inngest 4.1.2 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/api/api.cjs +30 -1
  3. package/api/api.cjs.map +1 -1
  4. package/api/api.d.cts +19 -0
  5. package/api/api.d.cts.map +1 -1
  6. package/api/api.d.ts +19 -0
  7. package/api/api.d.ts.map +1 -1
  8. package/api/api.js +30 -1
  9. package/api/api.js.map +1 -1
  10. package/components/InngestCommHandler.cjs +9 -1
  11. package/components/InngestCommHandler.cjs.map +1 -1
  12. package/components/InngestCommHandler.d.cts.map +1 -1
  13. package/components/InngestCommHandler.d.ts.map +1 -1
  14. package/components/InngestCommHandler.js +9 -1
  15. package/components/InngestCommHandler.js.map +1 -1
  16. package/components/StreamTools.cjs +241 -0
  17. package/components/StreamTools.cjs.map +1 -0
  18. package/components/StreamTools.d.cts +161 -0
  19. package/components/StreamTools.d.cts.map +1 -0
  20. package/components/StreamTools.d.ts +161 -0
  21. package/components/StreamTools.d.ts.map +1 -0
  22. package/components/StreamTools.js +240 -0
  23. package/components/StreamTools.js.map +1 -0
  24. package/components/createWebApiCommHandler.cjs +46 -0
  25. package/components/createWebApiCommHandler.cjs.map +1 -0
  26. package/components/createWebApiCommHandler.js +46 -0
  27. package/components/createWebApiCommHandler.js.map +1 -0
  28. package/components/execution/InngestExecution.cjs.map +1 -1
  29. package/components/execution/InngestExecution.d.cts +6 -0
  30. package/components/execution/InngestExecution.d.cts.map +1 -1
  31. package/components/execution/InngestExecution.d.ts +6 -0
  32. package/components/execution/InngestExecution.d.ts.map +1 -1
  33. package/components/execution/InngestExecution.js.map +1 -1
  34. package/components/execution/als.cjs.map +1 -1
  35. package/components/execution/als.d.cts +9 -1
  36. package/components/execution/als.d.cts.map +1 -1
  37. package/components/execution/als.d.ts +9 -1
  38. package/components/execution/als.d.ts.map +1 -1
  39. package/components/execution/als.js.map +1 -1
  40. package/components/execution/engine.cjs +334 -26
  41. package/components/execution/engine.cjs.map +1 -1
  42. package/components/execution/engine.d.cts +1 -0
  43. package/components/execution/engine.d.cts.map +1 -1
  44. package/components/execution/engine.d.ts +1 -0
  45. package/components/execution/engine.d.ts.map +1 -1
  46. package/components/execution/engine.js +334 -26
  47. package/components/execution/engine.js.map +1 -1
  48. package/components/execution/streaming.cjs +208 -0
  49. package/components/execution/streaming.cjs.map +1 -0
  50. package/components/execution/streaming.d.cts +12 -0
  51. package/components/execution/streaming.d.cts.map +1 -0
  52. package/components/execution/streaming.d.ts +12 -0
  53. package/components/execution/streaming.d.ts.map +1 -0
  54. package/components/execution/streaming.js +198 -0
  55. package/components/execution/streaming.js.map +1 -0
  56. package/edge.cjs +19 -32
  57. package/edge.cjs.map +1 -1
  58. package/edge.d.cts +1 -1
  59. package/edge.d.cts.map +1 -1
  60. package/edge.d.ts +1 -1
  61. package/edge.d.ts.map +1 -1
  62. package/edge.js +19 -32
  63. package/edge.js.map +1 -1
  64. package/experimental/durable-endpoints/client.cjs +114 -0
  65. package/experimental/durable-endpoints/client.cjs.map +1 -0
  66. package/experimental/durable-endpoints/client.d.cts +49 -0
  67. package/experimental/durable-endpoints/client.d.cts.map +1 -0
  68. package/experimental/durable-endpoints/client.d.ts +49 -0
  69. package/experimental/durable-endpoints/client.d.ts.map +1 -0
  70. package/experimental/durable-endpoints/client.js +114 -0
  71. package/experimental/durable-endpoints/client.js.map +1 -0
  72. package/experimental/durable-endpoints/index.cjs +3 -0
  73. package/experimental/durable-endpoints/index.d.cts +2 -0
  74. package/experimental/durable-endpoints/index.d.ts +2 -0
  75. package/experimental/durable-endpoints/index.js +3 -0
  76. package/helpers/promises.cjs.map +1 -1
  77. package/helpers/promises.js.map +1 -1
  78. package/node.cjs +97 -0
  79. package/node.cjs.map +1 -1
  80. package/node.d.cts +34 -2
  81. package/node.d.cts.map +1 -1
  82. package/node.d.ts +34 -2
  83. package/node.d.ts.map +1 -1
  84. package/node.js +95 -2
  85. package/node.js.map +1 -1
  86. package/package.json +17 -1
  87. package/react.d.cts.map +1 -1
  88. package/version.cjs +1 -1
  89. package/version.cjs.map +1 -1
  90. package/version.d.cts +1 -1
  91. package/version.d.ts +1 -1
  92. package/version.js +1 -1
  93. package/version.js.map +1 -1
package/node.cjs CHANGED
@@ -1,5 +1,8 @@
1
1
  const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
2
  const require_InngestCommHandler = require('./components/InngestCommHandler.cjs');
3
+ const require_createWebApiCommHandler = require('./components/createWebApiCommHandler.cjs');
4
+ const require_InngestDurableEndpointProxy = require('./components/InngestDurableEndpointProxy.cjs');
5
+ const require_InngestEndpointAdapter = require('./components/InngestEndpointAdapter.cjs');
3
6
  let node_http = require("node:http");
4
7
  node_http = require_rolldown_runtime.__toESM(node_http);
5
8
  let node_url = require("node:url");
@@ -136,9 +139,103 @@ const createServer = (options) => {
136
139
  });
137
140
  return server;
138
141
  };
142
+ /**
143
+ * Comm handler for durable endpoints. Uses Web API Request/Response since
144
+ * that's the interface users write against, regardless of the underlying
145
+ * runtime.
146
+ */
147
+ function endpointCommHandler(options, syncOptions) {
148
+ return require_createWebApiCommHandler.createWebApiCommHandler(frameworkName, options, syncOptions);
149
+ }
150
+ /**
151
+ * Creates a durable endpoint proxy handler for Node.js environments.
152
+ */
153
+ function createDurableEndpointProxyHandler(options) {
154
+ return async (req, res) => {
155
+ const url = getURL(req);
156
+ const result = await require_InngestDurableEndpointProxy.handleDurableEndpointProxyRequest(options.client, {
157
+ runId: url.searchParams.get("runId"),
158
+ token: url.searchParams.get("token"),
159
+ method: req.method || "GET"
160
+ });
161
+ res.writeHead(result.status, result.headers);
162
+ res.end(result.body);
163
+ };
164
+ }
165
+ /**
166
+ * In a Node.js environment, create a function that can wrap any endpoint to be
167
+ * able to use steps seamlessly within that API.
168
+ */
169
+ const endpointAdapter = require_InngestEndpointAdapter.InngestEndpointAdapter.create((options) => {
170
+ return endpointCommHandler(options, options).createSyncHandler();
171
+ }, createDurableEndpointProxyHandler);
172
+ /**
173
+ * Bridge a Web API endpoint handler to a Node.js `http.RequestListener`.
174
+ *
175
+ * Converts an incoming `http.IncomingMessage` into a Web API `Request`,
176
+ * invokes the handler, then streams the resulting `Response` back through
177
+ * the Node.js `http.ServerResponse`.
178
+ *
179
+ * Important: uses `value != null` (not `value`) when forwarding headers so
180
+ * that empty-string headers (like `X-Inngest-Signature: ""` in dev mode)
181
+ * are preserved. Dropping them breaks `isInngestReq()` detection.
182
+ */
183
+ function serveEndpoint(handler) {
184
+ return async (req, res) => {
185
+ const body = await readRequestBody(req);
186
+ const headers = new Headers();
187
+ for (const [key, value] of Object.entries(req.headers)) if (value != null) {
188
+ if (Array.isArray(value)) for (const v of value) headers.append(key, v);
189
+ else if (typeof value === "string") headers.set(key, value);
190
+ }
191
+ const url = getURL(req);
192
+ const webRequest = new Request(url.href, {
193
+ method: req.method,
194
+ headers,
195
+ body: body.length > 0 ? body : void 0
196
+ });
197
+ try {
198
+ const webResponse = await handler(webRequest);
199
+ const resHeaders = {};
200
+ webResponse.headers.forEach((v, k) => {
201
+ resHeaders[k] = v;
202
+ });
203
+ res.writeHead(webResponse.status, resHeaders);
204
+ if (webResponse.body) {
205
+ const reader = webResponse.body.getReader();
206
+ while (true) {
207
+ const { done, value } = await reader.read();
208
+ if (done) break;
209
+ res.write(value);
210
+ }
211
+ }
212
+ res.end();
213
+ } catch (err) {
214
+ if (!res.headersSent) res.writeHead(500);
215
+ res.end(String(err));
216
+ }
217
+ };
218
+ }
219
+ /**
220
+ * Create an HTTP server that serves a durable endpoint handler.
221
+ *
222
+ * This bridges the Web API `Request`/`Response` interface that Durable
223
+ * Endpoints use with Node.js's `http.Server`.
224
+ */
225
+ function createEndpointServer(handler) {
226
+ const listener = serveEndpoint(handler);
227
+ const server = node_http.default.createServer(listener);
228
+ server.on("clientError", (_err, socket) => {
229
+ socket.end("HTTP/1.1 400 Bad Request\r\n\r\n");
230
+ });
231
+ return server;
232
+ }
139
233
 
