inngest 4.5.0 → 4.5.1
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 +12 -0
- package/api/api.cjs +17 -0
- package/api/api.cjs.map +1 -1
- package/api/api.d.cts +9 -0
- package/api/api.d.cts.map +1 -1
- package/api/api.d.ts +9 -0
- package/api/api.d.ts.map +1 -1
- package/api/api.js +17 -0
- package/api/api.js.map +1 -1
- 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 +1 -1
- package/components/DeferredFunction.cjs.map +1 -1
- package/components/DeferredFunction.js +1 -1
- package/components/DeferredFunction.js.map +1 -1
- package/components/Inngest.d.cts +1 -1
- package/components/Inngest.d.ts +1 -1
- package/components/InngestCommHandler.cjs +9 -0
- package/components/InngestCommHandler.cjs.map +1 -1
- package/components/InngestCommHandler.d.cts.map +1 -1
- package/components/InngestCommHandler.d.ts.map +1 -1
- package/components/InngestCommHandler.js +9 -0
- package/components/InngestCommHandler.js.map +1 -1
- package/components/InngestStepTools.d.cts +1 -1
- package/components/InngestStepTools.d.ts +1 -1
- package/components/execution/InngestExecution.cjs.map +1 -1
- package/components/execution/InngestExecution.d.cts +19 -0
- package/components/execution/InngestExecution.d.cts.map +1 -1
- package/components/execution/InngestExecution.d.ts +19 -0
- package/components/execution/InngestExecution.d.ts.map +1 -1
- package/components/execution/InngestExecution.js.map +1 -1
- package/components/execution/engine.cjs +19 -3
- package/components/execution/engine.cjs.map +1 -1
- package/components/execution/engine.d.cts.map +1 -1
- package/components/execution/engine.d.ts.map +1 -1
- package/components/execution/engine.js +20 -4
- package/components/execution/engine.js.map +1 -1
- package/components/execution/otel/middleware.d.cts +6 -6
- package/components/execution/otel/middleware.d.ts +6 -6
- package/components/execution/otel/processor.cjs +7 -5
- package/components/execution/otel/processor.cjs.map +1 -1
- package/components/execution/otel/processor.d.cts.map +1 -1
- package/components/execution/otel/processor.d.ts.map +1 -1
- package/components/execution/otel/processor.js +7 -5
- package/components/execution/otel/processor.js.map +1 -1
- package/components/realtime/types.d.cts +4 -4
- package/components/realtime/types.d.cts.map +1 -1
- package/components/realtime/types.d.ts +4 -4
- package/components/realtime/types.d.ts.map +1 -1
- package/helpers/consts.cjs +1 -0
- package/helpers/consts.cjs.map +1 -1
- package/helpers/consts.d.cts +1 -0
- package/helpers/consts.d.cts.map +1 -1
- package/helpers/consts.d.ts +1 -0
- package/helpers/consts.d.ts.map +1 -1
- package/helpers/consts.js +1 -0
- package/helpers/consts.js.map +1 -1
- package/helpers/marker.cjs +5 -1
- package/helpers/marker.cjs.map +1 -1
- package/helpers/marker.d.cts +2 -1
- package/helpers/marker.d.cts.map +1 -1
- package/helpers/marker.d.ts +2 -1
- package/helpers/marker.d.ts.map +1 -1
- package/helpers/marker.js +5 -2
- package/helpers/marker.js.map +1 -1
- package/helpers/promises.cjs +1 -1
- package/helpers/promises.cjs.map +1 -1
- package/helpers/promises.d.cts.map +1 -1
- package/helpers/promises.d.ts.map +1 -1
- package/helpers/promises.js +1 -1
- package/helpers/promises.js.map +1 -1
- package/package.json +1 -1
- package/types.d.cts +1 -1
- package/types.d.ts +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
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# inngest
|
|
2
2
|
|
|
3
|
+
## 4.5.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#1551](https://github.com/inngest/inngest-js/pull/1551) [`0af90c3c`](https://github.com/inngest/inngest-js/commit/0af90c3cc98680bed38c1c1ec02a5461d28ce228) Thanks [@rhino1998](https://github.com/rhino1998)! - fix: Add step attribution attributes to all extended trace spans
|
|
8
|
+
|
|
9
|
+
- [#1556](https://github.com/inngest/inngest-js/pull/1556) [`5bd87775`](https://github.com/inngest/inngest-js/commit/5bd8777594a601e5cb08cd451fb47850ec9e8fe9) Thanks [@Linell](https://github.com/Linell)! - Update internal tracing values used for identifying checkpointed data.
|
|
10
|
+
|
|
11
|
+
- [#1548](https://github.com/inngest/inngest-js/pull/1548) [`7be1cee3`](https://github.com/inngest/inngest-js/commit/7be1cee32b8451fac9a1b88ab67431be0851ce71) Thanks [@amh4r](https://github.com/amh4r)! - Fix unnecessary outgoing Durable Endpoint request
|
|
12
|
+
|
|
13
|
+
- [#1511](https://github.com/inngest/inngest-js/pull/1511) [`79558be2`](https://github.com/inngest/inngest-js/commit/79558be210b784b95ea26b36d1f70798548e7707) Thanks [@Linell](https://github.com/Linell)! - Fix duplicate execution when response terminates early
|
|
14
|
+
|
|
3
15
|
## 4.5.0
|
|
4
16
|
|
|
5
17
|
### Minor Changes
|
package/api/api.cjs
CHANGED
|
@@ -2,11 +2,24 @@ const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
|
|
|
2
2
|
const require_errors = require('../helpers/errors.cjs');
|
|
3
3
|
const require_types = require('../types.cjs');
|
|
4
4
|
const require_schema = require('./schema.cjs');
|
|
5
|
+
const require_marker = require('../helpers/marker.cjs');
|
|
5
6
|
const require_strings = require('../helpers/strings.cjs');
|
|
6
7
|
const require_net = require('../helpers/net.cjs');
|
|
7
8
|
let zod_v3 = require("zod/v3");
|
|
8
9
|
|
|
9
10
|
//#region src/api/api.ts
|
|
11
|
+
/**
|
|
12
|
+
* Thrown when the executor has already requeued the current run. Returning
|
|
13
|
+
* buffered ops after this would let the executor memoize them as canonical and
|
|
14
|
+
* chain the next dispatch off this dead invocation, producing duplicates.
|
|
15
|
+
*/
|
|
16
|
+
var StaleDispatchError = class extends Error {
|
|
17
|
+
constructor(message) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = "StaleDispatchError";
|
|
20
|
+
}
|
|
21
|
+
[require_marker.markerKey] = { kind: "StaleDispatchError" };
|
|
22
|
+
};
|
|
10
23
|
const realtimeSubscriptionTokenSchema = zod_v3.z.object({ jwt: zod_v3.z.string() });
|
|
11
24
|
const sendSignalSuccessResponseSchema = zod_v3.z.object({ data: zod_v3.z.object({ run_id: zod_v3.z.string().min(1) }) });
|
|
12
25
|
const checkpointNewRunResponseSchema = zod_v3.z.object({ data: zod_v3.z.object({
|
|
@@ -277,6 +290,9 @@ var InngestApi = class {
|
|
|
277
290
|
run_id: args.runId,
|
|
278
291
|
fn_id: args.fnId,
|
|
279
292
|
qi_id: args.queueItemId,
|
|
293
|
+
request_id: args.requestId,
|
|
294
|
+
generation_id: args.generationId,
|
|
295
|
+
request_started_at: args.requestStartedAt,
|
|
280
296
|
steps: args.steps,
|
|
281
297
|
ts: (/* @__PURE__ */ new Date()).valueOf()
|
|
282
298
|
});
|
|
@@ -286,6 +302,7 @@ var InngestApi = class {
|
|
|
286
302
|
});
|
|
287
303
|
if (!result.ok) throw new Error(require_errors.getErrorMessage(result.error, "Unknown error checkpointing async"));
|
|
288
304
|
const res = result.value;
|
|
305
|
+
if (res.status === 409) throw new StaleDispatchError(`Stale dispatch: checkpoint returned 409 (run ${args.runId})`);
|
|
289
306
|
if (!res.ok) throw new Error(`Failed to checkpoint async: ${res.status} ${res.statusText} - ${await res.text()}`);
|
|
290
307
|
}
|
|
291
308
|
/**
|
package/api/api.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.cjs","names":["z","hashSigningKey","finalUrl: URL","ok","fetchWithAuthFallback","err","data: unknown","stepSchema","errorSchema","getErrorMessage","batchSchema","json: unknown","rawData: unknown"],"sources":["../../src/api/api.ts"],"sourcesContent":["import type { fetch } from \"cross-fetch\";\nimport { z } from \"zod/v3\";\nimport type { ExecutionVersion } from \"../helpers/consts.ts\";\nimport { getErrorMessage } from \"../helpers/errors.ts\";\nimport { fetchWithAuthFallback } from \"../helpers/net.ts\";\nimport { hashSigningKey } from \"../helpers/strings.ts\";\nimport {\n type APIStepPayload,\n err,\n type MetadataTarget,\n type OutgoingOp,\n ok,\n type Result,\n} from \"../types.ts\";\nimport {\n type BatchResponse,\n batchSchema,\n type ErrorResponse,\n errorSchema,\n type StepsResponse,\n stepSchema,\n} from \"./schema.ts\";\n\ntype FetchT = typeof fetch;\n\nconst realtimeSubscriptionTokenSchema = z.object({\n jwt: z.string(),\n});\n\nconst sendSignalSuccessResponseSchema = z.object({\n data: z.object({\n run_id: z.string().min(1),\n }),\n});\n\nconst checkpointNewRunResponseSchema = z.object({\n data: z.object({\n fn_id: z.string().min(1),\n app_id: z.string().min(1),\n run_id: z.string().min(1),\n token: z.string().min(1).optional(),\n realtime_token: z.string().min(1),\n }),\n});\n\nexport namespace InngestApi {\n export interface Options {\n baseUrl: () => string | undefined;\n signingKey: () => string | undefined;\n signingKeyFallback: () => string | undefined;\n fetch: () => FetchT;\n }\n\n export interface Subscription {\n topics: string[];\n channel: string;\n }\n\n export interface PublishOptions extends Subscription {\n runId?: string;\n }\n\n export interface SendSignalOptions {\n signal: string;\n data?: unknown;\n }\n\n export interface SendSignalResponse {\n /**\n * The ID of the run that was signaled.\n *\n * If this is undefined, the signal could not be matched to a run.\n */\n runId: string | undefined;\n }\n}\n\nexport class InngestApi {\n private readonly _signingKey: () => string | undefined;\n private readonly _signingKeyFallback: () => string | undefined;\n private readonly _apiBaseUrl: () => string | undefined;\n private readonly _fetch: () => FetchT;\n\n constructor({\n baseUrl,\n signingKey,\n signingKeyFallback,\n fetch,\n }: InngestApi.Options) {\n this._apiBaseUrl = baseUrl;\n this._signingKey = signingKey;\n this._signingKeyFallback = signingKeyFallback;\n this._fetch = fetch;\n }\n\n private get apiBaseUrl(): string | undefined {\n return this._apiBaseUrl();\n }\n\n private get signingKey(): string | undefined {\n return this._signingKey();\n }\n\n private get signingKeyFallback(): string | undefined {\n return this._signingKeyFallback();\n }\n\n private get hashedKey(): string {\n return hashSigningKey(this.signingKey);\n }\n\n private get hashedFallbackKey(): string | undefined {\n if (!this.signingKeyFallback) {\n return;\n }\n\n return hashSigningKey(this.signingKeyFallback);\n }\n\n private async getTargetUrl(path: string): Promise<URL> {\n return new URL(path, this.apiBaseUrl);\n }\n\n private async req(\n url: string | URL,\n options?: RequestInit,\n ): Promise<Result<Response, unknown>> {\n const finalUrl: URL =\n typeof url === \"string\" ? await this.getTargetUrl(url) : url;\n\n try {\n const res = await fetchWithAuthFallback({\n authToken: this.hashedKey,\n authTokenFallback: this.hashedFallbackKey,\n fetch: this._fetch(),\n url: finalUrl,\n options: {\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n },\n });\n\n return ok(res);\n } catch (error) {\n return err(error);\n }\n }\n\n async getRunSteps(\n runId: string,\n ): Promise<Result<StepsResponse, ErrorResponse>> {\n const result = await this.req(\n `/v0/runs/${encodeURIComponent(runId)}/actions`,\n );\n if (result.ok) {\n const res = result.value;\n const data: unknown = await res.json();\n\n if (res.ok) {\n return ok(stepSchema.parse(data));\n }\n\n return err(errorSchema.parse(data));\n }\n\n return err({\n error: getErrorMessage(\n result.error,\n \"Unknown error retrieving step data\",\n ),\n status: 500,\n });\n }\n\n async getRunBatch(\n runId: string,\n ): Promise<Result<BatchResponse, ErrorResponse>> {\n const result = await this.req(\n `/v0/runs/${encodeURIComponent(runId)}/batch`,\n );\n if (result.ok) {\n const res = result.value;\n const data: unknown = await res.json();\n\n if (res.ok) {\n return ok(batchSchema.parse(data));\n }\n\n return err(errorSchema.parse(data));\n }\n\n return err({\n error: getErrorMessage(\n result.error,\n \"Unknown error retrieving event batch\",\n ),\n status: 500,\n });\n }\n\n async publish(\n publishOptions: InngestApi.PublishOptions,\n // biome-ignore lint/suspicious/noExplicitAny: anything is acceptable\n data: any,\n ): Promise<Result<void, ErrorResponse>> {\n // todo it may not be a \"text/stream\"\n const isStream = data instanceof ReadableStream;\n\n const url = await this.getTargetUrl(\"/v1/realtime/publish\");\n url.searchParams.set(\"channel\", publishOptions.channel || \"\");\n if (publishOptions.runId) {\n url.searchParams.set(\"run_id\", publishOptions.runId);\n }\n for (const topic of publishOptions.topics) {\n url.searchParams.append(\"topic\", topic);\n }\n\n const result = await this.req(url, {\n body: isStream\n ? data\n : typeof data === \"string\"\n ? data\n : JSON.stringify(data),\n method: \"POST\",\n headers: {\n \"Content-Type\": isStream ? \"text/stream\" : \"application/json\",\n },\n ...(isStream ? { duplex: \"half\" } : {}),\n });\n if (result.ok) {\n const res = result.value;\n if (!res.ok) {\n throw new Error(\n `Failed to publish event: ${res.status} ${res.statusText}`,\n );\n }\n\n return ok<void>(undefined);\n }\n\n return err({\n error: getErrorMessage(result.error, \"Unknown error publishing event\"),\n status: 500,\n });\n }\n\n async sendSignal(\n signalOptions: InngestApi.SendSignalOptions,\n options?: {\n headers?: Record<string, string>;\n },\n ): Promise<Result<InngestApi.SendSignalResponse, ErrorResponse>> {\n const url = await this.getTargetUrl(\"/v1/signals\");\n\n const body = {\n signal: signalOptions.signal,\n data: signalOptions.data,\n };\n\n return fetchWithAuthFallback({\n authToken: this.hashedKey,\n authTokenFallback: this.hashedFallbackKey,\n fetch: this._fetch(),\n url,\n options: {\n method: \"POST\",\n body: JSON.stringify(body),\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n },\n })\n .then(async (res) => {\n // A 404 is valid if the signal was not found.\n if (res.status === 404) {\n return ok<InngestApi.SendSignalResponse>({\n runId: undefined,\n });\n }\n\n // Save a clone of the response we can use to get the text of if we fail\n // to parse the JSON.\n const resClone = res.clone();\n\n // JSON!\n let json: unknown;\n try {\n json = await res.json();\n } catch {\n // res.json() failed so not a valid JSON response\n return err({\n error: `Failed to send signal: ${res.status} ${\n res.statusText\n } - ${await resClone.text()}`,\n status: res.status,\n });\n }\n\n // If we're not 2xx, something went wrong.\n if (!res.ok) {\n try {\n return err(errorSchema.parse(json));\n } catch {\n // schema parse failed\n return err({\n error: `Failed to send signal: ${res.status} ${\n res.statusText\n } - ${await res.text()}`,\n status: res.status,\n });\n }\n }\n\n // If we are 2xx, we should have a run_id.\n const parseRes = sendSignalSuccessResponseSchema.safeParse(json);\n if (!parseRes.success) {\n return err({\n error: `Successfully sent signal, but response parsing failed: ${\n res.status\n } ${res.statusText} - ${await resClone.text()}`,\n status: res.status,\n });\n }\n\n return ok({\n runId: parseRes.data.data.run_id,\n });\n })\n .catch((error) => {\n // Catch-all if various things go wrong\n return err({\n error: getErrorMessage(error, \"Unknown error sending signal\"),\n status: 500,\n });\n });\n }\n\n async getSubscriptionToken(\n channel: string,\n topics: string[],\n ): Promise<string> {\n const url = await this.getTargetUrl(\"/v1/realtime/token\");\n\n const body = topics.map((topic) => ({\n channel,\n name: topic,\n kind: \"run\",\n }));\n\n return fetchWithAuthFallback({\n authToken: this.hashedKey,\n authTokenFallback: this.hashedFallbackKey,\n fetch: this._fetch(),\n url,\n options: {\n method: \"POST\",\n body: JSON.stringify(body),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n },\n })\n .then(async (res) => {\n if (!res.ok) {\n throw new Error(\n `Failed to get subscription token: ${res.status} ${\n res.statusText\n } - ${await res.text()}`,\n );\n }\n\n const data = realtimeSubscriptionTokenSchema.parse(await res.json());\n\n return data.jwt;\n })\n .catch((error) => {\n throw new Error(\n getErrorMessage(error, \"Unknown error getting subscription token\"),\n );\n });\n }\n\n async updateMetadata(\n args: {\n target: MetadataTarget;\n metadata: Array<{\n kind: string;\n op: string;\n values: Record<string, unknown>;\n }>;\n },\n options?: {\n headers?: Record<string, string>;\n },\n ): Promise<Result<void, ErrorResponse>> {\n const payload = { target: args.target, metadata: args.metadata };\n\n const result = await this.req(\n `/v1/runs/${encodeURIComponent(args.target.run_id)}/metadata`,\n {\n method: \"POST\",\n body: JSON.stringify(payload),\n headers: options?.headers,\n },\n );\n\n if (!result.ok) {\n return err({\n error: getErrorMessage(result.error, \"Unknown error updating metadata\"),\n status: 500,\n });\n }\n\n const res = result.value;\n if (res.ok) {\n return ok<void>(undefined);\n }\n\n const resClone = res.clone();\n\n let json: unknown;\n try {\n json = await res.json();\n } catch {\n return err({\n error: `Failed to update metadata: ${res.status} ${\n res.statusText\n } - ${await resClone.text()}`,\n status: res.status,\n });\n }\n\n try {\n return err(errorSchema.parse(json));\n } catch {\n return err({\n error: `Failed to update metadata: ${res.status} ${res.statusText}`,\n status: res.status,\n });\n }\n }\n\n /**\n * Start a new run, optionally passing in a number of steps to initialize the\n * run with.\n */\n async checkpointNewRun(args: {\n runId: string;\n event: APIStepPayload;\n executionVersion: ExecutionVersion;\n retries: number;\n steps?: OutgoingOp[];\n }): Promise<z.output<typeof checkpointNewRunResponseSchema>> {\n const body = JSON.stringify({\n run_id: args.runId,\n event: args.event,\n steps: args.steps,\n ts: new Date().valueOf(),\n request_version: args.executionVersion,\n retries: args.retries,\n });\n\n const result = await this.req(\"/v1/checkpoint\", {\n method: \"POST\",\n body,\n });\n\n if (!result.ok) {\n throw new Error(\n getErrorMessage(result.error, \"Unknown error checkpointing new run\"),\n );\n }\n\n const res = result.value;\n if (res.ok) {\n const rawData: unknown = await res.json();\n const data = checkpointNewRunResponseSchema.parse(rawData);\n\n return data;\n }\n\n throw new Error(\n `Failed to checkpoint new run: ${res.status} ${\n res.statusText\n } - ${await res.text()}`,\n );\n }\n\n /**\n * Checkpoint steps for a given sync run.\n */\n async checkpointSteps(args: {\n runId: string;\n fnId: string;\n appId: string;\n steps: OutgoingOp[];\n }): Promise<void> {\n const body = JSON.stringify({\n fn_id: args.fnId,\n app_id: args.appId,\n run_id: args.runId,\n steps: args.steps,\n ts: new Date().valueOf(),\n });\n\n const result = await this.req(\n `/v1/checkpoint/${encodeURIComponent(args.runId)}/steps`,\n {\n method: \"POST\",\n body,\n },\n );\n\n if (!result.ok) {\n throw new Error(\n getErrorMessage(result.error, \"Unknown error checkpointing steps\"),\n );\n }\n\n const res = result.value;\n if (!res.ok) {\n throw new Error(\n `Failed to checkpoint steps: ${res.status} ${\n res.statusText\n } - ${await res.text()}`,\n );\n }\n }\n\n /**\n * Checkpoint steps for a given async run.\n */\n async checkpointStepsAsync(args: {\n runId: string;\n fnId: string;\n queueItemId: string;\n steps: OutgoingOp[];\n }): Promise<void> {\n const body = JSON.stringify({\n run_id: args.runId,\n fn_id: args.fnId,\n qi_id: args.queueItemId,\n steps: args.steps,\n ts: new Date().valueOf(),\n });\n\n const result = await this.req(\n `/v1/checkpoint/${encodeURIComponent(args.runId)}/async`,\n {\n method: \"POST\",\n body,\n },\n );\n\n if (!result.ok) {\n throw new Error(\n getErrorMessage(result.error, \"Unknown error checkpointing async\"),\n );\n }\n\n const res = result.value;\n if (!res.ok) {\n throw new Error(\n `Failed to checkpoint async: ${res.status} ${\n res.statusText\n } - ${await res.text()}`,\n );\n }\n }\n\n /**\n * POST stream data to the realtime publish/tee endpoint, forwarding raw\n * bytes to all subscribers via the broadcaster.\n */\n async checkpointStream(args: {\n runId: string;\n body: ReadableStream;\n }): Promise<void> {\n const url = await this.getTargetUrl(\n `/v1/realtime/publish/tee?channel=${encodeURIComponent(args.runId)}`,\n );\n\n const res = await fetchWithAuthFallback({\n authToken: this.hashedKey,\n authTokenFallback: this.hashedFallbackKey,\n fetch: this._fetch(),\n url,\n options: {\n method: \"POST\",\n body: args.body,\n headers: {\n \"Content-Type\": \"application/octet-stream\",\n },\n // Required for streaming request bodies\n // @ts-expect-error duplex not in RequestInit types yet\n duplex: \"half\",\n },\n });\n\n if (!res.ok) {\n throw new Error(\n `Failed to stream checkpoint: ${res.status} ${\n res.statusText\n } - ${await res.text()}`,\n );\n }\n }\n\n /**\n * Build the full SSE URL for a run's stream channel using the given token.\n */\n async getRealtimeStreamRedirect(token: string): Promise<{ url: string }> {\n const sseUrl = await this.getTargetUrl(\"/v1/realtime/sse\");\n sseUrl.searchParams.set(\"token\", token);\n\n return { url: sseUrl.toString() };\n }\n\n /**\n * Fetch the output of a completed run using a token.\n *\n * This uses token-based auth (not signing key) and is intended for use by\n * proxy endpoints that fetch results on behalf of users.\n *\n * @param runId - The ID of the run to fetch output for\n * @param token - The token used to authenticate the request\n * @returns The raw Response from the API\n */\n async getRunOutput(runId: string, token: string): Promise<Response> {\n const url = await this.getTargetUrl(\n `/v1/http/runs/${encodeURIComponent(runId)}/output`,\n );\n url.searchParams.set(\"token\", token);\n\n return this._fetch()(url.toString(), {\n method: \"GET\",\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api.cjs","names":["markerKey","z","hashSigningKey","finalUrl: URL","ok","fetchWithAuthFallback","err","data: unknown","stepSchema","errorSchema","getErrorMessage","batchSchema","json: unknown","rawData: unknown"],"sources":["../../src/api/api.ts"],"sourcesContent":["import type { fetch } from \"cross-fetch\";\nimport { z } from \"zod/v3\";\nimport type { ExecutionVersion } from \"../helpers/consts.ts\";\nimport { getErrorMessage } from \"../helpers/errors.ts\";\nimport { type Marker, markerKey } from \"../helpers/marker.ts\";\nimport { fetchWithAuthFallback } from \"../helpers/net.ts\";\nimport { hashSigningKey } from \"../helpers/strings.ts\";\nimport {\n type APIStepPayload,\n err,\n type MetadataTarget,\n type OutgoingOp,\n ok,\n type Result,\n} from \"../types.ts\";\nimport {\n type BatchResponse,\n batchSchema,\n type ErrorResponse,\n errorSchema,\n type StepsResponse,\n stepSchema,\n} from \"./schema.ts\";\n\ntype FetchT = typeof fetch;\n\n/**\n * Thrown when the executor has already requeued the current run. Returning\n * buffered ops after this would let the executor memoize them as canonical and\n * chain the next dispatch off this dead invocation, producing duplicates.\n */\nexport class StaleDispatchError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"StaleDispatchError\";\n }\n\n readonly [markerKey]: Marker = { kind: \"StaleDispatchError\" };\n}\n\nconst realtimeSubscriptionTokenSchema = z.object({\n jwt: z.string(),\n});\n\nconst sendSignalSuccessResponseSchema = z.object({\n data: z.object({\n run_id: z.string().min(1),\n }),\n});\n\nconst checkpointNewRunResponseSchema = z.object({\n data: z.object({\n fn_id: z.string().min(1),\n app_id: z.string().min(1),\n run_id: z.string().min(1),\n token: z.string().min(1).optional(),\n realtime_token: z.string().min(1),\n }),\n});\n\nexport namespace InngestApi {\n export interface Options {\n baseUrl: () => string | undefined;\n signingKey: () => string | undefined;\n signingKeyFallback: () => string | undefined;\n fetch: () => FetchT;\n }\n\n export interface Subscription {\n topics: string[];\n channel: string;\n }\n\n export interface PublishOptions extends Subscription {\n runId?: string;\n }\n\n export interface SendSignalOptions {\n signal: string;\n data?: unknown;\n }\n\n export interface SendSignalResponse {\n /**\n * The ID of the run that was signaled.\n *\n * If this is undefined, the signal could not be matched to a run.\n */\n runId: string | undefined;\n }\n}\n\nexport class InngestApi {\n private readonly _signingKey: () => string | undefined;\n private readonly _signingKeyFallback: () => string | undefined;\n private readonly _apiBaseUrl: () => string | undefined;\n private readonly _fetch: () => FetchT;\n\n constructor({\n baseUrl,\n signingKey,\n signingKeyFallback,\n fetch,\n }: InngestApi.Options) {\n this._apiBaseUrl = baseUrl;\n this._signingKey = signingKey;\n this._signingKeyFallback = signingKeyFallback;\n this._fetch = fetch;\n }\n\n private get apiBaseUrl(): string | undefined {\n return this._apiBaseUrl();\n }\n\n private get signingKey(): string | undefined {\n return this._signingKey();\n }\n\n private get signingKeyFallback(): string | undefined {\n return this._signingKeyFallback();\n }\n\n private get hashedKey(): string {\n return hashSigningKey(this.signingKey);\n }\n\n private get hashedFallbackKey(): string | undefined {\n if (!this.signingKeyFallback) {\n return;\n }\n\n return hashSigningKey(this.signingKeyFallback);\n }\n\n private async getTargetUrl(path: string): Promise<URL> {\n return new URL(path, this.apiBaseUrl);\n }\n\n private async req(\n url: string | URL,\n options?: RequestInit,\n ): Promise<Result<Response, unknown>> {\n const finalUrl: URL =\n typeof url === \"string\" ? await this.getTargetUrl(url) : url;\n\n try {\n const res = await fetchWithAuthFallback({\n authToken: this.hashedKey,\n authTokenFallback: this.hashedFallbackKey,\n fetch: this._fetch(),\n url: finalUrl,\n options: {\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n },\n });\n\n return ok(res);\n } catch (error) {\n return err(error);\n }\n }\n\n async getRunSteps(\n runId: string,\n ): Promise<Result<StepsResponse, ErrorResponse>> {\n const result = await this.req(\n `/v0/runs/${encodeURIComponent(runId)}/actions`,\n );\n if (result.ok) {\n const res = result.value;\n const data: unknown = await res.json();\n\n if (res.ok) {\n return ok(stepSchema.parse(data));\n }\n\n return err(errorSchema.parse(data));\n }\n\n return err({\n error: getErrorMessage(\n result.error,\n \"Unknown error retrieving step data\",\n ),\n status: 500,\n });\n }\n\n async getRunBatch(\n runId: string,\n ): Promise<Result<BatchResponse, ErrorResponse>> {\n const result = await this.req(\n `/v0/runs/${encodeURIComponent(runId)}/batch`,\n );\n if (result.ok) {\n const res = result.value;\n const data: unknown = await res.json();\n\n if (res.ok) {\n return ok(batchSchema.parse(data));\n }\n\n return err(errorSchema.parse(data));\n }\n\n return err({\n error: getErrorMessage(\n result.error,\n \"Unknown error retrieving event batch\",\n ),\n status: 500,\n });\n }\n\n async publish(\n publishOptions: InngestApi.PublishOptions,\n // biome-ignore lint/suspicious/noExplicitAny: anything is acceptable\n data: any,\n ): Promise<Result<void, ErrorResponse>> {\n // todo it may not be a \"text/stream\"\n const isStream = data instanceof ReadableStream;\n\n const url = await this.getTargetUrl(\"/v1/realtime/publish\");\n url.searchParams.set(\"channel\", publishOptions.channel || \"\");\n if (publishOptions.runId) {\n url.searchParams.set(\"run_id\", publishOptions.runId);\n }\n for (const topic of publishOptions.topics) {\n url.searchParams.append(\"topic\", topic);\n }\n\n const result = await this.req(url, {\n body: isStream\n ? data\n : typeof data === \"string\"\n ? data\n : JSON.stringify(data),\n method: \"POST\",\n headers: {\n \"Content-Type\": isStream ? \"text/stream\" : \"application/json\",\n },\n ...(isStream ? { duplex: \"half\" } : {}),\n });\n if (result.ok) {\n const res = result.value;\n if (!res.ok) {\n throw new Error(\n `Failed to publish event: ${res.status} ${res.statusText}`,\n );\n }\n\n return ok<void>(undefined);\n }\n\n return err({\n error: getErrorMessage(result.error, \"Unknown error publishing event\"),\n status: 500,\n });\n }\n\n async sendSignal(\n signalOptions: InngestApi.SendSignalOptions,\n options?: {\n headers?: Record<string, string>;\n },\n ): Promise<Result<InngestApi.SendSignalResponse, ErrorResponse>> {\n const url = await this.getTargetUrl(\"/v1/signals\");\n\n const body = {\n signal: signalOptions.signal,\n data: signalOptions.data,\n };\n\n return fetchWithAuthFallback({\n authToken: this.hashedKey,\n authTokenFallback: this.hashedFallbackKey,\n fetch: this._fetch(),\n url,\n options: {\n method: \"POST\",\n body: JSON.stringify(body),\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n },\n })\n .then(async (res) => {\n // A 404 is valid if the signal was not found.\n if (res.status === 404) {\n return ok<InngestApi.SendSignalResponse>({\n runId: undefined,\n });\n }\n\n // Save a clone of the response we can use to get the text of if we fail\n // to parse the JSON.\n const resClone = res.clone();\n\n // JSON!\n let json: unknown;\n try {\n json = await res.json();\n } catch {\n // res.json() failed so not a valid JSON response\n return err({\n error: `Failed to send signal: ${res.status} ${\n res.statusText\n } - ${await resClone.text()}`,\n status: res.status,\n });\n }\n\n // If we're not 2xx, something went wrong.\n if (!res.ok) {\n try {\n return err(errorSchema.parse(json));\n } catch {\n // schema parse failed\n return err({\n error: `Failed to send signal: ${res.status} ${\n res.statusText\n } - ${await res.text()}`,\n status: res.status,\n });\n }\n }\n\n // If we are 2xx, we should have a run_id.\n const parseRes = sendSignalSuccessResponseSchema.safeParse(json);\n if (!parseRes.success) {\n return err({\n error: `Successfully sent signal, but response parsing failed: ${\n res.status\n } ${res.statusText} - ${await resClone.text()}`,\n status: res.status,\n });\n }\n\n return ok({\n runId: parseRes.data.data.run_id,\n });\n })\n .catch((error) => {\n // Catch-all if various things go wrong\n return err({\n error: getErrorMessage(error, \"Unknown error sending signal\"),\n status: 500,\n });\n });\n }\n\n async getSubscriptionToken(\n channel: string,\n topics: string[],\n ): Promise<string> {\n const url = await this.getTargetUrl(\"/v1/realtime/token\");\n\n const body = topics.map((topic) => ({\n channel,\n name: topic,\n kind: \"run\",\n }));\n\n return fetchWithAuthFallback({\n authToken: this.hashedKey,\n authTokenFallback: this.hashedFallbackKey,\n fetch: this._fetch(),\n url,\n options: {\n method: \"POST\",\n body: JSON.stringify(body),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n },\n })\n .then(async (res) => {\n if (!res.ok) {\n throw new Error(\n `Failed to get subscription token: ${res.status} ${\n res.statusText\n } - ${await res.text()}`,\n );\n }\n\n const data = realtimeSubscriptionTokenSchema.parse(await res.json());\n\n return data.jwt;\n })\n .catch((error) => {\n throw new Error(\n getErrorMessage(error, \"Unknown error getting subscription token\"),\n );\n });\n }\n\n async updateMetadata(\n args: {\n target: MetadataTarget;\n metadata: Array<{\n kind: string;\n op: string;\n values: Record<string, unknown>;\n }>;\n },\n options?: {\n headers?: Record<string, string>;\n },\n ): Promise<Result<void, ErrorResponse>> {\n const payload = { target: args.target, metadata: args.metadata };\n\n const result = await this.req(\n `/v1/runs/${encodeURIComponent(args.target.run_id)}/metadata`,\n {\n method: \"POST\",\n body: JSON.stringify(payload),\n headers: options?.headers,\n },\n );\n\n if (!result.ok) {\n return err({\n error: getErrorMessage(result.error, \"Unknown error updating metadata\"),\n status: 500,\n });\n }\n\n const res = result.value;\n if (res.ok) {\n return ok<void>(undefined);\n }\n\n const resClone = res.clone();\n\n let json: unknown;\n try {\n json = await res.json();\n } catch {\n return err({\n error: `Failed to update metadata: ${res.status} ${\n res.statusText\n } - ${await resClone.text()}`,\n status: res.status,\n });\n }\n\n try {\n return err(errorSchema.parse(json));\n } catch {\n return err({\n error: `Failed to update metadata: ${res.status} ${res.statusText}`,\n status: res.status,\n });\n }\n }\n\n /**\n * Start a new run, optionally passing in a number of steps to initialize the\n * run with.\n */\n async checkpointNewRun(args: {\n runId: string;\n event: APIStepPayload;\n executionVersion: ExecutionVersion;\n retries: number;\n steps?: OutgoingOp[];\n }): Promise<z.output<typeof checkpointNewRunResponseSchema>> {\n const body = JSON.stringify({\n run_id: args.runId,\n event: args.event,\n steps: args.steps,\n ts: new Date().valueOf(),\n request_version: args.executionVersion,\n retries: args.retries,\n });\n\n const result = await this.req(\"/v1/checkpoint\", {\n method: \"POST\",\n body,\n });\n\n if (!result.ok) {\n throw new Error(\n getErrorMessage(result.error, \"Unknown error checkpointing new run\"),\n );\n }\n\n const res = result.value;\n if (res.ok) {\n const rawData: unknown = await res.json();\n const data = checkpointNewRunResponseSchema.parse(rawData);\n\n return data;\n }\n\n throw new Error(\n `Failed to checkpoint new run: ${res.status} ${\n res.statusText\n } - ${await res.text()}`,\n );\n }\n\n /**\n * Checkpoint steps for a given sync run.\n */\n async checkpointSteps(args: {\n runId: string;\n fnId: string;\n appId: string;\n steps: OutgoingOp[];\n }): Promise<void> {\n const body = JSON.stringify({\n fn_id: args.fnId,\n app_id: args.appId,\n run_id: args.runId,\n steps: args.steps,\n ts: new Date().valueOf(),\n });\n\n const result = await this.req(\n `/v1/checkpoint/${encodeURIComponent(args.runId)}/steps`,\n {\n method: \"POST\",\n body,\n },\n );\n\n if (!result.ok) {\n throw new Error(\n getErrorMessage(result.error, \"Unknown error checkpointing steps\"),\n );\n }\n\n const res = result.value;\n if (!res.ok) {\n throw new Error(\n `Failed to checkpoint steps: ${res.status} ${\n res.statusText\n } - ${await res.text()}`,\n );\n }\n }\n\n /**\n * Checkpoint steps for a given async run.\n */\n async checkpointStepsAsync(args: {\n runId: string;\n fnId: string;\n queueItemId: string;\n generationId: number | undefined;\n requestId: string | undefined;\n requestStartedAt: number | undefined;\n steps: OutgoingOp[];\n }): Promise<void> {\n const body = JSON.stringify({\n run_id: args.runId,\n fn_id: args.fnId,\n qi_id: args.queueItemId,\n request_id: args.requestId,\n generation_id: args.generationId,\n request_started_at: args.requestStartedAt,\n steps: args.steps,\n ts: new Date().valueOf(),\n });\n\n const result = await this.req(\n `/v1/checkpoint/${encodeURIComponent(args.runId)}/async`,\n {\n method: \"POST\",\n body,\n },\n );\n\n if (!result.ok) {\n throw new Error(\n getErrorMessage(result.error, \"Unknown error checkpointing async\"),\n );\n }\n\n const res = result.value;\n // 409 means the executor has already requeued. Halt rather than returning\n // buffered ops, which would let the executor memoize them as canonical and\n // chain the next dispatch off this dead invocation. See EXE-1552.\n if (res.status === 409) {\n throw new StaleDispatchError(\n `Stale dispatch: checkpoint returned 409 (run ${args.runId})`,\n );\n }\n if (!res.ok) {\n throw new Error(\n `Failed to checkpoint async: ${res.status} ${\n res.statusText\n } - ${await res.text()}`,\n );\n }\n }\n\n /**\n * POST stream data to the realtime publish/tee endpoint, forwarding raw\n * bytes to all subscribers via the broadcaster.\n */\n async checkpointStream(args: {\n runId: string;\n body: ReadableStream;\n }): Promise<void> {\n const url = await this.getTargetUrl(\n `/v1/realtime/publish/tee?channel=${encodeURIComponent(args.runId)}`,\n );\n\n const res = await fetchWithAuthFallback({\n authToken: this.hashedKey,\n authTokenFallback: this.hashedFallbackKey,\n fetch: this._fetch(),\n url,\n options: {\n method: \"POST\",\n body: args.body,\n headers: {\n \"Content-Type\": \"application/octet-stream\",\n },\n // Required for streaming request bodies\n // @ts-expect-error duplex not in RequestInit types yet\n duplex: \"half\",\n },\n });\n\n if (!res.ok) {\n throw new Error(\n `Failed to stream checkpoint: ${res.status} ${\n res.statusText\n } - ${await res.text()}`,\n );\n }\n }\n\n /**\n * Build the full SSE URL for a run's stream channel using the given token.\n */\n async getRealtimeStreamRedirect(token: string): Promise<{ url: string }> {\n const sseUrl = await this.getTargetUrl(\"/v1/realtime/sse\");\n sseUrl.searchParams.set(\"token\", token);\n\n return { url: sseUrl.toString() };\n }\n\n /**\n * Fetch the output of a completed run using a token.\n *\n * This uses token-based auth (not signing key) and is intended for use by\n * proxy endpoints that fetch results on behalf of users.\n *\n * @param runId - The ID of the run to fetch output for\n * @param token - The token used to authenticate the request\n * @returns The raw Response from the API\n */\n async getRunOutput(runId: string, token: string): Promise<Response> {\n const url = await this.getTargetUrl(\n `/v1/http/runs/${encodeURIComponent(runId)}/output`,\n );\n url.searchParams.set(\"token\", token);\n\n return this._fetch()(url.toString(), {\n method: \"GET\",\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n}\n"],"mappings":"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"}
|
package/api/api.d.cts
CHANGED
|
@@ -6,6 +6,12 @@ import { fetch } from "cross-fetch";
|
|
|
6
6
|
|
|
7
7
|
//#region src/api/api.d.ts
|
|
8
8
|
type FetchT = typeof fetch;
|
|
9
|
+
/**
|
|
10
|
+
* Thrown when the executor has already requeued the current run. Returning
|
|
11
|
+
* buffered ops after this would let the executor memoize them as canonical and
|
|
12
|
+
* chain the next dispatch off this dead invocation, producing duplicates.
|
|
13
|
+
*/
|
|
14
|
+
|
|
9
15
|
declare const checkpointNewRunResponseSchema: z.ZodObject<{
|
|
10
16
|
data: z.ZodObject<{
|
|
11
17
|
fn_id: z.ZodString;
|
|
@@ -132,6 +138,9 @@ declare class InngestApi {
|
|
|
132
138
|
runId: string;
|
|
133
139
|
fnId: string;
|
|
134
140
|
queueItemId: string;
|
|
141
|
+
generationId: number | undefined;
|
|
142
|
+
requestId: string | undefined;
|
|
143
|
+
requestStartedAt: number | undefined;
|
|
135
144
|
steps: OutgoingOp[];
|
|
136
145
|
}): Promise<void>;
|
|
137
146
|
/**
|
package/api/api.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.cts","names":[],"sources":["../../src/api/api.ts"],"sourcesContent":[],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"api.d.cts","names":[],"sources":["../../src/api/api.ts"],"sourcesContent":[],"mappings":";;;;;;;KAwBK,MAAA,UAAgB;AAFA;AAgBpB;;;;;cAYK,gCAA8B,CAAA,CAAA;;;IAAA,MAAA,aAAA;IAAA,MAAA,aAAA;IAUnB,KAAA,eAAU,YAAA,CAAA;IAAA,cAAA,aAAA;KAKV,OAAA,cAAA,EAAA;IAQyB,MAAA,EAAA,MAAA;IAAY,KAAA,EAAA,MAAA;IAmBzC,MAAA,EAAA,MAAU;IAAA,cAAA,EAAA,MAAA;IAOnB,KAAA,CAAA,EAAA,MAAA,GAAA,SAAA;KACA;IACA,MAAA,EAAA,MAAA;IACA,KAAA,EAAA,MAAA;IACC,MAAA,EAAA,MAAW;IAiEI,cAAA,EAAA,MAAA;IAAe,KAAA,CAAA,EAAA,MAAA,GAAA,SAAA;;UAA9B,cAAA,EAAA;MA0Be,EAAA;IAAe,MAAA,EAAA,MAAA;IAAtB,KAAA,EAAA,MAAA;IAAR,MAAA,EAAA,MAAA;IAyBe,cAAW,EAAA,MAAA;IAGL,KAAA,CAAA,EAAA,MAAA,GAAA,SAAA;;;MA2CP,EAAA;IAEH,MAAA,EAAA,MAAA;IAEI,KAAA,EAAA,MAAW;IAAoB,MAAA,EAAA,MAAA;IAAtC,cAAA,EAAA,MAAA;IAAR,KAAA,CAAA,EAAA,MAAA,GAAA,SAAA;;;AA0IW,kBA3VC,UAAA,CA2VD;YAHA,OAAA,CAAA;IAOA,OAAA,EAAA,GAAA,GAAA,MAAA,GAAA,SAAA;IAEU,UAAA,EAAA,GAAA,GAAA,MAAA,GAAA,SAAA;IAAb,kBAAA,EAAA,GAAA,GAAA,MAAA,GAAA,SAAA;IAAR,KAAA,EAAA,GAAA,GA5VY,MA4VZ;;YAuDiB,YAAA,CAAA;IAEV,MAAA,EAAA,MAAA,EAAA;IACkB,OAAA,EAAA,MAAA;;YAAxB,cAAA,SA9YoC,YA8YpC,CAAA;IA2CK,KAAA,CAAA,EAAA,MAAA;;YA4CA,iBAAA,CAAA;IACL,MAAA,EAAA,MAAA;IAkDI,IAAA,CAAA,EAAA,OAAA;;YAmCwC,kBAAA,CAAA;IAiBU;;;;;;;;cAzjB/C,UAAA;;;;;;;;;;KAWR,UAAA,CAAW;;;;;;;;8BAiEX,QAAQ,OAAO,eAAe;8BA0B9B,QAAQ,OAAO,eAAe;0BAyBf,UAAA,CAAW,4BAG1B,QAAQ,aAAa;4BA2CP,UAAA,CAAW;cAEd;MAEX,QAAQ,OAAO,UAAA,CAAW,oBAAoB;2DA0F9C;;YA4CS;cACE;;;cAGA;;;cAIA;MAEX,QAAQ,aAAa;;;;;;;WAsDf;sBACW;;YAEV;MACN,QAAQ,CAAA,CAAE,cAAc;;;;;;;;WA2CnB;MACL;;;;;;;;;;;WA2CK;MACL;;;;;;;UAkDI;MACJ;;;;4CAkC4C;;;;;;;;;;;;;8CAiBE,QAAQ"}
|
package/api/api.d.ts
CHANGED
|
@@ -6,6 +6,12 @@ import { fetch } from "cross-fetch";
|
|
|
6
6
|
|
|
7
7
|
//#region src/api/api.d.ts
|
|
8
8
|
type FetchT = typeof fetch;
|
|
9
|
+
/**
|
|
10
|
+
* Thrown when the executor has already requeued the current run. Returning
|
|
11
|
+
* buffered ops after this would let the executor memoize them as canonical and
|
|
12
|
+
* chain the next dispatch off this dead invocation, producing duplicates.
|
|
13
|
+
*/
|
|
14
|
+
|
|
9
15
|
declare const checkpointNewRunResponseSchema: z.ZodObject<{
|
|
10
16
|
data: z.ZodObject<{
|
|
11
17
|
fn_id: z.ZodString;
|
|
@@ -132,6 +138,9 @@ declare class InngestApi {
|
|
|
132
138
|
runId: string;
|
|
133
139
|
fnId: string;
|
|
134
140
|
queueItemId: string;
|
|
141
|
+
generationId: number | undefined;
|
|
142
|
+
requestId: string | undefined;
|
|
143
|
+
requestStartedAt: number | undefined;
|
|
135
144
|
steps: OutgoingOp[];
|
|
136
145
|
}): Promise<void>;
|
|
137
146
|
/**
|
package/api/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","names":[],"sources":["../../src/api/api.ts"],"sourcesContent":[],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"api.d.ts","names":[],"sources":["../../src/api/api.ts"],"sourcesContent":[],"mappings":";;;;;;;KAwBK,MAAA,UAAgB;AAFA;AAgBpB;;;;;cAYK,gCAA8B,CAAA,CAAA;;;IAAA,MAAA,aAAA;IAAA,MAAA,aAAA;IAUnB,KAAA,eAAU,YAAA,CAAA;IAAA,cAAA,aAAA;KAKV,OAAA,cAAA,EAAA;IAQyB,MAAA,EAAA,MAAA;IAAY,KAAA,EAAA,MAAA;IAmBzC,MAAA,EAAA,MAAU;IAAA,cAAA,EAAA,MAAA;IAOnB,KAAA,CAAA,EAAA,MAAA,GAAA,SAAA;KACA;IACA,MAAA,EAAA,MAAA;IACA,KAAA,EAAA,MAAA;IACC,MAAA,EAAA,MAAW;IAiEI,cAAA,EAAA,MAAA;IAAe,KAAA,CAAA,EAAA,MAAA,GAAA,SAAA;;UAA9B,cAAA,EAAA;MA0Be,EAAA;IAAe,MAAA,EAAA,MAAA;IAAtB,KAAA,EAAA,MAAA;IAAR,MAAA,EAAA,MAAA;IAyBe,cAAW,EAAA,MAAA;IAGL,KAAA,CAAA,EAAA,MAAA,GAAA,SAAA;;;MA2CP,EAAA;IAEH,MAAA,EAAA,MAAA;IAEI,KAAA,EAAA,MAAW;IAAoB,MAAA,EAAA,MAAA;IAAtC,cAAA,EAAA,MAAA;IAAR,KAAA,CAAA,EAAA,MAAA,GAAA,SAAA;;;AA0IW,kBA3VC,UAAA,CA2VD;YAHA,OAAA,CAAA;IAOA,OAAA,EAAA,GAAA,GAAA,MAAA,GAAA,SAAA;IAEU,UAAA,EAAA,GAAA,GAAA,MAAA,GAAA,SAAA;IAAb,kBAAA,EAAA,GAAA,GAAA,MAAA,GAAA,SAAA;IAAR,KAAA,EAAA,GAAA,GA5VY,MA4VZ;;YAuDiB,YAAA,CAAA;IAEV,MAAA,EAAA,MAAA,EAAA;IACkB,OAAA,EAAA,MAAA;;YAAxB,cAAA,SA9YoC,YA8YpC,CAAA;IA2CK,KAAA,CAAA,EAAA,MAAA;;YA4CA,iBAAA,CAAA;IACL,MAAA,EAAA,MAAA;IAkDI,IAAA,CAAA,EAAA,OAAA;;YAmCwC,kBAAA,CAAA;IAiBU;;;;;;;;cAzjB/C,UAAA;;;;;;;;;;KAWR,UAAA,CAAW;;;;;;;;8BAiEX,QAAQ,OAAO,eAAe;8BA0B9B,QAAQ,OAAO,eAAe;0BAyBf,UAAA,CAAW,4BAG1B,QAAQ,aAAa;4BA2CP,UAAA,CAAW;cAEd;MAEX,QAAQ,OAAO,UAAA,CAAW,oBAAoB;2DA0F9C;;YA4CS;cACE;;;cAGA;;;cAIA;MAEX,QAAQ,aAAa;;;;;;;WAsDf;sBACW;;YAEV;MACN,QAAQ,CAAA,CAAE,cAAc;;;;;;;;WA2CnB;MACL;;;;;;;;;;;WA2CK;MACL;;;;;;;UAkDI;MACJ;;;;4CAkC4C;;;;;;;;;;;;;8CAiBE,QAAQ"}
|
package/api/api.js
CHANGED
|
@@ -1,11 +1,24 @@
|
|
|
1
1
|
import { getErrorMessage } from "../helpers/errors.js";
|
|
2
2
|
import { err, ok } from "../types.js";
|
|
3
3
|
import { batchSchema, errorSchema, stepSchema } from "./schema.js";
|
|
4
|
+
import { markerKey } from "../helpers/marker.js";
|
|
4
5
|
import { hashSigningKey } from "../helpers/strings.js";
|
|
5
6
|
import { fetchWithAuthFallback } from "../helpers/net.js";
|
|
6
7
|
import { z } from "zod/v3";
|
|
7
8
|
|
|
8
9
|
//#region src/api/api.ts
|
|
10
|
+
/**
|
|
11
|
+
* Thrown when the executor has already requeued the current run. Returning
|
|
12
|
+
* buffered ops after this would let the executor memoize them as canonical and
|
|
13
|
+
* chain the next dispatch off this dead invocation, producing duplicates.
|
|
14
|
+
*/
|
|
15
|
+
var StaleDispatchError = class extends Error {
|
|
16
|
+
constructor(message) {
|
|
17
|
+
super(message);
|
|
18
|
+
this.name = "StaleDispatchError";
|
|
19
|
+
}
|
|
20
|
+
[markerKey] = { kind: "StaleDispatchError" };
|
|
21
|
+
};
|
|
9
22
|
const realtimeSubscriptionTokenSchema = z.object({ jwt: z.string() });
|
|
10
23
|
const sendSignalSuccessResponseSchema = z.object({ data: z.object({ run_id: z.string().min(1) }) });
|
|
11
24
|
const checkpointNewRunResponseSchema = z.object({ data: z.object({
|
|
@@ -276,6 +289,9 @@ var InngestApi = class {
|
|
|
276
289
|
run_id: args.runId,
|
|
277
290
|
fn_id: args.fnId,
|
|
278
291
|
qi_id: args.queueItemId,
|
|
292
|
+
request_id: args.requestId,
|
|
293
|
+
generation_id: args.generationId,
|
|
294
|
+
request_started_at: args.requestStartedAt,
|
|
279
295
|
steps: args.steps,
|
|
280
296
|
ts: (/* @__PURE__ */ new Date()).valueOf()
|
|
281
297
|
});
|
|
@@ -285,6 +301,7 @@ var InngestApi = class {
|
|
|
285
301
|
});
|
|
286
302
|
if (!result.ok) throw new Error(getErrorMessage(result.error, "Unknown error checkpointing async"));
|
|
287
303
|
const res = result.value;
|
|
304
|
+
if (res.status === 409) throw new StaleDispatchError(`Stale dispatch: checkpoint returned 409 (run ${args.runId})`);
|
|
288
305
|
if (!res.ok) throw new Error(`Failed to checkpoint async: ${res.status} ${res.statusText} - ${await res.text()}`);
|
|
289
306
|
}
|
|
290
307
|
/**
|
package/api/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","names":["finalUrl: URL","data: unknown","json: unknown","rawData: unknown"],"sources":["../../src/api/api.ts"],"sourcesContent":["import type { fetch } from \"cross-fetch\";\nimport { z } from \"zod/v3\";\nimport type { ExecutionVersion } from \"../helpers/consts.ts\";\nimport { getErrorMessage } from \"../helpers/errors.ts\";\nimport { fetchWithAuthFallback } from \"../helpers/net.ts\";\nimport { hashSigningKey } from \"../helpers/strings.ts\";\nimport {\n type APIStepPayload,\n err,\n type MetadataTarget,\n type OutgoingOp,\n ok,\n type Result,\n} from \"../types.ts\";\nimport {\n type BatchResponse,\n batchSchema,\n type ErrorResponse,\n errorSchema,\n type StepsResponse,\n stepSchema,\n} from \"./schema.ts\";\n\ntype FetchT = typeof fetch;\n\nconst realtimeSubscriptionTokenSchema = z.object({\n jwt: z.string(),\n});\n\nconst sendSignalSuccessResponseSchema = z.object({\n data: z.object({\n run_id: z.string().min(1),\n }),\n});\n\nconst checkpointNewRunResponseSchema = z.object({\n data: z.object({\n fn_id: z.string().min(1),\n app_id: z.string().min(1),\n run_id: z.string().min(1),\n token: z.string().min(1).optional(),\n realtime_token: z.string().min(1),\n }),\n});\n\nexport namespace InngestApi {\n export interface Options {\n baseUrl: () => string | undefined;\n signingKey: () => string | undefined;\n signingKeyFallback: () => string | undefined;\n fetch: () => FetchT;\n }\n\n export interface Subscription {\n topics: string[];\n channel: string;\n }\n\n export interface PublishOptions extends Subscription {\n runId?: string;\n }\n\n export interface SendSignalOptions {\n signal: string;\n data?: unknown;\n }\n\n export interface SendSignalResponse {\n /**\n * The ID of the run that was signaled.\n *\n * If this is undefined, the signal could not be matched to a run.\n */\n runId: string | undefined;\n }\n}\n\nexport class InngestApi {\n private readonly _signingKey: () => string | undefined;\n private readonly _signingKeyFallback: () => string | undefined;\n private readonly _apiBaseUrl: () => string | undefined;\n private readonly _fetch: () => FetchT;\n\n constructor({\n baseUrl,\n signingKey,\n signingKeyFallback,\n fetch,\n }: InngestApi.Options) {\n this._apiBaseUrl = baseUrl;\n this._signingKey = signingKey;\n this._signingKeyFallback = signingKeyFallback;\n this._fetch = fetch;\n }\n\n private get apiBaseUrl(): string | undefined {\n return this._apiBaseUrl();\n }\n\n private get signingKey(): string | undefined {\n return this._signingKey();\n }\n\n private get signingKeyFallback(): string | undefined {\n return this._signingKeyFallback();\n }\n\n private get hashedKey(): string {\n return hashSigningKey(this.signingKey);\n }\n\n private get hashedFallbackKey(): string | undefined {\n if (!this.signingKeyFallback) {\n return;\n }\n\n return hashSigningKey(this.signingKeyFallback);\n }\n\n private async getTargetUrl(path: string): Promise<URL> {\n return new URL(path, this.apiBaseUrl);\n }\n\n private async req(\n url: string | URL,\n options?: RequestInit,\n ): Promise<Result<Response, unknown>> {\n const finalUrl: URL =\n typeof url === \"string\" ? await this.getTargetUrl(url) : url;\n\n try {\n const res = await fetchWithAuthFallback({\n authToken: this.hashedKey,\n authTokenFallback: this.hashedFallbackKey,\n fetch: this._fetch(),\n url: finalUrl,\n options: {\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n },\n });\n\n return ok(res);\n } catch (error) {\n return err(error);\n }\n }\n\n async getRunSteps(\n runId: string,\n ): Promise<Result<StepsResponse, ErrorResponse>> {\n const result = await this.req(\n `/v0/runs/${encodeURIComponent(runId)}/actions`,\n );\n if (result.ok) {\n const res = result.value;\n const data: unknown = await res.json();\n\n if (res.ok) {\n return ok(stepSchema.parse(data));\n }\n\n return err(errorSchema.parse(data));\n }\n\n return err({\n error: getErrorMessage(\n result.error,\n \"Unknown error retrieving step data\",\n ),\n status: 500,\n });\n }\n\n async getRunBatch(\n runId: string,\n ): Promise<Result<BatchResponse, ErrorResponse>> {\n const result = await this.req(\n `/v0/runs/${encodeURIComponent(runId)}/batch`,\n );\n if (result.ok) {\n const res = result.value;\n const data: unknown = await res.json();\n\n if (res.ok) {\n return ok(batchSchema.parse(data));\n }\n\n return err(errorSchema.parse(data));\n }\n\n return err({\n error: getErrorMessage(\n result.error,\n \"Unknown error retrieving event batch\",\n ),\n status: 500,\n });\n }\n\n async publish(\n publishOptions: InngestApi.PublishOptions,\n // biome-ignore lint/suspicious/noExplicitAny: anything is acceptable\n data: any,\n ): Promise<Result<void, ErrorResponse>> {\n // todo it may not be a \"text/stream\"\n const isStream = data instanceof ReadableStream;\n\n const url = await this.getTargetUrl(\"/v1/realtime/publish\");\n url.searchParams.set(\"channel\", publishOptions.channel || \"\");\n if (publishOptions.runId) {\n url.searchParams.set(\"run_id\", publishOptions.runId);\n }\n for (const topic of publishOptions.topics) {\n url.searchParams.append(\"topic\", topic);\n }\n\n const result = await this.req(url, {\n body: isStream\n ? data\n : typeof data === \"string\"\n ? data\n : JSON.stringify(data),\n method: \"POST\",\n headers: {\n \"Content-Type\": isStream ? \"text/stream\" : \"application/json\",\n },\n ...(isStream ? { duplex: \"half\" } : {}),\n });\n if (result.ok) {\n const res = result.value;\n if (!res.ok) {\n throw new Error(\n `Failed to publish event: ${res.status} ${res.statusText}`,\n );\n }\n\n return ok<void>(undefined);\n }\n\n return err({\n error: getErrorMessage(result.error, \"Unknown error publishing event\"),\n status: 500,\n });\n }\n\n async sendSignal(\n signalOptions: InngestApi.SendSignalOptions,\n options?: {\n headers?: Record<string, string>;\n },\n ): Promise<Result<InngestApi.SendSignalResponse, ErrorResponse>> {\n const url = await this.getTargetUrl(\"/v1/signals\");\n\n const body = {\n signal: signalOptions.signal,\n data: signalOptions.data,\n };\n\n return fetchWithAuthFallback({\n authToken: this.hashedKey,\n authTokenFallback: this.hashedFallbackKey,\n fetch: this._fetch(),\n url,\n options: {\n method: \"POST\",\n body: JSON.stringify(body),\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n },\n })\n .then(async (res) => {\n // A 404 is valid if the signal was not found.\n if (res.status === 404) {\n return ok<InngestApi.SendSignalResponse>({\n runId: undefined,\n });\n }\n\n // Save a clone of the response we can use to get the text of if we fail\n // to parse the JSON.\n const resClone = res.clone();\n\n // JSON!\n let json: unknown;\n try {\n json = await res.json();\n } catch {\n // res.json() failed so not a valid JSON response\n return err({\n error: `Failed to send signal: ${res.status} ${\n res.statusText\n } - ${await resClone.text()}`,\n status: res.status,\n });\n }\n\n // If we're not 2xx, something went wrong.\n if (!res.ok) {\n try {\n return err(errorSchema.parse(json));\n } catch {\n // schema parse failed\n return err({\n error: `Failed to send signal: ${res.status} ${\n res.statusText\n } - ${await res.text()}`,\n status: res.status,\n });\n }\n }\n\n // If we are 2xx, we should have a run_id.\n const parseRes = sendSignalSuccessResponseSchema.safeParse(json);\n if (!parseRes.success) {\n return err({\n error: `Successfully sent signal, but response parsing failed: ${\n res.status\n } ${res.statusText} - ${await resClone.text()}`,\n status: res.status,\n });\n }\n\n return ok({\n runId: parseRes.data.data.run_id,\n });\n })\n .catch((error) => {\n // Catch-all if various things go wrong\n return err({\n error: getErrorMessage(error, \"Unknown error sending signal\"),\n status: 500,\n });\n });\n }\n\n async getSubscriptionToken(\n channel: string,\n topics: string[],\n ): Promise<string> {\n const url = await this.getTargetUrl(\"/v1/realtime/token\");\n\n const body = topics.map((topic) => ({\n channel,\n name: topic,\n kind: \"run\",\n }));\n\n return fetchWithAuthFallback({\n authToken: this.hashedKey,\n authTokenFallback: this.hashedFallbackKey,\n fetch: this._fetch(),\n url,\n options: {\n method: \"POST\",\n body: JSON.stringify(body),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n },\n })\n .then(async (res) => {\n if (!res.ok) {\n throw new Error(\n `Failed to get subscription token: ${res.status} ${\n res.statusText\n } - ${await res.text()}`,\n );\n }\n\n const data = realtimeSubscriptionTokenSchema.parse(await res.json());\n\n return data.jwt;\n })\n .catch((error) => {\n throw new Error(\n getErrorMessage(error, \"Unknown error getting subscription token\"),\n );\n });\n }\n\n async updateMetadata(\n args: {\n target: MetadataTarget;\n metadata: Array<{\n kind: string;\n op: string;\n values: Record<string, unknown>;\n }>;\n },\n options?: {\n headers?: Record<string, string>;\n },\n ): Promise<Result<void, ErrorResponse>> {\n const payload = { target: args.target, metadata: args.metadata };\n\n const result = await this.req(\n `/v1/runs/${encodeURIComponent(args.target.run_id)}/metadata`,\n {\n method: \"POST\",\n body: JSON.stringify(payload),\n headers: options?.headers,\n },\n );\n\n if (!result.ok) {\n return err({\n error: getErrorMessage(result.error, \"Unknown error updating metadata\"),\n status: 500,\n });\n }\n\n const res = result.value;\n if (res.ok) {\n return ok<void>(undefined);\n }\n\n const resClone = res.clone();\n\n let json: unknown;\n try {\n json = await res.json();\n } catch {\n return err({\n error: `Failed to update metadata: ${res.status} ${\n res.statusText\n } - ${await resClone.text()}`,\n status: res.status,\n });\n }\n\n try {\n return err(errorSchema.parse(json));\n } catch {\n return err({\n error: `Failed to update metadata: ${res.status} ${res.statusText}`,\n status: res.status,\n });\n }\n }\n\n /**\n * Start a new run, optionally passing in a number of steps to initialize the\n * run with.\n */\n async checkpointNewRun(args: {\n runId: string;\n event: APIStepPayload;\n executionVersion: ExecutionVersion;\n retries: number;\n steps?: OutgoingOp[];\n }): Promise<z.output<typeof checkpointNewRunResponseSchema>> {\n const body = JSON.stringify({\n run_id: args.runId,\n event: args.event,\n steps: args.steps,\n ts: new Date().valueOf(),\n request_version: args.executionVersion,\n retries: args.retries,\n });\n\n const result = await this.req(\"/v1/checkpoint\", {\n method: \"POST\",\n body,\n });\n\n if (!result.ok) {\n throw new Error(\n getErrorMessage(result.error, \"Unknown error checkpointing new run\"),\n );\n }\n\n const res = result.value;\n if (res.ok) {\n const rawData: unknown = await res.json();\n const data = checkpointNewRunResponseSchema.parse(rawData);\n\n return data;\n }\n\n throw new Error(\n `Failed to checkpoint new run: ${res.status} ${\n res.statusText\n } - ${await res.text()}`,\n );\n }\n\n /**\n * Checkpoint steps for a given sync run.\n */\n async checkpointSteps(args: {\n runId: string;\n fnId: string;\n appId: string;\n steps: OutgoingOp[];\n }): Promise<void> {\n const body = JSON.stringify({\n fn_id: args.fnId,\n app_id: args.appId,\n run_id: args.runId,\n steps: args.steps,\n ts: new Date().valueOf(),\n });\n\n const result = await this.req(\n `/v1/checkpoint/${encodeURIComponent(args.runId)}/steps`,\n {\n method: \"POST\",\n body,\n },\n );\n\n if (!result.ok) {\n throw new Error(\n getErrorMessage(result.error, \"Unknown error checkpointing steps\"),\n );\n }\n\n const res = result.value;\n if (!res.ok) {\n throw new Error(\n `Failed to checkpoint steps: ${res.status} ${\n res.statusText\n } - ${await res.text()}`,\n );\n }\n }\n\n /**\n * Checkpoint steps for a given async run.\n */\n async checkpointStepsAsync(args: {\n runId: string;\n fnId: string;\n queueItemId: string;\n steps: OutgoingOp[];\n }): Promise<void> {\n const body = JSON.stringify({\n run_id: args.runId,\n fn_id: args.fnId,\n qi_id: args.queueItemId,\n steps: args.steps,\n ts: new Date().valueOf(),\n });\n\n const result = await this.req(\n `/v1/checkpoint/${encodeURIComponent(args.runId)}/async`,\n {\n method: \"POST\",\n body,\n },\n );\n\n if (!result.ok) {\n throw new Error(\n getErrorMessage(result.error, \"Unknown error checkpointing async\"),\n );\n }\n\n const res = result.value;\n if (!res.ok) {\n throw new Error(\n `Failed to checkpoint async: ${res.status} ${\n res.statusText\n } - ${await res.text()}`,\n );\n }\n }\n\n /**\n * POST stream data to the realtime publish/tee endpoint, forwarding raw\n * bytes to all subscribers via the broadcaster.\n */\n async checkpointStream(args: {\n runId: string;\n body: ReadableStream;\n }): Promise<void> {\n const url = await this.getTargetUrl(\n `/v1/realtime/publish/tee?channel=${encodeURIComponent(args.runId)}`,\n );\n\n const res = await fetchWithAuthFallback({\n authToken: this.hashedKey,\n authTokenFallback: this.hashedFallbackKey,\n fetch: this._fetch(),\n url,\n options: {\n method: \"POST\",\n body: args.body,\n headers: {\n \"Content-Type\": \"application/octet-stream\",\n },\n // Required for streaming request bodies\n // @ts-expect-error duplex not in RequestInit types yet\n duplex: \"half\",\n },\n });\n\n if (!res.ok) {\n throw new Error(\n `Failed to stream checkpoint: ${res.status} ${\n res.statusText\n } - ${await res.text()}`,\n );\n }\n }\n\n /**\n * Build the full SSE URL for a run's stream channel using the given token.\n */\n async getRealtimeStreamRedirect(token: string): Promise<{ url: string }> {\n const sseUrl = await this.getTargetUrl(\"/v1/realtime/sse\");\n sseUrl.searchParams.set(\"token\", token);\n\n return { url: sseUrl.toString() };\n }\n\n /**\n * Fetch the output of a completed run using a token.\n *\n * This uses token-based auth (not signing key) and is intended for use by\n * proxy endpoints that fetch results on behalf of users.\n *\n * @param runId - The ID of the run to fetch output for\n * @param token - The token used to authenticate the request\n * @returns The raw Response from the API\n */\n async getRunOutput(runId: string, token: string): Promise<Response> {\n const url = await this.getTargetUrl(\n `/v1/http/runs/${encodeURIComponent(runId)}/output`,\n );\n url.searchParams.set(\"token\", token);\n\n return this._fetch()(url.toString(), {\n method: \"GET\",\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api.js","names":["finalUrl: URL","data: unknown","json: unknown","rawData: unknown"],"sources":["../../src/api/api.ts"],"sourcesContent":["import type { fetch } from \"cross-fetch\";\nimport { z } from \"zod/v3\";\nimport type { ExecutionVersion } from \"../helpers/consts.ts\";\nimport { getErrorMessage } from \"../helpers/errors.ts\";\nimport { type Marker, markerKey } from \"../helpers/marker.ts\";\nimport { fetchWithAuthFallback } from \"../helpers/net.ts\";\nimport { hashSigningKey } from \"../helpers/strings.ts\";\nimport {\n type APIStepPayload,\n err,\n type MetadataTarget,\n type OutgoingOp,\n ok,\n type Result,\n} from \"../types.ts\";\nimport {\n type BatchResponse,\n batchSchema,\n type ErrorResponse,\n errorSchema,\n type StepsResponse,\n stepSchema,\n} from \"./schema.ts\";\n\ntype FetchT = typeof fetch;\n\n/**\n * Thrown when the executor has already requeued the current run. Returning\n * buffered ops after this would let the executor memoize them as canonical and\n * chain the next dispatch off this dead invocation, producing duplicates.\n */\nexport class StaleDispatchError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"StaleDispatchError\";\n }\n\n readonly [markerKey]: Marker = { kind: \"StaleDispatchError\" };\n}\n\nconst realtimeSubscriptionTokenSchema = z.object({\n jwt: z.string(),\n});\n\nconst sendSignalSuccessResponseSchema = z.object({\n data: z.object({\n run_id: z.string().min(1),\n }),\n});\n\nconst checkpointNewRunResponseSchema = z.object({\n data: z.object({\n fn_id: z.string().min(1),\n app_id: z.string().min(1),\n run_id: z.string().min(1),\n token: z.string().min(1).optional(),\n realtime_token: z.string().min(1),\n }),\n});\n\nexport namespace InngestApi {\n export interface Options {\n baseUrl: () => string | undefined;\n signingKey: () => string | undefined;\n signingKeyFallback: () => string | undefined;\n fetch: () => FetchT;\n }\n\n export interface Subscription {\n topics: string[];\n channel: string;\n }\n\n export interface PublishOptions extends Subscription {\n runId?: string;\n }\n\n export interface SendSignalOptions {\n signal: string;\n data?: unknown;\n }\n\n export interface SendSignalResponse {\n /**\n * The ID of the run that was signaled.\n *\n * If this is undefined, the signal could not be matched to a run.\n */\n runId: string | undefined;\n }\n}\n\nexport class InngestApi {\n private readonly _signingKey: () => string | undefined;\n private readonly _signingKeyFallback: () => string | undefined;\n private readonly _apiBaseUrl: () => string | undefined;\n private readonly _fetch: () => FetchT;\n\n constructor({\n baseUrl,\n signingKey,\n signingKeyFallback,\n fetch,\n }: InngestApi.Options) {\n this._apiBaseUrl = baseUrl;\n this._signingKey = signingKey;\n this._signingKeyFallback = signingKeyFallback;\n this._fetch = fetch;\n }\n\n private get apiBaseUrl(): string | undefined {\n return this._apiBaseUrl();\n }\n\n private get signingKey(): string | undefined {\n return this._signingKey();\n }\n\n private get signingKeyFallback(): string | undefined {\n return this._signingKeyFallback();\n }\n\n private get hashedKey(): string {\n return hashSigningKey(this.signingKey);\n }\n\n private get hashedFallbackKey(): string | undefined {\n if (!this.signingKeyFallback) {\n return;\n }\n\n return hashSigningKey(this.signingKeyFallback);\n }\n\n private async getTargetUrl(path: string): Promise<URL> {\n return new URL(path, this.apiBaseUrl);\n }\n\n private async req(\n url: string | URL,\n options?: RequestInit,\n ): Promise<Result<Response, unknown>> {\n const finalUrl: URL =\n typeof url === \"string\" ? await this.getTargetUrl(url) : url;\n\n try {\n const res = await fetchWithAuthFallback({\n authToken: this.hashedKey,\n authTokenFallback: this.hashedFallbackKey,\n fetch: this._fetch(),\n url: finalUrl,\n options: {\n ...options,\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n },\n });\n\n return ok(res);\n } catch (error) {\n return err(error);\n }\n }\n\n async getRunSteps(\n runId: string,\n ): Promise<Result<StepsResponse, ErrorResponse>> {\n const result = await this.req(\n `/v0/runs/${encodeURIComponent(runId)}/actions`,\n );\n if (result.ok) {\n const res = result.value;\n const data: unknown = await res.json();\n\n if (res.ok) {\n return ok(stepSchema.parse(data));\n }\n\n return err(errorSchema.parse(data));\n }\n\n return err({\n error: getErrorMessage(\n result.error,\n \"Unknown error retrieving step data\",\n ),\n status: 500,\n });\n }\n\n async getRunBatch(\n runId: string,\n ): Promise<Result<BatchResponse, ErrorResponse>> {\n const result = await this.req(\n `/v0/runs/${encodeURIComponent(runId)}/batch`,\n );\n if (result.ok) {\n const res = result.value;\n const data: unknown = await res.json();\n\n if (res.ok) {\n return ok(batchSchema.parse(data));\n }\n\n return err(errorSchema.parse(data));\n }\n\n return err({\n error: getErrorMessage(\n result.error,\n \"Unknown error retrieving event batch\",\n ),\n status: 500,\n });\n }\n\n async publish(\n publishOptions: InngestApi.PublishOptions,\n // biome-ignore lint/suspicious/noExplicitAny: anything is acceptable\n data: any,\n ): Promise<Result<void, ErrorResponse>> {\n // todo it may not be a \"text/stream\"\n const isStream = data instanceof ReadableStream;\n\n const url = await this.getTargetUrl(\"/v1/realtime/publish\");\n url.searchParams.set(\"channel\", publishOptions.channel || \"\");\n if (publishOptions.runId) {\n url.searchParams.set(\"run_id\", publishOptions.runId);\n }\n for (const topic of publishOptions.topics) {\n url.searchParams.append(\"topic\", topic);\n }\n\n const result = await this.req(url, {\n body: isStream\n ? data\n : typeof data === \"string\"\n ? data\n : JSON.stringify(data),\n method: \"POST\",\n headers: {\n \"Content-Type\": isStream ? \"text/stream\" : \"application/json\",\n },\n ...(isStream ? { duplex: \"half\" } : {}),\n });\n if (result.ok) {\n const res = result.value;\n if (!res.ok) {\n throw new Error(\n `Failed to publish event: ${res.status} ${res.statusText}`,\n );\n }\n\n return ok<void>(undefined);\n }\n\n return err({\n error: getErrorMessage(result.error, \"Unknown error publishing event\"),\n status: 500,\n });\n }\n\n async sendSignal(\n signalOptions: InngestApi.SendSignalOptions,\n options?: {\n headers?: Record<string, string>;\n },\n ): Promise<Result<InngestApi.SendSignalResponse, ErrorResponse>> {\n const url = await this.getTargetUrl(\"/v1/signals\");\n\n const body = {\n signal: signalOptions.signal,\n data: signalOptions.data,\n };\n\n return fetchWithAuthFallback({\n authToken: this.hashedKey,\n authTokenFallback: this.hashedFallbackKey,\n fetch: this._fetch(),\n url,\n options: {\n method: \"POST\",\n body: JSON.stringify(body),\n headers: {\n \"Content-Type\": \"application/json\",\n ...options?.headers,\n },\n },\n })\n .then(async (res) => {\n // A 404 is valid if the signal was not found.\n if (res.status === 404) {\n return ok<InngestApi.SendSignalResponse>({\n runId: undefined,\n });\n }\n\n // Save a clone of the response we can use to get the text of if we fail\n // to parse the JSON.\n const resClone = res.clone();\n\n // JSON!\n let json: unknown;\n try {\n json = await res.json();\n } catch {\n // res.json() failed so not a valid JSON response\n return err({\n error: `Failed to send signal: ${res.status} ${\n res.statusText\n } - ${await resClone.text()}`,\n status: res.status,\n });\n }\n\n // If we're not 2xx, something went wrong.\n if (!res.ok) {\n try {\n return err(errorSchema.parse(json));\n } catch {\n // schema parse failed\n return err({\n error: `Failed to send signal: ${res.status} ${\n res.statusText\n } - ${await res.text()}`,\n status: res.status,\n });\n }\n }\n\n // If we are 2xx, we should have a run_id.\n const parseRes = sendSignalSuccessResponseSchema.safeParse(json);\n if (!parseRes.success) {\n return err({\n error: `Successfully sent signal, but response parsing failed: ${\n res.status\n } ${res.statusText} - ${await resClone.text()}`,\n status: res.status,\n });\n }\n\n return ok({\n runId: parseRes.data.data.run_id,\n });\n })\n .catch((error) => {\n // Catch-all if various things go wrong\n return err({\n error: getErrorMessage(error, \"Unknown error sending signal\"),\n status: 500,\n });\n });\n }\n\n async getSubscriptionToken(\n channel: string,\n topics: string[],\n ): Promise<string> {\n const url = await this.getTargetUrl(\"/v1/realtime/token\");\n\n const body = topics.map((topic) => ({\n channel,\n name: topic,\n kind: \"run\",\n }));\n\n return fetchWithAuthFallback({\n authToken: this.hashedKey,\n authTokenFallback: this.hashedFallbackKey,\n fetch: this._fetch(),\n url,\n options: {\n method: \"POST\",\n body: JSON.stringify(body),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n },\n })\n .then(async (res) => {\n if (!res.ok) {\n throw new Error(\n `Failed to get subscription token: ${res.status} ${\n res.statusText\n } - ${await res.text()}`,\n );\n }\n\n const data = realtimeSubscriptionTokenSchema.parse(await res.json());\n\n return data.jwt;\n })\n .catch((error) => {\n throw new Error(\n getErrorMessage(error, \"Unknown error getting subscription token\"),\n );\n });\n }\n\n async updateMetadata(\n args: {\n target: MetadataTarget;\n metadata: Array<{\n kind: string;\n op: string;\n values: Record<string, unknown>;\n }>;\n },\n options?: {\n headers?: Record<string, string>;\n },\n ): Promise<Result<void, ErrorResponse>> {\n const payload = { target: args.target, metadata: args.metadata };\n\n const result = await this.req(\n `/v1/runs/${encodeURIComponent(args.target.run_id)}/metadata`,\n {\n method: \"POST\",\n body: JSON.stringify(payload),\n headers: options?.headers,\n },\n );\n\n if (!result.ok) {\n return err({\n error: getErrorMessage(result.error, \"Unknown error updating metadata\"),\n status: 500,\n });\n }\n\n const res = result.value;\n if (res.ok) {\n return ok<void>(undefined);\n }\n\n const resClone = res.clone();\n\n let json: unknown;\n try {\n json = await res.json();\n } catch {\n return err({\n error: `Failed to update metadata: ${res.status} ${\n res.statusText\n } - ${await resClone.text()}`,\n status: res.status,\n });\n }\n\n try {\n return err(errorSchema.parse(json));\n } catch {\n return err({\n error: `Failed to update metadata: ${res.status} ${res.statusText}`,\n status: res.status,\n });\n }\n }\n\n /**\n * Start a new run, optionally passing in a number of steps to initialize the\n * run with.\n */\n async checkpointNewRun(args: {\n runId: string;\n event: APIStepPayload;\n executionVersion: ExecutionVersion;\n retries: number;\n steps?: OutgoingOp[];\n }): Promise<z.output<typeof checkpointNewRunResponseSchema>> {\n const body = JSON.stringify({\n run_id: args.runId,\n event: args.event,\n steps: args.steps,\n ts: new Date().valueOf(),\n request_version: args.executionVersion,\n retries: args.retries,\n });\n\n const result = await this.req(\"/v1/checkpoint\", {\n method: \"POST\",\n body,\n });\n\n if (!result.ok) {\n throw new Error(\n getErrorMessage(result.error, \"Unknown error checkpointing new run\"),\n );\n }\n\n const res = result.value;\n if (res.ok) {\n const rawData: unknown = await res.json();\n const data = checkpointNewRunResponseSchema.parse(rawData);\n\n return data;\n }\n\n throw new Error(\n `Failed to checkpoint new run: ${res.status} ${\n res.statusText\n } - ${await res.text()}`,\n );\n }\n\n /**\n * Checkpoint steps for a given sync run.\n */\n async checkpointSteps(args: {\n runId: string;\n fnId: string;\n appId: string;\n steps: OutgoingOp[];\n }): Promise<void> {\n const body = JSON.stringify({\n fn_id: args.fnId,\n app_id: args.appId,\n run_id: args.runId,\n steps: args.steps,\n ts: new Date().valueOf(),\n });\n\n const result = await this.req(\n `/v1/checkpoint/${encodeURIComponent(args.runId)}/steps`,\n {\n method: \"POST\",\n body,\n },\n );\n\n if (!result.ok) {\n throw new Error(\n getErrorMessage(result.error, \"Unknown error checkpointing steps\"),\n );\n }\n\n const res = result.value;\n if (!res.ok) {\n throw new Error(\n `Failed to checkpoint steps: ${res.status} ${\n res.statusText\n } - ${await res.text()}`,\n );\n }\n }\n\n /**\n * Checkpoint steps for a given async run.\n */\n async checkpointStepsAsync(args: {\n runId: string;\n fnId: string;\n queueItemId: string;\n generationId: number | undefined;\n requestId: string | undefined;\n requestStartedAt: number | undefined;\n steps: OutgoingOp[];\n }): Promise<void> {\n const body = JSON.stringify({\n run_id: args.runId,\n fn_id: args.fnId,\n qi_id: args.queueItemId,\n request_id: args.requestId,\n generation_id: args.generationId,\n request_started_at: args.requestStartedAt,\n steps: args.steps,\n ts: new Date().valueOf(),\n });\n\n const result = await this.req(\n `/v1/checkpoint/${encodeURIComponent(args.runId)}/async`,\n {\n method: \"POST\",\n body,\n },\n );\n\n if (!result.ok) {\n throw new Error(\n getErrorMessage(result.error, \"Unknown error checkpointing async\"),\n );\n }\n\n const res = result.value;\n // 409 means the executor has already requeued. Halt rather than returning\n // buffered ops, which would let the executor memoize them as canonical and\n // chain the next dispatch off this dead invocation. See EXE-1552.\n if (res.status === 409) {\n throw new StaleDispatchError(\n `Stale dispatch: checkpoint returned 409 (run ${args.runId})`,\n );\n }\n if (!res.ok) {\n throw new Error(\n `Failed to checkpoint async: ${res.status} ${\n res.statusText\n } - ${await res.text()}`,\n );\n }\n }\n\n /**\n * POST stream data to the realtime publish/tee endpoint, forwarding raw\n * bytes to all subscribers via the broadcaster.\n */\n async checkpointStream(args: {\n runId: string;\n body: ReadableStream;\n }): Promise<void> {\n const url = await this.getTargetUrl(\n `/v1/realtime/publish/tee?channel=${encodeURIComponent(args.runId)}`,\n );\n\n const res = await fetchWithAuthFallback({\n authToken: this.hashedKey,\n authTokenFallback: this.hashedFallbackKey,\n fetch: this._fetch(),\n url,\n options: {\n method: \"POST\",\n body: args.body,\n headers: {\n \"Content-Type\": \"application/octet-stream\",\n },\n // Required for streaming request bodies\n // @ts-expect-error duplex not in RequestInit types yet\n duplex: \"half\",\n },\n });\n\n if (!res.ok) {\n throw new Error(\n `Failed to stream checkpoint: ${res.status} ${\n res.statusText\n } - ${await res.text()}`,\n );\n }\n }\n\n /**\n * Build the full SSE URL for a run's stream channel using the given token.\n */\n async getRealtimeStreamRedirect(token: string): Promise<{ url: string }> {\n const sseUrl = await this.getTargetUrl(\"/v1/realtime/sse\");\n sseUrl.searchParams.set(\"token\", token);\n\n return { url: sseUrl.toString() };\n }\n\n /**\n * Fetch the output of a completed run using a token.\n *\n * This uses token-based auth (not signing key) and is intended for use by\n * proxy endpoints that fetch results on behalf of users.\n *\n * @param runId - The ID of the run to fetch output for\n * @param token - The token used to authenticate the request\n * @returns The raw Response from the API\n */\n async getRunOutput(runId: string, token: string): Promise<Response> {\n const url = await this.getTargetUrl(\n `/v1/http/runs/${encodeURIComponent(runId)}/output`,\n );\n url.searchParams.set(\"token\", token);\n\n return this._fetch()(url.toString(), {\n method: \"GET\",\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n}\n"],"mappings":"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"}
|
package/api/schema.d.cts
CHANGED
|
@@ -6,11 +6,11 @@ declare const errorSchema: z.ZodObject<{
|
|
|
6
6
|
error: z.ZodString;
|
|
7
7
|
status: z.ZodNumber;
|
|
8
8
|
}, "strip", z.ZodTypeAny, {
|
|
9
|
-
error: string;
|
|
10
9
|
status: number;
|
|
11
|
-
}, {
|
|
12
10
|
error: string;
|
|
11
|
+
}, {
|
|
13
12
|
status: number;
|
|
13
|
+
error: string;
|
|
14
14
|
}>;
|
|
15
15
|
type ErrorResponse = z.infer<typeof errorSchema>;
|
|
16
16
|
declare const stepSchema: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodUnion<[z.ZodUnion<[z.ZodObject<{
|
package/api/schema.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.cts","names":[],"sources":["../../src/api/schema.ts"],"sourcesContent":[],"mappings":";;;;cAGa,aAAW,CAAA,CAAA;;EAAX,MAAA,aAGX;CAAA,EAAA,OAAA,cAAA,EAAA;;;;
|
|
1
|
+
{"version":3,"file":"schema.d.cts","names":[],"sources":["../../src/api/schema.ts"],"sourcesContent":[],"mappings":";;;;cAGa,aAAW,CAAA,CAAA;;EAAX,MAAA,aAGX;CAAA,EAAA,OAAA,cAAA,EAAA;;;;QAHsB,EAAA,MAAA;EAAA,KAAA,EAAA,MAAA;AAIxB,CAAA,CAAA;AAAyB,KAAb,aAAA,GAAgB,CAAA,CAAE,KAAL,CAAA,OAAkB,WAAlB,CAAA;AAAkB,cAE9B,UAF8B,EAEpB,CAAA,CAAA,UAFoB,CAEpB,CAAA,CAAA,SAFoB,CAEpB,CAAA,CAAA,SAFoB,EAEpB,CAAA,CAAA,QAFoB,CAAA,CAEpB,CAAA,CAAA,QAFoB,CAAA,CAEpB,CAAA,CAAA,QAFoB,CAAA,CAEpB,CAAA,CAAA,SAFoB,CAAA;MAAf,cAAE,cAAA,aAAA,CAAA,MAAA,CAAA,CAAA,CAAA;EAAK,IAAA,cAAA,SAAA,EAAA,GAAA,EAAA,GAAA,CAAA;AAEnC,CAAA,EAAA,QAAa,cAuCC,EAAA;EAAA,IAAA,EAAA,MAAA;MAvCS,CAAA,EAAA,GAAA;;;;;;;WAAA,cAAA,EAAA;;;;;;;;;;;;;;;;;;MAAA;;;IAAA,KAAA,CAAA,EAAA,OAAA;;MAAA,CAAA,EAAA,OAAA,GAAA,SAAA;CAAA,CAAA,CAAA,CAAA,aAAA,CAAA;EAyCX,IAAA,cAAa,cAAA,aAAA,CAAA,OAAA,CAAA,CAAA,CAAA;EAAA,KAAA,cAAA,SAAA,EAAA,GAAA,EAAA,GAAA,CAAA;WAAkB,cAAA,EAAA;MAAf,EAAE,OAAA;EAAK,KAAA,CAAA,EAAA,GAAA;AAEnC,CAAA,EAAA;EAEC,IAAA,CAAA,EAAA,OAAA,GAAA,SAAA;OAFuB,CAAA,EAAA,GAAA;kBAAA,SAAA,EAAA;MAAA,EAAA,MAAA;MAAA,EAAA,GAAA;OAAA,CAAA,CAAA,CAAA,CAAA;AAAA,KAFZ,aAAA,GAAgB,CAAA,CAAE,KAEN,CAAA,OAFmB,UAEnB,CAAA;AAAA,cAAX,WAAW,EAAA,CAAA,CAAA,QAAA,CAAA,CAAA,CAAA,UAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAAA,SAAA,EAAA,CAAA,CAAA,MAAA,CAAA,EAAA,YAAA,CAAA,GAAA,CAAA,EAAA,MAAA,CAAA,MAAA,EAAA,GAAA,CAAA,CAAA,EAAA,MAAA,CAAA;AAAA,KAGZ,aAAA,GAAgB,CAAA,CAAE,KAHN,CAAA,OAGmB,WAHnB,CAAA"}
|
package/api/schema.d.ts
CHANGED
|
@@ -6,11 +6,11 @@ declare const errorSchema: z.ZodObject<{
|
|
|
6
6
|
error: z.ZodString;
|
|
7
7
|
status: z.ZodNumber;
|
|
8
8
|
}, "strip", z.ZodTypeAny, {
|
|
9
|
-
error: string;
|
|
10
9
|
status: number;
|
|
11
|
-
}, {
|
|
12
10
|
error: string;
|
|
11
|
+
}, {
|
|
13
12
|
status: number;
|
|
13
|
+
error: string;
|
|
14
14
|
}>;
|
|
15
15
|
type ErrorResponse = z.infer<typeof errorSchema>;
|
|
16
16
|
declare const stepSchema: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodUnion<[z.ZodUnion<[z.ZodObject<{
|
package/api/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","names":[],"sources":["../../src/api/schema.ts"],"sourcesContent":[],"mappings":";;;;cAGa,aAAW,CAAA,CAAA;;EAAX,MAAA,aAGX;CAAA,EAAA,OAAA,cAAA,EAAA;;;;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","names":[],"sources":["../../src/api/schema.ts"],"sourcesContent":[],"mappings":";;;;cAGa,aAAW,CAAA,CAAA;;EAAX,MAAA,aAGX;CAAA,EAAA,OAAA,cAAA,EAAA;;;;QAHsB,EAAA,MAAA;EAAA,KAAA,EAAA,MAAA;AAIxB,CAAA,CAAA;AAAyB,KAAb,aAAA,GAAgB,CAAA,CAAE,KAAL,CAAA,OAAkB,WAAlB,CAAA;AAAkB,cAE9B,UAF8B,EAEpB,CAAA,CAAA,UAFoB,CAEpB,CAAA,CAAA,SAFoB,CAEpB,CAAA,CAAA,SAFoB,EAEpB,CAAA,CAAA,QAFoB,CAAA,CAEpB,CAAA,CAAA,QAFoB,CAAA,CAEpB,CAAA,CAAA,QAFoB,CAAA,CAEpB,CAAA,CAAA,SAFoB,CAAA;MAAf,cAAE,cAAA,aAAA,CAAA,MAAA,CAAA,CAAA,CAAA;EAAK,IAAA,cAAA,SAAA,EAAA,GAAA,EAAA,GAAA,CAAA;AAEnC,CAAA,EAAA,QAAa,cAuCC,EAAA;EAAA,IAAA,EAAA,MAAA;MAvCS,CAAA,EAAA,GAAA;;;;;;;WAAA,cAAA,EAAA;;;;;;;;;;;;;;;;;;MAAA;;;IAAA,KAAA,CAAA,EAAA,OAAA;;MAAA,CAAA,EAAA,OAAA,GAAA,SAAA;CAAA,CAAA,CAAA,CAAA,aAAA,CAAA;EAyCX,IAAA,cAAa,cAAA,aAAA,CAAA,OAAA,CAAA,CAAA,CAAA;EAAA,KAAA,cAAA,SAAA,EAAA,GAAA,EAAA,GAAA,CAAA;WAAkB,cAAA,EAAA;MAAf,EAAE,OAAA;EAAK,KAAA,CAAA,EAAA,GAAA;AAEnC,CAAA,EAAA;EAEC,IAAA,CAAA,EAAA,OAAA,GAAA,SAAA;OAFuB,CAAA,EAAA,GAAA;kBAAA,SAAA,EAAA;MAAA,EAAA,MAAA;MAAA,EAAA,GAAA;OAAA,CAAA,CAAA,CAAA,CAAA;AAAA,KAFZ,aAAA,GAAgB,CAAA,CAAE,KAEN,CAAA,OAFmB,UAEnB,CAAA;AAAA,cAAX,WAAW,EAAA,CAAA,CAAA,QAAA,CAAA,CAAA,CAAA,UAAA,CAAA,CAAA,CAAA,SAAA,CAAA,CAAA,CAAA,SAAA,EAAA,CAAA,CAAA,MAAA,CAAA,EAAA,YAAA,CAAA,GAAA,CAAA,EAAA,MAAA,CAAA,MAAA,EAAA,GAAA,CAAA,CAAA,EAAA,MAAA,CAAA;AAAA,KAGZ,aAAA,GAAgB,CAAA,CAAE,KAHN,CAAA,OAGmB,WAHnB,CAAA"}
|
|
@@ -22,7 +22,7 @@ const idDenyRegex = /['\\\n\r]/;
|
|
|
22
22
|
*/
|
|
23
23
|
var DeferredFunction = class extends require_InngestFunction.InngestFunction {
|
|
24
24
|
schema;
|
|
25
|
-
[require_marker.markerKey] = { kind: "
|
|
25
|
+
[require_marker.markerKey] = { kind: "DeferredFunction" };
|
|
26
26
|
constructor(client, opts, handler, schema) {
|
|
27
27
|
if (idDenyRegex.test(opts.id)) throw new Error(`invalid id "${opts.id}"; must match ${idDenyRegex.source}`);
|
|
28
28
|
super(client, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeferredFunction.cjs","names":["InngestFunction","markerKey","internalEvents"],"sources":["../../src/components/DeferredFunction.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { internalEvents } from \"../helpers/consts.ts\";\nimport { type Marker, markerKey } from \"../helpers/marker.ts\";\nimport type {\n ApplyAllMiddlewareCtxExtensions,\n ApplyAllMiddlewareStepExtensions,\n BaseContext,\n FunctionConfig,\n Handler,\n} from \"../types.ts\";\nimport type {\n builtInMiddleware,\n ClientOptionsFromInngest,\n Inngest,\n} from \"./Inngest.ts\";\nimport { InngestFunction } from \"./InngestFunction.ts\";\nimport type { createStepTools } from \"./InngestStepTools.ts\";\nimport type { Middleware } from \"./middleware/index.ts\";\n\nconst idDenyRegex = /['\\\\\\n\\r]/;\n\n/**\n * EXPERIMENTAL: This API is not yet stable and may change in the future without\n * a major version bump.\n *\n * A defer (companion) function created via `createDefer(...)`. Real\n * `InngestFunction` at runtime, but with the trigger pinned to\n * `inngest/deferred.schedule` (see `getConfigTriggers`), `triggers` and\n * `onFailure` disallowed, and the schema carried as a typed instance\n * property so callers of `defer(id, { function, data })` can extract it.\n *\n * Identify a defer function at runtime via `isDeferredFunction(value)` from\n * `helpers/marker.ts`. Prefer that over `instanceof`, which fails across\n * duplicate SDK copies in the same process.\n *\n * @public\n */\nexport class DeferredFunction<\n TSchema extends\n | StandardSchemaV1<Record<string, unknown>>\n | undefined = undefined,\n> extends InngestFunction<\n InngestFunction.Options<[], never>,\n Handler.Any,\n never,\n Inngest.Any,\n []\n> {\n readonly schema: TSchema;\n readonly [markerKey]: Marker = { kind: \"
|
|
1
|
+
{"version":3,"file":"DeferredFunction.cjs","names":["InngestFunction","markerKey","internalEvents"],"sources":["../../src/components/DeferredFunction.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { internalEvents } from \"../helpers/consts.ts\";\nimport { type Marker, markerKey } from \"../helpers/marker.ts\";\nimport type {\n ApplyAllMiddlewareCtxExtensions,\n ApplyAllMiddlewareStepExtensions,\n BaseContext,\n FunctionConfig,\n Handler,\n} from \"../types.ts\";\nimport type {\n builtInMiddleware,\n ClientOptionsFromInngest,\n Inngest,\n} from \"./Inngest.ts\";\nimport { InngestFunction } from \"./InngestFunction.ts\";\nimport type { createStepTools } from \"./InngestStepTools.ts\";\nimport type { Middleware } from \"./middleware/index.ts\";\n\nconst idDenyRegex = /['\\\\\\n\\r]/;\n\n/**\n * EXPERIMENTAL: This API is not yet stable and may change in the future without\n * a major version bump.\n *\n * A defer (companion) function created via `createDefer(...)`. Real\n * `InngestFunction` at runtime, but with the trigger pinned to\n * `inngest/deferred.schedule` (see `getConfigTriggers`), `triggers` and\n * `onFailure` disallowed, and the schema carried as a typed instance\n * property so callers of `defer(id, { function, data })` can extract it.\n *\n * Identify a defer function at runtime via `isDeferredFunction(value)` from\n * `helpers/marker.ts`. Prefer that over `instanceof`, which fails across\n * duplicate SDK copies in the same process.\n *\n * @public\n */\nexport class DeferredFunction<\n TSchema extends\n | StandardSchemaV1<Record<string, unknown>>\n | undefined = undefined,\n> extends InngestFunction<\n InngestFunction.Options<[], never>,\n Handler.Any,\n never,\n Inngest.Any,\n []\n> {\n readonly schema: TSchema;\n readonly [markerKey]: Marker = { kind: \"DeferredFunction\" };\n\n constructor(\n client: Inngest.Any,\n opts: DeferredFunction.Options,\n handler: Handler.Any,\n schema: TSchema,\n ) {\n // The id is interpolated into a CEL trigger expression\n // (`event.data._inngest.fn_slug == '${fnId}'`). Reject characters that\n // would break the single-quoted string literal.\n if (idDenyRegex.test(opts.id)) {\n throw new Error(\n `invalid id \"${opts.id}\"; must match ${idDenyRegex.source}`,\n );\n }\n super(\n client,\n { ...opts, triggers: [] } as InngestFunction.Options<[], never>,\n handler,\n );\n this.schema = schema;\n }\n\n protected override getConfigTriggers(\n fnId: string,\n ): FunctionConfig[\"triggers\"] {\n return [\n {\n event: internalEvents.DeferredSchedule,\n expression: `event.data._inngest.fn_slug == '${fnId}'`,\n },\n ];\n }\n}\n\n/**\n * @public\n */\nexport namespace DeferredFunction {\n /**\n * Matches any `DeferredFunction` regardless of its schema. Use as the\n * constraint for the `function` argument of `defer()`.\n */\n // biome-ignore lint/suspicious/noExplicitAny: widest schema constraint for inference\n export type Any = DeferredFunction<StandardSchemaV1<any> | undefined>;\n\n /**\n * The user-facing options accepted by `createDefer(client, opts, handler)`.\n * Mirrors `InngestFunction.Options` minus `triggers` (implicit), `onFailure`\n * (not yet supported), and `batchEvents` (each `defer(...)` is its own run).\n */\n export type Options = Omit<\n InngestFunction.Options<[], never>,\n \"triggers\" | \"onFailure\" | \"batchEvents\"\n >;\n}\n\n/**\n * The `event` shape a defer handler receives. With a schema, `data`\n * narrows to its inferred type; without one, it falls back to\n * `Record<string, any>`.\n */\ntype DeferEvent<TSchema> = {\n name: internalEvents.DeferredSchedule;\n data: TSchema extends StandardSchemaV1<\n infer D extends Record<string, unknown>\n >\n ? D\n : // biome-ignore lint/suspicious/noExplicitAny: no schema = any\n Record<string, any>;\n};\n\n/**\n * Base ctx shape for a defer handler: the standard function context\n * (`runId`, `attempt`, `group`, `step` with middleware step extensions)\n * with `event`/`events` pinned to `inngest/deferred.schedule` and the\n * schema-typed payload.\n */\ntype BaseDeferCtx<\n TClient extends Inngest.Any,\n TFnMiddleware extends Middleware.Class[] | undefined,\n TSchema extends StandardSchemaV1<Record<string, unknown>> | undefined,\n> = Omit<BaseContext<TClient>, \"event\" | \"events\" | \"step\"> & {\n event: DeferEvent<TSchema>;\n events: [DeferEvent<TSchema>];\n step: ReturnType<typeof createStepTools<TClient, TFnMiddleware>> &\n ApplyAllMiddlewareStepExtensions<\n ClientOptionsFromInngest<TClient>[\"middleware\"]\n > &\n ApplyAllMiddlewareStepExtensions<TFnMiddleware>;\n};\n\n/**\n * Input type for `createDefer`. Same shape as `DeferredFunction.Options`\n * plus `schema` (the StandardSchema describing `event.data` that flows\n * to caller `defer(id, { function, data })` call sites) and `middleware`.\n */\nexport type CreateDeferInput<\n TFnMiddleware extends Middleware.Class[] | undefined,\n TSchema extends StandardSchemaV1<Record<string, unknown>> | undefined,\n> = DeferredFunction.Options & {\n schema?: TSchema;\n middleware?: TFnMiddleware;\n};\n\n/**\n * EXPERIMENTAL: This API is not yet stable and may change in the future without\n * a major version bump.\n *\n * Create a typed defer function. One `createDefer` call = one Inngest\n * function. Returns a `DeferredFunction<TSchema>` so callers of `defer(id,\n * { function, data })` get the data type inferred from the schema.\n *\n * Mirrors `inngest.createFunction(opts, handler)`, with three differences:\n * the client is the first positional arg, `triggers` is not accepted (the\n * SDK emits an implicit `inngest/deferred.schedule` trigger), and `schema`\n * describes the payload that callers will send via `defer(id, { function,\n * data })`.\n *\n * Pass the result to `serve()` alongside regular functions so the SDK\n * registers it.\n */\nexport function createDefer<\n TClient extends Inngest.Any,\n TSchema extends\n | StandardSchemaV1<Record<string, unknown>>\n | undefined = undefined,\n const TFnMiddleware extends Middleware.Class[] | undefined = undefined,\n THandler extends Handler.Any = (\n ctx: BaseDeferCtx<TClient, TFnMiddleware, TSchema> &\n ApplyAllMiddlewareCtxExtensions<\n [...ReturnType<typeof builtInMiddleware>]\n > &\n ApplyAllMiddlewareCtxExtensions<\n ClientOptionsFromInngest<TClient>[\"middleware\"]\n > &\n ApplyAllMiddlewareCtxExtensions<TFnMiddleware>,\n ) => unknown,\n>(\n client: TClient,\n options: CreateDeferInput<TFnMiddleware, TSchema>,\n handler: THandler,\n): DeferredFunction<TSchema> {\n const { schema, ...rest } = options;\n return new DeferredFunction<TSchema>(\n client,\n rest,\n handler as Handler.Any,\n schema as TSchema,\n );\n}\n"],"mappings":";;;;;AAmBA,MAAM,cAAc;;;;;;;;;;;;;;;;;AAkBpB,IAAa,mBAAb,cAIUA,wCAMR;CACA,AAAS;CACT,CAAUC,4BAAqB,EAAE,MAAM,oBAAoB;CAE3D,YACE,QACA,MACA,SACA,QACA;AAIA,MAAI,YAAY,KAAK,KAAK,GAAG,CAC3B,OAAM,IAAI,MACR,eAAe,KAAK,GAAG,gBAAgB,YAAY,SACpD;AAEH,QACE,QACA;GAAE,GAAG;GAAM,UAAU,EAAE;GAAE,EACzB,QACD;AACD,OAAK,SAAS;;CAGhB,AAAmB,kBACjB,MAC4B;AAC5B,SAAO,CACL;GACE,OAAOC,8BAAe;GACtB,YAAY,mCAAmC,KAAK;GACrD,CACF;;;;;;;;;;;;;;;;;;;;AA2FL,SAAgB,YAiBd,QACA,SACA,SAC2B;CAC3B,MAAM,EAAE,QAAQ,GAAG,SAAS;AAC5B,QAAO,IAAI,iBACT,QACA,MACA,SACA,OACD"}
|
|
@@ -22,7 +22,7 @@ const idDenyRegex = /['\\\n\r]/;
|
|
|
22
22
|
*/
|
|
23
23
|
var DeferredFunction = class extends InngestFunction {
|
|
24
24
|
schema;
|
|
25
|
-
[markerKey] = { kind: "
|
|
25
|
+
[markerKey] = { kind: "DeferredFunction" };
|
|
26
26
|
constructor(client, opts, handler, schema) {
|
|
27
27
|
if (idDenyRegex.test(opts.id)) throw new Error(`invalid id "${opts.id}"; must match ${idDenyRegex.source}`);
|
|
28
28
|
super(client, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeferredFunction.js","names":[],"sources":["../../src/components/DeferredFunction.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { internalEvents } from \"../helpers/consts.ts\";\nimport { type Marker, markerKey } from \"../helpers/marker.ts\";\nimport type {\n ApplyAllMiddlewareCtxExtensions,\n ApplyAllMiddlewareStepExtensions,\n BaseContext,\n FunctionConfig,\n Handler,\n} from \"../types.ts\";\nimport type {\n builtInMiddleware,\n ClientOptionsFromInngest,\n Inngest,\n} from \"./Inngest.ts\";\nimport { InngestFunction } from \"./InngestFunction.ts\";\nimport type { createStepTools } from \"./InngestStepTools.ts\";\nimport type { Middleware } from \"./middleware/index.ts\";\n\nconst idDenyRegex = /['\\\\\\n\\r]/;\n\n/**\n * EXPERIMENTAL: This API is not yet stable and may change in the future without\n * a major version bump.\n *\n * A defer (companion) function created via `createDefer(...)`. Real\n * `InngestFunction` at runtime, but with the trigger pinned to\n * `inngest/deferred.schedule` (see `getConfigTriggers`), `triggers` and\n * `onFailure` disallowed, and the schema carried as a typed instance\n * property so callers of `defer(id, { function, data })` can extract it.\n *\n * Identify a defer function at runtime via `isDeferredFunction(value)` from\n * `helpers/marker.ts`. Prefer that over `instanceof`, which fails across\n * duplicate SDK copies in the same process.\n *\n * @public\n */\nexport class DeferredFunction<\n TSchema extends\n | StandardSchemaV1<Record<string, unknown>>\n | undefined = undefined,\n> extends InngestFunction<\n InngestFunction.Options<[], never>,\n Handler.Any,\n never,\n Inngest.Any,\n []\n> {\n readonly schema: TSchema;\n readonly [markerKey]: Marker = { kind: \"
|
|
1
|
+
{"version":3,"file":"DeferredFunction.js","names":[],"sources":["../../src/components/DeferredFunction.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { internalEvents } from \"../helpers/consts.ts\";\nimport { type Marker, markerKey } from \"../helpers/marker.ts\";\nimport type {\n ApplyAllMiddlewareCtxExtensions,\n ApplyAllMiddlewareStepExtensions,\n BaseContext,\n FunctionConfig,\n Handler,\n} from \"../types.ts\";\nimport type {\n builtInMiddleware,\n ClientOptionsFromInngest,\n Inngest,\n} from \"./Inngest.ts\";\nimport { InngestFunction } from \"./InngestFunction.ts\";\nimport type { createStepTools } from \"./InngestStepTools.ts\";\nimport type { Middleware } from \"./middleware/index.ts\";\n\nconst idDenyRegex = /['\\\\\\n\\r]/;\n\n/**\n * EXPERIMENTAL: This API is not yet stable and may change in the future without\n * a major version bump.\n *\n * A defer (companion) function created via `createDefer(...)`. Real\n * `InngestFunction` at runtime, but with the trigger pinned to\n * `inngest/deferred.schedule` (see `getConfigTriggers`), `triggers` and\n * `onFailure` disallowed, and the schema carried as a typed instance\n * property so callers of `defer(id, { function, data })` can extract it.\n *\n * Identify a defer function at runtime via `isDeferredFunction(value)` from\n * `helpers/marker.ts`. Prefer that over `instanceof`, which fails across\n * duplicate SDK copies in the same process.\n *\n * @public\n */\nexport class DeferredFunction<\n TSchema extends\n | StandardSchemaV1<Record<string, unknown>>\n | undefined = undefined,\n> extends InngestFunction<\n InngestFunction.Options<[], never>,\n Handler.Any,\n never,\n Inngest.Any,\n []\n> {\n readonly schema: TSchema;\n readonly [markerKey]: Marker = { kind: \"DeferredFunction\" };\n\n constructor(\n client: Inngest.Any,\n opts: DeferredFunction.Options,\n handler: Handler.Any,\n schema: TSchema,\n ) {\n // The id is interpolated into a CEL trigger expression\n // (`event.data._inngest.fn_slug == '${fnId}'`). Reject characters that\n // would break the single-quoted string literal.\n if (idDenyRegex.test(opts.id)) {\n throw new Error(\n `invalid id \"${opts.id}\"; must match ${idDenyRegex.source}`,\n );\n }\n super(\n client,\n { ...opts, triggers: [] } as InngestFunction.Options<[], never>,\n handler,\n );\n this.schema = schema;\n }\n\n protected override getConfigTriggers(\n fnId: string,\n ): FunctionConfig[\"triggers\"] {\n return [\n {\n event: internalEvents.DeferredSchedule,\n expression: `event.data._inngest.fn_slug == '${fnId}'`,\n },\n ];\n }\n}\n\n/**\n * @public\n */\nexport namespace DeferredFunction {\n /**\n * Matches any `DeferredFunction` regardless of its schema. Use as the\n * constraint for the `function` argument of `defer()`.\n */\n // biome-ignore lint/suspicious/noExplicitAny: widest schema constraint for inference\n export type Any = DeferredFunction<StandardSchemaV1<any> | undefined>;\n\n /**\n * The user-facing options accepted by `createDefer(client, opts, handler)`.\n * Mirrors `InngestFunction.Options` minus `triggers` (implicit), `onFailure`\n * (not yet supported), and `batchEvents` (each `defer(...)` is its own run).\n */\n export type Options = Omit<\n InngestFunction.Options<[], never>,\n \"triggers\" | \"onFailure\" | \"batchEvents\"\n >;\n}\n\n/**\n * The `event` shape a defer handler receives. With a schema, `data`\n * narrows to its inferred type; without one, it falls back to\n * `Record<string, any>`.\n */\ntype DeferEvent<TSchema> = {\n name: internalEvents.DeferredSchedule;\n data: TSchema extends StandardSchemaV1<\n infer D extends Record<string, unknown>\n >\n ? D\n : // biome-ignore lint/suspicious/noExplicitAny: no schema = any\n Record<string, any>;\n};\n\n/**\n * Base ctx shape for a defer handler: the standard function context\n * (`runId`, `attempt`, `group`, `step` with middleware step extensions)\n * with `event`/`events` pinned to `inngest/deferred.schedule` and the\n * schema-typed payload.\n */\ntype BaseDeferCtx<\n TClient extends Inngest.Any,\n TFnMiddleware extends Middleware.Class[] | undefined,\n TSchema extends StandardSchemaV1<Record<string, unknown>> | undefined,\n> = Omit<BaseContext<TClient>, \"event\" | \"events\" | \"step\"> & {\n event: DeferEvent<TSchema>;\n events: [DeferEvent<TSchema>];\n step: ReturnType<typeof createStepTools<TClient, TFnMiddleware>> &\n ApplyAllMiddlewareStepExtensions<\n ClientOptionsFromInngest<TClient>[\"middleware\"]\n > &\n ApplyAllMiddlewareStepExtensions<TFnMiddleware>;\n};\n\n/**\n * Input type for `createDefer`. Same shape as `DeferredFunction.Options`\n * plus `schema` (the StandardSchema describing `event.data` that flows\n * to caller `defer(id, { function, data })` call sites) and `middleware`.\n */\nexport type CreateDeferInput<\n TFnMiddleware extends Middleware.Class[] | undefined,\n TSchema extends StandardSchemaV1<Record<string, unknown>> | undefined,\n> = DeferredFunction.Options & {\n schema?: TSchema;\n middleware?: TFnMiddleware;\n};\n\n/**\n * EXPERIMENTAL: This API is not yet stable and may change in the future without\n * a major version bump.\n *\n * Create a typed defer function. One `createDefer` call = one Inngest\n * function. Returns a `DeferredFunction<TSchema>` so callers of `defer(id,\n * { function, data })` get the data type inferred from the schema.\n *\n * Mirrors `inngest.createFunction(opts, handler)`, with three differences:\n * the client is the first positional arg, `triggers` is not accepted (the\n * SDK emits an implicit `inngest/deferred.schedule` trigger), and `schema`\n * describes the payload that callers will send via `defer(id, { function,\n * data })`.\n *\n * Pass the result to `serve()` alongside regular functions so the SDK\n * registers it.\n */\nexport function createDefer<\n TClient extends Inngest.Any,\n TSchema extends\n | StandardSchemaV1<Record<string, unknown>>\n | undefined = undefined,\n const TFnMiddleware extends Middleware.Class[] | undefined = undefined,\n THandler extends Handler.Any = (\n ctx: BaseDeferCtx<TClient, TFnMiddleware, TSchema> &\n ApplyAllMiddlewareCtxExtensions<\n [...ReturnType<typeof builtInMiddleware>]\n > &\n ApplyAllMiddlewareCtxExtensions<\n ClientOptionsFromInngest<TClient>[\"middleware\"]\n > &\n ApplyAllMiddlewareCtxExtensions<TFnMiddleware>,\n ) => unknown,\n>(\n client: TClient,\n options: CreateDeferInput<TFnMiddleware, TSchema>,\n handler: THandler,\n): DeferredFunction<TSchema> {\n const { schema, ...rest } = options;\n return new DeferredFunction<TSchema>(\n client,\n rest,\n handler as Handler.Any,\n schema as TSchema,\n );\n}\n"],"mappings":";;;;;AAmBA,MAAM,cAAc;;;;;;;;;;;;;;;;;AAkBpB,IAAa,mBAAb,cAIU,gBAMR;CACA,AAAS;CACT,CAAU,aAAqB,EAAE,MAAM,oBAAoB;CAE3D,YACE,QACA,MACA,SACA,QACA;AAIA,MAAI,YAAY,KAAK,KAAK,GAAG,CAC3B,OAAM,IAAI,MACR,eAAe,KAAK,GAAG,gBAAgB,YAAY,SACpD;AAEH,QACE,QACA;GAAE,GAAG;GAAM,UAAU,EAAE;GAAE,EACzB,QACD;AACD,OAAK,SAAS;;CAGhB,AAAmB,kBACjB,MAC4B;AAC5B,SAAO,CACL;GACE,OAAO,eAAe;GACtB,YAAY,mCAAmC,KAAK;GACrD,CACF;;;;;;;;;;;;;;;;;;;;AA2FL,SAAgB,YAiBd,QACA,SACA,SAC2B;CAC3B,MAAM,EAAE,QAAQ,GAAG,SAAS;AAC5B,QAAO,IAAI,iBACT,QACA,MACA,SACA,OACD"}
|
package/components/Inngest.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { InngestApi } from "../api/api.cjs";
|
|
1
2
|
import { AsArray, IsNever, MaybePromise, SendEventPayload, SimplifyDeep, SingleOrArray } from "../helpers/types.cjs";
|
|
2
3
|
import { Logger, ProxyLogger } from "../middleware/logger.cjs";
|
|
3
|
-
import { InngestApi } from "../api/api.cjs";
|
|
4
4
|
import { Jsonify } from "../helpers/jsonify.cjs";
|
|
5
5
|
import { Middleware } from "./middleware/middleware.cjs";
|
|
6
6
|
import { Realtime } from "./realtime/types.cjs";
|
package/components/Inngest.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { InngestApi } from "../api/api.js";
|
|
1
2
|
import { AsArray, IsNever, MaybePromise, SendEventPayload, SimplifyDeep, SingleOrArray } from "../helpers/types.js";
|
|
2
3
|
import { Logger, ProxyLogger } from "../middleware/logger.js";
|
|
3
|
-
import { InngestApi } from "../api/api.js";
|
|
4
4
|
import { Jsonify } from "../helpers/jsonify.js";
|
|
5
5
|
import { Middleware } from "./middleware/middleware.js";
|
|
6
6
|
import { Realtime } from "./realtime/types.js";
|