From a440e85ffe4a7f2de82bb5dedcb2187ffe1e2947 Mon Sep 17 00:00:00 2001 From: EYHN Date: Mon, 27 May 2024 05:11:12 +0000 Subject: [PATCH] chore: bump blocksuite (#7075) ## Features - toeverything/blocksuite#6937 @Flrande ## Bugfix - toeverything/blocksuite#7137 @fundon - toeverything/blocksuite#7126 @golok727 - toeverything/blocksuite#7128 @CatsJuice - toeverything/blocksuite#7130 @fundon ## Refactor ## Misc - toeverything/blocksuite#7131 @fundon ## Additional changes Adjust the awareness provider so that it only obtains awareness instances when connect, and fixes the dependencies between workspace components. --- packages/common/env/package.json | 4 +- packages/common/infra/package.json | 10 +- .../src/modules/workspace/entities/engine.ts | 2 +- .../src/modules/workspace/entities/upgrade.ts | 4 +- .../modules/workspace/entities/workspace.ts | 21 +-- .../infra/src/modules/workspace/index.ts | 2 +- .../modules/workspace/providers/flavour.ts | 3 +- .../src/modules/workspace/services/engine.ts | 8 +- .../workspace/testing/testing-provider.ts | 15 +- packages/common/infra/src/sync/awareness.ts | 8 +- packages/common/infra/src/sync/blob/blob.ts | 3 + packages/frontend/component/package.json | 10 +- packages/frontend/core/package.json | 12 +- .../affine/page-history-modal/data.ts | 8 +- .../new-workspace-setting-detail/profile.tsx | 2 +- .../src/components/image-preview/index.tsx | 4 +- .../modules/workspace-engine/impls/cloud.ts | 23 ++- .../engine/awareness-broadcast-channel.ts | 38 ++--- .../impls/engine/awareness-cloud.ts | 39 +++-- .../modules/workspace-engine/impls/local.ts | 16 +- .../src/pages/share/share-detail-page.tsx | 6 +- packages/frontend/electron/package.json | 8 +- tools/cli/package.json | 2 +- yarn.lock | 138 +++++++++--------- 24 files changed, 192 insertions(+), 194 deletions(-) diff --git a/packages/common/env/package.json b/packages/common/env/package.json index 3615dac83e..42588a094a 100644 --- a/packages/common/env/package.json +++ b/packages/common/env/package.json @@ -3,8 +3,8 @@ "private": true, "type": "module", "devDependencies": { - "@blocksuite/global": "0.15.0-canary-202405240632-44ff286", - "@blocksuite/store": "0.15.0-canary-202405240632-44ff286", + "@blocksuite/global": "0.15.0-canary-202405261009-6c8ef5b", + "@blocksuite/store": "0.15.0-canary-202405261009-6c8ef5b", "react": "18.3.1", "react-dom": "18.3.1", "vitest": "1.6.0" diff --git a/packages/common/infra/package.json b/packages/common/infra/package.json index bc777d4953..467160954d 100644 --- a/packages/common/infra/package.json +++ b/packages/common/infra/package.json @@ -13,9 +13,9 @@ "@affine/debug": "workspace:*", "@affine/env": "workspace:*", "@affine/templates": "workspace:*", - "@blocksuite/blocks": "0.15.0-canary-202405240632-44ff286", - "@blocksuite/global": "0.15.0-canary-202405240632-44ff286", - "@blocksuite/store": "0.15.0-canary-202405240632-44ff286", + "@blocksuite/blocks": "0.15.0-canary-202405261009-6c8ef5b", + "@blocksuite/global": "0.15.0-canary-202405261009-6c8ef5b", + "@blocksuite/store": "0.15.0-canary-202405261009-6c8ef5b", "@datastructures-js/binary-search-tree": "^5.3.2", "foxact": "^0.2.33", "jotai": "^2.8.0", @@ -30,8 +30,8 @@ "devDependencies": { "@affine-test/fixtures": "workspace:*", "@affine/templates": "workspace:*", - "@blocksuite/block-std": "0.15.0-canary-202405240632-44ff286", - "@blocksuite/presets": "0.15.0-canary-202405240632-44ff286", + "@blocksuite/block-std": "0.15.0-canary-202405261009-6c8ef5b", + "@blocksuite/presets": "0.15.0-canary-202405261009-6c8ef5b", "@testing-library/react": "^15.0.0", "async-call-rpc": "^6.4.0", "react": "^18.2.0", diff --git a/packages/common/infra/src/modules/workspace/entities/engine.ts b/packages/common/infra/src/modules/workspace/entities/engine.ts index f8fa62973d..dbd4b9cb6d 100644 --- a/packages/common/infra/src/modules/workspace/entities/engine.ts +++ b/packages/common/infra/src/modules/workspace/entities/engine.ts @@ -34,7 +34,7 @@ export class WorkspaceEngine extends Entity<{ start() { this.doc.start(); - this.awareness.connect(); + this.awareness.connect(this.workspaceService.workspace.awareness); this.blob.start(); } diff --git a/packages/common/infra/src/modules/workspace/entities/upgrade.ts b/packages/common/infra/src/modules/workspace/entities/upgrade.ts index 04c2012f32..ee3ee2e537 100644 --- a/packages/common/infra/src/modules/workspace/entities/upgrade.ts +++ b/packages/common/infra/src/modules/workspace/entities/upgrade.ts @@ -78,11 +78,11 @@ export class WorkspaceUpgrade extends Entity { this.workspaceService.workspace.docCollection.schema ); const blobList = - await this.workspaceService.workspace.docCollection.blob.list(); + await this.workspaceService.workspace.docCollection.blobSync.list(); for (const blobKey of blobList) { const blob = - await this.workspaceService.workspace.docCollection.blob.get( + await this.workspaceService.workspace.docCollection.blobSync.get( blobKey ); if (blob) { diff --git a/packages/common/infra/src/modules/workspace/entities/workspace.ts b/packages/common/infra/src/modules/workspace/entities/workspace.ts index cf74482420..59f5dba71a 100644 --- a/packages/common/infra/src/modules/workspace/entities/workspace.ts +++ b/packages/common/infra/src/modules/workspace/entities/workspace.ts @@ -29,24 +29,9 @@ export class Workspace extends Entity { if (!this._docCollection) { this._docCollection = new DocCollection({ id: this.openOptions.metadata.id, - blobStorages: [ - () => ({ - crud: { - get: key => { - return this.engine.blob.get(key); - }, - set: (key, value) => { - return this.engine.blob.set(key, value); - }, - list: () => { - return this.engine.blob.list(); - }, - delete: key => { - return this.engine.blob.delete(key); - }, - }, - }), - ], + blobSources: { + main: this.engine.blob, + }, idGenerator: () => nanoid(), schema: globalBlockSuiteSchema, }); diff --git a/packages/common/infra/src/modules/workspace/index.ts b/packages/common/infra/src/modules/workspace/index.ts index 302437878c..6ca53b3396 100644 --- a/packages/common/infra/src/modules/workspace/index.ts +++ b/packages/common/infra/src/modules/workspace/index.ts @@ -69,7 +69,7 @@ export function configureWorkspaceModule(framework: Framework) { .scope(WorkspaceScope) .service(WorkspaceService) .entity(Workspace, [WorkspaceScope]) - .service(WorkspaceEngineService, [WorkspaceService]) + .service(WorkspaceEngineService, [WorkspaceScope]) .entity(WorkspaceEngine, [WorkspaceService]) .service(WorkspaceUpgradeService) .entity(WorkspaceUpgrade, [ diff --git a/packages/common/infra/src/modules/workspace/providers/flavour.ts b/packages/common/infra/src/modules/workspace/providers/flavour.ts index 76fe00500d..bd5516928b 100644 --- a/packages/common/infra/src/modules/workspace/providers/flavour.ts +++ b/packages/common/infra/src/modules/workspace/providers/flavour.ts @@ -10,7 +10,6 @@ import type { DocStorage, } from '../../../sync'; import type { WorkspaceProfileInfo } from '../entities/profile'; -import type { Workspace } from '../entities/workspace'; import type { WorkspaceMetadata } from '../metadata'; export interface WorkspaceEngineProvider { @@ -54,7 +53,7 @@ export interface WorkspaceFlavourProvider { getWorkspaceBlob(id: string, blob: string): Promise; - getEngineProvider(workspace: Workspace): WorkspaceEngineProvider; + getEngineProvider(workspaceId: string): WorkspaceEngineProvider; } export const WorkspaceFlavourProvider = diff --git a/packages/common/infra/src/modules/workspace/services/engine.ts b/packages/common/infra/src/modules/workspace/services/engine.ts index 633ec87521..d1be647d2f 100644 --- a/packages/common/infra/src/modules/workspace/services/engine.ts +++ b/packages/common/infra/src/modules/workspace/services/engine.ts @@ -1,6 +1,6 @@ import { Service } from '../../../framework'; import { WorkspaceEngine } from '../entities/engine'; -import type { WorkspaceService } from './workspace'; +import type { WorkspaceScope } from '../scopes/workspace'; export class WorkspaceEngineService extends Service { private _engine: WorkspaceEngine | null = null; @@ -8,15 +8,15 @@ export class WorkspaceEngineService extends Service { if (!this._engine) { this._engine = this.framework.createEntity(WorkspaceEngine, { engineProvider: - this.workspaceService.workspace.flavourProvider.getEngineProvider( - this.workspaceService.workspace + this.workspaceScope.props.flavourProvider.getEngineProvider( + this.workspaceScope.props.openOptions.metadata.id ), }); } return this._engine; } - constructor(private readonly workspaceService: WorkspaceService) { + constructor(private readonly workspaceScope: WorkspaceScope) { super(); } } diff --git a/packages/common/infra/src/modules/workspace/testing/testing-provider.ts b/packages/common/infra/src/modules/workspace/testing/testing-provider.ts index df45eb41fb..6d970d9e1c 100644 --- a/packages/common/infra/src/modules/workspace/testing/testing-provider.ts +++ b/packages/common/infra/src/modules/workspace/testing/testing-provider.ts @@ -10,7 +10,6 @@ import { type BlobStorage, MemoryDocStorage } from '../../../sync'; import { MemoryBlobStorage } from '../../../sync/blob/blob'; import type { GlobalState } from '../../storage'; import type { WorkspaceProfileInfo } from '../entities/profile'; -import type { Workspace } from '../entities/workspace'; import { globalBlockSuiteSchema } from '../global-schema'; import type { WorkspaceMetadata } from '../metadata'; import type { @@ -54,13 +53,9 @@ export class TestingWorkspaceLocalProvider id: id, idGenerator: () => nanoid(), schema: globalBlockSuiteSchema, - blobStorages: [ - () => { - return { - crud: blobStorage, - }; - }, - ], + blobSources: { + main: blobStorage, + }, }); // apply initial state @@ -110,7 +105,7 @@ export class TestingWorkspaceLocalProvider blob ); } - getEngineProvider(workspace: Workspace): WorkspaceEngineProvider { + getEngineProvider(workspaceId: string): WorkspaceEngineProvider { return { getDocStorage: () => { return this.docStorage; @@ -123,7 +118,7 @@ export class TestingWorkspaceLocalProvider }, getLocalBlobStorage: () => { return new MemoryBlobStorage( - wrapMemento(this.store, workspace.id + '/blobs/') + wrapMemento(this.store, workspaceId + '/blobs/') ); }, getRemoteBlobStorages() { diff --git a/packages/common/infra/src/sync/awareness.ts b/packages/common/infra/src/sync/awareness.ts index d2c8243745..c1a2d946c5 100644 --- a/packages/common/infra/src/sync/awareness.ts +++ b/packages/common/infra/src/sync/awareness.ts @@ -1,13 +1,15 @@ +import type { Awareness } from 'y-protocols/awareness.js'; + export interface AwarenessConnection { - connect(): void; + connect(awareness: Awareness): void; disconnect(): void; } export class AwarenessEngine { constructor(public readonly connections: AwarenessConnection[]) {} - connect() { - this.connections.forEach(connection => connection.connect()); + connect(awareness: Awareness) { + this.connections.forEach(connection => connection.connect(awareness)); } disconnect() { diff --git a/packages/common/infra/src/sync/blob/blob.ts b/packages/common/infra/src/sync/blob/blob.ts index bf4b335918..4bd1615949 100644 --- a/packages/common/infra/src/sync/blob/blob.ts +++ b/packages/common/infra/src/sync/blob/blob.ts @@ -29,6 +29,9 @@ export interface BlobStatus { * all operations priority use local, then use remote. */ export class BlobEngine { + readonly name = 'blob-engine'; + readonly readonly = this.local.readonly; + private abort: AbortController | null = null; readonly isStorageOverCapacity$ = new LiveData(false); diff --git a/packages/frontend/component/package.json b/packages/frontend/component/package.json index fefb0f574e..8e781bfb97 100644 --- a/packages/frontend/component/package.json +++ b/packages/frontend/component/package.json @@ -75,12 +75,12 @@ "zod": "^3.22.4" }, "devDependencies": { - "@blocksuite/block-std": "0.15.0-canary-202405240632-44ff286", - "@blocksuite/blocks": "0.15.0-canary-202405240632-44ff286", - "@blocksuite/global": "0.15.0-canary-202405240632-44ff286", + "@blocksuite/block-std": "0.15.0-canary-202405261009-6c8ef5b", + "@blocksuite/blocks": "0.15.0-canary-202405261009-6c8ef5b", + "@blocksuite/global": "0.15.0-canary-202405261009-6c8ef5b", "@blocksuite/icons": "2.1.51", - "@blocksuite/presets": "0.15.0-canary-202405240632-44ff286", - "@blocksuite/store": "0.15.0-canary-202405240632-44ff286", + "@blocksuite/presets": "0.15.0-canary-202405261009-6c8ef5b", + "@blocksuite/store": "0.15.0-canary-202405261009-6c8ef5b", "@storybook/addon-actions": "^7.6.17", "@storybook/addon-essentials": "^7.6.17", "@storybook/addon-interactions": "^7.6.17", diff --git a/packages/frontend/core/package.json b/packages/frontend/core/package.json index 1343da94e6..324988c0e3 100644 --- a/packages/frontend/core/package.json +++ b/packages/frontend/core/package.json @@ -18,13 +18,13 @@ "@affine/graphql": "workspace:*", "@affine/i18n": "workspace:*", "@affine/templates": "workspace:*", - "@blocksuite/block-std": "0.15.0-canary-202405240632-44ff286", - "@blocksuite/blocks": "0.15.0-canary-202405240632-44ff286", - "@blocksuite/global": "0.15.0-canary-202405240632-44ff286", + "@blocksuite/block-std": "0.15.0-canary-202405261009-6c8ef5b", + "@blocksuite/blocks": "0.15.0-canary-202405261009-6c8ef5b", + "@blocksuite/global": "0.15.0-canary-202405261009-6c8ef5b", "@blocksuite/icons": "2.1.51", - "@blocksuite/inline": "0.15.0-canary-202405240632-44ff286", - "@blocksuite/presets": "0.15.0-canary-202405240632-44ff286", - "@blocksuite/store": "0.15.0-canary-202405240632-44ff286", + "@blocksuite/inline": "0.15.0-canary-202405261009-6c8ef5b", + "@blocksuite/presets": "0.15.0-canary-202405261009-6c8ef5b", + "@blocksuite/store": "0.15.0-canary-202405261009-6c8ef5b", "@dnd-kit/core": "^6.1.0", "@dnd-kit/modifiers": "^7.0.0", "@dnd-kit/sortable": "^8.0.0", diff --git a/packages/frontend/core/src/components/affine/page-history-modal/data.ts b/packages/frontend/core/src/components/affine/page-history-modal/data.ts index 18948e9c5e..6635ef2969 100644 --- a/packages/frontend/core/src/components/affine/page-history-modal/data.ts +++ b/packages/frontend/core/src/components/affine/page-history-modal/data.ts @@ -108,11 +108,9 @@ const getOrCreateShellWorkspace = (workspaceId: string) => { const blobStorage = new CloudBlobStorage(workspaceId); docCollection = new DocCollection({ id: workspaceId, - blobStorages: [ - () => ({ - crud: blobStorage, - }), - ], + blobSources: { + main: blobStorage, + }, schema: globalBlockSuiteSchema, }); docCollectionMap.set(workspaceId, docCollection); diff --git a/packages/frontend/core/src/components/affine/setting-modal/workspace-setting/new-workspace-setting-detail/profile.tsx b/packages/frontend/core/src/components/affine/setting-modal/workspace-setting/new-workspace-setting-detail/profile.tsx index 3734feb5ad..b993ea8ccd 100644 --- a/packages/frontend/core/src/components/affine/setting-modal/workspace-setting/new-workspace-setting-detail/profile.tsx +++ b/packages/frontend/core/src/components/affine/setting-modal/workspace-setting/new-workspace-setting-detail/profile.tsx @@ -64,7 +64,7 @@ export const ProfilePanel = () => { } try { const reducedFile = await validateAndReduceImage(file); - const blobs = workspace.docCollection.blob; + const blobs = workspace.docCollection.blobSync; const blobId = await blobs.set(reducedFile); workspace.docCollection.meta.setAvatar(blobId); } catch (error) { diff --git a/packages/frontend/core/src/components/image-preview/index.tsx b/packages/frontend/core/src/components/image-preview/index.tsx index e00925ede3..ca73c88153 100644 --- a/packages/frontend/core/src/components/image-preview/index.tsx +++ b/packages/frontend/core/src/components/image-preview/index.tsx @@ -190,7 +190,7 @@ const ImagePreviewModalImpl = ( if (typeof blockId === 'string') { const block = page.getBlockById(blockId) as ImageBlockModel; assertExists(block); - const store = block.page.blob; + const store = block.page.blobSync; const url = store?.get(block.sourceId as string); const img = await url; if (!img) { @@ -260,7 +260,7 @@ const ImagePreviewModalImpl = ( assertExists(page); const block = page.getBlockById(blockId) as ImageBlockModel; assertExists(block); - return props.docCollection.blob.get(block?.sourceId as string); + return props.docCollection.blobSync.get(block?.sourceId as string); }, suspense: true, } diff --git a/packages/frontend/core/src/modules/workspace-engine/impls/cloud.ts b/packages/frontend/core/src/modules/workspace-engine/impls/cloud.ts index e586c84cc4..2c160e6052 100644 --- a/packages/frontend/core/src/modules/workspace-engine/impls/cloud.ts +++ b/packages/frontend/core/src/modules/workspace-engine/impls/cloud.ts @@ -18,7 +18,6 @@ import { onComplete, OnEvent, onStart, - type Workspace, type WorkspaceEngineProvider, type WorkspaceFlavourProvider, type WorkspaceMetadata, @@ -96,7 +95,9 @@ export class CloudWorkspaceFlavourProviderService id: tempId, idGenerator: () => nanoid(), schema: globalBlockSuiteSchema, - blobStorages: [() => ({ crud: blobStorage })], + blobSources: { + main: blobStorage, + }, }); // apply initial state @@ -223,35 +224,31 @@ export class CloudWorkspaceFlavourProviderService const cloudBlob = new CloudBlobStorage(id); return await cloudBlob.get(blob); } - getEngineProvider(workspace: Workspace): WorkspaceEngineProvider { + getEngineProvider(workspaceId: string): WorkspaceEngineProvider { return { getAwarenessConnections: () => { return [ - new BroadcastChannelAwarenessConnection( - workspace.id, - workspace.awareness - ), + new BroadcastChannelAwarenessConnection(workspaceId), new CloudAwarenessConnection( - workspace.id, - workspace.awareness, + workspaceId, this.webSocketService.newSocket() ), ]; }, getDocServer: () => { return new CloudDocEngineServer( - workspace.id, + workspaceId, this.webSocketService.newSocket() ); }, getDocStorage: () => { - return this.storageProvider.getDocStorage(workspace.id); + return this.storageProvider.getDocStorage(workspaceId); }, getLocalBlobStorage: () => { - return this.storageProvider.getBlobStorage(workspace.id); + return this.storageProvider.getBlobStorage(workspaceId); }, getRemoteBlobStorages() { - return [new CloudBlobStorage(workspace.id)]; + return [new CloudBlobStorage(workspaceId)]; }, }; } diff --git a/packages/frontend/core/src/modules/workspace-engine/impls/engine/awareness-broadcast-channel.ts b/packages/frontend/core/src/modules/workspace-engine/impls/engine/awareness-broadcast-channel.ts index 36ceff042c..eec1d4198f 100644 --- a/packages/frontend/core/src/modules/workspace-engine/impls/engine/awareness-broadcast-channel.ts +++ b/packages/frontend/core/src/modules/workspace-engine/impls/engine/awareness-broadcast-channel.ts @@ -15,34 +15,32 @@ export class BroadcastChannelAwarenessConnection implements AwarenessConnection { channel: BroadcastChannel | null = null; + awareness: Awareness | null = null; - constructor( - private readonly workspaceId: string, - private readonly awareness: Awareness - ) {} + constructor(private readonly workspaceId: string) {} - connect(): void { + connect(awareness: Awareness): void { + this.awareness = awareness; this.channel = new BroadcastChannel('awareness:' + this.workspaceId); this.channel.postMessage({ type: 'connect', } satisfies ChannelMessage); - this.awareness.on('update', (changes: AwarenessChanges, origin: unknown) => - this.handleAwarenessUpdate(changes, origin) - ); - this.channel.addEventListener( - 'message', - (event: MessageEvent) => { - this.handleChannelMessage(event); - } - ); + this.awareness.on('update', this.handleAwarenessUpdate); + this.channel.addEventListener('message', this.handleChannelMessage); } disconnect(): void { this.channel?.close(); this.channel = null; + this.awareness?.off('update', this.handleAwarenessUpdate); + this.awareness = null; } - handleAwarenessUpdate(changes: AwarenessChanges, origin: unknown) { + handleAwarenessUpdate = (changes: AwarenessChanges, origin: unknown) => { + if (this.awareness === null) { + return; + } + if (origin === 'remote') { return; } @@ -56,9 +54,13 @@ export class BroadcastChannelAwarenessConnection type: 'update', update: update, } satisfies ChannelMessage); - } + }; + + handleChannelMessage = (event: MessageEvent) => { + if (this.awareness === null) { + return; + } - handleChannelMessage(event: MessageEvent) { if (event.data.type === 'update') { const update = event.data.update; applyAwarenessUpdate(this.awareness, update, 'remote'); @@ -71,5 +73,5 @@ export class BroadcastChannelAwarenessConnection ]), } satisfies ChannelMessage); } - } + }; } diff --git a/packages/frontend/core/src/modules/workspace-engine/impls/engine/awareness-cloud.ts b/packages/frontend/core/src/modules/workspace-engine/impls/engine/awareness-cloud.ts index 02d43d2635..2f7ff9a3f8 100644 --- a/packages/frontend/core/src/modules/workspace-engine/impls/engine/awareness-cloud.ts +++ b/packages/frontend/core/src/modules/workspace-engine/impls/engine/awareness-cloud.ts @@ -15,23 +15,25 @@ const logger = new DebugLogger('affine:awareness:socketio'); type AwarenessChanges = Record<'added' | 'updated' | 'removed', number[]>; export class CloudAwarenessConnection implements AwarenessConnection { + awareness: Awareness | null = null; + constructor( private readonly workspaceId: string, - private readonly awareness: Awareness, private readonly socket: Socket ) {} - connect(): void { + connect(awareness: Awareness): void { this.socket.on('server-awareness-broadcast', this.awarenessBroadcast); this.socket.on( 'new-client-awareness-init', this.newClientAwarenessInitHandler ); + this.awareness = awareness; this.awareness.on('update', this.awarenessUpdate); window.addEventListener('beforeunload', this.windowBeforeUnloadHandler); - this.socket.on('connect', () => this.handleConnect()); + this.socket.on('connect', this.handleConnect); this.socket.on('server-version-rejected', this.handleReject); if (this.socket.connected) { @@ -42,12 +44,16 @@ export class CloudAwarenessConnection implements AwarenessConnection { } disconnect(): void { - removeAwarenessStates( - this.awareness, - [this.awareness.clientID], - 'disconnect' - ); - this.awareness.off('update', this.awarenessUpdate); + if (this.awareness) { + removeAwarenessStates( + this.awareness, + [this.awareness.clientID], + 'disconnect' + ); + this.awareness.off('update', this.awarenessUpdate); + } + this.awareness = null; + this.socket.emit('client-leave-awareness', this.workspaceId); this.socket.off('server-awareness-broadcast', this.awarenessBroadcast); this.socket.off( @@ -66,6 +72,9 @@ export class CloudAwarenessConnection implements AwarenessConnection { workspaceId: string; awarenessUpdate: string; }) => { + if (!this.awareness) { + return; + } if (wsId !== this.workspaceId) { return; } @@ -77,6 +86,10 @@ export class CloudAwarenessConnection implements AwarenessConnection { }; awarenessUpdate = (changes: AwarenessChanges, origin: unknown) => { + if (!this.awareness) { + return; + } + if (origin === 'remote') { return; } @@ -97,6 +110,10 @@ export class CloudAwarenessConnection implements AwarenessConnection { }; newClientAwarenessInitHandler = () => { + if (!this.awareness) { + return; + } + const awarenessUpdate = encodeAwarenessUpdate(this.awareness, [ this.awareness.clientID, ]); @@ -111,6 +128,10 @@ export class CloudAwarenessConnection implements AwarenessConnection { }; windowBeforeUnloadHandler = () => { + if (!this.awareness) { + return; + } + removeAwarenessStates( this.awareness, [this.awareness.clientID], diff --git a/packages/frontend/core/src/modules/workspace-engine/impls/local.ts b/packages/frontend/core/src/modules/workspace-engine/impls/local.ts index 6a3121b36d..f90828a83d 100644 --- a/packages/frontend/core/src/modules/workspace-engine/impls/local.ts +++ b/packages/frontend/core/src/modules/workspace-engine/impls/local.ts @@ -3,7 +3,6 @@ import { WorkspaceFlavour } from '@affine/env/workspace'; import { DocCollection } from '@blocksuite/store'; import type { BlobStorage, - Workspace, WorkspaceEngineProvider, WorkspaceFlavourProvider, WorkspaceMetadata, @@ -68,7 +67,7 @@ export class LocalWorkspaceFlavourProvider id: id, idGenerator: () => nanoid(), schema: globalBlockSuiteSchema, - blobStorages: [() => ({ crud: blobStorage })], + blobSources: { main: blobStorage }, }); // apply initial state @@ -153,24 +152,19 @@ export class LocalWorkspaceFlavourProvider return this.storageProvider.getBlobStorage(id).get(blob); } - getEngineProvider(workspace: Workspace): WorkspaceEngineProvider { + getEngineProvider(workspaceId: string): WorkspaceEngineProvider { return { getAwarenessConnections() { - return [ - new BroadcastChannelAwarenessConnection( - workspace.id, - workspace.awareness - ), - ]; + return [new BroadcastChannelAwarenessConnection(workspaceId)]; }, getDocServer() { return null; }, getDocStorage: () => { - return this.storageProvider.getDocStorage(workspace.id); + return this.storageProvider.getDocStorage(workspaceId); }, getLocalBlobStorage: () => { - return this.storageProvider.getBlobStorage(workspace.id); + return this.storageProvider.getBlobStorage(workspaceId); }, getRemoteBlobStorages() { return []; diff --git a/packages/frontend/core/src/pages/share/share-detail-page.tsx b/packages/frontend/core/src/pages/share/share-detail-page.tsx index 783a5542ae..7e92aaf5c9 100644 --- a/packages/frontend/core/src/pages/share/share-detail-page.tsx +++ b/packages/frontend/core/src/pages/share/share-detail-page.tsx @@ -138,11 +138,11 @@ export const Component = () => { }, { ...defaultCloudProvider, - getEngineProvider(workspace) { + getEngineProvider(workspaceId) { return { getDocStorage() { return new ReadonlyDocStorage({ - [workspace.id]: new Uint8Array(workspaceArrayBuffer), + [workspaceId]: new Uint8Array(workspaceArrayBuffer), [docId]: new Uint8Array(pageArrayBuffer), }); }, @@ -156,7 +156,7 @@ export const Component = () => { return EmptyBlobStorage; }, getRemoteBlobStorages() { - return [new CloudBlobStorage(workspace.id)]; + return [new CloudBlobStorage(workspaceId)]; }, }; }, diff --git a/packages/frontend/electron/package.json b/packages/frontend/electron/package.json index 980a8b70c1..54e1aa4818 100644 --- a/packages/frontend/electron/package.json +++ b/packages/frontend/electron/package.json @@ -29,10 +29,10 @@ "@affine/env": "workspace:*", "@affine/i18n": "workspace:*", "@affine/native": "workspace:*", - "@blocksuite/block-std": "0.15.0-canary-202405240632-44ff286", - "@blocksuite/blocks": "0.15.0-canary-202405240632-44ff286", - "@blocksuite/presets": "0.15.0-canary-202405240632-44ff286", - "@blocksuite/store": "0.15.0-canary-202405240632-44ff286", + "@blocksuite/block-std": "0.15.0-canary-202405261009-6c8ef5b", + "@blocksuite/blocks": "0.15.0-canary-202405261009-6c8ef5b", + "@blocksuite/presets": "0.15.0-canary-202405261009-6c8ef5b", + "@blocksuite/store": "0.15.0-canary-202405261009-6c8ef5b", "@electron-forge/cli": "^7.3.0", "@electron-forge/core": "^7.3.0", "@electron-forge/core-utils": "^7.3.0", diff --git a/tools/cli/package.json b/tools/cli/package.json index 3118138bae..a252bc230a 100644 --- a/tools/cli/package.json +++ b/tools/cli/package.json @@ -6,7 +6,7 @@ "@affine/env": "workspace:*", "@affine/templates": "workspace:*", "@aws-sdk/client-s3": "3.583.0", - "@blocksuite/presets": "0.15.0-canary-202405240632-44ff286", + "@blocksuite/presets": "0.15.0-canary-202405261009-6c8ef5b", "@clack/core": "^0.3.4", "@clack/prompts": "^0.7.0", "@magic-works/i18n-codegen": "^0.6.0", diff --git a/yarn.lock b/yarn.lock index 63827ad7f5..7e7b624380 100644 --- a/yarn.lock +++ b/yarn.lock @@ -166,7 +166,7 @@ __metadata: "@affine/env": "workspace:*" "@affine/templates": "workspace:*" "@aws-sdk/client-s3": "npm:3.583.0" - "@blocksuite/presets": "npm:0.15.0-canary-202405240632-44ff286" + "@blocksuite/presets": "npm:0.15.0-canary-202405261009-6c8ef5b" "@clack/core": "npm:^0.3.4" "@clack/prompts": "npm:^0.7.0" "@magic-works/i18n-codegen": "npm:^0.6.0" @@ -219,12 +219,12 @@ __metadata: "@affine/electron-api": "workspace:*" "@affine/graphql": "workspace:*" "@affine/i18n": "workspace:*" - "@blocksuite/block-std": "npm:0.15.0-canary-202405240632-44ff286" - "@blocksuite/blocks": "npm:0.15.0-canary-202405240632-44ff286" - "@blocksuite/global": "npm:0.15.0-canary-202405240632-44ff286" + "@blocksuite/block-std": "npm:0.15.0-canary-202405261009-6c8ef5b" + "@blocksuite/blocks": "npm:0.15.0-canary-202405261009-6c8ef5b" + "@blocksuite/global": "npm:0.15.0-canary-202405261009-6c8ef5b" "@blocksuite/icons": "npm:2.1.51" - "@blocksuite/presets": "npm:0.15.0-canary-202405240632-44ff286" - "@blocksuite/store": "npm:0.15.0-canary-202405240632-44ff286" + "@blocksuite/presets": "npm:0.15.0-canary-202405261009-6c8ef5b" + "@blocksuite/store": "npm:0.15.0-canary-202405261009-6c8ef5b" "@dnd-kit/core": "npm:^6.1.0" "@dnd-kit/modifiers": "npm:^7.0.0" "@dnd-kit/sortable": "npm:^8.0.0" @@ -320,13 +320,13 @@ __metadata: "@affine/graphql": "workspace:*" "@affine/i18n": "workspace:*" "@affine/templates": "workspace:*" - "@blocksuite/block-std": "npm:0.15.0-canary-202405240632-44ff286" - "@blocksuite/blocks": "npm:0.15.0-canary-202405240632-44ff286" - "@blocksuite/global": "npm:0.15.0-canary-202405240632-44ff286" + "@blocksuite/block-std": "npm:0.15.0-canary-202405261009-6c8ef5b" + "@blocksuite/blocks": "npm:0.15.0-canary-202405261009-6c8ef5b" + "@blocksuite/global": "npm:0.15.0-canary-202405261009-6c8ef5b" "@blocksuite/icons": "npm:2.1.51" - "@blocksuite/inline": "npm:0.15.0-canary-202405240632-44ff286" - "@blocksuite/presets": "npm:0.15.0-canary-202405240632-44ff286" - "@blocksuite/store": "npm:0.15.0-canary-202405240632-44ff286" + "@blocksuite/inline": "npm:0.15.0-canary-202405261009-6c8ef5b" + "@blocksuite/presets": "npm:0.15.0-canary-202405261009-6c8ef5b" + "@blocksuite/store": "npm:0.15.0-canary-202405261009-6c8ef5b" "@dnd-kit/core": "npm:^6.1.0" "@dnd-kit/modifiers": "npm:^7.0.0" "@dnd-kit/sortable": "npm:^8.0.0" @@ -448,10 +448,10 @@ __metadata: "@affine/env": "workspace:*" "@affine/i18n": "workspace:*" "@affine/native": "workspace:*" - "@blocksuite/block-std": "npm:0.15.0-canary-202405240632-44ff286" - "@blocksuite/blocks": "npm:0.15.0-canary-202405240632-44ff286" - "@blocksuite/presets": "npm:0.15.0-canary-202405240632-44ff286" - "@blocksuite/store": "npm:0.15.0-canary-202405240632-44ff286" + "@blocksuite/block-std": "npm:0.15.0-canary-202405261009-6c8ef5b" + "@blocksuite/blocks": "npm:0.15.0-canary-202405261009-6c8ef5b" + "@blocksuite/presets": "npm:0.15.0-canary-202405261009-6c8ef5b" + "@blocksuite/store": "npm:0.15.0-canary-202405261009-6c8ef5b" "@electron-forge/cli": "npm:^7.3.0" "@electron-forge/core": "npm:^7.3.0" "@electron-forge/core-utils": "npm:^7.3.0" @@ -508,8 +508,8 @@ __metadata: version: 0.0.0-use.local resolution: "@affine/env@workspace:packages/common/env" dependencies: - "@blocksuite/global": "npm:0.15.0-canary-202405240632-44ff286" - "@blocksuite/store": "npm:0.15.0-canary-202405240632-44ff286" + "@blocksuite/global": "npm:0.15.0-canary-202405261009-6c8ef5b" + "@blocksuite/store": "npm:0.15.0-canary-202405261009-6c8ef5b" lit: "npm:^3.1.2" react: "npm:18.3.1" react-dom: "npm:18.3.1" @@ -3335,30 +3335,30 @@ __metadata: languageName: node linkType: hard -"@blocksuite/block-std@npm:0.15.0-canary-202405240632-44ff286": - version: 0.15.0-canary-202405240632-44ff286 - resolution: "@blocksuite/block-std@npm:0.15.0-canary-202405240632-44ff286" +"@blocksuite/block-std@npm:0.15.0-canary-202405261009-6c8ef5b": + version: 0.15.0-canary-202405261009-6c8ef5b + resolution: "@blocksuite/block-std@npm:0.15.0-canary-202405261009-6c8ef5b" dependencies: - "@blocksuite/global": "npm:0.15.0-canary-202405240632-44ff286" + "@blocksuite/global": "npm:0.15.0-canary-202405261009-6c8ef5b" lit: "npm:^3.1.3" lz-string: "npm:^1.5.0" w3c-keyname: "npm:^2.2.8" zod: "npm:^3.23.8" peerDependencies: - "@blocksuite/inline": 0.15.0-canary-202405240632-44ff286 - "@blocksuite/store": 0.15.0-canary-202405240632-44ff286 - checksum: 10/707717b3b434caebfccbd316744f512a600386b18c4ad3054a0416f123ae0617524aead148148343fcc9312ff1ffa5aec835b723b75b5db29b7855a60156797a + "@blocksuite/inline": 0.15.0-canary-202405261009-6c8ef5b + "@blocksuite/store": 0.15.0-canary-202405261009-6c8ef5b + checksum: 10/ad6c58969282e9cd7839629214600cb023a921267e9219ed8a37807b7430de19f8126c71bf8b554da91e356ae703229d292296fed789caaf4a66ab0c4ea079fb languageName: node linkType: hard -"@blocksuite/blocks@npm:0.15.0-canary-202405240632-44ff286": - version: 0.15.0-canary-202405240632-44ff286 - resolution: "@blocksuite/blocks@npm:0.15.0-canary-202405240632-44ff286" +"@blocksuite/blocks@npm:0.15.0-canary-202405261009-6c8ef5b": + version: 0.15.0-canary-202405261009-6c8ef5b + resolution: "@blocksuite/blocks@npm:0.15.0-canary-202405261009-6c8ef5b" dependencies: - "@blocksuite/block-std": "npm:0.15.0-canary-202405240632-44ff286" - "@blocksuite/global": "npm:0.15.0-canary-202405240632-44ff286" - "@blocksuite/inline": "npm:0.15.0-canary-202405240632-44ff286" - "@blocksuite/store": "npm:0.15.0-canary-202405240632-44ff286" + "@blocksuite/block-std": "npm:0.15.0-canary-202405261009-6c8ef5b" + "@blocksuite/global": "npm:0.15.0-canary-202405261009-6c8ef5b" + "@blocksuite/inline": "npm:0.15.0-canary-202405261009-6c8ef5b" + "@blocksuite/store": "npm:0.15.0-canary-202405261009-6c8ef5b" "@dotlottie/player-component": "npm:^2.7.12" "@fal-ai/serverless-client": "npm:^0.10.0" "@floating-ui/dom": "npm:^1.6.5" @@ -3395,16 +3395,17 @@ __metadata: sortablejs: "npm:^1.15.2" unified: "npm:^11.0.4" zod: "npm:^3.23.8" - checksum: 10/f7b2494746ae1842f3388407b446e28ea97d403c0e2ecc38eca6a718e1247f7d6b5217ceeb854be47f9304cebe16dfa1d5d0f6839c6396098f9560be4378fb1e + checksum: 10/5e766b5af69a0c73a0944be8464b404f6d2c0e7b3f66d5b1e191126ed31cf42b2310ac7d0f246a0998e1d26fd3a909416be7b4a1af08cdd0bbb52bae0e025c48 languageName: node linkType: hard -"@blocksuite/global@npm:0.15.0-canary-202405240632-44ff286": - version: 0.15.0-canary-202405240632-44ff286 - resolution: "@blocksuite/global@npm:0.15.0-canary-202405240632-44ff286" +"@blocksuite/global@npm:0.15.0-canary-202405261009-6c8ef5b": + version: 0.15.0-canary-202405261009-6c8ef5b + resolution: "@blocksuite/global@npm:0.15.0-canary-202405261009-6c8ef5b" dependencies: + lib0: "npm:^0.2.93" zod: "npm:^3.23.8" - checksum: 10/c5eb7c7f566e67f35b64918cb459a2b76302b4a633d86311690a36c514ccf3e4cfa70c15de151965505fe913d5a6d9c3383a1855976f6f8b6bb7fa0deda9f4ec + checksum: 10/1333f50c05ca1d846a334714e19cfee152d966e594e3a8d54a70889382b2407cd7aaffcc952edd45db84b3cbaad2a34efc1db00bac2efdb5a3e145201a85090c languageName: node linkType: hard @@ -3418,45 +3419,45 @@ __metadata: languageName: node linkType: hard -"@blocksuite/inline@npm:0.15.0-canary-202405240632-44ff286": - version: 0.15.0-canary-202405240632-44ff286 - resolution: "@blocksuite/inline@npm:0.15.0-canary-202405240632-44ff286" +"@blocksuite/inline@npm:0.15.0-canary-202405261009-6c8ef5b": + version: 0.15.0-canary-202405261009-6c8ef5b + resolution: "@blocksuite/inline@npm:0.15.0-canary-202405261009-6c8ef5b" dependencies: - "@blocksuite/global": "npm:0.15.0-canary-202405240632-44ff286" + "@blocksuite/global": "npm:0.15.0-canary-202405261009-6c8ef5b" zod: "npm:^3.23.8" peerDependencies: lit: ^3.1.1 yjs: ^13.6.15 - checksum: 10/1f2ec5a45640edada09218e57f5a15d19f800aa162bd91731048aee9a0a74b0b2b82af9e01bb4e6725c8d3465df22621c606b6621de4c71b42393e80781d7381 + checksum: 10/b60037bd3aae9f5cdcf47db82cefc9b9fc55b0f1c69924a1b6c6a8260a25aa2eec4d5d6315447fa4ff3dbe64ae57a17c1592e94824b124bf7c1e95e486f85b62 languageName: node linkType: hard -"@blocksuite/presets@npm:0.15.0-canary-202405240632-44ff286": - version: 0.15.0-canary-202405240632-44ff286 - resolution: "@blocksuite/presets@npm:0.15.0-canary-202405240632-44ff286" +"@blocksuite/presets@npm:0.15.0-canary-202405261009-6c8ef5b": + version: 0.15.0-canary-202405261009-6c8ef5b + resolution: "@blocksuite/presets@npm:0.15.0-canary-202405261009-6c8ef5b" dependencies: - "@blocksuite/block-std": "npm:0.15.0-canary-202405240632-44ff286" - "@blocksuite/blocks": "npm:0.15.0-canary-202405240632-44ff286" - "@blocksuite/global": "npm:0.15.0-canary-202405240632-44ff286" - "@blocksuite/inline": "npm:0.15.0-canary-202405240632-44ff286" - "@blocksuite/store": "npm:0.15.0-canary-202405240632-44ff286" + "@blocksuite/block-std": "npm:0.15.0-canary-202405261009-6c8ef5b" + "@blocksuite/blocks": "npm:0.15.0-canary-202405261009-6c8ef5b" + "@blocksuite/global": "npm:0.15.0-canary-202405261009-6c8ef5b" + "@blocksuite/inline": "npm:0.15.0-canary-202405261009-6c8ef5b" + "@blocksuite/store": "npm:0.15.0-canary-202405261009-6c8ef5b" "@dotlottie/player-component": "npm:^2.7.12" "@fal-ai/serverless-client": "npm:^0.10.0" "@floating-ui/dom": "npm:^1.6.5" "@toeverything/theme": "npm:^0.7.30" lit: "npm:^3.1.3" openai: "npm:^4.47.1" - checksum: 10/58eb30f64128b7daa0236b38cfffcc698027e083c5b3af084c3f59173f847de25ed107671226bac50095ad093f1b6f4e50d99e074457c70bf8bbaff7d7e9d17f + checksum: 10/7b7470910077cba5d993a801c7385974bc80fb35c2830c797ddae45aeba632335e8f4ea58771e5b24c1c7cde5b1e55413f4fb83704715c773bd0c7d6e4fc51e2 languageName: node linkType: hard -"@blocksuite/store@npm:0.15.0-canary-202405240632-44ff286": - version: 0.15.0-canary-202405240632-44ff286 - resolution: "@blocksuite/store@npm:0.15.0-canary-202405240632-44ff286" +"@blocksuite/store@npm:0.15.0-canary-202405261009-6c8ef5b": + version: 0.15.0-canary-202405261009-6c8ef5b + resolution: "@blocksuite/store@npm:0.15.0-canary-202405261009-6c8ef5b" dependencies: - "@blocksuite/global": "npm:0.15.0-canary-202405240632-44ff286" - "@blocksuite/inline": "npm:0.15.0-canary-202405240632-44ff286" - "@blocksuite/sync": "npm:0.15.0-canary-202405240632-44ff286" + "@blocksuite/global": "npm:0.15.0-canary-202405261009-6c8ef5b" + "@blocksuite/inline": "npm:0.15.0-canary-202405261009-6c8ef5b" + "@blocksuite/sync": "npm:0.15.0-canary-202405261009-6c8ef5b" "@types/flexsearch": "npm:^0.7.6" flexsearch: "npm:0.7.43" idb-keyval: "npm:^6.2.1" @@ -3468,20 +3469,21 @@ __metadata: zod: "npm:^3.23.8" peerDependencies: yjs: ^13.6.15 - checksum: 10/68b22b2a6cb89e4313a9a4c6532fbf296a36c727a3cb910a5b35885f32e10a9db209184bafb365fee6128fd0df8689c73c93314c5a63d8064257f5be5ae4e982 + checksum: 10/827f6d0fd98c518e927f9d60ebfe31ad3fc13eb60ee487099b80c174f11a8e5931dcdb0c7bc79b5f563d62c506fb784c3493af894934498311db080d177fcdab languageName: node linkType: hard -"@blocksuite/sync@npm:0.15.0-canary-202405240632-44ff286": - version: 0.15.0-canary-202405240632-44ff286 - resolution: "@blocksuite/sync@npm:0.15.0-canary-202405240632-44ff286" +"@blocksuite/sync@npm:0.15.0-canary-202405261009-6c8ef5b": + version: 0.15.0-canary-202405261009-6c8ef5b + resolution: "@blocksuite/sync@npm:0.15.0-canary-202405261009-6c8ef5b" dependencies: - "@blocksuite/global": "npm:0.15.0-canary-202405240632-44ff286" + "@blocksuite/global": "npm:0.15.0-canary-202405261009-6c8ef5b" idb: "npm:^8.0.0" + idb-keyval: "npm:^6.2.1" y-protocols: "npm:^1.0.6" peerDependencies: yjs: ^13.6.15 - checksum: 10/225716092e5ab4a68bbadd9bc4cdab111fa9d69ef8d88187b76614f42a98e5d5f059d9368db454fd28f1ee411be996ef8e2e407f824ca08e4a53601670d85fe2 + checksum: 10/3370baae7c3ba24a3ff1539fb677ee563d7743e44cc489dae262d3818ab92e47d709331a5c8b36833f0f27658b1807045fc1efa5fe389cf8ff501ea2aaafd413 languageName: node linkType: hard @@ -13891,11 +13893,11 @@ __metadata: "@affine/debug": "workspace:*" "@affine/env": "workspace:*" "@affine/templates": "workspace:*" - "@blocksuite/block-std": "npm:0.15.0-canary-202405240632-44ff286" - "@blocksuite/blocks": "npm:0.15.0-canary-202405240632-44ff286" - "@blocksuite/global": "npm:0.15.0-canary-202405240632-44ff286" - "@blocksuite/presets": "npm:0.15.0-canary-202405240632-44ff286" - "@blocksuite/store": "npm:0.15.0-canary-202405240632-44ff286" + "@blocksuite/block-std": "npm:0.15.0-canary-202405261009-6c8ef5b" + "@blocksuite/blocks": "npm:0.15.0-canary-202405261009-6c8ef5b" + "@blocksuite/global": "npm:0.15.0-canary-202405261009-6c8ef5b" + "@blocksuite/presets": "npm:0.15.0-canary-202405261009-6c8ef5b" + "@blocksuite/store": "npm:0.15.0-canary-202405261009-6c8ef5b" "@datastructures-js/binary-search-tree": "npm:^5.3.2" "@testing-library/react": "npm:^15.0.0" async-call-rpc: "npm:^6.4.0"