@orkify/cli 1.0.0-beta.5 → 1.0.0-beta.6

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 (90) hide show
  1. package/README.md +10 -5
  2. package/package.json +8 -31
  3. package/packages/cache/README.md +0 -114
  4. package/packages/cache/dist/CacheClient.d.ts +0 -26
  5. package/packages/cache/dist/CacheClient.d.ts.map +0 -1
  6. package/packages/cache/dist/CacheClient.js +0 -174
  7. package/packages/cache/dist/CacheClient.js.map +0 -1
  8. package/packages/cache/dist/CacheFileStore.d.ts +0 -45
  9. package/packages/cache/dist/CacheFileStore.d.ts.map +0 -1
  10. package/packages/cache/dist/CacheFileStore.js +0 -446
  11. package/packages/cache/dist/CacheFileStore.js.map +0 -1
  12. package/packages/cache/dist/CachePersistence.d.ts +0 -9
  13. package/packages/cache/dist/CachePersistence.d.ts.map +0 -1
  14. package/packages/cache/dist/CachePersistence.js +0 -67
  15. package/packages/cache/dist/CachePersistence.js.map +0 -1
  16. package/packages/cache/dist/CachePrimary.d.ts +0 -25
  17. package/packages/cache/dist/CachePrimary.d.ts.map +0 -1
  18. package/packages/cache/dist/CachePrimary.js +0 -155
  19. package/packages/cache/dist/CachePrimary.js.map +0 -1
  20. package/packages/cache/dist/CacheStore.d.ts +0 -50
  21. package/packages/cache/dist/CacheStore.d.ts.map +0 -1
  22. package/packages/cache/dist/CacheStore.js +0 -271
  23. package/packages/cache/dist/CacheStore.js.map +0 -1
  24. package/packages/cache/dist/constants.d.ts +0 -6
  25. package/packages/cache/dist/constants.d.ts.map +0 -1
  26. package/packages/cache/dist/constants.js +0 -9
  27. package/packages/cache/dist/constants.js.map +0 -1
  28. package/packages/cache/dist/index.d.ts +0 -16
  29. package/packages/cache/dist/index.d.ts.map +0 -1
  30. package/packages/cache/dist/index.js +0 -86
  31. package/packages/cache/dist/index.js.map +0 -1
  32. package/packages/cache/dist/serialize.d.ts +0 -9
  33. package/packages/cache/dist/serialize.d.ts.map +0 -1
  34. package/packages/cache/dist/serialize.js +0 -40
  35. package/packages/cache/dist/serialize.js.map +0 -1
  36. package/packages/cache/dist/types.d.ts +0 -123
  37. package/packages/cache/dist/types.d.ts.map +0 -1
  38. package/packages/cache/dist/types.js +0 -2
  39. package/packages/cache/dist/types.js.map +0 -1
  40. package/packages/cache/package.json +0 -27
  41. package/packages/cache/src/CacheClient.ts +0 -227
  42. package/packages/cache/src/CacheFileStore.ts +0 -528
  43. package/packages/cache/src/CachePersistence.ts +0 -89
  44. package/packages/cache/src/CachePrimary.ts +0 -172
  45. package/packages/cache/src/CacheStore.ts +0 -308
  46. package/packages/cache/src/constants.ts +0 -10
  47. package/packages/cache/src/index.ts +0 -100
  48. package/packages/cache/src/serialize.ts +0 -49
  49. package/packages/cache/src/types.ts +0 -156
  50. package/packages/cache/tsconfig.json +0 -18
  51. package/packages/cache/tsconfig.tsbuildinfo +0 -1
  52. package/packages/next/README.md +0 -166
  53. package/packages/next/dist/error-capture.d.ts +0 -34
  54. package/packages/next/dist/error-capture.d.ts.map +0 -1
  55. package/packages/next/dist/error-capture.js +0 -130
  56. package/packages/next/dist/error-capture.js.map +0 -1
  57. package/packages/next/dist/error-handler.d.ts +0 -10
  58. package/packages/next/dist/error-handler.d.ts.map +0 -1
  59. package/packages/next/dist/error-handler.js +0 -186
  60. package/packages/next/dist/error-handler.js.map +0 -1
  61. package/packages/next/dist/isr-cache.d.ts +0 -9
  62. package/packages/next/dist/isr-cache.d.ts.map +0 -1
  63. package/packages/next/dist/isr-cache.js +0 -86
  64. package/packages/next/dist/isr-cache.js.map +0 -1
  65. package/packages/next/dist/stream.d.ts +0 -5
  66. package/packages/next/dist/stream.d.ts.map +0 -1
  67. package/packages/next/dist/stream.js +0 -22
  68. package/packages/next/dist/stream.js.map +0 -1
  69. package/packages/next/dist/types.d.ts +0 -33
  70. package/packages/next/dist/types.d.ts.map +0 -1
  71. package/packages/next/dist/types.js +0 -6
  72. package/packages/next/dist/types.js.map +0 -1
  73. package/packages/next/dist/use-cache.d.ts +0 -4
  74. package/packages/next/dist/use-cache.d.ts.map +0 -1
  75. package/packages/next/dist/use-cache.js +0 -86
  76. package/packages/next/dist/use-cache.js.map +0 -1
  77. package/packages/next/dist/utils.d.ts +0 -32
  78. package/packages/next/dist/utils.d.ts.map +0 -1
  79. package/packages/next/dist/utils.js +0 -88
  80. package/packages/next/dist/utils.js.map +0 -1
  81. package/packages/next/package.json +0 -52
  82. package/packages/next/src/error-capture.ts +0 -177
  83. package/packages/next/src/error-handler.ts +0 -221
  84. package/packages/next/src/isr-cache.ts +0 -100
  85. package/packages/next/src/stream.ts +0 -23
  86. package/packages/next/src/types.ts +0 -33
  87. package/packages/next/src/use-cache.ts +0 -99
  88. package/packages/next/src/utils.ts +0 -102
  89. package/packages/next/tsconfig.json +0 -19
  90. package/packages/next/tsconfig.tsbuildinfo +0 -1
