mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-09-24 04:27:27 +08:00
feat: data center part0
This commit is contained in:
@@ -25,7 +25,8 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"encoding": "^0.1.13",
|
"encoding": "^0.1.13",
|
||||||
"firebase": "^9.13.0",
|
"firebase": "^9.15.0",
|
||||||
|
"idb-keyval": "^6.2.0",
|
||||||
"ky": "^0.33.0",
|
"ky": "^0.33.0",
|
||||||
"lib0": "^0.2.58",
|
"lib0": "^0.2.58",
|
||||||
"swr": "^2.0.0",
|
"swr": "^2.0.0",
|
||||||
|
|||||||
@@ -1,9 +1,18 @@
|
|||||||
|
import { DCProvider, MemoryProvider } from './provider.js';
|
||||||
|
|
||||||
export class DataCenter {
|
export class DataCenter {
|
||||||
|
private readonly _providers = new Map<string, DCProvider>();
|
||||||
|
|
||||||
static async init() {
|
static async init() {
|
||||||
return new DataCenter();
|
const dc = new DataCenter();
|
||||||
|
dc.addProvider(MemoryProvider);
|
||||||
}
|
}
|
||||||
|
|
||||||
private constructor() {
|
private constructor() {
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
addProvider<P extends DCProvider>(provider: P) {
|
||||||
|
this._providers.set(provider.id, provider);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
import { IdbInstance } from './store.js';
|
||||||
|
|
||||||
|
export interface DCProvider {
|
||||||
|
id: string;
|
||||||
|
init(config: IdbInstance<any>): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class MemoryProvider implements DCProvider {
|
||||||
|
static readonly id = 'memory';
|
||||||
|
private _config: IdbInstance<any> | undefined;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
init(config: IdbInstance<any>) {
|
||||||
|
this._config = config;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
import { createStore, del, get, keys, set } from 'idb-keyval';
|
||||||
|
|
||||||
|
export type IdbInstance<T = any> = {
|
||||||
|
get: (key: string) => Promise<T | undefined>;
|
||||||
|
set: (key: string, value: T) => Promise<void>;
|
||||||
|
keys: () => Promise<string[]>;
|
||||||
|
delete: (key: string) => Promise<void>;
|
||||||
|
};
|
||||||
|
|
||||||
|
const initialIndexedDB = <T = any>(database: string): IdbInstance<T> => {
|
||||||
|
const store = createStore(`affine:${database}`, 'database');
|
||||||
|
return {
|
||||||
|
get: (key: string) => get<T>(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 <T = any>(scope: string): IdbInstance<T> => ({
|
||||||
|
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();
|
||||||
Generated
+3
-1
@@ -133,7 +133,8 @@ importers:
|
|||||||
specifiers:
|
specifiers:
|
||||||
'@playwright/test': ^1.29.1
|
'@playwright/test': ^1.29.1
|
||||||
encoding: ^0.1.13
|
encoding: ^0.1.13
|
||||||
firebase: ^9.13.0
|
firebase: ^9.15.0
|
||||||
|
idb-keyval: ^6.2.0
|
||||||
ky: ^0.33.0
|
ky: ^0.33.0
|
||||||
lib0: ^0.2.58
|
lib0: ^0.2.58
|
||||||
swr: ^2.0.0
|
swr: ^2.0.0
|
||||||
@@ -142,6 +143,7 @@ importers:
|
|||||||
dependencies:
|
dependencies:
|
||||||
encoding: 0.1.13
|
encoding: 0.1.13
|
||||||
firebase: 9.15.0_encoding@0.1.13
|
firebase: 9.15.0_encoding@0.1.13
|
||||||
|
idb-keyval: 6.2.0
|
||||||
ky: 0.33.1
|
ky: 0.33.1
|
||||||
lib0: 0.2.58
|
lib0: 0.2.58
|
||||||
swr: 2.0.0
|
swr: 2.0.0
|
||||||
|
|||||||
Reference in New Issue
Block a user