@ironflow/node 0.20.2 → 0.21.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/agent/agent.d.ts +60 -0
- package/dist/agent/agent.d.ts.map +1 -0
- package/dist/agent/agent.js +133 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/approve.d.ts +23 -0
- package/dist/agent/approve.d.ts.map +1 -0
- package/dist/agent/approve.js +42 -0
- package/dist/agent/approve.js.map +1 -0
- package/dist/agent/dispatch.d.ts +63 -0
- package/dist/agent/dispatch.d.ts.map +1 -0
- package/dist/agent/dispatch.js +130 -0
- package/dist/agent/dispatch.js.map +1 -0
- package/dist/agent/errors.d.ts +90 -0
- package/dist/agent/errors.d.ts.map +1 -0
- package/dist/agent/errors.js +136 -0
- package/dist/agent/errors.js.map +1 -0
- package/dist/agent/index.d.ts +35 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +32 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/internal-registry.d.ts +27 -0
- package/dist/agent/internal-registry.d.ts.map +1 -0
- package/dist/agent/internal-registry.js +36 -0
- package/dist/agent/internal-registry.js.map +1 -0
- package/dist/agent/internal.d.ts +24 -0
- package/dist/agent/internal.d.ts.map +1 -0
- package/dist/agent/internal.js +29 -0
- package/dist/agent/internal.js.map +1 -0
- package/dist/agent/llm.d.ts +39 -0
- package/dist/agent/llm.d.ts.map +1 -0
- package/dist/agent/llm.js +59 -0
- package/dist/agent/llm.js.map +1 -0
- package/dist/agent/mcp.d.ts +51 -0
- package/dist/agent/mcp.d.ts.map +1 -0
- package/dist/agent/mcp.js +155 -0
- package/dist/agent/mcp.js.map +1 -0
- package/dist/agent/memory.d.ts +74 -0
- package/dist/agent/memory.d.ts.map +1 -0
- package/dist/agent/memory.js +130 -0
- package/dist/agent/memory.js.map +1 -0
- package/dist/agent/spawn.d.ts +20 -0
- package/dist/agent/spawn.d.ts.map +1 -0
- package/dist/agent/spawn.js +29 -0
- package/dist/agent/spawn.js.map +1 -0
- package/dist/agent/tool.d.ts +39 -0
- package/dist/agent/tool.d.ts.map +1 -0
- package/dist/agent/tool.js +103 -0
- package/dist/agent/tool.js.map +1 -0
- package/dist/agent/types.d.ts +363 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +9 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/client.d.ts +942 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +1557 -0
- package/dist/client.js.map +1 -0
- package/dist/command-dedup.d.ts +61 -0
- package/dist/command-dedup.d.ts.map +1 -0
- package/dist/command-dedup.js +129 -0
- package/dist/command-dedup.js.map +1 -0
- package/dist/config-client.d.ts +58 -0
- package/dist/config-client.d.ts.map +1 -0
- package/dist/config-client.js +171 -0
- package/dist/config-client.js.map +1 -0
- package/dist/function.d.ts +53 -0
- package/dist/function.d.ts.map +1 -0
- package/dist/function.js +72 -0
- package/dist/function.js.map +1 -0
- package/dist/index.d.ts +71 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +70 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/assert-defined.d.ts +10 -0
- package/dist/internal/assert-defined.d.ts.map +1 -0
- package/dist/internal/assert-defined.js +15 -0
- package/dist/internal/assert-defined.js.map +1 -0
- package/dist/internal/context.d.ts +142 -0
- package/dist/internal/context.d.ts.map +1 -0
- package/dist/internal/context.js +306 -0
- package/dist/internal/context.js.map +1 -0
- package/dist/internal/errors.d.ts +66 -0
- package/dist/internal/errors.d.ts.map +1 -0
- package/dist/internal/errors.js +29 -0
- package/dist/internal/errors.js.map +1 -0
- package/dist/internal/run-context.d.ts +10 -0
- package/dist/internal/run-context.d.ts.map +1 -0
- package/dist/internal/run-context.js +23 -0
- package/dist/internal/run-context.js.map +1 -0
- package/dist/kv.d.ts +86 -0
- package/dist/kv.d.ts.map +1 -0
- package/dist/kv.js +261 -0
- package/dist/kv.js.map +1 -0
- package/dist/projection-runner.d.ts +83 -0
- package/dist/projection-runner.d.ts.map +1 -0
- package/dist/projection-runner.js +498 -0
- package/dist/projection-runner.js.map +1 -0
- package/dist/projection.d.ts +36 -0
- package/dist/projection.d.ts.map +1 -0
- package/dist/projection.js +55 -0
- package/dist/projection.js.map +1 -0
- package/dist/secrets.d.ts +6 -0
- package/dist/secrets.d.ts.map +1 -0
- package/dist/secrets.js +19 -0
- package/dist/secrets.js.map +1 -0
- package/dist/serve.d.ts +71 -0
- package/dist/serve.d.ts.map +1 -0
- package/dist/serve.js +460 -0
- package/dist/serve.js.map +1 -0
- package/dist/step.d.ts +18 -0
- package/dist/step.d.ts.map +1 -0
- package/dist/step.js +581 -0
- package/dist/step.js.map +1 -0
- package/dist/subscribe.d.ts +164 -0
- package/dist/subscribe.d.ts.map +1 -0
- package/dist/subscribe.js +487 -0
- package/dist/subscribe.js.map +1 -0
- package/dist/test/index.d.ts +22 -0
- package/dist/test/index.d.ts.map +1 -0
- package/dist/test/index.js +112 -0
- package/dist/test/index.js.map +1 -0
- package/dist/test/test-step.d.ts +21 -0
- package/dist/test/test-step.d.ts.map +1 -0
- package/dist/test/test-step.js +83 -0
- package/dist/test/test-step.js.map +1 -0
- package/dist/types.d.ts +108 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +4 -0
- package/dist/version.js.map +1 -0
- package/dist/webhook.d.ts +22 -0
- package/dist/webhook.d.ts.map +1 -0
- package/dist/webhook.js +23 -0
- package/dist/webhook.js.map +1 -0
- package/dist/worker-streaming.d.ts +17 -0
- package/dist/worker-streaming.d.ts.map +1 -0
- package/dist/worker-streaming.js +510 -0
- package/dist/worker-streaming.js.map +1 -0
- package/dist/worker.d.ts +28 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +559 -0
- package/dist/worker.js.map +1 -0
- package/package.json +3 -3
package/dist/serve.d.ts
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal HTTP Serve Handler
|
|
3
|
+
*
|
|
4
|
+
* Provides a universal handler that works with:
|
|
5
|
+
* - Next.js App Router (export const POST = serve(...))
|
|
6
|
+
* - Express (app.post("/api/ironflow", serve(...)))
|
|
7
|
+
* - Hono (app.post("/api/ironflow", serve(...)))
|
|
8
|
+
* - Generic Fetch API (native Request/Response)
|
|
9
|
+
*/
|
|
10
|
+
import type { ServeConfig } from "./types.js";
|
|
11
|
+
/**
|
|
12
|
+
* Node.js IncomingMessage-like object
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
interface NodeRequest {
|
|
16
|
+
method?: string;
|
|
17
|
+
url?: string;
|
|
18
|
+
headers: Record<string, string | string[] | undefined>;
|
|
19
|
+
on?(event: string, callback: (data: unknown) => void): void;
|
|
20
|
+
body?: string | Buffer | unknown;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Node.js ServerResponse-like object
|
|
24
|
+
* @internal
|
|
25
|
+
*/
|
|
26
|
+
interface NodeResponse {
|
|
27
|
+
statusCode?: number;
|
|
28
|
+
setHeader?(name: string, value: string): void;
|
|
29
|
+
end?(data: string): void;
|
|
30
|
+
writeHead?(statusCode: number, headers: Record<string, string>): void;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Universal handler function signature
|
|
34
|
+
*/
|
|
35
|
+
type UniversalHandler = (request: Request | NodeRequest, responseOrContext?: NodeResponse | unknown) => Promise<Response | void>;
|
|
36
|
+
/**
|
|
37
|
+
* Create a universal HTTP handler for Ironflow functions
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* // Next.js App Router
|
|
42
|
+
* import { serve } from "@ironflow/node/serve";
|
|
43
|
+
* import { processOrder } from "./functions/process-order";
|
|
44
|
+
*
|
|
45
|
+
* export const POST = serve({
|
|
46
|
+
* functions: [processOrder],
|
|
47
|
+
* signingKey: process.env.IRONFLOW_SIGNING_KEY,
|
|
48
|
+
* });
|
|
49
|
+
* ```
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```typescript
|
|
53
|
+
* // Express
|
|
54
|
+
* import { serve } from "@ironflow/node/serve";
|
|
55
|
+
*
|
|
56
|
+
* app.post("/api/ironflow", serve({
|
|
57
|
+
* functions: [processOrder],
|
|
58
|
+
* signingKey: process.env.IRONFLOW_SIGNING_KEY,
|
|
59
|
+
* }));
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
export declare function serve(config: ServeConfig): UniversalHandler;
|
|
63
|
+
/**
|
|
64
|
+
* Create handler helper (alias for serve)
|
|
65
|
+
*/
|
|
66
|
+
export declare const createHandler: typeof serve;
|
|
67
|
+
/**
|
|
68
|
+
* Default export
|
|
69
|
+
*/
|
|
70
|
+
export default serve;
|
|
71
|
+
//# sourceMappingURL=serve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAsBH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAQ9C;;;GAGG;AACH,UAAU,WAAW;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;IAC5D,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;CAClC;AAED;;;GAGG;AACH,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;CACvE;AAED;;GAEG;AACH,KAAK,gBAAgB,GAAG,CACtB,OAAO,EAAE,OAAO,GAAG,WAAW,EAC9B,iBAAiB,CAAC,EAAE,YAAY,GAAG,OAAO,KACvC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,gBAAgB,CA0O3D;AAuPD;;GAEG;AACH,eAAO,MAAM,aAAa,cAAQ,CAAC;AAEnC;;GAEG;AACH,eAAe,KAAK,CAAC"}
|
package/dist/serve.js
ADDED
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal HTTP Serve Handler
|
|
3
|
+
*
|
|
4
|
+
* Provides a universal handler that works with:
|
|
5
|
+
* - Next.js App Router (export const POST = serve(...))
|
|
6
|
+
* - Express (app.post("/api/ironflow", serve(...)))
|
|
7
|
+
* - Hono (app.post("/api/ironflow", serve(...)))
|
|
8
|
+
* - Generic Fetch API (native Request/Response)
|
|
9
|
+
*/
|
|
10
|
+
import { IronflowError, FunctionNotFoundError, isRetryable, PushRequestSchema, createLogger, createNoopLogger, HEADERS, DEFAULT_ENVIRONMENT, } from "@ironflow/core";
|
|
11
|
+
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
12
|
+
import { ExecutionContext } from "./internal/context.js";
|
|
13
|
+
import { createStepClient, executeCompensations } from "./step.js";
|
|
14
|
+
import { isYieldSignal } from "./internal/errors.js";
|
|
15
|
+
import { createSecretsClient } from "./secrets.js";
|
|
16
|
+
import { withRunContext } from "./internal/run-context.js";
|
|
17
|
+
import { DISPATCH_PATH, handleAgentToolDispatch } from "./agent/dispatch.js";
|
|
18
|
+
/**
|
|
19
|
+
* Create a universal HTTP handler for Ironflow functions
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* // Next.js App Router
|
|
24
|
+
* import { serve } from "@ironflow/node/serve";
|
|
25
|
+
* import { processOrder } from "./functions/process-order";
|
|
26
|
+
*
|
|
27
|
+
* export const POST = serve({
|
|
28
|
+
* functions: [processOrder],
|
|
29
|
+
* signingKey: process.env.IRONFLOW_SIGNING_KEY,
|
|
30
|
+
* });
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* // Express
|
|
36
|
+
* import { serve } from "@ironflow/node/serve";
|
|
37
|
+
*
|
|
38
|
+
* app.post("/api/ironflow", serve({
|
|
39
|
+
* functions: [processOrder],
|
|
40
|
+
* signingKey: process.env.IRONFLOW_SIGNING_KEY,
|
|
41
|
+
* }));
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export function serve(config) {
|
|
45
|
+
// Resolve environment
|
|
46
|
+
const environment = config.environment ?? process.env.IRONFLOW_ENV ?? DEFAULT_ENVIRONMENT;
|
|
47
|
+
// Initialize logger
|
|
48
|
+
let logger;
|
|
49
|
+
if (config.logger === false) {
|
|
50
|
+
logger = createNoopLogger();
|
|
51
|
+
}
|
|
52
|
+
else if (config.logger) {
|
|
53
|
+
logger = config.logger;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
logger = createLogger({ prefix: "[ironflow-serve]" });
|
|
57
|
+
}
|
|
58
|
+
// Build function map for fast lookup
|
|
59
|
+
const functionMap = new Map();
|
|
60
|
+
for (const fn of config.functions) {
|
|
61
|
+
if (functionMap.has(fn.config.id)) {
|
|
62
|
+
logger.warn(`Duplicate function ID "${fn.config.id}" — the later definition will overwrite the earlier one. ` +
|
|
63
|
+
"Each function should have a unique ID.");
|
|
64
|
+
}
|
|
65
|
+
functionMap.set(fn.config.id, fn);
|
|
66
|
+
}
|
|
67
|
+
// Build webhook map for fast lookup
|
|
68
|
+
const webhookMap = new Map();
|
|
69
|
+
if (config.webhooks) {
|
|
70
|
+
for (const wh of config.webhooks) {
|
|
71
|
+
webhookMap.set(wh.config.id, wh);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Warn about projections in push mode
|
|
75
|
+
if (config.projections?.length) {
|
|
76
|
+
logger.warn("Projections in push mode are not supported. " +
|
|
77
|
+
"Use createWorker() for projections.");
|
|
78
|
+
}
|
|
79
|
+
// Warn about missing signature verification
|
|
80
|
+
if (!config.signingKey && !config.skipVerification) {
|
|
81
|
+
logger.warn("No signingKey configured — webhook requests will not be authenticated. " +
|
|
82
|
+
"Set signingKey in serve config for production use.");
|
|
83
|
+
}
|
|
84
|
+
// The universal handler
|
|
85
|
+
const handler = async (requestOrReq, resOrContext) => {
|
|
86
|
+
// Detect environment and normalize request
|
|
87
|
+
const { request, sendResponse } = normalizeRequest(requestOrReq, resOrContext, environment);
|
|
88
|
+
try {
|
|
89
|
+
// Check if this is an agent-tool dispatch from `ironflow serve` →
|
|
90
|
+
// `exposeMcp()` callback. Discriminated by URL suffix so it works
|
|
91
|
+
// alongside the existing /webhooks routes and the bare push path.
|
|
92
|
+
const reqPath = extractRequestPath(requestOrReq);
|
|
93
|
+
if (reqPath.endsWith(DISPATCH_PATH)) {
|
|
94
|
+
const result = await handleAgentToolDispatch(request);
|
|
95
|
+
return sendResponse(result.status, result.body);
|
|
96
|
+
}
|
|
97
|
+
// Check if this is a webhook request
|
|
98
|
+
let webhookProvider;
|
|
99
|
+
if (requestOrReq instanceof Request) {
|
|
100
|
+
const url = new URL(requestOrReq.url, "http://localhost");
|
|
101
|
+
const webhookMatch = url.pathname.match(/\/webhooks\/([^/]+)/);
|
|
102
|
+
if (webhookMatch) {
|
|
103
|
+
webhookProvider = webhookMatch[1];
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
// Node.js request
|
|
108
|
+
const nodeReq = requestOrReq;
|
|
109
|
+
const webhookMatch = (nodeReq.url || "").match(/\/webhooks\/([^/]+)/);
|
|
110
|
+
if (webhookMatch) {
|
|
111
|
+
webhookProvider = webhookMatch[1];
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (webhookProvider && webhookMap.size > 0) {
|
|
115
|
+
const wh = webhookMap.get(webhookProvider);
|
|
116
|
+
if (!wh) {
|
|
117
|
+
return sendResponse(404, {
|
|
118
|
+
error: { message: `Webhook source not found: ${webhookProvider}`, code: "WEBHOOK_NOT_FOUND" },
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
const body = await request.text();
|
|
122
|
+
const headers = {};
|
|
123
|
+
// Extract headers from the original request
|
|
124
|
+
if (requestOrReq instanceof Request) {
|
|
125
|
+
requestOrReq.headers.forEach((value, key) => {
|
|
126
|
+
headers[key] = value;
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
const nodeReq = requestOrReq;
|
|
131
|
+
for (const [key, value] of Object.entries(nodeReq.headers)) {
|
|
132
|
+
if (typeof value === "string")
|
|
133
|
+
headers[key] = value;
|
|
134
|
+
else if (Array.isArray(value))
|
|
135
|
+
headers[key] = value[0] ?? "";
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
await wh.config.verify({ body, headers });
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
return sendResponse(401, {
|
|
143
|
+
error: {
|
|
144
|
+
message: err instanceof Error ? err.message : "Verification failed",
|
|
145
|
+
code: "VERIFY_FAILED",
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
const payload = JSON.parse(body);
|
|
151
|
+
const event = await wh.config.transform(payload);
|
|
152
|
+
// Emit event to Ironflow server if configured
|
|
153
|
+
const emitUrl = config.serverUrl || process.env.IRONFLOW_URL;
|
|
154
|
+
if (emitUrl) {
|
|
155
|
+
const emitBody = {
|
|
156
|
+
name: event.name,
|
|
157
|
+
data: event.data,
|
|
158
|
+
};
|
|
159
|
+
if (event.idempotencyKey) {
|
|
160
|
+
emitBody.idempotencyKey = event.idempotencyKey;
|
|
161
|
+
}
|
|
162
|
+
const emitResp = await fetch(`${emitUrl}/api/v1/events`, {
|
|
163
|
+
method: "POST",
|
|
164
|
+
headers: { "Content-Type": "application/json" },
|
|
165
|
+
body: JSON.stringify(emitBody),
|
|
166
|
+
});
|
|
167
|
+
if (!emitResp.ok) {
|
|
168
|
+
const errText = await emitResp.text();
|
|
169
|
+
return sendResponse(502, {
|
|
170
|
+
error: { message: `Failed to emit event: ${errText}`, code: "EMIT_FAILED" },
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return sendResponse(200, { status: "accepted", event });
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
return sendResponse(400, {
|
|
178
|
+
error: {
|
|
179
|
+
message: err instanceof Error ? err.message : "Transform failed",
|
|
180
|
+
code: "TRANSFORM_FAILED",
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Read body
|
|
186
|
+
const body = await request.text();
|
|
187
|
+
// Verify signature (unless skipped for dev)
|
|
188
|
+
if (config.signingKey && !config.skipVerification) {
|
|
189
|
+
const signature = request.headers.get("x-ironflow-signature");
|
|
190
|
+
if (!signature) {
|
|
191
|
+
return sendResponse(401, {
|
|
192
|
+
error: { message: "Missing signature", code: "SIGNATURE_MISSING" },
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
if (!verifySignature(body, signature, config.signingKey)) {
|
|
196
|
+
return sendResponse(401, {
|
|
197
|
+
error: { message: "Invalid signature", code: "SIGNATURE_INVALID" },
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// Parse and validate request
|
|
202
|
+
let pushRequest;
|
|
203
|
+
try {
|
|
204
|
+
const parsed = JSON.parse(body);
|
|
205
|
+
const result = PushRequestSchema.safeParse(parsed);
|
|
206
|
+
if (!result.success) {
|
|
207
|
+
const issues = result.error.issues
|
|
208
|
+
.map((i) => `${i.path.join(".")}: ${i.message}`)
|
|
209
|
+
.join(", ");
|
|
210
|
+
return sendResponse(400, {
|
|
211
|
+
error: {
|
|
212
|
+
message: `Invalid request body: ${issues}`,
|
|
213
|
+
code: "VALIDATION_ERROR",
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
pushRequest = result.data;
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return sendResponse(400, {
|
|
221
|
+
error: { message: "Invalid JSON body", code: "INVALID_JSON" },
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
// Find function
|
|
225
|
+
const fn = functionMap.get(pushRequest.function_id);
|
|
226
|
+
if (!fn) {
|
|
227
|
+
return sendResponse(404, {
|
|
228
|
+
error: {
|
|
229
|
+
message: `Function not found: ${pushRequest.function_id}`,
|
|
230
|
+
code: "FUNCTION_NOT_FOUND",
|
|
231
|
+
},
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
// Execute function
|
|
235
|
+
const serverUrl = config.serverUrl || process.env.IRONFLOW_URL || process.env.IRONFLOW_SERVER_URL;
|
|
236
|
+
const response = await executeHandler(fn, pushRequest, config.eventDefinitions, serverUrl);
|
|
237
|
+
return sendResponse(200, response);
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
// Unexpected error
|
|
241
|
+
logger.error("Unexpected error in serve handler", {
|
|
242
|
+
error: error instanceof Error ? error.message : String(error),
|
|
243
|
+
});
|
|
244
|
+
return sendResponse(500, {
|
|
245
|
+
error: {
|
|
246
|
+
message: error instanceof Error ? error.message : "Internal server error",
|
|
247
|
+
code: "INTERNAL_ERROR",
|
|
248
|
+
},
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
return handler;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Execute a function handler and build the response
|
|
256
|
+
*/
|
|
257
|
+
async function executeHandler(fn, request, eventDefinitions, serverUrl) {
|
|
258
|
+
// Create execution context (with optional upcasting)
|
|
259
|
+
const ctx = new ExecutionContext(request, undefined, eventDefinitions, fn.config.stepTimeout, serverUrl);
|
|
260
|
+
// Create step client
|
|
261
|
+
const step = createStepClient(ctx);
|
|
262
|
+
// Build function context
|
|
263
|
+
const functionContext = {
|
|
264
|
+
event: ctx.event,
|
|
265
|
+
step,
|
|
266
|
+
run: ctx.runInfo,
|
|
267
|
+
logger: ctx.logger,
|
|
268
|
+
secrets: createSecretsClient(request.secrets),
|
|
269
|
+
};
|
|
270
|
+
try {
|
|
271
|
+
// Execute the function handler
|
|
272
|
+
const result = await withRunContext(ctx.runId, () => fn.handler(functionContext));
|
|
273
|
+
// Function completed successfully
|
|
274
|
+
return {
|
|
275
|
+
status: "completed",
|
|
276
|
+
steps: ctx.getExecutedSteps(),
|
|
277
|
+
result,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
// Check if this is a yield signal (sleep/waitForEvent)
|
|
282
|
+
if (isYieldSignal(error)) {
|
|
283
|
+
return {
|
|
284
|
+
status: "yielded",
|
|
285
|
+
steps: ctx.getExecutedSteps(),
|
|
286
|
+
yield: error.yieldInfo,
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
// Handle actual errors
|
|
290
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
291
|
+
const errorStack = error instanceof Error ? error.stack : undefined;
|
|
292
|
+
const errorCode = error instanceof IronflowError ? error.code : "ERROR";
|
|
293
|
+
const retryable = isRetryable(error);
|
|
294
|
+
// Run compensations only if error is not retryable (terminal failure)
|
|
295
|
+
if (ctx.hasCompensations() && !retryable) {
|
|
296
|
+
await executeCompensations(ctx);
|
|
297
|
+
}
|
|
298
|
+
// Get step ID if it's a step error
|
|
299
|
+
let stepId;
|
|
300
|
+
if (error instanceof FunctionNotFoundError) {
|
|
301
|
+
stepId = undefined;
|
|
302
|
+
}
|
|
303
|
+
else if (error instanceof IronflowError && error.details?.["stepId"]) {
|
|
304
|
+
stepId = error.details["stepId"];
|
|
305
|
+
}
|
|
306
|
+
ctx.logger.error(`Function failed: ${errorMessage}`, {
|
|
307
|
+
code: errorCode,
|
|
308
|
+
retryable,
|
|
309
|
+
stepId,
|
|
310
|
+
});
|
|
311
|
+
return {
|
|
312
|
+
status: "failed",
|
|
313
|
+
steps: ctx.getExecutedSteps(),
|
|
314
|
+
error: {
|
|
315
|
+
message: errorMessage,
|
|
316
|
+
code: errorCode,
|
|
317
|
+
step_id: stepId,
|
|
318
|
+
retryable,
|
|
319
|
+
stack: errorStack,
|
|
320
|
+
},
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Normalize different request types into a common interface
|
|
326
|
+
*/
|
|
327
|
+
function normalizeRequest(request, responseOrContext, environment) {
|
|
328
|
+
const responseHeaders = {
|
|
329
|
+
"Content-Type": "application/json",
|
|
330
|
+
};
|
|
331
|
+
if (environment) {
|
|
332
|
+
responseHeaders[HEADERS.ENVIRONMENT] = environment;
|
|
333
|
+
}
|
|
334
|
+
// Check if it's a native Fetch Request
|
|
335
|
+
if (request instanceof Request) {
|
|
336
|
+
return {
|
|
337
|
+
request: {
|
|
338
|
+
text: () => request.text(),
|
|
339
|
+
headers: {
|
|
340
|
+
get: (name) => request.headers.get(name),
|
|
341
|
+
},
|
|
342
|
+
},
|
|
343
|
+
sendResponse: (status, body) => {
|
|
344
|
+
return new Response(JSON.stringify(body), {
|
|
345
|
+
status,
|
|
346
|
+
headers: responseHeaders,
|
|
347
|
+
});
|
|
348
|
+
},
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
// It's a Node.js-style request
|
|
352
|
+
const nodeReq = request;
|
|
353
|
+
const nodeRes = responseOrContext;
|
|
354
|
+
return {
|
|
355
|
+
request: {
|
|
356
|
+
text: async () => {
|
|
357
|
+
// If body is already parsed (e.g., by express.json())
|
|
358
|
+
if (typeof nodeReq.body === "string") {
|
|
359
|
+
return nodeReq.body;
|
|
360
|
+
}
|
|
361
|
+
if (Buffer.isBuffer(nodeReq.body)) {
|
|
362
|
+
return nodeReq.body.toString("utf-8");
|
|
363
|
+
}
|
|
364
|
+
if (typeof nodeReq.body === "object" && nodeReq.body !== null) {
|
|
365
|
+
return JSON.stringify(nodeReq.body);
|
|
366
|
+
}
|
|
367
|
+
// Read from stream
|
|
368
|
+
return new Promise((resolve, reject) => {
|
|
369
|
+
const chunks = [];
|
|
370
|
+
nodeReq.on?.("data", (chunk) => {
|
|
371
|
+
if (chunk instanceof Uint8Array || Buffer.isBuffer(chunk)) {
|
|
372
|
+
chunks.push(chunk);
|
|
373
|
+
}
|
|
374
|
+
else if (typeof chunk === "string") {
|
|
375
|
+
chunks.push(Buffer.from(chunk));
|
|
376
|
+
}
|
|
377
|
+
});
|
|
378
|
+
nodeReq.on?.("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
|
|
379
|
+
nodeReq.on?.("error", reject);
|
|
380
|
+
});
|
|
381
|
+
},
|
|
382
|
+
headers: {
|
|
383
|
+
get: (name) => {
|
|
384
|
+
const value = nodeReq.headers[name.toLowerCase()];
|
|
385
|
+
if (Array.isArray(value)) {
|
|
386
|
+
return value[0] ?? null;
|
|
387
|
+
}
|
|
388
|
+
return value ?? null;
|
|
389
|
+
},
|
|
390
|
+
},
|
|
391
|
+
},
|
|
392
|
+
sendResponse: (status, body) => {
|
|
393
|
+
if (nodeRes) {
|
|
394
|
+
if (nodeRes.writeHead) {
|
|
395
|
+
nodeRes.writeHead(status, responseHeaders);
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
nodeRes.statusCode = status;
|
|
399
|
+
for (const [key, value] of Object.entries(responseHeaders)) {
|
|
400
|
+
nodeRes.setHeader?.(key, value);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
nodeRes.end?.(JSON.stringify(body));
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
return new Response(JSON.stringify(body), {
|
|
407
|
+
status,
|
|
408
|
+
headers: responseHeaders,
|
|
409
|
+
});
|
|
410
|
+
},
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Extract the request URL path for routing decisions. Both Fetch
|
|
415
|
+
* Request and NodeRequest types are supported — we only need the
|
|
416
|
+
* pathname suffix.
|
|
417
|
+
*/
|
|
418
|
+
function extractRequestPath(req) {
|
|
419
|
+
if (req instanceof Request) {
|
|
420
|
+
try {
|
|
421
|
+
return new URL(req.url, "http://localhost").pathname;
|
|
422
|
+
}
|
|
423
|
+
catch {
|
|
424
|
+
return "";
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
const nodeReq = req;
|
|
428
|
+
return nodeReq.url ?? "";
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Verify HMAC-SHA256 signature using timing-safe comparison.
|
|
432
|
+
*
|
|
433
|
+
* The signature header is expected in the format "sha256=<hex digest>".
|
|
434
|
+
*/
|
|
435
|
+
function verifySignature(body, signature, signingKey) {
|
|
436
|
+
const prefix = "sha256=";
|
|
437
|
+
if (!signature.startsWith(prefix)) {
|
|
438
|
+
return false;
|
|
439
|
+
}
|
|
440
|
+
const receivedHex = signature.slice(prefix.length);
|
|
441
|
+
const expectedHex = createHmac("sha256", signingKey)
|
|
442
|
+
.update(body)
|
|
443
|
+
.digest("hex");
|
|
444
|
+
// Timing-safe comparison to prevent timing attacks
|
|
445
|
+
const receivedBuf = Buffer.from(receivedHex, "hex");
|
|
446
|
+
const expectedBuf = Buffer.from(expectedHex, "hex");
|
|
447
|
+
if (receivedBuf.length !== expectedBuf.length) {
|
|
448
|
+
return false;
|
|
449
|
+
}
|
|
450
|
+
return timingSafeEqual(receivedBuf, expectedBuf);
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Create handler helper (alias for serve)
|
|
454
|
+
*/
|
|
455
|
+
export const createHandler = serve;
|
|
456
|
+
/**
|
|
457
|
+
* Default export
|
|
458
|
+
*/
|
|
459
|
+
export default serve;
|
|
460
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"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"}
|
package/dist/step.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Step Execution Client
|
|
3
|
+
*
|
|
4
|
+
* Implements durable step primitives: run, sleep, sleepUntil, waitForEvent, parallel, map
|
|
5
|
+
*/
|
|
6
|
+
import type { StepClient } from "@ironflow/core";
|
|
7
|
+
import { ExecutionContext } from "./internal/context.js";
|
|
8
|
+
/**
|
|
9
|
+
* Create a step client for the given execution context
|
|
10
|
+
*/
|
|
11
|
+
export declare function createStepClient(ctx: ExecutionContext): StepClient;
|
|
12
|
+
/**
|
|
13
|
+
* Execute registered compensations in reverse order.
|
|
14
|
+
* Each compensation is executed as a durable step (memoized).
|
|
15
|
+
* Compensation failures are recorded but don't stop remaining compensations.
|
|
16
|
+
*/
|
|
17
|
+
export declare function executeCompensations(ctx: ExecutionContext): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=step.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../src/step.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAKV,UAAU,EAKX,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAiB,MAAM,uBAAuB,CAAC;AAiCxE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,GAAG,UAAU,CAElE;AAugBD;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiE/E"}
|