140
234
  //#endregion
235
+ exports.createEndpointServer = createEndpointServer;
141
236
  exports.createServer = createServer;
237
+ exports.endpointAdapter = endpointAdapter;
142
238
  exports.frameworkName = frameworkName;
143
239
  exports.serve = serve;
240
+ exports.serveEndpoint = serveEndpoint;
144
241
  //# sourceMappingURL=node.cjs.map
package/node.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"node.cjs","names":["frameworkName: SupportedFrameworkName","URL","InngestCommHandler","http"],"sources":["../src/node.ts"],"sourcesContent":["import http from \"node:http\";\nimport { PassThrough } from \"node:stream\";\nimport type { TLSSocket } from \"node:tls\";\nimport { URL } from \"node:url\";\nimport {\n InngestCommHandler,\n type ServeHandlerOptions,\n type SyncHandlerOptions,\n} from \"./components/InngestCommHandler.ts\";\nimport type { SupportedFrameworkName } from \"./types.ts\";\n\n/**\n * The name of the framework, used to identify the framework in Inngest\n * dashboards and during testing.\n */\nexport const frameworkName: SupportedFrameworkName = \"nodejs\";\n\n/**\n * Read the incoming message request body as text\n */\nasync function readRequestBody(req: http.IncomingMessage): Promise<string> {\n return new Promise((resolve) => {\n let body = \"\";\n req.on(\"data\", (chunk) => {\n body += chunk;\n });\n req.on(\"end\", () => {\n resolve(body);\n });\n });\n}\n\nfunction getURL(req: http.IncomingMessage, hostnameOption?: string): URL {\n const protocol =\n (req.headers[\"x-forwarded-proto\"] as string) ||\n ((req.socket as TLSSocket)?.encrypted ? \"https\" : \"http\");\n const origin = hostnameOption || `${protocol}://${req.headers.host}`;\n return new URL(req.url || \"\", origin);\n}\n\nconst _createResProxy = (\n res: http.ServerResponse,\n): {\n proxy: http.ServerResponse;\n data: Promise<string>;\n} => {\n // We tap the response so that we can capture data being output to convert\n // it to the format we need for checkpointing sync responses with\n // `checkpointResponse()`.\n const resChunks: Uint8Array[] = [];\n\n const tap = new PassThrough();\n tap.on(\"data\", (chunk) => resChunks.push(chunk));\n\n const data = new Promise<string>((resolve, reject) => {\n tap.on(\"end\", () => {\n resolve(Buffer.concat(resChunks).toString());\n });\n\n // TODO reject when?\n\n tap.pipe(res);\n });\n\n const proxy = new Proxy(res, {\n get(target, prop) {\n if (prop === \"write\") return tap.write.bind(tap);\n if (prop === \"end\") return tap.end.bind(tap);\n\n return Reflect.get(target, prop);\n },\n });\n\n return { proxy, data };\n};\n\nconst commHandler = (options: ServeHandlerOptions | SyncHandlerOptions) => {\n const handler = new InngestCommHandler({\n frameworkName,\n ...options,\n handler: (req: http.IncomingMessage, res: http.ServerResponse) => {\n return {\n body: async () => readRequestBody(req),\n headers: (key) => {\n return req.headers[key] && Array.isArray(req.headers[key])\n ? req.headers[key][0]\n : req.headers[key];\n },\n method: () => {\n if (!req.method) {\n throw new Error(\n \"Request method not defined. Potential use outside of context of Server.\",\n );\n }\n return req.method;\n },\n url: () => getURL(req, options.serveOrigin),\n transformResponse: ({ body, status, headers }) => {\n res.writeHead(status, headers);\n res.end(body);\n },\n\n transformStreamingResponse: async ({ body, headers, status }) => {\n res.writeHead(status, headers);\n\n const reader = body.getReader();\n try {\n let done = false;\n while (!done) {\n const result = await reader.read();\n done = result.done;\n if (!done) {\n res.write(result.value);\n }\n }\n res.end();\n } catch (error) {\n if (error instanceof Error) {\n res.destroy(error);\n } else {\n res.destroy(new Error(String(error)));\n }\n }\n },\n };\n },\n });\n\n return handler;\n};\n\n/**\n * Serve and register any declared functions with Inngest, making them available\n * to be triggered by events.\n *\n * @example Serve Inngest functions on all paths\n * ```ts\n * import { serve } from \"inngest/node\";\n * import { inngest } from \"./src/inngest/client\";\n * import myFn from \"./src/inngest/myFn\"; // Your own function\n *\n * const server = http.createServer(serve({\n * client: inngest, functions: [myFn]\n * }));\n * server.listen(3000);\n * ```\n *\n * @example Serve Inngest on a specific path\n * ```ts\n * import { serve } from \"inngest/node\";\n * import { inngest } from \"./src/inngest/client\";\n * import myFn from \"./src/inngest/myFn\"; // Your own function\n *\n * const server = http.createServer((req, res) => {\n * if (req.url.start === '/api/inngest') {\n * return serve({\n * client: inngest, functions: [myFn]\n * })(req, res);\n * }\n * // ...\n * });\n * server.listen(3000);\n * ```\n *\n * @public\n */\n// Has explicit return type to avoid JSR-defined \"slow types\"\nexport const serve = (options: ServeHandlerOptions): http.RequestListener => {\n return commHandler(options).createHandler() as http.RequestListener;\n};\n\n/**\n * EXPERIMENTAL - Create an http server to serve Inngest functions.\n *\n * @example\n * ```ts\n * import { createServer } from \"inngest/node\";\n * import { inngest } from \"./src/inngest/client\";\n * import myFn from \"./src/inngest/myFn\"; // Your own function\n *\n * const server = createServer({\n * client: inngest, functions: [myFn]\n * });\n * server.listen(3000);\n * ```\n *\n * @public\n */\nexport const createServer = (options: ServeHandlerOptions) => {\n const server = http.createServer((req, res) => {\n const url = getURL(req, options.serveOrigin);\n const pathname = options.servePath || \"/api/inngest\";\n if (url.pathname === pathname) {\n return serve(options)(req, res);\n }\n res.writeHead(404);\n res.end();\n });\n server.on(\"clientError\", (_err, socket) => {\n socket.end(\"HTTP/1.1 400 Bad Request\\r\\n\\r\\n\");\n });\n return server;\n};\n"],"mappings":";;;;;;;;;;;AAeA,MAAaA,gBAAwC;;;;AAKrD,eAAe,gBAAgB,KAA4C;AACzE,QAAO,IAAI,SAAS,YAAY;EAC9B,IAAI,OAAO;AACX,MAAI,GAAG,SAAS,UAAU;AACxB,WAAQ;IACR;AACF,MAAI,GAAG,aAAa;AAClB,WAAQ,KAAK;IACb;GACF;;AAGJ,SAAS,OAAO,KAA2B,gBAA8B;CACvE,MAAM,WACH,IAAI,QAAQ,yBACX,IAAI,QAAsB,YAAY,UAAU;CACpD,MAAM,SAAS,kBAAkB,GAAG,SAAS,KAAK,IAAI,QAAQ;AAC9D,QAAO,IAAIC,aAAI,IAAI,OAAO,IAAI,OAAO;;AAuCvC,MAAM,eAAe,YAAsD;AAoDzE,QAnDgB,IAAIC,8CAAmB;EACrC;EACA,GAAG;EACH,UAAU,KAA2B,QAA6B;AAChE,UAAO;IACL,MAAM,YAAY,gBAAgB,IAAI;IACtC,UAAU,QAAQ;AAChB,YAAO,IAAI,QAAQ,QAAQ,MAAM,QAAQ,IAAI,QAAQ,KAAK,GACtD,IAAI,QAAQ,KAAK,KACjB,IAAI,QAAQ;;IAElB,cAAc;AACZ,SAAI,CAAC,IAAI,OACP,OAAM,IAAI,MACR,0EACD;AAEH,YAAO,IAAI;;IAEb,WAAW,OAAO,KAAK,QAAQ,YAAY;IAC3C,oBAAoB,EAAE,MAAM,QAAQ,cAAc;AAChD,SAAI,UAAU,QAAQ,QAAQ;AAC9B,SAAI,IAAI,KAAK;;IAGf,4BAA4B,OAAO,EAAE,MAAM,SAAS,aAAa;AAC/D,SAAI,UAAU,QAAQ,QAAQ;KAE9B,MAAM,SAAS,KAAK,WAAW;AAC/B,SAAI;MACF,IAAI,OAAO;AACX,aAAO,CAAC,MAAM;OACZ,MAAM,SAAS,MAAM,OAAO,MAAM;AAClC,cAAO,OAAO;AACd,WAAI,CAAC,KACH,KAAI,MAAM,OAAO,MAAM;;AAG3B,UAAI,KAAK;cACF,OAAO;AACd,UAAI,iBAAiB,MACnB,KAAI,QAAQ,MAAM;UAElB,KAAI,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC,CAAC;;;IAI5C;;EAEJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCJ,MAAa,SAAS,YAAuD;AAC3E,QAAO,YAAY,QAAQ,CAAC,eAAe;;;;;;;;;;;;;;;;;;;AAoB7C,MAAa,gBAAgB,YAAiC;CAC5D,MAAM,SAASC,kBAAK,cAAc,KAAK,QAAQ;EAC7C,MAAM,MAAM,OAAO,KAAK,QAAQ,YAAY;EAC5C,MAAM,WAAW,QAAQ,aAAa;AACtC,MAAI,IAAI,aAAa,SACnB,QAAO,MAAM,QAAQ,CAAC,KAAK,IAAI;AAEjC,MAAI,UAAU,IAAI;AAClB,MAAI,KAAK;GACT;AACF,QAAO,GAAG,gBAAgB,MAAM,WAAW;AACzC,SAAO,IAAI,mCAAmC;GAC9C;AACF,QAAO"}
1
+ {"version":3,"file":"node.cjs","names":["frameworkName: SupportedFrameworkName","URL","InngestCommHandler","http","createWebApiCommHandler","handleDurableEndpointProxyRequest","InngestEndpointAdapter","resHeaders: Record<string, string>"],"sources":["../src/node.ts"],"sourcesContent":["import http from \"node:http\";\nimport type { TLSSocket } from \"node:tls\";\nimport { URL } from \"node:url\";\nimport { createWebApiCommHandler } from \"./components/createWebApiCommHandler.ts\";\nimport type { Inngest } from \"./components/Inngest.ts\";\nimport {\n InngestCommHandler,\n type ServeHandlerOptions,\n type SyncHandlerOptions,\n} from \"./components/InngestCommHandler.ts\";\nimport { handleDurableEndpointProxyRequest } from \"./components/InngestDurableEndpointProxy.ts\";\nimport { InngestEndpointAdapter } from \"./components/InngestEndpointAdapter.ts\";\nimport type { RegisterOptions, SupportedFrameworkName } from \"./types.ts\";\n\n/**\n * The name of the framework, used to identify the framework in Inngest\n * dashboards and during testing.\n */\nexport const frameworkName: SupportedFrameworkName = \"nodejs\";\n\n/**\n * Read the incoming message request body as text\n */\nasync function readRequestBody(req: http.IncomingMessage): Promise<string> {\n return new Promise((resolve) => {\n let body = \"\";\n req.on(\"data\", (chunk) => {\n body += chunk;\n });\n req.on(\"end\", () => {\n resolve(body);\n });\n });\n}\n\nfunction getURL(req: http.IncomingMessage, hostnameOption?: string): URL {\n const protocol =\n (req.headers[\"x-forwarded-proto\"] as string) ||\n ((req.socket as TLSSocket)?.encrypted ? \"https\" : \"http\");\n const origin = hostnameOption || `${protocol}://${req.headers.host}`;\n return new URL(req.url || \"\", origin);\n}\n\nconst commHandler = (options: ServeHandlerOptions | SyncHandlerOptions) => {\n const handler = new InngestCommHandler({\n frameworkName,\n ...options,\n handler: (req: http.IncomingMessage, res: http.ServerResponse) => {\n return {\n body: async () => readRequestBody(req),\n headers: (key) => {\n return req.headers[key] && Array.isArray(req.headers[key])\n ? req.headers[key][0]\n : req.headers[key];\n },\n method: () => {\n if (!req.method) {\n throw new Error(\n \"Request method not defined. Potential use outside of context of Server.\",\n );\n }\n return req.method;\n },\n url: () => getURL(req, options.serveOrigin),\n transformResponse: ({ body, status, headers }) => {\n res.writeHead(status, headers);\n res.end(body);\n },\n\n transformStreamingResponse: async ({ body, headers, status }) => {\n res.writeHead(status, headers);\n\n const reader = body.getReader();\n try {\n let done = false;\n while (!done) {\n const result = await reader.read();\n done = result.done;\n if (!done) {\n res.write(result.value);\n }\n }\n res.end();\n } catch (error) {\n if (error instanceof Error) {\n res.destroy(error);\n } else {\n res.destroy(new Error(String(error)));\n }\n }\n },\n };\n },\n });\n\n return handler;\n};\n\n/**\n * Serve and register any declared functions with Inngest, making them available\n * to be triggered by events.\n *\n * @example Serve Inngest functions on all paths\n * ```ts\n * import { serve } from \"inngest/node\";\n * import { inngest } from \"./src/inngest/client\";\n * import myFn from \"./src/inngest/myFn\"; // Your own function\n *\n * const server = http.createServer(serve({\n * client: inngest, functions: [myFn]\n * }));\n * server.listen(3000);\n * ```\n *\n * @example Serve Inngest on a specific path\n * ```ts\n * import { serve } from \"inngest/node\";\n * import { inngest } from \"./src/inngest/client\";\n * import myFn from \"./src/inngest/myFn\"; // Your own function\n *\n * const server = http.createServer((req, res) => {\n * if (req.url.start === '/api/inngest') {\n * return serve({\n * client: inngest, functions: [myFn]\n * })(req, res);\n * }\n * // ...\n * });\n * server.listen(3000);\n * ```\n *\n * @public\n */\n// Has explicit return type to avoid JSR-defined \"slow types\"\nexport const serve = (options: ServeHandlerOptions): http.RequestListener => {\n return commHandler(options).createHandler() as http.RequestListener;\n};\n\n/**\n * EXPERIMENTAL - Create an http server to serve Inngest functions.\n *\n * @example\n * ```ts\n * import { createServer } from \"inngest/node\";\n * import { inngest } from \"./src/inngest/client\";\n * import myFn from \"./src/inngest/myFn\"; // Your own function\n *\n * const server = createServer({\n * client: inngest, functions: [myFn]\n * });\n * server.listen(3000);\n * ```\n *\n * @public\n */\nexport const createServer = (options: ServeHandlerOptions) => {\n const server = http.createServer((req, res) => {\n const url = getURL(req, options.serveOrigin);\n const pathname = options.servePath || \"/api/inngest\";\n if (url.pathname === pathname) {\n return serve(options)(req, res);\n }\n res.writeHead(404);\n res.end();\n });\n server.on(\"clientError\", (_err, socket) => {\n socket.end(\"HTTP/1.1 400 Bad Request\\r\\n\\r\\n\");\n });\n return server;\n};\n\nexport type EndpointHandler = (req: Request) => Promise<Response>;\n\n/**\n * Comm handler for durable endpoints. Uses Web API Request/Response since\n * that's the interface users write against, regardless of the underlying\n * runtime.\n */\nfunction endpointCommHandler(\n options: RegisterOptions & { client: Inngest.Like },\n syncOptions?: SyncHandlerOptions,\n): InngestCommHandler {\n return createWebApiCommHandler(frameworkName, options, syncOptions);\n}\n\n/**\n * Creates a durable endpoint proxy handler for Node.js environments.\n */\nfunction createDurableEndpointProxyHandler(\n options: InngestEndpointAdapter.ProxyHandlerOptions,\n): http.RequestListener {\n return async (\n req: http.IncomingMessage,\n res: http.ServerResponse,\n ): Promise<void> => {\n const url = getURL(req);\n\n const result = await handleDurableEndpointProxyRequest(\n options.client as Inngest.Any,\n {\n runId: url.searchParams.get(\"runId\"),\n token: url.searchParams.get(\"token\"),\n method: req.method || \"GET\",\n },\n );\n\n res.writeHead(result.status, result.headers);\n res.end(result.body);\n };\n}\n\n/**\n * In a Node.js environment, create a function that can wrap any endpoint to be\n * able to use steps seamlessly within that API.\n */\nexport const endpointAdapter = InngestEndpointAdapter.create((options) => {\n return endpointCommHandler(options, options).createSyncHandler();\n}, createDurableEndpointProxyHandler);\n\n/**\n * Bridge a Web API endpoint handler to a Node.js `http.RequestListener`.\n *\n * Converts an incoming `http.IncomingMessage` into a Web API `Request`,\n * invokes the handler, then streams the resulting `Response` back through\n * the Node.js `http.ServerResponse`.\n *\n * Important: uses `value != null` (not `value`) when forwarding headers so\n * that empty-string headers (like `X-Inngest-Signature: \"\"` in dev mode)\n * are preserved. Dropping them breaks `isInngestReq()` detection.\n */\nexport function serveEndpoint(handler: EndpointHandler): http.RequestListener {\n return async (req: http.IncomingMessage, res: http.ServerResponse) => {\n const body = await readRequestBody(req);\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value != null) {\n if (Array.isArray(value)) {\n for (const v of value) {\n headers.append(key, v);\n }\n } else if (typeof value === \"string\") {\n headers.set(key, value);\n }\n }\n }\n\n const url = getURL(req);\n const webRequest = new Request(url.href, {\n method: req.method,\n headers,\n body: body.length > 0 ? body : undefined,\n });\n\n try {\n const webResponse = await handler(webRequest);\n\n const resHeaders: Record<string, string> = {};\n webResponse.headers.forEach((v, k) => {\n resHeaders[k] = v;\n });\n res.writeHead(webResponse.status, resHeaders);\n\n if (webResponse.body) {\n const reader = webResponse.body.getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n res.write(value);\n }\n }\n res.end();\n } catch (err) {\n if (!res.headersSent) {\n res.writeHead(500);\n }\n res.end(String(err));\n }\n };\n}\n\n/**\n * Create an HTTP server that serves a durable endpoint handler.\n *\n * This bridges the Web API `Request`/`Response` interface that Durable\n * Endpoints use with Node.js's `http.Server`.\n */\nexport function createEndpointServer(handler: EndpointHandler): http.Server {\n const listener = serveEndpoint(handler);\n const server = http.createServer(listener);\n server.on(\"clientError\", (_err, socket) => {\n socket.end(\"HTTP/1.1 400 Bad Request\\r\\n\\r\\n\");\n });\n return server;\n}\n"],"mappings":"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"}
package/node.d.cts CHANGED
@@ -1,5 +1,6 @@
1
+ import { InngestEndpointAdapter } from "./components/InngestEndpointAdapter.cjs";
1
2
  import { SupportedFrameworkName } from "./types.cjs";
