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