@blokjs/runner 0.2.1 → 0.4.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 (159) hide show
  1. package/dist/Blok.js +11 -11
  2. package/dist/Blok.js.map +1 -1
  3. package/dist/Configuration.d.ts +39 -2
  4. package/dist/Configuration.js +337 -28
  5. package/dist/Configuration.js.map +1 -1
  6. package/dist/ConfigurationResolver.d.ts +9 -0
  7. package/dist/ConfigurationResolver.js +17 -1
  8. package/dist/ConfigurationResolver.js.map +1 -1
  9. package/dist/PayloadTooLargeError.d.ts +19 -0
  10. package/dist/PayloadTooLargeError.js +29 -0
  11. package/dist/PayloadTooLargeError.js.map +1 -0
  12. package/dist/RunCancelledError.d.ts +17 -0
  13. package/dist/RunCancelledError.js +25 -0
  14. package/dist/RunCancelledError.js.map +1 -0
  15. package/dist/RunnerSteps.js +363 -23
  16. package/dist/RunnerSteps.js.map +1 -1
  17. package/dist/RuntimeAdapterNode.d.ts +32 -2
  18. package/dist/RuntimeAdapterNode.js +122 -27
  19. package/dist/RuntimeAdapterNode.js.map +1 -1
  20. package/dist/SubworkflowNode.d.ts +75 -0
  21. package/dist/SubworkflowNode.js +221 -0
  22. package/dist/SubworkflowNode.js.map +1 -0
  23. package/dist/TriggerBase.d.ts +128 -0
  24. package/dist/TriggerBase.js +808 -6
  25. package/dist/TriggerBase.js.map +1 -1
  26. package/dist/WaitDispatchRequest.d.ts +38 -0
  27. package/dist/WaitDispatchRequest.js +13 -0
  28. package/dist/WaitDispatchRequest.js.map +1 -0
  29. package/dist/WaitNode.d.ts +23 -0
  30. package/dist/WaitNode.js +26 -0
  31. package/dist/WaitNode.js.map +1 -0
  32. package/dist/adapters/BunRuntimeAdapter.d.ts +1 -0
  33. package/dist/adapters/BunRuntimeAdapter.js +1 -0
  34. package/dist/adapters/BunRuntimeAdapter.js.map +1 -1
  35. package/dist/adapters/DockerRuntimeAdapter.d.ts +2 -1
  36. package/dist/adapters/DockerRuntimeAdapter.js +10 -1
  37. package/dist/adapters/DockerRuntimeAdapter.js.map +1 -1
  38. package/dist/adapters/HttpRuntimeAdapter.d.ts +26 -5
  39. package/dist/adapters/HttpRuntimeAdapter.js +97 -16
  40. package/dist/adapters/HttpRuntimeAdapter.js.map +1 -1
  41. package/dist/adapters/NodeJsRuntimeAdapter.d.ts +1 -0
  42. package/dist/adapters/NodeJsRuntimeAdapter.js +1 -0
  43. package/dist/adapters/NodeJsRuntimeAdapter.js.map +1 -1
  44. package/dist/adapters/RuntimeAdapter.d.ts +17 -0
  45. package/dist/adapters/WasmRuntimeAdapter.d.ts +1 -0
  46. package/dist/adapters/WasmRuntimeAdapter.js +1 -0
  47. package/dist/adapters/WasmRuntimeAdapter.js.map +1 -1
  48. package/dist/adapters/grpc/GrpcChannelOptions.d.ts +31 -0
  49. package/dist/adapters/grpc/GrpcChannelOptions.js +68 -0
  50. package/dist/adapters/grpc/GrpcChannelOptions.js.map +1 -0
  51. package/dist/adapters/grpc/GrpcClientPool.d.ts +43 -0
  52. package/dist/adapters/grpc/GrpcClientPool.js +89 -0
  53. package/dist/adapters/grpc/GrpcClientPool.js.map +1 -0
  54. package/dist/adapters/grpc/GrpcCodec.d.ts +226 -0
  55. package/dist/adapters/grpc/GrpcCodec.js +275 -0
  56. package/dist/adapters/grpc/GrpcCodec.js.map +1 -0
  57. package/dist/adapters/grpc/GrpcErrors.d.ts +59 -0
  58. package/dist/adapters/grpc/GrpcErrors.js +190 -0
  59. package/dist/adapters/grpc/GrpcErrors.js.map +1 -0
  60. package/dist/adapters/grpc/GrpcHealthChecker.d.ts +69 -0
  61. package/dist/adapters/grpc/GrpcHealthChecker.js +96 -0
  62. package/dist/adapters/grpc/GrpcHealthChecker.js.map +1 -0
  63. package/dist/adapters/grpc/GrpcRuntimeAdapter.d.ts +98 -0
  64. package/dist/adapters/grpc/GrpcRuntimeAdapter.js +478 -0
  65. package/dist/adapters/grpc/GrpcRuntimeAdapter.js.map +1 -0
  66. package/dist/adapters/grpc/index.d.ts +13 -0
  67. package/dist/adapters/grpc/index.js +14 -0
  68. package/dist/adapters/grpc/index.js.map +1 -0
  69. package/dist/adapters/grpc/proto/blok/runtime/v1/runtime.proto +302 -0
  70. package/dist/adapters/grpc/types.d.ts +97 -0
  71. package/dist/adapters/grpc/types.js +41 -0
  72. package/dist/adapters/grpc/types.js.map +1 -0
  73. package/dist/adapters/transport.d.ts +108 -0
  74. package/dist/adapters/transport.js +196 -0
  75. package/dist/adapters/transport.js.map +1 -0
  76. package/dist/concurrency/ConcurrencyBackend.d.ts +61 -0
  77. package/dist/concurrency/ConcurrencyBackend.js +20 -0
  78. package/dist/concurrency/ConcurrencyBackend.js.map +1 -0
  79. package/dist/concurrency/ConcurrencyLimitError.d.ts +37 -0
  80. package/dist/concurrency/ConcurrencyLimitError.js +16 -0
  81. package/dist/concurrency/ConcurrencyLimitError.js.map +1 -0
  82. package/dist/concurrency/NatsKvConcurrencyBackend.d.ts +64 -0
  83. package/dist/concurrency/NatsKvConcurrencyBackend.js +297 -0
  84. package/dist/concurrency/NatsKvConcurrencyBackend.js.map +1 -0
  85. package/dist/concurrency/QueueExpiredError.d.ts +40 -0
  86. package/dist/concurrency/QueueExpiredError.js +15 -0
  87. package/dist/concurrency/QueueExpiredError.js.map +1 -0
  88. package/dist/concurrency/createConcurrencyBackend.d.ts +23 -0
  89. package/dist/concurrency/createConcurrencyBackend.js +34 -0
  90. package/dist/concurrency/createConcurrencyBackend.js.map +1 -0
  91. package/dist/concurrency/readConcurrencyConfig.d.ts +60 -0
  92. package/dist/concurrency/readConcurrencyConfig.js +60 -0
  93. package/dist/concurrency/readConcurrencyConfig.js.map +1 -0
  94. package/dist/idempotency/resolveIdempotencyKey.d.ts +20 -0
  95. package/dist/idempotency/resolveIdempotencyKey.js +37 -0
  96. package/dist/idempotency/resolveIdempotencyKey.js.map +1 -0
  97. package/dist/index.d.ts +35 -3
  98. package/dist/index.js +61 -2
  99. package/dist/index.js.map +1 -1
  100. package/dist/monitoring/ConcurrencyMetrics.d.ts +56 -0
  101. package/dist/monitoring/ConcurrencyMetrics.js +107 -0
  102. package/dist/monitoring/ConcurrencyMetrics.js.map +1 -0
  103. package/dist/monitoring/JanitorMetrics.d.ts +27 -0
  104. package/dist/monitoring/JanitorMetrics.js +48 -0
  105. package/dist/monitoring/JanitorMetrics.js.map +1 -0
  106. package/dist/scheduling/DebounceCoordinator.d.ts +88 -0
  107. package/dist/scheduling/DebounceCoordinator.js +141 -0
  108. package/dist/scheduling/DebounceCoordinator.js.map +1 -0
  109. package/dist/scheduling/DeferredDispatchSignal.d.ts +50 -0
  110. package/dist/scheduling/DeferredDispatchSignal.js +14 -0
  111. package/dist/scheduling/DeferredDispatchSignal.js.map +1 -0
  112. package/dist/scheduling/DeferredRunScheduler.d.ts +68 -0
  113. package/dist/scheduling/DeferredRunScheduler.js +154 -0
  114. package/dist/scheduling/DeferredRunScheduler.js.map +1 -0
  115. package/dist/scheduling/readSchedulingConfig.d.ts +24 -0
  116. package/dist/scheduling/readSchedulingConfig.js +52 -0
  117. package/dist/scheduling/readSchedulingConfig.js.map +1 -0
  118. package/dist/testing/WorkflowTestRunner.js +12 -0
  119. package/dist/testing/WorkflowTestRunner.js.map +1 -1
  120. package/dist/timeouts/StepTimeoutError.d.ts +22 -0
  121. package/dist/timeouts/StepTimeoutError.js +31 -0
  122. package/dist/timeouts/StepTimeoutError.js.map +1 -0
  123. package/dist/tracing/InMemoryRunStore.d.ts +28 -1
  124. package/dist/tracing/InMemoryRunStore.js +150 -0
  125. package/dist/tracing/InMemoryRunStore.js.map +1 -1
  126. package/dist/tracing/Janitor.d.ts +70 -0
  127. package/dist/tracing/Janitor.js +150 -0
  128. package/dist/tracing/Janitor.js.map +1 -0
  129. package/dist/tracing/PostgresRunStore.d.ts +30 -0
  130. package/dist/tracing/PostgresRunStore.js +435 -3
  131. package/dist/tracing/PostgresRunStore.js.map +1 -1
  132. package/dist/tracing/RunStore.d.ts +100 -1
  133. package/dist/tracing/RunTracker.d.ts +261 -11
  134. package/dist/tracing/RunTracker.js +691 -11
  135. package/dist/tracing/RunTracker.js.map +1 -1
  136. package/dist/tracing/SqliteRunStore.d.ts +23 -1
  137. package/dist/tracing/SqliteRunStore.js +421 -6
  138. package/dist/tracing/SqliteRunStore.js.map +1 -1
  139. package/dist/tracing/TraceRouter.d.ts +20 -2
  140. package/dist/tracing/TraceRouter.js +494 -9
  141. package/dist/tracing/TraceRouter.js.map +1 -1
  142. package/dist/tracing/sanitize.d.ts +11 -0
  143. package/dist/tracing/sanitize.js +29 -0
  144. package/dist/tracing/sanitize.js.map +1 -1
  145. package/dist/tracing/types.d.ts +429 -11
  146. package/dist/types/GlobalOptions.d.ts +9 -2
  147. package/dist/utils/createChildContext.d.ts +32 -0
  148. package/dist/utils/createChildContext.js +113 -0
  149. package/dist/utils/createChildContext.js.map +1 -0
  150. package/dist/workflow/PersistenceHelper.d.ts +46 -0
  151. package/dist/workflow/PersistenceHelper.js +57 -0
  152. package/dist/workflow/PersistenceHelper.js.map +1 -0
  153. package/dist/workflow/WorkflowNormalizer.d.ts +79 -0
  154. package/dist/workflow/WorkflowNormalizer.js +486 -0
  155. package/dist/workflow/WorkflowNormalizer.js.map +1 -0
  156. package/dist/workflow/WorkflowRegistry.d.ts +64 -0
  157. package/dist/workflow/WorkflowRegistry.js +81 -0
  158. package/dist/workflow/WorkflowRegistry.js.map +1 -0
  159. package/package.json +10 -7
