@decaf-ts/core 0.8.51 → 0.8.52

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/README.md +206 -93
  2. package/dist/core.cjs +1 -1
  3. package/dist/core.cjs.map +1 -1
  4. package/dist/core.js +1 -1
  5. package/dist/core.js.map +1 -1
  6. package/lib/esm/fs/FilesystemAdapter.d.ts +67 -0
  7. package/lib/esm/fs/FilesystemAdapter.js +430 -0
  8. package/lib/esm/fs/FilesystemAdapter.js.map +1 -0
  9. package/lib/esm/fs/FsDispatch.d.ts +7 -0
  10. package/lib/esm/fs/FsDispatch.js +20 -0
  11. package/lib/esm/fs/FsDispatch.js.map +1 -0
  12. package/lib/esm/fs/helpers.d.ts +17 -0
  13. package/lib/esm/fs/helpers.js +64 -0
  14. package/lib/esm/fs/helpers.js.map +1 -0
  15. package/lib/esm/fs/index.d.ts +4 -0
  16. package/lib/esm/fs/index.js +5 -0
  17. package/lib/esm/fs/index.js.map +1 -0
  18. package/lib/esm/fs/indexStore.d.ts +28 -0
  19. package/lib/esm/fs/indexStore.js +173 -0
  20. package/lib/esm/fs/indexStore.js.map +1 -0
  21. package/lib/esm/fs/locks/FilesystemLock.d.ts +13 -0
  22. package/lib/esm/fs/locks/FilesystemLock.js +49 -0
  23. package/lib/esm/fs/locks/FilesystemLock.js.map +1 -0
  24. package/lib/esm/fs/locks/FilesystemMultiLock.d.ts +8 -0
  25. package/lib/esm/fs/locks/FilesystemMultiLock.js +23 -0
  26. package/lib/esm/fs/locks/FilesystemMultiLock.js.map +1 -0
  27. package/lib/esm/fs/types.d.ts +34 -0
  28. package/lib/esm/fs/types.js +2 -0
  29. package/lib/esm/fs/types.js.map +1 -0
  30. package/lib/esm/index.d.ts +1 -1
  31. package/lib/esm/index.js +1 -1
  32. package/lib/esm/ram/RamAdapter.d.ts +1 -1
  33. package/lib/esm/ram/types.d.ts +2 -1
  34. package/lib/esm/tasks/TaskEngine.d.ts +30 -1
  35. package/lib/esm/tasks/TaskEngine.js +361 -16
  36. package/lib/esm/tasks/TaskEngine.js.map +1 -1
  37. package/lib/esm/tasks/TaskService.js +3 -0
  38. package/lib/esm/tasks/TaskService.js.map +1 -1
  39. package/lib/esm/tasks/builder.js +1 -1
  40. package/lib/esm/tasks/builder.js.map +1 -1
  41. package/lib/esm/tasks/constants.js +1 -0
  42. package/lib/esm/tasks/constants.js.map +1 -1
  43. package/lib/esm/tasks/types.d.ts +12 -0
  44. package/lib/esm/tasks/workers/WorkThreadEnvironment.d.ts +32 -0
  45. package/lib/esm/tasks/workers/WorkThreadEnvironment.js +28 -0
  46. package/lib/esm/tasks/workers/WorkThreadEnvironment.js.map +1 -0
  47. package/lib/esm/tasks/workers/messages.d.ts +69 -0
  48. package/lib/esm/tasks/workers/messages.js +2 -0
  49. package/lib/esm/tasks/workers/messages.js.map +1 -0
  50. package/lib/esm/tasks/workers/workerThread.d.ts +1 -0
  51. package/lib/esm/tasks/workers/workerThread.js +185 -0
  52. package/lib/esm/tasks/workers/workerThread.js.map +1 -0
  53. package/lib/fs/FilesystemAdapter.cjs +437 -0
  54. package/lib/fs/FilesystemAdapter.d.ts +67 -0
  55. package/lib/fs/FilesystemAdapter.js.map +1 -0
  56. package/lib/fs/FsDispatch.cjs +24 -0
  57. package/lib/fs/FsDispatch.d.ts +7 -0
  58. package/lib/fs/FsDispatch.js.map +1 -0
  59. package/lib/fs/helpers.cjs +76 -0
  60. package/lib/fs/helpers.d.ts +17 -0
  61. package/lib/fs/helpers.js.map +1 -0
  62. package/lib/fs/index.cjs +21 -0
  63. package/lib/fs/index.d.ts +4 -0
  64. package/lib/fs/index.js.map +1 -0
  65. package/lib/fs/indexStore.cjs +181 -0
  66. package/lib/fs/indexStore.d.ts +28 -0
  67. package/lib/fs/indexStore.js.map +1 -0
  68. package/lib/fs/locks/FilesystemLock.cjs +56 -0
  69. package/lib/fs/locks/FilesystemLock.d.ts +13 -0
  70. package/lib/fs/locks/FilesystemLock.js.map +1 -0
  71. package/lib/fs/locks/FilesystemMultiLock.cjs +30 -0
  72. package/lib/fs/locks/FilesystemMultiLock.d.ts +8 -0
  73. package/lib/fs/locks/FilesystemMultiLock.js.map +1 -0
  74. package/lib/fs/types.cjs +3 -0
  75. package/lib/fs/types.d.ts +34 -0
  76. package/lib/fs/types.js.map +1 -0
  77. package/lib/index.cjs +1 -1
  78. package/lib/index.d.ts +1 -1
  79. package/lib/ram/RamAdapter.d.ts +1 -1
  80. package/lib/ram/types.d.ts +2 -1
  81. package/lib/tasks/TaskEngine.cjs +360 -15
  82. package/lib/tasks/TaskEngine.d.ts +30 -1
  83. package/lib/tasks/TaskEngine.js.map +1 -1
  84. package/lib/tasks/TaskService.cjs +3 -0
  85. package/lib/tasks/TaskService.js.map +1 -1
  86. package/lib/tasks/builder.cjs +1 -1
  87. package/lib/tasks/builder.js.map +1 -1
  88. package/lib/tasks/constants.cjs +1 -0
  89. package/lib/tasks/constants.js.map +1 -1
  90. package/lib/tasks/types.d.ts +12 -0
  91. package/lib/tasks/workers/WorkThreadEnvironment.cjs +31 -0
  92. package/lib/tasks/workers/WorkThreadEnvironment.d.ts +32 -0
  93. package/lib/tasks/workers/WorkThreadEnvironment.js.map +1 -0
  94. package/lib/tasks/workers/messages.cjs +3 -0
  95. package/lib/tasks/workers/messages.d.ts +69 -0
  96. package/lib/tasks/workers/messages.js.map +1 -0
  97. package/lib/tasks/workers/workerThread.cjs +220 -0
  98. package/lib/tasks/workers/workerThread.d.ts +1 -0
  99. package/lib/tasks/workers/workerThread.js.map +1 -0
  100. package/package.json +19 -8
