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/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 d5e83691d..113148b42 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) { + throw new AbortOperation('Connection request has been aborted'); + } const abortController = new AbortController(); signal.addEventListener('abort', () => abortController.abort());