@orkify/cli 1.0.0-beta.5

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 (203) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +1701 -0
  3. package/bin/orkify +3 -0
  4. package/boot/systemd/orkify@.service +30 -0
  5. package/dist/agent-name.d.ts +4 -0
  6. package/dist/agent-name.js +42 -0
  7. package/dist/alerts/AlertEvaluator.d.ts +14 -0
  8. package/dist/alerts/AlertEvaluator.js +135 -0
  9. package/dist/cli/commands/autostart.d.ts +3 -0
  10. package/dist/cli/commands/autostart.js +11 -0
  11. package/dist/cli/commands/crash-test.d.ts +3 -0
  12. package/dist/cli/commands/crash-test.js +17 -0
  13. package/dist/cli/commands/daemon-reload.d.ts +3 -0
  14. package/dist/cli/commands/daemon-reload.js +72 -0
  15. package/dist/cli/commands/delete.d.ts +3 -0
  16. package/dist/cli/commands/delete.js +37 -0
  17. package/dist/cli/commands/deploy.d.ts +6 -0
  18. package/dist/cli/commands/deploy.js +266 -0
  19. package/dist/cli/commands/down.d.ts +3 -0
  20. package/dist/cli/commands/down.js +36 -0
  21. package/dist/cli/commands/flush.d.ts +3 -0
  22. package/dist/cli/commands/flush.js +28 -0
  23. package/dist/cli/commands/kill.d.ts +3 -0
  24. package/dist/cli/commands/kill.js +35 -0
  25. package/dist/cli/commands/list.d.ts +14 -0
  26. package/dist/cli/commands/list.js +361 -0
  27. package/dist/cli/commands/logs.d.ts +3 -0
  28. package/dist/cli/commands/logs.js +107 -0
  29. package/dist/cli/commands/mcp.d.ts +3 -0
  30. package/dist/cli/commands/mcp.js +151 -0
  31. package/dist/cli/commands/reload.d.ts +3 -0
  32. package/dist/cli/commands/reload.js +54 -0
  33. package/dist/cli/commands/restart.d.ts +3 -0
  34. package/dist/cli/commands/restart.js +43 -0
  35. package/dist/cli/commands/restore.d.ts +3 -0
  36. package/dist/cli/commands/restore.js +88 -0
  37. package/dist/cli/commands/run.d.ts +8 -0
  38. package/dist/cli/commands/run.js +212 -0
  39. package/dist/cli/commands/snap.d.ts +3 -0
  40. package/dist/cli/commands/snap.js +30 -0
  41. package/dist/cli/commands/up.d.ts +3 -0
  42. package/dist/cli/commands/up.js +125 -0
  43. package/dist/cli/crash-recovery.d.ts +2 -0
  44. package/dist/cli/crash-recovery.js +67 -0
  45. package/dist/cli/index.d.ts +3 -0
  46. package/dist/cli/index.js +46 -0
  47. package/dist/cli/parse.d.ts +28 -0
  48. package/dist/cli/parse.js +97 -0
  49. package/dist/cluster/ClusterWrapper.d.ts +18 -0
  50. package/dist/cluster/ClusterWrapper.js +602 -0
  51. package/dist/config/ConfigStore.d.ts +11 -0
  52. package/dist/config/ConfigStore.js +21 -0
  53. package/dist/config/schema.d.ts +103 -0
  54. package/dist/config/schema.js +49 -0
  55. package/dist/constants.d.ts +83 -0
  56. package/dist/constants.js +289 -0
  57. package/dist/cron/CronScheduler.d.ts +25 -0
  58. package/dist/cron/CronScheduler.js +149 -0
  59. package/dist/daemon/GracefulManager.d.ts +8 -0
  60. package/dist/daemon/GracefulManager.js +29 -0
  61. package/dist/daemon/ManagedProcess.d.ts +71 -0
  62. package/dist/daemon/ManagedProcess.js +1020 -0
  63. package/dist/daemon/Orchestrator.d.ts +51 -0
  64. package/dist/daemon/Orchestrator.js +416 -0
  65. package/dist/daemon/RotatingWriter.d.ts +27 -0
  66. package/dist/daemon/RotatingWriter.js +264 -0
  67. package/dist/daemon/index.d.ts +2 -0
  68. package/dist/daemon/index.js +106 -0
  69. package/dist/daemon/startDaemon.d.ts +30 -0
  70. package/dist/daemon/startDaemon.js +693 -0
  71. package/dist/deploy/CommandPoller.d.ts +13 -0
  72. package/dist/deploy/CommandPoller.js +53 -0
  73. package/dist/deploy/DeployExecutor.d.ts +33 -0
  74. package/dist/deploy/DeployExecutor.js +340 -0
  75. package/dist/deploy/config.d.ts +20 -0
  76. package/dist/deploy/config.js +161 -0
  77. package/dist/deploy/env.d.ts +2 -0
  78. package/dist/deploy/env.js +17 -0
  79. package/dist/deploy/tarball.d.ts +32 -0
  80. package/dist/deploy/tarball.js +243 -0
  81. package/dist/detect/framework.d.ts +2 -0
  82. package/dist/detect/framework.js +24 -0
  83. package/dist/ipc/DaemonClient.d.ts +31 -0
  84. package/dist/ipc/DaemonClient.js +248 -0
  85. package/dist/ipc/DaemonServer.d.ts +28 -0
  86. package/dist/ipc/DaemonServer.js +166 -0
  87. package/dist/ipc/MultiUserClient.d.ts +27 -0
  88. package/dist/ipc/MultiUserClient.js +203 -0
  89. package/dist/ipc/protocol.d.ts +7 -0
  90. package/dist/ipc/protocol.js +53 -0
  91. package/dist/ipc/restoreDaemon.d.ts +8 -0
  92. package/dist/ipc/restoreDaemon.js +19 -0
  93. package/dist/machine-id.d.ts +11 -0
  94. package/dist/machine-id.js +51 -0
  95. package/dist/mcp/auth.d.ts +118 -0
  96. package/dist/mcp/auth.js +245 -0
  97. package/dist/mcp/http.d.ts +20 -0
  98. package/dist/mcp/http.js +229 -0
  99. package/dist/mcp/index.d.ts +3 -0
  100. package/dist/mcp/index.js +8 -0
  101. package/dist/mcp/server.d.ts +37 -0
  102. package/dist/mcp/server.js +413 -0
  103. package/dist/probe/compute-fingerprint.d.ts +27 -0
  104. package/dist/probe/compute-fingerprint.js +65 -0
  105. package/dist/probe/parse-frames.d.ts +21 -0
  106. package/dist/probe/parse-frames.js +57 -0
  107. package/dist/probe/resolve-sourcemaps.d.ts +25 -0
  108. package/dist/probe/resolve-sourcemaps.js +281 -0
  109. package/dist/state/StateStore.d.ts +11 -0
  110. package/dist/state/StateStore.js +78 -0
  111. package/dist/telemetry/TelemetryReporter.d.ts +49 -0
  112. package/dist/telemetry/TelemetryReporter.js +451 -0
  113. package/dist/types/index.d.ts +373 -0
  114. package/dist/types/index.js +2 -0
  115. package/package.json +148 -0
  116. package/packages/cache/README.md +114 -0
  117. package/packages/cache/dist/CacheClient.d.ts +26 -0
  118. package/packages/cache/dist/CacheClient.d.ts.map +1 -0
  119. package/packages/cache/dist/CacheClient.js +174 -0
  120. package/packages/cache/dist/CacheClient.js.map +1 -0
  121. package/packages/cache/dist/CacheFileStore.d.ts +45 -0
  122. package/packages/cache/dist/CacheFileStore.d.ts.map +1 -0
  123. package/packages/cache/dist/CacheFileStore.js +446 -0
  124. package/packages/cache/dist/CacheFileStore.js.map +1 -0
  125. package/packages/cache/dist/CachePersistence.d.ts +9 -0
  126. package/packages/cache/dist/CachePersistence.d.ts.map +1 -0
  127. package/packages/cache/dist/CachePersistence.js +67 -0
  128. package/packages/cache/dist/CachePersistence.js.map +1 -0
  129. package/packages/cache/dist/CachePrimary.d.ts +25 -0
  130. package/packages/cache/dist/CachePrimary.d.ts.map +1 -0
  131. package/packages/cache/dist/CachePrimary.js +155 -0
  132. package/packages/cache/dist/CachePrimary.js.map +1 -0
  133. package/packages/cache/dist/CacheStore.d.ts +50 -0
  134. package/packages/cache/dist/CacheStore.d.ts.map +1 -0
  135. package/packages/cache/dist/CacheStore.js +271 -0
  136. package/packages/cache/dist/CacheStore.js.map +1 -0
  137. package/packages/cache/dist/constants.d.ts +6 -0
  138. package/packages/cache/dist/constants.d.ts.map +1 -0
  139. package/packages/cache/dist/constants.js +9 -0
  140. package/packages/cache/dist/constants.js.map +1 -0
  141. package/packages/cache/dist/index.d.ts +16 -0
  142. package/packages/cache/dist/index.d.ts.map +1 -0
  143. package/packages/cache/dist/index.js +86 -0
  144. package/packages/cache/dist/index.js.map +1 -0
  145. package/packages/cache/dist/serialize.d.ts +9 -0
  146. package/packages/cache/dist/serialize.d.ts.map +1 -0
  147. package/packages/cache/dist/serialize.js +40 -0
  148. package/packages/cache/dist/serialize.js.map +1 -0
  149. package/packages/cache/dist/types.d.ts +123 -0
  150. package/packages/cache/dist/types.d.ts.map +1 -0
  151. package/packages/cache/dist/types.js +2 -0
  152. package/packages/cache/dist/types.js.map +1 -0
  153. package/packages/cache/package.json +27 -0
  154. package/packages/cache/src/CacheClient.ts +227 -0
  155. package/packages/cache/src/CacheFileStore.ts +528 -0
  156. package/packages/cache/src/CachePersistence.ts +89 -0
  157. package/packages/cache/src/CachePrimary.ts +172 -0
  158. package/packages/cache/src/CacheStore.ts +308 -0
  159. package/packages/cache/src/constants.ts +10 -0
  160. package/packages/cache/src/index.ts +100 -0
  161. package/packages/cache/src/serialize.ts +49 -0
  162. package/packages/cache/src/types.ts +156 -0
  163. package/packages/cache/tsconfig.json +18 -0
  164. package/packages/cache/tsconfig.tsbuildinfo +1 -0
  165. package/packages/next/README.md +166 -0
  166. package/packages/next/dist/error-capture.d.ts +34 -0
  167. package/packages/next/dist/error-capture.d.ts.map +1 -0
  168. package/packages/next/dist/error-capture.js +130 -0
  169. package/packages/next/dist/error-capture.js.map +1 -0
  170. package/packages/next/dist/error-handler.d.ts +10 -0
  171. package/packages/next/dist/error-handler.d.ts.map +1 -0
  172. package/packages/next/dist/error-handler.js +186 -0
  173. package/packages/next/dist/error-handler.js.map +1 -0
  174. package/packages/next/dist/isr-cache.d.ts +9 -0
  175. package/packages/next/dist/isr-cache.d.ts.map +1 -0
  176. package/packages/next/dist/isr-cache.js +86 -0
  177. package/packages/next/dist/isr-cache.js.map +1 -0
  178. package/packages/next/dist/stream.d.ts +5 -0
  179. package/packages/next/dist/stream.d.ts.map +1 -0
  180. package/packages/next/dist/stream.js +22 -0
  181. package/packages/next/dist/stream.js.map +1 -0
  182. package/packages/next/dist/types.d.ts +33 -0
  183. package/packages/next/dist/types.d.ts.map +1 -0
  184. package/packages/next/dist/types.js +6 -0
  185. package/packages/next/dist/types.js.map +1 -0
  186. package/packages/next/dist/use-cache.d.ts +4 -0
  187. package/packages/next/dist/use-cache.d.ts.map +1 -0
  188. package/packages/next/dist/use-cache.js +86 -0
  189. package/packages/next/dist/use-cache.js.map +1 -0
  190. package/packages/next/dist/utils.d.ts +32 -0
  191. package/packages/next/dist/utils.d.ts.map +1 -0
  192. package/packages/next/dist/utils.js +88 -0
  193. package/packages/next/dist/utils.js.map +1 -0
  194. package/packages/next/package.json +52 -0
  195. package/packages/next/src/error-capture.ts +177 -0
  196. package/packages/next/src/error-handler.ts +221 -0
  197. package/packages/next/src/isr-cache.ts +100 -0
  198. package/packages/next/src/stream.ts +23 -0
  199. package/packages/next/src/types.ts +33 -0
  200. package/packages/next/src/use-cache.ts +99 -0
  201. package/packages/next/src/utils.ts +102 -0
  202. package/packages/next/tsconfig.json +19 -0
  203. package/packages/next/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheStore.js","sourceRoot":"","sources":["../src/CacheStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare const CACHE_DIR: string;
