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.
@@ -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
- * Keyset pagination over p:all, newest first (enqueuedAt DESC, id DESC).
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 list: Redis.Script<{
116
- params: [prefix: string, filtersJson: string, cursor: string, limit: number];
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAA;AAkPnD;;;;;;GAMG;AACH,eAAO,MAAM,OAAO;;;EAkIM,CAAA;AAE1B;;;;;GAKG;AACH,eAAO,MAAM,KAAK;;;EAsEQ,CAAA;AAE1B;;;;GAIG;AACH,eAAO,MAAM,GAAG;;;EA0EU,CAAA;AAE1B;;;GAGG;AACH,eAAO,MAAM,OAAO;;;EA4BM,CAAA;AAE1B;;;GAGG;AACH,eAAO,MAAM,WAAW;;;EAuBE,CAAA;AAE1B;;;GAGG;AACH,eAAO,MAAM,cAAc;;;EAiDD,CAAA;AAE1B,sEAAsE;AACtE,eAAO,MAAM,MAAM;;;EAUO,CAAA;AAE1B;;;GAGG;AACH,eAAO,MAAM,IAAI;;;EAsES,CAAA;AAE1B,mDAAmD;AACnD,eAAO,MAAM,MAAM;;;EAUO,CAAA;AAE1B,+EAA+E;AAC/E,eAAO,MAAM,MAAM;;;EAeO,CAAA;AAE1B,sEAAsE;AACtE,eAAO,MAAM,KAAK;;;EA2BQ,CAAA;AAE1B;;;;;GAKG;AACH,eAAO,MAAM,MAAM;;;EAqCO,CAAA;AAE1B,yDAAyD;AACzD,eAAO,MAAM,OAAO;;;EAqBM,CAAA;AAE1B;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc;;;EA8DD,CAAA;AAE1B,sDAAsD;AACtD,eAAO,MAAM,cAAc;;;EAUD,CAAA;AAE1B,yEAAyE;AACzE,eAAO,MAAM,aAAa;;;EAsBA,CAAA;AAE1B,gEAAgE;AAChE,eAAO,MAAM,YAAY;;;EAcC,CAAA;AAE1B,gFAAgF;AAChF,eAAO,MAAM,eAAe;;;EAcF,CAAA;AAE1B;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY;;;EA0DC,CAAA;AAE1B;;;;;;GAMG;AACH,eAAO,MAAM,WAAW;;;EA+CE,CAAA;AAE1B;;;;;GAKG;AACH,eAAO,MAAM,UAAU;;;EA4DG,CAAA;AAE1B;;;;GAIG;AACH,eAAO,MAAM,YAAY;;;EAyCC,CAAA;AAE1B;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,MAAM;;;EA+FO,CAAA;AAE1B;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,kBAAkB;;;EAmGL,CAAA;AAE1B;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB;;;EAkBH,CAAA;AAE1B;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,aAAa;;;EA0EA,CAAA;AAE1B;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;EAgBP,CAAA"}
1
+ {"version":3,"file":"scripts.d.ts","sourceRoot":"","sources":["../../src/redis/scripts.ts"],"names":[],"mappings":"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"}