diff --git a/src/lib/requests/RequestManager.ts b/src/lib/requests/RequestManager.ts index 7098edb0..b60df486 100644 --- a/src/lib/requests/RequestManager.ts +++ b/src/lib/requests/RequestManager.ts @@ -428,6 +428,7 @@ export class RequestManager { public reset(): void { this.graphQLClient.client.resetStore(); + this.graphQLClient.terminateSubscriptions(); this.cache.clear(); this.imageQueue.clear(); } diff --git a/src/lib/requests/client/BaseClient.ts b/src/lib/requests/client/BaseClient.ts index 3f25667e..295db28a 100644 --- a/src/lib/requests/client/BaseClient.ts +++ b/src/lib/requests/client/BaseClient.ts @@ -9,14 +9,10 @@ import { AppStorage } from '@/util/AppStorage.ts'; export abstract class BaseClient { - protected client!: Client; + protected abstract client: Client; public abstract readonly fetcher: Fetcher; - constructor() { - this.createClient(); - } - public getBaseUrl(): string { const { hostname, port, protocol } = window.location; @@ -25,7 +21,5 @@ export abstract class BaseClient { return AppStorage.local.getItemParsed('serverBaseURL', `${protocol}//${hostname}:${inferredPort}`); } - protected abstract createClient(): void; - public abstract updateConfig(config: Partial): void; } diff --git a/src/lib/requests/client/GraphQLClient.ts b/src/lib/requests/client/GraphQLClient.ts index bedfd29f..a2532095 100644 --- a/src/lib/requests/client/GraphQLClient.ts +++ b/src/lib/requests/client/GraphQLClient.ts @@ -136,14 +136,24 @@ export class GraphQLClient extends BaseClient< > { readonly fetcher = null; - public declare client: ApolloClient; + public client!: ApolloClient; private wsClient!: Client; + constructor() { + super(); + + this.createClient(); + } + public override getBaseUrl(): string { return `${super.getBaseUrl()}/api/graphql`; } + public terminateSubscriptions(): void { + this.wsClient.terminate(); + } + private createUploadLink() { return createUploadLink({ uri: () => this.getBaseUrl(), credentials: 'include' }); } @@ -182,13 +192,11 @@ export class GraphQLClient extends BaseClient< }); const checkHeartbeatInterval = heartbeatInterval + 1000 * 10; - // for some reason "this.wsClient" is undefined in the "setInterval" callback - const { wsClient } = this; setInterval(() => { const isHeartbeatMissing = Date.now() - lastHeartbeat > checkHeartbeatInterval * 1.1; if (isHeartbeatMissing) { // force a reconnect - wsClient.terminate(); + this.wsClient.terminate(); } }, checkHeartbeatInterval); diff --git a/src/lib/requests/client/RestClient.ts b/src/lib/requests/client/RestClient.ts index 6547ada9..2584ad70 100644 --- a/src/lib/requests/client/RestClient.ts +++ b/src/lib/requests/client/RestClient.ts @@ -27,6 +27,8 @@ export class RestClient extends BaseClient Promise> implements IRestClient { + protected client!: typeof fetch; + private config: RequestInit = { credentials: 'include', }; @@ -78,7 +80,13 @@ export class RestClient return result; }; - protected override createClient(): void { + constructor() { + super(); + + this.createClient(); + } + + private createClient(): void { this.client = fetch.bind(window); }