@@ -0,0 +1,67 @@
1
+ import { promises as defaultFs } from "node:fs";
2
+ import { Constructor } from "@decaf-ts/decoration";
3
+ import { Model } from "@decaf-ts/decorator-validation";
4
+ import { PrimaryKeyType } from "@decaf-ts/db-decorators";
5
+ import { Dispatch } from "../persistence/Dispatch";
6
+ import { ContextualArgs } from "../utils/ContextualLoggedClass";
7
+ import { RamAdapter } from "../ram";
8
+ import type { RamContext, RawRamQuery } from "../ram/types";
9
+ import type { FilesystemConfig } from "./types";
10
+ export declare class FilesystemAdapter extends RamAdapter {
11
+ private readonly rootDir;
12
+ private readonly dbPath;
13
+ private readonly fs;
14
+ private readonly ready;
15
+ private readonly jsonSpacing?;
16
+ private readonly onHydrated?;
17
+ private readonly indexStore;
18
+ private readonly pkColumnCache;
19
+ private readonly indexDescriptorCache;
20
+ private readonly tableWatchers;
21
+ private rootWatcher?;
22
+ private watching;
23
+ private readonly watchDebounceMs;
24
+ private readonly pendingObserverRefresh;
25
+ constructor(conf?: FilesystemConfig, alias?: string);
26
+ getFs(): typeof defaultFs;
27
+ getStoragePath(): string;
28
+ getTablePath(tableName: string): string;
29
+ getIndexesPath(tableName: string): string;
30
+ protected Dispatch(): Dispatch<FilesystemAdapter>;
31
+ private initializeFromDisk;
32
+ ensureWatching(): Promise<void>;
33
+ stopWatching(): void;
34
+ private ensureReady;
35
+ private startRootWatcher;
36
+ private handleRootEvent;
37
+ private normalizeFilename;
38
+ private scheduleObserverRefresh;
39
+ private flushObserverRefresh;
40
+ private clearPendingObserverRefresh;
41
+ private watchTable;
42
+ private unwatchTable;
43
+ private handleTableEvent;
44
+ private removeRecordFromMap;
45
+ private applyRecord;
46
+ private hydrateTable;
47
+ private directoryExists;
48
+ private tablePath;
49
+ private recordPath;
50
+ private indexesPath;
51
+ private writeRecord;
52
+ private removeRecord;
53
+ private syncIndexesForWrite;
54
+ private removeIndexesForRecord;
55
+ private getIndexDescriptors;
56
+ private collectIndexMetadata;
57
+ private asIndexMetadata;
58
+ private buildColumns;
59
+ private columnNameOrFallback;
60
+ private getPkColumn;
61
+ private buildIndexSource;
62
+ create<M extends Model>(clazz: Constructor<M>, id: PrimaryKeyType, model: Record<string, any>, ...args: ContextualArgs<RamContext>): Promise<Record<string, any>>;
63
+ read<M extends Model>(clazz: Constructor<M>, id: PrimaryKeyType, ...args: ContextualArgs<RamContext>): Promise<Record<string, any>>;
64
+ update<M extends Model>(clazz: Constructor<M>, id: PrimaryKeyType, model: Record<string, any>, ...args: ContextualArgs<RamContext>): Promise<Record<string, any>>;
65
+ delete<M extends Model>(clazz: Constructor<M>, id: PrimaryKeyType, ...args: ContextualArgs<RamContext>): Promise<Record<string, any>>;
66
+ raw<R, D extends boolean>(rawInput: RawRamQuery<any>, docsOnly?: D, ...args: ContextualArgs<RamContext>): Promise<import("..").RawResult<R, D>>;
67
+ }
@@ -0,0 +1,430 @@
1
+ import { promises as defaultFs, watch as fsWatch } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import path from "node:path";
4
+ import { Model } from "@decaf-ts/decorator-validation";
5
+ import { OperationKeys } from "@decaf-ts/db-decorators";
6
+ import { PersistenceKeys } from "./../persistence/constants.js";
7
+ import { RamAdapter } from "./../ram/index.js";
8
+ import { deserializeId, encodeId, ensureDir, readDirSafe, readJsonFile, removeFile, serializeId, writeJsonAtomic, fileExists, } from "./helpers.js";
9
+ import { FilesystemMultiLock } from "./locks/FilesystemMultiLock.js";
10
+ import { FsDispatch } from "./FsDispatch.js";
11
+ import { FsIndexStore, toIndexFileName } from "./indexStore.js";
12
+ export class FilesystemAdapter extends RamAdapter {
13
+ constructor(conf = {}, alias = "fs") {
14
+ const fsImpl = conf.fs ?? defaultFs;
15
+ const aliasName = alias || "fs";
16
+ const rootDir = conf.rootDir ?? path.join(tmpdir(), "decaf-fs-adapter");
17
+ const dbPath = path.join(rootDir, aliasName);
18
+ const lockDir = conf.lockDir ?? path.join(dbPath, "locks");
19
+ const lock = conf.lock ??
20
+ new FilesystemMultiLock(lockDir, fsImpl);
21
+ const normalizedConfig = Object.assign({}, conf, {
22
+ fs: fsImpl,
23
+ rootDir,
24
+ lockDir,
25
+ lock,
26
+ });
27
+ super(normalizedConfig, alias);
28
+ this.pkColumnCache = new WeakMap();
29
+ this.indexDescriptorCache = new WeakMap();
30
+ this.tableWatchers = new Map();
31
+ this.watching = false;
32
+ this.pendingObserverRefresh = new Map();
33
+ this.fs = fsImpl;
34
+ this.jsonSpacing = conf.jsonSpacing;
35
+ this.onHydrated = conf.onHydrated;
36
+ this.rootDir = rootDir;
37
+ this.dbPath = dbPath;
38
+ this.indexStore = new FsIndexStore(this.fs, (tableName) => this.indexesPath(tableName), this.jsonSpacing);
39
+ this.watchDebounceMs = conf.watchDebounceMs ?? 50;
40
+ this.ready = this.initializeFromDisk();
41
+ this.ready.then(() => this.ensureWatching().catch((error) => this.log
42
+ .for(this.ensureWatching)
43
+ .error(`Filesystem watcher setup failed: ${error}`)));
44
+ }
45
+ getFs() {
46
+ return this.fs;
47
+ }
48
+ getStoragePath() {
49
+ return this.dbPath;
50
+ }
51
+ getTablePath(tableName) {
52
+ return this.tablePath(tableName);
53
+ }
54
+ getIndexesPath(tableName) {
55
+ return this.indexesPath(tableName);
56
+ }
57
+ Dispatch() {
58
+ return new FsDispatch();
59
+ }
60
+ async initializeFromDisk() {
61
+ await ensureDir(this.fs, this.dbPath);
62
+ const tables = await readDirSafe(this.fs, this.dbPath);
63
+ for (const entry of tables) {
64
+ if (!entry.isDirectory())
65
+ continue;
66
+ const tableName = entry.name;
67
+ const tableDir = path.join(this.dbPath, tableName);
68
+ const map = this.client.get(tableName) ?? new Map();
69
+ this.client.set(tableName, map);
70
+ const rows = await readDirSafe(this.fs, tableDir);
71
+ let hydrated = 0;
72
+ for (const row of rows) {
73
+ if (row.isDirectory())
74
+ continue;
75
+ if (!row.name.endsWith(".json"))
76
+ continue;
77
+ const payload = await readJsonFile(this.fs, path.join(tableDir, row.name));
78
+ if (!payload)
79
+ continue;
80
+ map.set(deserializeId(payload.id), payload.record);
81
+ hydrated += 1;
82
+ }
83
+ if (hydrated) {
84
+ this.onHydrated?.({ table: tableName, records: hydrated });
85
+ }
86
+ }
87
+ }
88
+ async ensureWatching() {
89
+ if (this.watching)
90
+ return;
91
+ await this.ensureReady();
92
+ this.watching = true;
93
+ this.startRootWatcher();
94
+ const tables = await readDirSafe(this.fs, this.dbPath);
95
+ for (const entry of tables) {
96
+ if (!entry.isDirectory())
97
+ continue;
98
+ await this.watchTable(entry.name);
99
+ }
100
+ }
101
+ stopWatching() {
102
+ if (!this.watching)
103
+ return;
104
+ this.watching = false;
105
+ this.rootWatcher?.close();
106
+ this.rootWatcher = undefined;
107
+ for (const watcher of this.tableWatchers.values()) {
108
+ watcher.close();
109
+ }
110
+ this.tableWatchers.clear();
111
+ this.clearPendingObserverRefresh();
112
+ }
113
+ async ensureReady() {
114
+ await this.ready;
115
+ }
116
+ startRootWatcher() {
117
+ if (this.rootWatcher)
118
+ return;
119
+ this.rootWatcher = fsWatch(this.dbPath, { persistent: false }, (event, filename) => void this.handleRootEvent(event, filename));
120
+ this.rootWatcher.on("error", (error) => this.log.for(this.startRootWatcher).error(`Filesystem root watcher error: ${error}`));
121
+ }
122
+ async handleRootEvent(event, filename) {
123
+ if (event !== "rename")
124
+ return;
125
+ const tableName = this.normalizeFilename(filename);
126
+ if (!tableName)
127
+ return;
128
+ const tableDir = this.tablePath(tableName);
129
+ if (await this.directoryExists(tableDir)) {
130
+ await this.watchTable(tableName);
131
+ }
132
+ else {
133
+ this.unwatchTable(tableName);
134
+ }
135
+ }
136
+ normalizeFilename(filename) {
137
+ if (!filename)
138
+ return undefined;
139
+ return typeof filename === "string"
140
+ ? filename
141
+ : filename.toString("utf8");
142
+ }
143
+ scheduleObserverRefresh(tableName, event, id) {
144
+ if (!this.dispatch)
145
+ return;
146
+ const pending = this.pendingObserverRefresh.get(tableName);
147
+ if (pending) {
148
+ clearTimeout(pending.timer);
149
+ pending.event = event;
150
+ pending.id = id;
151
+ pending.timer = setTimeout(() => this.flushObserverRefresh(tableName), this.watchDebounceMs);
152
+ return;
153
+ }
154
+ const timer = setTimeout(() => this.flushObserverRefresh(tableName), this.watchDebounceMs);
155
+ this.pendingObserverRefresh.set(tableName, { timer, event, id });
156
+ }
157
+ flushObserverRefresh(tableName) {
158
+ const pending = this.pendingObserverRefresh.get(tableName);
159
+ if (!pending)
160
+ return;
161
+ this.pendingObserverRefresh.delete(tableName);
162
+ const { event, id } = pending;
163
+ const { ctxArgs } = this.logCtx([], this.flushObserverRefresh);
164
+ this.refresh(tableName, event, id, ...ctxArgs).catch((error) => this.log
165
+ .for(this.flushObserverRefresh)
166
+ .error(`Failed to refresh observers for ${tableName}: ${error}`));
167
+ }
168
+ clearPendingObserverRefresh(tableName) {
169
+ if (tableName) {
170
+ const pending = this.pendingObserverRefresh.get(tableName);
171
+ if (!pending)
172
+ return;
173
+ clearTimeout(pending.timer);
174
+ this.pendingObserverRefresh.delete(tableName);
175
+ return;
176
+ }
177
+ for (const pending of this.pendingObserverRefresh.values()) {
178
+ clearTimeout(pending.timer);
179
+ }
180
+ this.pendingObserverRefresh.clear();
181
+ }
182
+ async watchTable(tableName) {
183
+ if (!this.watching)
184
+ return;
185
+ if (this.tableWatchers.has(tableName))
186
+ return;
187
+ const tableDir = this.tablePath(tableName);
188
+ if (!(await this.directoryExists(tableDir)))
189
+ return;
190
+ const watcher = fsWatch(tableDir, { persistent: false }, (event, filename) => void this.handleTableEvent(tableName, event, filename));
191
+ watcher.on("error", (error) => this.log.for(this.watchTable).error(`Watcher error for ${tableName}: ${error}`));
192
+ this.tableWatchers.set(tableName, watcher);
193
+ }
194
+ unwatchTable(tableName) {
195
+ const watcher = this.tableWatchers.get(tableName);
196
+ if (watcher) {
197
+ watcher.close();
198
+ this.tableWatchers.delete(tableName);
199
+ }
200
+ this.client.delete(tableName);
201
+ }
202
+ async handleTableEvent(tableName, event, filename) {
203
+ const fileName = this.normalizeFilename(filename);
204
+ if (!fileName || !fileName.endsWith(".json"))
205
+ return;
206
+ if (fileName === "indexes" || fileName.startsWith("indexes"))
207
+ return;
208
+ const targetPath = path.join(this.tablePath(tableName), fileName);
209
+ if (!(await fileExists(this.fs, targetPath))) {
210
+ const removedId = this.removeRecordFromMap(tableName, fileName);
211
+ if (removedId !== undefined) {
212
+ this.scheduleObserverRefresh(tableName, OperationKeys.DELETE, removedId);
213
+ }
214
+ return;
215
+ }
216
+ const payload = await readJsonFile(this.fs, targetPath);
217
+ if (!payload)
218
+ return;
219
+ const id = deserializeId(payload.id);
220
+ const refreshEvent = this.applyRecord(tableName, payload);
221
+ this.scheduleObserverRefresh(tableName, refreshEvent, id);
222
+ }
223
+ removeRecordFromMap(tableName, fileName) {
224
+ const table = this.client.get(tableName);
225
+ if (!table)
226
+ return;
227
+ const encoded = fileName.replace(/\.json$/, "");
228
+ for (const key of table.keys()) {
229
+ const candidate = key;
230
+ if (encodeId(candidate) === encoded) {
231
+ table.delete(candidate);
232
+ return candidate;
233
+ }
234
+ }
235
+ return undefined;
236
+ }
237
+ applyRecord(tableName, payload) {
238
+ const map = this.client.get(tableName) ?? new Map();
239
+ const id = deserializeId(payload.id);
240
+ const existed = map.has(id);
241
+ map.set(id, payload.record);
242
+ this.client.set(tableName, map);
243
+ return existed ? OperationKeys.UPDATE : OperationKeys.CREATE;
244
+ }
245
+ async hydrateTable(tableName) {
246
+ const tableDir = this.tablePath(tableName);
247
+ if (!(await this.directoryExists(tableDir)))
248
+ return;
249
+ const map = new Map();
250
+ const rows = await readDirSafe(this.fs, tableDir);
251
+ for (const row of rows) {
252
+ if (row.isDirectory())
253
+ continue;
254
+ if (!row.name.endsWith(".json"))
255
+ continue;
256
+ const payload = await readJsonFile(this.fs, path.join(tableDir, row.name));
257
+ if (!payload)
258
+ continue;
259
+ map.set(deserializeId(payload.id), payload.record);
260
+ }
261
+ this.client.set(tableName, map);
262
+ }
263
+ async directoryExists(dir) {
264
+ try {
265
+ const stats = await this.fs.stat(dir);
266
+ return stats.isDirectory();
267
+ }
268
+ catch {
269
+ return false;
270
+ }
271
+ }
272
+ tablePath(tableName) {
273
+ return path.join(this.dbPath, tableName);
274
+ }
275
+ recordPath(tableName, id) {
276
+ return path.join(this.tablePath(tableName), `${encodeId(id)}.json`);
277
+ }
278
+ indexesPath(tableName) {
279
+ return path.join(this.tablePath(tableName), "indexes");
280
+ }
281
+ async writeRecord(tableName, id, record) {
282
+ const tableDir = this.tablePath(tableName);
283
+ await ensureDir(this.fs, tableDir);
284
+ await ensureDir(this.fs, this.indexesPath(tableName));
285
+ const payload = {
286
+ id: serializeId(id),
287
+ record,
288
+ };
289
+ const filePath = this.recordPath(tableName, id);
290
+ await writeJsonAtomic(this.fs, filePath, payload, this.jsonSpacing);
291
+ }
292
+ async removeRecord(tableName, id) {
293
+ const filePath = this.recordPath(tableName, id);
294
+ await removeFile(this.fs, filePath);
295
+ }
296
+ async syncIndexesForWrite(clazz, tableName, id, record, previous) {
297
+ const descriptors = this.getIndexDescriptors(clazz);
298
+ if (!descriptors.length)
299
+ return;
300
+ await this.indexStore.upsert(tableName, descriptors, id, this.buildIndexSource(clazz, record, id), previous ? this.buildIndexSource(clazz, previous, id) : undefined);
301
+ }
302
+ async removeIndexesForRecord(clazz, tableName, id, record) {
303
+ const descriptors = this.getIndexDescriptors(clazz);
304
+ if (!descriptors.length)
305
+ return;
306
+ await this.indexStore.remove(tableName, descriptors, id, record ? this.buildIndexSource(clazz, record, id) : undefined);
307
+ }
308
+ getIndexDescriptors(clazz) {
309
+ const cached = this.indexDescriptorCache.get(clazz);
310
+ if (cached)
311
+ return cached;
312
+ const indexes = Model.indexes(clazz) || {};
313
+ const tableName = Model.tableName(clazz);
314
+ const descriptors = [];
315
+ Object.entries(indexes).forEach(([property, metadata]) => {
316
+ const rawMeta = metadata?.[PersistenceKeys.INDEX];
317
+ if (!rawMeta)
318
+ return;
319
+ const flattened = this.collectIndexMetadata(property, rawMeta);
320
+ flattened.forEach(({ property: targetProp, meta }) => {
321
+ const columns = this.buildColumns(clazz, targetProp, meta.compositions);
322
+ const baseName = meta.name ||
323
+ [tableName, targetProp, ...(meta.compositions ?? [])].join("_");
324
+ descriptors.push({
325
+ name: baseName,
326
+ fileName: toIndexFileName(baseName),
327
+ columns,
328
+ directions: meta.directions,
329
+ });
330
+ });
331
+ });
332
+ this.indexDescriptorCache.set(clazz, descriptors);
333
+ return descriptors;
334
+ }
335
+ collectIndexMetadata(property, raw) {
336
+ if (!raw)
337
+ return [];
338
+ const entries = [];
339
+ const directMeta = this.asIndexMetadata(raw);
340
+ if (directMeta) {
341
+ entries.push({ property, meta: directMeta });
342
+ }
343
+ Object.entries(raw).forEach(([key, value]) => {
344
+ if (["directions", "compositions", "name"].includes(key) ||
345
+ value === undefined ||
346
+ value === null) {
347
+ return;
348
+ }
349
+ if (typeof value === "object") {
350
+ entries.push(...this.collectIndexMetadata(key, value));
351
+ }
352
+ });
353
+ return entries;
354
+ }
355
+ asIndexMetadata(raw) {
356
+ const hasMeta = Object.prototype.hasOwnProperty.call(raw, "directions") ||
357
+ Object.prototype.hasOwnProperty.call(raw, "compositions") ||
358
+ Object.prototype.hasOwnProperty.call(raw, "name");
359
+ if (!hasMeta)
360
+ return undefined;
361
+ const { directions, compositions, name } = raw;
362
+ return {
363
+ directions: directions,
364
+ compositions: compositions,
365
+ name: name,
366
+ };
367
+ }
368
+ buildColumns(clazz, property, compositions) {
369
+ const main = this.columnNameOrFallback(clazz, property);
370
+ const extras = (compositions ?? []).map((comp) => this.columnNameOrFallback(clazz, comp));
371
+ return [main, ...extras];
372
+ }
373
+ columnNameOrFallback(clazz, property) {
374
+ try {
375
+ return Model.columnName(clazz, property);
376
+ }
377
+ catch {
378
+ return property;
379
+ }
380
+ }
381
+ getPkColumn(clazz) {
382
+ const cached = this.pkColumnCache.get(clazz);
383
+ if (cached)
384
+ return cached;
385
+ const pkProp = Model.pk(clazz);
386
+ const column = this.columnNameOrFallback(clazz, String(pkProp));
387
+ this.pkColumnCache.set(clazz, column);
388
+ return column;
389
+ }
390
+ buildIndexSource(clazz, record, id) {
391
+ const pkColumn = this.getPkColumn(clazz);
392
+ if (!pkColumn || pkColumn in record)
393
+ return record;
394
+ return Object.assign({}, record, { [pkColumn]: id });
395
+ }
396
+ async create(clazz, id, model, ...args) {
397
+ await this.ensureReady();
398
+ const tableName = Model.tableName(clazz);
399
+ const record = await super.create(clazz, id, model, ...args);
400
+ await this.writeRecord(tableName, id, record);
401
+ await this.syncIndexesForWrite(clazz, tableName, id, record);
402
+ return record;
403
+ }
404
+ async read(clazz, id, ...args) {
405
+ await this.ensureReady();
406
+ return super.read(clazz, id, ...args);
407
+ }
408
+ async update(clazz, id, model, ...args) {
409
+ await this.ensureReady();
410
+ const tableName = Model.tableName(clazz);
411
+ const previous = this.client.get(tableName)?.get(id);
412
+ const record = await super.update(clazz, id, model, ...args);
413
+ await this.writeRecord(tableName, id, record);
414
+ await this.syncIndexesForWrite(clazz, tableName, id, record, previous);
415
+ return record;
416
+ }
417
+ async delete(clazz, id, ...args) {
418
+ await this.ensureReady();
419
+ const tableName = Model.tableName(clazz);
420
+ const record = await super.delete(clazz, id, ...args);
421
+ await this.removeRecord(tableName, id);
422
+ await this.removeIndexesForRecord(clazz, tableName, id, record);
423
+ return record;
424
+ }
425
+ async raw(rawInput, docsOnly = true, ...args) {
426
+ await this.ensureReady();
427
+ return super.raw(rawInput, docsOnly, ...args);
428
+ }
429
+ }
430
+ //# sourceMappingURL=FilesystemAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilesystemAdapter.js","sourceRoot":"","sources":["../../../src/fs/FilesystemAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Dispatch } from "../persistence/Dispatch";
2
+ import type { Adapter } from "../persistence/Adapter";
3
+ import { ContextOf } from "../persistence/types";
4
+ import { MaybeContextualArg } from "../utils/ContextualLoggedClass";
5
+ export declare class FsDispatch<A extends Adapter<any, any, any, any> = Adapter<any, any, any, any>> extends Dispatch<A> {
6
+ protected initialize(...args: MaybeContextualArg<ContextOf<A>>): Promise<void>;
7
+ }
@@ -0,0 +1,20 @@
1
+ import { Dispatch } from "./../persistence/Dispatch.js";
2
+ export class FsDispatch extends Dispatch {
3
+ async initialize(...args) {
4
+ await super.initialize(...args);
5
+ if (!this.adapter)
6
+ return;
7
+ const ensureWatching = this.adapter["ensureWatching"];
8
+ if (typeof ensureWatching !== "function")
9
+ return;
10
+ try {
11
+ await ensureWatching.call(this.adapter);
12
+ }
13
+ catch (error) {
14
+ this.log
15
+ .for(this.initialize)
16
+ .error(`Failed to enable filesystem watchers: ${error}`);
17
+ }
18
+ }
19
+ }
20
+ //# sourceMappingURL=FsDispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FsDispatch.js","sourceRoot":"","sources":["../../../src/fs/FsDispatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,qCAAgC;AAKnD,MAAM,OAAO,UAEX,SAAQ,QAAW;IACA,KAAK,CAAC,UAAU,CACjC,GAAG,IAAsC;QAEzC,MAAM,KAAK,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,MAAM,cAAc,GAAI,IAAI,CAAC,OAAe,CAAC,gBAAgB,CAAC,CAAC;QAC/D,IAAI,OAAO,cAAc,KAAK,UAAU;YAAE,OAAO;QACjD,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG;iBACL,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;iBACpB,KAAK,CAAC,yCAAyC,KAAK,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ import type { Dirent, promises as FsPromises } from "node:fs";
2
+ import { PrimaryKeyType } from "@decaf-ts/db-decorators";
3
+ export type JsonSpacing = number | string | undefined;
4
+ export type SerializedId = {
5
+ type: "string" | "number" | "bigint";
6
+ value: string;
7
+ };
8
+ export declare function encodeId(id: PrimaryKeyType): string;
9
+ export declare function serializeId(id: PrimaryKeyType): SerializedId;
10
+ export declare function deserializeId(id: SerializedId): PrimaryKeyType;
11
+ export declare function ensureDir(fs: typeof FsPromises, dir: string): Promise<void>;
12
+ export declare function readJsonFile<T>(fs: typeof FsPromises, filePath: string): Promise<T | undefined>;
13
+ export declare function fileExists(fs: typeof FsPromises, filePath: string): Promise<boolean>;
14
+ export declare function writeJsonAtomic(fs: typeof FsPromises, filePath: string, payload: unknown, spacing?: JsonSpacing): Promise<void>;
15
+ export declare function atomicWrite(fs: typeof FsPromises, filePath: string, contents: string): Promise<void>;
16
+ export declare function removeFile(fs: typeof FsPromises, filePath: string): Promise<void>;
17
+ export declare function readDirSafe(fs: typeof FsPromises, dir: string): Promise<Dirent[]>;
@@ -0,0 +1,64 @@
1
+ export function encodeId(id) {
2
+ return encodeURIComponent(String(id));
3
+ }
4
+ export function serializeId(id) {
5
+ if (typeof id === "number") {
6
+ return { type: "number", value: id.toString() };
7
+ }
8
+ if (typeof id === "bigint") {
9
+ return { type: "bigint", value: id.toString() };
10
+ }
11
+ return { type: "string", value: String(id) };
12
+ }
13
+ export function deserializeId(id) {
14
+ switch (id.type) {
15
+ case "number":
16
+ return Number(id.value);
17
+ case "bigint":
18
+ return BigInt(id.value);
19
+ default:
20
+ return id.value;
21
+ }
22
+ }
23
+ export async function ensureDir(fs, dir) {
24
+ await fs.mkdir(dir, { recursive: true });
25
+ }
26
+ export async function readJsonFile(fs, filePath) {
27
+ try {
28
+ const raw = await fs.readFile(filePath, "utf8");
29
+ return JSON.parse(raw);
30
+ }
31
+ catch {
32
+ return undefined;
33
+ }
34
+ }
35
+ export async function fileExists(fs, filePath) {
36
+ try {
37
+ await fs.access(filePath);
38
+ return true;
39
+ }
40
+ catch {
41
+ return false;
42
+ }
43
+ }
44
+ export async function writeJsonAtomic(fs, filePath, payload, spacing) {
45
+ const contents = JSON.stringify(payload, null, spacing);
46
+ await atomicWrite(fs, filePath, contents);
47
+ }
48
+ export async function atomicWrite(fs, filePath, contents) {
49
+ const tmp = `${filePath}.tmp-${process.pid}-${Date.now()}`;
50
+ await fs.writeFile(tmp, contents);
51
+ await fs.rename(tmp, filePath);
52
+ }
53
+ export async function removeFile(fs, filePath) {
54
+ await fs.rm(filePath, { force: true });
55
+ }
56
+ export async function readDirSafe(fs, dir) {
57
+ try {
58
+ return await fs.readdir(dir, { withFileTypes: true });
59
+ }
60
+ catch {
61
+ return [];
62
+ }
63
+ }
64
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/fs/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from "./FilesystemAdapter";
2
+ export * from "./types";
3
+ export * from "./helpers";
4
+ export * from "./indexStore";
@@ -0,0 +1,5 @@
1
+ export * from "./FilesystemAdapter.js";
2
+ export * from "./types.js";
3
+ export * from "./helpers.js";
4
+ export * from "./indexStore.js";
5
+ //# sourceMappingURL=index.js.map