@vielzeug/postmaster 2.0.0 → 2.2.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.
@@ -1 +1 @@
1
- {"version":3,"file":"memory-store.cjs","names":[],"sources":["../../src/testing/memory-store.ts"],"sourcesContent":["import type { EntryFilter, PostmasterStats, PostmasterStore, StoredJob, StoreTx } from '../types.ts';\n\nfunction normalize(entry: StoredJob): StoredJob {\n const { failure, leaseExpiresAt, ownerId, ...rest } = entry;\n return {\n ...rest,\n ...(failure !== undefined ? { failure } : {}),\n ...(leaseExpiresAt !== undefined ? { leaseExpiresAt } : {}),\n ...(ownerId !== undefined ? { ownerId } : {}),\n };\n}\n\nexport function createMemoryPostmasterStore(entries: readonly StoredJob[] = []): PostmasterStore {\n const records = new Map(entries.map((entry) => [entry.id, normalize(entry)]));\n const controller = new AbortController();\n const listeners = new Set<() => void>();\n let disposed = false;\n let chain = Promise.resolve();\n\n const exclusive = <T>(fn: () => T | Promise<T>): Promise<T> => {\n const result = chain.then(fn, fn);\n chain = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n };\n\n const notify = (): void => {\n for (const listener of listeners) listener();\n };\n\n const live = (): void => {\n if (disposed) throw new Error('Postmaster store is disposed');\n };\n\n const tx: StoreTx = {\n async countByStatus(): Promise<PostmasterStats> {\n let deadLetter = 0;\n let queued = 0;\n let running = 0;\n for (const entry of records.values()) {\n if (entry.status === 'dead-letter') deadLetter += 1;\n else if (entry.status === 'queued') queued += 1;\n else running += 1;\n }\n return { deadLetter, queued, running };\n },\n async delete(id: string): Promise<void> {\n records.delete(id);\n },\n async findClaimable(now: number): Promise<StoredJob | undefined> {\n let best: StoredJob | undefined;\n for (const entry of records.values()) {\n const claimable =\n (entry.status === 'queued' && entry.availableAt <= now) ||\n (entry.status === 'running' && (entry.leaseExpiresAt ?? 0) <= now);\n if (!claimable) continue;\n if (\n !best ||\n entry.availableAt < best.availableAt ||\n (entry.availableAt === best.availableAt && entry.createdAt < best.createdAt)\n ) {\n best = entry;\n }\n }\n return best ? normalize(best) : undefined;\n },\n async findNextWake(now: number): Promise<number | undefined> {\n let next: number | undefined;\n for (const entry of records.values()) {\n let wake: number | undefined;\n if (entry.status === 'queued' && entry.availableAt > now) wake = entry.availableAt;\n else if (entry.status === 'running' && (entry.leaseExpiresAt ?? 0) > now) wake = entry.leaseExpiresAt;\n if (wake !== undefined && (next === undefined || wake < next)) next = wake;\n }\n return next;\n },\n async get(id: string): Promise<StoredJob | undefined> {\n const entry = records.get(id);\n return entry ? normalize(entry) : undefined;\n },\n async put(entry: StoredJob): Promise<void> {\n records.set(entry.id, normalize(entry));\n },\n };\n\n return {\n get disposalSignal() {\n return controller.signal;\n },\n async dispose(): Promise<void> {\n if (disposed) return;\n disposed = true;\n controller.abort();\n listeners.clear();\n },\n get disposed() {\n return disposed;\n },\n async list(filter?: EntryFilter): Promise<StoredJob[]> {\n return exclusive(() => {\n live();\n return [...records.values()]\n .filter((entry) => filter?.status === undefined || entry.status === filter.status)\n .sort((a, b) => a.createdAt - b.createdAt)\n .map(normalize);\n });\n },\n subscribe(listener: () => void): () => void {\n live();\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n transact<T>(fn: (tx: StoreTx) => Promise<T>): Promise<T> {\n return exclusive(async () => {\n live();\n const result = await fn(tx);\n notify();\n return result;\n });\n },\n async [Symbol.asyncDispose](): Promise<void> {\n await this.dispose();\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"memory-store.cjs","names":[],"sources":["../../src/testing/memory-store.ts"],"sourcesContent":["import { normalize } from '../_store-utils.ts';\nimport type { EntryFilter, PostmasterStats, PostmasterStore, StoredJob, StoreTx } from '../types.ts';\n\nexport function createMemoryPostmasterStore(entries: readonly StoredJob[] = []): PostmasterStore {\n const records = new Map(entries.map((entry) => [entry.id, normalize(entry)]));\n const controller = new AbortController();\n const listeners = new Set<() => void>();\n let disposed = false;\n let chain = Promise.resolve();\n\n const exclusive = <T>(fn: () => T | Promise<T>): Promise<T> => {\n const result = chain.then(fn, fn);\n chain = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n };\n\n const notify = (): void => {\n for (const listener of listeners) listener();\n };\n\n const live = (): void => {\n if (disposed) throw new Error('Postmaster store is disposed');\n };\n\n const tx: StoreTx = {\n async countByStatus(): Promise<PostmasterStats> {\n let deadLetter = 0;\n let queued = 0;\n let running = 0;\n for (const entry of records.values()) {\n if (entry.status === 'dead-letter') deadLetter += 1;\n else if (entry.status === 'queued') queued += 1;\n else running += 1;\n }\n return { deadLetter, queued, running };\n },\n async delete(id: string): Promise<void> {\n records.delete(id);\n },\n async findClaimable(now: number): Promise<StoredJob | undefined> {\n let best: StoredJob | undefined;\n for (const entry of records.values()) {\n const claimable =\n (entry.status === 'queued' && entry.availableAt <= now) ||\n (entry.status === 'running' && (entry.leaseExpiresAt ?? 0) <= now);\n if (!claimable) continue;\n if (\n !best ||\n entry.availableAt < best.availableAt ||\n (entry.availableAt === best.availableAt && entry.createdAt < best.createdAt)\n ) {\n best = entry;\n }\n }\n return best ? normalize(best) : undefined;\n },\n async findNextWake(now: number): Promise<number | undefined> {\n let next: number | undefined;\n for (const entry of records.values()) {\n let wake: number | undefined;\n if (entry.status === 'queued' && entry.availableAt > now) wake = entry.availableAt;\n else if (entry.status === 'running' && (entry.leaseExpiresAt ?? 0) > now) wake = entry.leaseExpiresAt;\n if (wake !== undefined && (next === undefined || wake < next)) next = wake;\n }\n return next;\n },\n async get(id: string): Promise<StoredJob | undefined> {\n const entry = records.get(id);\n return entry ? normalize(entry) : undefined;\n },\n async put(entry: StoredJob): Promise<void> {\n records.set(entry.id, normalize(entry));\n },\n };\n\n return {\n get disposalSignal() {\n return controller.signal;\n },\n async dispose(): Promise<void> {\n if (disposed) return;\n disposed = true;\n controller.abort();\n listeners.clear();\n },\n get disposed() {\n return disposed;\n },\n async list(filter?: EntryFilter): Promise<StoredJob[]> {\n return exclusive(() => {\n live();\n return [...records.values()]\n .filter((entry) => filter?.status === undefined || entry.status === filter.status)\n .sort((a, b) => a.createdAt - b.createdAt)\n .map(normalize);\n });\n },\n subscribe(listener: () => void): () => void {\n live();\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n transact<T>(fn: (tx: StoreTx) => Promise<T>): Promise<T> {\n return exclusive(async () => {\n live();\n const result = await fn(tx);\n notify();\n return result;\n });\n },\n async [Symbol.asyncDispose](): Promise<void> {\n await this.dispose();\n },\n };\n}\n"],"mappings":"uCAGA,SAAgB,EAA4B,EAAgC,CAAC,EAAoB,CAC/F,IAAM,EAAU,IAAI,IAAI,EAAQ,IAAK,GAAU,CAAC,EAAM,GAAI,EAAA,UAAU,CAAK,CAAC,CAAC,CAAC,EACtE,EAAa,IAAI,gBACjB,EAAY,IAAI,IAClB,EAAW,GACX,EAAQ,QAAQ,QAAQ,EAEtB,EAAgB,GAAyC,CAC7D,IAAM,EAAS,EAAM,KAAK,EAAI,CAAE,EAKhC,MAJA,GAAQ,EAAO,SACP,IAAA,OACA,IAAA,EACR,EACO,CACT,EAEM,MAAqB,CACzB,IAAK,IAAM,KAAY,EAAW,EAAS,CAC7C,EAEM,MAAmB,CACvB,GAAI,EAAU,MAAU,MAAM,8BAA8B,CAC9D,EAEM,EAAc,CAClB,MAAM,eAA0C,CAC9C,IAAI,EAAa,EACb,EAAS,EACT,EAAU,EACd,IAAK,IAAM,KAAS,EAAQ,OAAO,EAC7B,EAAM,SAAW,cAAe,GAAc,EACzC,EAAM,SAAW,SAAU,GAAU,EACzC,GAAW,EAElB,MAAO,CAAE,aAAY,SAAQ,SAAQ,CACvC,EACA,MAAM,OAAO,EAA2B,CACtC,EAAQ,OAAO,CAAE,CACnB,EACA,MAAM,cAAc,EAA6C,CAC/D,IAAI,EACJ,IAAK,IAAM,KAAS,EAAQ,OAAO,GAE9B,EAAM,SAAW,UAAY,EAAM,aAAe,GAClD,EAAM,SAAW,YAAc,EAAM,gBAAkB,IAAM,KAG9D,CAAC,GACD,EAAM,YAAc,EAAK,aACxB,EAAM,cAAgB,EAAK,aAAe,EAAM,UAAY,EAAK,aAElE,EAAO,GAGX,OAAO,EAAO,EAAA,UAAU,CAAI,EAAI,IAAA,EAClC,EACA,MAAM,aAAa,EAA0C,CAC3D,IAAI,EACJ,IAAK,IAAM,KAAS,EAAQ,OAAO,EAAG,CACpC,IAAI,EACA,EAAM,SAAW,UAAY,EAAM,YAAc,EAAK,EAAO,EAAM,YAC9D,EAAM,SAAW,YAAc,EAAM,gBAAkB,GAAK,IAAK,EAAO,EAAM,gBACnF,IAAS,IAAA,KAAc,IAAS,IAAA,IAAa,EAAO,KAAO,EAAO,EACxE,CACA,OAAO,CACT,EACA,MAAM,IAAI,EAA4C,CACpD,IAAM,EAAQ,EAAQ,IAAI,CAAE,EAC5B,OAAO,EAAQ,EAAA,UAAU,CAAK,EAAI,IAAA,EACpC,EACA,MAAM,IAAI,EAAiC,CACzC,EAAQ,IAAI,EAAM,GAAI,EAAA,UAAU,CAAK,CAAC,CACxC,CACF,EAEA,MAAO,CACL,IAAI,gBAAiB,CACnB,OAAO,EAAW,MACpB,EACA,MAAM,SAAyB,CACzB,IACJ,EAAW,GACX,EAAW,MAAM,EACjB,EAAU,MAAM,EAClB,EACA,IAAI,UAAW,CACb,OAAO,CACT,EACA,MAAM,KAAK,EAA4C,CACrD,OAAO,OACL,EAAK,EACE,CAAC,GAAG,EAAQ,OAAO,CAAC,CAAC,CACzB,OAAQ,GAAU,GAAQ,SAAW,IAAA,IAAa,EAAM,SAAW,EAAO,MAAM,CAAC,CACjF,MAAM,EAAG,IAAM,EAAE,UAAY,EAAE,SAAS,CAAC,CACzC,IAAI,EAAA,SAAS,EACjB,CACH,EACA,UAAU,EAAkC,CAG1C,OAFA,EAAK,EACL,EAAU,IAAI,CAAQ,MACT,EAAU,OAAO,CAAQ,CACxC,EACA,SAAY,EAA6C,CACvD,OAAO,EAAU,SAAY,CAC3B,EAAK,EACL,IAAM,EAAS,MAAM,EAAG,CAAE,EAE1B,OADA,EAAO,EACA,CACT,CAAC,CACH,EACA,MAAO,OAAO,eAA+B,CAC3C,MAAM,KAAK,QAAQ,CACrB,CACF,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../../src/testing/memory-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgC,eAAe,EAAE,SAAS,EAAW,MAAM,aAAa,CAAC;AAYrG,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,SAAS,SAAS,EAAO,GAAG,eAAe,CAkH/F"}
1
+ {"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../../src/testing/memory-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgC,eAAe,EAAE,SAAS,EAAW,MAAM,aAAa,CAAC;AAErG,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,SAAS,SAAS,EAAO,GAAG,eAAe,CAkH/F"}
@@ -1,13 +1,5 @@
1
+ import { normalize as e } from "../_store-utils.js";
1
2
  //#region src/testing/memory-store.ts
2
- function e(e) {
3
- let { failure: t, leaseExpiresAt: n, ownerId: r, ...i } = e;
4
- return {
5
- ...i,
6
- ...t === void 0 ? {} : { failure: t },
7
- ...n === void 0 ? {} : { leaseExpiresAt: n },
8
- ...r === void 0 ? {} : { ownerId: r }
9
- };
10
- }
11
3
  function t(t = []) {
12
4
  let n = new Map(t.map((t) => [t.id, e(t)])), r = new AbortController(), i = /* @__PURE__ */ new Set(), a = !1, o = Promise.resolve(), s = (e) => {
13
5
  let t = o.then(e, e);
@@ -1 +1 @@
1
- {"version":3,"file":"memory-store.js","names":[],"sources":["../../src/testing/memory-store.ts"],"sourcesContent":["import type { EntryFilter, PostmasterStats, PostmasterStore, StoredJob, StoreTx } from '../types.ts';\n\nfunction normalize(entry: StoredJob): StoredJob {\n const { failure, leaseExpiresAt, ownerId, ...rest } = entry;\n return {\n ...rest,\n ...(failure !== undefined ? { failure } : {}),\n ...(leaseExpiresAt !== undefined ? { leaseExpiresAt } : {}),\n ...(ownerId !== undefined ? { ownerId } : {}),\n };\n}\n\nexport function createMemoryPostmasterStore(entries: readonly StoredJob[] = []): PostmasterStore {\n const records = new Map(entries.map((entry) => [entry.id, normalize(entry)]));\n const controller = new AbortController();\n const listeners = new Set<() => void>();\n let disposed = false;\n let chain = Promise.resolve();\n\n const exclusive = <T>(fn: () => T | Promise<T>): Promise<T> => {\n const result = chain.then(fn, fn);\n chain = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n };\n\n const notify = (): void => {\n for (const listener of listeners) listener();\n };\n\n const live = (): void => {\n if (disposed) throw new Error('Postmaster store is disposed');\n };\n\n const tx: StoreTx = {\n async countByStatus(): Promise<PostmasterStats> {\n let deadLetter = 0;\n let queued = 0;\n let running = 0;\n for (const entry of records.values()) {\n if (entry.status === 'dead-letter') deadLetter += 1;\n else if (entry.status === 'queued') queued += 1;\n else running += 1;\n }\n return { deadLetter, queued, running };\n },\n async delete(id: string): Promise<void> {\n records.delete(id);\n },\n async findClaimable(now: number): Promise<StoredJob | undefined> {\n let best: StoredJob | undefined;\n for (const entry of records.values()) {\n const claimable =\n (entry.status === 'queued' && entry.availableAt <= now) ||\n (entry.status === 'running' && (entry.leaseExpiresAt ?? 0) <= now);\n if (!claimable) continue;\n if (\n !best ||\n entry.availableAt < best.availableAt ||\n (entry.availableAt === best.availableAt && entry.createdAt < best.createdAt)\n ) {\n best = entry;\n }\n }\n return best ? normalize(best) : undefined;\n },\n async findNextWake(now: number): Promise<number | undefined> {\n let next: number | undefined;\n for (const entry of records.values()) {\n let wake: number | undefined;\n if (entry.status === 'queued' && entry.availableAt > now) wake = entry.availableAt;\n else if (entry.status === 'running' && (entry.leaseExpiresAt ?? 0) > now) wake = entry.leaseExpiresAt;\n if (wake !== undefined && (next === undefined || wake < next)) next = wake;\n }\n return next;\n },\n async get(id: string): Promise<StoredJob | undefined> {\n const entry = records.get(id);\n return entry ? normalize(entry) : undefined;\n },\n async put(entry: StoredJob): Promise<void> {\n records.set(entry.id, normalize(entry));\n },\n };\n\n return {\n get disposalSignal() {\n return controller.signal;\n },\n async dispose(): Promise<void> {\n if (disposed) return;\n disposed = true;\n controller.abort();\n listeners.clear();\n },\n get disposed() {\n return disposed;\n },\n async list(filter?: EntryFilter): Promise<StoredJob[]> {\n return exclusive(() => {\n live();\n return [...records.values()]\n .filter((entry) => filter?.status === undefined || entry.status === filter.status)\n .sort((a, b) => a.createdAt - b.createdAt)\n .map(normalize);\n });\n },\n subscribe(listener: () => void): () => void {\n live();\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n transact<T>(fn: (tx: StoreTx) => Promise<T>): Promise<T> {\n return exclusive(async () => {\n live();\n const result = await fn(tx);\n notify();\n return result;\n });\n },\n async [Symbol.asyncDispose](): Promise<void> {\n await this.dispose();\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"memory-store.js","names":[],"sources":["../../src/testing/memory-store.ts"],"sourcesContent":["import { normalize } from '../_store-utils.ts';\nimport type { EntryFilter, PostmasterStats, PostmasterStore, StoredJob, StoreTx } from '../types.ts';\n\nexport function createMemoryPostmasterStore(entries: readonly StoredJob[] = []): PostmasterStore {\n const records = new Map(entries.map((entry) => [entry.id, normalize(entry)]));\n const controller = new AbortController();\n const listeners = new Set<() => void>();\n let disposed = false;\n let chain = Promise.resolve();\n\n const exclusive = <T>(fn: () => T | Promise<T>): Promise<T> => {\n const result = chain.then(fn, fn);\n chain = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n };\n\n const notify = (): void => {\n for (const listener of listeners) listener();\n };\n\n const live = (): void => {\n if (disposed) throw new Error('Postmaster store is disposed');\n };\n\n const tx: StoreTx = {\n async countByStatus(): Promise<PostmasterStats> {\n let deadLetter = 0;\n let queued = 0;\n let running = 0;\n for (const entry of records.values()) {\n if (entry.status === 'dead-letter') deadLetter += 1;\n else if (entry.status === 'queued') queued += 1;\n else running += 1;\n }\n return { deadLetter, queued, running };\n },\n async delete(id: string): Promise<void> {\n records.delete(id);\n },\n async findClaimable(now: number): Promise<StoredJob | undefined> {\n let best: StoredJob | undefined;\n for (const entry of records.values()) {\n const claimable =\n (entry.status === 'queued' && entry.availableAt <= now) ||\n (entry.status === 'running' && (entry.leaseExpiresAt ?? 0) <= now);\n if (!claimable) continue;\n if (\n !best ||\n entry.availableAt < best.availableAt ||\n (entry.availableAt === best.availableAt && entry.createdAt < best.createdAt)\n ) {\n best = entry;\n }\n }\n return best ? normalize(best) : undefined;\n },\n async findNextWake(now: number): Promise<number | undefined> {\n let next: number | undefined;\n for (const entry of records.values()) {\n let wake: number | undefined;\n if (entry.status === 'queued' && entry.availableAt > now) wake = entry.availableAt;\n else if (entry.status === 'running' && (entry.leaseExpiresAt ?? 0) > now) wake = entry.leaseExpiresAt;\n if (wake !== undefined && (next === undefined || wake < next)) next = wake;\n }\n return next;\n },\n async get(id: string): Promise<StoredJob | undefined> {\n const entry = records.get(id);\n return entry ? normalize(entry) : undefined;\n },\n async put(entry: StoredJob): Promise<void> {\n records.set(entry.id, normalize(entry));\n },\n };\n\n return {\n get disposalSignal() {\n return controller.signal;\n },\n async dispose(): Promise<void> {\n if (disposed) return;\n disposed = true;\n controller.abort();\n listeners.clear();\n },\n get disposed() {\n return disposed;\n },\n async list(filter?: EntryFilter): Promise<StoredJob[]> {\n return exclusive(() => {\n live();\n return [...records.values()]\n .filter((entry) => filter?.status === undefined || entry.status === filter.status)\n .sort((a, b) => a.createdAt - b.createdAt)\n .map(normalize);\n });\n },\n subscribe(listener: () => void): () => void {\n live();\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n transact<T>(fn: (tx: StoreTx) => Promise<T>): Promise<T> {\n return exclusive(async () => {\n live();\n const result = await fn(tx);\n notify();\n return result;\n });\n },\n async [Symbol.asyncDispose](): Promise<void> {\n await this.dispose();\n },\n };\n}\n"],"mappings":";;AAGA,SAAgB,EAA4B,IAAgC,CAAC,GAAoB;CAC/F,IAAM,IAAU,IAAI,IAAI,EAAQ,KAAK,MAAU,CAAC,EAAM,IAAI,EAAU,CAAK,CAAC,CAAC,CAAC,GACtE,IAAa,IAAI,gBAAgB,GACjC,oBAAY,IAAI,IAAgB,GAClC,IAAW,IACX,IAAQ,QAAQ,QAAQ,GAEtB,KAAgB,MAAyC;EAC7D,IAAM,IAAS,EAAM,KAAK,GAAI,CAAE;EAKhC,OAJA,IAAQ,EAAO,WACP,KAAA,SACA,KAAA,CACR,GACO;CACT,GAEM,UAAqB;EACzB,KAAK,IAAM,KAAY,GAAW,EAAS;CAC7C,GAEM,UAAmB;EACvB,IAAI,GAAU,MAAU,MAAM,8BAA8B;CAC9D,GAEM,IAAc;EAClB,MAAM,gBAA0C;GAC9C,IAAI,IAAa,GACb,IAAS,GACT,IAAU;GACd,KAAK,IAAM,KAAS,EAAQ,OAAO,GACjC,AAAI,EAAM,WAAW,gBAAe,KAAc,IACzC,EAAM,WAAW,WAAU,KAAU,IACzC,KAAW;GAElB,OAAO;IAAE;IAAY;IAAQ;GAAQ;EACvC;EACA,MAAM,OAAO,GAA2B;GACtC,EAAQ,OAAO,CAAE;EACnB;EACA,MAAM,cAAc,GAA6C;GAC/D,IAAI;GACJ,KAAK,IAAM,KAAS,EAAQ,OAAO,GAE9B,GAAM,WAAW,YAAY,EAAM,eAAe,KAClD,EAAM,WAAW,cAAc,EAAM,kBAAkB,MAAM,OAG9D,CAAC,KACD,EAAM,cAAc,EAAK,eACxB,EAAM,gBAAgB,EAAK,eAAe,EAAM,YAAY,EAAK,eAElE,IAAO;GAGX,OAAO,IAAO,EAAU,CAAI,IAAI,KAAA;EAClC;EACA,MAAM,aAAa,GAA0C;GAC3D,IAAI;GACJ,KAAK,IAAM,KAAS,EAAQ,OAAO,GAAG;IACpC,IAAI;IAGJ,AAFI,EAAM,WAAW,YAAY,EAAM,cAAc,IAAK,IAAO,EAAM,cAC9D,EAAM,WAAW,cAAc,EAAM,kBAAkB,KAAK,MAAK,IAAO,EAAM,iBACnF,MAAS,KAAA,MAAc,MAAS,KAAA,KAAa,IAAO,OAAO,IAAO;GACxE;GACA,OAAO;EACT;EACA,MAAM,IAAI,GAA4C;GACpD,IAAM,IAAQ,EAAQ,IAAI,CAAE;GAC5B,OAAO,IAAQ,EAAU,CAAK,IAAI,KAAA;EACpC;EACA,MAAM,IAAI,GAAiC;GACzC,EAAQ,IAAI,EAAM,IAAI,EAAU,CAAK,CAAC;EACxC;CACF;CAEA,OAAO;EACL,IAAI,iBAAiB;GACnB,OAAO,EAAW;EACpB;EACA,MAAM,UAAyB;GACzB,MACJ,IAAW,IACX,EAAW,MAAM,GACjB,EAAU,MAAM;EAClB;EACA,IAAI,WAAW;GACb,OAAO;EACT;EACA,MAAM,KAAK,GAA4C;GACrD,OAAO,SACL,EAAK,GACE,CAAC,GAAG,EAAQ,OAAO,CAAC,CAAC,CACzB,QAAQ,MAAU,GAAQ,WAAW,KAAA,KAAa,EAAM,WAAW,EAAO,MAAM,CAAC,CACjF,MAAM,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,CACzC,IAAI,CAAS,EACjB;EACH;EACA,UAAU,GAAkC;GAG1C,OAFA,EAAK,GACL,EAAU,IAAI,CAAQ,SACT,EAAU,OAAO,CAAQ;EACxC;EACA,SAAY,GAA6C;GACvD,OAAO,EAAU,YAAY;IAC3B,EAAK;IACL,IAAM,IAAS,MAAM,EAAG,CAAE;IAE1B,OADA,EAAO,GACA;GACT,CAAC;EACH;EACA,OAAO,OAAO,gBAA+B;GAC3C,MAAM,KAAK,QAAQ;EACrB;CACF;AACF"}
package/dist/types.d.ts CHANGED
@@ -116,11 +116,23 @@ export interface CreatePostmasterOptions<J extends JobDefinitions> {
116
116
  readonly signal?: AbortSignal;
117
117
  readonly store: PostmasterStore;
118
118
  }
119
+ /**
120
+ * Options for {@link Postmaster.enqueue}.
121
+ *
122
+ * `availableAt` is the earliest epoch timestamp (ms) at which the job may be
123
+ * claimed. Defaults to the Postmaster clock at enqueue time. Past timestamps
124
+ * remain immediately eligible. Postmaster does not guarantee execution at the
125
+ * requested time — only that the job will not be claimed before it. A live
126
+ * processor (`start()` or `flush()`) is required for execution.
127
+ */
128
+ export interface EnqueueOptions {
129
+ readonly availableAt?: number;
130
+ }
119
131
  export interface Postmaster<J extends JobDefinitions> {
120
132
  readonly disposalSignal: AbortSignal;
121
133
  dispose(): Promise<void>;
122
134
  readonly disposed: boolean;
123
- enqueue<K extends keyof J & string>(name: K, payload: InferJobPayload<J[K]>): Promise<PostmasterEntry>;
135
+ enqueue<K extends keyof J & string>(name: K, payload: InferJobPayload<J[K]>, options?: EnqueueOptions): Promise<PostmasterEntry>;
124
136
  flush(options?: {
125
137
  signal?: AbortSignal;
126
138
  }): Promise<FlushResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vielzeug/postmaster",
3
- "version": "2.0.0",
3
+ "version": "2.2.0",
4
4
  "description": "Typed durable job outbox with leased processing, retries, and dead-letter recovery",
5
5
  "repository": {
6
6
  "type": "git",
@@ -61,10 +61,11 @@
61
61
  },
62
62
  "dependencies": {
63
63
  "@vielzeug/arsenal": "2.1.0",
64
- "@vielzeug/vault": "2.4.0"
64
+ "@vielzeug/vault": "2.5.0"
65
65
  },
66
66
  "devDependencies": {
67
67
  "@types/node": "^26.2.0",
68
+ "@vielzeug/courier": "2.3.1",
68
69
  "fake-indexeddb": "^6.2.5",
69
70
  "typescript": "^6.0.3",
70
71
  "vite": "^8.2.1",