From 2c49c774afd160a737c1bbecfd87664a808b819b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90=20Kevin=20Deng?= Date: Fri, 5 May 2023 11:42:49 +0800 Subject: [PATCH] feat(y-indexeddb): add connected (#2208) Co-authored-by: Himself65 --- packages/y-indexeddb/src/__tests__/index.spec.ts | 6 ++++++ packages/y-indexeddb/src/index.ts | 5 +++++ packages/y-indexeddb/src/shared.ts | 1 + 3 files changed, 12 insertions(+) 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 = {