diff --git a/packages/y-indexeddb/src/__tests__/index.spec.ts b/packages/y-indexeddb/src/__tests__/index.spec.ts index 350f40b1a..7cb8be085 100644 --- a/packages/y-indexeddb/src/__tests__/index.spec.ts +++ b/packages/y-indexeddb/src/__tests__/index.spec.ts @@ -136,10 +136,12 @@ describe('indexeddb provider', () => { rootDBName ); provider.connect(); + expect(provider.connected).toBe(true); const p1 = provider.whenSynced; await p1; const snapshot = encodeStateAsUpdate(workspace.doc); provider.disconnect(); + expect(provider.connected).toBe(false); { const page = workspace.createPage('page0'); const pageBlockId = page.addBlock('affine:page', { title: '' }); @@ -151,14 +153,18 @@ describe('indexeddb provider', () => { expect(updates.length).toBe(1); expect(updates[0]).toEqual(snapshot); } + expect(provider.connected).toBe(false); provider.connect(); + expect(provider.connected).toBe(true); const p2 = provider.whenSynced; await p2; { const updates = await getUpdates(workspace.id); expect(updates).not.toEqual([]); } + expect(provider.connected).toBe(true); provider.disconnect(); + expect(provider.connected).toBe(false); expect(p1).not.toBe(p2); }); diff --git a/packages/y-indexeddb/src/index.ts b/packages/y-indexeddb/src/index.ts index 4d5e80ed7..829e86504 100644 --- a/packages/y-indexeddb/src/index.ts +++ b/packages/y-indexeddb/src/index.ts @@ -209,6 +209,8 @@ export const createIndexedDBProvider = ( }; const apis = { connect: async () => { + if (connected) return; + apis.whenSynced = new Promise((_resolve, _reject) => { early = true; resolve = _resolve; @@ -287,6 +289,9 @@ export const createIndexedDBProvider = ( (await dbPromise).delete('workspace', id); }, whenSynced: Promise.resolve(), + get connected() { + return connected; + }, }; return apis; diff --git a/packages/y-indexeddb/src/shared.ts b/packages/y-indexeddb/src/shared.ts index 855c6c961..1b994f30c 100644 --- a/packages/y-indexeddb/src/shared.ts +++ b/packages/y-indexeddb/src/shared.ts @@ -13,6 +13,7 @@ export interface IndexedDBProvider { disconnect: () => void; cleanup: () => Promise; whenSynced: Promise; + readonly connected: boolean; } export type UpdateMessage = {