2
+ export declare const CACHE_DEFAULT_MAX_ENTRIES = 10000;
3
+ export declare const CACHE_DEFAULT_MAX_MEMORY_SIZE: number;
4
+ export declare const CACHE_DEFAULT_MAX_VALUE_SIZE: number;
5
+ export declare const CACHE_CLEANUP_INTERVAL = 60000;
6
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,SAAS,QAA6B,CAAC;AACpD,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAChD,eAAO,MAAM,6BAA6B,QAAmB,CAAC;AAC9D,eAAO,MAAM,4BAA4B,QAAc,CAAC;AACxD,eAAO,MAAM,sBAAsB,QAAS,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { homedir } from 'node:os';
2
+ import { join } from 'node:path';
3
+ const ORKIFY_HOME = join(homedir(), '.orkify');
4
+ export const CACHE_DIR = join(ORKIFY_HOME, 'cache');
5
+ export const CACHE_DEFAULT_MAX_ENTRIES = 10_000;
6
+ export const CACHE_DEFAULT_MAX_MEMORY_SIZE = 64 * 1024 * 1024; // 64 MB
7
+ export const CACHE_DEFAULT_MAX_VALUE_SIZE = 1024 * 1024; // 1 MB
8
+ export const CACHE_CLEANUP_INTERVAL = 60_000; // 60s
9
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAE/C,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AACpD,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAChD,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,QAAQ;AACvE,MAAM,CAAC,MAAM,4BAA4B,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO;AAChE,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC,CAAC,MAAM"}
@@ -0,0 +1,16 @@
1
+ import type { CacheConfig } from './types.js';
2
+ import { CacheClient } from './CacheClient.js';
3
+ /**
4
+ * @deprecated Use `cache.configure()` instead. Will be removed in a future version.
5
+ */
6
+ export declare function configure(config: CacheConfig): void;
7
+ /**
8
+ * Shared cache singleton. Reads are always synchronous local Map lookups.
9
+ * In cluster mode, writes broadcast via IPC so all workers converge.
10
+ * In standalone/fork mode, behaves as a local in-memory cache.
11
+ *
12
+ * Call `cache.configure()` before any other method to set options.
13
+ */
14
+ export declare const cache: CacheClient;
15
+ export type { CacheConfig, CacheSetOptions, CacheStats } from './types.js';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AA2D/C;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAKnD;AAED;;;;;;GAMG;AACH,eAAO,MAAM,KAAK,EAAE,WAoBlB,CAAC;AAEH,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,86 @@
1
+ import { CacheClient } from './CacheClient.js';
2
+ let instance;
3
+ let pendingConfig;
4
+ // In cluster mode, IPC cache messages (including snapshots) can arrive before
5
+ // this module loads. The metrics probe registers a global buffer on
6
+ // `globalThis.__orkifyCacheBuffer` synchronously before any `await`, so those
7
+ // early messages are captured even when this module loads late.
8
+ //
9
+ // Messages that arrive *after* this module loads but *before* the proxy is first
10
+ // accessed are captured by the local early listener below. Both sources are
11
+ // merged and drained when the CacheClient is created.
12
+ const g = globalThis;
13
+ const probeBuffer = Array.isArray(g.__orkifyCacheBuffer)
14
+ ? g.__orkifyCacheBuffer
15
+ : [];
16
+ const localBuffer = [];
17
+ let earlyListener;
18
+ if (process.env.ORKIFY_CLUSTER_MODE === 'true' && typeof process.send === 'function') {
19
+ earlyListener = (msg) => {
20
+ const m = msg;
21
+ if (m?.__orkify && m.type?.startsWith('cache:')) {
22
+ localBuffer.push(msg);
23
+ }
24
+ };
25
+ process.on('message', earlyListener);
26
+ }
27
+ function createInstance() {
28
+ // Stop the local early listener — CacheClient registers its own
29
+ if (earlyListener) {
30
+ process.removeListener('message', earlyListener);
31
+ earlyListener = undefined;
32
+ }
33
+ // Stop the probe's global buffer listener
34
+ if (typeof g.__orkifyCacheBufferCleanup === 'function') {
35
+ g.__orkifyCacheBufferCleanup();
36
+ delete g.__orkifyCacheBufferCleanup;
37
+ delete g.__orkifyCacheBuffer;
38
+ }
39
+ // Merge probe buffer + local buffer — probe messages arrived first
40
+ const merged = [...probeBuffer, ...localBuffer];
41
+ probeBuffer.length = 0;
42
+ localBuffer.length = 0;
43
+ // Default to fileBacked: true unless explicitly disabled
44
+ const config = pendingConfig?.fileBacked === false ? pendingConfig : { fileBacked: true, ...pendingConfig };
45
+ instance = new CacheClient(config, merged);
46
+ const client = instance;
47
+ g.__orkifyCacheStats = () => client.stats();
48
+ }
49
+ /**
50
+ * @deprecated Use `cache.configure()` instead. Will be removed in a future version.
51
+ */
52
+ export function configure(config) {
53
+ if (instance) {
54
+ throw new Error('orkify/cache: configure() must be called before the first use of cache');
55
+ }
56
+ pendingConfig = config;
57
+ }
58
+ /**
59
+ * Shared cache singleton. Reads are always synchronous local Map lookups.
60
+ * In cluster mode, writes broadcast via IPC so all workers converge.
61
+ * In standalone/fork mode, behaves as a local in-memory cache.
62
+ *
63
+ * Call `cache.configure()` before any other method to set options.
64
+ */
65
+ export const cache = new Proxy({}, {
66
+ get(_target, prop, receiver) {
67
+ // configure() must run before the instance is created
68
+ if (prop === 'configure') {
69
+ return (config) => {
70
+ if (instance) {
71
+ throw new Error('orkify/cache: configure() must be called before the first use of cache');
72
+ }
73
+ pendingConfig = config;
74
+ };
75
+ }
76
+ if (!instance)
77
+ createInstance();
78
+ const inst = instance;
79
+ const value = Reflect.get(inst, prop, receiver);
80
+ if (typeof value === 'function') {
81
+ return value.bind(inst);
82
+ }
83
+ return value;
84
+ },
85
+ });
86
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type Encoding = 'json' | 'v8';
2
+ export interface Serialized {
3
+ data: string;
4
+ encoding: Encoding;
5
+ }
6
+ export declare function serialize(value: unknown): Serialized;
7
+ export declare function deserialize({ data, encoding }: Serialized): unknown;
8
+ export declare function serializedByteLength(s: Serialized): number;
9
+ //# sourceMappingURL=serialize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../src/serialize.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC;AAErC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAmBD,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAWpD;AAED,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,UAAU,GAAG,OAAO,CAGnE;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAI1D"}
@@ -0,0 +1,40 @@
1
+ import v8 from 'node:v8';
2
+ function needsV8(value) {
3
+ if (value instanceof Map ||
4
+ value instanceof Set ||
5
+ value instanceof Date ||
6
+ value instanceof RegExp ||
7
+ value instanceof Error)
8
+ return true;
9
+ if (ArrayBuffer.isView(value) || value instanceof ArrayBuffer)
10
+ return true;
11
+ if (Array.isArray(value))
12
+ return value.some(needsV8);
13
+ if (value !== null && typeof value === 'object') {
14
+ return Object.values(value).some(needsV8);
15
+ }
16
+ return false;
17
+ }
18
+ export function serialize(value) {
19
+ if (typeof value === 'function') {
20
+ throw new Error('cache: functions are not serializable');
21
+ }
22
+ if (typeof value === 'symbol') {
23
+ throw new Error('cache: symbols are not serializable');
24
+ }
25
+ if (needsV8(value)) {
26
+ return { data: v8.serialize(value).toString('base64'), encoding: 'v8' };
27
+ }
28
+ return { data: JSON.stringify(value), encoding: 'json' };
29
+ }
30
+ export function deserialize({ data, encoding }) {
31
+ if (encoding === 'v8')
32
+ return v8.deserialize(Buffer.from(data, 'base64'));
33
+ return JSON.parse(data);
34
+ }
35
+ export function serializedByteLength(s) {
36
+ return s.encoding === 'v8'
37
+ ? Math.ceil((s.data.length * 3) / 4) // base64 → raw bytes
38
+ : Buffer.byteLength(s.data, 'utf-8');
39
+ }
40
+ //# sourceMappingURL=serialize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialize.js","sourceRoot":"","sources":["../src/serialize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AASzB,SAAS,OAAO,CAAC,KAAc;IAC7B,IACE,KAAK,YAAY,GAAG;QACpB,KAAK,YAAY,GAAG;QACpB,KAAK,YAAY,IAAI;QACrB,KAAK,YAAY,MAAM;QACvB,KAAK,YAAY,KAAK;QAEtB,OAAO,IAAI,CAAC;IACd,IAAI,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,WAAW;QAAE,OAAO,IAAI,CAAC;IAC3E,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC1E,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAc;IACxD,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC1E,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,CAAa;IAChD,OAAO,CAAC,CAAC,QAAQ,KAAK,IAAI;QACxB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,qBAAqB;QAC1D,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,123 @@
1
+ export interface CacheConfig {
2
+ defaultTtl?: number;
3
+ fileBacked?: boolean;
4
+ maxEntries?: number;
5
+ maxMemorySize?: number;
6
+ maxValueSize?: number;
7
+ }
8
+ export interface CacheSetOptions {
9
+ tags?: string[];
10
+ ttl?: number;
11
+ }
12
+ export interface CacheStats {
13
+ diskSize?: number;
14
+ hitRate: number;
15
+ hits: number;
16
+ misses: number;
17
+ size: number;
18
+ totalBytes: number;
19
+ }
20
+ export interface CacheEntry {
21
+ byteSize: number;
22
+ expiresAt?: number;
23
+ lastAccessedAt: number;
24
+ tags?: string[];
25
+ value: unknown;
26
+ }
27
+ export interface SerializedCacheEntry {
28
+ expiresAt?: number;
29
+ tags?: string[];
30
+ value: unknown;
31
+ }
32
+ export interface CacheSnapshot {
33
+ entries: Array<[string, SerializedCacheEntry]>;
34
+ tagTimestamps: Array<[string, number]>;
35
+ }
36
+ export type EvictReason = 'expired' | 'lru';
37
+ export interface ICacheStore {
38
+ applyDelete(key: string): void;
39
+ applySet(key: string, value: unknown, expiresAt?: number, tags?: string[]): void;
40
+ applySnapshot(snapshot: CacheSnapshot): void;
41
+ applyTagTimestamp(tag: string, timestamp: number): void;
42
+ clear(): void;
43
+ delete(key: string): boolean;
44
+ destroy(): void;
45
+ get<T>(key: string): T | undefined;
46
+ getAsync<T>(key: string): Promise<T | undefined>;
47
+ getTagExpiration(tags: string[]): number;
48
+ has(key: string): boolean;
49
+ invalidateTag(tag: string): string[];
50
+ serialize(): CacheSnapshot;
51
+ set(key: string, value: unknown, expiresAt?: number, tags?: string[], precomputedByteSize?: number): void;
52
+ stats(): CacheStats;
53
+ }
54
+ export interface CacheSetMessage {
55
+ __orkify: true;
56
+ key: string;
57
+ tags?: string[];
58
+ ttl?: number;
59
+ type: 'cache:set';
60
+ value: unknown;
61
+ }
62
+ export interface CacheDeleteMessage {
63
+ __orkify: true;
64
+ key: string;
65
+ type: 'cache:delete';
66
+ }
67
+ export interface CacheClearMessage {
68
+ __orkify: true;
69
+ type: 'cache:clear';
70
+ }
71
+ export interface CacheInvalidateTagMessage {
72
+ __orkify: true;
73
+ tag: string;
74
+ type: 'cache:invalidate-tag';
75
+ }
76
+ export interface CacheUpdateTagTimestampMessage {
77
+ __orkify: true;
78
+ tag: string;
79
+ tagTimestamp: number;
80
+ type: 'cache:update-tag-timestamp';
81
+ }
82
+ export interface CacheConfigureMessage {
83
+ __orkify: true;
84
+ config: CacheConfig;
85
+ type: 'cache:configure';
86
+ }
87
+ export type CacheWorkerMessage = CacheClearMessage | CacheConfigureMessage | CacheDeleteMessage | CacheInvalidateTagMessage | CacheSetMessage | CacheUpdateTagTimestampMessage;
88
+ export interface CacheBroadcastSetMessage {
89
+ __orkify: true;
90
+ expiresAt?: number;
91
+ key: string;
92
+ tags?: string[];
93
+ type: 'cache:set';
94
+ value: unknown;
95
+ }
96
+ export interface CacheBroadcastDeleteMessage {
97
+ __orkify: true;
98
+ key: string;
99
+ type: 'cache:delete';
100
+ }
101
+ export interface CacheBroadcastClearMessage {
102
+ __orkify: true;
103
+ type: 'cache:clear';
104
+ }
105
+ export interface CacheBroadcastInvalidateTagMessage {
106
+ __orkify: true;
107
+ tag: string;
108
+ tagTimestamp: number;
109
+ type: 'cache:invalidate-tag';
110
+ }
111
+ export interface CacheBroadcastUpdateTagTimestampMessage {
112
+ __orkify: true;
113
+ tag: string;
114
+ tagTimestamp: number;
115
+ type: 'cache:update-tag-timestamp';
116
+ }
117
+ export interface CacheSnapshotMessage {
118
+ __orkify: true;
119
+ entries: Array<[string, SerializedCacheEntry]>;
120
+ tagTimestamps: Array<[string, number]>;
121
+ type: 'cache:snapshot';
122
+ }
123
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@orkify/cache",
3
+ "version": "1.0.0-beta.1",
4
+ "private": true,
5
+ "description": "Framework-agnostic shared cache for orkify-managed processes",
6
+ "type": "module",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./src/index.ts",
10
+ "import": "./dist/index.js",
11
+ "default": "./dist/index.js"
12
+ },
13
+ "./primary": {
14
+ "types": "./src/CachePrimary.ts",
15
+ "import": "./dist/CachePrimary.js",
16
+ "default": "./dist/CachePrimary.js"
17
+ },
18
+ "./types": {
19
+ "types": "./src/types.ts",
20
+ "import": "./dist/types.js",
21
+ "default": "./dist/types.js"
22
+ }
23
+ },
24
+ "scripts": {
25
+ "build": "tsc"
26
+ }
27
+ }
@@ -0,0 +1,227 @@
1
+ import type {
2
+ CacheBroadcastClearMessage,
3
+ CacheBroadcastDeleteMessage,
4
+ CacheBroadcastInvalidateTagMessage,
5
+ CacheBroadcastSetMessage,
6
+ CacheBroadcastUpdateTagTimestampMessage,
7
+ CacheConfig,
8
+ CacheSetOptions,
9
+ CacheSnapshotMessage,
10
+ CacheStats,
11
+ ICacheStore,
12
+ } from './types.js';
13
+ import { CACHE_DEFAULT_MAX_VALUE_SIZE } from './constants.js';
14
+ import { CacheFileStore } from './CacheFileStore.js';
15
+ import { CacheStore } from './CacheStore.js';
16
+ import { serialize, serializedByteLength } from './serialize.js';
17
+
18
+ type CacheInboundMessage =
19
+ | CacheBroadcastClearMessage
20
+ | CacheBroadcastDeleteMessage
21
+ | CacheBroadcastInvalidateTagMessage
22
+ | CacheBroadcastSetMessage
23
+ | CacheBroadcastUpdateTagTimestampMessage
24
+ | CacheSnapshotMessage;
25
+
26
+ export class CacheClient {
27
+ private clusterMode: boolean;
28
+ private defaultTtl: number | undefined;
29
+ private maxValueSize: number;
30
+ private messageHandler: ((msg: unknown) => void) | undefined;
31
+ private store: ICacheStore;
32
+
33
+ constructor(config?: CacheConfig, bufferedMessages?: unknown[]) {
34
+ this.defaultTtl = config?.defaultTtl;
35
+ this.maxValueSize = config?.maxValueSize ?? CACHE_DEFAULT_MAX_VALUE_SIZE;
36
+ this.clusterMode =
37
+ process.env.ORKIFY_CLUSTER_MODE === 'true' && typeof process.send === 'function';
38
+
39
+ // File-backed: CacheFileStore for disk cold layer.
40
+ // In cluster mode workers are readOnly (reads from disk, writes go through IPC to primary).
41
+ // In standalone/fork mode the store has full read/write access.
42
+ const fileBacked = config?.fileBacked === true;
43
+ this.store = fileBacked
44
+ ? new CacheFileStore(
45
+ process.env.ORKIFY_PROCESS_NAME ?? 'default',
46
+ config,
47
+ this.clusterMode ? { readOnly: true } : undefined
48
+ )
49
+ : new CacheStore(config);
50
+
51
+ // In fork/standalone mode, flush file-backed cache on process exit so all
52
+ // entries (not just evicted ones) survive restarts. Uses synchronous I/O
53
+ // since the 'exit' event doesn't support async operations.
54
+ if (!this.clusterMode && fileBacked) {
55
+ const fileStore = this.store as CacheFileStore;
56
+
57
+ // IPC flush for graceful shutdown (works cross-platform including Windows
58
+ // where SIGTERM doesn't trigger exit handlers)
59
+ process.on('message', (msg: unknown) => {
60
+ const m = msg as { __orkify?: boolean; type?: string };
61
+ if (m?.__orkify && m.type === 'cache:flush') {
62
+ fileStore.flushSync();
63
+ try {
64
+ process.send?.({ __orkify: true, type: 'cache:flushed' });
65
+ } catch {
66
+ // parent may have disconnected
67
+ }
68
+ process.exit(0);
69
+ }
70
+ });
71
+
72
+ // Fallback: also flush on exit event (works on Unix via SIGTERM → exit)
73
+ process.on('exit', () => fileStore.flushSync());
74
+ }
75
+
76
+ if (this.clusterMode) {
77
+ this.messageHandler = (msg: unknown) => this.handleMessage(msg);
78
+ process.on('message', this.messageHandler);
79
+
80
+ // Drain any IPC messages that arrived before this client was created
81
+ if (bufferedMessages) {
82
+ for (const msg of bufferedMessages) {
83
+ this.handleMessage(msg);
84
+ }
85
+ }
86
+
87
+ // Notify the cluster primary about file-backed config so it can upgrade its store
88
+ if (process.send && fileBacked) {
89
+ this.trySend({
90
+ __orkify: true,
91
+ type: 'cache:configure',
92
+ config: { ...config, fileBacked: true },
93
+ });
94
+ }
95
+ }
96
+ }
97
+
98
+ /** Configure cache options. Must be called before any other method. Intercepted by the proxy in `cache/index.ts`. */
99
+ configure(_config: CacheConfig): void {
100
+ throw new Error('orkify/cache: configure() must be called via the cache singleton proxy');
101
+ }
102
+
103
+ get<T>(key: string): T | undefined {
104
+ return this.store.get<T>(key);
105
+ }
106
+
107
+ async getAsync<T>(key: string): Promise<T | undefined> {
108
+ return this.store.getAsync<T>(key);
109
+ }
110
+
111
+ set(key: string, value: unknown, opts?: CacheSetOptions): void {
112
+ if (opts?.ttl !== undefined && opts.ttl <= 0) {
113
+ throw new Error(`cache.set(): ttl must be positive, got ${opts.ttl}`);
114
+ }
115
+
116
+ // Validate serializability and size
117
+ const serialized = serialize(value);
118
+ const byteLength = serializedByteLength(serialized);
119
+ if (byteLength > this.maxValueSize) {
120
+ throw new Error(
121
+ `cache.set(): value for key "${key}" is ${byteLength} bytes, exceeds max ${this.maxValueSize} bytes`
122
+ );
123
+ }
124
+
125
+ const ttl = opts?.ttl ?? this.defaultTtl;
126
+ const expiresAt = ttl ? Date.now() + ttl * 1000 : undefined;
127
+ const tags = opts?.tags;
128
+ this.store.set(key, value, expiresAt, tags, byteLength);
129
+
130
+ if (this.clusterMode) {
131
+ this.trySend({ __orkify: true, type: 'cache:set', key, value, ttl, tags });
132
+ }
133
+ }
134
+
135
+ delete(key: string): void {
136
+ this.store.delete(key);
137
+
138
+ if (this.clusterMode) {
139
+ this.trySend({ __orkify: true, type: 'cache:delete', key });
140
+ }
141
+ }
142
+
143
+ clear(): void {
144
+ this.store.clear();
145
+
146
+ if (this.clusterMode) {
147
+ this.trySend({ __orkify: true, type: 'cache:clear' });
148
+ }
149
+ }
150
+
151
+ has(key: string): boolean {
152
+ return this.store.has(key);
153
+ }
154
+
155
+ stats(): CacheStats {
156
+ return this.store.stats();
157
+ }
158
+
159
+ getTagExpiration(tags: string[]): number {
160
+ return this.store.getTagExpiration(tags);
161
+ }
162
+
163
+ invalidateTag(tag: string): void {
164
+ this.store.invalidateTag(tag);
165
+
166
+ if (this.clusterMode) {
167
+ this.trySend({ __orkify: true, type: 'cache:invalidate-tag', tag });
168
+ }
169
+ }
170
+
171
+ updateTagTimestamp(tag: string, timestamp?: number): void {
172
+ const ts = timestamp ?? Date.now();
173
+ this.store.applyTagTimestamp(tag, ts);
174
+
175
+ if (this.clusterMode) {
176
+ this.trySend({ __orkify: true, type: 'cache:update-tag-timestamp', tag, tagTimestamp: ts });
177
+ }
178
+ }
179
+
180
+ destroy(): void {
181
+ if (this.messageHandler) {
182
+ process.removeListener('message', this.messageHandler);
183
+ this.messageHandler = undefined;
184
+ }
185
+ this.store.destroy();
186
+ }
187
+
188
+ /** Send an IPC message to the cluster primary, silently ignoring failures (e.g. closed channel). */
189
+ private trySend(msg: Record<string, unknown>): void {
190
+ try {
191
+ process.send?.(msg);
192
+ } catch {
193
+ // IPC channel closed — primary died or worker is shutting down
194
+ }
195
+ }
196
+
197
+ private handleMessage(msg: unknown): void {
198
+ const m = msg as { __orkify?: boolean; type?: string };
199
+ if (!m?.__orkify || !m.type?.startsWith('cache:')) return;
200
+
201
+ const message = msg as CacheInboundMessage;
202
+ switch (message.type) {
203
+ case 'cache:set':
204
+ this.store.applySet(message.key, message.value, message.expiresAt, message.tags);
205
+ break;
206
+ case 'cache:delete':
207
+ this.store.applyDelete(message.key);
208
+ break;
209
+ case 'cache:clear':
210
+ this.store.clear();
211
+ break;
212
+ case 'cache:invalidate-tag':
213
+ this.store.invalidateTag(message.tag);
214
+ this.store.applyTagTimestamp(message.tag, message.tagTimestamp);
215
+ break;
216
+ case 'cache:update-tag-timestamp':
217
+ this.store.applyTagTimestamp(message.tag, message.tagTimestamp);
218
+ break;
219
+ case 'cache:snapshot':
220
+ this.store.applySnapshot({
221
+ entries: message.entries,
222
+ tagTimestamps: message.tagTimestamps,
223
+ });
224
+ break;
225
+ }
226
+ }
227
+ }