@zmdb/jobs-sqlite 1.0.0-beta.1

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/README.md ADDED
@@ -0,0 +1,12 @@
1
+ # @zmdb/jobs-sqlite
2
+
3
+ Explicit SQLite persistence for `@zmdb/jobs`. Install `@zmdb/jobs@1.0.0-beta.1` and `@zmdb/jobs-sqlite@1.0.0-beta.1` on Node.js 26 or later.
4
+
5
+ `createSqliteJobStore(database)` borrows a public `SqliteDatabase` connection. Apply the exported `jobsSqliteMigrations` before starting workers. `sqliteJobEnqueuer(database)` enqueues on the caller's
6
+ transaction without beginning or ending it.
7
+
8
+ `createMemoryJobStore()` owns a fresh `node:sqlite` memory database and applies both migrations. Its `close()` and `Symbol.dispose` close the database once. Borrowed stores leave the caller's database
9
+ open.
10
+
11
+ Pass stores to `jobsExtension({ workers, schedulers, stores })` to close them after background work stops. Both stores implement the portable queue and renewable scheduler-lease ports. The package has
12
+ one root export and a required `@zmdb/jobs@1.0.0-beta.1` peer; it has no third-party runtime peer.
@@ -0,0 +1,16 @@
1
+ import { DatabaseSync } from 'node:sqlite';
2
+ import type { JobEnqueuer, JobStore, JobStoreMigration, JobStoreResource, LeaseStore } from '@zmdb/jobs';
3
+ import type { SqliteDatabase } from '@zmdb/sqlite';
4
+ export interface SqliteJobStore extends JobStore, LeaseStore, JobStoreResource {
5
+ }
6
+ export interface SqliteJobStoreOptions {
7
+ readonly maxCacheSize?: number;
8
+ }
9
+ export interface MemoryJobStore extends SqliteJobStore, Disposable {
10
+ readonly database: DatabaseSync;
11
+ }
12
+ export declare const jobsSqliteMigrations: readonly JobStoreMigration[];
13
+ export declare function createSqliteJobStore(database: SqliteDatabase, options?: SqliteJobStoreOptions): SqliteJobStore;
14
+ export declare function createMemoryJobStore(options?: SqliteJobStoreOptions): MemoryJobStore;
15
+ export declare function sqliteJobEnqueuer(database: SqliteDatabase): JobEnqueuer;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EAMV,WAAW,EAGX,QAAQ,EACR,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,EACX,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,cAAc,EAAmB,MAAM,cAAc,CAAC;AAEpE,MAAM,WAAW,cAAe,SAAQ,QAAQ,EAAE,UAAU,EAAE,gBAAgB;CAAG;AACjF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AACD,MAAM,WAAW,cAAe,SAAQ,cAAc,EAAE,UAAU;IAChE,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;CACjC;AAED,eAAO,MAAM,oBAAoB,EAAE,SAAS,iBAAiB,EA0B3D,CAAC;AA8RH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,cAAc,CAE9G;AAWD,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,cAAc,CAUpF;AACD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,cAAc,GAAG,WAAW,CAgBvE"}
package/dist/index.js ADDED
@@ -0,0 +1,323 @@
1
+ import { DatabaseSync } from 'node:sqlite';
2
+ export const jobsSqliteMigrations = Object.freeze([
3
+ Object.freeze({
4
+ version: 20260906000100,
5
+ name: 'jobs_queue',
6
+ up: `CREATE TABLE zmdb_job (
7
+ id TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL, payload TEXT NOT NULL,
8
+ status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'done', 'dead')),
9
+ attempts INTEGER NOT NULL DEFAULT 0 CHECK (attempts BETWEEN 0 AND 2147483647),
10
+ enqueued_at TEXT NOT NULL, dedupe_key TEXT UNIQUE,
11
+ lease_owner TEXT NOT NULL DEFAULT '', lease_until TEXT NOT NULL DEFAULT '1970-01-01T00:00:00.000Z',
12
+ last_error TEXT, dead_reason TEXT CHECK (dead_reason IN ('invalid-payload', 'unknown-name', 'attempts-exhausted')),
13
+ dead_detail TEXT, dead_at TEXT
14
+ );
15
+ CREATE TABLE zmdb_job_done (key TEXT PRIMARY KEY NOT NULL, completed_at TEXT NOT NULL);
16
+ CREATE INDEX zmdb_job_pending ON zmdb_job(status, lease_until, enqueued_at) WHERE status = 'pending';
17
+ CREATE INDEX zmdb_job_lease_expiry ON zmdb_job(lease_until) WHERE status = 'pending';
18
+ CREATE INDEX zmdb_job_dead ON zmdb_job(dead_at) WHERE status = 'dead';`,
19
+ down: 'DROP INDEX zmdb_job_dead; DROP INDEX zmdb_job_lease_expiry; DROP INDEX zmdb_job_pending; DROP TABLE zmdb_job_done; DROP TABLE zmdb_job;',
20
+ }),
21
+ Object.freeze({
22
+ version: 20260906000200,
23
+ name: 'jobs_schedule_lease',
24
+ up: `CREATE TABLE zmdb_job_lease (key TEXT PRIMARY KEY NOT NULL, holder TEXT NOT NULL CHECK (holder <> ''), expires_at TEXT NOT NULL);
25
+ CREATE INDEX zmdb_job_schedule_expiry ON zmdb_job_lease(expires_at);`,
26
+ down: 'DROP INDEX zmdb_job_schedule_expiry; DROP TABLE zmdb_job_lease;',
27
+ }),
28
+ ]);
29
+ const MAX_INTEGER = 2_147_483_647;
30
+ function integer(name, value, minimum, maximum = MAX_INTEGER) {
31
+ if (!Number.isSafeInteger(value) || value < minimum || value > maximum)
32
+ throw new RangeError(`${name} must be an integer in [${minimum}, ${maximum}]`);
33
+ }
34
+ function string(name, value, empty = false) {
35
+ if (typeof value !== 'string' || (!empty && value.length === 0) || value.includes('\0') || !value.isWellFormed()) {
36
+ throw new TypeError(`${name} must be ${empty ? '' : 'nonempty '}Unicode text without NUL`);
37
+ }
38
+ }
39
+ function timestamp(value) {
40
+ if (!(value instanceof Date) ||
41
+ !Number.isFinite(value.getTime()) ||
42
+ value.getTime() < -62_135_596_800_000 ||
43
+ value.getTime() > 253_402_300_799_999)
44
+ throw new RangeError('timestamp must be a finite Date between years 0001 and 9999');
45
+ return value.toISOString();
46
+ }
47
+ function reason(value) {
48
+ if (value === 'invalid-payload' || value === 'unknown-name' || value === 'attempts-exhausted')
49
+ return value;
50
+ throw new TypeError('unknown dead-letter reason');
51
+ }
52
+ function record(value) {
53
+ return typeof value === 'object' && value !== null;
54
+ }
55
+ function text(row, key) {
56
+ const value = row[key];
57
+ if (typeof value !== 'string')
58
+ throw new TypeError(`zmdb_job.${key} must be text`);
59
+ return value;
60
+ }
61
+ function count(row) {
62
+ const value = row['attempts'];
63
+ if (typeof value !== 'number')
64
+ throw new TypeError('zmdb_job.attempts must be a number');
65
+ integer('attempts', value, 0);
66
+ return value;
67
+ }
68
+ function candidate(row) {
69
+ return { id: text(row, 'id'), name: text(row, 'name'), enqueuedAt: new Date(text(row, 'enqueued_at')) };
70
+ }
71
+ function claimed(row) {
72
+ return {
73
+ ...candidate(row),
74
+ payload: text(row, 'payload'),
75
+ attempts: count(row),
76
+ holder: text(row, 'lease_owner'),
77
+ ...(row['dedupe_key'] === null ? {} : { dedupeKey: text(row, 'dedupe_key') }),
78
+ };
79
+ }
80
+ function enqueue(rows, job) {
81
+ validateEnqueue(job);
82
+ const enqueuedAt = timestamp(job.enqueuedAt), availableAt = timestamp(job.availableAt);
83
+ const inserted = rows(`INSERT INTO zmdb_job (id, name, payload, enqueued_at, dedupe_key, lease_until)
84
+ VALUES (?, ?, ?, ?, ?, ?) ON CONFLICT(dedupe_key) DO NOTHING RETURNING id`, [job.id, job.name, job.payload, enqueuedAt, job.dedupeKey ?? null, availableAt]);
85
+ if (inserted.length > 0)
86
+ return { kind: 'inserted', jobId: job.id };
87
+ const existing = rows('SELECT id FROM zmdb_job WHERE dedupe_key = ?', [job.dedupeKey])[0];
88
+ if (existing === undefined)
89
+ throw new Error('@zmdb/jobs-sqlite: dedupe row is missing');
90
+ return { kind: 'duplicate', jobId: text(existing, 'id') };
91
+ }
92
+ function validateEnqueue(job) {
93
+ string('id', job.id);
94
+ string('name', job.name);
95
+ string('payload', job.payload, true);
96
+ if (job.dedupeKey !== undefined)
97
+ string('dedupeKey', job.dedupeKey);
98
+ timestamp(job.enqueuedAt);
99
+ timestamp(job.availableAt);
100
+ }
101
+ class SqliteStore {
102
+ #database;
103
+ #cache = new Map();
104
+ #maxCacheSize;
105
+ #dispose;
106
+ #closed = false;
107
+ constructor(database, options, dispose) {
108
+ this.#maxCacheSize = options?.maxCacheSize ?? 100;
109
+ integer('maxCacheSize', this.#maxCacheSize, 0, Number.MAX_SAFE_INTEGER);
110
+ this.#database = database;
111
+ this.#dispose = dispose;
112
+ }
113
+ #open() {
114
+ if (this.#closed)
115
+ throw new Error('@zmdb/jobs-sqlite: store is closed');
116
+ }
117
+ #rows = (sql, parameters = []) => {
118
+ this.#open();
119
+ let statement = this.#cache.get(sql);
120
+ this.#cache.delete(sql);
121
+ statement ??= this.#database.prepare(sql);
122
+ if (this.#maxCacheSize > 0) {
123
+ this.#cache.set(sql, statement);
124
+ if (this.#cache.size > this.#maxCacheSize) {
125
+ const oldest = this.#cache.keys().next().value;
126
+ if (oldest !== undefined)
127
+ this.#cache.delete(oldest);
128
+ }
129
+ }
130
+ return statement.all(...parameters).map(row => {
131
+ if (!record(row))
132
+ throw new TypeError('@zmdb/jobs-sqlite: invalid database row');
133
+ return row;
134
+ });
135
+ };
136
+ #transaction(body) {
137
+ this.#open();
138
+ this.#database.exec('BEGIN IMMEDIATE');
139
+ try {
140
+ const result = body();
141
+ this.#database.exec('COMMIT');
142
+ return result;
143
+ }
144
+ catch (primary) {
145
+ try {
146
+ this.#database.exec('ROLLBACK');
147
+ }
148
+ catch (rollback) {
149
+ throw new AggregateError([primary, rollback], '@zmdb/jobs-sqlite: rollback failed', { cause: rollback });
150
+ }
151
+ throw primary;
152
+ }
153
+ }
154
+ async enqueue(job) {
155
+ validateEnqueue(job);
156
+ return this.#transaction(() => enqueue(this.#rows, job));
157
+ }
158
+ async candidates(options) {
159
+ integer('limit', options.limit, 1);
160
+ return this.#rows("SELECT id, name, enqueued_at FROM zmdb_job WHERE status = 'pending' AND lease_until <= ? ORDER BY enqueued_at, id COLLATE BINARY LIMIT ?", [timestamp(options.now), options.limit]).map(candidate);
161
+ }
162
+ async claim(options) {
163
+ this.#open();
164
+ string('holder', options.holder);
165
+ const now = timestamp(options.now), until = timestamp(options.leaseUntil);
166
+ if (options.leaseUntil.getTime() <= options.now.getTime())
167
+ throw new RangeError('leaseUntil must be later than now');
168
+ for (const id of options.ids)
169
+ string('id', id);
170
+ const ids = [...new Set(options.ids)];
171
+ if (ids.length === 0)
172
+ return [];
173
+ return this.#transaction(() => {
174
+ const rows = ids.flatMap(id => this.#rows("UPDATE zmdb_job SET lease_owner = ?, lease_until = ? WHERE id = ? AND status = 'pending' AND lease_until <= ? RETURNING *", [options.holder, until, id, now]));
175
+ // SQLite's UTF-8 BINARY ordering is applied by the database to the claimed rows.
176
+ return this.#rows(`SELECT * FROM zmdb_job WHERE id IN (${rows.map(() => '?').join(',') || 'NULL'}) ORDER BY enqueued_at, id COLLATE BINARY`, rows.map(row => text(row, 'id'))).map(claimed);
177
+ });
178
+ }
179
+ async completed(key) {
180
+ string('key', key);
181
+ return this.#rows('SELECT key FROM zmdb_job_done WHERE key = ?', [key]).length > 0;
182
+ }
183
+ async settle(settlement) {
184
+ string('jobId', settlement.jobId);
185
+ string('holder', settlement.holder);
186
+ const fence = " WHERE id = ? AND lease_owner = ? AND lease_owner <> '' AND status = 'pending' RETURNING id";
187
+ const identity = [settlement.jobId, settlement.holder];
188
+ let sql, parameters;
189
+ switch (settlement.kind) {
190
+ case 'done':
191
+ string('idempotencyKey', settlement.idempotencyKey);
192
+ sql =
193
+ "UPDATE zmdb_job SET status = 'done', attempts = attempts + 1, lease_owner = '', lease_until = ?, last_error = NULL, dead_reason = NULL, dead_detail = NULL, dead_at = NULL";
194
+ parameters = [timestamp(settlement.completedAt)];
195
+ break;
196
+ case 'retry':
197
+ integer('attempts', settlement.attempts, 0);
198
+ string('detail', settlement.detail, true);
199
+ sql =
200
+ "UPDATE zmdb_job SET attempts = ?, lease_owner = '', lease_until = ?, last_error = ?, dead_reason = NULL, dead_detail = NULL, dead_at = NULL";
201
+ parameters = [settlement.attempts, timestamp(settlement.availableAt), settlement.detail];
202
+ break;
203
+ case 'dead':
204
+ integer('attempts', settlement.attempts, 0);
205
+ string('detail', settlement.detail, true);
206
+ reason(settlement.reason);
207
+ sql =
208
+ "UPDATE zmdb_job SET status = 'dead', attempts = ?, lease_owner = '', lease_until = ?, last_error = ?, dead_reason = ?, dead_detail = ?, dead_at = ?";
209
+ parameters = [
210
+ settlement.attempts,
211
+ timestamp(settlement.deadAt),
212
+ settlement.detail,
213
+ settlement.reason,
214
+ settlement.detail,
215
+ timestamp(settlement.deadAt),
216
+ ];
217
+ break;
218
+ case 'release':
219
+ sql = "UPDATE zmdb_job SET lease_owner = '', lease_until = ?";
220
+ parameters = [timestamp(settlement.availableAt)];
221
+ break;
222
+ default:
223
+ throw new TypeError('unknown job settlement');
224
+ }
225
+ return this.#transaction(() => {
226
+ const changed = this.#rows(sql + fence, [...parameters, ...identity]).length > 0;
227
+ if (changed && settlement.kind === 'done')
228
+ this.#rows('INSERT INTO zmdb_job_done (key, completed_at) VALUES (?, ?) ON CONFLICT(key) DO NOTHING RETURNING key', [settlement.idempotencyKey, timestamp(settlement.completedAt)]);
229
+ return changed;
230
+ });
231
+ }
232
+ async listDead(options) {
233
+ integer('limit', options.limit, 1);
234
+ if (options.reason !== undefined)
235
+ reason(options.reason);
236
+ return this.#rows(`SELECT * FROM zmdb_job WHERE status = 'dead'${options.reason === undefined ? '' : ' AND dead_reason = ?'} ORDER BY dead_at DESC, id COLLATE BINARY LIMIT ?`, options.reason === undefined ? [options.limit] : [options.reason, options.limit]).map(row => ({
237
+ jobId: text(row, 'id'),
238
+ name: text(row, 'name'),
239
+ payload: text(row, 'payload'),
240
+ attempts: count(row),
241
+ reason: reason(row['dead_reason']),
242
+ detail: text(row, 'dead_detail'),
243
+ enqueuedAt: new Date(text(row, 'enqueued_at')),
244
+ deadAt: new Date(text(row, 'dead_at')),
245
+ }));
246
+ }
247
+ async replay(jobId, availableAt) {
248
+ string('jobId', jobId);
249
+ return (this.#rows("UPDATE zmdb_job SET status = 'pending', attempts = 0, lease_owner = '', lease_until = ?, last_error = NULL, dead_reason = NULL, dead_detail = NULL, dead_at = NULL WHERE id = ? AND status = 'dead' RETURNING id", [timestamp(availableAt), jobId]).length > 0);
250
+ }
251
+ async acquire(key, holder, ttlMs) {
252
+ string('key', key);
253
+ string('holder', holder);
254
+ integer('ttlMs', ttlMs, 1);
255
+ const now = Date.now();
256
+ return (this.#rows(`INSERT INTO zmdb_job_lease (key, holder, expires_at) VALUES (?, ?, ?)
257
+ ON CONFLICT(key) DO UPDATE SET holder = excluded.holder, expires_at = excluded.expires_at
258
+ WHERE zmdb_job_lease.holder = excluded.holder OR zmdb_job_lease.expires_at <= ? RETURNING key`, [key, holder, timestamp(new Date(now + ttlMs)), timestamp(new Date(now))]).length > 0);
259
+ }
260
+ async renew(key, holder, ttlMs) {
261
+ string('key', key);
262
+ string('holder', holder);
263
+ integer('ttlMs', ttlMs, 1);
264
+ const now = Date.now();
265
+ return (this.#rows('UPDATE zmdb_job_lease SET expires_at = ? WHERE key = ? AND holder = ? AND expires_at > ? RETURNING key', [timestamp(new Date(now + ttlMs)), key, holder, timestamp(new Date(now))]).length > 0);
266
+ }
267
+ async release(key, holder) {
268
+ string('key', key);
269
+ string('holder', holder);
270
+ this.#rows('DELETE FROM zmdb_job_lease WHERE key = ? AND holder = ? RETURNING key', [key, holder]);
271
+ }
272
+ close(options) {
273
+ if (options !== undefined)
274
+ integer('graceMs', options.graceMs, 0);
275
+ if (this.#closed)
276
+ return;
277
+ this.#closed = true;
278
+ this.#cache.clear();
279
+ this.#dispose?.();
280
+ }
281
+ }
282
+ export function createSqliteJobStore(database, options) {
283
+ return new SqliteStore(database, options);
284
+ }
285
+ class MemoryStore extends SqliteStore {
286
+ database;
287
+ constructor(database, options) {
288
+ super(database, options, () => database.close());
289
+ this.database = database;
290
+ }
291
+ [Symbol.dispose]() {
292
+ this.close();
293
+ }
294
+ }
295
+ export function createMemoryJobStore(options) {
296
+ if (options?.maxCacheSize !== undefined)
297
+ integer('maxCacheSize', options.maxCacheSize, 0, Number.MAX_SAFE_INTEGER);
298
+ const database = new DatabaseSync(':memory:');
299
+ try {
300
+ for (const migration of jobsSqliteMigrations)
301
+ database.exec(migration.up);
302
+ return new MemoryStore(database, options);
303
+ }
304
+ catch (error) {
305
+ database.close();
306
+ throw error;
307
+ }
308
+ }
309
+ export function sqliteJobEnqueuer(database) {
310
+ return {
311
+ async enqueue(job) {
312
+ return enqueue((sql, parameters = []) => database
313
+ .prepare(sql)
314
+ .all(...parameters)
315
+ .map(row => {
316
+ if (!record(row))
317
+ throw new TypeError('@zmdb/jobs-sqlite: invalid database row');
318
+ return row;
319
+ }), job);
320
+ },
321
+ };
322
+ }
323
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@zmdb/jobs-sqlite",
3
+ "version": "1.0.0-beta.1",
4
+ "description": "Explicit SQLite persistence and owned memory storage for portable zmdb jobs.",
5
+ "keywords": [
6
+ "jobs",
7
+ "queue",
8
+ "sqlite",
9
+ "typescript",
10
+ "zmdb"
11
+ ],
12
+ "homepage": "https://github.com/ambasta/zmdb#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/ambasta/zmdb/issues"
15
+ },
16
+ "license": "GPL-3.0-or-later",
17
+ "author": "zmdb contributors",
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/ambasta/zmdb.git",
21
+ "directory": "packages/jobs-sqlite"
22
+ },
23
+ "type": "module",
24
+ "sideEffects": false,
25
+ "exports": {
26
+ ".": {
27
+ "types": "./dist/index.d.ts",
28
+ "import": "./dist/index.js"
29
+ }
30
+ },
31
+ "publishConfig": {
32
+ "access": "public",
33
+ "tag": "beta"
34
+ },
35
+ "scripts": {
36
+ "build": "node ../../scripts/build-package.mjs",
37
+ "test": "vitest run"
38
+ },
39
+ "dependencies": {
40
+ "@zmdb/sqlite": "1.0.0-beta.1"
41
+ },
42
+ "peerDependencies": {
43
+ "@zmdb/jobs": "1.0.0-beta.1"
44
+ },
45
+ "engines": {
46
+ "node": ">=26"
47
+ },
48
+ "main": "./dist/index.js",
49
+ "types": "./dist/index.d.ts"
50
+ }