@x12i/memorix-service 3.6.2 → 3.6.4
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 +8 -0
- package/dist/access-gate.d.ts +10 -0
- package/dist/access-gate.d.ts.map +1 -1
- package/dist/access-gate.js +38 -1
- package/dist/access-gate.js.map +1 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +2 -0
- package/dist/app.js.map +1 -1
- package/dist/blob-store/types.js +1 -1
- package/dist/blob-store/types.js.map +1 -1
- package/dist/callback-grant.d.ts.map +1 -1
- package/dist/callback-grant.js +10 -6
- package/dist/callback-grant.js.map +1 -1
- package/dist/catalog/catalog-service.js +1 -1
- package/dist/catalog/catalog-service.js.map +1 -1
- package/dist/catalog-bridge.d.ts.map +1 -1
- package/dist/catalog-bridge.js +74 -61
- package/dist/catalog-bridge.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +6 -2
- package/dist/cli.js.map +1 -1
- package/dist/connector-catalog.d.ts +8 -3
- package/dist/connector-catalog.d.ts.map +1 -1
- package/dist/connector-catalog.js +66 -93
- package/dist/connector-catalog.js.map +1 -1
- package/dist/generic-connectors.d.ts +39 -1
- package/dist/generic-connectors.d.ts.map +1 -1
- package/dist/generic-connectors.js +142 -3
- package/dist/generic-connectors.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/jobs-scope.d.ts +1 -0
- package/dist/jobs-scope.d.ts.map +1 -1
- package/dist/jobs-scope.js +5 -4
- package/dist/jobs-scope.js.map +1 -1
- package/dist/mgc-landing-stores.d.ts +94 -0
- package/dist/mgc-landing-stores.d.ts.map +1 -0
- package/dist/mgc-landing-stores.js +174 -0
- package/dist/mgc-landing-stores.js.map +1 -0
- package/dist/optional-companion-url.d.ts +1 -1
- package/dist/optional-companion-url.js +1 -1
- package/dist/pipeline-compile.d.ts +1 -1
- package/dist/pipeline-compile.js +1 -1
- package/dist/platform.d.ts +17 -1
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +56 -8
- package/dist/platform.js.map +1 -1
- package/dist/routes/connector-invocations.d.ts.map +1 -1
- package/dist/routes/connector-invocations.js +6 -1
- package/dist/routes/connector-invocations.js.map +1 -1
- package/dist/routes/connector-ops.d.ts +2 -1
- package/dist/routes/connector-ops.d.ts.map +1 -1
- package/dist/routes/connector-ops.js +8 -5
- package/dist/routes/connector-ops.js.map +1 -1
- package/dist/routes/data.d.ts.map +1 -1
- package/dist/routes/data.js +11 -12
- package/dist/routes/data.js.map +1 -1
- package/dist/routes/jobs.d.ts.map +1 -1
- package/dist/routes/jobs.js +46 -21
- package/dist/routes/jobs.js.map +1 -1
- package/dist/routes/memory.d.ts.map +1 -1
- package/dist/routes/memory.js +187 -90
- package/dist/routes/memory.js.map +1 -1
- package/dist/routes/mgc-landing.d.ts +7 -0
- package/dist/routes/mgc-landing.d.ts.map +1 -0
- package/dist/routes/mgc-landing.js +177 -0
- package/dist/routes/mgc-landing.js.map +1 -0
- package/dist/scope.d.ts +23 -0
- package/dist/scope.d.ts.map +1 -1
- package/dist/scope.js +13 -1
- package/dist/scope.js.map +1 -1
- package/dist/write-precondition.d.ts +14 -0
- package/dist/write-precondition.d.ts.map +1 -0
- package/dist/write-precondition.js +41 -0
- package/dist/write-precondition.js.map +1 -0
- package/package.json +1 -2
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { ServiceError } from "../errors.js";
|
|
2
|
+
import { requireLandingGrant } from "../access-gate.js";
|
|
3
|
+
function asRecord(value) {
|
|
4
|
+
return value && typeof value === "object" && !Array.isArray(value)
|
|
5
|
+
? value
|
|
6
|
+
: null;
|
|
7
|
+
}
|
|
8
|
+
export async function registerMgcLandingRoutes(app, platform) {
|
|
9
|
+
app.put("/api/v1/raw-records/:collection/:identity", async (req) => {
|
|
10
|
+
const landing = requireLandingGrant(req);
|
|
11
|
+
const collection = decodeURIComponent(req.params.collection ?? "").trim();
|
|
12
|
+
const identity = decodeURIComponent(req.params.identity ?? "").trim();
|
|
13
|
+
if (!collection || !identity) {
|
|
14
|
+
throw new ServiceError("VALIDATION", "collection and identity required", 400);
|
|
15
|
+
}
|
|
16
|
+
const body = asRecord(req.body) ?? {};
|
|
17
|
+
const objectType = typeof body.objectType === "string" && body.objectType.trim()
|
|
18
|
+
? body.objectType.trim()
|
|
19
|
+
: collection.replace(/-raw$/, "") || collection;
|
|
20
|
+
const ttlSeconds = typeof body.ttlSeconds === "number" && Number.isFinite(body.ttlSeconds)
|
|
21
|
+
? Math.max(0, Math.floor(body.ttlSeconds))
|
|
22
|
+
: 3600;
|
|
23
|
+
const provenance = body.provenance === "cache" || body.provenance === "source"
|
|
24
|
+
? body.provenance
|
|
25
|
+
: "source";
|
|
26
|
+
const doc = await platform.rawRecordStore.put({
|
|
27
|
+
identity,
|
|
28
|
+
collection,
|
|
29
|
+
objectType,
|
|
30
|
+
payload: body.payload !== undefined ? body.payload : body,
|
|
31
|
+
fetchedAt: typeof body.fetchedAt === "string" && body.fetchedAt
|
|
32
|
+
? body.fetchedAt
|
|
33
|
+
: new Date().toISOString(),
|
|
34
|
+
ttlSeconds,
|
|
35
|
+
connectorId: typeof body.connectorId === "string" && body.connectorId.trim()
|
|
36
|
+
? body.connectorId.trim()
|
|
37
|
+
: "unknown",
|
|
38
|
+
...(typeof body.definitionHash === "string" && body.definitionHash.trim()
|
|
39
|
+
? { definitionHash: body.definitionHash.trim() }
|
|
40
|
+
: {}),
|
|
41
|
+
provenance,
|
|
42
|
+
orgId: landing.orgId,
|
|
43
|
+
...(typeof body.streamId === "string" && body.streamId.trim()
|
|
44
|
+
? { streamId: body.streamId.trim() }
|
|
45
|
+
: {}),
|
|
46
|
+
});
|
|
47
|
+
return { record: doc };
|
|
48
|
+
});
|
|
49
|
+
app.get("/api/v1/raw-records/:collection/:identity", async (req) => {
|
|
50
|
+
const landing = requireLandingGrant(req);
|
|
51
|
+
const collection = decodeURIComponent(req.params.collection ?? "").trim();
|
|
52
|
+
const identity = decodeURIComponent(req.params.identity ?? "").trim();
|
|
53
|
+
const record = await platform.rawRecordStore.get(landing.orgId, collection, identity);
|
|
54
|
+
if (!record)
|
|
55
|
+
throw new ServiceError("NOT_FOUND", "raw record not found", 404);
|
|
56
|
+
return { record };
|
|
57
|
+
});
|
|
58
|
+
app.get("/api/v1/raw-records/:collection", async (req) => {
|
|
59
|
+
const landing = requireLandingGrant(req);
|
|
60
|
+
const collection = decodeURIComponent(req.params.collection ?? "").trim();
|
|
61
|
+
const records = await platform.rawRecordStore.list(landing.orgId, collection);
|
|
62
|
+
return { collection, records };
|
|
63
|
+
});
|
|
64
|
+
const receiptAction = async (req, action) => {
|
|
65
|
+
const landing = requireLandingGrant(req);
|
|
66
|
+
const body = asRecord(req.body) ?? {};
|
|
67
|
+
const destinationId = String(body.destinationId ?? "").trim();
|
|
68
|
+
const idempotencyKey = String(body.idempotencyKey ?? "").trim();
|
|
69
|
+
if (!destinationId || !idempotencyKey) {
|
|
70
|
+
throw new ServiceError("VALIDATION", "destinationId and idempotencyKey required", 400);
|
|
71
|
+
}
|
|
72
|
+
const orgId = landing.orgId;
|
|
73
|
+
if (action === "lookup") {
|
|
74
|
+
const receipt = await platform.targetItemReceipts.lookup(orgId, destinationId, idempotencyKey);
|
|
75
|
+
return { receipt };
|
|
76
|
+
}
|
|
77
|
+
if (action === "claim") {
|
|
78
|
+
const receipt = await platform.targetItemReceipts.claim({
|
|
79
|
+
orgId,
|
|
80
|
+
destinationId,
|
|
81
|
+
idempotencyKey,
|
|
82
|
+
workId: typeof body.workId === "string" ? body.workId : undefined,
|
|
83
|
+
invocationId: typeof body.invocationId === "string"
|
|
84
|
+
? body.invocationId
|
|
85
|
+
: landing.invocationId,
|
|
86
|
+
});
|
|
87
|
+
return { receipt };
|
|
88
|
+
}
|
|
89
|
+
if (action === "complete") {
|
|
90
|
+
const receipt = await platform.targetItemReceipts.complete({
|
|
91
|
+
orgId,
|
|
92
|
+
destinationId,
|
|
93
|
+
idempotencyKey,
|
|
94
|
+
providerResourceId: typeof body.providerResourceId === "string"
|
|
95
|
+
? body.providerResourceId
|
|
96
|
+
: undefined,
|
|
97
|
+
reused: body.reused === true,
|
|
98
|
+
reconciled: body.reconciled === true,
|
|
99
|
+
receipt: asRecord(body.receipt) ?? undefined,
|
|
100
|
+
});
|
|
101
|
+
return { receipt };
|
|
102
|
+
}
|
|
103
|
+
const failure = asRecord(body.failure);
|
|
104
|
+
const receipt = await platform.targetItemReceipts.release({
|
|
105
|
+
orgId,
|
|
106
|
+
destinationId,
|
|
107
|
+
idempotencyKey,
|
|
108
|
+
retryable: body.retryable !== false,
|
|
109
|
+
effectState: body.effectState === "unknown" ||
|
|
110
|
+
body.effectState === "applied" ||
|
|
111
|
+
body.effectState === "not_applied"
|
|
112
|
+
? body.effectState
|
|
113
|
+
: "not_applied",
|
|
114
|
+
failure: failure
|
|
115
|
+
? {
|
|
116
|
+
code: String(failure.code ?? "TARGET_ITEM_FAILED"),
|
|
117
|
+
message: String(failure.message ?? ""),
|
|
118
|
+
}
|
|
119
|
+
: undefined,
|
|
120
|
+
});
|
|
121
|
+
return { receipt };
|
|
122
|
+
};
|
|
123
|
+
app.post("/api/memory/target-receipts/lookup", async (req) => receiptAction(req, "lookup"));
|
|
124
|
+
app.post("/api/memory/target-receipts/claim", async (req) => receiptAction(req, "claim"));
|
|
125
|
+
app.post("/api/memory/target-receipts/complete", async (req) => receiptAction(req, "complete"));
|
|
126
|
+
app.post("/api/memory/target-receipts/release", async (req) => receiptAction(req, "release"));
|
|
127
|
+
app.put("/api/memory/artifacts/:ref", async (req) => {
|
|
128
|
+
const landing = requireLandingGrant(req);
|
|
129
|
+
const ref = decodeURIComponent(req.params.ref ?? "").trim();
|
|
130
|
+
if (!ref)
|
|
131
|
+
throw new ServiceError("VALIDATION", "ref required", 400);
|
|
132
|
+
const contentType = typeof req.headers["content-type"] === "string"
|
|
133
|
+
? req.headers["content-type"].split(";")[0].trim()
|
|
134
|
+
: "application/octet-stream";
|
|
135
|
+
const raw = req.body;
|
|
136
|
+
const bytes = Buffer.isBuffer(raw)
|
|
137
|
+
? raw
|
|
138
|
+
: typeof raw === "string"
|
|
139
|
+
? Buffer.from(raw)
|
|
140
|
+
: Buffer.from(JSON.stringify(raw ?? null));
|
|
141
|
+
await platform.deliveryArtifacts.put({
|
|
142
|
+
ref,
|
|
143
|
+
orgId: landing.orgId,
|
|
144
|
+
contentType,
|
|
145
|
+
bytes,
|
|
146
|
+
createdAt: new Date().toISOString(),
|
|
147
|
+
});
|
|
148
|
+
try {
|
|
149
|
+
await platform.blobStore.put(landing.orgId, `mgc-artifacts/${ref}`, bytes, { contentType });
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// in-memory artifact store is enough for the GET path
|
|
153
|
+
}
|
|
154
|
+
return { ref, bytes: bytes.length };
|
|
155
|
+
});
|
|
156
|
+
app.get("/api/memory/artifacts/:ref/content", async (req, reply) => {
|
|
157
|
+
const landing = requireLandingGrant(req);
|
|
158
|
+
const ref = decodeURIComponent(req.params.ref ?? "").trim();
|
|
159
|
+
if (!ref)
|
|
160
|
+
throw new ServiceError("VALIDATION", "ref required", 400);
|
|
161
|
+
const local = await platform.deliveryArtifacts.get(landing.orgId, ref);
|
|
162
|
+
if (local) {
|
|
163
|
+
return reply
|
|
164
|
+
.header("content-type", local.contentType)
|
|
165
|
+
.send(local.bytes);
|
|
166
|
+
}
|
|
167
|
+
const fromBlob = await platform.blobStore.get(landing.orgId, `mgc-artifacts/${ref}`);
|
|
168
|
+
if (!fromBlob) {
|
|
169
|
+
throw new ServiceError("NOT_FOUND", "artifact not found", 404);
|
|
170
|
+
}
|
|
171
|
+
const head = await platform.blobStore.head(landing.orgId, `mgc-artifacts/${ref}`);
|
|
172
|
+
return reply
|
|
173
|
+
.header("content-type", head?.contentType ?? "application/octet-stream")
|
|
174
|
+
.send(fromBlob);
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=mgc-landing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mgc-landing.js","sourceRoot":"","sources":["../../src/routes/mgc-landing.ts"],"names":[],"mappings":"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"}
|
package/dist/scope.d.ts
CHANGED
|
@@ -1,6 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Canonical request scope: exactly one orgId + one or more unique agentIds.
|
|
3
3
|
* orgId = data universe; agentIds = effective metadata only.
|
|
4
|
+
*
|
|
5
|
+
* ## Org identity (MX-ORG-01)
|
|
6
|
+
*
|
|
7
|
+
* Org ids are **case-insensitive**. Canonical form is trim + Unicode-stable
|
|
8
|
+
* lower-case via `String.prototype.toLocaleLowerCase("en-US")` (ASCII lower-case
|
|
9
|
+
* for the org ids used in practice). The same rule applies to:
|
|
10
|
+
* - `x-memorix-org-id` / `x-organization-id` / `x-org-id`
|
|
11
|
+
* - path / query org ids that resolve into scope
|
|
12
|
+
* - auth / invocation-grant org claims (compare and store canonical)
|
|
13
|
+
*
|
|
14
|
+
* `scope.orgId` and `addressing.orgId` always echo the canonical form, so
|
|
15
|
+
* writers and readers that differ only by case share one tenant bag.
|
|
16
|
+
* Empty / missing org remains rejected (400).
|
|
17
|
+
*
|
|
18
|
+
* Non-goal: merging two **already distinct** bags written under different
|
|
19
|
+
* casings in the past (one-time ops rekey if both exist).
|
|
4
20
|
*/
|
|
5
21
|
export type MemorixScope = {
|
|
6
22
|
orgId: string;
|
|
@@ -10,6 +26,13 @@ export declare class ScopeValidationError extends Error {
|
|
|
10
26
|
readonly code = "SCOPE_INVALID";
|
|
11
27
|
constructor(message: string);
|
|
12
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Canonical org id: trim + `toLocaleLowerCase("en-US")`.
|
|
31
|
+
* Returns "" when the input is empty/whitespace (caller rejects).
|
|
32
|
+
*/
|
|
33
|
+
export declare function normalizeOrgId(raw: string): string;
|
|
34
|
+
/** Case-insensitive org equality after the same normalization rule. */
|
|
35
|
+
export declare function orgIdsEqual(a: string, b: string): boolean;
|
|
13
36
|
export declare function canonicalizeScope(input: {
|
|
14
37
|
orgId?: unknown;
|
|
15
38
|
agentIds?: unknown;
|
package/dist/scope.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEF,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,mBAAmB;gBACpB,OAAO,EAAE,MAAM;CAI5B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,YAAY,CAmCf;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,YAAY,CAcrG"}
|
package/dist/scope.js
CHANGED
|
@@ -5,8 +5,19 @@ export class ScopeValidationError extends Error {
|
|
|
5
5
|
this.name = "ScopeValidationError";
|
|
6
6
|
}
|
|
7
7
|
}
|
|
8
|
+
/**
|
|
9
|
+
* Canonical org id: trim + `toLocaleLowerCase("en-US")`.
|
|
10
|
+
* Returns "" when the input is empty/whitespace (caller rejects).
|
|
11
|
+
*/
|
|
12
|
+
export function normalizeOrgId(raw) {
|
|
13
|
+
return raw.trim().toLocaleLowerCase("en-US");
|
|
14
|
+
}
|
|
15
|
+
/** Case-insensitive org equality after the same normalization rule. */
|
|
16
|
+
export function orgIdsEqual(a, b) {
|
|
17
|
+
return normalizeOrgId(a) === normalizeOrgId(b);
|
|
18
|
+
}
|
|
8
19
|
export function canonicalizeScope(input) {
|
|
9
|
-
const orgId = typeof input.orgId === "string" ? input.orgId
|
|
20
|
+
const orgId = typeof input.orgId === "string" ? normalizeOrgId(input.orgId) : "";
|
|
10
21
|
if (!orgId) {
|
|
11
22
|
throw new ScopeValidationError("orgId is required and must be a non-empty string");
|
|
12
23
|
}
|
|
@@ -34,6 +45,7 @@ export function canonicalizeScope(input) {
|
|
|
34
45
|
}
|
|
35
46
|
export function scopeFromHeaders(headers) {
|
|
36
47
|
const org = header(headers, "x-memorix-org-id") ??
|
|
48
|
+
header(headers, "x-organization-id") ??
|
|
37
49
|
header(headers, "x-org-id");
|
|
38
50
|
const agents = header(headers, "x-memorix-agent-ids") ??
|
|
39
51
|
header(headers, "x-agent-ids");
|
package/dist/scope.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type WireWritePrecondition = "absent" | "exact-revision" | {
|
|
2
|
+
kind: "absent";
|
|
3
|
+
} | {
|
|
4
|
+
kind: "revision";
|
|
5
|
+
revision: number;
|
|
6
|
+
};
|
|
7
|
+
export type NormalizedWritePrecondition = {
|
|
8
|
+
form: "absent";
|
|
9
|
+
} | {
|
|
10
|
+
form: "exact-revision";
|
|
11
|
+
expectedRevision: number;
|
|
12
|
+
};
|
|
13
|
+
export declare function normalizeWritePrecondition(raw: unknown, expectedRevision?: unknown): NormalizedWritePrecondition;
|
|
14
|
+
//# sourceMappingURL=write-precondition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-precondition.d.ts","sourceRoot":"","sources":["../src/write-precondition.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,qBAAqB,GAC7B,QAAQ,GACR,gBAAgB,GAChB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C,MAAM,MAAM,2BAA2B,GACnC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,OAAO,EACZ,gBAAgB,CAAC,EAAE,OAAO,GACzB,2BAA2B,CA6C7B"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalize POST /api/data/content write preconditions.
|
|
3
|
+
*
|
|
4
|
+
* Canonical wire form is string `"absent" | "exact-revision"` (+ `expectedRevision`).
|
|
5
|
+
* Also accept the writer-native object form `{ kind: "absent" }` /
|
|
6
|
+
* `{ kind: "revision", revision }` so clients do not silently fall through to create.
|
|
7
|
+
*/
|
|
8
|
+
import { ServiceError } from "./errors.js";
|
|
9
|
+
export function normalizeWritePrecondition(raw, expectedRevision) {
|
|
10
|
+
if (raw === "absent") {
|
|
11
|
+
return { form: "absent" };
|
|
12
|
+
}
|
|
13
|
+
if (raw === "exact-revision") {
|
|
14
|
+
if (expectedRevision === undefined || expectedRevision === null || expectedRevision === "") {
|
|
15
|
+
throw new ServiceError("VALIDATION", "expectedRevision required when precondition is exact-revision", 400);
|
|
16
|
+
}
|
|
17
|
+
const revision = Number(expectedRevision);
|
|
18
|
+
if (!Number.isFinite(revision)) {
|
|
19
|
+
throw new ServiceError("VALIDATION", "expectedRevision must be a number", 400);
|
|
20
|
+
}
|
|
21
|
+
return { form: "exact-revision", expectedRevision: revision };
|
|
22
|
+
}
|
|
23
|
+
if (raw && typeof raw === "object" && !Array.isArray(raw)) {
|
|
24
|
+
const kind = raw.kind;
|
|
25
|
+
if (kind === "absent") {
|
|
26
|
+
return { form: "absent" };
|
|
27
|
+
}
|
|
28
|
+
if (kind === "revision") {
|
|
29
|
+
const fromBody = raw.revision;
|
|
30
|
+
const revision = Number(fromBody !== undefined && fromBody !== null && fromBody !== ""
|
|
31
|
+
? fromBody
|
|
32
|
+
: expectedRevision);
|
|
33
|
+
if (!Number.isFinite(revision)) {
|
|
34
|
+
throw new ServiceError("VALIDATION", "precondition.revision (or expectedRevision) required when kind is revision", 400);
|
|
35
|
+
}
|
|
36
|
+
return { form: "exact-revision", expectedRevision: revision };
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
throw new ServiceError("VALIDATION", 'precondition required: "absent" | "exact-revision" | { kind: "absent" } | { kind: "revision", revision }', 400);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=write-precondition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-precondition.js","sourceRoot":"","sources":["../src/write-precondition.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAY3C,MAAM,UAAU,0BAA0B,CACxC,GAAY,EACZ,gBAA0B;IAE1B,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC5B,CAAC;IACD,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;QAC7B,IAAI,gBAAgB,KAAK,SAAS,IAAI,gBAAgB,KAAK,IAAI,IAAI,gBAAgB,KAAK,EAAE,EAAE,CAAC;YAC3F,MAAM,IAAI,YAAY,CACpB,YAAY,EACZ,+DAA+D,EAC/D,GAAG,CACJ,CAAC;QACJ,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,YAAY,CAAC,YAAY,EAAE,mCAAmC,EAAE,GAAG,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC;IAChE,CAAC;IACD,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAI,GAA0B,CAAC,IAAI,CAAC;QAC9C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAI,GAA8B,CAAC,QAAQ,CAAC;YAC1D,MAAM,QAAQ,GAAG,MAAM,CACrB,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,EAAE;gBAC5D,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,gBAAgB,CACrB,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,YAAY,CACpB,YAAY,EACZ,4EAA4E,EAC5E,GAAG,CACJ,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC;QAChE,CAAC;IACH,CAAC;IACD,MAAM,IAAI,YAAY,CACpB,YAAY,EACZ,0GAA0G,EAC1G,GAAG,CACJ,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@x12i/memorix-service",
|
|
3
|
-
"version": "3.6.
|
|
3
|
+
"version": "3.6.4",
|
|
4
4
|
"description": "Memorix production service composition root — one versioned API over accepted packages.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -83,7 +83,6 @@
|
|
|
83
83
|
"@neo-connectors/neo-splunk-platform-services": "0.1.0",
|
|
84
84
|
"@neo-connectors/neo-status-ui": "0.1.0",
|
|
85
85
|
"@neo-connectors/neo-tenable-nessus-services": "0.1.0",
|
|
86
|
-
"@x12i/memorix-graphifier": "^1.2.0",
|
|
87
86
|
"@x12i/memorix-pipeline-services": "1.6.0",
|
|
88
87
|
"@x12i/web-agentic-api": "0.2.0"
|
|
89
88
|
},
|