effect-mq 0.2.0 → 0.3.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.
Files changed (45) hide show
  1. package/README.md +153 -18
  2. package/dist/Job.d.ts +51 -1
  3. package/dist/Job.d.ts.map +1 -1
  4. package/dist/Job.js +44 -2
  5. package/dist/Job.js.map +1 -1
  6. package/dist/JobStore.d.ts +86 -6
  7. package/dist/JobStore.d.ts.map +1 -1
  8. package/dist/JobStore.js +27 -1
  9. package/dist/JobStore.js.map +1 -1
  10. package/dist/MemoryJobStore.d.ts +6 -5
  11. package/dist/MemoryJobStore.d.ts.map +1 -1
  12. package/dist/MemoryJobStore.js +160 -32
  13. package/dist/MemoryJobStore.js.map +1 -1
  14. package/dist/Worker.d.ts.map +1 -1
  15. package/dist/Worker.js +1 -0
  16. package/dist/Worker.js.map +1 -1
  17. package/dist/drizzle-postgres/DrizzleJobStore.d.ts +20 -3
  18. package/dist/drizzle-postgres/DrizzleJobStore.d.ts.map +1 -1
  19. package/dist/drizzle-postgres/DrizzleJobStore.js +352 -84
  20. package/dist/drizzle-postgres/DrizzleJobStore.js.map +1 -1
  21. package/dist/drizzle-postgres/schema.d.ts +255 -351
  22. package/dist/drizzle-postgres/schema.d.ts.map +1 -1
  23. package/dist/drizzle-postgres/schema.js +75 -27
  24. package/dist/drizzle-postgres/schema.js.map +1 -1
  25. package/dist/redis/RedisJobStore.d.ts +4 -2
  26. package/dist/redis/RedisJobStore.d.ts.map +1 -1
  27. package/dist/redis/RedisJobStore.js +67 -28
  28. package/dist/redis/RedisJobStore.js.map +1 -1
  29. package/dist/redis/scripts.d.ts +19 -6
  30. package/dist/redis/scripts.d.ts.map +1 -1
  31. package/dist/redis/scripts.js +208 -23
  32. package/dist/redis/scripts.js.map +1 -1
  33. package/dist/testing/conformance.d.ts.map +1 -1
  34. package/dist/testing/conformance.js +172 -7
  35. package/dist/testing/conformance.js.map +1 -1
  36. package/package.json +1 -1
  37. package/src/Job.ts +113 -6
  38. package/src/JobStore.ts +122 -6
  39. package/src/MemoryJobStore.ts +184 -44
  40. package/src/Worker.ts +1 -0
  41. package/src/drizzle-postgres/DrizzleJobStore.ts +431 -91
  42. package/src/drizzle-postgres/schema.ts +177 -63
  43. package/src/redis/RedisJobStore.ts +90 -35
  44. package/src/redis/scripts.ts +217 -24
  45. package/src/testing/conformance.ts +246 -7
@@ -16,7 +16,7 @@
16
16
  *
17
17
  * @since 0.1.0
18
18
  */
19
- import { Brand, Context, type Effect, type Option } from "effect";
19
+ import { Brand, Context, Duration, type Effect, type Option } from "effect";
20
20
  /**
21
21
  * The identifier of an enqueued job. Produced by `enqueue` (either
22
22
  * store-assigned or derived from a custom id / idempotency key).
@@ -80,18 +80,65 @@ export interface BackoffPolicy {
80
80
  readonly factor?: number | undefined;
81
81
  }
82
82
  /**
83
- * Retention policy for terminal (completed/failed) jobs, persisted on the
84
- * record. Applied by the store after terminal acks, scoped to jobs with the
85
- * same name and state. Default (undefined) keeps records forever.
83
+ * Retention rule for one terminal state's records (per job name).
86
84
  *
87
- * @since 0.1.0
85
+ * @since 0.3.0
88
86
  */
