Skip to content

Commit 5adb3a0

Browse files
committed
Add configurable job timeouts and rename processingInterval to pollInterval
1 parent 2c97993 commit 5adb3a0

File tree

18 files changed

+255
-21
lines changed

18 files changed

+255
-21
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
---
2+
"@vorsteh-queue/core": minor
3+
"@vorsteh-queue/adapter-drizzle": minor
4+
"@vorsteh-queue/adapter-prisma": minor
5+
---
6+
7+
Add configurable job timeouts and rename `processingInterval` to `pollInterval`.
8+
9+
**New Features:**
10+
11+
- **Configurable job timeouts**: Set `timeout: number` for specific timeout or `timeout: false` to disable timeout completely
12+
- **Job-specific timeout override**: Individual jobs can override queue default timeout settings
13+
- **Timeout field storage**: Job timeout configuration is now stored in job records for proper handling
14+
15+
**Breaking Changes:**
16+
17+
- **Renamed `processingInterval` to `pollInterval`**: More accurately describes the interval between queue polling cycles
18+
- **Database schema changes**: Added `timeout` column to queue_jobs table (JSONB field, nullable)
19+
20+
**Migration Guide:**
21+
22+
```typescript
23+
// Before
24+
const queue = new Queue(adapter, {
25+
name: "my-queue",
26+
processingInterval: 1000, // OLD
27+
})
28+
29+
// After
30+
const queue = new Queue(adapter, {
31+
name: "my-queue",
32+
pollInterval: 1000, // NEW
33+
})
34+
35+
// New timeout features
36+
await queue.add("long-job", payload, { timeout: false }) // Disable timeout
37+
await queue.add("quick-job", payload, { timeout: 5000 }) // 5 second timeout
38+
```
39+
40+
**Database Migration Required:**
41+
42+
- **Drizzle users**: Run migrations to add `timeout` column
43+
- **Prisma users**: Run `prisma db push` or `prisma migrate` to apply schema changes
44+
45+
**Examples:**
46+
47+
```typescript
48+
// Disable timeout for long-running data processing
49+
await queue.add("process-large-dataset", data, { timeout: false })
50+
51+
// Set specific timeout for API calls
52+
await queue.add("external-api-call", params, { timeout: 30000 })
53+
54+
// Use default timeout (30 seconds) - no change needed
55+
await queue.add("normal-job", payload)
56+
```
57+
58+
This release improves queue configuration clarity and provides flexible timeout control for different job types.

.github/workflows/ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,12 +100,12 @@ jobs:
100100
run: pnpm test:core
101101

102102
- name: Test Drizzle PostgreSQL (PGlite)
103-
run: pnpm test:drizzle-postgres
103+
run: pnpm test:drizzle
104104

105105
- name: Test Prisma (Testcontainers - Postgres)
106106
run: |
107107
pnpm -F adapter-prisma prisma:generate
108-
pnpm test:prisma-postgres
108+
pnpm test:prisma
109109
env:
110110
# Ensure Docker is available for Testcontainers
111111
TESTCONTAINERS_RYUK_DISABLED: true

examples/prisma-client-js/prisma/schema.prisma

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ model QueueJob {
2626
error Json? @db.JsonB
2727
result Json? @db.JsonB
2828
progress Int? @default(0)
29+
timeout Json? @db.JsonB
2930
cron String? @db.VarChar(255)
3031
repeatEvery Int? @map("repeat_every")
3132
repeatLimit Int? @map("repeat_limit")

examples/prisma-client/prisma/schema.prisma

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ model QueueJob {
3333
error Json? @db.JsonB
3434
result Json? @db.JsonB
3535
progress Int? @default(0)
36+
timeout Json? @db.JsonB
3637
cron String? @db.VarChar(255)
3738
repeatEvery Int? @map("repeat_every")
3839
repeatLimit Int? @map("repeat_limit")

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@
3232
"test": "vitest",
3333
"test:ui": "vitest --ui",
3434
"test:core": "pnpm -F core test",
35-
"test:drizzle-postgres": "pnpm -F adapter-drizzle test:postgres",
36-
"test:prisma-postgres": "pnpm -F adapter-prisma test:postgres",
35+
"test:drizzle": "pnpm -F adapter-drizzle test",
36+
"test:prisma": "pnpm -F adapter-prisma test",
3737
"cs": "changeset",
3838
"ci:publish": "pnpm -F adapter-prisma prisma:generate && pnpm build:pkg && pnpm publish -r --access public --publish-branch main && pnpm changeset tag",
3939
"ci:version": "pnpm changeset version && pnpm install --no-frozen-lockfile && git add ."

packages/adapter-drizzle/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@
5858
"format": "prettier --check . --ignore-path ../../.gitignore",
5959
"lint": "eslint .",
6060
"test": "vitest",
61-
"test:postgres": "vitest --run tests/drizzle-adapter.test.ts tests/utc-storage.test.ts tests/timezone-edge-cases.test.ts tests/progress.test.ts",
6261
"test:watch": "vitest --watch",
6362
"typecheck": "tsc --noEmit"
6463
},

packages/adapter-drizzle/src/postgres-adapter.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ export class PostgresQueueAdapter extends BaseQueueAdapter {
6565
repeatEvery: job.repeatEvery,
6666
repeatLimit: job.repeatLimit,
6767
repeatCount: job.repeatCount,
68+
timeout: job.timeout,
6869
})
6970
.returning()
7071

@@ -254,6 +255,7 @@ export class PostgresQueueAdapter extends BaseQueueAdapter {
254255
repeatEvery: job.repeatEvery ?? undefined,
255256
repeatLimit: job.repeatLimit ?? undefined,
256257
repeatCount: job.repeatCount ?? 0,
258+
timeout: job.timeout as number | false | undefined,
257259
}
258260
}
259261
}

packages/adapter-drizzle/src/postgres-schema.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export const queueJobs = pgTable(
2828
repeatEvery: integer("repeat_every"),
2929
repeatLimit: integer("repeat_limit"),
3030
repeatCount: integer("repeat_count").default(0),
31+
timeout: jsonb("timeout"),
3132
},
3233
(table) => [
3334
index("idx_queue_jobs_status_priority").on(

packages/adapter-prisma/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
"format": "prettier --check . --ignore-path ../../.gitignore",
4949
"lint": "eslint .",
5050
"prisma:generate": "prisma generate --schema=prisma/schema.prisma",
51-
"test:postgres": "vitest",
51+
"test": "vitest",
5252
"typecheck": "tsc --noEmit"
5353
},
5454
"prettier": "@vorsteh-queue/prettier-config",

packages/adapter-prisma/prisma/schema.prisma

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ model QueueJob {
3131
error Json? @db.JsonB
3232
result Json? @db.JsonB
3333
progress Int? @default(0)
34+
timeout Json? @db.JsonB
3435
cron String? @db.VarChar(255)
3536
repeatEvery Int? @map("repeat_every")
3637
repeatLimit Int? @map("repeat_limit")

0 commit comments

Comments
 (0)