fix: close durable queue and runtime gaps
Quality / quality (ubuntu-latest) (push) Failing after 9m54s
Quality / quality (windows-latest) (push) Canceled after 0s

This commit is contained in:
Clintchiz committed 2026-08-23 20:47:00 +05:30
1 parent 1a94179b5f
commit a9670c2a1c
19 files changed
+198 -26

No files matched your search

+19 -8
View File
@@ -23,9 +23,19 @@ export function redisQueueStore(client: RedisQueueClient, prefix = "wrnexus:queu
const jobs = `${prefix}:jobs`;
const due = `${prefix}:due`;
const key = (id: string) => `${prefix}:job:${id}`;
const idempotencyKey = (name: string, value: string) =>
`${prefix}:idempotency:${encodeURIComponent(name)}:${encodeURIComponent(value)}`;
return {
async put(job) {
const previousValue = await client.get(key(job.id));
const previous = previousValue ? (JSON.parse(previousValue) as Job) : null;
if (previous?.idempotencyKey && previous.idempotencyKey !== job.idempotencyKey) {
await client.del(idempotencyKey(previous.name, previous.idempotencyKey));
}
await client.set(key(job.id), JSON.stringify(job));
if (job.idempotencyKey) {
await client.set(idempotencyKey(job.name, job.idempotencyKey), job.id);
}
await client.sadd(jobs, job.id);
await client.zadd(due, job.runAt, job.id);
await client.del(`${prefix}:lease:${job.id}`);
@@ -35,7 +45,11 @@ export function redisQueueStore(client: RedisQueueClient, prefix = "wrnexus:queu
return value ? (JSON.parse(value) as Job) : null;
},
async remove(id) {
await client.del(key(id), `${prefix}:lease:${id}`);
const value = await client.get(key(id));
const job = value ? (JSON.parse(value) as Job) : null;
const keys = [key(id), `${prefix}:lease:${id}`];
if (job?.idempotencyKey) keys.push(idempotencyKey(job.name, job.idempotencyKey));
await client.del(...keys);
await client.srem(jobs, id);
await client.zrem(due, id);
},
@@ -55,13 +69,10 @@ export function redisQueueStore(client: RedisQueueClient, prefix = "wrnexus:queu
.filter((job) => !name || job.name === name);
},
async findByIdempotencyKey(name, idempotencyKey) {
const ids = await client.smembers(jobs);
const values = await Promise.all(ids.map((id) => client.get(key(id))));
const found = values
.filter((value): value is string => value !== null)
.map((value) => JSON.parse(value) as Job)
.find((job) => job.name === name && job.idempotencyKey === idempotencyKey);
return found ?? null;
const id = await client.get(
`${prefix}:idempotency:${encodeURIComponent(name)}:${encodeURIComponent(idempotencyKey)}`,
);
return id ? this.get(id) : null;
},
async size() {
return (await client.smembers(jobs)).length;