89
- export interface KeepPolicy {
87
+ export interface KeepStatePolicy {
90
88
  /** Keep at most this many terminal records (per name + state). */
91
89
  readonly count?: number | undefined;
92
90
  /** Remove terminal records older than this many milliseconds. */
93
91
  readonly ageMs?: number | undefined;
94
92
  }
93
+ /**
94
+ * Retention policy persisted on the record, split by terminal state —
95
+ * completed jobs are usually noise, failed ones evidence. Applied by the
96
+ * store after terminal acks (scoped to jobs with the same name and state),
97
+ * and honoured by the store's periodic history sweep when one is configured.
98
+ * An absent state keeps its records until the store's `historyTtl` ceiling
99
+ * (forever without one). Producers accept a flat `{ count, age }` shorthand
100
+ * and normalize it to all three states before it reaches a driver.
101
+ *
102
+ * @since 0.1.0
103
+ */
104
+ export interface KeepPolicy {
105
+ readonly completed?: KeepStatePolicy | undefined;
106
+ readonly failed?: KeepStatePolicy | undefined;
107
+ readonly cancelled?: KeepStatePolicy | undefined;
108
+ }
109
+ /**
110
+ * The terminal states retention applies to.
111
+ *
112
+ * @since 0.3.0
113
+ */
114
+ export type TerminalState = "completed" | "failed" | "cancelled";
115
+ /**
116
+ * Store-level retention ceiling: one duration for all terminal states, or a
117
+ * per-state split (an absent state is never swept by the timer).
118
+ *
119
+ * @since 0.3.0
120
+ */
121
+ export type HistoryTtlInput = Duration.Input | {
122
+ readonly completed?: Duration.Input | undefined;
123
+ readonly failed?: Duration.Input | undefined;
124
+ readonly cancelled?: Duration.Input | undefined;
125
+ };
126
+ /**
127
+ * `HistoryTtlInput` normalized to milliseconds per terminal state.
128
+ *
129
+ * @since 0.3.0
130
+ */
131
+ export interface HistoryTtlByState {
132
+ readonly completed?: number | undefined;
133
+ readonly failed?: number | undefined;
134
+ readonly cancelled?: number | undefined;
135
+ }
136
+ /**
137
+ * Normalize a `HistoryTtlInput` to milliseconds per terminal state.
138
+ *
139
+ * @internal
140
+ */
141
+ export declare const normalizeHistoryTtl: (input: HistoryTtlInput) => HistoryTtlByState;
95
142
  /**
96
143
  * One run of a job, persisted so the full run history is durable and
97
144
  * inspectable — the storage-level analogue of `tapError` before a rerun,
@@ -141,6 +188,8 @@ export interface JobRecord {
141
188
  * handler on its next heartbeat and acks `Cancelled`.
142
189
  */
143
190
  readonly cancelRequested: boolean;
191
+ /** The dedup key this job was enqueued under, if any (see `DedupePolicy`). */
192
+ readonly dedupeKey: string | undefined;
144
193
  /** Epoch millis before which the job must not be claimed. */
145
194
  readonly runAt: number;
146
195
  readonly enqueuedAt: number;
@@ -151,6 +200,35 @@ export interface JobRecord {
151
200
  /** Set when the store itself failed the job (e.g. exceeded stall limit). */
152
201
  readonly failedReason: string | undefined;
153
202
  }
203
+ /**
204
+ * Deduplication policy carried on an enqueue request, scoped per job name.
205
+ * Dedup NEVER changes the job id — ids come from the caller, the idempotency
206
+ * key, or the store's id generator; the dedup key is a separate value with
207
+ * its own lifecycle:
208
+ *
209
+ * - `{ key }` (no ttl): dedupe while the keyed job is pending (waiting,
210
+ * delayed, or active); a terminal keyed job frees the key.
211
+ * - `{ key, ttlMs }`: throttle — at most one job per key per window,
212
+ * regardless of the keyed job's completion.
213
+ * - `extend` (requires `ttlMs`): each deduplicated enqueue pushes the window
214
+ * out (debounce).
215
+ * - `replace`: while the keyed job is still *delayed*, the new enqueue's
216
+ * payload/metadata/priority/attempts/backoff/keep/timeout/delay replace the
217
+ * existing job's (id and ledger preserved), and a `ttlMs` window is
218
+ * re-armed from the replace; in every other state normal dedup applies.
219
+ *
220
+ * A deduplicated (or replaced) enqueue returns the keyed job's id with
221
+ * `duplicate: true`.
222
+ *
223
+ * @since 0.3.0
224
+ */
225
+ export interface DedupePolicy {
226
+ /** Non-empty; producers validate before the request reaches a driver. */
227
+ readonly key: string;
228
+ readonly ttlMs: number | undefined;
229
+ readonly extend: boolean;
230
+ readonly replace: boolean;
231
+ }
154
232
  /**
155
233
  * @since 0.1.0
156
234
  */
@@ -170,6 +248,8 @@ export interface EnqueueRequest {
170
248
  readonly backoff: BackoffPolicy | undefined;
171
249
  readonly keep: KeepPolicy | undefined;
172
250
  readonly timeoutMs: number | undefined;
251
+ /** Deduplicate against other enqueues sharing `dedupe.key` (same name). */
252
+ readonly dedupe: DedupePolicy | undefined;
173
253
  readonly delayMs: number;
174
254
  }
175
255
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"JobStore.d.ts","sourceRoot":"","sources":["../src/JobStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"JobStore.d.ts","sourceRoot":"","sources":["../src/JobStore.ts"],"names":[],"mappings":"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"}
package/dist/JobStore.js CHANGED
@@ -16,7 +16,7 @@
16
16
  *
17
17
  * @since 0.1.0
18
18
  */
19
- import { Brand, Context, Cron, Data, Predicate, Result } from "effect";
19
+ import { Brand, Context, Cron, Data, Duration, Predicate, Result } from "effect";
20
20
  /**
21
21
  * Brand a raw string as a `JobId`.
22
22
  *
@@ -35,6 +35,32 @@ export const QueueName = Brand.nominal();
35
35
  * @since 0.2.0
36
36
  */
37
37
  export const ScheduleKey = Brand.nominal();
38
+ /**
39
+ * Normalize a `HistoryTtlInput` to milliseconds per terminal state.
40
+ *
41
+ * @internal
42
+ */
43
+ export const normalizeHistoryTtl = (input) => {
44
+ if (Predicate.isObject(input) && !Duration.isDuration(input)) {
45
+ if (!("completed" in input || "failed" in input || "cancelled" in input)) {
46
+ // {} or a DurationObject would silently normalize to a 0ms ceiling and
47
+ // wipe all history — refuse loudly; use "90 days"-style inputs.
48
+ throw new Error("effect-mq: historyTtl object must set at least one of completed/failed/cancelled");
49
+ }
50
+ // SAFETY: Duration inputs (numbers, strings, bigints, tuples, Duration
51
+ // instances, DurationObjects) never carry terminal-state keys, so this
52
+ // is the per-state split form.
53
+ const split = input;
54
+ return {
55
+ completed: split.completed !== undefined ? Duration.toMillis(split.completed) : undefined,
56
+ failed: split.failed !== undefined ? Duration.toMillis(split.failed) : undefined,
57
+ cancelled: split.cancelled !== undefined ? Duration.toMillis(split.cancelled) : undefined
58
+ };
59
+ }
60
+ // SAFETY: not the split form (checked above), so a plain Duration input.
61
+ const ms = Duration.toMillis(input);
62
+ return { completed: ms, failed: ms, cancelled: ms };
63
+ };
38
64
  /**
39
65
  * A transient or fatal driver error (connection loss, serialization, etc.).
40
66
  *
@@ -1 +1 @@
1
- {"version":3,"file":"JobStore.js","sourceRoot":"","sources":["../src/JobStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"JobStore.js","sourceRoot":"","sources":["../src/JobStore.ts"],"names":[],"mappings":"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"}
@@ -11,17 +11,18 @@
11
11
  * @since 0.1.0
12
12
  */
13
13
  import { type Context, Duration, Effect, Layer, type Scope } from "effect";
14
- import { type IdGenerator, JobStore, type Service } from "./JobStore.ts";
14
+ import { type HistoryTtlInput, type IdGenerator, JobStore, type Service } from "./JobStore.ts";
15
15
  /**
16
16
  * @since 0.2.0
17
17
  */
18
18
  export interface MemoryJobStoreOptions {
19
19
  /**
20
- * Store-level retention ceiling: terminal records (completed, failed,
21
- * cancelled) older than this are removed by a periodic sweep. Per-job
22
- * `keep` policies may only be stricter.
20
+ * Store-level retention ceiling: terminal records older than this are
21
+ * removed by a periodic sweep — one duration for all terminal states or a
22
+ * per-state split (`{ completed: "1 day", failed: "30 days" }`). The sweep
23
+ * also honours stricter per-job `keep.age` rules.
23
24
  */
24
- readonly historyTtl?: Duration.Input | undefined;
25
+ readonly historyTtl?: HistoryTtlInput | undefined;
25
26
  /** Sweep cadence (default 1 minute). */
26
27
  readonly historySweepInterval?: Duration.Input | undefined;
27
28
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"MemoryJobStore.d.ts","sourceRoot":"","sources":["../src/MemoryJobStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAS,KAAK,OAAO,EAAY,QAAQ,EAAE,MAAM,EAAQ,KAAK,EAAU,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAA;AACzG,OAAO,EAKL,KAAK,WAAW,EAQhB,QAAQ,EAOR,KAAK,OAAO,EACb,MAAM,eAAe,CAAA;AA6lBtB;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAA;IAChD,wCAAwC;IACxC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAA;IAC1D;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;CAC/C;AAED;;;;;GAKG;AACH,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAgD,CAAA;AAExF;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,aACT,qBAAqB,GAAG,SAAS,KAC1C,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAaxC,CAAA;AAEJ;;;;GAIG;AACH,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAsC,CAAA;AAE9E;;;;GAIG;AACH,eAAO,MAAM,SAAS,aACV,qBAAqB,GAAG,SAAS,KAC1C,KAAK,CAAC,KAAK,CAAC,QAAQ,CAA8C,CAAA;AAErE;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,EAAE,SAClB,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,YACrB,qBAAqB,GAAG,SAAS,KAC1C,KAAK,CAAC,KAAK,CAAC,EAAE,CAA2C,CAAA"}
1
+ {"version":3,"file":"MemoryJobStore.d.ts","sourceRoot":"","sources":["../src/MemoryJobStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAS,KAAK,OAAO,EAAY,QAAQ,EAAE,MAAM,EAAQ,KAAK,EAAU,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAA;AACzG,OAAO,EAML,KAAK,eAAe,EACpB,KAAK,WAAW,EAShB,QAAQ,EASR,KAAK,OAAO,EACb,MAAM,eAAe,CAAA;AAmuBtB;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,eAAe,GAAG,SAAS,CAAA;IACjD,wCAAwC;IACxC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAA;IAC1D;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;CAC/C;AAED;;;;;GAKG;AACH,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAgD,CAAA;AAExF;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,aACT,qBAAqB,GAAG,SAAS,KAC1C,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAaxC,CAAA;AAEJ;;;;GAIG;AACH,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAsC,CAAA;AAE9E;;;;GAIG;AACH,eAAO,MAAM,SAAS,aACV,qBAAqB,GAAG,SAAS,KAC1C,KAAK,CAAC,KAAK,CAAC,QAAQ,CAA8C,CAAA;AAErE;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,EAAE,SAClB,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,YACrB,qBAAqB,GAAG,SAAS,KAC1C,KAAK,CAAC,KAAK,CAAC,EAAE,CAA2C,CAAA"}
@@ -11,7 +11,7 @@
11
11
  * @since 0.1.0
12
12
  */
13
13
  import { Clock, Deferred, Duration, Effect, Exit, Layer, Option } from "effect";
14
- import { JobId, JobNotCancellableError, JobNotFoundError, JobNotPromotableError, JobNotRetryableError, JobStore, LockLostError, JobStoreError } from "./JobStore.js";
14
+ import { JobId, JobNotCancellableError, JobNotFoundError, JobNotPromotableError, JobNotRetryableError, JobStore, LockLostError, JobStoreError, normalizeHistoryTtl } from "./JobStore.js";
15
15
  const TERMINAL_STATES = new Set(["completed", "failed", "cancelled"]);
16
16
  const snapshot = (job) => ({
17
17
  id: job.id,
@@ -28,6 +28,7 @@ const snapshot = (job) => ({
28
28
  keep: job.keep,
29
29
  timeoutMs: job.timeoutMs,
30
30
  cancelRequested: job.cancelRequested,
31
+ dedupeKey: job.dedupeKey,
31
32
  runAt: job.runAt,
32
33
  enqueuedAt: job.enqueuedAt,
33
34
  processedAt: job.processedAt,
@@ -46,18 +47,42 @@ const makeStoreUnsafe = (options) => {
46
47
  const jobs = new Map();
47
48
  const schedules = new Map();
48
49
  const paused = new Set();
50
+ // Dedup registry: one entry per (name, key). `expiresAt` is set for
51
+ // ttl/throttle windows; pending-mode entries live as long as their job.
52
+ const dedupes = new Map();
53
+ const dedupeMapKey = (name, key) => `${name}\u0000${key}`;
49
54
  let seq = 0;
50
55
  let idCounter = 0;
51
56
  let wakeVersion = 0;
52
- let wake = Deferred.makeUnsafe();
57
+ let lastBroadcast = 0;
58
+ const lastWake = new Map();
59
+ const waiters = new Set();
60
+ const lastWakeFor = (queue) => Math.max(lastWake.get(queue) ?? 0, lastBroadcast);
53
61
  // Synchronous on purpose: it is called inside the same synchronous block as
54
62
  // the state mutation, so no effect-op boundary (where an interrupt could
55
- // land) can separate a mutation from its wake-up signal.
56
- const signalWake = () => {
63
+ // land) can separate a mutation from its wake-up signal. A queue targets
64
+ // only waiters watching it; no queue broadcasts (rare maintenance verbs).
65
+ const signalWake = (queue) => {
57
66
  wakeVersion += 1;
58
- const current = wake;
59
- wake = Deferred.makeUnsafe();
60
- Deferred.doneUnsafe(current, Exit.succeed(void 0));
67
+ if (queue === undefined) {
68
+ lastBroadcast = wakeVersion;
69
+ }
70
+ else {
71
+ lastWake.set(queue, wakeVersion);
72
+ }
73
+ // Snapshot-and-clear BEFORE resolving: doneUnsafe resumes waiting fibers
74
+ // synchronously, and a woken taker that re-parks registers a NEW waiter —
75
+ // resolving inside the live Set iteration would visit it and livelock.
76
+ const toWake = [];
77
+ for (const waiter of waiters) {
78
+ if (queue === undefined || waiter.queues.has(queue)) {
79
+ waiters.delete(waiter);
80
+ toWake.push(waiter);
81
+ }
82
+ }
83
+ for (const waiter of toWake) {
84
+ Deferred.doneUnsafe(waiter.deferred, Exit.succeed(void 0));
85
+ }
61
86
  };
62
87
  const promoteDue = (now) => {
63
88
  for (const job of jobs.values()) {
@@ -79,32 +104,68 @@ const makeStoreUnsafe = (options) => {
79
104
  exit
80
105
  });
81
106
  };
107
+ // A job leaving the pending states frees its pending-mode dedup entry;
108
+ // live throttle windows deliberately outlast the job.
109
+ const releaseDedupe = (job, now) => {
110
+ if (job.dedupeKey === undefined)
111
+ return;
112
+ const key = dedupeMapKey(job.name, job.dedupeKey);
113
+ const entry = dedupes.get(key);
114
+ if (entry !== undefined && entry.jobId === job.id &&
115
+ (entry.expiresAt === undefined || entry.expiresAt <= now)) {
116
+ dedupes.delete(key);
117
+ }
118
+ };
82
119
  const markCancelled = (job, now) => {
83
120
  clearLock(job);
84
121
  job.cancelRequested = false;
85
122
  job.state = "cancelled";
86
123
  job.finishedAt = now;
87
124
  recordAttempt(job, "cancelled", now, undefined);
125
+ releaseDedupe(job, now);
88
126
  applyKeep(job, now);
89
127
  };
128
+ const keepPolicyFor = (keep, state) => {
129
+ if (keep === undefined)
130
+ return undefined;
131
+ const policy = state === "completed"
132
+ ? keep.completed
133
+ : state === "failed"
134
+ ? keep.failed
135
+ : state === "cancelled"
136
+ ? keep.cancelled
137
+ : undefined;
138
+ if (policy !== undefined)
139
+ return policy;
140
+ // Records persisted by 0.2.x carry the flat {count, ageMs} shape — honour
141
+ // it as an all-states policy so upgrades keep pruning.
142
+ if (keep.completed === undefined && keep.failed === undefined && keep.cancelled === undefined &&
143
+ ("count" in keep || "ageMs" in keep)) {
144
+ // SAFETY: the flat legacy shape carries KeepStatePolicy fields.
145
+ return keep;
146
+ }
147
+ return undefined;
148
+ };
90
149
  // Terminal retention: keep at most `count` and drop older than `ageMs`
91
- // among terminal jobs sharing this job's name + state.
150
+ // among terminal jobs sharing this job's name + state (policies are split
151
+ // per terminal state).
92
152
  const applyKeep = (job, now) => {
93
- if (job.keep === undefined)
153
+ const policy = keepPolicyFor(job.keep, job.state);
154
+ if (policy === undefined)
94
155
  return;
95
156
  const peers = Array.from(jobs.values())
96
157
  .filter((peer) => peer.name === job.name && peer.state === job.state)
97
158
  .toSorted((a, b) => ((b.finishedAt ?? 0) - (a.finishedAt ?? 0)) || (b.seq - a.seq));
98
159
  const remove = new Set();
99
- if (job.keep.ageMs !== undefined) {
160
+ if (policy.ageMs !== undefined) {
100
161
  for (const peer of peers) {
101
- if (peer.finishedAt !== undefined && peer.finishedAt <= now - job.keep.ageMs) {
162
+ if (peer.finishedAt !== undefined && peer.finishedAt <= now - policy.ageMs) {
102
163
  remove.add(peer.id);
103
164
  }
104
165
  }
105
166
  }
106
- if (job.keep.count !== undefined) {
107
- for (const peer of peers.slice(Math.max(0, job.keep.count))) {
167
+ if (policy.count !== undefined) {
168
+ for (const peer of peers.slice(Math.max(0, policy.count))) {
108
169
  remove.add(peer.id);
109
170
  }
110
171
  }
@@ -112,18 +173,75 @@ const makeStoreUnsafe = (options) => {
112
173
  jobs.delete(id);
113
174
  }
114
175
  };
115
- const sweepHistory = (now, ttlMs) => {
176
+ const sweepHistory = (now, ttlByState) => {
116
177
  for (const job of jobs.values()) {
117
- if (TERMINAL_STATES.has(job.state) &&
118
- job.finishedAt !== undefined &&
119
- job.finishedAt <= now - ttlMs) {
178
+ if (!TERMINAL_STATES.has(job.state) || job.finishedAt === undefined)
179
+ continue;
180
+ // SAFETY: TERMINAL_STATES membership was checked above.
181
+ const state = job.state;
182
+ const ttl = ttlByState[state];
183
+ const keepAge = keepPolicyFor(job.keep, state)?.ageMs;
184
+ // The sweep honours min(per-row keep age, store ceiling) — a quiet job
185
+ // name is pruned on the timer, not only when its group is acked.
186
+ const effective = keepAge !== undefined && (ttl === undefined || keepAge < ttl) ? keepAge : ttl;
187
+ if (effective !== undefined && job.finishedAt <= now - effective) {
120
188
  jobs.delete(job.id);
121
189
  }
122
190
  }
191
+ // Dead dedup entries: expired window, or a pointer at a vanished job.
192
+ for (const [key, entry] of dedupes) {
193
+ const alive = entry.expiresAt !== undefined
194
+ ? entry.expiresAt > now
195
+ : jobs.has(entry.jobId) && !TERMINAL_STATES.has(jobs.get(entry.jobId)?.state ?? "completed");
196
+ if (!alive)
197
+ dedupes.delete(key);
198
+ }
123
199
  };
124
200
  const service = JobStore.of({
125
201
  enqueue: (request) => Effect.gen(function* () {
126
202
  const now = yield* Clock.currentTimeMillis;
203
+ if (request.id !== undefined && jobs.has(request.id)) {
204
+ return { id: request.id, duplicate: true };
205
+ }
206
+ // The dedup decision tree runs BEFORE id generation, so a
207
+ // deduplicated enqueue never consults the id generator.
208
+ if (request.dedupe !== undefined) {
209
+ const mapKey = dedupeMapKey(request.name, request.dedupe.key);
210
+ const entry = dedupes.get(mapKey);
211
+ if (entry !== undefined) {
212
+ const keyed = jobs.get(entry.jobId);
213
+ const windowLive = entry.expiresAt !== undefined && now < entry.expiresAt;
214
+ // Latest-wins while the keyed job is still delayed.
215
+ if (request.dedupe.replace && keyed !== undefined && keyed.state === "delayed") {
216
+ keyed.payload = request.payload;
217
+ keyed.metadata = request.metadata;
218
+ keyed.priority = request.priority;
219
+ keyed.attemptsMax = request.attemptsMax;
220
+ keyed.backoff = request.backoff;
221
+ keyed.keep = request.keep;
222
+ keyed.timeoutMs = request.timeoutMs;
223
+ keyed.runAt = now + Math.max(0, request.delayMs);
224
+ // A landed replace re-arms the ttl window.
225
+ if (request.dedupe.ttlMs !== undefined) {
226
+ entry.expiresAt = now + request.dedupe.ttlMs;
227
+ }
228
+ signalWake(keyed.queue);
229
+ return { id: keyed.id, duplicate: true };
230
+ }
231
+ if (windowLive) {
232
+ if (request.dedupe.extend && request.dedupe.ttlMs !== undefined) {
233
+ entry.expiresAt = now + request.dedupe.ttlMs;
234
+ }
235
+ return { id: entry.jobId, duplicate: true };
236
+ }
237
+ const pending = keyed !== undefined && !TERMINAL_STATES.has(keyed.state);
238
+ if (entry.expiresAt === undefined && pending) {
239
+ return { id: entry.jobId, duplicate: true };
240
+ }
241
+ // Dead entry (expired window / finished job): fall through and
242
+ // let the new job take over the key below.
243
+ }
244
+ }
127
245
  let id = request.id;
128
246
  if (id === undefined) {
129
247
  const generate = options?.idGenerator;
@@ -150,9 +268,6 @@ const makeStoreUnsafe = (options) => {
150
268
  }
151
269
  }
152
270
  }
153
- else if (jobs.has(id)) {
154
- return { id, duplicate: true };
155
- }
156
271
  jobs.set(id, {
157
272
  id,
158
273
  name: request.name,
@@ -168,6 +283,7 @@ const makeStoreUnsafe = (options) => {
168
283
  keep: request.keep,
169
284
  timeoutMs: request.timeoutMs,
170
285
  cancelRequested: false,
286
+ dedupeKey: request.dedupe?.key,
171
287
  runAt: now + Math.max(0, request.delayMs),
172
288
  enqueuedAt: now,
173
289
  processedAt: undefined,
@@ -179,7 +295,13 @@ const makeStoreUnsafe = (options) => {
179
295
  lockToken: undefined,
180
296
  lockExpiresAt: undefined
181
297
  });
182
- signalWake();
298
+ if (request.dedupe !== undefined) {
299
+ dedupes.set(dedupeMapKey(request.name, request.dedupe.key), {
300
+ jobId: id,
301
+ expiresAt: request.dedupe.ttlMs !== undefined ? now + request.dedupe.ttlMs : undefined
302
+ });
303
+ }
304
+ signalWake(request.queue);
183
305
  return { id, duplicate: false };
184
306
  }),
185
307
  claim: (options) => Effect.gen(function* () {
@@ -233,6 +355,7 @@ const makeStoreUnsafe = (options) => {
233
355
  job.exit = outcome.exit;
234
356
  job.finishedAt = now;
235
357
  recordAttempt(job, "completed", now, outcome.exit);
358
+ releaseDedupe(job, now);
236
359
  applyKeep(job, now);
237
360
  break;
238
361
  }
@@ -242,6 +365,7 @@ const makeStoreUnsafe = (options) => {
242
365
  job.exit = outcome.exit;
243
366
  job.finishedAt = now;
244
367
  recordAttempt(job, "failed", now, outcome.exit);
368
+ releaseDedupe(job, now);
245
369
  applyKeep(job, now);
246
370
  break;
247
371
  }
@@ -250,6 +374,7 @@ const makeStoreUnsafe = (options) => {
250
374
  job.state = "cancelled";
251
375
  job.finishedAt = now;
252
376
  recordAttempt(job, "cancelled", now, undefined);
377
+ releaseDedupe(job, now);
253
378
  applyKeep(job, now);
254
379
  break;
255
380
  }
@@ -265,7 +390,7 @@ const makeStoreUnsafe = (options) => {
265
390
  job.runAt = now + Math.max(0, outcome.delayMs);
266
391
  job.state = outcome.delayMs > 0 ? "delayed" : "waiting";
267
392
  job.seq = ++seq;
268
- signalWake();
393
+ signalWake(job.queue);
269
394
  break;
270
395
  }
271
396
  }
@@ -287,7 +412,7 @@ const makeStoreUnsafe = (options) => {
287
412
  }
288
413
  clearLock(job);
289
414
  job.state = "waiting";
290
- signalWake();
415
+ signalWake(job.queue);
291
416
  }),
292
417
  extendLocks: (locks, durationMs) => Effect.gen(function* () {
293
418
  const now = yield* Clock.currentTimeMillis;
@@ -331,6 +456,7 @@ const makeStoreUnsafe = (options) => {
331
456
  job.state = "failed";
332
457
  job.finishedAt = now;
333
458
  job.failedReason = "job stalled more than allowable limit";
459
+ releaseDedupe(job, now);
334
460
  recovered.push({ id: job.id, failed: true });
335
461
  }
336
462
  else {
@@ -343,10 +469,12 @@ const makeStoreUnsafe = (options) => {
343
469
  }
344
470
  return recovered;
345
471
  }),
346
- awaitWake: (_queues, wakeToken) => Effect.suspend(() => {
347
- if (wakeVersion > wakeToken)
472
+ awaitWake: (queues, wakeToken) => Effect.suspend(() => {
473
+ if (queues.some((queue) => lastWakeFor(queue) > wakeToken))
348
474
  return Effect.void;
349
- return Deferred.await(wake);
475
+ const waiter = { queues: new Set(queues), deferred: Deferred.makeUnsafe() };
476
+ waiters.add(waiter);
477
+ return Deferred.await(waiter.deferred).pipe(Effect.ensuring(Effect.sync(() => waiters.delete(waiter))));
350
478
  }),
351
479
  getJob: (id) => Effect.sync(() => {
352
480
  const job = jobs.get(id);
@@ -412,7 +540,7 @@ const makeStoreUnsafe = (options) => {
412
540
  job.processedAt = undefined;
413
541
  job.runAt = now;
414
542
  job.seq = ++seq;
415
- signalWake();
543
+ signalWake(job.queue);
416
544
  }),
417
545
  cancel: (id) => Effect.gen(function* () {
418
546
  const now = yield* Clock.currentTimeMillis;
@@ -446,14 +574,14 @@ const makeStoreUnsafe = (options) => {
446
574
  }
447
575
  job.state = "waiting";
448
576
  job.runAt = now;
449
- signalWake();
577
+ signalWake(job.queue);
450
578
  }),
451
579
  pause: (queue) => Effect.sync(() => {
452
580
  paused.add(queue);
453
581
  }),
454
582
  resume: (queue) => Effect.sync(() => {
455
583
  if (paused.delete(queue)) {
456
- signalWake();
584
+ signalWake(queue);
457
585
  }
458
586
  }),
459
587
  pausedQueues: () => Effect.sync(() => Array.from(paused)),
@@ -467,7 +595,7 @@ const makeStoreUnsafe = (options) => {
467
595
  existing.tz === schedule.tz &&
468
596
  existing.everyMs === schedule.everyMs;
469
597
  schedules.set(schedule.key, sameCadence ? { ...schedule, nextRunAt: existing.nextRunAt } : schedule);
470
- signalWake();
598
+ signalWake(schedule.queue);
471
599
  }),
472
600
  removeSchedule: (key) => Effect.sync(() => schedules.delete(key)),
473
601
  listSchedules: (options) => Effect.sync(() => Array.from(schedules.values()).filter((schedule) => (options?.jobName === undefined || schedule.jobName === options.jobName) &&
@@ -526,12 +654,12 @@ export const make = Effect.sync(() => makeStoreUnsafe().service);
526
654
  export const makeWith = (options) => Effect.gen(function* () {
527
655
  const { service, sweepHistory } = makeStoreUnsafe(options);
528
656
  if (options?.historyTtl !== undefined) {
529
- const ttlMs = Duration.toMillis(options.historyTtl);
657
+ const ttlByState = normalizeHistoryTtl(options.historyTtl);
530
658
  const intervalMs = Duration.toMillis(options.historySweepInterval ?? "1 minute");
531
659
  yield* Effect.gen(function* () {
532
660
  yield* Effect.sleep(intervalMs);
533
661
  const now = yield* Clock.currentTimeMillis;
534
- sweepHistory(now, ttlMs);
662
+ sweepHistory(now, ttlByState);
535
663
  }).pipe(Effect.forever, Effect.forkScoped);
536
664
  }
537
665
  return service;