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 fd69d2f6c..679198399 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 @@ -1,21 +1,40 @@ -import { - BlobId, - BlobProvider, - BlobURL, -} from '@blocksuite/store/dist/blob/types'; +import { BlobSyncState } from '@blocksuite/store'; import * as ipcMethods from '../ipc/methods.js'; -import { Signal } from '@blocksuite/store'; +import { BlobOptionsGetter, Signal } from '@blocksuite/store'; +import type { + BlobProvider, + BlobSyncStateChangeEvent, + BlobId, + BlobURL, +} from '@blocksuite/store/dist/persistence/blob/types.js'; -// @staticImplements() export class IPCBlobProvider implements BlobProvider { #ipc = ipcMethods; - readonly blobs: Set = new Set(); + #workspace: string; + readonly signals = { - blobAdded: new Signal(), - blobDeleted: new Signal(), + onBlobSyncStateChange: new Signal(), }; + private constructor(workspace: string) { + this.#workspace = workspace; + } + + static async init(workspace: string): Promise { + const provider = new IPCBlobProvider(workspace); + return provider; + } + + get uploading() { + return false; + } + + get blobs() { + // TODO: implement blob list in Octobase + return Promise.resolve([]) as Promise; + } + async get(id: BlobId): Promise { const blobArray = await this.#ipc.getBlob({ id, @@ -23,8 +42,10 @@ export class IPCBlobProvider implements BlobProvider { // 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); + this.signals.onBlobSyncStateChange.emit({ + id, + state: BlobSyncState.Success, + }); } return window.URL.createObjectURL(blob); } @@ -34,29 +55,18 @@ export class IPCBlobProvider implements BlobProvider { const blobID = await this.#ipc.putBlob({ blob: Array.from(new Uint8Array(await blob.arrayBuffer())), }); - this.signals.blobAdded.emit(blobID); + this.signals.onBlobSyncStateChange.emit({ + id: blobID, + state: BlobSyncState.Success, + }); return blobID; } - // 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(); + // TODO: implement blob clear in Octobase, use workspace id #workspace } } diff --git a/packages/data-center/src/provider/tauri-ipc/index.ts b/packages/data-center/src/provider/tauri-ipc/index.ts index 55060cadd..024d39c0f 100644 --- a/packages/data-center/src/provider/tauri-ipc/index.ts +++ b/packages/data-center/src/provider/tauri-ipc/index.ts @@ -99,7 +99,9 @@ export class TauriIPCProvider extends LocalProvider { const { room } = blocksuiteWorkspace; assert(room); - (await blocksuiteWorkspace.blobs)?.addProvider(new IPCBlobProvider()); + (await blocksuiteWorkspace.blobs)?.setProvider( + await IPCBlobProvider.init(room) + ); await this.#initDocFromIPC(room, blocksuiteWorkspace); await this.#connectDocToIPC(room, blocksuiteWorkspace);