@x12i/memorix-service 3.12.4 → 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.
- package/README.md +1 -1
- package/dist/anomaly/catalog.d.ts +4 -0
- package/dist/anomaly/catalog.d.ts.map +1 -0
- package/dist/anomaly/catalog.js +315 -0
- package/dist/anomaly/catalog.js.map +1 -0
- package/dist/anomaly/descriptors.d.ts +11 -0
- package/dist/anomaly/descriptors.d.ts.map +1 -0
- package/dist/anomaly/descriptors.js +113 -0
- package/dist/anomaly/descriptors.js.map +1 -0
- package/dist/anomaly/index.d.ts +6 -0
- package/dist/anomaly/index.d.ts.map +1 -0
- package/dist/anomaly/index.js +5 -0
- package/dist/anomaly/index.js.map +1 -0
- package/dist/anomaly/records.d.ts +28 -0
- package/dist/anomaly/records.d.ts.map +1 -0
- package/dist/anomaly/records.js +384 -0
- package/dist/anomaly/records.js.map +1 -0
- package/dist/anomaly/types.d.ts +116 -0
- package/dist/anomaly/types.d.ts.map +1 -0
- package/dist/anomaly/types.js +24 -0
- package/dist/anomaly/types.js.map +1 -0
- package/dist/anomaly/values.d.ts +31 -0
- package/dist/anomaly/values.d.ts.map +1 -0
- package/dist/anomaly/values.js +171 -0
- package/dist/anomaly/values.js.map +1 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +12 -0
- package/dist/app.js.map +1 -1
- package/dist/catalog-bridge.d.ts +18 -0
- package/dist/catalog-bridge.d.ts.map +1 -1
- package/dist/catalog-bridge.js +85 -0
- package/dist/catalog-bridge.js.map +1 -1
- package/dist/errors.d.ts +5 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +18 -0
- package/dist/errors.js.map +1 -1
- package/dist/knowledge-upstream.d.ts +32 -0
- package/dist/knowledge-upstream.d.ts.map +1 -1
- package/dist/knowledge-upstream.js +86 -2
- package/dist/knowledge-upstream.js.map +1 -1
- package/dist/mcp/nexum-tools.d.ts +1 -1
- package/dist/mcp/nexum-tools.d.ts.map +1 -1
- package/dist/mcp/nexum-tools.js +39 -22
- package/dist/mcp/nexum-tools.js.map +1 -1
- package/dist/nexum-analysis/enqueue.d.ts.map +1 -1
- package/dist/nexum-analysis/enqueue.js +2 -1
- package/dist/nexum-analysis/enqueue.js.map +1 -1
- package/dist/nexum-analysis/knowledge-read.d.ts +45 -0
- package/dist/nexum-analysis/knowledge-read.d.ts.map +1 -0
- package/dist/nexum-analysis/knowledge-read.js +26 -0
- package/dist/nexum-analysis/knowledge-read.js.map +1 -0
- package/dist/openapi/openapi.json +18354 -17718
- package/dist/patches/access.d.ts +15 -0
- package/dist/patches/access.d.ts.map +1 -0
- package/dist/patches/access.js +27 -0
- package/dist/patches/access.js.map +1 -0
- package/dist/patches/engine.d.ts +67 -0
- package/dist/patches/engine.d.ts.map +1 -0
- package/dist/patches/engine.js +966 -0
- package/dist/patches/engine.js.map +1 -0
- package/dist/patches/guards.d.ts +23 -0
- package/dist/patches/guards.d.ts.map +1 -0
- package/dist/patches/guards.js +77 -0
- package/dist/patches/guards.js.map +1 -0
- package/dist/patches/legacy-rows.d.ts +56 -0
- package/dist/patches/legacy-rows.d.ts.map +1 -0
- package/dist/patches/legacy-rows.js +162 -0
- package/dist/patches/legacy-rows.js.map +1 -0
- package/dist/patches/ops.d.ts +24 -0
- package/dist/patches/ops.d.ts.map +1 -0
- package/dist/patches/ops.js +204 -0
- package/dist/patches/ops.js.map +1 -0
- package/dist/patches/parse.d.ts +5 -0
- package/dist/patches/parse.d.ts.map +1 -0
- package/dist/patches/parse.js +323 -0
- package/dist/patches/parse.js.map +1 -0
- package/dist/patches/paths.d.ts +38 -0
- package/dist/patches/paths.d.ts.map +1 -0
- package/dist/patches/paths.js +204 -0
- package/dist/patches/paths.js.map +1 -0
- package/dist/patches/service.d.ts +16 -0
- package/dist/patches/service.d.ts.map +1 -0
- package/dist/patches/service.js +128 -0
- package/dist/patches/service.js.map +1 -0
- package/dist/patches/store.d.ts +87 -0
- package/dist/patches/store.d.ts.map +1 -0
- package/dist/patches/store.js +27 -0
- package/dist/patches/store.js.map +1 -0
- package/dist/patches/types.d.ts +112 -0
- package/dist/patches/types.d.ts.map +1 -0
- package/dist/patches/types.js +5 -0
- package/dist/patches/types.js.map +1 -0
- package/dist/platform.d.ts +8 -0
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +98 -4
- package/dist/platform.js.map +1 -1
- package/dist/routes/anomaly.d.ts +5 -0
- package/dist/routes/anomaly.d.ts.map +1 -0
- package/dist/routes/anomaly.js +308 -0
- package/dist/routes/anomaly.js.map +1 -0
- package/dist/routes/data.d.ts.map +1 -1
- package/dist/routes/data.js +190 -202
- package/dist/routes/data.js.map +1 -1
- package/dist/routes/knowledge.d.ts.map +1 -1
- package/dist/routes/knowledge.js +6 -22
- package/dist/routes/knowledge.js.map +1 -1
- package/dist/routes/metadata.d.ts.map +1 -1
- package/dist/routes/metadata.js +28 -1
- package/dist/routes/metadata.js.map +1 -1
- package/dist/routes/patches.d.ts +7 -0
- package/dist/routes/patches.d.ts.map +1 -0
- package/dist/routes/patches.js +111 -0
- package/dist/routes/patches.js.map +1 -0
- package/dist/routes/subject-roots-backfill.d.ts +4 -0
- package/dist/routes/subject-roots-backfill.d.ts.map +1 -0
- package/dist/routes/subject-roots-backfill.js +15 -0
- package/dist/routes/subject-roots-backfill.js.map +1 -0
- package/dist/single-read-discriminator.d.ts +17 -0
- package/dist/single-read-discriminator.d.ts.map +1 -0
- package/dist/single-read-discriminator.js +67 -0
- package/dist/single-read-discriminator.js.map +1 -0
- package/dist/subject-roots-backfill.d.ts +24 -0
- package/dist/subject-roots-backfill.d.ts.map +1 -0
- package/dist/subject-roots-backfill.js +133 -0
- package/dist/subject-roots-backfill.js.map +1 -0
- package/dist/write-precondition.d.ts +5 -1
- package/dist/write-precondition.d.ts.map +1 -1
- package/dist/write-precondition.js +11 -3
- package/dist/write-precondition.js.map +1 -1
- package/dist/writes/content-write.d.ts +170 -0
- package/dist/writes/content-write.d.ts.map +1 -0
- package/dist/writes/content-write.js +569 -0
- package/dist/writes/content-write.js.map +1 -0
- package/dist/writes/effects.d.ts +13 -0
- package/dist/writes/effects.d.ts.map +1 -0
- package/dist/writes/effects.js +28 -0
- package/dist/writes/effects.js.map +1 -0
- package/dist/writes/error-shape.d.ts +11 -0
- package/dist/writes/error-shape.d.ts.map +1 -0
- package/dist/writes/error-shape.js +100 -0
- package/dist/writes/error-shape.js.map +1 -0
- package/dist/writes/receipt-store.d.ts +81 -0
- package/dist/writes/receipt-store.d.ts.map +1 -0
- package/dist/writes/receipt-store.js +171 -0
- package/dist/writes/receipt-store.js.map +1 -0
- package/dist/writes/worker.d.ts +9 -0
- package/dist/writes/worker.d.ts.map +1 -0
- package/dist/writes/worker.js +20 -0
- package/dist/writes/worker.js.map +1 -0
- package/openapi/openapi.json +18354 -17718
- 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":"AAIA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAElC,eAAO,MAAM,yBAAyB,mBAAmB,CAAC;AAC1D,eAAO,MAAM,uBAAuB,QAA0B,CAAC;AAC/D,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAE7C,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;AAE7E,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,EAAE;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,cAAc,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAC;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,QAAQ,GAAG,gBAAgB,GAAG,MAAM,CAAC;IACnD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC1C,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IAC/F,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IACvE,4DAA4D;IAC5D,MAAM,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC;IAC/D,IAAI,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI,EAAE;QACT,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;QAC3C,KAAK,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;CAClG,CAAC;AAEF,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAErD;AAOD,wBAAgB,6BAA6B,IAAI,iBAAiB,CAmEjE;AAID,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,EAAE,GAAG,iBAAiB,CA6EtE"}
|
|
@@ -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":"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"}
|
|
@@ -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"}
|