From 03ff4c3e3db4efa46c868763b191df7bac112020 Mon Sep 17 00:00:00 2001 From: zuomeng wang Date: Fri, 13 Jan 2023 15:09:56 +0800 Subject: [PATCH] fix: upload origin doc when enable cloud (#729) --- .../data-center/src/provider/affine/affine.ts | 37 +++++++++++-------- .../src/provider/affine/apis/workspace.ts | 4 +- .../data-center/src/provider/affine/utils.ts | 34 ----------------- 3 files changed, 24 insertions(+), 51 deletions(-) diff --git a/packages/data-center/src/provider/affine/affine.ts b/packages/data-center/src/provider/affine/affine.ts index c8078c4cdc..793d7e7cd9 100644 --- a/packages/data-center/src/provider/affine/affine.ts +++ b/packages/data-center/src/provider/affine/affine.ts @@ -13,11 +13,7 @@ import { getApis, Workspace } from './apis/index.js'; import type { Apis, WorkspaceDetail, Callback } from './apis'; import { token } from './apis/token.js'; import { WebsocketClient } from './channel'; -import { - loadWorkspaceUnit, - createWorkspaceUnit, - syncToCloud, -} from './utils.js'; +import { loadWorkspaceUnit, createWorkspaceUnit } from './utils.js'; import { WorkspaceUnit } from '../../workspace-unit.js'; import { createBlocksuiteWorkspace, applyUpdate } from '../../utils/index.js'; import type { SyncMode } from '../../workspace-unit'; @@ -316,7 +312,22 @@ export class AffineProvider extends BaseProvider { public override async createWorkspace( meta: CreateWorkspaceInfoParams ): Promise { - const { id } = await this._apis.createWorkspace(meta); + const workspaceUnitForUpload = await createWorkspaceUnit({ + id: '', + name: meta.name, + avatar: undefined, + owner: await this.getUserInfo(), + published: false, + memberCount: 1, + provider: this.id, + syncMode: 'core', + }); + const { id } = await this._apis.createWorkspace( + new Blob([ + encodeStateAsUpdate(workspaceUnitForUpload.blocksuiteWorkspace!.doc) + .buffer, + ]) + ); const workspaceUnit = await createWorkspaceUnit({ id, @@ -329,10 +340,6 @@ export class AffineProvider extends BaseProvider { syncMode: 'core', }); - await syncToCloud( - workspaceUnit.blocksuiteWorkspace!, - this._apis.token.refresh - ); this._workspaces.add(workspaceUnit); return workspaceUnit; @@ -360,9 +367,11 @@ export class AffineProvider extends BaseProvider { public override async extendWorkspace( workspaceUnit: WorkspaceUnit ): Promise { - const { id } = await this._apis.createWorkspace({ - name: workspaceUnit.name, - }); + const { id } = await this._apis.createWorkspace( + new Blob([ + encodeStateAsUpdate(workspaceUnit.blocksuiteWorkspace!.doc).buffer, + ]) + ); const newWorkspaceUnit = new WorkspaceUnit({ id, name: workspaceUnit.name, @@ -381,8 +390,6 @@ export class AffineProvider extends BaseProvider { encodeStateAsUpdate(workspaceUnit.blocksuiteWorkspace.doc) ); - await syncToCloud(blocksuiteWorkspace, this._apis.token.refresh); - newWorkspaceUnit.setBlocksuiteWorkspace(blocksuiteWorkspace); this._workspaces.add(newWorkspaceUnit); diff --git a/packages/data-center/src/provider/affine/apis/workspace.ts b/packages/data-center/src/provider/affine/apis/workspace.ts index 106dc72b04..584db159fe 100644 --- a/packages/data-center/src/provider/affine/apis/workspace.ts +++ b/packages/data-center/src/provider/affine/apis/workspace.ts @@ -112,10 +112,10 @@ export interface CreateWorkspaceParams { } export async function createWorkspace( - params: CreateWorkspaceParams + encodedYDoc: Blob ): Promise<{ id: string }> { try { - return client.post('api/workspace', { json: params }).json(); + return client.post('api/workspace', { body: encodedYDoc }).json(); } catch (error) { sendMessage(messageCode.createWorkspaceFailed); throw new RequestError('create workspace failed', error); diff --git a/packages/data-center/src/provider/affine/utils.ts b/packages/data-center/src/provider/affine/utils.ts index 93c2f56007..4bb401fbf2 100644 --- a/packages/data-center/src/provider/affine/utils.ts +++ b/packages/data-center/src/provider/affine/utils.ts @@ -1,10 +1,7 @@ -import assert from 'assert'; -import { Workspace as BlocksuiteWorkspace } from '@blocksuite/store'; import { WorkspaceUnit } from '../../workspace-unit.js'; import type { WorkspaceUnitCtorParams } from '../../workspace-unit'; import { createBlocksuiteWorkspace } from '../../utils/index.js'; import type { Apis } from './apis'; -import { WebsocketProvider } from './sync.js'; import { setDefaultAvatar } from '../utils.js'; import { applyUpdate } from '../../utils/index.js'; @@ -42,37 +39,6 @@ export const loadWorkspaceUnit = async ( return workspaceUnit; }; -export const syncToCloud = async ( - blocksuiteWorkspace: BlocksuiteWorkspace, - refreshToken: string -) => { - const workspaceId = blocksuiteWorkspace.room; - assert(workspaceId, 'Blocksuite workspace without room(workspaceId).'); - - const wsUrl = `${window.location.protocol === 'https:' ? 'wss' : 'ws'}://${ - window.location.host - }/api/sync/`; - - const ws = new WebsocketProvider( - wsUrl, - workspaceId, - blocksuiteWorkspace.doc, - { - params: { token: refreshToken }, - } - ); - - await new Promise((resolve, reject) => { - ws.once('synced', () => { - // FIXME: we don't when send local data to cloud successfully, so hack to wait 1s. - // Server will support this by add a new api. - setTimeout(resolve, 1000); - }); - ws.once('lost-connection', () => reject()); - ws.once('connection-error', () => reject()); - }); -}; - export const createWorkspaceUnit = async (params: WorkspaceUnitCtorParams) => { const workspaceUnit = new WorkspaceUnit(params);