effect-mq 0.6.0 → 0.7.0
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/dist/JobStore.d.ts +41 -3
- package/dist/JobStore.d.ts.map +1 -1
- package/dist/JobStore.js +10 -0
- package/dist/JobStore.js.map +1 -1
- package/dist/MemoryJobStore.d.ts.map +1 -1
- package/dist/MemoryJobStore.js +27 -14
- package/dist/MemoryJobStore.js.map +1 -1
- package/dist/drizzle-postgres/DrizzleJobStore.d.ts.map +1 -1
- package/dist/drizzle-postgres/DrizzleJobStore.js +25 -3
- package/dist/drizzle-postgres/DrizzleJobStore.js.map +1 -1
- package/dist/redis/RedisJobStore.d.ts +53 -0
- package/dist/redis/RedisJobStore.d.ts.map +1 -1
- package/dist/redis/RedisJobStore.js +188 -37
- package/dist/redis/RedisJobStore.js.map +1 -1
- package/dist/redis/scripts.d.ts +101 -30
- package/dist/redis/scripts.d.ts.map +1 -1
- package/dist/redis/scripts.js +204 -55
- package/dist/redis/scripts.js.map +1 -1
- package/dist/testing/conformance.d.ts.map +1 -1
- package/dist/testing/conformance.js +127 -11
- package/dist/testing/conformance.js.map +1 -1
- package/package.json +1 -1
- package/src/JobStore.ts +38 -3
- package/src/MemoryJobStore.ts +26 -18
- package/src/drizzle-postgres/DrizzleJobStore.ts +27 -3
- package/src/redis/RedisJobStore.ts +256 -36
- package/src/redis/scripts.ts +232 -59
- package/src/testing/conformance.ts +143 -11
package/dist/redis/scripts.d.ts
CHANGED
|
@@ -21,6 +21,19 @@
|
|
|
21
21
|
* - `p:delayed:<queue>` ZSET, score `runAt`
|
|
22
22
|
* - `p:active` ZSET, score `lockExpiresAt`
|
|
23
23
|
* - `p:all` ZSET, score `enqueuedAt` (list pagination)
|
|
24
|
+
* - `p:byname:<name>` ZSET, score `enqueuedAt` (list name index;
|
|
25
|
+
* optional, `RedisJobStoreOptions.indexes.name`)
|
|
26
|
+
* - `p:byqueue:<queue>` ZSET, score `enqueuedAt` (list queue index;
|
|
27
|
+
* optional, `RedisJobStoreOptions.indexes.queue`)
|
|
28
|
+
* - `p:index:<kind>:ready` STRING, millis timestamp of the last index
|
|
29
|
+
* reconcile's start for `<kind>` (name |
|
|
30
|
+
* queue). Absent: the next enabled boot does a
|
|
31
|
+
* full ZSCAN rebuild. Present: enabled boots
|
|
32
|
+
* heal the tail (rows enqueued since the value
|
|
33
|
+
* minus a safety margin) and re-stamp it —
|
|
34
|
+
* closing the rolling-deploy window where
|
|
35
|
+
* index-less writers inserted rows after the
|
|
36
|
+
* marker landed
|
|
24
37
|
* - `p:finished:<state>` ZSET, score `finishedAt` (history TTL)
|
|
25
38
|
* - `p:terminal:<name>:<state>` ZSET, score `finishedAt` (keep pruning)
|
|
26
39
|
* - `p:counts` HASH `<queue>|<state>` -> integer
|
|
@@ -49,6 +62,27 @@
|
|
|
49
62
|
* @since 0.2.0
|
|
50
63
|
*/
|
|
51
64
|
import { Redis } from "effect/unstable/persistence";
|
|
65
|
+
/**
|
|
66
|
+
* Which optional list indexes (`p:byname:<name>` / `p:byqueue:<queue>`) this
|
|
67
|
+
* store maintains. The flags are baked into the script text (the helpers are
|
|
68
|
+
* shared by every script), so a store instance only ever runs scripts that
|
|
69
|
+
* match its configuration — disabled indexes cost no writes at all.
|
|
70
|
+
*
|
|
71
|
+
* @since 0.7.0
|
|
72
|
+
*/
|
|
73
|
+
export interface IndexConfig {
|
|
74
|
+
readonly name: boolean;
|
|
75
|
+
readonly queue: boolean;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Shared helpers textually prepended to every script (the `Redis.script`
|
|
79
|
+
* runner has no include mechanism). `ARGV[1]` is always the key prefix.
|
|
80
|
+
* Built once per store instance: `insertJobRow` writes only the list indexes
|
|
81
|
+
* enabled by `IndexConfig` (`deleteJob` clears both unconditionally — a ZREM
|
|
82
|
+
* on a missing key is free, and stray entries from an earlier configuration
|
|
83
|
+
* must never outlive their job).
|
|
84
|
+
*/
|
|
85
|
+
export declare const helpers: (indexes: IndexConfig) => string;
|
|
52
86
|
/**
|
|
53
87
|
* enqueue(prefix, idMode, id, name, queue, payloadJson, metadataJson,
|
|
54
88
|
* priority, attemptsMax, backoffJson, keepJson, timeoutMs, delayMs,
|
|
@@ -56,7 +90,7 @@ import { Redis } from "effect/unstable/persistence";
|
|
|
56
90
|
* idMode: "user" (dedup no-op), "generated" (collision -> retry sentinel),
|
|
57
91
|
* "auto" (j-<seq>, in-script collision loop).
|
|
58
92
|
*/
|
|
59
|
-
export declare const enqueue: Redis.Script<{
|
|
93
|
+
export declare const enqueue: (HELPERS: string) => Redis.Script<{
|
|
60
94
|
params: [prefix: string, idMode: string, id: string, name: string, queue: string, payloadJson: string, metadataJson: string, priority: number, attemptsMax: number, backoffJson: string, keepJson: string, timeoutMs: string, delayMs: number, now: number, dedupeKey: string, dedupeTtlMs: string, dedupeExtend: string, dedupeReplace: string, traceJson: string, parentJson: string];
|
|
61
95
|
result: string;
|
|
62
96
|
}>;
|
|
@@ -66,7 +100,7 @@ export declare const enqueue: Redis.Script<{
|
|
|
66
100
|
* waiting job whose name matches. Returns the claimed record (HGETALL pairs)
|
|
67
101
|
* or an Empty result with the earliest matching delayed runAt.
|
|
68
102
|
*/
|
|
69
|
-
export declare const claim: Redis.Script<{
|
|
103
|
+
export declare const claim: (HELPERS: string) => Redis.Script<{
|
|
70
104
|
params: [prefix: string, queue: string, namesJson: string, token: string, lockDurationMs: number, now: number];
|
|
71
105
|
result: string;
|
|
72
106
|
}>;
|
|
@@ -75,7 +109,7 @@ export declare const claim: Redis.Script<{
|
|
|
75
109
|
* Token-guarded. Retry on a cancel-requested job finishes it as cancelled
|
|
76
110
|
* (cancellation wins over revival, mirroring release/recoverStalled).
|
|
77
111
|
*/
|
|
78
|
-
export declare const ack: Redis.Script<{
|
|
112
|
+
export declare const ack: (HELPERS: string) => Redis.Script<{
|
|
79
113
|
params: [prefix: string, id: string, token: string, outcomeTag: string, exitJson: string, delayMs: number, now: number];
|
|
80
114
|
result: string;
|
|
81
115
|
}>;
|
|
@@ -83,7 +117,7 @@ export declare const ack: Redis.Script<{
|
|
|
83
117
|
* release(prefix, id, token, now) — hand the job back without consuming an
|
|
84
118
|
* attempt; a pending cancel wins and finishes the job instead.
|
|
85
119
|
*/
|
|
86
|
-
export declare const release: Redis.Script<{
|
|
120
|
+
export declare const release: (HELPERS: string) => Redis.Script<{
|
|
87
121
|
params: [prefix: string, id: string, token: string, now: number];
|
|
88
122
|
result: string;
|
|
89
123
|
}>;
|
|
@@ -91,7 +125,7 @@ export declare const release: Redis.Script<{
|
|
|
91
125
|
* extendLocks(prefix, locksJson, durationMs, now) -> { lost, cancel }
|
|
92
126
|
* Cancel-requested locks are reported, not extended.
|
|
93
127
|
*/
|
|
94
|
-
export declare const extendLocks: Redis.Script<{
|
|
128
|
+
export declare const extendLocks: (HELPERS: string) => Redis.Script<{
|
|
95
129
|
params: [prefix: string, locksJson: string, durationMs: number, now: number];
|
|
96
130
|
result: string;
|
|
97
131
|
}>;
|
|
@@ -99,35 +133,72 @@ export declare const extendLocks: Redis.Script<{
|
|
|
99
133
|
* recoverStalled(prefix, maxStalledCount, now) -> recovered [{id, failed}]
|
|
100
134
|
* A pending cancel finishes the job as cancelled (not reported as recovered).
|
|
101
135
|
*/
|
|
102
|
-
export declare const recoverStalled: Redis.Script<{
|
|
136
|
+
export declare const recoverStalled: (HELPERS: string) => Redis.Script<{
|
|
103
137
|
params: [prefix: string, maxStalledCount: number, now: number];
|
|
104
138
|
result: string;
|
|
105
139
|
}>;
|
|
106
140
|
/** getJob(prefix, id) -> HGETALL pairs (empty array when missing). */
|
|
107
|
-
export declare const getJob: Redis.Script<{
|
|
141
|
+
export declare const getJob: (HELPERS: string) => Redis.Script<{
|
|
108
142
|
params: [prefix: string, id: string];
|
|
109
143
|
result: string;
|
|
110
144
|
}>;
|
|
111
145
|
/**
|
|
112
|
-
* list(prefix, filtersJson, cursor, limit)
|
|
113
|
-
*
|
|
146
|
+
* list(prefix, sourcesJson, order, filtersJson, cursor, limit)
|
|
147
|
+
*
|
|
148
|
+
* Indexed list. The DRIVER routes the query to the narrowest zset(s) — see
|
|
149
|
+
* `RedisJobStore`'s routing matrix — and this script merges those sorted
|
|
150
|
+
* sources by (score, id) in the requested direction, pages past the
|
|
151
|
+
* exclusive `<orderValue>:<id>` keyset cursor, loads each candidate row, and
|
|
152
|
+
* applies the residual predicates until `limit` matches accumulate. Sources
|
|
153
|
+
* must be plain-id-membered zsets whose score IS the requested order value
|
|
154
|
+
* (`all`/`byname:`/`byqueue:` = enqueuedAt, `delayed:<queue>` = runAt,
|
|
155
|
+
* `finished:`/`terminal:` = finishedAt) and must be pairwise disjoint; the
|
|
156
|
+
* waiting zsets (seq-prefixed members, priority scores) are never routed
|
|
157
|
+
* here. A member whose job hash is gone is an orphan: it is ZREM'd from the
|
|
158
|
+
* source being scanned (self-heal) and skipped.
|
|
159
|
+
*/
|
|
160
|
+
export declare const list: (HELPERS: string) => Redis.Script<{
|
|
161
|
+
params: [prefix: string, sourcesJson: string, order: string, filtersJson: string, cursor: string, limit: number];
|
|
162
|
+
result: string;
|
|
163
|
+
}>;
|
|
164
|
+
/**
|
|
165
|
+
* indexMembers(prefix, kind, idsJson) -> "1"
|
|
166
|
+
*
|
|
167
|
+
* Index one ZSCAN chunk of `p:all` members during a full rebuild. The driver
|
|
168
|
+
* owns the ZSCAN cursor loop (linear, tie-immune, guaranteed to terminate,
|
|
169
|
+
* and guaranteed to return every element present for the whole scan); this
|
|
170
|
+
* script only does the per-chunk work, so the single-threaded server is
|
|
171
|
+
* never held for the whole keyspace. Re-visited members and rows indexed
|
|
172
|
+
* live by insertJobRow mid-scan are idempotent ZADDs.
|
|
173
|
+
*/
|
|
174
|
+
export declare const indexMembers: (HELPERS: string) => Redis.Script<{
|
|
175
|
+
params: [prefix: string, kind: string, idsJson: string];
|
|
176
|
+
result: string;
|
|
177
|
+
}>;
|
|
178
|
+
/**
|
|
179
|
+
* indexTailPage(prefix, kind, min, offset, pageSize) -> scanned count
|
|
180
|
+
*
|
|
181
|
+
* One bounded page of the boot-time tail heal: index every `p:all` member
|
|
182
|
+
* with score >= min (the previous marker minus a safety margin). Plain
|
|
183
|
+
* LIMIT offset paging — tails are small, and a rank-shift skip from a
|
|
184
|
+
* concurrent delete is covered by the margin plus the next boot's heal.
|
|
114
185
|
*/
|
|
115
|
-
export declare const
|
|
116
|
-
params: [prefix: string,
|
|
186
|
+
export declare const indexTailPage: (HELPERS: string) => Redis.Script<{
|
|
187
|
+
params: [prefix: string, kind: string, min: string, offset: number, pageSize: number];
|
|
117
188
|
result: string;
|
|
118
189
|
}>;
|
|
119
190
|
/** counts(prefix) -> HGETALL pairs of p:counts. */
|
|
120
|
-
export declare const counts: Redis.Script<{
|
|
191
|
+
export declare const counts: (HELPERS: string) => Redis.Script<{
|
|
121
192
|
params: [prefix: string];
|
|
122
193
|
result: string;
|
|
123
194
|
}>;
|
|
124
195
|
/** remove(prefix, id) -> removed boolean (active/waiting-children refused). */
|
|
125
|
-
export declare const remove: Redis.Script<{
|
|
196
|
+
export declare const remove: (HELPERS: string) => Redis.Script<{
|
|
126
197
|
params: [prefix: string, id: string];
|
|
127
198
|
result: string;
|
|
128
199
|
}>;
|
|
129
200
|
/** retry(prefix, id, now) — failed -> waiting with a fresh budget. */
|
|
130
|
-
export declare const retry: Redis.Script<{
|
|
201
|
+
export declare const retry: (HELPERS: string) => Redis.Script<{
|
|
131
202
|
params: [prefix: string, id: string, now: number];
|
|
132
203
|
result: string;
|
|
133
204
|
}>;
|
|
@@ -137,12 +208,12 @@ export declare const retry: Redis.Script<{
|
|
|
137
208
|
* handing them to the cascade sweep); active gets the cancel-request flag;
|
|
138
209
|
* terminal states are refused.
|
|
139
210
|
*/
|
|
140
|
-
export declare const cancel: Redis.Script<{
|
|
211
|
+
export declare const cancel: (HELPERS: string) => Redis.Script<{
|
|
141
212
|
params: [prefix: string, id: string, now: number];
|
|
142
213
|
result: string;
|
|
143
214
|
}>;
|
|
144
215
|
/** promote(prefix, id, now) — delayed -> waiting now. */
|
|
145
|
-
export declare const promote: Redis.Script<{
|
|
216
|
+
export declare const promote: (HELPERS: string) => Redis.Script<{
|
|
146
217
|
params: [prefix: string, id: string, now: number];
|
|
147
218
|
result: string;
|
|
148
219
|
}>;
|
|
@@ -155,27 +226,27 @@ export declare const promote: Redis.Script<{
|
|
|
155
226
|
* digits) and empty arrays ({}). An unchanged cadence (cron/tz/everyMs)
|
|
156
227
|
* preserves the stored nextRunAt.
|
|
157
228
|
*/
|
|
158
|
-
export declare const upsertSchedule: Redis.Script<{
|
|
229
|
+
export declare const upsertSchedule: (HELPERS: string) => Redis.Script<{
|
|
159
230
|
params: [prefix: string, key: string, jobName: string, queue: string, cron: string, tz: string, everyMs: string, payloadJson: string, metadataJson: string, priority: string, attemptsMax: string, backoffJson: string, keepJson: string, timeoutMs: string, group: string, nextRunAt: number];
|
|
160
231
|
result: string;
|
|
161
232
|
}>;
|
|
162
233
|
/** removeSchedule(prefix, key) -> existed boolean. */
|
|
163
|
-
export declare const removeSchedule: Redis.Script<{
|
|
234
|
+
export declare const removeSchedule: (HELPERS: string) => Redis.Script<{
|
|
164
235
|
params: [prefix: string, key: string];
|
|
165
236
|
result: string;
|
|
166
237
|
}>;
|
|
167
238
|
/** listSchedules(prefix, filtersJson) ordered by nextRunAt ascending. */
|
|
168
|
-
export declare const listSchedules: Redis.Script<{
|
|
239
|
+
export declare const listSchedules: (HELPERS: string) => Redis.Script<{
|
|
169
240
|
params: [prefix: string, filtersJson: string];
|
|
170
241
|
result: string;
|
|
171
242
|
}>;
|
|
172
243
|
/** dueSchedules(prefix, now) ordered by nextRunAt ascending. */
|
|
173
|
-
export declare const dueSchedules: Redis.Script<{
|
|
244
|
+
export declare const dueSchedules: (HELPERS: string) => Redis.Script<{
|
|
174
245
|
params: [prefix: string, now: number];
|
|
175
246
|
result: string;
|
|
176
247
|
}>;
|
|
177
248
|
/** advanceSchedule(prefix, key, expectedRunAt, nextRunAt) — conditional CAS. */
|
|
178
|
-
export declare const advanceSchedule: Redis.Script<{
|
|
249
|
+
export declare const advanceSchedule: (HELPERS: string) => Redis.Script<{
|
|
179
250
|
params: [prefix: string, key: string, expectedRunAt: number, nextRunAt: number];
|
|
180
251
|
result: string;
|
|
181
252
|
}>;
|
|
@@ -187,7 +258,7 @@ export declare const advanceSchedule: Redis.Script<{
|
|
|
187
258
|
* in one script, so a stale sweeper can never re-fire a slot — even after
|
|
188
259
|
* retention pruned the previous slot's job row.
|
|
189
260
|
*/
|
|
190
|
-
export declare const tickSchedule: Redis.Script<{
|
|
261
|
+
export declare const tickSchedule: (HELPERS: string) => Redis.Script<{
|
|
191
262
|
params: [prefix: string, key: string, expectedRunAt: number, nextRunAt: number, id: string, name: string, queue: string, payloadJson: string, metadataJson: string, priority: number, attemptsMax: number, backoffJson: string, keepJson: string, timeoutMs: string, traceJson: string, parentJson: string, delayMs: number, now: number];
|
|
192
263
|
result: string;
|
|
193
264
|
}>;
|
|
@@ -198,7 +269,7 @@ export declare const tickSchedule: Redis.Script<{
|
|
|
198
269
|
* backoffJson, keepJson, timeoutMs, traceJson, parentJson, delayMs. Plain
|
|
199
270
|
* (non-dedup) items only — the caller routes dedup items through \`enqueue\`.
|
|
200
271
|
*/
|
|
201
|
-
export declare const enqueueMany: Redis.Script<{
|
|
272
|
+
export declare const enqueueMany: (HELPERS: string) => Redis.Script<{
|
|
202
273
|
params: [prefix: string, now: number, count: number, items: readonly string[]];
|
|
203
274
|
result: string;
|
|
204
275
|
}>;
|
|
@@ -208,7 +279,7 @@ export declare const enqueueMany: Redis.Script<{
|
|
|
208
279
|
* min(store ceiling, per-row keep.age). The caller advances the offset by
|
|
209
280
|
* (scanned - deleted) and stops when a page comes back short.
|
|
210
281
|
*/
|
|
211
|
-
export declare const sweepState: Redis.Script<{
|
|
282
|
+
export declare const sweepState: (HELPERS: string) => Redis.Script<{
|
|
212
283
|
params: [prefix: string, state: string, ttlMs: string, limit: number, offset: number, now: number];
|
|
213
284
|
result: string;
|
|
214
285
|
}>;
|
|
@@ -217,7 +288,7 @@ export declare const sweepState: Redis.Script<{
|
|
|
217
288
|
* caller loops until 0): expired windows, then pending pointers (+inf)
|
|
218
289
|
* whose job is gone or terminal.
|
|
219
290
|
*/
|
|
220
|
-
export declare const sweepDedupes: Redis.Script<{
|
|
291
|
+
export declare const sweepDedupes: (HELPERS: string) => Redis.Script<{
|
|
221
292
|
params: [prefix: string, limit: number, now: number];
|
|
222
293
|
result: string;
|
|
223
294
|
}>;
|
|
@@ -240,7 +311,7 @@ export declare const sweepDedupes: Redis.Script<{
|
|
|
240
311
|
* raced cancelRequested wins: the parent settles cancelled and its pending
|
|
241
312
|
* rows flip to cancelled (cascade work for the flow sweeper).
|
|
242
313
|
*/
|
|
243
|
-
export declare const fanOut: Redis.Script<{
|
|
314
|
+
export declare const fanOut: (HELPERS: string) => Redis.Script<{
|
|
244
315
|
params: [prefix: string, id: string, token: string, final: string, clearStaged: string, failFast: string, total: number, now: number, count: number, items: readonly string[]];
|
|
245
316
|
result: string;
|
|
246
317
|
}>;
|
|
@@ -261,7 +332,7 @@ export declare const fanOut: Redis.Script<{
|
|
|
261
332
|
* transition, so its own report goes to the outbox here), else pending==0
|
|
262
333
|
* resumes the parent runnable at the flow's LAST applied report's index.
|
|
263
334
|
*/
|
|
264
|
-
export declare const recordChildResults: Redis.Script<{
|
|
335
|
+
export declare const recordChildResults: (HELPERS: string) => Redis.Script<{
|
|
265
336
|
params: [prefix: string, now: number, count: number, items: readonly string[]];
|
|
266
337
|
result: string;
|
|
267
338
|
}>;
|
|
@@ -271,7 +342,7 @@ export declare const recordChildResults: Redis.Script<{
|
|
|
271
342
|
* Items are positional HMGET tuples (the field list must stay in lockstep
|
|
272
343
|
* with the driver's `toChildRecord`) — the full spec JSON stays server-side.
|
|
273
344
|
*/
|
|
274
|
-
export declare const listChildResults: Redis.Script<{
|
|
345
|
+
export declare const listChildResults: (HELPERS: string) => Redis.Script<{
|
|
275
346
|
params: [prefix: string, flowId: string, cursor: string, limit: number];
|
|
276
347
|
result: string;
|
|
277
348
|
}>;
|
|
@@ -296,7 +367,7 @@ export declare const listChildResults: Redis.Script<{
|
|
|
296
367
|
* Spec JSON strings pass through untouched — the script never cjson-decodes
|
|
297
368
|
* stored payloads (precision, lone surrogates).
|
|
298
369
|
*/
|
|
299
|
-
export declare const flowSweepWork: Redis.Script<{
|
|
370
|
+
export declare const flowSweepWork: (HELPERS: string) => Redis.Script<{
|
|
300
371
|
params: [prefix: string, pendingAgeMs: number, limit: number, now: number];
|
|
301
372
|
result: string;
|
|
302
373
|
}>;
|
|
@@ -304,7 +375,7 @@ export declare const flowSweepWork: Redis.Script<{
|
|
|
304
375
|
* markChildrenCascaded(prefix, flowId, childKeysJson) — idempotent; unknown
|
|
305
376
|
* keys are ignored (their index members are still cleared).
|
|
306
377
|
*/
|
|
307
|
-
export declare const markChildrenCascaded: Redis.Script<{
|
|
378
|
+
export declare const markChildrenCascaded: (HELPERS: string) => Redis.Script<{
|
|
308
379
|
params: [prefix: string, flowId: string, childKeysJson: string];
|
|
309
380
|
result: string;
|
|
310
381
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripts.d.ts","sourceRoot":"","sources":["../../src/redis/scripts.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"scripts.d.ts","sourceRoot":"","sources":["../../src/redis/scripts.ts"],"names":[],"mappings":"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"}
|