From d3012de9d6a7ff4b00faf8e4b8dd0ac5126481b9 Mon Sep 17 00:00:00 2001 From: alt0 Date: Tue, 10 Jan 2023 11:23:00 +0800 Subject: [PATCH] fix: create workspace optimize --- packages/data-center/src/datacenter.ts | 28 ++++++---- .../data-center/src/provider/affine/affine.ts | 51 ++++++++++++------- packages/data-center/src/provider/base.ts | 10 ++-- .../data-center/src/provider/local/local.ts | 12 ++--- packages/data-center/src/utils/index.ts | 9 ++++ 5 files changed, 73 insertions(+), 37 deletions(-) diff --git a/packages/data-center/src/datacenter.ts b/packages/data-center/src/datacenter.ts index 1021a4afb..d033b0b6d 100644 --- a/packages/data-center/src/datacenter.ts +++ b/packages/data-center/src/datacenter.ts @@ -7,8 +7,8 @@ import { AffineProvider } from './provider'; import type { WorkspaceMeta } from './types'; import assert from 'assert'; import { getLogger } from './logger'; -import { BlockSchema } from '@blocksuite/blocks/models'; import { applyUpdate, encodeStateAsUpdate } from 'yjs'; +import { createBlocksuiteWorkspace } from './utils/index.js'; /** * @class DataCenter @@ -89,7 +89,13 @@ export class DataCenter { 'There is no provider. You should add provider first.' ); - const workspace = await this._mainProvider.createWorkspace(workspaceMeta); + const workspaceId = await this._mainProvider.createWorkspaceId( + workspaceMeta + ); + + const workspace = createBlocksuiteWorkspace(workspaceId); + + await this._mainProvider.createWorkspace(workspace, workspaceMeta); return workspace; } @@ -109,14 +115,12 @@ export class DataCenter { * get a new workspace only has room id * @param {string} workspaceId workspace id */ - private _getWorkspace(workspaceId: string) { + private _getBlocksuiteWorkspace(workspaceId: string) { const workspaceInfo = this._workspaces.find(workspaceId); assert(workspaceInfo, 'Workspace not found'); return ( this._workspaceInstances.get(workspaceId) || - new BlocksuiteWorkspace({ - room: workspaceId, - }).register(BlockSchema) + createBlocksuiteWorkspace(workspaceId) ); } @@ -155,7 +159,7 @@ export class DataCenter { const provider = this.providerMap.get(workspaceInfo.provider); assert(provider, `provide '${workspaceInfo.provider}' is not registered`); this._logger(`Loading ${workspaceInfo.provider} workspace: `, workspaceId); - const workspace = this._getWorkspace(workspaceId); + const workspace = this._getBlocksuiteWorkspace(workspaceId); this._workspaceInstances.set(workspaceId, workspace); return await provider.warpWorkspace(workspace); } @@ -288,11 +292,17 @@ export class DataCenter { const newProvider = this.providerMap.get(providerId); assert(newProvider, `provide '${providerId}' is not registered`); this._logger(`create ${providerId} workspace: `, workspaceInfo.name); - // TODO optimize this function - const newWorkspace = await newProvider.createWorkspace({ + const newWorkspaceId = await newProvider.createWorkspaceId({ name: workspaceInfo.name, avatar: workspaceInfo.avatar, }); + const newWorkspace = createBlocksuiteWorkspace(newWorkspaceId); + // TODO optimize this function + await newProvider.createWorkspace(newWorkspace, { + name: workspaceInfo.name, + avatar: workspaceInfo.avatar, + }); + assert(newWorkspace, 'Create workspace failed'); this._logger( `update workspace data from ${workspaceInfo.provider} to ${providerId}` diff --git a/packages/data-center/src/provider/affine/affine.ts b/packages/data-center/src/provider/affine/affine.ts index 6cb876a52..763871149 100644 --- a/packages/data-center/src/provider/affine/affine.ts +++ b/packages/data-center/src/provider/affine/affine.ts @@ -58,17 +58,24 @@ export class AffineProvider extends BaseProvider { } } - override async warpWorkspace(workspace: BlocksuiteWorkspace) { - const { doc, room } = workspace; - assert(room); - this.linkLocal(workspace); - const updates = await this._apis.downloadWorkspace(room); + private async _applyCloudUpdates(blocksuiteWorkspace: BlocksuiteWorkspace) { + const { doc, room: workspaceId } = blocksuiteWorkspace; + assert(workspaceId, 'Blocksuite Workspace without room(workspaceId).'); + const updates = await this._apis.downloadWorkspace(workspaceId); if (updates && updates.byteLength) { await new Promise(resolve => { doc.once('update', resolve); - applyUpdate(doc, new Uint8Array(updates)); + BlocksuiteWorkspace.Y.applyUpdate(doc, new Uint8Array(updates)); }); } + } + + override async warpWorkspace(workspace: BlocksuiteWorkspace) { + await this._applyCloudUpdates(workspace); + const { doc, room } = workspace; + assert(room); + this.linkLocal(workspace); + let ws = this._wsMap.get(room); if (!ws) { ws = new WebsocketProvider('/', room, doc); @@ -247,23 +254,29 @@ export class AffineProvider extends BaseProvider { // return workspace; } - public override async createWorkspace( + public override async createWorkspaceId( meta: WorkspaceMeta - ): Promise { - assert(meta.name, 'Workspace name is required'); + ): Promise { const { id } = await this._apis.createWorkspace( meta as Required ); + return id; + } + + public override async createWorkspace( + blocksuiteWorkspace: BlocksuiteWorkspace, + meta: WorkspaceMeta + ): Promise { + const workspaceId = blocksuiteWorkspace.room; + assert(workspaceId, 'Blocksuite Workspace without room(workspaceId).'); this._logger('Creating affine workspace'); - const nw = new BlocksuiteWorkspace({ - room: id, - }).register(BlockSchema); - nw.meta.setName(meta.name); - this.linkLocal(nw); + + this._applyCloudUpdates(blocksuiteWorkspace); + this.linkLocal(blocksuiteWorkspace); const workspaceInfo: WorkspaceInfo = { name: meta.name, - id, + id: workspaceId, isPublish: false, avatar: '', owner: undefined, @@ -272,20 +285,20 @@ export class AffineProvider extends BaseProvider { provider: 'affine', }; - if (!meta.avatar) { + if (!blocksuiteWorkspace.meta.avatar) { // set default avatar const blob = await getDefaultHeadImgBlob(meta.name); - const blobStorage = await nw.blobs; + const blobStorage = await blocksuiteWorkspace.blobs; assert(blobStorage, 'No blob storage'); const blobId = await blobStorage.set(blob); const avatar = await blobStorage.get(blobId); if (avatar) { - nw.meta.setAvatar(avatar); + blocksuiteWorkspace.meta.setAvatar(avatar); workspaceInfo.avatar = avatar; } } this._workspaces.add(workspaceInfo); - return nw; + return blocksuiteWorkspace; } public override async publish(id: string, isPublish: boolean): Promise { diff --git a/packages/data-center/src/provider/base.ts b/packages/data-center/src/provider/base.ts index 966141f50..b7d46e5ab 100644 --- a/packages/data-center/src/provider/base.ts +++ b/packages/data-center/src/provider/base.ts @@ -1,4 +1,4 @@ -import { Workspace as BlocksuiteWorkspace } from '@blocksuite/store'; +import { Workspace as BlocksuiteWorkspace, uuidv4 } from '@blocksuite/store'; import { Logger, User, WorkspaceInfo, WorkspaceMeta } from '../types'; import type { WorkspacesScope } from '../workspaces'; @@ -28,6 +28,10 @@ export class BaseProvider { return; } + public async createWorkspaceId(meta: WorkspaceMeta): Promise { + return uuidv4(); + } + /** * auth provider */ @@ -155,10 +159,10 @@ export class BaseProvider { * @param {WorkspaceMeta} meta */ public async createWorkspace( + blocksuiteWorkspace: BlocksuiteWorkspace, meta: WorkspaceMeta ): Promise { - meta; - return; + return blocksuiteWorkspace; } /** diff --git a/packages/data-center/src/provider/local/local.ts b/packages/data-center/src/provider/local/local.ts index 2d368fdf5..ecdf32562 100644 --- a/packages/data-center/src/provider/local/local.ts +++ b/packages/data-center/src/provider/local/local.ts @@ -76,6 +76,7 @@ export class LocalProvider extends BaseProvider { } public override async createWorkspace( + blocksuiteWorkspace: BlocksuiteWorkspace, meta: WorkspaceMeta ): Promise { assert(meta.name, 'Workspace name is required'); @@ -92,18 +93,17 @@ export class LocalProvider extends BaseProvider { provider: 'local', }; - const workspace = new BlocksuiteWorkspace({ room: workspaceInfo.id }); - this.linkLocal(workspace); - workspace.meta.setName(meta.name); + this.linkLocal(blocksuiteWorkspace); + blocksuiteWorkspace.meta.setName(meta.name); if (!meta.avatar) { // set default avatar const blob = await getDefaultHeadImgBlob(meta.name); - const blobStorage = await workspace.blobs; + const blobStorage = await blocksuiteWorkspace.blobs; assert(blobStorage, 'No blob storage'); const blobId = await blobStorage.set(blob); const avatar = await blobStorage.get(blobId); if (avatar) { - workspace.meta.setAvatar(avatar); + blocksuiteWorkspace.meta.setAvatar(avatar); workspaceInfo.avatar = avatar; } } @@ -111,7 +111,7 @@ export class LocalProvider extends BaseProvider { this._workspaces.add(workspaceInfo); this._storeWorkspaces(this._workspaces.list()); - return workspace; + return blocksuiteWorkspace; } public override async clear(): Promise { diff --git a/packages/data-center/src/utils/index.ts b/packages/data-center/src/utils/index.ts index d1040b024..2f2c516d8 100644 --- a/packages/data-center/src/utils/index.ts +++ b/packages/data-center/src/utils/index.ts @@ -1,3 +1,12 @@ +import { Workspace as BlocksuiteWorkspace } from '@blocksuite/store'; +import { BlockSchema } from '@blocksuite/blocks/models'; + +export const createBlocksuiteWorkspace = (workspaceId: string) => { + return new BlocksuiteWorkspace({ + room: workspaceId, + }).register(BlockSchema); +}; + const DefaultHeadImgColors = [ ['#C6F2F3', '#0C6066'], ['#FFF5AB', '#896406'],