inngest 4.18.1 → 4.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/api/api.cjs +22 -3
  3. package/api/api.cjs.map +1 -1
  4. package/api/api.js +22 -3
  5. package/api/api.js.map +1 -1
  6. package/components/Inngest.cjs +1 -0
  7. package/components/Inngest.cjs.map +1 -1
  8. package/components/Inngest.d.cts.map +1 -1
  9. package/components/Inngest.d.ts.map +1 -1
  10. package/components/Inngest.js +1 -0
  11. package/components/Inngest.js.map +1 -1
  12. package/components/execution/engine.cjs +7 -7
  13. package/components/execution/engine.cjs.map +1 -1
  14. package/components/execution/engine.d.cts.map +1 -1
  15. package/components/execution/engine.d.ts.map +1 -1
  16. package/components/execution/engine.js +8 -8
  17. package/components/execution/engine.js.map +1 -1
  18. package/components/realtime/types.d.cts +3 -3
  19. package/components/realtime/types.d.cts.map +1 -1
  20. package/components/realtime/types.d.ts +3 -3
  21. package/components/realtime/types.d.ts.map +1 -1
  22. package/components/sandbox/client.cjs +277 -45
  23. package/components/sandbox/client.cjs.map +1 -1
  24. package/components/sandbox/client.js +272 -47
  25. package/components/sandbox/client.js.map +1 -1
  26. package/components/sandbox/durable.cjs +164 -7
  27. package/components/sandbox/durable.cjs.map +1 -1
  28. package/components/sandbox/durable.js +166 -9
  29. package/components/sandbox/durable.js.map +1 -1
  30. package/components/sandbox/middleware.cjs +1 -0
  31. package/components/sandbox/middleware.cjs.map +1 -1
  32. package/components/sandbox/middleware.d.cts.map +1 -1
  33. package/components/sandbox/middleware.d.ts.map +1 -1
  34. package/components/sandbox/middleware.js +1 -0
  35. package/components/sandbox/middleware.js.map +1 -1
  36. package/components/sandbox/protocol.cjs +101 -5
  37. package/components/sandbox/protocol.cjs.map +1 -1
  38. package/components/sandbox/protocol.js +102 -6
  39. package/components/sandbox/protocol.js.map +1 -1
  40. package/components/sandbox/types.cjs +2 -0
  41. package/components/sandbox/types.cjs.map +1 -1
  42. package/components/sandbox/types.d.cts +140 -19
  43. package/components/sandbox/types.d.cts.map +1 -1
  44. package/components/sandbox/types.d.ts +140 -19
  45. package/components/sandbox/types.d.ts.map +1 -1
  46. package/components/sandbox/types.js +2 -0
  47. package/components/sandbox/types.js.map +1 -1
  48. package/components/sandbox/validation.cjs +101 -14
  49. package/components/sandbox/validation.cjs.map +1 -1
  50. package/components/sandbox/validation.js +96 -15
  51. package/components/sandbox/validation.js.map +1 -1
  52. package/experimental.d.cts +2 -2
  53. package/experimental.d.ts +2 -2
  54. package/helpers/sessions.cjs +10 -2
  55. package/helpers/sessions.cjs.map +1 -1
  56. package/helpers/sessions.js +10 -3
  57. package/helpers/sessions.js.map +1 -1
  58. package/package.json +1 -1
  59. package/types.d.cts +23 -23
  60. package/types.d.cts.map +1 -1
  61. package/types.d.ts +23 -23
  62. package/types.d.ts.map +1 -1
  63. package/version.cjs +1 -1
  64. package/version.cjs.map +1 -1
  65. package/version.d.cts +1 -1
  66. package/version.d.ts +1 -1
  67. package/version.js +1 -1
  68. package/version.js.map +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,36 @@
1
1
  # inngest
2
2
 
