From a986a44a408f7ddc1fce115202e1173dbd0f77b5 Mon Sep 17 00:00:00 2001 From: Jordy Herrera Mussio Date: Fri, 14 Mar 2025 10:46:44 -0600 Subject: [PATCH 1/5] feat: listen for client status events --- src/helpers/client/safari-client.ts | 10 ++++++++ src/models/aspera-sdk.model.ts | 37 +++++++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/helpers/client/safari-client.ts b/src/helpers/client/safari-client.ts index 3bcf641..b34595f 100644 --- a/src/helpers/client/safari-client.ts +++ b/src/helpers/client/safari-client.ts @@ -65,6 +65,7 @@ export class SafariClient implements Client { this.listenResponseEvents(); this.listenTransferActivityEvents(); this.listenStatusEvents(); + this.listenClientStatusEvents(); this.listenPongEvents(); if (keepAliveTimeout) { @@ -227,6 +228,15 @@ export class SafariClient implements Client { }); } + /** + * Listens for 'AsperaDesktop.ClientStatus' events. + */ + private listenClientStatusEvents() { + document.addEventListener('isAppAlive', (event: any) => { + asperaSdk.activityTracking.handleClientEvents(event.detail.running); + }); + } + /** * Listens for 'AsperaDesktop.Pong' events. */ diff --git a/src/models/aspera-sdk.model.ts b/src/models/aspera-sdk.model.ts index bd531d8..d903d3c 100644 --- a/src/models/aspera-sdk.model.ts +++ b/src/models/aspera-sdk.model.ts @@ -82,6 +82,8 @@ export class ActivityTracking { /** Keep track of the last WebSocket event **/ private lastWebSocketEvent: WebsocketEvent = 'CLOSED'; + /** Keep track of the last notified WebSocket event **/ + private lastNotifiedWebSocketEvent: WebsocketEvent = undefined; /** Keep track of the last Safari extension event **/ private lastSafariExtensionEvent: SafariExtensionEvent = 'DISABLED'; @@ -109,7 +111,7 @@ export class ActivityTracking { } /** - * Notify all consumers when a connection webSocketEvent occurs. For example, when the SDK + * Handle and notify if needed when a connection webSocketEvent occurs. For example, when the SDK * websocket connection to IBM Aspera App is closed or reconnected. * * @param webSocketEvent the event type. @@ -119,13 +121,44 @@ export class ActivityTracking { return; } + this.lastWebSocketEvent = webSocketEvent; + + this.notifyWebSocketEvent(webSocketEvent); + } + + /** + * Notify all consumers when a connection webSocketEvent occurs. + * + * @param webSocketEvent the event type. + */ + private notifyWebSocketEvent(webSocketEvent: WebsocketEvent): void { + if (this.lastNotifiedWebSocketEvent === webSocketEvent) { + return; + } + this.event_callbacks.forEach(callback => { if (typeof callback === 'function') { callback(webSocketEvent); } }); + } - this.lastWebSocketEvent = webSocketEvent; + /** + * Notify all consumers when the client changes status. For example, when + * IBM Aspera App is launched or closed. + * + * @param running whether the client is running or not. + */ + handleClientEvents(running: Boolean): void { + let webSocketEvent: WebsocketEvent; + + if (!running) { + webSocketEvent = 'CLOSED'; + } else { + webSocketEvent = this.lastWebSocketEvent; + } + + this.notifyWebSocketEvent(webSocketEvent); } /** From 66f41903f73050fc8e4f31e3c041a9fd261ede99 Mon Sep 17 00:00:00 2001 From: Jordy Herrera Mussio Date: Fri, 14 Mar 2025 10:48:57 -0600 Subject: [PATCH 2/5] chore: change event name --- src/helpers/client/safari-client.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/helpers/client/safari-client.ts b/src/helpers/client/safari-client.ts index b34595f..fdfedbf 100644 --- a/src/helpers/client/safari-client.ts +++ b/src/helpers/client/safari-client.ts @@ -229,7 +229,7 @@ export class SafariClient implements Client { } /** - * Listens for 'AsperaDesktop.ClientStatus' events. + * Listens for 'isAppAlive' events. */ private listenClientStatusEvents() { document.addEventListener('isAppAlive', (event: any) => { From 94b79c71acbb505ea8c2eb2920340a79f8fbeca7 Mon Sep 17 00:00:00 2001 From: Jordy Herrera Mussio Date: Fri, 14 Mar 2025 10:52:22 -0600 Subject: [PATCH 3/5] fix: set last notified websocket event --- src/models/aspera-sdk.model.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/models/aspera-sdk.model.ts b/src/models/aspera-sdk.model.ts index d903d3c..e6f10df 100644 --- a/src/models/aspera-sdk.model.ts +++ b/src/models/aspera-sdk.model.ts @@ -141,6 +141,8 @@ export class ActivityTracking { callback(webSocketEvent); } }); + + this.lastNotifiedWebSocketEvent = webSocketEvent; } /** From bde2c85b326c8fc1441ca37d89740a77b9daf9da Mon Sep 17 00:00:00 2001 From: Jordy Herrera Mussio Date: Fri, 14 Mar 2025 15:13:55 -0600 Subject: [PATCH 4/5] chore: change requests --- src/helpers/client/safari-client.ts | 18 +++++++++++++++++- src/models/aspera-sdk.model.ts | 6 +++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/helpers/client/safari-client.ts b/src/helpers/client/safari-client.ts index fdfedbf..2f0fc8f 100644 --- a/src/helpers/client/safari-client.ts +++ b/src/helpers/client/safari-client.ts @@ -206,6 +206,10 @@ export class SafariClient implements Client { */ private listenResponseEvents() { document.addEventListener('AsperaDesktop.Response', (event: CustomEvent) => { + if (event.detail === undefined) { + return; + } + this.handleResponse(event.detail); }); } @@ -215,6 +219,10 @@ export class SafariClient implements Client { */ private listenTransferActivityEvents() { document.addEventListener('AsperaDesktop.TransferActivity', (event: any) => { + if (event.detail === undefined) { + return; + } + asperaSdk.activityTracking.handleTransferActivity(event.detail); }); } @@ -224,15 +232,23 @@ export class SafariClient implements Client { */ private listenStatusEvents() { document.addEventListener('AsperaDesktop.Status', (event: any) => { + if (event.detail === undefined) { + return; + } + asperaSdk.activityTracking.handleWebSocketEvents(event.detail); }); } /** - * Listens for 'isAppAlive' events. + * Listens for 'isAppAlive' events. This was introduced in version 1.0.9. */ private listenClientStatusEvents() { document.addEventListener('isAppAlive', (event: any) => { + if (event.detail?.running === undefined) { + return; + } + asperaSdk.activityTracking.handleClientEvents(event.detail.running); }); } diff --git a/src/models/aspera-sdk.model.ts b/src/models/aspera-sdk.model.ts index e6f10df..f5ef25e 100644 --- a/src/models/aspera-sdk.model.ts +++ b/src/models/aspera-sdk.model.ts @@ -136,13 +136,13 @@ export class ActivityTracking { return; } + this.lastNotifiedWebSocketEvent = webSocketEvent; + this.event_callbacks.forEach(callback => { if (typeof callback === 'function') { callback(webSocketEvent); } }); - - this.lastNotifiedWebSocketEvent = webSocketEvent; } /** @@ -151,7 +151,7 @@ export class ActivityTracking { * * @param running whether the client is running or not. */ - handleClientEvents(running: Boolean): void { + handleClientEvents(running: boolean): void { let webSocketEvent: WebsocketEvent; if (!running) { From ece689e9c74cf2ea3e8d5c27e6be2df0c4f815aa Mon Sep 17 00:00:00 2001 From: Jordy Herrera Mussio Date: Tue, 18 Mar 2025 16:31:36 -0600 Subject: [PATCH 5/5] chore: change validations to use ! --- src/helpers/client/safari-client.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/helpers/client/safari-client.ts b/src/helpers/client/safari-client.ts index 2f0fc8f..618986b 100644 --- a/src/helpers/client/safari-client.ts +++ b/src/helpers/client/safari-client.ts @@ -206,7 +206,7 @@ export class SafariClient implements Client { */ private listenResponseEvents() { document.addEventListener('AsperaDesktop.Response', (event: CustomEvent) => { - if (event.detail === undefined) { + if (!event.detail) { return; } @@ -219,7 +219,7 @@ export class SafariClient implements Client { */ private listenTransferActivityEvents() { document.addEventListener('AsperaDesktop.TransferActivity', (event: any) => { - if (event.detail === undefined) { + if (!event.detail) { return; } @@ -232,7 +232,7 @@ export class SafariClient implements Client { */ private listenStatusEvents() { document.addEventListener('AsperaDesktop.Status', (event: any) => { - if (event.detail === undefined) { + if (!event.detail) { return; } @@ -245,7 +245,7 @@ export class SafariClient implements Client { */ private listenClientStatusEvents() { document.addEventListener('isAppAlive', (event: any) => { - if (event.detail?.running === undefined) { + if (!event.detail?.running) { return; }