@serve.zone/interfaces 30.7.0 → 30.9.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/changelog.md +18 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/data/index.d.ts +4 -0
- package/dist_ts/data/index.js +5 -1
- package/dist_ts/data/networkdelivery.d.ts +25 -0
- package/dist_ts/data/networkdelivery.js +38 -0
- package/dist_ts/data/networkprojection.d.ts +140 -0
- package/dist_ts/data/networkprojection.js +371 -0
- package/dist_ts/data/networkprotection.d.ts +68 -0
- package/dist_ts/data/networkprotection.js +129 -0
- package/dist_ts/data/networksigning.d.ts +46 -0
- package/dist_ts/data/networksigning.js +52 -0
- package/dist_ts/private/networkcontract.d.ts +31 -0
- package/dist_ts/private/networkcontract.js +134 -0
- package/dist_ts/requests/runtimesession.d.ts +20 -0
- package/dist_ts/runtime.d.ts +1 -0
- package/dist_ts/runtime.js +2 -1
- package/dist_ts/runtime.networkprojection.d.ts +15 -0
- package/dist_ts/runtime.networkprojection.js +58 -0
- package/package.json +1 -1
- package/readme.md +93 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/data/index.ts +4 -0
- package/ts/data/networkdelivery.ts +58 -0
- package/ts/data/networkprojection.ts +448 -0
- package/ts/data/networkprotection.ts +175 -0
- package/ts/data/networksigning.ts +84 -0
- package/ts/private/networkcontract.ts +117 -0
- package/ts/requests/runtimesession.ts +29 -0
- package/ts/runtime.networkprojection.ts +64 -0
- package/ts/runtime.ts +1 -0
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
import { snapshotRuntimeAssignmentV1, validateRuntimeAssignmentV1 } from './runtimeassignment.js';
|
|
2
|
+
import { bindRuntimeNetworkHandoffLeaseV1, computeRuntimeNetworkProtectedAuthorityV1Digest, snapshotRuntimeNetworkHandoffLeaseV1, snapshotRuntimeNetworkProtectedAuthorityV1 } from './networkauthority.js';
|
|
3
|
+
import { buildPrivateNetworkFqdnV1, composeServicePrivateNetworkDnsPolicyV1, snapshotPrivateNetworkV1, snapshotServicePrivateNetworksV1 } from './privatenetwork.js';
|
|
4
|
+
import { captureNetwork, failNetwork, networkCanonical, networkContains, networkController, networkCounter, networkDigest, networkEqual, networkHash, networkId, networkIpv4, networkIpv4Number, networkList, networkOverlaps, networkPrefixBounds, networkRecord, networkReference, networkReferenceOf, networkRevision, networkSafe, networkSorted, requireNetwork } from '../private/networkcontract.js';
|
|
5
|
+
export const runtimeNetworkProjectionV1Contract = Object.freeze({
|
|
6
|
+
workloadDigestDomain: 'serve.zone/runtime-network-workload-lease-v1',
|
|
7
|
+
projectionDigestDomain: 'serve.zone/runtime-network-projection-v1',
|
|
8
|
+
maximumCanonicalBytes: 917_504,
|
|
9
|
+
maximumAllocationAuthorities: 16,
|
|
10
|
+
maximumNetworks: 128,
|
|
11
|
+
maximumMemberships: 256,
|
|
12
|
+
maximumEndpoints: 256,
|
|
13
|
+
maximumGrants: 4096,
|
|
14
|
+
maximumDnsLeaseMs: 900_000,
|
|
15
|
+
positiveTtlSeconds: 5,
|
|
16
|
+
negativeTtlSeconds: 1,
|
|
17
|
+
omission: 'no-effect-without-explicit-withdrawal',
|
|
18
|
+
packetLifetime: 'until-applied-denial-or-independent-fence',
|
|
19
|
+
acknowledgement: 'admission-is-not-application-or-readiness',
|
|
20
|
+
allocationReuse: 'requires-controller-quarantine-and-all-affected-authority-fences',
|
|
21
|
+
});
|
|
22
|
+
const scope = (item) => ({
|
|
23
|
+
controller: networkController(item.controller), nodeId: networkId(item.nodeId), runtimeNamespace: networkId(item.runtimeNamespace),
|
|
24
|
+
});
|
|
25
|
+
const sameScope = (left, right) => networkEqual(left.controller, right.controller) && left.nodeId === right.nodeId && left.runtimeNamespace === right.runtimeNamespace;
|
|
26
|
+
const ownerKey = (value) => networkCanonical([value.organizationId, value.serviceId]);
|
|
27
|
+
const attemptKey = (value) => networkCanonical([value.organizationId, value.serviceId, value.replicaId, value.attemptId]);
|
|
28
|
+
const refKey = (value) => networkCanonical(networkReferenceOf(value));
|
|
29
|
+
const sortedReferences = (value) => networkSorted(networkList(value, 256, networkReference), refKey);
|
|
30
|
+
export const snapshotRuntimeNetworkNodeScopeV1 = (value) => networkSafe(() => scope(networkRecord(captureNetwork(value), ['controller', 'nodeId', 'runtimeNamespace'])));
|
|
31
|
+
export const snapshotRuntimeNetworkWorkloadLeaseV1 = (value) => networkSafe(() => {
|
|
32
|
+
const item = networkRecord(captureNetwork(value), ['schemaVersion', 'id', 'generation', 'controller', 'nodeId', 'runtimeNamespace',
|
|
33
|
+
'organizationId', 'assignmentId', 'serviceId', 'replicaId', 'attemptId', 'protectedAuthority', 'routerIncarnationId', 'ipv4', 'dnsServer', 'digest']);
|
|
34
|
+
requireNetwork(item.schemaVersion === 1);
|
|
35
|
+
const ip = networkRecord(item.ipv4, ['poolId', 'linkSubnet', 'address', 'sourcePrefix', 'gateway']);
|
|
36
|
+
requireNetwork(typeof ip.linkSubnet === 'string' && ip.linkSubnet.length <= 18);
|
|
37
|
+
const pieces = ip.linkSubnet.split('/');
|
|
38
|
+
requireNetwork(pieces.length === 2 && /^(?:[89]|[12][0-9]|3[01])$/.test(pieces[1]));
|
|
39
|
+
const first = networkIpv4Number(networkIpv4(pieces[0]));
|
|
40
|
+
requireNetwork(first % 2 ** (32 - Number(pieces[1])) === 0
|
|
41
|
+
&& ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16'].some(prefix => networkContains(prefix, ip.linkSubnet)));
|
|
42
|
+
const address = networkIpv4(ip.address), gateway = networkIpv4(ip.gateway), [low, high] = networkPrefixBounds(ip.linkSubnet);
|
|
43
|
+
requireNetwork(address !== gateway && ip.sourcePrefix === `${address}/32`);
|
|
44
|
+
for (const current of [address, gateway]) {
|
|
45
|
+
const number = networkIpv4Number(current);
|
|
46
|
+
requireNetwork(number >= low && number <= high && (high - low === 1 || (number !== low && number !== high)));
|
|
47
|
+
}
|
|
48
|
+
requireNetwork(item.dnsServer === gateway);
|
|
49
|
+
return { schemaVersion: 1, id: networkId(item.id), generation: networkCounter(item.generation), ...scope(item),
|
|
50
|
+
organizationId: networkId(item.organizationId), assignmentId: networkId(item.assignmentId), serviceId: networkId(item.serviceId),
|
|
51
|
+
replicaId: networkId(item.replicaId), attemptId: networkId(item.attemptId), protectedAuthority: networkReference(item.protectedAuthority),
|
|
52
|
+
routerIncarnationId: networkId(item.routerIncarnationId), ipv4: { poolId: networkId(ip.poolId), linkSubnet: ip.linkSubnet,
|
|
53
|
+
address, sourcePrefix: ip.sourcePrefix, gateway }, dnsServer: gateway, digest: networkDigest(item.digest) };
|
|
54
|
+
});
|
|
55
|
+
export const computeRuntimeNetworkWorkloadLeaseV1Digest = (value) => networkHash(runtimeNetworkProjectionV1Contract.workloadDigestDomain, snapshotRuntimeNetworkWorkloadLeaseV1(value));
|
|
56
|
+
const packetGrant = (value) => {
|
|
57
|
+
const item = networkRecord(value, ['source', 'destination']);
|
|
58
|
+
requireNetwork(item.destination !== null && typeof item.destination === 'object');
|
|
59
|
+
const kind = item.destination.kind;
|
|
60
|
+
if (kind === 'workload') {
|
|
61
|
+
const destination = networkRecord(item.destination, ['kind', 'lease']);
|
|
62
|
+
const source = networkReference(item.source), lease = networkReference(destination.lease);
|
|
63
|
+
requireNetwork(!networkEqual(source, lease));
|
|
64
|
+
return { source, destination: { kind, lease } };
|
|
65
|
+
}
|
|
66
|
+
if (kind === 'public') {
|
|
67
|
+
networkRecord(item.destination, ['kind']);
|
|
68
|
+
return { source: networkReference(item.source), destination: { kind } };
|
|
69
|
+
}
|
|
70
|
+
requireNetwork(kind === 'platform');
|
|
71
|
+
const destination = networkRecord(item.destination, ['kind', 'id', 'address', 'protocol', 'port']);
|
|
72
|
+
requireNetwork(destination.protocol === 'tcp' || destination.protocol === 'udp');
|
|
73
|
+
return { source: networkReference(item.source), destination: { kind, id: networkId(destination.id), address: networkIpv4(destination.address),
|
|
74
|
+
protocol: destination.protocol, port: networkCounter(destination.port, 65535) } };
|
|
75
|
+
};
|
|
76
|
+
const endpoint = (value) => {
|
|
77
|
+
const item = networkRecord(value, ['lease', 'ready', 'observation', 'publicEgress', 'platformEndpointIds']);
|
|
78
|
+
requireNetwork(typeof item.ready === 'boolean' && typeof item.publicEgress === 'boolean');
|
|
79
|
+
const lease = snapshotRuntimeNetworkWorkloadLeaseV1(item.lease);
|
|
80
|
+
let observation = null;
|
|
81
|
+
if (item.observation !== null) {
|
|
82
|
+
const observed = networkRecord(item.observation, ['assignment', 'reporterSessionId', 'sequence', 'digest']);
|
|
83
|
+
const assignment = networkRecord(observed.assignment, ['assignmentId', 'generation', 'digest']);
|
|
84
|
+
requireNetwork(assignment.assignmentId === lease.assignmentId);
|
|
85
|
+
observation = { assignment: { assignmentId: lease.assignmentId, generation: networkCounter(assignment.generation), digest: networkDigest(assignment.digest) },
|
|
86
|
+
reporterSessionId: networkId(observed.reporterSessionId), sequence: networkCounter(observed.sequence), digest: networkDigest(observed.digest) };
|
|
87
|
+
}
|
|
88
|
+
requireNetwork(!item.ready || (observation !== null && observation.assignment.generation === 1));
|
|
89
|
+
return { lease, ready: item.ready, observation, publicEgress: item.publicEgress,
|
|
90
|
+
platformEndpointIds: networkSorted(networkList(item.platformEndpointIds, 64, networkId), value => value) };
|
|
91
|
+
};
|
|
92
|
+
/** Structural snapshot only; use validate/signature/admission helpers before accepting authority. */
|
|
93
|
+
export const snapshotRuntimeNetworkProjectionV1 = (value) => networkSafe(() => {
|
|
94
|
+
const captured = captureNetwork(value);
|
|
95
|
+
requireNetwork(new TextEncoder().encode(networkCanonical(captured)).length <= runtimeNetworkProjectionV1Contract.maximumCanonicalBytes);
|
|
96
|
+
const item = networkRecord(captured, ['schemaVersion', 'id', 'generation', 'previous', 'controller', 'nodeId', 'runtimeNamespace',
|
|
97
|
+
'protectedAuthority', 'allocationAuthorities', 'handoff', 'networks', 'memberships', 'endpoints', 'dns', 'withdrawals', 'retiredLeases', 'retiredHandoffs', 'digest']);
|
|
98
|
+
requireNetwork(item.schemaVersion === 1);
|
|
99
|
+
const dns = networkRecord(item.dns, ['issuedAt', 'notBefore', 'expiresAt']);
|
|
100
|
+
const window = { issuedAt: networkCounter(dns.issuedAt), notBefore: networkCounter(dns.notBefore), expiresAt: networkCounter(dns.expiresAt) };
|
|
101
|
+
requireNetwork(window.notBefore >= window.issuedAt && window.expiresAt > window.notBefore && window.expiresAt - window.issuedAt <= 900_000);
|
|
102
|
+
return { schemaVersion: 1, ...networkRevision(item), ...scope(item),
|
|
103
|
+
protectedAuthority: snapshotRuntimeNetworkProtectedAuthorityV1(item.protectedAuthority),
|
|
104
|
+
allocationAuthorities: networkSorted(networkList(item.allocationAuthorities, 16, snapshotRuntimeNetworkProtectedAuthorityV1), refKey),
|
|
105
|
+
handoff: item.handoff === null ? null : snapshotRuntimeNetworkHandoffLeaseV1(item.handoff),
|
|
106
|
+
networks: networkSorted(networkList(item.networks, 128, snapshotPrivateNetworkV1), value => value.id),
|
|
107
|
+
memberships: networkSorted(networkList(item.memberships, 256, snapshotServicePrivateNetworksV1), ownerKey),
|
|
108
|
+
endpoints: networkSorted(networkList(item.endpoints, 256, endpoint), value => value.lease.id), dns: window,
|
|
109
|
+
withdrawals: networkSorted(networkList(item.withdrawals, 4096, packetGrant), networkCanonical),
|
|
110
|
+
retiredLeases: sortedReferences(item.retiredLeases), retiredHandoffs: sortedReferences(item.retiredHandoffs), digest: networkDigest(item.digest) };
|
|
111
|
+
});
|
|
112
|
+
const grantsOf = (projection) => {
|
|
113
|
+
const result = [];
|
|
114
|
+
const memberships = new Map(projection.memberships.map(member => [ownerKey(member), member]));
|
|
115
|
+
const append = (grant) => {
|
|
116
|
+
requireNetwork(result.length < 4096);
|
|
117
|
+
result.push(grant);
|
|
118
|
+
};
|
|
119
|
+
for (const source of projection.endpoints) {
|
|
120
|
+
const member = memberships.get(ownerKey(source.lease));
|
|
121
|
+
requireNetwork(member);
|
|
122
|
+
for (const destination of projection.endpoints) {
|
|
123
|
+
if (source === destination || (!sameScope(source.lease, projection) && !sameScope(destination.lease, projection)))
|
|
124
|
+
continue;
|
|
125
|
+
const target = memberships.get(ownerKey(destination.lease));
|
|
126
|
+
requireNetwork(target);
|
|
127
|
+
if (member.organizationId === target.organizationId && member.attachments.some(attachment => target.attachments.some(other => other.networkId === attachment.networkId))) {
|
|
128
|
+
append({ source: networkReferenceOf(source.lease), destination: { kind: 'workload', lease: networkReferenceOf(destination.lease) } });
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (!sameScope(source.lease, projection))
|
|
132
|
+
continue;
|
|
133
|
+
if (source.publicEgress)
|
|
134
|
+
append({ source: networkReferenceOf(source.lease), destination: { kind: 'public' } });
|
|
135
|
+
for (const id of source.platformEndpointIds) {
|
|
136
|
+
const platform = projection.protectedAuthority.platformEndpoints.find(item => item.id === id);
|
|
137
|
+
requireNetwork(platform);
|
|
138
|
+
append({ source: networkReferenceOf(source.lease), destination: { kind: 'platform', ...platform } });
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return result.sort((left, right) => networkCanonical(left) < networkCanonical(right) ? -1 : 1);
|
|
142
|
+
};
|
|
143
|
+
export const computeRuntimeNetworkProjectionV1Digest = (value) => networkHash(runtimeNetworkProjectionV1Contract.projectionDigestDomain, snapshotRuntimeNetworkProjectionV1(value));
|
|
144
|
+
/** Complete structural, digest, allocation and policy binding. Not an allocation/barrier/readiness proof. */
|
|
145
|
+
export const validateRuntimeNetworkProjectionV1 = async (value) => {
|
|
146
|
+
try {
|
|
147
|
+
const projection = snapshotRuntimeNetworkProjectionV1(value), current = projection.protectedAuthority;
|
|
148
|
+
requireNetwork(networkEqual(current.controller, projection.controller) && current.egressAuthorities.some(owner => owner.nodeId === projection.nodeId && owner.runtimeNamespace === projection.runtimeNamespace));
|
|
149
|
+
const authorities = [current, ...projection.allocationAuthorities];
|
|
150
|
+
requireNetwork(new Set(authorities.map(refKey)).size === authorities.length);
|
|
151
|
+
for (const authority of authorities) {
|
|
152
|
+
requireNetwork(networkEqual(authority.controller, projection.controller)
|
|
153
|
+
&& authority.digest === await computeRuntimeNetworkProtectedAuthorityV1Digest(authority));
|
|
154
|
+
}
|
|
155
|
+
const allocationAuthority = (reference) => {
|
|
156
|
+
const result = authorities.find(authority => networkEqual(networkReferenceOf(authority), reference));
|
|
157
|
+
requireNetwork(result);
|
|
158
|
+
return result;
|
|
159
|
+
};
|
|
160
|
+
if (projection.handoff !== null) {
|
|
161
|
+
await bindRuntimeNetworkHandoffLeaseV1(projection.handoff, allocationAuthority(projection.handoff.protectedAuthority));
|
|
162
|
+
requireNetwork(sameScope(projection.handoff, projection));
|
|
163
|
+
requireNetwork(current.pools.some(pool => pool.id === projection.handoff.transit.poolId && pool.purpose === 'transit'
|
|
164
|
+
&& networkContains(pool.prefix, projection.handoff.transit.prefix)));
|
|
165
|
+
}
|
|
166
|
+
const networks = new Map(projection.networks.map(network => [network.id, network]));
|
|
167
|
+
const organizationKeys = new Map(), keysToOrganizations = new Map();
|
|
168
|
+
const names = new Set();
|
|
169
|
+
for (const network of projection.networks) {
|
|
170
|
+
requireNetwork(network.state === 'active');
|
|
171
|
+
const key = `${network.organizationDnsKey}.${network.networkDnsKey}`;
|
|
172
|
+
requireNetwork(!names.has(key));
|
|
173
|
+
names.add(key);
|
|
174
|
+
requireNetwork(!organizationKeys.has(network.organizationId) || organizationKeys.get(network.organizationId) === network.organizationDnsKey);
|
|
175
|
+
requireNetwork(!keysToOrganizations.has(network.organizationDnsKey) || keysToOrganizations.get(network.organizationDnsKey) === network.organizationId);
|
|
176
|
+
organizationKeys.set(network.organizationId, network.organizationDnsKey);
|
|
177
|
+
keysToOrganizations.set(network.organizationDnsKey, network.organizationId);
|
|
178
|
+
for (const upstream of network.policy.externalDns?.upstreams ?? [])
|
|
179
|
+
requireNetwork(current.resolvers.some(resolver => resolver.address === upstream.address && resolver.port === upstream.port));
|
|
180
|
+
}
|
|
181
|
+
const members = new Map(projection.memberships.map(member => [ownerKey(member), member])), aliases = new Set();
|
|
182
|
+
for (const member of projection.memberships) {
|
|
183
|
+
composeServicePrivateNetworkDnsPolicyV1(member, member.attachments.map(attachment => networks.get(attachment.networkId)));
|
|
184
|
+
for (const attachment of member.attachments)
|
|
185
|
+
for (const alias of attachment.aliases) {
|
|
186
|
+
const name = buildPrivateNetworkFqdnV1(networks.get(attachment.networkId), alias);
|
|
187
|
+
requireNetwork(!aliases.has(name));
|
|
188
|
+
aliases.add(name);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
const assignments = new Set(), attempts = new Set(), readyReplicas = new Set();
|
|
192
|
+
for (const endpoint of projection.endpoints) {
|
|
193
|
+
const lease = endpoint.lease, authority = allocationAuthority(lease.protectedAuthority);
|
|
194
|
+
requireNetwork(networkEqual(lease.controller, projection.controller) && members.has(ownerKey(lease))
|
|
195
|
+
&& !assignments.has(lease.assignmentId) && !attempts.has(attemptKey(lease)));
|
|
196
|
+
assignments.add(lease.assignmentId);
|
|
197
|
+
attempts.add(attemptKey(lease));
|
|
198
|
+
if (endpoint.ready) {
|
|
199
|
+
const replica = networkCanonical([lease.organizationId, lease.serviceId, lease.replicaId]);
|
|
200
|
+
requireNetwork(!readyReplicas.has(replica));
|
|
201
|
+
readyReplicas.add(replica);
|
|
202
|
+
}
|
|
203
|
+
requireNetwork(lease.digest === await computeRuntimeNetworkWorkloadLeaseV1Digest(lease));
|
|
204
|
+
requireNetwork(authority.egressAuthorities.some(owner => owner.nodeId === lease.nodeId && owner.runtimeNamespace === lease.runtimeNamespace)
|
|
205
|
+
&& current.egressAuthorities.some(owner => owner.nodeId === lease.nodeId && owner.runtimeNamespace === lease.runtimeNamespace));
|
|
206
|
+
for (const protection of [authority, current])
|
|
207
|
+
requireNetwork(protection.pools.some(pool => pool.id === lease.ipv4.poolId && pool.purpose === 'workload' && networkContains(pool.prefix, lease.ipv4.linkSubnet)));
|
|
208
|
+
if (sameScope(lease, projection))
|
|
209
|
+
requireNetwork(projection.handoff !== null && lease.routerIncarnationId === projection.handoff.routerIncarnationId);
|
|
210
|
+
for (const id of endpoint.platformEndpointIds)
|
|
211
|
+
requireNetwork(current.platformEndpoints.some(platform => platform.id === id));
|
|
212
|
+
requireNetwork(!projection.retiredLeases.some(retired => networkEqual(retired, networkReferenceOf(lease))));
|
|
213
|
+
}
|
|
214
|
+
for (let index = 0; index < projection.endpoints.length; index++)
|
|
215
|
+
for (let previous = 0; previous < index; previous++) {
|
|
216
|
+
requireNetwork(!networkOverlaps(projection.endpoints[index].lease.ipv4.linkSubnet, projection.endpoints[previous].lease.ipv4.linkSubnet));
|
|
217
|
+
}
|
|
218
|
+
if (projection.handoff)
|
|
219
|
+
requireNetwork(!projection.retiredHandoffs.some(retired => networkEqual(retired, networkReferenceOf(projection.handoff))));
|
|
220
|
+
const grants = new Set(grantsOf(projection).map(networkCanonical));
|
|
221
|
+
requireNetwork(projection.withdrawals.every(grant => !grants.has(networkCanonical(grant))));
|
|
222
|
+
requireNetwork(projection.digest === await computeRuntimeNetworkProjectionV1Digest(projection));
|
|
223
|
+
return projection;
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
return failNetwork();
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
/** Complete directed full-mesh and explicitly authorized egress; no DNS readiness dependency. */
|
|
230
|
+
export const getRuntimeNetworkProjectionPacketGrantsV1 = async (value) => grantsOf(await validateRuntimeNetworkProjectionV1(value));
|
|
231
|
+
/** Complete offline DNS material, including authorized names never previously queried. */
|
|
232
|
+
export const composeRuntimeNetworkProjectionDnsViewsV1 = async (value) => {
|
|
233
|
+
const projection = await validateRuntimeNetworkProjectionV1(value);
|
|
234
|
+
const networks = new Map(projection.networks.map(network => [network.id, network]));
|
|
235
|
+
const members = new Map(projection.memberships.map(member => [ownerKey(member), member]));
|
|
236
|
+
return projection.endpoints.filter(endpoint => sameScope(endpoint.lease, projection)).map(endpoint => {
|
|
237
|
+
const member = members.get(ownerKey(endpoint.lease));
|
|
238
|
+
const policy = composeServicePrivateNetworkDnsPolicyV1(member, member.attachments.map(attachment => networks.get(attachment.networkId)));
|
|
239
|
+
const records = [];
|
|
240
|
+
for (const target of projection.memberships) {
|
|
241
|
+
if (target.organizationId !== member.organizationId)
|
|
242
|
+
continue;
|
|
243
|
+
const addresses = projection.endpoints.filter(candidate => candidate.ready && ownerKey(candidate.lease) === ownerKey(target))
|
|
244
|
+
.map(candidate => candidate.lease.ipv4.address).sort();
|
|
245
|
+
for (const attachment of target.attachments) {
|
|
246
|
+
if (!member.attachments.some(own => own.networkId === attachment.networkId))
|
|
247
|
+
continue;
|
|
248
|
+
for (const alias of attachment.aliases)
|
|
249
|
+
records.push({ name: buildPrivateNetworkFqdnV1(networks.get(attachment.networkId), alias), addresses: [...addresses] });
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
records.sort((left, right) => left.name < right.name ? -1 : 1);
|
|
253
|
+
return { source: networkReferenceOf(endpoint.lease), sourceAddress: endpoint.lease.ipv4.address, dnsServer: endpoint.lease.dnsServer, policy, records };
|
|
254
|
+
});
|
|
255
|
+
};
|
|
256
|
+
/** Bind immutable address material without a circular assignment-digest dependency. */
|
|
257
|
+
export const bindRuntimeNetworkWorkloadLeaseToAssignmentV1 = async (leaseValue, assignmentValue) => {
|
|
258
|
+
try {
|
|
259
|
+
const lease = snapshotRuntimeNetworkWorkloadLeaseV1(leaseValue), assignment = snapshotRuntimeAssignmentV1(assignmentValue);
|
|
260
|
+
requireNetwork((await validateRuntimeAssignmentV1(assignment)).length === 0 && sameScope(lease, assignment)
|
|
261
|
+
&& lease.organizationId === assignment.organizationId && lease.assignmentId === assignment.assignmentId
|
|
262
|
+
&& lease.serviceId === assignment.serviceId && lease.replicaId === assignment.replicaId && lease.attemptId === assignment.attemptId
|
|
263
|
+
&& networkEqual(networkReferenceOf(lease), assignment.workload.network)
|
|
264
|
+
&& lease.digest === await computeRuntimeNetworkWorkloadLeaseV1Digest(lease));
|
|
265
|
+
return lease;
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
return failNetwork();
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
/**
|
|
272
|
+
* Pure revision decision. appliedPrevious must be the receiver's exact durable,
|
|
273
|
+
* joined application receipt, never an incoming ACK field. All prior accepted
|
|
274
|
+
* material/apply journals survive until effects and DNS/allocation quarantine end.
|
|
275
|
+
*/
|
|
276
|
+
export const admitRuntimeNetworkProjectionV1 = async (value, previousValue, trustedScopeValue, appliedPreviousValue) => {
|
|
277
|
+
try {
|
|
278
|
+
// Snapshot ALL caller-owned inputs before the first asynchronous operation.
|
|
279
|
+
const incoming = snapshotRuntimeNetworkProjectionV1(value);
|
|
280
|
+
const previousInput = previousValue === null ? null : snapshotRuntimeNetworkProjectionV1(previousValue);
|
|
281
|
+
const trusted = snapshotRuntimeNetworkNodeScopeV1(trustedScopeValue);
|
|
282
|
+
const applied = appliedPreviousValue === null ? null : networkReference(captureNetwork(appliedPreviousValue));
|
|
283
|
+
const projection = await validateRuntimeNetworkProjectionV1(incoming);
|
|
284
|
+
requireNetwork(sameScope(projection, trusted));
|
|
285
|
+
if (previousInput === null) {
|
|
286
|
+
requireNetwork(projection.generation === 1 && applied === null && projection.withdrawals.length === 0
|
|
287
|
+
&& projection.retiredLeases.length === 0 && projection.retiredHandoffs.length === 0);
|
|
288
|
+
return { status: 'accepted', projection };
|
|
289
|
+
}
|
|
290
|
+
const previous = await validateRuntimeNetworkProjectionV1(previousInput);
|
|
291
|
+
requireNetwork(sameScope(previous, trusted) && previous.id === projection.id);
|
|
292
|
+
requireNetwork(applied === null || networkEqual(applied, networkReferenceOf(previous)));
|
|
293
|
+
if (projection.generation === previous.generation) {
|
|
294
|
+
requireNetwork(networkEqual(previous, projection));
|
|
295
|
+
return { status: 'replay', projection };
|
|
296
|
+
}
|
|
297
|
+
requireNetwork(networkEqual(projection.previous, networkReferenceOf(previous)));
|
|
298
|
+
requireNetwork(projection.dns.issuedAt >= previous.dns.issuedAt);
|
|
299
|
+
for (const old of previous.networks) {
|
|
300
|
+
const current = projection.networks.find(network => network.id === old.id);
|
|
301
|
+
if (!current)
|
|
302
|
+
continue;
|
|
303
|
+
requireNetwork(current.organizationId === old.organizationId && current.organizationDnsKey === old.organizationDnsKey
|
|
304
|
+
&& current.networkDnsKey === old.networkDnsKey && current.createdAt === old.createdAt && current.revision >= old.revision);
|
|
305
|
+
if (current.revision === old.revision)
|
|
306
|
+
requireNetwork(networkEqual(current, old));
|
|
307
|
+
}
|
|
308
|
+
for (const old of previous.memberships) {
|
|
309
|
+
const current = projection.memberships.find(member => ownerKey(member) === ownerKey(old));
|
|
310
|
+
if (!current)
|
|
311
|
+
continue;
|
|
312
|
+
requireNetwork(current.revision >= old.revision);
|
|
313
|
+
if (current.revision === old.revision)
|
|
314
|
+
requireNetwork(networkEqual(current, old));
|
|
315
|
+
}
|
|
316
|
+
const grants = new Set(grantsOf(projection).map(networkCanonical)), withdrawn = new Set(projection.withdrawals.map(networkCanonical));
|
|
317
|
+
const previousGrants = grantsOf(previous);
|
|
318
|
+
for (const grant of previousGrants)
|
|
319
|
+
requireNetwork(grants.has(networkCanonical(grant)) || withdrawn.has(networkCanonical(grant)));
|
|
320
|
+
const knownWithdrawals = new Set([...previousGrants, ...previous.withdrawals].map(networkCanonical));
|
|
321
|
+
requireNetwork(projection.withdrawals.every(grant => knownWithdrawals.has(networkCanonical(grant))));
|
|
322
|
+
const knownLeases = [...previous.endpoints.map(endpoint => networkReferenceOf(endpoint.lease)), ...previous.retiredLeases];
|
|
323
|
+
const knownHandoffs = [...(previous.handoff ? [networkReferenceOf(previous.handoff)] : []), ...previous.retiredHandoffs];
|
|
324
|
+
requireNetwork(projection.retiredLeases.every(retired => knownLeases.some(known => networkEqual(known, retired)))
|
|
325
|
+
&& projection.retiredHandoffs.every(retired => knownHandoffs.some(known => networkEqual(known, retired))));
|
|
326
|
+
const requireCarried = (old, next) => {
|
|
327
|
+
for (const reference of old)
|
|
328
|
+
requireNetwork(next.some(item => networkEqual(item, reference)));
|
|
329
|
+
};
|
|
330
|
+
if (applied === null) {
|
|
331
|
+
for (const grant of previous.withdrawals)
|
|
332
|
+
requireNetwork(withdrawn.has(networkCanonical(grant)));
|
|
333
|
+
requireCarried(previous.retiredLeases, projection.retiredLeases);
|
|
334
|
+
requireCarried(previous.retiredHandoffs, projection.retiredHandoffs);
|
|
335
|
+
}
|
|
336
|
+
for (const old of previous.endpoints) {
|
|
337
|
+
// A different allocation ID cannot rename the same immutable execution attempt.
|
|
338
|
+
for (const candidate of projection.endpoints) {
|
|
339
|
+
if (candidate.lease.assignmentId === old.lease.assignmentId || attemptKey(candidate.lease) === attemptKey(old.lease)) {
|
|
340
|
+
requireNetwork(networkEqual(candidate.lease, old.lease));
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
const current = projection.endpoints.find(item => item.lease.id === old.lease.id);
|
|
344
|
+
if (current) {
|
|
345
|
+
requireNetwork(networkEqual(current.lease, old.lease));
|
|
346
|
+
if (old.observation) {
|
|
347
|
+
requireNetwork(current.observation !== null && current.observation.sequence >= old.observation.sequence);
|
|
348
|
+
requireNetwork(current.observation.assignment.generation >= old.observation.assignment.generation);
|
|
349
|
+
if (current.observation.assignment.generation === old.observation.assignment.generation) {
|
|
350
|
+
requireNetwork(networkEqual(current.observation.assignment, old.observation.assignment));
|
|
351
|
+
}
|
|
352
|
+
if (current.observation.sequence === old.observation.sequence)
|
|
353
|
+
requireNetwork(networkEqual(current.observation, old.observation)
|
|
354
|
+
&& (!current.ready || old.ready));
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
else
|
|
358
|
+
requireNetwork(projection.retiredLeases.some(item => networkEqual(item, networkReferenceOf(old.lease))));
|
|
359
|
+
}
|
|
360
|
+
if (previous.handoff && !networkEqual(previous.handoff, projection.handoff))
|
|
361
|
+
requireNetwork(projection.retiredHandoffs.some(item => networkEqual(item, networkReferenceOf(previous.handoff))));
|
|
362
|
+
const protection = projection.protectedAuthority, oldProtection = previous.protectedAuthority;
|
|
363
|
+
requireNetwork(networkEqual(protection, oldProtection) || (protection.id === oldProtection.id
|
|
364
|
+
&& networkEqual(protection.previous, networkReferenceOf(oldProtection))));
|
|
365
|
+
return { status: 'accepted', projection };
|
|
366
|
+
}
|
|
367
|
+
catch {
|
|
368
|
+
return failNetwork();
|
|
369
|
+
}
|
|
370
|
+
};
|
|
371
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29ya3Byb2plY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL25ldHdvcmtwcm9qZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWxHLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSwrQ0FBK0MsRUFDeEYsb0NBQW9DLEVBQUUsMENBQTBDLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVsSCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsdUNBQXVDLEVBQ3pFLHdCQUF3QixFQUFFLGdDQUFnQyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFDeEcsYUFBYSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQ2hHLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUMxRyxXQUFXLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBeUZwRixNQUFNLENBQUMsTUFBTSxrQ0FBa0MsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzlELG9CQUFvQixFQUFFLDhDQUE4QztJQUNwRSxzQkFBc0IsRUFBRSwwQ0FBMEM7SUFDbEUscUJBQXFCLEVBQUUsT0FBTztJQUM5Qiw0QkFBNEIsRUFBRSxFQUFFO0lBQ2hDLGVBQWUsRUFBRSxHQUFHO0lBQ3BCLGtCQUFrQixFQUFFLEdBQUc7SUFDdkIsZ0JBQWdCLEVBQUUsR0FBRztJQUNyQixhQUFhLEVBQUUsSUFBSTtJQUNuQixpQkFBaUIsRUFBRSxPQUFPO0lBQzFCLGtCQUFrQixFQUFFLENB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VyxDQUFDLEVBQUUsZ0JBQWdCLENBQUM7UUFDOUYsYUFBYSxFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7QUFDdkosQ0FBQyxDQUFDLENBQUM7QUFFSCxNQUFNLFFBQVEsR0FBRyxDQUFDLFVBQXVDLEVBQWtDLEVBQUU7SUFDM0YsTUFBTSxNQUFNLEdBQW1DLEVBQUUsQ0FBQztJQUNsRCxNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5RixNQUFNLE1BQU0sR0FBRyxDQUFDLEtBQW1DLEVBQUUsRUFBRTtRQUNyRCxjQUFjLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQztRQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0QsQ0FBQyxDQUFDO0lBQ0YsS0FBSyxNQUFNLE1BQU0sSUFBSSxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDMUMsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0UsS0FBSyxNQUFNLFdBQVcsSUFBSSxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDL0MsSUFBSSxNQUFNLEtBQUssV0FBVyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FB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
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { TSha256Digest } from './immutableimage.js';
|
|
2
|
+
import type { IRuntimeAuthorityReferenceV1 } from './runtimeassignment.js';
|
|
3
|
+
import type { IRuntimeNetworkNodeScopeV1 } from './networkprojection.js';
|
|
4
|
+
import type { IRuntimeNetworkProtectedAuthorityV1 } from './networkauthority.js';
|
|
5
|
+
import type { IRuntimeSessionBindingV1 } from './runtimesession.js';
|
|
6
|
+
/**
|
|
7
|
+
* Durable native protection report, independent of projection admission and DNS.
|
|
8
|
+
* The producer owns a joined native journal covering ALL affected local egress
|
|
9
|
+
* paths. nativeBarrier identifies that complete journal, never an admission ACK,
|
|
10
|
+
* a single table inspection, a boot event or a caller-selected success flag.
|
|
11
|
+
* A null nativeBarrier explicitly withdraws this node's allocation eligibility.
|
|
12
|
+
*/
|
|
13
|
+
export interface IRuntimeNetworkProtectionReceiptV1 extends IRuntimeNetworkNodeScopeV1 {
|
|
14
|
+
schemaVersion: 1;
|
|
15
|
+
id: string;
|
|
16
|
+
generation: number;
|
|
17
|
+
previous: IRuntimeAuthorityReferenceV1 | null;
|
|
18
|
+
protectedAuthority: IRuntimeAuthorityReferenceV1;
|
|
19
|
+
reporterSessionId: string;
|
|
20
|
+
bootId: string;
|
|
21
|
+
nativeBarrier: IRuntimeAuthorityReferenceV1 | null;
|
|
22
|
+
digest: TSha256Digest;
|
|
23
|
+
}
|
|
24
|
+
export interface IReportRuntimeNetworkProtectionRequestV1 {
|
|
25
|
+
session: IRuntimeSessionBindingV1;
|
|
26
|
+
receipt: IRuntimeNetworkProtectionReceiptV1;
|
|
27
|
+
}
|
|
28
|
+
export interface IReportRuntimeNetworkProtectionResponseV1 {
|
|
29
|
+
status: 'accepted' | 'replay';
|
|
30
|
+
receipt: IRuntimeAuthorityReferenceV1;
|
|
31
|
+
authorityUse: 'current' | 'historical';
|
|
32
|
+
}
|
|
33
|
+
export declare const runtimeNetworkProtectionV1Contract: Readonly<{
|
|
34
|
+
readonly digestDomain: "serve.zone/runtime-network-protection-receipt-v1";
|
|
35
|
+
readonly maximumAuthorities: 256;
|
|
36
|
+
readonly allocation: "all-current-affected-egress-receipts-before-reserving-any-lease";
|
|
37
|
+
readonly receiptSource: "joined-complete-native-protection-journal";
|
|
38
|
+
readonly unavailable: "null-native-barrier-removes-allocation-eligibility";
|
|
39
|
+
readonly historical: "retain-for-outbox-replay-never-current-allocation-eligibility";
|
|
40
|
+
readonly quarantine: "no-release-authority";
|
|
41
|
+
}>;
|
|
42
|
+
export declare const snapshotRuntimeNetworkProtectionReceiptV1: (value: unknown) => IRuntimeNetworkProtectionReceiptV1;
|
|
43
|
+
export declare const computeRuntimeNetworkProtectionReceiptV1Digest: (value: IRuntimeNetworkProtectionReceiptV1) => Promise<TSha256Digest>;
|
|
44
|
+
/** Pure revision binding. The owner must authenticate the reporter and fence all DB writes. */
|
|
45
|
+
export declare const admitRuntimeNetworkProtectionReceiptV1: (value: unknown, previousValue: unknown | null, trustedScopeValue: unknown, knownProtectionValue: unknown) => Promise<{
|
|
46
|
+
status: "accepted" | "replay";
|
|
47
|
+
receipt: IRuntimeNetworkProtectionReceiptV1;
|
|
48
|
+
}>;
|
|
49
|
+
export declare const snapshotReportRuntimeNetworkProtectionRequestV1: (value: unknown) => IReportRuntimeNetworkProtectionRequestV1;
|
|
50
|
+
/** Both trusted bindings come from the receiver's fenced physical-session/history owner. */
|
|
51
|
+
export declare const bindReportRuntimeNetworkProtectionRequestV1: (value: unknown, trustedCurrentSessionValue: unknown, trustedReporterSessionValue: unknown) => {
|
|
52
|
+
request: IReportRuntimeNetworkProtectionRequestV1;
|
|
53
|
+
authorityUse: "current" | "historical";
|
|
54
|
+
};
|
|
55
|
+
export declare const snapshotReportRuntimeNetworkProtectionResponseV1: (value: unknown) => IReportRuntimeNetworkProtectionResponseV1;
|
|
56
|
+
export declare const bindReportRuntimeNetworkProtectionResponseV1: (value: unknown, sentReceiptValue: unknown) => IReportRuntimeNetworkProtectionResponseV1;
|
|
57
|
+
/**
|
|
58
|
+
* Complete allocation prerequisite, not authentication or a native inspector.
|
|
59
|
+
* Inputs MUST be the current receiver-persisted receipts and CURRENT durable
|
|
60
|
+
* sessions, fenced together with protection and lease insertion. Never supply
|
|
61
|
+
* worker-authored lists or just online peers. Missing/offline/unavailable owners
|
|
62
|
+
* cannot be omitted. Independent fences need their own verified owning contract;
|
|
63
|
+
* this helper supplies no generic override, expiry or quorum escape hatch.
|
|
64
|
+
*/
|
|
65
|
+
export declare const bindRuntimeNetworkAllocationProtectionV1: (protectionValue: unknown, receiptsValue: unknown, currentSessionsValue: unknown) => Promise<{
|
|
66
|
+
protection: IRuntimeNetworkProtectedAuthorityV1;
|
|
67
|
+
receipts: IRuntimeNetworkProtectionReceiptV1[];
|
|
68
|
+
}>;
|