From 8387fa4cf7ee4f7ece98954bbde061ab761ec14b Mon Sep 17 00:00:00 2001 From: DarkSky Date: Mon, 5 Sep 2022 18:37:10 +0800 Subject: [PATCH] chore: trick logic for temp feature --- libs/datasource/jwt/src/yjs/index.ts | 28 ++++++++++++++++++------- libs/datasource/jwt/src/yjs/provider.ts | 11 +++++++--- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/libs/datasource/jwt/src/yjs/index.ts b/libs/datasource/jwt/src/yjs/index.ts index 9b6fa3c3d9..76db288ad3 100644 --- a/libs/datasource/jwt/src/yjs/index.ts +++ b/libs/datasource/jwt/src/yjs/index.ts @@ -56,6 +56,7 @@ type YjsProviders = { connListener: { listeners?: ConnectivityListener }; userId: string; remoteToken: string | undefined; // remote storage token + providers: unknown[]; }; const _yjsDatabaseInstance = new Map(); @@ -107,19 +108,25 @@ async function _initYjsDatabase( ); const connListener: { listeners?: ConnectivityListener } = {}; + let providers: unknown[] = []; if (options.provider) { const emitState = (c: Connectivity) => connListener.listeners?.(workspace, c); - await Promise.all( - Object.entries(options.provider).flatMap(([, p]) => [ - p({ awareness, doc, token, workspace, emitState }), + providers = await Promise.all( + Object.entries(options.provider).flatMap(([name, p]) => [ + p({ awareness, doc, token, workspace, emitState }).then(p => { + console.log(p); + return { + [name]: p, + }; + }), p({ awareness, doc: binaries, token, workspace: `${workspace}_binaries`, emitState, - }), + }).then(p => ({ [`${name}_binaries`]: p })), ]) ); } @@ -128,7 +135,7 @@ async function _initYjsDatabase( binaries, doc, gatekeeper, - + providers, connListener, userId, remoteToken: token, @@ -342,7 +349,11 @@ export class YjsAdapter implements AsyncDatabaseAdapter { }); const [file] = (await fromEvent(handles)) as File[]; const binary = await file?.arrayBuffer(); - // await this._provider.idb.clearData(); + console.log(this._provider.providers); + let { indexeddb } = ( + this._provider.providers as any[] + ).find(p => p.indexeddb); + await indexeddb?.idb?.clearData(); const doc = new Doc({ autoLoad: true, shouldLoad: true }); let updated = 0; let isUpdated = false; @@ -365,8 +376,8 @@ export class YjsAdapter implements AsyncDatabaseAdapter { }; check(); }); - // await new IndexedDBProvider(this._provider.idb.name, doc) - // .whenSynced; + await new indexeddb.ctor(indexeddb.idb.name, doc) + .whenSynced; if (binary) { applyUpdate(doc, new Uint8Array(binary)); await update_check; @@ -374,6 +385,7 @@ export class YjsAdapter implements AsyncDatabaseAdapter { return true; } catch (err) { + console.log(err); return false; } }, diff --git a/libs/datasource/jwt/src/yjs/provider.ts b/libs/datasource/jwt/src/yjs/provider.ts index 99a09fd69c..0dab4244c0 100644 --- a/libs/datasource/jwt/src/yjs/provider.ts +++ b/libs/datasource/jwt/src/yjs/provider.ts @@ -18,7 +18,9 @@ type YjsDefaultInstances = { emitState: (connectivity: Connectivity) => void; }; -export type YjsProvider = (instances: YjsDefaultInstances) => Promise; +export type YjsProvider = ( + instances: YjsDefaultInstances +) => Promise; type ProviderType = 'idb' | 'sqlite' | 'ws'; @@ -38,9 +40,12 @@ export const getYjsProviders = ( return { indexeddb: async (instances: YjsDefaultInstances) => { if (options.enabled.includes('idb')) { - await new IndexedDBProvider(instances.workspace, instances.doc) - .whenSynced; + return new IndexedDBProvider( + instances.workspace, + instances.doc + ).whenSynced.then(idb => ({ idb, ctor: IndexedDBProvider })); } + return undefined; }, sqlite: async (instances: YjsDefaultInstances) => { if (options.enabled.includes('sqlite')) {