@x12i/memorix-service 3.12.3 → 3.13.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 (211) hide show
  1. package/README.md +2 -2
  2. package/dist/activity-ui.js +1 -1
  3. package/dist/agent-catalog.d.ts +32 -0
  4. package/dist/agent-catalog.d.ts.map +1 -0
  5. package/dist/agent-catalog.js +80 -0
  6. package/dist/agent-catalog.js.map +1 -0
  7. package/dist/analytics/engine.d.ts.map +1 -1
  8. package/dist/analytics/engine.js +2 -1
  9. package/dist/analytics/engine.js.map +1 -1
  10. package/dist/analytics/state.d.ts +1 -1
  11. package/dist/analytics/tracker.d.ts +2 -0
  12. package/dist/analytics/tracker.d.ts.map +1 -1
  13. package/dist/analytics/tracker.js +15 -8
  14. package/dist/analytics/tracker.js.map +1 -1
  15. package/dist/anomaly/catalog.d.ts +4 -0
  16. package/dist/anomaly/catalog.d.ts.map +1 -0
  17. package/dist/anomaly/catalog.js +315 -0
  18. package/dist/anomaly/catalog.js.map +1 -0
  19. package/dist/anomaly/descriptors.d.ts +11 -0
  20. package/dist/anomaly/descriptors.d.ts.map +1 -0
  21. package/dist/anomaly/descriptors.js +113 -0
  22. package/dist/anomaly/descriptors.js.map +1 -0
  23. package/dist/anomaly/index.d.ts +6 -0
  24. package/dist/anomaly/index.d.ts.map +1 -0
  25. package/dist/anomaly/index.js +5 -0
  26. package/dist/anomaly/index.js.map +1 -0
  27. package/dist/anomaly/records.d.ts +28 -0
  28. package/dist/anomaly/records.d.ts.map +1 -0
  29. package/dist/anomaly/records.js +384 -0
  30. package/dist/anomaly/records.js.map +1 -0
  31. package/dist/anomaly/types.d.ts +116 -0
  32. package/dist/anomaly/types.d.ts.map +1 -0
  33. package/dist/anomaly/types.js +24 -0
  34. package/dist/anomaly/types.js.map +1 -0
  35. package/dist/anomaly/values.d.ts +31 -0
  36. package/dist/anomaly/values.d.ts.map +1 -0
  37. package/dist/anomaly/values.js +171 -0
  38. package/dist/anomaly/values.js.map +1 -0
  39. package/dist/app.d.ts.map +1 -1
  40. package/dist/app.js +34 -1
  41. package/dist/app.js.map +1 -1
  42. package/dist/arrivals-backfill.d.ts +23 -0
  43. package/dist/arrivals-backfill.d.ts.map +1 -0
  44. package/dist/arrivals-backfill.js +132 -0
  45. package/dist/arrivals-backfill.js.map +1 -0
  46. package/dist/arrivals-routes.d.ts +8 -0
  47. package/dist/arrivals-routes.d.ts.map +1 -0
  48. package/dist/arrivals-routes.js +17 -0
  49. package/dist/arrivals-routes.js.map +1 -0
  50. package/dist/arrivals-ui.d.ts +3 -0
  51. package/dist/arrivals-ui.d.ts.map +1 -0
  52. package/dist/arrivals-ui.js +277 -0
  53. package/dist/arrivals-ui.js.map +1 -0
  54. package/dist/catalog-bridge.d.ts +18 -0
  55. package/dist/catalog-bridge.d.ts.map +1 -1
  56. package/dist/catalog-bridge.js +115 -7
  57. package/dist/catalog-bridge.js.map +1 -1
  58. package/dist/catalog-live-ui.js +1 -1
  59. package/dist/content-arrivals-countex.d.ts +90 -0
  60. package/dist/content-arrivals-countex.d.ts.map +1 -0
  61. package/dist/content-arrivals-countex.js +252 -0
  62. package/dist/content-arrivals-countex.js.map +1 -0
  63. package/dist/data-changes-ui.js +1 -1
  64. package/dist/data-changes.d.ts +3 -0
  65. package/dist/data-changes.d.ts.map +1 -1
  66. package/dist/data-changes.js +22 -21
  67. package/dist/data-changes.js.map +1 -1
  68. package/dist/errors.d.ts +6 -1
  69. package/dist/errors.d.ts.map +1 -1
  70. package/dist/errors.js +22 -2
  71. package/dist/errors.js.map +1 -1
  72. package/dist/hooks-live-ui.js +1 -1
  73. package/dist/knowledge-upstream.d.ts +32 -0
  74. package/dist/knowledge-upstream.d.ts.map +1 -1
  75. package/dist/knowledge-upstream.js +86 -2
  76. package/dist/knowledge-upstream.js.map +1 -1
  77. package/dist/land-v2-guards.d.ts +5 -12
  78. package/dist/land-v2-guards.d.ts.map +1 -1
  79. package/dist/land-v2-guards.js +10 -33
  80. package/dist/land-v2-guards.js.map +1 -1
  81. package/dist/live-ops-nav.d.ts.map +1 -1
  82. package/dist/live-ops-nav.js +4 -0
  83. package/dist/live-ops-nav.js.map +1 -1
  84. package/dist/mcp/nexum-tools.d.ts +1 -1
  85. package/dist/mcp/nexum-tools.d.ts.map +1 -1
  86. package/dist/mcp/nexum-tools.js +39 -22
  87. package/dist/mcp/nexum-tools.js.map +1 -1
  88. package/dist/nexum-analysis/enqueue.d.ts.map +1 -1
  89. package/dist/nexum-analysis/enqueue.js +2 -1
  90. package/dist/nexum-analysis/enqueue.js.map +1 -1
  91. package/dist/nexum-analysis/knowledge-read.d.ts +45 -0
  92. package/dist/nexum-analysis/knowledge-read.d.ts.map +1 -0
  93. package/dist/nexum-analysis/knowledge-read.js +26 -0
  94. package/dist/nexum-analysis/knowledge-read.js.map +1 -0
  95. package/dist/nexum-analysis/outbox.d.ts +1 -1
  96. package/dist/nexum-analysis/reconcile.d.ts.map +1 -1
  97. package/dist/nexum-analysis/reconcile.js +3 -2
  98. package/dist/nexum-analysis/reconcile.js.map +1 -1
  99. package/dist/openapi/openapi.json +18354 -17673
  100. package/dist/operational-db.d.ts +2 -2
  101. package/dist/operational-db.d.ts.map +1 -1
  102. package/dist/operational-db.js +8 -11
  103. package/dist/operational-db.js.map +1 -1
  104. package/dist/patches/access.d.ts +15 -0
  105. package/dist/patches/access.d.ts.map +1 -0
  106. package/dist/patches/access.js +27 -0
  107. package/dist/patches/access.js.map +1 -0
  108. package/dist/patches/engine.d.ts +67 -0
  109. package/dist/patches/engine.d.ts.map +1 -0
  110. package/dist/patches/engine.js +966 -0
  111. package/dist/patches/engine.js.map +1 -0
  112. package/dist/patches/guards.d.ts +23 -0
  113. package/dist/patches/guards.d.ts.map +1 -0
  114. package/dist/patches/guards.js +77 -0
  115. package/dist/patches/guards.js.map +1 -0
  116. package/dist/patches/legacy-rows.d.ts +56 -0
  117. package/dist/patches/legacy-rows.d.ts.map +1 -0
  118. package/dist/patches/legacy-rows.js +162 -0
  119. package/dist/patches/legacy-rows.js.map +1 -0
  120. package/dist/patches/ops.d.ts +24 -0
  121. package/dist/patches/ops.d.ts.map +1 -0
  122. package/dist/patches/ops.js +204 -0
  123. package/dist/patches/ops.js.map +1 -0
  124. package/dist/patches/parse.d.ts +5 -0
  125. package/dist/patches/parse.d.ts.map +1 -0
  126. package/dist/patches/parse.js +323 -0
  127. package/dist/patches/parse.js.map +1 -0
  128. package/dist/patches/paths.d.ts +38 -0
  129. package/dist/patches/paths.d.ts.map +1 -0
  130. package/dist/patches/paths.js +204 -0
  131. package/dist/patches/paths.js.map +1 -0
  132. package/dist/patches/service.d.ts +16 -0
  133. package/dist/patches/service.d.ts.map +1 -0
  134. package/dist/patches/service.js +128 -0
  135. package/dist/patches/service.js.map +1 -0
  136. package/dist/patches/store.d.ts +87 -0
  137. package/dist/patches/store.d.ts.map +1 -0
  138. package/dist/patches/store.js +27 -0
  139. package/dist/patches/store.js.map +1 -0
  140. package/dist/patches/types.d.ts +112 -0
  141. package/dist/patches/types.d.ts.map +1 -0
  142. package/dist/patches/types.js +5 -0
  143. package/dist/patches/types.js.map +1 -0
  144. package/dist/platform.d.ts +17 -3
  145. package/dist/platform.d.ts.map +1 -1
  146. package/dist/platform.js +114 -11
  147. package/dist/platform.js.map +1 -1
  148. package/dist/routes/anomaly.d.ts +5 -0
  149. package/dist/routes/anomaly.d.ts.map +1 -0
  150. package/dist/routes/anomaly.js +308 -0
  151. package/dist/routes/anomaly.js.map +1 -0
  152. package/dist/routes/data.d.ts.map +1 -1
  153. package/dist/routes/data.js +252 -210
  154. package/dist/routes/data.js.map +1 -1
  155. package/dist/routes/knowledge.d.ts.map +1 -1
  156. package/dist/routes/knowledge.js +6 -22
  157. package/dist/routes/knowledge.js.map +1 -1
  158. package/dist/routes/memory.d.ts.map +1 -1
  159. package/dist/routes/memory.js +2 -4
  160. package/dist/routes/memory.js.map +1 -1
  161. package/dist/routes/metadata.d.ts.map +1 -1
  162. package/dist/routes/metadata.js +40 -1
  163. package/dist/routes/metadata.js.map +1 -1
  164. package/dist/routes/mgc-landing.d.ts.map +1 -1
  165. package/dist/routes/mgc-landing.js +64 -94
  166. package/dist/routes/mgc-landing.js.map +1 -1
  167. package/dist/routes/patches.d.ts +7 -0
  168. package/dist/routes/patches.d.ts.map +1 -0
  169. package/dist/routes/patches.js +111 -0
  170. package/dist/routes/patches.js.map +1 -0
  171. package/dist/routes/subject-roots-backfill.d.ts +4 -0
  172. package/dist/routes/subject-roots-backfill.d.ts.map +1 -0
  173. package/dist/routes/subject-roots-backfill.js +15 -0
  174. package/dist/routes/subject-roots-backfill.js.map +1 -0
  175. package/dist/routes/workflow.d.ts.map +1 -1
  176. package/dist/routes/workflow.js +4 -10
  177. package/dist/routes/workflow.js.map +1 -1
  178. package/dist/single-read-discriminator.d.ts +17 -0
  179. package/dist/single-read-discriminator.d.ts.map +1 -0
  180. package/dist/single-read-discriminator.js +67 -0
  181. package/dist/single-read-discriminator.js.map +1 -0
  182. package/dist/subject-roots-backfill.d.ts +24 -0
  183. package/dist/subject-roots-backfill.d.ts.map +1 -0
  184. package/dist/subject-roots-backfill.js +133 -0
  185. package/dist/subject-roots-backfill.js.map +1 -0
  186. package/dist/write-precondition.d.ts +5 -1
  187. package/dist/write-precondition.d.ts.map +1 -1
  188. package/dist/write-precondition.js +11 -3
  189. package/dist/write-precondition.js.map +1 -1
  190. package/dist/writes/content-write.d.ts +170 -0
  191. package/dist/writes/content-write.d.ts.map +1 -0
  192. package/dist/writes/content-write.js +569 -0
  193. package/dist/writes/content-write.js.map +1 -0
  194. package/dist/writes/effects.d.ts +13 -0
  195. package/dist/writes/effects.d.ts.map +1 -0
  196. package/dist/writes/effects.js +28 -0
  197. package/dist/writes/effects.js.map +1 -0
  198. package/dist/writes/error-shape.d.ts +11 -0
  199. package/dist/writes/error-shape.d.ts.map +1 -0
  200. package/dist/writes/error-shape.js +100 -0
  201. package/dist/writes/error-shape.js.map +1 -0
  202. package/dist/writes/receipt-store.d.ts +81 -0
  203. package/dist/writes/receipt-store.d.ts.map +1 -0
  204. package/dist/writes/receipt-store.js +171 -0
  205. package/dist/writes/receipt-store.js.map +1 -0
  206. package/dist/writes/worker.d.ts +9 -0
  207. package/dist/writes/worker.d.ts.map +1 -0
  208. package/dist/writes/worker.js +20 -0
  209. package/dist/writes/worker.js.map +1 -0
  210. package/openapi/openapi.json +18354 -17673
  211. package/package.json +4 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-shape.d.ts","sourceRoot":"","sources":["../../src/writes/error-shape.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAwBF,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAmD1E;AAUD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAM,GAAG,MAAM,CAetE"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * FR-6 — a rejection names the field and says whether the same request can succeed later.
