From bd133d0991eb81372ec030d20ed78219429e70d1 Mon Sep 17 00:00:00 2001 From: stevensJourney Date: Thu, 28 Aug 2025 10:50:43 +0200 Subject: [PATCH 1/2] wip: abort rust connections if early abort detected --- .changeset/honest-penguins-worry.md | 5 +++++ .../sync/stream/AbstractStreamingSyncImplementation.ts | 3 +++ 2 files changed, 8 insertions(+) create mode 100644 .changeset/honest-penguins-worry.md diff --git a/.changeset/honest-penguins-worry.md b/.changeset/honest-penguins-worry.md new file mode 100644 index 000000000..c08ae16ad --- /dev/null +++ b/.changeset/honest-penguins-worry.md @@ -0,0 +1,5 @@ +--- +'@powersync/common': patch +--- + +Fix issue where Rust sync implementation might not disconnect in some circumstances. diff --git a/packages/common/src/client/sync/stream/AbstractStreamingSyncImplementation.ts b/packages/common/src/client/sync/stream/AbstractStreamingSyncImplementation.ts index d5e83691d..dd1dde8c2 100644 --- a/packages/common/src/client/sync/stream/AbstractStreamingSyncImplementation.ts +++ b/packages/common/src/client/sync/stream/AbstractStreamingSyncImplementation.ts @@ -899,6 +899,9 @@ The next upload iteration will be delayed.`); let receivingLines: Promise | null = null; let hadSyncLine = false; + if (signal.aborted) { + return; + } const abortController = new AbortController(); signal.addEventListener('abort', () => abortController.abort()); From 2f6153c95c9b24e5dca6213c3654e55eb8577cff Mon Sep 17 00:00:00 2001 From: stevensJourney Date: Thu, 28 Aug 2025 11:08:21 +0200 Subject: [PATCH 2/2] throw instead of returning --- packages/common/src/client/sync/stream/AbstractRemote.ts | 4 ++++ .../client/sync/stream/AbstractStreamingSyncImplementation.ts | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/common/src/client/sync/stream/AbstractRemote.ts b/packages/common/src/client/sync/stream/AbstractRemote.ts index 81da1ac8e..52db8015e 100644 --- a/packages/common/src/client/sync/stream/AbstractRemote.ts +++ b/packages/common/src/client/sync/stream/AbstractRemote.ts @@ -502,6 +502,10 @@ export abstract class AbstractRemote { * Aborting the active fetch request while it is being consumed seems to throw * an unhandled exception on the window level. */ + if (abortSignal?.aborted) { + throw new AbortOperation('Abort request received before making postStreamRaw request'); + } + const controller = new AbortController(); let requestResolved = false; abortSignal?.addEventListener('abort', () => { diff --git a/packages/common/src/client/sync/stream/AbstractStreamingSyncImplementation.ts b/packages/common/src/client/sync/stream/AbstractStreamingSyncImplementation.ts index dd1dde8c2..113148b42 100644 --- a/packages/common/src/client/sync/stream/AbstractStreamingSyncImplementation.ts +++ b/packages/common/src/client/sync/stream/AbstractStreamingSyncImplementation.ts @@ -900,7 +900,7 @@ The next upload iteration will be delayed.`); let hadSyncLine = false; if (signal.aborted) { - return; + throw new AbortOperation('Connection request has been aborted'); } const abortController = new AbortController(); signal.addEventListener('abort', () => abortController.abort());