diff --git a/arduino-ide-extension/src/node/arduino-backend-module.ts b/arduino-ide-extension/src/node/arduino-backend-module.ts index cd9cfc49..6e32e533 100644 --- a/arduino-ide-extension/src/node/arduino-backend-module.ts +++ b/arduino-ide-extension/src/node/arduino-backend-module.ts @@ -38,10 +38,10 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(ArduinoCliContribution).toSelf().inSingletonScope(); bind(CliContribution).toService(ArduinoCliContribution); - // Provides the path of the Ardunio CLI. + // Provides the path of the Arduino CLI. bind(ArduinoCli).toSelf().inSingletonScope(); - // Shared daemonn + // Shared daemon bind(ArduinoDaemon).toSelf().inSingletonScope(); bind(BackendApplicationContribution).toService(ArduinoDaemon); diff --git a/arduino-ide-extension/src/node/boards-service-impl.ts b/arduino-ide-extension/src/node/boards-service-impl.ts index 4b14a11c..ade97c54 100644 --- a/arduino-ide-extension/src/node/boards-service-impl.ts +++ b/arduino-ide-extension/src/node/boards-service-impl.ts @@ -10,6 +10,9 @@ import { ToolOutputServiceServer } from '../common/protocol/tool-output-service' @injectable() export class BoardsServiceImpl implements BoardsService { + @inject(ILogger) + protected logger: ILogger; + @inject(ILogger) @named('discovery') protected discoveryLogger: ILogger; @@ -95,9 +98,13 @@ export class BoardsServiceImpl implements BoardsService { } dispose(): void { + this.logger.info('>>> Disposing boards service...') + this.queue.pause(); + this.queue.clear(); if (this.discoveryTimer !== undefined) { clearInterval(this.discoveryTimer); } + this.logger.info('<<< Disposed boards service.') } async getAttachedBoards(): Promise<{ boards: Board[] }> { diff --git a/arduino-ide-extension/src/node/core-client-provider-impl.ts b/arduino-ide-extension/src/node/core-client-provider-impl.ts index 65147596..6a44c4fc 100644 --- a/arduino-ide-extension/src/node/core-client-provider-impl.ts +++ b/arduino-ide-extension/src/node/core-client-provider-impl.ts @@ -42,7 +42,24 @@ export class CoreClientProviderImpl implements CoreClientProvider { async getClient(workspaceRootOrResourceUri?: string): Promise { return this.clientRequestQueue.add(() => new Promise(async resolve => { - const roots = await this.workspaceServiceExt.roots(); + let roots = undefined; + try { + roots = await this.workspaceServiceExt.roots(); + } catch (e) { + if (e instanceof Error && e.message === 'Connection got disposed.') { + console.info('The frontend has already disconnected.'); + // Ignore it for now: https://github.com/eclipse-theia/theia/issues/6499 + // Client has disconnected, and the server still runs the serial board poll. + // The poll requires the client's workspace roots, but the client has disconnected :/ + } else { + throw e; + } + } + if (!roots) { + resolve(undefined); + return + } + if (!workspaceRootOrResourceUri) { resolve(this.getOrCreateClient(roots[0])); return;