inngest 4.5.1 → 4.6.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 +12 -0
- package/api/schema.d.cts +2 -2
- package/api/schema.d.cts.map +1 -1
- package/api/schema.d.ts +2 -2
- package/api/schema.d.ts.map +1 -1
- package/components/Inngest.cjs +3 -0
- package/components/Inngest.cjs.map +1 -1
- package/components/Inngest.d.cts.map +1 -1
- package/components/Inngest.d.ts.map +1 -1
- package/components/Inngest.js +4 -1
- package/components/Inngest.js.map +1 -1
- package/components/InngestFunction.cjs +3 -0
- package/components/InngestFunction.cjs.map +1 -1
- package/components/InngestFunction.d.cts +2 -0
- package/components/InngestFunction.d.cts.map +1 -1
- package/components/InngestFunction.d.ts +2 -0
- package/components/InngestFunction.d.ts.map +1 -1
- package/components/InngestFunction.js +3 -0
- package/components/InngestFunction.js.map +1 -1
- package/components/InngestGroupTools.cjs +2 -2
- package/components/InngestGroupTools.cjs.map +1 -1
- package/components/InngestGroupTools.js +2 -2
- package/components/InngestGroupTools.js.map +1 -1
- package/components/InngestMetadata.cjs.map +1 -1
- package/components/InngestMetadata.d.cts +1 -1
- package/components/InngestMetadata.d.cts.map +1 -1
- package/components/InngestMetadata.d.ts +1 -1
- package/components/InngestMetadata.d.ts.map +1 -1
- package/components/InngestMetadata.js.map +1 -1
- package/components/execution/engine.cjs +15 -0
- package/components/execution/engine.cjs.map +1 -1
- package/components/execution/engine.d.cts +8 -0
- package/components/execution/engine.d.cts.map +1 -1
- package/components/execution/engine.d.ts +8 -0
- package/components/execution/engine.d.ts.map +1 -1
- package/components/execution/engine.js +15 -0
- package/components/execution/engine.js.map +1 -1
- package/components/execution/otel/aiExtractor.cjs +114 -0
- package/components/execution/otel/aiExtractor.cjs.map +1 -0
- package/components/execution/otel/aiExtractor.d.cts +16 -0
- package/components/execution/otel/aiExtractor.d.cts.map +1 -0
- package/components/execution/otel/aiExtractor.d.ts +19 -0
- package/components/execution/otel/aiExtractor.d.ts.map +1 -0
- package/components/execution/otel/aiExtractor.js +111 -0
- package/components/execution/otel/aiExtractor.js.map +1 -0
- package/components/execution/otel/metadataProcessor.cjs +195 -0
- package/components/execution/otel/metadataProcessor.cjs.map +1 -0
- package/components/execution/otel/metadataProcessor.js +193 -0
- package/components/execution/otel/metadataProcessor.js.map +1 -0
- package/components/execution/otel/middleware.cjs +1 -1
- package/components/execution/otel/middleware.d.cts +5 -5
- package/components/execution/otel/middleware.d.ts +5 -5
- package/components/execution/otel/middleware.js +1 -1
- package/components/execution/otel/processor.cjs +1 -1
- package/components/execution/otel/processor.js +1 -1
- package/components/execution/otel/util.cjs.map +1 -1
- package/components/execution/otel/util.js.map +1 -1
- package/package.json +1 -1
- package/types.cjs.map +1 -1
- package/types.d.cts +17 -15
- package/types.d.cts.map +1 -1
- package/types.d.ts +17 -15
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Inngest.js","names":["headers: Record<string, string>","fields: Record<string, unknown>","realtimeSubscribe","realtimeGetSubscriptionToken","transformArgs: Middleware.TransformFunctionInputArgs","payloads: EventPayload[]","payload","rawBody: unknown","body: SendEventResponse | undefined","logger: Logger","childMetadata: Record<string, unknown>"],"sources":["../../src/components/Inngest.ts"],"sourcesContent":["import { InngestApi } from \"../api/api.ts\";\nimport {\n defaultDevServerHost,\n defaultInngestApiBaseUrl,\n defaultInngestEventBaseUrl,\n dummyEventKey,\n envKeys,\n headerKeys,\n} from \"../helpers/consts.ts\";\nimport { createEntropy } from \"../helpers/crypto.ts\";\nimport {\n type Env,\n getFetch,\n getProcessEnv,\n inngestHeaders,\n type Mode,\n normalizeUrl,\n parseAsBoolean,\n protectEnv,\n} from \"../helpers/env.ts\";\nimport { type ErrCode, fixEventKeyMissingSteps } from \"../helpers/errors.ts\";\nimport type { Jsonify } from \"../helpers/jsonify.ts\";\nimport { formatLogMessage, type StructuredLogMessage } from \"../helpers/log.ts\";\nimport { retryWithBackoff } from \"../helpers/promises.ts\";\nimport { stringify } from \"../helpers/strings.ts\";\nimport type {\n AsArray,\n IsNever,\n SendEventPayload,\n SimplifyDeep,\n SingleOrArray,\n} from \"../helpers/types.ts\";\nimport {\n ConsoleLogger,\n type Logger,\n ProxyLogger,\n} from \"../middleware/logger.ts\";\nimport {\n type ApplyAllMiddlewareCtxExtensions,\n type ApplyAllMiddlewareStepExtensions,\n type ApplyAllMiddlewareTransforms,\n type BaseContext,\n type ClientOptions,\n type EventPayload,\n type FailureEventArgs,\n type Handler,\n type InvokeTargetFunctionDefinition,\n type MetadataTarget,\n type SendEventOutput,\n type SendEventResponse,\n sendEventResponseSchema,\n} from \"../types.ts\";\nimport { getAsyncCtx } from \"./execution/als.ts\";\nimport { InngestFunction } from \"./InngestFunction.ts\";\nimport type { InngestFunctionReference } from \"./InngestFunctionReference.ts\";\nimport {\n type MetadataBuilder,\n UnscopedMetadataBuilder,\n} from \"./InngestMetadata.ts\";\nimport type { createStepTools } from \"./InngestStepTools.ts\";\nimport { step } from \"./InngestStepTools.ts\";\nimport { buildWrapSendEventChain, Middleware } from \"./middleware/index.ts\";\nimport {\n getSubscriptionToken as realtimeGetSubscriptionToken,\n subscribe as realtimeSubscribe,\n} from \"./realtime/subscribe/index.ts\";\nimport type { Realtime } from \"./realtime/types\";\nimport {\n type HandlerWithTriggers,\n isValidatable,\n} from \"./triggers/typeHelpers.ts\";\n\ntype ChannelTopicNames<InputChannel extends Realtime.ChannelInput> = Extract<\n keyof Realtime.Channel.InferTopics<InputChannel>,\n string\n>;\n\ntype ChannelTopicsInput<InputChannel extends Realtime.ChannelInput> = [\n ChannelTopicNames<InputChannel>,\n] extends [never]\n ? string[]\n : string extends ChannelTopicNames<InputChannel>\n ? string[]\n : ChannelTopicNames<InputChannel>[];\n\n/**\n * Capturing the global type of fetch so that we can reliably access it below.\n */\ntype FetchT = typeof fetch;\n\n/**\n * A client used to interact with the Inngest API by sending or reacting to\n * events.\n *\n * ```ts\n * const inngest = new Inngest({ id: \"my-app\" });\n * ```\n *\n * @public\n */\n\n/**\n * Symbol for accessing the SDK's internal logger. Not part of the public API.\n * @internal\n */\nexport const internalLoggerSymbol = Symbol.for(\"inngest.internalLogger\");\n\nexport class Inngest<const TClientOpts extends ClientOptions = ClientOptions>\n implements Inngest.Like\n{\n get [Symbol.toStringTag](): typeof Inngest.Tag {\n return Inngest.Tag;\n }\n\n /**\n * The ID of this instance, most commonly a reference to the application it\n * resides in.\n *\n * The ID of your client should remain the same for its lifetime; if you'd\n * like to change the name of your client as it appears in the Inngest UI,\n * change the `name` property instead.\n */\n public readonly id: string;\n\n /**\n * Stores the options so we can remember explicit settings the user has\n * provided.\n */\n private readonly options: TClientOpts;\n\n private readonly inngestApi: InngestApi;\n\n private readonly _userProvidedFetch?: FetchT;\n private _cachedFetch?: FetchT;\n\n private readonly _logger: Logger;\n\n /**\n * Logger for SDK internal messages. Falls back to the user's `logger` if\n * `internalLogger` is not provided in client options.\n *\n * @internal\n */\n readonly [internalLoggerSymbol]: Logger;\n\n private localFns: InngestFunction.Any[] = [];\n\n /**\n * Middleware instances that provide simpler hooks.\n */\n readonly middleware: Middleware.Class[];\n\n private _env: Env = {};\n\n private _appVersion: string | undefined;\n\n /**\n * @internal\n * Flag set by metadataMiddleware to enable step.metadata()\n */\n protected experimentalMetadataEnabled = false;\n\n /**\n * A dummy Inngest function used in Durable Endpoints. This is necessary\n * because the vast majority of middleware hooks require the Inngest function.\n * But for Durable Endpoints, there is no Inngest function. So we need some\n * placeholder.\n */\n private dummyDurableEndpointFunction: InngestFunction.Any | null = null;\n private getDummyDurableEndpointFunction(): InngestFunction.Any {\n if (this.dummyDurableEndpointFunction) {\n return this.dummyDurableEndpointFunction;\n }\n this.dummyDurableEndpointFunction = new InngestFunction(\n this,\n { id: \"__proxy__\", triggers: [] },\n async () => {},\n );\n return this.dummyDurableEndpointFunction;\n }\n\n /**\n * Try to parse the `INNGEST_DEV` environment variable as a URL.\n * Returns the URL if valid, otherwise `undefined`.\n */\n get explicitDevUrl(): URL | undefined {\n const devEnvValue = this._env[envKeys.InngestDevMode];\n if (typeof devEnvValue !== \"string\" || !devEnvValue) {\n return undefined;\n }\n\n if (parseAsBoolean(devEnvValue) !== undefined) {\n return undefined;\n }\n\n try {\n return new URL(normalizeUrl(devEnvValue));\n } catch {\n return undefined;\n }\n }\n\n /**\n * Given a default cloud URL, return the appropriate URL based on the\n * current mode and environment variables.\n *\n * If `INNGEST_DEV` is set to a URL, that URL is used. Otherwise, we use\n * the default cloud URL in cloud mode or the default dev server host in\n * dev mode.\n */\n private resolveDefaultUrl(cloudUrl: string): string {\n const explicitDevUrl = this.explicitDevUrl;\n if (explicitDevUrl) {\n return explicitDevUrl.href;\n }\n\n return this.mode === \"cloud\" ? cloudUrl : defaultDevServerHost;\n }\n\n get apiBaseUrl(): string {\n return (\n this.options.baseUrl ||\n this._env[envKeys.InngestApiBaseUrl] ||\n this._env[envKeys.InngestBaseUrl] ||\n this.resolveDefaultUrl(defaultInngestApiBaseUrl)\n );\n }\n\n get eventBaseUrl(): string {\n return (\n this.options.baseUrl ||\n this._env[envKeys.InngestEventApiBaseUrl] ||\n this._env[envKeys.InngestBaseUrl] ||\n this.resolveDefaultUrl(defaultInngestEventBaseUrl)\n );\n }\n\n get eventKey(): string | undefined {\n return (\n this.options.eventKey || this._env[envKeys.InngestEventKey] || undefined\n );\n }\n\n // defer fetch resolution until first use, but cache for reference stability\n get fetch(): FetchT {\n if (!this._cachedFetch) {\n this._cachedFetch = this._userProvidedFetch\n ? getFetch(this[internalLoggerSymbol], this._userProvidedFetch)\n : getFetch(this[internalLoggerSymbol], globalThis.fetch);\n }\n return this._cachedFetch;\n }\n\n get signingKey(): string | undefined {\n return this.options.signingKey || this._env[envKeys.InngestSigningKey];\n }\n\n get signingKeyFallback(): string | undefined {\n return (\n this.options.signingKeyFallback ||\n this._env[envKeys.InngestSigningKeyFallback]\n );\n }\n\n get headers(): Record<string, string> {\n return inngestHeaders({\n inngestEnv: this.options.env,\n env: this._env,\n });\n }\n\n /**\n * The base logger for this client. Passed to user functions as `ctx.logger`.\n */\n get logger(): Logger {\n return this._logger;\n }\n\n get env(): string | null {\n return this.headers[headerKeys.Environment] ?? null;\n }\n\n get appVersion(): string | undefined {\n return this._appVersion;\n }\n\n /**\n * Access the metadata builder for updating run and step metadata.\n *\n * @example\n * ```ts\n * // Update metadata for the current run\n * await inngest.metadata.update({ status: \"processing\" });\n *\n * // Update metadata for a different run\n * await inngest.metadata.run(otherRunId).update({ key: \"val\" });\n *\n * ```\n */\n get metadata(): MetadataBuilder {\n if (!this.experimentalMetadataEnabled) {\n throw new Error(\n 'inngest.metadata is experimental. Enable it by adding metadataMiddleware() from \"inngest/experimental\" to your client middleware.',\n );\n }\n return new UnscopedMetadataBuilder(this);\n }\n\n /**\n * A client used to interact with the Inngest API by sending or reacting to\n * events.\n *\n * ```ts\n * const inngest = new Inngest({ id: \"my-app\" });\n * ```\n */\n constructor(options: TClientOpts) {\n this.options = options;\n\n const { id, logger, middleware, appVersion } = this.options;\n\n if (!id) {\n throw new Error(\"An `id` must be passed to create an Inngest instance.\");\n }\n\n this.id = id;\n this._env = protectEnv({ ...getProcessEnv() });\n this._userProvidedFetch = options.fetch;\n\n this.inngestApi = new InngestApi({\n baseUrl: () => this.apiBaseUrl,\n signingKey: () => this.signingKey,\n signingKeyFallback: () => this.signingKeyFallback,\n fetch: () => this.fetch,\n });\n\n this._logger = logger ?? new ConsoleLogger();\n this[internalLoggerSymbol] = this.options.internalLogger ?? this._logger;\n\n this.middleware = [\n ...builtInMiddleware(this._logger),\n ...(middleware ?? []),\n ];\n\n for (const mw of this.middleware) {\n mw.onRegister?.({ client: this, fn: null });\n }\n\n this._appVersion = appVersion;\n }\n\n /**\n * Returns a `Promise` that resolves when the app is ready and all middleware\n * has been initialized.\n */\n public get ready(): Promise<void> {\n // Previously this was used to ensure that we could wait for middleware\n // to be instantiated, but we now no longer have a set-up function\n // that we await, so middleware is always ready to go.\n return Promise.resolve();\n }\n\n /**\n * Set the environment variables for this client. This is useful if you are\n * passed environment variables at runtime instead of as globals and need to\n * update the client with those values as requests come in.\n */\n public setEnvVars(\n env: Record<string, string | undefined> = getProcessEnv(),\n ): this {\n this._env = protectEnv({ ...this._env, ...env });\n\n return this;\n }\n\n get mode(): Mode {\n if (typeof this.options.isDev === \"boolean\") {\n return this.options.isDev ? \"dev\" : \"cloud\";\n }\n\n const envIsDev = parseAsBoolean(this._env[envKeys.InngestDevMode]);\n if (typeof envIsDev === \"boolean\") {\n return envIsDev ? \"dev\" : \"cloud\";\n }\n\n if (this.explicitDevUrl) {\n return \"dev\";\n }\n\n return \"cloud\";\n }\n\n /**\n * Given a response from Inngest, relay the error to the caller.\n */\n private async getResponseError(\n response: globalThis.Response,\n rawBody: unknown,\n foundErr = \"Unknown error\",\n ): Promise<Error> {\n let errorMessage = foundErr;\n\n if (errorMessage === \"Unknown error\") {\n switch (response.status) {\n case 401:\n errorMessage = \"Event key Not Found\";\n break;\n case 400:\n errorMessage = \"Cannot process event payload\";\n break;\n case 403:\n errorMessage = \"Forbidden\";\n break;\n case 404:\n errorMessage = \"Event key not found\";\n break;\n case 406:\n errorMessage = `${JSON.stringify(await rawBody)}`;\n break;\n case 409:\n case 412:\n errorMessage = \"Event transformation failed\";\n break;\n case 413:\n errorMessage = \"Event payload too large\";\n break;\n case 500:\n errorMessage = \"Internal server error\";\n break;\n default:\n try {\n errorMessage = await response.text();\n } catch (_err) {\n errorMessage = `${JSON.stringify(await rawBody)}`;\n }\n break;\n }\n }\n\n return new Error(`Inngest API Error: ${response.status} ${errorMessage}`);\n }\n\n private eventKeySet(): boolean {\n return this.eventKey !== undefined;\n }\n\n /**\n * EXPERIMENTAL: This API is not yet stable and may change in the future\n * without a major version bump.\n *\n * Send a Signal to Inngest.\n */\n public async sendSignal({\n signal,\n data,\n env,\n }: {\n /**\n * The signal to send.\n */\n signal: string;\n\n /**\n * The data to send with the signal.\n */\n data?: unknown;\n\n /**\n * The Inngest environment to send the signal to. Defaults to whichever\n * environment this client's key is associated with.\n *\n * It's like you never need to change this unless you're trying to sync\n * multiple systems together using branch names.\n */\n env?: string;\n }): Promise<InngestApi.SendSignalResponse> {\n const headers: Record<string, string> = {\n ...(env ? { [headerKeys.Environment]: env } : {}),\n };\n\n return this._sendSignal({ signal, data, headers });\n }\n\n private async _sendSignal({\n signal,\n data,\n headers,\n }: {\n signal: string;\n data?: unknown;\n headers?: Record<string, string>;\n }): Promise<InngestApi.SendSignalResponse> {\n const res = await this.inngestApi.sendSignal(\n { signal, data },\n { ...this.headers, ...headers },\n );\n if (res.ok) {\n return res.value;\n }\n\n throw new Error(\n `Failed to send signal: ${res.error?.error || \"Unknown error\"}`,\n );\n }\n\n private async updateMetadata({\n target,\n metadata,\n headers,\n }: {\n target: MetadataTarget;\n metadata: Array<{\n kind: string;\n op: string;\n values: Record<string, unknown>;\n }>;\n headers?: Record<string, string>;\n }): Promise<void> {\n const res = await this.inngestApi.updateMetadata(\n {\n target,\n metadata,\n },\n { headers },\n );\n if (res.ok) {\n return res.value;\n }\n\n throw new Error(\n `Failed to update metadata: ${res.error?.error || \"Unknown error\"}`,\n );\n }\n\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: used in the SDK\n private async warnMetadata(\n target: MetadataTarget,\n kind: ErrCode,\n log: StructuredLogMessage,\n ) {\n const fields: Record<string, unknown> = {};\n if (log.code) {\n fields.code = log.code;\n }\n if (log.explanation) {\n fields.explanation = log.explanation;\n }\n if (log.action) {\n fields.action = log.action;\n }\n if (log.docs) {\n fields.docs = log.docs;\n }\n\n if (Object.keys(fields).length > 0) {\n this[internalLoggerSymbol].warn(fields, log.message);\n } else {\n this[internalLoggerSymbol].warn(log.message);\n }\n\n if (!this.experimentalMetadataEnabled) {\n return;\n }\n\n await this.updateMetadata({\n target: target,\n metadata: [\n {\n kind: \"inngest.warnings\",\n op: \"merge\",\n values: {\n [`sdk.${kind}`]: formatLogMessage(log),\n },\n },\n ],\n });\n }\n\n /**\n * Realtime-related functionality for this Inngest client.\n */\n public realtime: {\n /**\n * Publish data to a realtime channel topic.\n *\n * This is a non-durable publish, it executes immediately and is not\n * memoized. If called inside an Inngest function, it will automatically\n * include the current run ID. For durable publishing inside functions, use\n * `step.realtime.publish()`.\n *\n * ```ts\n * await inngest.realtime.publish(ch.status, { message: \"Processing...\" });\n * ```\n */\n publish: Realtime.TypedPublishFn;\n\n /**\n * Subscribe to realtime messages on a channel, returning a readable stream.\n */\n subscribe: {\n <\n const InputChannel extends Realtime.ChannelInput,\n const InputTopics extends ChannelTopicsInput<InputChannel>,\n const TToken extends Realtime.Subscribe.Token<\n InputChannel,\n InputTopics\n >,\n >(opts: {\n channel: InputChannel;\n topics: InputTopics;\n validate?: boolean;\n onMessage: Realtime.Subscribe.Callback<TToken>;\n onError?: (err: unknown) => void;\n }): Promise<Realtime.Subscribe.CallbackSubscription>;\n <\n const InputChannel extends Realtime.ChannelInput,\n const InputTopics extends ChannelTopicsInput<InputChannel>,\n const TToken extends Realtime.Subscribe.Token<\n InputChannel,\n InputTopics\n >,\n >(opts: {\n channel: InputChannel;\n topics: InputTopics;\n validate?: boolean;\n }): Promise<Realtime.Subscribe.StreamSubscription<TToken>>;\n };\n\n /**\n * Generate a subscription token for subscribing to realtime messages.\n */\n token: <\n const InputChannel extends Realtime.ChannelInput,\n const InputTopics extends ChannelTopicsInput<InputChannel>,\n const TToken extends Realtime.Subscribe.Token<InputChannel, InputTopics>,\n >(opts: {\n channel: InputChannel;\n topics: InputTopics;\n }) => Promise<TToken>;\n } = {\n publish: async (topicRef, data) => {\n const topicConfig = topicRef.config;\n if (topicConfig && \"schema\" in topicConfig && topicConfig.schema) {\n const result = await topicConfig.schema[\"~standard\"].validate(data);\n if (result.issues) {\n throw new Error(\n `Schema validation failed for topic \"${topicRef.topic}\"`,\n );\n }\n }\n\n const ctx = await getAsyncCtx();\n const runId = ctx?.execution?.ctx.runId;\n\n const res = await this.inngestApi.publish(\n {\n channel: topicRef.channel,\n topics: [topicRef.topic],\n runId,\n },\n data,\n );\n\n if (!res.ok) {\n throw new Error(\n `Failed to publish to realtime: ${\n res.error?.error || \"Unknown error\"\n }`,\n );\n }\n },\n\n subscribe: async (opts) => {\n // biome-ignore lint/suspicious/noExplicitAny: sacrifice for clean generics\n return realtimeSubscribe({ ...opts, app: this } as any) as any;\n },\n\n token: async (opts) => {\n // biome-ignore lint/suspicious/noExplicitAny: sacrifice for clean generics\n return realtimeGetSubscriptionToken(this, opts as any) as any;\n },\n };\n\n public endpoint<THandler extends Inngest.EndpointHandler<this>>(\n handler: THandler,\n ): THandler {\n if (!this.options.endpointAdapter) {\n throw new Error(\n \"No endpoint adapter configured for this Inngest client.\",\n );\n }\n\n return this.options.endpointAdapter({ client: this })(handler);\n }\n\n /**\n * Creates a proxy handler that polls Inngest for durable endpoint results.\n *\n * The proxy:\n * - Extracts `runId` and `token` from query params\n * - Fetches the result from Inngest API\n * - Runs the response through middleware (e.g., decryption)\n * - Adds CORS headers\n *\n * Use this in combination with the `asyncRedirectUrl` option on your\n * endpoint adapter to redirect users to your own proxy endpoint instead\n * of directly to Inngest.\n *\n * @example\n * ```ts\n * import { Inngest } from \"inngest\";\n * import { endpointAdapter } from \"inngest/edge\";\n *\n * const inngest = new Inngest({\n * id: \"my-app\",\n * endpointAdapter: endpointAdapter.withOptions({\n * asyncRedirectUrl: \"/api/inngest/poll\",\n * }),\n * });\n *\n * // Durable endpoint\n * export const GET = inngest.endpoint(async (req) => {\n * const result = await step.run(\"work\", () => \"done\");\n * return new Response(result);\n * });\n *\n * // Proxy endpoint at /api/inngest/poll\n * export const GET = inngest.endpointProxy();\n * ```\n */\n public endpointProxy(): Inngest.ProxyHandler<this> {\n if (!this.options.endpointAdapter) {\n throw new Error(\n \"No endpoint adapter configured for this Inngest client.\",\n );\n }\n\n if (!this.options.endpointAdapter.createProxyHandler) {\n throw new Error(\n \"The configured endpoint adapter does not support proxy handlers.\",\n );\n }\n\n return this.options.endpointAdapter.createProxyHandler({ client: this });\n }\n\n /**\n * Decrypt a proxy response using the client's middleware stack.\n *\n * Runs `transformFunctionInput` on each middleware instance to decrypt\n * step data (used by encryption middleware).\n *\n * Uses type assertions because we're creating a minimal \"fake\" execution\n * context just to run the decryption middleware hooks - not a full execution.\n *\n * @internal\n */\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: accessed via bracket notation by InngestProxyHandler\n private async decryptProxyResult<T extends { data?: unknown }>(\n result: T,\n ): Promise<T> {\n if (!result.data) {\n return result;\n }\n\n const mwInstances = this.middleware.map((Cls) => {\n return new Cls({ client: this });\n });\n\n const dummyEvent = { name: \"__proxy__\", data: {} };\n const dummyCtx = {\n event: dummyEvent,\n events: [dummyEvent],\n runId: \"__proxy__\",\n attempt: 0,\n step,\n } as unknown as BaseContext<Inngest.Any>;\n\n let transformArgs: Middleware.TransformFunctionInputArgs = {\n ctx: dummyCtx,\n fn: this.getDummyDurableEndpointFunction(),\n steps: {\n __result__: { type: \"data\" as const, data: result.data },\n },\n };\n\n for (const mw of mwInstances) {\n if (mw.transformFunctionInput) {\n transformArgs = await mw.transformFunctionInput(transformArgs);\n }\n }\n\n const decryptedStep = transformArgs.steps?.__result__;\n let decryptedData = result.data;\n if (decryptedStep && \"data\" in decryptedStep) {\n decryptedData = decryptedStep.data as typeof decryptedData;\n }\n\n return { ...result, data: decryptedData };\n }\n\n /**\n * Send one or many events to Inngest. Takes an entire payload (including\n * name) as each input.\n *\n * ```ts\n * await inngest.send({ name: \"app/user.created\", data: { id: 123 } });\n * ```\n *\n * Returns a promise that will resolve if the event(s) were sent successfully,\n * else throws with an error explaining what went wrong.\n */\n public async send(\n payload: SendEventPayload,\n options?: {\n /**\n * The Inngest environment to send events to. Defaults to whichever\n * environment this client's event key is associated with.\n *\n * It's likely you never need to change this unless you're trying to sync\n * multiple systems together using branch names.\n */\n env?: string;\n },\n ): Promise<SendEventOutput<TClientOpts>> {\n const headers: Record<string, string> = {\n ...(options?.env ? { [headerKeys.Environment]: options.env } : {}),\n };\n\n return this._send({\n payload,\n headers,\n fnMiddleware: [],\n fn: null,\n });\n }\n\n /**\n * Internal method for sending an event, used to allow Inngest internals to\n * further customize the request sent to an Inngest Server.\n */\n private async _send({\n payload,\n headers,\n fn,\n fnMiddleware,\n }: {\n payload: SendEventPayload;\n headers?: Record<string, string>;\n fn: InngestFunction.Any | null;\n fnMiddleware: Middleware.Class[];\n }): Promise<SendEventOutput<TClientOpts>> {\n const nowMillis = new Date().getTime();\n\n let maxAttempts = 5;\n\n // Attempt to set the event ID seed header. If it fails then disable retries\n // (but we still want to send the event).\n try {\n const entropy = createEntropy(10);\n const entropyBase64 = Buffer.from(entropy).toString(\"base64\");\n headers = {\n ...headers,\n [headerKeys.EventIdSeed]: `${nowMillis},${entropyBase64}`,\n };\n } catch (err) {\n this[internalLoggerSymbol].debug(\n { err },\n \"Event-sending retries disabled\",\n );\n\n // Disable retries.\n maxAttempts = 1;\n }\n\n let payloads: EventPayload[] = Array.isArray(payload)\n ? (payload as EventPayload[])\n : payload\n ? ([payload] as [EventPayload])\n : [];\n\n // Instantiate fresh middleware per send() call.\n const mwInstances = [...this.middleware, ...fnMiddleware].map(\n (Cls) => new Cls({ client: this }),\n );\n for (const mw of mwInstances) {\n if (mw?.transformSendEvent) {\n const transformed = await mw.transformSendEvent({\n events: payloads,\n fn: fn ?? null,\n });\n if (transformed !== undefined) {\n payloads = transformed.events;\n }\n }\n }\n\n // Validate payloads that have a validate method (from `EventType.create()`)\n for (const payload of payloads) {\n if (isValidatable(payload)) {\n await payload.validate();\n }\n }\n\n // Ensure that we always add \"ts\" and \"data\" fields to events. \"ts\" is auto-\n // filled by the event server so is safe, and adding here fixes Next.js\n // server action cache issues.\n payloads = payloads.map((p) => {\n return {\n ...p,\n // Always generate an idempotency ID for an event for retries\n id: p.id,\n ts: p.ts || nowMillis,\n data: p.data || {},\n };\n });\n\n /**\n * It can be valid for a user to send an empty list of events; if this\n * happens, show a warning that this may not be intended, but don't throw.\n */\n if (!payloads.length) {\n this[internalLoggerSymbol].warn(\n \"inngest.send() called with no events; the returned promise will resolve, but no events have been sent\",\n );\n\n return { ids: [] } as SendEventOutput<TClientOpts>;\n }\n\n /**\n * If in prod mode and key is not present, fail now.\n */\n if (this.mode === \"cloud\" && !this.eventKeySet()) {\n throw new Error(\n formatLogMessage({\n message: \"Failed to send event\",\n explanation:\n \"Your event or events were not sent to Inngest. We couldn't find an event key to use to send events to Inngest.\",\n action: fixEventKeyMissingSteps.join(\"; \"),\n }),\n );\n }\n\n const innerHandler = async () => {\n const body = await retryWithBackoff(\n async () => {\n let rawBody: unknown;\n let body: SendEventResponse | undefined;\n\n // We don't need to do fallback auth here because this uses event keys and\n // not signing keys\n const url = new URL(\n `e/${this.eventKey ?? dummyEventKey}`,\n this.eventBaseUrl,\n );\n const response = await this.fetch(url.href, {\n method: \"POST\",\n body: stringify(payloads),\n headers: { ...this.headers, ...headers },\n });\n\n try {\n rawBody = await response.json();\n body = await sendEventResponseSchema.parseAsync(rawBody);\n } catch (_err) {\n throw await this.getResponseError(response, rawBody);\n }\n\n if (body.status !== 200 || body.error) {\n throw await this.getResponseError(response, rawBody, body.error);\n }\n\n return body;\n },\n {\n maxAttempts,\n baseDelay: 100,\n },\n );\n\n return { ids: body.ids } as SendEventOutput<TClientOpts>;\n };\n\n const wrappedHandler = buildWrapSendEventChain(\n mwInstances,\n innerHandler,\n payloads,\n fn,\n );\n\n return (await wrappedHandler()) as SendEventOutput<TClientOpts>;\n }\n\n public createFunction: Inngest.CreateFunction<this> = (\n rawOptions,\n handler,\n ) => {\n const fn = this._createFunction(rawOptions, handler);\n\n for (const mw of fn.opts.middleware ?? []) {\n mw.onRegister?.({ client: this, fn });\n }\n\n this.localFns.push(fn);\n\n return fn;\n };\n\n public get funcs() {\n return this.localFns;\n }\n\n private _createFunction: Inngest.CreateFunction<this> = (\n rawOptions,\n handler,\n ) => {\n if (typeof handler !== \"function\") {\n throw new Error(\n `\"createFunction\" expected a handler function as the second argument. Triggers belong in the first argument: createFunction({ id, triggers: { event: \"...\" } }, handler)`,\n );\n }\n\n const options = {\n ...rawOptions,\n triggers: this.sanitizeTriggers(rawOptions.triggers),\n };\n\n return new InngestFunction(this, options, handler);\n };\n\n /**\n * Runtime-only validation.\n */\n private sanitizeTriggers<\n T extends SingleOrArray<InngestFunction.Trigger<string>> | undefined,\n >(\n triggers: T | undefined,\n ): T extends undefined ? [] : AsArray<NonNullable<T>> {\n type Result = T extends undefined ? [] : AsArray<NonNullable<T>>;\n\n if (triggers === undefined) {\n return [] as Result;\n }\n\n if (!Array.isArray(triggers)) {\n return [triggers] as Result;\n }\n\n return triggers as Result;\n }\n}\n\n/**\n * Default middleware that is included in every client, placed before the user's\n * middleware. Returns new-style `Middleware.Class` constructors. Uses a closure\n * so the no-arg constructors can capture the base logger.\n */\nexport function builtInMiddleware(baseLogger: Logger) {\n return [\n class LoggerMiddleware extends Middleware.BaseMiddleware {\n readonly id = \"inngest:logger\";\n proxyLogger = new ProxyLogger(baseLogger);\n\n override transformFunctionInput(\n arg: Middleware.TransformFunctionInputArgs,\n ) {\n let logger: Logger = baseLogger;\n\n // Create a child logger with run metadata if supported\n if (\"child\" in logger) {\n try {\n const childMetadata: Record<string, unknown> = {\n runID: arg.ctx.runId,\n eventName: arg.ctx.event.name,\n };\n if (typeof arg.ctx.requestId !== \"undefined\") {\n childMetadata.requestId = arg.ctx.requestId;\n }\n if (typeof arg.ctx.jobId !== \"undefined\") {\n childMetadata.jobId = arg.ctx.jobId;\n }\n logger = (\n logger.child as (meta: Record<string, unknown>) => Logger\n )(childMetadata);\n } catch (err) {\n logger.error({ err }, 'failed to create \"childLogger\" with error');\n }\n }\n\n this.proxyLogger = new ProxyLogger(logger);\n\n return {\n ...arg,\n ctx: Object.assign({}, arg.ctx, {\n logger: this.proxyLogger as Logger,\n }),\n };\n }\n\n override onMemoizationEnd() {\n this.proxyLogger.enable();\n }\n\n override onStepError(arg: Middleware.OnStepErrorArgs) {\n this.proxyLogger.error({ err: arg.error }, \"Inngest step error\");\n }\n\n override wrapFunctionHandler({\n next,\n }: Middleware.WrapFunctionHandlerArgs) {\n return next().catch((err: unknown) => {\n this.proxyLogger.error({ err }, \"Inngest function error\");\n throw err;\n });\n }\n\n override wrapRequest({ next }: Middleware.WrapRequestArgs) {\n return next().finally(() => this.proxyLogger.flush());\n }\n },\n ] as const;\n}\n\n/**\n * A client used to interact with the Inngest API by sending or reacting to\n * events.\n *\n * ```ts\n * const inngest = new Inngest({ id: \"my-app\" });\n * ```\n *\n * @public\n */\nexport namespace Inngest {\n export const Tag = \"Inngest.App\" as const;\n\n /**\n * Represents any `Inngest` instance, regardless of generics and inference.\n *\n * Prefer use of `Inngest.Like` where possible to ensure compatibility with\n * multiple versions.\n */\n export type Any = Inngest;\n\n /**\n * References any `Inngest` instance across library versions, useful for use\n * in public APIs to ensure compatibility with multiple versions.\n *\n * Prefer use of `Inngest.Any` internally and `Inngest.Like` for public APIs.\n */\n export interface Like {\n readonly [Symbol.toStringTag]: typeof Inngest.Tag;\n }\n\n export type EndpointHandler<TClient extends Inngest.Any> = ReturnType<\n NonNullable<ClientOptionsFromInngest<TClient>[\"endpointAdapter\"]>\n >;\n\n type ResolveTriggers<T> = T extends undefined ? [] : AsArray<NonNullable<T>>;\n\n /**\n * Input type for createFunction that accepts raw trigger input (single,\n * array, or undefined) while keeping all other fields from\n * InngestFunction.Options.\n */\n export type CreateFunctionInput<\n TFnMiddleware extends Middleware.Class[] | undefined,\n TTriggers extends\n | SingleOrArray<InngestFunction.Trigger<string>>\n | undefined,\n TFailureHandler extends Handler.Any,\n > = Omit<\n InngestFunction.Options<InngestFunction.Trigger<string>[], TFailureHandler>,\n \"triggers\"\n > & {\n triggers?: TTriggers;\n middleware?: TFnMiddleware;\n };\n\n /**\n * The type of the proxy handler returned by `endpointProxy()`.\n *\n * This type is inferred from the `createProxyHandler` function of the\n * endpoint adapter configured on the client.\n */\n export type ProxyHandler<TClient extends Inngest.Any> = ReturnType<\n NonNullable<\n NonNullable<\n ClientOptionsFromInngest<TClient>[\"endpointAdapter\"]\n >[\"createProxyHandler\"]\n >\n >;\n\n export type CreateFunction<TClient extends Inngest.Any> = <\n const TTriggers extends\n | SingleOrArray<InngestFunction.Trigger<string>>\n | undefined = undefined,\n const TFnMiddleware extends Middleware.Class[] | undefined = undefined,\n THandler extends Handler.Any = HandlerWithTriggers<\n ReturnType<typeof createStepTools<TClient, TFnMiddleware>>,\n ResolveTriggers<TTriggers>,\n ApplyAllMiddlewareCtxExtensions<\n [...ReturnType<typeof builtInMiddleware>]\n > &\n ApplyAllMiddlewareCtxExtensions<\n ClientOptionsFromInngest<TClient>[\"middleware\"]\n > &\n ApplyAllMiddlewareCtxExtensions<TFnMiddleware> & {\n step: ReturnType<typeof createStepTools<TClient, TFnMiddleware>> &\n ApplyAllMiddlewareStepExtensions<\n ClientOptionsFromInngest<TClient>[\"middleware\"]\n > &\n ApplyAllMiddlewareStepExtensions<TFnMiddleware>;\n }\n >,\n TFailureHandler extends Handler.Any = HandlerWithTriggers<\n ReturnType<typeof createStepTools<TClient, TFnMiddleware>>,\n ResolveTriggers<TTriggers>,\n ApplyAllMiddlewareCtxExtensions<\n [...ReturnType<typeof builtInMiddleware>]\n > &\n FailureEventArgs<EventPayload> &\n ApplyAllMiddlewareCtxExtensions<\n ClientOptionsFromInngest<TClient>[\"middleware\"]\n > &\n ApplyAllMiddlewareCtxExtensions<TFnMiddleware> & {\n step: ReturnType<typeof createStepTools<TClient, TFnMiddleware>> &\n ApplyAllMiddlewareStepExtensions<\n ClientOptionsFromInngest<TClient>[\"middleware\"]\n > &\n ApplyAllMiddlewareStepExtensions<TFnMiddleware>;\n }\n >,\n >(\n options: CreateFunctionInput<TFnMiddleware, TTriggers, TFailureHandler>,\n handler: THandler,\n ) => InngestFunction<\n InngestFunction.Options<ResolveTriggers<TTriggers>, TFailureHandler>,\n THandler,\n TFailureHandler,\n TClient,\n ResolveTriggers<TTriggers>\n >;\n}\n\n/**\n * A helper type to extract the type of a set of event tooling from a given\n * Inngest instance and optionally a trigger.\n *\n * @example Get generic step tools for an Inngest instance.\n * ```ts\n * type StepTools = GetStepTools<typeof inngest>;\n * ```\n *\n * @example Get step tools with a trigger, ensuring tools like `waitForEvent` are typed.\n * ```ts\n * type StepTools = GetStepTools<typeof Inngest, \"github/pull_request\">;\n * ```\n *\n * @public\n */\nexport type GetStepTools<TInngest extends Inngest.Any> =\n GetFunctionInput<TInngest> extends { step: infer TStep } ? TStep : never;\n\n/**\n * A helper type to extract the type of the input to a function from a given\n * Inngest instance and optionally a trigger.\n *\n * @example Get generic function input for an Inngest instance.\n * ```ts\n * type Input = GetFunctionInput<typeof inngest>;\n * ```\n *\n * @example Get function input with a trigger, ensuring tools like `waitForEvent` are typed.\n * ```ts\n * type Input = GetFunctionInput<typeof Inngest, \"github/pull_request\">;\n * ```\n *\n * @public\n */\nexport type GetFunctionInput<TClient extends Inngest.Any> = Parameters<\n Handler<\n TClient,\n ApplyAllMiddlewareCtxExtensions<[...ReturnType<typeof builtInMiddleware>]> &\n ApplyAllMiddlewareCtxExtensions<\n ClientOptionsFromInngest<TClient>[\"middleware\"]\n > & {\n step: ReturnType<typeof createStepTools<TClient>> &\n ApplyAllMiddlewareStepExtensions<\n ClientOptionsFromInngest<TClient>[\"middleware\"]\n >;\n }\n >\n>[0];\n\n/**\n * A helper type to extract the type of the output of an Inngest function.\n *\n * @example Get a function's output\n * ```ts\n * type Output = GetFunctionOutput<typeof myFunction>;\n * ```\n *\n * @public\n */\nexport type GetFunctionOutput<\n TFunction extends InvokeTargetFunctionDefinition,\n> = TFunction extends InngestFunction.Any\n ? GetFunctionOutputFromInngestFunction<TFunction>\n : TFunction extends InngestFunctionReference.Any\n ? GetFunctionOutputFromReferenceInngestFunction<TFunction>\n : unknown;\n\n/**\n * A helper type to extract the type of the output of an Inngest function.\n *\n * Used internally for {@link GetFunctionOutput}. Code outside of this package\n * should use {@link GetFunctionOutput} instead.\n *\n * @internal\n */\nexport type GetFunctionOutputFromInngestFunction<\n TFunction extends InngestFunction.Any,\n> = TFunction extends InngestFunction<\n // biome-ignore lint/suspicious/noExplicitAny: intentional\n any,\n infer IHandler,\n // biome-ignore lint/suspicious/noExplicitAny: intentional\n any,\n infer TClient,\n // biome-ignore lint/suspicious/noExplicitAny: intentional\n any\n>\n ? IsNever<\n VoidToNull<SimplifyDeep<Awaited<ReturnType<IHandler>>>>\n > extends true\n ? null\n : ApplyAllMiddlewareTransforms<\n ClientOptionsFromInngest<TClient>[\"middleware\"],\n VoidToNull<SimplifyDeep<Awaited<ReturnType<IHandler>>>>,\n \"functionOutputTransform\"\n >\n : unknown;\n\n/**\n * A helper type to extract the type of the output of a referenced Inngest\n * function.\n *\n * Used internally for {@link GetFunctionOutput}. Code outside of this package\n * should use {@link GetFunctionOutput} instead.\n *\n * @internal\n */\nexport type GetFunctionOutputFromReferenceInngestFunction<\n TFunction extends InngestFunctionReference.Any,\n // biome-ignore lint/suspicious/noExplicitAny: intentional\n> = TFunction extends InngestFunctionReference<any, infer IOutput>\n ? IsNever<SimplifyDeep<Jsonify<IOutput>>> extends true\n ? null\n : SimplifyDeep<Jsonify<IOutput>>\n : unknown;\n\n/**\n * A helper type to extract the raw (non-Jsonified) output type of an Inngest\n * function. This is used when middleware transforms will handle serialization.\n *\n * @internal\n */\nexport type GetFunctionOutputRaw<\n TFunction extends InvokeTargetFunctionDefinition,\n> = TFunction extends InngestFunction.Any\n ? GetFunctionOutputRawFromInngestFunction<TFunction>\n : TFunction extends InngestFunctionReference.Any\n ? GetFunctionOutputRawFromReferenceInngestFunction<TFunction>\n : unknown;\n\n/**\n * @internal\n */\nexport type GetFunctionOutputRawFromInngestFunction<\n TFunction extends InngestFunction.Any,\n // biome-ignore lint/suspicious/noExplicitAny: intentional\n> = TFunction extends InngestFunction<any, infer IHandler, any, any, any>\n ? VoidToNull<Awaited<ReturnType<IHandler>>>\n : unknown;\n\n/**\n * @internal\n */\nexport type GetFunctionOutputRawFromReferenceInngestFunction<\n TFunction extends InngestFunctionReference.Any,\n // biome-ignore lint/suspicious/noExplicitAny: intentional\n> = TFunction extends InngestFunctionReference<any, infer IOutput>\n ? VoidToNull<SimplifyDeep<IOutput>>\n : unknown;\n\n/**\n * Helper type that converts void/undefined/never to null.\n * Uses ReturnType trick to check for void without directly using void in type position.\n * @internal\n */\ntype VoidToNull<T> = IsNever<T> extends true\n ? null\n : T extends ReturnType<() => void>\n ? null\n : T;\n\n/**\n * A helper type to extract the inferred options from a given Inngest instance.\n *\n * @example\n * ```ts\n * type Options = ClientOptionsFromInngest<typeof inngest>;\n * ```\n *\n * @public\n */\n\nexport type ClientOptionsFromInngest<TInngest extends Inngest.Any> =\n TInngest extends Inngest<infer U> ? U : ClientOptions;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Inngest.js","names":["headers: Record<string, string>","fields: Record<string, unknown>","realtimeSubscribe","realtimeGetSubscriptionToken","transformArgs: Middleware.TransformFunctionInputArgs","payloads: EventPayload[]","payload","rawBody: unknown","body: SendEventResponse | undefined","logger: Logger","childMetadata: Record<string, unknown>"],"sources":["../../src/components/Inngest.ts"],"sourcesContent":["import { InngestApi } from \"../api/api.ts\";\nimport {\n defaultDevServerHost,\n defaultInngestApiBaseUrl,\n defaultInngestEventBaseUrl,\n dummyEventKey,\n envKeys,\n headerKeys,\n} from \"../helpers/consts.ts\";\nimport { createEntropy } from \"../helpers/crypto.ts\";\nimport {\n type Env,\n getFetch,\n getProcessEnv,\n inngestHeaders,\n type Mode,\n normalizeUrl,\n parseAsBoolean,\n protectEnv,\n} from \"../helpers/env.ts\";\nimport { type ErrCode, fixEventKeyMissingSteps } from \"../helpers/errors.ts\";\nimport type { Jsonify } from \"../helpers/jsonify.ts\";\nimport {\n formatLogMessage,\n type StructuredLogMessage,\n warnOnce,\n} from \"../helpers/log.ts\";\nimport { retryWithBackoff } from \"../helpers/promises.ts\";\nimport { stringify } from \"../helpers/strings.ts\";\nimport type {\n AsArray,\n IsNever,\n SendEventPayload,\n SimplifyDeep,\n SingleOrArray,\n} from \"../helpers/types.ts\";\nimport {\n ConsoleLogger,\n type Logger,\n ProxyLogger,\n} from \"../middleware/logger.ts\";\nimport {\n type ApplyAllMiddlewareCtxExtensions,\n type ApplyAllMiddlewareStepExtensions,\n type ApplyAllMiddlewareTransforms,\n type BaseContext,\n type ClientOptions,\n type EventPayload,\n type FailureEventArgs,\n type Handler,\n type InvokeTargetFunctionDefinition,\n type MetadataTarget,\n type SendEventOutput,\n type SendEventResponse,\n sendEventResponseSchema,\n} from \"../types.ts\";\nimport { getAsyncCtx } from \"./execution/als.ts\";\nimport { metadataSpanProcessor } from \"./execution/otel/metadataProcessor.ts\";\nimport { InngestFunction } from \"./InngestFunction.ts\";\nimport type { InngestFunctionReference } from \"./InngestFunctionReference.ts\";\nimport {\n type MetadataBuilder,\n UnscopedMetadataBuilder,\n} from \"./InngestMetadata.ts\";\nimport type { createStepTools } from \"./InngestStepTools.ts\";\nimport { step } from \"./InngestStepTools.ts\";\nimport { buildWrapSendEventChain, Middleware } from \"./middleware/index.ts\";\nimport {\n getSubscriptionToken as realtimeGetSubscriptionToken,\n subscribe as realtimeSubscribe,\n} from \"./realtime/subscribe/index.ts\";\nimport type { Realtime } from \"./realtime/types\";\nimport {\n type HandlerWithTriggers,\n isValidatable,\n} from \"./triggers/typeHelpers.ts\";\n\ntype ChannelTopicNames<InputChannel extends Realtime.ChannelInput> = Extract<\n keyof Realtime.Channel.InferTopics<InputChannel>,\n string\n>;\n\ntype ChannelTopicsInput<InputChannel extends Realtime.ChannelInput> = [\n ChannelTopicNames<InputChannel>,\n] extends [never]\n ? string[]\n : string extends ChannelTopicNames<InputChannel>\n ? string[]\n : ChannelTopicNames<InputChannel>[];\n\n/**\n * Capturing the global type of fetch so that we can reliably access it below.\n */\ntype FetchT = typeof fetch;\n\n/**\n * A client used to interact with the Inngest API by sending or reacting to\n * events.\n *\n * ```ts\n * const inngest = new Inngest({ id: \"my-app\" });\n * ```\n *\n * @public\n */\n\n/**\n * Symbol for accessing the SDK's internal logger. Not part of the public API.\n * @internal\n */\nexport const internalLoggerSymbol = Symbol.for(\"inngest.internalLogger\");\n\nexport class Inngest<const TClientOpts extends ClientOptions = ClientOptions>\n implements Inngest.Like\n{\n get [Symbol.toStringTag](): typeof Inngest.Tag {\n return Inngest.Tag;\n }\n\n /**\n * The ID of this instance, most commonly a reference to the application it\n * resides in.\n *\n * The ID of your client should remain the same for its lifetime; if you'd\n * like to change the name of your client as it appears in the Inngest UI,\n * change the `name` property instead.\n */\n public readonly id: string;\n\n /**\n * Stores the options so we can remember explicit settings the user has\n * provided.\n */\n private readonly options: TClientOpts;\n\n private readonly inngestApi: InngestApi;\n\n private readonly _userProvidedFetch?: FetchT;\n private _cachedFetch?: FetchT;\n\n private readonly _logger: Logger;\n\n /**\n * Logger for SDK internal messages. Falls back to the user's `logger` if\n * `internalLogger` is not provided in client options.\n *\n * @internal\n */\n readonly [internalLoggerSymbol]: Logger;\n\n private localFns: InngestFunction.Any[] = [];\n\n /**\n * Middleware instances that provide simpler hooks.\n */\n readonly middleware: Middleware.Class[];\n\n private _env: Env = {};\n\n private _appVersion: string | undefined;\n\n /**\n * @internal\n * Flag set by metadataMiddleware to enable step.metadata()\n */\n protected experimentalMetadataEnabled = false;\n\n /**\n * A dummy Inngest function used in Durable Endpoints. This is necessary\n * because the vast majority of middleware hooks require the Inngest function.\n * But for Durable Endpoints, there is no Inngest function. So we need some\n * placeholder.\n */\n private dummyDurableEndpointFunction: InngestFunction.Any | null = null;\n private getDummyDurableEndpointFunction(): InngestFunction.Any {\n if (this.dummyDurableEndpointFunction) {\n return this.dummyDurableEndpointFunction;\n }\n this.dummyDurableEndpointFunction = new InngestFunction(\n this,\n { id: \"__proxy__\", triggers: [] },\n async () => {},\n );\n return this.dummyDurableEndpointFunction;\n }\n\n /**\n * Try to parse the `INNGEST_DEV` environment variable as a URL.\n * Returns the URL if valid, otherwise `undefined`.\n */\n get explicitDevUrl(): URL | undefined {\n const devEnvValue = this._env[envKeys.InngestDevMode];\n if (typeof devEnvValue !== \"string\" || !devEnvValue) {\n return undefined;\n }\n\n if (parseAsBoolean(devEnvValue) !== undefined) {\n return undefined;\n }\n\n try {\n return new URL(normalizeUrl(devEnvValue));\n } catch {\n return undefined;\n }\n }\n\n /**\n * Given a default cloud URL, return the appropriate URL based on the\n * current mode and environment variables.\n *\n * If `INNGEST_DEV` is set to a URL, that URL is used. Otherwise, we use\n * the default cloud URL in cloud mode or the default dev server host in\n * dev mode.\n */\n private resolveDefaultUrl(cloudUrl: string): string {\n const explicitDevUrl = this.explicitDevUrl;\n if (explicitDevUrl) {\n return explicitDevUrl.href;\n }\n\n return this.mode === \"cloud\" ? cloudUrl : defaultDevServerHost;\n }\n\n get apiBaseUrl(): string {\n return (\n this.options.baseUrl ||\n this._env[envKeys.InngestApiBaseUrl] ||\n this._env[envKeys.InngestBaseUrl] ||\n this.resolveDefaultUrl(defaultInngestApiBaseUrl)\n );\n }\n\n get eventBaseUrl(): string {\n return (\n this.options.baseUrl ||\n this._env[envKeys.InngestEventApiBaseUrl] ||\n this._env[envKeys.InngestBaseUrl] ||\n this.resolveDefaultUrl(defaultInngestEventBaseUrl)\n );\n }\n\n get eventKey(): string | undefined {\n return (\n this.options.eventKey || this._env[envKeys.InngestEventKey] || undefined\n );\n }\n\n // defer fetch resolution until first use, but cache for reference stability\n get fetch(): FetchT {\n if (!this._cachedFetch) {\n this._cachedFetch = this._userProvidedFetch\n ? getFetch(this[internalLoggerSymbol], this._userProvidedFetch)\n : getFetch(this[internalLoggerSymbol], globalThis.fetch);\n }\n return this._cachedFetch;\n }\n\n get signingKey(): string | undefined {\n return this.options.signingKey || this._env[envKeys.InngestSigningKey];\n }\n\n get signingKeyFallback(): string | undefined {\n return (\n this.options.signingKeyFallback ||\n this._env[envKeys.InngestSigningKeyFallback]\n );\n }\n\n get headers(): Record<string, string> {\n return inngestHeaders({\n inngestEnv: this.options.env,\n env: this._env,\n });\n }\n\n /**\n * The base logger for this client. Passed to user functions as `ctx.logger`.\n */\n get logger(): Logger {\n return this._logger;\n }\n\n get env(): string | null {\n return this.headers[headerKeys.Environment] ?? null;\n }\n\n get appVersion(): string | undefined {\n return this._appVersion;\n }\n\n /**\n * Access the metadata builder for updating run and step metadata.\n *\n * @example\n * ```ts\n * // Update metadata for the current run\n * await inngest.metadata.update({ status: \"processing\" });\n *\n * // Update metadata for a different run\n * await inngest.metadata.run(otherRunId).update({ key: \"val\" });\n *\n * ```\n */\n get metadata(): MetadataBuilder {\n if (!this.experimentalMetadataEnabled) {\n throw new Error(\n 'inngest.metadata is experimental. Enable it by adding metadataMiddleware() from \"inngest/experimental\" to your client middleware.',\n );\n }\n return new UnscopedMetadataBuilder(this);\n }\n\n /**\n * A client used to interact with the Inngest API by sending or reacting to\n * events.\n *\n * ```ts\n * const inngest = new Inngest({ id: \"my-app\" });\n * ```\n */\n constructor(options: TClientOpts) {\n this.options = options;\n\n const { id, logger, middleware, appVersion } = this.options;\n\n if (!id) {\n throw new Error(\"An `id` must be passed to create an Inngest instance.\");\n }\n\n this.id = id;\n this._env = protectEnv({ ...getProcessEnv() });\n this._userProvidedFetch = options.fetch;\n\n this.inngestApi = new InngestApi({\n baseUrl: () => this.apiBaseUrl,\n signingKey: () => this.signingKey,\n signingKeyFallback: () => this.signingKeyFallback,\n fetch: () => this.fetch,\n });\n\n this._logger = logger ?? new ConsoleLogger();\n this[internalLoggerSymbol] = this.options.internalLogger ?? this._logger;\n\n // Warned here rather than per-function so internal SDK functions\n // inheriting this setting don't each warn.\n if (this.options.optimizeParallelism === false) {\n warnOnce(\n this[internalLoggerSymbol],\n `optimize-parallelism-deprecated:${this.id}`,\n '`optimizeParallelism: false` is deprecated; use `group.parallel({ mode: \"race\" }, ...)` for race semantics instead',\n );\n }\n\n this.middleware = [\n ...builtInMiddleware(this._logger),\n ...(middleware ?? []),\n ];\n\n for (const mw of this.middleware) {\n mw.onRegister?.({ client: this, fn: null });\n }\n\n // Attach the read-only AI metadata span processor to whatever global OTel\n // provider already exists. Idempotent across clients; only attaches once.\n metadataSpanProcessor.attach();\n\n this._appVersion = appVersion;\n }\n\n /**\n * Returns a `Promise` that resolves when the app is ready and all middleware\n * has been initialized.\n */\n public get ready(): Promise<void> {\n // Previously this was used to ensure that we could wait for middleware\n // to be instantiated, but we now no longer have a set-up function\n // that we await, so middleware is always ready to go.\n return Promise.resolve();\n }\n\n /**\n * Set the environment variables for this client. This is useful if you are\n * passed environment variables at runtime instead of as globals and need to\n * update the client with those values as requests come in.\n */\n public setEnvVars(\n env: Record<string, string | undefined> = getProcessEnv(),\n ): this {\n this._env = protectEnv({ ...this._env, ...env });\n\n return this;\n }\n\n get mode(): Mode {\n if (typeof this.options.isDev === \"boolean\") {\n return this.options.isDev ? \"dev\" : \"cloud\";\n }\n\n const envIsDev = parseAsBoolean(this._env[envKeys.InngestDevMode]);\n if (typeof envIsDev === \"boolean\") {\n return envIsDev ? \"dev\" : \"cloud\";\n }\n\n if (this.explicitDevUrl) {\n return \"dev\";\n }\n\n return \"cloud\";\n }\n\n /**\n * Given a response from Inngest, relay the error to the caller.\n */\n private async getResponseError(\n response: globalThis.Response,\n rawBody: unknown,\n foundErr = \"Unknown error\",\n ): Promise<Error> {\n let errorMessage = foundErr;\n\n if (errorMessage === \"Unknown error\") {\n switch (response.status) {\n case 401:\n errorMessage = \"Event key Not Found\";\n break;\n case 400:\n errorMessage = \"Cannot process event payload\";\n break;\n case 403:\n errorMessage = \"Forbidden\";\n break;\n case 404:\n errorMessage = \"Event key not found\";\n break;\n case 406:\n errorMessage = `${JSON.stringify(await rawBody)}`;\n break;\n case 409:\n case 412:\n errorMessage = \"Event transformation failed\";\n break;\n case 413:\n errorMessage = \"Event payload too large\";\n break;\n case 500:\n errorMessage = \"Internal server error\";\n break;\n default:\n try {\n errorMessage = await response.text();\n } catch (_err) {\n errorMessage = `${JSON.stringify(await rawBody)}`;\n }\n break;\n }\n }\n\n return new Error(`Inngest API Error: ${response.status} ${errorMessage}`);\n }\n\n private eventKeySet(): boolean {\n return this.eventKey !== undefined;\n }\n\n /**\n * EXPERIMENTAL: This API is not yet stable and may change in the future\n * without a major version bump.\n *\n * Send a Signal to Inngest.\n */\n public async sendSignal({\n signal,\n data,\n env,\n }: {\n /**\n * The signal to send.\n */\n signal: string;\n\n /**\n * The data to send with the signal.\n */\n data?: unknown;\n\n /**\n * The Inngest environment to send the signal to. Defaults to whichever\n * environment this client's key is associated with.\n *\n * It's like you never need to change this unless you're trying to sync\n * multiple systems together using branch names.\n */\n env?: string;\n }): Promise<InngestApi.SendSignalResponse> {\n const headers: Record<string, string> = {\n ...(env ? { [headerKeys.Environment]: env } : {}),\n };\n\n return this._sendSignal({ signal, data, headers });\n }\n\n private async _sendSignal({\n signal,\n data,\n headers,\n }: {\n signal: string;\n data?: unknown;\n headers?: Record<string, string>;\n }): Promise<InngestApi.SendSignalResponse> {\n const res = await this.inngestApi.sendSignal(\n { signal, data },\n { ...this.headers, ...headers },\n );\n if (res.ok) {\n return res.value;\n }\n\n throw new Error(\n `Failed to send signal: ${res.error?.error || \"Unknown error\"}`,\n );\n }\n\n private async updateMetadata({\n target,\n metadata,\n headers,\n }: {\n target: MetadataTarget;\n metadata: Array<{\n kind: string;\n op: string;\n values: Record<string, unknown>;\n }>;\n headers?: Record<string, string>;\n }): Promise<void> {\n const res = await this.inngestApi.updateMetadata(\n {\n target,\n metadata,\n },\n { headers },\n );\n if (res.ok) {\n return res.value;\n }\n\n throw new Error(\n `Failed to update metadata: ${res.error?.error || \"Unknown error\"}`,\n );\n }\n\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: used in the SDK\n private async warnMetadata(\n target: MetadataTarget,\n kind: ErrCode,\n log: StructuredLogMessage,\n ) {\n const fields: Record<string, unknown> = {};\n if (log.code) {\n fields.code = log.code;\n }\n if (log.explanation) {\n fields.explanation = log.explanation;\n }\n if (log.action) {\n fields.action = log.action;\n }\n if (log.docs) {\n fields.docs = log.docs;\n }\n\n if (Object.keys(fields).length > 0) {\n this[internalLoggerSymbol].warn(fields, log.message);\n } else {\n this[internalLoggerSymbol].warn(log.message);\n }\n\n if (!this.experimentalMetadataEnabled) {\n return;\n }\n\n await this.updateMetadata({\n target: target,\n metadata: [\n {\n kind: \"inngest.warnings\",\n op: \"merge\",\n values: {\n [`sdk.${kind}`]: formatLogMessage(log),\n },\n },\n ],\n });\n }\n\n /**\n * Realtime-related functionality for this Inngest client.\n */\n public realtime: {\n /**\n * Publish data to a realtime channel topic.\n *\n * This is a non-durable publish, it executes immediately and is not\n * memoized. If called inside an Inngest function, it will automatically\n * include the current run ID. For durable publishing inside functions, use\n * `step.realtime.publish()`.\n *\n * ```ts\n * await inngest.realtime.publish(ch.status, { message: \"Processing...\" });\n * ```\n */\n publish: Realtime.TypedPublishFn;\n\n /**\n * Subscribe to realtime messages on a channel, returning a readable stream.\n */\n subscribe: {\n <\n const InputChannel extends Realtime.ChannelInput,\n const InputTopics extends ChannelTopicsInput<InputChannel>,\n const TToken extends Realtime.Subscribe.Token<\n InputChannel,\n InputTopics\n >,\n >(opts: {\n channel: InputChannel;\n topics: InputTopics;\n validate?: boolean;\n onMessage: Realtime.Subscribe.Callback<TToken>;\n onError?: (err: unknown) => void;\n }): Promise<Realtime.Subscribe.CallbackSubscription>;\n <\n const InputChannel extends Realtime.ChannelInput,\n const InputTopics extends ChannelTopicsInput<InputChannel>,\n const TToken extends Realtime.Subscribe.Token<\n InputChannel,\n InputTopics\n >,\n >(opts: {\n channel: InputChannel;\n topics: InputTopics;\n validate?: boolean;\n }): Promise<Realtime.Subscribe.StreamSubscription<TToken>>;\n };\n\n /**\n * Generate a subscription token for subscribing to realtime messages.\n */\n token: <\n const InputChannel extends Realtime.ChannelInput,\n const InputTopics extends ChannelTopicsInput<InputChannel>,\n const TToken extends Realtime.Subscribe.Token<InputChannel, InputTopics>,\n >(opts: {\n channel: InputChannel;\n topics: InputTopics;\n }) => Promise<TToken>;\n } = {\n publish: async (topicRef, data) => {\n const topicConfig = topicRef.config;\n if (topicConfig && \"schema\" in topicConfig && topicConfig.schema) {\n const result = await topicConfig.schema[\"~standard\"].validate(data);\n if (result.issues) {\n throw new Error(\n `Schema validation failed for topic \"${topicRef.topic}\"`,\n );\n }\n }\n\n const ctx = await getAsyncCtx();\n const runId = ctx?.execution?.ctx.runId;\n\n const res = await this.inngestApi.publish(\n {\n channel: topicRef.channel,\n topics: [topicRef.topic],\n runId,\n },\n data,\n );\n\n if (!res.ok) {\n throw new Error(\n `Failed to publish to realtime: ${\n res.error?.error || \"Unknown error\"\n }`,\n );\n }\n },\n\n subscribe: async (opts) => {\n // biome-ignore lint/suspicious/noExplicitAny: sacrifice for clean generics\n return realtimeSubscribe({ ...opts, app: this } as any) as any;\n },\n\n token: async (opts) => {\n // biome-ignore lint/suspicious/noExplicitAny: sacrifice for clean generics\n return realtimeGetSubscriptionToken(this, opts as any) as any;\n },\n };\n\n public endpoint<THandler extends Inngest.EndpointHandler<this>>(\n handler: THandler,\n ): THandler {\n if (!this.options.endpointAdapter) {\n throw new Error(\n \"No endpoint adapter configured for this Inngest client.\",\n );\n }\n\n return this.options.endpointAdapter({ client: this })(handler);\n }\n\n /**\n * Creates a proxy handler that polls Inngest for durable endpoint results.\n *\n * The proxy:\n * - Extracts `runId` and `token` from query params\n * - Fetches the result from Inngest API\n * - Runs the response through middleware (e.g., decryption)\n * - Adds CORS headers\n *\n * Use this in combination with the `asyncRedirectUrl` option on your\n * endpoint adapter to redirect users to your own proxy endpoint instead\n * of directly to Inngest.\n *\n * @example\n * ```ts\n * import { Inngest } from \"inngest\";\n * import { endpointAdapter } from \"inngest/edge\";\n *\n * const inngest = new Inngest({\n * id: \"my-app\",\n * endpointAdapter: endpointAdapter.withOptions({\n * asyncRedirectUrl: \"/api/inngest/poll\",\n * }),\n * });\n *\n * // Durable endpoint\n * export const GET = inngest.endpoint(async (req) => {\n * const result = await step.run(\"work\", () => \"done\");\n * return new Response(result);\n * });\n *\n * // Proxy endpoint at /api/inngest/poll\n * export const GET = inngest.endpointProxy();\n * ```\n */\n public endpointProxy(): Inngest.ProxyHandler<this> {\n if (!this.options.endpointAdapter) {\n throw new Error(\n \"No endpoint adapter configured for this Inngest client.\",\n );\n }\n\n if (!this.options.endpointAdapter.createProxyHandler) {\n throw new Error(\n \"The configured endpoint adapter does not support proxy handlers.\",\n );\n }\n\n return this.options.endpointAdapter.createProxyHandler({ client: this });\n }\n\n /**\n * Decrypt a proxy response using the client's middleware stack.\n *\n * Runs `transformFunctionInput` on each middleware instance to decrypt\n * step data (used by encryption middleware).\n *\n * Uses type assertions because we're creating a minimal \"fake\" execution\n * context just to run the decryption middleware hooks - not a full execution.\n *\n * @internal\n */\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: accessed via bracket notation by InngestProxyHandler\n private async decryptProxyResult<T extends { data?: unknown }>(\n result: T,\n ): Promise<T> {\n if (!result.data) {\n return result;\n }\n\n const mwInstances = this.middleware.map((Cls) => {\n return new Cls({ client: this });\n });\n\n const dummyEvent = { name: \"__proxy__\", data: {} };\n const dummyCtx = {\n event: dummyEvent,\n events: [dummyEvent],\n runId: \"__proxy__\",\n attempt: 0,\n step,\n } as unknown as BaseContext<Inngest.Any>;\n\n let transformArgs: Middleware.TransformFunctionInputArgs = {\n ctx: dummyCtx,\n fn: this.getDummyDurableEndpointFunction(),\n steps: {\n __result__: { type: \"data\" as const, data: result.data },\n },\n };\n\n for (const mw of mwInstances) {\n if (mw.transformFunctionInput) {\n transformArgs = await mw.transformFunctionInput(transformArgs);\n }\n }\n\n const decryptedStep = transformArgs.steps?.__result__;\n let decryptedData = result.data;\n if (decryptedStep && \"data\" in decryptedStep) {\n decryptedData = decryptedStep.data as typeof decryptedData;\n }\n\n return { ...result, data: decryptedData };\n }\n\n /**\n * Send one or many events to Inngest. Takes an entire payload (including\n * name) as each input.\n *\n * ```ts\n * await inngest.send({ name: \"app/user.created\", data: { id: 123 } });\n * ```\n *\n * Returns a promise that will resolve if the event(s) were sent successfully,\n * else throws with an error explaining what went wrong.\n */\n public async send(\n payload: SendEventPayload,\n options?: {\n /**\n * The Inngest environment to send events to. Defaults to whichever\n * environment this client's event key is associated with.\n *\n * It's likely you never need to change this unless you're trying to sync\n * multiple systems together using branch names.\n */\n env?: string;\n },\n ): Promise<SendEventOutput<TClientOpts>> {\n const headers: Record<string, string> = {\n ...(options?.env ? { [headerKeys.Environment]: options.env } : {}),\n };\n\n return this._send({\n payload,\n headers,\n fnMiddleware: [],\n fn: null,\n });\n }\n\n /**\n * Internal method for sending an event, used to allow Inngest internals to\n * further customize the request sent to an Inngest Server.\n */\n private async _send({\n payload,\n headers,\n fn,\n fnMiddleware,\n }: {\n payload: SendEventPayload;\n headers?: Record<string, string>;\n fn: InngestFunction.Any | null;\n fnMiddleware: Middleware.Class[];\n }): Promise<SendEventOutput<TClientOpts>> {\n const nowMillis = new Date().getTime();\n\n let maxAttempts = 5;\n\n // Attempt to set the event ID seed header. If it fails then disable retries\n // (but we still want to send the event).\n try {\n const entropy = createEntropy(10);\n const entropyBase64 = Buffer.from(entropy).toString(\"base64\");\n headers = {\n ...headers,\n [headerKeys.EventIdSeed]: `${nowMillis},${entropyBase64}`,\n };\n } catch (err) {\n this[internalLoggerSymbol].debug(\n { err },\n \"Event-sending retries disabled\",\n );\n\n // Disable retries.\n maxAttempts = 1;\n }\n\n let payloads: EventPayload[] = Array.isArray(payload)\n ? (payload as EventPayload[])\n : payload\n ? ([payload] as [EventPayload])\n : [];\n\n // Instantiate fresh middleware per send() call.\n const mwInstances = [...this.middleware, ...fnMiddleware].map(\n (Cls) => new Cls({ client: this }),\n );\n for (const mw of mwInstances) {\n if (mw?.transformSendEvent) {\n const transformed = await mw.transformSendEvent({\n events: payloads,\n fn: fn ?? null,\n });\n if (transformed !== undefined) {\n payloads = transformed.events;\n }\n }\n }\n\n // Validate payloads that have a validate method (from `EventType.create()`)\n for (const payload of payloads) {\n if (isValidatable(payload)) {\n await payload.validate();\n }\n }\n\n // Ensure that we always add \"ts\" and \"data\" fields to events. \"ts\" is auto-\n // filled by the event server so is safe, and adding here fixes Next.js\n // server action cache issues.\n payloads = payloads.map((p) => {\n return {\n ...p,\n // Always generate an idempotency ID for an event for retries\n id: p.id,\n ts: p.ts || nowMillis,\n data: p.data || {},\n };\n });\n\n /**\n * It can be valid for a user to send an empty list of events; if this\n * happens, show a warning that this may not be intended, but don't throw.\n */\n if (!payloads.length) {\n this[internalLoggerSymbol].warn(\n \"inngest.send() called with no events; the returned promise will resolve, but no events have been sent\",\n );\n\n return { ids: [] } as SendEventOutput<TClientOpts>;\n }\n\n /**\n * If in prod mode and key is not present, fail now.\n */\n if (this.mode === \"cloud\" && !this.eventKeySet()) {\n throw new Error(\n formatLogMessage({\n message: \"Failed to send event\",\n explanation:\n \"Your event or events were not sent to Inngest. We couldn't find an event key to use to send events to Inngest.\",\n action: fixEventKeyMissingSteps.join(\"; \"),\n }),\n );\n }\n\n const innerHandler = async () => {\n const body = await retryWithBackoff(\n async () => {\n let rawBody: unknown;\n let body: SendEventResponse | undefined;\n\n // We don't need to do fallback auth here because this uses event keys and\n // not signing keys\n const url = new URL(\n `e/${this.eventKey ?? dummyEventKey}`,\n this.eventBaseUrl,\n );\n const response = await this.fetch(url.href, {\n method: \"POST\",\n body: stringify(payloads),\n headers: { ...this.headers, ...headers },\n });\n\n try {\n rawBody = await response.json();\n body = await sendEventResponseSchema.parseAsync(rawBody);\n } catch (_err) {\n throw await this.getResponseError(response, rawBody);\n }\n\n if (body.status !== 200 || body.error) {\n throw await this.getResponseError(response, rawBody, body.error);\n }\n\n return body;\n },\n {\n maxAttempts,\n baseDelay: 100,\n },\n );\n\n return { ids: body.ids } as SendEventOutput<TClientOpts>;\n };\n\n const wrappedHandler = buildWrapSendEventChain(\n mwInstances,\n innerHandler,\n payloads,\n fn,\n );\n\n return (await wrappedHandler()) as SendEventOutput<TClientOpts>;\n }\n\n public createFunction: Inngest.CreateFunction<this> = (\n rawOptions,\n handler,\n ) => {\n const fn = this._createFunction(rawOptions, handler);\n\n for (const mw of fn.opts.middleware ?? []) {\n mw.onRegister?.({ client: this, fn });\n }\n\n this.localFns.push(fn);\n\n return fn;\n };\n\n public get funcs() {\n return this.localFns;\n }\n\n private _createFunction: Inngest.CreateFunction<this> = (\n rawOptions,\n handler,\n ) => {\n if (typeof handler !== \"function\") {\n throw new Error(\n `\"createFunction\" expected a handler function as the second argument. Triggers belong in the first argument: createFunction({ id, triggers: { event: \"...\" } }, handler)`,\n );\n }\n\n const options = {\n ...rawOptions,\n triggers: this.sanitizeTriggers(rawOptions.triggers),\n };\n\n return new InngestFunction(this, options, handler);\n };\n\n /**\n * Runtime-only validation.\n */\n private sanitizeTriggers<\n T extends SingleOrArray<InngestFunction.Trigger<string>> | undefined,\n >(\n triggers: T | undefined,\n ): T extends undefined ? [] : AsArray<NonNullable<T>> {\n type Result = T extends undefined ? [] : AsArray<NonNullable<T>>;\n\n if (triggers === undefined) {\n return [] as Result;\n }\n\n if (!Array.isArray(triggers)) {\n return [triggers] as Result;\n }\n\n return triggers as Result;\n }\n}\n\n/**\n * Default middleware that is included in every client, placed before the user's\n * middleware. Returns new-style `Middleware.Class` constructors. Uses a closure\n * so the no-arg constructors can capture the base logger.\n */\nexport function builtInMiddleware(baseLogger: Logger) {\n return [\n class LoggerMiddleware extends Middleware.BaseMiddleware {\n readonly id = \"inngest:logger\";\n proxyLogger = new ProxyLogger(baseLogger);\n\n override transformFunctionInput(\n arg: Middleware.TransformFunctionInputArgs,\n ) {\n let logger: Logger = baseLogger;\n\n // Create a child logger with run metadata if supported\n if (\"child\" in logger) {\n try {\n const childMetadata: Record<string, unknown> = {\n runID: arg.ctx.runId,\n eventName: arg.ctx.event.name,\n };\n if (typeof arg.ctx.requestId !== \"undefined\") {\n childMetadata.requestId = arg.ctx.requestId;\n }\n if (typeof arg.ctx.jobId !== \"undefined\") {\n childMetadata.jobId = arg.ctx.jobId;\n }\n logger = (\n logger.child as (meta: Record<string, unknown>) => Logger\n )(childMetadata);\n } catch (err) {\n logger.error({ err }, 'failed to create \"childLogger\" with error');\n }\n }\n\n this.proxyLogger = new ProxyLogger(logger);\n\n return {\n ...arg,\n ctx: Object.assign({}, arg.ctx, {\n logger: this.proxyLogger as Logger,\n }),\n };\n }\n\n override onMemoizationEnd() {\n this.proxyLogger.enable();\n }\n\n override onStepError(arg: Middleware.OnStepErrorArgs) {\n this.proxyLogger.error({ err: arg.error }, \"Inngest step error\");\n }\n\n override wrapFunctionHandler({\n next,\n }: Middleware.WrapFunctionHandlerArgs) {\n return next().catch((err: unknown) => {\n this.proxyLogger.error({ err }, \"Inngest function error\");\n throw err;\n });\n }\n\n override wrapRequest({ next }: Middleware.WrapRequestArgs) {\n return next().finally(() => this.proxyLogger.flush());\n }\n },\n ] as const;\n}\n\n/**\n * A client used to interact with the Inngest API by sending or reacting to\n * events.\n *\n * ```ts\n * const inngest = new Inngest({ id: \"my-app\" });\n * ```\n *\n * @public\n */\nexport namespace Inngest {\n export const Tag = \"Inngest.App\" as const;\n\n /**\n * Represents any `Inngest` instance, regardless of generics and inference.\n *\n * Prefer use of `Inngest.Like` where possible to ensure compatibility with\n * multiple versions.\n */\n export type Any = Inngest;\n\n /**\n * References any `Inngest` instance across library versions, useful for use\n * in public APIs to ensure compatibility with multiple versions.\n *\n * Prefer use of `Inngest.Any` internally and `Inngest.Like` for public APIs.\n */\n export interface Like {\n readonly [Symbol.toStringTag]: typeof Inngest.Tag;\n }\n\n export type EndpointHandler<TClient extends Inngest.Any> = ReturnType<\n NonNullable<ClientOptionsFromInngest<TClient>[\"endpointAdapter\"]>\n >;\n\n type ResolveTriggers<T> = T extends undefined ? [] : AsArray<NonNullable<T>>;\n\n /**\n * Input type for createFunction that accepts raw trigger input (single,\n * array, or undefined) while keeping all other fields from\n * InngestFunction.Options.\n */\n export type CreateFunctionInput<\n TFnMiddleware extends Middleware.Class[] | undefined,\n TTriggers extends\n | SingleOrArray<InngestFunction.Trigger<string>>\n | undefined,\n TFailureHandler extends Handler.Any,\n > = Omit<\n InngestFunction.Options<InngestFunction.Trigger<string>[], TFailureHandler>,\n \"triggers\"\n > & {\n triggers?: TTriggers;\n middleware?: TFnMiddleware;\n };\n\n /**\n * The type of the proxy handler returned by `endpointProxy()`.\n *\n * This type is inferred from the `createProxyHandler` function of the\n * endpoint adapter configured on the client.\n */\n export type ProxyHandler<TClient extends Inngest.Any> = ReturnType<\n NonNullable<\n NonNullable<\n ClientOptionsFromInngest<TClient>[\"endpointAdapter\"]\n >[\"createProxyHandler\"]\n >\n >;\n\n export type CreateFunction<TClient extends Inngest.Any> = <\n const TTriggers extends\n | SingleOrArray<InngestFunction.Trigger<string>>\n | undefined = undefined,\n const TFnMiddleware extends Middleware.Class[] | undefined = undefined,\n THandler extends Handler.Any = HandlerWithTriggers<\n ReturnType<typeof createStepTools<TClient, TFnMiddleware>>,\n ResolveTriggers<TTriggers>,\n ApplyAllMiddlewareCtxExtensions<\n [...ReturnType<typeof builtInMiddleware>]\n > &\n ApplyAllMiddlewareCtxExtensions<\n ClientOptionsFromInngest<TClient>[\"middleware\"]\n > &\n ApplyAllMiddlewareCtxExtensions<TFnMiddleware> & {\n step: ReturnType<typeof createStepTools<TClient, TFnMiddleware>> &\n ApplyAllMiddlewareStepExtensions<\n ClientOptionsFromInngest<TClient>[\"middleware\"]\n > &\n ApplyAllMiddlewareStepExtensions<TFnMiddleware>;\n }\n >,\n TFailureHandler extends Handler.Any = HandlerWithTriggers<\n ReturnType<typeof createStepTools<TClient, TFnMiddleware>>,\n ResolveTriggers<TTriggers>,\n ApplyAllMiddlewareCtxExtensions<\n [...ReturnType<typeof builtInMiddleware>]\n > &\n FailureEventArgs<EventPayload> &\n ApplyAllMiddlewareCtxExtensions<\n ClientOptionsFromInngest<TClient>[\"middleware\"]\n > &\n ApplyAllMiddlewareCtxExtensions<TFnMiddleware> & {\n step: ReturnType<typeof createStepTools<TClient, TFnMiddleware>> &\n ApplyAllMiddlewareStepExtensions<\n ClientOptionsFromInngest<TClient>[\"middleware\"]\n > &\n ApplyAllMiddlewareStepExtensions<TFnMiddleware>;\n }\n >,\n >(\n options: CreateFunctionInput<TFnMiddleware, TTriggers, TFailureHandler>,\n handler: THandler,\n ) => InngestFunction<\n InngestFunction.Options<ResolveTriggers<TTriggers>, TFailureHandler>,\n THandler,\n TFailureHandler,\n TClient,\n ResolveTriggers<TTriggers>\n >;\n}\n\n/**\n * A helper type to extract the type of a set of event tooling from a given\n * Inngest instance and optionally a trigger.\n *\n * @example Get generic step tools for an Inngest instance.\n * ```ts\n * type StepTools = GetStepTools<typeof inngest>;\n * ```\n *\n * @example Get step tools with a trigger, ensuring tools like `waitForEvent` are typed.\n * ```ts\n * type StepTools = GetStepTools<typeof Inngest, \"github/pull_request\">;\n * ```\n *\n * @public\n */\nexport type GetStepTools<TInngest extends Inngest.Any> =\n GetFunctionInput<TInngest> extends { step: infer TStep } ? TStep : never;\n\n/**\n * A helper type to extract the type of the input to a function from a given\n * Inngest instance and optionally a trigger.\n *\n * @example Get generic function input for an Inngest instance.\n * ```ts\n * type Input = GetFunctionInput<typeof inngest>;\n * ```\n *\n * @example Get function input with a trigger, ensuring tools like `waitForEvent` are typed.\n * ```ts\n * type Input = GetFunctionInput<typeof Inngest, \"github/pull_request\">;\n * ```\n *\n * @public\n */\nexport type GetFunctionInput<TClient extends Inngest.Any> = Parameters<\n Handler<\n TClient,\n ApplyAllMiddlewareCtxExtensions<[...ReturnType<typeof builtInMiddleware>]> &\n ApplyAllMiddlewareCtxExtensions<\n ClientOptionsFromInngest<TClient>[\"middleware\"]\n > & {\n step: ReturnType<typeof createStepTools<TClient>> &\n ApplyAllMiddlewareStepExtensions<\n ClientOptionsFromInngest<TClient>[\"middleware\"]\n >;\n }\n >\n>[0];\n\n/**\n * A helper type to extract the type of the output of an Inngest function.\n *\n * @example Get a function's output\n * ```ts\n * type Output = GetFunctionOutput<typeof myFunction>;\n * ```\n *\n * @public\n */\nexport type GetFunctionOutput<\n TFunction extends InvokeTargetFunctionDefinition,\n> = TFunction extends InngestFunction.Any\n ? GetFunctionOutputFromInngestFunction<TFunction>\n : TFunction extends InngestFunctionReference.Any\n ? GetFunctionOutputFromReferenceInngestFunction<TFunction>\n : unknown;\n\n/**\n * A helper type to extract the type of the output of an Inngest function.\n *\n * Used internally for {@link GetFunctionOutput}. Code outside of this package\n * should use {@link GetFunctionOutput} instead.\n *\n * @internal\n */\nexport type GetFunctionOutputFromInngestFunction<\n TFunction extends InngestFunction.Any,\n> = TFunction extends InngestFunction<\n // biome-ignore lint/suspicious/noExplicitAny: intentional\n any,\n infer IHandler,\n // biome-ignore lint/suspicious/noExplicitAny: intentional\n any,\n infer TClient,\n // biome-ignore lint/suspicious/noExplicitAny: intentional\n any\n>\n ? IsNever<\n VoidToNull<SimplifyDeep<Awaited<ReturnType<IHandler>>>>\n > extends true\n ? null\n : ApplyAllMiddlewareTransforms<\n ClientOptionsFromInngest<TClient>[\"middleware\"],\n VoidToNull<SimplifyDeep<Awaited<ReturnType<IHandler>>>>,\n \"functionOutputTransform\"\n >\n : unknown;\n\n/**\n * A helper type to extract the type of the output of a referenced Inngest\n * function.\n *\n * Used internally for {@link GetFunctionOutput}. Code outside of this package\n * should use {@link GetFunctionOutput} instead.\n *\n * @internal\n */\nexport type GetFunctionOutputFromReferenceInngestFunction<\n TFunction extends InngestFunctionReference.Any,\n // biome-ignore lint/suspicious/noExplicitAny: intentional\n> = TFunction extends InngestFunctionReference<any, infer IOutput>\n ? IsNever<SimplifyDeep<Jsonify<IOutput>>> extends true\n ? null\n : SimplifyDeep<Jsonify<IOutput>>\n : unknown;\n\n/**\n * A helper type to extract the raw (non-Jsonified) output type of an Inngest\n * function. This is used when middleware transforms will handle serialization.\n *\n * @internal\n */\nexport type GetFunctionOutputRaw<\n TFunction extends InvokeTargetFunctionDefinition,\n> = TFunction extends InngestFunction.Any\n ? GetFunctionOutputRawFromInngestFunction<TFunction>\n : TFunction extends InngestFunctionReference.Any\n ? GetFunctionOutputRawFromReferenceInngestFunction<TFunction>\n : unknown;\n\n/**\n * @internal\n */\nexport type GetFunctionOutputRawFromInngestFunction<\n TFunction extends InngestFunction.Any,\n // biome-ignore lint/suspicious/noExplicitAny: intentional\n> = TFunction extends InngestFunction<any, infer IHandler, any, any, any>\n ? VoidToNull<Awaited<ReturnType<IHandler>>>\n : unknown;\n\n/**\n * @internal\n */\nexport type GetFunctionOutputRawFromReferenceInngestFunction<\n TFunction extends InngestFunctionReference.Any,\n // biome-ignore lint/suspicious/noExplicitAny: intentional\n> = TFunction extends InngestFunctionReference<any, infer IOutput>\n ? VoidToNull<SimplifyDeep<IOutput>>\n : unknown;\n\n/**\n * Helper type that converts void/undefined/never to null.\n * Uses ReturnType trick to check for void without directly using void in type position.\n * @internal\n */\ntype VoidToNull<T> = IsNever<T> extends true\n ? null\n : T extends ReturnType<() => void>\n ? null\n : T;\n\n/**\n * A helper type to extract the inferred options from a given Inngest instance.\n *\n * @example\n * ```ts\n * type Options = ClientOptionsFromInngest<typeof inngest>;\n * ```\n *\n * @public\n */\n\nexport type ClientOptionsFromInngest<TInngest extends Inngest.Any> =\n TInngest extends Inngest<infer U> ? U : ClientOptions;\n"],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
const require_consts = require('../helpers/consts.cjs');
|
|
2
2
|
const require_types = require('../types.cjs');
|
|
3
|
+
const require_log = require('../helpers/log.cjs');
|
|
3
4
|
const require_strings = require('../helpers/strings.cjs');
|
|
4
5
|
const require_triggers = require('./triggers/triggers.cjs');
|
|
6
|
+
const require_Inngest = require('./Inngest.cjs');
|
|
5
7
|
const require_engine = require('./execution/engine.cjs');
|
|
6
8
|
|
|
7
9
|
//#region src/components/InngestFunction.ts
|
|
@@ -36,6 +38,7 @@ var InngestFunction = class InngestFunction {
|
|
|
36
38
|
this.opts = opts;
|
|
37
39
|
this.fn = fn;
|
|
38
40
|
this.onFailureFn = this.opts.onFailure;
|
|
41
|
+
if (this.opts.optimizeParallelism === false) require_log.warnOnce(this.client[require_Inngest.internalLoggerSymbol], `optimize-parallelism-deprecated:${this.opts.id}`, "`optimizeParallelism: false` is deprecated; use `group.parallel({ mode: \"race\" }, ...)` for race semantics instead");
|
|
39
42
|
}
|
|
40
43
|
/**
|
|
41
44
|
* The generated or given ID for this function.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InngestFunction.cjs","names":["queryKeys","fn: FunctionConfig","eventName: string","ret: NonNullable<FunctionConfig[\"cancel\"]>[number]","timeStr","config: FunctionConfig[]","internalEvents","triggers: FunctionConfig[\"triggers\"]","EventType","createExecutionEngine","defaultCheckpointingOptions"],"sources":["../../src/components/InngestFunction.ts"],"sourcesContent":["import { internalEvents, queryKeys } from \"../helpers/consts.ts\";\nimport { timeStr } from \"../helpers/strings.ts\";\nimport type { RecursiveTuple, StrictUnion } from \"../helpers/types.ts\";\nimport {\n type Cancellation,\n type CheckpointingOptions,\n type ConcurrencyOption,\n type DefaultMaxRuntime,\n defaultCheckpointingOptions,\n type FunctionConfig,\n type Handler,\n type InternalCheckpointingOptions,\n type TimeStr,\n type TimeStrBatch,\n} from \"../types.ts\";\nimport { createExecutionEngine } from \"./execution/engine.ts\";\nimport type {\n IInngestExecution,\n InngestExecutionOptions,\n} from \"./execution/InngestExecution.ts\";\n\nimport type { Inngest } from \"./Inngest.ts\";\nimport type { Middleware } from \"./middleware/middleware.ts\";\nimport { EventType, type EventTypeWithAnySchema } from \"./triggers/triggers.ts\";\n\n/**\n * A stateless Inngest function, wrapping up function configuration and any\n * in-memory steps to run when triggered.\n *\n * This function can be \"registered\" to create a handler that Inngest can\n * trigger remotely.\n *\n * @public\n */\nexport class InngestFunction<\n TFnOpts extends InngestFunction.Options<TTriggers, TFailureHandler>,\n THandler extends Handler.Any,\n TFailureHandler extends Handler.Any,\n TClient extends Inngest.Any = Inngest.Any,\n TTriggers extends\n InngestFunction.Trigger<string>[] = InngestFunction.Trigger<string>[],\n> implements InngestFunction.Like\n{\n static stepId = \"step\";\n static failureSuffix = \"-failure\";\n\n get [Symbol.toStringTag](): typeof InngestFunction.Tag {\n return InngestFunction.Tag;\n }\n\n public readonly opts: TFnOpts;\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: used internally\n private readonly fn: THandler;\n private readonly onFailureFn?: TFailureHandler;\n protected readonly client: TClient;\n\n /**\n * A stateless Inngest function, wrapping up function configuration and any\n * in-memory steps to run when triggered.\n *\n * This function can be \"registered\" to create a handler that Inngest can\n * trigger remotely.\n */\n constructor(\n client: TClient,\n\n /**\n * Options\n */\n opts: TFnOpts,\n fn: THandler,\n ) {\n this.client = client;\n this.opts = opts;\n this.fn = fn;\n this.onFailureFn = this.opts.onFailure;\n }\n\n /**\n * The generated or given ID for this function.\n */\n public id(prefix?: string): string {\n return [prefix, this.opts.id].filter(Boolean).join(\"-\");\n }\n\n /**\n * The generated or given ID for this function, prefixed with the app ID. This\n * is used for routing invokes and identifying the function across apps.\n */\n protected get absoluteId(): string {\n return this.id(this.client.id);\n }\n\n /**\n * The name of this function as it will appear in the Inngest Cloud UI.\n */\n public get name(): string {\n return this.opts.name || this.id();\n }\n\n /**\n * The description of this function.\n */\n public get description(): string | undefined {\n return this.opts.description;\n }\n\n /**\n * Retrieve the Inngest config for this function.\n */\n\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: used within the SDK\n private getConfig({\n baseUrl,\n appPrefix,\n isConnect,\n }: {\n /**\n * Must be provided a URL that will be used to access the function and step.\n * This function can't be expected to know how it will be accessed, so\n * relies on an outside method providing context.\n */\n baseUrl: URL;\n\n /**\n * The prefix for the app that this function is part of.\n */\n appPrefix: string;\n\n /**\n * Whether this function is being used in a Connect handler.\n */\n isConnect?: boolean;\n }): FunctionConfig[] {\n const fnId = this.id(appPrefix);\n const stepUrl = new URL(baseUrl.href);\n stepUrl.searchParams.set(queryKeys.FnId, fnId);\n stepUrl.searchParams.set(queryKeys.StepId, InngestFunction.stepId);\n\n const {\n retries: attempts,\n cancelOn,\n idempotency,\n batchEvents,\n rateLimit,\n throttle,\n concurrency,\n debounce,\n timeouts,\n priority,\n singleton,\n } = this.opts;\n\n /**\n * Convert retries into the format required when defining function\n * configuration.\n */\n const retries = typeof attempts === \"undefined\" ? undefined : { attempts };\n\n const triggers = this.getConfigTriggers(fnId);\n\n const fn: FunctionConfig = {\n id: fnId,\n name: this.name,\n triggers,\n steps: {\n [InngestFunction.stepId]: {\n id: InngestFunction.stepId,\n name: InngestFunction.stepId,\n runtime: {\n type: isConnect ? \"ws\" : \"http\",\n url: stepUrl.href,\n },\n retries,\n },\n },\n idempotency,\n batchEvents,\n rateLimit,\n throttle,\n concurrency,\n debounce,\n priority,\n timeouts,\n singleton,\n };\n\n if (cancelOn) {\n fn.cancel = cancelOn.map(({ event, timeout, if: ifStr, match }) => {\n let eventName: string;\n if (typeof event === \"string\") {\n eventName = event;\n } else {\n eventName = event.name;\n }\n\n const ret: NonNullable<FunctionConfig[\"cancel\"]>[number] = {\n event: eventName,\n };\n\n if (timeout) {\n ret.timeout = timeStr(timeout);\n }\n\n if (match) {\n ret.if = `event.${match} == async.${match}`;\n } else if (ifStr) {\n ret.if = ifStr;\n }\n\n return ret;\n }, []);\n }\n\n const config: FunctionConfig[] = [fn];\n\n if (this.onFailureFn) {\n const id = `${fn.id}${InngestFunction.failureSuffix}`;\n const name = `${fn.name ?? fn.id} (failure)`;\n\n const failureStepUrl = new URL(stepUrl.href);\n failureStepUrl.searchParams.set(queryKeys.FnId, id);\n\n config.push({\n id,\n name,\n triggers: [\n {\n event: internalEvents.FunctionFailed,\n expression: `event.data.function_id == '${fnId}'`,\n },\n ],\n steps: {\n [InngestFunction.stepId]: {\n id: InngestFunction.stepId,\n name: InngestFunction.stepId,\n runtime: {\n type: \"http\",\n url: failureStepUrl.href,\n },\n retries: { attempts: 1 },\n },\n },\n });\n }\n\n return config;\n }\n\n /**\n * Build the trigger list for this function's `getConfig` payload. Subclasses\n * (e.g. `DeferredFunction`) override this to emit implicit triggers.\n */\n protected getConfigTriggers(_fnId: string): FunctionConfig[\"triggers\"] {\n const triggers: FunctionConfig[\"triggers\"] = [];\n\n for (const trigger of this.opts.triggers ?? []) {\n if (trigger.cron) {\n const cronTrigger = trigger as { cron: string; jitter?: string };\n triggers.push({\n cron: cronTrigger.cron,\n ...(cronTrigger.jitter ? { jitter: cronTrigger.jitter } : {}),\n });\n continue;\n }\n\n if (!trigger.event) {\n continue;\n }\n\n // The invoke event is in the triggers if they used the `invoke` trigger\n // helper. But we need to remove it in the config, or else the function\n // will be triggered by any invoke.\n let eventName = trigger.event;\n if (eventName instanceof EventType) {\n eventName = eventName.name;\n }\n if (eventName === internalEvents.FunctionInvoked) {\n continue;\n }\n\n triggers.push({ event: eventName, expression: trigger.if });\n }\n\n return triggers;\n }\n\n protected createExecution(opts: CreateExecutionOptions): IInngestExecution {\n const options: InngestExecutionOptions = {\n fn: this,\n ...opts.partialOptions,\n };\n\n return createExecutionEngine(options);\n }\n\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: used within the SDK\n private shouldOptimizeParallelism(): boolean {\n // TODO We should check the commhandler's client instead of this one?\n return (\n this.opts.optimizeParallelism ??\n this.client[\"options\"].optimizeParallelism ??\n true\n );\n }\n\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: used within the SDK\n private shouldAsyncCheckpoint(\n requestedRunStep: string | undefined,\n internalFnId: string | undefined,\n disableImmediateExecution: boolean,\n defaultMaxRuntime: DefaultMaxRuntime,\n ): InternalCheckpointingOptions | undefined {\n if (requestedRunStep || !internalFnId || disableImmediateExecution) {\n return;\n }\n\n // TODO We should check the commhandler's client instead of this one?\n const userCfg =\n this.opts.checkpointing ??\n this.client[\"options\"].checkpointing ??\n this.opts.experimentalCheckpointing ??\n this.client[\"options\"].experimentalCheckpointing ??\n true;\n\n if (!userCfg) {\n // Opted out\n return;\n }\n\n if (userCfg === true) {\n return {\n ...defaultCheckpointingOptions,\n maxRuntime: defaultMaxRuntime,\n };\n }\n\n return {\n bufferedSteps:\n userCfg.bufferedSteps ?? defaultCheckpointingOptions.bufferedSteps,\n maxRuntime: userCfg.maxRuntime ?? defaultMaxRuntime,\n maxInterval:\n userCfg.maxInterval ?? defaultCheckpointingOptions.maxInterval,\n };\n }\n}\n\n/**\n * A stateless Inngest function, wrapping up function configuration and any\n * in-memory steps to run when triggered.\n *\n * This function can be \"registered\" to create a handler that Inngest can\n * trigger remotely.\n *\n * @public\n */\nexport namespace InngestFunction {\n export const Tag = \"Inngest.Function\" as const;\n\n /**\n * Represents any `InngestFunction` instance, regardless of generics and\n * inference.\n */\n export type Any = InngestFunction<\n // biome-ignore lint/suspicious/noExplicitAny: intentional\n InngestFunction.Options<any, any>,\n Handler.Any,\n Handler.Any,\n // biome-ignore lint/suspicious/noExplicitAny: intentional\n any,\n // biome-ignore lint/suspicious/noExplicitAny: intentional\n any\n >;\n\n export interface Like {\n readonly [Symbol.toStringTag]: typeof InngestFunction.Tag;\n }\n\n /**\n * A user-friendly method of specifying a trigger for an Inngest function.\n *\n * @public\n */\n export type Trigger<TName extends string> = StrictUnion<\n | {\n event: TName | EventTypeWithAnySchema<TName>;\n if?: string;\n }\n | {\n cron: string;\n }\n >;\n\n export type GetOptions<T extends InngestFunction.Any> =\n // biome-ignore lint/suspicious/noExplicitAny: intentional\n T extends InngestFunction<infer O, any, any, any, any> ? O : never;\n\n /**\n * A set of options for configuring an Inngest function.\n *\n * @public\n */\n export interface Options<\n TTriggers extends\n InngestFunction.Trigger<string>[] = InngestFunction.Trigger<string>[],\n TFailureHandler extends Handler.Any = Handler.Any,\n > {\n triggers?: TTriggers;\n\n /**\n * An unique ID used to identify the function. This is used internally for\n * versioning and referring to your function, so should not change between\n * deployments.\n *\n * If you'd like to set a prettier name for your function, use the `name`\n * option.\n */\n id: string;\n\n /**\n * A name for the function as it will appear in the Inngest Cloud UI.\n */\n name?: string;\n\n /**\n * A description of the function.\n */\n description?: string;\n\n /**\n * Concurrency specifies a limit on the total number of concurrent steps that\n * can occur across all runs of the function. A value of 0 (or undefined) means\n * use the maximum available concurrency.\n *\n * Specifying just a number means specifying only the concurrency limit. A\n * maximum of two concurrency options can be specified.\n */\n concurrency?:\n | number\n | ConcurrencyOption\n | RecursiveTuple<ConcurrencyOption, 2>;\n\n /**\n * batchEvents specifies the batch configuration on when this function\n * should be invoked when one of the requirements are fulfilled.\n */\n batchEvents?: {\n /**\n * The maximum number of events to be consumed in one batch.\n * Check the pricing page to verify the limit for each plan.\n */\n maxSize: number;\n\n /**\n * How long to wait before invoking the function with a list of events.\n * If timeout is reached, the function will be invoked with a batch\n * even if it's not filled up to `maxSize`.\n *\n * Expects a time string such as 1s, 60s or 15m15s.\n */\n timeout: TimeStrBatch;\n\n /**\n * An optional key to use for batching.\n *\n * See [batch documentation](https://innge.st/batching) for more\n * information on how to use `key` expressions.\n */\n key?: string;\n\n /**\n * An optional boolean expression to determine an event's eligibility for batching\n *\n * See [batch documentation](https://innge.st/batching) for more\n * information on how to use `if` expressions.\n */\n if?: string;\n };\n\n /**\n * Allow the specification of an idempotency key using event data. If\n * specified, this overrides the `rateLimit` object.\n */\n idempotency?: string;\n\n /**\n * Rate limit function runs, only running them a given number of times (limit) per\n * period. Note that rate limit is a lossy, hard limit. Once the limit is hit,\n * new runs will be skipped. To enqueue work when a rate limit is hit, use the\n * {@link throttle} parameter.\n */\n rateLimit?: {\n /**\n * An optional key to use for rate limiting, similar to idempotency.\n */\n key?: string;\n\n /**\n * The number of times to allow the function to run per the given `period`.\n */\n limit: number;\n\n /**\n * The period of time to allow the function to run `limit` times.\n */\n period: TimeStr;\n };\n\n /**\n * Throttles function runs, only running them a given number of times (limit) per\n * period. Once the limit is hit, new runs will be enqueued and will start when there's\n * capacity. This may lead to a large backlog. For hard rate limiting, use the\n * {@link rateLimit} parameter.\n */\n throttle?: {\n /**\n * An optional expression which returns a throttling key for controlling throttling.\n * Every unique key is its own throttle limit. Event data may be used within this\n * expression, eg \"event.data.user_id\".\n */\n key?: string;\n\n /**\n * The total number of runs allowed to start within the given `period`. The limit is\n * applied evenly over the period.\n */\n limit: number;\n\n /**\n * The period of time for the rate limit. Run starts are evenly spaced through\n * the given period. The minimum granularity is 1 second.\n */\n period: TimeStr;\n\n /**\n * The number of runs allowed to start in the given window in a single burst.\n * A burst > 1 bypasses smoothing for the burst and allows many runs to start\n * at once, if desired. Defaults to 1, which disables bursting.\n */\n burst?: number;\n };\n\n /**\n * Debounce delays functions for the `period` specified. If an event is sent,\n * the function will not run until at least `period` has elapsed.\n *\n * If any new events are received that match the same debounce `key`, the\n * function is rescheduled for another `period` delay, and the triggering\n * event is replaced with the latest event received.\n *\n * See the [Debounce documentation](https://innge.st/debounce) for more\n * information.\n */\n debounce?: {\n /**\n * An optional key to use for debouncing.\n *\n * See [Debounce documentation](https://innge.st/debounce) for more\n * information on how to use `key` expressions.\n */\n key?: string;\n\n /**\n * The period of time to delay after receiving the last trigger to run the\n * function.\n *\n * See [Debounce documentation](https://innge.st/debounce) for more\n * information.\n */\n period: TimeStr;\n\n /**\n * The maximum time that a debounce can be extended before running.\n * If events are continually received within the given period, a function\n * will always run after the given timeout period.\n *\n * See [Debounce documentation](https://innge.st/debounce) for more\n * information.\n */\n timeout?: TimeStr;\n };\n\n /**\n * Configure how the priority of a function run is decided when multiple\n * functions are triggered at the same time.\n *\n * See the [Priority documentation](https://innge.st/priority) for more\n * information.\n */\n priority?: {\n /**\n * An expression to use to determine the priority of a function run. The\n * expression can return a number between `-600` and `600`, where `600`\n * declares that this run should be executed before any others enqueued in\n * the last 600 seconds (10 minutes), and `-600` declares that this run\n * should be executed after any others enqueued in the last 600 seconds.\n *\n * See the [Priority documentation](https://innge.st/priority) for more\n * information.\n */\n run?: string;\n };\n\n /**\n * Configure timeouts for the function. If any of the timeouts are hit, the\n * function run will be cancelled.\n */\n timeouts?: {\n /**\n * Start represents the timeout for starting a function. If the time\n * between scheduling and starting a function exceeds this value, the\n * function will be cancelled.\n *\n * This is, essentially, the amount of time that a function sits in the\n * queue before starting.\n *\n * A function may exceed this duration because of concurrency limits,\n * throttling, etc.\n */\n start?: TimeStr;\n\n /**\n * Finish represents the time between a function starting and the function\n * finishing. If a function takes longer than this time to finish, the\n * function is marked as cancelled.\n *\n * The start time is taken from the time that the first successful\n * function request begins, and does not include the time spent in the\n * queue before the function starts.\n *\n * Note that if the final request to a function begins before this\n * timeout, and completes after this timeout, the function will succeed.\n */\n finish?: TimeStr;\n };\n\n /**\n * Ensures that only one run of the function is active at a time for a given key.\n * If a new run is triggered while another is still in progress with the same key,\n * the new run will either be skipped or replace the active one, depending on the mode.\n *\n * This is useful for deduplication or enforcing exclusive execution.\n */\n singleton?: {\n /**\n * An optional key expression used to scope singleton execution.\n * Each unique key has its own singleton lock. Event data can be referenced,\n * e.g. \"event.data.user_id\".\n */\n key?: string;\n\n /**\n * Determines how to handle new runs when one is already active for the same key.\n * - `\"skip\"` skips the new run.\n * - `\"cancel\"` cancels the existing run and starts the new one.\n */\n mode: \"skip\" | \"cancel\";\n };\n\n cancelOn?: Cancellation[];\n\n /**\n * Specifies the maximum number of retries for all steps across this function.\n *\n * Can be a number from `0` to `20`. Defaults to `3`.\n */\n retries?:\n | 0\n | 1\n | 2\n | 3\n | 4\n | 5\n | 6\n | 7\n | 8\n | 9\n | 10\n | 11\n | 12\n | 13\n | 14\n | 15\n | 16\n | 17\n | 18\n | 19\n | 20;\n\n /**\n * Provide a function to be called if your function fails, meaning\n * that it ran out of retries and was unable to complete successfully.\n *\n * This is useful for sending warning notifications or cleaning up\n * after a failure and supports all the same functionality as a\n * regular handler.\n */\n onFailure?: TFailureHandler;\n\n /**\n * Define a set of middleware that can be registered to hook into\n * various lifecycles of the SDK and affect input and output of\n * Inngest functionality.\n *\n * See {@link https://innge.st/middleware}\n */\n middleware?: Middleware.Class[];\n\n /**\n * Optimizes parallel steps to reduce traffic during `Promise` resolution,\n * reducing time and requests per run. `Promise.*()` waits for all promises\n * to settle before resolving. Use `group.parallel()` for `Promise.race()`\n * semantics.\n *\n * Overrides the client-level setting.\n *\n * @default true\n */\n optimizeParallelism?: boolean;\n\n /**\n * Whether or not to use checkpointing for this function's executions.\n *\n * If `true`, enables checkpointing with default settings, which is a safe,\n * blocking version of checkpointing, where we check in with Inngest after\n * every step is run.\n *\n * If an object, you can tweak the settings to batch, set a maximum runtime\n * before going async, and more. Note that if your server dies before the\n * checkpoint completes, step data will be lost and steps will be rerun.\n *\n * We recommend starting with the default `true` configuration and only tweak\n * the parameters directly if necessary.\n *\n * @deprecated Use `checkpointing` instead.\n */\n experimentalCheckpointing?: CheckpointingOptions;\n\n /**\n * Whether or not to use checkpointing for this function's executions.\n *\n * If `false`, disables checkpointing.\n *\n * If `true`, enables checkpointing with default settings, which is a safe,\n * blocking version of checkpointing, where we check in with Inngest after\n * every step is run.\n *\n * If an object, you can tweak the settings to batch, set a maximum runtime\n * before going async, and more. Note that if your server dies before the\n * checkpoint completes, step data will be lost and steps will be rerun.\n *\n * We recommend starting with the default `true` configuration and only tweak\n * the parameters directly if necessary.\n *\n * @default true\n */\n checkpointing?: CheckpointingOptions;\n }\n}\n\nexport type CreateExecutionOptions = {\n partialOptions: Omit<InngestExecutionOptions, \"fn\">;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"InngestFunction.cjs","names":["internalLoggerSymbol","queryKeys","fn: FunctionConfig","eventName: string","ret: NonNullable<FunctionConfig[\"cancel\"]>[number]","timeStr","config: FunctionConfig[]","internalEvents","triggers: FunctionConfig[\"triggers\"]","EventType","createExecutionEngine","defaultCheckpointingOptions"],"sources":["../../src/components/InngestFunction.ts"],"sourcesContent":["import { internalEvents, queryKeys } from \"../helpers/consts.ts\";\nimport { warnOnce } from \"../helpers/log.ts\";\nimport { timeStr } from \"../helpers/strings.ts\";\nimport type { RecursiveTuple, StrictUnion } from \"../helpers/types.ts\";\nimport {\n type Cancellation,\n type CheckpointingOptions,\n type ConcurrencyOption,\n type DefaultMaxRuntime,\n defaultCheckpointingOptions,\n type FunctionConfig,\n type Handler,\n type InternalCheckpointingOptions,\n type TimeStr,\n type TimeStrBatch,\n} from \"../types.ts\";\nimport { createExecutionEngine } from \"./execution/engine.ts\";\nimport type {\n IInngestExecution,\n InngestExecutionOptions,\n} from \"./execution/InngestExecution.ts\";\n\nimport { type Inngest, internalLoggerSymbol } from \"./Inngest.ts\";\nimport type { Middleware } from \"./middleware/middleware.ts\";\nimport { EventType, type EventTypeWithAnySchema } from \"./triggers/triggers.ts\";\n\n/**\n * A stateless Inngest function, wrapping up function configuration and any\n * in-memory steps to run when triggered.\n *\n * This function can be \"registered\" to create a handler that Inngest can\n * trigger remotely.\n *\n * @public\n */\nexport class InngestFunction<\n TFnOpts extends InngestFunction.Options<TTriggers, TFailureHandler>,\n THandler extends Handler.Any,\n TFailureHandler extends Handler.Any,\n TClient extends Inngest.Any = Inngest.Any,\n TTriggers extends\n InngestFunction.Trigger<string>[] = InngestFunction.Trigger<string>[],\n> implements InngestFunction.Like\n{\n static stepId = \"step\";\n static failureSuffix = \"-failure\";\n\n get [Symbol.toStringTag](): typeof InngestFunction.Tag {\n return InngestFunction.Tag;\n }\n\n public readonly opts: TFnOpts;\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: used internally\n private readonly fn: THandler;\n private readonly onFailureFn?: TFailureHandler;\n protected readonly client: TClient;\n\n /**\n * A stateless Inngest function, wrapping up function configuration and any\n * in-memory steps to run when triggered.\n *\n * This function can be \"registered\" to create a handler that Inngest can\n * trigger remotely.\n */\n constructor(\n client: TClient,\n\n /**\n * Options\n */\n opts: TFnOpts,\n fn: THandler,\n ) {\n this.client = client;\n this.opts = opts;\n this.fn = fn;\n this.onFailureFn = this.opts.onFailure;\n\n if (this.opts.optimizeParallelism === false) {\n warnOnce(\n this.client[internalLoggerSymbol],\n `optimize-parallelism-deprecated:${this.opts.id}`,\n '`optimizeParallelism: false` is deprecated; use `group.parallel({ mode: \"race\" }, ...)` for race semantics instead',\n );\n }\n }\n\n /**\n * The generated or given ID for this function.\n */\n public id(prefix?: string): string {\n return [prefix, this.opts.id].filter(Boolean).join(\"-\");\n }\n\n /**\n * The generated or given ID for this function, prefixed with the app ID. This\n * is used for routing invokes and identifying the function across apps.\n */\n protected get absoluteId(): string {\n return this.id(this.client.id);\n }\n\n /**\n * The name of this function as it will appear in the Inngest Cloud UI.\n */\n public get name(): string {\n return this.opts.name || this.id();\n }\n\n /**\n * The description of this function.\n */\n public get description(): string | undefined {\n return this.opts.description;\n }\n\n /**\n * Retrieve the Inngest config for this function.\n */\n\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: used within the SDK\n private getConfig({\n baseUrl,\n appPrefix,\n isConnect,\n }: {\n /**\n * Must be provided a URL that will be used to access the function and step.\n * This function can't be expected to know how it will be accessed, so\n * relies on an outside method providing context.\n */\n baseUrl: URL;\n\n /**\n * The prefix for the app that this function is part of.\n */\n appPrefix: string;\n\n /**\n * Whether this function is being used in a Connect handler.\n */\n isConnect?: boolean;\n }): FunctionConfig[] {\n const fnId = this.id(appPrefix);\n const stepUrl = new URL(baseUrl.href);\n stepUrl.searchParams.set(queryKeys.FnId, fnId);\n stepUrl.searchParams.set(queryKeys.StepId, InngestFunction.stepId);\n\n const {\n retries: attempts,\n cancelOn,\n idempotency,\n batchEvents,\n rateLimit,\n throttle,\n concurrency,\n debounce,\n timeouts,\n priority,\n singleton,\n } = this.opts;\n\n /**\n * Convert retries into the format required when defining function\n * configuration.\n */\n const retries = typeof attempts === \"undefined\" ? undefined : { attempts };\n\n const triggers = this.getConfigTriggers(fnId);\n\n const fn: FunctionConfig = {\n id: fnId,\n name: this.name,\n triggers,\n steps: {\n [InngestFunction.stepId]: {\n id: InngestFunction.stepId,\n name: InngestFunction.stepId,\n runtime: {\n type: isConnect ? \"ws\" : \"http\",\n url: stepUrl.href,\n },\n retries,\n },\n },\n idempotency,\n batchEvents,\n rateLimit,\n throttle,\n concurrency,\n debounce,\n priority,\n timeouts,\n singleton,\n };\n\n if (cancelOn) {\n fn.cancel = cancelOn.map(({ event, timeout, if: ifStr, match }) => {\n let eventName: string;\n if (typeof event === \"string\") {\n eventName = event;\n } else {\n eventName = event.name;\n }\n\n const ret: NonNullable<FunctionConfig[\"cancel\"]>[number] = {\n event: eventName,\n };\n\n if (timeout) {\n ret.timeout = timeStr(timeout);\n }\n\n if (match) {\n ret.if = `event.${match} == async.${match}`;\n } else if (ifStr) {\n ret.if = ifStr;\n }\n\n return ret;\n }, []);\n }\n\n const config: FunctionConfig[] = [fn];\n\n if (this.onFailureFn) {\n const id = `${fn.id}${InngestFunction.failureSuffix}`;\n const name = `${fn.name ?? fn.id} (failure)`;\n\n const failureStepUrl = new URL(stepUrl.href);\n failureStepUrl.searchParams.set(queryKeys.FnId, id);\n\n config.push({\n id,\n name,\n triggers: [\n {\n event: internalEvents.FunctionFailed,\n expression: `event.data.function_id == '${fnId}'`,\n },\n ],\n steps: {\n [InngestFunction.stepId]: {\n id: InngestFunction.stepId,\n name: InngestFunction.stepId,\n runtime: {\n type: \"http\",\n url: failureStepUrl.href,\n },\n retries: { attempts: 1 },\n },\n },\n });\n }\n\n return config;\n }\n\n /**\n * Build the trigger list for this function's `getConfig` payload. Subclasses\n * (e.g. `DeferredFunction`) override this to emit implicit triggers.\n */\n protected getConfigTriggers(_fnId: string): FunctionConfig[\"triggers\"] {\n const triggers: FunctionConfig[\"triggers\"] = [];\n\n for (const trigger of this.opts.triggers ?? []) {\n if (trigger.cron) {\n const cronTrigger = trigger as { cron: string; jitter?: string };\n triggers.push({\n cron: cronTrigger.cron,\n ...(cronTrigger.jitter ? { jitter: cronTrigger.jitter } : {}),\n });\n continue;\n }\n\n if (!trigger.event) {\n continue;\n }\n\n // The invoke event is in the triggers if they used the `invoke` trigger\n // helper. But we need to remove it in the config, or else the function\n // will be triggered by any invoke.\n let eventName = trigger.event;\n if (eventName instanceof EventType) {\n eventName = eventName.name;\n }\n if (eventName === internalEvents.FunctionInvoked) {\n continue;\n }\n\n triggers.push({ event: eventName, expression: trigger.if });\n }\n\n return triggers;\n }\n\n protected createExecution(opts: CreateExecutionOptions): IInngestExecution {\n const options: InngestExecutionOptions = {\n fn: this,\n ...opts.partialOptions,\n };\n\n return createExecutionEngine(options);\n }\n\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: used within the SDK\n private shouldOptimizeParallelism(): boolean {\n // TODO We should check the commhandler's client instead of this one?\n return (\n this.opts.optimizeParallelism ??\n this.client[\"options\"].optimizeParallelism ??\n true\n );\n }\n\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: used within the SDK\n private shouldAsyncCheckpoint(\n requestedRunStep: string | undefined,\n internalFnId: string | undefined,\n disableImmediateExecution: boolean,\n defaultMaxRuntime: DefaultMaxRuntime,\n ): InternalCheckpointingOptions | undefined {\n if (requestedRunStep || !internalFnId || disableImmediateExecution) {\n return;\n }\n\n // TODO We should check the commhandler's client instead of this one?\n const userCfg =\n this.opts.checkpointing ??\n this.client[\"options\"].checkpointing ??\n this.opts.experimentalCheckpointing ??\n this.client[\"options\"].experimentalCheckpointing ??\n true;\n\n if (!userCfg) {\n // Opted out\n return;\n }\n\n if (userCfg === true) {\n return {\n ...defaultCheckpointingOptions,\n maxRuntime: defaultMaxRuntime,\n };\n }\n\n return {\n bufferedSteps:\n userCfg.bufferedSteps ?? defaultCheckpointingOptions.bufferedSteps,\n maxRuntime: userCfg.maxRuntime ?? defaultMaxRuntime,\n maxInterval:\n userCfg.maxInterval ?? defaultCheckpointingOptions.maxInterval,\n };\n }\n}\n\n/**\n * A stateless Inngest function, wrapping up function configuration and any\n * in-memory steps to run when triggered.\n *\n * This function can be \"registered\" to create a handler that Inngest can\n * trigger remotely.\n *\n * @public\n */\nexport namespace InngestFunction {\n export const Tag = \"Inngest.Function\" as const;\n\n /**\n * Represents any `InngestFunction` instance, regardless of generics and\n * inference.\n */\n export type Any = InngestFunction<\n // biome-ignore lint/suspicious/noExplicitAny: intentional\n InngestFunction.Options<any, any>,\n Handler.Any,\n Handler.Any,\n // biome-ignore lint/suspicious/noExplicitAny: intentional\n any,\n // biome-ignore lint/suspicious/noExplicitAny: intentional\n any\n >;\n\n export interface Like {\n readonly [Symbol.toStringTag]: typeof InngestFunction.Tag;\n }\n\n /**\n * A user-friendly method of specifying a trigger for an Inngest function.\n *\n * @public\n */\n export type Trigger<TName extends string> = StrictUnion<\n | {\n event: TName | EventTypeWithAnySchema<TName>;\n if?: string;\n }\n | {\n cron: string;\n }\n >;\n\n export type GetOptions<T extends InngestFunction.Any> =\n // biome-ignore lint/suspicious/noExplicitAny: intentional\n T extends InngestFunction<infer O, any, any, any, any> ? O : never;\n\n /**\n * A set of options for configuring an Inngest function.\n *\n * @public\n */\n export interface Options<\n TTriggers extends\n InngestFunction.Trigger<string>[] = InngestFunction.Trigger<string>[],\n TFailureHandler extends Handler.Any = Handler.Any,\n > {\n triggers?: TTriggers;\n\n /**\n * An unique ID used to identify the function. This is used internally for\n * versioning and referring to your function, so should not change between\n * deployments.\n *\n * If you'd like to set a prettier name for your function, use the `name`\n * option.\n */\n id: string;\n\n /**\n * A name for the function as it will appear in the Inngest Cloud UI.\n */\n name?: string;\n\n /**\n * A description of the function.\n */\n description?: string;\n\n /**\n * Concurrency specifies a limit on the total number of concurrent steps that\n * can occur across all runs of the function. A value of 0 (or undefined) means\n * use the maximum available concurrency.\n *\n * Specifying just a number means specifying only the concurrency limit. A\n * maximum of two concurrency options can be specified.\n */\n concurrency?:\n | number\n | ConcurrencyOption\n | RecursiveTuple<ConcurrencyOption, 2>;\n\n /**\n * batchEvents specifies the batch configuration on when this function\n * should be invoked when one of the requirements are fulfilled.\n */\n batchEvents?: {\n /**\n * The maximum number of events to be consumed in one batch.\n * Check the pricing page to verify the limit for each plan.\n */\n maxSize: number;\n\n /**\n * How long to wait before invoking the function with a list of events.\n * If timeout is reached, the function will be invoked with a batch\n * even if it's not filled up to `maxSize`.\n *\n * Expects a time string such as 1s, 60s or 15m15s.\n */\n timeout: TimeStrBatch;\n\n /**\n * An optional key to use for batching.\n *\n * See [batch documentation](https://innge.st/batching) for more\n * information on how to use `key` expressions.\n */\n key?: string;\n\n /**\n * An optional boolean expression to determine an event's eligibility for batching\n *\n * See [batch documentation](https://innge.st/batching) for more\n * information on how to use `if` expressions.\n */\n if?: string;\n };\n\n /**\n * Allow the specification of an idempotency key using event data. If\n * specified, this overrides the `rateLimit` object.\n */\n idempotency?: string;\n\n /**\n * Rate limit function runs, only running them a given number of times (limit) per\n * period. Note that rate limit is a lossy, hard limit. Once the limit is hit,\n * new runs will be skipped. To enqueue work when a rate limit is hit, use the\n * {@link throttle} parameter.\n */\n rateLimit?: {\n /**\n * An optional key to use for rate limiting, similar to idempotency.\n */\n key?: string;\n\n /**\n * The number of times to allow the function to run per the given `period`.\n */\n limit: number;\n\n /**\n * The period of time to allow the function to run `limit` times.\n */\n period: TimeStr;\n };\n\n /**\n * Throttles function runs, only running them a given number of times (limit) per\n * period. Once the limit is hit, new runs will be enqueued and will start when there's\n * capacity. This may lead to a large backlog. For hard rate limiting, use the\n * {@link rateLimit} parameter.\n */\n throttle?: {\n /**\n * An optional expression which returns a throttling key for controlling throttling.\n * Every unique key is its own throttle limit. Event data may be used within this\n * expression, eg \"event.data.user_id\".\n */\n key?: string;\n\n /**\n * The total number of runs allowed to start within the given `period`. The limit is\n * applied evenly over the period.\n */\n limit: number;\n\n /**\n * The period of time for the rate limit. Run starts are evenly spaced through\n * the given period. The minimum granularity is 1 second.\n */\n period: TimeStr;\n\n /**\n * The number of runs allowed to start in the given window in a single burst.\n * A burst > 1 bypasses smoothing for the burst and allows many runs to start\n * at once, if desired. Defaults to 1, which disables bursting.\n */\n burst?: number;\n };\n\n /**\n * Debounce delays functions for the `period` specified. If an event is sent,\n * the function will not run until at least `period` has elapsed.\n *\n * If any new events are received that match the same debounce `key`, the\n * function is rescheduled for another `period` delay, and the triggering\n * event is replaced with the latest event received.\n *\n * See the [Debounce documentation](https://innge.st/debounce) for more\n * information.\n */\n debounce?: {\n /**\n * An optional key to use for debouncing.\n *\n * See [Debounce documentation](https://innge.st/debounce) for more\n * information on how to use `key` expressions.\n */\n key?: string;\n\n /**\n * The period of time to delay after receiving the last trigger to run the\n * function.\n *\n * See [Debounce documentation](https://innge.st/debounce) for more\n * information.\n */\n period: TimeStr;\n\n /**\n * The maximum time that a debounce can be extended before running.\n * If events are continually received within the given period, a function\n * will always run after the given timeout period.\n *\n * See [Debounce documentation](https://innge.st/debounce) for more\n * information.\n */\n timeout?: TimeStr;\n };\n\n /**\n * Configure how the priority of a function run is decided when multiple\n * functions are triggered at the same time.\n *\n * See the [Priority documentation](https://innge.st/priority) for more\n * information.\n */\n priority?: {\n /**\n * An expression to use to determine the priority of a function run. The\n * expression can return a number between `-600` and `600`, where `600`\n * declares that this run should be executed before any others enqueued in\n * the last 600 seconds (10 minutes), and `-600` declares that this run\n * should be executed after any others enqueued in the last 600 seconds.\n *\n * See the [Priority documentation](https://innge.st/priority) for more\n * information.\n */\n run?: string;\n };\n\n /**\n * Configure timeouts for the function. If any of the timeouts are hit, the\n * function run will be cancelled.\n */\n timeouts?: {\n /**\n * Start represents the timeout for starting a function. If the time\n * between scheduling and starting a function exceeds this value, the\n * function will be cancelled.\n *\n * This is, essentially, the amount of time that a function sits in the\n * queue before starting.\n *\n * A function may exceed this duration because of concurrency limits,\n * throttling, etc.\n */\n start?: TimeStr;\n\n /**\n * Finish represents the time between a function starting and the function\n * finishing. If a function takes longer than this time to finish, the\n * function is marked as cancelled.\n *\n * The start time is taken from the time that the first successful\n * function request begins, and does not include the time spent in the\n * queue before the function starts.\n *\n * Note that if the final request to a function begins before this\n * timeout, and completes after this timeout, the function will succeed.\n */\n finish?: TimeStr;\n };\n\n /**\n * Ensures that only one run of the function is active at a time for a given key.\n * If a new run is triggered while another is still in progress with the same key,\n * the new run will either be skipped or replace the active one, depending on the mode.\n *\n * This is useful for deduplication or enforcing exclusive execution.\n */\n singleton?: {\n /**\n * An optional key expression used to scope singleton execution.\n * Each unique key has its own singleton lock. Event data can be referenced,\n * e.g. \"event.data.user_id\".\n */\n key?: string;\n\n /**\n * Determines how to handle new runs when one is already active for the same key.\n * - `\"skip\"` skips the new run.\n * - `\"cancel\"` cancels the existing run and starts the new one.\n */\n mode: \"skip\" | \"cancel\";\n };\n\n cancelOn?: Cancellation[];\n\n /**\n * Specifies the maximum number of retries for all steps across this function.\n *\n * Can be a number from `0` to `20`. Defaults to `3`.\n */\n retries?:\n | 0\n | 1\n | 2\n | 3\n | 4\n | 5\n | 6\n | 7\n | 8\n | 9\n | 10\n | 11\n | 12\n | 13\n | 14\n | 15\n | 16\n | 17\n | 18\n | 19\n | 20;\n\n /**\n * Provide a function to be called if your function fails, meaning\n * that it ran out of retries and was unable to complete successfully.\n *\n * This is useful for sending warning notifications or cleaning up\n * after a failure and supports all the same functionality as a\n * regular handler.\n */\n onFailure?: TFailureHandler;\n\n /**\n * Define a set of middleware that can be registered to hook into\n * various lifecycles of the SDK and affect input and output of\n * Inngest functionality.\n *\n * See {@link https://innge.st/middleware}\n */\n middleware?: Middleware.Class[];\n\n /**\n * Optimizes parallel steps to reduce traffic during `Promise` resolution,\n * reducing time and requests per run. `Promise.*()` waits for all promises\n * to settle before resolving. Use `group.parallel()` for `Promise.race()`\n * semantics.\n *\n * Overrides the client-level setting.\n *\n * @deprecated Use `group.parallel({ mode: \"race\" })` for race semantics\n * instead.\n * @default true\n */\n optimizeParallelism?: boolean;\n\n /**\n * Whether or not to use checkpointing for this function's executions.\n *\n * If `true`, enables checkpointing with default settings, which is a safe,\n * blocking version of checkpointing, where we check in with Inngest after\n * every step is run.\n *\n * If an object, you can tweak the settings to batch, set a maximum runtime\n * before going async, and more. Note that if your server dies before the\n * checkpoint completes, step data will be lost and steps will be rerun.\n *\n * We recommend starting with the default `true` configuration and only tweak\n * the parameters directly if necessary.\n *\n * @deprecated Use `checkpointing` instead.\n */\n experimentalCheckpointing?: CheckpointingOptions;\n\n /**\n * Whether or not to use checkpointing for this function's executions.\n *\n * If `false`, disables checkpointing.\n *\n * If `true`, enables checkpointing with default settings, which is a safe,\n * blocking version of checkpointing, where we check in with Inngest after\n * every step is run.\n *\n * If an object, you can tweak the settings to batch, set a maximum runtime\n * before going async, and more. Note that if your server dies before the\n * checkpoint completes, step data will be lost and steps will be rerun.\n *\n * We recommend starting with the default `true` configuration and only tweak\n * the parameters directly if necessary.\n *\n * @default true\n */\n checkpointing?: CheckpointingOptions;\n }\n}\n\nexport type CreateExecutionOptions = {\n partialOptions: Omit<InngestExecutionOptions, \"fn\">;\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InngestFunction.d.cts","names":[],"sources":["../../src/components/InngestFunction.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"InngestFunction.d.cts","names":[],"sources":["../../src/components/InngestFunction.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;AAmCA;;;;;;;AAIkB,cAJL,eAIa,CAAA,gBAHR,eAAA,CAAgB,OAGR,CAHgB,SAGhB,EAH2B,eAG3B,CAAA,EAAA,iBAFP,OAAA,CAAQ,GAED,EAAA,wBADA,OAAA,CAAQ,GACR,EAAA,gBAAR,OAAA,CAAQ,GAAA,GAAM,OAAA,CAAQ,GAAd,EAAA,kBAEtB,eAAA,CAAgB,OAFM,CAAA,MAAA,CAAA,EAAA,GAEc,eAAA,CAAgB,OAF9B,CAAA,MAAA,CAAA,EAAA,CAAA,YAGb,eAAA,CAAgB,IAHH,CAAA;SAAM,MAAQ,EAAA,MAAA;SAEpC,aAAgB,EAAA,MAAA;OAMb,MAAA,CAAO,WAAA,GAN0C,EAAA,OAMnB,eAAA,CAAgB,GANG;WAMnB,IAAA,EAIb,OAJ6B;mBAAvC,EAAA;mBAIU,WAAA;qBAIK,MAAA,EAAA,OAAA;;;;;;;;EAbI,WAAA,CAAA,MAAA,EAuBrB,OAvBqB;EAmUhB;;;MAUb,EAjTM,OAiTE,EAAA,EAAA,EAhTJ,QAgTI;;;;KASE,MAAO,CAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;;;;gBAkBc,UAAgB,CAAA,CAAA,EAAA,MAAA;;;;MAW7C,IAAA,CAAA,CAAA,EAAA,MAAA;;;;MAGS,WAAA,CAAA,CAAA,EAAA,MAAA,GAAA,SAAA;;;;UAqDA,SAAA;;;;;YA+JD,iBAAA,CAAA,KAAA,EAAA,MAAA,CAAA,EA9WgC,cA8WhC,CAAA,UAAA,CAAA;YAcC,eAAA,CAAA,IAAA,EA1VmB,sBA0VnB,CAAA,EA1V4C,iBA0V5C;UA0BA,yBAAA;UAsCC,qBAAA;;;;;AAiEhB;;;;;;kBAtZiB,eAAA;;;;;;aAOG,gBAEhB,eAAA,CAAgB,mBAChB,OAAA,CAAQ,KACR,OAAA,CAAQ;;cAQE,MAAA,CAAO,WAAA,UAAqB,eAAA,CAAgB;;;;;;;uCAQZ;WAE/B,QAAQ,uBAAuB;;;;;4BAQX,eAAA,CAAgB,OAE/C,UAAU,+CAA+C;;;;;;sCASvD,eAAA,CAAgB,oBAAoB,eAAA,CAAgB,2CAC9B,OAAA,CAAQ,MAAM,OAAA,CAAQ;eAEnC;;;;;;;;;;;;;;;;;;;;;;;;;;2BAgCP,oBACA,eAAe;;;;;;;;;;;;;;;;;;eAoBR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA6CD;;;;;;;;;;;;;;;;;;;;;;;;cA2BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAqCA;;;;;;;;;gBAUE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAwCF;;;;;;;;;;;;;eAcC;;;;;;;;;;;;;;;;;;;;;;;eA0BA;;;;;;;;;;;;;;;gBAsCC;;;;;;;;iBASC,UAAA,CAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAgCI;;;;;;;;;;;;;;;;;;;oBAoBZ;;;KAIR,sBAAA;kBACM,KAAK"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InngestFunction.d.ts","names":[],"sources":["../../src/components/InngestFunction.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"InngestFunction.d.ts","names":[],"sources":["../../src/components/InngestFunction.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;AAmCA;;;;;;;AAIkB,cAJL,eAIa,CAAA,gBAHR,eAAA,CAAgB,OAGR,CAHgB,SAGhB,EAH2B,eAG3B,CAAA,EAAA,iBAFP,OAAA,CAAQ,GAED,EAAA,wBADA,OAAA,CAAQ,GACR,EAAA,gBAAR,OAAA,CAAQ,GAAA,GAAM,OAAA,CAAQ,GAAd,EAAA,kBAEtB,eAAA,CAAgB,OAFM,CAAA,MAAA,CAAA,EAAA,GAEc,eAAA,CAAgB,OAF9B,CAAA,MAAA,CAAA,EAAA,CAAA,YAGb,eAAA,CAAgB,IAHH,CAAA;SAAM,MAAQ,EAAA,MAAA;SAEpC,aAAgB,EAAA,MAAA;OAMb,MAAA,CAAO,WAAA,GAN0C,EAAA,OAMnB,eAAA,CAAgB,GANG;WAMnB,IAAA,EAIb,OAJ6B;mBAAvC,EAAA;mBAIU,WAAA;qBAIK,MAAA,EAAA,OAAA;;;;;;;;EAbI,WAAA,CAAA,MAAA,EAuBrB,OAvBqB;EAmUhB;;;MAUb,EAjTM,OAiTE,EAAA,EAAA,EAhTJ,QAgTI;;;;KASE,MAAO,CAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;;;;gBAkBc,UAAgB,CAAA,CAAA,EAAA,MAAA;;;;MAW7C,IAAA,CAAA,CAAA,EAAA,MAAA;;;;MAGS,WAAA,CAAA,CAAA,EAAA,MAAA,GAAA,SAAA;;;;UAqDA,SAAA;;;;;YA+JD,iBAAA,CAAA,KAAA,EAAA,MAAA,CAAA,EA9WgC,cA8WhC,CAAA,UAAA,CAAA;YAcC,eAAA,CAAA,IAAA,EA1VmB,sBA0VnB,CAAA,EA1V4C,iBA0V5C;UA0BA,yBAAA;UAsCC,qBAAA;;;;;AAiEhB;;;;;;kBAtZiB,eAAA;;;;;;aAOG,gBAEhB,eAAA,CAAgB,mBAChB,OAAA,CAAQ,KACR,OAAA,CAAQ;;cAQE,MAAA,CAAO,WAAA,UAAqB,eAAA,CAAgB;;;;;;;uCAQZ;WAE/B,QAAQ,uBAAuB;;;;;4BAQX,eAAA,CAAgB,OAE/C,UAAU,+CAA+C;;;;;;sCASvD,eAAA,CAAgB,oBAAoB,eAAA,CAAgB,2CAC9B,OAAA,CAAQ,MAAM,OAAA,CAAQ;eAEnC;;;;;;;;;;;;;;;;;;;;;;;;;;2BAgCP,oBACA,eAAe;;;;;;;;;;;;;;;;;;eAoBR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA6CD;;;;;;;;;;;;;;;;;;;;;;;;cA2BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAqCA;;;;;;;;;gBAUE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAwCF;;;;;;;;;;;;;eAcC;;;;;;;;;;;;;;;;;;;;;;;eA0BA;;;;;;;;;;;;;;;gBAsCC;;;;;;;;iBASC,UAAA,CAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAgCI;;;;;;;;;;;;;;;;;;;oBAoBZ;;;KAIR,sBAAA;kBACM,KAAK"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { internalEvents, queryKeys } from "../helpers/consts.js";
|
|
2
2
|
import { defaultCheckpointingOptions } from "../types.js";
|
|
3
|
+
import { warnOnce } from "../helpers/log.js";
|
|
3
4
|
import { timeStr } from "../helpers/strings.js";
|
|
4
5
|
import { EventType } from "./triggers/triggers.js";
|
|
6
|
+
import { internalLoggerSymbol } from "./Inngest.js";
|
|
5
7
|
import { createExecutionEngine } from "./execution/engine.js";
|
|
6
8
|
|
|
7
9
|
//#region src/components/InngestFunction.ts
|
|
@@ -36,6 +38,7 @@ var InngestFunction = class InngestFunction {
|
|
|
36
38
|
this.opts = opts;
|
|
37
39
|
this.fn = fn;
|
|
38
40
|
this.onFailureFn = this.opts.onFailure;
|
|
41
|
+
if (this.opts.optimizeParallelism === false) warnOnce(this.client[internalLoggerSymbol], `optimize-parallelism-deprecated:${this.opts.id}`, "`optimizeParallelism: false` is deprecated; use `group.parallel({ mode: \"race\" }, ...)` for race semantics instead");
|
|
39
42
|
}
|
|
40
43
|
/**
|
|
41
44
|
* The generated or given ID for this function.
|