inngest 4.14.0 → 4.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -0
- package/api/api.cjs.map +1 -1
- package/api/api.js.map +1 -1
- package/components/Inngest.cjs +37 -1
- package/components/Inngest.cjs.map +1 -1
- package/components/Inngest.d.cts +26 -6
- package/components/Inngest.d.cts.map +1 -1
- package/components/Inngest.d.ts +26 -6
- package/components/Inngest.d.ts.map +1 -1
- package/components/Inngest.js +38 -2
- package/components/Inngest.js.map +1 -1
- package/components/InngestCommHandler.cjs +6 -6
- 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 +6 -6
- package/components/InngestCommHandler.js.map +1 -1
- package/components/InngestFunction.cjs +1 -1
- package/components/InngestFunction.cjs.map +1 -1
- package/components/InngestFunction.js +1 -1
- package/components/InngestFunction.js.map +1 -1
- package/components/InngestFunctionReference.d.cts +1 -1
- package/components/InngestFunctionReference.d.ts +1 -1
- package/components/InngestGroupTools.d.cts +1 -1
- package/components/InngestGroupTools.d.ts +1 -1
- package/components/InngestStepTools.cjs +4 -4
- package/components/InngestStepTools.cjs.map +1 -1
- package/components/InngestStepTools.d.cts +16 -5
- package/components/InngestStepTools.d.cts.map +1 -1
- package/components/InngestStepTools.d.ts +16 -5
- package/components/InngestStepTools.d.ts.map +1 -1
- package/components/InngestStepTools.js +4 -4
- package/components/InngestStepTools.js.map +1 -1
- package/components/connect/config.cjs +3 -1
- package/components/connect/config.cjs.map +1 -1
- package/components/connect/config.js +3 -1
- package/components/connect/config.js.map +1 -1
- package/components/connect/strategies/core/requestProcessor.cjs +8 -13
- package/components/connect/strategies/core/requestProcessor.cjs.map +1 -1
- package/components/connect/strategies/core/requestProcessor.js +8 -13
- package/components/connect/strategies/core/requestProcessor.js.map +1 -1
- package/components/connect/strategies/core/types.cjs.map +1 -1
- package/components/connect/strategies/core/types.js.map +1 -1
- package/components/execution/als.cjs +10 -0
- package/components/execution/als.cjs.map +1 -1
- package/components/execution/als.js +10 -1
- package/components/execution/als.js.map +1 -1
- package/components/execution/engine.cjs +51 -46
- package/components/execution/engine.cjs.map +1 -1
- package/components/execution/engine.d.cts +1 -1
- package/components/execution/engine.d.cts.map +1 -1
- package/components/execution/engine.d.ts +1 -1
- package/components/execution/engine.d.ts.map +1 -1
- package/components/execution/engine.js +52 -47
- package/components/execution/engine.js.map +1 -1
- package/components/execution/otel/metadataProcessor.cjs +12 -68
- package/components/execution/otel/metadataProcessor.cjs.map +1 -1
- package/components/execution/otel/metadataProcessor.js +12 -68
- package/components/execution/otel/metadataProcessor.js.map +1 -1
- package/components/execution/otel/middleware.cjs +26 -4
- package/components/execution/otel/middleware.cjs.map +1 -1
- package/components/execution/otel/middleware.d.cts +8 -9
- package/components/execution/otel/middleware.d.cts.map +1 -1
- package/components/execution/otel/middleware.d.ts +8 -9
- package/components/execution/otel/middleware.d.ts.map +1 -1
- package/components/execution/otel/middleware.js +26 -4
- package/components/execution/otel/middleware.js.map +1 -1
- package/components/execution/otel/provider.cjs +111 -0
- package/components/execution/otel/provider.cjs.map +1 -0
- package/components/execution/otel/provider.js +110 -0
- package/components/execution/otel/provider.js.map +1 -0
- package/components/execution/otel/util.cjs +45 -47
- package/components/execution/otel/util.cjs.map +1 -1
- package/components/execution/otel/util.d.cts.map +1 -1
- package/components/execution/otel/util.d.ts.map +1 -1
- package/components/execution/otel/util.js +45 -47
- package/components/execution/otel/util.js.map +1 -1
- package/components/middleware/manager.cjs +58 -16
- package/components/middleware/manager.cjs.map +1 -1
- package/components/middleware/manager.js +58 -16
- package/components/middleware/manager.js.map +1 -1
- package/components/realtime/types.d.cts +7 -7
- package/components/realtime/types.d.cts.map +1 -1
- package/components/realtime/types.d.ts +7 -7
- package/components/realtime/types.d.ts.map +1 -1
- package/components/sandbox/client.cjs +524 -0
- package/components/sandbox/client.cjs.map +1 -0
- package/components/sandbox/client.js +521 -0
- package/components/sandbox/client.js.map +1 -0
- package/components/sandbox/durable.cjs +371 -0
- package/components/sandbox/durable.cjs.map +1 -0
- package/components/sandbox/durable.js +370 -0
- package/components/sandbox/durable.js.map +1 -0
- package/components/sandbox/middleware.cjs +85 -0
- package/components/sandbox/middleware.cjs.map +1 -0
- package/components/sandbox/middleware.d.cts +44 -0
- package/components/sandbox/middleware.d.cts.map +1 -0
- package/components/sandbox/middleware.d.ts +44 -0
- package/components/sandbox/middleware.d.ts.map +1 -0
- package/components/sandbox/middleware.js +85 -0
- package/components/sandbox/middleware.js.map +1 -0
- package/components/sandbox/protocol.cjs +365 -0
- package/components/sandbox/protocol.cjs.map +1 -0
- package/components/sandbox/protocol.js +359 -0
- package/components/sandbox/protocol.js.map +1 -0
- package/components/sandbox/types.cjs +44 -0
- package/components/sandbox/types.cjs.map +1 -0
- package/components/sandbox/types.d.cts +300 -0
- package/components/sandbox/types.d.cts.map +1 -0
- package/components/sandbox/types.d.ts +300 -0
- package/components/sandbox/types.d.ts.map +1 -0
- package/components/sandbox/types.js +41 -0
- package/components/sandbox/types.js.map +1 -0
- package/components/sandbox/validation.cjs +352 -0
- package/components/sandbox/validation.cjs.map +1 -0
- package/components/sandbox/validation.js +329 -0
- package/components/sandbox/validation.js.map +1 -0
- package/components/sdkFeatureObservations.cjs +121 -0
- package/components/sdkFeatureObservations.cjs.map +1 -0
- package/components/sdkFeatureObservations.d.cts +19 -0
- package/components/sdkFeatureObservations.d.cts.map +1 -0
- package/components/sdkFeatureObservations.d.ts +19 -0
- package/components/sdkFeatureObservations.d.ts.map +1 -0
- package/components/sdkFeatureObservations.js +117 -0
- package/components/sdkFeatureObservations.js.map +1 -0
- package/experimental.cjs +7 -2
- package/experimental.d.cts +3 -1
- package/experimental.d.ts +3 -1
- package/experimental.js +3 -1
- package/helpers/strings.cjs +7 -2
- package/helpers/strings.cjs.map +1 -1
- package/helpers/strings.d.cts.map +1 -1
- package/helpers/strings.d.ts.map +1 -1
- package/helpers/strings.js +7 -2
- package/helpers/strings.js.map +1 -1
- package/index.d.cts +13 -13
- package/index.d.ts +13 -13
- package/internals.d.cts +1 -1
- package/internals.d.ts +1 -1
- package/package.json +2 -2
- package/proto/google/protobuf/timestamp.cjs.map +1 -1
- package/proto/google/protobuf/timestamp.js.map +1 -1
- package/proto/src/components/connect/protobuf/connect.cjs +12 -2
- package/proto/src/components/connect/protobuf/connect.cjs.map +1 -1
- package/proto/src/components/connect/protobuf/connect.js +12 -2
- package/proto/src/components/connect/protobuf/connect.js.map +1 -1
- package/proto/src/components/sdkFeatureObservations/protobuf/feature_observations.cjs +696 -0
- package/proto/src/components/sdkFeatureObservations/protobuf/feature_observations.cjs.map +1 -0
- package/proto/src/components/sdkFeatureObservations/protobuf/feature_observations.d.cts +112 -0
- package/proto/src/components/sdkFeatureObservations/protobuf/feature_observations.d.cts.map +1 -0
- package/proto/src/components/sdkFeatureObservations/protobuf/feature_observations.d.ts +112 -0
- package/proto/src/components/sdkFeatureObservations/protobuf/feature_observations.d.ts.map +1 -0
- package/proto/src/components/sdkFeatureObservations/protobuf/feature_observations.js +687 -0
- package/proto/src/components/sdkFeatureObservations/protobuf/feature_observations.js.map +1 -0
- package/realtime.d.cts +1 -1
- package/realtime.d.ts +1 -1
- package/types.cjs.map +1 -1
- package/types.d.cts +31 -14
- package/types.d.cts.map +1 -1
- package/types.d.ts +31 -14
- package/types.d.ts.map +1 -1
- package/types.js.map +1 -1
- package/version.cjs +1 -1
- package/version.cjs.map +1 -1
- package/version.d.cts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.js.map +1 -1
- package/api/api.d.cts +0 -174
- package/api/api.d.cts.map +0 -1
- package/api/api.d.ts +0 -174
- package/api/api.d.ts.map +0 -1
- package/api/schema.d.cts +0 -70
- package/api/schema.d.cts.map +0 -1
- package/api/schema.d.ts +0 -70
- package/api/schema.d.ts.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# inngest
|
|
2
2
|
|
|
3
|
+
## 4.16.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#1671](https://github.com/inngest/inngest-js/pull/1671) [`3608c52d`](https://github.com/inngest/inngest-js/commit/3608c52d532d04f05a78138b25a4a6d6b1ba3f9e) Thanks [@amh4r](https://github.com/amh4r)! - Add SDK feature observations
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- [#1674](https://github.com/inngest/inngest-js/pull/1674) [`6b0ae370`](https://github.com/inngest/inngest-js/commit/6b0ae370268953627ea3803cc612dfa6171b01c6) Thanks [@Linell](https://github.com/Linell)! - Fix `TS2742` errors in projects that use `declaration` or `composite` `true` by exporting `SendSignalResponse` appropriately.
|
|
12
|
+
|
|
13
|
+
- [#1658](https://github.com/inngest/inngest-js/pull/1658) [`edcb6536`](https://github.com/inngest/inngest-js/commit/edcb6536e916f0afdacc043b87f4ab87c8466573) Thanks [@amh4r](https://github.com/amh4r)! - Fix wrapStep middleware hook sometimes skipped for parallel steps
|
|
14
|
+
|
|
15
|
+
## 4.15.0
|
|
16
|
+
|
|
17
|
+
### Minor Changes
|
|
18
|
+
|
|
19
|
+
- [#1667](https://github.com/inngest/inngest-js/pull/1667) [`961d2807`](https://github.com/inngest/inngest-js/commit/961d28075694c460372ba569caa738e291d1269c) Thanks [@jakobevangelista](https://github.com/jakobevangelista)! - Allow sandbox Create to configure environment variables inherited by commands and managed processes.
|
|
20
|
+
|
|
21
|
+
- [#1654](https://github.com/inngest/inngest-js/pull/1654) [`23ddbc2e`](https://github.com/inngest/inngest-js/commit/23ddbc2e9caaa195f5fe20d95261c7298afd1b5e) Thanks [@jakobevangelista](https://github.com/jakobevangelista)! - Add experimental sandbox APIs, including the direct `inngest.sandboxes` client and the opt-in durable `step.sandbox` surface enabled by `sandboxMiddleware()`.
|
|
22
|
+
|
|
23
|
+
### Patch Changes
|
|
24
|
+
|
|
25
|
+
- [#1663](https://github.com/inngest/inngest-js/pull/1663) [`0bec14ee`](https://github.com/inngest/inngest-js/commit/0bec14eecf31ee74974190bb5675880a96c7f501) Thanks [@mar-inngest](https://github.com/mar-inngest)! - Prevent Connect lease renewals from using a draining or replaced connection.
|
|
26
|
+
|
|
27
|
+
- [#1665](https://github.com/inngest/inngest-js/pull/1665) [`3f25b191`](https://github.com/inngest/inngest-js/commit/3f25b19199cd6336ecf5b79cdf594d884be56ee8) Thanks [@Linell](https://github.com/Linell)! - Sub-second durations no longer get dropped. `step.sleep("id", 500)` used to resolve immediately; it now rounds up and sleeps a full second, the minimum resolution of a durable wait. The same rounding applies to `waitForEvent`, `invoke`, `waitForSignal`, and `cancelOn` timeouts.
|
|
28
|
+
|
|
3
29
|
## 4.14.0
|
|
4
30
|
|
|
5
31
|
### Minor Changes
|
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} 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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"}
|
|
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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"}
|
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} 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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"}
|
|
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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"}
|
package/components/Inngest.cjs
CHANGED
|
@@ -14,10 +14,12 @@ const require_metadataProcessor = require('./execution/otel/metadataProcessor.cj
|
|
|
14
14
|
const require_InngestFunction = require('./InngestFunction.cjs');
|
|
15
15
|
const require_middleware = require('./middleware/middleware.cjs');
|
|
16
16
|
const require_InngestMetadata = require('./InngestMetadata.cjs');
|
|
17
|
+
const require_client = require('./sandbox/client.cjs');
|
|
17
18
|
const require_InngestScore = require('./InngestScore.cjs');
|
|
18
19
|
const require_InngestStepTools = require('./InngestStepTools.cjs');
|
|
19
20
|
const require_utils = require('./middleware/utils.cjs');
|
|
20
21
|
const require_index = require('./realtime/subscribe/index.cjs');
|
|
22
|
+
const require_sdkFeatureObservations = require('./sdkFeatureObservations.cjs');
|
|
21
23
|
const require_typeHelpers = require('./triggers/typeHelpers.cjs');
|
|
22
24
|
|
|
23
25
|
//#region src/components/Inngest.ts
|
|
@@ -56,6 +58,16 @@ var Inngest = class Inngest {
|
|
|
56
58
|
*/
|
|
57
59
|
id;
|
|
58
60
|
/**
|
|
61
|
+
* EXPERIMENTAL: This API is not yet stable and may change in the future
|
|
62
|
+
* without a major version bump.
|
|
63
|
+
*
|
|
64
|
+
* Direct, non-durable access to sandbox REST APIs.
|
|
65
|
+
*
|
|
66
|
+
* Use `step.sandbox` inside an Inngest function to run the operation as a
|
|
67
|
+
* durable step.
|
|
68
|
+
*/
|
|
69
|
+
sandboxes;
|
|
70
|
+
/**
|
|
59
71
|
* Stores the options so we can remember explicit settings the user has
|
|
60
72
|
* provided.
|
|
61
73
|
*/
|
|
@@ -77,6 +89,12 @@ var Inngest = class Inngest {
|
|
|
77
89
|
* @internal
|
|
78
90
|
*/
|
|
79
91
|
[internalLoggerSymbol];
|
|
92
|
+
/**
|
|
93
|
+
* Latest feature observations collected by SDK setup paths.
|
|
94
|
+
*
|
|
95
|
+
* @internal
|
|
96
|
+
*/
|
|
97
|
+
[require_sdkFeatureObservations.featureObservationStateSymbol];
|
|
80
98
|
localFns = [];
|
|
81
99
|
/**
|
|
82
100
|
* Middleware instances that provide simpler hooks.
|
|
@@ -145,6 +163,17 @@ var Inngest = class Inngest {
|
|
|
145
163
|
get eventKey() {
|
|
146
164
|
return this.options.eventKey || this._env[require_consts.envKeys.InngestEventKey] || void 0;
|
|
147
165
|
}
|
|
166
|
+
hasEventApiOriginOverride() {
|
|
167
|
+
return Boolean(this.options.baseUrl || this._env[require_consts.envKeys.InngestEventApiBaseUrl] || this._env[require_consts.envKeys.InngestBaseUrl]);
|
|
168
|
+
}
|
|
169
|
+
[require_sdkFeatureObservations.featureObservationsSymbol]() {
|
|
170
|
+
return require_sdkFeatureObservations.collectFeatureObservations({
|
|
171
|
+
state: this[require_sdkFeatureObservations.featureObservationStateSymbol],
|
|
172
|
+
mode: this.mode,
|
|
173
|
+
eventKeyConfigured: this.eventKeySet(),
|
|
174
|
+
eventApiOriginOverrideConfigured: this.hasEventApiOriginOverride()
|
|
175
|
+
});
|
|
176
|
+
}
|
|
148
177
|
get fetch() {
|
|
149
178
|
if (!this._cachedFetch) this._cachedFetch = this._userProvidedFetch ? require_env.getFetch(this[internalLoggerSymbol], this._userProvidedFetch) : require_env.getFetch(this[internalLoggerSymbol], globalThis.fetch);
|
|
150
179
|
return this._cachedFetch;
|
|
@@ -214,6 +243,7 @@ var Inngest = class Inngest {
|
|
|
214
243
|
if (!id) throw new Error("An `id` must be passed to create an Inngest instance.");
|
|
215
244
|
this.id = id;
|
|
216
245
|
this.aiMetadataEnabled = this.options.aiMetadata !== false;
|
|
246
|
+
this[require_sdkFeatureObservations.featureObservationStateSymbol] = require_sdkFeatureObservations.sdkFeatureObservations.createState({ aiMetadataEnabled: this.aiMetadataEnabled });
|
|
217
247
|
this._env = require_env.protectEnv({ ...require_env.getProcessEnv() });
|
|
218
248
|
this._userProvidedFetch = options.fetch;
|
|
219
249
|
this.inngestApi = new require_api.InngestApi({
|
|
@@ -224,13 +254,19 @@ var Inngest = class Inngest {
|
|
|
224
254
|
});
|
|
225
255
|
this._logger = logger ?? new require_logger.ConsoleLogger();
|
|
226
256
|
this[internalLoggerSymbol] = this.options.internalLogger ?? this._logger;
|
|
257
|
+
this.sandboxes = require_client.createSandboxClient({
|
|
258
|
+
baseUrl: () => this.apiBaseUrl,
|
|
259
|
+
apiKey: () => require_strings.hashSigningKey(this.signingKey),
|
|
260
|
+
headers: () => this.headers,
|
|
261
|
+
fetch: () => this.fetch
|
|
262
|
+
});
|
|
227
263
|
if (this.options.optimizeParallelism === false) require_log.warnOnce(this[internalLoggerSymbol], `optimize-parallelism-deprecated:${this.id}`, "`optimizeParallelism: false` is deprecated; use `group.parallel({ mode: \"race\" }, ...)` for race semantics instead");
|
|
228
264
|
this.middleware = [...builtInMiddleware(this._logger), ...middleware ?? []];
|
|
229
265
|
for (const mw of this.middleware) mw.onRegister?.({
|
|
230
266
|
client: this,
|
|
231
267
|
fn: null
|
|
232
268
|
});
|
|
233
|
-
if (this.aiMetadataEnabled) require_metadataProcessor.metadataSpanProcessor.attach();
|
|
269
|
+
if (this.aiMetadataEnabled) require_sdkFeatureObservations.sdkFeatureObservations.aiMetadata.replaceSetup(this, require_metadataProcessor.metadataSpanProcessor.attach());
|
|
234
270
|
this._appVersion = appVersion;
|
|
235
271
|
}
|
|
236
272
|
/**
|