Skip to content

Changelog

v0.9.4

What’s Changed

Runtime Safety

  • Mutating client methods (startJobChain, startJobChains, deleteJobChains, triggerJob, completeJobChain) now enforce that a transaction context from runInTransaction is provided at runtime, throwing TransactionContextRequiredError if omitted. This matches the existing TypeScript type requirements and ensures consistent behavior for JavaScript callers.
  • New exported error class TransactionContextRequiredError for specific error handling.

Bug Fixes

  • Dashboard chain-delete and job-trigger routes now correctly wrap mutating calls in a transaction context.

Packages

All packages released at 0.9.4: queuert, @queuert/postgres, @queuert/sqlite, @queuert/redis, @queuert/nats, @queuert/otel, @queuert/dashboard.

v0.9.3

What’s Changed

Improvements

  • Simplified JobAttemptMiddleware type signature — The second type parameter (TJobTypeDefinitions) has been removed from JobAttemptMiddleware and JobTypeProcessorDefaults. Middleware definitions are now simpler: use JobAttemptMiddleware<typeof stateAdapter> instead of JobAttemptMiddleware<typeof stateAdapter, JobTypeRegistryDefinitions<typeof registry>>. The JobTypeRegistryDefinitions import is no longer needed for middleware.

  • Fixed ResolvedJobChain output type — Intermediate chain steps with output: undefined no longer leak undefined into the final chain’s completed output type.

Packages

All packages released at 0.9.3: queuert, @queuert/postgres, @queuert/sqlite, @queuert/redis, @queuert/nats, @queuert/otel, @queuert/dashboard.

v0.9.2

What’s Changed

Bug Fixes

  • Fix broken package exports in published npm packages — tsdown’s devExports writes source paths to exports and dist paths to publishConfig.exports, but npm publish (used by changeset publish) does not apply publishConfig overrides. Switched to pnpm publish which handles this natively.

Packages

All packages released at 0.9.2: queuert, @queuert/postgres, @queuert/sqlite, @queuert/redis, @queuert/nats, @queuert/otel, @queuert/dashboard.

v0.9.1

What’s Changed

Bug Fixes

  • Fix broken package exports in published npm packages — publishConfig overrides (e.g. exports pointing to dist/) were not being applied during changeset publish, causing v0.9.0 packages to be unusable

Packages

All packages released at 0.9.1: queuert, @queuert/postgres, @queuert/sqlite, @queuert/redis, @queuert/nats, @queuert/otel, @queuert/dashboard.

v0.9.0

What’s Changed

Features

  • Richer error messages: Failed jobs now store the full stack trace and custom Error properties (e.g., code, statusCode) instead of just [object Object] or a bare message string. Long errors are truncated at 10,000 characters.
  • New observability events: jobChainDeleted and jobTriggered events are now emitted through logging, OpenTelemetry, and custom observability adapters.
  • Safer triggerJob: Now guards against non-pending jobs (AND status = 'pending') and uses row-level locking (FOR UPDATE) in Postgres to prevent race conditions.

Breaking Changes

  • Default Postgres schema changed: The Postgres adapter now defaults to schema: "public" with tablePrefix: "queuert_" (previously schema: "queuert" with no prefix). Pass { schema: "queuert", tablePrefix: "" } to createPgStateAdapter to preserve existing behavior.
  • Removed type exports: NavigationMap, BaseNavigationMap, BaseNavigationEntry, JobTypeRegistryNavigation, ChainJobTypeNames, ContinuationJobTypes, EntryJobTypeDefinitions, BlockedJobTypeNames, ChainTypesReaching, JobTypeProcessorRegistryNavigation, processorNavigationSymbol. Use JobTypeNames, JobTypeEntryNames, and JobTypeProperty as replacements.
  • Union-based merged registries: Merged registry definitions are now a union type instead of an intersection.

Packages

All packages released at 0.9.0: queuert, @queuert/postgres, @queuert/sqlite, @queuert/redis, @queuert/nats, @queuert/otel, @queuert/dashboard.

v0.8.1

What’s Changed

Bug Fixes

  • Dashboard: Fixed job detail continuation lookup to use a targeted query instead of fetching the entire chain, significantly improving performance for long chains.
  • Dashboard: Fixed a race condition where changing filters while a “load more” request was in-flight could append stale results in the chain and job list views.
  • Dashboard: The leasedBy badge in the job list now only appears for running jobs.
  • Dashboard: Fixed TypeScript type inference for createDashboard — the client option now preserves generic types instead of requiring Client<any, any>.

Packages

All packages released at 0.8.1: queuert, @queuert/postgres, @queuert/sqlite, @queuert/redis, @queuert/nats, @queuert/otel, @queuert/dashboard.

v0.8.0

