fix: upload origin doc when enable cloud (#729)
This commit is contained in:
@@ -13,11 +13,7 @@ import { getApis, Workspace } from './apis/index.js';
|
|||||||
import type { Apis, WorkspaceDetail, Callback } from './apis';
|
import type { Apis, WorkspaceDetail, Callback } from './apis';
|
||||||
import { token } from './apis/token.js';
|
import { token } from './apis/token.js';
|
||||||
import { WebsocketClient } from './channel';
|
import { WebsocketClient } from './channel';
|
||||||
import {
|
import { loadWorkspaceUnit, createWorkspaceUnit } from './utils.js';
|
||||||
loadWorkspaceUnit,
|
|
||||||
createWorkspaceUnit,
|
|
||||||
syncToCloud,
|
|
||||||
} from './utils.js';
|
|
||||||
import { WorkspaceUnit } from '../../workspace-unit.js';
|
import { WorkspaceUnit } from '../../workspace-unit.js';
|
||||||
import { createBlocksuiteWorkspace, applyUpdate } from '../../utils/index.js';
|
import { createBlocksuiteWorkspace, applyUpdate } from '../../utils/index.js';
|
||||||
import type { SyncMode } from '../../workspace-unit';
|
import type { SyncMode } from '../../workspace-unit';
|
||||||
@@ -316,7 +312,22 @@ export class AffineProvider extends BaseProvider {
|
|||||||
public override async createWorkspace(
|
public override async createWorkspace(
|
||||||
meta: CreateWorkspaceInfoParams
|
meta: CreateWorkspaceInfoParams
|
||||||
): Promise<WorkspaceUnit | undefined> {
|
): 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({
|
const workspaceUnit = await createWorkspaceUnit({
|
||||||
id,
|
id,
|
||||||
@@ -329,10 +340,6 @@ export class AffineProvider extends BaseProvider {
|
|||||||
syncMode: 'core',
|
syncMode: 'core',
|
||||||
});
|
});
|
||||||
|
|
||||||
await syncToCloud(
|
|
||||||
workspaceUnit.blocksuiteWorkspace!,
|
|
||||||
this._apis.token.refresh
|
|
||||||
);
|
|
||||||
this._workspaces.add(workspaceUnit);
|
this._workspaces.add(workspaceUnit);
|
||||||
|
|
||||||
return workspaceUnit;
|
return workspaceUnit;
|
||||||
@@ -360,9 +367,11 @@ export class AffineProvider extends BaseProvider {
|
|||||||
public override async extendWorkspace(
|
public override async extendWorkspace(
|
||||||
workspaceUnit: WorkspaceUnit
|
workspaceUnit: WorkspaceUnit
|
||||||
): Promise<WorkspaceUnit> {
|
): Promise<WorkspaceUnit> {
|
||||||
const { id } = await this._apis.createWorkspace({
|
const { id } = await this._apis.createWorkspace(
|
||||||
name: workspaceUnit.name,
|
new Blob([
|
||||||
});
|
encodeStateAsUpdate(workspaceUnit.blocksuiteWorkspace!.doc).buffer,
|
||||||
|
])
|
||||||
|
);
|
||||||
const newWorkspaceUnit = new WorkspaceUnit({
|
const newWorkspaceUnit = new WorkspaceUnit({
|
||||||
id,
|
id,
|
||||||
name: workspaceUnit.name,
|
name: workspaceUnit.name,
|
||||||
@@ -381,8 +390,6 @@ export class AffineProvider extends BaseProvider {
|
|||||||
encodeStateAsUpdate(workspaceUnit.blocksuiteWorkspace.doc)
|
encodeStateAsUpdate(workspaceUnit.blocksuiteWorkspace.doc)
|
||||||
);
|
);
|
||||||
|
|
||||||
await syncToCloud(blocksuiteWorkspace, this._apis.token.refresh);
|
|
||||||
|
|
||||||
newWorkspaceUnit.setBlocksuiteWorkspace(blocksuiteWorkspace);
|
newWorkspaceUnit.setBlocksuiteWorkspace(blocksuiteWorkspace);
|
||||||
|
|
||||||
this._workspaces.add(newWorkspaceUnit);
|
this._workspaces.add(newWorkspaceUnit);
|
||||||
|
|||||||
@@ -112,10 +112,10 @@ export interface CreateWorkspaceParams {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function createWorkspace(
|
export async function createWorkspace(
|
||||||
params: CreateWorkspaceParams
|
encodedYDoc: Blob
|
||||||
): Promise<{ id: string }> {
|
): Promise<{ id: string }> {
|
||||||
try {
|
try {
|
||||||
return client.post('api/workspace', { json: params }).json();
|
return client.post('api/workspace', { body: encodedYDoc }).json();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
sendMessage(messageCode.createWorkspaceFailed);
|
sendMessage(messageCode.createWorkspaceFailed);
|
||||||
throw new RequestError('create workspace failed', error);
|
throw new RequestError('create workspace failed', error);
|
||||||
|
|||||||
@@ -1,10 +1,7 @@
|
|||||||
import assert from 'assert';
|
|
||||||
import { Workspace as BlocksuiteWorkspace } from '@blocksuite/store';
|
|
||||||
import { WorkspaceUnit } from '../../workspace-unit.js';
|
import { WorkspaceUnit } from '../../workspace-unit.js';
|
||||||
import type { WorkspaceUnitCtorParams } from '../../workspace-unit';
|
import type { WorkspaceUnitCtorParams } from '../../workspace-unit';
|
||||||
import { createBlocksuiteWorkspace } from '../../utils/index.js';
|
import { createBlocksuiteWorkspace } from '../../utils/index.js';
|
||||||
import type { Apis } from './apis';
|
import type { Apis } from './apis';
|
||||||
import { WebsocketProvider } from './sync.js';
|
|
||||||
import { setDefaultAvatar } from '../utils.js';
|
import { setDefaultAvatar } from '../utils.js';
|
||||||
import { applyUpdate } from '../../utils/index.js';
|
import { applyUpdate } from '../../utils/index.js';
|
||||||
|
|
||||||
@@ -42,37 +39,6 @@ export const loadWorkspaceUnit = async (
|
|||||||
return workspaceUnit;
|
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) => {
|
export const createWorkspaceUnit = async (params: WorkspaceUnitCtorParams) => {
|
||||||
const workspaceUnit = new WorkspaceUnit(params);
|
const workspaceUnit = new WorkspaceUnit(params);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user