2
- import { ServeHandlerOptions } from "./components/InngestCommHandler.cjs";
3
+ import { ServeHandlerOptions, SyncHandlerOptions } from "./components/InngestCommHandler.cjs";
3
4
  import http from "node:http";
4
5
 
5
6
  //#region src/node.d.ts
@@ -63,6 +64,37 @@ declare const serve: (options: ServeHandlerOptions) => http.RequestListener;
63
64
  * @public
64
65
  */
65
66
  declare const createServer: (options: ServeHandlerOptions) => http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>;
67
+ type EndpointHandler = (req: Request) => Promise<Response>;
68
+ /**
69
+ * Creates a durable endpoint proxy handler for Node.js environments.
70
+ */
71
+ declare function createDurableEndpointProxyHandler(options: InngestEndpointAdapter.ProxyHandlerOptions): http.RequestListener;
72
+ /**
73
+ * In a Node.js environment, create a function that can wrap any endpoint to be
74
+ * able to use steps seamlessly within that API.
75
+ */
76
+ declare const endpointAdapter: ((options: SyncHandlerOptions) => (handler: (...args: any[]) => Promise<any>) => (...args: any[]) => Promise<any>) & InngestEndpointAdapter.Like & {
77
+ createProxyHandler: typeof createDurableEndpointProxyHandler;
78
+ };
79
+ /**
80
+ * Bridge a Web API endpoint handler to a Node.js `http.RequestListener`.
81
+ *
82
+ * Converts an incoming `http.IncomingMessage` into a Web API `Request`,
83
+ * invokes the handler, then streams the resulting `Response` back through
84
+ * the Node.js `http.ServerResponse`.
85
+ *
86
+ * Important: uses `value != null` (not `value`) when forwarding headers so
87
+ * that empty-string headers (like `X-Inngest-Signature: ""` in dev mode)
88
+ * are preserved. Dropping them breaks `isInngestReq()` detection.
89
+ */
90
+ declare function serveEndpoint(handler: EndpointHandler): http.RequestListener;
91
+ /**
92
+ * Create an HTTP server that serves a durable endpoint handler.
93
+ *
94
+ * This bridges the Web API `Request`/`Response` interface that Durable
95
+ * Endpoints use with Node.js's `http.Server`.
96
+ */
97
+ declare function createEndpointServer(handler: EndpointHandler): http.Server;
66
98
  //#endregion