What’s Changed

Breaking Changes

  • Renamed worker and client options for clarity: registry → jobTypeRegistry, processorRegistry → jobTypeProcessorRegistry, processDefaults → jobTypeProcessorDefaults. The InProcessWorkerProcessDefaults type is now JobTypeProcessorDefaults. mergeJobTypeRegistries and mergeJobTypeProcessorRegistries now take { slices: [...] } instead of positional args.
  • The Job type now has a 5th type parameter TOutput. Completed jobs expose an output field.
  • Dashboard now takes a Client instance instead of raw adapters.

Features

  • triggerJob API: New client method to trigger a pending job immediately, bypassing its scheduled time. Dashboard also gains a “Trigger” button for pending jobs.
  • jobChainTypeName filter on listJobs: Query jobs scoped to chains of a specific type.
  • Chain deletion in dashboard: Delete job chains with a confirmation dialog.
  • Merged registry rejection: createJobTypeProcessorRegistry now throws a clear TypeError when passed a merged registry.

Bug Fixes

  • continueWith now uses distributive conditional types for correct type checking across union job types.
  • completeJobChain rejects un-narrowed union jobs, preventing ambiguous completions.

Packages

All packages released at 0.8.0: queuert, @queuert/postgres, @queuert/sqlite, @queuert/redis, @queuert/nats, @queuert/otel, @queuert/dashboard.

v0.7.0

What’s Changed

Features

  • Savepoint support for TransactionHooks — New withSavepoint(fn) and createSavepoint() methods enable partial rollback of buffered side effects (notifications, observability events) within a transaction without discarding the entire transaction’s work. Hook definitions can now provide a checkpoint callback via the new optional HookDef.checkpoint field.
  • HookDef and TransactionHooksSavepoint types are now exported from @queuert/core.

Bug Fixes

  • Lease renewal scoped to staged mode — Lease renewal after getJobBlockers no longer runs in atomic/deferred modes where the transaction stays open and renewal is unnecessary.
  • Error handler transaction rollback — When the error handler’s runInTransaction fails, prepare and complete transactions are now properly rejected (rolled back) instead of resolved, preventing jobs from being left in inconsistent state.
  • Default TJobId type corrected — PgStateAdapter and SqliteStateAdapter type defaults changed from string to UUID, matching actual runtime behavior.

Breaking Changes

  • StateAdapter.withSavepoint is now a required method (previously optional) with a simplified positional signature: withSavepoint(txCtx, fn). Custom state adapter implementations must add this method.
  • Default TJobId generic on PgStateAdapter and SqliteStateAdapter changed from string to UUID. Code relying on the previous string default may see new type errors.

Packages

All packages released at 0.7.0: queuert, @queuert/postgres, @queuert/sqlite, @queuert/redis, @queuert/nats, @queuert/otel, @queuert/dashboard.

v0.6.0

What’s Changed

Features

  • Batch startJobChains API — Create multiple job chains in a single operation via client.startJobChains(), with full type-safe return values and optimized database round-trips for PostgreSQL (unnest + CTE-based batch inserts)
  • Savepoint-protected user callbacks — prepare and complete callbacks during job processing now run inside database savepoints on PostgreSQL. If a user callback executes a failing SQL statement, only the savepoint is rolled back — the outer transaction remains usable for error handling (reschedule, retry, etc.)
  • Optional withSavepoint on StateAdapter — Custom state adapter authors can implement withSavepoint to opt into savepoint protection. The PostgreSQL adapter implements this automatically

Breaking Changes

  • StateAdapter interface updated — createJob/addJobBlockers (singular) replaced by createJobs/addJobsBlockers (plural/batched). Custom state adapter implementations must update to the new array-based signatures. The official PostgreSQL and SQLite adapters are already updated
  • Removed type exports — CompleteJobChainResult and JobChainCompleteOptions are no longer exported from queuert (now internal types prefixed with _)

Packages

All packages released at 0.6.0: queuert, @queuert/postgres, @queuert/sqlite, @queuert/redis, @queuert/nats, @queuert/otel, @queuert/dashboard.

v0.5.1

What’s Changed

Features

  • Compile-time validation for job type definitions — New ValidatedJobTypeDefinitions and JobTypeDefinitionErrors types catch definition errors (missing output schemas, invalid blocker references, unknown type names) as TypeScript errors instead of accepting them silently
  • Compile-time validation for createInProcessWorker — Processor registries containing job types unknown to the client are now rejected at compile time instead of only failing at runtime
  • Validation adapter examples updated to use the new compile-time validation types

Packages

All packages released at 0.5.1: queuert, @queuert/postgres, @queuert/sqlite, @queuert/redis, @queuert/nats, @queuert/otel, @queuert/dashboard.