@vielzeug/postmaster 2.1.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.
- package/dist/_store-utils.cjs +2 -0
- package/dist/_store-utils.cjs.map +1 -0
- package/dist/_store-utils.d.ts +7 -0
- package/dist/_store-utils.d.ts.map +1 -0
- package/dist/_store-utils.js +14 -0
- package/dist/_store-utils.js.map +1 -0
- package/dist/indexeddb.cjs +1 -1
- package/dist/indexeddb.cjs.map +1 -1
- package/dist/indexeddb.d.ts.map +1 -1
- package/dist/indexeddb.js +15 -23
- package/dist/indexeddb.js.map +1 -1
- package/dist/postmaster.cjs +1 -1
- package/dist/postmaster.cjs.map +1 -1
- package/dist/postmaster.d.ts.map +1 -1
- package/dist/postmaster.iife.js +1 -1
- package/dist/postmaster.iife.js.map +1 -1
- package/dist/postmaster.js +1 -1
- package/dist/postmaster.js.map +1 -1
- package/dist/store-ops.cjs +1 -1
- package/dist/store-ops.cjs.map +1 -1
- package/dist/store-ops.d.ts.map +1 -1
- package/dist/store-ops.js +15 -14
- package/dist/store-ops.js.map +1 -1
- package/dist/testing/memory-store.cjs +1 -1
- package/dist/testing/memory-store.cjs.map +1 -1
- package/dist/testing/memory-store.d.ts.map +1 -1
- package/dist/testing/memory-store.js +1 -9
- package/dist/testing/memory-store.js.map +1 -1
- package/package.json +3 -3
|
@@ -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\
|
|
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":"
|
|
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\
|
|
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vielzeug/postmaster",
|
|
3
|
-
"version": "2.
|
|
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,11 +61,11 @@
|
|
|
61
61
|
},
|
|
62
62
|
"dependencies": {
|
|
63
63
|
"@vielzeug/arsenal": "2.1.0",
|
|
64
|
-
"@vielzeug/vault": "2.
|
|
64
|
+
"@vielzeug/vault": "2.5.0"
|
|
65
65
|
},
|
|
66
66
|
"devDependencies": {
|
|
67
67
|
"@types/node": "^26.2.0",
|
|
68
|
-
"@vielzeug/courier": "2.3.
|
|
68
|
+
"@vielzeug/courier": "2.3.1",
|
|
69
69
|
"fake-indexeddb": "^6.2.5",
|
|
70
70
|
"typescript": "^6.0.3",
|
|
71
71
|
"vite": "^8.2.1",
|