From d09f6fb7cc34b183958c6e3e5bbf32da29f4bdfe Mon Sep 17 00:00:00 2001 From: Alex Yang Date: Thu, 21 Sep 2023 12:31:17 -0500 Subject: [PATCH] refactor: replace with data source (#4447) --- packages/workspace/src/affine/index.ts | 4 ++-- packages/workspace/src/providers/index.ts | 23 +++++++++++-------- .../src/providers/sqlite-providers.ts | 7 ++---- packages/y-indexeddb/src/provider.ts | 8 +++---- .../y-provider/src/__tests__/index.spec.ts | 4 ++-- packages/y-provider/src/data-source.ts | 10 ++++---- packages/y-provider/src/lazy-provider.ts | 4 ++-- packages/y-provider/src/types.ts | 4 ++-- 8 files changed, 33 insertions(+), 31 deletions(-) diff --git a/packages/workspace/src/affine/index.ts b/packages/workspace/src/affine/index.ts index 86447a4f9d..4a566eb0eb 100644 --- a/packages/workspace/src/affine/index.ts +++ b/packages/workspace/src/affine/index.ts @@ -1,5 +1,5 @@ import { DebugLogger } from '@affine/debug'; -import type { DatasourceDocAdapter } from '@affine/y-provider'; +import type { DocDataSource } from '@affine/y-provider'; import type { Socket } from 'socket.io-client'; import { Manager } from 'socket.io-client'; import { @@ -129,7 +129,7 @@ export const createAffineDataSource = ( socket.disconnect(); }; }, - } satisfies DatasourceDocAdapter & { readonly socket: Socket }; + } satisfies DocDataSource & { readonly socket: Socket }; }; function setupAffineAwareness( diff --git a/packages/workspace/src/providers/index.ts b/packages/workspace/src/providers/index.ts index 0e425e68be..3f6632cdd3 100644 --- a/packages/workspace/src/providers/index.ts +++ b/packages/workspace/src/providers/index.ts @@ -10,10 +10,10 @@ import type { DocProviderCreator } from '@blocksuite/store'; import { Workspace } from '@blocksuite/store'; import { createBroadcastChannelProvider } from '@blocksuite/store/providers/broadcast-channel'; import { + createIndexedDBDatasource, createIndexedDBProvider as create, - downloadBinary, } from '@toeverything/y-indexeddb'; -import type { Doc } from 'yjs'; +import { encodeStateVector } from 'yjs'; import { createAffineDataSource } from '../affine'; import { @@ -87,18 +87,13 @@ const createIndexedDBDownloadProvider: DocProviderCreator = ( id, doc ): LocalIndexedDBDownloadProvider => { + const datasource = createIndexedDBDatasource({}); let _resolve: () => void; let _reject: (error: unknown) => void; const promise = new Promise((resolve, reject) => { _resolve = resolve; _reject = reject; }); - async function downloadAndApply(doc: Doc) { - const binary = await downloadBinary(doc.guid); - if (binary) { - Y.applyUpdate(doc, binary, indexedDBDownloadOrigin); - } - } return { flavour: 'local-indexeddb', @@ -111,7 +106,17 @@ const createIndexedDBDownloadProvider: DocProviderCreator = ( }, sync: () => { logger.info('sync indexeddb provider', id); - downloadAndApply(doc).then(_resolve).catch(_reject); + datasource + .queryDocState(doc.guid, { + stateVector: encodeStateVector(doc), + }) + .then(docState => { + if (docState) { + Y.applyUpdate(doc, docState.missing, indexedDBDownloadOrigin); + } + _resolve(); + }) + .catch(_reject); }, }; }; diff --git a/packages/workspace/src/providers/sqlite-providers.ts b/packages/workspace/src/providers/sqlite-providers.ts index 53b48a5c87..f16e53994c 100644 --- a/packages/workspace/src/providers/sqlite-providers.ts +++ b/packages/workspace/src/providers/sqlite-providers.ts @@ -2,10 +2,7 @@ import type { SQLiteDBDownloadProvider, SQLiteProvider, } from '@affine/env/workspace'; -import { - createLazyProvider, - type DatasourceDocAdapter, -} from '@affine/y-provider'; +import { createLazyProvider, type DocDataSource } from '@affine/y-provider'; import { assertExists } from '@blocksuite/global/utils'; import type { DocProviderCreator } from '@blocksuite/store'; import { Workspace as BlockSuiteWorkspace } from '@blocksuite/store'; @@ -17,7 +14,7 @@ const Y = BlockSuiteWorkspace.Y; const sqliteOrigin = 'sqlite-provider-origin'; -const createDatasource = (workspaceId: string): DatasourceDocAdapter => { +const createDatasource = (workspaceId: string): DocDataSource => { if (!window.apis?.db) { throw new Error('sqlite datasource is not available'); } diff --git a/packages/y-indexeddb/src/provider.ts b/packages/y-indexeddb/src/provider.ts index 5389de2497..8fd6f4419b 100644 --- a/packages/y-indexeddb/src/provider.ts +++ b/packages/y-indexeddb/src/provider.ts @@ -1,6 +1,6 @@ import { createLazyProvider, - type DatasourceDocAdapter, + type DocDataSource, writeOperation, } from '@affine/y-provider'; import { assertExists } from '@blocksuite/global/utils'; @@ -26,10 +26,10 @@ export function setMergeCount(count: number) { } export const createIndexedDBDatasource = ({ - dbName, + dbName = DEFAULT_DB_NAME, mergeCount, }: { - dbName: string; + dbName?: string; mergeCount?: number; }) => { let dbPromise: Promise> | null = null; @@ -99,7 +99,7 @@ export const createIndexedDBDatasource = ({ } } }, - } satisfies DatasourceDocAdapter; + } satisfies DocDataSource; return { ...adapter, diff --git a/packages/y-provider/src/__tests__/index.spec.ts b/packages/y-provider/src/__tests__/index.spec.ts index ca8dc42c44..86d45e537b 100644 --- a/packages/y-provider/src/__tests__/index.spec.ts +++ b/packages/y-provider/src/__tests__/index.spec.ts @@ -3,7 +3,7 @@ import { setTimeout } from 'node:timers/promises'; import { describe, expect, test, vi } from 'vitest'; import { applyUpdate, Doc, encodeStateAsUpdate, encodeStateVector } from 'yjs'; -import type { DatasourceDocAdapter } from '../data-source'; +import type { DocDataSource } from '../data-source'; import { createLazyProvider } from '../lazy-provider'; import { getDoc } from '../utils'; @@ -54,7 +54,7 @@ const createMemoryDatasource = (rootDoc: Doc) => { listeners.delete(callback); }; }, - } satisfies DatasourceDocAdapter; + } satisfies DocDataSource; return { rootDoc, // expose rootDoc for testing ...adapter, diff --git a/packages/y-provider/src/data-source.ts b/packages/y-provider/src/data-source.ts index ac95e0606b..d19c4f5287 100644 --- a/packages/y-provider/src/data-source.ts +++ b/packages/y-provider/src/data-source.ts @@ -3,7 +3,7 @@ import { applyUpdate, encodeStateAsUpdate } from 'yjs'; import type { DocState } from './types'; -export interface DatasourceDocAdapter { +export interface DocDataSource { /** * request diff update from other clients */ @@ -31,7 +31,7 @@ export interface DatasourceDocAdapter { export async function syncDocFromDataSource( rootDoc: YDoc, - datasource: DatasourceDocAdapter + datasource: DocDataSource ) { const downloadDocStateRecursively = async (doc: YDoc) => { const docState = await datasource.queryDocState(doc.guid); @@ -49,7 +49,7 @@ export async function syncDocFromDataSource( export async function syncDataSourceFromDoc( rootDoc: YDoc, - datasource: DatasourceDocAdapter + datasource: DocDataSource ) { const uploadDocStateRecursively = async (doc: YDoc) => { await datasource.sendDocUpdate(doc.guid, encodeStateAsUpdate(doc)); @@ -72,8 +72,8 @@ export async function syncDataSourceFromDoc( */ export async function syncDataSource( listDocGuids: () => string[], - remoteDataSource: DatasourceDocAdapter, - localDataSource: DatasourceDocAdapter + remoteDataSource: DocDataSource, + localDataSource: DocDataSource ) { const guids = listDocGuids(); await Promise.all( diff --git a/packages/y-provider/src/lazy-provider.ts b/packages/y-provider/src/lazy-provider.ts index 65db5b0b57..6584e11d49 100644 --- a/packages/y-provider/src/lazy-provider.ts +++ b/packages/y-provider/src/lazy-provider.ts @@ -6,7 +6,7 @@ import { encodeStateVector, } from 'yjs'; -import type { DatasourceDocAdapter } from './data-source'; +import type { DocDataSource } from './data-source'; import type { DataSourceAdapter } from './types'; import type { Status } from './types'; @@ -43,7 +43,7 @@ export type DocProvider = { */ export const createLazyProvider = ( rootDoc: Doc, - datasource: DatasourceDocAdapter, + datasource: DocDataSource, options: LazyProviderOptions = {} ): DocProvider & DataSourceAdapter => { let connected = false; diff --git a/packages/y-provider/src/types.ts b/packages/y-provider/src/types.ts index 6ad651abfb..d31150b7d8 100644 --- a/packages/y-provider/src/types.ts +++ b/packages/y-provider/src/types.ts @@ -1,4 +1,4 @@ -import type { DatasourceDocAdapter } from './data-source'; +import type { DocDataSource } from './data-source'; export type Status = | { @@ -16,7 +16,7 @@ export type Status = }; export interface DataSourceAdapter { - datasource: DatasourceDocAdapter; + datasource: DocDataSource; readonly status: Status; subscribeStatusChange(onStatusChange: () => void): () => void;