feat(y-indexeddb): cleanup (#2207)

Co-authored-by: himself65 <himself65@outlook.com>
This commit is contained in:
三咲智子 Kevin Deng
2023-05-04 20:25:58 +00:00
committed by GitHub
co-authored by himself65
parent 6d7f06c1c3
commit 52b9734a7b
4 changed files with 58 additions and 11 deletions
+17 -8
View File
@@ -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,
@@ -144,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) {
@@ -197,7 +203,7 @@ export const createIndexedDBProvider = (
upgrade: upgradeDB,
});
const handleDestroy = async () => {
connect = true;
connected = true;
const db = await dbPromise;
db.close();
};
@@ -208,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
@@ -218,7 +224,7 @@ export const createIndexedDBProvider = (
.transaction('workspace', 'readwrite')
.objectStore('workspace');
const data = await store.get(id);
if (!connect) {
if (!connected) {
return;
}
if (!data) {
@@ -267,15 +273,18 @@ export const createIndexedDBProvider = (
resolve();
},
disconnect() {
connect = false;
connected = false;
if (early) {
reject(new EarlyDisconnectError());
}
doc.off('update', handleUpdate);
doc.off('destroy', handleDestroy);
},
cleanup() {
// todo
async cleanup() {
if (connected) {
throw new CleanupWhenConnectingError();
}
(await dbPromise).delete('workspace', id);
},
whenSynced: Promise.resolve(),
};