mirror of
https://github.com/arduino/arduino-ide.git
synced 2025-07-10 21:06:33 +00:00
Gracefully handle disconnected frontends.
Signed-off-by: Akos Kitta <kittaakos@typefox.io>
This commit is contained in:
parent
2dc73eb3b5
commit
df33c5689f
@ -38,10 +38,10 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
|
|||||||
bind(ArduinoCliContribution).toSelf().inSingletonScope();
|
bind(ArduinoCliContribution).toSelf().inSingletonScope();
|
||||||
bind(CliContribution).toService(ArduinoCliContribution);
|
bind(CliContribution).toService(ArduinoCliContribution);
|
||||||
|
|
||||||
// Provides the path of the Ardunio CLI.
|
// Provides the path of the Arduino CLI.
|
||||||
bind(ArduinoCli).toSelf().inSingletonScope();
|
bind(ArduinoCli).toSelf().inSingletonScope();
|
||||||
|
|
||||||
// Shared daemonn
|
// Shared daemon
|
||||||
bind(ArduinoDaemon).toSelf().inSingletonScope();
|
bind(ArduinoDaemon).toSelf().inSingletonScope();
|
||||||
bind(BackendApplicationContribution).toService(ArduinoDaemon);
|
bind(BackendApplicationContribution).toService(ArduinoDaemon);
|
||||||
|
|
||||||
|
@ -10,6 +10,9 @@ import { ToolOutputServiceServer } from '../common/protocol/tool-output-service'
|
|||||||
@injectable()
|
@injectable()
|
||||||
export class BoardsServiceImpl implements BoardsService {
|
export class BoardsServiceImpl implements BoardsService {
|
||||||
|
|
||||||
|
@inject(ILogger)
|
||||||
|
protected logger: ILogger;
|
||||||
|
|
||||||
@inject(ILogger)
|
@inject(ILogger)
|
||||||
@named('discovery')
|
@named('discovery')
|
||||||
protected discoveryLogger: ILogger;
|
protected discoveryLogger: ILogger;
|
||||||
@ -95,9 +98,13 @@ export class BoardsServiceImpl implements BoardsService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dispose(): void {
|
dispose(): void {
|
||||||
|
this.logger.info('>>> Disposing boards service...')
|
||||||
|
this.queue.pause();
|
||||||
|
this.queue.clear();
|
||||||
if (this.discoveryTimer !== undefined) {
|
if (this.discoveryTimer !== undefined) {
|
||||||
clearInterval(this.discoveryTimer);
|
clearInterval(this.discoveryTimer);
|
||||||
}
|
}
|
||||||
|
this.logger.info('<<< Disposed boards service.')
|
||||||
}
|
}
|
||||||
|
|
||||||
async getAttachedBoards(): Promise<{ boards: Board[] }> {
|
async getAttachedBoards(): Promise<{ boards: Board[] }> {
|
||||||
|
@ -42,7 +42,24 @@ export class CoreClientProviderImpl implements CoreClientProvider {
|
|||||||
|
|
||||||
async getClient(workspaceRootOrResourceUri?: string): Promise<Client | undefined> {
|
async getClient(workspaceRootOrResourceUri?: string): Promise<Client | undefined> {
|
||||||
return this.clientRequestQueue.add(() => new Promise<Client | undefined>(async resolve => {
|
return this.clientRequestQueue.add(() => new Promise<Client | undefined>(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) {
|
if (!workspaceRootOrResourceUri) {
|
||||||
resolve(this.getOrCreateClient(roots[0]));
|
resolve(this.getOrCreateClient(roots[0]));
|
||||||
return;
|
return;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user