From 6ed2d467b73877c8f62bb683880e554d4c8dc08b Mon Sep 17 00:00:00 2001 From: DarkSky Date: Thu, 29 Dec 2022 23:05:19 +0800 Subject: [PATCH] feat: memory provider first work --- .../providers/app-state-provider/context.ts | 1 - .../app-state-provider/dynamic-blocksuite.tsx | 47 +++++++++---------- .../providers/app-state-provider/provider.tsx | 4 +- packages/data-center/package.json | 1 + .../data-center/src/datacenter/datacenter.ts | 33 ++++++++----- .../src/datacenter/provider/base.ts | 6 ++- .../src/datacenter/provider/memory.ts | 4 ++ packages/data-center/src/datacenter/store.ts | 9 +++- packages/data-center/tests/datacenter.spec.ts | 9 +++- pnpm-lock.yaml | 2 + 10 files changed, 74 insertions(+), 42 deletions(-) diff --git a/packages/app/src/providers/app-state-provider/context.ts b/packages/app/src/providers/app-state-provider/context.ts index 01a0f78b17..467276507e 100644 --- a/packages/app/src/providers/app-state-provider/context.ts +++ b/packages/app/src/providers/app-state-provider/context.ts @@ -8,7 +8,6 @@ import type { import type { EditorContainer } from '@blocksuite/editor'; export type LoadWorkspaceHandler = ( workspaceId: string, - websocket?: boolean, user?: AccessTokenMessage | null ) => Promise | null; export type CreateEditorHandler = (page: StorePage) => EditorContainer | null; diff --git a/packages/app/src/providers/app-state-provider/dynamic-blocksuite.tsx b/packages/app/src/providers/app-state-provider/dynamic-blocksuite.tsx index d30e0e02a1..7c1b8877b9 100644 --- a/packages/app/src/providers/app-state-provider/dynamic-blocksuite.tsx +++ b/packages/app/src/providers/app-state-provider/dynamic-blocksuite.tsx @@ -1,13 +1,11 @@ import { useEffect } from 'react'; import type { Page } from '@blocksuite/store'; -import { - IndexedDBDocProvider, - Workspace as StoreWorkspace, -} from '@blocksuite/store'; +import { Workspace as StoreWorkspace } from '@blocksuite/store'; import '@blocksuite/blocks'; import { EditorContainer } from '@blocksuite/editor'; import { BlockSchema } from '@blocksuite/blocks/models'; import type { LoadWorkspaceHandler, CreateEditorHandler } from './context'; +import { downloadWorkspace, getDataCenter } from '@affine/datacenter'; interface Props { setLoadWorkspaceHandler: (handler: LoadWorkspaceHandler) => void; @@ -19,18 +17,18 @@ const DynamicBlocksuite = ({ setCreateEditorHandler, }: Props) => { useEffect(() => { - const openWorkspace: LoadWorkspaceHandler = ( - workspaceId: string, - websocket = false, - user - ) => + const openWorkspace: LoadWorkspaceHandler = (workspaceId: string, user) => // eslint-disable-next-line no-async-promise-executor new Promise(async resolve => { - const workspace = new StoreWorkspace({ - room: workspaceId, - providers: [IndexedDBDocProvider], - }).register(BlockSchema); - console.log('websocket', websocket); + const dc = await getDataCenter(); + const workspace = await dc.initWorkspace( + workspaceId, + new StoreWorkspace({ + room: workspaceId, + }).register(BlockSchema) + ); + + // console.log('websocket', websocket); console.log('user', user); // if (websocket && token.refresh) { @@ -58,9 +56,9 @@ const DynamicBlocksuite = ({ // workspace.__ws__ = ws; // } - const indexDBProvider = workspace.providers.find( - p => p instanceof IndexedDBDocProvider - ); + // const indexDBProvider = workspace.providers.find( + // p => p instanceof IndexedDBDocProvider + // ); // if (user) { // const updates = await downloadWorkspace({ workspaceId }); // updates && @@ -71,13 +69,14 @@ const DynamicBlocksuite = ({ // // if after update, the space:meta is empty, then we need to get map with doc // workspace.doc.getMap('space:meta'); // } - if (indexDBProvider) { - (indexDBProvider as IndexedDBDocProvider).whenSynced.then(() => { - resolve(workspace); - }); - } else { - resolve(workspace); - } + + // if (indexDBProvider) { + // (indexDBProvider as IndexedDBDocProvider).whenSynced.then(() => { + // resolve(workspace); + // }); + // } else { + resolve(workspace); + // } }); setLoadWorkspaceHandler(openWorkspace); diff --git a/packages/app/src/providers/app-state-provider/provider.tsx b/packages/app/src/providers/app-state-provider/provider.tsx index c9258480dc..0bdc81f77f 100644 --- a/packages/app/src/providers/app-state-provider/provider.tsx +++ b/packages/app/src/providers/app-state-provider/provider.tsx @@ -41,7 +41,7 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => { const workspacesList = await Promise.all( state.workspacesMeta.map(async ({ id }) => { const workspace = - (await loadWorkspaceHandler?.(id, false, state.user)) || null; + (await loadWorkspaceHandler?.(id, state.user)) || null; return { id, workspace }; }) ); @@ -84,7 +84,7 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => { return state.currentWorkspace; } const workspace = - (await loadWorkspaceHandler?.(workspaceId, true, state.user)) || null; + (await loadWorkspaceHandler?.(workspaceId, state.user)) || null; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error diff --git a/packages/data-center/package.json b/packages/data-center/package.json index bbd463e080..eab7ce011f 100644 --- a/packages/data-center/package.json +++ b/packages/data-center/package.json @@ -25,6 +25,7 @@ "typescript": "^4.8.4" }, "dependencies": { + "@blocksuite/store": "0.3.0-20221228162706-9576a3a", "encoding": "^0.1.13", "firebase": "^9.15.0", "idb-keyval": "^6.2.0", diff --git a/packages/data-center/src/datacenter/datacenter.ts b/packages/data-center/src/datacenter/datacenter.ts index e8e4dbc0c1..c95675c3d0 100644 --- a/packages/data-center/src/datacenter/datacenter.ts +++ b/packages/data-center/src/datacenter/datacenter.ts @@ -1,4 +1,4 @@ -import { Doc } from 'yjs'; +import { Workspace } from '@blocksuite/store'; import type { BaseProvider } from './provider/index.js'; import { MemoryProvider } from './provider/index.js'; @@ -6,7 +6,7 @@ import { getKVConfigure } from './store.js'; export class DataCenter { private readonly _providers = new Map(); - private readonly _workspaces = new Map>(); + private readonly _workspaces = new Map>(); private readonly _config; static async init(): Promise { @@ -24,25 +24,34 @@ export class DataCenter { this._providers.set(provider.id, provider); } - private async _initWorkspace(id: string): Promise { - const workspace = new Doc(); - - const providerId = await this._config.get(`workspace:${id}:provider`); - if (this._providers.has(providerId)) { + private async _initWorkspace( + id: string, + workspace: Workspace, + providerId: string + ): Promise { + const providerKey = `workspace:${id}:provider`; + const providerValue = await this._config.get(providerKey); + if (this._providers.has(providerValue || providerId)) { + if (!providerValue) { + await this._config.set(providerKey, providerId); + } // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const Provider = this._providers.get(providerId)!; const provider = new Provider(); - provider.init(getKVConfigure(id)); + await provider.init(getKVConfigure(id), workspace); } return workspace; } - async getWorkspace(id: string): Promise { + async initWorkspace( + id: string, + workspace: Workspace, + provider = 'memory' + ): Promise { if (!this._workspaces.has(id)) { - const workspace = this._initWorkspace(id); - this._workspaces.set(id, workspace); + this._workspaces.set(id, this._initWorkspace(id, workspace, provider)); } - return this._workspaces.get(id); + return this._workspaces.get(id)!; } } diff --git a/packages/data-center/src/datacenter/provider/base.ts b/packages/data-center/src/datacenter/provider/base.ts index 805d0e867b..317bd1f58b 100644 --- a/packages/data-center/src/datacenter/provider/base.ts +++ b/packages/data-center/src/datacenter/provider/base.ts @@ -1,14 +1,18 @@ +import { Workspace } from '@blocksuite/store'; + import type { ConfigStore } from '../store.js'; export class BaseProvider { static id = 'memory'; protected _config: ConfigStore | undefined; + protected _workspace: Workspace | undefined; constructor() { // TODO } - init(config: ConfigStore) { + async init(config: ConfigStore, workspace: Workspace) { this._config = config; + this._workspace = workspace; } } diff --git a/packages/data-center/src/datacenter/provider/memory.ts b/packages/data-center/src/datacenter/provider/memory.ts index 58ad54bd65..4e71606c7f 100644 --- a/packages/data-center/src/datacenter/provider/memory.ts +++ b/packages/data-center/src/datacenter/provider/memory.ts @@ -4,4 +4,8 @@ export class MemoryProvider extends BaseProvider { constructor() { super(); } + + test() { + console.log(this._config, this._workspace); + } } diff --git a/packages/data-center/src/datacenter/store.ts b/packages/data-center/src/datacenter/store.ts index dc3fb75d42..68cbebae6a 100644 --- a/packages/data-center/src/datacenter/store.ts +++ b/packages/data-center/src/datacenter/store.ts @@ -44,4 +44,11 @@ const scopedIndexedDB = () => { }; }; -export const getKVConfigure = scopedIndexedDB(); +let lazyKVConfigure: ReturnType | undefined = undefined; + +export const getKVConfigure = (scope: string) => { + if (!lazyKVConfigure) { + lazyKVConfigure = scopedIndexedDB(); + } + return lazyKVConfigure(scope); +}; diff --git a/packages/data-center/tests/datacenter.spec.ts b/packages/data-center/tests/datacenter.spec.ts index de43f3e1cd..2c4ea73f2a 100644 --- a/packages/data-center/tests/datacenter.spec.ts +++ b/packages/data-center/tests/datacenter.spec.ts @@ -1,4 +1,6 @@ import { test, expect } from '@playwright/test'; +import { Workspace } from '@blocksuite/store'; + import { getDataCenter } from './utils.js'; import 'fake-indexeddb/auto'; @@ -7,6 +9,11 @@ test('can init data center', async () => { const dataCenter = await getDataCenter(); expect(dataCenter).toBeTruthy(); - const workspace = await dataCenter.getWorkspace('test'); + const workspace = await dataCenter.initWorkspace( + 'test', + new Workspace({ + room: 'test', + }) + ); expect(workspace).toBeTruthy(); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e6b2984183..ce22115325 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -131,6 +131,7 @@ importers: packages/data-center: specifiers: + '@blocksuite/store': 0.3.0-20221228162706-9576a3a '@playwright/test': ^1.29.1 encoding: ^0.1.13 fake-indexeddb: 4.0.1 @@ -143,6 +144,7 @@ importers: y-protocols: ^1.0.5 yjs: ^13.5.43 dependencies: + '@blocksuite/store': 0.3.0-20221228162706-9576a3a_yjs@13.5.43 encoding: 0.1.13 firebase: 9.15.0_encoding@0.1.13 idb-keyval: 6.2.0