Skip to content

Commit 20c11b9

Browse files
authored
fix: dispose plugin service will cause crash (#115)
1 parent 4dc9769 commit 20c11b9

7 files changed

Lines changed: 28 additions & 10 deletions

File tree

packages/core/src/api/createApp.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
makeWorkspaceDir,
88
RuntimeConfig,
99
STORAGE_DIR,
10+
tryCatchPromise,
1011
} from '@codeblitzjs/ide-sumi-core';
1112
import {
1213
FILES_DEFAULTS,
@@ -127,7 +128,7 @@ export function createApp({ appConfig, runtimeConfig }: IConfig): IAppInstance {
127128
destroyed = true;
128129
disposeMode();
129130
disposableCollection.forEach((d) => d(app.injector));
130-
app.injector.disposeAll();
131+
tryCatchPromise(() => app.injector.disposeAll());
131132
};
132133

133134
return app;

packages/core/src/api/createEditor.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
makeWorkspaceDir,
88
RuntimeConfig,
99
STORAGE_DIR,
10+
tryCatchPromise,
1011
} from '@codeblitzjs/ide-sumi-core';
1112
import { Injector } from '@opensumi/di';
1213
import { FILES_DEFAULTS, IAppRenderer, IReporter, SlotLocation, SlotRenderer } from '@opensumi/ide-core-browser';
@@ -100,7 +101,7 @@ export function createEditor({ appConfig, runtimeConfig }: IConfig): IAppInstanc
100101
destroyed = true;
101102
disposeMode();
102103
disposableCollection.forEach((d) => d(app.injector));
103-
app.injector.disposeAll();
104+
tryCatchPromise(() => app.injector.disposeAll());
104105
};
105106

106107
return app;

packages/plugin/src/plugin.contribution.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ export class PluginContribution implements ClientAppContribution {
1515
}
1616

1717
dispose() {
18-
this.pluginService.deactivate();
18+
// dispose 阶段不保证顺序,如果 IPluginService 比 PluginContribution 先 dispose,会导致此时 `this.pluginService` 为空
19+
if (this.pluginService) {
20+
this.pluginService.deactivate();
21+
}
1922
}
2023
}

packages/plugin/src/plugin.service.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,8 @@ export class PluginService {
7575
this.pluginActivator.set(plugin.PLUGIN_ID, { subscriptions: context.subscriptions });
7676
}
7777
}
78+
79+
dispose() {
80+
this.deactivate();
81+
}
7882
}

packages/sumi-core/src/client/override/monacoOverride/contextKeyService.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,5 @@ export class MonacoContextKeyServiceOverride extends BaseContextKeyService imple
200200

201201
dispose(): void {
202202
// context 不需要dispose
203-
// super.dispose();
204203
}
205204
}

packages/sumi-core/src/common/util.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { IExtensionIdentity, IExtensionMode } from '@codeblitzjs/ide-common';
22
import { ConstructorOf, Provider } from '@opensumi/di';
33
import { BrowserModule } from '@opensumi/ide-core-browser';
4-
import { BackService } from '@opensumi/ide-core-common';
4+
import { BackService, MaybePromise } from '@opensumi/ide-core-common';
55
import * as paths from 'path';
66
import { EXT_SCHEME, OSSBucket, WORKSPACE_ROOT } from './constant';
77

@@ -100,3 +100,13 @@ export const extendModule = ({
100100
}
101101
};
102102
};
103+
104+
export const tryCatchPromise = (fn: () => MaybePromise<void>): Promise<void> => {
105+
const run = async () => {
106+
return await fn();
107+
}
108+
109+
return run().catch((e) => {
110+
console.error("dispose injector error", e);
111+
});
112+
}

packages/sumi-core/src/server/core/app.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import { INodeLogger, NodeLogger } from './node-logger';
2727
import { HOME_ROOT, IServerApp } from '../../common';
2828
import { STORAGE_DIR, WORKSPACE_ROOT } from '../../common/constant';
2929
import { RootFS, RuntimeConfig } from '../../common/types';
30-
import { isBackServicesInServer } from '../../common/util';
30+
import { isBackServicesInServer, tryCatchPromise } from '../../common/util';
3131
import { fsExtra as fse } from '../node';
3232
import { initializeHomeFileSystem, initializeRootFileSystem, unmountRootFS } from './filesystem';
3333

@@ -283,7 +283,7 @@ export function bindModuleBackService(
283283
serviceCenter.loadProtocol(service.protocol);
284284
}
285285

286-
logger.log('back service', serviceToken);
286+
logger.log('bind back service', serviceToken);
287287
const serviceInstance = childInjector.get(serviceToken);
288288
const proxyService = createRPCService(servicePath, serviceInstance);
289289
if (!serviceInstance.client) {
@@ -319,9 +319,9 @@ function handleClientChannel(
319319
);
320320

321321
channel.onceClose(() => {
322-
remove.dispose();
323-
serviceChildInjector.disposeAll();
324-
325322
logger.log(`Remove RPC connection ${clientId}`);
323+
324+
remove.dispose();
325+
tryCatchPromise(() => serviceChildInjector.disposeAll());
326326
});
327327
}

0 commit comments

Comments
 (0)