From 20002785e9bcf103da8a852e397ed656f6962be5 Mon Sep 17 00:00:00 2001 From: Lin Onetwo Date: Thu, 5 Jan 2023 14:53:02 +0800 Subject: [PATCH] refactor: move ipc method and types to data-center folder --- .../generateTsTypingsFromJsonSchema.mjs | 11 +++- .../src-tauri/examples/generate-jsonschema.rs | 15 +++-- client-app/src/types/ipc/blob.ts | 4 +- client-app/src/types/ipc/document.ts | 2 +- client-app/src/types/ipc/workspace.ts | 2 +- packages/data-center/package.json | 5 +- .../src/provider/tauri-ipc/index.ts | 64 +++++++++++++++++++ .../tauri-ipc}/ipc/TauriIPCProvider.ts | 4 +- .../src/provider/tauri-ipc}/ipc/methods.ts | 0 pnpm-lock.yaml | 2 + 10 files changed, 94 insertions(+), 15 deletions(-) create mode 100644 packages/data-center/src/provider/tauri-ipc/index.ts rename {client-app/src => packages/data-center/src/provider/tauri-ipc}/ipc/TauriIPCProvider.ts (94%) rename {client-app/src => packages/data-center/src/provider/tauri-ipc}/ipc/methods.ts (100%) diff --git a/client-app/scripts/generateTsTypingsFromJsonSchema.mjs b/client-app/scripts/generateTsTypingsFromJsonSchema.mjs index 1800b5d361..a524e9b2da 100644 --- a/client-app/scripts/generateTsTypingsFromJsonSchema.mjs +++ b/client-app/scripts/generateTsTypingsFromJsonSchema.mjs @@ -10,16 +10,24 @@ import path from 'path'; import { compileFromFile } from 'json-schema-to-typescript'; import { cd } from 'zx/core'; +const projectRoot = path.join(__dirname, '..', '..'); +const tsTypingsFolder = path.join( + projectRoot, + 'packages/data-center/src/provider/tauri-ipc/ipc/types' +); + /** * 1. generate JSONSchema using rs crate `schemars`, this happened on rs side script `src-tauri/examples/generate-jsonschema.rs` */ cd('./src-tauri'); +try { + fs.mkdirSync(tsTypingsFolder); +} catch {} await $`cargo run --example generate-jsonschema`; /** * 2. generate TS from JSON schema, this is efficient on NodeJS side. */ -const tsTypingsFolder = path.join(__dirname, '..', 'src', 'types', 'ipc'); const fileNames = fs.readdirSync(tsTypingsFolder); const jsonSchemaFilePaths = fileNames .filter(fileName => fileName.endsWith('.json')) @@ -37,6 +45,7 @@ await Promise.all( /** * 3. fix eslint error on generated ts files */ +cd(path.join(projectRoot, 'packages/data-center')); await $`eslint ${tsTypingsFolder} --ext ts --fix`; /** diff --git a/client-app/src-tauri/examples/generate-jsonschema.rs b/client-app/src-tauri/examples/generate-jsonschema.rs index a50087717a..ba0101a1f9 100644 --- a/client-app/src-tauri/examples/generate-jsonschema.rs +++ b/client-app/src-tauri/examples/generate-jsonschema.rs @@ -1,6 +1,4 @@ -use ipc_types::{ - blob::IBlobParameters, document::YDocumentUpdate, workspace::CreateWorkspace, -}; +use ipc_types::{blob::IBlobParameters, document::YDocumentUpdate, workspace::CreateWorkspace}; /** * convert serde to jsonschema: https://imfeld.dev/writing/generating_typescript_types_from_rust * with way to optimize @@ -24,7 +22,12 @@ where fn main() { let project_root = &get_project_root().unwrap(); - generate::(Path::join(project_root, "../src/types/ipc/document.json")); - generate::(Path::join(project_root, "../src/types/ipc/workspace.json")); - generate::(Path::join(project_root, "../src/types/ipc/blob.json")); + let mono_repo_root = Path::join(project_root, "../.."); + let data_center_ipc_type_folder = Path::join( + &mono_repo_root, + "packages/data-center/src/provider/tauri-ipc/ipc/types", + ); + generate::(Path::join(&data_center_ipc_type_folder, "document.json")); + generate::(Path::join(&data_center_ipc_type_folder, "workspace.json")); + generate::(Path::join(&data_center_ipc_type_folder, "blob.json")); } diff --git a/client-app/src/types/ipc/blob.ts b/client-app/src/types/ipc/blob.ts index 66beca454f..388d1611dd 100644 --- a/client-app/src/types/ipc/blob.ts +++ b/client-app/src/types/ipc/blob.ts @@ -14,12 +14,12 @@ export type IBlobParameters = }; export interface PutBlob { - [k: string]: unknown; blob: number[]; workspace_id: number; + [k: string]: unknown; } export interface GetBlob { - [k: string]: unknown; id: string; workspace_id: number; + [k: string]: unknown; } diff --git a/client-app/src/types/ipc/document.ts b/client-app/src/types/ipc/document.ts index 7e17b64605..fd6dd91608 100644 --- a/client-app/src/types/ipc/document.ts +++ b/client-app/src/types/ipc/document.ts @@ -6,7 +6,7 @@ */ export interface YDocumentUpdate { - [k: string]: unknown; room: string; update: number[]; + [k: string]: unknown; } diff --git a/client-app/src/types/ipc/workspace.ts b/client-app/src/types/ipc/workspace.ts index cc72ecb51b..cf60dcbd54 100644 --- a/client-app/src/types/ipc/workspace.ts +++ b/client-app/src/types/ipc/workspace.ts @@ -6,8 +6,8 @@ */ export interface CreateWorkspace { - [k: string]: unknown; avatar: string; id: number; name: string; + [k: string]: unknown; } diff --git a/packages/data-center/package.json b/packages/data-center/package.json index 5d0ebc843f..932b160f68 100644 --- a/packages/data-center/package.json +++ b/packages/data-center/package.json @@ -28,6 +28,7 @@ "dependencies": { "@blocksuite/blocks": "^0.3.1", "@blocksuite/store": "^0.3.1", + "@tauri-apps/api": "^1.2.0", "debug": "^4.3.4", "encoding": "^0.1.13", "firebase": "^9.15.0", @@ -36,7 +37,7 @@ "ky-universal": "^0.11.0", "lib0": "^0.2.58", "swr": "^2.0.0", - "yjs": "^13.5.44", - "y-protocols": "^1.0.5" + "y-protocols": "^1.0.5", + "yjs": "^13.5.44" } } diff --git a/packages/data-center/src/provider/tauri-ipc/index.ts b/packages/data-center/src/provider/tauri-ipc/index.ts new file mode 100644 index 0000000000..d2ced1b9ee --- /dev/null +++ b/packages/data-center/src/provider/tauri-ipc/index.ts @@ -0,0 +1,64 @@ +import type { BlobStorage } from '@blocksuite/store'; +import assert from 'assert'; + +import type { ConfigStore, InitialParams } from '../index.js'; +import { BaseProvider } from '../base.js'; +import { IndexedDBProvider } from './indexeddb.js'; + +export class LocalProvider extends BaseProvider { + static id = 'local'; + private _blobs!: BlobStorage; + private _idb?: IndexedDBProvider = undefined; + + constructor() { + super(); + } + async init(params: InitialParams) { + super.init(params); + + const blobs = await this._workspace.blobs; + assert(blobs); + this._blobs = blobs; + } + + async initData() { + assert(this._workspace.room); + this._logger('Loading local data'); + this._idb = new IndexedDBProvider( + this._workspace.room, + this._workspace.doc + ); + + await this._idb.whenSynced; + this._logger('Local data loaded'); + + await this._globalConfig.set(this._workspace.room, true); + } + + async clear() { + await super.clear(); + await this._blobs.clear(); + await this._idb?.clearData(); + await this._globalConfig.delete(this._workspace.room!); + } + + async destroy(): Promise { + super.destroy(); + await this._idb?.destroy(); + } + + async getBlob(id: string): Promise { + return this._blobs.get(id); + } + + async setBlob(blob: Blob): Promise { + return this._blobs.set(blob); + } + + static async list( + config: Readonly> + ): Promise | undefined> { + const entries = await config.entries(); + return new Map(entries); + } +} diff --git a/client-app/src/ipc/TauriIPCProvider.ts b/packages/data-center/src/provider/tauri-ipc/ipc/TauriIPCProvider.ts similarity index 94% rename from client-app/src/ipc/TauriIPCProvider.ts rename to packages/data-center/src/provider/tauri-ipc/ipc/TauriIPCProvider.ts index 55c71f5cdf..b01d36e794 100644 --- a/client-app/src/ipc/TauriIPCProvider.ts +++ b/packages/data-center/src/provider/tauri-ipc/ipc/TauriIPCProvider.ts @@ -21,7 +21,7 @@ export class TauriIPCProvider super(); this.#yDocument = yDocument; this.#yDocument.on( - 'updateV2', + 'update', async ( update: Uint8Array, origin: any, @@ -37,7 +37,7 @@ export class TauriIPCProvider }); } catch (error) { // TODO: write error log to disk, and add button to open them in settings panel - console.error("#yDocument.on('updateV2'", error); + console.error("#yDocument.on('update'", error); } } ); diff --git a/client-app/src/ipc/methods.ts b/packages/data-center/src/provider/tauri-ipc/ipc/methods.ts similarity index 100% rename from client-app/src/ipc/methods.ts rename to packages/data-center/src/provider/tauri-ipc/ipc/methods.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6c98c76b16..a3d24e6447 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -237,6 +237,7 @@ importers: '@blocksuite/blocks': ^0.3.1 '@blocksuite/store': ^0.3.1 '@playwright/test': ^1.29.1 + '@tauri-apps/api': ^1.2.0 '@types/debug': ^4.1.7 debug: ^4.3.4 encoding: ^0.1.13 @@ -253,6 +254,7 @@ importers: dependencies: '@blocksuite/blocks': 0.3.1_yjs@13.5.44 '@blocksuite/store': 0.3.1_yjs@13.5.44 + '@tauri-apps/api': 1.2.0 debug: 4.3.4 encoding: 0.1.13 firebase: 9.15.0_encoding@0.1.13