Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions js/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,29 +7,29 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.3.0] - 2026-10-26

### Added

- Add optional `delete`, `deleteMany`, and `deleteBefore` pilot interceptors for job deletion through the client and job cleaner. Hooks run within the deletion transaction and can extend or replace the standard deletion. [PR #1502](https://github.com/riverqueue/river/pull/1502).
- Add `@riverqueue/driver-knex` for inserting jobs on Postgres inside Knex transactions, including batches, unique jobs, and nested savepoints. Configure its `knexTransactionAdapter` on `PgDriver` to use native Knex transactions with `completeTx` in workers. [PR #1516](https://github.com/riverqueue/river/pull/1516).
- Support native Prisma interactive transactions with `completeTx` in workers and `{ tx }` on Postgres client operations. Configure `prismaTransactionAdapter` from `@riverqueue/driver-prisma` on `PgDriver` to commit application writes and job completion together. [PR #1517](https://github.com/riverqueue/river/pull/1517).
- Support Node.js 24 across all packages. On runtimes without native `Temporal`, preload an application-provided polyfill before importing River, including in worker threads. River validates runtime support on library import and never installs or replaces a global polyfill. The standalone `riverqueue` CLI supplies its own polyfill when needed. Node.js 26 uses native `Temporal`.
- Support Node.js 24 across all packages. On runtimes without native `Temporal`, preload an application-provided polyfill before importing River, including in worker threads. River validates runtime support on library import and never installs or replaces a global polyfill. The standalone `riverqueue` CLI supplies its own polyfill when needed. Node.js 26 uses native `Temporal`. [PR #1497](https://github.com/riverqueue/river/pull/1497), [PR #1548](https://github.com/riverqueue/river/pull/1548).

### Changed

- **Breaking:** Resumable steps can no longer be nested. Calls fail before running child callbacks, preventing unreachable resume points and rolled-back parent checkpoints from being saved again. [PR #1534](https://github.com/riverqueue/river/pull/1534).
- Like River for Go, `insertMany` rejects an empty batch with a `ValidationError` instead of returning an empty result. [PR #1504](https://github.com/riverqueue/river/pull/1504).
- **Breaking:** Like River for Go, `insertMany` rejects an empty batch with a `ValidationError` instead of returning an empty result. [PR #1504](https://github.com/riverqueue/river/pull/1504).
- Like River for Go, the client no longer caps `maxAttempts` at 32767: SQLite stores wider attempt counts, and the Postgres and Prisma drivers clamp `maxAttempts` to their 16-bit column on insert instead of failing. [PR #1504](https://github.com/riverqueue/river/pull/1504).
- Like River for Go's `ResumableStep`, a failed resumable step records the step's own error as the attempt's error instead of wrapping it in a `LifecycleError`. [PR #1504](https://github.com/riverqueue/river/pull/1504).

### Fixed

- Refresh a durable periodic job's saved row only after its next run time is loaded at startup or committed. When a startup write rolled back, keep-alive could revive an expired row, and the next leader enqueued every run since the row's old next run time. [PR #1540](https://github.com/riverqueue/river/pull/1540).
- Fail retries that omit a saved cursor-only step, while preserving their checkpoints for recovery. Jobs with an existing step marker retain their behavior, including legacy stale cursor entries. [PR #1534](https://github.com/riverqueue/river/pull/1534).

- Replace whole top-level metadata values on SQLite, including JSON null, matching Postgres. Completed resumable cursor steps no longer run again because of stale cursor entries. [PR #1533](https://github.com/riverqueue/river/pull/1533).

- Preserve first-step resumable cursors on failure and step progress on snooze. Transactional checkpoints no longer leak into deferred updates after rollback or a failed write; rolling back a successful checkpoint write may replay earlier unpersisted steps.

- Worker threads respect cancellation received while loading a handler module, before invoking its handler.
- Preserve first-step resumable cursors on failure and step progress on snooze. Transactional checkpoints no longer leak into deferred updates after rollback or a failed write; rolling back a successful checkpoint write may replay earlier unpersisted steps. [PR #1521](https://github.com/riverqueue/river/pull/1521).
- Worker threads respect cancellation received while loading a handler module, before invoking its handler. [PR #1497](https://github.com/riverqueue/river/pull/1497).
- Like River for Go, a leader whose renewal finds its term gone, because it expired or another process replaced it, gives up leadership at once instead of running maintenance until its local deadline passes. [PR #1504](https://github.com/riverqueue/river/pull/1504).
- `updateQueue` raising a full queue's `maxWorkers` starts jobs at once instead of waiting for a running job to finish. [PR #1504](https://github.com/riverqueue/river/pull/1504).

Expand Down
8 changes: 4 additions & 4 deletions js/cli/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@riverqueue/cli",
"version": "0.2.0",
"version": "0.3.0",
"description": "Command-line migrations, benchmarks, and upgrade codemods for River TypeScript.",
"type": "module",
"sideEffects": [
Expand Down Expand Up @@ -50,10 +50,10 @@
},
"dependencies": {
"@js-temporal/polyfill": "^0.5.1",
"@riverqueue/driver-pg": "workspace:0.2.0",
"@riverqueue/migrate": "workspace:0.2.0",
"@riverqueue/driver-pg": "workspace:0.3.0",
"@riverqueue/migrate": "workspace:0.3.0",
"pg": "^8.23.1",
"riverqueue": "workspace:0.2.0"
"riverqueue": "workspace:0.3.0"
},
"peerDependencies": {
"@types/node": ">=24",
Expand Down
6 changes: 3 additions & 3 deletions js/driver/knex/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@riverqueue/driver-knex",
"version": "0.2.0",
"version": "0.3.0",
"description": "Knex driver for the riverqueue TypeScript client.",
"type": "module",
"sideEffects": false,
Expand Down Expand Up @@ -45,12 +45,12 @@
"peerDependencies": {
"knex": "^3.1.0",
"pg": "^8.0.0",
"riverqueue": "workspace:0.2.0"
"riverqueue": "workspace:0.3.0"
},
"devDependencies": {
"knex": "^3.1.0",
"pg": "^8.23.1",
"riverqueue": "workspace:0.2.0",
"riverqueue": "workspace:0.3.0",
"typescript": "^6.0.3"
},
"keywords": [
Expand Down
6 changes: 3 additions & 3 deletions js/driver/pg/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@riverqueue/driver-pg",
"version": "0.2.0",
"version": "0.3.0",
"description": "Complete node-postgres backend for River's TypeScript runtime.",
"type": "module",
"sideEffects": false,
Expand Down Expand Up @@ -48,7 +48,7 @@
"peerDependencies": {
"@types/pg": ">=8",
"pg": ">=8.0.0",
"riverqueue": "workspace:0.2.0"
"riverqueue": "workspace:0.3.0"
},
"peerDependenciesMeta": {
"@types/pg": {
Expand All @@ -58,7 +58,7 @@
"devDependencies": {
"@types/pg": "^8.23.1",
"pg": "^8.23.1",
"riverqueue": "workspace:0.2.0",
"riverqueue": "workspace:0.3.0",
"typescript": "^6.0.3"
},
"keywords": [
Expand Down
6 changes: 3 additions & 3 deletions js/driver/prisma/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@riverqueue/driver-prisma",
"version": "0.2.0",
"version": "0.3.0",
"description": "Prisma driver for the riverqueue TypeScript client.",
"type": "module",
"sideEffects": false,
Expand Down Expand Up @@ -44,13 +44,13 @@
},
"peerDependencies": {
"@prisma/client": ">=5.0.0",
"riverqueue": "workspace:0.2.0"
"riverqueue": "workspace:0.3.0"
},
"devDependencies": {
"@prisma/adapter-pg": "7.10.1",
"@prisma/client": "7.10.1",
"prisma": "7.10.1",
"riverqueue": "workspace:0.2.0",
"riverqueue": "workspace:0.3.0",
"typescript": "^6.0.3"
},
"keywords": [
Expand Down
8 changes: 4 additions & 4 deletions js/driver/sqlite/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@riverqueue/driver-sqlite",
"version": "0.2.0",
"version": "0.3.0",
"description": "First-party node:sqlite backend for River.",
"type": "module",
"sideEffects": false,
Expand Down Expand Up @@ -46,17 +46,17 @@
},
"peerDependencies": {
"@types/node": ">=24",
"riverqueue": "workspace:0.2.0"
"riverqueue": "workspace:0.3.0"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
},
"devDependencies": {
"@riverqueue/migrate": "workspace:0.2.0",
"@riverqueue/migrate": "workspace:0.3.0",
"@types/node": "^26.6.5",
"riverqueue": "workspace:0.2.0"
"riverqueue": "workspace:0.3.0"
},
"keywords": [
"river",
Expand Down
8 changes: 4 additions & 4 deletions js/migrate/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@riverqueue/migrate",
"version": "0.2.0",
"version": "0.3.0",
"description": "Canonical River database migrations for JavaScript and TypeScript.",
"type": "module",
"sideEffects": false,
Expand Down Expand Up @@ -46,18 +46,18 @@
},
"peerDependencies": {
"@types/node": ">=24",
"riverqueue": "workspace:0.2.0"
"riverqueue": "workspace:0.3.0"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
},
"devDependencies": {
"@riverqueue/driver-pg": "workspace:0.2.0",
"@riverqueue/driver-pg": "workspace:0.3.0",
"@types/node": "^26.6.5",
"pg": "^8.23.1",
"riverqueue": "workspace:0.2.0"
"riverqueue": "workspace:0.3.0"
},
"keywords": [
"river",
Expand Down
2 changes: 1 addition & 1 deletion js/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "riverqueue",
"version": "0.2.0",
"version": "0.3.0",
"description": "TypeScript implementation of River, a fast and reliable background job system.",
"type": "module",
"sideEffects": [
Expand Down
28 changes: 14 additions & 14 deletions js/pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions js/test/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@riverqueue/test",
"version": "0.2.0",
"version": "0.3.0",
"description": "Typed test helpers for River jobs, workers, and clients.",
"type": "module",
"sideEffects": false,
Expand Down Expand Up @@ -44,10 +44,10 @@
"provenance": true
},
"peerDependencies": {
"riverqueue": "workspace:0.2.0"
"riverqueue": "workspace:0.3.0"
},
"devDependencies": {
"riverqueue": "workspace:0.2.0"
"riverqueue": "workspace:0.3.0"
},
"keywords": [
"river",
Expand Down
10 changes: 5 additions & 5 deletions js/worker-threads/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@riverqueue/worker-threads",
"version": "0.2.0",
"version": "0.3.0",
"description": "Optional bounded worker-thread executor for River TypeScript.",
"type": "module",
"sideEffects": [
Expand Down Expand Up @@ -48,18 +48,18 @@
},
"peerDependencies": {
"@types/node": ">=24",
"riverqueue": "workspace:0.2.0"
"riverqueue": "workspace:0.3.0"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
},
"devDependencies": {
"@riverqueue/driver-sqlite": "workspace:0.2.0",
"@riverqueue/migrate": "workspace:0.2.0",
"@riverqueue/driver-sqlite": "workspace:0.3.0",
"@riverqueue/migrate": "workspace:0.3.0",
"@types/node": "^26.6.5",
"riverqueue": "workspace:0.2.0"
"riverqueue": "workspace:0.3.0"
},
"keywords": [
"river",
Expand Down
Loading