MCPcopy Create free account
hub / github.com/Monogatari/Monogatari / FileSystemStorage

Class FileSystemStorage

src/lib/FileSystemStorage.ts:11–193  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

9const nextRequestId = (): string => `fss_${++requestIdCounter}_${Date.now()}`;
10
11export class FileSystemStorage implements StorageInterface {
12 private bridge: DesktopBridge;
13 private _config: Record<string, unknown> = {};
14
15 private _callbacks = {
16 create: [] as Array<(key: string, value: unknown) => void>,
17 update: [] as Array<(key: string, value: unknown) => void>,
18 delete: [] as Array<(key: string, value: unknown) => void>,
19 };
20
21 private _transformations: Record<string, { id: string; get?: ((key: string, value: unknown) => unknown) | null; set?: ((key: string, value: unknown) => unknown) | null }> = {};
22
23 private _pendingRequests = new Map<string, { resolve: (data: unknown) => void; reject: (error: Error) => void }>();
24
25 private _upgradeCallbacks: Array<{ oldVersion: string; newVersion: string; callback: (...args: unknown[]) => Promise<void> }> = [];
26
27 constructor(bridge: DesktopBridge) {
28 this.bridge = bridge;
29
30 this.bridge.on('monogatari:storage-response', (raw: unknown) => {
31 const response = raw as { requestId: string; data?: unknown; error?: string };
32 const pending = this._pendingRequests.get(response.requestId);
33
34 if (pending) {
35 this._pendingRequests.delete(response.requestId);
36
37 if (response.error) {
38 pending.reject(new Error(response.error));
39 } else {
40 pending.resolve(response.data);
41 }
42 }
43 });
44 }
45
46 private sendRequest(channel: string, payload: Record<string, unknown>): Promise<unknown> {
47 const requestId = nextRequestId();
48
49 return new Promise((resolve, reject) => {
50 this._pendingRequests.set(requestId, { resolve, reject });
51 this.bridge.send(channel, { ...payload, requestId });
52 });
53 }
54
55 private applyGetTransformations(key: string, value: unknown): unknown {
56 let result = value;
57
58 for (const transformation of Object.values(this._transformations)) {
59 if (transformation.get) {
60 result = transformation.get(key, result);
61 }
62 }
63
64 return result;
65 }
66
67 private applySetTransformations(key: string, value: unknown): unknown {
68 let result = value;

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected