From 76999ee8305352f4f9a7ec77127347cab89dca42 Mon Sep 17 00:00:00 2001 From: alep85 Date: Mon, 14 Apr 2025 14:46:27 +0200 Subject: [PATCH 1/2] AAE-30358 Remove client if already exists when connection is closed to use the refreshed token changing the page, turn connectionParams into a function to ensures that the latest token is always used for WebSocket connections --- .../src/lib/services/web-socket.service.spec.ts | 2 +- .../src/lib/services/web-socket.service.ts | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/lib/process-services-cloud/src/lib/services/web-socket.service.spec.ts b/lib/process-services-cloud/src/lib/services/web-socket.service.spec.ts index b89a0f629a8..a8cbbfdc7f4 100644 --- a/lib/process-services-cloud/src/lib/services/web-socket.service.spec.ts +++ b/lib/process-services-cloud/src/lib/services/web-socket.service.spec.ts @@ -27,7 +27,7 @@ describe('WebSocketService', () => { let service: WebSocketService; const onLogoutSubject: Subject = new Subject(); - const apolloMock = jasmine.createSpyObj('Apollo', ['use', 'createNamed']); + const apolloMock = jasmine.createSpyObj('Apollo', ['use', 'createNamed', 'removeClient']); beforeEach(() => { TestBed.configureTestingModule({ diff --git a/lib/process-services-cloud/src/lib/services/web-socket.service.ts b/lib/process-services-cloud/src/lib/services/web-socket.service.ts index f84ac9ef5f0..79af5f059bb 100644 --- a/lib/process-services-cloud/src/lib/services/web-socket.service.ts +++ b/lib/process-services-cloud/src/lib/services/web-socket.service.ts @@ -72,6 +72,12 @@ export class WebSocketService { return this.apollo.use(apolloClientName).subscribe({ errorPolicy: 'all', ...subscriptionOptions }); } + private removeApolloClientIfExists(apolloClientName: string) { + if (this.apollo.use(apolloClientName)) { + this.apollo.removeClient(apolloClientName); + } + } + private get contextRoot() { return this.appConfigService.get('bpmHost', ''); } @@ -155,10 +161,13 @@ export class WebSocketService { this.wsLink = new GraphQLWsLink( createClient({ url: this.createWsUrl(options.wsUrl) + '/v2/ws/graphql', - connectionParams: { + connectionParams: () => ({ Authorization: 'Bearer ' + this.authService.getToken() - }, + }), on: { + closed: () => { + this.removeApolloClientIfExists(options.apolloClientName); + }, error: () => { this.apollo.removeClient(options.apolloClientName); this.initSubscriptions(options); From 10346dbf1fb98ddc8e4c047d3ddb78dd4afec95c Mon Sep 17 00:00:00 2001 From: alep85 Date: Mon, 14 Apr 2025 14:56:26 +0200 Subject: [PATCH 2/2] AAE-30358 Update Retry connection logic to allow retry when the graphql return unauthorized error --- .../src/lib/services/web-socket.service.ts | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/lib/process-services-cloud/src/lib/services/web-socket.service.ts b/lib/process-services-cloud/src/lib/services/web-socket.service.ts index 79af5f059bb..e85afc3324c 100644 --- a/lib/process-services-cloud/src/lib/services/web-socket.service.ts +++ b/lib/process-services-cloud/src/lib/services/web-socket.service.ts @@ -141,9 +141,25 @@ export class WebSocketService { max: Number.POSITIVE_INFINITY, jitter: true }, - attempts: { - max: 5, - retryIf: (error) => !!error + attempts: (count: number, _operation: Operation, error: any) => { + if (!error) { + return false; + } + + const isUnauthorizedError = + (Array.isArray(error) && + error.some( + (err: any) => + err?.extensions?.code === 'UNAUTHORIZED' || + err?.message?.includes('4401') || + err?.message?.toLowerCase().includes('unauthorized') + )) || + (typeof error === 'string' && (error.includes('4401') || error.toLowerCase().includes('unauthorized'))) || + (error?.message && (error.message.includes('4401') || error.message.toLowerCase().includes('unauthorized'))); + + const shouldRetry = isUnauthorizedError ? this.authService.isLoggedIn() : count < 5; + + return shouldRetry; } });