@@ -0,0 +1,141 @@
1
+ export class DebounceCoordinator {
2
+ static instance = null;
3
+ states = new Map();
4
+ static getInstance() {
5
+ if (!DebounceCoordinator.instance) {
6
+ DebounceCoordinator.instance = new DebounceCoordinator();
7
+ }
8
+ return DebounceCoordinator.instance;
9
+ }
10
+ /** Test-only — reset the singleton + clear all state. */
11
+ static resetInstance() {
12
+ DebounceCoordinator.instance?.clear();
13
+ DebounceCoordinator.instance = null;
14
+ }
15
+ bucket(workflowName, debounceKey) {
16
+ return `${workflowName}\x1f${debounceKey}`;
17
+ }
18
+ register(opts) {
19
+ const now = opts.__now ?? Date.now();
20
+ const bucketKey = this.bucket(opts.workflowName, opts.debounceKey);
21
+ const existing = this.states.get(bucketKey);
22
+ // === Leading mode ===
23
+ if (opts.mode === "leading") {
24
+ if (existing) {
25
+ // Window active — coalesce this ping (drop the run).
26
+ existing.pingCount += 1;
27
+ existing.lastPingAt = now;
28
+ return {
29
+ outcome: "coalesce",
30
+ activeRunId: existing.activeRunId,
31
+ pingCount: existing.pingCount,
32
+ };
33
+ }
34
+ // Open a new window. Caller fires synchronously; coordinator just
35
+ // tracks state to suppress follow-ups for `delayMs`.
36
+ const state = {
37
+ bucketKey,
38
+ mode: "leading",
39
+ delayMs: opts.delayMs,
40
+ maxDelayMs: opts.maxDelayMs,
41
+ firstPingAt: now,
42
+ lastPingAt: now,
43
+ pingCount: 1,
44
+ activeRunId: opts.runId,
45
+ };
46
+ // Auto-close the window after delayMs of silence — clear state so
47
+ // subsequent pings start fresh.
48
+ state.timer = setTimeout(() => {
49
+ const cur = this.states.get(bucketKey);
50
+ if (cur && cur.lastPingAt + opts.delayMs <= Date.now()) {
51
+ this.states.delete(bucketKey);
52
+ }
53
+ }, opts.delayMs);
54
+ this.states.set(bucketKey, state);
55
+ return { outcome: "fire-immediate", activeRunId: opts.runId, pingCount: 1 };
56
+ }
57
+ // === Trailing mode ===
58
+ if (existing) {
59
+ // Extend the window: cancel the old timer, set a new one. Latest
60
+ // payload wins via the captured `onFire`.
61
+ if (existing.timer)
62
+ clearTimeout(existing.timer);
63
+ existing.pingCount += 1;
64
+ existing.lastPingAt = now;
65
+ existing.onFire = opts.onFire;
66
+ const naiveDeadline = now + opts.delayMs;
67
+ const dispatchAt = existing.maxDelayDeadline !== undefined ? Math.min(naiveDeadline, existing.maxDelayDeadline) : naiveDeadline;
68
+ const wait = Math.max(0, dispatchAt - now);
69
+ existing.timer = setTimeout(() => this.fireTrailing(bucketKey), wait);
70
+ return {
71
+ outcome: "coalesce",
72
+ activeRunId: existing.activeRunId,
73
+ scheduledAt: dispatchAt,
74
+ pingCount: existing.pingCount,
75
+ };
76
+ }
77
+ // New trailing window.
78
+ const state = {
79
+ bucketKey,
80
+ mode: "trailing",
81
+ delayMs: opts.delayMs,
82
+ maxDelayMs: opts.maxDelayMs,
83
+ firstPingAt: now,
84
+ lastPingAt: now,
85
+ pingCount: 1,
86
+ activeRunId: opts.runId,
87
+ maxDelayDeadline: opts.maxDelayMs !== undefined ? now + opts.maxDelayMs : undefined,
88
+ onFire: opts.onFire,
89
+ };
90
+ const naiveDeadline = now + opts.delayMs;
91
+ const dispatchAt = state.maxDelayDeadline !== undefined ? Math.min(naiveDeadline, state.maxDelayDeadline) : naiveDeadline;
92
+ const wait = Math.max(0, dispatchAt - now);
93
+ state.timer = setTimeout(() => this.fireTrailing(bucketKey), wait);
94
+ this.states.set(bucketKey, state);
95
+ return {
96
+ outcome: "schedule-trailing",
97
+ activeRunId: opts.runId,
98
+ scheduledAt: dispatchAt,
99
+ pingCount: 1,
100
+ };
101
+ }
102
+ fireTrailing(bucketKey) {
103
+ const state = this.states.get(bucketKey);
104
+ if (!state)
105
+ return;
106
+ this.states.delete(bucketKey);
107
+ if (state.onFire) {
108
+ void state.onFire().catch((err) => {
109
+ console.error(`[blok][scheduling] DebounceCoordinator trailing-fire failed for key ${bucketKey}:`, err instanceof Error ? err.stack || err.message : err);
110
+ });
111
+ }
112
+ }
113
+ /** Cancel an active window without firing. Returns true if cancelled. */
114
+ cancel(workflowName, debounceKey) {
115
+ const bucketKey = this.bucket(workflowName, debounceKey);
116
+ const state = this.states.get(bucketKey);
117
+ if (!state)
118
+ return false;
119
+ if (state.timer)
120
+ clearTimeout(state.timer);
121
+ this.states.delete(bucketKey);
122
+ return true;
123
+ }
124
+ /** Number of active debounce windows. Tests + observability. */
125
+ size() {
126
+ return this.states.size;
127
+ }
128
+ /** True if a window is open for `(workflow, key)`. */
129
+ has(workflowName, debounceKey) {
130
+ return this.states.has(this.bucket(workflowName, debounceKey));
131
+ }
132
+ /** Cancel everything without firing. */
133
+ clear() {
134
+ for (const state of this.states.values()) {
135
+ if (state.timer)
136
+ clearTimeout(state.timer);
137
+ }
138
+ this.states.clear();
139
+ }
140
+ }
141
+ //# sourceMappingURL=DebounceCoordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DebounceCoordinator.js","sourceRoot":"","sources":["../../src/scheduling/DebounceCoordinator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Tier 2 #5 + #7 — thrown by `TriggerBase.run()` when a workflow's
3
+ * scheduling gates (debounce / delay) defer the run to a future
4
+ * dispatch. Tier 2 #6 follow-up extends this to cover `onLimit:"queue"`
5
+ * (concurrency-gate-deferred runs); same transport translation.
6
+ *
7
+ * NOT a true error — a control-flow exception. Trigger transports
8
+ * catch it and translate it into the appropriate transport-level
9
+ * response:
10
+ *
11
+ * - HTTP trigger → `202 Accepted` with `Location: /__blok/runs/:id`
12
+ * header and structured JSON body.
13
+ * - Worker trigger → ACK without retry (the deferred coordinator owns
14
+ * the eventual dispatch).
15
+ *
16
+ * Carries the run-detail summary the transport needs to populate the
17
+ * response.
18
+ */
19
+ export interface DeferredDispatchInfo {
20
+ /** Run id allocated by the tracer when the run was created. */
21
+ runId: string;
22
+ /** Workflow name. */
23
+ workflowName: string;
24
+ /**
25
+ * Resolved status the run was placed in:
26
+ * - `"delayed"` — Tier 2 #5 (`trigger.delay`).
27
+ * - `"debounced"` — Tier 2 #7 (`trigger.debounce`).
28
+ * - `"queued"` — Tier 2 #6 follow-up (`trigger.onLimit:"queue"`).
29
+ */
30
+ status: "delayed" | "debounced" | "queued";
31
+ /** ms since epoch when the run is scheduled to dispatch. */
32
+ scheduledAt: number;
33
+ /** ms since epoch when the run will expire if not dispatched. Undefined when no TTL. */
34
+ expiresAt?: number;
35
+ /** True when the run was placed in `"debounced"` status (Tier 2 #7). */
36
+ debounced: boolean;
37
+ /** Pings absorbed by the run so far (always 1+). */
38
+ pingCount: number;
39
+ /**
40
+ * For leading-mode debounce, the runId of the sibling that fired
41
+ * immediately. Lets transports return `Location: /__blok/runs/<sibling>`
42
+ * so the caller can poll the actually-running run.
43
+ */
44
+ intoRunId?: string;
45
+ }
46
+ export declare class DeferredDispatchSignal extends Error {
47
+ readonly info: DeferredDispatchInfo;
48
+ constructor(info: DeferredDispatchInfo);
49
+ }
50
+ export declare function isDeferredDispatchSignal(err: unknown): err is DeferredDispatchSignal;
@@ -0,0 +1,14 @@
1
+ export class DeferredDispatchSignal extends Error {
2
+ info;
3
+ constructor(info) {
4
+ super(`Run ${info.runId} for workflow '${info.workflowName}' was deferred ` +
5
+ `(${info.status}; scheduledAt=${info.scheduledAt}; pingCount=${info.pingCount}).`);
6
+ this.name = "DeferredDispatchSignal";
7
+ this.info = info;
8
+ Object.setPrototypeOf(this, DeferredDispatchSignal.prototype);
9
+ }
10
+ }
11
+ export function isDeferredDispatchSignal(err) {
12
+ return err instanceof DeferredDispatchSignal;
13
+ }
14
+ //# sourceMappingURL=DeferredDispatchSignal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeferredDispatchSignal.js","sourceRoot":"","sources":["../../src/scheduling/DeferredDispatchSignal.ts"],"names":[],"mappings":"AA8CA,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAChC,IAAI,CAAuB;IAE3C,YAAY,IAA0B;QACrC,KAAK,CACJ,OAAO,IAAI,CAAC,KAAK,kBAAkB,IAAI,CAAC,YAAY,iBAAiB;YACpE,IAAI,IAAI,CAAC,MAAM,iBAAiB,IAAI,CAAC,WAAW,eAAe,IAAI,CAAC,SAAS,IAAI,CAClF,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAC/D,CAAC;CACD;AAED,MAAM,UAAU,wBAAwB,CAAC,GAAY;IACpD,OAAO,GAAG,YAAY,sBAAsB,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,68 @@
1
+ import type { ScheduledDispatchRow } from "../tracing/types";
2
+ export type DeferredDispatchFn = () => Promise<void>;
3
+ /**
4
+ * Optional persistence payload — when supplied to `schedule()`, the
5
+ * scheduler writes a `scheduled_dispatches` row before registering the
6
+ * timer, and deletes it on cancel or fire. Trigger boot recovery
7
+ * (e.g. `HttpTrigger.recoverDispatches`) reads these rows to re-register
8
+ * timers across process restarts.
9
+ */
10
+ export interface DeferredScheduleOptions {
11
+ workflowName: string;
12
+ /** Trigger type — `"http"` for v1; future triggers can opt in. */
13
+ triggerType: string;
14
+ /** TTL deadline (ms since epoch). When set, expired rows get marked `expired` on boot recovery. */
15
+ expiresAt?: number;
16
+ /** Mirrors the run record's status. */
17
+ dispatchStatus: ScheduledDispatchRow["dispatchStatus"];
18
+ /**
19
+ * JSON-serializable trigger-defined payload sufficient to reconstruct
20
+ * dispatch on boot. Trigger packages choose what to put here.
21
+ */
22
+ payload: unknown;
23
+ }
24
+ export declare class DeferredRunScheduler {
25
+ private static instance;
26
+ private entries;
27
+ static getInstance(): DeferredRunScheduler;
28
+ /** Test-only — reset the singleton. Cancels all pending timers. */
29
+ static resetInstance(): void;
30
+ /**
31
+ * Register a deferred dispatch. The timer fires at `dispatchAt`
32
+ * (clamped to ≥ now); when it fires, the entry is removed from the
33
+ * map and `dispatchFn` is invoked. Errors thrown by `dispatchFn` are
34
+ * swallowed and logged — the scheduler is fire-and-forget by design.
35
+ *
36
+ * Re-scheduling the same `runId` cancels the previous timer and
37
+ * replaces it (used by the debounce coordinator's "reset on ping").
38
+ *
39
+ * When `persist` is provided, the scheduler also writes a
40
+ * `scheduled_dispatches` row before registering the timer (so a
41
+ * crash leaves the dispatch recoverable), and deletes the row on
42
+ * cancel or fire.
43
+ */
44
+ schedule(runId: string, dispatchAt: number, dispatchFn: DeferredDispatchFn, persist?: DeferredScheduleOptions): void;
45
+ /**
46
+ * Cancel a pending dispatch. Returns true if the entry existed and
47
+ * was cancelled; false otherwise. Idempotent. When the entry was
48
+ * persisted, also deletes the `scheduled_dispatches` row.
49
+ *
50
+ * `cancelPersistedOnly` (default false) lets callers force the
51
+ * persistence-row delete even when the in-memory timer is gone (e.g.
52
+ * recovery cleanup that knows about a row but never had a timer).
53
+ */
54
+ cancel(runId: string, cancelPersistedOnly?: boolean): boolean;
55
+ private deletePersistedRow;
56
+ /** True if `runId` has a pending timer. */
57
+ has(runId: string): boolean;
58
+ /** Number of pending timers. Useful for tests + observability. */
59
+ size(): number;
60
+ /**
61
+ * Fire ALL pending dispatches immediately and clear the queue.
62
+ * Awaits each `dispatchFn` so the caller knows when the queue is
63
+ * drained. Useful for graceful shutdown.
64
+ */
65
+ drainAll(): Promise<void>;
66
+ /** Cancel everything without dispatching. */
67
+ clear(): void;
68
+ }
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Tier 2 #5 — in-memory scheduler for deferred workflow runs. Tier 2
3
+ * #5+#7 follow-up adds optional sqlite-backed durability via the
4
+ * {@link DeferredScheduleOptions.persist} parameter.
5
+ *
6
+ * Process-wide singleton; obtained via {@link DeferredRunScheduler.getInstance}.
7
+ * Reset between tests via {@link DeferredRunScheduler.resetInstance}.
8
+ */
9
+ import { RunTracker } from "../tracing/RunTracker";
10
+ export class DeferredRunScheduler {
11
+ static instance = null;
12
+ entries = new Map();
13
+ static getInstance() {
14
+ if (!DeferredRunScheduler.instance) {
15
+ DeferredRunScheduler.instance = new DeferredRunScheduler();
16
+ }
17
+ return DeferredRunScheduler.instance;
18
+ }
19
+ /** Test-only — reset the singleton. Cancels all pending timers. */
20
+ static resetInstance() {
21
+ DeferredRunScheduler.instance?.clear();
22
+ DeferredRunScheduler.instance = null;
23
+ }
24
+ /**
25
+ * Register a deferred dispatch. The timer fires at `dispatchAt`
26
+ * (clamped to ≥ now); when it fires, the entry is removed from the
27
+ * map and `dispatchFn` is invoked. Errors thrown by `dispatchFn` are
28
+ * swallowed and logged — the scheduler is fire-and-forget by design.
29
+ *
30
+ * Re-scheduling the same `runId` cancels the previous timer and
31
+ * replaces it (used by the debounce coordinator's "reset on ping").
32
+ *
33
+ * When `persist` is provided, the scheduler also writes a
34
+ * `scheduled_dispatches` row before registering the timer (so a
35
+ * crash leaves the dispatch recoverable), and deletes the row on
36
+ * cancel or fire.
37
+ */
38
+ schedule(runId, dispatchAt, dispatchFn, persist) {
39
+ // Persist BEFORE the timer so a crash between persist + setTimeout
40
+ // still leaves the row recoverable.
41
+ const persisted = persist !== undefined;
42
+ if (persisted) {
43
+ const tracker = RunTracker.getInstance();
44
+ if (tracker.active) {
45
+ try {
46
+ tracker.getStore().upsertScheduledDispatch({
47
+ runId,
48
+ workflowName: persist.workflowName,
49
+ triggerType: persist.triggerType,
50
+ scheduledAt: dispatchAt,
51
+ expiresAt: persist.expiresAt,
52
+ dispatchStatus: persist.dispatchStatus,
53
+ payload: persist.payload,
54
+ createdAt: Date.now(),
55
+ });
56
+ }
57
+ catch (err) {
58
+ // Don't block the dispatch on persistence failure — log and continue.
59
+ console.error(`[blok][scheduling] persist failed for run ${runId}; continuing in-memory only:`, err instanceof Error ? err.stack || err.message : err);
60
+ }
61
+ }
62
+ }
63
+ // Replace any existing entry for this runId.
64
+ const existing = this.entries.get(runId);
65
+ if (existing)
66
+ clearTimeout(existing.timer);
67
+ const delay = Math.max(0, dispatchAt - Date.now());
68
+ const timer = setTimeout(() => {
69
+ this.entries.delete(runId);
70
+ // Best-effort delete the persisted row before invoking dispatchFn —
71
+ // dispatch will write the run's terminal status separately.
72
+ if (persisted)
73
+ this.deletePersistedRow(runId);
74
+ void dispatchFn().catch((err) => {
75
+ console.error(`[blok][scheduling] DeferredRunScheduler dispatch failed for run ${runId}:`, err instanceof Error ? err.stack || err.message : err);
76
+ });
77
+ }, delay);
78
+ // `Node` will keep the event loop alive for pending timers — that's
79
+ // the desired behavior for delayed runs in long-running services.
80
+ // `unref()` would be wrong here.
81
+ this.entries.set(runId, { runId, dispatchAt, timer, dispatchFn, persisted });
82
+ }
83
+ /**
84
+ * Cancel a pending dispatch. Returns true if the entry existed and
85
+ * was cancelled; false otherwise. Idempotent. When the entry was
86
+ * persisted, also deletes the `scheduled_dispatches` row.
87
+ *
88
+ * `cancelPersistedOnly` (default false) lets callers force the
89
+ * persistence-row delete even when the in-memory timer is gone (e.g.
90
+ * recovery cleanup that knows about a row but never had a timer).
91
+ */
92
+ cancel(runId, cancelPersistedOnly = false) {
93
+ const entry = this.entries.get(runId);
94
+ if (!entry) {
95
+ if (cancelPersistedOnly) {
96
+ return this.deletePersistedRow(runId);
97
+ }
98
+ return false;
99
+ }
100
+ clearTimeout(entry.timer);
101
+ this.entries.delete(runId);
102
+ if (entry.persisted)
103
+ this.deletePersistedRow(runId);
104
+ return true;
105
+ }
106
+ deletePersistedRow(runId) {
107
+ const tracker = RunTracker.getInstance();
108
+ if (!tracker.active)
109
+ return false;
110
+ try {
111
+ return tracker.getStore().deleteScheduledDispatch(runId);
112
+ }
113
+ catch (err) {
114
+ console.error(`[blok][scheduling] persist-cleanup failed for run ${runId}:`, err instanceof Error ? err.stack || err.message : err);
115
+ return false;
116
+ }
117
+ }
118
+ /** True if `runId` has a pending timer. */
119
+ has(runId) {
120
+ return this.entries.has(runId);
121
+ }
122
+ /** Number of pending timers. Useful for tests + observability. */
123
+ size() {
124
+ return this.entries.size;
125
+ }
126
+ /**
127
+ * Fire ALL pending dispatches immediately and clear the queue.
128
+ * Awaits each `dispatchFn` so the caller knows when the queue is
129
+ * drained. Useful for graceful shutdown.
130
+ */
131
+ async drainAll() {
132
+ const toFire = Array.from(this.entries.values());
133
+ // Cancel all timers first so we don't double-dispatch.
134
+ for (const entry of toFire)
135
+ clearTimeout(entry.timer);
136
+ this.entries.clear();
137
+ // Sequential dispatch — preserves intended order if it matters.
138
+ for (const entry of toFire) {
139
+ try {
140
+ await entry.dispatchFn();
141
+ }
142
+ catch (err) {
143
+ console.error(`[blok][scheduling] drainAll dispatch failed for run ${entry.runId}:`, err instanceof Error ? err.stack || err.message : err);
144
+ }
145
+ }
146
+ }
147
+ /** Cancel everything without dispatching. */
148
+ clear() {
149
+ for (const entry of this.entries.values())
150
+ clearTimeout(entry.timer);
151
+ this.entries.clear();
152
+ }
153
+ }
154
+ //# sourceMappingURL=DeferredRunScheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeferredRunScheduler.js","sourceRoot":"","sources":["../../src/scheduling/DeferredRunScheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /** Parsed, normalized debounce config ready for the coordinator. */
2
+ export interface NormalizedDebounceConfig {
3
+ keyExpression: string;
4
+ mode: "leading" | "trailing";
5
+ delayMs: number;
6
+ maxDelayMs?: number;
7
+ }
8
+ /** Parsed, normalized scheduling config ready for the gates. */
9
+ export interface NormalizedSchedulingConfig {
10
+ /** Delay in ms; undefined when no delay configured. */
11
+ delayMs?: number;
12
+ /** TTL in ms; undefined when no TTL configured. */
13
+ ttlMs?: number;
14
+ /** Debounce config; undefined when no debounce configured. */
15
+ debounce?: NormalizedDebounceConfig;
16
+ }
17
+ /**
18
+ * Read a workflow's trigger config and return the normalized scheduling
19
+ * config, or null when the workflow has no scheduling gates.
20
+ */
21
+ export declare function readSchedulingConfig(trigger: Record<string, unknown> | undefined | null): NormalizedSchedulingConfig | null;
22
+ export declare const SCHEDULING_DEFAULTS: {
23
+ readonly debounceMode: "trailing";
24
+ };
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Tier 2 #5 + #7 — extract scheduling config from a workflow's trigger
3
+ * block, regardless of which trigger type owns it (HTTP, Worker, …).
4
+ *
5
+ * Returns `null` when the trigger has NO scheduling fields set. The
6
+ * caller (`TriggerBase.run()`) treats null as "skip the gates, run the
7
+ * workflow synchronously" — zero-overhead default.
8
+ *
9
+ * Upfront duration parsing converts `"1h"` → `3600000` so downstream
10
+ * code only deals in milliseconds. Invalid duration values are dropped
11
+ * (treated as if the field were unset) — this is fail-open by design,
12
+ * matching `idempotencyKey` semantics. Use `BLOK_MAPPER_MODE=strict`
13
+ * for fail-fast behavior in production (handled at the trigger config
14
+ * validation layer, not here).
15
+ */
16
+ import { tryParseDuration } from "@blokjs/helper";
17
+ const SCHEDULING_TRIGGER_KEYS = ["http", "worker"];
18
+ /**
19
+ * Read a workflow's trigger config and return the normalized scheduling
20
+ * config, or null when the workflow has no scheduling gates.
21
+ */
22
+ export function readSchedulingConfig(trigger) {
23
+ if (!trigger)
24
+ return null;
25
+ for (const triggerKey of SCHEDULING_TRIGGER_KEYS) {
26
+ const cfg = trigger[triggerKey];
27
+ if (!cfg)
28
+ continue;
29
+ const delayMs = cfg.delay !== undefined ? (tryParseDuration(cfg.delay) ?? undefined) : undefined;
30
+ const ttlMs = cfg.ttl !== undefined ? (tryParseDuration(cfg.ttl) ?? undefined) : undefined;
31
+ let debounce;
32
+ if (cfg.debounce && typeof cfg.debounce === "object") {
33
+ const d = cfg.debounce;
34
+ const keyExpression = typeof d.key === "string" ? d.key.trim() : "";
35
+ const dDelayMs = d.delay !== undefined ? (tryParseDuration(d.delay) ?? undefined) : undefined;
36
+ if (keyExpression && dDelayMs !== undefined && dDelayMs >= 0) {
37
+ const mode = d.mode === "leading" ? "leading" : "trailing";
38
+ const maxDelayMs = d.maxDelay !== undefined ? (tryParseDuration(d.maxDelay) ?? undefined) : undefined;
39
+ debounce = { keyExpression, mode, delayMs: dDelayMs, maxDelayMs };
40
+ }
41
+ }
42
+ const hasAny = delayMs !== undefined || ttlMs !== undefined || debounce !== undefined;
43
+ if (hasAny) {
44
+ return { delayMs, ttlMs, debounce };
45
+ }
46
+ }
47
+ return null;
48
+ }
49
+ export const SCHEDULING_DEFAULTS = {
50
+ debounceMode: "trailing",
51
+ };
52
+ //# sourceMappingURL=readSchedulingConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readSchedulingConfig.js","sourceRoot":"","sources":["../../src/scheduling/readSchedulingConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAU,CAAC;AAiC5D;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CACnC,OAAmD;IAEnD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,KAAK,MAAM,UAAU,IAAI,uBAAuB,EAAE,CAAC;QAClD,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAA8B,CAAC;QAC7D,IAAI,CAAC,GAAG;YAAE,SAAS;QAEnB,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACjG,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAE3F,IAAI,QAA8C,CAAC;QACnD,IAAI,GAAG,CAAC,QAAQ,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACtD,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC;YACvB,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpE,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC9F,IAAI,aAAa,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;gBAC9D,MAAM,IAAI,GAA2B,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;gBACnF,MAAM,UAAU,GAAG,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACtG,QAAQ,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;YACnE,CAAC;QACF,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,CAAC;QACtF,IAAI,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QACrC,CAAC;IACF,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG;IAClC,YAAY,EAAE,UAAmB;CACxB,CAAC"}
@@ -4,13 +4,17 @@ import { TestLogger } from "./TestLogger";
4
4
  /**
5
5
  * A mock node implementation wrapping a user-provided handler function.
6
6
  */
