fix: upload origin doc when enable cloud (#729)

This commit is contained in:
zuomeng wang
2023-01-13 15:09:56 +08:00
committed by GitHub
parent 3efc4b554b
commit 03ff4c3e3d
3 changed files with 24 additions and 51 deletions

View File

@@ -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<WorkspaceUnit | undefined> {
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<WorkspaceUnit> {
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);

View File

@@ -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);

View File

@@ -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);