67
- export { createServer, frameworkName, serve };
99
+ export { EndpointHandler, createEndpointServer, createServer, endpointAdapter, frameworkName, serve, serveEndpoint };
68
100
  //# sourceMappingURL=node.d.cts.map
package/node.d.cts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.cts","names":[],"sources":["../src/node.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAeA;AAwJA;AAEC,cA1JY,aA0JZ,EA1J2B,sBA0J3B;;;;AAmBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cArBa,iBAAkB,wBAAsB,IAAA,CAAK;;;;;;;;;;;;;;;;;;cAqB7C,wBAAyB,wBAAmB,IAAA,CAAA,cAAA,IAAA,CAAA,wBAAA,IAAA,CAAA"}
1
+ {"version":3,"file":"node.d.cts","names":[],"sources":["../src/node.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AAkBA;AAoHA;AAEC,cAtHY,aAsHZ,EAtH2B,sBAsH3B;;;;AAmBD;;;;;;;AAgBA;;;;;;AAAkE;;;;;AA4ClE;;;;;;;;AAeA;;;;;AA2DA;AAAoC,cA3JvB,KA2JuB,EAAA,CAAA,OAAA,EA3JL,mBA2JK,EAAA,GA3JiB,IAAA,CAAK,eA2JtB;;;;;;;;;;;;;;;;;;cAtIvB,wBAAyB,wBAAmB,IAAA,CAAA,cAAA,IAAA,CAAA,wBAAA,IAAA,CAAA;KAgB7C,eAAA,SAAwB,YAAY,QAAQ;;;;iBAiB/C,iCAAA,UACE,sBAAA,CAAuB,sBAC/B,IAAA,CAAK;;;;;cAyBK,4BAAe,qDAAA,qCAAA,gBAAA,sBAAA,CAAA;;;;;;;;;;;;;;iBAeZ,aAAA,UAAuB,kBAAkB,IAAA,CAAK;;;;;;;iBA2D9C,oBAAA,UAA8B,kBAAkB,IAAA,CAAK"}
package/node.d.ts CHANGED
@@ -1,5 +1,6 @@
1
+ import { InngestEndpointAdapter } from "./components/InngestEndpointAdapter.js";
1
2
  import { SupportedFrameworkName } from "./types.js";
2
- import { ServeHandlerOptions } from "./components/InngestCommHandler.js";
3
+ import { ServeHandlerOptions, SyncHandlerOptions } from "./components/InngestCommHandler.js";
3
4
  import http from "node:http";
4
5
 
5
6
  //#region src/node.d.ts
@@ -63,6 +64,37 @@ declare const serve: (options: ServeHandlerOptions) => http.RequestListener;
63
64
  * @public
64
65
  */
65
66
  declare const createServer: (options: ServeHandlerOptions) => http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>;
67
+ type EndpointHandler = (req: Request) => Promise<Response>;
68
+ /**
69
+ * Creates a durable endpoint proxy handler for Node.js environments.
70
+ */
71
+ declare function createDurableEndpointProxyHandler(options: InngestEndpointAdapter.ProxyHandlerOptions): http.RequestListener;
72
+ /**
73
+ * In a Node.js environment, create a function that can wrap any endpoint to be
74
+ * able to use steps seamlessly within that API.
75
+ */
76
+ declare const endpointAdapter: ((options: SyncHandlerOptions) => (handler: (...args: any[]) => Promise<any>) => (...args: any[]) => Promise<any>) & InngestEndpointAdapter.Like & {
77
+ createProxyHandler: typeof createDurableEndpointProxyHandler;
78
+ };
79
+ /**
80
+ * Bridge a Web API endpoint handler to a Node.js `http.RequestListener`.
81
+ *
82
+ * Converts an incoming `http.IncomingMessage` into a Web API `Request`,
83
+ * invokes the handler, then streams the resulting `Response` back through
84
+ * the Node.js `http.ServerResponse`.
85
+ *
86
+ * Important: uses `value != null` (not `value`) when forwarding headers so
87
+ * that empty-string headers (like `X-Inngest-Signature: ""` in dev mode)
88
+ * are preserved. Dropping them breaks `isInngestReq()` detection.
89
+ */
90
+ declare function serveEndpoint(handler: EndpointHandler): http.RequestListener;
91
+ /**
92
+ * Create an HTTP server that serves a durable endpoint handler.
93
+ *
94
+ * This bridges the Web API `Request`/`Response` interface that Durable
95
+ * Endpoints use with Node.js's `http.Server`.
96
+ */
97
+ declare function createEndpointServer(handler: EndpointHandler): http.Server;
66
98
  //#endregion
67
- export { createServer, frameworkName, serve };
99
+ export { EndpointHandler, createEndpointServer, createServer, endpointAdapter, frameworkName, serve, serveEndpoint };
68
100
  //# sourceMappingURL=node.d.ts.map
package/node.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","names":[],"sources":["../src/node.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAeA;AAwJA;AAEC,cA1JY,aA0JZ,EA1J2B,sBA0J3B;;;;AAmBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cArBa,iBAAkB,wBAAsB,IAAA,CAAK;;;;;;;;;;;;;;;;;;cAqB7C,wBAAyB,wBAAmB,IAAA,CAAA,cAAA,IAAA,CAAA,wBAAA,IAAA,CAAA"}
1
+ {"version":3,"file":"node.d.ts","names":[],"sources":["../src/node.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AAkBA;AAoHA;AAEC,cAtHY,aAsHZ,EAtH2B,sBAsH3B;;;;AAmBD;;;;;;;AAgBA;;;;;;AAAkE;;;;;AA4ClE;;;;;;;;AAeA;;;;;AA2DA;AAAoC,cA3JvB,KA2JuB,EAAA,CAAA,OAAA,EA3JL,mBA2JK,EAAA,GA3JiB,IAAA,CAAK,eA2JtB;;;;;;;;;;;;;;;;;;cAtIvB,wBAAyB,wBAAmB,IAAA,CAAA,cAAA,IAAA,CAAA,wBAAA,IAAA,CAAA;KAgB7C,eAAA,SAAwB,YAAY,QAAQ;;;;iBAiB/C,iCAAA,UACE,sBAAA,CAAuB,sBAC/B,IAAA,CAAK;;;;;cAyBK,4BAAe,qDAAA,qCAAA,gBAAA,sBAAA,CAAA;;;;;;;;;;;;;;iBAeZ,aAAA,UAAuB,kBAAkB,IAAA,CAAK;;;;;;;iBA2D9C,oBAAA,UAA8B,kBAAkB,IAAA,CAAK"}
package/node.js CHANGED
@@ -1,6 +1,8 @@
1
1
  import { InngestCommHandler } from "./components/InngestCommHandler.js";
2
+ import { createWebApiCommHandler } from "./components/createWebApiCommHandler.js";
3
+ import { handleDurableEndpointProxyRequest } from "./components/InngestDurableEndpointProxy.js";
4
+ import { InngestEndpointAdapter } from "./components/InngestEndpointAdapter.js";
2
5
  import http from "node:http";
3
- import "node:stream";
4
6
  import { URL } from "node:url";
5
7
 
6
8
  //#region src/node.ts
@@ -135,7 +137,98 @@ const createServer = (options) => {
135
137
  });
136
138
  return server;
137
139
  };
