From b111c411bd0414f67550b87ff842d9950bf51b3a Mon Sep 17 00:00:00 2001 From: alt0 Date: Tue, 10 Jan 2023 20:22:14 +0800 Subject: [PATCH] fix: local provider create workspace should wait sync to idb --- .../local/{ => indexeddb}/indexeddb.ts | 0 .../src/provider/local/indexeddb/utils.ts | 20 +++++++++++++++++++ .../data-center/src/provider/local/local.ts | 16 +++++---------- 3 files changed, 25 insertions(+), 11 deletions(-) rename packages/data-center/src/provider/local/{ => indexeddb}/indexeddb.ts (100%) create mode 100644 packages/data-center/src/provider/local/indexeddb/utils.ts diff --git a/packages/data-center/src/provider/local/indexeddb.ts b/packages/data-center/src/provider/local/indexeddb/indexeddb.ts similarity index 100% rename from packages/data-center/src/provider/local/indexeddb.ts rename to packages/data-center/src/provider/local/indexeddb/indexeddb.ts diff --git a/packages/data-center/src/provider/local/indexeddb/utils.ts b/packages/data-center/src/provider/local/indexeddb/utils.ts new file mode 100644 index 0000000000..8ca5c9b46d --- /dev/null +++ b/packages/data-center/src/provider/local/indexeddb/utils.ts @@ -0,0 +1,20 @@ +import assert from 'assert'; +import * as idb from 'lib0/indexeddb.js'; +import { Workspace as BlocksuiteWorkspace } from '@blocksuite/store'; + +const { encodeStateAsUpdate } = BlocksuiteWorkspace.Y; + +export const initStore = async (blocksuiteWorkspace: BlocksuiteWorkspace) => { + const workspaceId = blocksuiteWorkspace.room; + assert(workspaceId); + await idb.deleteDB(workspaceId); + const db = await idb.openDB(workspaceId, db => + idb.createStores(db, [['updates', { autoIncrement: true }], ['custom']]) + ); + const currState = encodeStateAsUpdate(blocksuiteWorkspace.doc); + const [updatesStore] = idb.transact(db, ['updates']); // , 'readonly') + + if (updatesStore) { + await idb.addAutoKey(updatesStore, currState); + } +}; diff --git a/packages/data-center/src/provider/local/local.ts b/packages/data-center/src/provider/local/local.ts index f87d7c95fb..e662320b64 100644 --- a/packages/data-center/src/provider/local/local.ts +++ b/packages/data-center/src/provider/local/local.ts @@ -7,7 +7,8 @@ import type { } from '../base'; import { varStorage as storage } from 'lib0/storage'; import { Workspace as BlocksuiteWorkspace, uuidv4 } from '@blocksuite/store'; -import { IndexedDBProvider } from './indexeddb.js'; +import { IndexedDBProvider } from './indexeddb/indexeddb.js'; +import { initStore } from './indexeddb/utils.js'; import assert from 'assert'; import { setDefaultAvatar } from '../utils.js'; @@ -101,21 +102,12 @@ export class LocalProvider extends BaseProvider { ): Promise { const workspaceId = blocksuiteWorkspace.room; assert(workspaceId, 'Blocksuite Workspace without room(workspaceId).'); - assert(meta.name, 'Workspace name is required'); this._logger('Creating affine workspace'); const workspaceInfo: WorkspaceMeta0 = { - name: meta.name, - id: workspaceId, - published: false, - avatar: '', - owner: undefined, - syncMode: 'core', - memberCount: 1, - provider: 'local', + ...meta, }; - this.linkLocal(blocksuiteWorkspace); blocksuiteWorkspace.meta.setName(meta.name); if (!meta.avatar) { @@ -123,6 +115,8 @@ export class LocalProvider extends BaseProvider { workspaceInfo.avatar = blocksuiteWorkspace.meta.avatar; } + await initStore(blocksuiteWorkspace); + this._workspaces.add(workspaceInfo); this._storeWorkspaces(this._workspaces.list());