@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 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/fs/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./FilesystemAdapter.cjs"), exports);
18
+ __exportStar(require("./types.cjs"), exports);
19
+ __exportStar(require("./helpers.cjs"), exports);
20
+ __exportStar(require("./indexStore.cjs"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,4 @@
1
+ export * from "./FilesystemAdapter";
2
+ export * from "./types";
3
+ export * from "./helpers";
4
+ export * from "./indexStore";
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fs/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0DAAoC;AACpC,8CAAwB;AACxB,gDAA0B;AAC1B,mDAA6B"}
@@ -0,0 +1,181 @@
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.FsIndexStore = void 0;
7
+ exports.toIndexFileName = toIndexFileName;
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const helpers_1 = require("./helpers.cjs");
10
+ const KEY_SEPARATOR = "::";
11
+ function toIndexFileName(indexName) {
12
+ return encodeURIComponent(indexName).replace(/%/g, "_");
13
+ }
14
+ class FsIndexStore {
15
+ constructor(fs, indexDirResolver, spacing) {
16
+ this.fs = fs;
17
+ this.indexDirResolver = indexDirResolver;
18
+ this.spacing = spacing;
19
+ this.cache = new Map();
20
+ }
21
+ async ensure(tableName, descriptors) {
22
+ if (!descriptors.length)
23
+ return;
24
+ await (0, helpers_1.ensureDir)(this.fs, this.indexDirResolver(tableName));
25
+ if (!this.cache.has(tableName))
26
+ this.cache.set(tableName, new Map());
27
+ const tableCache = this.cache.get(tableName);
28
+ await Promise.all(descriptors.map(async (descriptor) => {
29
+ if (tableCache.has(descriptor.fileName))
30
+ return;
31
+ const filePath = this.indexPath(tableName, descriptor.fileName);
32
+ const existing = await (0, helpers_1.readJsonFile)(this.fs, filePath);
33
+ const payload = existing && existing.columns?.length
34
+ ? {
35
+ ...descriptor,
36
+ entries: existing.entries ?? {},
37
+ directions: existing.directions ?? descriptor.directions,
38
+ columns: existing.columns,
39
+ }
40
+ : {
41
+ ...descriptor,
42
+ entries: {},
43
+ };
44
+ tableCache.set(descriptor.fileName, payload);
45
+ }));
46
+ }
47
+ async upsert(tableName, descriptors, id, record, previous) {
48
+ if (!descriptors.length)
49
+ return;
50
+ await this.ensure(tableName, descriptors);
51
+ const tableCache = this.cache.get(tableName);
52
+ if (!tableCache)
53
+ return;
54
+ const serializedId = (0, helpers_1.serializeId)(id);
55
+ await Promise.all(descriptors.map(async (descriptor) => {
56
+ const payload = tableCache.get(descriptor.fileName);
57
+ if (!payload)
58
+ return;
59
+ if (previous) {
60
+ const prevKey = this.keyForRecord(previous, descriptor.columns);
61
+ if (prevKey) {
62
+ this.removeFromEntries(payload.entries, prevKey, serializedId);
63
+ }
64
+ }
65
+ const nextKey = this.keyForRecord(record, descriptor.columns);
66
+ if (!nextKey)
67
+ return;
68
+ const bucket = payload.entries[nextKey] ?? [];
69
+ if (!bucket.find((entry) => entry.type === serializedId.type && entry.value === serializedId.value)) {
70
+ bucket.push(serializedId);
71
+ payload.entries[nextKey] = bucket;
72
+ }
73
+ await this.persist(tableName, payload);
74
+ }));
75
+ }
76
+ async remove(tableName, descriptors, id, record) {
77
+ if (!descriptors.length)
78
+ return;
79
+ await this.ensure(tableName, descriptors);
80
+ const tableCache = this.cache.get(tableName);
81
+ if (!tableCache)
82
+ return;
83
+ const serializedId = (0, helpers_1.serializeId)(id);
84
+ await Promise.all(descriptors.map(async (descriptor) => {
85
+ const payload = tableCache.get(descriptor.fileName);
86
+ if (!payload)
87
+ return;
88
+ let removed = false;
89
+ if (record) {
90
+ const key = this.keyForRecord(record, descriptor.columns);
91
+ if (key) {
92
+ removed = this.removeFromEntries(payload.entries, key, serializedId);
93
+ }
94
+ }
95
+ if (!removed) {
96
+ removed = this.removeFromAll(payload.entries, serializedId);
97
+ }
98
+ if (removed) {
99
+ await this.persist(tableName, payload);
100
+ }
101
+ }));
102
+ }
103
+ removeFromEntries(entries, key, id) {
104
+ const bucket = entries[key];
105
+ if (!bucket)
106
+ return false;
107
+ const filtered = bucket.filter((entry) => entry.value !== id.value || entry.type !== id.type);
108
+ if (filtered.length) {
109
+ entries[key] = filtered;
110
+ }
111
+ else {
112
+ delete entries[key];
113
+ }
114
+ return filtered.length !== bucket.length;
115
+ }
116
+ removeFromAll(entries, id) {
117
+ let removed = false;
118
+ for (const key of Object.keys(entries)) {
119
+ removed = this.removeFromEntries(entries, key, id) || removed;
120
+ }
121
+ return removed;
122
+ }
123
+ keyForRecord(record, columns) {
124
+ if (!record)
125
+ return undefined;
126
+ const values = [];
127
+ for (const column of columns) {
128
+ if (!(column in record) || typeof record[column] === "undefined") {
129
+ return undefined;
130
+ }
131
+ values.push(record[column]);
132
+ }
133
+ return values.map(this.normalizeValue).join(KEY_SEPARATOR);
134
+ }
135
+ normalizeValue(value) {
136
+ if (value === null)
137
+ return "__null__";
138
+ if (value === undefined)
139
+ return "__undefined__";
140
+ if (typeof value === "object") {
141
+ try {
142
+ return JSON.stringify(value);
143
+ }
144
+ catch {
145
+ return String(value);
146
+ }
147
+ }
148
+ return String(value);
149
+ }
150
+ indexPath(tableName, fileName) {
151
+ return node_path_1.default.join(this.indexDirResolver(tableName), `${fileName}.json`);
152
+ }
153
+ async persist(tableName, payload) {
154
+ const filePath = this.indexPath(tableName, payload.fileName);
155
+ await (0, helpers_1.writeJsonAtomic)(this.fs, filePath, payload, this.spacing);
156
+ }
157
+ async refresh(tableName, descriptors) {
158
+ if (!descriptors.length)
159
+ return;
160
+ await this.ensure(tableName, descriptors);
161
+ const tableCache = this.cache.get(tableName);
162
+ if (!tableCache)
163
+ return;
164
+ await Promise.all(descriptors.map(async (descriptor) => {
165
+ const filePath = this.indexPath(tableName, descriptor.fileName);
166
+ const payload = await (0, helpers_1.readJsonFile)(this.fs, filePath);
167
+ if (!payload) {
168
+ tableCache.delete(descriptor.fileName);
169
+ return;
170
+ }
171
+ const refreshed = {
172
+ ...descriptor,
173
+ entries: payload.entries ?? {},
174
+ directions: payload.directions ?? descriptor.directions,
175
+ };
176
+ tableCache.set(descriptor.fileName, refreshed);
177
+ }));
178
+ }
179
+ }
180
+ exports.FsIndexStore = FsIndexStore;
181
+ //# sourceMappingURL=indexStore.js.map
@@ -0,0 +1,28 @@
1
+ import type { promises as FsPromises } from "node:fs";
2
+ import { PrimaryKeyType } from "@decaf-ts/db-decorators";
3
+ import { OrderDirection } from "../repository/constants";
4
+ import { JsonSpacing } from "./helpers";
5
+ export type IndexDescriptor = {
6
+ name: string;
7
+ fileName: string;
8
+ columns: string[];
9
+ directions?: OrderDirection[2];
10
+ };
11
+ export declare function toIndexFileName(indexName: string): string;
12
+ export declare class FsIndexStore {
13
+ private readonly fs;
14
+ private readonly indexDirResolver;
15
+ private readonly spacing?;
16
+ private readonly cache;
17
+ constructor(fs: typeof FsPromises, indexDirResolver: (tableName: string) => string, spacing?: JsonSpacing);
18
+ ensure(tableName: string, descriptors: IndexDescriptor[]): Promise<void>;
19
+ upsert(tableName: string, descriptors: IndexDescriptor[], id: PrimaryKeyType, record: Record<string, any>, previous?: Record<string, any>): Promise<void>;
20
+ remove(tableName: string, descriptors: IndexDescriptor[], id: PrimaryKeyType, record?: Record<string, any>): Promise<void>;
21
+ private removeFromEntries;
22
+ private removeFromAll;
23
+ private keyForRecord;
24
+ private normalizeValue;
25
+ private indexPath;
26
+ private persist;
27
+ refresh(tableName: string, descriptors: IndexDescriptor[]): Promise<void>;
28
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexStore.js","sourceRoot":"","sources":["../../src/fs/indexStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
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.FilesystemLock = void 0;
7
+ const node_fs_1 = require("node:fs");
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const transactional_decorators_1 = require("@decaf-ts/transactional-decorators");
10
+ const helpers_1 = require("./../helpers.cjs");
11
+ const DEFAULT_WAIT_MS = 50;
12
+ class FilesystemLock extends transactional_decorators_1.Lock {
13
+ constructor(lockPath, fs = node_fs_1.promises, waitMs = DEFAULT_WAIT_MS) {
14
+ super();
15
+ this.lockPath = lockPath;
16
+ this.fs = fs;
17
+ this.waitMs = waitMs;
18
+ }
19
+ async takeLock() {
20
+ await (0, helpers_1.ensureDir)(this.fs, node_path_1.default.dirname(this.lockPath));
21
+ while (true) {
22
+ try {
23
+ this.handle = await this.fs.open(this.lockPath, node_fs_1.constants.O_CREAT | node_fs_1.constants.O_EXCL | node_fs_1.constants.O_RDWR);
24
+ return;
25
+ }
26
+ catch (err) {
27
+ if (err?.code === "EEXIST") {
28
+ await new Promise((resolve) => setTimeout(resolve, this.waitMs));
29
+ continue;
30
+ }
31
+ throw err;
32
+ }
33
+ }
34
+ }
35
+ async releaseLockFile() {
36
+ if (!this.handle)
37
+ return;
38
+ try {
39
+ await this.handle.close();
40
+ }
41
+ catch {
42
+ // ignore errors while closing
43
+ }
44
+ await this.fs.rm(this.lockPath, { force: true });
45
+ this.handle = undefined;
46
+ }
47
+ async acquire(...args) {
48
+ await super.acquire(...args);
49
+ await this.takeLock();
50
+ }
51
+ release(...args) {
52
+ void this.releaseLockFile().then(() => super.release(...args));
53
+ }
54
+ }
55
+ exports.FilesystemLock = FilesystemLock;
56
+ //# sourceMappingURL=FilesystemLock.js.map
@@ -0,0 +1,13 @@
1
+ import { promises as defaultFs } from "node:fs";
2
+ import { Lock } from "@decaf-ts/transactional-decorators";
3
+ export declare class FilesystemLock extends Lock {
4
+ private readonly lockPath;
5
+ private readonly fs;
6
+ private readonly waitMs;
7
+ private handle?;
8
+ constructor(lockPath: string, fs?: typeof defaultFs, waitMs?: number);
9
+ private takeLock;
10
+ private releaseLockFile;
11
+ acquire(...args: any[]): Promise<void>;
12
+ release(...args: any[]): void;
13
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilesystemLock.js","sourceRoot":"","sources":["../../../src/fs/locks/FilesystemLock.ts"],"names":[],"mappings":";;;;;;AAAA,qCAA0E;AAC1E,0DAA6B;AAC7B,iFAA0D;AAC1D,8CAAuC;AAEvC,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B,MAAa,cAAe,SAAQ,+BAAI;IAGtC,YACmB,QAAgB,EAChB,KAAuB,kBAAS,EAChC,SAAiB,eAAe;QAEjD,KAAK,EAAE,CAAC;QAJS,aAAQ,GAAR,QAAQ,CAAQ;QAChB,OAAE,GAAF,EAAE,CAA8B;QAChC,WAAM,GAAN,MAAM,CAA0B;IAGnD,CAAC;IAEO,KAAK,CAAC,QAAQ;QACpB,MAAM,IAAA,mBAAS,EAAC,IAAI,CAAC,EAAE,EAAE,mBAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtD,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAC9B,IAAI,CAAC,QAAQ,EACb,mBAAW,CAAC,OAAO,GAAG,mBAAW,CAAC,MAAM,GAAG,mBAAW,CAAC,MAAM,CAC9D,CAAC;gBACF,OAAO;YACT,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,IAAI,GAAG,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC3B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;oBACjE,SAAS;gBACX,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QACzB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;QACD,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;IAC1B,CAAC;IAEQ,KAAK,CAAC,OAAO,CAAC,GAAG,IAAW;QACnC,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QAC7B,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;IAEQ,OAAO,CAAC,GAAG,IAAW;QAC7B,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACjE,CAAC;CACF;AAjDD,wCAiDC"}
@@ -0,0 +1,30 @@
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.FilesystemMultiLock = void 0;
7
+ const node_fs_1 = require("node:fs");
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const transactional_decorators_1 = require("@decaf-ts/transactional-decorators");
10
+ const helpers_1 = require("./../helpers.cjs");
11
+ const FilesystemLock_1 = require("./FilesystemLock.cjs");
12
+ class FilesystemMultiLock extends transactional_decorators_1.MultiLock {
13
+ constructor(lockDir, fs = node_fs_1.promises) {
14
+ super();
15
+ this.lockDir = lockDir;
16
+ this.fs = fs;
17
+ }
18
+ async lockFor(name) {
19
+ await this.lock.acquire();
20
+ if (!this.locks[name]) {
21
+ const lockPath = node_path_1.default.join(this.lockDir, `${encodeURIComponent(name)}.lock`);
22
+ await (0, helpers_1.ensureDir)(this.fs, node_path_1.default.dirname(lockPath));
23
+ this.locks[name] = new FilesystemLock_1.FilesystemLock(lockPath, this.fs);
24
+ }
25
+ this.lock.release();
26
+ return this.locks[name];
27
+ }
28
+ }
29
+ exports.FilesystemMultiLock = FilesystemMultiLock;
30
+ //# sourceMappingURL=FilesystemMultiLock.js.map
@@ -0,0 +1,8 @@
1
+ import { promises as defaultFs } from "node:fs";
2
+ import { MultiLock, Lock } from "@decaf-ts/transactional-decorators";
3
+ export declare class FilesystemMultiLock extends MultiLock {
4
+ private readonly lockDir;
5
+ private readonly fs;
6
+ constructor(lockDir: string, fs?: typeof defaultFs);
7
+ protected lockFor(name: string): Promise<Lock>;
8
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilesystemMultiLock.js","sourceRoot":"","sources":["../../../src/fs/locks/FilesystemMultiLock.ts"],"names":[],"mappings":";;;;;;AAAA,qCAAgD;AAChD,0DAA6B;AAC7B,iFAAqE;AACrE,8CAAuC;AACvC,yDAAkD;AAElD,MAAa,mBAAoB,SAAQ,oCAAS;IAChD,YACmB,OAAe,EACf,KAAuB,kBAAS;QAEjD,KAAK,EAAE,CAAC;QAHS,YAAO,GAAP,OAAO,CAAQ;QACf,OAAE,GAAF,EAAE,CAA8B;IAGnD,CAAC;IAEkB,KAAK,CAAC,OAAO,CAAC,IAAY;QAC3C,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,mBAAI,CAAC,IAAI,CACxB,IAAI,CAAC,OAAO,EACZ,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,CACnC,CAAC;YACF,MAAM,IAAA,mBAAS,EAAC,IAAI,CAAC,EAAE,EAAE,mBAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;YACjD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,+BAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF;AArBD,kDAqBC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,34 @@
1
+ import type { promises as FsPromises } from "node:fs";
2
+ import type { RamConfig } from "../ram/types";
3
+ import type { JsonSpacing } from "./helpers";
4
+ export type FilesystemHydrationInfo = {
5
+ table: string;
6
+ records: number;
7
+ };
8
+ export type FilesystemConfig = RamConfig & {
9
+ /**
10
+ * Base directory where adapter data is persisted.
11
+ * A sub-directory using the adapter alias will be created automatically.
12
+ */
13
+ rootDir?: string;
14
+ /**
15
+ * Optional fs/promises implementation (for testing/mocking).
16
+ */
17
+ fs?: typeof FsPromises;
18
+ /**
19
+ * Whether JSON files should use pretty formatting.
20
+ */
21
+ jsonSpacing?: JsonSpacing;
22
+ /**
23
+ * Optional callback invoked after a table has been hydrated from disk.
24
+ */
25
+ onHydrated?: (info: FilesystemHydrationInfo) => void;
26
+ /**
27
+ * Directory used to store lockfiles when filesystem locking is enabled.
28
+ */
29
+ lockDir?: string;
30
+ /**
31
+ * Minimum debounce window (in milliseconds) used by watchers before notifying observers.
32
+ */
33
+ watchDebounceMs?: number;
34
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/fs/types.ts"],"names":[],"mappings":""}
package/lib/index.cjs CHANGED
@@ -49,7 +49,7 @@ __exportStar(require("./persistence/index.cjs"), exports);
49
49
  * @const VERSION
50
50
  * @memberOf module:core
51
51
  */
52
- exports.VERSION = "0.8.50";
52
+ exports.VERSION = "0.8.51";
53
53
  /**
54
54
  * @description Stores the current package version
55
55
  * @summary A constant representing the version of the core package
package/lib/index.d.ts CHANGED
@@ -22,7 +22,7 @@ export * from "./persistence";
22
22
  * @const VERSION
23
23
  * @memberOf module:core
24
24
  */
25
- export declare const VERSION = "0.8.50";
25
+ export declare const VERSION = "0.8.51";
26
26
  /**
27
27
  * @description Stores the current package version
28
28
  * @summary A constant representing the version of the core package
@@ -235,7 +235,7 @@ export declare class RamAdapter extends Adapter<RamConfig, RamStorage, RawRamQue
235
235
  * @param {Constructor<M>} from - The model class
236
236
  * @return {Map<string | number, any> | undefined} The table Map or undefined
237
237
  */
238
- protected tableFor<M extends Model>(from: Constructor<M>): Map<string | number, any> | undefined;
238
+ protected tableFor<M extends Model>(from: Constructor<M>): Map<PrimaryKeyType, any> | undefined;
239
239
  /**
240
240
  * @description Executes a raw query against the in-memory storage
241
241
  * @summary Performs a query operation on the in-memory data store using the provided query specification.
@@ -4,6 +4,7 @@ import { Constructor } from "@decaf-ts/decoration";
4
4
  import { Adapter, AdapterFlags } from "../persistence";
5
5
  import { Context } from "../persistence/Context";
6
6
  import { MultiLock } from "@decaf-ts/transactional-decorators";
7
+ import { PrimaryKeyType } from "@decaf-ts/db-decorators";
7
8
  /**
8
9
  * @description In-memory storage structure for the RAM adapter
9
10
  * @summary A nested Map structure that stores all entities by their table name and primary key.
@@ -12,7 +13,7 @@ import { MultiLock } from "@decaf-ts/transactional-decorators";
12
13
  * @memberOf module:core
13
14
  * @category Ram
14
15
  */
15
- export type RamStorage = Map<string, Map<string | number, any>>;
16
+ export type RamStorage = Map<string, Map<PrimaryKeyType, any>>;
16
17
  export type RawRamQuery<M extends Model = any> = {
17
18
  select: undefined | (keyof M)[];
18
19
  from: Constructor<M>;