3
+ ## 4.20.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#1672](https://github.com/inngest/inngest-js/pull/1672) [`37813011`](https://github.com/inngest/inngest-js/commit/378130115bfa80f0b8d9e07d1acef0777114f904) Thanks [@jakobevangelista](https://github.com/jakobevangelista)! - Add sandbox snapshot create, list, get, wait, delete, and clone APIs to both the direct client and `step.sandbox`.
8
+
9
+ - [#1683](https://github.com/inngest/inngest-js/pull/1683) [`3b5ddba5`](https://github.com/inngest/inngest-js/commit/3b5ddba53c645d8ad5539a5e781ec3fc1bb876b0) Thanks [@jakobevangelista](https://github.com/jakobevangelista)! - Add sandbox pause and resume APIs to both the direct client and `step.sandbox`.
10
+
11
+ ## 4.19.0
12
+
13
+ ### Minor Changes
14
+
15
+ - [#1701](https://github.com/inngest/inngest-js/pull/1701) [`f4fa1eb8`](https://github.com/inngest/inngest-js/commit/f4fa1eb84622224eb92feaaa3b6e97f2f79205ee) Thanks [@jakobevangelista](https://github.com/jakobevangelista)! - Wait for newly created sandboxes to reach RUNNING by default, with `runningTimeout: false` as an explicit opt-out.
16
+
17
+ ### Patch Changes
18
+
19
+ - [#1713](https://github.com/inngest/inngest-js/pull/1713) [`f7c49003`](https://github.com/inngest/inngest-js/commit/f7c490030838b66a3000917f76b2ad3b03f61a26) Thanks [@KiKoS0](https://github.com/KiKoS0)! - Route signing-key API requests to the correct branch environment and include SDK identification headers.
20
+
21
+ - [#1700](https://github.com/inngest/inngest-js/pull/1700) [`8f5dceb4`](https://github.com/inngest/inngest-js/commit/8f5dceb45ffaad28e1193e3d32a5eb6a07f7e79e) Thanks [@jakobevangelista](https://github.com/jakobevangelista)! - Return captured sandbox command stdout and stderr as UTF-8 strings.
22
+
23
+ - [#1705](https://github.com/inngest/inngest-js/pull/1705) [`28603273`](https://github.com/inngest/inngest-js/commit/2860327336e9f8fb76651554e27f034eb1d08041) Thanks [@jakobevangelista](https://github.com/jakobevangelista)! - Allow sandbox commands to use executable names and relative paths.
24
+
25
+ - [#1684](https://github.com/inngest/inngest-js/pull/1684) [`dde88e4d`](https://github.com/inngest/inngest-js/commit/dde88e4d8897bcbc8e4521fccf81dd8f8f3e9468) Thanks [@jakobevangelista](https://github.com/jakobevangelista)! - Support shell command strings in the experimental sandbox command and managed process APIs.
26
+
27
+ - [#1693](https://github.com/inngest/inngest-js/pull/1693) [`a2cd5b48`](https://github.com/inngest/inngest-js/commit/a2cd5b48f724ea2566047a2916a072dc5e7f3049) Thanks [@scottnuma](https://github.com/scottnuma)! - Validate propagated sessions with step.invoke and defer
28
+
29
+ - [#1712](https://github.com/inngest/inngest-js/pull/1712) [`a9975874`](https://github.com/inngest/inngest-js/commit/a9975874dc9e43139996e74110c5cef9b0580767) Thanks [@jakobevangelista](https://github.com/jakobevangelista)! - Export `SandboxCommand` from `inngest/experimental`.
30
+
31
+ - Updated dependencies [[`abc4a63f`](https://github.com/inngest/inngest-js/commit/abc4a63fb8a5d8d1599ee7a3afbeb2b82d9cc875)]:
32
+ - @inngest/ai@0.1.8
33
+
3
34
  ## 4.18.1
4
35
 
5
36
  ### Patch Changes
package/api/api.cjs CHANGED
@@ -1,4 +1,6 @@
1
1
  const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
+ const require_consts = require('../helpers/consts.cjs');
3
+ const require_version = require('../version.cjs');
2
4
  const require_errors = require('../helpers/errors.cjs');
3
5
  const require_types = require('../types.cjs');
4
6
  const require_schema = require('./schema.cjs');
@@ -33,11 +35,13 @@ var InngestApi = class {
33
35
  _signingKey;
34
36
  _signingKeyFallback;
35
37
  _apiBaseUrl;
38
+ _environment;
36
39
  _fetch;
37
- constructor({ baseUrl, signingKey, signingKeyFallback, fetch }) {
40
+ constructor({ baseUrl, signingKey, signingKeyFallback, environment, fetch }) {
38
41
  this._apiBaseUrl = baseUrl;
39
42
  this._signingKey = signingKey;
40
43
  this._signingKeyFallback = signingKeyFallback;
44
+ this._environment = environment;
41
45
  this._fetch = fetch;
42
46
  }
43
47
  get apiBaseUrl() {
@@ -49,6 +53,13 @@ var InngestApi = class {
49
53
  get signingKeyFallback() {
50
54
  return this._signingKeyFallback();
51
55
  }
56
+ get apiHeaders() {
57
+ const environment = this._environment();
58
+ return {
59
+ [require_consts.headerKeys.SdkVersion]: `inngest-js:v${require_version.version}`,
60
+ ...environment ? { [require_consts.headerKeys.Environment]: environment } : {}
61
+ };
62
+ }
52
63
  get hashedKey() {
53
64
  return require_strings.hashSigningKey(this.signingKey);
54
65
  }
@@ -71,6 +82,7 @@ var InngestApi = class {
71
82
  ...options,
72
83
  headers: {
73
84
  "Content-Type": "application/json",
85
+ ...this.apiHeaders,
74
86
  ...options?.headers
75
87
  }
76
88
  }
@@ -143,6 +155,7 @@ var InngestApi = class {
143
155
  body: JSON.stringify(body),
144
156
  headers: {
145
157
  "Content-Type": "application/json",
158
+ ...this.apiHeaders,
146
159
  ...options?.headers
147
160
  }
148
161
  }
@@ -194,7 +207,10 @@ var InngestApi = class {
194
207
  options: {
195
208
  method: "POST",
196
209
  body: JSON.stringify(body),
197
- headers: { "Content-Type": "application/json" }
210
+ headers: {
211
+ "Content-Type": "application/json",
212
+ ...this.apiHeaders
213
+ }
198
214
  }
199
215
  }).then(async (res) => {
200
216
  if (!res.ok) throw new Error(`Failed to get subscription token: ${res.status} ${res.statusText} - ${await res.text()}`);
@@ -319,7 +335,10 @@ var InngestApi = class {
319
335
  options: {
320
336
  method: "POST",
321
337
  body: args.body,
322
- headers: { "Content-Type": "application/octet-stream" },
338
+ headers: {
339
+ "Content-Type": "application/octet-stream",
340
+ ...this.apiHeaders
341
+ },
323
342
  duplex: "half"
324
343
  }
325
344
  });
package/api/api.cjs.map CHANGED
@@ -1 +1 @@
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 type SendSignalResponse,\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\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<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<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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"}
1
+ {"version":3,"file":"api.cjs","names":["markerKey","z","headerKeys","version","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, headerKeys } 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 type SendSignalResponse,\n} from \"../types.ts\";\nimport { version } from \"../version.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 environment: () => string | null;\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\nexport class InngestApi {\n private readonly _signingKey: () => string | undefined;\n private readonly _signingKeyFallback: () => string | undefined;\n private readonly _apiBaseUrl: () => string | undefined;\n private readonly _environment: () => string | null;\n private readonly _fetch: () => FetchT;\n\n constructor({\n baseUrl,\n signingKey,\n signingKeyFallback,\n environment,\n fetch,\n }: InngestApi.Options) {\n this._apiBaseUrl = baseUrl;\n this._signingKey = signingKey;\n this._signingKeyFallback = signingKeyFallback;\n this._environment = environment;\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 apiHeaders(): Record<string, string> {\n const environment = this._environment();\n return {\n [headerKeys.SdkVersion]: `inngest-js:v${version}`,\n ...(environment ? { [headerKeys.Environment]: environment } : {}),\n };\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 ...this.apiHeaders,\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<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 ...this.apiHeaders,\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<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 ...this.apiHeaders,\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 ...this.apiHeaders,\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.js CHANGED
@@ -1,3 +1,5 @@
1
+ import { headerKeys } from "../helpers/consts.js";
2
+ import { version } from "../version.js";
1
3
  import { getErrorMessage } from "../helpers/errors.js";
2
4
  import { err, ok } from "../types.js";
3
5
  import { batchSchema, errorSchema, stepSchema } from "./schema.js";
@@ -32,11 +34,13 @@ var InngestApi = class {
32
34
  _signingKey;
33
35
  _signingKeyFallback;
34
36
  _apiBaseUrl;
37
+ _environment;
35
38
  _fetch;
36
- constructor({ baseUrl, signingKey, signingKeyFallback, fetch }) {
39
+ constructor({ baseUrl, signingKey, signingKeyFallback, environment, fetch }) {
37
40
  this._apiBaseUrl = baseUrl;
38
41
  this._signingKey = signingKey;
39
42
  this._signingKeyFallback = signingKeyFallback;
43
+ this._environment = environment;
40
44
  this._fetch = fetch;
41
45
  }
42
46
  get apiBaseUrl() {
@@ -48,6 +52,13 @@ var InngestApi = class {
48
52
  get signingKeyFallback() {
49
53
  return this._signingKeyFallback();
50
54
  }
55
+ get apiHeaders() {
56
+ const environment = this._environment();
57
+ return {
58
+ [headerKeys.SdkVersion]: `inngest-js:v${version}`,
59
+ ...environment ? { [headerKeys.Environment]: environment } : {}
60
+ };
61
+ }
51
62
  get hashedKey() {
52
63
  return hashSigningKey(this.signingKey);
53
64
  }
@@ -70,6 +81,7 @@ var InngestApi = class {
70
81
  ...options,
71
82
  headers: {
72
83
  "Content-Type": "application/json",
84
+ ...this.apiHeaders,
73
85
  ...options?.headers
74
86
  }
75
87
  }
@@ -142,6 +154,7 @@ var InngestApi = class {
142
154
  body: JSON.stringify(body),
143
155
  headers: {
144
156
  "Content-Type": "application/json",
157
+ ...this.apiHeaders,
145
158
  ...options?.headers
146
159
  }
147
160
  }
@@ -193,7 +206,10 @@ var InngestApi = class {
193
206
  options: {
194
207
  method: "POST",
195
208
  body: JSON.stringify(body),
196
- headers: { "Content-Type": "application/json" }
209
+ headers: {
210
+ "Content-Type": "application/json",
211
+ ...this.apiHeaders
212
+ }
197
213
  }
198
214
  }).then(async (res) => {
199
215
  if (!res.ok) throw new Error(`Failed to get subscription token: ${res.status} ${res.statusText} - ${await res.text()}`);
@@ -318,7 +334,10 @@ var InngestApi = class {
318
334
  options: {
319
335
  method: "POST",
320
336
  body: args.body,
321
- headers: { "Content-Type": "application/octet-stream" },
337
+ headers: {
338
+ "Content-Type": "application/octet-stream",
339
+ ...this.apiHeaders
340
+ },
322
341
  duplex: "half"
323
342
  }
324
343
  });
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 { 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 type SendSignalResponse,\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\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<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<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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"}
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, headerKeys } 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 type SendSignalResponse,\n} from \"../types.ts\";\nimport { version } from \"../version.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 environment: () => string | null;\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\nexport class InngestApi {\n private readonly _signingKey: () => string | undefined;\n private readonly _signingKeyFallback: () => string | undefined;\n private readonly _apiBaseUrl: () => string | undefined;\n private readonly _environment: () => string | null;\n private readonly _fetch: () => FetchT;\n\n constructor({\n baseUrl,\n signingKey,\n signingKeyFallback,\n environment,\n fetch,\n }: InngestApi.Options) {\n this._apiBaseUrl = baseUrl;\n this._signingKey = signingKey;\n this._signingKeyFallback = signingKeyFallback;\n this._environment = environment;\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 apiHeaders(): Record<string, string> {\n const environment = this._environment();\n return {\n [headerKeys.SdkVersion]: `inngest-js:v${version}`,\n ...(environment ? { [headerKeys.Environment]: environment } : {}),\n };\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 ...this.apiHeaders,\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<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 ...this.apiHeaders,\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<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 ...this.apiHeaders,\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 ...this.apiHeaders,\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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"}
@@ -250,6 +250,7 @@ var Inngest = class Inngest {
250
250
  baseUrl: () => this.apiBaseUrl,
251
251
  signingKey: () => this.signingKey,
252
252
  signingKeyFallback: () => this.signingKeyFallback,
253
+ environment: () => this.env,
253
254
  fetch: () => this.fetch
254
255
  });
255
256
  this._logger = logger ?? new require_logger.ConsoleLogger();