inngest 4.2.6 → 4.4.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 +24 -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/DeferredFunction.cjs +66 -0
- package/components/DeferredFunction.cjs.map +1 -0
- package/components/DeferredFunction.d.cts +99 -0
- package/components/DeferredFunction.d.cts.map +1 -0
- package/components/DeferredFunction.d.ts +99 -0
- package/components/DeferredFunction.d.ts.map +1 -0
- package/components/DeferredFunction.js +65 -0
- package/components/DeferredFunction.js.map +1 -0
- package/components/Inngest.cjs +5 -2
- package/components/Inngest.cjs.map +1 -1
- package/components/Inngest.d.cts +11 -4
- package/components/Inngest.d.cts.map +1 -1
- package/components/Inngest.d.ts +11 -4
- package/components/Inngest.d.ts.map +1 -1
- package/components/Inngest.js +5 -2
- package/components/Inngest.js.map +1 -1
- package/components/InngestCommHandler.cjs +28 -23
- package/components/InngestCommHandler.cjs.map +1 -1
- package/components/InngestCommHandler.d.cts +9 -4
- package/components/InngestCommHandler.d.cts.map +1 -1
- package/components/InngestCommHandler.d.ts +9 -4
- package/components/InngestCommHandler.d.ts.map +1 -1
- package/components/InngestCommHandler.js +28 -23
- package/components/InngestCommHandler.js.map +1 -1
- package/components/InngestFunction.cjs +27 -19
- package/components/InngestFunction.cjs.map +1 -1
- package/components/InngestFunction.d.cts +6 -1
- package/components/InngestFunction.d.cts.map +1 -1
- package/components/InngestFunction.d.ts +6 -1
- package/components/InngestFunction.d.ts.map +1 -1
- package/components/InngestFunction.js +27 -19
- package/components/InngestFunction.js.map +1 -1
- package/components/InngestGroupTools.cjs +1 -1
- package/components/InngestGroupTools.cjs.map +1 -1
- package/components/InngestGroupTools.js +1 -1
- package/components/InngestGroupTools.js.map +1 -1
- package/components/InngestStepTools.cjs +3 -7
- package/components/InngestStepTools.cjs.map +1 -1
- package/components/InngestStepTools.d.cts +10 -7
- package/components/InngestStepTools.d.cts.map +1 -1
- package/components/InngestStepTools.d.ts +10 -7
- package/components/InngestStepTools.d.ts.map +1 -1
- package/components/InngestStepTools.js +3 -7
- package/components/InngestStepTools.js.map +1 -1
- package/components/connect/config.cjs +2 -0
- package/components/connect/config.cjs.map +1 -1
- package/components/connect/config.js +2 -0
- package/components/connect/config.js.map +1 -1
- package/components/connect/strategies/core/connection.cjs +91 -11
- package/components/connect/strategies/core/connection.cjs.map +1 -1
- package/components/connect/strategies/core/connection.js +91 -11
- package/components/connect/strategies/core/connection.js.map +1 -1
- package/components/connect/strategies/core/heartbeat.cjs +2 -1
- package/components/connect/strategies/core/heartbeat.cjs.map +1 -1
- package/components/connect/strategies/core/heartbeat.js +2 -1
- package/components/connect/strategies/core/heartbeat.js.map +1 -1
- package/components/connect/strategies/core/requestProcessor.cjs +27 -4
- package/components/connect/strategies/core/requestProcessor.cjs.map +1 -1
- package/components/connect/strategies/core/requestProcessor.js +27 -4
- package/components/connect/strategies/core/requestProcessor.js.map +1 -1
- package/components/connect/strategies/core/types.cjs +21 -0
- package/components/connect/strategies/core/types.cjs.map +1 -0
- package/components/connect/strategies/core/types.js +20 -0
- package/components/connect/strategies/core/types.js.map +1 -0
- package/components/connect/types.cjs.map +1 -1
- package/components/connect/types.d.cts +18 -0
- package/components/connect/types.d.cts.map +1 -1
- package/components/connect/types.d.ts +18 -0
- package/components/connect/types.d.ts.map +1 -1
- package/components/connect/types.js.map +1 -1
- package/components/execution/InngestExecution.cjs.map +1 -1
- package/components/execution/InngestExecution.d.cts +19 -2
- package/components/execution/InngestExecution.d.cts.map +1 -1
- package/components/execution/InngestExecution.d.ts +19 -2
- package/components/execution/InngestExecution.d.ts.map +1 -1
- package/components/execution/InngestExecution.js.map +1 -1
- package/components/execution/engine.cjs +233 -28
- package/components/execution/engine.cjs.map +1 -1
- package/components/execution/engine.d.cts +14 -0
- package/components/execution/engine.d.cts.map +1 -1
- package/components/execution/engine.d.ts +14 -0
- package/components/execution/engine.d.ts.map +1 -1
- package/components/execution/engine.js +233 -28
- package/components/execution/engine.js.map +1 -1
- package/components/execution/lazyOps.cjs +64 -0
- package/components/execution/lazyOps.cjs.map +1 -0
- package/components/execution/lazyOps.d.cts +42 -0
- package/components/execution/lazyOps.d.cts.map +1 -0
- package/components/execution/lazyOps.d.ts +42 -0
- package/components/execution/lazyOps.d.ts.map +1 -0
- package/components/execution/lazyOps.js +63 -0
- package/components/execution/lazyOps.js.map +1 -0
- package/components/execution/otel/middleware.d.cts +14 -5
- package/components/execution/otel/middleware.d.cts.map +1 -1
- package/components/execution/otel/middleware.d.ts +14 -5
- package/components/execution/otel/middleware.d.ts.map +1 -1
- package/components/middleware/manager.cjs +1 -1
- package/components/middleware/manager.cjs.map +1 -1
- package/components/middleware/manager.js +2 -2
- package/components/middleware/manager.js.map +1 -1
- package/components/middleware/middleware.cjs.map +1 -1
- package/components/middleware/middleware.d.cts +1 -1
- package/components/middleware/middleware.d.cts.map +1 -1
- package/components/middleware/middleware.d.ts +1 -1
- package/components/middleware/middleware.d.ts.map +1 -1
- package/components/middleware/middleware.js.map +1 -1
- package/components/middleware/utils.cjs +5 -3
- package/components/middleware/utils.cjs.map +1 -1
- package/components/middleware/utils.js +5 -3
- package/components/middleware/utils.js.map +1 -1
- package/components/triggers/typeHelpers.cjs.map +1 -1
- package/components/triggers/typeHelpers.d.cts +11 -0
- package/components/triggers/typeHelpers.d.cts.map +1 -1
- package/components/triggers/typeHelpers.d.ts +11 -0
- package/components/triggers/typeHelpers.d.ts.map +1 -1
- package/components/triggers/typeHelpers.js.map +1 -1
- package/experimental.cjs +3 -0
- package/experimental.d.cts +2 -1
- package/experimental.d.ts +2 -1
- package/experimental.js +2 -1
- package/helpers/consts.cjs +6 -0
- package/helpers/consts.cjs.map +1 -1
- package/helpers/consts.d.cts +6 -0
- package/helpers/consts.d.cts.map +1 -1
- package/helpers/consts.d.ts +6 -0
- package/helpers/consts.d.ts.map +1 -1
- package/helpers/consts.js +6 -0
- package/helpers/consts.js.map +1 -1
- package/helpers/functions.cjs +1 -0
- package/helpers/functions.cjs.map +1 -1
- package/helpers/functions.js +1 -0
- package/helpers/functions.js.map +1 -1
- package/helpers/marker.cjs +21 -0
- package/helpers/marker.cjs.map +1 -0
- package/helpers/marker.d.cts +12 -0
- package/helpers/marker.d.cts.map +1 -0
- package/helpers/marker.d.ts +12 -0
- package/helpers/marker.d.ts.map +1 -0
- package/helpers/marker.js +19 -0
- package/helpers/marker.js.map +1 -0
- package/helpers/strings.cjs +10 -4
- package/helpers/strings.cjs.map +1 -1
- package/helpers/strings.d.cts.map +1 -1
- package/helpers/strings.d.ts.map +1 -1
- package/helpers/strings.js +10 -4
- package/helpers/strings.js.map +1 -1
- package/helpers/temporal.cjs +2 -0
- package/helpers/temporal.d.ts +3 -0
- package/helpers/temporal.d.ts.map +1 -1
- package/helpers/temporal.js +1 -1
- package/package.json +2 -2
- package/proto/src/components/connect/protobuf/connect.cjs +11 -2
- package/proto/src/components/connect/protobuf/connect.cjs.map +1 -1
- package/proto/src/components/connect/protobuf/connect.js +11 -2
- package/proto/src/components/connect/protobuf/connect.js.map +1 -1
- package/react.d.cts.map +1 -1
- package/types.cjs +2 -0
- package/types.cjs.map +1 -1
- package/types.d.cts +43 -8
- package/types.d.cts.map +1 -1
- package/types.d.ts +43 -8
- package/types.d.ts.map +1 -1
- package/types.js +2 -0
- 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":"typeHelpers.js","names":[],"sources":["../../../src/components/triggers/typeHelpers.ts"],"sourcesContent":["// biome-ignore-all lint/suspicious/noExplicitAny: it's fine\n\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { AsTuple } from \"../../helpers/types.ts\";\nimport type { createGroupTools } from \"../InngestGroupTools.ts\";\nimport type { EventType, EventTypeWithAnySchema } from \"./triggers.ts\";\n\nexport type AnySchema = StandardSchemaV1<any>;\ntype BasicDataUnknown = Record<string, unknown>;\ntype BasicDataAny = Record<string, any>;\n\ntype InvokeEventName = \"inngest/function.invoked\";\ntype CronEventName = \"inngest/scheduled.timer\";\ntype CronEventData = { cron: string };\n\n/**\n * Detects if a string type contains a wildcard character (*).\n */\ntype ContainsWildcard<T extends string> = T extends `${string}*${string}`\n ? true\n : false;\n\n/**\n * Converts wildcard event names to `unknown`, preserving literal names.\n */\ntype WildcardToUnknown<T extends string> = ContainsWildcard<T> extends true\n ? unknown\n : T;\n\n/**\n * Represents the structure of an event as received by function handlers.\n *\n * This is the runtime event shape that your function receives when triggered.\n *\n * @template TName - The event name as a string literal type\n * @template TData - The event data object type\n */\nexport type ReceivedEvent<TName, TData extends BasicDataUnknown> = {\n data: TData;\n id: string;\n name: TName;\n ts: number;\n v: string;\n};\n\n/**\n * Recursively checks if a trigger array contains an invoke trigger.\n *\n * This type is used to determine whether to add \"inngest/function.invoked\"\n * event to the received events tuple.\n *\n * @template T - Array of trigger definitions to check\n * @returns `true` if array contains an invoke trigger, `false` otherwise\n */\ntype HasInvokeTrigger<T extends readonly any[]> = T extends readonly [\n infer First,\n ...infer Rest,\n]\n ? First extends EventTypeWithAnySchema<InvokeEventName>\n ? true\n : HasInvokeTrigger<Rest>\n : false;\n\n/**\n * Converts an EventType instance to a ReceivedEvent type.\n *\n * Extracts the event name and schema from EventType and transforms it into\n * the ReceivedEvent shape that function handlers receive.\n *\n * @template TEventType - The EventType instance to convert\n * @returns ReceivedEvent type with extracted name and data\n */\ntype EventTypeToEvent<TEventType> = TEventType extends EventType<\n infer TName,\n infer TSchema\n>\n ? TSchema extends StandardSchemaV1<infer TData extends BasicDataUnknown>\n ? ReceivedEvent<WildcardToUnknown<TName>, TData>\n : ReceivedEvent<WildcardToUnknown<TName>, BasicDataAny>\n : never;\n\n/**\n * Converts a plain event object trigger to a ReceivedEvent type.\n *\n * Handles triggers like `{ event: \"my-event\", schema?: z.object(...) }`.\n *\n * @template TName - Event name\n * @template TSchema - Optional schema type\n * @returns ReceivedEvent with typed data from schema, or Record<string, any> if no schema\n */\ntype PlainEventToReceivedEvent<\n TName extends string,\n TSchema,\n> = TSchema extends StandardSchemaV1<infer TData extends BasicDataUnknown>\n ? ReceivedEvent<WildcardToUnknown<TName>, TData>\n : ReceivedEvent<WildcardToUnknown<TName>, BasicDataAny>;\n\n/**\n * Processes a single trigger and converts it to ReceivedEvent(s).\n *\n * @template TTrigger - The trigger to process\n * @template TSeenCron - Whether we've already seen a cron trigger\n * @returns Tuple of ReceivedEvent(s), or empty array if trigger should be skipped\n */\ntype ProcessSingleTrigger<\n TTrigger,\n TSeenCron extends boolean,\n> = TTrigger extends EventTypeWithAnySchema<InvokeEventName> // Is this an invoke trigger?\n ? [] // Skip invoke triggers (handled separately by ToReceivedEvent)\n : TTrigger extends EventTypeWithAnySchema<string> // Is this an event type trigger?\n ? [EventTypeToEvent<TTrigger>]\n : TTrigger extends { cron: string } // Is this a cron trigger?\n ? TSeenCron extends true\n ? [] // Skip additional cron triggers (they're merged into one)\n : [ReceivedEvent<CronEventName, CronEventData>]\n : // Is this an event trigger using an EventType?\n TTrigger extends {\n event: EventType<infer TName, infer TSchema>;\n if?: string;\n }\n ? [\n TSchema extends StandardSchemaV1<\n infer TData extends BasicDataUnknown\n >\n ? ReceivedEvent<WildcardToUnknown<TName>, TData>\n : ReceivedEvent<WildcardToUnknown<TName>, BasicDataAny>,\n ]\n : // Is this an event trigger using a string name (i.e. not an EventType)?\n TTrigger extends {\n event: infer TName extends string;\n schema?: infer TSchema;\n }\n ? [PlainEventToReceivedEvent<TName, TSchema>]\n : []; // Unknown trigger type, skip it\n\n/**\n * Recursively processes trigger array, converting to event types while tracking\n * crons.\n *\n * This type iterates through a trigger array, converting each trigger to its\n * corresponding ReceivedEvent type. It handles:\n * - EventType instances → ReceivedEvent with typed data\n * - Cron triggers → \"inngest/scheduled.timer\" event (merged if multiple)\n * - Plain event objects → ReceivedEvent with typed or untyped data\n * - Invoke triggers → skipped (handled by ToReceivedEvent)\n *\n * @template T - Array of trigger definitions to process\n * @template SeenCron - Tracks whether we've already encountered a cron trigger\n *\n * @remarks\n * Multiple cron triggers are merged into a single \"inngest/scheduled.timer\" event.\n */\ntype TriggersToEventsWithCron<\n T extends readonly any[],\n SeenCron extends boolean = false,\n> = T extends readonly [infer First, ...infer Rest]\n ? [\n ...ProcessSingleTrigger<First, SeenCron>,\n ...TriggersToEventsWithCron<\n Rest,\n First extends { cron: string } ? true : SeenCron\n >,\n ]\n : [];\n\n/**\n * Alias for TriggersToEventsWithCron that processes all non-invoke triggers.\n *\n * Despite the name \"Filter\", this type actually:\n * 1. Converts event triggers to ReceivedEvent types\n * 2. Converts cron triggers to \"inngest/scheduled.timer\" events\n * 3. Merges multiple cron triggers into one\n * 4. Preserves the order of non-invoke triggers\n *\n * @template T - Array of trigger definitions to process\n */\ntype FilterNonInvokeTriggers<T extends readonly any[]> =\n TriggersToEventsWithCron<T>;\n\n/**\n * Extracts and builds a union of schema output types from invoke triggers.\n *\n * This recursively processes the trigger array and accumulates the output types\n * from all invoke trigger schemas (those with event: \"inngest/function.invoked\")\n * into a union type.\n *\n * @template T - Array of trigger definitions to process\n * @returns Union of all invoke trigger schema output types, or `never` if none found\n */\ntype ExtractInvokeSchemas<T extends readonly any[]> = T extends readonly [\n infer First,\n ...infer Rest,\n]\n ? First extends EventType<InvokeEventName, infer TSchema>\n ? TSchema extends StandardSchemaV1<infer TData>\n ? TData | ExtractInvokeSchemas<Rest>\n : ExtractInvokeSchemas<Rest>\n : ExtractInvokeSchemas<Rest>\n : never;\n\n/**\n * Extracts and builds a union of all data types from all trigger schemas.\n *\n * Unlike ExtractInvokeSchemas which only processes invoke triggers, this type\n * processes ALL triggers (event and invoke triggers) and builds a union of\n * their data types. For event triggers without schemas, it returns Record<string, any>.\n *\n * @template T - Array of trigger definitions to process\n * @returns Union of all trigger data types, or `never` if none found\n */\ntype ExtractAllSchemaOutputs<T extends readonly any[]> = T extends readonly [\n infer First,\n ...infer Rest,\n]\n ? First extends EventType<string, infer TSchema>\n ? TSchema extends StandardSchemaV1<infer TData>\n ? TData | ExtractAllSchemaOutputs<Rest>\n : BasicDataAny | ExtractAllSchemaOutputs<Rest>\n : First extends { event: EventType<string, infer TSchema> }\n ? TSchema extends StandardSchemaV1<infer TData>\n ? TData | ExtractAllSchemaOutputs<Rest>\n : BasicDataAny | ExtractAllSchemaOutputs<Rest>\n : First extends {\n event: string;\n schema: StandardSchemaV1<infer TData>;\n }\n ? TData | ExtractAllSchemaOutputs<Rest>\n : First extends { event: string }\n ? BasicDataAny | ExtractAllSchemaOutputs<Rest>\n : ExtractAllSchemaOutputs<Rest>\n : never;\n\n/**\n * Converts `never` type to empty object `{}` for data types.\n *\n * This utility is used to ensure that when no schemas are found, the data type\n * becomes `{}` instead of `never`, which provides better TypeScript error\n * messages and autocomplete.\n *\n * @template T - Type to check and potentially convert\n * @returns `{}` if T is `never`, otherwise returns T unchanged\n */\ntype NeverToEmpty<T> = [T] extends [never] ? {} : T;\n\n/**\n * Converts a trigger array to a tuple of ReceivedEvent types.\n *\n * This type transforms trigger definitions into the event types that a function\n * handler will receive. It always includes an invoke event type because\n * functions can be invoked directly regardless of their declared triggers.\n *\n * When invoke triggers are present, it uses their schemas for the invoke event\n * data. Otherwise, it derives the invoke event data type from all trigger\n * schemas.\n *\n * @template T - Array of trigger definitions to process\n */\nexport type ToReceivedEvent<T extends readonly any[]> =\n HasInvokeTrigger<T> extends true\n ? [\n ...FilterNonInvokeTriggers<T>,\n ReceivedEvent<InvokeEventName, NeverToEmpty<ExtractInvokeSchemas<T>>>,\n ]\n : [\n ...TriggersToEventsWithCron<T>,\n ReceivedEvent<\n InvokeEventName,\n NeverToEmpty<ExtractAllSchemaOutputs<T>>\n >,\n ];\n\n/**\n * Converts a tuple of ReceivedEvent types to a union.\n * @internal\n */\ntype ReceivedEventTupleToUnion<T extends readonly any[]> = T[number];\n\n/**\n * Base context object for handlers using the new trigger-based event typing.\n * This uses ToReceivedEvent to derive event types directly from triggers\n * rather than looking up from the client's event registry.\n *\n * @template TStepTools - The step tools type for this context\n * @template TTriggers - Array of trigger definitions\n * @internal\n */\nexport type BaseContextWithTriggers<\n TStepTools,\n TTriggers extends readonly any[],\n> = {\n /**\n * The event data present in the payload.\n */\n event: ReceivedEventTupleToUnion<ToReceivedEvent<TTriggers>>;\n events: AsTuple<ReceivedEventTupleToUnion<ToReceivedEvent<TTriggers>>>;\n\n /**\n * The run ID for the current function execution\n */\n runId: string;\n\n step: TStepTools;\n\n /**\n * Tools for grouping and coordinating steps.\n */\n group: ReturnType<typeof createGroupTools>;\n\n /**\n * The current zero-indexed attempt number for this function execution.\n */\n attempt: number;\n\n /**\n * The maximum number of attempts allowed for this function.\n */\n maxAttempts?: number;\n};\n\n/**\n * Context object for handlers using trigger-based event typing with middleware overrides.\n *\n * @template TStepTools - The step tools type for this context\n * @template TTriggers - Array of trigger definitions\n * @template TOverrides - Properties to override from middleware\n * @internal\n */\nexport type ContextWithTriggers<\n TStepTools,\n TTriggers extends readonly any[],\n TOverrides extends BasicDataUnknown = Record<never, never>,\n> = Omit<BaseContextWithTriggers<TStepTools, TTriggers>, keyof TOverrides> &\n TOverrides;\n\n/**\n * A handler type that computes its event type from a trigger array using ToReceivedEvent.\n * This provides proper typing for EventType instances and schema-bearing triggers.\n *\n * @template TStepTools - The step tools type for this context\n * @template TTriggers - Array of trigger definitions\n * @template TOverrides - Properties to override from middleware\n * @internal\n */\nexport type HandlerWithTriggers<\n TStepTools,\n TTriggers extends readonly any[],\n TOverrides extends BasicDataUnknown = Record<never, never>,\n> = (\n /**\n * The context argument provides access to all data and tooling available to\n * the function.\n */\n ctx: ContextWithTriggers<TStepTools, TTriggers, TOverrides>,\n) => unknown;\n\n/**\n * Type guard to check if an object has a `validate` method. The use case is for\n * safely validating an event payload that might have a `validate` method\n */\nexport function isValidatable<T>(\n value: T,\n): value is T & { validate: () => Promise<void> } {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n if (!(\"validate\" in value)) {\n return false;\n }\n return typeof value.validate === \"function\";\n}\n"],"mappings":";;;;;AAuWA,SAAgB,cACd,OACgD;AAChD,KAAI,OAAO,UAAU,YAAY,UAAU,KACzC,QAAO;AAET,KAAI,EAAE,cAAc,OAClB,QAAO;AAET,QAAO,OAAO,MAAM,aAAa"}
|
|
1
|
+
{"version":3,"file":"typeHelpers.js","names":[],"sources":["../../../src/components/triggers/typeHelpers.ts"],"sourcesContent":["// biome-ignore-all lint/suspicious/noExplicitAny: it's fine\n\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { AsTuple } from \"../../helpers/types.ts\";\nimport type { DeferFn } from \"../../types.ts\";\nimport type { createGroupTools } from \"../InngestGroupTools.ts\";\nimport type { EventType, EventTypeWithAnySchema } from \"./triggers.ts\";\n\nexport type AnySchema = StandardSchemaV1<any>;\ntype BasicDataUnknown = Record<string, unknown>;\ntype BasicDataAny = Record<string, any>;\n\ntype InvokeEventName = \"inngest/function.invoked\";\ntype CronEventName = \"inngest/scheduled.timer\";\ntype CronEventData = { cron: string };\n\n/**\n * Detects if a string type contains a wildcard character (*).\n */\ntype ContainsWildcard<T extends string> = T extends `${string}*${string}`\n ? true\n : false;\n\n/**\n * Converts wildcard event names to `unknown`, preserving literal names.\n */\ntype WildcardToUnknown<T extends string> = ContainsWildcard<T> extends true\n ? unknown\n : T;\n\n/**\n * Represents the structure of an event as received by function handlers.\n *\n * This is the runtime event shape that your function receives when triggered.\n *\n * @template TName - The event name as a string literal type\n * @template TData - The event data object type\n */\nexport type ReceivedEvent<TName, TData extends BasicDataUnknown> = {\n data: TData;\n id: string;\n name: TName;\n ts: number;\n v: string;\n};\n\n/**\n * Recursively checks if a trigger array contains an invoke trigger.\n *\n * This type is used to determine whether to add \"inngest/function.invoked\"\n * event to the received events tuple.\n *\n * @template T - Array of trigger definitions to check\n * @returns `true` if array contains an invoke trigger, `false` otherwise\n */\ntype HasInvokeTrigger<T extends readonly any[]> = T extends readonly [\n infer First,\n ...infer Rest,\n]\n ? First extends EventTypeWithAnySchema<InvokeEventName>\n ? true\n : HasInvokeTrigger<Rest>\n : false;\n\n/**\n * Converts an EventType instance to a ReceivedEvent type.\n *\n * Extracts the event name and schema from EventType and transforms it into\n * the ReceivedEvent shape that function handlers receive.\n *\n * @template TEventType - The EventType instance to convert\n * @returns ReceivedEvent type with extracted name and data\n */\ntype EventTypeToEvent<TEventType> = TEventType extends EventType<\n infer TName,\n infer TSchema\n>\n ? TSchema extends StandardSchemaV1<infer TData extends BasicDataUnknown>\n ? ReceivedEvent<WildcardToUnknown<TName>, TData>\n : ReceivedEvent<WildcardToUnknown<TName>, BasicDataAny>\n : never;\n\n/**\n * Converts a plain event object trigger to a ReceivedEvent type.\n *\n * Handles triggers like `{ event: \"my-event\", schema?: z.object(...) }`.\n *\n * @template TName - Event name\n * @template TSchema - Optional schema type\n * @returns ReceivedEvent with typed data from schema, or Record<string, any> if no schema\n */\ntype PlainEventToReceivedEvent<\n TName extends string,\n TSchema,\n> = TSchema extends StandardSchemaV1<infer TData extends BasicDataUnknown>\n ? ReceivedEvent<WildcardToUnknown<TName>, TData>\n : ReceivedEvent<WildcardToUnknown<TName>, BasicDataAny>;\n\n/**\n * Processes a single trigger and converts it to ReceivedEvent(s).\n *\n * @template TTrigger - The trigger to process\n * @template TSeenCron - Whether we've already seen a cron trigger\n * @returns Tuple of ReceivedEvent(s), or empty array if trigger should be skipped\n */\ntype ProcessSingleTrigger<\n TTrigger,\n TSeenCron extends boolean,\n> = TTrigger extends EventTypeWithAnySchema<InvokeEventName> // Is this an invoke trigger?\n ? [] // Skip invoke triggers (handled separately by ToReceivedEvent)\n : TTrigger extends EventTypeWithAnySchema<string> // Is this an event type trigger?\n ? [EventTypeToEvent<TTrigger>]\n : TTrigger extends { cron: string } // Is this a cron trigger?\n ? TSeenCron extends true\n ? [] // Skip additional cron triggers (they're merged into one)\n : [ReceivedEvent<CronEventName, CronEventData>]\n : // Is this an event trigger using an EventType?\n TTrigger extends {\n event: EventType<infer TName, infer TSchema>;\n if?: string;\n }\n ? [\n TSchema extends StandardSchemaV1<\n infer TData extends BasicDataUnknown\n >\n ? ReceivedEvent<WildcardToUnknown<TName>, TData>\n : ReceivedEvent<WildcardToUnknown<TName>, BasicDataAny>,\n ]\n : // Is this an event trigger using a string name (i.e. not an EventType)?\n TTrigger extends {\n event: infer TName extends string;\n schema?: infer TSchema;\n }\n ? [PlainEventToReceivedEvent<TName, TSchema>]\n : []; // Unknown trigger type, skip it\n\n/**\n * Recursively processes trigger array, converting to event types while tracking\n * crons.\n *\n * This type iterates through a trigger array, converting each trigger to its\n * corresponding ReceivedEvent type. It handles:\n * - EventType instances → ReceivedEvent with typed data\n * - Cron triggers → \"inngest/scheduled.timer\" event (merged if multiple)\n * - Plain event objects → ReceivedEvent with typed or untyped data\n * - Invoke triggers → skipped (handled by ToReceivedEvent)\n *\n * @template T - Array of trigger definitions to process\n * @template SeenCron - Tracks whether we've already encountered a cron trigger\n *\n * @remarks\n * Multiple cron triggers are merged into a single \"inngest/scheduled.timer\" event.\n */\ntype TriggersToEventsWithCron<\n T extends readonly any[],\n SeenCron extends boolean = false,\n> = T extends readonly [infer First, ...infer Rest]\n ? [\n ...ProcessSingleTrigger<First, SeenCron>,\n ...TriggersToEventsWithCron<\n Rest,\n First extends { cron: string } ? true : SeenCron\n >,\n ]\n : [];\n\n/**\n * Alias for TriggersToEventsWithCron that processes all non-invoke triggers.\n *\n * Despite the name \"Filter\", this type actually:\n * 1. Converts event triggers to ReceivedEvent types\n * 2. Converts cron triggers to \"inngest/scheduled.timer\" events\n * 3. Merges multiple cron triggers into one\n * 4. Preserves the order of non-invoke triggers\n *\n * @template T - Array of trigger definitions to process\n */\ntype FilterNonInvokeTriggers<T extends readonly any[]> =\n TriggersToEventsWithCron<T>;\n\n/**\n * Extracts and builds a union of schema output types from invoke triggers.\n *\n * This recursively processes the trigger array and accumulates the output types\n * from all invoke trigger schemas (those with event: \"inngest/function.invoked\")\n * into a union type.\n *\n * @template T - Array of trigger definitions to process\n * @returns Union of all invoke trigger schema output types, or `never` if none found\n */\ntype ExtractInvokeSchemas<T extends readonly any[]> = T extends readonly [\n infer First,\n ...infer Rest,\n]\n ? First extends EventType<InvokeEventName, infer TSchema>\n ? TSchema extends StandardSchemaV1<infer TData>\n ? TData | ExtractInvokeSchemas<Rest>\n : ExtractInvokeSchemas<Rest>\n : ExtractInvokeSchemas<Rest>\n : never;\n\n/**\n * Extracts and builds a union of all data types from all trigger schemas.\n *\n * Unlike ExtractInvokeSchemas which only processes invoke triggers, this type\n * processes ALL triggers (event and invoke triggers) and builds a union of\n * their data types. For event triggers without schemas, it returns Record<string, any>.\n *\n * @template T - Array of trigger definitions to process\n * @returns Union of all trigger data types, or `never` if none found\n */\ntype ExtractAllSchemaOutputs<T extends readonly any[]> = T extends readonly [\n infer First,\n ...infer Rest,\n]\n ? First extends EventType<string, infer TSchema>\n ? TSchema extends StandardSchemaV1<infer TData>\n ? TData | ExtractAllSchemaOutputs<Rest>\n : BasicDataAny | ExtractAllSchemaOutputs<Rest>\n : First extends { event: EventType<string, infer TSchema> }\n ? TSchema extends StandardSchemaV1<infer TData>\n ? TData | ExtractAllSchemaOutputs<Rest>\n : BasicDataAny | ExtractAllSchemaOutputs<Rest>\n : First extends {\n event: string;\n schema: StandardSchemaV1<infer TData>;\n }\n ? TData | ExtractAllSchemaOutputs<Rest>\n : First extends { event: string }\n ? BasicDataAny | ExtractAllSchemaOutputs<Rest>\n : ExtractAllSchemaOutputs<Rest>\n : never;\n\n/**\n * Converts `never` type to empty object `{}` for data types.\n *\n * This utility is used to ensure that when no schemas are found, the data type\n * becomes `{}` instead of `never`, which provides better TypeScript error\n * messages and autocomplete.\n *\n * @template T - Type to check and potentially convert\n * @returns `{}` if T is `never`, otherwise returns T unchanged\n */\ntype NeverToEmpty<T> = [T] extends [never] ? {} : T;\n\n/**\n * Converts a trigger array to a tuple of ReceivedEvent types.\n *\n * This type transforms trigger definitions into the event types that a function\n * handler will receive. It always includes an invoke event type because\n * functions can be invoked directly regardless of their declared triggers.\n *\n * When invoke triggers are present, it uses their schemas for the invoke event\n * data. Otherwise, it derives the invoke event data type from all trigger\n * schemas.\n *\n * @template T - Array of trigger definitions to process\n */\nexport type ToReceivedEvent<T extends readonly any[]> =\n HasInvokeTrigger<T> extends true\n ? [\n ...FilterNonInvokeTriggers<T>,\n ReceivedEvent<InvokeEventName, NeverToEmpty<ExtractInvokeSchemas<T>>>,\n ]\n : [\n ...TriggersToEventsWithCron<T>,\n ReceivedEvent<\n InvokeEventName,\n NeverToEmpty<ExtractAllSchemaOutputs<T>>\n >,\n ];\n\n/**\n * Converts a tuple of ReceivedEvent types to a union.\n * @internal\n */\ntype ReceivedEventTupleToUnion<T extends readonly any[]> = T[number];\n\n/**\n * Base context object for handlers using the new trigger-based event typing.\n * This uses ToReceivedEvent to derive event types directly from triggers\n * rather than looking up from the client's event registry.\n *\n * @template TStepTools - The step tools type for this context\n * @template TTriggers - Array of trigger definitions\n * @internal\n */\nexport type BaseContextWithTriggers<\n TStepTools,\n TTriggers extends readonly any[],\n> = {\n defer: DeferFn;\n\n /**\n * The event data present in the payload.\n */\n event: ReceivedEventTupleToUnion<ToReceivedEvent<TTriggers>>;\n events: AsTuple<ReceivedEventTupleToUnion<ToReceivedEvent<TTriggers>>>;\n\n /**\n * The run ID for the current function execution\n */\n runId: string;\n\n /**\n * The request ID for this individual outbound SDK invocation, if provided by\n * the executor.\n */\n requestId?: string;\n\n /**\n * The stable job ID for this invocation, if provided by the executor.\n */\n jobId?: string;\n\n step: TStepTools;\n\n /**\n * Tools for grouping and coordinating steps.\n */\n group: ReturnType<typeof createGroupTools>;\n\n /**\n * The current zero-indexed attempt number for this function execution.\n */\n attempt: number;\n\n /**\n * The maximum number of attempts allowed for this function.\n */\n maxAttempts?: number;\n};\n\n/**\n * Context object for handlers using trigger-based event typing with middleware overrides.\n *\n * @template TStepTools - The step tools type for this context\n * @template TTriggers - Array of trigger definitions\n * @template TOverrides - Properties to override from middleware\n * @internal\n */\nexport type ContextWithTriggers<\n TStepTools,\n TTriggers extends readonly any[],\n TOverrides extends BasicDataUnknown = Record<never, never>,\n> = Omit<BaseContextWithTriggers<TStepTools, TTriggers>, keyof TOverrides> &\n TOverrides;\n\n/**\n * A handler type that computes its event type from a trigger array using ToReceivedEvent.\n * This provides proper typing for EventType instances and schema-bearing triggers.\n *\n * @template TStepTools - The step tools type for this context\n * @template TTriggers - Array of trigger definitions\n * @template TOverrides - Properties to override from middleware\n * @internal\n */\nexport type HandlerWithTriggers<\n TStepTools,\n TTriggers extends readonly any[],\n TOverrides extends BasicDataUnknown = Record<never, never>,\n> = (\n /**\n * The context argument provides access to all data and tooling available to\n * the function.\n */\n ctx: ContextWithTriggers<TStepTools, TTriggers, TOverrides>,\n) => unknown;\n\n/**\n * Type guard to check if an object has a `validate` method. The use case is for\n * safely validating an event payload that might have a `validate` method\n */\nexport function isValidatable<T>(\n value: T,\n): value is T & { validate: () => Promise<void> } {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n if (!(\"validate\" in value)) {\n return false;\n }\n return typeof value.validate === \"function\";\n}\n"],"mappings":";;;;;AAqXA,SAAgB,cACd,OACgD;AAChD,KAAI,OAAO,UAAU,YAAY,UAAU,KACzC,QAAO;AAET,KAAI,EAAE,cAAc,OAClB,QAAO;AAET,QAAO,OAAO,MAAM,aAAa"}
|
package/experimental.cjs
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
const require_als = require('./components/execution/als.cjs');
|
|
2
2
|
const require_InngestMetadata = require('./components/InngestMetadata.cjs');
|
|
3
|
+
const require_DeferredFunction = require('./components/DeferredFunction.cjs');
|
|
3
4
|
const require_processor = require('./components/execution/otel/processor.cjs');
|
|
4
5
|
const require_middleware = require('./components/execution/otel/middleware.cjs');
|
|
5
6
|
|
|
7
|
+
exports.DeferredFunction = require_DeferredFunction.DeferredFunction;
|
|
6
8
|
exports.InngestSpanProcessor = require_processor.PublicInngestSpanProcessor;
|
|
9
|
+
exports.createDefer = require_DeferredFunction.createDefer;
|
|
7
10
|
exports.extendedTracesMiddleware = require_middleware.extendedTracesMiddleware;
|
|
8
11
|
exports.getAsyncCtx = require_als.getAsyncCtx;
|
|
9
12
|
exports.metadataMiddleware = require_InngestMetadata.metadataMiddleware;
|
package/experimental.d.cts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { AsyncContext, getAsyncCtx } from "./components/execution/als.cjs";
|
|
2
2
|
import { metadataMiddleware } from "./components/InngestMetadata.cjs";
|
|
3
|
+
import { DeferredFunction, createDefer } from "./components/DeferredFunction.cjs";
|
|
3
4
|
import { PublicInngestSpanProcessor } from "./components/execution/otel/processor.cjs";
|
|
4
5
|
import { ExtendedTracesMiddlewareOptions, extendedTracesMiddleware } from "./components/execution/otel/middleware.cjs";
|
|
5
|
-
export { type AsyncContext, type ExtendedTracesMiddlewareOptions, PublicInngestSpanProcessor as InngestSpanProcessor, extendedTracesMiddleware, getAsyncCtx, metadataMiddleware };
|
|
6
|
+
export { type AsyncContext, DeferredFunction, type ExtendedTracesMiddlewareOptions, PublicInngestSpanProcessor as InngestSpanProcessor, createDefer, extendedTracesMiddleware, getAsyncCtx, metadataMiddleware };
|
package/experimental.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { AsyncContext, getAsyncCtx } from "./components/execution/als.js";
|
|
2
2
|
import { metadataMiddleware } from "./components/InngestMetadata.js";
|
|
3
|
+
import { DeferredFunction, createDefer } from "./components/DeferredFunction.js";
|
|
3
4
|
import { PublicInngestSpanProcessor } from "./components/execution/otel/processor.js";
|
|
4
5
|
import { ExtendedTracesMiddlewareOptions, extendedTracesMiddleware } from "./components/execution/otel/middleware.js";
|
|
5
|
-
export { type AsyncContext, type ExtendedTracesMiddlewareOptions, PublicInngestSpanProcessor as InngestSpanProcessor, extendedTracesMiddleware, getAsyncCtx, metadataMiddleware };
|
|
6
|
+
export { type AsyncContext, DeferredFunction, type ExtendedTracesMiddlewareOptions, PublicInngestSpanProcessor as InngestSpanProcessor, createDefer, extendedTracesMiddleware, getAsyncCtx, metadataMiddleware };
|
package/experimental.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { getAsyncCtx } from "./components/execution/als.js";
|
|
2
2
|
import { metadataMiddleware } from "./components/InngestMetadata.js";
|
|
3
|
+
import { DeferredFunction, createDefer } from "./components/DeferredFunction.js";
|
|
3
4
|
import { PublicInngestSpanProcessor } from "./components/execution/otel/processor.js";
|
|
4
5
|
import { extendedTracesMiddleware } from "./components/execution/otel/middleware.js";
|
|
5
6
|
|
|
6
|
-
export { PublicInngestSpanProcessor as InngestSpanProcessor, extendedTracesMiddleware, getAsyncCtx, metadataMiddleware };
|
|
7
|
+
export { DeferredFunction, PublicInngestSpanProcessor as InngestSpanProcessor, createDefer, extendedTracesMiddleware, getAsyncCtx, metadataMiddleware };
|
package/helpers/consts.cjs
CHANGED
|
@@ -162,6 +162,8 @@ let headerKeys = /* @__PURE__ */ function(headerKeys$1) {
|
|
|
162
162
|
headerKeys$1["Platform"] = "x-inngest-platform";
|
|
163
163
|
headerKeys$1["Framework"] = "x-inngest-framework";
|
|
164
164
|
headerKeys$1["NoRetry"] = "x-inngest-no-retry";
|
|
165
|
+
headerKeys$1["RequestId"] = "x-request-id";
|
|
166
|
+
headerKeys$1["InngestJobId"] = "x-inngest-job-id";
|
|
165
167
|
headerKeys$1["RequestVersion"] = "x-inngest-req-version";
|
|
166
168
|
headerKeys$1["RetryAfter"] = "retry-after";
|
|
167
169
|
headerKeys$1["InngestServerKind"] = "x-inngest-server-kind";
|
|
@@ -201,6 +203,10 @@ let internalEvents = /* @__PURE__ */ function(internalEvents$1) {
|
|
|
201
203
|
internalEvents$1["FunctionCancelled"] = "inngest/function.cancelled";
|
|
202
204
|
internalEvents$1["ScheduledTimer"] = "inngest/scheduled.timer";
|
|
203
205
|
internalEvents$1["HttpRequest"] = "inngest/http.request";
|
|
206
|
+
/**
|
|
207
|
+
* Triggers a deferred function. The backend emits this.
|
|
208
|
+
*/
|
|
209
|
+
internalEvents$1["DeferredSchedule"] = "inngest/deferred.schedule";
|
|
204
210
|
return internalEvents$1;
|
|
205
211
|
}({});
|
|
206
212
|
const logPrefix = "[Inngest]";
|
package/helpers/consts.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consts.cjs","names":["logPrefix: string"],"sources":["../../src/helpers/consts.ts"],"sourcesContent":["/**\n * Keys for accessing query parameters included in requests from Inngest to run\n * functions.\n *\n * Used internally to create handlers using `InngestCommHandler`, but can be\n * imported to be used if creating a custom handler outside of the package.\n *\n * @public\n */\nexport enum queryKeys {\n DeployId = \"deployId\",\n FnId = \"fnId\",\n Probe = \"probe\",\n StepId = \"stepId\",\n}\n\nexport enum probe {\n Trust = \"trust\",\n}\n\nexport enum envKeys {\n InngestSigningKey = \"INNGEST_SIGNING_KEY\",\n InngestSigningKeyFallback = \"INNGEST_SIGNING_KEY_FALLBACK\",\n InngestEventKey = \"INNGEST_EVENT_KEY\",\n\n /**\n * @deprecated Removed in v3. Use {@link InngestBaseUrl} instead.\n */\n InngestDevServerUrl = \"INNGEST_DEVSERVER_URL\",\n InngestEnvironment = \"INNGEST_ENV\",\n InngestBaseUrl = \"INNGEST_BASE_URL\",\n InngestEventApiBaseUrl = \"INNGEST_EVENT_API_BASE_URL\",\n InngestApiBaseUrl = \"INNGEST_API_BASE_URL\",\n InngestServeHost = \"INNGEST_SERVE_HOST\", // Deprecated, use INNGEST_SERVE_ORIGIN\n InngestServePath = \"INNGEST_SERVE_PATH\",\n InngestServeOrigin = \"INNGEST_SERVE_ORIGIN\",\n InngestStreaming = \"INNGEST_STREAMING\",\n InngestDevMode = \"INNGEST_DEV\",\n InngestAllowInBandSync = \"INNGEST_ALLOW_IN_BAND_SYNC\",\n InngestConnectMaxWorkerConcurrency = \"INNGEST_CONNECT_MAX_WORKER_CONCURRENCY\",\n InngestConnectIsolateExecution = \"INNGEST_CONNECT_ISOLATE_EXECUTION\",\n InngestConnectGatewayUrl = \"INNGEST_CONNECT_GATEWAY_URL\",\n\n /**\n * @deprecated It's unknown what this env var was used for, but we do not\n * provide explicit support for it. Prefer using `INNGEST_ENV` instead.\n */\n BranchName = \"BRANCH_NAME\",\n\n /**\n * The git branch of the commit the deployment was triggered by. Example:\n * `improve-about-page`.\n *\n * {@link https://vercel.com/docs/concepts/projects/environment-variables/system-environment-variables#system-environment-variables}\n */\n VercelBranch = \"VERCEL_GIT_COMMIT_REF\",\n\n /**\n * Expected to be `\"1\"` if defined.\n */\n IsVercel = \"VERCEL\",\n\n /**\n * The branch name of the current deployment. May only be accessible at build\n * time, but included here just in case.\n *\n * {@link https://developers.cloudflare.com/pages/platform/build-configuration/#environment-variables}\n */\n CloudflarePagesBranch = \"CF_PAGES_BRANCH\",\n\n /**\n * Expected to be `\"1\"` if defined.\n */\n IsCloudflarePages = \"CF_PAGES\",\n\n /**\n * The branch name of the deployment from Git to Netlify, if available.\n *\n * {@link https://docs.netlify.com/configure-builds/environment-variables/#git-metadata}\n */\n NetlifyBranch = \"BRANCH\",\n\n /**\n * Expected to be `\"true\"` if defined.\n */\n IsNetlify = \"NETLIFY\",\n\n /**\n * The Git branch for a service or deploy.\n *\n * {@link https://render.com/docs/environment-variables#all-services}\n */\n RenderBranch = \"RENDER_GIT_BRANCH\",\n\n /**\n * Expected to be `\"true\"` if defined.\n */\n IsRender = \"RENDER\",\n\n /**\n * The branch that triggered the deployment. Example: `main`\n *\n * {@link https://docs.railway.app/develop/variables#railway-provided-variables}\n */\n RailwayBranch = \"RAILWAY_GIT_BRANCH\",\n\n /**\n * The railway environment for the deployment. Example: `production`\n *\n * {@link https://docs.railway.app/develop/variables#railway-provided-variables}\n */\n RailwayEnvironment = \"RAILWAY_ENVIRONMENT\",\n\n VercelEnvKey = \"VERCEL_ENV\",\n\n /**\n * Standard Node.js environment indicator (e.g. `\"production\"`, `\"development\"`,\n * `\"test\"`). Read by some framework adapters to choose the request scheme,\n * and by prod-mode inference.\n */\n NodeEnv = \"NODE_ENV\",\n\n /**\n * Netlify's deploy context (e.g. `\"production\"`, `\"deploy-preview\"`). Used\n * for prod-mode inference.\n *\n * {@link https://docs.netlify.com/configure-builds/environment-variables/#build-metadata}\n */\n Context = \"CONTEXT\",\n\n /**\n * Generic environment name used by some platforms to indicate prod vs\n * non-prod (e.g. `\"production\"`).\n */\n Environment = \"ENVIRONMENT\",\n\n /**\n * Set by Deno Deploy. Its presence indicates a Deno Deploy environment,\n * which we treat as prod.\n *\n * {@link https://docs.deno.com/deploy/manual/environment-variables/}\n */\n DenoDeployment = \"DENO_DEPLOYMENT_ID\",\n\n OpenAiApiKey = \"OPENAI_API_KEY\",\n GeminiApiKey = \"GEMINI_API_KEY\",\n AnthropicApiKey = \"ANTHROPIC_API_KEY\",\n\n /**\n * Framework-prefixed variants of Inngest env vars. CRA's `REACT_APP_` and\n * Next's `NEXT_PUBLIC_` prefixes expose env vars to bundled client code, so\n * we accept the prefixed forms in addition to the canonical names.\n */\n ReactAppInngestBaseUrl = \"REACT_APP_INNGEST_BASE_URL\",\n ReactAppInngestDevMode = \"REACT_APP_INNGEST_DEV\",\n NextPublicInngestBaseUrl = \"NEXT_PUBLIC_INNGEST_BASE_URL\",\n NextPublicInngestDevMode = \"NEXT_PUBLIC_INNGEST_DEV\",\n}\n\n/**\n * Keys for accessing headers included in requests from Inngest to run\n * functions.\n *\n * Used internally to create handlers using `InngestCommHandler`, but can be\n * imported to be used if creating a custom handler outside of the package.\n *\n * @public\n */\nexport enum headerKeys {\n ContentType = \"content-type\",\n Host = \"host\",\n ForwardedFor = \"x-forwarded-for\",\n RealIp = \"x-real-ip\",\n Location = \"location\",\n ContentLength = \"content-length\",\n Signature = \"x-inngest-signature\",\n SdkVersion = \"x-inngest-sdk\",\n Environment = \"x-inngest-env\",\n Platform = \"x-inngest-platform\",\n Framework = \"x-inngest-framework\",\n NoRetry = \"x-inngest-no-retry\",\n RequestVersion = \"x-inngest-req-version\",\n RetryAfter = \"retry-after\",\n InngestServerKind = \"x-inngest-server-kind\",\n InngestExpectedServerKind = \"x-inngest-expected-server-kind\",\n InngestSyncKind = \"x-inngest-sync-kind\",\n EventIdSeed = \"x-inngest-event-id-seed\",\n TraceParent = \"traceparent\",\n TraceState = \"tracestate\",\n InngestRunId = \"x-run-id\",\n InngestStepId = \"x-inngest-step-id\",\n InngestForceStepPlan = \"x-inngest-force-step-plan\",\n SdkHandled = \"x-inngest-sdk-handled\",\n}\n\n/**\n * Headers that are forwarded from the original request when an Inngest function\n * is invoked.\n */\nexport const forwardedHeaders = [headerKeys.TraceParent, headerKeys.TraceState];\n\nexport const defaultInngestApiBaseUrl = \"https://api.inngest.com/\";\nexport const defaultInngestEventBaseUrl = \"https://inn.gs/\";\nexport const defaultDevServerHost = \"http://localhost:8288/\";\n\n/**\n * Events that Inngest may send internally that can be used to trigger\n * functions.\n *\n * @public\n */\nexport enum internalEvents {\n /**\n * A function has failed after exhausting all available retries. This event\n * will contain the original event and the error that caused the failure.\n */\n FunctionFailed = \"inngest/function.failed\",\n FunctionInvoked = \"inngest/function.invoked\",\n FunctionFinished = \"inngest/function.finished\",\n FunctionCancelled = \"inngest/function.cancelled\",\n ScheduledTimer = \"inngest/scheduled.timer\",\n HttpRequest = \"inngest/http.request\",\n}\n\nexport const logPrefix: string = \"[Inngest]\";\n\nexport const debugPrefix = \"inngest\";\n\nexport const dummyEventKey = \"NO_EVENT_KEY_SET\";\n\nexport enum serverKind {\n Dev = \"dev\",\n Cloud = \"cloud\",\n}\n\nexport enum syncKind {\n InBand = \"in_band\",\n OutOfBand = \"out_of_band\",\n}\n\n/**\n * The execution models the SDK is aware of.\n *\n * This is used in a number of places to ensure all execution versions are\n * accounted for for a given operation.\n */\nexport enum ExecutionVersion {\n /**\n * Uses a more flexible approach to execution and is more lenient about\n * determinism, allowing non-step async actions and non-determinism.\n *\n * Nowhere near as stubborn about determinism and so can silently migrate\n * between versions after bug fixes.\n */\n V1 = 1,\n\n /**\n * Identical to V1, but allows the Executor to optimize parallel calls, hugely\n * reducing traffic going to/from the SDK.\n */\n V2 = 2,\n}\n\n/**\n * Default maximum number of retries for function/step executions.\n */\nexport const defaultMaxRetries = 3;\n"],"mappings":";;;;;;;;;;;AASA,IAAY,kDAAL;AACL;AACA;AACA;AACA;;;AAGF,IAAY,0CAAL;AACL;;;AAGF,IAAY,8CAAL;AACL;AACA;AACA;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AAMA;;;;;;;AAQA;;;;AAKA;;;;;;;AAQA;;;;AAKA;;;;;;AAOA;;;;AAKA;;;;;;AAOA;;;;AAKA;;;;;;AAOA;;;;;;AAOA;AAEA;;;;;;AAOA;;;;;;;AAQA;;;;;AAMA;;;;;;;AAQA;AAEA;AACA;AACA;;;;;;AAOA;AACA;AACA;AACA;;;;;;;;;;;;AAYF,IAAY,oDAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AAOF,MAAa,mBAAmB,CAAC,WAAW,aAAa,WAAW,WAAW;AAE/E,MAAa,2BAA2B;AACxC,MAAa,6BAA6B;AAC1C,MAAa,uBAAuB;;;;;;;AAQpC,IAAY,4DAAL;;;;;AAKL;AACA;AACA;AACA;AACA;AACA;;;AAGF,MAAaA,YAAoB;AAEjC,MAAa,cAAc;AAE3B,MAAa,gBAAgB;AAO7B,IAAY,gDAAL;AACL;AACA;;;;;;;;;AASF,IAAY,gEAAL;;;;;;;;AAQL;;;;;AAMA;;;;;;AAMF,MAAa,oBAAoB"}
|
|
1
|
+
{"version":3,"file":"consts.cjs","names":["logPrefix: string"],"sources":["../../src/helpers/consts.ts"],"sourcesContent":["/**\n * Keys for accessing query parameters included in requests from Inngest to run\n * functions.\n *\n * Used internally to create handlers using `InngestCommHandler`, but can be\n * imported to be used if creating a custom handler outside of the package.\n *\n * @public\n */\nexport enum queryKeys {\n DeployId = \"deployId\",\n FnId = \"fnId\",\n Probe = \"probe\",\n StepId = \"stepId\",\n}\n\nexport enum probe {\n Trust = \"trust\",\n}\n\nexport enum envKeys {\n InngestSigningKey = \"INNGEST_SIGNING_KEY\",\n InngestSigningKeyFallback = \"INNGEST_SIGNING_KEY_FALLBACK\",\n InngestEventKey = \"INNGEST_EVENT_KEY\",\n\n /**\n * @deprecated Removed in v3. Use {@link InngestBaseUrl} instead.\n */\n InngestDevServerUrl = \"INNGEST_DEVSERVER_URL\",\n InngestEnvironment = \"INNGEST_ENV\",\n InngestBaseUrl = \"INNGEST_BASE_URL\",\n InngestEventApiBaseUrl = \"INNGEST_EVENT_API_BASE_URL\",\n InngestApiBaseUrl = \"INNGEST_API_BASE_URL\",\n InngestServeHost = \"INNGEST_SERVE_HOST\", // Deprecated, use INNGEST_SERVE_ORIGIN\n InngestServePath = \"INNGEST_SERVE_PATH\",\n InngestServeOrigin = \"INNGEST_SERVE_ORIGIN\",\n InngestStreaming = \"INNGEST_STREAMING\",\n InngestDevMode = \"INNGEST_DEV\",\n InngestAllowInBandSync = \"INNGEST_ALLOW_IN_BAND_SYNC\",\n InngestConnectMaxWorkerConcurrency = \"INNGEST_CONNECT_MAX_WORKER_CONCURRENCY\",\n InngestConnectIsolateExecution = \"INNGEST_CONNECT_ISOLATE_EXECUTION\",\n InngestConnectGatewayUrl = \"INNGEST_CONNECT_GATEWAY_URL\",\n\n /**\n * @deprecated It's unknown what this env var was used for, but we do not\n * provide explicit support for it. Prefer using `INNGEST_ENV` instead.\n */\n BranchName = \"BRANCH_NAME\",\n\n /**\n * The git branch of the commit the deployment was triggered by. Example:\n * `improve-about-page`.\n *\n * {@link https://vercel.com/docs/concepts/projects/environment-variables/system-environment-variables#system-environment-variables}\n */\n VercelBranch = \"VERCEL_GIT_COMMIT_REF\",\n\n /**\n * Expected to be `\"1\"` if defined.\n */\n IsVercel = \"VERCEL\",\n\n /**\n * The branch name of the current deployment. May only be accessible at build\n * time, but included here just in case.\n *\n * {@link https://developers.cloudflare.com/pages/platform/build-configuration/#environment-variables}\n */\n CloudflarePagesBranch = \"CF_PAGES_BRANCH\",\n\n /**\n * Expected to be `\"1\"` if defined.\n */\n IsCloudflarePages = \"CF_PAGES\",\n\n /**\n * The branch name of the deployment from Git to Netlify, if available.\n *\n * {@link https://docs.netlify.com/configure-builds/environment-variables/#git-metadata}\n */\n NetlifyBranch = \"BRANCH\",\n\n /**\n * Expected to be `\"true\"` if defined.\n */\n IsNetlify = \"NETLIFY\",\n\n /**\n * The Git branch for a service or deploy.\n *\n * {@link https://render.com/docs/environment-variables#all-services}\n */\n RenderBranch = \"RENDER_GIT_BRANCH\",\n\n /**\n * Expected to be `\"true\"` if defined.\n */\n IsRender = \"RENDER\",\n\n /**\n * The branch that triggered the deployment. Example: `main`\n *\n * {@link https://docs.railway.app/develop/variables#railway-provided-variables}\n */\n RailwayBranch = \"RAILWAY_GIT_BRANCH\",\n\n /**\n * The railway environment for the deployment. Example: `production`\n *\n * {@link https://docs.railway.app/develop/variables#railway-provided-variables}\n */\n RailwayEnvironment = \"RAILWAY_ENVIRONMENT\",\n\n VercelEnvKey = \"VERCEL_ENV\",\n\n /**\n * Standard Node.js environment indicator (e.g. `\"production\"`, `\"development\"`,\n * `\"test\"`). Read by some framework adapters to choose the request scheme,\n * and by prod-mode inference.\n */\n NodeEnv = \"NODE_ENV\",\n\n /**\n * Netlify's deploy context (e.g. `\"production\"`, `\"deploy-preview\"`). Used\n * for prod-mode inference.\n *\n * {@link https://docs.netlify.com/configure-builds/environment-variables/#build-metadata}\n */\n Context = \"CONTEXT\",\n\n /**\n * Generic environment name used by some platforms to indicate prod vs\n * non-prod (e.g. `\"production\"`).\n */\n Environment = \"ENVIRONMENT\",\n\n /**\n * Set by Deno Deploy. Its presence indicates a Deno Deploy environment,\n * which we treat as prod.\n *\n * {@link https://docs.deno.com/deploy/manual/environment-variables/}\n */\n DenoDeployment = \"DENO_DEPLOYMENT_ID\",\n\n OpenAiApiKey = \"OPENAI_API_KEY\",\n GeminiApiKey = \"GEMINI_API_KEY\",\n AnthropicApiKey = \"ANTHROPIC_API_KEY\",\n\n /**\n * Framework-prefixed variants of Inngest env vars. CRA's `REACT_APP_` and\n * Next's `NEXT_PUBLIC_` prefixes expose env vars to bundled client code, so\n * we accept the prefixed forms in addition to the canonical names.\n */\n ReactAppInngestBaseUrl = \"REACT_APP_INNGEST_BASE_URL\",\n ReactAppInngestDevMode = \"REACT_APP_INNGEST_DEV\",\n NextPublicInngestBaseUrl = \"NEXT_PUBLIC_INNGEST_BASE_URL\",\n NextPublicInngestDevMode = \"NEXT_PUBLIC_INNGEST_DEV\",\n}\n\n/**\n * Keys for accessing headers included in requests from Inngest to run\n * functions.\n *\n * Used internally to create handlers using `InngestCommHandler`, but can be\n * imported to be used if creating a custom handler outside of the package.\n *\n * @public\n */\nexport enum headerKeys {\n ContentType = \"content-type\",\n Host = \"host\",\n ForwardedFor = \"x-forwarded-for\",\n RealIp = \"x-real-ip\",\n Location = \"location\",\n ContentLength = \"content-length\",\n Signature = \"x-inngest-signature\",\n SdkVersion = \"x-inngest-sdk\",\n Environment = \"x-inngest-env\",\n Platform = \"x-inngest-platform\",\n Framework = \"x-inngest-framework\",\n NoRetry = \"x-inngest-no-retry\",\n RequestId = \"x-request-id\",\n InngestJobId = \"x-inngest-job-id\",\n RequestVersion = \"x-inngest-req-version\",\n RetryAfter = \"retry-after\",\n InngestServerKind = \"x-inngest-server-kind\",\n InngestExpectedServerKind = \"x-inngest-expected-server-kind\",\n InngestSyncKind = \"x-inngest-sync-kind\",\n EventIdSeed = \"x-inngest-event-id-seed\",\n TraceParent = \"traceparent\",\n TraceState = \"tracestate\",\n InngestRunId = \"x-run-id\",\n InngestStepId = \"x-inngest-step-id\",\n InngestForceStepPlan = \"x-inngest-force-step-plan\",\n SdkHandled = \"x-inngest-sdk-handled\",\n}\n\n/**\n * Headers that are forwarded from the original request when an Inngest function\n * is invoked.\n */\nexport const forwardedHeaders = [headerKeys.TraceParent, headerKeys.TraceState];\n\nexport const defaultInngestApiBaseUrl = \"https://api.inngest.com/\";\nexport const defaultInngestEventBaseUrl = \"https://inn.gs/\";\nexport const defaultDevServerHost = \"http://localhost:8288/\";\n\n/**\n * Events that Inngest may send internally that can be used to trigger\n * functions.\n *\n * @public\n */\nexport enum internalEvents {\n /**\n * A function has failed after exhausting all available retries. This event\n * will contain the original event and the error that caused the failure.\n */\n FunctionFailed = \"inngest/function.failed\",\n FunctionInvoked = \"inngest/function.invoked\",\n FunctionFinished = \"inngest/function.finished\",\n FunctionCancelled = \"inngest/function.cancelled\",\n ScheduledTimer = \"inngest/scheduled.timer\",\n HttpRequest = \"inngest/http.request\",\n\n /**\n * Triggers a deferred function. The backend emits this.\n */\n DeferredSchedule = \"inngest/deferred.schedule\",\n}\n\nexport const logPrefix: string = \"[Inngest]\";\n\nexport const debugPrefix = \"inngest\";\n\nexport const dummyEventKey = \"NO_EVENT_KEY_SET\";\n\nexport enum serverKind {\n Dev = \"dev\",\n Cloud = \"cloud\",\n}\n\nexport enum syncKind {\n InBand = \"in_band\",\n OutOfBand = \"out_of_band\",\n}\n\n/**\n * The execution models the SDK is aware of.\n *\n * This is used in a number of places to ensure all execution versions are\n * accounted for for a given operation.\n */\nexport enum ExecutionVersion {\n /**\n * Uses a more flexible approach to execution and is more lenient about\n * determinism, allowing non-step async actions and non-determinism.\n *\n * Nowhere near as stubborn about determinism and so can silently migrate\n * between versions after bug fixes.\n */\n V1 = 1,\n\n /**\n * Identical to V1, but allows the Executor to optimize parallel calls, hugely\n * reducing traffic going to/from the SDK.\n */\n V2 = 2,\n}\n\n/**\n * Default maximum number of retries for function/step executions.\n */\nexport const defaultMaxRetries = 3;\n"],"mappings":";;;;;;;;;;;AASA,IAAY,kDAAL;AACL;AACA;AACA;AACA;;;AAGF,IAAY,0CAAL;AACL;;;AAGF,IAAY,8CAAL;AACL;AACA;AACA;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AAMA;;;;;;;AAQA;;;;AAKA;;;;;;;AAQA;;;;AAKA;;;;;;AAOA;;;;AAKA;;;;;;AAOA;;;;AAKA;;;;;;AAOA;;;;;;AAOA;AAEA;;;;;;AAOA;;;;;;;AAQA;;;;;AAMA;;;;;;;AAQA;AAEA;AACA;AACA;;;;;;AAOA;AACA;AACA;AACA;;;;;;;;;;;;AAYF,IAAY,oDAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AAOF,MAAa,mBAAmB,CAAC,WAAW,aAAa,WAAW,WAAW;AAE/E,MAAa,2BAA2B;AACxC,MAAa,6BAA6B;AAC1C,MAAa,uBAAuB;;;;;;;AAQpC,IAAY,4DAAL;;;;;AAKL;AACA;AACA;AACA;AACA;AACA;;;;AAKA;;;AAGF,MAAaA,YAAoB;AAEjC,MAAa,cAAc;AAE3B,MAAa,gBAAgB;AAO7B,IAAY,gDAAL;AACL;AACA;;;;;;;;;AASF,IAAY,gEAAL;;;;;;;;AAQL;;;;;AAMA;;;;;;AAMF,MAAa,oBAAoB"}
|
package/helpers/consts.d.cts
CHANGED
|
@@ -36,6 +36,8 @@ declare enum headerKeys {
|
|
|
36
36
|
Platform = "x-inngest-platform",
|
|
37
37
|
Framework = "x-inngest-framework",
|
|
38
38
|
NoRetry = "x-inngest-no-retry",
|
|
39
|
+
RequestId = "x-request-id",
|
|
40
|
+
InngestJobId = "x-inngest-job-id",
|
|
39
41
|
RequestVersion = "x-inngest-req-version",
|
|
40
42
|
RetryAfter = "retry-after",
|
|
41
43
|
InngestServerKind = "x-inngest-server-kind",
|
|
@@ -66,6 +68,10 @@ declare enum internalEvents {
|
|
|
66
68
|
FunctionCancelled = "inngest/function.cancelled",
|
|
67
69
|
ScheduledTimer = "inngest/scheduled.timer",
|
|
68
70
|
HttpRequest = "inngest/http.request",
|
|
71
|
+
/**
|
|
72
|
+
* Triggers a deferred function. The backend emits this.
|
|
73
|
+
*/
|
|
74
|
+
DeferredSchedule = "inngest/deferred.schedule",
|
|
69
75
|
}
|
|
70
76
|
/**
|
|
71
77
|
* The execution models the SDK is aware of.
|
package/helpers/consts.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consts.d.cts","names":[],"sources":["../../src/helpers/consts.ts"],"sourcesContent":[],"mappings":";;AASA;AA+JA;
|
|
1
|
+
{"version":3,"file":"consts.d.cts","names":[],"sources":["../../src/helpers/consts.ts"],"sourcesContent":[],"mappings":";;AASA;AA+JA;AA6CA;AAwCA;;;;;aApPY,SAAA;;;;;;;;;;;;;;;aA+JA,UAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA6CA,cAAA;;;;;;;;;;;;;;;;;;;;;;aAwCA,gBAAA"}
|
package/helpers/consts.d.ts
CHANGED
|
@@ -36,6 +36,8 @@ declare enum headerKeys {
|
|
|
36
36
|
Platform = "x-inngest-platform",
|
|
37
37
|
Framework = "x-inngest-framework",
|
|
38
38
|
NoRetry = "x-inngest-no-retry",
|
|
39
|
+
RequestId = "x-request-id",
|
|
40
|
+
InngestJobId = "x-inngest-job-id",
|
|
39
41
|
RequestVersion = "x-inngest-req-version",
|
|
40
42
|
RetryAfter = "retry-after",
|
|
41
43
|
InngestServerKind = "x-inngest-server-kind",
|
|
@@ -66,6 +68,10 @@ declare enum internalEvents {
|
|
|
66
68
|
FunctionCancelled = "inngest/function.cancelled",
|
|
67
69
|
ScheduledTimer = "inngest/scheduled.timer",
|
|
68
70
|
HttpRequest = "inngest/http.request",
|
|
71
|
+
/**
|
|
72
|
+
* Triggers a deferred function. The backend emits this.
|
|
73
|
+
*/
|
|
74
|
+
DeferredSchedule = "inngest/deferred.schedule",
|
|
69
75
|
}
|
|
70
76
|
/**
|
|
71
77
|
* The execution models the SDK is aware of.
|
package/helpers/consts.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consts.d.ts","names":[],"sources":["../../src/helpers/consts.ts"],"sourcesContent":[],"mappings":";;AASA;AA+JA;
|
|
1
|
+
{"version":3,"file":"consts.d.ts","names":[],"sources":["../../src/helpers/consts.ts"],"sourcesContent":[],"mappings":";;AASA;AA+JA;AA6CA;AAwCA;;;;;aApPY,SAAA;;;;;;;;;;;;;;;aA+JA,UAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA6CA,cAAA;;;;;;;;;;;;;;;;;;;;;;aAwCA,gBAAA"}
|
package/helpers/consts.js
CHANGED
|
@@ -161,6 +161,8 @@ let headerKeys = /* @__PURE__ */ function(headerKeys$1) {
|
|
|
161
161
|
headerKeys$1["Platform"] = "x-inngest-platform";
|
|
162
162
|
headerKeys$1["Framework"] = "x-inngest-framework";
|
|
163
163
|
headerKeys$1["NoRetry"] = "x-inngest-no-retry";
|
|
164
|
+
headerKeys$1["RequestId"] = "x-request-id";
|
|
165
|
+
headerKeys$1["InngestJobId"] = "x-inngest-job-id";
|
|
164
166
|
headerKeys$1["RequestVersion"] = "x-inngest-req-version";
|
|
165
167
|
headerKeys$1["RetryAfter"] = "retry-after";
|
|
166
168
|
headerKeys$1["InngestServerKind"] = "x-inngest-server-kind";
|
|
@@ -200,6 +202,10 @@ let internalEvents = /* @__PURE__ */ function(internalEvents$1) {
|
|
|
200
202
|
internalEvents$1["FunctionCancelled"] = "inngest/function.cancelled";
|
|
201
203
|
internalEvents$1["ScheduledTimer"] = "inngest/scheduled.timer";
|
|
202
204
|
internalEvents$1["HttpRequest"] = "inngest/http.request";
|
|
205
|
+
/**
|
|
206
|
+
* Triggers a deferred function. The backend emits this.
|
|
207
|
+
*/
|
|
208
|
+
internalEvents$1["DeferredSchedule"] = "inngest/deferred.schedule";
|
|
203
209
|
return internalEvents$1;
|
|
204
210
|
}({});
|
|
205
211
|
const logPrefix = "[Inngest]";
|
package/helpers/consts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consts.js","names":["logPrefix: string"],"sources":["../../src/helpers/consts.ts"],"sourcesContent":["/**\n * Keys for accessing query parameters included in requests from Inngest to run\n * functions.\n *\n * Used internally to create handlers using `InngestCommHandler`, but can be\n * imported to be used if creating a custom handler outside of the package.\n *\n * @public\n */\nexport enum queryKeys {\n DeployId = \"deployId\",\n FnId = \"fnId\",\n Probe = \"probe\",\n StepId = \"stepId\",\n}\n\nexport enum probe {\n Trust = \"trust\",\n}\n\nexport enum envKeys {\n InngestSigningKey = \"INNGEST_SIGNING_KEY\",\n InngestSigningKeyFallback = \"INNGEST_SIGNING_KEY_FALLBACK\",\n InngestEventKey = \"INNGEST_EVENT_KEY\",\n\n /**\n * @deprecated Removed in v3. Use {@link InngestBaseUrl} instead.\n */\n InngestDevServerUrl = \"INNGEST_DEVSERVER_URL\",\n InngestEnvironment = \"INNGEST_ENV\",\n InngestBaseUrl = \"INNGEST_BASE_URL\",\n InngestEventApiBaseUrl = \"INNGEST_EVENT_API_BASE_URL\",\n InngestApiBaseUrl = \"INNGEST_API_BASE_URL\",\n InngestServeHost = \"INNGEST_SERVE_HOST\", // Deprecated, use INNGEST_SERVE_ORIGIN\n InngestServePath = \"INNGEST_SERVE_PATH\",\n InngestServeOrigin = \"INNGEST_SERVE_ORIGIN\",\n InngestStreaming = \"INNGEST_STREAMING\",\n InngestDevMode = \"INNGEST_DEV\",\n InngestAllowInBandSync = \"INNGEST_ALLOW_IN_BAND_SYNC\",\n InngestConnectMaxWorkerConcurrency = \"INNGEST_CONNECT_MAX_WORKER_CONCURRENCY\",\n InngestConnectIsolateExecution = \"INNGEST_CONNECT_ISOLATE_EXECUTION\",\n InngestConnectGatewayUrl = \"INNGEST_CONNECT_GATEWAY_URL\",\n\n /**\n * @deprecated It's unknown what this env var was used for, but we do not\n * provide explicit support for it. Prefer using `INNGEST_ENV` instead.\n */\n BranchName = \"BRANCH_NAME\",\n\n /**\n * The git branch of the commit the deployment was triggered by. Example:\n * `improve-about-page`.\n *\n * {@link https://vercel.com/docs/concepts/projects/environment-variables/system-environment-variables#system-environment-variables}\n */\n VercelBranch = \"VERCEL_GIT_COMMIT_REF\",\n\n /**\n * Expected to be `\"1\"` if defined.\n */\n IsVercel = \"VERCEL\",\n\n /**\n * The branch name of the current deployment. May only be accessible at build\n * time, but included here just in case.\n *\n * {@link https://developers.cloudflare.com/pages/platform/build-configuration/#environment-variables}\n */\n CloudflarePagesBranch = \"CF_PAGES_BRANCH\",\n\n /**\n * Expected to be `\"1\"` if defined.\n */\n IsCloudflarePages = \"CF_PAGES\",\n\n /**\n * The branch name of the deployment from Git to Netlify, if available.\n *\n * {@link https://docs.netlify.com/configure-builds/environment-variables/#git-metadata}\n */\n NetlifyBranch = \"BRANCH\",\n\n /**\n * Expected to be `\"true\"` if defined.\n */\n IsNetlify = \"NETLIFY\",\n\n /**\n * The Git branch for a service or deploy.\n *\n * {@link https://render.com/docs/environment-variables#all-services}\n */\n RenderBranch = \"RENDER_GIT_BRANCH\",\n\n /**\n * Expected to be `\"true\"` if defined.\n */\n IsRender = \"RENDER\",\n\n /**\n * The branch that triggered the deployment. Example: `main`\n *\n * {@link https://docs.railway.app/develop/variables#railway-provided-variables}\n */\n RailwayBranch = \"RAILWAY_GIT_BRANCH\",\n\n /**\n * The railway environment for the deployment. Example: `production`\n *\n * {@link https://docs.railway.app/develop/variables#railway-provided-variables}\n */\n RailwayEnvironment = \"RAILWAY_ENVIRONMENT\",\n\n VercelEnvKey = \"VERCEL_ENV\",\n\n /**\n * Standard Node.js environment indicator (e.g. `\"production\"`, `\"development\"`,\n * `\"test\"`). Read by some framework adapters to choose the request scheme,\n * and by prod-mode inference.\n */\n NodeEnv = \"NODE_ENV\",\n\n /**\n * Netlify's deploy context (e.g. `\"production\"`, `\"deploy-preview\"`). Used\n * for prod-mode inference.\n *\n * {@link https://docs.netlify.com/configure-builds/environment-variables/#build-metadata}\n */\n Context = \"CONTEXT\",\n\n /**\n * Generic environment name used by some platforms to indicate prod vs\n * non-prod (e.g. `\"production\"`).\n */\n Environment = \"ENVIRONMENT\",\n\n /**\n * Set by Deno Deploy. Its presence indicates a Deno Deploy environment,\n * which we treat as prod.\n *\n * {@link https://docs.deno.com/deploy/manual/environment-variables/}\n */\n DenoDeployment = \"DENO_DEPLOYMENT_ID\",\n\n OpenAiApiKey = \"OPENAI_API_KEY\",\n GeminiApiKey = \"GEMINI_API_KEY\",\n AnthropicApiKey = \"ANTHROPIC_API_KEY\",\n\n /**\n * Framework-prefixed variants of Inngest env vars. CRA's `REACT_APP_` and\n * Next's `NEXT_PUBLIC_` prefixes expose env vars to bundled client code, so\n * we accept the prefixed forms in addition to the canonical names.\n */\n ReactAppInngestBaseUrl = \"REACT_APP_INNGEST_BASE_URL\",\n ReactAppInngestDevMode = \"REACT_APP_INNGEST_DEV\",\n NextPublicInngestBaseUrl = \"NEXT_PUBLIC_INNGEST_BASE_URL\",\n NextPublicInngestDevMode = \"NEXT_PUBLIC_INNGEST_DEV\",\n}\n\n/**\n * Keys for accessing headers included in requests from Inngest to run\n * functions.\n *\n * Used internally to create handlers using `InngestCommHandler`, but can be\n * imported to be used if creating a custom handler outside of the package.\n *\n * @public\n */\nexport enum headerKeys {\n ContentType = \"content-type\",\n Host = \"host\",\n ForwardedFor = \"x-forwarded-for\",\n RealIp = \"x-real-ip\",\n Location = \"location\",\n ContentLength = \"content-length\",\n Signature = \"x-inngest-signature\",\n SdkVersion = \"x-inngest-sdk\",\n Environment = \"x-inngest-env\",\n Platform = \"x-inngest-platform\",\n Framework = \"x-inngest-framework\",\n NoRetry = \"x-inngest-no-retry\",\n RequestVersion = \"x-inngest-req-version\",\n RetryAfter = \"retry-after\",\n InngestServerKind = \"x-inngest-server-kind\",\n InngestExpectedServerKind = \"x-inngest-expected-server-kind\",\n InngestSyncKind = \"x-inngest-sync-kind\",\n EventIdSeed = \"x-inngest-event-id-seed\",\n TraceParent = \"traceparent\",\n TraceState = \"tracestate\",\n InngestRunId = \"x-run-id\",\n InngestStepId = \"x-inngest-step-id\",\n InngestForceStepPlan = \"x-inngest-force-step-plan\",\n SdkHandled = \"x-inngest-sdk-handled\",\n}\n\n/**\n * Headers that are forwarded from the original request when an Inngest function\n * is invoked.\n */\nexport const forwardedHeaders = [headerKeys.TraceParent, headerKeys.TraceState];\n\nexport const defaultInngestApiBaseUrl = \"https://api.inngest.com/\";\nexport const defaultInngestEventBaseUrl = \"https://inn.gs/\";\nexport const defaultDevServerHost = \"http://localhost:8288/\";\n\n/**\n * Events that Inngest may send internally that can be used to trigger\n * functions.\n *\n * @public\n */\nexport enum internalEvents {\n /**\n * A function has failed after exhausting all available retries. This event\n * will contain the original event and the error that caused the failure.\n */\n FunctionFailed = \"inngest/function.failed\",\n FunctionInvoked = \"inngest/function.invoked\",\n FunctionFinished = \"inngest/function.finished\",\n FunctionCancelled = \"inngest/function.cancelled\",\n ScheduledTimer = \"inngest/scheduled.timer\",\n HttpRequest = \"inngest/http.request\",\n}\n\nexport const logPrefix: string = \"[Inngest]\";\n\nexport const debugPrefix = \"inngest\";\n\nexport const dummyEventKey = \"NO_EVENT_KEY_SET\";\n\nexport enum serverKind {\n Dev = \"dev\",\n Cloud = \"cloud\",\n}\n\nexport enum syncKind {\n InBand = \"in_band\",\n OutOfBand = \"out_of_band\",\n}\n\n/**\n * The execution models the SDK is aware of.\n *\n * This is used in a number of places to ensure all execution versions are\n * accounted for for a given operation.\n */\nexport enum ExecutionVersion {\n /**\n * Uses a more flexible approach to execution and is more lenient about\n * determinism, allowing non-step async actions and non-determinism.\n *\n * Nowhere near as stubborn about determinism and so can silently migrate\n * between versions after bug fixes.\n */\n V1 = 1,\n\n /**\n * Identical to V1, but allows the Executor to optimize parallel calls, hugely\n * reducing traffic going to/from the SDK.\n */\n V2 = 2,\n}\n\n/**\n * Default maximum number of retries for function/step executions.\n */\nexport const defaultMaxRetries = 3;\n"],"mappings":";;;;;;;;;;AASA,IAAY,kDAAL;AACL;AACA;AACA;AACA;;;AAGF,IAAY,0CAAL;AACL;;;AAGF,IAAY,8CAAL;AACL;AACA;AACA;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AAMA;;;;;;;AAQA;;;;AAKA;;;;;;;AAQA;;;;AAKA;;;;;;AAOA;;;;AAKA;;;;;;AAOA;;;;AAKA;;;;;;AAOA;;;;;;AAOA;AAEA;;;;;;AAOA;;;;;;;AAQA;;;;;AAMA;;;;;;;AAQA;AAEA;AACA;AACA;;;;;;AAOA;AACA;AACA;AACA;;;;;;;;;;;;AAYF,IAAY,oDAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AAOF,MAAa,mBAAmB,CAAC,WAAW,aAAa,WAAW,WAAW;AAE/E,MAAa,2BAA2B;AACxC,MAAa,6BAA6B;AAC1C,MAAa,uBAAuB;;;;;;;AAQpC,IAAY,4DAAL;;;;;AAKL;AACA;AACA;AACA;AACA;AACA;;;AAGF,MAAaA,YAAoB;AAEjC,MAAa,cAAc;AAE3B,MAAa,gBAAgB;AAO7B,IAAY,gDAAL;AACL;AACA;;;;;;;;;AASF,IAAY,gEAAL;;;;;;;;AAQL;;;;;AAMA;;;;;;AAMF,MAAa,oBAAoB"}
|
|
1
|
+
{"version":3,"file":"consts.js","names":["logPrefix: string"],"sources":["../../src/helpers/consts.ts"],"sourcesContent":["/**\n * Keys for accessing query parameters included in requests from Inngest to run\n * functions.\n *\n * Used internally to create handlers using `InngestCommHandler`, but can be\n * imported to be used if creating a custom handler outside of the package.\n *\n * @public\n */\nexport enum queryKeys {\n DeployId = \"deployId\",\n FnId = \"fnId\",\n Probe = \"probe\",\n StepId = \"stepId\",\n}\n\nexport enum probe {\n Trust = \"trust\",\n}\n\nexport enum envKeys {\n InngestSigningKey = \"INNGEST_SIGNING_KEY\",\n InngestSigningKeyFallback = \"INNGEST_SIGNING_KEY_FALLBACK\",\n InngestEventKey = \"INNGEST_EVENT_KEY\",\n\n /**\n * @deprecated Removed in v3. Use {@link InngestBaseUrl} instead.\n */\n InngestDevServerUrl = \"INNGEST_DEVSERVER_URL\",\n InngestEnvironment = \"INNGEST_ENV\",\n InngestBaseUrl = \"INNGEST_BASE_URL\",\n InngestEventApiBaseUrl = \"INNGEST_EVENT_API_BASE_URL\",\n InngestApiBaseUrl = \"INNGEST_API_BASE_URL\",\n InngestServeHost = \"INNGEST_SERVE_HOST\", // Deprecated, use INNGEST_SERVE_ORIGIN\n InngestServePath = \"INNGEST_SERVE_PATH\",\n InngestServeOrigin = \"INNGEST_SERVE_ORIGIN\",\n InngestStreaming = \"INNGEST_STREAMING\",\n InngestDevMode = \"INNGEST_DEV\",\n InngestAllowInBandSync = \"INNGEST_ALLOW_IN_BAND_SYNC\",\n InngestConnectMaxWorkerConcurrency = \"INNGEST_CONNECT_MAX_WORKER_CONCURRENCY\",\n InngestConnectIsolateExecution = \"INNGEST_CONNECT_ISOLATE_EXECUTION\",\n InngestConnectGatewayUrl = \"INNGEST_CONNECT_GATEWAY_URL\",\n\n /**\n * @deprecated It's unknown what this env var was used for, but we do not\n * provide explicit support for it. Prefer using `INNGEST_ENV` instead.\n */\n BranchName = \"BRANCH_NAME\",\n\n /**\n * The git branch of the commit the deployment was triggered by. Example:\n * `improve-about-page`.\n *\n * {@link https://vercel.com/docs/concepts/projects/environment-variables/system-environment-variables#system-environment-variables}\n */\n VercelBranch = \"VERCEL_GIT_COMMIT_REF\",\n\n /**\n * Expected to be `\"1\"` if defined.\n */\n IsVercel = \"VERCEL\",\n\n /**\n * The branch name of the current deployment. May only be accessible at build\n * time, but included here just in case.\n *\n * {@link https://developers.cloudflare.com/pages/platform/build-configuration/#environment-variables}\n */\n CloudflarePagesBranch = \"CF_PAGES_BRANCH\",\n\n /**\n * Expected to be `\"1\"` if defined.\n */\n IsCloudflarePages = \"CF_PAGES\",\n\n /**\n * The branch name of the deployment from Git to Netlify, if available.\n *\n * {@link https://docs.netlify.com/configure-builds/environment-variables/#git-metadata}\n */\n NetlifyBranch = \"BRANCH\",\n\n /**\n * Expected to be `\"true\"` if defined.\n */\n IsNetlify = \"NETLIFY\",\n\n /**\n * The Git branch for a service or deploy.\n *\n * {@link https://render.com/docs/environment-variables#all-services}\n */\n RenderBranch = \"RENDER_GIT_BRANCH\",\n\n /**\n * Expected to be `\"true\"` if defined.\n */\n IsRender = \"RENDER\",\n\n /**\n * The branch that triggered the deployment. Example: `main`\n *\n * {@link https://docs.railway.app/develop/variables#railway-provided-variables}\n */\n RailwayBranch = \"RAILWAY_GIT_BRANCH\",\n\n /**\n * The railway environment for the deployment. Example: `production`\n *\n * {@link https://docs.railway.app/develop/variables#railway-provided-variables}\n */\n RailwayEnvironment = \"RAILWAY_ENVIRONMENT\",\n\n VercelEnvKey = \"VERCEL_ENV\",\n\n /**\n * Standard Node.js environment indicator (e.g. `\"production\"`, `\"development\"`,\n * `\"test\"`). Read by some framework adapters to choose the request scheme,\n * and by prod-mode inference.\n */\n NodeEnv = \"NODE_ENV\",\n\n /**\n * Netlify's deploy context (e.g. `\"production\"`, `\"deploy-preview\"`). Used\n * for prod-mode inference.\n *\n * {@link https://docs.netlify.com/configure-builds/environment-variables/#build-metadata}\n */\n Context = \"CONTEXT\",\n\n /**\n * Generic environment name used by some platforms to indicate prod vs\n * non-prod (e.g. `\"production\"`).\n */\n Environment = \"ENVIRONMENT\",\n\n /**\n * Set by Deno Deploy. Its presence indicates a Deno Deploy environment,\n * which we treat as prod.\n *\n * {@link https://docs.deno.com/deploy/manual/environment-variables/}\n */\n DenoDeployment = \"DENO_DEPLOYMENT_ID\",\n\n OpenAiApiKey = \"OPENAI_API_KEY\",\n GeminiApiKey = \"GEMINI_API_KEY\",\n AnthropicApiKey = \"ANTHROPIC_API_KEY\",\n\n /**\n * Framework-prefixed variants of Inngest env vars. CRA's `REACT_APP_` and\n * Next's `NEXT_PUBLIC_` prefixes expose env vars to bundled client code, so\n * we accept the prefixed forms in addition to the canonical names.\n */\n ReactAppInngestBaseUrl = \"REACT_APP_INNGEST_BASE_URL\",\n ReactAppInngestDevMode = \"REACT_APP_INNGEST_DEV\",\n NextPublicInngestBaseUrl = \"NEXT_PUBLIC_INNGEST_BASE_URL\",\n NextPublicInngestDevMode = \"NEXT_PUBLIC_INNGEST_DEV\",\n}\n\n/**\n * Keys for accessing headers included in requests from Inngest to run\n * functions.\n *\n * Used internally to create handlers using `InngestCommHandler`, but can be\n * imported to be used if creating a custom handler outside of the package.\n *\n * @public\n */\nexport enum headerKeys {\n ContentType = \"content-type\",\n Host = \"host\",\n ForwardedFor = \"x-forwarded-for\",\n RealIp = \"x-real-ip\",\n Location = \"location\",\n ContentLength = \"content-length\",\n Signature = \"x-inngest-signature\",\n SdkVersion = \"x-inngest-sdk\",\n Environment = \"x-inngest-env\",\n Platform = \"x-inngest-platform\",\n Framework = \"x-inngest-framework\",\n NoRetry = \"x-inngest-no-retry\",\n RequestId = \"x-request-id\",\n InngestJobId = \"x-inngest-job-id\",\n RequestVersion = \"x-inngest-req-version\",\n RetryAfter = \"retry-after\",\n InngestServerKind = \"x-inngest-server-kind\",\n InngestExpectedServerKind = \"x-inngest-expected-server-kind\",\n InngestSyncKind = \"x-inngest-sync-kind\",\n EventIdSeed = \"x-inngest-event-id-seed\",\n TraceParent = \"traceparent\",\n TraceState = \"tracestate\",\n InngestRunId = \"x-run-id\",\n InngestStepId = \"x-inngest-step-id\",\n InngestForceStepPlan = \"x-inngest-force-step-plan\",\n SdkHandled = \"x-inngest-sdk-handled\",\n}\n\n/**\n * Headers that are forwarded from the original request when an Inngest function\n * is invoked.\n */\nexport const forwardedHeaders = [headerKeys.TraceParent, headerKeys.TraceState];\n\nexport const defaultInngestApiBaseUrl = \"https://api.inngest.com/\";\nexport const defaultInngestEventBaseUrl = \"https://inn.gs/\";\nexport const defaultDevServerHost = \"http://localhost:8288/\";\n\n/**\n * Events that Inngest may send internally that can be used to trigger\n * functions.\n *\n * @public\n */\nexport enum internalEvents {\n /**\n * A function has failed after exhausting all available retries. This event\n * will contain the original event and the error that caused the failure.\n */\n FunctionFailed = \"inngest/function.failed\",\n FunctionInvoked = \"inngest/function.invoked\",\n FunctionFinished = \"inngest/function.finished\",\n FunctionCancelled = \"inngest/function.cancelled\",\n ScheduledTimer = \"inngest/scheduled.timer\",\n HttpRequest = \"inngest/http.request\",\n\n /**\n * Triggers a deferred function. The backend emits this.\n */\n DeferredSchedule = \"inngest/deferred.schedule\",\n}\n\nexport const logPrefix: string = \"[Inngest]\";\n\nexport const debugPrefix = \"inngest\";\n\nexport const dummyEventKey = \"NO_EVENT_KEY_SET\";\n\nexport enum serverKind {\n Dev = \"dev\",\n Cloud = \"cloud\",\n}\n\nexport enum syncKind {\n InBand = \"in_band\",\n OutOfBand = \"out_of_band\",\n}\n\n/**\n * The execution models the SDK is aware of.\n *\n * This is used in a number of places to ensure all execution versions are\n * accounted for for a given operation.\n */\nexport enum ExecutionVersion {\n /**\n * Uses a more flexible approach to execution and is more lenient about\n * determinism, allowing non-step async actions and non-determinism.\n *\n * Nowhere near as stubborn about determinism and so can silently migrate\n * between versions after bug fixes.\n */\n V1 = 1,\n\n /**\n * Identical to V1, but allows the Executor to optimize parallel calls, hugely\n * reducing traffic going to/from the SDK.\n */\n V2 = 2,\n}\n\n/**\n * Default maximum number of retries for function/step executions.\n */\nexport const defaultMaxRetries = 3;\n"],"mappings":";;;;;;;;;;AASA,IAAY,kDAAL;AACL;AACA;AACA;AACA;;;AAGF,IAAY,0CAAL;AACL;;;AAGF,IAAY,8CAAL;AACL;AACA;AACA;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AAMA;;;;;;;AAQA;;;;AAKA;;;;;;;AAQA;;;;AAKA;;;;;;AAOA;;;;AAKA;;;;;;AAOA;;;;AAKA;;;;;;AAOA;;;;;;AAOA;AAEA;;;;;;AAOA;;;;;;;AAQA;;;;;AAMA;;;;;;;AAQA;AAEA;AACA;AACA;;;;;;AAOA;AACA;AACA;AACA;;;;;;;;;;;;AAYF,IAAY,oDAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AAOF,MAAa,mBAAmB,CAAC,WAAW,aAAa,WAAW,WAAW;AAE/E,MAAa,2BAA2B;AACxC,MAAa,6BAA6B;AAC1C,MAAa,uBAAuB;;;;;;;AAQpC,IAAY,4DAAL;;;;;AAKL;AACA;AACA;AACA;AACA;AACA;;;;AAKA;;;AAGF,MAAaA,YAAoB;AAEjC,MAAa,cAAc;AAE3B,MAAa,gBAAgB;AAO7B,IAAY,gDAAL;AACL;AACA;;;;;;;;;AASF,IAAY,gEAAL;;;;;;;;AAQL;;;;;AAMA;;;;;;AAMF,MAAa,oBAAoB"}
|
package/helpers/functions.cjs
CHANGED
|
@@ -60,6 +60,7 @@ const parseFnData = (data, headerVersion, internalLogger) => {
|
|
|
60
60
|
event: zod_v3.z.record(zod_v3.z.any()),
|
|
61
61
|
events: zod_v3.z.array(zod_v3.z.record(zod_v3.z.any())).default([]),
|
|
62
62
|
steps: require_schema.stepSchema,
|
|
63
|
+
defers: zod_v3.z.record(zod_v3.z.unknown()).optional().default({}),
|
|
63
64
|
ctx: zod_v3.z.object({
|
|
64
65
|
run_id: zod_v3.z.string(),
|
|
65
66
|
fn_id: zod_v3.z.string().optional(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"functions.cjs","names":["debugPrefix","z","PREFERRED_ASYNC_EXECUTION_VERSION","version: ExecutionVersion | undefined","sdkDecided: boolean","stepSchema","err","formatLogMessage","ok","why: string | undefined","ZodError"],"sources":["../../src/helpers/functions.ts"],"sourcesContent":["import Debug from \"debug\";\nimport { ZodError, z } from \"zod/v3\";\nimport type { InngestApi } from \"../api/api.ts\";\nimport { stepSchema } from \"../api/schema.ts\";\nimport { PREFERRED_ASYNC_EXECUTION_VERSION } from \"../components/execution/InngestExecution.ts\";\nimport type { Logger } from \"../middleware/logger.ts\";\nimport { err, ok, type Result } from \"../types.ts\";\nimport { debugPrefix, type ExecutionVersion } from \"./consts.ts\";\nimport { formatLogMessage } from \"./log.ts\";\nimport type { Await } from \"./types.ts\";\n\nconst devDebug = Debug(`${debugPrefix}:functions`);\n\n/**\n * Wraps a function with a cache. When the returned function is run, it will\n * cache the result and return it on subsequent calls.\n */\n// biome-ignore lint/suspicious/noExplicitAny: intentional\nexport const cacheFn = <T extends (...args: any[]) => any>(fn: T): T => {\n const key = \"value\";\n const cache = new Map<typeof key, unknown>();\n\n return ((...args) => {\n if (!cache.has(key)) {\n cache.set(key, fn(...args));\n }\n\n return cache.get(key);\n }) as T;\n};\n\n/**\n * Given an array of functions, return a new function that will run each\n * function in series and return the result of the final function. Regardless of\n * if the functions are synchronous or asynchronous, they'll be made into an\n * async promise chain.\n *\n * If an error is thrown, the waterfall will stop and return the error.\n *\n * Because this needs to support both sync and async functions, it only allows\n * functions that accept a single argument.\n */\n// biome-ignore lint/suspicious/noExplicitAny: intentional\nexport const waterfall = <TFns extends ((arg?: any) => any)[]>(\n fns: TFns,\n\n /**\n * A function that transforms the result of each function in the waterfall,\n * ready for the next function.\n *\n * Will not be called on the final function.\n */\n // biome-ignore lint/suspicious/noExplicitAny: intentional\n transform?: (prev: any, output: any) => any,\n): ((...args: Parameters<TFns[number]>) => Promise<Await<TFns[number]>>) => {\n return (...args) => {\n const chain = fns.reduce(async (acc, fn) => {\n const prev = await acc;\n const output = (await fn(prev)) as Promise<Await<TFns[number]>>;\n\n if (transform) {\n return await transform(prev, output);\n }\n\n if (typeof output === \"undefined\") {\n return prev;\n }\n\n return output;\n }, Promise.resolve(args[0]));\n\n return chain;\n };\n};\n\n/**\n * Given a value `v`, return `v` if it's not undefined, otherwise return `null`.\n */\nexport const undefinedToNull = (v: unknown) => {\n const isUndefined = typeof v === \"undefined\";\n return isUndefined ? null : v;\n};\n\nexport const createVersionSchema = (internalLogger: Logger) =>\n z\n .literal(-1)\n .or(z.literal(0))\n .or(z.literal(1))\n .or(z.literal(2))\n .optional()\n .transform<{ version: ExecutionVersion; sdkDecided: boolean }>((v) => {\n if (typeof v === \"undefined\") {\n devDebug(\"No request version specified by executor; using default\");\n\n return {\n sdkDecided: true,\n version: PREFERRED_ASYNC_EXECUTION_VERSION,\n };\n }\n\n if (v === 0) {\n internalLogger.error(\"V0 execution version is no longer supported\"); // TODO: improve?\n throw new Error(\"V0 execution version is no longer supported\");\n }\n\n if (v === -1) {\n return {\n sdkDecided: true,\n version: PREFERRED_ASYNC_EXECUTION_VERSION,\n };\n }\n\n return {\n sdkDecided: false,\n version: v,\n };\n });\n\nexport const parseFnData = (\n data: unknown,\n headerVersion: unknown | undefined,\n internalLogger: Logger,\n) => {\n const versionSchema = createVersionSchema(internalLogger);\n const fnDataVersionSchema = z.object({ version: versionSchema });\n let version: ExecutionVersion | undefined;\n let sdkDecided: boolean = true;\n\n try {\n if (typeof headerVersion !== \"undefined\") {\n try {\n const res = versionSchema.parse(headerVersion);\n version = res.version;\n sdkDecided = res.sdkDecided;\n } catch {\n // no-op\n }\n }\n\n if (typeof version === \"undefined\") {\n const parsedVersionData = fnDataVersionSchema.parse(data);\n version = parsedVersionData.version.version;\n sdkDecided = parsedVersionData.version.sdkDecided;\n }\n\n return {\n version,\n sdkDecided,\n ...z\n .object({\n event: z.record(z.any()),\n events: z.array(z.record(z.any())).default([]),\n steps: stepSchema,\n ctx: z\n .object({\n run_id: z.string(),\n fn_id: z.string().optional(),\n attempt: z.number().default(0),\n max_attempts: z.number().optional(),\n disable_immediate_execution: z.boolean().default(false),\n use_api: z.boolean().default(false),\n qi_id: z.string().optional(),\n stack: z\n .object({\n stack: z\n .array(z.string())\n .nullable()\n .transform((v) => (Array.isArray(v) ? v : [])),\n current: z.number(),\n })\n .optional()\n .nullable(),\n })\n .optional()\n .nullable(),\n })\n .parse(data),\n } as const;\n } catch (err) {\n throw new Error(parseFailureErr(err));\n }\n};\nexport type FnData = ReturnType<typeof parseFnData>;\n\ntype ParseErr = string;\nexport const fetchAllFnData = async ({\n data,\n api,\n logger,\n}: {\n data: FnData;\n api: InngestApi;\n logger: Logger;\n}): Promise<Result<FnData, ParseErr>> => {\n const result = { ...data };\n\n try {\n if (result.ctx?.use_api) {\n if (!result.ctx?.run_id) {\n return err(\n formatLogMessage({\n message: \"Failed to attempt retrieving data from API\",\n explanation:\n \"Function execution can't continue. run_id is missing from context.\",\n }),\n );\n }\n\n const [evtResp, stepResp] = await Promise.all([\n api.getRunBatch(result.ctx.run_id),\n api.getRunSteps(result.ctx.run_id),\n ]);\n\n if (evtResp.ok) {\n result.events = evtResp.value;\n } else {\n return err(\n formatLogMessage({\n message: \"Failed to retrieve list of events\",\n explanation: `Function execution can't continue.${evtResp.error?.error ? ` ${evtResp.error.error}` : \"\"}`,\n }),\n );\n }\n\n if (stepResp.ok) {\n result.steps = stepResp.value;\n } else {\n return err(\n formatLogMessage({\n message: \"Failed to retrieve steps for function run\",\n explanation: `Function execution can't continue.${stepResp.error?.error ? ` ${stepResp.error.error}` : \"\"}`,\n }),\n );\n }\n }\n\n // If we don't have a stack here, we need to at least set something.\n // TODO We should be passed this by the steps API.\n const stepIds = Object.keys(result.steps || {});\n if (stepIds.length && !result.ctx?.stack?.stack?.length) {\n result.ctx = {\n ...(result.ctx as NonNullable<typeof result.ctx>),\n stack: {\n stack: stepIds,\n current: stepIds.length - 1,\n },\n };\n }\n\n return ok(result);\n } catch (error) {\n logger.error({ err: error }, \"Failed to fetch all function data\");\n\n return err(parseFailureErr(error));\n }\n};\n\nconst parseFailureErr = (err: unknown) => {\n let why: string | undefined;\n if (err instanceof ZodError) {\n why = err.toString();\n }\n\n return formatLogMessage({\n message: \"Failed to parse data from executor\",\n explanation: `Function execution can't continue.${why ? ` ${why}` : \"\"}`,\n action:\n \"Make sure that your API is set up to parse incoming request bodies as JSON, like body-parser for Express.\",\n docs: \"https://expressjs.com/en/resources/middleware/body-parser.html\",\n });\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"functions.cjs","names":["debugPrefix","z","PREFERRED_ASYNC_EXECUTION_VERSION","version: ExecutionVersion | undefined","sdkDecided: boolean","stepSchema","err","formatLogMessage","ok","why: string | undefined","ZodError"],"sources":["../../src/helpers/functions.ts"],"sourcesContent":["import Debug from \"debug\";\nimport { ZodError, z } from \"zod/v3\";\nimport type { InngestApi } from \"../api/api.ts\";\nimport { stepSchema } from \"../api/schema.ts\";\nimport { PREFERRED_ASYNC_EXECUTION_VERSION } from \"../components/execution/InngestExecution.ts\";\nimport type { Logger } from \"../middleware/logger.ts\";\nimport { err, ok, type Result } from \"../types.ts\";\nimport { debugPrefix, type ExecutionVersion } from \"./consts.ts\";\nimport { formatLogMessage } from \"./log.ts\";\nimport type { Await } from \"./types.ts\";\n\nconst devDebug = Debug(`${debugPrefix}:functions`);\n\n/**\n * Wraps a function with a cache. When the returned function is run, it will\n * cache the result and return it on subsequent calls.\n */\n// biome-ignore lint/suspicious/noExplicitAny: intentional\nexport const cacheFn = <T extends (...args: any[]) => any>(fn: T): T => {\n const key = \"value\";\n const cache = new Map<typeof key, unknown>();\n\n return ((...args) => {\n if (!cache.has(key)) {\n cache.set(key, fn(...args));\n }\n\n return cache.get(key);\n }) as T;\n};\n\n/**\n * Given an array of functions, return a new function that will run each\n * function in series and return the result of the final function. Regardless of\n * if the functions are synchronous or asynchronous, they'll be made into an\n * async promise chain.\n *\n * If an error is thrown, the waterfall will stop and return the error.\n *\n * Because this needs to support both sync and async functions, it only allows\n * functions that accept a single argument.\n */\n// biome-ignore lint/suspicious/noExplicitAny: intentional\nexport const waterfall = <TFns extends ((arg?: any) => any)[]>(\n fns: TFns,\n\n /**\n * A function that transforms the result of each function in the waterfall,\n * ready for the next function.\n *\n * Will not be called on the final function.\n */\n // biome-ignore lint/suspicious/noExplicitAny: intentional\n transform?: (prev: any, output: any) => any,\n): ((...args: Parameters<TFns[number]>) => Promise<Await<TFns[number]>>) => {\n return (...args) => {\n const chain = fns.reduce(async (acc, fn) => {\n const prev = await acc;\n const output = (await fn(prev)) as Promise<Await<TFns[number]>>;\n\n if (transform) {\n return await transform(prev, output);\n }\n\n if (typeof output === \"undefined\") {\n return prev;\n }\n\n return output;\n }, Promise.resolve(args[0]));\n\n return chain;\n };\n};\n\n/**\n * Given a value `v`, return `v` if it's not undefined, otherwise return `null`.\n */\nexport const undefinedToNull = (v: unknown) => {\n const isUndefined = typeof v === \"undefined\";\n return isUndefined ? null : v;\n};\n\nexport const createVersionSchema = (internalLogger: Logger) =>\n z\n .literal(-1)\n .or(z.literal(0))\n .or(z.literal(1))\n .or(z.literal(2))\n .optional()\n .transform<{ version: ExecutionVersion; sdkDecided: boolean }>((v) => {\n if (typeof v === \"undefined\") {\n devDebug(\"No request version specified by executor; using default\");\n\n return {\n sdkDecided: true,\n version: PREFERRED_ASYNC_EXECUTION_VERSION,\n };\n }\n\n if (v === 0) {\n internalLogger.error(\"V0 execution version is no longer supported\"); // TODO: improve?\n throw new Error(\"V0 execution version is no longer supported\");\n }\n\n if (v === -1) {\n return {\n sdkDecided: true,\n version: PREFERRED_ASYNC_EXECUTION_VERSION,\n };\n }\n\n return {\n sdkDecided: false,\n version: v,\n };\n });\n\nexport const parseFnData = (\n data: unknown,\n headerVersion: unknown | undefined,\n internalLogger: Logger,\n) => {\n const versionSchema = createVersionSchema(internalLogger);\n const fnDataVersionSchema = z.object({ version: versionSchema });\n let version: ExecutionVersion | undefined;\n let sdkDecided: boolean = true;\n\n try {\n if (typeof headerVersion !== \"undefined\") {\n try {\n const res = versionSchema.parse(headerVersion);\n version = res.version;\n sdkDecided = res.sdkDecided;\n } catch {\n // no-op\n }\n }\n\n if (typeof version === \"undefined\") {\n const parsedVersionData = fnDataVersionSchema.parse(data);\n version = parsedVersionData.version.version;\n sdkDecided = parsedVersionData.version.sdkDecided;\n }\n\n return {\n version,\n sdkDecided,\n ...z\n .object({\n event: z.record(z.any()),\n events: z.array(z.record(z.any())).default([]),\n steps: stepSchema,\n defers: z.record(z.unknown()).optional().default({}),\n ctx: z\n .object({\n run_id: z.string(),\n fn_id: z.string().optional(),\n attempt: z.number().default(0),\n max_attempts: z.number().optional(),\n disable_immediate_execution: z.boolean().default(false),\n use_api: z.boolean().default(false),\n qi_id: z.string().optional(),\n stack: z\n .object({\n stack: z\n .array(z.string())\n .nullable()\n .transform((v) => (Array.isArray(v) ? v : [])),\n current: z.number(),\n })\n .optional()\n .nullable(),\n })\n .optional()\n .nullable(),\n })\n .parse(data),\n } as const;\n } catch (err) {\n throw new Error(parseFailureErr(err));\n }\n};\nexport type FnData = ReturnType<typeof parseFnData>;\n\ntype ParseErr = string;\nexport const fetchAllFnData = async ({\n data,\n api,\n logger,\n}: {\n data: FnData;\n api: InngestApi;\n logger: Logger;\n}): Promise<Result<FnData, ParseErr>> => {\n const result = { ...data };\n\n try {\n if (result.ctx?.use_api) {\n if (!result.ctx?.run_id) {\n return err(\n formatLogMessage({\n message: \"Failed to attempt retrieving data from API\",\n explanation:\n \"Function execution can't continue. run_id is missing from context.\",\n }),\n );\n }\n\n const [evtResp, stepResp] = await Promise.all([\n api.getRunBatch(result.ctx.run_id),\n api.getRunSteps(result.ctx.run_id),\n ]);\n\n if (evtResp.ok) {\n result.events = evtResp.value;\n } else {\n return err(\n formatLogMessage({\n message: \"Failed to retrieve list of events\",\n explanation: `Function execution can't continue.${evtResp.error?.error ? ` ${evtResp.error.error}` : \"\"}`,\n }),\n );\n }\n\n if (stepResp.ok) {\n result.steps = stepResp.value;\n } else {\n return err(\n formatLogMessage({\n message: \"Failed to retrieve steps for function run\",\n explanation: `Function execution can't continue.${stepResp.error?.error ? ` ${stepResp.error.error}` : \"\"}`,\n }),\n );\n }\n }\n\n // If we don't have a stack here, we need to at least set something.\n // TODO We should be passed this by the steps API.\n const stepIds = Object.keys(result.steps || {});\n if (stepIds.length && !result.ctx?.stack?.stack?.length) {\n result.ctx = {\n ...(result.ctx as NonNullable<typeof result.ctx>),\n stack: {\n stack: stepIds,\n current: stepIds.length - 1,\n },\n };\n }\n\n return ok(result);\n } catch (error) {\n logger.error({ err: error }, \"Failed to fetch all function data\");\n\n return err(parseFailureErr(error));\n }\n};\n\nconst parseFailureErr = (err: unknown) => {\n let why: string | undefined;\n if (err instanceof ZodError) {\n why = err.toString();\n }\n\n return formatLogMessage({\n message: \"Failed to parse data from executor\",\n explanation: `Function execution can't continue.${why ? ` ${why}` : \"\"}`,\n action:\n \"Make sure that your API is set up to parse incoming request bodies as JSON, like body-parser for Express.\",\n docs: \"https://expressjs.com/en/resources/middleware/body-parser.html\",\n });\n};\n"],"mappings":";;;;;;;;;;;AAWA,MAAM,8BAAiB,GAAGA,2BAAY,YAAY;;;;AAmElD,MAAa,mBAAmB,MAAe;AAE7C,QADoB,OAAO,MAAM,cACZ,OAAO;;AAG9B,MAAa,uBAAuB,mBAClCC,SACG,QAAQ,GAAG,CACX,GAAGA,SAAE,QAAQ,EAAE,CAAC,CAChB,GAAGA,SAAE,QAAQ,EAAE,CAAC,CAChB,GAAGA,SAAE,QAAQ,EAAE,CAAC,CAChB,UAAU,CACV,WAA+D,MAAM;AACpE,KAAI,OAAO,MAAM,aAAa;AAC5B,WAAS,0DAA0D;AAEnE,SAAO;GACL,YAAY;GACZ,SAASC;GACV;;AAGH,KAAI,MAAM,GAAG;AACX,iBAAe,MAAM,8CAA8C;AACnE,QAAM,IAAI,MAAM,8CAA8C;;AAGhE,KAAI,MAAM,GACR,QAAO;EACL,YAAY;EACZ,SAASA;EACV;AAGH,QAAO;EACL,YAAY;EACZ,SAAS;EACV;EACD;AAEN,MAAa,eACX,MACA,eACA,mBACG;CACH,MAAM,gBAAgB,oBAAoB,eAAe;CACzD,MAAM,sBAAsBD,SAAE,OAAO,EAAE,SAAS,eAAe,CAAC;CAChE,IAAIE;CACJ,IAAIC,aAAsB;AAE1B,KAAI;AACF,MAAI,OAAO,kBAAkB,YAC3B,KAAI;GACF,MAAM,MAAM,cAAc,MAAM,cAAc;AAC9C,aAAU,IAAI;AACd,gBAAa,IAAI;UACX;AAKV,MAAI,OAAO,YAAY,aAAa;GAClC,MAAM,oBAAoB,oBAAoB,MAAM,KAAK;AACzD,aAAU,kBAAkB,QAAQ;AACpC,gBAAa,kBAAkB,QAAQ;;AAGzC,SAAO;GACL;GACA;GACA,GAAGH,SACA,OAAO;IACN,OAAOA,SAAE,OAAOA,SAAE,KAAK,CAAC;IACxB,QAAQA,SAAE,MAAMA,SAAE,OAAOA,SAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC9C,OAAOI;IACP,QAAQJ,SAAE,OAAOA,SAAE,SAAS,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;IACpD,KAAKA,SACF,OAAO;KACN,QAAQA,SAAE,QAAQ;KAClB,OAAOA,SAAE,QAAQ,CAAC,UAAU;KAC5B,SAASA,SAAE,QAAQ,CAAC,QAAQ,EAAE;KAC9B,cAAcA,SAAE,QAAQ,CAAC,UAAU;KACnC,6BAA6BA,SAAE,SAAS,CAAC,QAAQ,MAAM;KACvD,SAASA,SAAE,SAAS,CAAC,QAAQ,MAAM;KACnC,OAAOA,SAAE,QAAQ,CAAC,UAAU;KAC5B,OAAOA,SACJ,OAAO;MACN,OAAOA,SACJ,MAAMA,SAAE,QAAQ,CAAC,CACjB,UAAU,CACV,WAAW,MAAO,MAAM,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAE;MAChD,SAASA,SAAE,QAAQ;MACpB,CAAC,CACD,UAAU,CACV,UAAU;KACd,CAAC,CACD,UAAU,CACV,UAAU;IACd,CAAC,CACD,MAAM,KAAK;GACf;UACMK,OAAK;AACZ,QAAM,IAAI,MAAM,gBAAgBA,MAAI,CAAC;;;AAMzC,MAAa,iBAAiB,OAAO,EACnC,MACA,KACA,aAKuC;CACvC,MAAM,SAAS,EAAE,GAAG,MAAM;AAE1B,KAAI;AACF,MAAI,OAAO,KAAK,SAAS;AACvB,OAAI,CAAC,OAAO,KAAK,OACf,QAAOA,kBACLC,6BAAiB;IACf,SAAS;IACT,aACE;IACH,CAAC,CACH;GAGH,MAAM,CAAC,SAAS,YAAY,MAAM,QAAQ,IAAI,CAC5C,IAAI,YAAY,OAAO,IAAI,OAAO,EAClC,IAAI,YAAY,OAAO,IAAI,OAAO,CACnC,CAAC;AAEF,OAAI,QAAQ,GACV,QAAO,SAAS,QAAQ;OAExB,QAAOD,kBACLC,6BAAiB;IACf,SAAS;IACT,aAAa,qCAAqC,QAAQ,OAAO,QAAQ,IAAI,QAAQ,MAAM,UAAU;IACtG,CAAC,CACH;AAGH,OAAI,SAAS,GACX,QAAO,QAAQ,SAAS;OAExB,QAAOD,kBACLC,6BAAiB;IACf,SAAS;IACT,aAAa,qCAAqC,SAAS,OAAO,QAAQ,IAAI,SAAS,MAAM,UAAU;IACxG,CAAC,CACH;;EAML,MAAM,UAAU,OAAO,KAAK,OAAO,SAAS,EAAE,CAAC;AAC/C,MAAI,QAAQ,UAAU,CAAC,OAAO,KAAK,OAAO,OAAO,OAC/C,QAAO,MAAM;GACX,GAAI,OAAO;GACX,OAAO;IACL,OAAO;IACP,SAAS,QAAQ,SAAS;IAC3B;GACF;AAGH,SAAOC,iBAAG,OAAO;UACV,OAAO;AACd,SAAO,MAAM,EAAE,KAAK,OAAO,EAAE,oCAAoC;AAEjE,SAAOF,kBAAI,gBAAgB,MAAM,CAAC;;;AAItC,MAAM,mBAAmB,UAAiB;CACxC,IAAIG;AACJ,KAAIH,iBAAeI,gBACjB,OAAMJ,MAAI,UAAU;AAGtB,QAAOC,6BAAiB;EACtB,SAAS;EACT,aAAa,qCAAqC,MAAM,IAAI,QAAQ;EACpE,QACE;EACF,MAAM;EACP,CAAC"}
|
package/helpers/functions.js
CHANGED
|
@@ -58,6 +58,7 @@ const parseFnData = (data, headerVersion, internalLogger) => {
|
|
|
58
58
|
event: z.record(z.any()),
|
|
59
59
|
events: z.array(z.record(z.any())).default([]),
|
|
60
60
|
steps: stepSchema,
|
|
61
|
+
defers: z.record(z.unknown()).optional().default({}),
|
|
61
62
|
ctx: z.object({
|
|
62
63
|
run_id: z.string(),
|
|
63
64
|
fn_id: z.string().optional(),
|
package/helpers/functions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"functions.js","names":["version: ExecutionVersion | undefined","sdkDecided: boolean","err","why: string | undefined"],"sources":["../../src/helpers/functions.ts"],"sourcesContent":["import Debug from \"debug\";\nimport { ZodError, z } from \"zod/v3\";\nimport type { InngestApi } from \"../api/api.ts\";\nimport { stepSchema } from \"../api/schema.ts\";\nimport { PREFERRED_ASYNC_EXECUTION_VERSION } from \"../components/execution/InngestExecution.ts\";\nimport type { Logger } from \"../middleware/logger.ts\";\nimport { err, ok, type Result } from \"../types.ts\";\nimport { debugPrefix, type ExecutionVersion } from \"./consts.ts\";\nimport { formatLogMessage } from \"./log.ts\";\nimport type { Await } from \"./types.ts\";\n\nconst devDebug = Debug(`${debugPrefix}:functions`);\n\n/**\n * Wraps a function with a cache. When the returned function is run, it will\n * cache the result and return it on subsequent calls.\n */\n// biome-ignore lint/suspicious/noExplicitAny: intentional\nexport const cacheFn = <T extends (...args: any[]) => any>(fn: T): T => {\n const key = \"value\";\n const cache = new Map<typeof key, unknown>();\n\n return ((...args) => {\n if (!cache.has(key)) {\n cache.set(key, fn(...args));\n }\n\n return cache.get(key);\n }) as T;\n};\n\n/**\n * Given an array of functions, return a new function that will run each\n * function in series and return the result of the final function. Regardless of\n * if the functions are synchronous or asynchronous, they'll be made into an\n * async promise chain.\n *\n * If an error is thrown, the waterfall will stop and return the error.\n *\n * Because this needs to support both sync and async functions, it only allows\n * functions that accept a single argument.\n */\n// biome-ignore lint/suspicious/noExplicitAny: intentional\nexport const waterfall = <TFns extends ((arg?: any) => any)[]>(\n fns: TFns,\n\n /**\n * A function that transforms the result of each function in the waterfall,\n * ready for the next function.\n *\n * Will not be called on the final function.\n */\n // biome-ignore lint/suspicious/noExplicitAny: intentional\n transform?: (prev: any, output: any) => any,\n): ((...args: Parameters<TFns[number]>) => Promise<Await<TFns[number]>>) => {\n return (...args) => {\n const chain = fns.reduce(async (acc, fn) => {\n const prev = await acc;\n const output = (await fn(prev)) as Promise<Await<TFns[number]>>;\n\n if (transform) {\n return await transform(prev, output);\n }\n\n if (typeof output === \"undefined\") {\n return prev;\n }\n\n return output;\n }, Promise.resolve(args[0]));\n\n return chain;\n };\n};\n\n/**\n * Given a value `v`, return `v` if it's not undefined, otherwise return `null`.\n */\nexport const undefinedToNull = (v: unknown) => {\n const isUndefined = typeof v === \"undefined\";\n return isUndefined ? null : v;\n};\n\nexport const createVersionSchema = (internalLogger: Logger) =>\n z\n .literal(-1)\n .or(z.literal(0))\n .or(z.literal(1))\n .or(z.literal(2))\n .optional()\n .transform<{ version: ExecutionVersion; sdkDecided: boolean }>((v) => {\n if (typeof v === \"undefined\") {\n devDebug(\"No request version specified by executor; using default\");\n\n return {\n sdkDecided: true,\n version: PREFERRED_ASYNC_EXECUTION_VERSION,\n };\n }\n\n if (v === 0) {\n internalLogger.error(\"V0 execution version is no longer supported\"); // TODO: improve?\n throw new Error(\"V0 execution version is no longer supported\");\n }\n\n if (v === -1) {\n return {\n sdkDecided: true,\n version: PREFERRED_ASYNC_EXECUTION_VERSION,\n };\n }\n\n return {\n sdkDecided: false,\n version: v,\n };\n });\n\nexport const parseFnData = (\n data: unknown,\n headerVersion: unknown | undefined,\n internalLogger: Logger,\n) => {\n const versionSchema = createVersionSchema(internalLogger);\n const fnDataVersionSchema = z.object({ version: versionSchema });\n let version: ExecutionVersion | undefined;\n let sdkDecided: boolean = true;\n\n try {\n if (typeof headerVersion !== \"undefined\") {\n try {\n const res = versionSchema.parse(headerVersion);\n version = res.version;\n sdkDecided = res.sdkDecided;\n } catch {\n // no-op\n }\n }\n\n if (typeof version === \"undefined\") {\n const parsedVersionData = fnDataVersionSchema.parse(data);\n version = parsedVersionData.version.version;\n sdkDecided = parsedVersionData.version.sdkDecided;\n }\n\n return {\n version,\n sdkDecided,\n ...z\n .object({\n event: z.record(z.any()),\n events: z.array(z.record(z.any())).default([]),\n steps: stepSchema,\n ctx: z\n .object({\n run_id: z.string(),\n fn_id: z.string().optional(),\n attempt: z.number().default(0),\n max_attempts: z.number().optional(),\n disable_immediate_execution: z.boolean().default(false),\n use_api: z.boolean().default(false),\n qi_id: z.string().optional(),\n stack: z\n .object({\n stack: z\n .array(z.string())\n .nullable()\n .transform((v) => (Array.isArray(v) ? v : [])),\n current: z.number(),\n })\n .optional()\n .nullable(),\n })\n .optional()\n .nullable(),\n })\n .parse(data),\n } as const;\n } catch (err) {\n throw new Error(parseFailureErr(err));\n }\n};\nexport type FnData = ReturnType<typeof parseFnData>;\n\ntype ParseErr = string;\nexport const fetchAllFnData = async ({\n data,\n api,\n logger,\n}: {\n data: FnData;\n api: InngestApi;\n logger: Logger;\n}): Promise<Result<FnData, ParseErr>> => {\n const result = { ...data };\n\n try {\n if (result.ctx?.use_api) {\n if (!result.ctx?.run_id) {\n return err(\n formatLogMessage({\n message: \"Failed to attempt retrieving data from API\",\n explanation:\n \"Function execution can't continue. run_id is missing from context.\",\n }),\n );\n }\n\n const [evtResp, stepResp] = await Promise.all([\n api.getRunBatch(result.ctx.run_id),\n api.getRunSteps(result.ctx.run_id),\n ]);\n\n if (evtResp.ok) {\n result.events = evtResp.value;\n } else {\n return err(\n formatLogMessage({\n message: \"Failed to retrieve list of events\",\n explanation: `Function execution can't continue.${evtResp.error?.error ? ` ${evtResp.error.error}` : \"\"}`,\n }),\n );\n }\n\n if (stepResp.ok) {\n result.steps = stepResp.value;\n } else {\n return err(\n formatLogMessage({\n message: \"Failed to retrieve steps for function run\",\n explanation: `Function execution can't continue.${stepResp.error?.error ? ` ${stepResp.error.error}` : \"\"}`,\n }),\n );\n }\n }\n\n // If we don't have a stack here, we need to at least set something.\n // TODO We should be passed this by the steps API.\n const stepIds = Object.keys(result.steps || {});\n if (stepIds.length && !result.ctx?.stack?.stack?.length) {\n result.ctx = {\n ...(result.ctx as NonNullable<typeof result.ctx>),\n stack: {\n stack: stepIds,\n current: stepIds.length - 1,\n },\n };\n }\n\n return ok(result);\n } catch (error) {\n logger.error({ err: error }, \"Failed to fetch all function data\");\n\n return err(parseFailureErr(error));\n }\n};\n\nconst parseFailureErr = (err: unknown) => {\n let why: string | undefined;\n if (err instanceof ZodError) {\n why = err.toString();\n }\n\n return formatLogMessage({\n message: \"Failed to parse data from executor\",\n explanation: `Function execution can't continue.${why ? ` ${why}` : \"\"}`,\n action:\n \"Make sure that your API is set up to parse incoming request bodies as JSON, like body-parser for Express.\",\n docs: \"https://expressjs.com/en/resources/middleware/body-parser.html\",\n });\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"functions.js","names":["version: ExecutionVersion | undefined","sdkDecided: boolean","err","why: string | undefined"],"sources":["../../src/helpers/functions.ts"],"sourcesContent":["import Debug from \"debug\";\nimport { ZodError, z } from \"zod/v3\";\nimport type { InngestApi } from \"../api/api.ts\";\nimport { stepSchema } from \"../api/schema.ts\";\nimport { PREFERRED_ASYNC_EXECUTION_VERSION } from \"../components/execution/InngestExecution.ts\";\nimport type { Logger } from \"../middleware/logger.ts\";\nimport { err, ok, type Result } from \"../types.ts\";\nimport { debugPrefix, type ExecutionVersion } from \"./consts.ts\";\nimport { formatLogMessage } from \"./log.ts\";\nimport type { Await } from \"./types.ts\";\n\nconst devDebug = Debug(`${debugPrefix}:functions`);\n\n/**\n * Wraps a function with a cache. When the returned function is run, it will\n * cache the result and return it on subsequent calls.\n */\n// biome-ignore lint/suspicious/noExplicitAny: intentional\nexport const cacheFn = <T extends (...args: any[]) => any>(fn: T): T => {\n const key = \"value\";\n const cache = new Map<typeof key, unknown>();\n\n return ((...args) => {\n if (!cache.has(key)) {\n cache.set(key, fn(...args));\n }\n\n return cache.get(key);\n }) as T;\n};\n\n/**\n * Given an array of functions, return a new function that will run each\n * function in series and return the result of the final function. Regardless of\n * if the functions are synchronous or asynchronous, they'll be made into an\n * async promise chain.\n *\n * If an error is thrown, the waterfall will stop and return the error.\n *\n * Because this needs to support both sync and async functions, it only allows\n * functions that accept a single argument.\n */\n// biome-ignore lint/suspicious/noExplicitAny: intentional\nexport const waterfall = <TFns extends ((arg?: any) => any)[]>(\n fns: TFns,\n\n /**\n * A function that transforms the result of each function in the waterfall,\n * ready for the next function.\n *\n * Will not be called on the final function.\n */\n // biome-ignore lint/suspicious/noExplicitAny: intentional\n transform?: (prev: any, output: any) => any,\n): ((...args: Parameters<TFns[number]>) => Promise<Await<TFns[number]>>) => {\n return (...args) => {\n const chain = fns.reduce(async (acc, fn) => {\n const prev = await acc;\n const output = (await fn(prev)) as Promise<Await<TFns[number]>>;\n\n if (transform) {\n return await transform(prev, output);\n }\n\n if (typeof output === \"undefined\") {\n return prev;\n }\n\n return output;\n }, Promise.resolve(args[0]));\n\n return chain;\n };\n};\n\n/**\n * Given a value `v`, return `v` if it's not undefined, otherwise return `null`.\n */\nexport const undefinedToNull = (v: unknown) => {\n const isUndefined = typeof v === \"undefined\";\n return isUndefined ? null : v;\n};\n\nexport const createVersionSchema = (internalLogger: Logger) =>\n z\n .literal(-1)\n .or(z.literal(0))\n .or(z.literal(1))\n .or(z.literal(2))\n .optional()\n .transform<{ version: ExecutionVersion; sdkDecided: boolean }>((v) => {\n if (typeof v === \"undefined\") {\n devDebug(\"No request version specified by executor; using default\");\n\n return {\n sdkDecided: true,\n version: PREFERRED_ASYNC_EXECUTION_VERSION,\n };\n }\n\n if (v === 0) {\n internalLogger.error(\"V0 execution version is no longer supported\"); // TODO: improve?\n throw new Error(\"V0 execution version is no longer supported\");\n }\n\n if (v === -1) {\n return {\n sdkDecided: true,\n version: PREFERRED_ASYNC_EXECUTION_VERSION,\n };\n }\n\n return {\n sdkDecided: false,\n version: v,\n };\n });\n\nexport const parseFnData = (\n data: unknown,\n headerVersion: unknown | undefined,\n internalLogger: Logger,\n) => {\n const versionSchema = createVersionSchema(internalLogger);\n const fnDataVersionSchema = z.object({ version: versionSchema });\n let version: ExecutionVersion | undefined;\n let sdkDecided: boolean = true;\n\n try {\n if (typeof headerVersion !== \"undefined\") {\n try {\n const res = versionSchema.parse(headerVersion);\n version = res.version;\n sdkDecided = res.sdkDecided;\n } catch {\n // no-op\n }\n }\n\n if (typeof version === \"undefined\") {\n const parsedVersionData = fnDataVersionSchema.parse(data);\n version = parsedVersionData.version.version;\n sdkDecided = parsedVersionData.version.sdkDecided;\n }\n\n return {\n version,\n sdkDecided,\n ...z\n .object({\n event: z.record(z.any()),\n events: z.array(z.record(z.any())).default([]),\n steps: stepSchema,\n defers: z.record(z.unknown()).optional().default({}),\n ctx: z\n .object({\n run_id: z.string(),\n fn_id: z.string().optional(),\n attempt: z.number().default(0),\n max_attempts: z.number().optional(),\n disable_immediate_execution: z.boolean().default(false),\n use_api: z.boolean().default(false),\n qi_id: z.string().optional(),\n stack: z\n .object({\n stack: z\n .array(z.string())\n .nullable()\n .transform((v) => (Array.isArray(v) ? v : [])),\n current: z.number(),\n })\n .optional()\n .nullable(),\n })\n .optional()\n .nullable(),\n })\n .parse(data),\n } as const;\n } catch (err) {\n throw new Error(parseFailureErr(err));\n }\n};\nexport type FnData = ReturnType<typeof parseFnData>;\n\ntype ParseErr = string;\nexport const fetchAllFnData = async ({\n data,\n api,\n logger,\n}: {\n data: FnData;\n api: InngestApi;\n logger: Logger;\n}): Promise<Result<FnData, ParseErr>> => {\n const result = { ...data };\n\n try {\n if (result.ctx?.use_api) {\n if (!result.ctx?.run_id) {\n return err(\n formatLogMessage({\n message: \"Failed to attempt retrieving data from API\",\n explanation:\n \"Function execution can't continue. run_id is missing from context.\",\n }),\n );\n }\n\n const [evtResp, stepResp] = await Promise.all([\n api.getRunBatch(result.ctx.run_id),\n api.getRunSteps(result.ctx.run_id),\n ]);\n\n if (evtResp.ok) {\n result.events = evtResp.value;\n } else {\n return err(\n formatLogMessage({\n message: \"Failed to retrieve list of events\",\n explanation: `Function execution can't continue.${evtResp.error?.error ? ` ${evtResp.error.error}` : \"\"}`,\n }),\n );\n }\n\n if (stepResp.ok) {\n result.steps = stepResp.value;\n } else {\n return err(\n formatLogMessage({\n message: \"Failed to retrieve steps for function run\",\n explanation: `Function execution can't continue.${stepResp.error?.error ? ` ${stepResp.error.error}` : \"\"}`,\n }),\n );\n }\n }\n\n // If we don't have a stack here, we need to at least set something.\n // TODO We should be passed this by the steps API.\n const stepIds = Object.keys(result.steps || {});\n if (stepIds.length && !result.ctx?.stack?.stack?.length) {\n result.ctx = {\n ...(result.ctx as NonNullable<typeof result.ctx>),\n stack: {\n stack: stepIds,\n current: stepIds.length - 1,\n },\n };\n }\n\n return ok(result);\n } catch (error) {\n logger.error({ err: error }, \"Failed to fetch all function data\");\n\n return err(parseFailureErr(error));\n }\n};\n\nconst parseFailureErr = (err: unknown) => {\n let why: string | undefined;\n if (err instanceof ZodError) {\n why = err.toString();\n }\n\n return formatLogMessage({\n message: \"Failed to parse data from executor\",\n explanation: `Function execution can't continue.${why ? ` ${why}` : \"\"}`,\n action:\n \"Make sure that your API is set up to parse incoming request bodies as JSON, like body-parser for Express.\",\n docs: \"https://expressjs.com/en/resources/middleware/body-parser.html\",\n });\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/helpers/marker.ts
|
|
3
|
+
/**
|
|
4
|
+
* Property name used to stamp SDK-internal metadata onto objects. The tilde
|
|
5
|
+
* prefix signals "internal, don't touch."
|
|
6
|
+
*/
|
|
7
|
+
const markerKey = "~inngest";
|
|
8
|
+
function getMarker(value) {
|
|
9
|
+
if (typeof value !== "object" || value === null) return;
|
|
10
|
+
const m = value[markerKey];
|
|
11
|
+
if (typeof m !== "object" || m === null) return;
|
|
12
|
+
return m;
|
|
13
|
+
}
|
|
14
|
+
function isDeferredFunction(value) {
|
|
15
|
+
return getMarker(value)?.kind === "deferredFunction";
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
//#endregion
|
|
19
|
+
exports.isDeferredFunction = isDeferredFunction;
|
|
20
|
+
exports.markerKey = markerKey;
|
|
21
|
+
//# sourceMappingURL=marker.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marker.cjs","names":[],"sources":["../../src/helpers/marker.ts"],"sourcesContent":["import type { DeferredFunction } from \"../components/DeferredFunction.ts\";\n\n/**\n * Property name used to stamp SDK-internal metadata onto objects. The tilde\n * prefix signals \"internal, don't touch.\"\n */\nexport const markerKey = \"~inngest\" as const;\n\nexport type Marker = {\n kind?: \"deferredFunction\";\n};\n\nfunction getMarker(value: unknown): Marker | undefined {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n const m = (value as { [markerKey]?: unknown })[markerKey];\n if (typeof m !== \"object\" || m === null) {\n return undefined;\n }\n return m as Marker;\n}\n\nexport function isDeferredFunction(\n value: unknown,\n): value is DeferredFunction.Any {\n return getMarker(value)?.kind === \"deferredFunction\";\n}\n"],"mappings":";;;;;;AAMA,MAAa,YAAY;AAMzB,SAAS,UAAU,OAAoC;AACrD,KAAI,OAAO,UAAU,YAAY,UAAU,KACzC;CAEF,MAAM,IAAK,MAAoC;AAC/C,KAAI,OAAO,MAAM,YAAY,MAAM,KACjC;AAEF,QAAO;;AAGT,SAAgB,mBACd,OAC+B;AAC/B,QAAO,UAAU,MAAM,EAAE,SAAS"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//#region src/helpers/marker.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Property name used to stamp SDK-internal metadata onto objects. The tilde
|
|
4
|
+
* prefix signals "internal, don't touch."
|
|
5
|
+
*/
|
|
6
|
+
declare const markerKey: "~inngest";
|
|
7
|
+
type Marker = {
|
|
8
|
+
kind?: "deferredFunction";
|
|
9
|
+
};
|
|
10
|
+
//#endregion
|
|
11
|
+
export { Marker, markerKey };
|
|
12
|
+
//# sourceMappingURL=marker.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marker.d.cts","names":[],"sources":["../../src/helpers/marker.ts"],"sourcesContent":[],"mappings":";AAMA;AAEA;;;cAFa;KAED,MAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//#region src/helpers/marker.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Property name used to stamp SDK-internal metadata onto objects. The tilde
|
|
4
|
+
* prefix signals "internal, don't touch."
|
|
5
|
+
*/
|
|
6
|
+
declare const markerKey: "~inngest";
|
|
7
|
+
type Marker = {
|
|
8
|
+
kind?: "deferredFunction";
|
|
9
|
+
};
|
|
10
|
+
//#endregion
|
|
11
|
+
export { Marker, markerKey };
|
|
12
|
+
//# sourceMappingURL=marker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marker.d.ts","names":[],"sources":["../../src/helpers/marker.ts"],"sourcesContent":[],"mappings":";AAMA;AAEA;;;cAFa;KAED,MAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/helpers/marker.ts
|
|
2
|
+
/**
|
|
3
|
+
* Property name used to stamp SDK-internal metadata onto objects. The tilde
|
|
4
|
+
* prefix signals "internal, don't touch."
|
|
5
|
+
*/
|
|
6
|
+
const markerKey = "~inngest";
|
|
7
|
+
function getMarker(value) {
|
|
8
|
+
if (typeof value !== "object" || value === null) return;
|
|
9
|
+
const m = value[markerKey];
|
|
10
|
+
if (typeof m !== "object" || m === null) return;
|
|
11
|
+
return m;
|
|
12
|
+
}
|
|
13
|
+
function isDeferredFunction(value) {
|
|
14
|
+
return getMarker(value)?.kind === "deferredFunction";
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
//#endregion
|
|
18
|
+
export { isDeferredFunction, markerKey };
|
|
19
|
+
//# sourceMappingURL=marker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marker.js","names":[],"sources":["../../src/helpers/marker.ts"],"sourcesContent":["import type { DeferredFunction } from \"../components/DeferredFunction.ts\";\n\n/**\n * Property name used to stamp SDK-internal metadata onto objects. The tilde\n * prefix signals \"internal, don't touch.\"\n */\nexport const markerKey = \"~inngest\" as const;\n\nexport type Marker = {\n kind?: \"deferredFunction\";\n};\n\nfunction getMarker(value: unknown): Marker | undefined {\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n const m = (value as { [markerKey]?: unknown })[markerKey];\n if (typeof m !== \"object\" || m === null) {\n return undefined;\n }\n return m as Marker;\n}\n\nexport function isDeferredFunction(\n value: unknown,\n): value is DeferredFunction.Any {\n return getMarker(value)?.kind === \"deferredFunction\";\n}\n"],"mappings":";;;;;AAMA,MAAa,YAAY;AAMzB,SAAS,UAAU,OAAoC;AACrD,KAAI,OAAO,UAAU,YAAY,UAAU,KACzC;CAEF,MAAM,IAAK,MAAoC;AAC/C,KAAI,OAAO,MAAM,YAAY,MAAM,KACjC;AAEF,QAAO;;AAGT,SAAgB,mBACd,OAC+B;AAC/B,QAAO,UAAU,MAAM,EAAE,SAAS"}
|
package/helpers/strings.cjs
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
|
|
2
|
+
const require_temporal = require('./temporal.cjs');
|
|
2
3
|
let json_stringify_safe = require("json-stringify-safe");
|
|
3
4
|
json_stringify_safe = require_rolldown_runtime.__toESM(json_stringify_safe);
|
|
4
5
|
let hash_js = require("hash.js");
|
|
5
6
|
hash_js = require_rolldown_runtime.__toESM(hash_js);
|
|
6
7
|
let ms = require("ms");
|
|
7
8
|
ms = require_rolldown_runtime.__toESM(ms);
|
|
9
|
+
let temporal_polyfill = require("temporal-polyfill");
|
|
8
10
|
|
|
9
11
|
//#region src/helpers/strings.ts
|
|
10
12
|
const { sha256 } = hash_js.default;
|
|
@@ -61,13 +63,17 @@ const periods = [
|
|
|
61
63
|
/**
|
|
62
64
|
* Convert a given `Date`, `number`, or `ms`-compatible `string` to a
|
|
63
65
|
* Inngest sleep-compatible time string (e.g. `"1d"` or `"2h3010s"`).
|
|
64
|
-
*
|
|
65
|
-
* Can optionally provide a `now` date to use as the base for the calculation,
|
|
66
|
-
* otherwise a new date will be created on invocation.
|
|
67
66
|
*/
|
|
68
67
|
const timeStr = (input) => {
|
|
69
68
|
if (input instanceof Date) return input.toISOString();
|
|
70
|
-
|
|
69
|
+
if (require_temporal.isTemporalInstant(input) || require_temporal.isTemporalZonedDateTime(input)) return require_temporal.getISOString(input);
|
|
70
|
+
let milliseconds;
|
|
71
|
+
if (require_temporal.isTemporalDuration(input)) milliseconds = input.total({
|
|
72
|
+
unit: "milliseconds",
|
|
73
|
+
relativeTo: temporal_polyfill.Temporal.Now.plainDateTimeISO("UTC").toString()
|
|
74
|
+
});
|
|
75
|
+
else if (typeof input === "string") milliseconds = (0, ms.default)(input);
|
|
76
|
+
else milliseconds = input;
|
|
71
77
|
const [, timeStr$1] = periods.reduce(([num, str], [suffix, period]) => {
|
|
72
78
|
const numPeriods = Math.floor(num / period);
|
|
73
79
|
if (numPeriods > 0) return [num % period, `${str}${numPeriods}${suffix}`];
|