feat: data center part0

This commit is contained in:
DarkSky
2022-12-29 18:40:43 +08:00
committed by DarkSky
parent 0d79f183c5
commit e6e4c775a8
5 changed files with 72 additions and 3 deletions

View File

@@ -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",

View File

@@ -1,9 +1,18 @@
import { DCProvider, MemoryProvider } from './provider.js';
export class DataCenter {
private readonly _providers = new Map<string, DCProvider>();
static async init() {
return new DataCenter();
const dc = new DataCenter();
dc.addProvider(MemoryProvider);
}
private constructor() {
// TODO
}
addProvider<P extends DCProvider>(provider: P) {
this._providers.set(provider.id, provider);
}
}

View File

@@ -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;
}
}

View File

@@ -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();