7
+ // biome-ignore lint/suspicious/noExplicitAny: mock node needs generic any for test flexibility
7
8
  class MockNode extends BlokService {
9
+ // biome-ignore lint/suspicious/noExplicitAny: mock handler accepts arbitrary inputs/outputs
8
10
  handler;
11
+ // biome-ignore lint/suspicious/noExplicitAny: mock handler accepts arbitrary inputs/outputs
9
12
  constructor(name, handler) {
10
13
  super();
11
14
  this.name = name;
12
15
  this.handler = handler;
13
16
  }
17
+ // biome-ignore lint/suspicious/noExplicitAny: matches BlokService.handle signature
14
18
  async handle(ctx, inputs) {
15
19
  const response = new BlokResponse();
16
20
  try {
@@ -73,9 +77,11 @@ class AutoMockNode extends MockNode {
73
77
  */
74
78
  export class WorkflowTestRunner {
75
79
  config;
80
+ // biome-ignore lint/suspicious/noExplicitAny: node registry holds heterogeneous node types
76
81
  nodes;
77
82
  workflow;
78
83
  trace;
84
+ // biome-ignore lint/suspicious/noExplicitAny: test results hold arbitrary data
79
85
  nodeResults;
80
86
  constructor(config) {
81
87
  this.config = {
@@ -94,8 +100,10 @@ export class WorkflowTestRunner {
94
100
  * @param name - The node name as referenced in the workflow steps
95
101
  * @param node - A BlokService instance or a FunctionNode from defineNode()
96
102
  */
103
+ // biome-ignore lint/suspicious/noExplicitAny: accepts heterogeneous node types for test flexibility
97
104
  registerNode(name, node) {
98
105
  node.name = name;
106
+ // biome-ignore lint/suspicious/noExplicitAny: cast required for heterogeneous node storage
99
107
  this.nodes.set(name, node);
100
108
  if (this.config.verbose) {
101
109
  console.log(`[WorkflowTestRunner] Registered node: ${name}`);
@@ -110,6 +118,7 @@ export class WorkflowTestRunner {
110
118
  * @param name - The node name as referenced in the workflow steps
111
119
  * @param handler - Async function that receives (input, ctx) and returns output
112
120
  */
121
+ // biome-ignore lint/suspicious/noExplicitAny: mock handler accepts arbitrary inputs/outputs
113
122
  mockNode(name, handler) {
114
123
  const mockNodeInstance = new MockNode(name, handler);
115
124
  this.nodes.set(name, mockNodeInstance);
@@ -154,6 +163,7 @@ export class WorkflowTestRunner {
154
163
  * @returns WorkflowTestResult with output, trace, and per-node results
155
164
  * @throws Error if no workflow is loaded or if a required node is not registered
156
165
  */
166
+ // biome-ignore lint/suspicious/noExplicitAny: test utility accepts arbitrary input data
157
167
  async execute(input, options) {
158
168
  if (!this.workflow) {
159
169
  throw new Error("No workflow loaded. Call loadWorkflow() first.");
@@ -189,6 +199,7 @@ export class WorkflowTestRunner {
189
199
  _PRIVATE_: {},
190
200
  };
191
201
  let workflowSuccess = true;
202
+ // biome-ignore lint/suspicious/noExplicitAny: error can be any type
192
203
  let workflowError = null;
193
204
  // Create a timeout promise
194
205
  const timeoutPromise = new Promise((_, reject) => {
@@ -312,6 +323,7 @@ export class WorkflowTestRunner {
312
323
  if (step.set_var) {
313
324
  if (!ctx.vars)
314
325
  ctx.vars = {};
326
+ // biome-ignore lint/suspicious/noExplicitAny: vars hold arbitrary workflow data
315
327
  ctx.vars[step.name] = response.data;
316
328
  }
317
329
  traceEntry.success = true;
@@ -1 +1 @@
1
- {"version":3,"file":"WorkflowTestRunner.js","sourceRoot":"","sources":["../../src/testing/WorkflowTestRunner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WorkflowTestRunner.js","sourceRoot":"","sources":["../../src/testing/WorkflowTestRunner.ts"],"names":[],"mappings":"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"}