3
+ */
4
+ const NON_RETRYABLE = new Set([
5
+ "WRITE_IDENTIFIER_ISSUER",
6
+ "DIRECTORY_CONFLICT_OBJECT_TYPE",
7
+ "DIRECTORY_CONFLICT_DATA_CATEGORY",
8
+ "READ_DISCRIMINATOR_REQUIRED",
9
+ "WRITE_DISCRIMINATOR_REQUIRED",
10
+ "WRITE_ID_REUSED",
11
+ "READ_QUERY_INVALID",
12
+ "WRITE_NOT_ABSENT",
13
+ "WRITE_NOT_FOUND",
14
+ "WRITE_STALE_REVISION",
15
+ "WRITE_PRECONDITION_INVALID",
16
+ "WRITE_IDENTITY_MISMATCH",
17
+ "WRITE_IDENTITY_ADOPTION",
18
+ "WRITE_FORMAT_INVALID",
19
+ "WRITE_INTERFACE_BINDING",
20
+ "VALIDATION",
21
+ "SCOPE_INVALID",
22
+ "BODY_TOO_LARGE",
23
+ "PUBLICATION_PINNED",
24
+ ]);
25
+ export function classifyFailure(err, status) {
26
+ const code = err && typeof err === "object" && "code" in err && typeof err.code === "string"
27
+ ? err.code
28
+ : "";
29
+ const message = err instanceof Error ? err.message : typeof err === "string" ? err : "";
30
+ const details = err && typeof err === "object" && "details" in err ? err.details : undefined;
31
+ const detail = details && typeof details === "object" && !Array.isArray(details)
32
+ ? details
33
+ : {};
34
+ let field = null;
35
+ if (typeof detail.field === "string" && detail.field.trim())
36
+ field = detail.field;
37
+ else if (typeof detail.path === "string" && detail.path.trim())
38
+ field = detail.path;
39
+ else if (code === "WRITE_IDENTIFIER_ISSUER")
40
+ field = "concept.identifiers.primary.issuer";
41
+ else if (code === "DIRECTORY_CONFLICT_OBJECT_TYPE" || code === "DIRECTORY_CONFLICT_DATA_CATEGORY") {
42
+ field = "recordId";
43
+ }
44
+ else if (code === "READ_DISCRIMINATOR_REQUIRED" || code === "WRITE_DISCRIMINATOR_REQUIRED") {
45
+ field = "discriminatorValue";
46
+ }
47
+ else if (code === "WRITE_ID_REUSED")
48
+ field = "writeId";
49
+ else if (code === "WRITE_NOT_FOUND" || code === "WRITE_NOT_ABSENT")
50
+ field = "recordId";
51
+ else {
52
+ const match = message.match(/filter\[\d+\](?:\.[A-Za-z0-9_]+)?/);
53
+ if (match)
54
+ field = match[0];
55
+ }
56
+ if (detail.retryable === true) {
57
+ return { field, retryable: true, retryAfterMs: retryAfter(message, status, detail) };
58
+ }
59
+ if (detail.retryable === false || NON_RETRYABLE.has(code)) {
60
+ return { field, retryable: false };
61
+ }
62
+ const transient = status === 408 ||
63
+ status === 429 ||
64
+ status === 503 ||
65
+ status === 504 ||
66
+ code === "READ_UNAVAILABLE" ||
67
+ code === "ABSTRACT_WRITE_UNAVAILABLE" ||
68
+ code === "BACKFILL_UNAVAILABLE" ||
69
+ /timeout|timed out|ECONNRESET|EAI_AGAIN|MongoNetwork|server selection|overload|too many requests|ECONNREFUSED/i.test(message);
70
+ if (transient || status >= 500) {
71
+ return { field, retryable: true, retryAfterMs: retryAfter(message, status, detail) };
72
+ }
73
+ return { field, retryable: false };
74
+ }
75
+ function retryAfter(message, status, detail) {
76
+ if (typeof detail.retryAfterMs === "number" && Number.isFinite(detail.retryAfterMs)) {
77
+ return detail.retryAfterMs;
78
+ }
79
+ if (status === 429 || status === 503 || /overload|too many/i.test(message))
80
+ return 5_000;
81
+ return 1_000;
82
+ }
83
+ export function httpStatusForCode(code, fallback = 500) {
84
+ if (code === "WRITE_ID_REUSED" || code === "WRITE_NOT_ABSENT" || code === "WRITE_STALE_REVISION")
85
+ return 409;
86
+ if (code === "WRITE_NOT_FOUND" || code === "READ_NOT_FOUND")
87
+ return 404;
88
+ if (code === "READ_UNAVAILABLE" || code === "BACKFILL_UNAVAILABLE")
89
+ return 503;
90
+ if (code.startsWith("WRITE_") ||
91
+ code.startsWith("READ_") ||
92
+ code.startsWith("ROUTE_") ||
93
+ code.startsWith("DIRECTORY_") ||
94
+ code.startsWith("SCOPE_") ||
95
+ code === "VALIDATION") {
96
+ return 400;
97
+ }
98
+ return fallback;
99
+ }
100
+ //# sourceMappingURL=error-shape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-shape.js","sourceRoot":"","sources":["../../src/writes/error-shape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import type { Db } from "mongodb";
2
+ export declare const WRITE_RECEIPTS_COLLECTION = "write-receipts";
3
+ export declare const REJECTED_RECEIPT_TTL_MS: number;
4
+ export declare const WRITE_ATTEMPT_LEASE_MS = 30000;
5
+ export type WriteOperation = "created" | "updated" | "removed" | "unchanged";
6
+ export type WriteReceipt = {
7
+ storageKey: {
8
+ objectType: string;
9
+ contentType: string;
10
+ recordId: string;
11
+ discriminator?: string;
12
+ };
13
+ revision: number;
14
+ writtenAt: string;
15
+ operation: WriteOperation;
16
+ };
17
+ export type StoredContentWrite = {
18
+ scope: {
19
+ orgId: string;
20
+ agentIds: string[];
21
+ };
22
+ caller: string;
23
+ op: "add" | "upsert" | "patch" | "replace" | "remove";
24
+ objectType: string;
25
+ contentType: string;
26
+ precondition: "absent" | "exact-revision" | "none";
27
+ expectedRevision?: number;
28
+ discriminatorValue?: string;
29
+ suppressHooks: boolean;
30
+ record?: Record<string, unknown>;
31
+ patch?: unknown;
32
+ subject?: {
33
+ objectType: string;
34
+ recordId: string;
35
+ };
36
+ datasourceDeclared: boolean;
37
+ datasourceDeclaration?: unknown;
38
+ };
39
+ export type ReceiptError = {
40
+ code: string;
41
+ field: string | null;
42
+ message: string;
43
+ retryable: boolean;
44
+ retryAfterMs?: number;
45
+ status: number;
46
+ };
47
+ export type WriteReceiptRow = {
48
+ receiptId: string;
49
+ orgId: string;
50
+ caller: string;
51
+ writeId?: string;
52
+ contentHash: string;
53
+ status: "pending" | "stored" | "rejected";
54
+ receipt?: WriteReceipt;
55
+ error?: ReceiptError;
56
+ request: StoredContentWrite;
57
+ attempts: number;
58
+ nextAttemptAt: string;
59
+ createdAt: string;
60
+ updatedAt: string;
61
+ expireAt?: string;
62
+ };
63
+ export type WriteReceiptStore = {
64
+ findByWriteId(orgId: string, caller: string, writeId: string): Promise<WriteReceiptRow | null>;
65
+ get(orgId: string, receiptId: string): Promise<WriteReceiptRow | null>;
66
+ /** `conflict` when this caller already has that writeId. */
67
+ insert(row: WriteReceiptRow): Promise<"inserted" | "conflict">;
68
+ save(row: WriteReceiptRow): Promise<void>;
69
+ list(args: {
70
+ orgId: string;
71
+ caller: string;
72
+ status?: "pending" | "stored" | "rejected";
73
+ limit: number;
74
+ }): Promise<WriteReceiptRow[]>;
75
+ claimDue(orgId: string, now: string, limit: number, leaseMs: number): Promise<WriteReceiptRow[]>;
76
+ };
77
+ export declare function newReceiptId(): string;
78
+ export declare function rejectedExpiry(nowIso: string): string;
79
+ export declare function createMemoryWriteReceiptStore(): WriteReceiptStore;
80
+ export declare function createMongoWriteReceiptStore(db: Db): WriteReceiptStore;
81
+ //# sourceMappingURL=receipt-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receipt-store.d.ts","sourceRoot":"","sources":["../../src/writes/receipt-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,171 @@
1
+ /**
2
+ * FR-2 / FR-4 — durable write receipts. Rejected rows stay listable for 7 days.
3
+ */
4
+ import { randomBytes } from "node:crypto";
5
+ export const WRITE_RECEIPTS_COLLECTION = "write-receipts";
6
+ export const REJECTED_RECEIPT_TTL_MS = 7 * 24 * 60 * 60 * 1000;
7
+ export const WRITE_ATTEMPT_LEASE_MS = 30_000;
8
+ export function newReceiptId() {
9
+ return `wr_${randomBytes(16).toString("hex")}`;
10
+ }
11
+ export function rejectedExpiry(nowIso) {
12
+ return new Date(Date.parse(nowIso) + REJECTED_RECEIPT_TTL_MS).toISOString();
13
+ }
14
+ export function createMemoryWriteReceiptStore() {
15
+ const buckets = new Map();
16
+ function bucket(orgId) {
17
+ let found = buckets.get(orgId);
18
+ if (!found) {
19
+ found = { byId: new Map(), byWriteId: new Map() };
20
+ buckets.set(orgId, found);
21
+ }
22
+ return found;
23
+ }
24
+ function writeKey(caller, writeId) {
25
+ return `${caller}\n${writeId}`;
26
+ }
27
+ return {
28
+ async findByWriteId(orgId, caller, writeId) {
29
+ const id = bucket(orgId).byWriteId.get(writeKey(caller, writeId));
30
+ if (!id)
31
+ return null;
32
+ return structuredClone(bucket(orgId).byId.get(id) ?? null);
33
+ },
34
+ async get(orgId, receiptId) {
35
+ return structuredClone(bucket(orgId).byId.get(receiptId) ?? null);
36
+ },
37
+ async insert(row) {
38
+ const box = bucket(row.orgId);
39
+ if (row.writeId) {
40
+ const key = writeKey(row.caller, row.writeId);
41
+ if (box.byWriteId.has(key))
42
+ return "conflict";
43
+ box.byWriteId.set(key, row.receiptId);
44
+ }
45
+ box.byId.set(row.receiptId, structuredClone(row));
46
+ return "inserted";
47
+ },
48
+ async save(row) {
49
+ const box = bucket(row.orgId);
50
+ box.byId.set(row.receiptId, structuredClone(row));
51
+ if (row.writeId)
52
+ box.byWriteId.set(writeKey(row.caller, row.writeId), row.receiptId);
53
+ },
54
+ async list(args) {
55
+ const cutoff = Date.now() - REJECTED_RECEIPT_TTL_MS;
56
+ return [...bucket(args.orgId).byId.values()]
57
+ .filter((row) => row.caller === args.caller)
58
+ .filter((row) => (args.status ? row.status === args.status : true))
59
+ .filter((row) => row.status !== "rejected" || Date.parse(row.createdAt) >= cutoff)
60
+ .sort((a, b) => b.createdAt.localeCompare(a.createdAt))
61
+ .slice(0, args.limit)
62
+ .map((row) => structuredClone(row));
63
+ },
64
+ async claimDue(orgId, now, limit, leaseMs) {
65
+ const until = new Date(Date.parse(now) + leaseMs).toISOString();
66
+ const due = [...bucket(orgId).byId.values()]
67
+ .filter((row) => row.status === "pending" && row.nextAttemptAt <= now)
68
+ .sort((a, b) => a.nextAttemptAt.localeCompare(b.nextAttemptAt))
69
+ .slice(0, limit);
70
+ const claimed = [];
71
+ for (const row of due) {
72
+ if (row.status !== "pending" || row.nextAttemptAt > now)
73
+ continue;
74
+ row.nextAttemptAt = until;
75
+ row.attempts += 1;
76
+ row.updatedAt = now;
77
+ claimed.push(structuredClone(row));
78
+ }
79
+ return claimed;
80
+ },
81
+ };
82
+ }
83
+ export function createMongoWriteReceiptStore(db) {
84
+ const coll = db.collection(WRITE_RECEIPTS_COLLECTION);
85
+ let ready = null;
86
+ function ensure() {
87
+ ready ??= Promise.all([
88
+ coll.createIndex({ orgId: 1, caller: 1, writeId: 1 }, {
89
+ unique: true,
90
+ name: "write_id",
91
+ partialFilterExpression: { writeId: { $type: "string" } },
92
+ }),
93
+ coll.createIndex({ orgId: 1, caller: 1, status: 1, createdAt: -1 }, { name: "caller_status" }),
94
+ coll.createIndex({ orgId: 1, status: 1, nextAttemptAt: 1 }, { name: "pending_due" }),
95
+ coll.createIndex({ expireAtDate: 1 }, { expireAfterSeconds: 0, name: "rejected_ttl" }),
96
+ ]).then(() => undefined);
97
+ return ready;
98
+ }
99
+ return {
100
+ async findByWriteId(orgId, caller, writeId) {
101
+ await ensure();
102
+ const doc = await coll.findOne({ orgId, caller, writeId });
103
+ return doc ? fromDoc(doc) : null;
104
+ },
105
+ async get(orgId, receiptId) {
106
+ await ensure();
107
+ const doc = await coll.findOne({ _id: receiptId, orgId });
108
+ return doc ? fromDoc(doc) : null;
109
+ },
110
+ async insert(row) {
111
+ await ensure();
112
+ try {
113
+ await coll.insertOne(toDoc(row));
114
+ return "inserted";
115
+ }
116
+ catch (err) {
117
+ const message = err instanceof Error ? err.message : String(err);
118
+ if (message.includes("E11000") || message.includes("duplicate"))
119
+ return "conflict";
120
+ throw err;
121
+ }
122
+ },
123
+ async save(row) {
124
+ await ensure();
125
+ await coll.replaceOne({ _id: row.receiptId }, toDoc(row), { upsert: true });
126
+ },
127
+ async list(args) {
128
+ await ensure();
129
+ const cutoff = new Date(Date.now() - REJECTED_RECEIPT_TTL_MS).toISOString();
130
+ const filter = { orgId: args.orgId, caller: args.caller };
131
+ if (args.status)
132
+ filter.status = args.status;
133
+ if (args.status === "rejected")
134
+ filter.createdAt = { $gte: cutoff };
135
+ const docs = await coll.find(filter).sort({ createdAt: -1 }).limit(args.limit).toArray();
136
+ return docs.map(fromDoc);
137
+ },
138
+ async claimDue(orgId, now, limit, leaseMs) {
139
+ await ensure();
140
+ const until = new Date(Date.parse(now) + leaseMs).toISOString();
141
+ const due = await coll
142
+ .find({ orgId, status: "pending", nextAttemptAt: { $lte: now } })
143
+ .sort({ nextAttemptAt: 1 })
144
+ .limit(limit)
145
+ .toArray();
146
+ const claimed = [];
147
+ for (const doc of due) {
148
+ const updated = await coll.updateOne({ _id: doc._id, status: "pending", nextAttemptAt: doc.nextAttemptAt }, { $set: { nextAttemptAt: until, updatedAt: now }, $inc: { attempts: 1 } });
149
+ if (updated.modifiedCount !== 1)
150
+ continue;
151
+ const fresh = await coll.findOne({ _id: doc._id });
152
+ if (fresh)
153
+ claimed.push(fromDoc(fresh));
154
+ }
155
+ return claimed;
156
+ },
157
+ };
158
+ }
159
+ function toDoc(row) {
160
+ const doc = { ...row, _id: row.receiptId };
161
+ if (row.expireAt)
162
+ doc.expireAtDate = new Date(row.expireAt);
163
+ return doc;
164
+ }
165
+ function fromDoc(doc) {
166
+ const { _id: _drop, expireAtDate: _date, ...rest } = doc;
167
+ void _drop;
168
+ void _date;
169
+ return rest;
170
+ }
171
+ //# sourceMappingURL=receipt-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receipt-store.js","sourceRoot":"","sources":["../../src/writes/receipt-store.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,CAAC,MAAM,yBAAyB,GAAG,gBAAgB,CAAC;AAC1D,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC/D,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AA0E7C,MAAM,UAAU,YAAY;IAC1B,OAAO,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,uBAAuB,CAAC,CAAC,WAAW,EAAE,CAAC;AAC9E,CAAC;AAOD,MAAM,UAAU,6BAA6B;IAC3C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEhD,SAAS,MAAM,CAAC,KAAa;QAC3B,IAAI,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,SAAS,QAAQ,CAAC,MAAc,EAAE,OAAe;QAC/C,OAAO,GAAG,MAAM,KAAK,OAAO,EAAE,CAAC;IACjC,CAAC;IAED,OAAO;QACL,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO;YACxC,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;YAClE,IAAI,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC;YACrB,OAAO,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC;QAC7D,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS;YACxB,OAAO,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,CAAC;QACpE,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,GAAG;YACd,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAChB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC9C,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,OAAO,UAAU,CAAC;gBAC9C,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;YACxC,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;YAClD,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG;YACZ,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC9B,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;YAClD,IAAI,GAAG,CAAC,OAAO;gBAAE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QACvF,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI;YACb,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,uBAAuB,CAAC;YACpD,OAAO,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;iBACzC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC;iBAC3C,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;iBAClE,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC;iBACjF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;iBACtD,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC;iBACpB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO;YACvC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAChE,MAAM,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;iBACzC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC;iBACrE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;iBAC9D,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACnB,MAAM,OAAO,GAAsB,EAAE,CAAC;YACtC,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;gBACtB,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,aAAa,GAAG,GAAG;oBAAE,SAAS;gBAClE,GAAG,CAAC,aAAa,GAAG,KAAK,CAAC;gBAC1B,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC;gBAClB,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;YACrC,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC;AAID,MAAM,UAAU,4BAA4B,CAAC,EAAM;IACjD,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAa,yBAAyB,CAAC,CAAC;IAClE,IAAI,KAAK,GAAyB,IAAI,CAAC;IAEvC,SAAS,MAAM;QACb,KAAK,KAAK,OAAO,CAAC,GAAG,CAAC;YACpB,IAAI,CAAC,WAAW,CACd,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EACnC;gBACE,MAAM,EAAE,IAAI;gBACZ,IAAI,EAAE,UAAU;gBAChB,uBAAuB,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;aAC1D,CACF;YACD,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;YAC9F,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;YACpF,IAAI,CAAC,WAAW,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;SACvF,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO;YACxC,MAAM,MAAM,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YAC3D,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnC,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS;YACxB,MAAM,MAAM,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1D,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnC,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,GAAG;YACd,MAAM,MAAM,EAAE,CAAC;YACf,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;gBACjC,OAAO,UAAU,CAAC;YACpB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;oBAAE,OAAO,UAAU,CAAC;gBACnF,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG;YACZ,MAAM,MAAM,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI;YACb,MAAM,MAAM,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,uBAAuB,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5E,MAAM,MAAM,GAA4B,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YACnF,IAAI,IAAI,CAAC,MAAM;gBAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC7C,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU;gBAAE,MAAM,CAAC,SAAS,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YACpE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;YACzF,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO;YACvC,MAAM,MAAM,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAChE,MAAM,GAAG,GAAG,MAAM,IAAI;iBACnB,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;iBAChE,IAAI,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;iBAC1B,KAAK,CAAC,KAAK,CAAC;iBACZ,OAAO,EAAE,CAAC;YACb,MAAM,OAAO,GAAsB,EAAE,CAAC;YACtC,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;gBACtB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAClC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,CAAC,aAAa,EAAE,EACrE,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAC1E,CAAC;gBACF,IAAI,OAAO,CAAC,aAAa,KAAK,CAAC;oBAAE,SAAS;gBAC1C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;gBACnD,IAAI,KAAK;oBAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1C,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,GAAoB;IACjC,MAAM,GAAG,GAAe,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;IACvD,IAAI,GAAG,CAAC,QAAQ;QAAE,GAAG,CAAC,YAAY,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC5D,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,OAAO,CAAC,GAAe;IAC9B,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC;IACzD,KAAK,KAAK,CAAC;IACX,KAAK,KAAK,CAAC;IACX,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type WriteReceiptRow, type WriteReceiptStore } from "./receipt-store.js";
2
+ /** Finish writes Memorix already accepted. */
3
+ export declare function tickWriteReceipts(args: {
4
+ orgIds: string[];
5
+ now: string;
6
+ storeFor: (orgId: string) => WriteReceiptStore;
7
+ replay: (row: WriteReceiptRow) => Promise<void>;
8
+ }): Promise<void>;
9
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/writes/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE1G,8CAA8C;AAC9C,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,iBAAiB,CAAC;IAC/C,MAAM,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD,GAAG,OAAO,CAAC,IAAI,CAAC,CAehB"}
@@ -0,0 +1,20 @@
1
+ import { WRITE_ATTEMPT_LEASE_MS } from "./receipt-store.js";
2
+ /** Finish writes Memorix already accepted. */
3
+ export async function tickWriteReceipts(args) {
4
+ for (const orgId of args.orgIds) {
5
+ const store = args.storeFor(orgId);
6
+ const due = await store.claimDue(orgId, args.now, 20, WRITE_ATTEMPT_LEASE_MS);
7
+ for (const row of due) {
8
+ try {
9
+ await args.replay(row);
10
+ }
11
+ catch {
12
+ row.status = "pending";
13
+ row.nextAttemptAt = new Date(Date.parse(args.now) + 5_000).toISOString();
14
+ row.updatedAt = args.now;
15
+ await store.save(row);
16
+ }
17
+ }
18
+ }
19
+ }
20
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/writes/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAgD,MAAM,oBAAoB,CAAC;AAE1G,8CAA8C;AAC9C,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAKvC;IACC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,sBAAsB,CAAC,CAAC;QAC9E,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC;gBACvB,GAAG,CAAC,aAAa,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;gBACzE,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC;gBACzB,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}