From 26586c71901e194b1e74e466b5aa29676214ce20 Mon Sep 17 00:00:00 2001 From: Andrew Schlackman <72105194+sei-aschlackman@users.noreply.github.com> Date: Wed, 9 Oct 2024 14:20:31 -0400 Subject: [PATCH] add signalR stateful reconnect support (#646) * add signalR stateful reconnect support - available due to player.api update to .NET 8 --- package-lock.json | 137 ++++++++++++------ package.json | 2 +- .../notification/notification.service.ts | 5 +- 3 files changed, 94 insertions(+), 50 deletions(-) diff --git a/package-lock.json b/package-lock.json index 24efaf29..9c77184f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "@datorama/akita": "^8.0.1", "@datorama/akita-ng-router-store": "^8.0.0", "@mdi/font": "^7.2.96", - "@microsoft/signalr": "^6.0.0", + "@microsoft/signalr": "^8.0.7", "@popperjs/core": "^2.10.2", "angular-resizable-element": "^7.0.2", "babel-polyfill": "^6.26.0", @@ -4313,13 +4313,13 @@ "license": "Apache-2.0" }, "node_modules/@microsoft/signalr": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/@microsoft/signalr/-/signalr-6.0.16.tgz", - "integrity": "sha512-wekzRtt2Ti38Ja0OQwLE0EKN0Zm7RI9VilrungwHe5Eej1IwnRYuhpauAqNtwwP3CY2j7uFT4XUk74E2vythTQ==", + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/@microsoft/signalr/-/signalr-8.0.7.tgz", + "integrity": "sha512-PHcdMv8v5hJlBkRHAuKG5trGViQEkPYee36LnJQx4xHOQ5LL4X0nEWIxOp5cCtZ7tu+30quz5V3k0b1YNuc6lw==", "dependencies": { "abort-controller": "^3.0.0", - "eventsource": "^1.0.7", - "fetch-cookie": "^0.11.0", + "eventsource": "^2.0.2", + "fetch-cookie": "^2.0.3", "node-fetch": "^2.6.7", "ws": "^7.4.5" } @@ -8578,13 +8578,11 @@ } }, "node_modules/eventsource": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "original": "^1.0.0" - }, + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", "engines": { - "node": ">=0.12.0" + "node": ">=12.0.0" } }, "node_modules/execa": { @@ -8819,14 +8817,34 @@ } }, "node_modules/fetch-cookie": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-0.11.0.tgz", - "integrity": "sha512-BQm7iZLFhMWFy5CZ/162sAGjBfdNWb7a8LEqqnzsHFhxT/X/SVj/z2t2nu3aJvjlbQkrAlTUApplPRjWyH4mhA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-2.2.0.tgz", + "integrity": "sha512-h9AgfjURuCgA2+2ISl8GbavpUdR+WGAM2McW/ovn4tVccegp8ZqCKWSBR8uRdM8dDNlx5WdKRWxBYUwteLDCNQ==", "dependencies": { - "tough-cookie": "^2.3.3 || ^3.0.1 || ^4.0.0" + "set-cookie-parser": "^2.4.8", + "tough-cookie": "^4.0.0" + } + }, + "node_modules/fetch-cookie/node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { - "node": ">=8" + "node": ">=6" + } + }, + "node_modules/fetch-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "engines": { + "node": ">= 4.0.0" } }, "node_modules/figures": { @@ -12956,13 +12974,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/original": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "url-parse": "^1.4.3" - } - }, "node_modules/os-tmpdir": { "version": "1.0.2", "dev": true, @@ -14085,7 +14096,8 @@ }, "node_modules/querystringify": { "version": "2.2.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, "node_modules/queue-microtask": { "version": "1.2.3", @@ -14965,6 +14977,11 @@ "dev": true, "license": "ISC" }, + "node_modules/set-cookie-parser": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.0.tgz", + "integrity": "sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==" + }, "node_modules/set-immediate-shim": { "version": "1.0.1", "dev": true, @@ -16032,6 +16049,7 @@ }, "node_modules/tough-cookie": { "version": "2.5.0", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.28", @@ -16414,8 +16432,9 @@ } }, "node_modules/url-parse": { - "version": "1.5.1", - "license": "MIT", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -20198,13 +20217,13 @@ "version": "7.2.96" }, "@microsoft/signalr": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/@microsoft/signalr/-/signalr-6.0.16.tgz", - "integrity": "sha512-wekzRtt2Ti38Ja0OQwLE0EKN0Zm7RI9VilrungwHe5Eej1IwnRYuhpauAqNtwwP3CY2j7uFT4XUk74E2vythTQ==", + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/@microsoft/signalr/-/signalr-8.0.7.tgz", + "integrity": "sha512-PHcdMv8v5hJlBkRHAuKG5trGViQEkPYee36LnJQx4xHOQ5LL4X0nEWIxOp5cCtZ7tu+30quz5V3k0b1YNuc6lw==", "requires": { "abort-controller": "^3.0.0", - "eventsource": "^1.0.7", - "fetch-cookie": "^0.11.0", + "eventsource": "^2.0.2", + "fetch-cookie": "^2.0.3", "node-fetch": "^2.6.7", "ws": "^7.4.5" } @@ -23222,10 +23241,9 @@ "dev": true }, "eventsource": { - "version": "1.1.0", - "requires": { - "original": "^1.0.0" - } + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==" }, "execa": { "version": "5.1.1", @@ -23417,11 +23435,30 @@ } }, "fetch-cookie": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-0.11.0.tgz", - "integrity": "sha512-BQm7iZLFhMWFy5CZ/162sAGjBfdNWb7a8LEqqnzsHFhxT/X/SVj/z2t2nu3aJvjlbQkrAlTUApplPRjWyH4mhA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-2.2.0.tgz", + "integrity": "sha512-h9AgfjURuCgA2+2ISl8GbavpUdR+WGAM2McW/ovn4tVccegp8ZqCKWSBR8uRdM8dDNlx5WdKRWxBYUwteLDCNQ==", "requires": { - "tough-cookie": "^2.3.3 || ^3.0.1 || ^4.0.0" + "set-cookie-parser": "^2.4.8", + "tough-cookie": "^4.0.0" + }, + "dependencies": { + "tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + } + }, + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==" + } } }, "figures": { @@ -26381,12 +26418,6 @@ "wcwidth": "^1.0.1" } }, - "original": { - "version": "1.0.2", - "requires": { - "url-parse": "^1.4.3" - } - }, "os-tmpdir": { "version": "1.0.2", "dev": true @@ -27111,7 +27142,9 @@ } }, "querystringify": { - "version": "2.2.0" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, "queue-microtask": { "version": "1.2.3", @@ -27734,6 +27767,11 @@ "version": "2.0.0", "dev": true }, + "set-cookie-parser": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.0.tgz", + "integrity": "sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==" + }, "set-immediate-shim": { "version": "1.0.1", "dev": true @@ -28513,6 +28551,7 @@ }, "tough-cookie": { "version": "2.5.0", + "dev": true, "requires": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -28755,7 +28794,9 @@ } }, "url-parse": { - "version": "1.5.1", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "requires": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" diff --git a/package.json b/package.json index 5b4a338c..7d4035df 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "@datorama/akita": "^8.0.1", "@datorama/akita-ng-router-store": "^8.0.0", "@mdi/font": "^7.2.96", - "@microsoft/signalr": "^6.0.0", + "@microsoft/signalr": "^8.0.7", "@popperjs/core": "^2.10.2", "angular-resizable-element": "^7.0.2", "babel-polyfill": "^6.26.0", diff --git a/src/app/services/notification/notification.service.ts b/src/app/services/notification/notification.service.ts index 9915e6ee..c472757c 100644 --- a/src/app/services/notification/notification.service.ts +++ b/src/app/services/notification/notification.service.ts @@ -43,18 +43,21 @@ export class NotificationService { `${this.settingsSvc.settings.NotificationsSettings.url}/view?bearer=${userToken}` ) .withAutomaticReconnect(new RetryPolicy(120, 0, 5)) + .withStatefulReconnect() .build(); this.teamConnection = new signalR.HubConnectionBuilder() .withUrl( `${this.settingsSvc.settings.NotificationsSettings.url}/team?bearer=${userToken}` ) .withAutomaticReconnect(new RetryPolicy(120, 0, 5)) + .withStatefulReconnect() .build(); this.userConnection = new signalR.HubConnectionBuilder() .withUrl( `${this.settingsSvc.settings.NotificationsSettings.url}/user?bearer=${userToken}` ) .withAutomaticReconnect(new RetryPolicy(120, 0, 5)) + .withStatefulReconnect() .build(); this.viewConnection.on('Reply', (data: NotificationData) => { @@ -181,6 +184,7 @@ export class NotificationService { this.settingsSvc.settings.NotificationsSettings.url }/view?bearer=${this.authService.getAuthorizationToken()}` ) + .withStatefulReconnect() .withAutomaticReconnect(new RetryPolicy(120, 0, 5)) .build(); @@ -201,7 +205,6 @@ export class NotificationService { this.invokeJoinPresence(viewId); this.viewConnection.onreconnected(() => { - this.viewConnection.invoke('JoinView', viewId); this.viewConnection.invoke('JoinPresence', viewId); }); }