From d5f4fbcdb5180a014caf34c5da4e7e2183a9b5b5 Mon Sep 17 00:00:00 2001 From: Hongtao Lye Date: Thu, 21 Sep 2023 22:22:23 +0800 Subject: [PATCH] fix: providers get disconnected after opening the setting and close it (#4429) Co-authored-by: Alex Yang --- packages/infra/src/__internal__/workspace.ts | 30 ++++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/packages/infra/src/__internal__/workspace.ts b/packages/infra/src/__internal__/workspace.ts index 9d70ad95f2..5a8d3f9198 100644 --- a/packages/infra/src/__internal__/workspace.ts +++ b/packages/infra/src/__internal__/workspace.ts @@ -18,10 +18,12 @@ const workspaceActiveAtomWeakMap = new WeakMap< const workspaceActiveWeakMap = new WeakMap(); // Whether the workspace has been enabled the passive effect (background) -const workspacePassiveEffectWeakMap = new WeakMap(); +const workspacePassiveEffectWeakMap = new WeakMap(); export function enablePassiveProviders(workspace: Workspace) { - if (workspacePassiveEffectWeakMap.get(workspace) === true) { + const value = workspacePassiveEffectWeakMap.get(workspace); + if (value !== undefined && value !== 0) { + workspacePassiveEffectWeakMap.set(workspace, value + 1); return; } const providers = workspace.providers.filter( @@ -31,21 +33,25 @@ export function enablePassiveProviders(workspace: Workspace) { providers.forEach(provider => { provider.connect(); }); - workspacePassiveEffectWeakMap.set(workspace, true); + workspacePassiveEffectWeakMap.set(workspace, 1); } export function disablePassiveProviders(workspace: Workspace) { - if (workspacePassiveEffectWeakMap.get(workspace) !== true) { + const value = workspacePassiveEffectWeakMap.get(workspace); + if (value && value > 0) { + workspacePassiveEffectWeakMap.set(workspace, value - 1); + if (value - 1 === 0) { + const providers = workspace.providers.filter( + (provider): provider is PassiveDocProvider => + 'passive' in provider && provider.passive === true + ); + providers.forEach(provider => { + provider.disconnect(); + }); + workspacePassiveEffectWeakMap.delete(workspace); + } return; } - const providers = workspace.providers.filter( - (provider): provider is PassiveDocProvider => - 'passive' in provider && provider.passive === true - ); - providers.forEach(provider => { - provider.disconnect(); - }); - workspacePassiveEffectWeakMap.delete(workspace); } export async function waitForWorkspace(workspace: Workspace) {