@blokjs/runner 0.6.21 → 0.7.0

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 (167) hide show
  1. package/dist/Blok.d.ts +2 -0
  2. package/dist/Blok.js +42 -110
  3. package/dist/Blok.js.map +1 -1
  4. package/dist/DefaultLogger.d.ts +13 -0
  5. package/dist/DefaultLogger.js +25 -0
  6. package/dist/DefaultLogger.js.map +1 -1
  7. package/dist/RunnerSteps.d.ts +23 -0
  8. package/dist/RunnerSteps.js +128 -87
  9. package/dist/RunnerSteps.js.map +1 -1
  10. package/dist/SubworkflowNode.js +19 -0
  11. package/dist/SubworkflowNode.js.map +1 -1
  12. package/dist/TriggerBase.d.ts +12 -0
  13. package/dist/TriggerBase.js +216 -181
  14. package/dist/TriggerBase.js.map +1 -1
  15. package/dist/adapters/grpc/GrpcRuntimeAdapter.d.ts +9 -0
  16. package/dist/adapters/grpc/GrpcRuntimeAdapter.js +76 -6
  17. package/dist/adapters/grpc/GrpcRuntimeAdapter.js.map +1 -1
  18. package/dist/index.d.ts +4 -39
  19. package/dist/index.js +7 -32
  20. package/dist/index.js.map +1 -1
  21. package/dist/monitoring/JanitorMetrics.d.ts +3 -0
  22. package/dist/monitoring/JanitorMetrics.js +11 -0
  23. package/dist/monitoring/JanitorMetrics.js.map +1 -1
  24. package/dist/monitoring/ProcessErrorMetrics.d.ts +32 -0
  25. package/dist/monitoring/ProcessErrorMetrics.js +43 -0
  26. package/dist/monitoring/ProcessErrorMetrics.js.map +1 -0
  27. package/dist/monitoring/PrometheusMetricsBridge.d.ts +7 -0
  28. package/dist/monitoring/PrometheusMetricsBridge.js +8 -2
  29. package/dist/monitoring/PrometheusMetricsBridge.js.map +1 -1
  30. package/dist/monitoring/SubworkflowMetrics.d.ts +25 -0
  31. package/dist/monitoring/SubworkflowMetrics.js +38 -0
  32. package/dist/monitoring/SubworkflowMetrics.js.map +1 -0
  33. package/dist/observability/ErrorSink.d.ts +23 -0
  34. package/dist/observability/ErrorSink.js +32 -0
  35. package/dist/observability/ErrorSink.js.map +1 -0
  36. package/dist/observability/SentryIntegration.d.ts +9 -0
  37. package/dist/observability/SentryIntegration.js +31 -0
  38. package/dist/observability/SentryIntegration.js.map +1 -0
  39. package/dist/scheduling/DebounceCoordinator.d.ts +7 -53
  40. package/dist/scheduling/DebounceCoordinator.js +8 -207
  41. package/dist/scheduling/DebounceCoordinator.js.map +1 -1
  42. package/dist/tracing/InMemoryRunStore.d.ts +5 -1
  43. package/dist/tracing/InMemoryRunStore.js +14 -0
  44. package/dist/tracing/InMemoryRunStore.js.map +1 -1
  45. package/dist/tracing/Janitor.js +3 -0
  46. package/dist/tracing/Janitor.js.map +1 -1
  47. package/dist/tracing/PostgresRunStore.d.ts +4 -1
  48. package/dist/tracing/PostgresRunStore.js +73 -3
  49. package/dist/tracing/PostgresRunStore.js.map +1 -1
  50. package/dist/tracing/RunStore.d.ts +17 -1
  51. package/dist/tracing/RunTracker.d.ts +13 -34
  52. package/dist/tracing/RunTracker.js +62 -32
  53. package/dist/tracing/RunTracker.js.map +1 -1
  54. package/dist/tracing/SqliteRunStore.d.ts +4 -1
  55. package/dist/tracing/SqliteRunStore.js +60 -0
  56. package/dist/tracing/SqliteRunStore.js.map +1 -1
  57. package/dist/tracing/TraceRouter.d.ts +13 -0
  58. package/dist/tracing/TraceRouter.js +43 -11
  59. package/dist/tracing/TraceRouter.js.map +1 -1
  60. package/dist/tracing/TracingLogger.js +22 -0
  61. package/dist/tracing/TracingLogger.js.map +1 -1
  62. package/dist/tracing/createStore.js +51 -22
  63. package/dist/tracing/createStore.js.map +1 -1
  64. package/dist/tracing/types.d.ts +22 -0
  65. package/dist/types/GlobalOptions.d.ts +5 -7
  66. package/dist/workflow/WorkflowNormalizer.js +63 -0
  67. package/dist/workflow/WorkflowNormalizer.js.map +1 -1
  68. package/package.json +7 -4
  69. package/dist/cache/NodeResultCache.d.ts +0 -286
  70. package/dist/cache/NodeResultCache.js +0 -506
  71. package/dist/cache/NodeResultCache.js.map +0 -1
  72. package/dist/cache/index.d.ts +0 -1
  73. package/dist/cache/index.js +0 -2
  74. package/dist/cache/index.js.map +0 -1
  75. package/dist/concurrency/ConcurrencyBackend.d.ts +0 -61
  76. package/dist/concurrency/ConcurrencyBackend.js +0 -20
  77. package/dist/concurrency/ConcurrencyBackend.js.map +0 -1
  78. package/dist/concurrency/NatsKvConcurrencyBackend.d.ts +0 -64
  79. package/dist/concurrency/NatsKvConcurrencyBackend.js +0 -310
  80. package/dist/concurrency/NatsKvConcurrencyBackend.js.map +0 -1
  81. package/dist/concurrency/RedisConcurrencyBackend.d.ts +0 -64
  82. package/dist/concurrency/RedisConcurrencyBackend.js +0 -374
  83. package/dist/concurrency/RedisConcurrencyBackend.js.map +0 -1
  84. package/dist/concurrency/createConcurrencyBackend.d.ts +0 -24
  85. package/dist/concurrency/createConcurrencyBackend.js +0 -38
  86. package/dist/concurrency/createConcurrencyBackend.js.map +0 -1
  87. package/dist/graphql/GraphQLSchemaGenerator.d.ts +0 -129
  88. package/dist/graphql/GraphQLSchemaGenerator.js +0 -425
  89. package/dist/graphql/GraphQLSchemaGenerator.js.map +0 -1
  90. package/dist/integrations/APMIntegration.d.ts +0 -141
  91. package/dist/integrations/APMIntegration.js +0 -212
  92. package/dist/integrations/APMIntegration.js.map +0 -1
  93. package/dist/integrations/AzureMonitorIntegration.d.ts +0 -118
  94. package/dist/integrations/AzureMonitorIntegration.js +0 -254
  95. package/dist/integrations/AzureMonitorIntegration.js.map +0 -1
  96. package/dist/integrations/CloudWatchIntegration.d.ts +0 -135
  97. package/dist/integrations/CloudWatchIntegration.js +0 -293
  98. package/dist/integrations/CloudWatchIntegration.js.map +0 -1
  99. package/dist/integrations/SentryIntegration.d.ts +0 -153
  100. package/dist/integrations/SentryIntegration.js +0 -200
  101. package/dist/integrations/SentryIntegration.js.map +0 -1
  102. package/dist/integrations/index.d.ts +0 -19
  103. package/dist/integrations/index.js +0 -16
  104. package/dist/integrations/index.js.map +0 -1
  105. package/dist/marketplace/RuntimeAutoScaler.d.ts +0 -148
  106. package/dist/marketplace/RuntimeAutoScaler.js +0 -366
  107. package/dist/marketplace/RuntimeAutoScaler.js.map +0 -1
  108. package/dist/marketplace/RuntimeCatalog.d.ts +0 -180
  109. package/dist/marketplace/RuntimeCatalog.js +0 -339
  110. package/dist/marketplace/RuntimeCatalog.js.map +0 -1
  111. package/dist/marketplace/RuntimeDiscovery.d.ts +0 -86
  112. package/dist/marketplace/RuntimeDiscovery.js +0 -231
  113. package/dist/marketplace/RuntimeDiscovery.js.map +0 -1
  114. package/dist/marketplace/RuntimeHealthMonitor.d.ts +0 -100
  115. package/dist/marketplace/RuntimeHealthMonitor.js +0 -241
  116. package/dist/marketplace/RuntimeHealthMonitor.js.map +0 -1
  117. package/dist/marketplace/RuntimeMetricsDashboard.d.ts +0 -113
  118. package/dist/marketplace/RuntimeMetricsDashboard.js +0 -293
  119. package/dist/marketplace/RuntimeMetricsDashboard.js.map +0 -1
  120. package/dist/openapi/OpenAPIGenerator.d.ts +0 -192
  121. package/dist/openapi/OpenAPIGenerator.js +0 -378
  122. package/dist/openapi/OpenAPIGenerator.js.map +0 -1
  123. package/dist/openapi/index.d.ts +0 -20
  124. package/dist/openapi/index.js +0 -20
  125. package/dist/openapi/index.js.map +0 -1
  126. package/dist/scheduling/DebounceBackend.d.ts +0 -108
  127. package/dist/scheduling/DebounceBackend.js +0 -23
  128. package/dist/scheduling/DebounceBackend.js.map +0 -1
  129. package/dist/scheduling/NatsKvDebounceBackend.d.ts +0 -53
  130. package/dist/scheduling/NatsKvDebounceBackend.js +0 -334
  131. package/dist/scheduling/NatsKvDebounceBackend.js.map +0 -1
  132. package/dist/scheduling/RedisDebounceBackend.d.ts +0 -49
  133. package/dist/scheduling/RedisDebounceBackend.js +0 -356
  134. package/dist/scheduling/RedisDebounceBackend.js.map +0 -1
  135. package/dist/scheduling/createDebounceBackend.d.ts +0 -25
  136. package/dist/scheduling/createDebounceBackend.js +0 -39
  137. package/dist/scheduling/createDebounceBackend.js.map +0 -1
  138. package/dist/security/ABAC.d.ts +0 -224
  139. package/dist/security/ABAC.js +0 -380
  140. package/dist/security/ABAC.js.map +0 -1
  141. package/dist/security/AuditLogger.d.ts +0 -242
  142. package/dist/security/AuditLogger.js +0 -317
  143. package/dist/security/AuditLogger.js.map +0 -1
  144. package/dist/security/AuthMiddleware.d.ts +0 -162
  145. package/dist/security/AuthMiddleware.js +0 -289
  146. package/dist/security/AuthMiddleware.js.map +0 -1
  147. package/dist/security/EncryptionAtRest.d.ts +0 -206
  148. package/dist/security/EncryptionAtRest.js +0 -236
  149. package/dist/security/EncryptionAtRest.js.map +0 -1
  150. package/dist/security/OAuthProvider.d.ts +0 -334
  151. package/dist/security/OAuthProvider.js +0 -719
  152. package/dist/security/OAuthProvider.js.map +0 -1
  153. package/dist/security/PIIDetector.d.ts +0 -233
  154. package/dist/security/PIIDetector.js +0 -354
  155. package/dist/security/PIIDetector.js.map +0 -1
  156. package/dist/security/RBAC.d.ts +0 -143
  157. package/dist/security/RBAC.js +0 -285
  158. package/dist/security/RBAC.js.map +0 -1
  159. package/dist/security/SecretManager.d.ts +0 -652
  160. package/dist/security/SecretManager.js +0 -1147
  161. package/dist/security/SecretManager.js.map +0 -1
  162. package/dist/security/TLSConfig.d.ts +0 -305
  163. package/dist/security/TLSConfig.js +0 -550
  164. package/dist/security/TLSConfig.js.map +0 -1
  165. package/dist/security/index.d.ts +0 -81
  166. package/dist/security/index.js +0 -82
  167. package/dist/security/index.js.map +0 -1