140
+ /**
141
+ * Comm handler for durable endpoints. Uses Web API Request/Response since
142
+ * that's the interface users write against, regardless of the underlying
143
+ * runtime.
144
+ */
145
+ function endpointCommHandler(options, syncOptions) {
146
+ return createWebApiCommHandler(frameworkName, options, syncOptions);
147
+ }
148
+ /**
149
+ * Creates a durable endpoint proxy handler for Node.js environments.
150
+ */
151
+ function createDurableEndpointProxyHandler(options) {
152
+ return async (req, res) => {
153
+ const url = getURL(req);
154
+ const result = await handleDurableEndpointProxyRequest(options.client, {
155
+ runId: url.searchParams.get("runId"),
156
+ token: url.searchParams.get("token"),
157
+ method: req.method || "GET"
158
+ });
159
+ res.writeHead(result.status, result.headers);
160
+ res.end(result.body);
161
+ };
162
+ }
163
+ /**
164
+ * In a Node.js environment, create a function that can wrap any endpoint to be
165
+ * able to use steps seamlessly within that API.
166
+ */
167
+ const endpointAdapter = InngestEndpointAdapter.create((options) => {
168
+ return endpointCommHandler(options, options).createSyncHandler();
169
+ }, createDurableEndpointProxyHandler);
170
+ /**
171
+ * Bridge a Web API endpoint handler to a Node.js `http.RequestListener`.
172
+ *
173
+ * Converts an incoming `http.IncomingMessage` into a Web API `Request`,
174
+ * invokes the handler, then streams the resulting `Response` back through
175
+ * the Node.js `http.ServerResponse`.
176
+ *
177
+ * Important: uses `value != null` (not `value`) when forwarding headers so
178
+ * that empty-string headers (like `X-Inngest-Signature: ""` in dev mode)
179
+ * are preserved. Dropping them breaks `isInngestReq()` detection.
180
+ */
181
+ function serveEndpoint(handler) {
182
+ return async (req, res) => {
183
+ const body = await readRequestBody(req);
184
+ const headers = new Headers();
185
+ for (const [key, value] of Object.entries(req.headers)) if (value != null) {
186
+ if (Array.isArray(value)) for (const v of value) headers.append(key, v);
187
+ else if (typeof value === "string") headers.set(key, value);
188
+ }
189
+ const url = getURL(req);
190
+ const webRequest = new Request(url.href, {
191
+ method: req.method,
192
+ headers,
193
+ body: body.length > 0 ? body : void 0
194
+ });
195
+ try {
196
+ const webResponse = await handler(webRequest);
197
+ const resHeaders = {};
198
+ webResponse.headers.forEach((v, k) => {
199
+ resHeaders[k] = v;
200
+ });
201
+ res.writeHead(webResponse.status, resHeaders);
202
+ if (webResponse.body) {
203
+ const reader = webResponse.body.getReader();
204
+ while (true) {
205
+ const { done, value } = await reader.read();
206
+ if (done) break;
207
+ res.write(value);
208
+ }
209
+ }
210
+ res.end();
211
+ } catch (err) {
212
+ if (!res.headersSent) res.writeHead(500);
213
+ res.end(String(err));
214
+ }
215
+ };
216
+ }
217
+ /**
218
+ * Create an HTTP server that serves a durable endpoint handler.
219
+ *
220
+ * This bridges the Web API `Request`/`Response` interface that Durable
221
+ * Endpoints use with Node.js's `http.Server`.
222
+ */
223
+ function createEndpointServer(handler) {
224
+ const listener = serveEndpoint(handler);
225
+ const server = http.createServer(listener);
226
+ server.on("clientError", (_err, socket) => {
227
+ socket.end("HTTP/1.1 400 Bad Request\r\n\r\n");
228
+ });
229
+ return server;
230
+ }
138
231
 
