diff --git a/src/client/api/configuration.ts b/src/client/api/configuration.ts index d12978a..6b90c64 100644 --- a/src/client/api/configuration.ts +++ b/src/client/api/configuration.ts @@ -2,7 +2,7 @@ import { Observable, Subscription } from 'rxjs' import { createProxyAndHandleRequests } from '../../common/proxy' import { ExtConfigurationAPI } from '../../extension/api/configuration' import { ConfigurationUpdateParams } from '../../protocol' -import { Connection } from '../../protocol/jsonrpc2/connection' +import { Connection, ConnectionError, ConnectionErrors } from '../../protocol/jsonrpc2/connection' /** @internal */ export interface ClientConfigurationAPI { @@ -26,7 +26,14 @@ export class ClientConfiguration implements ClientConfigurationAPI { this.subscriptions.add( environmentConfiguration.subscribe(config => { - this.proxy.$acceptConfigurationData(config) + this.proxy.$acceptConfigurationData(config).catch(error => { + if (error instanceof ConnectionError && error.code === ConnectionErrors.Unsubscribed) { + // This error was probably caused by the user disabling + // an extension, which is a normal occurrence. + return + } + throw error + }) }) ) } diff --git a/src/extension/api/configuration.ts b/src/extension/api/configuration.ts index 70f9bb1..931fa2f 100644 --- a/src/extension/api/configuration.ts +++ b/src/extension/api/configuration.ts @@ -36,7 +36,7 @@ class ExtConfigurationSection implements sourcegraph.Configura * @template C - The configuration schema. */ export interface ExtConfigurationAPI { - $acceptConfigurationData(data: Readonly): void + $acceptConfigurationData(data: Readonly): Promise } /** @@ -48,8 +48,9 @@ export class ExtConfiguration> implements Ex constructor(private proxy: ClientConfigurationAPI) {} - public $acceptConfigurationData(data: Readonly): void { + public $acceptConfigurationData(data: Readonly): Promise { this.data.next(Object.freeze(data)) + return Promise.resolve() } public get(): sourcegraph.Configuration { diff --git a/src/protocol/jsonrpc2/connection.ts b/src/protocol/jsonrpc2/connection.ts index 640ea4f..c403f78 100644 --- a/src/protocol/jsonrpc2/connection.ts +++ b/src/protocol/jsonrpc2/connection.ts @@ -48,7 +48,7 @@ const NullLogger: Logger = Object.freeze({ }, }) -enum ConnectionErrors { +export enum ConnectionErrors { /** * The connection is closed. */ @@ -63,7 +63,7 @@ enum ConnectionErrors { AlreadyListening = 3, } -class ConnectionError extends Error { +export class ConnectionError extends Error { public readonly code: ConnectionErrors constructor(code: ConnectionErrors, message: string) { @@ -632,9 +632,15 @@ function _createConnection(transports: MessageTransports, logger: Logger, strate } state = ConnectionState.Unsubscribed unsubscribeEmitter.fire(undefined) - const error = new Error('Connection got unsubscribed.') for (const key of Object.keys(responsePromises)) { - responsePromises[key].reject(error) + responsePromises[key].reject( + new ConnectionError( + ConnectionErrors.Unsubscribed, + `The underlying JSON-RPC connection got unsubscribed while responding to this ${ + responsePromises[key].method + } request.` + ) + ) } responsePromises = Object.create(null) requestTokens = Object.create(null)