From aacdc921b6603aa3145f3e6166b68cea510a3ee0 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: Tue, 2 May 2023 17:28:50 +0800 Subject: [PATCH 1/4] feat(y-indexeddb): cleanup --- .github/CLA.md | 2 +- packages/y-indexeddb/src/index.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/CLA.md b/.github/CLA.md index e9efea09b7da..9340387c4cf7 100644 --- a/.github/CLA.md +++ b/.github/CLA.md @@ -56,5 +56,5 @@ Example: - Skye Sun, @skyesun, 2023/04/14 - Jordy Delgado, @Jdelgad8, 2023/04/17 - Howard Do, @howarddo2208, 2023/04/20 -- Kevin Deng, @sxzz, 2023/04/21 +- 三咲智子 Kevin Deng, @sxzz, 2023/04/21 - Moeyua, @moeyua, 2023/04/22 diff --git a/packages/y-indexeddb/src/index.ts b/packages/y-indexeddb/src/index.ts index c2ddc1d9f037..6d71685bae9f 100644 --- a/packages/y-indexeddb/src/index.ts +++ b/packages/y-indexeddb/src/index.ts @@ -274,8 +274,8 @@ export const createIndexedDBProvider = ( doc.off('update', handleUpdate); doc.off('destroy', handleDestroy); }, - cleanup() { - // todo + async cleanup() { + (await dbPromise).delete('workspace', id); }, whenSynced: Promise.resolve(), }; From a79211733eceb6982abb46995931c03e1fa04960 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: Wed, 3 May 2023 21:42:11 +0800 Subject: [PATCH 2/4] test: add --- .../y-indexeddb/src/__tests__/index.spec.ts | 27 ++++++++++++++++++- packages/y-indexeddb/src/shared.ts | 2 +- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/packages/y-indexeddb/src/__tests__/index.spec.ts b/packages/y-indexeddb/src/__tests__/index.spec.ts index c99247a393c9..8e537ed7d3f2 100644 --- a/packages/y-indexeddb/src/__tests__/index.spec.ts +++ b/packages/y-indexeddb/src/__tests__/index.spec.ts @@ -59,7 +59,7 @@ describe('indexeddb provider', () => { await provider.whenSynced; const db = await openDB(rootDBName, dbVersion); { - const store = await db + const store = db .transaction('workspace', 'readonly') .objectStore('workspace'); const data = await store.get(id); @@ -161,6 +161,31 @@ describe('indexeddb provider', () => { expect(p1).not.toBe(p2); }); + test('cleanup', async () => { + const provider = createIndexedDBProvider(workspace.id, workspace.doc); + provider.connect(); + await provider.whenSynced; + const db = await openDB(rootDBName, dbVersion); + + { + const store = db + .transaction('workspace', 'readonly') + .objectStore('workspace'); + const keys = await store.getAllKeys(); + expect(keys).contain(workspace.id); + } + + await provider.cleanup(); + + { + const store = db + .transaction('workspace', 'readonly') + .objectStore('workspace'); + const keys = await store.getAllKeys(); + expect(keys).not.contain(workspace.id); + } + }); + test('merge', async () => { setMergeCount(5); const provider = createIndexedDBProvider( diff --git a/packages/y-indexeddb/src/shared.ts b/packages/y-indexeddb/src/shared.ts index 98ad6673d6ff..855c6c96135a 100644 --- a/packages/y-indexeddb/src/shared.ts +++ b/packages/y-indexeddb/src/shared.ts @@ -11,7 +11,7 @@ export function upgradeDB(db: IDBPDatabase) { export interface IndexedDBProvider { connect: () => void; disconnect: () => void; - cleanup: () => void; + cleanup: () => Promise; whenSynced: Promise; } From 45f8c2bde55651a8f4b765051191b8ce0b825c80 Mon Sep 17 00:00:00 2001 From: himself65 Date: Wed, 3 May 2023 19:19:19 -0500 Subject: [PATCH 3/4] test: add a test case for edge --- packages/y-indexeddb/src/__tests__/index.spec.ts | 12 ++++++++++++ packages/y-indexeddb/src/index.ts | 9 +++++++++ 2 files changed, 21 insertions(+) diff --git a/packages/y-indexeddb/src/__tests__/index.spec.ts b/packages/y-indexeddb/src/__tests__/index.spec.ts index 8e537ed7d3f2..a70a0bf5716e 100644 --- a/packages/y-indexeddb/src/__tests__/index.spec.ts +++ b/packages/y-indexeddb/src/__tests__/index.spec.ts @@ -13,6 +13,7 @@ import { applyUpdate, Doc, encodeStateAsUpdate } from 'yjs'; import type { WorkspacePersist } from '../index'; import { + CleanupWhenConnectingError, createIndexedDBProvider, dbVersion, DEFAULT_DB_NAME, @@ -186,6 +187,17 @@ describe('indexeddb provider', () => { } }); + test('cleanup when connecting', async () => { + const provider = createIndexedDBProvider(workspace.id, workspace.doc); + provider.connect(); + expect(() => provider.cleanup()).rejects.toThrowError( + CleanupWhenConnectingError + ); + await provider.whenSynced; + provider.disconnect(); + await provider.cleanup(); + }); + test('merge', async () => { setMergeCount(5); const provider = createIndexedDBProvider( diff --git a/packages/y-indexeddb/src/index.ts b/packages/y-indexeddb/src/index.ts index 6d71685bae9f..0b23432186f0 100644 --- a/packages/y-indexeddb/src/index.ts +++ b/packages/y-indexeddb/src/index.ts @@ -90,6 +90,12 @@ export class EarlyDisconnectError extends Error { } } +export class CleanupWhenConnectingError extends Error { + constructor() { + super('Cleanup when connecting'); + } +} + export const markMilestone = async ( id: string, doc: Doc, @@ -275,6 +281,9 @@ export const createIndexedDBProvider = ( doc.off('destroy', handleDestroy); }, async cleanup() { + if (connect) { + throw new CleanupWhenConnectingError(); + } (await dbPromise).delete('workspace', id); }, whenSynced: Promise.resolve(), From c1f5620356760e103e7dddc4f555cc4254a81f05 Mon Sep 17 00:00:00 2001 From: himself65 Date: Thu, 4 May 2023 15:15:41 -0500 Subject: [PATCH 4/4] fix: test --- packages/y-indexeddb/src/__tests__/index.spec.ts | 1 + packages/y-indexeddb/src/index.ts | 14 +++++++------- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/y-indexeddb/src/__tests__/index.spec.ts b/packages/y-indexeddb/src/__tests__/index.spec.ts index a70a0bf5716e..350f40b1ade3 100644 --- a/packages/y-indexeddb/src/__tests__/index.spec.ts +++ b/packages/y-indexeddb/src/__tests__/index.spec.ts @@ -176,6 +176,7 @@ describe('indexeddb provider', () => { expect(keys).contain(workspace.id); } + provider.disconnect(); await provider.cleanup(); { diff --git a/packages/y-indexeddb/src/index.ts b/packages/y-indexeddb/src/index.ts index 0b23432186f0..4d5e80ed7e21 100644 --- a/packages/y-indexeddb/src/index.ts +++ b/packages/y-indexeddb/src/index.ts @@ -150,11 +150,11 @@ export const createIndexedDBProvider = ( let resolve: () => void; let reject: (reason?: unknown) => void; let early = true; - let connect = false; + let connected = false; async function handleUpdate(update: Uint8Array, origin: unknown) { const db = await dbPromise; - if (!connect) { + if (!connected) { return; } if (origin === indexeddbOrigin) { @@ -203,7 +203,7 @@ export const createIndexedDBProvider = ( upgrade: upgradeDB, }); const handleDestroy = async () => { - connect = true; + connected = true; const db = await dbPromise; db.close(); }; @@ -214,7 +214,7 @@ export const createIndexedDBProvider = ( resolve = _resolve; reject = _reject; }); - connect = true; + connected = true; doc.on('update', handleUpdate); doc.on('destroy', handleDestroy); // only run promise below, otherwise the logic is incorrect @@ -224,7 +224,7 @@ export const createIndexedDBProvider = ( .transaction('workspace', 'readwrite') .objectStore('workspace'); const data = await store.get(id); - if (!connect) { + if (!connected) { return; } if (!data) { @@ -273,7 +273,7 @@ export const createIndexedDBProvider = ( resolve(); }, disconnect() { - connect = false; + connected = false; if (early) { reject(new EarlyDisconnectError()); } @@ -281,7 +281,7 @@ export const createIndexedDBProvider = ( doc.off('destroy', handleDestroy); }, async cleanup() { - if (connect) { + if (connected) { throw new CleanupWhenConnectingError(); } (await dbPromise).delete('workspace', id);