@@ -1,446 +0,0 @@
1
- import { createHash } from 'node:crypto';
2
- import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
3
- import { mkdir, readFile, rename, unlink, writeFile } from 'node:fs/promises';
4
- import { join } from 'node:path';
5
- import { CACHE_CLEANUP_INTERVAL } from './constants.js';
6
- import { CacheStore } from './CacheStore.js';
7
- import { deserialize, serialize, serializedByteLength } from './serialize.js';
8
- export class CacheFileStore {
9
- cacheDir;
10
- diskIndex = new Map();
11
- diskSweepTimer;
12
- diskTagIndex = new Map(); // tag → disk keys
13
- entriesDir;
14
- indexPath;
15
- indexDirty = false;
16
- loadIndexPromise;
17
- persistPromise;
18
- readOnly;
19
- store;
20
- tagTimestamps = new Map(); // disk-only tag timestamps
21
- constructor(processName, config, options) {
22
- this.readOnly = options?.readOnly ?? false;
23
- this.cacheDir = join(process.env.HOME ?? process.env.USERPROFILE ?? '.', '.orkify', 'cache', processName);
24
- this.entriesDir = join(this.cacheDir, 'entries');
25
- this.indexPath = join(this.cacheDir, 'index.json');
26
- this.store = new CacheStore(config, this.readOnly
27
- ? undefined
28
- : (key, entry, reason) => {
29
- if (reason === 'lru') {
30
- // Spill evicted entry to disk (fire-and-forget)
31
- void this.writeToDisk(key, entry);
32
- }
33
- else if (reason === 'expired') {
34
- // Clean expired entry from disk
35
- void this.deleteFromDisk(key);
36
- }
37
- });
38
- if (!this.readOnly) {
39
- // Periodic disk sweep for expired entries
40
- this.diskSweepTimer = setInterval(() => void this.sweepDisk(), CACHE_CLEANUP_INTERVAL);
41
- this.diskSweepTimer.unref();
42
- // Load disk index from any previous session (entries promoted lazily via getAsync).
43
- // Store the promise so getAsync can await it before checking the index.
44
- this.loadIndexPromise = this.loadIndex();
45
- }
46
- }
47
- // --- ICacheStore public API ---
48
- get(key) {
49
- return this.store.get(key);
50
- }
51
- async getAsync(key) {
52
- // Hot path: sync memory lookup
53
- const memValue = this.store.get(key);
54
- if (memValue !== undefined)
55
- return memValue;
56
- // Ensure disk index is loaded from any previous session before checking it
57
- if (this.loadIndexPromise) {
58
- await this.loadIndexPromise;
59
- this.loadIndexPromise = undefined;
60
- }
61
- // Cold path: check disk index (populated in full mode, empty in readOnly mode)
62
- const meta = this.diskIndex.get(key);
63
- // In full mode, if not in index it's a true miss.
64
- // In readOnly mode, diskIndex is empty — always try file directly.
65
- if (!meta && !this.readOnly)
66
- return undefined;
67
- // Compute file path: from index if available, otherwise derive from key hash
68
- const fileName = meta?.file ?? createHash('sha256').update(key).digest('hex') + '.json';
69
- const filePath = join(this.entriesDir, fileName);
70
- try {
71
- const content = await readFile(filePath, 'utf-8');
72
- const disk = JSON.parse(content);
73
- // Check TTL expiration
74
- if (disk.expiresAt !== undefined && disk.expiresAt < Date.now()) {
75
- if (!this.readOnly)
76
- void this.deleteFromDisk(key);
77
- return undefined;
78
- }
79
- // Check tag timestamps — if any tag was invalidated after the entry was written, it's stale
80
- if (disk.tags && disk.tags.length > 0) {
81
- const tagExp = this.getTagExpiration(disk.tags);
82
- if (tagExp > disk.timestamp) {
83
- if (!this.readOnly)
84
- void this.deleteFromDisk(key);
85
- return undefined;
86
- }
87
- }
88
- // Deserialize the value
89
- const value = deserialize(disk.value);
90
- // Promote to memory (may evict other entries to disk via callback in full mode;
91
- // in readOnly mode evictions just drop since there's no onEvict)
92
- this.store.set(key, value, disk.expiresAt, disk.tags);
93
- // In full mode, remove from disk index (it's now in memory)
94
- if (meta && !this.readOnly) {
95
- this.removeDiskMeta(key);
96
- }
97
- return value;
98
- }
99
- catch {
100
- // File read/parse failed — remove stale index entry in full mode
101
- if (meta && !this.readOnly) {
102
- this.removeDiskMeta(key);
103
- }
104
- return undefined;
105
- }
106
- }
107
- set(key, value, expiresAt, tags, precomputedByteSize) {
108
- // Remove from disk if it exists there (we're overwriting)
109
- if (this.diskIndex.has(key)) {
110
- void this.deleteFromDisk(key);
111
- }
112
- this.store.set(key, value, expiresAt, tags, precomputedByteSize);
113
- }
114
- delete(key) {
115
- const memDeleted = this.store.delete(key);
116
- const diskHad = this.diskIndex.has(key);
117
- if (diskHad) {
118
- void this.deleteFromDisk(key);
119
- }
120
- return memDeleted || diskHad;
121
- }
122
- clear() {
123
- this.store.clear();
124
- // Clear all disk entries
125
- const diskKeys = [...this.diskIndex.keys()];
126
- for (const key of diskKeys) {
127
- void this.deleteFromDisk(key);
128
- }
129
- this.diskIndex.clear();
130
- this.diskTagIndex.clear();
131
- this.tagTimestamps.clear();
132
- this.indexDirty = true;
133
- void this.persistIndex();
134
- }
135
- has(key) {
136
- if (this.store.has(key))
137
- return true;
138
- const meta = this.diskIndex.get(key);
139
- if (!meta)
140
- return false;
141
- if (meta.expiresAt !== undefined && meta.expiresAt < Date.now()) {
142
- if (!this.readOnly)
143
- void this.deleteFromDisk(key);
144
- return false;
145
- }
146
- return true;
147
- }
148
- stats() {
149
- const base = this.store.stats();
150
- return { ...base, diskSize: this.diskIndex.size };
151
- }
152
- invalidateTag(tag) {
153
- // Invalidate in memory
154
- const deleted = this.store.invalidateTag(tag);
155
- // Record tag timestamp for disk entries
156
- this.tagTimestamps.set(tag, Date.now());
157
- // Delete disk entries with this tag
158
- const diskKeys = this.diskTagIndex.get(tag);
159
- if (diskKeys && diskKeys.size > 0) {
160
- for (const key of [...diskKeys]) {
161
- void this.deleteFromDisk(key);
162
- }
163
- }
164
- return deleted;
165
- }
166
- getTagExpiration(tags) {
167
- // Check both in-memory store and disk-level tag timestamps
168
- const memExp = this.store.getTagExpiration(tags);
169
- let diskExp = 0;
170
- for (const tag of tags) {
171
- const ts = this.tagTimestamps.get(tag);
172
- if (ts !== undefined && ts > diskExp) {
173
- diskExp = ts;
174
- }
175
- }
176
- return Math.max(memExp, diskExp);
177
- }
178
- applyTagTimestamp(tag, timestamp) {
179
- this.store.applyTagTimestamp(tag, timestamp);
180
- this.tagTimestamps.set(tag, timestamp);
181
- }
182
- applySet(key, value, expiresAt, tags) {
183
- if (this.diskIndex.has(key)) {
184
- void this.deleteFromDisk(key);
185
- }
186
- this.store.applySet(key, value, expiresAt, tags);
187
- }
188
- applyDelete(key) {
189
- this.store.applyDelete(key);
190
- if (this.diskIndex.has(key)) {
191
- void this.deleteFromDisk(key);
192
- }
193
- }
194
- applySnapshot(snapshot) {
195
- this.store.applySnapshot(snapshot);
196
- // Snapshot replaces everything — clear disk too
197
- for (const key of [...this.diskIndex.keys()]) {
198
- void this.deleteFromDisk(key);
199
- }
200
- this.diskIndex.clear();
201
- this.diskTagIndex.clear();
202
- // Merge tag timestamps from snapshot
203
- this.tagTimestamps.clear();
204
- for (const [tag, ts] of snapshot.tagTimestamps) {
205
- this.tagTimestamps.set(tag, ts);
206
- }
207
- this.indexDirty = true;
208
- void this.persistIndex();
209
- }
210
- serialize() {
211
- return this.store.serialize();
212
- }
213
- destroy() {
214
- if (this.diskSweepTimer) {
215
- clearInterval(this.diskSweepTimer);
216
- this.diskSweepTimer = undefined;
217
- }
218
- this.store.destroy();
219
- this.diskIndex.clear();
220
- this.diskTagIndex.clear();
221
- this.tagTimestamps.clear();
222
- }
223
- // --- File-backed specific methods ---
224
- /** Flush all in-memory entries to disk (called on graceful shutdown). No-op in readOnly mode. */
225
- async flush() {
226
- if (this.readOnly)
227
- return;
228
- const snapshot = this.store.serialize();
229
- for (const [key, entry] of snapshot.entries) {
230
- const byteSize = serializedByteLength(serialize(entry.value));
231
- await this.writeToDisk(key, {
232
- byteSize,
233
- value: entry.value,
234
- expiresAt: entry.expiresAt,
235
- lastAccessedAt: Date.now(),
236
- tags: entry.tags,
237
- });
238
- }
239
- // Force a final index write — fire-and-forget calls from writeToDisk may have
240
- // already persisted a partial index and cleared the dirty flag
241
- this.indexDirty = true;
242
- await this.persistIndex();
243
- }
244
- /** Synchronous flush for use in process 'exit' handlers where async I/O is unavailable. */
245
- flushSync() {
246
- if (this.readOnly)
247
- return;
248
- const snapshot = this.store.serialize();
249
- if (snapshot.entries.length === 0)
250
- return;
251
- mkdirSync(this.entriesDir, { recursive: true });
252
- for (const [key, entry] of snapshot.entries) {
253
- const fileName = createHash('sha256').update(key).digest('hex') + '.json';
254
- const filePath = join(this.entriesDir, fileName);
255
- const now = Date.now();
256
- const disk = {
257
- key,
258
- value: serialize(entry.value),
259
- expiresAt: entry.expiresAt,
260
- tags: entry.tags,
261
- timestamp: now,
262
- };
263
- writeFileSync(filePath, JSON.stringify(disk), 'utf-8');
264
- const meta = { file: fileName, expiresAt: entry.expiresAt, timestamp: now };
265
- if (entry.tags && entry.tags.length > 0)
266
- meta.tags = entry.tags;
267
- this.diskIndex.set(key, meta);
268
- if (entry.tags) {
269
- for (const tag of entry.tags) {
270
- let keys = this.diskTagIndex.get(tag);
271
- if (!keys) {
272
- keys = new Set();
273
- this.diskTagIndex.set(tag, keys);
274
- }
275
- keys.add(key);
276
- }
277
- }
278
- }
279
- mkdirSync(this.cacheDir, { recursive: true });
280
- const data = {
281
- entries: Object.fromEntries(this.diskIndex),
282
- tagTimestamps: [...this.tagTimestamps],
283
- };
284
- writeFileSync(this.indexPath, JSON.stringify(data), 'utf-8');
285
- }
286
- /** Load disk index on startup (values are loaded lazily on access). No-op in readOnly mode. */
287
- async loadIndex() {
288
- if (this.readOnly)
289
- return;
290
- if (!existsSync(this.indexPath))
291
- return;
292
- try {
293
- const content = await readFile(this.indexPath, 'utf-8');
294
- const data = JSON.parse(content);
295
- this.diskIndex.clear();
296
- this.diskTagIndex.clear();
297
- const now = Date.now();
298
- for (const [key, meta] of Object.entries(data.entries)) {
299
- // Skip expired entries
300
- if (meta.expiresAt !== undefined && meta.expiresAt < now)
301
- continue;
302
- // Ensure timestamp exists (older indexes may lack it)
303
- if (!meta.timestamp)
304
- meta.timestamp = now;
305
- this.diskIndex.set(key, meta);
306
- if (meta.tags) {
307
- for (const tag of meta.tags) {
308
- let keys = this.diskTagIndex.get(tag);
309
- if (!keys) {
310
- keys = new Set();
311
- this.diskTagIndex.set(tag, keys);
312
- }
313
- keys.add(key);
314
- }
315
- }
316
- }
317
- // Restore tag timestamps
318
- if (data.tagTimestamps) {
319
- for (const [tag, ts] of data.tagTimestamps) {
320
- this.tagTimestamps.set(tag, ts);
321
- this.store.applyTagTimestamp(tag, ts);
322
- }
323
- }
324
- }
325
- catch {
326
- // Corrupted index — start fresh
327
- this.diskIndex.clear();
328
- this.diskTagIndex.clear();
329
- }
330
- }
331
- // --- Private helpers ---
332
- async writeToDisk(key, entry) {
333
- try {
334
- await mkdir(this.entriesDir, { recursive: true });
335
- const fileName = createHash('sha256').update(key).digest('hex') + '.json';
336
- const filePath = join(this.entriesDir, fileName);
337
- const now = Date.now();
338
- const disk = {
339
- key,
340
- value: serialize(entry.value),
341
- expiresAt: entry.expiresAt,
342
- tags: entry.tags,
343
- timestamp: now,
344
- };
345
- // Atomic write
346
- const tmpPath = filePath + '.tmp';
347
- await writeFile(tmpPath, JSON.stringify(disk), 'utf-8');
348
- await rename(tmpPath, filePath);
349
- // Update disk index
350
- const meta = { file: fileName, expiresAt: entry.expiresAt, timestamp: now };
351
- if (entry.tags && entry.tags.length > 0) {
352
- meta.tags = entry.tags;
353
- }
354
- this.diskIndex.set(key, meta);
355
- // Update disk tag index
356
- if (entry.tags) {
357
- for (const tag of entry.tags) {
358
- let keys = this.diskTagIndex.get(tag);
359
- if (!keys) {
360
- keys = new Set();
361
- this.diskTagIndex.set(tag, keys);
362
- }
363
- keys.add(key);
364
- }
365
- }
366
- this.indexDirty = true;
367
- void this.persistIndex();
368
- }
369
- catch {
370
- // Disk write failed — entry stays in-memory only
371
- }
372
- }
373
- async deleteFromDisk(key) {
374
- const meta = this.diskIndex.get(key);
375
- if (!meta)
376
- return;
377
- this.removeDiskMeta(key);
378
- try {
379
- const filePath = join(this.entriesDir, meta.file);
380
- if (existsSync(filePath)) {
381
- await unlink(filePath);
382
- }
383
- }
384
- catch {
385
- // File already gone or inaccessible — ok
386
- }
387
- this.indexDirty = true;
388
- void this.persistIndex();
389
- }
390
- removeDiskMeta(key) {
391
- const meta = this.diskIndex.get(key);
392
- if (!meta)
393
- return;
394
- // Remove from disk tag index
395
- if (meta.tags) {
396
- for (const tag of meta.tags) {
397
- const keys = this.diskTagIndex.get(tag);
398
- if (keys) {
399
- keys.delete(key);
400
- if (keys.size === 0) {
401
- this.diskTagIndex.delete(tag);
402
- }
403
- }
404
- }
405
- }
406
- this.diskIndex.delete(key);
407
- this.indexDirty = true;
408
- }
409
- async sweepDisk() {
410
- const now = Date.now();
411
- for (const [key, meta] of [...this.diskIndex]) {
412
- if (meta.expiresAt !== undefined && meta.expiresAt < now) {
413
- await this.deleteFromDisk(key);
414
- }
415
- }
416
- }
417
- async persistIndex() {
418
- if (this.readOnly || !this.indexDirty)
419
- return;
420
- this.indexDirty = false;
421
- const doWrite = async () => {
422
- try {
423
- await mkdir(this.cacheDir, { recursive: true });
424
- const data = {
425
- entries: Object.fromEntries(this.diskIndex),
426
- tagTimestamps: [...this.tagTimestamps],
427
- };
428
- const tmpPath = this.indexPath + '.tmp';
429
- await writeFile(tmpPath, JSON.stringify(data), 'utf-8');
430
- await rename(tmpPath, this.indexPath);
431
- }
432
- catch {
433
- // Index write failed — will retry on next change
434
- this.indexDirty = true;
435
- }
436
- };
437
- // Chain onto any in-flight write so they don't overlap
438
- this.persistPromise = (this.persistPromise ?? Promise.resolve()).then(doWrite);
439
- await this.persistPromise;
440
- // If new changes arrived during the write, persist again
441
- if (this.indexDirty) {
442
- void this.persistIndex();
443
- }
444
- }
445
- }
446
- //# sourceMappingURL=CacheFileStore.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CacheFileStore.js","sourceRoot":"","sources":["../src/CacheFileStore.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- import type { CacheSnapshot } from './types.js';
2
- export declare class CachePersistence {
3
- private filePath;
4
- constructor(processName: string);
5
- save(snapshot: CacheSnapshot): Promise<void>;
6
- load(): Promise<CacheSnapshot>;
7
- clear(): Promise<void>;
8
- }
9
- //# sourceMappingURL=CachePersistence.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CachePersistence.d.ts","sourceRoot":"","sources":["../src/CachePersistence.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAwB,MAAM,YAAY,CAAC;AAgBtE,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAS;gBAEb,WAAW,EAAE,MAAM;IAIzB,IAAI,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB5C,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC;IAgC9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK7B"}
@@ -1,67 +0,0 @@
1
- import { existsSync } from 'node:fs';
2
- import { mkdir, readFile, rename, unlink, writeFile } from 'node:fs/promises';
3
- import { dirname, join } from 'node:path';
4
- import { CACHE_DIR } from './constants.js';
5
- import { deserialize, serialize } from './serialize.js';
6
- export class CachePersistence {
7
- filePath;
8
- constructor(processName) {
9
- this.filePath = join(CACHE_DIR, `${processName}.json`);
10
- }
11
- async save(snapshot) {
12
- const dir = dirname(this.filePath);
13
- if (!existsSync(dir)) {
14
- await mkdir(dir, { recursive: true });
15
- }
16
- const diskEntries = snapshot.entries.map(([key, entry]) => {
17
- const disk = {
18
- value: serialize(entry.value),
19
- expiresAt: entry.expiresAt,
20
- };
21
- if (entry.tags && entry.tags.length > 0) {
22
- disk.tags = entry.tags;
23
- }
24
- return [key, disk];
25
- });
26
- const diskData = { entries: diskEntries, tagTimestamps: snapshot.tagTimestamps };
27
- // Atomic write: temp file → rename
28
- const tmpPath = this.filePath + '.tmp';
29
- await writeFile(tmpPath, JSON.stringify(diskData), 'utf-8');
30
- await rename(tmpPath, this.filePath);
31
- }
32
- async load() {
33
- if (!existsSync(this.filePath)) {
34
- return { entries: [], tagTimestamps: [] };
35
- }
36
- try {
37
- const content = await readFile(this.filePath, 'utf-8');
38
- const raw = JSON.parse(content);
39
- const diskEntries = raw.entries;
40
- const tagTimestamps = raw.tagTimestamps;
41
- const now = Date.now();
42
- const entries = diskEntries
43
- .filter(([, entry]) => entry.expiresAt === undefined || entry.expiresAt > now)
44
- .map(([key, entry]) => {
45
- const result = {
46
- value: deserialize(entry.value),
47
- expiresAt: entry.expiresAt,
48
- };
49
- if (entry.tags) {
50
- result.tags = entry.tags;
51
- }
52
- return [key, result];
53
- });
54
- return { entries, tagTimestamps };
55
- }
56
- catch (err) {
57
- console.warn(`[orkify:cache] Failed to load cache from ${this.filePath}:`, err);
58
- return { entries: [], tagTimestamps: [] };
59
- }
60
- }
61
- async clear() {
62
- if (existsSync(this.filePath)) {
63
- await unlink(this.filePath);
64
- }
65
- }
66
- }
67
- //# sourceMappingURL=CachePersistence.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CachePersistence.js","sourceRoot":"","sources":["../src/CachePersistence.ts"],"names":[],"mappings":"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"}
@@ -1,25 +0,0 @@
1
- import type { Worker } from 'node:cluster';
2
- import type { CacheConfig, CacheWorkerMessage } from './types.js';
3
- interface WorkerState {
4
- worker: Worker;
5
- }
6
- export declare class CachePrimary {
7
- private fileBacked;
8
- private persistence;
9
- private processName;
10
- private store;
11
- constructor(processName: string, config?: CacheConfig);
12
- handleMessage(_worker: Worker, msg: CacheWorkerMessage, allWorkers: Map<number, WorkerState>): void;
13
- /**
14
- * Upgrade from CacheStore to CacheFileStore when a worker reports fileBacked config.
15
- * Migrates existing in-memory entries and loads the disk index from any previous session.
16
- */
17
- private applyConfig;
18
- sendSnapshot(worker: Worker): void;
19
- persist(): Promise<void>;
20
- restore(): Promise<void>;
21
- destroy(): void;
22
- shutdown(): Promise<void>;
23
- }
24
- export {};
25
- //# sourceMappingURL=CachePrimary.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CachePrimary.d.ts","sourceRoot":"","sources":["../src/CachePrimary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAe,MAAM,YAAY,CAAC;AAK/E,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,WAAW,CAAmB;IACtC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAc;gBAEf,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW;IAOrD,aAAa,CACX,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,kBAAkB,EACvB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,GACnC,IAAI;IA8EP;;;OAGG;IACH,OAAO,CAAC,WAAW;IAqBnB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAW5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAWxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAW9B,OAAO,IAAI,IAAI;IAIT,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAIhC"}