inngest 4.2.6 → 4.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.
- package/CHANGELOG.md +24 -0
- package/api/schema.d.cts +2 -2
- package/api/schema.d.cts.map +1 -1
- package/api/schema.d.ts +2 -2
- package/api/schema.d.ts.map +1 -1
- package/components/DeferredFunction.cjs +66 -0
- package/components/DeferredFunction.cjs.map +1 -0
- package/components/DeferredFunction.d.cts +99 -0
- package/components/DeferredFunction.d.cts.map +1 -0
- package/components/DeferredFunction.d.ts +99 -0
- package/components/DeferredFunction.d.ts.map +1 -0
- package/components/DeferredFunction.js +65 -0
- package/components/DeferredFunction.js.map +1 -0
- package/components/Inngest.cjs +5 -2
- package/components/Inngest.cjs.map +1 -1
- package/components/Inngest.d.cts +11 -4
- package/components/Inngest.d.cts.map +1 -1
- package/components/Inngest.d.ts +11 -4
- package/components/Inngest.d.ts.map +1 -1
- package/components/Inngest.js +5 -2
- package/components/Inngest.js.map +1 -1
- package/components/InngestCommHandler.cjs +28 -23
- package/components/InngestCommHandler.cjs.map +1 -1
- package/components/InngestCommHandler.d.cts +9 -4
- package/components/InngestCommHandler.d.cts.map +1 -1
- package/components/InngestCommHandler.d.ts +9 -4
- package/components/InngestCommHandler.d.ts.map +1 -1
- package/components/InngestCommHandler.js +28 -23
- package/components/InngestCommHandler.js.map +1 -1
- package/components/InngestFunction.cjs +27 -19
- package/components/InngestFunction.cjs.map +1 -1
- package/components/InngestFunction.d.cts +6 -1
- package/components/InngestFunction.d.cts.map +1 -1
- package/components/InngestFunction.d.ts +6 -1
- package/components/InngestFunction.d.ts.map +1 -1
- package/components/InngestFunction.js +27 -19
- package/components/InngestFunction.js.map +1 -1
- package/components/InngestGroupTools.cjs +1 -1
- package/components/InngestGroupTools.cjs.map +1 -1
- package/components/InngestGroupTools.js +1 -1
- package/components/InngestGroupTools.js.map +1 -1
- package/components/InngestStepTools.cjs +3 -7
- package/components/InngestStepTools.cjs.map +1 -1
- package/components/InngestStepTools.d.cts +10 -7
- package/components/InngestStepTools.d.cts.map +1 -1
- package/components/InngestStepTools.d.ts +10 -7
- package/components/InngestStepTools.d.ts.map +1 -1
- package/components/InngestStepTools.js +3 -7
- package/components/InngestStepTools.js.map +1 -1
- package/components/connect/config.cjs +2 -0
- package/components/connect/config.cjs.map +1 -1
- package/components/connect/config.js +2 -0
- package/components/connect/config.js.map +1 -1
- package/components/connect/strategies/core/connection.cjs +91 -11
- package/components/connect/strategies/core/connection.cjs.map +1 -1
- package/components/connect/strategies/core/connection.js +91 -11
- package/components/connect/strategies/core/connection.js.map +1 -1
- package/components/connect/strategies/core/heartbeat.cjs +2 -1
- package/components/connect/strategies/core/heartbeat.cjs.map +1 -1
- package/components/connect/strategies/core/heartbeat.js +2 -1
- package/components/connect/strategies/core/heartbeat.js.map +1 -1
- package/components/connect/strategies/core/requestProcessor.cjs +27 -4
- package/components/connect/strategies/core/requestProcessor.cjs.map +1 -1
- package/components/connect/strategies/core/requestProcessor.js +27 -4
- package/components/connect/strategies/core/requestProcessor.js.map +1 -1
- package/components/connect/strategies/core/types.cjs +21 -0
- package/components/connect/strategies/core/types.cjs.map +1 -0
- package/components/connect/strategies/core/types.js +20 -0
- package/components/connect/strategies/core/types.js.map +1 -0
- package/components/connect/types.cjs.map +1 -1
- package/components/connect/types.d.cts +18 -0
- package/components/connect/types.d.cts.map +1 -1
- package/components/connect/types.d.ts +18 -0
- package/components/connect/types.d.ts.map +1 -1
- package/components/connect/types.js.map +1 -1
- package/components/execution/InngestExecution.cjs.map +1 -1
- package/components/execution/InngestExecution.d.cts +19 -2
- package/components/execution/InngestExecution.d.cts.map +1 -1
- package/components/execution/InngestExecution.d.ts +19 -2
- package/components/execution/InngestExecution.d.ts.map +1 -1
- package/components/execution/InngestExecution.js.map +1 -1
- package/components/execution/engine.cjs +233 -28
- package/components/execution/engine.cjs.map +1 -1
- package/components/execution/engine.d.cts +14 -0
- package/components/execution/engine.d.cts.map +1 -1
- package/components/execution/engine.d.ts +14 -0
- package/components/execution/engine.d.ts.map +1 -1
- package/components/execution/engine.js +233 -28
- package/components/execution/engine.js.map +1 -1
- package/components/execution/lazyOps.cjs +64 -0
- package/components/execution/lazyOps.cjs.map +1 -0
- package/components/execution/lazyOps.d.cts +42 -0
- package/components/execution/lazyOps.d.cts.map +1 -0
- package/components/execution/lazyOps.d.ts +42 -0
- package/components/execution/lazyOps.d.ts.map +1 -0
- package/components/execution/lazyOps.js +63 -0
- package/components/execution/lazyOps.js.map +1 -0
- package/components/execution/otel/middleware.d.cts +14 -5
- package/components/execution/otel/middleware.d.cts.map +1 -1
- package/components/execution/otel/middleware.d.ts +14 -5
- package/components/execution/otel/middleware.d.ts.map +1 -1
- package/components/middleware/manager.cjs +1 -1
- package/components/middleware/manager.cjs.map +1 -1
- package/components/middleware/manager.js +2 -2
- package/components/middleware/manager.js.map +1 -1
- package/components/middleware/middleware.cjs.map +1 -1
- package/components/middleware/middleware.d.cts +1 -1
- package/components/middleware/middleware.d.cts.map +1 -1
- package/components/middleware/middleware.d.ts +1 -1
- package/components/middleware/middleware.d.ts.map +1 -1
- package/components/middleware/middleware.js.map +1 -1
- package/components/middleware/utils.cjs +5 -3
- package/components/middleware/utils.cjs.map +1 -1
- package/components/middleware/utils.js +5 -3
- package/components/middleware/utils.js.map +1 -1
- package/components/triggers/typeHelpers.cjs.map +1 -1
- package/components/triggers/typeHelpers.d.cts +11 -0
- package/components/triggers/typeHelpers.d.cts.map +1 -1
- package/components/triggers/typeHelpers.d.ts +11 -0
- package/components/triggers/typeHelpers.d.ts.map +1 -1
- package/components/triggers/typeHelpers.js.map +1 -1
- package/experimental.cjs +3 -0
- package/experimental.d.cts +2 -1
- package/experimental.d.ts +2 -1
- package/experimental.js +2 -1
- package/helpers/consts.cjs +6 -0
- package/helpers/consts.cjs.map +1 -1
- package/helpers/consts.d.cts +6 -0
- package/helpers/consts.d.cts.map +1 -1
- package/helpers/consts.d.ts +6 -0
- package/helpers/consts.d.ts.map +1 -1
- package/helpers/consts.js +6 -0
- package/helpers/consts.js.map +1 -1
- package/helpers/functions.cjs +1 -0
- package/helpers/functions.cjs.map +1 -1
- package/helpers/functions.js +1 -0
- package/helpers/functions.js.map +1 -1
- package/helpers/marker.cjs +21 -0
- package/helpers/marker.cjs.map +1 -0
- package/helpers/marker.d.cts +12 -0
- package/helpers/marker.d.cts.map +1 -0
- package/helpers/marker.d.ts +12 -0
- package/helpers/marker.d.ts.map +1 -0
- package/helpers/marker.js +19 -0
- package/helpers/marker.js.map +1 -0
- package/helpers/strings.cjs +10 -4
- package/helpers/strings.cjs.map +1 -1
- package/helpers/strings.d.cts.map +1 -1
- package/helpers/strings.d.ts.map +1 -1
- package/helpers/strings.js +10 -4
- package/helpers/strings.js.map +1 -1
- package/helpers/temporal.cjs +2 -0
- package/helpers/temporal.d.ts +3 -0
- package/helpers/temporal.d.ts.map +1 -1
- package/helpers/temporal.js +1 -1
- package/package.json +2 -2
- package/proto/src/components/connect/protobuf/connect.cjs +11 -2
- package/proto/src/components/connect/protobuf/connect.cjs.map +1 -1
- package/proto/src/components/connect/protobuf/connect.js +11 -2
- package/proto/src/components/connect/protobuf/connect.js.map +1 -1
- package/react.d.cts.map +1 -1
- package/types.cjs +2 -0
- package/types.cjs.map +1 -1
- package/types.d.cts +43 -8
- package/types.d.cts.map +1 -1
- package/types.d.ts +43 -8
- package/types.d.ts.map +1 -1
- package/types.js +2 -0
- package/types.js.map +1 -1
- package/version.cjs +1 -1
- package/version.cjs.map +1 -1
- package/version.d.cts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.js.map +1 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
const require_types = require('../../types.cjs');
|
|
2
|
+
|
|
3
|
+
//#region src/components/execution/lazyOps.ts
|
|
4
|
+
/**
|
|
5
|
+
* Buffer for opcode-only sync ops (e.g. `DeferAdd`). These ops need to be
|
|
6
|
+
* buffered until the next outbound wire message (e.g. checkpointing a
|
|
7
|
+
* `step.run`).
|
|
8
|
+
*
|
|
9
|
+
* The engine owns shipping. This helper owns the buffer.
|
|
10
|
+
*/
|
|
11
|
+
var LazyOps = class {
|
|
12
|
+
buffer = [];
|
|
13
|
+
pushedIds = /* @__PURE__ */ new Set();
|
|
14
|
+
/**
|
|
15
|
+
* Number of ops waiting to ship.
|
|
16
|
+
*/
|
|
17
|
+
get length() {
|
|
18
|
+
return this.buffer.length;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Whether an op with this hashed id has been pushed in this execution
|
|
22
|
+
* (whether or not it has since been drained).
|
|
23
|
+
*/
|
|
24
|
+
hasId(id) {
|
|
25
|
+
return this.pushedIds.has(id);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Take ownership of buffered ops and clear the buffer. Callers ship them on
|
|
29
|
+
* whichever wire message comes next.
|
|
30
|
+
*/
|
|
31
|
+
drain() {
|
|
32
|
+
if (this.buffer.length === 0) return [];
|
|
33
|
+
const ops = this.buffer;
|
|
34
|
+
this.buffer = [];
|
|
35
|
+
return ops;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Buffer an op for later shipment.
|
|
39
|
+
*/
|
|
40
|
+
push(op) {
|
|
41
|
+
this.buffer.push(op);
|
|
42
|
+
this.pushedIds.add(op.id);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Record that an id has been observed in this execution without buffering
|
|
46
|
+
* an op for it. Used to consume a `priorDefers` replay match so that
|
|
47
|
+
* subsequent encounters of the same id surface as duplicates.
|
|
48
|
+
*/
|
|
49
|
+
markSeen(id) {
|
|
50
|
+
this.pushedIds.add(id);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* True when a step being registered is an opcode-only sync op (no local
|
|
55
|
+
* handler, sync mode).
|
|
56
|
+
*/
|
|
57
|
+
function isLazyOp(opts, opId) {
|
|
58
|
+
return !opts?.fn && opId.mode === require_types.StepMode.Sync;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
//#endregion
|
|
62
|
+
exports.LazyOps = LazyOps;
|
|
63
|
+
exports.isLazyOp = isLazyOp;
|
|
64
|
+
//# sourceMappingURL=lazyOps.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazyOps.cjs","names":["StepMode"],"sources":["../../../src/components/execution/lazyOps.ts"],"sourcesContent":["import { type OutgoingOp, StepMode } from \"../../types.ts\";\nimport type { MatchOpFn, StepToolOptions } from \"../InngestStepTools.ts\";\n\n/**\n * Buffer for opcode-only sync ops (e.g. `DeferAdd`). These ops need to be\n * buffered until the next outbound wire message (e.g. checkpointing a\n * `step.run`).\n *\n * The engine owns shipping. This helper owns the buffer.\n */\nexport class LazyOps {\n private buffer: OutgoingOp[] = [];\n\n // Tracks every id pushed during this execution, including those already\n // drained. `buffer` alone can't answer \"have we seen this id?\" once a\n // checkpoint ships its contents, so duplicates that straddle a drain would\n // otherwise slip through.\n private pushedIds: Set<string> = new Set();\n\n /**\n * Number of ops waiting to ship.\n */\n get length(): number {\n return this.buffer.length;\n }\n\n /**\n * Whether an op with this hashed id has been pushed in this execution\n * (whether or not it has since been drained).\n */\n hasId(id: string): boolean {\n return this.pushedIds.has(id);\n }\n\n /**\n * Take ownership of buffered ops and clear the buffer. Callers ship them on\n * whichever wire message comes next.\n */\n drain(): OutgoingOp[] {\n if (this.buffer.length === 0) {\n return [];\n }\n const ops = this.buffer;\n this.buffer = [];\n return ops;\n }\n\n /**\n * Buffer an op for later shipment.\n */\n push(op: OutgoingOp): void {\n this.buffer.push(op);\n this.pushedIds.add(op.id);\n }\n\n /**\n * Record that an id has been observed in this execution without buffering\n * an op for it. Used to consume a `priorDefers` replay match so that\n * subsequent encounters of the same id surface as duplicates.\n */\n markSeen(id: string): void {\n this.pushedIds.add(id);\n }\n}\n\n/**\n * True when a step being registered is an opcode-only sync op (no local\n * handler, sync mode).\n */\nexport function isLazyOp(\n opts: StepToolOptions | undefined,\n opId: ReturnType<MatchOpFn>,\n): boolean {\n return !opts?.fn && opId.mode === StepMode.Sync;\n}\n"],"mappings":";;;;;;;;;;AAUA,IAAa,UAAb,MAAqB;CACnB,AAAQ,SAAuB,EAAE;CAMjC,AAAQ,4BAAyB,IAAI,KAAK;;;;CAK1C,IAAI,SAAiB;AACnB,SAAO,KAAK,OAAO;;;;;;CAOrB,MAAM,IAAqB;AACzB,SAAO,KAAK,UAAU,IAAI,GAAG;;;;;;CAO/B,QAAsB;AACpB,MAAI,KAAK,OAAO,WAAW,EACzB,QAAO,EAAE;EAEX,MAAM,MAAM,KAAK;AACjB,OAAK,SAAS,EAAE;AAChB,SAAO;;;;;CAMT,KAAK,IAAsB;AACzB,OAAK,OAAO,KAAK,GAAG;AACpB,OAAK,UAAU,IAAI,GAAG,GAAG;;;;;;;CAQ3B,SAAS,IAAkB;AACzB,OAAK,UAAU,IAAI,GAAG;;;;;;;AAQ1B,SAAgB,SACd,MACA,MACS;AACT,QAAO,CAAC,MAAM,MAAM,KAAK,SAASA,uBAAS"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { OutgoingOp } from "../../types.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/components/execution/lazyOps.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Buffer for opcode-only sync ops (e.g. `DeferAdd`). These ops need to be
|
|
7
|
+
* buffered until the next outbound wire message (e.g. checkpointing a
|
|
8
|
+
* `step.run`).
|
|
9
|
+
*
|
|
10
|
+
* The engine owns shipping. This helper owns the buffer.
|
|
11
|
+
*/
|
|
12
|
+
declare class LazyOps {
|
|
13
|
+
private buffer;
|
|
14
|
+
private pushedIds;
|
|
15
|
+
/**
|
|
16
|
+
* Number of ops waiting to ship.
|
|
17
|
+
*/
|
|
18
|
+
get length(): number;
|
|
19
|
+
/**
|
|
20
|
+
* Whether an op with this hashed id has been pushed in this execution
|
|
21
|
+
* (whether or not it has since been drained).
|
|
22
|
+
*/
|
|
23
|
+
hasId(id: string): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Take ownership of buffered ops and clear the buffer. Callers ship them on
|
|
26
|
+
* whichever wire message comes next.
|
|
27
|
+
*/
|
|
28
|
+
drain(): OutgoingOp[];
|
|
29
|
+
/**
|
|
30
|
+
* Buffer an op for later shipment.
|
|
31
|
+
*/
|
|
32
|
+
push(op: OutgoingOp): void;
|
|
33
|
+
/**
|
|
34
|
+
* Record that an id has been observed in this execution without buffering
|
|
35
|
+
* an op for it. Used to consume a `priorDefers` replay match so that
|
|
36
|
+
* subsequent encounters of the same id surface as duplicates.
|
|
37
|
+
*/
|
|
38
|
+
markSeen(id: string): void;
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
export { LazyOps };
|
|
42
|
+
//# sourceMappingURL=lazyOps.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazyOps.d.cts","names":[],"sources":["../../../src/components/execution/lazyOps.ts"],"sourcesContent":[],"mappings":";;;;;AAUA;;;;;;cAAa,OAAA;;;;;;;;;;;;;;;;WA4BF;;;;WAYA"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { OutgoingOp } from "../../types.js";
|
|
2
|
+
|
|
3
|
+
//#region src/components/execution/lazyOps.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Buffer for opcode-only sync ops (e.g. `DeferAdd`). These ops need to be
|
|
7
|
+
* buffered until the next outbound wire message (e.g. checkpointing a
|
|
8
|
+
* `step.run`).
|
|
9
|
+
*
|
|
10
|
+
* The engine owns shipping. This helper owns the buffer.
|
|
11
|
+
*/
|
|
12
|
+
declare class LazyOps {
|
|
13
|
+
private buffer;
|
|
14
|
+
private pushedIds;
|
|
15
|
+
/**
|
|
16
|
+
* Number of ops waiting to ship.
|
|
17
|
+
*/
|
|
18
|
+
get length(): number;
|
|
19
|
+
/**
|
|
20
|
+
* Whether an op with this hashed id has been pushed in this execution
|
|
21
|
+
* (whether or not it has since been drained).
|
|
22
|
+
*/
|
|
23
|
+
hasId(id: string): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Take ownership of buffered ops and clear the buffer. Callers ship them on
|
|
26
|
+
* whichever wire message comes next.
|
|
27
|
+
*/
|
|
28
|
+
drain(): OutgoingOp[];
|
|
29
|
+
/**
|
|
30
|
+
* Buffer an op for later shipment.
|
|
31
|
+
*/
|
|
32
|
+
push(op: OutgoingOp): void;
|
|
33
|
+
/**
|
|
34
|
+
* Record that an id has been observed in this execution without buffering
|
|
35
|
+
* an op for it. Used to consume a `priorDefers` replay match so that
|
|
36
|
+
* subsequent encounters of the same id surface as duplicates.
|
|
37
|
+
*/
|
|
38
|
+
markSeen(id: string): void;
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
export { LazyOps };
|
|
42
|
+
//# sourceMappingURL=lazyOps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazyOps.d.ts","names":[],"sources":["../../../src/components/execution/lazyOps.ts"],"sourcesContent":[],"mappings":";;;;;AAUA;;;;;;cAAa,OAAA;;;;;;;;;;;;;;;;WA4BF;;;;WAYA"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { StepMode } from "../../types.js";
|
|
2
|
+
|
|
3
|
+
//#region src/components/execution/lazyOps.ts
|
|
4
|
+
/**
|
|
5
|
+
* Buffer for opcode-only sync ops (e.g. `DeferAdd`). These ops need to be
|
|
6
|
+
* buffered until the next outbound wire message (e.g. checkpointing a
|
|
7
|
+
* `step.run`).
|
|
8
|
+
*
|
|
9
|
+
* The engine owns shipping. This helper owns the buffer.
|
|
10
|
+
*/
|
|
11
|
+
var LazyOps = class {
|
|
12
|
+
buffer = [];
|
|
13
|
+
pushedIds = /* @__PURE__ */ new Set();
|
|
14
|
+
/**
|
|
15
|
+
* Number of ops waiting to ship.
|
|
16
|
+
*/
|
|
17
|
+
get length() {
|
|
18
|
+
return this.buffer.length;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Whether an op with this hashed id has been pushed in this execution
|
|
22
|
+
* (whether or not it has since been drained).
|
|
23
|
+
*/
|
|
24
|
+
hasId(id) {
|
|
25
|
+
return this.pushedIds.has(id);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Take ownership of buffered ops and clear the buffer. Callers ship them on
|
|
29
|
+
* whichever wire message comes next.
|
|
30
|
+
*/
|
|
31
|
+
drain() {
|
|
32
|
+
if (this.buffer.length === 0) return [];
|
|
33
|
+
const ops = this.buffer;
|
|
34
|
+
this.buffer = [];
|
|
35
|
+
return ops;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Buffer an op for later shipment.
|
|
39
|
+
*/
|
|
40
|
+
push(op) {
|
|
41
|
+
this.buffer.push(op);
|
|
42
|
+
this.pushedIds.add(op.id);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Record that an id has been observed in this execution without buffering
|
|
46
|
+
* an op for it. Used to consume a `priorDefers` replay match so that
|
|
47
|
+
* subsequent encounters of the same id surface as duplicates.
|
|
48
|
+
*/
|
|
49
|
+
markSeen(id) {
|
|
50
|
+
this.pushedIds.add(id);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* True when a step being registered is an opcode-only sync op (no local
|
|
55
|
+
* handler, sync mode).
|
|
56
|
+
*/
|
|
57
|
+
function isLazyOp(opts, opId) {
|
|
58
|
+
return !opts?.fn && opId.mode === StepMode.Sync;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
//#endregion
|
|
62
|
+
export { LazyOps, isLazyOp };
|
|
63
|
+
//# sourceMappingURL=lazyOps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazyOps.js","names":[],"sources":["../../../src/components/execution/lazyOps.ts"],"sourcesContent":["import { type OutgoingOp, StepMode } from \"../../types.ts\";\nimport type { MatchOpFn, StepToolOptions } from \"../InngestStepTools.ts\";\n\n/**\n * Buffer for opcode-only sync ops (e.g. `DeferAdd`). These ops need to be\n * buffered until the next outbound wire message (e.g. checkpointing a\n * `step.run`).\n *\n * The engine owns shipping. This helper owns the buffer.\n */\nexport class LazyOps {\n private buffer: OutgoingOp[] = [];\n\n // Tracks every id pushed during this execution, including those already\n // drained. `buffer` alone can't answer \"have we seen this id?\" once a\n // checkpoint ships its contents, so duplicates that straddle a drain would\n // otherwise slip through.\n private pushedIds: Set<string> = new Set();\n\n /**\n * Number of ops waiting to ship.\n */\n get length(): number {\n return this.buffer.length;\n }\n\n /**\n * Whether an op with this hashed id has been pushed in this execution\n * (whether or not it has since been drained).\n */\n hasId(id: string): boolean {\n return this.pushedIds.has(id);\n }\n\n /**\n * Take ownership of buffered ops and clear the buffer. Callers ship them on\n * whichever wire message comes next.\n */\n drain(): OutgoingOp[] {\n if (this.buffer.length === 0) {\n return [];\n }\n const ops = this.buffer;\n this.buffer = [];\n return ops;\n }\n\n /**\n * Buffer an op for later shipment.\n */\n push(op: OutgoingOp): void {\n this.buffer.push(op);\n this.pushedIds.add(op.id);\n }\n\n /**\n * Record that an id has been observed in this execution without buffering\n * an op for it. Used to consume a `priorDefers` replay match so that\n * subsequent encounters of the same id surface as duplicates.\n */\n markSeen(id: string): void {\n this.pushedIds.add(id);\n }\n}\n\n/**\n * True when a step being registered is an opcode-only sync op (no local\n * handler, sync mode).\n */\nexport function isLazyOp(\n opts: StepToolOptions | undefined,\n opId: ReturnType<MatchOpFn>,\n): boolean {\n return !opts?.fn && opId.mode === StepMode.Sync;\n}\n"],"mappings":";;;;;;;;;;AAUA,IAAa,UAAb,MAAqB;CACnB,AAAQ,SAAuB,EAAE;CAMjC,AAAQ,4BAAyB,IAAI,KAAK;;;;CAK1C,IAAI,SAAiB;AACnB,SAAO,KAAK,OAAO;;;;;;CAOrB,MAAM,IAAqB;AACzB,SAAO,KAAK,UAAU,IAAI,GAAG;;;;;;CAO/B,QAAsB;AACpB,MAAI,KAAK,OAAO,WAAW,EACzB,QAAO,EAAE;EAEX,MAAM,MAAM,KAAK;AACjB,OAAK,SAAS,EAAE;AAChB,SAAO;;;;;CAMT,KAAK,IAAsB;AACzB,OAAK,OAAO,KAAK,GAAG;AACpB,OAAK,UAAU,IAAI,GAAG,GAAG;;;;;;;CAQ3B,SAAS,IAAkB;AACzB,OAAK,UAAU,IAAI,GAAG;;;;;;;AAQ1B,SAAgB,SACd,MACA,MACS;AACT,QAAO,CAAC,MAAM,MAAM,KAAK,SAAS,SAAS"}
|
|
@@ -8,7 +8,7 @@ import { Middleware } from "../../middleware/middleware.cjs";
|
|
|
8
8
|
import { Realtime } from "../../realtime/types.cjs";
|
|
9
9
|
import { EventType } from "../../triggers/triggers.cjs";
|
|
10
10
|
import { InngestFunction } from "../../InngestFunction.cjs";
|
|
11
|
-
import { ClientOptions, EventPayload, InvocationResult, InvokeTargetFunctionDefinition, JsonError, SendEventBaseOutput, SendEventOutput, StepOptionsOrId, TimeStr, TimeStrBatch, TriggerEventFromFunction } from "../../../types.cjs";
|
|
11
|
+
import { ClientOptions, DeferFn, EventPayload, InvocationResult, InvokeTargetFunctionDefinition, JsonError, SendEventBaseOutput, SendEventOutput, StepOptionsOrId, TimeStr, TimeStrBatch, TriggerEventFromFunction } from "../../../types.cjs";
|
|
12
12
|
import { GetFunctionOutputRaw, Inngest } from "../../Inngest.cjs";
|
|
13
13
|
import { Behaviour, Instrumentations } from "./util.cjs";
|
|
14
14
|
import * as _standard_schema_spec0 from "@standard-schema/spec";
|
|
@@ -76,7 +76,7 @@ declare const extendedTracesMiddleware: ({
|
|
|
76
76
|
sendEvent: (idOrOptions: StepOptionsOrId, payload: SendEventPayload) => Promise<SendEventOutput<ClientOptions>>;
|
|
77
77
|
waitForSignal: <TData>(idOrOptions: StepOptionsOrId, opts: {
|
|
78
78
|
signal: string;
|
|
79
|
-
timeout: number | string | Date;
|
|
79
|
+
timeout: number | string | Date | DurationLike | InstantLike | ZonedDateTimeLike;
|
|
80
80
|
onConflict: "replace" | "fail";
|
|
81
81
|
}) => Promise<{
|
|
82
82
|
signal: string;
|
|
@@ -91,7 +91,7 @@ declare const extendedTracesMiddleware: ({
|
|
|
91
91
|
}) => Promise<InngestApi.SendSignalResponse>;
|
|
92
92
|
waitForEvent: <TOpts extends {
|
|
93
93
|
event: string | EventType<string, any>;
|
|
94
|
-
timeout: number | string | Date;
|
|
94
|
+
timeout: number | string | Date | DurationLike | InstantLike | ZonedDateTimeLike;
|
|
95
95
|
} & ExclusiveKeys<{
|
|
96
96
|
match?: string;
|
|
97
97
|
if?: string;
|
|
@@ -149,12 +149,15 @@ declare const extendedTracesMiddleware: ({
|
|
|
149
149
|
invoke: <TFunction extends InvokeTargetFunctionDefinition>(idOrOptions: StepOptionsOrId, opts: {
|
|
150
150
|
function: TFunction;
|
|
151
151
|
} & Omit<TriggerEventFromFunction<TFunction>, "id"> & {
|
|
152
|
-
timeout?: number | string | Date;
|
|
152
|
+
timeout?: number | string | Date | DurationLike | InstantLike | ZonedDateTimeLike;
|
|
153
153
|
}) => InvocationResult<Jsonify<GetFunctionOutputRaw<TFunction>>>;
|
|
154
154
|
fetch: StepFetch;
|
|
155
155
|
};
|
|
156
|
+
defer: DeferFn;
|
|
156
157
|
events: AsTuple<Simplify<EventPayload>>;
|
|
157
158
|
runId: string;
|
|
159
|
+
requestId?: string | undefined;
|
|
160
|
+
jobId?: string | undefined;
|
|
158
161
|
group: ReturnType<typeof createGroupTools>;
|
|
159
162
|
attempt: number;
|
|
160
163
|
maxAttempts?: number | undefined;
|
|
@@ -234,7 +237,13 @@ declare const extendedTracesMiddleware: ({
|
|
|
234
237
|
};
|
|
235
238
|
readonly if?: string | undefined;
|
|
236
239
|
readonly match?: string | undefined;
|
|
237
|
-
readonly timeout?: string | number | Readonly<Date> |
|
|
240
|
+
readonly timeout?: string | number | Readonly<Date> | {
|
|
241
|
+
readonly [Symbol.toStringTag]: "Temporal.Duration";
|
|
242
|
+
} | {
|
|
243
|
+
readonly [Symbol.toStringTag]: "Temporal.Instant";
|
|
244
|
+
} | {
|
|
245
|
+
readonly [Symbol.toStringTag]: "Temporal.ZonedDateTime";
|
|
246
|
+
} | undefined;
|
|
238
247
|
}[] | undefined;
|
|
239
248
|
readonly retries?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | undefined;
|
|
240
249
|
readonly onFailure?: any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.cts","names":[],"sources":["../../../../src/components/execution/otel/middleware.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;UA6BiB,+BAAA;;;;;;;;;;;;;EAAA,SAAA,CAAA,EAaH,SAbG;EAA+B;;;;;AAwChD;;kBAAyC,CAAA,EAlBpB,gBAkBoB;;;;;;;UA6GO,CAAA,EAvHnC,YAuHmC;;;;;;;;;cA7GnC;;;;IAIV;;;;;;;gCAyGQ,UAAA,CAAW;;gBAA0B,mBAAA,CAAA
|
|
1
|
+
{"version":3,"file":"middleware.d.cts","names":[],"sources":["../../../../src/components/execution/otel/middleware.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;UA6BiB,+BAAA;;;;;;;;;;;;;EAAA,SAAA,CAAA,EAaH,SAbG;EAA+B;;;;;AAwChD;;kBAAyC,CAAA,EAlBpB,gBAkBoB;;;;;;;UA6GO,CAAA,EAvHnC,YAuHmC;;;;;;;;;cA7GnC;;;;IAIV;;;;;;;gCAyGQ,UAAA,CAAW;;gBAA0B,mBAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAWI,SAAA,OAAA,CAAA,EAAA,MAAA,GAAA,SAAA;cAAe,SAAA,MAAA,EAAA,CAAA,GAAA,IAAA,EAAA,CAAA,IAAA,SAAA,CAAA,MAAA,EAAA,OAAA,CAAA,GAAA,SAAA,EAAA,OAAA,GAAA;gBAAA,EAAA,CAAA,EAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YApCb,CAAA,GAAA,SAAA;YAAc,SAAA,aAAA,CAAA,EAAA,MAAA,GAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoC3B,UAAA,CAAW,kBAAe,QAAA,UAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;KApCxB,UAAA,CAAW"}
|
|
@@ -8,7 +8,7 @@ import { Middleware } from "../../middleware/middleware.js";
|
|
|
8
8
|
import { Realtime } from "../../realtime/types.js";
|
|
9
9
|
import { EventType } from "../../triggers/triggers.js";
|
|
10
10
|
import { InngestFunction } from "../../InngestFunction.js";
|
|
11
|
-
import { ClientOptions, EventPayload, InvocationResult, InvokeTargetFunctionDefinition, JsonError, SendEventBaseOutput, SendEventOutput, StepOptionsOrId, TimeStr, TimeStrBatch, TriggerEventFromFunction } from "../../../types.js";
|
|
11
|
+
import { ClientOptions, DeferFn, EventPayload, InvocationResult, InvokeTargetFunctionDefinition, JsonError, SendEventBaseOutput, SendEventOutput, StepOptionsOrId, TimeStr, TimeStrBatch, TriggerEventFromFunction } from "../../../types.js";
|
|
12
12
|
import { GetFunctionOutputRaw, Inngest } from "../../Inngest.js";
|
|
13
13
|
import { Behaviour, Instrumentations } from "./util.js";
|
|
14
14
|
import * as _opentelemetry_api0 from "@opentelemetry/api";
|
|
@@ -76,7 +76,7 @@ declare const extendedTracesMiddleware: ({
|
|
|
76
76
|
sendEvent: (idOrOptions: StepOptionsOrId, payload: SendEventPayload) => Promise<SendEventOutput<ClientOptions>>;
|
|
77
77
|
waitForSignal: <TData>(idOrOptions: StepOptionsOrId, opts: {
|
|
78
78
|
signal: string;
|
|
79
|
-
timeout: number | string | Date;
|
|
79
|
+
timeout: number | string | Date | DurationLike | InstantLike | ZonedDateTimeLike;
|
|
80
80
|
onConflict: "replace" | "fail";
|
|
81
81
|
}) => Promise<{
|
|
82
82
|
signal: string;
|
|
@@ -91,7 +91,7 @@ declare const extendedTracesMiddleware: ({
|
|
|
91
91
|
}) => Promise<InngestApi.SendSignalResponse>;
|
|
92
92
|
waitForEvent: <TOpts extends {
|
|
93
93
|
event: string | EventType<string, any>;
|
|
94
|
-
timeout: number | string | Date;
|
|
94
|
+
timeout: number | string | Date | DurationLike | InstantLike | ZonedDateTimeLike;
|
|
95
95
|
} & ExclusiveKeys<{
|
|
96
96
|
match?: string;
|
|
97
97
|
if?: string;
|
|
@@ -149,12 +149,15 @@ declare const extendedTracesMiddleware: ({
|
|
|
149
149
|
invoke: <TFunction extends InvokeTargetFunctionDefinition>(idOrOptions: StepOptionsOrId, opts: {
|
|
150
150
|
function: TFunction;
|
|
151
151
|
} & Omit<TriggerEventFromFunction<TFunction>, "id"> & {
|
|
152
|
-
timeout?: number | string | Date;
|
|
152
|
+
timeout?: number | string | Date | DurationLike | InstantLike | ZonedDateTimeLike;
|
|
153
153
|
}) => InvocationResult<Jsonify<GetFunctionOutputRaw<TFunction>>>;
|
|
154
154
|
fetch: StepFetch;
|
|
155
155
|
};
|
|
156
|
+
defer: DeferFn;
|
|
156
157
|
events: AsTuple<Simplify<EventPayload>>;
|
|
157
158
|
runId: string;
|
|
159
|
+
requestId?: string | undefined;
|
|
160
|
+
jobId?: string | undefined;
|
|
158
161
|
group: ReturnType<typeof createGroupTools>;
|
|
159
162
|
attempt: number;
|
|
160
163
|
maxAttempts?: number | undefined;
|
|
@@ -234,7 +237,13 @@ declare const extendedTracesMiddleware: ({
|
|
|
234
237
|
};
|
|
235
238
|
readonly if?: string | undefined;
|
|
236
239
|
readonly match?: string | undefined;
|
|
237
|
-
readonly timeout?: string | number | Readonly<Date> |
|
|
240
|
+
readonly timeout?: string | number | Readonly<Date> | {
|
|
241
|
+
readonly [Symbol.toStringTag]: "Temporal.Duration";
|
|
242
|
+
} | {
|
|
243
|
+
readonly [Symbol.toStringTag]: "Temporal.Instant";
|
|
244
|
+
} | {
|
|
245
|
+
readonly [Symbol.toStringTag]: "Temporal.ZonedDateTime";
|
|
246
|
+
} | undefined;
|
|
238
247
|
}[] | undefined;
|
|
239
248
|
readonly retries?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | undefined;
|
|
240
249
|
readonly onFailure?: any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","names":[],"sources":["../../../../src/components/execution/otel/middleware.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;UA6BiB,+BAAA;;;;;;;;;;;;;EAAA,SAAA,CAAA,EAaH,SAbG;EAA+B;;;;;AAwChD;;kBAAyC,CAAA,EAlBpB,gBAkBoB;;;;;;;UA6GO,CAAA,EAvHnC,YAuHmC;;;;;;;;;cA7GnC;;;;IAIV;;;;;;;gCAyGQ,UAAA,CAAW;;gBAA0B,mBAAA,CAAA
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","names":[],"sources":["../../../../src/components/execution/otel/middleware.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;UA6BiB,+BAAA;;;;;;;;;;;;;EAAA,SAAA,CAAA,EAaH,SAbG;EAA+B;;;;;AAwChD;;kBAAyC,CAAA,EAlBpB,gBAkBoB;;;;;;;UA6GO,CAAA,EAvHnC,YAuHmC;;;;;;;;;cA7GnC;;;;IAIV;;;;;;;gCAyGQ,UAAA,CAAW;;gBAA0B,mBAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAWI,SAAA,OAAA,CAAA,EAAA,MAAA,GAAA,SAAA;cAAe,SAAA,MAAA,EAAA,CAAA,GAAA,IAAA,EAAA,CAAA,IAAA,SAAA,CAAA,MAAA,EAAA,OAAA,CAAA,GAAA,SAAA,EAAA,OAAA,GAAA;gBAAA,EAAA,CAAA,EAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YApCb,CAAA,GAAA,SAAA;YAAc,SAAA,aAAA,CAAA,EAAA,MAAA,GAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoC3B,UAAA,CAAW,kBAAe,QAAA,UAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;KApCxB,UAAA,CAAW"}
|
|
@@ -64,7 +64,7 @@ var MiddlewareManager = class {
|
|
|
64
64
|
}
|
|
65
65
|
let opName;
|
|
66
66
|
if (stepType === "sleep" && stepInfo.input !== void 0) {
|
|
67
|
-
if (!require_utils.
|
|
67
|
+
if (!require_utils.isSleepInput(stepInfo.input[0])) throw new Error("Sleep time must be a string, number, Date, or Temporal.Duration");
|
|
68
68
|
opName = require_strings.timeStr(stepInfo.input[0]);
|
|
69
69
|
}
|
|
70
70
|
const opOpts = require_utils.optsFromStepInput(stepType, stepInfo.input);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.cjs","names":["stepTypeFromOpCode","stepInputFromOpts","opName: string | undefined","isTimeStrInput","timeStr","optsFromStepInput","actualHandler: (() => Promise<unknown>) | undefined","result: Middleware.TransformFunctionInputArgs[\"steps\"]","result: Middleware.TransformFunctionInputArgs","chain: () => Promise<unknown>","result: Middleware.TransformStepInputArgs","UnreachableError"],"sources":["../../../src/components/middleware/manager.ts"],"sourcesContent":["import { timeStr } from \"../../helpers/strings.ts\";\nimport type { Logger } from \"../../middleware/logger.ts\";\nimport type { Context, StepOpCode } from \"../../types.ts\";\nimport type { MemoizedOp } from \"../execution/InngestExecution.ts\";\nimport type { InngestFunction } from \"../InngestFunction.ts\";\nimport type { Middleware } from \"./middleware.ts\";\nimport {\n isTimeStrInput,\n optsFromStepInput,\n stepInputFromOpts,\n stepTypeFromOpCode,\n UnreachableError,\n} from \"./utils.ts\";\n\nexport interface StepInfoOptions {\n hashedId: string;\n userlandId: string;\n displayName?: string;\n memoized: boolean;\n stepType: Middleware.StepType;\n input?: unknown[];\n}\n\nexport interface ApplyToStepInput {\n op: StepOpCode;\n opts?: Record<string, unknown>;\n hashedId: string;\n userlandId: string;\n displayName?: string;\n memoized: boolean;\n}\n\nexport interface PreparedStep {\n entryPoint: () => Promise<unknown>;\n\n /**\n * Only used for sleep steps. The sleep's wake-up time must be in the op name,\n * and that may be changed by the `transformStepInput` hook. The user-facing\n * name is actually the op's `displayName` field (yes, that's confusing).\n */\n opName?: string;\n\n /**\n * For step kinds where middleware input maps to the outgoing op's opts\n * (e.g. invoke, waitForEvent). Derived by reversing `stepInputFromOpts`.\n */\n opOpts?: Record<string, unknown>;\n\n setActualHandler: (handler: () => Promise<unknown>) => void;\n stepInfo: Middleware.StepInfo;\n}\n\n/**\n * Manages middleware. Hides middleware complexity from elsewhere in the\n * codebase. Not for for public use.\n */\nexport class MiddlewareManager {\n private readonly fnArg: Context.Any;\n private readonly getStepState: () => Record<string, MemoizedOp>;\n\n /**\n * Whether any middleware defines `transformStepInput`. Used for perf\n * optimization.\n */\n private readonly hasTransformStepInput: boolean;\n\n /**\n * Whether memoization has ended. Used for idempotency, since memoization must\n * only call once per request.\n */\n private memoizationEnded = false;\n\n private readonly fn: InngestFunction.Any;\n private readonly middleware: Middleware.BaseMiddleware[];\n private readonly internalLogger: Logger;\n\n /**\n * Infinite recursion guard for `wrapStep`. Prevents a middleware from\n * wrapping steps it creates inside its own `wrapStep` via `ctx.step.run`.\n */\n private readonly activeWrapStep = new Set<Middleware.BaseMiddleware>();\n\n constructor(\n fnArg: Context.Any,\n getStepState: () => Record<string, MemoizedOp>,\n middleware: Middleware.BaseMiddleware[] = [],\n fn: InngestFunction.Any,\n logger: Logger,\n ) {\n this.fnArg = fnArg;\n this.getStepState = getStepState;\n this.middleware = middleware;\n this.fn = fn;\n this.internalLogger = logger;\n\n this.hasTransformStepInput = middleware.some((mw) =>\n Boolean(mw?.transformStepInput),\n );\n }\n\n hasMiddleware(): boolean {\n return this.middleware.length > 0;\n }\n\n /**\n * Derives step-kind, extracts input, runs `transformStepInput` middleware,\n * and creates a deferred handler entry point. Does NOT build the wrapStep\n * chain — the caller should do that after any post-processing (e.g. ID\n * collision resolution) so middleware sees final values.\n */\n async applyToStep(input: ApplyToStepInput): Promise<PreparedStep> {\n const stepType = stepTypeFromOpCode(\n input.op,\n input.opts,\n this.internalLogger,\n );\n const stepInput = stepInputFromOpts(stepType, input.opts);\n\n const stepInfo = this.buildStepInfo({\n hashedId: input.hashedId,\n userlandId: input.userlandId,\n displayName: input.displayName,\n memoized: input.memoized,\n stepType,\n input: stepInput,\n });\n\n // Only run transformStepInput if at least one middleware defines it. This\n // avoids some allocations that are unnecessary when no middleware will read\n // or mutate them.\n if (this.hasTransformStepInput) {\n const originalInput = stepInfo.input;\n const transformed = await this.transformStepInput(stepInfo);\n stepInfo.options = transformed.stepOptions;\n\n // Preserve undefined if input wasn't changed from the initial empty array\n if (originalInput === undefined && transformed.input.length === 0) {\n stepInfo.input = undefined;\n } else {\n stepInfo.input = transformed.input;\n }\n }\n\n // For sleep steps, if middleware transformed the input, re-derive the op\n // name (which encodes the wake-up time). If there's no input, the matchOp\n // already set the name directly.\n let opName: string | undefined;\n if (stepType === \"sleep\" && stepInfo.input !== undefined) {\n if (!isTimeStrInput(stepInfo.input[0])) {\n throw new Error(\"Sleep time must be a string, number, or Date\");\n }\n opName = timeStr(stepInfo.input[0]);\n }\n\n // Reverse the input→opts mapping for step kinds where the whole opts\n // object was wrapped as input (e.g. invoke, waitForEvent).\n const opOpts = optsFromStepInput(stepType, stepInfo.input);\n\n // Deferred handler pattern — actual handler set later based on memoization\n let actualHandler: (() => Promise<unknown>) | undefined;\n const entryPoint = async () => {\n if (!actualHandler) {\n throw new Error(\"Handler not initialized\");\n }\n return actualHandler();\n };\n const setActualHandler = (handler: () => Promise<unknown>) => {\n actualHandler = handler;\n };\n\n return {\n entryPoint,\n opName,\n opOpts,\n setActualHandler,\n stepInfo,\n };\n }\n\n private buildStepInfo(opts: StepInfoOptions): Middleware.StepInfo {\n return {\n hashedId: opts.hashedId,\n input: opts.input,\n memoized: opts.memoized,\n options: {\n id: opts.userlandId,\n ...(opts.displayName !== undefined && { name: opts.displayName }),\n },\n stepType: opts.stepType,\n };\n }\n\n private buildSteps(): Middleware.TransformFunctionInputArgs[\"steps\"] {\n const result: Middleware.TransformFunctionInputArgs[\"steps\"] = {};\n const stepState = this.getStepState();\n\n for (const [id, op] of Object.entries(stepState)) {\n if (op.error !== undefined) {\n result[id] = {\n type: \"error\" as const,\n error: op.error,\n };\n } else if (op.input !== undefined) {\n result[id] = {\n type: \"input\" as const,\n input: op.input,\n };\n } else {\n result[id] = {\n type: \"data\" as const,\n data: op.data,\n };\n }\n }\n\n return result;\n }\n\n /**\n * Apply transformFunctionInput middleware in forward order.\n * Each middleware builds on the previous result.\n */\n async transformFunctionInput(): Promise<Middleware.TransformFunctionInputArgs> {\n let result: Middleware.TransformFunctionInputArgs = {\n ctx: this.fnArg,\n fn: this.fn,\n steps: this.buildSteps(),\n };\n\n for (const mw of this.middleware) {\n if (mw?.transformFunctionInput) {\n result = await mw.transformFunctionInput(result);\n }\n }\n\n return result;\n }\n\n /**\n * Wrap a run handler with wrapFunctionHandler middlewares (reverse order for\n * onion layering, same pattern as wrapStepHandler).\n */\n wrapRunHandler(handler: () => Promise<unknown>): () => Promise<unknown> {\n let chain: () => Promise<unknown> = handler;\n for (let i = this.middleware.length - 1; i >= 0; i--) {\n const mw = this.middleware[i];\n if (mw?.wrapFunctionHandler) {\n const next = chain;\n chain = () =>\n mw.wrapFunctionHandler!({\n ctx: this.fnArg,\n fn: this.fn,\n next,\n });\n }\n }\n return chain;\n }\n\n /**\n * Apply transformStepInput middleware in forward order.\n * Each middleware builds on the previous result.\n */\n private async transformStepInput(\n stepInfo: Middleware.StepInfo,\n ): Promise<Middleware.TransformStepInputArgs> {\n let result: Middleware.TransformStepInputArgs = {\n fn: this.fn,\n stepInfo: {\n hashedId: stepInfo.hashedId,\n memoized: stepInfo.memoized,\n stepType: stepInfo.stepType,\n },\n stepOptions: { ...stepInfo.options },\n input: [...(stepInfo.input ?? [])],\n };\n\n for (const mw of this.middleware) {\n if (mw?.transformStepInput) {\n result = await mw.transformStepInput(result);\n }\n }\n\n return result;\n }\n\n /**\n * Wrap a step handler with wrapStep middlewares (reverse order for\n * onion layering). Returns the wrapped handler.\n */\n buildWrapStepChain(\n handler: () => Promise<unknown>,\n stepInfo: Middleware.StepInfo,\n ): () => Promise<unknown> {\n let chain: () => Promise<unknown> = handler;\n for (let i = this.middleware.length - 1; i >= 0; i--) {\n const mw = this.middleware[i];\n if (mw?.wrapStep) {\n const next = chain;\n chain = () => {\n if (!mw.wrapStep) {\n throw new UnreachableError(\"wrapStep is undefined\");\n }\n\n // Infinite recursion guard: skip if this middleware is already\n // executing\n if (this.activeWrapStep.has(mw)) {\n return next();\n }\n\n this.activeWrapStep.add(mw);\n\n // Remove from active while inside next() so only the middleware\n // that directly calls ctx.step.run() is guarded.\n const guardedNext = () => {\n this.activeWrapStep.delete(mw);\n return next().finally(() => {\n this.activeWrapStep.add(mw);\n });\n };\n\n return mw.wrapStep!({\n ctx: this.fnArg,\n fn: this.fn,\n next: guardedNext,\n stepInfo,\n }).finally(() => {\n this.activeWrapStep.delete(mw);\n });\n };\n }\n }\n return chain;\n }\n\n async onStepStart(stepInfo: Middleware.StepInfo): Promise<void> {\n for (const mw of this.middleware) {\n if (mw?.onStepStart) {\n try {\n await mw.onStepStart({\n ctx: this.fnArg,\n fn: this.fn,\n stepInfo,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onStepStart\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n\n async onStepComplete(\n stepInfo: Middleware.StepInfo,\n output: unknown,\n ): Promise<void> {\n for (const mw of this.middleware) {\n if (mw?.onStepComplete) {\n try {\n await mw.onStepComplete({\n ctx: this.fnArg,\n fn: this.fn,\n output,\n stepInfo,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onStepComplete\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n\n /**\n * Build a wrapStepHandler chain around the actual step handler.\n * Called once per `step.run` attempt (not for memoized steps).\n * Simpler than buildWrapStepChain — no recursion guard needed.\n */\n buildWrapStepHandlerChain(\n handler: () => Promise<unknown>,\n stepInfo: Middleware.StepInfo,\n ): () => Promise<unknown> {\n let chain: () => Promise<unknown> = handler;\n for (let i = this.middleware.length - 1; i >= 0; i--) {\n const mw = this.middleware[i];\n if (mw?.wrapStepHandler) {\n const next = chain;\n chain = () =>\n mw.wrapStepHandler!({\n ctx: this.fnArg,\n fn: this.fn,\n next,\n stepInfo,\n });\n }\n }\n return chain;\n }\n\n async onStepError(\n stepInfo: Middleware.StepInfo,\n error: Error,\n isFinalAttempt: boolean,\n ): Promise<void> {\n for (const mw of this.middleware) {\n if (mw?.onStepError) {\n try {\n await mw.onStepError({\n ctx: this.fnArg,\n error,\n fn: this.fn,\n isFinalAttempt,\n stepInfo,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onStepError\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n\n /**\n * Idempotent: safe to call from every code path that might end memoization.\n */\n async onMemoizationEnd(): Promise<void> {\n if (this.memoizationEnded) {\n return;\n }\n this.memoizationEnded = true;\n\n for (const mw of this.middleware) {\n if (mw?.onMemoizationEnd) {\n try {\n await mw.onMemoizationEnd({\n ctx: this.fnArg,\n fn: this.fn,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onMemoizationEnd\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n\n async onRunStart(): Promise<void> {\n for (const mw of this.middleware) {\n if (mw?.onRunStart) {\n try {\n await mw.onRunStart({\n ctx: this.fnArg,\n fn: this.fn,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onRunStart\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n\n async onRunComplete(output: unknown): Promise<void> {\n for (const mw of this.middleware) {\n if (mw?.onRunComplete) {\n try {\n await mw.onRunComplete({\n ctx: this.fnArg,\n fn: this.fn,\n output,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onRunComplete\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n\n async onRunError(error: Error, isFinalAttempt: boolean): Promise<void> {\n for (const mw of this.middleware) {\n if (mw?.onRunError) {\n try {\n await mw.onRunError({\n ctx: this.fnArg,\n error,\n fn: this.fn,\n isFinalAttempt,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onRunError\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"manager.cjs","names":["stepTypeFromOpCode","stepInputFromOpts","opName: string | undefined","isSleepInput","timeStr","optsFromStepInput","actualHandler: (() => Promise<unknown>) | undefined","result: Middleware.TransformFunctionInputArgs[\"steps\"]","result: Middleware.TransformFunctionInputArgs","chain: () => Promise<unknown>","result: Middleware.TransformStepInputArgs","UnreachableError"],"sources":["../../../src/components/middleware/manager.ts"],"sourcesContent":["import { timeStr } from \"../../helpers/strings.ts\";\nimport type { Logger } from \"../../middleware/logger.ts\";\nimport type { Context, StepOpCode } from \"../../types.ts\";\nimport type { MemoizedOp } from \"../execution/InngestExecution.ts\";\nimport type { InngestFunction } from \"../InngestFunction.ts\";\nimport type { Middleware } from \"./middleware.ts\";\nimport {\n isSleepInput,\n optsFromStepInput,\n stepInputFromOpts,\n stepTypeFromOpCode,\n UnreachableError,\n} from \"./utils.ts\";\n\nexport interface StepInfoOptions {\n hashedId: string;\n userlandId: string;\n displayName?: string;\n memoized: boolean;\n stepType: Middleware.StepType;\n input?: unknown[];\n}\n\nexport interface ApplyToStepInput {\n op: StepOpCode;\n opts?: Record<string, unknown>;\n hashedId: string;\n userlandId: string;\n displayName?: string;\n memoized: boolean;\n}\n\nexport interface PreparedStep {\n entryPoint: () => Promise<unknown>;\n\n /**\n * Only used for sleep steps. The sleep's wake-up time must be in the op name,\n * and that may be changed by the `transformStepInput` hook. The user-facing\n * name is actually the op's `displayName` field (yes, that's confusing).\n */\n opName?: string;\n\n /**\n * For step kinds where middleware input maps to the outgoing op's opts\n * (e.g. invoke, waitForEvent). Derived by reversing `stepInputFromOpts`.\n */\n opOpts?: Record<string, unknown>;\n\n setActualHandler: (handler: () => Promise<unknown>) => void;\n stepInfo: Middleware.StepInfo;\n}\n\n/**\n * Manages middleware. Hides middleware complexity from elsewhere in the\n * codebase. Not for for public use.\n */\nexport class MiddlewareManager {\n private readonly fnArg: Context.Any;\n private readonly getStepState: () => Record<string, MemoizedOp>;\n\n /**\n * Whether any middleware defines `transformStepInput`. Used for perf\n * optimization.\n */\n private readonly hasTransformStepInput: boolean;\n\n /**\n * Whether memoization has ended. Used for idempotency, since memoization must\n * only call once per request.\n */\n private memoizationEnded = false;\n\n private readonly fn: InngestFunction.Any;\n private readonly middleware: Middleware.BaseMiddleware[];\n private readonly internalLogger: Logger;\n\n /**\n * Infinite recursion guard for `wrapStep`. Prevents a middleware from\n * wrapping steps it creates inside its own `wrapStep` via `ctx.step.run`.\n */\n private readonly activeWrapStep = new Set<Middleware.BaseMiddleware>();\n\n constructor(\n fnArg: Context.Any,\n getStepState: () => Record<string, MemoizedOp>,\n middleware: Middleware.BaseMiddleware[] = [],\n fn: InngestFunction.Any,\n logger: Logger,\n ) {\n this.fnArg = fnArg;\n this.getStepState = getStepState;\n this.middleware = middleware;\n this.fn = fn;\n this.internalLogger = logger;\n\n this.hasTransformStepInput = middleware.some((mw) =>\n Boolean(mw?.transformStepInput),\n );\n }\n\n hasMiddleware(): boolean {\n return this.middleware.length > 0;\n }\n\n /**\n * Derives step-kind, extracts input, runs `transformStepInput` middleware,\n * and creates a deferred handler entry point. Does NOT build the wrapStep\n * chain — the caller should do that after any post-processing (e.g. ID\n * collision resolution) so middleware sees final values.\n */\n async applyToStep(input: ApplyToStepInput): Promise<PreparedStep> {\n const stepType = stepTypeFromOpCode(\n input.op,\n input.opts,\n this.internalLogger,\n );\n const stepInput = stepInputFromOpts(stepType, input.opts);\n\n const stepInfo = this.buildStepInfo({\n hashedId: input.hashedId,\n userlandId: input.userlandId,\n displayName: input.displayName,\n memoized: input.memoized,\n stepType,\n input: stepInput,\n });\n\n // Only run transformStepInput if at least one middleware defines it. This\n // avoids some allocations that are unnecessary when no middleware will read\n // or mutate them.\n if (this.hasTransformStepInput) {\n const originalInput = stepInfo.input;\n const transformed = await this.transformStepInput(stepInfo);\n stepInfo.options = transformed.stepOptions;\n\n // Preserve undefined if input wasn't changed from the initial empty array\n if (originalInput === undefined && transformed.input.length === 0) {\n stepInfo.input = undefined;\n } else {\n stepInfo.input = transformed.input;\n }\n }\n\n // For sleep steps, if middleware transformed the input, re-derive the op\n // name (which encodes the wake-up time). If there's no input, the matchOp\n // already set the name directly.\n let opName: string | undefined;\n if (stepType === \"sleep\" && stepInfo.input !== undefined) {\n if (!isSleepInput(stepInfo.input[0])) {\n throw new Error(\n \"Sleep time must be a string, number, Date, or Temporal.Duration\",\n );\n }\n opName = timeStr(stepInfo.input[0]);\n }\n\n // Reverse the input→opts mapping for step kinds where the whole opts\n // object was wrapped as input (e.g. invoke, waitForEvent).\n const opOpts = optsFromStepInput(stepType, stepInfo.input);\n\n // Deferred handler pattern — actual handler set later based on memoization\n let actualHandler: (() => Promise<unknown>) | undefined;\n const entryPoint = async () => {\n if (!actualHandler) {\n throw new Error(\"Handler not initialized\");\n }\n return actualHandler();\n };\n const setActualHandler = (handler: () => Promise<unknown>) => {\n actualHandler = handler;\n };\n\n return {\n entryPoint,\n opName,\n opOpts,\n setActualHandler,\n stepInfo,\n };\n }\n\n private buildStepInfo(opts: StepInfoOptions): Middleware.StepInfo {\n return {\n hashedId: opts.hashedId,\n input: opts.input,\n memoized: opts.memoized,\n options: {\n id: opts.userlandId,\n ...(opts.displayName !== undefined && { name: opts.displayName }),\n },\n stepType: opts.stepType,\n };\n }\n\n private buildSteps(): Middleware.TransformFunctionInputArgs[\"steps\"] {\n const result: Middleware.TransformFunctionInputArgs[\"steps\"] = {};\n const stepState = this.getStepState();\n\n for (const [id, op] of Object.entries(stepState)) {\n if (op.error !== undefined) {\n result[id] = {\n type: \"error\" as const,\n error: op.error,\n };\n } else if (op.input !== undefined) {\n result[id] = {\n type: \"input\" as const,\n input: op.input,\n };\n } else {\n result[id] = {\n type: \"data\" as const,\n data: op.data,\n };\n }\n }\n\n return result;\n }\n\n /**\n * Apply transformFunctionInput middleware in forward order.\n * Each middleware builds on the previous result.\n */\n async transformFunctionInput(): Promise<Middleware.TransformFunctionInputArgs> {\n let result: Middleware.TransformFunctionInputArgs = {\n ctx: this.fnArg,\n fn: this.fn,\n steps: this.buildSteps(),\n };\n\n for (const mw of this.middleware) {\n if (mw?.transformFunctionInput) {\n result = await mw.transformFunctionInput(result);\n }\n }\n\n return result;\n }\n\n /**\n * Wrap a run handler with wrapFunctionHandler middlewares (reverse order for\n * onion layering, same pattern as wrapStepHandler).\n */\n wrapRunHandler(handler: () => Promise<unknown>): () => Promise<unknown> {\n let chain: () => Promise<unknown> = handler;\n for (let i = this.middleware.length - 1; i >= 0; i--) {\n const mw = this.middleware[i];\n if (mw?.wrapFunctionHandler) {\n const next = chain;\n chain = () =>\n mw.wrapFunctionHandler!({\n ctx: this.fnArg,\n fn: this.fn,\n next,\n });\n }\n }\n return chain;\n }\n\n /**\n * Apply transformStepInput middleware in forward order.\n * Each middleware builds on the previous result.\n */\n private async transformStepInput(\n stepInfo: Middleware.StepInfo,\n ): Promise<Middleware.TransformStepInputArgs> {\n let result: Middleware.TransformStepInputArgs = {\n fn: this.fn,\n stepInfo: {\n hashedId: stepInfo.hashedId,\n memoized: stepInfo.memoized,\n stepType: stepInfo.stepType,\n },\n stepOptions: { ...stepInfo.options },\n input: [...(stepInfo.input ?? [])],\n };\n\n for (const mw of this.middleware) {\n if (mw?.transformStepInput) {\n result = await mw.transformStepInput(result);\n }\n }\n\n return result;\n }\n\n /**\n * Wrap a step handler with wrapStep middlewares (reverse order for\n * onion layering). Returns the wrapped handler.\n */\n buildWrapStepChain(\n handler: () => Promise<unknown>,\n stepInfo: Middleware.StepInfo,\n ): () => Promise<unknown> {\n let chain: () => Promise<unknown> = handler;\n for (let i = this.middleware.length - 1; i >= 0; i--) {\n const mw = this.middleware[i];\n if (mw?.wrapStep) {\n const next = chain;\n chain = () => {\n if (!mw.wrapStep) {\n throw new UnreachableError(\"wrapStep is undefined\");\n }\n\n // Infinite recursion guard: skip if this middleware is already\n // executing\n if (this.activeWrapStep.has(mw)) {\n return next();\n }\n\n this.activeWrapStep.add(mw);\n\n // Remove from active while inside next() so only the middleware\n // that directly calls ctx.step.run() is guarded.\n const guardedNext = () => {\n this.activeWrapStep.delete(mw);\n return next().finally(() => {\n this.activeWrapStep.add(mw);\n });\n };\n\n return mw.wrapStep!({\n ctx: this.fnArg,\n fn: this.fn,\n next: guardedNext,\n stepInfo,\n }).finally(() => {\n this.activeWrapStep.delete(mw);\n });\n };\n }\n }\n return chain;\n }\n\n async onStepStart(stepInfo: Middleware.StepInfo): Promise<void> {\n for (const mw of this.middleware) {\n if (mw?.onStepStart) {\n try {\n await mw.onStepStart({\n ctx: this.fnArg,\n fn: this.fn,\n stepInfo,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onStepStart\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n\n async onStepComplete(\n stepInfo: Middleware.StepInfo,\n output: unknown,\n ): Promise<void> {\n for (const mw of this.middleware) {\n if (mw?.onStepComplete) {\n try {\n await mw.onStepComplete({\n ctx: this.fnArg,\n fn: this.fn,\n output,\n stepInfo,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onStepComplete\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n\n /**\n * Build a wrapStepHandler chain around the actual step handler.\n * Called once per `step.run` attempt (not for memoized steps).\n * Simpler than buildWrapStepChain — no recursion guard needed.\n */\n buildWrapStepHandlerChain(\n handler: () => Promise<unknown>,\n stepInfo: Middleware.StepInfo,\n ): () => Promise<unknown> {\n let chain: () => Promise<unknown> = handler;\n for (let i = this.middleware.length - 1; i >= 0; i--) {\n const mw = this.middleware[i];\n if (mw?.wrapStepHandler) {\n const next = chain;\n chain = () =>\n mw.wrapStepHandler!({\n ctx: this.fnArg,\n fn: this.fn,\n next,\n stepInfo,\n });\n }\n }\n return chain;\n }\n\n async onStepError(\n stepInfo: Middleware.StepInfo,\n error: Error,\n isFinalAttempt: boolean,\n ): Promise<void> {\n for (const mw of this.middleware) {\n if (mw?.onStepError) {\n try {\n await mw.onStepError({\n ctx: this.fnArg,\n error,\n fn: this.fn,\n isFinalAttempt,\n stepInfo,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onStepError\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n\n /**\n * Idempotent: safe to call from every code path that might end memoization.\n */\n async onMemoizationEnd(): Promise<void> {\n if (this.memoizationEnded) {\n return;\n }\n this.memoizationEnded = true;\n\n for (const mw of this.middleware) {\n if (mw?.onMemoizationEnd) {\n try {\n await mw.onMemoizationEnd({\n ctx: this.fnArg,\n fn: this.fn,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onMemoizationEnd\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n\n async onRunStart(): Promise<void> {\n for (const mw of this.middleware) {\n if (mw?.onRunStart) {\n try {\n await mw.onRunStart({\n ctx: this.fnArg,\n fn: this.fn,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onRunStart\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n\n async onRunComplete(output: unknown): Promise<void> {\n for (const mw of this.middleware) {\n if (mw?.onRunComplete) {\n try {\n await mw.onRunComplete({\n ctx: this.fnArg,\n fn: this.fn,\n output,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onRunComplete\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n\n async onRunError(error: Error, isFinalAttempt: boolean): Promise<void> {\n for (const mw of this.middleware) {\n if (mw?.onRunError) {\n try {\n await mw.onRunError({\n ctx: this.fnArg,\n error,\n fn: this.fn,\n isFinalAttempt,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onRunError\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n}\n"],"mappings":";;;;;;;;AAwDA,IAAa,oBAAb,MAA+B;CAC7B,AAAiB;CACjB,AAAiB;;;;;CAMjB,AAAiB;;;;;CAMjB,AAAQ,mBAAmB;CAE3B,AAAiB;CACjB,AAAiB;CACjB,AAAiB;;;;;CAMjB,AAAiB,iCAAiB,IAAI,KAAgC;CAEtE,YACE,OACA,cACA,aAA0C,EAAE,EAC5C,IACA,QACA;AACA,OAAK,QAAQ;AACb,OAAK,eAAe;AACpB,OAAK,aAAa;AAClB,OAAK,KAAK;AACV,OAAK,iBAAiB;AAEtB,OAAK,wBAAwB,WAAW,MAAM,OAC5C,QAAQ,IAAI,mBAAmB,CAChC;;CAGH,gBAAyB;AACvB,SAAO,KAAK,WAAW,SAAS;;;;;;;;CASlC,MAAM,YAAY,OAAgD;EAChE,MAAM,WAAWA,iCACf,MAAM,IACN,MAAM,MACN,KAAK,eACN;EACD,MAAM,YAAYC,gCAAkB,UAAU,MAAM,KAAK;EAEzD,MAAM,WAAW,KAAK,cAAc;GAClC,UAAU,MAAM;GAChB,YAAY,MAAM;GAClB,aAAa,MAAM;GACnB,UAAU,MAAM;GAChB;GACA,OAAO;GACR,CAAC;AAKF,MAAI,KAAK,uBAAuB;GAC9B,MAAM,gBAAgB,SAAS;GAC/B,MAAM,cAAc,MAAM,KAAK,mBAAmB,SAAS;AAC3D,YAAS,UAAU,YAAY;AAG/B,OAAI,kBAAkB,UAAa,YAAY,MAAM,WAAW,EAC9D,UAAS,QAAQ;OAEjB,UAAS,QAAQ,YAAY;;EAOjC,IAAIC;AACJ,MAAI,aAAa,WAAW,SAAS,UAAU,QAAW;AACxD,OAAI,CAACC,2BAAa,SAAS,MAAM,GAAG,CAClC,OAAM,IAAI,MACR,kEACD;AAEH,YAASC,wBAAQ,SAAS,MAAM,GAAG;;EAKrC,MAAM,SAASC,gCAAkB,UAAU,SAAS,MAAM;EAG1D,IAAIC;EACJ,MAAM,aAAa,YAAY;AAC7B,OAAI,CAAC,cACH,OAAM,IAAI,MAAM,0BAA0B;AAE5C,UAAO,eAAe;;EAExB,MAAM,oBAAoB,YAAoC;AAC5D,mBAAgB;;AAGlB,SAAO;GACL;GACA;GACA;GACA;GACA;GACD;;CAGH,AAAQ,cAAc,MAA4C;AAChE,SAAO;GACL,UAAU,KAAK;GACf,OAAO,KAAK;GACZ,UAAU,KAAK;GACf,SAAS;IACP,IAAI,KAAK;IACT,GAAI,KAAK,gBAAgB,UAAa,EAAE,MAAM,KAAK,aAAa;IACjE;GACD,UAAU,KAAK;GAChB;;CAGH,AAAQ,aAA6D;EACnE,MAAMC,SAAyD,EAAE;EACjE,MAAM,YAAY,KAAK,cAAc;AAErC,OAAK,MAAM,CAAC,IAAI,OAAO,OAAO,QAAQ,UAAU,CAC9C,KAAI,GAAG,UAAU,OACf,QAAO,MAAM;GACX,MAAM;GACN,OAAO,GAAG;GACX;WACQ,GAAG,UAAU,OACtB,QAAO,MAAM;GACX,MAAM;GACN,OAAO,GAAG;GACX;MAED,QAAO,MAAM;GACX,MAAM;GACN,MAAM,GAAG;GACV;AAIL,SAAO;;;;;;CAOT,MAAM,yBAAyE;EAC7E,IAAIC,SAAgD;GAClD,KAAK,KAAK;GACV,IAAI,KAAK;GACT,OAAO,KAAK,YAAY;GACzB;AAED,OAAK,MAAM,MAAM,KAAK,WACpB,KAAI,IAAI,uBACN,UAAS,MAAM,GAAG,uBAAuB,OAAO;AAIpD,SAAO;;;;;;CAOT,eAAe,SAAyD;EACtE,IAAIC,QAAgC;AACpC,OAAK,IAAI,IAAI,KAAK,WAAW,SAAS,GAAG,KAAK,GAAG,KAAK;GACpD,MAAM,KAAK,KAAK,WAAW;AAC3B,OAAI,IAAI,qBAAqB;IAC3B,MAAM,OAAO;AACb,kBACE,GAAG,oBAAqB;KACtB,KAAK,KAAK;KACV,IAAI,KAAK;KACT;KACD,CAAC;;;AAGR,SAAO;;;;;;CAOT,MAAc,mBACZ,UAC4C;EAC5C,IAAIC,SAA4C;GAC9C,IAAI,KAAK;GACT,UAAU;IACR,UAAU,SAAS;IACnB,UAAU,SAAS;IACnB,UAAU,SAAS;IACpB;GACD,aAAa,EAAE,GAAG,SAAS,SAAS;GACpC,OAAO,CAAC,GAAI,SAAS,SAAS,EAAE,CAAE;GACnC;AAED,OAAK,MAAM,MAAM,KAAK,WACpB,KAAI,IAAI,mBACN,UAAS,MAAM,GAAG,mBAAmB,OAAO;AAIhD,SAAO;;;;;;CAOT,mBACE,SACA,UACwB;EACxB,IAAID,QAAgC;AACpC,OAAK,IAAI,IAAI,KAAK,WAAW,SAAS,GAAG,KAAK,GAAG,KAAK;GACpD,MAAM,KAAK,KAAK,WAAW;AAC3B,OAAI,IAAI,UAAU;IAChB,MAAM,OAAO;AACb,kBAAc;AACZ,SAAI,CAAC,GAAG,SACN,OAAM,IAAIE,+BAAiB,wBAAwB;AAKrD,SAAI,KAAK,eAAe,IAAI,GAAG,CAC7B,QAAO,MAAM;AAGf,UAAK,eAAe,IAAI,GAAG;KAI3B,MAAM,oBAAoB;AACxB,WAAK,eAAe,OAAO,GAAG;AAC9B,aAAO,MAAM,CAAC,cAAc;AAC1B,YAAK,eAAe,IAAI,GAAG;QAC3B;;AAGJ,YAAO,GAAG,SAAU;MAClB,KAAK,KAAK;MACV,IAAI,KAAK;MACT,MAAM;MACN;MACD,CAAC,CAAC,cAAc;AACf,WAAK,eAAe,OAAO,GAAG;OAC9B;;;;AAIR,SAAO;;CAGT,MAAM,YAAY,UAA8C;AAC9D,OAAK,MAAM,MAAM,KAAK,WACpB,KAAI,IAAI,YACN,KAAI;AACF,SAAM,GAAG,YAAY;IACnB,KAAK,KAAK;IACV,IAAI,KAAK;IACT;IACD,CAAC;WACK,KAAK;AACZ,QAAK,eAAe,MAClB;IACE;IACA,MAAM;IACN,IAAI,GAAG;IACR,EACD,mBACD;;;CAMT,MAAM,eACJ,UACA,QACe;AACf,OAAK,MAAM,MAAM,KAAK,WACpB,KAAI,IAAI,eACN,KAAI;AACF,SAAM,GAAG,eAAe;IACtB,KAAK,KAAK;IACV,IAAI,KAAK;IACT;IACA;IACD,CAAC;WACK,KAAK;AACZ,QAAK,eAAe,MAClB;IACE;IACA,MAAM;IACN,IAAI,GAAG;IACR,EACD,mBACD;;;;;;;;CAWT,0BACE,SACA,UACwB;EACxB,IAAIF,QAAgC;AACpC,OAAK,IAAI,IAAI,KAAK,WAAW,SAAS,GAAG,KAAK,GAAG,KAAK;GACpD,MAAM,KAAK,KAAK,WAAW;AAC3B,OAAI,IAAI,iBAAiB;IACvB,MAAM,OAAO;AACb,kBACE,GAAG,gBAAiB;KAClB,KAAK,KAAK;KACV,IAAI,KAAK;KACT;KACA;KACD,CAAC;;;AAGR,SAAO;;CAGT,MAAM,YACJ,UACA,OACA,gBACe;AACf,OAAK,MAAM,MAAM,KAAK,WACpB,KAAI,IAAI,YACN,KAAI;AACF,SAAM,GAAG,YAAY;IACnB,KAAK,KAAK;IACV;IACA,IAAI,KAAK;IACT;IACA;IACD,CAAC;WACK,KAAK;AACZ,QAAK,eAAe,MAClB;IACE;IACA,MAAM;IACN,IAAI,GAAG;IACR,EACD,mBACD;;;;;;CAST,MAAM,mBAAkC;AACtC,MAAI,KAAK,iBACP;AAEF,OAAK,mBAAmB;AAExB,OAAK,MAAM,MAAM,KAAK,WACpB,KAAI,IAAI,iBACN,KAAI;AACF,SAAM,GAAG,iBAAiB;IACxB,KAAK,KAAK;IACV,IAAI,KAAK;IACV,CAAC;WACK,KAAK;AACZ,QAAK,eAAe,MAClB;IACE;IACA,MAAM;IACN,IAAI,GAAG;IACR,EACD,mBACD;;;CAMT,MAAM,aAA4B;AAChC,OAAK,MAAM,MAAM,KAAK,WACpB,KAAI,IAAI,WACN,KAAI;AACF,SAAM,GAAG,WAAW;IAClB,KAAK,KAAK;IACV,IAAI,KAAK;IACV,CAAC;WACK,KAAK;AACZ,QAAK,eAAe,MAClB;IACE;IACA,MAAM;IACN,IAAI,GAAG;IACR,EACD,mBACD;;;CAMT,MAAM,cAAc,QAAgC;AAClD,OAAK,MAAM,MAAM,KAAK,WACpB,KAAI,IAAI,cACN,KAAI;AACF,SAAM,GAAG,cAAc;IACrB,KAAK,KAAK;IACV,IAAI,KAAK;IACT;IACD,CAAC;WACK,KAAK;AACZ,QAAK,eAAe,MAClB;IACE;IACA,MAAM;IACN,IAAI,GAAG;IACR,EACD,mBACD;;;CAMT,MAAM,WAAW,OAAc,gBAAwC;AACrE,OAAK,MAAM,MAAM,KAAK,WACpB,KAAI,IAAI,WACN,KAAI;AACF,SAAM,GAAG,WAAW;IAClB,KAAK,KAAK;IACV;IACA,IAAI,KAAK;IACT;IACD,CAAC;WACK,KAAK;AACZ,QAAK,eAAe,MAClB;IACE;IACA,MAAM;IACN,IAAI,GAAG;IACR,EACD,mBACD"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { timeStr } from "../../helpers/strings.js";
|
|
2
|
-
import { UnreachableError,
|
|
2
|
+
import { UnreachableError, isSleepInput, optsFromStepInput, stepInputFromOpts, stepTypeFromOpCode } from "./utils.js";
|
|
3
3
|
|
|
4
4
|
//#region src/components/middleware/manager.ts
|
|
5
5
|
/**
|
|
@@ -64,7 +64,7 @@ var MiddlewareManager = class {
|
|
|
64
64
|
}
|
|
65
65
|
let opName;
|
|
66
66
|
if (stepType === "sleep" && stepInfo.input !== void 0) {
|
|
67
|
-
if (!
|
|
67
|
+
if (!isSleepInput(stepInfo.input[0])) throw new Error("Sleep time must be a string, number, Date, or Temporal.Duration");
|
|
68
68
|
opName = timeStr(stepInfo.input[0]);
|
|
69
69
|
}
|
|
70
70
|
const opOpts = optsFromStepInput(stepType, stepInfo.input);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","names":["opName: string | undefined","actualHandler: (() => Promise<unknown>) | undefined","result: Middleware.TransformFunctionInputArgs[\"steps\"]","result: Middleware.TransformFunctionInputArgs","chain: () => Promise<unknown>","result: Middleware.TransformStepInputArgs"],"sources":["../../../src/components/middleware/manager.ts"],"sourcesContent":["import { timeStr } from \"../../helpers/strings.ts\";\nimport type { Logger } from \"../../middleware/logger.ts\";\nimport type { Context, StepOpCode } from \"../../types.ts\";\nimport type { MemoizedOp } from \"../execution/InngestExecution.ts\";\nimport type { InngestFunction } from \"../InngestFunction.ts\";\nimport type { Middleware } from \"./middleware.ts\";\nimport {\n isTimeStrInput,\n optsFromStepInput,\n stepInputFromOpts,\n stepTypeFromOpCode,\n UnreachableError,\n} from \"./utils.ts\";\n\nexport interface StepInfoOptions {\n hashedId: string;\n userlandId: string;\n displayName?: string;\n memoized: boolean;\n stepType: Middleware.StepType;\n input?: unknown[];\n}\n\nexport interface ApplyToStepInput {\n op: StepOpCode;\n opts?: Record<string, unknown>;\n hashedId: string;\n userlandId: string;\n displayName?: string;\n memoized: boolean;\n}\n\nexport interface PreparedStep {\n entryPoint: () => Promise<unknown>;\n\n /**\n * Only used for sleep steps. The sleep's wake-up time must be in the op name,\n * and that may be changed by the `transformStepInput` hook. The user-facing\n * name is actually the op's `displayName` field (yes, that's confusing).\n */\n opName?: string;\n\n /**\n * For step kinds where middleware input maps to the outgoing op's opts\n * (e.g. invoke, waitForEvent). Derived by reversing `stepInputFromOpts`.\n */\n opOpts?: Record<string, unknown>;\n\n setActualHandler: (handler: () => Promise<unknown>) => void;\n stepInfo: Middleware.StepInfo;\n}\n\n/**\n * Manages middleware. Hides middleware complexity from elsewhere in the\n * codebase. Not for for public use.\n */\nexport class MiddlewareManager {\n private readonly fnArg: Context.Any;\n private readonly getStepState: () => Record<string, MemoizedOp>;\n\n /**\n * Whether any middleware defines `transformStepInput`. Used for perf\n * optimization.\n */\n private readonly hasTransformStepInput: boolean;\n\n /**\n * Whether memoization has ended. Used for idempotency, since memoization must\n * only call once per request.\n */\n private memoizationEnded = false;\n\n private readonly fn: InngestFunction.Any;\n private readonly middleware: Middleware.BaseMiddleware[];\n private readonly internalLogger: Logger;\n\n /**\n * Infinite recursion guard for `wrapStep`. Prevents a middleware from\n * wrapping steps it creates inside its own `wrapStep` via `ctx.step.run`.\n */\n private readonly activeWrapStep = new Set<Middleware.BaseMiddleware>();\n\n constructor(\n fnArg: Context.Any,\n getStepState: () => Record<string, MemoizedOp>,\n middleware: Middleware.BaseMiddleware[] = [],\n fn: InngestFunction.Any,\n logger: Logger,\n ) {\n this.fnArg = fnArg;\n this.getStepState = getStepState;\n this.middleware = middleware;\n this.fn = fn;\n this.internalLogger = logger;\n\n this.hasTransformStepInput = middleware.some((mw) =>\n Boolean(mw?.transformStepInput),\n );\n }\n\n hasMiddleware(): boolean {\n return this.middleware.length > 0;\n }\n\n /**\n * Derives step-kind, extracts input, runs `transformStepInput` middleware,\n * and creates a deferred handler entry point. Does NOT build the wrapStep\n * chain — the caller should do that after any post-processing (e.g. ID\n * collision resolution) so middleware sees final values.\n */\n async applyToStep(input: ApplyToStepInput): Promise<PreparedStep> {\n const stepType = stepTypeFromOpCode(\n input.op,\n input.opts,\n this.internalLogger,\n );\n const stepInput = stepInputFromOpts(stepType, input.opts);\n\n const stepInfo = this.buildStepInfo({\n hashedId: input.hashedId,\n userlandId: input.userlandId,\n displayName: input.displayName,\n memoized: input.memoized,\n stepType,\n input: stepInput,\n });\n\n // Only run transformStepInput if at least one middleware defines it. This\n // avoids some allocations that are unnecessary when no middleware will read\n // or mutate them.\n if (this.hasTransformStepInput) {\n const originalInput = stepInfo.input;\n const transformed = await this.transformStepInput(stepInfo);\n stepInfo.options = transformed.stepOptions;\n\n // Preserve undefined if input wasn't changed from the initial empty array\n if (originalInput === undefined && transformed.input.length === 0) {\n stepInfo.input = undefined;\n } else {\n stepInfo.input = transformed.input;\n }\n }\n\n // For sleep steps, if middleware transformed the input, re-derive the op\n // name (which encodes the wake-up time). If there's no input, the matchOp\n // already set the name directly.\n let opName: string | undefined;\n if (stepType === \"sleep\" && stepInfo.input !== undefined) {\n if (!isTimeStrInput(stepInfo.input[0])) {\n throw new Error(\"Sleep time must be a string, number, or Date\");\n }\n opName = timeStr(stepInfo.input[0]);\n }\n\n // Reverse the input→opts mapping for step kinds where the whole opts\n // object was wrapped as input (e.g. invoke, waitForEvent).\n const opOpts = optsFromStepInput(stepType, stepInfo.input);\n\n // Deferred handler pattern — actual handler set later based on memoization\n let actualHandler: (() => Promise<unknown>) | undefined;\n const entryPoint = async () => {\n if (!actualHandler) {\n throw new Error(\"Handler not initialized\");\n }\n return actualHandler();\n };\n const setActualHandler = (handler: () => Promise<unknown>) => {\n actualHandler = handler;\n };\n\n return {\n entryPoint,\n opName,\n opOpts,\n setActualHandler,\n stepInfo,\n };\n }\n\n private buildStepInfo(opts: StepInfoOptions): Middleware.StepInfo {\n return {\n hashedId: opts.hashedId,\n input: opts.input,\n memoized: opts.memoized,\n options: {\n id: opts.userlandId,\n ...(opts.displayName !== undefined && { name: opts.displayName }),\n },\n stepType: opts.stepType,\n };\n }\n\n private buildSteps(): Middleware.TransformFunctionInputArgs[\"steps\"] {\n const result: Middleware.TransformFunctionInputArgs[\"steps\"] = {};\n const stepState = this.getStepState();\n\n for (const [id, op] of Object.entries(stepState)) {\n if (op.error !== undefined) {\n result[id] = {\n type: \"error\" as const,\n error: op.error,\n };\n } else if (op.input !== undefined) {\n result[id] = {\n type: \"input\" as const,\n input: op.input,\n };\n } else {\n result[id] = {\n type: \"data\" as const,\n data: op.data,\n };\n }\n }\n\n return result;\n }\n\n /**\n * Apply transformFunctionInput middleware in forward order.\n * Each middleware builds on the previous result.\n */\n async transformFunctionInput(): Promise<Middleware.TransformFunctionInputArgs> {\n let result: Middleware.TransformFunctionInputArgs = {\n ctx: this.fnArg,\n fn: this.fn,\n steps: this.buildSteps(),\n };\n\n for (const mw of this.middleware) {\n if (mw?.transformFunctionInput) {\n result = await mw.transformFunctionInput(result);\n }\n }\n\n return result;\n }\n\n /**\n * Wrap a run handler with wrapFunctionHandler middlewares (reverse order for\n * onion layering, same pattern as wrapStepHandler).\n */\n wrapRunHandler(handler: () => Promise<unknown>): () => Promise<unknown> {\n let chain: () => Promise<unknown> = handler;\n for (let i = this.middleware.length - 1; i >= 0; i--) {\n const mw = this.middleware[i];\n if (mw?.wrapFunctionHandler) {\n const next = chain;\n chain = () =>\n mw.wrapFunctionHandler!({\n ctx: this.fnArg,\n fn: this.fn,\n next,\n });\n }\n }\n return chain;\n }\n\n /**\n * Apply transformStepInput middleware in forward order.\n * Each middleware builds on the previous result.\n */\n private async transformStepInput(\n stepInfo: Middleware.StepInfo,\n ): Promise<Middleware.TransformStepInputArgs> {\n let result: Middleware.TransformStepInputArgs = {\n fn: this.fn,\n stepInfo: {\n hashedId: stepInfo.hashedId,\n memoized: stepInfo.memoized,\n stepType: stepInfo.stepType,\n },\n stepOptions: { ...stepInfo.options },\n input: [...(stepInfo.input ?? [])],\n };\n\n for (const mw of this.middleware) {\n if (mw?.transformStepInput) {\n result = await mw.transformStepInput(result);\n }\n }\n\n return result;\n }\n\n /**\n * Wrap a step handler with wrapStep middlewares (reverse order for\n * onion layering). Returns the wrapped handler.\n */\n buildWrapStepChain(\n handler: () => Promise<unknown>,\n stepInfo: Middleware.StepInfo,\n ): () => Promise<unknown> {\n let chain: () => Promise<unknown> = handler;\n for (let i = this.middleware.length - 1; i >= 0; i--) {\n const mw = this.middleware[i];\n if (mw?.wrapStep) {\n const next = chain;\n chain = () => {\n if (!mw.wrapStep) {\n throw new UnreachableError(\"wrapStep is undefined\");\n }\n\n // Infinite recursion guard: skip if this middleware is already\n // executing\n if (this.activeWrapStep.has(mw)) {\n return next();\n }\n\n this.activeWrapStep.add(mw);\n\n // Remove from active while inside next() so only the middleware\n // that directly calls ctx.step.run() is guarded.\n const guardedNext = () => {\n this.activeWrapStep.delete(mw);\n return next().finally(() => {\n this.activeWrapStep.add(mw);\n });\n };\n\n return mw.wrapStep!({\n ctx: this.fnArg,\n fn: this.fn,\n next: guardedNext,\n stepInfo,\n }).finally(() => {\n this.activeWrapStep.delete(mw);\n });\n };\n }\n }\n return chain;\n }\n\n async onStepStart(stepInfo: Middleware.StepInfo): Promise<void> {\n for (const mw of this.middleware) {\n if (mw?.onStepStart) {\n try {\n await mw.onStepStart({\n ctx: this.fnArg,\n fn: this.fn,\n stepInfo,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onStepStart\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n\n async onStepComplete(\n stepInfo: Middleware.StepInfo,\n output: unknown,\n ): Promise<void> {\n for (const mw of this.middleware) {\n if (mw?.onStepComplete) {\n try {\n await mw.onStepComplete({\n ctx: this.fnArg,\n fn: this.fn,\n output,\n stepInfo,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onStepComplete\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n\n /**\n * Build a wrapStepHandler chain around the actual step handler.\n * Called once per `step.run` attempt (not for memoized steps).\n * Simpler than buildWrapStepChain — no recursion guard needed.\n */\n buildWrapStepHandlerChain(\n handler: () => Promise<unknown>,\n stepInfo: Middleware.StepInfo,\n ): () => Promise<unknown> {\n let chain: () => Promise<unknown> = handler;\n for (let i = this.middleware.length - 1; i >= 0; i--) {\n const mw = this.middleware[i];\n if (mw?.wrapStepHandler) {\n const next = chain;\n chain = () =>\n mw.wrapStepHandler!({\n ctx: this.fnArg,\n fn: this.fn,\n next,\n stepInfo,\n });\n }\n }\n return chain;\n }\n\n async onStepError(\n stepInfo: Middleware.StepInfo,\n error: Error,\n isFinalAttempt: boolean,\n ): Promise<void> {\n for (const mw of this.middleware) {\n if (mw?.onStepError) {\n try {\n await mw.onStepError({\n ctx: this.fnArg,\n error,\n fn: this.fn,\n isFinalAttempt,\n stepInfo,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onStepError\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n\n /**\n * Idempotent: safe to call from every code path that might end memoization.\n */\n async onMemoizationEnd(): Promise<void> {\n if (this.memoizationEnded) {\n return;\n }\n this.memoizationEnded = true;\n\n for (const mw of this.middleware) {\n if (mw?.onMemoizationEnd) {\n try {\n await mw.onMemoizationEnd({\n ctx: this.fnArg,\n fn: this.fn,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onMemoizationEnd\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n\n async onRunStart(): Promise<void> {\n for (const mw of this.middleware) {\n if (mw?.onRunStart) {\n try {\n await mw.onRunStart({\n ctx: this.fnArg,\n fn: this.fn,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onRunStart\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n\n async onRunComplete(output: unknown): Promise<void> {\n for (const mw of this.middleware) {\n if (mw?.onRunComplete) {\n try {\n await mw.onRunComplete({\n ctx: this.fnArg,\n fn: this.fn,\n output,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onRunComplete\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n\n async onRunError(error: Error, isFinalAttempt: boolean): Promise<void> {\n for (const mw of this.middleware) {\n if (mw?.onRunError) {\n try {\n await mw.onRunError({\n ctx: this.fnArg,\n error,\n fn: this.fn,\n isFinalAttempt,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onRunError\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"manager.js","names":["opName: string | undefined","actualHandler: (() => Promise<unknown>) | undefined","result: Middleware.TransformFunctionInputArgs[\"steps\"]","result: Middleware.TransformFunctionInputArgs","chain: () => Promise<unknown>","result: Middleware.TransformStepInputArgs"],"sources":["../../../src/components/middleware/manager.ts"],"sourcesContent":["import { timeStr } from \"../../helpers/strings.ts\";\nimport type { Logger } from \"../../middleware/logger.ts\";\nimport type { Context, StepOpCode } from \"../../types.ts\";\nimport type { MemoizedOp } from \"../execution/InngestExecution.ts\";\nimport type { InngestFunction } from \"../InngestFunction.ts\";\nimport type { Middleware } from \"./middleware.ts\";\nimport {\n isSleepInput,\n optsFromStepInput,\n stepInputFromOpts,\n stepTypeFromOpCode,\n UnreachableError,\n} from \"./utils.ts\";\n\nexport interface StepInfoOptions {\n hashedId: string;\n userlandId: string;\n displayName?: string;\n memoized: boolean;\n stepType: Middleware.StepType;\n input?: unknown[];\n}\n\nexport interface ApplyToStepInput {\n op: StepOpCode;\n opts?: Record<string, unknown>;\n hashedId: string;\n userlandId: string;\n displayName?: string;\n memoized: boolean;\n}\n\nexport interface PreparedStep {\n entryPoint: () => Promise<unknown>;\n\n /**\n * Only used for sleep steps. The sleep's wake-up time must be in the op name,\n * and that may be changed by the `transformStepInput` hook. The user-facing\n * name is actually the op's `displayName` field (yes, that's confusing).\n */\n opName?: string;\n\n /**\n * For step kinds where middleware input maps to the outgoing op's opts\n * (e.g. invoke, waitForEvent). Derived by reversing `stepInputFromOpts`.\n */\n opOpts?: Record<string, unknown>;\n\n setActualHandler: (handler: () => Promise<unknown>) => void;\n stepInfo: Middleware.StepInfo;\n}\n\n/**\n * Manages middleware. Hides middleware complexity from elsewhere in the\n * codebase. Not for for public use.\n */\nexport class MiddlewareManager {\n private readonly fnArg: Context.Any;\n private readonly getStepState: () => Record<string, MemoizedOp>;\n\n /**\n * Whether any middleware defines `transformStepInput`. Used for perf\n * optimization.\n */\n private readonly hasTransformStepInput: boolean;\n\n /**\n * Whether memoization has ended. Used for idempotency, since memoization must\n * only call once per request.\n */\n private memoizationEnded = false;\n\n private readonly fn: InngestFunction.Any;\n private readonly middleware: Middleware.BaseMiddleware[];\n private readonly internalLogger: Logger;\n\n /**\n * Infinite recursion guard for `wrapStep`. Prevents a middleware from\n * wrapping steps it creates inside its own `wrapStep` via `ctx.step.run`.\n */\n private readonly activeWrapStep = new Set<Middleware.BaseMiddleware>();\n\n constructor(\n fnArg: Context.Any,\n getStepState: () => Record<string, MemoizedOp>,\n middleware: Middleware.BaseMiddleware[] = [],\n fn: InngestFunction.Any,\n logger: Logger,\n ) {\n this.fnArg = fnArg;\n this.getStepState = getStepState;\n this.middleware = middleware;\n this.fn = fn;\n this.internalLogger = logger;\n\n this.hasTransformStepInput = middleware.some((mw) =>\n Boolean(mw?.transformStepInput),\n );\n }\n\n hasMiddleware(): boolean {\n return this.middleware.length > 0;\n }\n\n /**\n * Derives step-kind, extracts input, runs `transformStepInput` middleware,\n * and creates a deferred handler entry point. Does NOT build the wrapStep\n * chain — the caller should do that after any post-processing (e.g. ID\n * collision resolution) so middleware sees final values.\n */\n async applyToStep(input: ApplyToStepInput): Promise<PreparedStep> {\n const stepType = stepTypeFromOpCode(\n input.op,\n input.opts,\n this.internalLogger,\n );\n const stepInput = stepInputFromOpts(stepType, input.opts);\n\n const stepInfo = this.buildStepInfo({\n hashedId: input.hashedId,\n userlandId: input.userlandId,\n displayName: input.displayName,\n memoized: input.memoized,\n stepType,\n input: stepInput,\n });\n\n // Only run transformStepInput if at least one middleware defines it. This\n // avoids some allocations that are unnecessary when no middleware will read\n // or mutate them.\n if (this.hasTransformStepInput) {\n const originalInput = stepInfo.input;\n const transformed = await this.transformStepInput(stepInfo);\n stepInfo.options = transformed.stepOptions;\n\n // Preserve undefined if input wasn't changed from the initial empty array\n if (originalInput === undefined && transformed.input.length === 0) {\n stepInfo.input = undefined;\n } else {\n stepInfo.input = transformed.input;\n }\n }\n\n // For sleep steps, if middleware transformed the input, re-derive the op\n // name (which encodes the wake-up time). If there's no input, the matchOp\n // already set the name directly.\n let opName: string | undefined;\n if (stepType === \"sleep\" && stepInfo.input !== undefined) {\n if (!isSleepInput(stepInfo.input[0])) {\n throw new Error(\n \"Sleep time must be a string, number, Date, or Temporal.Duration\",\n );\n }\n opName = timeStr(stepInfo.input[0]);\n }\n\n // Reverse the input→opts mapping for step kinds where the whole opts\n // object was wrapped as input (e.g. invoke, waitForEvent).\n const opOpts = optsFromStepInput(stepType, stepInfo.input);\n\n // Deferred handler pattern — actual handler set later based on memoization\n let actualHandler: (() => Promise<unknown>) | undefined;\n const entryPoint = async () => {\n if (!actualHandler) {\n throw new Error(\"Handler not initialized\");\n }\n return actualHandler();\n };\n const setActualHandler = (handler: () => Promise<unknown>) => {\n actualHandler = handler;\n };\n\n return {\n entryPoint,\n opName,\n opOpts,\n setActualHandler,\n stepInfo,\n };\n }\n\n private buildStepInfo(opts: StepInfoOptions): Middleware.StepInfo {\n return {\n hashedId: opts.hashedId,\n input: opts.input,\n memoized: opts.memoized,\n options: {\n id: opts.userlandId,\n ...(opts.displayName !== undefined && { name: opts.displayName }),\n },\n stepType: opts.stepType,\n };\n }\n\n private buildSteps(): Middleware.TransformFunctionInputArgs[\"steps\"] {\n const result: Middleware.TransformFunctionInputArgs[\"steps\"] = {};\n const stepState = this.getStepState();\n\n for (const [id, op] of Object.entries(stepState)) {\n if (op.error !== undefined) {\n result[id] = {\n type: \"error\" as const,\n error: op.error,\n };\n } else if (op.input !== undefined) {\n result[id] = {\n type: \"input\" as const,\n input: op.input,\n };\n } else {\n result[id] = {\n type: \"data\" as const,\n data: op.data,\n };\n }\n }\n\n return result;\n }\n\n /**\n * Apply transformFunctionInput middleware in forward order.\n * Each middleware builds on the previous result.\n */\n async transformFunctionInput(): Promise<Middleware.TransformFunctionInputArgs> {\n let result: Middleware.TransformFunctionInputArgs = {\n ctx: this.fnArg,\n fn: this.fn,\n steps: this.buildSteps(),\n };\n\n for (const mw of this.middleware) {\n if (mw?.transformFunctionInput) {\n result = await mw.transformFunctionInput(result);\n }\n }\n\n return result;\n }\n\n /**\n * Wrap a run handler with wrapFunctionHandler middlewares (reverse order for\n * onion layering, same pattern as wrapStepHandler).\n */\n wrapRunHandler(handler: () => Promise<unknown>): () => Promise<unknown> {\n let chain: () => Promise<unknown> = handler;\n for (let i = this.middleware.length - 1; i >= 0; i--) {\n const mw = this.middleware[i];\n if (mw?.wrapFunctionHandler) {\n const next = chain;\n chain = () =>\n mw.wrapFunctionHandler!({\n ctx: this.fnArg,\n fn: this.fn,\n next,\n });\n }\n }\n return chain;\n }\n\n /**\n * Apply transformStepInput middleware in forward order.\n * Each middleware builds on the previous result.\n */\n private async transformStepInput(\n stepInfo: Middleware.StepInfo,\n ): Promise<Middleware.TransformStepInputArgs> {\n let result: Middleware.TransformStepInputArgs = {\n fn: this.fn,\n stepInfo: {\n hashedId: stepInfo.hashedId,\n memoized: stepInfo.memoized,\n stepType: stepInfo.stepType,\n },\n stepOptions: { ...stepInfo.options },\n input: [...(stepInfo.input ?? [])],\n };\n\n for (const mw of this.middleware) {\n if (mw?.transformStepInput) {\n result = await mw.transformStepInput(result);\n }\n }\n\n return result;\n }\n\n /**\n * Wrap a step handler with wrapStep middlewares (reverse order for\n * onion layering). Returns the wrapped handler.\n */\n buildWrapStepChain(\n handler: () => Promise<unknown>,\n stepInfo: Middleware.StepInfo,\n ): () => Promise<unknown> {\n let chain: () => Promise<unknown> = handler;\n for (let i = this.middleware.length - 1; i >= 0; i--) {\n const mw = this.middleware[i];\n if (mw?.wrapStep) {\n const next = chain;\n chain = () => {\n if (!mw.wrapStep) {\n throw new UnreachableError(\"wrapStep is undefined\");\n }\n\n // Infinite recursion guard: skip if this middleware is already\n // executing\n if (this.activeWrapStep.has(mw)) {\n return next();\n }\n\n this.activeWrapStep.add(mw);\n\n // Remove from active while inside next() so only the middleware\n // that directly calls ctx.step.run() is guarded.\n const guardedNext = () => {\n this.activeWrapStep.delete(mw);\n return next().finally(() => {\n this.activeWrapStep.add(mw);\n });\n };\n\n return mw.wrapStep!({\n ctx: this.fnArg,\n fn: this.fn,\n next: guardedNext,\n stepInfo,\n }).finally(() => {\n this.activeWrapStep.delete(mw);\n });\n };\n }\n }\n return chain;\n }\n\n async onStepStart(stepInfo: Middleware.StepInfo): Promise<void> {\n for (const mw of this.middleware) {\n if (mw?.onStepStart) {\n try {\n await mw.onStepStart({\n ctx: this.fnArg,\n fn: this.fn,\n stepInfo,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onStepStart\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n\n async onStepComplete(\n stepInfo: Middleware.StepInfo,\n output: unknown,\n ): Promise<void> {\n for (const mw of this.middleware) {\n if (mw?.onStepComplete) {\n try {\n await mw.onStepComplete({\n ctx: this.fnArg,\n fn: this.fn,\n output,\n stepInfo,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onStepComplete\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n\n /**\n * Build a wrapStepHandler chain around the actual step handler.\n * Called once per `step.run` attempt (not for memoized steps).\n * Simpler than buildWrapStepChain — no recursion guard needed.\n */\n buildWrapStepHandlerChain(\n handler: () => Promise<unknown>,\n stepInfo: Middleware.StepInfo,\n ): () => Promise<unknown> {\n let chain: () => Promise<unknown> = handler;\n for (let i = this.middleware.length - 1; i >= 0; i--) {\n const mw = this.middleware[i];\n if (mw?.wrapStepHandler) {\n const next = chain;\n chain = () =>\n mw.wrapStepHandler!({\n ctx: this.fnArg,\n fn: this.fn,\n next,\n stepInfo,\n });\n }\n }\n return chain;\n }\n\n async onStepError(\n stepInfo: Middleware.StepInfo,\n error: Error,\n isFinalAttempt: boolean,\n ): Promise<void> {\n for (const mw of this.middleware) {\n if (mw?.onStepError) {\n try {\n await mw.onStepError({\n ctx: this.fnArg,\n error,\n fn: this.fn,\n isFinalAttempt,\n stepInfo,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onStepError\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n\n /**\n * Idempotent: safe to call from every code path that might end memoization.\n */\n async onMemoizationEnd(): Promise<void> {\n if (this.memoizationEnded) {\n return;\n }\n this.memoizationEnded = true;\n\n for (const mw of this.middleware) {\n if (mw?.onMemoizationEnd) {\n try {\n await mw.onMemoizationEnd({\n ctx: this.fnArg,\n fn: this.fn,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onMemoizationEnd\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n\n async onRunStart(): Promise<void> {\n for (const mw of this.middleware) {\n if (mw?.onRunStart) {\n try {\n await mw.onRunStart({\n ctx: this.fnArg,\n fn: this.fn,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onRunStart\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n\n async onRunComplete(output: unknown): Promise<void> {\n for (const mw of this.middleware) {\n if (mw?.onRunComplete) {\n try {\n await mw.onRunComplete({\n ctx: this.fnArg,\n fn: this.fn,\n output,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onRunComplete\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n\n async onRunError(error: Error, isFinalAttempt: boolean): Promise<void> {\n for (const mw of this.middleware) {\n if (mw?.onRunError) {\n try {\n await mw.onRunError({\n ctx: this.fnArg,\n error,\n fn: this.fn,\n isFinalAttempt,\n });\n } catch (err) {\n this.internalLogger.error(\n {\n err,\n hook: \"onRunError\",\n mw: mw.id,\n },\n \"middleware error\",\n );\n }\n }\n }\n }\n}\n"],"mappings":"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"}
|