From 7c315470c83a9019e66b6e35c5e59e3f25583014 Mon Sep 17 00:00:00 2001 From: Gleb Kiva Date: Fri, 13 Feb 2026 17:46:50 +0300 Subject: [PATCH 1/2] fix: close WebSocket on pagehide to support bfcache --- packages/javascript/src/modules/socket.ts | 41 +++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/packages/javascript/src/modules/socket.ts b/packages/javascript/src/modules/socket.ts index eb64b59..d30d0a9 100644 --- a/packages/javascript/src/modules/socket.ts +++ b/packages/javascript/src/modules/socket.ts @@ -54,6 +54,11 @@ export default class Socket implements Transport { */ private reconnectionAttempts: number; + /** + * Page hide event handler reference (for removal) + */ + private pageHideHandler: () => void; + /** * Creates new Socket instance. Setup initial socket params. * @@ -77,6 +82,11 @@ export default class Socket implements Transport { this.reconnectionTimeout = reconnectionTimeout; this.reconnectionAttempts = reconnectionAttempts; + this.pageHideHandler = () => { + log('Page entering bfcache, closing WebSocket', 'info'); + this.close(); + }; + this.eventsQueue = []; this.ws = null; @@ -120,12 +130,25 @@ export default class Socket implements Transport { } /** - * Create new WebSocket connection and setup event listeners + * Setup window event listeners + */ + private setupListeners(): void { + window.addEventListener('pagehide', this.pageHideHandler, { capture: true }); + } + + /** + * Remove window event listeners + */ + public destroyListeners(): void { + window.removeEventListener('pagehide', this.pageHideHandler, { capture: true }); + } + + /** + * Create new WebSocket connection and setup socket event listeners */ private init(): Promise { return new Promise((resolve, reject) => { this.ws = new WebSocket(this.url); - /** * New message handler */ @@ -139,6 +162,8 @@ export default class Socket implements Transport { * @param event - websocket event on closing */ this.ws.onclose = (event: CloseEvent): void => { + this.destroyListeners(); + if (typeof this.onClose === 'function') { this.onClose(event); } @@ -154,6 +179,8 @@ export default class Socket implements Transport { }; this.ws.onopen = (event: Event): void => { + this.setupListeners(); + if (typeof this.onOpen === 'function') { this.onOpen(event); } @@ -163,6 +190,16 @@ export default class Socket implements Transport { }); } + /** + * Closes socket, it can be restored with init() later + */ + private close(): void { + if (this.ws) { + this.ws.close(); + this.ws = null; + } + } + /** * Tries to reconnect to the server for specified number of times with the interval * From 715f01602e4f41996f97176938bd770a1f0a56dd Mon Sep 17 00:00:00 2001 From: Gleb Kiva Date: Fri, 13 Feb 2026 17:58:21 +0300 Subject: [PATCH 2/2] fix: lint --- packages/javascript/src/modules/socket.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/javascript/src/modules/socket.ts b/packages/javascript/src/modules/socket.ts index d30d0a9..affbcaa 100644 --- a/packages/javascript/src/modules/socket.ts +++ b/packages/javascript/src/modules/socket.ts @@ -130,17 +130,17 @@ export default class Socket implements Transport { } /** - * Setup window event listeners + * Remove window event listeners */ - private setupListeners(): void { - window.addEventListener('pagehide', this.pageHideHandler, { capture: true }); + public destroyListeners(): void { + window.removeEventListener('pagehide', this.pageHideHandler, { capture: true }); } /** - * Remove window event listeners + * Setup window event listeners */ - public destroyListeners(): void { - window.removeEventListener('pagehide', this.pageHideHandler, { capture: true }); + private setupListeners(): void { + window.addEventListener('pagehide', this.pageHideHandler, { capture: true }); } /** @@ -149,6 +149,7 @@ export default class Socket implements Transport { private init(): Promise { return new Promise((resolve, reject) => { this.ws = new WebSocket(this.url); + /** * New message handler */