@blokjs/runner 0.4.0 → 0.6.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.
- package/dist/Blok.js +32 -3
- package/dist/Blok.js.map +1 -1
- package/dist/Configuration.d.ts +41 -5
- package/dist/Configuration.js +215 -92
- package/dist/Configuration.js.map +1 -1
- package/dist/ForEachNode.d.ts +59 -0
- package/dist/ForEachNode.js +522 -0
- package/dist/ForEachNode.js.map +1 -0
- package/dist/LoopMaxIterationsError.d.ts +11 -0
- package/dist/LoopMaxIterationsError.js +18 -0
- package/dist/LoopMaxIterationsError.js.map +1 -0
- package/dist/LoopNode.d.ts +36 -0
- package/dist/LoopNode.js +182 -0
- package/dist/LoopNode.js.map +1 -0
- package/dist/Runner.d.ts +11 -1
- package/dist/Runner.js +9 -2
- package/dist/Runner.js.map +1 -1
- package/dist/RunnerSteps.js +419 -112
- package/dist/RunnerSteps.js.map +1 -1
- package/dist/RuntimeAdapterNode.d.ts +2 -1
- package/dist/RuntimeAdapterNode.js +2 -2
- package/dist/RuntimeAdapterNode.js.map +1 -1
- package/dist/RuntimeRegistry.d.ts +23 -2
- package/dist/RuntimeRegistry.js +31 -2
- package/dist/RuntimeRegistry.js.map +1 -1
- package/dist/SubworkflowNode.d.ts +106 -0
- package/dist/SubworkflowNode.js +261 -3
- package/dist/SubworkflowNode.js.map +1 -1
- package/dist/SwitchNode.d.ts +37 -0
- package/dist/SwitchNode.js +153 -0
- package/dist/SwitchNode.js.map +1 -0
- package/dist/TriggerBase.d.ts +50 -0
- package/dist/TriggerBase.js +262 -4
- package/dist/TriggerBase.js.map +1 -1
- package/dist/TryCatchNode.d.ts +32 -0
- package/dist/TryCatchNode.js +207 -0
- package/dist/TryCatchNode.js.map +1 -0
- package/dist/adapters/grpc/GrpcCodec.js +2 -2
- package/dist/adapters/grpc/GrpcRuntimeAdapter.d.ts +6 -4
- package/dist/adapters/grpc/GrpcRuntimeAdapter.js +6 -4
- package/dist/adapters/grpc/GrpcRuntimeAdapter.js.map +1 -1
- package/dist/adapters/grpc/types.d.ts +7 -5
- package/dist/adapters/grpc/types.js.map +1 -1
- package/dist/adapters/transport.d.ts +12 -41
- package/dist/adapters/transport.js +21 -70
- package/dist/adapters/transport.js.map +1 -1
- package/dist/cache/NodeResultCache.js +7 -0
- package/dist/cache/NodeResultCache.js.map +1 -1
- package/dist/concurrency/NatsKvConcurrencyBackend.js +18 -5
- package/dist/concurrency/NatsKvConcurrencyBackend.js.map +1 -1
- package/dist/concurrency/RedisConcurrencyBackend.d.ts +64 -0
- package/dist/concurrency/RedisConcurrencyBackend.js +374 -0
- package/dist/concurrency/RedisConcurrencyBackend.js.map +1 -0
- package/dist/concurrency/createConcurrencyBackend.d.ts +1 -0
- package/dist/concurrency/createConcurrencyBackend.js +5 -1
- package/dist/concurrency/createConcurrencyBackend.js.map +1 -1
- package/dist/defineNode.d.ts +8 -0
- package/dist/defineNode.js +25 -5
- package/dist/defineNode.js.map +1 -1
- package/dist/graphql/GraphQLSchemaGenerator.js +1 -1
- package/dist/graphql/GraphQLSchemaGenerator.js.map +1 -1
- package/dist/index.d.ts +10 -6
- package/dist/index.js +13 -9
- package/dist/index.js.map +1 -1
- package/dist/marketplace/RuntimeCatalog.d.ts +6 -0
- package/dist/marketplace/RuntimeCatalog.js.map +1 -1
- package/dist/marketplace/RuntimeDiscovery.d.ts +2 -2
- package/dist/marketplace/RuntimeDiscovery.js +18 -6
- package/dist/marketplace/RuntimeDiscovery.js.map +1 -1
- package/dist/monitoring/ConcurrencyMetrics.d.ts +26 -0
- package/dist/monitoring/ConcurrencyMetrics.js +36 -4
- package/dist/monitoring/ConcurrencyMetrics.js.map +1 -1
- package/dist/monitoring/ForEachWaitMetrics.d.ts +22 -0
- package/dist/monitoring/ForEachWaitMetrics.js +36 -0
- package/dist/monitoring/ForEachWaitMetrics.js.map +1 -0
- package/dist/openapi/OpenAPIGenerator.js +7 -2
- package/dist/openapi/OpenAPIGenerator.js.map +1 -1
- package/dist/runtime/PrimitiveStack.d.ts +64 -0
- package/dist/runtime/PrimitiveStack.js +92 -0
- package/dist/runtime/PrimitiveStack.js.map +1 -0
- package/dist/scheduling/DebounceBackend.d.ts +108 -0
- package/dist/scheduling/DebounceBackend.js +23 -0
- package/dist/scheduling/DebounceBackend.js.map +1 -0
- package/dist/scheduling/DebounceCoordinator.d.ts +65 -12
- package/dist/scheduling/DebounceCoordinator.js +234 -13
- package/dist/scheduling/DebounceCoordinator.js.map +1 -1
- package/dist/scheduling/DeferredRunScheduler.d.ts +28 -0
- package/dist/scheduling/DeferredRunScheduler.js +105 -3
- package/dist/scheduling/DeferredRunScheduler.js.map +1 -1
- package/dist/scheduling/NatsKvDebounceBackend.d.ts +53 -0
- package/dist/scheduling/NatsKvDebounceBackend.js +334 -0
- package/dist/scheduling/NatsKvDebounceBackend.js.map +1 -0
- package/dist/scheduling/RedisDebounceBackend.d.ts +49 -0
- package/dist/scheduling/RedisDebounceBackend.js +356 -0
- package/dist/scheduling/RedisDebounceBackend.js.map +1 -0
- package/dist/scheduling/createDebounceBackend.d.ts +25 -0
- package/dist/scheduling/createDebounceBackend.js +39 -0
- package/dist/scheduling/createDebounceBackend.js.map +1 -0
- package/dist/security/AuditLogger.js +1 -1
- package/dist/security/AuditLogger.js.map +1 -1
- package/dist/security/AuthMiddleware.d.ts +19 -20
- package/dist/security/AuthMiddleware.js +35 -20
- package/dist/security/AuthMiddleware.js.map +1 -1
- package/dist/security/OAuthProvider.js +2 -2
- package/dist/security/OAuthProvider.js.map +1 -1
- package/dist/security/SecretManager.js +14 -13
- package/dist/security/SecretManager.js.map +1 -1
- package/dist/security/index.d.ts +3 -1
- package/dist/security/index.js +3 -1
- package/dist/security/index.js.map +1 -1
- package/dist/testing/TestHarness.d.ts +27 -12
- package/dist/testing/TestHarness.js +19 -3
- package/dist/testing/TestHarness.js.map +1 -1
- package/dist/testing/WorkflowTestRunner.js +0 -7
- package/dist/testing/WorkflowTestRunner.js.map +1 -1
- package/dist/tracing/InMemoryRunStore.d.ts +14 -1
- package/dist/tracing/InMemoryRunStore.js +95 -6
- package/dist/tracing/InMemoryRunStore.js.map +1 -1
- package/dist/tracing/PostgresRunStore.d.ts +28 -2
- package/dist/tracing/PostgresRunStore.js +276 -3
- package/dist/tracing/PostgresRunStore.js.map +1 -1
- package/dist/tracing/RoutingDiagnostics.d.ts +55 -0
- package/dist/tracing/RoutingDiagnostics.js +50 -0
- package/dist/tracing/RoutingDiagnostics.js.map +1 -0
- package/dist/tracing/RunStore.d.ts +82 -1
- package/dist/tracing/RunTracker.d.ts +7 -1
- package/dist/tracing/RunTracker.js +23 -0
- package/dist/tracing/RunTracker.js.map +1 -1
- package/dist/tracing/SqliteRunStore.d.ts +57 -2
- package/dist/tracing/SqliteRunStore.js +408 -48
- package/dist/tracing/SqliteRunStore.js.map +1 -1
- package/dist/tracing/TraceRouter.js +380 -18
- package/dist/tracing/TraceRouter.js.map +1 -1
- package/dist/tracing/createStore.js +14 -3
- package/dist/tracing/createStore.js.map +1 -1
- package/dist/tracing/metadataFilter.d.ts +63 -0
- package/dist/tracing/metadataFilter.js +224 -0
- package/dist/tracing/metadataFilter.js.map +1 -0
- package/dist/tracing/types.d.ts +331 -7
- package/dist/utils/envAllowlist.d.ts +35 -0
- package/dist/utils/envAllowlist.js +113 -0
- package/dist/utils/envAllowlist.js.map +1 -0
- package/dist/version/RuntimeVersionValidator.d.ts +38 -0
- package/dist/version/RuntimeVersionValidator.js +121 -0
- package/dist/version/RuntimeVersionValidator.js.map +1 -0
- package/dist/visualization/WorkflowVisualizer.js +4 -4
- package/dist/visualization/WorkflowVisualizer.js.map +1 -1
- package/dist/workflow/PersistenceHelper.d.ts +18 -10
- package/dist/workflow/PersistenceHelper.js +35 -9
- package/dist/workflow/PersistenceHelper.js.map +1 -1
- package/dist/workflow/WorkflowNormalizer.d.ts +19 -1
- package/dist/workflow/WorkflowNormalizer.js +469 -19
- package/dist/workflow/WorkflowNormalizer.js.map +1 -1
- package/dist/workflow/WorkflowRegistry.d.ts +122 -0
- package/dist/workflow/WorkflowRegistry.js +121 -0
- package/dist/workflow/WorkflowRegistry.js.map +1 -1
- package/dist/workflow/sampleBody.d.ts +54 -0
- package/dist/workflow/sampleBody.js +320 -0
- package/dist/workflow/sampleBody.js.map +1 -0
- package/package.json +3 -8
- package/dist/adapters/HttpRuntimeAdapter.d.ts +0 -79
- package/dist/adapters/HttpRuntimeAdapter.js +0 -233
- package/dist/adapters/HttpRuntimeAdapter.js.map +0 -1
|
@@ -15,8 +15,40 @@
|
|
|
15
15
|
* an exporter).
|
|
16
16
|
*/
|
|
17
17
|
import { metrics } from "@opentelemetry/api";
|
|
18
|
+
/**
|
|
19
|
+
* D6 (v0.6) — read the per-key opt-in env var. `concurrency_key` is
|
|
20
|
+
* potentially high-cardinality (per-user, per-tenant, …); emitting it as
|
|
21
|
+
* a metric label by default risks a cardinality explosion in any
|
|
22
|
+
* non-trivial deployment. Default OFF: strip the key before emission so
|
|
23
|
+
* counters stay bucketed by `workflow_name` alone. Opt in to per-key
|
|
24
|
+
* granularity with `BLOK_METRICS_PER_KEY=1` (or `=true`).
|
|
25
|
+
*
|
|
26
|
+
* Exported for test reuse (the strip helper below).
|
|
27
|
+
*/
|
|
28
|
+
export function isPerKeyMetricsEnabled() {
|
|
29
|
+
const raw = process.env.BLOK_METRICS_PER_KEY;
|
|
30
|
+
return raw === "1" || raw === "true";
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Pure helper — strips `concurrency_key` from a copy of `attrs` when
|
|
34
|
+
* per-key emission is disabled. Returns the original reference when
|
|
35
|
+
* enabled (no allocation on the hot path).
|
|
36
|
+
*/
|
|
37
|
+
export function filterPerKeyAttrs(attrs, enabled) {
|
|
38
|
+
if (enabled || attrs.concurrency_key === undefined)
|
|
39
|
+
return attrs;
|
|
40
|
+
const { concurrency_key: _omitted, ...rest } = attrs;
|
|
41
|
+
return rest;
|
|
42
|
+
}
|
|
18
43
|
export class ConcurrencyMetrics {
|
|
19
44
|
static instance = null;
|
|
45
|
+
/**
|
|
46
|
+
* Captured at construction time — the constructor is private + the
|
|
47
|
+
* singleton is only reset in tests, so this stays stable for the
|
|
48
|
+
* lifetime of a process. Tests that toggle the env var call
|
|
49
|
+
* `resetInstance()` before re-`getInstance()` to pick up the flip.
|
|
50
|
+
*/
|
|
51
|
+
perKeyEnabled = isPerKeyMetricsEnabled();
|
|
20
52
|
acquiredCounter = metrics.getMeter("blok").createCounter("blok_concurrency_acquired_total", {
|
|
21
53
|
description: "Total concurrency slots acquired (per workflow + key).",
|
|
22
54
|
unit: "1",
|
|
@@ -78,13 +110,13 @@ export class ConcurrencyMetrics {
|
|
|
78
110
|
ConcurrencyMetrics.instance = null;
|
|
79
111
|
}
|
|
80
112
|
recordAcquired(attrs) {
|
|
81
|
-
this.acquiredCounter.add(1, attrs);
|
|
113
|
+
this.acquiredCounter.add(1, filterPerKeyAttrs(attrs, this.perKeyEnabled));
|
|
82
114
|
}
|
|
83
115
|
recordDenied(attrs) {
|
|
84
|
-
this.deniedCounter.add(1, attrs);
|
|
116
|
+
this.deniedCounter.add(1, filterPerKeyAttrs(attrs, this.perKeyEnabled));
|
|
85
117
|
}
|
|
86
118
|
recordReleased(attrs) {
|
|
87
|
-
this.releasedCounter.add(1, attrs);
|
|
119
|
+
this.releasedCounter.add(1, filterPerKeyAttrs(attrs, this.perKeyEnabled));
|
|
88
120
|
}
|
|
89
121
|
recordDispatchRecovered(attrs) {
|
|
90
122
|
this.dispatchRecoveredCounter.add(1, attrs);
|
|
@@ -101,7 +133,7 @@ export class ConcurrencyMetrics {
|
|
|
101
133
|
}
|
|
102
134
|
// PR 3 D2 — OCC retry depth + outcome (success | denied | fail-closed).
|
|
103
135
|
recordOccRetries(attrs, attempts) {
|
|
104
|
-
this.occRetriesHistogram.record(attempts, attrs);
|
|
136
|
+
this.occRetriesHistogram.record(attempts, filterPerKeyAttrs(attrs, this.perKeyEnabled));
|
|
105
137
|
}
|
|
106
138
|
}
|
|
107
139
|
//# sourceMappingURL=ConcurrencyMetrics.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConcurrencyMetrics.js","sourceRoot":"","sources":["../../src/monitoring/ConcurrencyMetrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAa7C,MAAM,OAAO,kBAAkB;IACtB,MAAM,CAAC,QAAQ,GAA8B,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"ConcurrencyMetrics.js","sourceRoot":"","sources":["../../src/monitoring/ConcurrencyMetrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v0.6 Phase 3 — OTel counter for parallel forEach + wait observability.
|
|
3
|
+
* Incremented at cursor-write time with the count of iterations
|
|
4
|
+
* cancelled because a peer fired a wait. Lets ops dashboards spot
|
|
5
|
+
* workflows that frequently waste work on cancel + re-launch — usually
|
|
6
|
+
* a signal that the author should switch to sequential forEach OR add
|
|
7
|
+
* `idempotencyKey` to inner steps so the re-launches are cache hits.
|
|
8
|
+
*
|
|
9
|
+
* Singleton, lazy-instantiated. No-ops cleanly when OTel isn't
|
|
10
|
+
* configured (the meter API silently swallows recordings without an
|
|
11
|
+
* exporter).
|
|
12
|
+
*/
|
|
13
|
+
export declare class ForEachWaitMetrics {
|
|
14
|
+
private static instance;
|
|
15
|
+
private readonly cancelledCounter;
|
|
16
|
+
static getInstance(): ForEachWaitMetrics;
|
|
17
|
+
static resetInstance(): void;
|
|
18
|
+
recordCancellation(opts: {
|
|
19
|
+
workflowName: string;
|
|
20
|
+
cancelledCount: number;
|
|
21
|
+
}): void;
|
|
22
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v0.6 Phase 3 — OTel counter for parallel forEach + wait observability.
|
|
3
|
+
* Incremented at cursor-write time with the count of iterations
|
|
4
|
+
* cancelled because a peer fired a wait. Lets ops dashboards spot
|
|
5
|
+
* workflows that frequently waste work on cancel + re-launch — usually
|
|
6
|
+
* a signal that the author should switch to sequential forEach OR add
|
|
7
|
+
* `idempotencyKey` to inner steps so the re-launches are cache hits.
|
|
8
|
+
*
|
|
9
|
+
* Singleton, lazy-instantiated. No-ops cleanly when OTel isn't
|
|
10
|
+
* configured (the meter API silently swallows recordings without an
|
|
11
|
+
* exporter).
|
|
12
|
+
*/
|
|
13
|
+
import { metrics } from "@opentelemetry/api";
|
|
14
|
+
export class ForEachWaitMetrics {
|
|
15
|
+
static instance = null;
|
|
16
|
+
cancelledCounter = metrics.getMeter("blok").createCounter("blok_foreach_wait_cancelled_total", {
|
|
17
|
+
description: "Iterations cancelled because a peer fired a wait inside a parallel forEach. High values signal authors should add idempotencyKey to inner steps.",
|
|
18
|
+
unit: "1",
|
|
19
|
+
});
|
|
20
|
+
static getInstance() {
|
|
21
|
+
if (!ForEachWaitMetrics.instance) {
|
|
22
|
+
ForEachWaitMetrics.instance = new ForEachWaitMetrics();
|
|
23
|
+
}
|
|
24
|
+
return ForEachWaitMetrics.instance;
|
|
25
|
+
}
|
|
26
|
+
static resetInstance() {
|
|
27
|
+
ForEachWaitMetrics.instance = null;
|
|
28
|
+
}
|
|
29
|
+
recordCancellation(opts) {
|
|
30
|
+
if (opts.cancelledCount <= 0)
|
|
31
|
+
return;
|
|
32
|
+
const attrs = { workflow_name: opts.workflowName };
|
|
33
|
+
this.cancelledCounter.add(opts.cancelledCount, attrs);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=ForEachWaitMetrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ForEachWaitMetrics.js","sourceRoot":"","sources":["../../src/monitoring/ForEachWaitMetrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAmB,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE9D,MAAM,OAAO,kBAAkB;IACtB,MAAM,CAAC,QAAQ,GAA8B,IAAI,CAAC;IAEzC,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,mCAAmC,EAAE;QAC/G,WAAW,EACV,kJAAkJ;QACnJ,IAAI,EAAE,GAAG;KACT,CAAC,CAAC;IAEH,MAAM,CAAC,WAAW;QACjB,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC;YAClC,kBAAkB,CAAC,QAAQ,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACxD,CAAC;QACD,OAAO,kBAAkB,CAAC,QAAQ,CAAC;IACpC,CAAC;IAED,MAAM,CAAC,aAAa;QACnB,kBAAkB,CAAC,QAAQ,GAAG,IAAI,CAAC;IACpC,CAAC;IAED,kBAAkB,CAAC,IAAsD;QACxE,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC;YAAE,OAAO;QACrC,MAAM,KAAK,GAAe,EAAE,aAAa,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;QAC/D,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACvD,CAAC"}
|
|
@@ -180,7 +180,12 @@ export class OpenAPIGenerator {
|
|
|
180
180
|
return this.jsonToYaml(spec);
|
|
181
181
|
}
|
|
182
182
|
buildOperation(workflow) {
|
|
183
|
+
// Caller (`generate()`) only invokes `buildOperation` for workflows
|
|
184
|
+
// that have an http trigger; defensive check keeps the type exact.
|
|
183
185
|
const httpTrigger = workflow.trigger.http;
|
|
186
|
+
if (!httpTrigger) {
|
|
187
|
+
throw new Error(`[OpenAPIGenerator] workflow "${workflow.name}" has no http trigger — cannot build operation`);
|
|
188
|
+
}
|
|
184
189
|
const method = (httpTrigger.method || "GET").toUpperCase();
|
|
185
190
|
const tag = this.inferTag(workflow);
|
|
186
191
|
const operation = {
|
|
@@ -219,7 +224,7 @@ export class OpenAPIGenerator {
|
|
|
219
224
|
// Extract path parameters
|
|
220
225
|
const pathParams = this.extractPathParams(httpTrigger.path);
|
|
221
226
|
for (const param of pathParams) {
|
|
222
|
-
operation.parameters
|
|
227
|
+
operation.parameters?.push({
|
|
223
228
|
name: param,
|
|
224
229
|
in: "path",
|
|
225
230
|
required: true,
|
|
@@ -238,7 +243,7 @@ export class OpenAPIGenerator {
|
|
|
238
243
|
};
|
|
239
244
|
}
|
|
240
245
|
// Add requestId query parameter
|
|
241
|
-
operation.parameters
|
|
246
|
+
operation.parameters?.push({
|
|
242
247
|
name: "requestId",
|
|
243
248
|
in: "query",
|
|
244
249
|
required: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAPIGenerator.js","sourceRoot":"","sources":["../../src/openapi/OpenAPIGenerator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OpenAPIGenerator.js","sourceRoot":"","sources":["../../src/openapi/OpenAPIGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PrimitiveStack — v0.6 Phase 4 — runtime call stack of active
|
|
3
|
+
* primitives (forEach, loop, switch) currently executing a sub-
|
|
4
|
+
* pipeline.
|
|
5
|
+
*
|
|
6
|
+
* The Phase 1-3 single-slot machinery (`_blokActivePrimitiveNodeRunId`,
|
|
7
|
+
* `_blokForEachCurrentIteration`, `_blokForEachPartialResults`)
|
|
8
|
+
* could only track ONE primitive at a time. That's fine for
|
|
9
|
+
* `forEach > wait` and `loop > wait`, but the moment a wait fires
|
|
10
|
+
* inside `forEach > forEach > wait` (or `switch > forEach > wait`,
|
|
11
|
+
* etc.) the inner primitive overwrites the outer's sentinels —
|
|
12
|
+
* only the inner cursor lands in `node_runs.iteration_context`, and
|
|
13
|
+
* the outer primitive resumes from iteration 0 instead of iteration
|
|
14
|
+
* N. Phase 4 replaces the single-slot model with this stack so each
|
|
15
|
+
* primitive writes its own NodeRun's cursor frame on wait-throw.
|
|
16
|
+
*
|
|
17
|
+
* Mechanics:
|
|
18
|
+
*
|
|
19
|
+
* - **Each primitive pushes a frame on entry, pops in finally.**
|
|
20
|
+
* `cursor` is an `IterationContext` whose discriminator (`mode`)
|
|
21
|
+
* tells the persistence + resume code paths what shape to expect
|
|
22
|
+
* ("sequential" / "parallel" / "switch").
|
|
23
|
+
* - **The primitive owns the cursor's iteration/case state.** It
|
|
24
|
+
* updates `frame.cursor.iteration` (forEach/loop) or
|
|
25
|
+
* `frame.cursor.caseIndex` (switch) and
|
|
26
|
+
* `frame.cursor.completedResults` as the sub-pipeline progresses.
|
|
27
|
+
* - **RunnerSteps owns the inner-step cursor.** At each step
|
|
28
|
+
* boundary inside a deep runSteps, the runner sets the TOP
|
|
29
|
+
* frame's `cursor.innerStepIndex = i` so a wait fired at that step
|
|
30
|
+
* gets the right cursor written.
|
|
31
|
+
* - **The wait-throw site walks the whole stack** and persists each
|
|
32
|
+
* frame to its respective NodeRun. On resume, every primitive
|
|
33
|
+
* looks itself up by NodeRun id in the rehydrated cursor map
|
|
34
|
+
* (see `_blokIterationCursors` populated by `TriggerBase.run`).
|
|
35
|
+
*
|
|
36
|
+
* The stack lives on `ctx._blokPrimitiveStack` so the per-iteration
|
|
37
|
+
* child-ctx shallow spread inside ForEachNode / LoopNode / SwitchNode
|
|
38
|
+
* preserves the reference; pushes from a nested primitive are visible
|
|
39
|
+
* to the outer runSteps because they share the array.
|
|
40
|
+
*/
|
|
41
|
+
import type { Context } from "@blokjs/shared";
|
|
42
|
+
import type { IterationContext } from "../tracing/types";
|
|
43
|
+
export interface PrimitiveStackFrame {
|
|
44
|
+
/** NodeRun id of the primitive that owns this frame. */
|
|
45
|
+
nodeRunId: string;
|
|
46
|
+
/** Iteration / case cursor — mutated in place as the sub-pipeline progresses. */
|
|
47
|
+
cursor: IterationContext;
|
|
48
|
+
}
|
|
49
|
+
export declare function getPrimitiveStack(ctx: Context): PrimitiveStackFrame[];
|
|
50
|
+
export declare function pushPrimitiveFrame(ctx: Context, frame: PrimitiveStackFrame): void;
|
|
51
|
+
export declare function popPrimitiveFrame(ctx: Context): PrimitiveStackFrame | undefined;
|
|
52
|
+
export declare function peekPrimitiveFrame(ctx: Context): PrimitiveStackFrame | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* Read the cursor stamped onto `ctx._blokIterationCursors` for the
|
|
55
|
+
* given primitive step name. The map is keyed by step NAME (not
|
|
56
|
+
* NodeRun id) because NodeRun ids change on every dispatchDeferred
|
|
57
|
+
* re-entry while step names are stable. Returns `undefined` when no
|
|
58
|
+
* cursor was rehydrated (fresh run, no waits, sibling primitive).
|
|
59
|
+
* After successful resume, primitives should call
|
|
60
|
+
* {@link consumeRehydratedCursor} to clear the entry so sibling
|
|
61
|
+
* primitives later in the workflow don't accidentally re-resume.
|
|
62
|
+
*/
|
|
63
|
+
export declare function readRehydratedCursor(ctx: Context, stepName: string): IterationContext | undefined;
|
|
64
|
+
export declare function consumeRehydratedCursor(ctx: Context, stepName: string): void;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PrimitiveStack — v0.6 Phase 4 — runtime call stack of active
|
|
3
|
+
* primitives (forEach, loop, switch) currently executing a sub-
|
|
4
|
+
* pipeline.
|
|
5
|
+
*
|
|
6
|
+
* The Phase 1-3 single-slot machinery (`_blokActivePrimitiveNodeRunId`,
|
|
7
|
+
* `_blokForEachCurrentIteration`, `_blokForEachPartialResults`)
|
|
8
|
+
* could only track ONE primitive at a time. That's fine for
|
|
9
|
+
* `forEach > wait` and `loop > wait`, but the moment a wait fires
|
|
10
|
+
* inside `forEach > forEach > wait` (or `switch > forEach > wait`,
|
|
11
|
+
* etc.) the inner primitive overwrites the outer's sentinels —
|
|
12
|
+
* only the inner cursor lands in `node_runs.iteration_context`, and
|
|
13
|
+
* the outer primitive resumes from iteration 0 instead of iteration
|
|
14
|
+
* N. Phase 4 replaces the single-slot model with this stack so each
|
|
15
|
+
* primitive writes its own NodeRun's cursor frame on wait-throw.
|
|
16
|
+
*
|
|
17
|
+
* Mechanics:
|
|
18
|
+
*
|
|
19
|
+
* - **Each primitive pushes a frame on entry, pops in finally.**
|
|
20
|
+
* `cursor` is an `IterationContext` whose discriminator (`mode`)
|
|
21
|
+
* tells the persistence + resume code paths what shape to expect
|
|
22
|
+
* ("sequential" / "parallel" / "switch").
|
|
23
|
+
* - **The primitive owns the cursor's iteration/case state.** It
|
|
24
|
+
* updates `frame.cursor.iteration` (forEach/loop) or
|
|
25
|
+
* `frame.cursor.caseIndex` (switch) and
|
|
26
|
+
* `frame.cursor.completedResults` as the sub-pipeline progresses.
|
|
27
|
+
* - **RunnerSteps owns the inner-step cursor.** At each step
|
|
28
|
+
* boundary inside a deep runSteps, the runner sets the TOP
|
|
29
|
+
* frame's `cursor.innerStepIndex = i` so a wait fired at that step
|
|
30
|
+
* gets the right cursor written.
|
|
31
|
+
* - **The wait-throw site walks the whole stack** and persists each
|
|
32
|
+
* frame to its respective NodeRun. On resume, every primitive
|
|
33
|
+
* looks itself up by NodeRun id in the rehydrated cursor map
|
|
34
|
+
* (see `_blokIterationCursors` populated by `TriggerBase.run`).
|
|
35
|
+
*
|
|
36
|
+
* The stack lives on `ctx._blokPrimitiveStack` so the per-iteration
|
|
37
|
+
* child-ctx shallow spread inside ForEachNode / LoopNode / SwitchNode
|
|
38
|
+
* preserves the reference; pushes from a nested primitive are visible
|
|
39
|
+
* to the outer runSteps because they share the array.
|
|
40
|
+
*/
|
|
41
|
+
const STACK_KEY = "_blokPrimitiveStack";
|
|
42
|
+
export function getPrimitiveStack(ctx) {
|
|
43
|
+
const stack = ctx[STACK_KEY];
|
|
44
|
+
if (Array.isArray(stack))
|
|
45
|
+
return stack;
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
export function pushPrimitiveFrame(ctx, frame) {
|
|
49
|
+
const ctxAny = ctx;
|
|
50
|
+
let stack = ctxAny[STACK_KEY];
|
|
51
|
+
if (!Array.isArray(stack)) {
|
|
52
|
+
stack = [];
|
|
53
|
+
ctxAny[STACK_KEY] = stack;
|
|
54
|
+
}
|
|
55
|
+
stack.push(frame);
|
|
56
|
+
}
|
|
57
|
+
export function popPrimitiveFrame(ctx) {
|
|
58
|
+
const ctxAny = ctx;
|
|
59
|
+
const stack = ctxAny[STACK_KEY];
|
|
60
|
+
if (!Array.isArray(stack) || stack.length === 0)
|
|
61
|
+
return undefined;
|
|
62
|
+
return stack.pop();
|
|
63
|
+
}
|
|
64
|
+
export function peekPrimitiveFrame(ctx) {
|
|
65
|
+
const stack = getPrimitiveStack(ctx);
|
|
66
|
+
if (stack.length === 0)
|
|
67
|
+
return undefined;
|
|
68
|
+
return stack[stack.length - 1];
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Read the cursor stamped onto `ctx._blokIterationCursors` for the
|
|
72
|
+
* given primitive step name. The map is keyed by step NAME (not
|
|
73
|
+
* NodeRun id) because NodeRun ids change on every dispatchDeferred
|
|
74
|
+
* re-entry while step names are stable. Returns `undefined` when no
|
|
75
|
+
* cursor was rehydrated (fresh run, no waits, sibling primitive).
|
|
76
|
+
* After successful resume, primitives should call
|
|
77
|
+
* {@link consumeRehydratedCursor} to clear the entry so sibling
|
|
78
|
+
* primitives later in the workflow don't accidentally re-resume.
|
|
79
|
+
*/
|
|
80
|
+
export function readRehydratedCursor(ctx, stepName) {
|
|
81
|
+
const map = ctx._blokIterationCursors;
|
|
82
|
+
if (!(map instanceof Map))
|
|
83
|
+
return undefined;
|
|
84
|
+
return map.get(stepName);
|
|
85
|
+
}
|
|
86
|
+
export function consumeRehydratedCursor(ctx, stepName) {
|
|
87
|
+
const map = ctx._blokIterationCursors;
|
|
88
|
+
if (map instanceof Map) {
|
|
89
|
+
map.delete(stepName);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=PrimitiveStack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrimitiveStack.js","sourceRoot":"","sources":["../../src/runtime/PrimitiveStack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAKH,MAAM,SAAS,GAAG,qBAAqB,CAAC;AASxC,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC7C,MAAM,KAAK,GAAI,GAA+B,CAAC,SAAS,CAAC,CAAC;IAC1D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAA8B,CAAC;IAChE,OAAO,EAAE,CAAC;AACX,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAY,EAAE,KAA0B;IAC1E,MAAM,MAAM,GAAG,GAA8B,CAAC;IAC9C,IAAI,KAAK,GAAG,MAAM,CAAC,SAAS,CAAsC,CAAC;IACnE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,KAAK,GAAG,EAAE,CAAC;QACX,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;IAC3B,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC7C,MAAM,MAAM,GAAG,GAA8B,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAsC,CAAC;IACrE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAClE,OAAO,KAAK,CAAC,GAAG,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC9C,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACzC,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAY,EAAE,QAAgB;IAClE,MAAM,GAAG,GAAI,GAA+B,CAAC,qBAAqB,CAAC;IACnE,IAAI,CAAC,CAAC,GAAG,YAAY,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,OAAQ,GAAqC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAY,EAAE,QAAgB;IACrE,MAAM,GAAG,GAAI,GAA+B,CAAC,qBAAqB,CAAC;IACnE,IAAI,GAAG,YAAY,GAAG,EAAE,CAAC;QACvB,GAAqC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzD,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tier C #1 · Cross-process debounce backend interface.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the relationship between `ConcurrencyBackend` and the
|
|
5
|
+
* `RunStore`-backed concurrency gate: an optional async capability that
|
|
6
|
+
* lets `DebounceCoordinator` coordinate windows across processes
|
|
7
|
+
* (NATS KV, Redis) instead of relying on the local in-memory Map.
|
|
8
|
+
*
|
|
9
|
+
* Default behavior is unchanged — when no backend is set, the
|
|
10
|
+
* coordinator uses its existing in-memory state. The backend is opt-in
|
|
11
|
+
* via `BLOK_DEBOUNCE_BACKEND={nats-kv|redis}` and installed by trigger
|
|
12
|
+
* packages during `listen()`.
|
|
13
|
+
*
|
|
14
|
+
* **Semantic trade-off**: this v1 ships *owner-local payload*
|
|
15
|
+
* semantics. The owning process's captured closure (`onFire`) fires
|
|
16
|
+
* when its local timer elapses; payloads from coalesce pings on other
|
|
17
|
+
* processes are dropped (the doc only records `pingCount`,
|
|
18
|
+
* `lastPingAt`, and `scheduledAt`). Cross-process latest-payload-wins
|
|
19
|
+
* is a deferred follow-up — would require persisting each ping's
|
|
20
|
+
* payload to the shared doc.
|
|
21
|
+
*/
|
|
22
|
+
export type DebounceBackendMode = "leading" | "trailing";
|
|
23
|
+
export interface DebounceRegisterBackendOpts {
|
|
24
|
+
workflowName: string;
|
|
25
|
+
debounceKey: string;
|
|
26
|
+
mode: DebounceBackendMode;
|
|
27
|
+
delayMs: number;
|
|
28
|
+
maxDelayMs?: number;
|
|
29
|
+
/** Run id allocated by the caller for THIS ping. */
|
|
30
|
+
runId: string;
|
|
31
|
+
/** Process identity used for owner-lease attribution. */
|
|
32
|
+
processId: string;
|
|
33
|
+
/** Owner lease in ms — when expired, another process can take over. */
|
|
34
|
+
ownerLeaseMs: number;
|
|
35
|
+
/** Current wall-clock ms. */
|
|
36
|
+
now: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Result of a `registerPing`. Three outcomes, mirroring the
|
|
40
|
+
* single-process `DebounceRegisterResult` shape:
|
|
41
|
+
*
|
|
42
|
+
* - `"owner-new"` — caller is the new owner of a fresh window.
|
|
43
|
+
* For leading mode: fire synchronously. For trailing mode: start a
|
|
44
|
+
* local timer to fire at `scheduledAt`.
|
|
45
|
+
* - `"owner-extend"` — caller is the existing owner; window extended.
|
|
46
|
+
* Cancel + restart local timer to fire at the new `scheduledAt`.
|
|
47
|
+
* - `"coalesce"` — caller is NOT the owner. Mark the run `debounced`
|
|
48
|
+
* with `intoRunId = activeRunId`.
|
|
49
|
+
*/
|
|
50
|
+
export interface DebounceRegisterBackendResult {
|
|
51
|
+
outcome: "owner-new" | "owner-extend" | "coalesce";
|
|
52
|
+
activeRunId: string;
|
|
53
|
+
/** The runId of the OWNING process. Equal to opts.runId when outcome ∈ {owner-new, owner-extend}; differs on coalesce. */
|
|
54
|
+
scheduledAt: number;
|
|
55
|
+
pingCount: number;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Result of a `finalize` call from an owning process's local timer.
|
|
59
|
+
*
|
|
60
|
+
* - `"fire"` — caller still owns AND the silence period elapsed.
|
|
61
|
+
* Bucket has been atomically DELETEd; caller dispatches.
|
|
62
|
+
* - `"reschedule"` — caller still owns, but coalesce pings from other
|
|
63
|
+
* processes pushed `scheduledAt` forward. Caller restarts local
|
|
64
|
+
* timer for `scheduledAt - now`.
|
|
65
|
+
* - `"abandoned"` — caller's lease expired and another process took
|
|
66
|
+
* ownership. Caller silently drops the closure.
|
|
67
|
+
*/
|
|
68
|
+
export type DebounceFinalizeResult = {
|
|
69
|
+
finalize: "fire";
|
|
70
|
+
} | {
|
|
71
|
+
finalize: "reschedule";
|
|
72
|
+
scheduledAt: number;
|
|
73
|
+
} | {
|
|
74
|
+
finalize: "abandoned";
|
|
75
|
+
};
|
|
76
|
+
export interface DebounceBackend {
|
|
77
|
+
/** Identifying string for logs/metrics. e.g. `"nats-kv"`, `"redis"`. */
|
|
78
|
+
readonly name: string;
|
|
79
|
+
/** Lifecycle — open the underlying connection. Idempotent. */
|
|
80
|
+
connect(): Promise<void>;
|
|
81
|
+
/** Lifecycle — close the underlying connection. Idempotent. */
|
|
82
|
+
disconnect(): Promise<void>;
|
|
83
|
+
/**
|
|
84
|
+
* Atomically record a ping against the `(workflow, debounceKey)`
|
|
85
|
+
* bucket and decide ownership. Returns one of the three outcomes
|
|
86
|
+
* documented on {@link DebounceRegisterBackendResult}.
|
|
87
|
+
*/
|
|
88
|
+
registerPing(opts: DebounceRegisterBackendOpts): Promise<DebounceRegisterBackendResult>;
|
|
89
|
+
/**
|
|
90
|
+
* Owner calls this on local timer fire. Atomically:
|
|
91
|
+
* - If `runId` still owns AND `now >= scheduledAt` → DELETE the
|
|
92
|
+
* bucket and return `{finalize: "fire"}`.
|
|
93
|
+
* - If `runId` still owns but `now < scheduledAt` → return
|
|
94
|
+
* `{finalize: "reschedule", scheduledAt}`.
|
|
95
|
+
* - If `runId` no longer owns (lease expired + handoff) → return
|
|
96
|
+
* `{finalize: "abandoned"}`.
|
|
97
|
+
*/
|
|
98
|
+
finalize(workflowName: string, debounceKey: string, runId: string, now: number): Promise<DebounceFinalizeResult>;
|
|
99
|
+
/** Cancel an active window without firing. Returns true if cancelled. */
|
|
100
|
+
cancel(workflowName: string, debounceKey: string): Promise<boolean>;
|
|
101
|
+
/**
|
|
102
|
+
* Janitor sweep — purge every bucket whose owner lease expired
|
|
103
|
+
* AND whose `scheduledAt` is in the past. Returns the count of
|
|
104
|
+
* purged buckets. Cheap per-bucket lazy-purge happens inside the
|
|
105
|
+
* registerPing/finalize scripts.
|
|
106
|
+
*/
|
|
107
|
+
purgeExpired(now: number): Promise<number>;
|
|
108
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tier C #1 · Cross-process debounce backend interface.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the relationship between `ConcurrencyBackend` and the
|
|
5
|
+
* `RunStore`-backed concurrency gate: an optional async capability that
|
|
6
|
+
* lets `DebounceCoordinator` coordinate windows across processes
|
|
7
|
+
* (NATS KV, Redis) instead of relying on the local in-memory Map.
|
|
8
|
+
*
|
|
9
|
+
* Default behavior is unchanged — when no backend is set, the
|
|
10
|
+
* coordinator uses its existing in-memory state. The backend is opt-in
|
|
11
|
+
* via `BLOK_DEBOUNCE_BACKEND={nats-kv|redis}` and installed by trigger
|
|
12
|
+
* packages during `listen()`.
|
|
13
|
+
*
|
|
14
|
+
* **Semantic trade-off**: this v1 ships *owner-local payload*
|
|
15
|
+
* semantics. The owning process's captured closure (`onFire`) fires
|
|
16
|
+
* when its local timer elapses; payloads from coalesce pings on other
|
|
17
|
+
* processes are dropped (the doc only records `pingCount`,
|
|
18
|
+
* `lastPingAt`, and `scheduledAt`). Cross-process latest-payload-wins
|
|
19
|
+
* is a deferred follow-up — would require persisting each ping's
|
|
20
|
+
* payload to the shared doc.
|
|
21
|
+
*/
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=DebounceBackend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DebounceBackend.js","sourceRoot":"","sources":["../../src/scheduling/DebounceBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG"}
|
|
@@ -1,19 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Tier 2 #7 —
|
|
2
|
+
* Tier 2 #7 — debounce coordinator. Tier C #1 — cross-process awareness.
|
|
3
3
|
*
|
|
4
4
|
* Coalesces rapid same-key triggers into a single delayed run. Modes:
|
|
5
5
|
*
|
|
6
6
|
* - `"trailing"` (default): each ping resets a timer; the run fires
|
|
7
|
-
* after `delayMs` of silence. Latest payload wins
|
|
8
|
-
* bounds tail latency — even with
|
|
9
|
-
* after `maxDelayMs` from the FIRST
|
|
7
|
+
* after `delayMs` of silence. Latest payload wins (within a single
|
|
8
|
+
* owning process). `maxDelayMs` bounds tail latency — even with
|
|
9
|
+
* continuous pings, the run fires after `maxDelayMs` from the FIRST
|
|
10
|
+
* ping.
|
|
10
11
|
* - `"leading"`: the first ping fires immediately. Subsequent pings
|
|
11
12
|
* within `delayMs` are dropped. Window resets after `delayMs` of
|
|
12
13
|
* silence.
|
|
13
14
|
*
|
|
14
|
-
* Process-wide singleton.
|
|
15
|
-
*
|
|
15
|
+
* Process-wide singleton. **Default**: in-memory only — fast,
|
|
16
|
+
* synchronous internally. **Cross-process mode (Tier C #1)**: install a
|
|
17
|
+
* `DebounceBackend` via `setBackend()` and the coordinator routes
|
|
18
|
+
* register/cancel through the backend with the same outcome surface,
|
|
19
|
+
* keeping a local timer + closure for the OWNING process. The
|
|
20
|
+
* `register()` API is async — callers must `await` it.
|
|
21
|
+
*
|
|
22
|
+
* Latest-payload semantics in cross-process mode: **owner-local**.
|
|
23
|
+
* Pings from a non-owning process bump pingCount + push scheduledAt in
|
|
24
|
+
* the shared doc but do NOT contribute their payload — only the
|
|
25
|
+
* owning process's captured `onFire` closure fires. Cross-process
|
|
26
|
+
* latest-payload-wins is deferred (would require persisting each
|
|
27
|
+
* ping's payload to the shared doc; tracked in BACKLOG).
|
|
16
28
|
*/
|
|
29
|
+
import type { DebounceBackend } from "./DebounceBackend";
|
|
17
30
|
export type DebounceDispatchFn = () => Promise<void>;
|
|
18
31
|
export type DebounceMode = "leading" | "trailing";
|
|
19
32
|
export interface DebounceRegisterOpts {
|
|
@@ -71,18 +84,58 @@ export interface DebounceRegisterResult {
|
|
|
71
84
|
export declare class DebounceCoordinator {
|
|
72
85
|
private static instance;
|
|
73
86
|
private states;
|
|
87
|
+
private backend;
|
|
88
|
+
/** Process identity for cross-process owner-lease attribution. Stable for the lifetime of the singleton. */
|
|
89
|
+
private readonly processId;
|
|
90
|
+
private ownerLeaseMs;
|
|
74
91
|
static getInstance(): DebounceCoordinator;
|
|
75
92
|
/** Test-only — reset the singleton + clear all state. */
|
|
76
93
|
static resetInstance(): void;
|
|
94
|
+
/**
|
|
95
|
+
* Install a cross-process backend. Set via `HttpTrigger.listen()` /
|
|
96
|
+
* `WorkerTrigger.listen()` when `BLOK_DEBOUNCE_BACKEND` is configured.
|
|
97
|
+
* Pass `null` to revert to the in-memory fast path.
|
|
98
|
+
*/
|
|
99
|
+
setBackend(backend: DebounceBackend | null): void;
|
|
100
|
+
getBackend(): DebounceBackend | null;
|
|
101
|
+
/**
|
|
102
|
+
* Override the owner-lease duration. Used by `HttpTrigger.listen()` /
|
|
103
|
+
* `WorkerTrigger.listen()` to apply `BLOK_DEBOUNCE_OWNER_LEASE_MS`.
|
|
104
|
+
*/
|
|
105
|
+
setOwnerLeaseMs(ms: number): void;
|
|
77
106
|
private bucket;
|
|
78
|
-
register(opts: DebounceRegisterOpts): DebounceRegisterResult
|
|
79
|
-
|
|
107
|
+
register(opts: DebounceRegisterOpts): Promise<DebounceRegisterResult>;
|
|
108
|
+
/**
|
|
109
|
+
* In-memory fast path — preserved exactly from the v1 single-process
|
|
110
|
+
* implementation. Synchronous internally; the outer signature is
|
|
111
|
+
* async so callers don't need to discriminate.
|
|
112
|
+
*/
|
|
113
|
+
private registerLocal;
|
|
114
|
+
private fireTrailingLocal;
|
|
115
|
+
/**
|
|
116
|
+
* Cross-process path — delegates ownership to the backend and uses
|
|
117
|
+
* a local timer + closure for the OWNING process.
|
|
118
|
+
*
|
|
119
|
+
* Three outcomes from the backend:
|
|
120
|
+
* - `owner-new`: this process is the new owner. Start a local timer
|
|
121
|
+
* + closure; on fire, atomically finalize via the backend.
|
|
122
|
+
* - `owner-extend`: this process is already the owner. Cancel +
|
|
123
|
+
* restart the local timer at the new scheduledAt; refresh closure.
|
|
124
|
+
* - `coalesce`: another process owns the window. Just return.
|
|
125
|
+
*
|
|
126
|
+
* Leading mode: `owner-new` translates to `fire-immediate` (caller
|
|
127
|
+
* fires synchronously); `owner-extend`/`coalesce` translate to
|
|
128
|
+
* `coalesce`.
|
|
129
|
+
*/
|
|
130
|
+
private registerCrossProcess;
|
|
131
|
+
private installOwnerTimer;
|
|
132
|
+
private fireTrailingCrossProcess;
|
|
80
133
|
/** Cancel an active window without firing. Returns true if cancelled. */
|
|
81
|
-
cancel(workflowName: string, debounceKey: string): boolean
|
|
82
|
-
/** Number of active debounce windows. Tests + observability. */
|
|
134
|
+
cancel(workflowName: string, debounceKey: string): Promise<boolean>;
|
|
135
|
+
/** Number of active LOCAL debounce windows. Tests + observability. Excludes cross-process windows owned by other processes. */
|
|
83
136
|
size(): number;
|
|
84
|
-
/** True if a window
|
|
137
|
+
/** True if THIS process has a local window for `(workflow, key)`. Excludes windows owned by other processes. */
|
|
85
138
|
has(workflowName: string, debounceKey: string): boolean;
|
|
86
|
-
/** Cancel everything without firing. */
|
|
139
|
+
/** Cancel everything without firing. Local state only — cross-process buckets fall back to lease-expiry. */
|
|
87
140
|
clear(): void;
|
|
88
141
|
}
|