From e6e4c775a8031f9e30d84eb938ae469ee32f52c6 Mon Sep 17 00:00:00 2001 From: DarkSky Date: Thu, 29 Dec 2022 18:40:43 +0800 Subject: [PATCH] feat: data center part0 --- packages/data-center/package.json | 3 +- .../data-center/src/datacenter/datacenter.ts | 11 +++++- .../data-center/src/datacenter/provider.ts | 19 ++++++++++ packages/data-center/src/datacenter/store.ts | 38 +++++++++++++++++++ pnpm-lock.yaml | 4 +- 5 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 packages/data-center/src/datacenter/provider.ts create mode 100644 packages/data-center/src/datacenter/store.ts diff --git a/packages/data-center/package.json b/packages/data-center/package.json index 9d38ffde5..c80906681 100644 --- a/packages/data-center/package.json +++ b/packages/data-center/package.json @@ -25,7 +25,8 @@ }, "dependencies": { "encoding": "^0.1.13", - "firebase": "^9.13.0", + "firebase": "^9.15.0", + "idb-keyval": "^6.2.0", "ky": "^0.33.0", "lib0": "^0.2.58", "swr": "^2.0.0", diff --git a/packages/data-center/src/datacenter/datacenter.ts b/packages/data-center/src/datacenter/datacenter.ts index 190278561..7b898a697 100644 --- a/packages/data-center/src/datacenter/datacenter.ts +++ b/packages/data-center/src/datacenter/datacenter.ts @@ -1,9 +1,18 @@ +import { DCProvider, MemoryProvider } from './provider.js'; + export class DataCenter { + private readonly _providers = new Map(); + static async init() { - return new DataCenter(); + const dc = new DataCenter(); + dc.addProvider(MemoryProvider); } private constructor() { // TODO } + + addProvider

(provider: P) { + this._providers.set(provider.id, provider); + } } diff --git a/packages/data-center/src/datacenter/provider.ts b/packages/data-center/src/datacenter/provider.ts new file mode 100644 index 000000000..4cb036793 --- /dev/null +++ b/packages/data-center/src/datacenter/provider.ts @@ -0,0 +1,19 @@ +import { IdbInstance } from './store.js'; + +export interface DCProvider { + id: string; + init(config: IdbInstance): void; +} + +export class MemoryProvider implements DCProvider { + static readonly id = 'memory'; + private _config: IdbInstance | undefined; + + constructor() { + // TODO + } + + init(config: IdbInstance) { + this._config = config; + } +} diff --git a/packages/data-center/src/datacenter/store.ts b/packages/data-center/src/datacenter/store.ts new file mode 100644 index 000000000..f27e25289 --- /dev/null +++ b/packages/data-center/src/datacenter/store.ts @@ -0,0 +1,38 @@ +import { createStore, del, get, keys, set } from 'idb-keyval'; + +export type IdbInstance = { + get: (key: string) => Promise; + set: (key: string, value: T) => Promise; + keys: () => Promise; + delete: (key: string) => Promise; +}; + +const initialIndexedDB = (database: string): IdbInstance => { + const store = createStore(`affine:${database}`, 'database'); + return { + get: (key: string) => get(key, store), + set: (key: string, value: T) => set(key, value, store), + keys: () => keys(store), + delete: (key: string) => del(key, store), + }; +}; + +const globalIndexedDB = () => { + const idb = initialIndexedDB('global'); + + return (scope: string): IdbInstance => ({ + get: (key: string) => idb.get(`${scope}:${key}`), + set: (key: string, value: T) => idb.set(`${scope}:${key}`, value), + keys: () => + idb + .keys() + .then(keys => + keys + .filter(k => k.startsWith(`${scope}:`)) + .map(k => k.replace(`${scope}:`, '')) + ), + delete: (key: string) => del(`${scope}:${key}`), + }); +}; + +export const getKVConfigure = globalIndexedDB(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5dd19be23..f7d59807b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -133,7 +133,8 @@ importers: specifiers: '@playwright/test': ^1.29.1 encoding: ^0.1.13 - firebase: ^9.13.0 + firebase: ^9.15.0 + idb-keyval: ^6.2.0 ky: ^0.33.0 lib0: ^0.2.58 swr: ^2.0.0 @@ -142,6 +143,7 @@ importers: dependencies: encoding: 0.1.13 firebase: 9.15.0_encoding@0.1.13 + idb-keyval: 6.2.0 ky: 0.33.1 lib0: 0.2.58 swr: 2.0.0