From edcbf716220a7cbf6b78e95b9731e799a0f3bc07 Mon Sep 17 00:00:00 2001 From: rdlabo Date: Sun, 26 Jul 2026 20:48:37 +0900 Subject: [PATCH] fix: flush offline outbox after reconnect --- .../src/lib/offline-sync.service.spec.ts | 21 +++++++++++++++++++ .../offline/src/lib/offline-sync.service.ts | 3 ++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/projects/kit/offline/src/lib/offline-sync.service.spec.ts b/projects/kit/offline/src/lib/offline-sync.service.spec.ts index 1e1f952..caf17e1 100644 --- a/projects/kit/offline/src/lib/offline-sync.service.spec.ts +++ b/projects/kit/offline/src/lib/offline-sync.service.spec.ts @@ -176,6 +176,27 @@ describe('OfflineSyncService', () => { expect(service.pendingCount()).toBe(1); }); + it('offline初期化後の再接続でpending outboxを自動送信する', async () => { + await service.initialize(); + await service.enqueue( + { + groupId: 10, + aggregateType: 'documents', + aggregateLocalId: 'reconnect-local', + operation: 'documents.create', + payload: { title: 'queued offline' }, + optimisticValue: { id: 0, title: 'queued offline' }, + }, + { flush: false }, + ); + expect(execute).not.toHaveBeenCalled(); + + connected.set(true); + + await vi.waitFor(() => expect(execute).toHaveBeenCalledOnce()); + await vi.waitFor(() => expect(service.pendingCount()).toBe(0)); + }); + it('session失効前に開始したenqueueを永続commitせずreset完了まで直列化する', async () => { let releaseRead: (() => void) | undefined; let readStarted: (() => void) | undefined; diff --git a/projects/kit/offline/src/lib/offline-sync.service.ts b/projects/kit/offline/src/lib/offline-sync.service.ts index c1e97ad..1782db1 100644 --- a/projects/kit/offline/src/lib/offline-sync.service.ts +++ b/projects/kit/offline/src/lib/offline-sync.service.ts @@ -76,7 +76,8 @@ export class OfflineSyncService { constructor() { effect(() => { - if (this.#initialized && this.#network.connected()) this.#flushInBackground(); + const connected = this.#network.connected(); + if (this.#initialized && connected) this.#flushInBackground(); }); }