@@ -1,506 +0,0 @@
1
- /**
2
- * Node Result Caching for Blok Runner
3
- *
4
- * Provides intelligent caching of node execution results to avoid redundant
5
- * computation. Supports LRU eviction, TTL-based expiry, tag-based invalidation,
6
- * and pluggable cache providers.
7
- *
8
- * Uses only Node.js built-ins (node:crypto for hashing).
9
- */
10
- import { createHash } from "node:crypto";
11
- /**
12
- * Estimate the byte-size of an arbitrary value by serialising it to JSON.
13
- * Falls back to 0 for values that cannot be serialised.
14
- */
15
- function estimateSize(value) {
16
- try {
17
- return Buffer.byteLength(JSON.stringify(value), "utf-8");
18
- }
19
- catch {
20
- return 0;
21
- }
22
- }
23
- /**
24
- * Produce a deterministic SHA-256 hex digest for a cache key string.
25
- */
26
- function sha256(input) {
27
- return createHash("sha256").update(input).digest("hex");
28
- }
29
- const DEFAULT_MAX_SIZE = 500;
30
- const DEFAULT_TTL_MS = 60_000;
31
- const DEFAULT_MAX_MEMORY_BYTES = 50 * 1024 * 1024; // 50 MB
32
- const SWEEP_INTERVAL_MS = 60_000; // 60 s
33
- /**
34
- * LRU cache with TTL-based expiry, tag-based invalidation, and memory limits.
35
- *
36
- * Internally backed by a `Map` whose insertion order is used for LRU tracking.
37
- * Every `get` promotes the accessed key to the most-recently-used position.
38
- *
39
- * Expired entries are cleaned up lazily on access and periodically via a
40
- * background sweep timer (every 60 s). The timer is `unref`-ed so it does
41
- * not prevent the Node.js process from exiting.
42
- */
43
- export class InMemoryCache {
44
- name = "in-memory";
45
- store = new Map();
46
- maxSize;
47
- defaultTTLMs;
48
- maxMemoryBytes;
49
- onEvict;
50
- _hits = 0;
51
- _misses = 0;
52
- _evictions = 0;
53
- _totalSets = 0;
54
- _memoryUsageBytes = 0;
55
- sweepTimer = null;
56
- constructor(config = {}) {
57
- this.maxSize = config.maxSize ?? DEFAULT_MAX_SIZE;
58
- this.defaultTTLMs = config.defaultTTLMs ?? DEFAULT_TTL_MS;
59
- this.maxMemoryBytes = config.maxMemoryBytes ?? DEFAULT_MAX_MEMORY_BYTES;
60
- this.onEvict = config.onEvict;
61
- this.startPeriodicSweep();
62
- }
63
- // -- CacheProvider implementation ----------------------------------------
64
- /** @inheritdoc */
65
- async get(key) {
66
- const internal = this.store.get(key);
67
- if (!internal) {
68
- this._misses++;
69
- return null;
70
- }
71
- // Lazy TTL check
72
- if (Date.now() >= internal.entry.expiresAt) {
73
- this.evict(key, "ttl");
74
- this._misses++;
75
- return null;
76
- }
77
- // Promote to most-recently-used (re-insert at the end of the Map)
78
- this.store.delete(key);
79
- internal.entry.hits++;
80
- this.store.set(key, internal);
81
- this._hits++;
82
- return { ...internal.entry };
83
- }
84
- /** @inheritdoc */
85
- async set(key, value, options) {
86
- this._totalSets++;
87
- const ttlMs = options?.ttlMs ?? this.defaultTTLMs;
88
- const tags = options?.tags ?? [];
89
- const priority = options?.priority ?? 0;
90
- const size = estimateSize(value);
91
- const now = Date.now();
92
- // If the key already exists, remove it first so the new entry goes to
93
- // the end of the Map (most-recently-used position).
94
- const existing = this.store.get(key);
95
- if (existing) {
96
- this._memoryUsageBytes -= existing.entry.size;
97
- this.store.delete(key);
98
- }
99
- const entry = {
100
- value,
101
- key,
102
- createdAt: now,
103
- expiresAt: now + ttlMs,
104
- hits: 0,
105
- size,
106
- };
107
- const internal = { entry, tags, priority };
108
- this.store.set(key, internal);
109
- this._memoryUsageBytes += size;
110
- // Enforce memory limit
111
- this.enforceMemoryLimit();
112
- // Enforce max-size limit via LRU eviction
113
- this.enforceSizeLimit();
114
- }
115
- /** @inheritdoc */
116
- async delete(key) {
117
- return this.evict(key, "manual");
118
- }
119
- /** @inheritdoc */
120
- async clear() {
121
- this.store.clear();
122
- this._memoryUsageBytes = 0;
123
- }
124
- /** @inheritdoc */
125
- async has(key) {
126
- const internal = this.store.get(key);
127
- if (!internal)
128
- return false;
129
- if (Date.now() >= internal.entry.expiresAt) {
130
- this.evict(key, "ttl");
131
- return false;
132
- }
133
- return true;
134
- }
135
- /** @inheritdoc */
136
- getStats() {
137
- const total = this._hits + this._misses;
138
- return {
139
- hits: this._hits,
140
- misses: this._misses,
141
- size: this.store.size,
142
- maxSize: this.maxSize,
143
- hitRate: total === 0 ? 0 : this._hits / total,
144
- evictions: this._evictions,
145
- totalSets: this._totalSets,
146
- memoryUsageBytes: this._memoryUsageBytes,
147
- };
148
- }
149
- // -- Extended API --------------------------------------------------------
150
- /**
151
- * Remove all entries that carry the given tag.
152
- *
153
- * @param tag - Tag string to match against.
154
- * @returns Number of entries removed.
155
- */
156
- invalidateByTag(tag) {
157
- let count = 0;
158
- const entries = Array.from(this.store.entries());
159
- for (const [key, internal] of entries) {
160
- if (internal.tags.includes(tag)) {
161
- this.evict(key, "manual");
162
- count++;
163
- }
164
- }
165
- return count;
166
- }
167
- /**
168
- * Stop the periodic sweep timer and release resources.
169
- * Call this when the cache is no longer needed.
170
- */
171
- destroy() {
172
- this.stopPeriodicSweep();
173
- this.store.clear();
174
- this._memoryUsageBytes = 0;
175
- }
176
- // -- Private helpers -----------------------------------------------------
177
- /**
178
- * Evict a single key from the cache.
179
- *
180
- * @returns `true` if the key existed and was removed.
181
- */
182
- evict(key, reason) {
183
- const internal = this.store.get(key);
184
- if (!internal)
185
- return false;
186
- this.store.delete(key);
187
- this._memoryUsageBytes -= internal.entry.size;
188
- this._evictions++;
189
- if (this.onEvict) {
190
- try {
191
- this.onEvict(key, reason);
192
- }
193
- catch {
194
- // Eviction callbacks must not throw into the hot path.
195
- }
196
- }
197
- return true;
198
- }
199
- /**
200
- * Evict the least-recently-used entries until `store.size <= maxSize`.
201
- * Entries with higher priority are skipped in favour of lower-priority ones.
202
- */
203
- enforceSizeLimit() {
204
- while (this.store.size > this.maxSize) {
205
- // Find the entry with the lowest priority among the oldest entries
206
- let lowestKey = null;
207
- let lowestPriority = Number.POSITIVE_INFINITY;
208
- const entries = Array.from(this.store.entries());
209
- for (const [key, internal] of entries) {
210
- if (internal.priority < lowestPriority) {
211
- lowestPriority = internal.priority;
212
- lowestKey = key;
213
- }
214
- // Only inspect the oldest quarter (those at the front of the Map)
215
- // to keep eviction fast while still respecting priority.
216
- if (lowestKey !== null && lowestPriority === 0)
217
- break;
218
- }
219
- if (lowestKey !== null) {
220
- this.evict(lowestKey, "lru");
221
- }
222
- else {
223
- // Safety valve: evict the first (oldest) key.
224
- const keys = Array.from(this.store.keys());
225
- if (keys.length > 0) {
226
- this.evict(keys[0], "lru");
227
- }
228
- }
229
- }
230
- }
231
- /**
232
- * Evict entries until `_memoryUsageBytes <= maxMemoryBytes`.
233
- */
234
- enforceMemoryLimit() {
235
- while (this._memoryUsageBytes > this.maxMemoryBytes && this.store.size > 0) {
236
- const keys = Array.from(this.store.keys());
237
- if (keys.length === 0)
238
- break;
239
- this.evict(keys[0], "memory");
240
- }
241
- }
242
- /**
243
- * Sweep all expired entries. Called periodically by the background timer.
244
- */
245
- sweep() {
246
- const now = Date.now();
247
- const entries = Array.from(this.store.entries());
248
- for (const [key, internal] of entries) {
249
- if (now >= internal.entry.expiresAt) {
250
- this.evict(key, "ttl");
251
- }
252
- }
253
- }
254
- startPeriodicSweep() {
255
- this.sweepTimer = setInterval(() => this.sweep(), SWEEP_INTERVAL_MS);
256
- if (this.sweepTimer.unref) {
257
- this.sweepTimer.unref();
258
- }
259
- }
260
- stopPeriodicSweep() {
261
- if (this.sweepTimer) {
262
- clearInterval(this.sweepTimer);
263
- this.sweepTimer = null;
264
- }
265
- }
266
- }
267
- /**
268
- * Singleton orchestrator that wraps node executions with transparent caching.
269
- *
270
- * Typical usage:
271
- *
272
- * ```ts
273
- * const cache = NodeResultCache.getInstance();
274
- *
275
- * const result = await cache.wrapExecution("myNode", input, async () => {
276
- * return expensiveComputation(input);
277
- * });
278
- *
279
- * console.log(result.cached); // true on subsequent identical calls
280
- * ```
281
- *
282
- * The singleton is configured once via {@link NodeResultCache.configure}.
283
- * Subsequent calls to `getInstance()` return the already-configured instance.
284
- */
285
- export class NodeResultCache {
286
- static instance = null;
287
- provider;
288
- enabled;
289
- keyStrategy;
290
- customKeyFn;
291
- /**
292
- * In-flight promise map for deduplicating concurrent executions of the
293
- * same cache key. Prevents the "thundering herd" problem where N
294
- * concurrent callers all compute the same expensive result.
295
- */
296
- inflight = new Map();
297
- constructor(config = {}) {
298
- this.provider = config.provider ?? new InMemoryCache();
299
- this.enabled = config.enabled ?? true;
300
- this.keyStrategy = config.keyStrategy ?? "node-input";
301
- this.customKeyFn = config.customKeyFn;
302
- if (this.keyStrategy === "custom" && typeof this.customKeyFn !== "function") {
303
- throw new Error('NodeResultCache: "custom" key strategy requires a customKeyFn to be provided.');
304
- }
305
- }
306
- // -- Singleton API -------------------------------------------------------
307
- /**
308
- * Return the singleton instance, creating one with defaults if necessary.
309
- */
310
- static getInstance() {
311
- if (!NodeResultCache.instance) {
312
- NodeResultCache.instance = new NodeResultCache();
313
- }
314
- return NodeResultCache.instance;
315
- }
316
- /**
317
- * Create (or replace) the singleton with the given configuration.
318
- *
319
- * @returns The newly configured singleton instance.
320
- */
321
- static configure(config) {
322
- // If an existing instance has a destroyable provider, clean it up.
323
- if (NodeResultCache.instance) {
324
- const oldProvider = NodeResultCache.instance.provider;
325
- if (oldProvider instanceof InMemoryCache) {
326
- oldProvider.destroy();
327
- }
328
- }
329
- NodeResultCache.instance = new NodeResultCache(config);
330
- return NodeResultCache.instance;
331
- }
332
- /**
333
- * Tear down the singleton, releasing any resources held by the provider.
334
- */
335
- static resetInstance() {
336
- if (NodeResultCache.instance) {
337
- const provider = NodeResultCache.instance.provider;
338
- if (provider instanceof InMemoryCache) {
339
- provider.destroy();
340
- }
341
- NodeResultCache.instance = null;
342
- }
343
- }
344
- // -- Public API ----------------------------------------------------------
345
- /**
346
- * Wrap an async execution with caching.
347
- *
348
- * If a cached result exists for the derived key it is returned immediately.
349
- * Otherwise `execute` is invoked and its result is stored before being
350
- * returned.
351
- *
352
- * Concurrent calls with the same key will share a single in-flight
353
- * execution (request coalescing).
354
- *
355
- * @param nodeName - Logical name of the node being executed.
356
- * @param input - The input payload used to derive the cache key.
357
- * @param execute - Factory that produces the result when no cache hit.
358
- * @param options - Optional TTL, tags, and priority for the cache entry.
359
- * @returns A {@link CacheResult} indicating whether the result was cached.
360
- */
361
- async wrapExecution(nodeName, input, execute, options) {
362
- const key = this.buildKey(nodeName, input);
363
- // Bypass cache entirely when disabled.
364
- if (!this.enabled) {
365
- const data = await execute();
366
- return { data, cached: false, key };
367
- }
368
- // 1. Check for a cached entry.
369
- const cached = await this.provider.get(key);
370
- if (cached) {
371
- return {
372
- data: cached.value,
373
- cached: true,
374
- key,
375
- ttlRemainingMs: Math.max(0, cached.expiresAt - Date.now()),
376
- };
377
- }
378
- // 2. Deduplicate concurrent executions for the same key.
379
- const existing = this.inflight.get(key);
380
- if (existing) {
381
- const data = (await existing);
382
- // By this point the first caller will have stored the result.
383
- const entry = await this.provider.get(key);
384
- return {
385
- data,
386
- cached: entry !== null,
387
- key,
388
- ttlRemainingMs: entry ? Math.max(0, entry.expiresAt - Date.now()) : undefined,
389
- };
390
- }
391
- // 3. Execute and cache.
392
- const promise = execute();
393
- this.inflight.set(key, promise);
394
- try {
395
- const data = await promise;
396
- await this.provider.set(key, data, options);
397
- return { data, cached: false, key };
398
- }
399
- finally {
400
- this.inflight.delete(key);
401
- }
402
- }
403
- /**
404
- * Invalidate all cache entries whose key starts with the node-specific
405
- * prefix. This is only fully effective with the default `"node-input"`
406
- * strategy and the built-in {@link InMemoryCache} provider.
407
- *
408
- * For external providers, consider using tag-based invalidation instead.
409
- *
410
- * @param nodeName - Name of the node whose results should be purged.
411
- */
412
- async invalidateNode(nodeName) {
413
- if (this.provider instanceof InMemoryCache) {
414
- const prefix = `node:${nodeName}:`;
415
- const store = this.provider.store;
416
- const keysToDelete = [];
417
- const allKeys = Array.from(store.keys());
418
- for (const key of allKeys) {
419
- if (key.startsWith(prefix)) {
420
- keysToDelete.push(key);
421
- }
422
- }
423
- for (const key of keysToDelete) {
424
- await this.provider.delete(key);
425
- }
426
- }
427
- else {
428
- // For external providers: best-effort tag invalidation.
429
- await this.invalidateByTags([`node:${nodeName}`]);
430
- }
431
- }
432
- /**
433
- * Invalidate all entries matching *any* of the supplied tags.
434
- *
435
- * This is a convenience wrapper around {@link InMemoryCache.invalidateByTag}
436
- * when the built-in provider is used.
437
- *
438
- * @param tags - Array of tag strings.
439
- */
440
- async invalidateByTags(tags) {
441
- if (this.provider instanceof InMemoryCache) {
442
- for (const tag of tags) {
443
- this.provider.invalidateByTag(tag);
444
- }
445
- }
446
- // External providers would need their own tag invalidation mechanism.
447
- }
448
- /**
449
- * Pre-populate the cache for a set of known inputs.
450
- *
451
- * This is useful during application startup to "warm" the cache and
452
- * ensure that the first real request for each input is served from cache.
453
- *
454
- * @param nodeName - Name of the node.
455
- * @param inputs - Array of inputs to pre-compute.
456
- * @param execute - Factory that computes the result for a given input.
457
- * @param options - Optional cache-set options applied to every entry.
458
- */
459
- async warmup(nodeName, inputs, execute, options) {
460
- await Promise.all(inputs.map(async (input) => {
461
- const key = this.buildKey(nodeName, input);
462
- const exists = await this.provider.has(key);
463
- if (!exists) {
464
- const result = await execute(input);
465
- await this.provider.set(key, result, options);
466
- }
467
- }));
468
- }
469
- /**
470
- * Return the underlying provider's statistics snapshot.
471
- */
472
- getStats() {
473
- return this.provider.getStats();
474
- }
475
- /**
476
- * Return the underlying cache provider instance.
477
- */
478
- getProvider() {
479
- return this.provider;
480
- }
481
- // -- Private helpers -----------------------------------------------------
482
- /**
483
- * Derive a cache key from the node name and input based on the configured
484
- * {@link CacheKeyStrategy}.
485
- */
486
- buildKey(nodeName, input) {
487
- switch (this.keyStrategy) {
488
- case "input-hash":
489
- return sha256(JSON.stringify(input));
490
- case "node-input":
491
- return `node:${nodeName}:${sha256(nodeName + JSON.stringify(input))}`;
492
- case "custom":
493
- // Constructor (line ~484) throws when strategy === "custom" but
494
- // customKeyFn is missing, so by the time we get here the fn is
495
- // guaranteed defined. Defensive runtime check keeps TS happy
496
- // without `!`.
497
- if (!this.customKeyFn) {
498
- throw new Error('NodeResultCache: "custom" key strategy requires a customKeyFn to be provided.');
499
- }
500
- return this.customKeyFn(nodeName, input);
501
- default:
502
- return `node:${nodeName}:${sha256(nodeName + JSON.stringify(input))}`;
503
- }
504
- }
505
- }
506
- //# sourceMappingURL=NodeResultCache.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NodeResultCache.js","sourceRoot":"","sources":["../../src/cache/NodeResultCache.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export { InMemoryCache, NodeResultCache, type CacheProvider, type CacheEntry, type CacheSetOptions, type CacheStats, type InMemoryCacheConfig, type CacheKeyStrategy, type CustomKeyFn, type CacheResult, type NodeResultCacheConfig, } from "./NodeResultCache";
@@ -1,2 +0,0 @@
1
- export { InMemoryCache, NodeResultCache, } from "./NodeResultCache";
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,aAAa,EACb,eAAe,GAUf,MAAM,mBAAmB,CAAC"}
@@ -1,61 +0,0 @@
1
- /**
2
- * Tier 2 #6 follow-up · cross-process concurrency backend.
3
- *
4
- * Optional capability layer that lets `RunTracker.acquireConcurrencySlot`
5
- * delegate to a backend with cross-process semantics (NATS KV, future
6
- * Redis) instead of the local sync `RunStore` impl.
7
- *
8
- * Default behavior is unchanged — when no backend is set, the tracker
9
- * uses the existing `store.acquireConcurrencySlot` (single-process via
10
- * SQLite locks or in-memory Map). The backend is opt-in via
11
- * `BLOK_CONCURRENCY_BACKEND=nats-kv` and installed by trigger packages
12
- * during `listen()`.
13
- *
14
- * Async-only — NATS KV operations require network round-trips. The
15
- * sync `RunStore` interface remains untouched (no breaking change to
16
- * existing extension points); the tracker bridges async + sync via
17
- * `Promise.resolve()` when no backend is set.
18
- */
19
- import type { ConcurrencySlotResult } from "../tracing/types";
20
- export interface ConcurrencyBackend {
21
- /**
22
- * Identifying string for logs/metrics. e.g. `"nats-kv"`, `"redis"`.
23
- */
24
- readonly name: string;
25
- /**
26
- * Lifecycle — open the underlying connection. Idempotent. Called
27
- * once when the trigger installs the backend during `listen()`.
28
- */
29
- connect(): Promise<void>;
30
- /**
31
- * Lifecycle — close the underlying connection. Idempotent. Called
32
- * on graceful process shutdown (when wired).
33
- */
34
- disconnect(): Promise<void>;
35
- /**
36
- * Atomically attempt to acquire a slot for the
37
- * `(workflowName, concurrencyKey)` bucket against the given limit.
38
- *
39
- * Contract — must match {@link RunStore.acquireConcurrencySlot}:
40
- * - Lazy-purge expired leases on the bucket before counting.
41
- * - Idempotent re-acquire: same `runId` refreshes the lease,
42
- * does NOT grow the count.
43
- * - On count >= limit: return `{acquired: false, currentInFlight}`
44
- * without inserting.
45
- * - On grant: return `{acquired: true, currentInFlight}` where
46
- * `currentInFlight` includes the just-acquired slot.
47
- */
48
- acquireSlot(workflowName: string, concurrencyKey: string, concurrencyLimit: number, runId: string, leaseExpiresAt: number): Promise<ConcurrencySlotResult>;
49
- /**
50
- * Release a slot. Idempotent. Safe to call on `runId`s that don't
51
- * hold a slot (e.g. crash + restart releases via lease expiry).
52
- */
53
- releaseSlot(workflowName: string, concurrencyKey: string, runId: string): Promise<void>;
54
- /**
55
- * Janitor sweep — purge every lease whose `expiresAt <= now` across
56
- * all buckets. Returns the count of purged leases. Cheap per-bucket
57
- * lazy-purge happens on every acquire; this method is for global
58
- * cleanup (e.g., periodic background task).
59
- */
60
- purgeExpired(now: number): Promise<number>;
61
- }
@@ -1,20 +0,0 @@
1
- /**
2
- * Tier 2 #6 follow-up · cross-process concurrency backend.
3
- *
4
- * Optional capability layer that lets `RunTracker.acquireConcurrencySlot`
5
- * delegate to a backend with cross-process semantics (NATS KV, future
6
- * Redis) instead of the local sync `RunStore` impl.
7
- *
8
- * Default behavior is unchanged — when no backend is set, the tracker
9
- * uses the existing `store.acquireConcurrencySlot` (single-process via
10
- * SQLite locks or in-memory Map). The backend is opt-in via
11
- * `BLOK_CONCURRENCY_BACKEND=nats-kv` and installed by trigger packages
12
- * during `listen()`.
13
- *
14
- * Async-only — NATS KV operations require network round-trips. The
15
- * sync `RunStore` interface remains untouched (no breaking change to
16
- * existing extension points); the tracker bridges async + sync via
17
- * `Promise.resolve()` when no backend is set.
18
- */
19
- export {};
20
- //# sourceMappingURL=ConcurrencyBackend.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ConcurrencyBackend.js","sourceRoot":"","sources":["../../src/concurrency/ConcurrencyBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG"}