139
232
  //#endregion
140
- export { createServer, frameworkName, serve };
233
+ export { createEndpointServer, createServer, endpointAdapter, frameworkName, serve, serveEndpoint };
141
234
  //# sourceMappingURL=node.js.map
package/node.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"node.js","names":["frameworkName: SupportedFrameworkName"],"sources":["../src/node.ts"],"sourcesContent":["import http from \"node:http\";\nimport { PassThrough } from \"node:stream\";\nimport type { TLSSocket } from \"node:tls\";\nimport { URL } from \"node:url\";\nimport {\n InngestCommHandler,\n type ServeHandlerOptions,\n type SyncHandlerOptions,\n} from \"./components/InngestCommHandler.ts\";\nimport type { SupportedFrameworkName } from \"./types.ts\";\n\n/**\n * The name of the framework, used to identify the framework in Inngest\n * dashboards and during testing.\n */\nexport const frameworkName: SupportedFrameworkName = \"nodejs\";\n\n/**\n * Read the incoming message request body as text\n */\nasync function readRequestBody(req: http.IncomingMessage): Promise<string> {\n return new Promise((resolve) => {\n let body = \"\";\n req.on(\"data\", (chunk) => {\n body += chunk;\n });\n req.on(\"end\", () => {\n resolve(body);\n });\n });\n}\n\nfunction getURL(req: http.IncomingMessage, hostnameOption?: string): URL {\n const protocol =\n (req.headers[\"x-forwarded-proto\"] as string) ||\n ((req.socket as TLSSocket)?.encrypted ? \"https\" : \"http\");\n const origin = hostnameOption || `${protocol}://${req.headers.host}`;\n return new URL(req.url || \"\", origin);\n}\n\nconst _createResProxy = (\n res: http.ServerResponse,\n): {\n proxy: http.ServerResponse;\n data: Promise<string>;\n} => {\n // We tap the response so that we can capture data being output to convert\n // it to the format we need for checkpointing sync responses with\n // `checkpointResponse()`.\n const resChunks: Uint8Array[] = [];\n\n const tap = new PassThrough();\n tap.on(\"data\", (chunk) => resChunks.push(chunk));\n\n const data = new Promise<string>((resolve, reject) => {\n tap.on(\"end\", () => {\n resolve(Buffer.concat(resChunks).toString());\n });\n\n // TODO reject when?\n\n tap.pipe(res);\n });\n\n const proxy = new Proxy(res, {\n get(target, prop) {\n if (prop === \"write\") return tap.write.bind(tap);\n if (prop === \"end\") return tap.end.bind(tap);\n\n return Reflect.get(target, prop);\n },\n });\n\n return { proxy, data };\n};\n\nconst commHandler = (options: ServeHandlerOptions | SyncHandlerOptions) => {\n const handler = new InngestCommHandler({\n frameworkName,\n ...options,\n handler: (req: http.IncomingMessage, res: http.ServerResponse) => {\n return {\n body: async () => readRequestBody(req),\n headers: (key) => {\n return req.headers[key] && Array.isArray(req.headers[key])\n ? req.headers[key][0]\n : req.headers[key];\n },\n method: () => {\n if (!req.method) {\n throw new Error(\n \"Request method not defined. Potential use outside of context of Server.\",\n );\n }\n return req.method;\n },\n url: () => getURL(req, options.serveOrigin),\n transformResponse: ({ body, status, headers }) => {\n res.writeHead(status, headers);\n res.end(body);\n },\n\n transformStreamingResponse: async ({ body, headers, status }) => {\n res.writeHead(status, headers);\n\n const reader = body.getReader();\n try {\n let done = false;\n while (!done) {\n const result = await reader.read();\n done = result.done;\n if (!done) {\n res.write(result.value);\n }\n }\n res.end();\n } catch (error) {\n if (error instanceof Error) {\n res.destroy(error);\n } else {\n res.destroy(new Error(String(error)));\n }\n }\n },\n };\n },\n });\n\n return handler;\n};\n\n/**\n * Serve and register any declared functions with Inngest, making them available\n * to be triggered by events.\n *\n * @example Serve Inngest functions on all paths\n * ```ts\n * import { serve } from \"inngest/node\";\n * import { inngest } from \"./src/inngest/client\";\n * import myFn from \"./src/inngest/myFn\"; // Your own function\n *\n * const server = http.createServer(serve({\n * client: inngest, functions: [myFn]\n * }));\n * server.listen(3000);\n * ```\n *\n * @example Serve Inngest on a specific path\n * ```ts\n * import { serve } from \"inngest/node\";\n * import { inngest } from \"./src/inngest/client\";\n * import myFn from \"./src/inngest/myFn\"; // Your own function\n *\n * const server = http.createServer((req, res) => {\n * if (req.url.start === '/api/inngest') {\n * return serve({\n * client: inngest, functions: [myFn]\n * })(req, res);\n * }\n * // ...\n * });\n * server.listen(3000);\n * ```\n *\n * @public\n */\n// Has explicit return type to avoid JSR-defined \"slow types\"\nexport const serve = (options: ServeHandlerOptions): http.RequestListener => {\n return commHandler(options).createHandler() as http.RequestListener;\n};\n\n/**\n * EXPERIMENTAL - Create an http server to serve Inngest functions.\n *\n * @example\n * ```ts\n * import { createServer } from \"inngest/node\";\n * import { inngest } from \"./src/inngest/client\";\n * import myFn from \"./src/inngest/myFn\"; // Your own function\n *\n * const server = createServer({\n * client: inngest, functions: [myFn]\n * });\n * server.listen(3000);\n * ```\n *\n * @public\n */\nexport const createServer = (options: ServeHandlerOptions) => {\n const server = http.createServer((req, res) => {\n const url = getURL(req, options.serveOrigin);\n const pathname = options.servePath || \"/api/inngest\";\n if (url.pathname === pathname) {\n return serve(options)(req, res);\n }\n res.writeHead(404);\n res.end();\n });\n server.on(\"clientError\", (_err, socket) => {\n socket.end(\"HTTP/1.1 400 Bad Request\\r\\n\\r\\n\");\n });\n return server;\n};\n"],"mappings":";;;;;;;;;;AAeA,MAAaA,gBAAwC;;;;AAKrD,eAAe,gBAAgB,KAA4C;AACzE,QAAO,IAAI,SAAS,YAAY;EAC9B,IAAI,OAAO;AACX,MAAI,GAAG,SAAS,UAAU;AACxB,WAAQ;IACR;AACF,MAAI,GAAG,aAAa;AAClB,WAAQ,KAAK;IACb;GACF;;AAGJ,SAAS,OAAO,KAA2B,gBAA8B;CACvE,MAAM,WACH,IAAI,QAAQ,yBACX,IAAI,QAAsB,YAAY,UAAU;CACpD,MAAM,SAAS,kBAAkB,GAAG,SAAS,KAAK,IAAI,QAAQ;AAC9D,QAAO,IAAI,IAAI,IAAI,OAAO,IAAI,OAAO;;AAuCvC,MAAM,eAAe,YAAsD;AAoDzE,QAnDgB,IAAI,mBAAmB;EACrC;EACA,GAAG;EACH,UAAU,KAA2B,QAA6B;AAChE,UAAO;IACL,MAAM,YAAY,gBAAgB,IAAI;IACtC,UAAU,QAAQ;AAChB,YAAO,IAAI,QAAQ,QAAQ,MAAM,QAAQ,IAAI,QAAQ,KAAK,GACtD,IAAI,QAAQ,KAAK,KACjB,IAAI,QAAQ;;IAElB,cAAc;AACZ,SAAI,CAAC,IAAI,OACP,OAAM,IAAI,MACR,0EACD;AAEH,YAAO,IAAI;;IAEb,WAAW,OAAO,KAAK,QAAQ,YAAY;IAC3C,oBAAoB,EAAE,MAAM,QAAQ,cAAc;AAChD,SAAI,UAAU,QAAQ,QAAQ;AAC9B,SAAI,IAAI,KAAK;;IAGf,4BAA4B,OAAO,EAAE,MAAM,SAAS,aAAa;AAC/D,SAAI,UAAU,QAAQ,QAAQ;KAE9B,MAAM,SAAS,KAAK,WAAW;AAC/B,SAAI;MACF,IAAI,OAAO;AACX,aAAO,CAAC,MAAM;OACZ,MAAM,SAAS,MAAM,OAAO,MAAM;AAClC,cAAO,OAAO;AACd,WAAI,CAAC,KACH,KAAI,MAAM,OAAO,MAAM;;AAG3B,UAAI,KAAK;cACF,OAAO;AACd,UAAI,iBAAiB,MACnB,KAAI,QAAQ,MAAM;UAElB,KAAI,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC,CAAC;;;IAI5C;;EAEJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCJ,MAAa,SAAS,YAAuD;AAC3E,QAAO,YAAY,QAAQ,CAAC,eAAe;;;;;;;;;;;;;;;;;;;AAoB7C,MAAa,gBAAgB,YAAiC;CAC5D,MAAM,SAAS,KAAK,cAAc,KAAK,QAAQ;EAC7C,MAAM,MAAM,OAAO,KAAK,QAAQ,YAAY;EAC5C,MAAM,WAAW,QAAQ,aAAa;AACtC,MAAI,IAAI,aAAa,SACnB,QAAO,MAAM,QAAQ,CAAC,KAAK,IAAI;AAEjC,MAAI,UAAU,IAAI;AAClB,MAAI,KAAK;GACT;AACF,QAAO,GAAG,gBAAgB,MAAM,WAAW;AACzC,SAAO,IAAI,mCAAmC;GAC9C;AACF,QAAO"}
1
+ {"version":3,"file":"node.js","names":["frameworkName: SupportedFrameworkName","resHeaders: Record<string, string>"],"sources":["../src/node.ts"],"sourcesContent":["import http from \"node:http\";\nimport type { TLSSocket } from \"node:tls\";\nimport { URL } from \"node:url\";\nimport { createWebApiCommHandler } from \"./components/createWebApiCommHandler.ts\";\nimport type { Inngest } from \"./components/Inngest.ts\";\nimport {\n InngestCommHandler,\n type ServeHandlerOptions,\n type SyncHandlerOptions,\n} from \"./components/InngestCommHandler.ts\";\nimport { handleDurableEndpointProxyRequest } from \"./components/InngestDurableEndpointProxy.ts\";\nimport { InngestEndpointAdapter } from \"./components/InngestEndpointAdapter.ts\";\nimport type { RegisterOptions, SupportedFrameworkName } from \"./types.ts\";\n\n/**\n * The name of the framework, used to identify the framework in Inngest\n * dashboards and during testing.\n */\nexport const frameworkName: SupportedFrameworkName = \"nodejs\";\n\n/**\n * Read the incoming message request body as text\n */\nasync function readRequestBody(req: http.IncomingMessage): Promise<string> {\n return new Promise((resolve) => {\n let body = \"\";\n req.on(\"data\", (chunk) => {\n body += chunk;\n });\n req.on(\"end\", () => {\n resolve(body);\n });\n });\n}\n\nfunction getURL(req: http.IncomingMessage, hostnameOption?: string): URL {\n const protocol =\n (req.headers[\"x-forwarded-proto\"] as string) ||\n ((req.socket as TLSSocket)?.encrypted ? \"https\" : \"http\");\n const origin = hostnameOption || `${protocol}://${req.headers.host}`;\n return new URL(req.url || \"\", origin);\n}\n\nconst commHandler = (options: ServeHandlerOptions | SyncHandlerOptions) => {\n const handler = new InngestCommHandler({\n frameworkName,\n ...options,\n handler: (req: http.IncomingMessage, res: http.ServerResponse) => {\n return {\n body: async () => readRequestBody(req),\n headers: (key) => {\n return req.headers[key] && Array.isArray(req.headers[key])\n ? req.headers[key][0]\n : req.headers[key];\n },\n method: () => {\n if (!req.method) {\n throw new Error(\n \"Request method not defined. Potential use outside of context of Server.\",\n );\n }\n return req.method;\n },\n url: () => getURL(req, options.serveOrigin),\n transformResponse: ({ body, status, headers }) => {\n res.writeHead(status, headers);\n res.end(body);\n },\n\n transformStreamingResponse: async ({ body, headers, status }) => {\n res.writeHead(status, headers);\n\n const reader = body.getReader();\n try {\n let done = false;\n while (!done) {\n const result = await reader.read();\n done = result.done;\n if (!done) {\n res.write(result.value);\n }\n }\n res.end();\n } catch (error) {\n if (error instanceof Error) {\n res.destroy(error);\n } else {\n res.destroy(new Error(String(error)));\n }\n }\n },\n };\n },\n });\n\n return handler;\n};\n\n/**\n * Serve and register any declared functions with Inngest, making them available\n * to be triggered by events.\n *\n * @example Serve Inngest functions on all paths\n * ```ts\n * import { serve } from \"inngest/node\";\n * import { inngest } from \"./src/inngest/client\";\n * import myFn from \"./src/inngest/myFn\"; // Your own function\n *\n * const server = http.createServer(serve({\n * client: inngest, functions: [myFn]\n * }));\n * server.listen(3000);\n * ```\n *\n * @example Serve Inngest on a specific path\n * ```ts\n * import { serve } from \"inngest/node\";\n * import { inngest } from \"./src/inngest/client\";\n * import myFn from \"./src/inngest/myFn\"; // Your own function\n *\n * const server = http.createServer((req, res) => {\n * if (req.url.start === '/api/inngest') {\n * return serve({\n * client: inngest, functions: [myFn]\n * })(req, res);\n * }\n * // ...\n * });\n * server.listen(3000);\n * ```\n *\n * @public\n */\n// Has explicit return type to avoid JSR-defined \"slow types\"\nexport const serve = (options: ServeHandlerOptions): http.RequestListener => {\n return commHandler(options).createHandler() as http.RequestListener;\n};\n\n/**\n * EXPERIMENTAL - Create an http server to serve Inngest functions.\n *\n * @example\n * ```ts\n * import { createServer } from \"inngest/node\";\n * import { inngest } from \"./src/inngest/client\";\n * import myFn from \"./src/inngest/myFn\"; // Your own function\n *\n * const server = createServer({\n * client: inngest, functions: [myFn]\n * });\n * server.listen(3000);\n * ```\n *\n * @public\n */\nexport const createServer = (options: ServeHandlerOptions) => {\n const server = http.createServer((req, res) => {\n const url = getURL(req, options.serveOrigin);\n const pathname = options.servePath || \"/api/inngest\";\n if (url.pathname === pathname) {\n return serve(options)(req, res);\n }\n res.writeHead(404);\n res.end();\n });\n server.on(\"clientError\", (_err, socket) => {\n socket.end(\"HTTP/1.1 400 Bad Request\\r\\n\\r\\n\");\n });\n return server;\n};\n\nexport type EndpointHandler = (req: Request) => Promise<Response>;\n\n/**\n * Comm handler for durable endpoints. Uses Web API Request/Response since\n * that's the interface users write against, regardless of the underlying\n * runtime.\n */\nfunction endpointCommHandler(\n options: RegisterOptions & { client: Inngest.Like },\n syncOptions?: SyncHandlerOptions,\n): InngestCommHandler {\n return createWebApiCommHandler(frameworkName, options, syncOptions);\n}\n\n/**\n * Creates a durable endpoint proxy handler for Node.js environments.\n */\nfunction createDurableEndpointProxyHandler(\n options: InngestEndpointAdapter.ProxyHandlerOptions,\n): http.RequestListener {\n return async (\n req: http.IncomingMessage,\n res: http.ServerResponse,\n ): Promise<void> => {\n const url = getURL(req);\n\n const result = await handleDurableEndpointProxyRequest(\n options.client as Inngest.Any,\n {\n runId: url.searchParams.get(\"runId\"),\n token: url.searchParams.get(\"token\"),\n method: req.method || \"GET\",\n },\n );\n\n res.writeHead(result.status, result.headers);\n res.end(result.body);\n };\n}\n\n/**\n * In a Node.js environment, create a function that can wrap any endpoint to be\n * able to use steps seamlessly within that API.\n */\nexport const endpointAdapter = InngestEndpointAdapter.create((options) => {\n return endpointCommHandler(options, options).createSyncHandler();\n}, createDurableEndpointProxyHandler);\n\n/**\n * Bridge a Web API endpoint handler to a Node.js `http.RequestListener`.\n *\n * Converts an incoming `http.IncomingMessage` into a Web API `Request`,\n * invokes the handler, then streams the resulting `Response` back through\n * the Node.js `http.ServerResponse`.\n *\n * Important: uses `value != null` (not `value`) when forwarding headers so\n * that empty-string headers (like `X-Inngest-Signature: \"\"` in dev mode)\n * are preserved. Dropping them breaks `isInngestReq()` detection.\n */\nexport function serveEndpoint(handler: EndpointHandler): http.RequestListener {\n return async (req: http.IncomingMessage, res: http.ServerResponse) => {\n const body = await readRequestBody(req);\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value != null) {\n if (Array.isArray(value)) {\n for (const v of value) {\n headers.append(key, v);\n }\n } else if (typeof value === \"string\") {\n headers.set(key, value);\n }\n }\n }\n\n const url = getURL(req);\n const webRequest = new Request(url.href, {\n method: req.method,\n headers,\n body: body.length > 0 ? body : undefined,\n });\n\n try {\n const webResponse = await handler(webRequest);\n\n const resHeaders: Record<string, string> = {};\n webResponse.headers.forEach((v, k) => {\n resHeaders[k] = v;\n });\n res.writeHead(webResponse.status, resHeaders);\n\n if (webResponse.body) {\n const reader = webResponse.body.getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n res.write(value);\n }\n }\n res.end();\n } catch (err) {\n if (!res.headersSent) {\n res.writeHead(500);\n }\n res.end(String(err));\n }\n };\n}\n\n/**\n * Create an HTTP server that serves a durable endpoint handler.\n *\n * This bridges the Web API `Request`/`Response` interface that Durable\n * Endpoints use with Node.js's `http.Server`.\n */\nexport function createEndpointServer(handler: EndpointHandler): http.Server {\n const listener = serveEndpoint(handler);\n const server = http.createServer(listener);\n server.on(\"clientError\", (_err, socket) => {\n socket.end(\"HTTP/1.1 400 Bad Request\\r\\n\\r\\n\");\n });\n return server;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "inngest",
3
- "version": "4.1.2",
3
+ "version": "4.2.0",
4
4
  "description": "Official SDK for Inngest.com. Inngest is the reliability layer for modern applications. Inngest combines durable execution, events, and queues into a zero-infra platform with built-in observability.",
5
5
  "main": "./index.cjs",
6
6
  "module": "./index.js",
@@ -226,6 +226,22 @@
226
226
  "import": "./internals.js",
227
227
  "require": "./internals.cjs"
228
228
  },
229
+ "./experimental/durable-endpoints": {
230
+ "types": {
231
+ "import": "./experimental/durable-endpoints/index.d.ts",
232
+ "require": "./experimental/durable-endpoints/index.d.cts"
233
+ },
234
+ "import": "./experimental/durable-endpoints/index.js",
235
+ "require": "./experimental/durable-endpoints/index.cjs"
236
+ },
237
+ "./experimental/durable-endpoints/client": {
238
+ "types": {
239
+ "import": "./experimental/durable-endpoints/client.d.ts",
240
+ "require": "./experimental/durable-endpoints/client.d.cts"
241
+ },
242
+ "import": "./experimental/durable-endpoints/client.js",
243
+ "require": "./experimental/durable-endpoints/client.cjs"
244
+ },
229
245
  "./realtime": {
230
246
  "types": {
231
247
  "import": "./realtime.d.ts",
package/react.d.cts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"react.d.cts","names":[],"sources":["../src/react.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"react.d.cts","names":[],"sources":["../src/react.ts"],"sourcesContent":[],"mappings":"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"}
package/version.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
 
2
2
  //#region src/version.ts
3
- const version = "4.1.2";
3
+ const version = "4.2.0";
4
4
 
5
5
  //#endregion
6
6
  exports.version = version;
package/version.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"version.cjs","names":[],"sources":["../src/version.ts"],"sourcesContent":["// Generated by genversion.\nexport const version = \"4.1.2\";\n"],"mappings":";;AACA,MAAa,UAAU"}
1
+ {"version":3,"file":"version.cjs","names":[],"sources":["../src/version.ts"],"sourcesContent":["// Generated by genversion.\nexport const version = \"4.2.0\";\n"],"mappings":";;AACA,MAAa,UAAU"}
package/version.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region src/version.d.ts
2
- declare const version = "4.1.2";
2
+ declare const version = "4.2.0";
3
3
  //#endregion
4
4
  export { version };
5
5
  //# sourceMappingURL=version.d.cts.map
package/version.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region src/version.d.ts
2
- declare const version = "4.1.2";
2
+ declare const version = "4.2.0";
3
3
  //#endregion
4
4
  export { version };
5
5
  //# sourceMappingURL=version.d.ts.map
package/version.js CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region src/version.ts
2
- const version = "4.1.2";
2
+ const version = "4.2.0";
3
3
 
4
4
  //#endregion
5
5
  export { version };
package/version.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","names":[],"sources":["../src/version.ts"],"sourcesContent":["// Generated by genversion.\nexport const version = \"4.1.2\";\n"],"mappings":";AACA,MAAa,UAAU"}
1
+ {"version":3,"file":"version.js","names":[],"sources":["../src/version.ts"],"sourcesContent":["// Generated by genversion.\nexport const version = \"4.2.0\";\n"],"mappings":";AACA,MAAa,UAAU"}