@cotal-ai/core 0.89.0 → 0.90.1
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/auth-provider.d.ts +25 -0
- package/dist/auth-provider.d.ts.map +1 -1
- package/dist/auth-provider.js.map +1 -1
- package/dist/endpoint-capability-policy.d.ts +24 -0
- package/dist/endpoint-capability-policy.d.ts.map +1 -0
- package/dist/endpoint-capability-policy.js +106 -0
- package/dist/endpoint-capability-policy.js.map +1 -0
- package/dist/endpoint-describe-observation.d.ts +20 -0
- package/dist/endpoint-describe-observation.d.ts.map +1 -0
- package/dist/endpoint-describe-observation.js +33 -0
- package/dist/endpoint-describe-observation.js.map +1 -0
- package/dist/endpoint-reconcile.d.ts.map +1 -1
- package/dist/endpoint-reconcile.js +3 -1
- package/dist/endpoint-reconcile.js.map +1 -1
- package/dist/endpoint-serve-kv.d.ts +4 -13
- package/dist/endpoint-serve-kv.d.ts.map +1 -1
- package/dist/endpoint-serve-kv.js +114 -7
- package/dist/endpoint-serve-kv.js.map +1 -1
- package/dist/endpoint-serve.d.ts +2 -1
- package/dist/endpoint-serve.d.ts.map +1 -1
- package/dist/endpoint-serve.js +13 -2
- package/dist/endpoint-serve.js.map +1 -1
- package/dist/endpoint-service.d.ts +15 -14
- package/dist/endpoint-service.d.ts.map +1 -1
- package/dist/endpoint-service.js +47 -0
- package/dist/endpoint-service.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/lifecycle-saga.d.ts.map +1 -1
- package/dist/lifecycle-saga.js +20 -12
- package/dist/lifecycle-saga.js.map +1 -1
- package/dist/lifecycle-state.d.ts +17 -1
- package/dist/lifecycle-state.d.ts.map +1 -1
- package/dist/lifecycle-state.js +24 -4
- package/dist/lifecycle-state.js.map +1 -1
- package/dist/native-uid-custody.d.ts +43 -0
- package/dist/native-uid-custody.d.ts.map +1 -0
- package/dist/native-uid-custody.js +104 -0
- package/dist/native-uid-custody.js.map +1 -0
- package/dist/provision.d.ts +26 -0
- package/dist/provision.d.ts.map +1 -1
- package/dist/provision.js +28 -0
- package/dist/provision.js.map +1 -1
- package/dist/remote-service-authority.d.ts +204 -0
- package/dist/remote-service-authority.d.ts.map +1 -0
- package/dist/remote-service-authority.js +415 -0
- package/dist/remote-service-authority.js.map +1 -0
- package/dist/service-authority-limits.d.ts +5 -0
- package/dist/service-authority-limits.d.ts.map +1 -0
- package/dist/service-authority-limits.js +5 -0
- package/dist/service-authority-limits.js.map +1 -0
- package/dist/service-gate.d.ts +42 -0
- package/dist/service-gate.d.ts.map +1 -0
- package/dist/service-gate.js +99 -0
- package/dist/service-gate.js.map +1 -0
- package/dist/terminal.d.ts +5 -5
- package/package.json +1 -1
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { canonicalJson, contractDigest, isContractDigest } from "./canonical.js";
|
|
3
|
+
import { CONTRACT_CLOSURE_MAX_ARTIFACTS } from "./contract-manifest.js";
|
|
4
|
+
import { CONTRACT_ARTIFACT_MAX_BYTES } from "./endpoint-contract-store.js";
|
|
5
|
+
import { EpEnvelopeError } from "./endpoint-error.js";
|
|
6
|
+
import { endpointToken, assertBoundedOwner, assertCommandToken, parseEpSubject, MAX_EP_SUBJECT_BYTES } from "./endpoint-subjects.js";
|
|
7
|
+
import { parseServiceSpec } from "./endpoint-service.js";
|
|
8
|
+
import { isAccountNkey } from "./identity.js";
|
|
9
|
+
import { assertDerivedOwnerToken, assertLifecycleToken, spacePrefix } from "./subjects.js";
|
|
10
|
+
import { SERVICE_AUTHORITY_MAX_BYTES, SERVICE_DESCRIBE_QUERY_BUDGET_MS } from "./service-authority-limits.js";
|
|
11
|
+
export { SERVICE_ACCESS_TTL_SECONDS, SERVICE_RENEWAL_TTL_SECONDS, SERVICE_AUTHORITY_MAX_BYTES, SERVICE_DESCRIBE_QUERY_BUDGET_MS } from "./service-authority-limits.js";
|
|
12
|
+
/** A transport failure never permits a new mutation identity or an unqualified replay. */
|
|
13
|
+
export class ServiceAuthorityTransportError extends Error {
|
|
14
|
+
outcome;
|
|
15
|
+
httpStatus;
|
|
16
|
+
constructor(message, outcome, httpStatus) {
|
|
17
|
+
super(message);
|
|
18
|
+
this.outcome = outcome;
|
|
19
|
+
this.httpStatus = httpStatus;
|
|
20
|
+
this.name = "ServiceAuthorityTransportError";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const COMMON = ["v", "kind", "operation", "requestId", "space", "accountPublicKey", "endpoint", "instanceId"];
|
|
24
|
+
const WITNESS = ["accountPublicKey", "space", "endpoint", "instanceId", "principal", "rootCredentialId", "approvalDigest", "processEpoch", "registrationRevision", "nameAuthorityRevision", "registrationRequestId", "registrationProof"];
|
|
25
|
+
const OPERATIONS = ["register", "activate", "renew", "ready", "revoke", "status", "describe-view"];
|
|
26
|
+
const RESULT_STATES = {
|
|
27
|
+
register: ["approval-required", "pending", "registered", "denied"],
|
|
28
|
+
activate: ["credential", "denied"],
|
|
29
|
+
renew: ["credential", "denied"],
|
|
30
|
+
ready: ["ready", "denied"],
|
|
31
|
+
revoke: ["pending", "retired", "denied"],
|
|
32
|
+
status: ["status", "denied"],
|
|
33
|
+
"describe-view": ["view", "denied"],
|
|
34
|
+
};
|
|
35
|
+
const PROOFS = {
|
|
36
|
+
register: ["idp"], activate: ["idp", "service-renewal"], renew: ["service-renewal"],
|
|
37
|
+
ready: ["service-access"], revoke: ["idp", "service-renewal"],
|
|
38
|
+
status: ["idp", "service-renewal", "service-access"],
|
|
39
|
+
"describe-view": ["service-access"],
|
|
40
|
+
};
|
|
41
|
+
function invalid(detail) {
|
|
42
|
+
throw new EpEnvelopeError("bad-request", `service-endpoint authority: ${detail}`);
|
|
43
|
+
}
|
|
44
|
+
function record(raw, what) {
|
|
45
|
+
if (raw === null || typeof raw !== "object" || Array.isArray(raw))
|
|
46
|
+
invalid(`${what} must be an object`);
|
|
47
|
+
const proto = Object.getPrototypeOf(raw);
|
|
48
|
+
if (proto !== Object.prototype && proto !== null)
|
|
49
|
+
invalid(`${what} must be a plain object`);
|
|
50
|
+
return raw;
|
|
51
|
+
}
|
|
52
|
+
function closed(o, required, optional = []) {
|
|
53
|
+
if (required.some((k) => !Object.hasOwn(o, k)) ||
|
|
54
|
+
Reflect.ownKeys(o).some((k) => typeof k !== "string" || (!required.includes(k) && !optional.includes(k))))
|
|
55
|
+
invalid("object has missing or unsupported fields");
|
|
56
|
+
}
|
|
57
|
+
function text(raw, what, max = 128) {
|
|
58
|
+
if (typeof raw !== "string" || raw.length === 0 || raw.length > max)
|
|
59
|
+
invalid(`${what} must be bounded nonempty text`);
|
|
60
|
+
return raw;
|
|
61
|
+
}
|
|
62
|
+
function integer(raw, what) {
|
|
63
|
+
if (typeof raw !== "number" || !Number.isSafeInteger(raw) || raw < 0)
|
|
64
|
+
invalid(`${what} must be an unsigned safe integer`);
|
|
65
|
+
return raw;
|
|
66
|
+
}
|
|
67
|
+
function requestId(raw) {
|
|
68
|
+
if (typeof raw !== "string" || !/^[0-9a-f]{32}$/.test(raw))
|
|
69
|
+
invalid("requestId must be 32 lowercase hex characters");
|
|
70
|
+
return raw;
|
|
71
|
+
}
|
|
72
|
+
function digest(raw, what) {
|
|
73
|
+
if (typeof raw !== "string" || !isContractDigest(raw))
|
|
74
|
+
invalid(`${what} must be a canonical sha256 digest`);
|
|
75
|
+
return raw;
|
|
76
|
+
}
|
|
77
|
+
function coordinates(o) {
|
|
78
|
+
if (o.v !== 1 || o.kind !== "service-endpoint-authority")
|
|
79
|
+
invalid("unsupported version or kind");
|
|
80
|
+
if (!OPERATIONS.includes(o.operation))
|
|
81
|
+
invalid("unsupported operation");
|
|
82
|
+
requestId(o.requestId);
|
|
83
|
+
spacePrefix(text(o.space, "space"));
|
|
84
|
+
if (typeof o.accountPublicKey !== "string" || !isAccountNkey(o.accountPublicKey))
|
|
85
|
+
invalid("invalid account public key");
|
|
86
|
+
endpointToken(text(o.endpoint, "endpoint", 512));
|
|
87
|
+
assertLifecycleToken(text(o.instanceId, "instanceId"), "instanceId");
|
|
88
|
+
}
|
|
89
|
+
function boundedJson(raw) {
|
|
90
|
+
let bytes;
|
|
91
|
+
try {
|
|
92
|
+
bytes = canonicalJson(raw);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
invalid("input must be canonicalizable JSON");
|
|
96
|
+
}
|
|
97
|
+
if (Buffer.byteLength(bytes, "utf8") > SERVICE_AUTHORITY_MAX_BYTES)
|
|
98
|
+
invalid("JSON exceeds the authority envelope limit");
|
|
99
|
+
return bytes;
|
|
100
|
+
}
|
|
101
|
+
function artifacts(raw, closureCount) {
|
|
102
|
+
// Each native closure counts documents separately from its manifest. The HTTP byte bound
|
|
103
|
+
// still caps the union, and the host must verify each closure's own walk limits.
|
|
104
|
+
if (!Number.isSafeInteger(closureCount) || closureCount < 1 || closureCount > CONTRACT_CLOSURE_MAX_ARTIFACTS)
|
|
105
|
+
invalid("clusterDigests must be a bounded nonempty array");
|
|
106
|
+
if (!Array.isArray(raw) || raw.length === 0 || raw.length > closureCount * (CONTRACT_CLOSURE_MAX_ARTIFACTS + 1))
|
|
107
|
+
invalid("contractArtifacts must be a bounded nonempty array");
|
|
108
|
+
const seen = new Set();
|
|
109
|
+
for (const artifact of raw) {
|
|
110
|
+
record(artifact, "contract artifact");
|
|
111
|
+
const bytes = boundedJson(artifact);
|
|
112
|
+
if (Buffer.byteLength(bytes, "utf8") > CONTRACT_ARTIFACT_MAX_BYTES)
|
|
113
|
+
invalid("contract artifact exceeds the native byte limit");
|
|
114
|
+
const id = contractDigest(artifact);
|
|
115
|
+
if (seen.has(id))
|
|
116
|
+
invalid("duplicate contract artifact");
|
|
117
|
+
seen.add(id);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
export function parseServiceAuthorityInfo(raw, expectedSpace) {
|
|
121
|
+
const o = record(raw, "authority info");
|
|
122
|
+
closed(o, ["v", "kind", "space", "accountPublicKey"]);
|
|
123
|
+
spacePrefix(expectedSpace);
|
|
124
|
+
if (o.v !== 1 || o.kind !== "service-endpoint-authority-info" || o.space !== expectedSpace)
|
|
125
|
+
invalid("authority info does not match this space and protocol");
|
|
126
|
+
if (typeof o.accountPublicKey !== "string" || !isAccountNkey(o.accountPublicKey))
|
|
127
|
+
invalid("invalid DATA-account public key");
|
|
128
|
+
return { v: 1, kind: "service-endpoint-authority-info", space: expectedSpace, accountPublicKey: o.accountPublicKey };
|
|
129
|
+
}
|
|
130
|
+
export function parseServiceRegistrationWitness(raw) {
|
|
131
|
+
const o = record(raw, "registration witness");
|
|
132
|
+
closed(o, WITNESS);
|
|
133
|
+
coordinates({ ...o, v: 1, kind: "service-endpoint-authority", operation: "activate", requestId: o.registrationRequestId });
|
|
134
|
+
const principal = record(o.principal, "service principal");
|
|
135
|
+
closed(principal, ["owner", "actor", "lifecycleUid"]);
|
|
136
|
+
assertDerivedOwnerToken(text(principal.owner, "owner"));
|
|
137
|
+
assertBoundedOwner(text(principal.actor, "actor"), "service actor");
|
|
138
|
+
assertLifecycleToken(text(principal.lifecycleUid, "lifecycleUid"), "lifecycleUid");
|
|
139
|
+
assertLifecycleToken(text(o.rootCredentialId, "rootCredentialId"), "rootCredentialId");
|
|
140
|
+
digest(o.approvalDigest, "approvalDigest");
|
|
141
|
+
digest(o.registrationProof, "registrationProof");
|
|
142
|
+
for (const key of ["processEpoch", "registrationRevision", "nameAuthorityRevision"])
|
|
143
|
+
integer(o[key], key);
|
|
144
|
+
const expectedActor = serviceEndpointActor({
|
|
145
|
+
accountPublicKey: o.accountPublicKey, space: o.space, owner: principal.owner,
|
|
146
|
+
endpoint: o.endpoint, instanceId: o.instanceId,
|
|
147
|
+
});
|
|
148
|
+
if (principal.actor !== expectedActor)
|
|
149
|
+
invalid("serving actor does not match the assigned tuple");
|
|
150
|
+
return JSON.parse(boundedJson(o));
|
|
151
|
+
}
|
|
152
|
+
function boundWitness(raw, request) {
|
|
153
|
+
const witness = parseServiceRegistrationWitness(raw);
|
|
154
|
+
for (const key of ["accountPublicKey", "space", "endpoint", "instanceId"])
|
|
155
|
+
if (witness[key] !== request[key])
|
|
156
|
+
invalid("witness belongs to a different service assignment");
|
|
157
|
+
return witness;
|
|
158
|
+
}
|
|
159
|
+
function observation(raw, outer) {
|
|
160
|
+
const o = record(raw, "Describe observation");
|
|
161
|
+
closed(o, ["subject", "fingerprint"]);
|
|
162
|
+
const subject = text(o.subject, "Describe subject", MAX_EP_SUBJECT_BYTES);
|
|
163
|
+
const parsed = parseEpSubject(subject);
|
|
164
|
+
if (!subject.startsWith(`${spacePrefix(outer.space)}.ep.`) || !parsed || parsed.plane !== "request"
|
|
165
|
+
|| parsed.command !== "describe" || parsed.endpoint !== outer.endpoint || parsed.target !== null
|
|
166
|
+
|| (parsed.route === "inst" && parsed.instanceId !== outer.instanceId))
|
|
167
|
+
invalid("Describe observation does not name this service");
|
|
168
|
+
return { subject, fingerprint: digest(o.fingerprint, "Describe fingerprint") };
|
|
169
|
+
}
|
|
170
|
+
/** Parsing binds shape and identity only. Authentication and current native state remain host checks. */
|
|
171
|
+
export function parseServiceAuthorityRequest(raw) {
|
|
172
|
+
const o = record(raw, "request");
|
|
173
|
+
coordinates(o);
|
|
174
|
+
switch (o.operation) {
|
|
175
|
+
case "register": {
|
|
176
|
+
closed(o, [...COMMON, "registration", "expected"]);
|
|
177
|
+
const registration = record(o.registration, "registration");
|
|
178
|
+
closed(registration, ["clusterDigests", "contractArtifacts"]);
|
|
179
|
+
const digests = registration.clusterDigests;
|
|
180
|
+
if (!Array.isArray(digests) || digests.length === 0 || digests.length > CONTRACT_CLOSURE_MAX_ARTIFACTS)
|
|
181
|
+
invalid("clusterDigests must be a bounded nonempty array");
|
|
182
|
+
digests.forEach((d) => digest(d, "cluster digest"));
|
|
183
|
+
if (new Set(digests).size !== digests.length)
|
|
184
|
+
invalid("duplicate cluster digest");
|
|
185
|
+
artifacts(registration.contractArtifacts, digests.length);
|
|
186
|
+
const expected = record(o.expected, "expected registration");
|
|
187
|
+
if (expected.state === "unregistered")
|
|
188
|
+
closed(expected, ["state"]);
|
|
189
|
+
else if (expected.state === "registered") {
|
|
190
|
+
closed(expected, ["state", "witness"]);
|
|
191
|
+
boundWitness(expected.witness, o);
|
|
192
|
+
}
|
|
193
|
+
else
|
|
194
|
+
invalid("unsupported expected registration state");
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
case "describe-view":
|
|
198
|
+
closed(o, [...COMMON, "witness", "observation"]);
|
|
199
|
+
boundWitness(o.witness, o);
|
|
200
|
+
observation(o.observation, o);
|
|
201
|
+
break;
|
|
202
|
+
case "status": {
|
|
203
|
+
closed(o, [...COMMON, "target"]);
|
|
204
|
+
const target = record(o.target, "status target");
|
|
205
|
+
if (target.kind === "instance")
|
|
206
|
+
closed(target, ["kind"]);
|
|
207
|
+
else if (target.kind === "operation") {
|
|
208
|
+
closed(target, ["kind", "requestId"]);
|
|
209
|
+
requestId(target.requestId);
|
|
210
|
+
}
|
|
211
|
+
else
|
|
212
|
+
invalid("unsupported status target");
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
default:
|
|
216
|
+
closed(o, [...COMMON, "witness"]);
|
|
217
|
+
boundWitness(o.witness, o);
|
|
218
|
+
}
|
|
219
|
+
return JSON.parse(boundedJson(o));
|
|
220
|
+
}
|
|
221
|
+
export function parseServiceAuthorityEnvelope(raw) {
|
|
222
|
+
const o = record(raw, "envelope");
|
|
223
|
+
closed(o, ["request", "proof"]);
|
|
224
|
+
const request = parseServiceAuthorityRequest(o.request);
|
|
225
|
+
const proof = record(o.proof, "proof");
|
|
226
|
+
closed(proof, ["kind", "token"]);
|
|
227
|
+
if (!PROOFS[request.operation].includes(proof.kind))
|
|
228
|
+
invalid("proof kind is not admitted for this operation");
|
|
229
|
+
text(proof.token, "proof token", 64 * 1024);
|
|
230
|
+
boundedJson(o);
|
|
231
|
+
return { request, proof: { kind: proof.kind, token: proof.token } };
|
|
232
|
+
}
|
|
233
|
+
function snapshot(raw, witness) {
|
|
234
|
+
const o = record(raw, "registration snapshot");
|
|
235
|
+
closed(o, ["spec", "name", "processEpoch", "contractArtifacts"]);
|
|
236
|
+
const spec = record(o.spec, "spec snapshot"), name = record(o.name, "name snapshot");
|
|
237
|
+
closed(spec, ["value", "revision"]);
|
|
238
|
+
closed(name, ["authorized", "revision"]);
|
|
239
|
+
const value = parseServiceSpec(spec.value, { endpoint: witness.endpoint });
|
|
240
|
+
if (value.owner !== witness.principal.owner || spec.revision !== witness.registrationRevision ||
|
|
241
|
+
name.authorized !== true || name.revision !== witness.nameAuthorityRevision || o.processEpoch !== witness.processEpoch)
|
|
242
|
+
invalid("snapshot disagrees with the registration witness");
|
|
243
|
+
artifacts(o.contractArtifacts, value.clusterDigests.length);
|
|
244
|
+
return value;
|
|
245
|
+
}
|
|
246
|
+
function status(raw, outer) {
|
|
247
|
+
const o = record(raw, "status result");
|
|
248
|
+
switch (o.state) {
|
|
249
|
+
case "proposed":
|
|
250
|
+
closed(o, ["state", "proposalId", "proposalDigest"]);
|
|
251
|
+
text(o.proposalId, "proposalId");
|
|
252
|
+
digest(o.proposalDigest, "proposalDigest");
|
|
253
|
+
break;
|
|
254
|
+
case "approved-unregistered":
|
|
255
|
+
closed(o, ["state", "approvalDigest"]);
|
|
256
|
+
digest(o.approvalDigest, "approvalDigest");
|
|
257
|
+
break;
|
|
258
|
+
case "registering":
|
|
259
|
+
case "revoking":
|
|
260
|
+
closed(o, ["state", "operationId", "phase"], ["notBefore"]);
|
|
261
|
+
text(o.operationId, "operationId");
|
|
262
|
+
text(o.phase, "phase");
|
|
263
|
+
if (o.notBefore !== undefined)
|
|
264
|
+
integer(o.notBefore, "notBefore");
|
|
265
|
+
break;
|
|
266
|
+
case "registered":
|
|
267
|
+
case "ready": {
|
|
268
|
+
closed(o, ["state", "witness", "snapshot", ...(o.state === "ready" ? ["reportedAt"] : [])]);
|
|
269
|
+
snapshot(o.snapshot, boundWitness(o.witness, outer));
|
|
270
|
+
if (o.state === "ready")
|
|
271
|
+
integer(o.reportedAt, "reportedAt");
|
|
272
|
+
break;
|
|
273
|
+
}
|
|
274
|
+
case "retired":
|
|
275
|
+
closed(o, ["state", "operationId", "witness"]);
|
|
276
|
+
text(o.operationId, "operationId");
|
|
277
|
+
boundWitness(o.witness, outer);
|
|
278
|
+
break;
|
|
279
|
+
case "refused":
|
|
280
|
+
closed(o, ["state", "proposalId", "reason"]);
|
|
281
|
+
text(o.proposalId, "proposalId");
|
|
282
|
+
text(o.reason, "reason");
|
|
283
|
+
break;
|
|
284
|
+
case "superseded":
|
|
285
|
+
closed(o, ["state", "registrationRequestId", "currentRegistrationRequestId"]);
|
|
286
|
+
requestId(o.registrationRequestId);
|
|
287
|
+
requestId(o.currentRegistrationRequestId);
|
|
288
|
+
break;
|
|
289
|
+
default: invalid("unsupported status state");
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/** Check a response against the request actually sent, not a response-supplied request echo. */
|
|
293
|
+
export function parseServiceAuthorityResult(raw, expected) {
|
|
294
|
+
const request = parseServiceAuthorityRequest(expected);
|
|
295
|
+
const o = record(raw, "result");
|
|
296
|
+
coordinates(o);
|
|
297
|
+
for (const key of COMMON)
|
|
298
|
+
if (o[key] !== request[key])
|
|
299
|
+
invalid("result does not echo the submitted request");
|
|
300
|
+
if (!RESULT_STATES[request.operation].includes(o.state))
|
|
301
|
+
invalid("result state is not admitted for this operation");
|
|
302
|
+
const common = [...COMMON, "state"];
|
|
303
|
+
switch (o.state) {
|
|
304
|
+
case "approval-required": {
|
|
305
|
+
closed(o, [...common, "proposalId", "proposalDigest"], ["approvalUrl"]);
|
|
306
|
+
text(o.proposalId, "proposalId");
|
|
307
|
+
digest(o.proposalDigest, "proposalDigest");
|
|
308
|
+
if (o.approvalUrl !== undefined) {
|
|
309
|
+
let url;
|
|
310
|
+
try {
|
|
311
|
+
url = new URL(text(o.approvalUrl, "approvalUrl", 2048));
|
|
312
|
+
}
|
|
313
|
+
catch {
|
|
314
|
+
invalid("invalid approval URL");
|
|
315
|
+
}
|
|
316
|
+
if (url.protocol !== "https:" || url.username || url.password || url.hash)
|
|
317
|
+
invalid("invalid approval URL");
|
|
318
|
+
}
|
|
319
|
+
break;
|
|
320
|
+
}
|
|
321
|
+
case "pending":
|
|
322
|
+
closed(o, [...common, "operationId", "phase"], ["notBefore"]);
|
|
323
|
+
text(o.operationId, "operationId");
|
|
324
|
+
text(o.phase, "phase");
|
|
325
|
+
if (o.notBefore !== undefined)
|
|
326
|
+
integer(o.notBefore, "notBefore");
|
|
327
|
+
break;
|
|
328
|
+
case "registered": {
|
|
329
|
+
closed(o, [...common, "witness", "snapshot"]);
|
|
330
|
+
const witness = boundWitness(o.witness, o);
|
|
331
|
+
if (witness.registrationRequestId !== request.requestId)
|
|
332
|
+
invalid("registered result belongs to another operation");
|
|
333
|
+
const spec = snapshot(o.snapshot, witness);
|
|
334
|
+
if (request.operation !== "register" || canonicalJson([...spec.clusterDigests].sort()) !== canonicalJson([...request.registration.clusterDigests].sort()))
|
|
335
|
+
invalid("registered result does not bind the submitted closure set");
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
338
|
+
case "credential": {
|
|
339
|
+
closed(o, [...common, "witness", "snapshot", "duty", "accessBearer", "accessExpiresAt", "renewalProof", "renewalExpiresAt"]);
|
|
340
|
+
if (o.duty !== "serve")
|
|
341
|
+
invalid("unsupported service duty");
|
|
342
|
+
const witness = boundWitness(o.witness, o);
|
|
343
|
+
if (!("witness" in request) || serviceWitnessDigest(witness) !== serviceWitnessDigest(request.witness))
|
|
344
|
+
invalid("credential does not bind the submitted registration witness");
|
|
345
|
+
snapshot(o.snapshot, witness);
|
|
346
|
+
text(o.accessBearer, "access bearer", 64 * 1024);
|
|
347
|
+
text(o.renewalProof, "renewal proof", 64 * 1024);
|
|
348
|
+
integer(o.accessExpiresAt, "accessExpiresAt");
|
|
349
|
+
integer(o.renewalExpiresAt, "renewalExpiresAt");
|
|
350
|
+
break;
|
|
351
|
+
}
|
|
352
|
+
case "ready": {
|
|
353
|
+
closed(o, [...common, "witness", "reportedAt"]);
|
|
354
|
+
const witness = boundWitness(o.witness, o);
|
|
355
|
+
if (!("witness" in request) || serviceWitnessDigest(witness) !== serviceWitnessDigest(request.witness))
|
|
356
|
+
invalid("ready result does not bind the submitted witness");
|
|
357
|
+
integer(o.reportedAt, "reportedAt");
|
|
358
|
+
break;
|
|
359
|
+
}
|
|
360
|
+
case "view": {
|
|
361
|
+
closed(o, [...common, "witness", "observation", "basis", "commands", "validForMs"]);
|
|
362
|
+
if (request.operation !== "describe-view")
|
|
363
|
+
invalid("view result requires a Describe query");
|
|
364
|
+
const witness = boundWitness(o.witness, o), observed = observation(o.observation, o);
|
|
365
|
+
if (serviceWitnessDigest(witness) !== serviceWitnessDigest(request.witness)
|
|
366
|
+
|| canonicalJson(observed) !== canonicalJson(request.observation) || o.basis !== "principal-policy-v1")
|
|
367
|
+
invalid("view result does not bind this query and principal-policy basis");
|
|
368
|
+
if (!Array.isArray(o.commands) || new Set(o.commands).size !== o.commands.length)
|
|
369
|
+
invalid("view commands must be a unique array");
|
|
370
|
+
for (const command of o.commands)
|
|
371
|
+
assertCommandToken(text(command, "view command", 32));
|
|
372
|
+
const validity = integer(o.validForMs, "view validity");
|
|
373
|
+
if (validity === 0 || validity > SERVICE_DESCRIBE_QUERY_BUDGET_MS)
|
|
374
|
+
invalid("view validity exceeds its query budget");
|
|
375
|
+
break;
|
|
376
|
+
}
|
|
377
|
+
case "status":
|
|
378
|
+
closed(o, [...common, "status"]);
|
|
379
|
+
status(o.status, o);
|
|
380
|
+
break;
|
|
381
|
+
case "retired": {
|
|
382
|
+
closed(o, [...common, "operationId", "witness"]);
|
|
383
|
+
text(o.operationId, "operationId");
|
|
384
|
+
const witness = boundWitness(o.witness, o);
|
|
385
|
+
if (!("witness" in request) || serviceWitnessDigest(witness) !== serviceWitnessDigest(request.witness))
|
|
386
|
+
invalid("retired result does not bind the submitted witness");
|
|
387
|
+
break;
|
|
388
|
+
}
|
|
389
|
+
case "denied":
|
|
390
|
+
closed(o, [...common, "reason"]);
|
|
391
|
+
text(o.reason, "reason");
|
|
392
|
+
break;
|
|
393
|
+
}
|
|
394
|
+
return JSON.parse(boundedJson(o));
|
|
395
|
+
}
|
|
396
|
+
/** Deterministic bounded spelling; the host must also reject persisted tuple/alias collisions. */
|
|
397
|
+
export function serviceEndpointActor(tuple) {
|
|
398
|
+
if (!isAccountNkey(tuple.accountPublicKey))
|
|
399
|
+
invalid("invalid service account public key");
|
|
400
|
+
spacePrefix(tuple.space);
|
|
401
|
+
assertDerivedOwnerToken(tuple.owner);
|
|
402
|
+
endpointToken(tuple.endpoint);
|
|
403
|
+
assertLifecycleToken(tuple.instanceId, "instanceId");
|
|
404
|
+
const bytes = canonicalJson([1, tuple.accountPublicKey, tuple.space, tuple.owner, tuple.endpoint, tuple.instanceId, "serve"]);
|
|
405
|
+
const hash = createHash("sha256").update(bytes, "utf8").digest("hex");
|
|
406
|
+
return assertBoundedOwner(`svc_${BigInt(`0x${hash}`).toString(36).padStart(50, "0")}`, "service actor");
|
|
407
|
+
}
|
|
408
|
+
export function serviceWitnessDigest(witness) {
|
|
409
|
+
return contractDigest(parseServiceRegistrationWitness(witness));
|
|
410
|
+
}
|
|
411
|
+
/** Proof secrets are excluded; changing a request body under its persisted id is a conflict. */
|
|
412
|
+
export function serviceAuthorityRequestDigest(request) {
|
|
413
|
+
return contractDigest(parseServiceAuthorityRequest(request));
|
|
414
|
+
}
|
|
415
|
+
//# sourceMappingURL=remote-service-authority.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-service-authority.js","sourceRoot":"","sources":["../src/remote-service-authority.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const SERVICE_ACCESS_TTL_SECONDS = 60;
|
|
2
|
+
export declare const SERVICE_RENEWAL_TTL_SECONDS: number;
|
|
3
|
+
export declare const SERVICE_AUTHORITY_MAX_BYTES: number;
|
|
4
|
+
export declare const SERVICE_DESCRIBE_QUERY_BUDGET_MS = 2000;
|
|
5
|
+
//# sourceMappingURL=service-authority-limits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-authority-limits.d.ts","sourceRoot":"","sources":["../src/service-authority-limits.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAC7C,eAAO,MAAM,2BAA2B,QAAe,CAAC;AACxD,eAAO,MAAM,2BAA2B,QAAkB,CAAC;AAC3D,eAAO,MAAM,gCAAgC,OAAQ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export const SERVICE_ACCESS_TTL_SECONDS = 60;
|
|
2
|
+
export const SERVICE_RENEWAL_TTL_SECONDS = 24 * 60 * 60;
|
|
3
|
+
export const SERVICE_AUTHORITY_MAX_BYTES = 2 * 1024 * 1024;
|
|
4
|
+
export const SERVICE_DESCRIBE_QUERY_BUDGET_MS = 2_000;
|
|
5
|
+
//# sourceMappingURL=service-authority-limits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-authority-limits.js","sourceRoot":"","sources":["../src/service-authority-limits.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,CAAC;AAC7C,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACxD,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAC3D,MAAM,CAAC,MAAM,gCAAgC,GAAG,KAAK,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { EpCapability } from "./endpoint-grants.js";
|
|
2
|
+
/** Broker-authenticated connection coordinates. The client inbox nonce is not this identity. */
|
|
3
|
+
export interface ServiceConnectionBinding {
|
|
4
|
+
userNkey: string;
|
|
5
|
+
serverId: string;
|
|
6
|
+
clientId: number;
|
|
7
|
+
}
|
|
8
|
+
/** Syntax and checksum checks only; the encrypted callout authenticates these coordinates. */
|
|
9
|
+
export declare function parseServiceConnectionBinding(raw: unknown): ServiceConnectionBinding;
|
|
10
|
+
export interface ServiceRegistrationIdentity {
|
|
11
|
+
operationId: string;
|
|
12
|
+
requestId: string;
|
|
13
|
+
requestDigest: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ServiceRegistrationStamp extends ServiceRegistrationIdentity {
|
|
16
|
+
processEpoch: number;
|
|
17
|
+
registrationRevision: number;
|
|
18
|
+
nameAuthorityRevision: number;
|
|
19
|
+
registrationProof: string;
|
|
20
|
+
}
|
|
21
|
+
/** Native service approval coordinates on the endpoint's own release-fence key. Expiries are Unix seconds. */
|
|
22
|
+
export interface ServiceGateAuthority {
|
|
23
|
+
v: 1;
|
|
24
|
+
assignmentDigest: string;
|
|
25
|
+
lifecycleUid: string;
|
|
26
|
+
state: "pending-root" | "approved" | "revoked";
|
|
27
|
+
rootCredentialId: string | null;
|
|
28
|
+
rootExpiresAt: number | null;
|
|
29
|
+
approvalDigest: string | null;
|
|
30
|
+
approvalExpiresAt: number | null;
|
|
31
|
+
callerCeiling: EpCapability[];
|
|
32
|
+
activationIssued: boolean;
|
|
33
|
+
registration?: ServiceRegistrationStamp;
|
|
34
|
+
pendingRegistration?: ServiceRegistrationIdentity;
|
|
35
|
+
}
|
|
36
|
+
/** The identity persisted under the registration freeze, before any spec write. */
|
|
37
|
+
export declare function parseServiceRegistrationIdentity(raw: unknown): ServiceRegistrationIdentity;
|
|
38
|
+
/** Stored-row syntax only. Native root custody and owner consent are checked by the host. */
|
|
39
|
+
export declare function parseServiceGateAuthority(raw: unknown): ServiceGateAuthority;
|
|
40
|
+
/** An expired or revoked approval never becomes usable merely because a registration reopens its gate. */
|
|
41
|
+
export declare function serviceGateApprovalLive(authority: ServiceGateAuthority, nowSeconds: number): boolean;
|
|
42
|
+
//# sourceMappingURL=service-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-gate.d.ts","sourceRoot":"","sources":["../src/service-gate.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGzD,gGAAgG;AAChG,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,8FAA8F;AAC9F,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,OAAO,GAAG,wBAAwB,CAUpF;AAED,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AACD,MAAM,WAAW,wBAAyB,SAAQ,2BAA2B;IAC3E,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,8GAA8G;AAC9G,MAAM,WAAW,oBAAoB;IACnC,CAAC,EAAE,CAAC,CAAC;IACL,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,cAAc,GAAG,UAAU,GAAG,SAAS,CAAC;IAC/C,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,wBAAwB,CAAC;IACxC,mBAAmB,CAAC,EAAE,2BAA2B,CAAC;CACnD;AAMD,mFAAmF;AACnF,wBAAgB,gCAAgC,CAAC,GAAG,EAAE,OAAO,GAAG,2BAA2B,CAS1F;AAED,6FAA6F;AAC7F,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,oBAAoB,CAiC5E;AAED,0GAA0G;AAC1G,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAIpG"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { fromPublic } from "@nats-io/nkeys";
|
|
2
|
+
import { isContractDigest } from "./canonical.js";
|
|
3
|
+
import { EpEnvelopeError } from "./endpoint-error.js";
|
|
4
|
+
import { parseEndpointCapabilities } from "./endpoint-capability-policy.js";
|
|
5
|
+
import { assertLifecycleToken } from "./endpoint-subjects.js";
|
|
6
|
+
/** Syntax and checksum checks only; the encrypted callout authenticates these coordinates. */
|
|
7
|
+
export function parseServiceConnectionBinding(raw) {
|
|
8
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
9
|
+
bad();
|
|
10
|
+
const o = raw;
|
|
11
|
+
if (Object.getPrototypeOf(raw) !== Object.prototype && Object.getPrototypeOf(raw) !== null)
|
|
12
|
+
bad();
|
|
13
|
+
if (Reflect.ownKeys(o).length !== 3 || Object.keys(o).some((k) => !["userNkey", "serverId", "clientId"].includes(k))
|
|
14
|
+
|| typeof o.userNkey !== "string" || !/^U[A-Z2-7]{55}$/.test(o.userNkey)
|
|
15
|
+
|| typeof o.serverId !== "string" || !/^N[A-Z2-7]{55}$/.test(o.serverId)
|
|
16
|
+
|| typeof o.clientId !== "number" || !Number.isSafeInteger(o.clientId) || o.clientId <= 0)
|
|
17
|
+
bad();
|
|
18
|
+
try {
|
|
19
|
+
fromPublic(o.userNkey);
|
|
20
|
+
fromPublic(o.serverId);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
bad();
|
|
24
|
+
}
|
|
25
|
+
return { userNkey: o.userNkey, serverId: o.serverId, clientId: o.clientId };
|
|
26
|
+
}
|
|
27
|
+
function bad() { throw new EpEnvelopeError("internal", "invalid native service gate authority"); }
|
|
28
|
+
function digest(raw) { return typeof raw === "string" && isContractDigest(raw); }
|
|
29
|
+
function expiry(raw) { return typeof raw === "number" && Number.isSafeInteger(raw) && raw > 0; }
|
|
30
|
+
/** The identity persisted under the registration freeze, before any spec write. */
|
|
31
|
+
export function parseServiceRegistrationIdentity(raw) {
|
|
32
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
33
|
+
bad();
|
|
34
|
+
const r = raw;
|
|
35
|
+
if (Object.getPrototypeOf(raw) !== Object.prototype && Object.getPrototypeOf(raw) !== null)
|
|
36
|
+
bad();
|
|
37
|
+
if (Reflect.ownKeys(r).some((k) => typeof k !== "string" || !["operationId", "requestId", "requestDigest"].includes(k)))
|
|
38
|
+
bad();
|
|
39
|
+
if (Reflect.ownKeys(r).length !== 3 || typeof r.operationId !== "string" || typeof r.requestId !== "string"
|
|
40
|
+
|| !/^[a-f0-9]{32}$/.test(r.requestId) || !digest(r.requestDigest))
|
|
41
|
+
bad();
|
|
42
|
+
assertLifecycleToken(r.operationId, "service registration operationId");
|
|
43
|
+
return r;
|
|
44
|
+
}
|
|
45
|
+
/** Stored-row syntax only. Native root custody and owner consent are checked by the host. */
|
|
46
|
+
export function parseServiceGateAuthority(raw) {
|
|
47
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
48
|
+
bad();
|
|
49
|
+
const proto = Object.getPrototypeOf(raw);
|
|
50
|
+
if (proto !== Object.prototype && proto !== null)
|
|
51
|
+
bad();
|
|
52
|
+
const o = raw;
|
|
53
|
+
const required = ["v", "assignmentDigest", "lifecycleUid", "state", "rootCredentialId", "rootExpiresAt", "approvalDigest", "approvalExpiresAt", "callerCeiling", "activationIssued"];
|
|
54
|
+
if (required.some((k) => !Object.hasOwn(o, k)) || Reflect.ownKeys(o).some((k) => typeof k !== "string" || ![...required, "registration", "pendingRegistration"].includes(k)))
|
|
55
|
+
bad();
|
|
56
|
+
if (o.v !== 1 || !digest(o.assignmentDigest) || typeof o.lifecycleUid !== "string" || typeof o.activationIssued !== "boolean")
|
|
57
|
+
bad();
|
|
58
|
+
assertLifecycleToken(o.lifecycleUid, "service lifecycleUid");
|
|
59
|
+
if (o.state !== "pending-root" && o.state !== "approved" && o.state !== "revoked")
|
|
60
|
+
bad();
|
|
61
|
+
const ceiling = parseEndpointCapabilities(o.callerCeiling);
|
|
62
|
+
if (o.rootCredentialId === null) {
|
|
63
|
+
if (o.rootExpiresAt !== null || o.approvalDigest !== null || o.approvalExpiresAt !== null || ceiling.length || o.activationIssued || o.registration !== undefined || o.pendingRegistration !== undefined || o.state === "approved")
|
|
64
|
+
bad();
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
if (typeof o.rootCredentialId !== "string" || !expiry(o.rootExpiresAt) || !digest(o.approvalDigest) || (o.approvalExpiresAt !== null && !expiry(o.approvalExpiresAt)) || o.state === "pending-root")
|
|
68
|
+
bad();
|
|
69
|
+
assertLifecycleToken(o.rootCredentialId, "service root credentialId");
|
|
70
|
+
}
|
|
71
|
+
if (o.registration !== undefined) {
|
|
72
|
+
if (!o.registration || typeof o.registration !== "object" || Array.isArray(o.registration))
|
|
73
|
+
bad();
|
|
74
|
+
const r = o.registration;
|
|
75
|
+
if (Reflect.ownKeys(r).length !== 7 || Reflect.ownKeys(r).some((k) => typeof k !== "string"
|
|
76
|
+
|| !["operationId", "requestId", "requestDigest", "registrationProof", "processEpoch", "registrationRevision", "nameAuthorityRevision"].includes(k))
|
|
77
|
+
|| !digest(r.registrationProof))
|
|
78
|
+
bad();
|
|
79
|
+
parseServiceRegistrationIdentity({ operationId: r.operationId, requestId: r.requestId, requestDigest: r.requestDigest });
|
|
80
|
+
if (typeof r.processEpoch !== "number" || !Number.isSafeInteger(r.processEpoch) || r.processEpoch < 0
|
|
81
|
+
|| !expiry(r.registrationRevision) || !expiry(r.nameAuthorityRevision))
|
|
82
|
+
bad();
|
|
83
|
+
}
|
|
84
|
+
if (o.pendingRegistration !== undefined) {
|
|
85
|
+
parseServiceRegistrationIdentity(o.pendingRegistration);
|
|
86
|
+
if (o.activationIssued)
|
|
87
|
+
bad();
|
|
88
|
+
}
|
|
89
|
+
if (o.activationIssued && o.registration === undefined)
|
|
90
|
+
bad();
|
|
91
|
+
return o;
|
|
92
|
+
}
|
|
93
|
+
/** An expired or revoked approval never becomes usable merely because a registration reopens its gate. */
|
|
94
|
+
export function serviceGateApprovalLive(authority, nowSeconds) {
|
|
95
|
+
return Number.isSafeInteger(nowSeconds) && nowSeconds >= 0 && authority.state === "approved"
|
|
96
|
+
&& authority.rootExpiresAt !== null && authority.rootExpiresAt > nowSeconds
|
|
97
|
+
&& (authority.approvalExpiresAt === null || authority.approvalExpiresAt > nowSeconds);
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=service-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-gate.js","sourceRoot":"","sources":["../src/service-gate.ts"],"names":[],"mappings":"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"}
|