From 01ba190c5ea3af27120bf4c195748493b936b4e0 Mon Sep 17 00:00:00 2001 From: Rodrigo Pastro Date: Thu, 12 Nov 2020 15:21:34 -0500 Subject: [PATCH 1/3] Prevent canceller from being invoked twice for same subscription --- src/client.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/client.ts b/src/client.ts index f3cbd718..3b823507 100644 --- a/src/client.ts +++ b/src/client.ts @@ -249,6 +249,7 @@ export function createClient(options: ClientOptions): Client { } cancellerRef.current = () => { + cancellerRef.current = null; cleanup?.(); state.locks--; if (!state.locks) { @@ -375,6 +376,7 @@ export function createClient(options: ClientOptions): Client { } cancellerRef.current = () => { + cancellerRef.current = null; cleanup?.(); state.locks--; if (!state.locks) { From 47f31aff6651af170ea0a45155abf1042d7b770f Mon Sep 17 00:00:00 2001 From: Rodrigo Pastro Date: Thu, 12 Nov 2020 16:04:57 -0500 Subject: [PATCH 2/3] apply suggestions --- src/client.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client.ts b/src/client.ts index 4485ea29..a9917faf 100644 --- a/src/client.ts +++ b/src/client.ts @@ -499,6 +499,7 @@ export function createClient(options: ClientOptions): Client { // either the canceller will be called and the promise resolved // or the socket closed and the promise rejected await throwOnCloseOrWaitForCancel(() => { + cancellerRef.current = null; // if not completed already, send complete message to server on cancel if (!completed) { socket.send( @@ -541,8 +542,7 @@ export function createClient(options: ClientOptions): Client { } })() .catch(sink.error) - .then(sink.complete) // resolves on cancel or normal closure - .finally(() => (cancellerRef.current = null)); // when this promise settles there is nothing to cancel + .then(sink.complete); // resolves on cancel or normal closure return () => { cancellerRef.current?.(); From fe3c6f64b834287174e2b0d45b4429c13ef458e9 Mon Sep 17 00:00:00 2001 From: enisdenjo Date: Thu, 12 Nov 2020 22:10:55 +0100 Subject: [PATCH 3/3] fix: remove canceller on close --- src/client.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/client.ts b/src/client.ts index a9917faf..950c2f9a 100644 --- a/src/client.ts +++ b/src/client.ts @@ -243,6 +243,7 @@ export function createClient(options: ClientOptions): Client { state.socket.addEventListener('close', listener); function listener(event: CloseEvent) { + cancellerRef.current = null; state.locks--; state.socket?.removeEventListener('close', listener); return reject(event); @@ -370,6 +371,7 @@ export function createClient(options: ClientOptions): Client { socket.addEventListener('close', listener); function listener(event: CloseEvent) { + cancellerRef.current = null; state.locks--; socket.removeEventListener('close', listener); return reject(event); @@ -499,7 +501,6 @@ export function createClient(options: ClientOptions): Client { // either the canceller will be called and the promise resolved // or the socket closed and the promise rejected await throwOnCloseOrWaitForCancel(() => { - cancellerRef.current = null; // if not completed already, send complete message to server on cancel if (!completed) { socket.send(