5c8f50e1 Thanks @scottnuma! - Accept Temporal.Duration, Temporal.Instant, and Temporal.ZonedDateTime (and their *Like variants) wherever a timeout or sleep duration is taken: step.sleep(), step.waitForEvent(), step.waitForSignal(), step.invoke(), and function-level cancelOn timeouts. Durations are treated as relative waits; instants and zoned date-times as absolute deadlines.60cda73f Thanks @mar-inngest! - Fix Connect shutdown getting stuck when a late lease-extension ACK recreates a stale in-flight lease entry after request completion or lease loss#1492 68dcd8aa Thanks @amh4r! - Reduce response info when unauthorized
#1490 a8027116 Thanks @amh4r! - Authed introspection returns partial signing key hash
#1479 6b9769ca Thanks @scottnuma! - Fix step.sendSignal() return type to match runtime: Promise<InngestApi.SendSignalResponse> ({ runId: string | undefined }) instead of Promise<null>
#1483 d0a59629 Thanks @Linell! - Fix run IDs not URL encoded in Durable Endpoints
#1481 970ded9b Thanks @Linell! - Improves HMAC signature verification by using a constant-time comparison, which mitigates a potential timing-based signature-recovery attack against the request signature. Also improves handling of timestamps in signatures, including malformed or future-dated values.
#1472 9df36dee Thanks @Linell! - Fix empty body on Vercel serverless Node handlers
#1482 e34972d3 Thanks @Linell! - Hash the signing key used when exporting OTel traces
#1460 ce5110de Thanks @amh4r! - Fix multi-byte UTF-8 chars corrupted when split over chunks
#1461 d75b59ce Thanks @amh4r! - Fix CountQueuingStrategy erroring when stubbed in edge runtimes
#1366 aca72f88 Thanks @Linell! - Fix extendProvider() for OTel SDK v2 where addSpanProcessor() was removed.
Move @opentelemetry/auto-instrumentations-node and related imports from static top-level to dynamic await import() inside createProvider(). This prevents module-level monkey-patching side effects that broke inngest.send() when combined with host app OTel setups (e.g. Sentry). See #1324.
#1457 d151b404 Thanks @amh4r! - Fix using CountQueuingStrategy when not available
#1455 15495e03 Thanks @amh4r! - Fix dependencyInjection not working statically at function level
#1435 d8fc84b2 Thanks @KiKoS0! - Fix Connect worker blocking flushing & termination issues
#1437 ad7ae27a Thanks @amh4r! - Fix worker thread strategy missing graceful shutdown
#1420 38c6e27c Thanks @BrunoScheufler! - Connect: Refactor internal architecture
#1412 556a32eb Thanks @rhino1998! - Extended Traces: Include step attributes in userland spans
#1414 7e699a06 Thanks @rhino1998! - Step Metadata: Collapse step/step_attempt behavior
#1418 31300308 Thanks @BrunoScheufler! - Fix graceful shutdown cleanup in case of draining connection replacement
494364eb Thanks @jpwilliams! - Fix type exports not being available for composite: true projects
627c0720 Thanks @jacobheric! - Adds first class, internal realtime support with improved DX for publishing and subscribing to typed channels and topics. See: https://www.inngest.com/docs/features/realtime#1395 c4861ff8 Thanks @amh4r! - Error when function config is v3-style
#1389 905d4b24 Thanks @amh4r! - Ensure we track retries when creating a new run
#1396 9baa304f Thanks @amh4r! - Fix onRunError hook's isFinalAttempt not true on final attempt
#1387 983f527b Thanks @amh4r! - Fix checkpointing maxRuntime causing function run hang
#1387 983f527b Thanks @amh4r! - Fallback to async flow on checkpoint error
e8024132 Thanks @amh4r! - See list of changes in the migration guide: https://www.inngest.com/docs/reference/typescript/v4/migrations/v3-to-v4#1359 b4d9833f Thanks @Linell! - fix: use deterministic IDs for correct checkpointed parenting
#1370 037336dc Thanks @amh4r! - Fix mishandling drain message (Connect only)
#1350 470fdb98 Thanks @amh4r! - Fix false NESTING_STEPS error
#1356 2e961c21 Thanks @amh4r! - Fix checkpointing maxRuntime causing function run hang
4f45adb7 Thanks @jakobevangelista! - Fix signing key propagation from serve() options to InngestApi for outgoing API calls#1258 e17a148f Thanks @amh4r! - Connect: add worker thread support
#1313 bbdab785 Thanks @tonyhb! - Add step names and IDs to step not found error
#1306 b74bd1b9 Thanks @amh4r! - Add a log before the 405 response
#1288 daf858f0 Thanks @jpwilliams! - Add the ability to create Durable Endpoint Proxies, used to redirect to Inngest run results using a user's own domain.
import { Inngest, step } from "inngest";
import { endpointAdapter } from "inngest/edge";
const inngest = new Inngest({
id: "bun-sync-example",
endpointAdapter: endpointAdapter.withOptions({
asyncRedirectUrl: "/poll",
}),
});
#1297 32b59507 Thanks @ptts! - Fix extendProvider() failing to extend existing OTel providers by unwrapping the ProxyTracerProvider returned by trace.getTracerProvider(). Previously, the proxy wrapper hid the underlying provider's addSpanProcessor method, causing "auto" mode to fall through to createProvider() and register duplicate instrumentations.
#1292 9c8f5d94 Thanks @jpwilliams! - Fix Durable Endpoints not capturing and obeying step plan forcing, resulting in strange behaviour during parallel flows
#1285 9a7b0528 Thanks @jpwilliams! - Handle checkpointing failures more gracefully across async checkpointing and Durable Endpoints
8e377c27 Thanks @jpwilliams! - Add isInngestRequest() export for lightly checking if a Request looks like it comes from Inngest#1269 8e377c27 Thanks @jpwilliams! - Stabilise execution version when switching from sync to async
#1269 8e377c27 Thanks @jpwilliams! - Use endpoint adapters for experimental Durable Endpoints instead of wrappers
#1250 ad078067 Thanks @Linell! - NonRetriableError && RetryAfterError instanceof checks help resolve issues of errors not working as expected in monorepos.
#1168 4371be38 Thanks @Linell! - Add Anthropic Open Telemetry instrumentation so that calls to the Anthropic API are automatically captured.
#1269 8e377c27 Thanks @jpwilliams! - Rename http/run.started event created from Durable Endpoints to inngest/http.request
#1266 b6361ee1 Thanks ! - Fix issue where middleware transformOutput is not called.
#1226 dab4607c Thanks @jpwilliams! - Adds the ability to configure the number of bufferedSteps and maxInterval when checkpointing.
import { inngest } from "./client";
export const helloWorld = inngest.createFunction(
{
id: "hello-world",
checkpointing: { bufferedSteps: Infinity, maxInterval: "5s" },
},
{ event: "demo/event.sent" },
async ({ event
#1267 093c4f96 Thanks @amh4r! - Fix not properly handling transfer chunked requests
#1233 df7d3023 Thanks @Linell! - Lazily load ulid to avoid issues in edge environments.
#1257 0eb6b473 Thanks @Linell! - Use native Web Crypto API for HMAC-SHA256 signing with hash.js fallback
This change improves performance by using the native Web Crypto API when available for request signature verification. Falls back to hash.js for environments without crypto support.
#1226 dab4607c Thanks @jpwilliams! - Correctly access parallel step IDs from resumed sync requests
#1226 dab4607c Thanks @jpwilliams! - Default to v2 execution version when checkpointing
#1244 f5c565e8 Thanks @jpwilliams! - Ensure execution version doesn't slide when going to/from checkpointing
#1245 6694bccc Thanks @jpwilliams! - Fix async data fetching not happening with optimizedParallelism: true
#1215 29307e2e Thanks @rhino1998! - Fix step.fetch response status code
#1222 ecf46a58 Thanks @amh4r! - Remove "authentication_succeeded: false" when responding to unsigned requests
#1214 326fe06b Thanks @djfarrelly! - Fix Connect heartbeater stops too soon during shutdown
28ffbc89 Thanks @jpwilliams! - Bring checkpointing out of experimental90b14e92 Thanks @jpwilliams! - Add experimentalCheckpointing: { maxRuntime?: number | string | Temporal.DurationLike } to set max runtime duration before re-entry during checkpointing#1190 cb286c5e Thanks @jpwilliams! - Recover from checkpointing failures by falling back to async mode
#1179 9c88fd19 Thanks @jpwilliams! - Fix sync execution looking for step in the wrong place
#1173 75820c72 Thanks @jpwilliams! - Add async checkpointing to functions and clients. Only allows checkpointing after every step (maxSteps: 1) currently.
Can be enabled on the client:
import { Inngest } from "inngest";
const inngest = new Inngest({
id: "...",
experimentalCheckpointing: true,
});
...or on each function...
inngest.createFunction(
{
id: "..."
ef6fd33d Thanks @Linell! - Updated OpenTelemetry dependencies to support broader version ranges and adapted code for OTEL 2.x API compatibilty#1155 9fa34d12 Thanks @mar-inngest! - Connect - Adding support for worker concurrency limits
#1160 ab446473 Thanks @jpwilliams! - Widen zod dependency range to support v3/v4 across libraries
#1165 b5139f04 Thanks @jpwilliams! - Remove setImmediate use (Node only)
ead9837b Thanks @jpwilliams! - Add experimental APIs for supporting synchronous execution#1149 9d5d7131 Thanks @Linell! - Refactor otelMiddleware to extendedTracesMiddleware so that its purpose is more easily understood
#1150 68e67d80 Thanks @faizanu94! - Fix custom loggers dumbly waiting 1s to flush; they now correctly call flush() if available
#1148 9cf36f4d Thanks @BrunoScheufler! - Include retry count in the error message if gracefully flushing connect worker progress fails after all attempts
#1139 6366f557 Thanks @rhino1998! - Add userland ID & index to Ops
#1133 e7494a67 Thanks @jpwilliams! - Export the full runtime enum for ConnectionState from "inngest/connect"
#1129 7a7c2f5f Thanks @de-tester! - Expose types that are used for step result signature
c2b249aa Thanks @jpwilliams! - Build targets no specific platform, solving some issues with edge runtimes where the library would internally attempt to require() some node:* dependencies#1114 c191c93a Thanks @jpwilliams! - Fix .fromSchema()-defined schemas not being compatible with @inngest/middleware-validation
#1116 aa4be8f1 Thanks @jacobheric! - Amended a comment for batch event timeouts
#1102 6507c0cd Thanks @jpwilliams! - Add InngestFunctionReference.Like for comparing referenced functions across versions
#1102 6507c0cd Thanks @jpwilliams! - Add Standard Schema to referenceFunction()
1cf1e525 Thanks @Linell! - Add support for the StepFailed opcode, which is used to signify that a function has failed in a permanent way and should not be retried.6557014 Thanks @jpwilliams! - Fix bad release commandd081d36 Thanks @jpwilliams! - Fix legacy exports when using older module resolution#1083 2f24a09 Thanks @jpwilliams! - Fix "inngest/connect" not being exported in JSR package
#1083 2f24a09 Thanks @jpwilliams! - Export some internal packages under "inngest/internals" for @inngest/test use
#920 0da1995 Thanks @jpwilliams! - Added isInngest, isInngestFunction, and isInngestMiddleware, runtime helpers to check if a given object is the expected type.
import { isInngest, isInngestFunction, isInngestMiddleware } from "inngest";
const objIsInngest = isInngest(someObj);
const objIsInngestFunction = isInngestFunction(someObj);
const objIsInngestMiddleware = isInngestMiddleware(someObj);
#920 0da1995 Thanks @jpwilliams! - Add support for Standard Schema when specifying event types.
#920 0da1995 Thanks @jpwilliams! - Dropped support for Node 14, 16, and 18, as they are out of LTS
#920 0da1995 Thanks @jpwilliams! - inngest no longer requires an earlier version of zod@3.22.0 as a peer dependency
#920 0da1995 Thanks @jpwilliams! - Now builds separate EJS and CSM packages, which should alleviate some issues attempting to get the current single build to satisfy all conditions.
Most notably, pure ESM consumers should now have a significantly easier time using the library.
#920 0da1995 Thanks @jpwilliams! - Use Symbol.toStringTag for *.Like types, making them much more reliable across versions.
This means you can check for the type of value against Inngset values much more easily:
type IsInngest<T> =
3e5bf652 Thanks @tonyhb! - Allow passing publish options to step.ai.infer(), automatically publishing to realtime channel/topics8ba5486 Thanks @jpwilliams! - SDK appropriately sets "inngest.traceref" for userland otel spans#1045 ec2320a Thanks @jpwilliams! - Add type to step.sendEvent() to differentiate it from other step.run()-based steps
#1050 ac9748f Thanks @lkasinathan! - Introduces support for the if expression on the batchEvents configuration. This can be used to determine which events are eligible for batching. For more details, check out the batching documentation!
abb0e8e Thanks @charlypoly! - Revert "obscure "node:async_hooks" import from bundlers"#1284 5717c64b Thanks @jpwilliams! - Add a Durable Endpoints Next.js Adapter
// app/api/my-endpoint/route.ts
import { Inngest, step } from "inngest";
import { endpointAdapter } from "inngest/next";
const inngest = new Inngest({
id: "my-app",
endpointAdapter,
});
export const GET = inngest.endpoint(async (req) => {
const foo = await step.run("my-step", () => ({ foo: "bar" }));
return new Response(`Result: ${JSON.stringify(foo)}`);
});
If checkpointing: true is used, bufferedSteps defaults to 1 and no maxInterval is set.
#1093 ad044e05 Thanks @jpwilliams! - Add realtime client methods to inngest:
inngest.realtime.publish()inngest.realtime.getSubscriptionToken()step.realtime.publish()import { EventSchemas } from "inngest";
import { z } from "zod";
const schemas = new EventSchemas().fromSchema({
"demo/event.sent": z.object({
username: z.string(),
}),
});This entrypoint can be used for both Zod v3 and v4 schemas, as well as a multitude of others.
.fromZod() is still available, which provides some more nuanced use cases but will is deprecated in favor of .fromSchema().
In addition, logged objects that are these types now show the type instead of just [object Object], e.g. [object Inngest.App].
#920 0da1995 Thanks @jpwilliams! - Middleware now runs like onion layers. For example { middleware: [foo, bar] } now runs:
foo.transformInputbar.transformInputfoo.beforeMemoizationbar.beforeMemoizationbar.afterMemoizationfoo.afterMemoizationfoo.beforeExecutionbar.beforeExecutionbar.afterExecutionfoo.afterExecutionbar.transformOutputfoo.transformOutputfoo finishedbar finishedfoo beforeResponsebar beforeResponseThis should enable middleware to behave correctly when it has to wrap other middleware.
#920 0da1995 Thanks @jpwilliams! - Drop support for TypeScript 4.7, 4.8, 4.9, 5.0, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6 and 5.7