From 707bc1f6edd3f28a966dfed1dc02c8461c25ed59 Mon Sep 17 00:00:00 2001 From: linonetwo Date: Mon, 9 Jan 2023 15:28:29 +0800 Subject: [PATCH] refactor: move blob related jsb to IPCBlobProvider --- packages/data-center/src/datacenter.ts | 3 +- .../tauri-ipc/blocksuite-provider/blob.ts | 49 +++++++++++++------ .../src/provider/tauri-ipc/index.ts | 2 +- 3 files changed, 36 insertions(+), 18 deletions(-) diff --git a/packages/data-center/src/datacenter.ts b/packages/data-center/src/datacenter.ts index 7e31d3e2c..6c9bf18d4 100644 --- a/packages/data-center/src/datacenter.ts +++ b/packages/data-center/src/datacenter.ts @@ -9,7 +9,6 @@ import assert from 'assert'; import { getLogger } from './logger'; import { BlockSchema } from '@blocksuite/blocks/models'; import { applyUpdate, encodeStateAsUpdate } from 'yjs'; -import { SelfHostedProvider } from './provider/selfhosted'; import { TauriIPCProvider } from './provider/tauri-ipc'; /** @@ -47,12 +46,12 @@ export class DataCenter { blobs: dc._blobStorage, }) ); - dc.registerProvider(new SelfHostedProvider()); if (typeof window !== 'undefined' && window.CLIENT_APP) { dc.registerProvider( new TauriIPCProvider({ logger: dc._logger, workspaces: dc._workspaces.createScope(), + blobs: dc._blobStorage, }) ); } diff --git a/packages/data-center/src/provider/tauri-ipc/blocksuite-provider/blob.ts b/packages/data-center/src/provider/tauri-ipc/blocksuite-provider/blob.ts index 4a5af06e4..fd69d2f6c 100644 --- a/packages/data-center/src/provider/tauri-ipc/blocksuite-provider/blob.ts +++ b/packages/data-center/src/provider/tauri-ipc/blocksuite-provider/blob.ts @@ -6,38 +6,57 @@ import { import * as ipcMethods from '../ipc/methods.js'; import { Signal } from '@blocksuite/store'; +// @staticImplements() export class IPCBlobProvider implements BlobProvider { #ipc = ipcMethods; - blobs: Set; - signals: { - blobAdded: Signal; + readonly blobs: Set = new Set(); + readonly signals = { + blobAdded: new Signal(), + blobDeleted: new Signal(), }; - static async init( - workspace: string, - cloudApi?: string - ): Promise { - const provider = new IPCBlobProvider(workspace, cloudApi); - await provider._initBlobs(); - return provider; - } - async get(id: BlobId): Promise { const blobArray = await this.#ipc.getBlob({ id, }); // Make a Blob from the bytes const blob = new Blob([new Uint8Array(blobArray)], { type: 'image/bmp' }); + if (blob) { + this.signals.blobAdded.emit(id); + this.blobs.add(id); + } return window.URL.createObjectURL(blob); } async set(blob: Blob): Promise { - return this.#ipc.putBlob({ + // TODO: skip if already has + const blobID = await this.#ipc.putBlob({ blob: Array.from(new Uint8Array(await blob.arrayBuffer())), }); + this.signals.blobAdded.emit(blobID); + return blobID; } - delete(id: BlobId): Promise; - clear(): Promise; + // TODO: implement getAllKeys in Octobase + // private async _initBlobs() { + // const entries = await this._database.keys(); + // for (const key of entries) { + // const blobId = key as BlobId; + // this.signals.blobAdded.emit(blobId); + // this.blobs.add(blobId); + // } + // } + + async delete(id: BlobId): Promise { + // TODO: implement blob delete in Octobase + this.signals.blobDeleted.emit(id); + this.blobs.delete(id); + } + + async clear(): Promise { + // TODO: implement blob clear in Octobase, need workspace id + // await this._database.clear(); + this.blobs.clear(); + } } diff --git a/packages/data-center/src/provider/tauri-ipc/index.ts b/packages/data-center/src/provider/tauri-ipc/index.ts index c3f1e178e..252281e10 100644 --- a/packages/data-center/src/provider/tauri-ipc/index.ts +++ b/packages/data-center/src/provider/tauri-ipc/index.ts @@ -18,7 +18,7 @@ export class TauriIPCProvider extends LocalProvider { constructor(params: ProviderConstructorParams) { super(params); // TODO: let blocksuite's blob provider get blob receive workspace id. Currently, all blobs are placed together - this._blobs = new IPCBlobProvider(); + this._blobs.addProvider(new IPCBlobProvider()); } async initData() {