feat: bump blocksuite (#6078)

This commit is contained in:
regischen
2024-03-13 17:04:21 +08:00
committed by GitHub
parent 573528be41
commit fddbb426a6
126 changed files with 891 additions and 918 deletions
@@ -22,7 +22,7 @@ describe('Workspace System', () => {
expect(workspaceListService.workspaceList.value.length).toBe(1);
const page = workspace.blockSuiteWorkspace.createDoc({
const page = workspace.docCollection.createDoc({
id: 'page0',
});
page.load();
@@ -30,7 +30,7 @@ describe('Workspace System', () => {
title: new page.Text('test-page'),
});
expect(workspace.blockSuiteWorkspace.docs.size).toBe(1);
expect(workspace.docCollection.docs.size).toBe(1);
expect(
(page!.getBlockByFlavour('affine:page')[0] as any).title.toString()
).toBe('test-page');
@@ -18,7 +18,7 @@
* })
*/
import { Workspace as BlockSuiteWorkspace } from '@blocksuite/store';
import { DocCollection } from '@blocksuite/store';
import { nanoid } from 'nanoid';
import type { Awareness } from 'y-protocols/awareness.js';
import type { Doc as YDoc } from 'yjs';
@@ -29,7 +29,7 @@ import { globalBlockSuiteSchema } from './global-schema';
import type { WorkspaceMetadata } from './metadata';
import { WorkspaceScope } from './service-scope';
export const BlockSuiteWorkspaceContext = createIdentifier<BlockSuiteWorkspace>(
export const BlockSuiteWorkspaceContext = createIdentifier<DocCollection>(
'BlockSuiteWorkspaceContext'
);
@@ -53,7 +53,7 @@ export function configureWorkspaceContext(
.addImpl(WorkspaceMetadataContext, workspaceMetadata)
.addImpl(WorkspaceIdContext, workspaceMetadata.id)
.addImpl(BlockSuiteWorkspaceContext, provider => {
return new BlockSuiteWorkspace({
return new DocCollection({
id: workspaceMetadata.id,
blobStorages: [
() => ({
@@ -1,5 +1,5 @@
import { WorkspaceFlavour } from '@affine/env/workspace';
import { Workspace } from '@blocksuite/store';
import { DocCollection } from '@blocksuite/store';
import { beforeEach, describe, expect, test, vi } from 'vitest';
import { Doc } from 'yjs';
@@ -26,14 +26,14 @@ describe('SyncEngine', () => {
const storage2 = new MemoryMemento();
let prev: any;
{
const workspace = new Workspace({
const docCollection = new DocCollection({
id: 'test',
schema: globalBlockSuiteSchema,
});
const syncEngine = new SyncEngine(
workspace.doc,
docCollection.doc,
new TestingSyncStorage(testMeta, storage),
[
new TestingSyncStorage(testMeta, storage1),
@@ -42,7 +42,7 @@ describe('SyncEngine', () => {
);
syncEngine.start();
const page = workspace.createDoc({
const page = docCollection.createDoc({
id: 'page0',
});
page.load();
@@ -69,23 +69,23 @@ describe('SyncEngine', () => {
);
await syncEngine.waitForSynced();
syncEngine.forceStop();
prev = workspace.doc.toJSON();
prev = docCollection.doc.toJSON();
}
for (const current of [storage, storage1, storage2]) {
const workspace = new Workspace({
const docCollection = new DocCollection({
id: 'test',
schema: globalBlockSuiteSchema,
});
const syncEngine = new SyncEngine(
workspace.doc,
docCollection.doc,
new TestingSyncStorage(testMeta, current),
[]
);
syncEngine.start();
await syncEngine.waitForSynced();
expect(workspace.doc.toJSON()).toEqual({
expect(docCollection.doc.toJSON()).toEqual({
...prev,
});
syncEngine.forceStop();
@@ -1,5 +1,5 @@
import { WorkspaceFlavour } from '@affine/env/workspace';
import { Workspace } from '@blocksuite/store';
import { DocCollection } from '@blocksuite/store';
import { beforeEach, describe, expect, test, vi } from 'vitest';
import { MemoryMemento } from '../../../../storage';
@@ -23,19 +23,19 @@ describe('SyncPeer', () => {
let prev: any;
{
const workspace = new Workspace({
const docCollection = new DocCollection({
id: 'test',
schema: globalBlockSuiteSchema,
});
const syncPeer = new SyncPeer(
workspace.doc,
docCollection.doc,
new TestingSyncStorage(testMeta, storage)
);
await syncPeer.waitForLoaded();
const page = workspace.createDoc({
const page = docCollection.createDoc({
id: 'page0',
});
page.load();
@@ -62,21 +62,21 @@ describe('SyncPeer', () => {
);
await syncPeer.waitForSynced();
syncPeer.stop();
prev = workspace.doc.toJSON();
prev = docCollection.doc.toJSON();
}
{
const workspace = new Workspace({
const docCollection = new DocCollection({
id: 'test',
schema: globalBlockSuiteSchema,
});
const syncPeer = new SyncPeer(
workspace.doc,
docCollection.doc,
new TestingSyncStorage(testMeta, storage)
);
await syncPeer.waitForSynced();
expect(workspace.doc.toJSON()).toEqual({
expect(docCollection.doc.toJSON()).toEqual({
...prev,
});
syncPeer.stop();
@@ -86,21 +86,21 @@ describe('SyncPeer', () => {
test('status', async () => {
const storage = new MemoryMemento();
const workspace = new Workspace({
const docCollection = new DocCollection({
id: 'test',
schema: globalBlockSuiteSchema,
});
const syncPeer = new SyncPeer(
workspace.doc,
docCollection.doc,
new TestingSyncStorage(testMeta, storage)
);
expect(syncPeer.status.step).toBe(SyncPeerStep.LoadingRootDoc);
await syncPeer.waitForSynced();
expect(syncPeer.status.step).toBe(SyncPeerStep.Synced);
const page = workspace.createDoc({
const page = docCollection.createDoc({
id: 'page0',
});
expect(syncPeer.status.step).toBe(SyncPeerStep.LoadingSubDoc);
@@ -1,6 +1,6 @@
import { DebugLogger } from '@affine/debug';
import type { WorkspaceFlavour } from '@affine/env/workspace';
import type { Workspace as BlockSuiteWorkspace } from '@blocksuite/store';
import type { DocCollection } from '@blocksuite/store';
import { differenceWith } from 'lodash-es';
import { createIdentifier } from '../../di';
@@ -34,7 +34,7 @@ export interface WorkspaceListProvider {
*/
create(
initial: (
workspace: BlockSuiteWorkspace,
docCollection: DocCollection,
blobStorage: BlobStorage
) => Promise<void>
): Promise<WorkspaceMetadata>;
@@ -124,7 +124,7 @@ export class WorkspaceListService {
async create(
flavour: WorkspaceFlavour,
initial: (
workspace: BlockSuiteWorkspace,
docCollection: DocCollection,
blobStorage: BlobStorage
) => Promise<void> = () => Promise.resolve()
) {
@@ -57,13 +57,13 @@ export class WorkspaceInformation {
*/
syncWithWorkspace(workspace: Workspace) {
this.info = {
avatar: workspace.blockSuiteWorkspace.meta.avatar ?? this.info.avatar,
name: workspace.blockSuiteWorkspace.meta.name ?? this.info.name,
avatar: workspace.docCollection.meta.avatar ?? this.info.avatar,
name: workspace.docCollection.meta.name ?? this.info.name,
};
workspace.blockSuiteWorkspace.meta.commonFieldsUpdated.on(() => {
workspace.docCollection.meta.commonFieldsUpdated.on(() => {
this.info = {
avatar: workspace.blockSuiteWorkspace.meta.avatar ?? this.info.avatar,
name: workspace.blockSuiteWorkspace.meta.name ?? this.info.name,
avatar: workspace.docCollection.meta.avatar ?? this.info.avatar,
name: workspace.docCollection.meta.name ?? this.info.name,
};
});
}
@@ -2,7 +2,7 @@ import { DebugLogger } from '@affine/debug';
import { setupEditorFlags } from '@affine/env/global';
import { WorkspaceFlavour } from '@affine/env/workspace';
import { assertEquals } from '@blocksuite/global/utils';
import type { Workspace as BlockSuiteWorkspace } from '@blocksuite/store';
import type { DocCollection } from '@blocksuite/store';
import { applyUpdate, encodeStateAsUpdate } from 'yjs';
import { fixWorkspaceVersion } from '../blocksuite';
@@ -105,7 +105,7 @@ export class WorkspaceManager {
createWorkspace(
flavour: WorkspaceFlavour,
initial?: (
workspace: BlockSuiteWorkspace,
docCollection: DocCollection,
blobStorage: BlobStorage
) => Promise<void>
): Promise<WorkspaceMetadata> {
@@ -131,9 +131,9 @@ export class WorkspaceManager {
const newId = await this.list.create(
WorkspaceFlavour.AFFINE_CLOUD,
async (ws, bs) => {
applyUpdate(ws.doc, encodeStateAsUpdate(local.blockSuiteWorkspace.doc));
applyUpdate(ws.doc, encodeStateAsUpdate(local.docCollection.doc));
for (const subdoc of local.blockSuiteWorkspace.doc.getSubdocs()) {
for (const subdoc of local.docCollection.doc.getSubdocs()) {
for (const newSubdoc of ws.doc.getSubdocs()) {
if (newSubdoc.guid === subdoc.guid) {
applyUpdate(newSubdoc, encodeStateAsUpdate(subdoc));
@@ -191,9 +191,9 @@ export class WorkspaceManager {
const workspace = provider.get(Workspace);
// apply compatibility fix
fixWorkspaceVersion(workspace.blockSuiteWorkspace.doc);
fixWorkspaceVersion(workspace.docCollection.doc);
setupEditorFlags(workspace.blockSuiteWorkspace);
setupEditorFlags(workspace.docCollection);
return workspace;
}
@@ -1,5 +1,5 @@
import { WorkspaceFlavour } from '@affine/env/workspace';
import { Workspace as BlockSuiteWorkspace } from '@blocksuite/store';
import { DocCollection } from '@blocksuite/store';
import { differenceBy } from 'lodash-es';
import { nanoid } from 'nanoid';
import { applyUpdate, encodeStateAsUpdate } from 'yjs';
@@ -43,7 +43,7 @@ export class TestingLocalWorkspaceListProvider
}
async create(
initial: (
workspace: BlockSuiteWorkspace,
docCollection: DocCollection,
blobStorage: BlobStorage
) => Promise<void>
): Promise<WorkspaceMetadata> {
@@ -53,18 +53,18 @@ export class TestingLocalWorkspaceListProvider
const blobStorage = new TestingBlobStorage(meta, this.state);
const syncStorage = new TestingSyncStorage(meta, this.state);
const workspace = new BlockSuiteWorkspace({
const docCollection = new DocCollection({
id: id,
idGenerator: () => nanoid(),
schema: globalBlockSuiteSchema,
});
// apply initial state
await initial(workspace, blobStorage);
await initial(docCollection, blobStorage);
// save workspace to storage
await syncStorage.push(id, encodeStateAsUpdate(workspace.doc));
for (const subdocs of workspace.doc.getSubdocs()) {
await syncStorage.push(id, encodeStateAsUpdate(docCollection.doc));
for (const subdocs of docCollection.doc.getSubdocs()) {
await syncStorage.push(subdocs.guid, encodeStateAsUpdate(subdocs));
}
@@ -117,7 +117,7 @@ export class TestingLocalWorkspaceListProvider
return;
}
const bs = new BlockSuiteWorkspace({
const bs = new DocCollection({
id,
schema: globalBlockSuiteSchema,
});
+14 -17
View File
@@ -1,7 +1,7 @@
import { Unreachable } from '@affine/env/constant';
import { WorkspaceFlavour } from '@affine/env/workspace';
import { Slot } from '@blocksuite/global/utils';
import type { Workspace as BlockSuiteWorkspace } from '@blocksuite/store';
import type { DocCollection } from '@blocksuite/store';
import { applyUpdate, Doc as YDoc, encodeStateAsUpdate } from 'yjs';
import { checkWorkspaceCompatibility, MigrationPoint } from '../blocksuite';
@@ -38,18 +38,18 @@ export class WorkspaceUpgradeController {
}
constructor(
private readonly blockSuiteWorkspace: BlockSuiteWorkspace,
private readonly docCollection: DocCollection,
private readonly sync: SyncEngine,
private readonly workspaceMetadata: WorkspaceMetadata
) {
blockSuiteWorkspace.doc.on('update', () => {
docCollection.doc.on('update', () => {
this.checkIfNeedUpgrade();
});
}
checkIfNeedUpgrade() {
const needUpgrade = !!checkWorkspaceCompatibility(
this.blockSuiteWorkspace,
this.docCollection,
this.workspaceMetadata.flavour === WorkspaceFlavour.AFFINE_CLOUD
);
this.status = {
@@ -72,7 +72,7 @@ export class WorkspaceUpgradeController {
await this.sync.waitForSynced();
const step = checkWorkspaceCompatibility(
this.blockSuiteWorkspace,
this.docCollection,
this.workspaceMetadata.flavour === WorkspaceFlavour.AFFINE_CLOUD
);
@@ -82,9 +82,9 @@ export class WorkspaceUpgradeController {
// Clone a new doc to prevent change events.
const clonedDoc = new YDoc({
guid: this.blockSuiteWorkspace.doc.guid,
guid: this.docCollection.doc.guid,
});
applyDoc(clonedDoc, this.blockSuiteWorkspace.doc);
applyDoc(clonedDoc, this.docCollection.doc);
if (step === MigrationPoint.SubDoc) {
const newWorkspace = await workspaceManager.createWorkspace(
@@ -92,14 +92,11 @@ export class WorkspaceUpgradeController {
async (workspace, blobStorage) => {
await upgradeV1ToV2(clonedDoc, workspace.doc);
migrateGuidCompatibility(clonedDoc);
await forceUpgradePages(
workspace.doc,
this.blockSuiteWorkspace.schema
);
const blobList = await this.blockSuiteWorkspace.blob.list();
await forceUpgradePages(workspace.doc, this.docCollection.schema);
const blobList = await this.docCollection.blob.list();
for (const blobKey of blobList) {
const blob = await this.blockSuiteWorkspace.blob.get(blobKey);
const blob = await this.docCollection.blob.get(blobKey);
if (blob) {
await blobStorage.set(blobKey, blob);
}
@@ -110,13 +107,13 @@ export class WorkspaceUpgradeController {
return newWorkspace;
} else if (step === MigrationPoint.GuidFix) {
migrateGuidCompatibility(clonedDoc);
await forceUpgradePages(clonedDoc, this.blockSuiteWorkspace.schema);
applyDoc(this.blockSuiteWorkspace.doc, clonedDoc);
await forceUpgradePages(clonedDoc, this.docCollection.schema);
applyDoc(this.docCollection.doc, clonedDoc);
await this.sync.waitForSynced();
return null;
} else if (step === MigrationPoint.BlockVersion) {
await forceUpgradePages(clonedDoc, this.blockSuiteWorkspace.schema);
applyDoc(this.blockSuiteWorkspace.doc, clonedDoc);
await forceUpgradePages(clonedDoc, this.docCollection.schema);
applyDoc(this.docCollection.doc, clonedDoc);
await this.sync.waitForSynced();
return null;
} else {
@@ -1,6 +1,6 @@
import { DebugLogger } from '@affine/debug';
import { Slot } from '@blocksuite/global/utils';
import type { Workspace as BlockSuiteWorkspace } from '@blocksuite/store';
import type { DocCollection } from '@blocksuite/store';
import type { ServiceProvider } from '../di';
import { CleanupService } from '../lifecycle';
@@ -10,7 +10,7 @@ import { type WorkspaceMetadata } from './metadata';
import type { WorkspaceUpgradeController } from './upgrade';
import { type WorkspaceUpgradeStatus } from './upgrade';
export type { Workspace as BlockSuiteWorkspace } from '@blocksuite/store';
export type { DocCollection } from '@blocksuite/store';
const logger = new DebugLogger('affine:workspace');
@@ -67,7 +67,7 @@ export class Workspace {
constructor(
public meta: WorkspaceMetadata,
public engine: WorkspaceEngine,
public blockSuiteWorkspace: BlockSuiteWorkspace,
public docCollection: DocCollection,
public upgrade: WorkspaceUpgradeController,
public services: ServiceProvider
) {