@serve.zone/interfaces 32.42.0 → 32.44.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 +48 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/data/index.d.ts +2 -0
- package/dist_ts/data/index.js +2 -1
- package/dist_ts/data/networkegressretirement.d.ts +37 -12
- package/dist_ts/data/networkegressretirement.js +43 -14
- package/dist_ts/data/networkprojection.d.ts +10 -0
- package/dist_ts/data/networkprojection.js +15 -2
- package/dist_ts/data/networkprojectionretirement.d.ts +52 -0
- package/dist_ts/data/networkprojectionretirement.js +33 -0
- package/dist_ts/data/networkprotection.d.ts +29 -1
- package/dist_ts/data/networkprotection.js +45 -1
- package/dist_ts/data/noderetirement.d.ts +3 -1
- package/dist_ts/data/noderetirement.js +1 -1
- package/package.json +3 -3
- package/readme.md +106 -16
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/data/index.ts +2 -0
- package/ts/data/networkegressretirement.ts +52 -15
- package/ts/data/networkprojection.ts +20 -1
- package/ts/data/networkprojectionretirement.ts +72 -0
- package/ts/data/networkprotection.ts +52 -1
- package/ts/data/noderetirement.ts +3 -1
package/changelog.md
CHANGED
|
@@ -1,5 +1,53 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-10-02 - 32.44.0
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- Cloudly can ask a running node to withdraw its allocation protection, and nothing else
|
|
8
|
+
withdraws it. `IRuntimeNetworkProjection.retirement`
|
|
9
|
+
(`IRuntimeNetworkProjectionRetirement { disposition: 'withdrawn', protectedAuthority }`,
|
|
10
|
+
`snapshotRuntimeNetworkProjectionRetirement`, `runtimeNetworkProjectionRetirementContract`) is the
|
|
11
|
+
signed request for a node whose egress ownership is retired with the `withdrawn` disposition:
|
|
12
|
+
only a `cloudly` projection carries it, it names the projection's own authority chain at a
|
|
13
|
+
generation the projection has reached, and `admitRuntimeNetworkProjection` admits its first
|
|
14
|
+
appearance only naming the projection's current authority and latches it, so every successor
|
|
15
|
+
carries it unchanged. Consumers earlier than this release refuse a projection that carries it, so Cloudly sends the request only to nodes that report a compatible interfaces version. Omitted, it keeps the projection's canonical bytes. The node
|
|
16
|
+
answers with the null-barrier successor of its protection receipt chain and mints no positive
|
|
17
|
+
receipt for that chain again (`runtimeNetworkProtectionContract.withdrawal`). The new
|
|
18
|
+
`bindRuntimeNetworkProtectionReceiptRetirement(receipt, previous, retirement)` is the receiver's
|
|
19
|
+
gate for such a node's reports: the null answer always passes, and a positive receipt passes only
|
|
20
|
+
while it can predate the request (no authority newer than the request's, no null predecessor).
|
|
21
|
+
A clean stop, a crash, a reboot or being offline no longer counts as a withdrawal: the retained
|
|
22
|
+
allocation-pool guard outlives the node process and is restored before networking at boot, so
|
|
23
|
+
the last receipt stays current until a reconnect binds a new reporter session.
|
|
24
|
+
|
|
25
|
+
### Maintenance
|
|
26
|
+
|
|
27
|
+
- Release tooling: `@git.zone/tsbuild` 5.1.2.
|
|
28
|
+
|
|
29
|
+
## 2026-10-02 - 32.43.0
|
|
30
|
+
|
|
31
|
+
### Features
|
|
32
|
+
|
|
33
|
+
- An egress owner that is lost no longer freezes the retirement of every other owner.
|
|
34
|
+
`IRuntimeNetworkEgressRetirement.clearedProjections` names every remaining owner except those
|
|
35
|
+
whose own `lost` fence is recorded against the same authority, and
|
|
36
|
+
`bindRuntimeNetworkProtectedAuthorityRetirement` takes an optional fifth argument `exemptions`
|
|
37
|
+
(default none) and answers them beside the fences: the `lost` fences of owners the step keeps,
|
|
38
|
+
each verified by its digest and recorded under the same controller against the exact `previous`,
|
|
39
|
+
for an owner both sides name and no fence or other exemption names, at most
|
|
40
|
+
`runtimeNetworkEgressRetirementContract.maximumExemptionsPerStep` (255). Every consumed fence's
|
|
41
|
+
clearance must name exactly the kept owners less the exempt ones. Lost owners can be fenced in
|
|
42
|
+
parallel and leave 16 per step, however many there are. `retiredOwners` is now the caller's
|
|
43
|
+
retired-owner history restricted to the owners `previous` or `next` names, and any entry refuses
|
|
44
|
+
the step; `maximumRetiredOwners` bounds that restriction at 512 instead of a lifetime history of
|
|
45
|
+
4096 owners, so a long-lived authority never runs out of retirements.
|
|
46
|
+
|
|
47
|
+
### Maintenance
|
|
48
|
+
|
|
49
|
+
- Release tooling: `@git.zone/tstest` 6.3.4.
|
|
50
|
+
|
|
3
51
|
## 2026-10-02 - 32.42.0
|
|
4
52
|
|
|
5
53
|
### Features
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@serve.zone/interfaces',
|
|
6
|
-
version: '32.
|
|
6
|
+
version: '32.44.0',
|
|
7
7
|
description: 'Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsV0FBVyxFQUFFLHVGQUF1RjtDQUNyRyxDQUFBIn0=
|
package/dist_ts/data/index.d.ts
CHANGED
|
@@ -48,6 +48,8 @@ export type { IRuntimeNetworkHostIngress, IRuntimeNetworkHostPacketGrant, IRunti
|
|
|
48
48
|
export { runtimeNetworkHostContract } from './networkhost.js';
|
|
49
49
|
export type { IRuntimeNetworkWorkloadIngress, IRuntimeNetworkWorkloadIngressPacketGrant, IRuntimeNetworkWorkloadIngressProjection } from './networkworkloadingress.js';
|
|
50
50
|
export { runtimeNetworkWorkloadIngressContract } from './networkworkloadingress.js';
|
|
51
|
+
export type { IRuntimeNetworkProjectionRetirement } from './networkprojectionretirement.js';
|
|
52
|
+
export { runtimeNetworkProjectionRetirementContract, snapshotRuntimeNetworkProjectionRetirement } from './networkprojectionretirement.js';
|
|
51
53
|
export * from './networkprotection.js';
|
|
52
54
|
export * from './networksigning.js';
|
|
53
55
|
export * from './privatenetwork.js';
|
package/dist_ts/data/index.js
CHANGED
|
@@ -45,6 +45,7 @@ export * from './networknode.js';
|
|
|
45
45
|
export * from './networkprojection.js';
|
|
46
46
|
export { runtimeNetworkHostContract } from './networkhost.js';
|
|
47
47
|
export { runtimeNetworkWorkloadIngressContract } from './networkworkloadingress.js';
|
|
48
|
+
export { runtimeNetworkProjectionRetirementContract, snapshotRuntimeNetworkProjectionRetirement } from './networkprojectionretirement.js';
|
|
48
49
|
export * from './networkprotection.js';
|
|
49
50
|
export * from './networksigning.js';
|
|
50
51
|
export * from './privatenetwork.js';
|
|
@@ -79,4 +80,4 @@ export * from './traffic.js';
|
|
|
79
80
|
export * from './user.js';
|
|
80
81
|
export * from './version.js';
|
|
81
82
|
export * from './webpush.js';
|
|
82
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLFdBQVcsQ0FBQztBQUMxQixjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyx3QkFBd0IsQ0FBQztBQUd2QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUc5RCxPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVwRixPQUFPLEVBQUUsMENBQTBDLEVBQUUsMENBQTBDLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxSSxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxjQUFjLENBQUMifQ==
|
|
@@ -29,10 +29,13 @@ export interface IRuntimeNetworkEgressRetirementClearance extends IRuntimeNetwor
|
|
|
29
29
|
* 4. every handoff and workload lease the node was granted is quarantined (`quarantinedHandoffs`,
|
|
30
30
|
* `quarantinedWorkloads`) and is never handed out again;
|
|
31
31
|
* 5. every remaining owner of `protectedAuthority` acknowledged a projection head that carries no
|
|
32
|
-
* endpoint of the node (`clearedProjections`).
|
|
32
|
+
* endpoint of the node (`clearedProjections`). An owner whose own `lost` fence is recorded
|
|
33
|
+
* against the same authority is not a remaining owner here: it never acknowledges anything again,
|
|
34
|
+
* so it can never clear another owner's endpoints, and it leaves behind its own fence.
|
|
33
35
|
*
|
|
34
36
|
* `lastReceipt` is the node's last accepted protection receipt. A `withdrawn` node took part in its
|
|
35
|
-
* retirement, so it always has one — its null withdrawal
|
|
37
|
+
* retirement, so it always has one — its null withdrawal, the answer to its projection's
|
|
38
|
+
* `retirement` request; a `lost` node may never have reported.
|
|
36
39
|
*
|
|
37
40
|
* A structural snapshot and digest do not authenticate any of it: the controller must fence the
|
|
38
41
|
* rows it read together with the authority it stages.
|
|
@@ -60,7 +63,10 @@ export interface IRuntimeNetworkEgressRetirement extends IRuntimeNetworkNodeScop
|
|
|
60
63
|
quarantinedHandoffs: IRuntimeAuthorityReference[];
|
|
61
64
|
/** Every workload lease the node was granted, each quarantined, in canonical order. */
|
|
62
65
|
quarantinedWorkloads: IRuntimeAuthorityReference[];
|
|
63
|
-
/**
|
|
66
|
+
/**
|
|
67
|
+
* One entry per remaining owner of `protectedAuthority` whose own `lost` fence is not recorded
|
|
68
|
+
* against that authority, in canonical owner order.
|
|
69
|
+
*/
|
|
64
70
|
clearedProjections: IRuntimeNetworkEgressRetirementClearance[];
|
|
65
71
|
digest: TSha256Digest;
|
|
66
72
|
}
|
|
@@ -71,8 +77,16 @@ export declare const runtimeNetworkEgressRetirementContract: Readonly<{
|
|
|
71
77
|
readonly maximumClearedProjections: number;
|
|
72
78
|
/** Fences one step may consume. Each is read on its own, so one step stays bounded. */
|
|
73
79
|
readonly maximumFencesPerStep: 16;
|
|
74
|
-
/**
|
|
75
|
-
|
|
80
|
+
/**
|
|
81
|
+
* Lost fences one step may hold as exemptions: owners it keeps that no consumed fence's clearance
|
|
82
|
+
* has to name. At least one owner is kept, so this is one fewer than the owners an authority has.
|
|
83
|
+
*/
|
|
84
|
+
readonly maximumExemptionsPerStep: number;
|
|
85
|
+
/**
|
|
86
|
+
* Retired owners one step may be given: the caller's history restricted to owners `previous` or
|
|
87
|
+
* `next` names, which is at most every owner of both.
|
|
88
|
+
*/
|
|
89
|
+
readonly maximumRetiredOwners: number;
|
|
76
90
|
readonly removal: "absent-owner-requires-fence-bound-to-exact-previous-authority";
|
|
77
91
|
readonly reentry: "a-fenced-owner-never-returns";
|
|
78
92
|
}>;
|
|
@@ -82,24 +96,35 @@ export declare const computeRuntimeNetworkEgressRetirementDigest: (value: IRunti
|
|
|
82
96
|
/**
|
|
83
97
|
* Whether `next` may succeed `previous`, judged on its egress owners and the address space it keeps.
|
|
84
98
|
*
|
|
85
|
-
* Pure and fail-closed. `fences` are the egress retirements this step consumes
|
|
86
|
-
*
|
|
87
|
-
*
|
|
99
|
+
* Pure and fail-closed. `fences` are the egress retirements this step consumes. `exemptions` are
|
|
100
|
+
* `lost` fences of owners this step keeps, recorded against the same `previous`: such an owner never
|
|
101
|
+
* acknowledges another projection head, so no consumed fence's clearance can wait for it. They are
|
|
102
|
+
* read, not consumed, and default to none. `retiredOwners` is the caller's durable history of
|
|
103
|
+
* fenced owners restricted to the owners `previous` or `next` names, in canonical owner order. The
|
|
104
|
+
* step is accepted only when:
|
|
88
105
|
*
|
|
89
106
|
* - `next` is the exact successor of `previous` under the same controller, and both digests verify;
|
|
90
107
|
* - an owner of `previous` is absent from `next` only when exactly one fence, recorded against the
|
|
91
108
|
* exact `previous` reference and verified by its digest, names it — a fence for an owner `next`
|
|
92
109
|
* still names, or for an owner `previous` does not name, refuses the step;
|
|
93
|
-
* - every
|
|
94
|
-
*
|
|
110
|
+
* - every exemption verifies by its digest, is `lost`, is recorded under the same controller against
|
|
111
|
+
* the exact `previous` reference, and names an owner both `previous` and `next` name, no fence
|
|
112
|
+
* names and no other exemption names; at most `maximumExemptionsPerStep`, in canonical owner order;
|
|
113
|
+
* - every fence's `clearedProjections` names exactly the owners of `previous` this step keeps, less
|
|
114
|
+
* the exempt owners; an exemption's own clearance is not judged here, only when its owner leaves;
|
|
115
|
+
* - `retiredOwners` is empty: any entry is either an owner a side names that was fenced before, or
|
|
116
|
+
* not part of the restriction at all, so a fenced owner never returns;
|
|
95
117
|
* - every pool of `previous` is kept unchanged and the prefixes of `next` cover those of `previous`;
|
|
96
118
|
* a step that removes an owner also keeps every resolver of `previous` unchanged.
|
|
97
119
|
*
|
|
98
120
|
* Owners that join in the same step are admitted. With no fence this is the additive owner rule:
|
|
99
|
-
* nobody leaves. It verifies no fence evidence against live state and
|
|
121
|
+
* nobody leaves, and exemptions relax nothing. It verifies no fence evidence against live state and
|
|
122
|
+
* fences no record: the caller fences every fence and exemption it read together with the authority
|
|
123
|
+
* it stages.
|
|
100
124
|
*/
|
|
101
|
-
export declare const bindRuntimeNetworkProtectedAuthorityRetirement: (previousValue: unknown, nextValue: unknown, fencesValue: unknown, retiredOwnersValue: unknown) => Promise<{
|
|
125
|
+
export declare const bindRuntimeNetworkProtectedAuthorityRetirement: (previousValue: unknown, nextValue: unknown, fencesValue: unknown, retiredOwnersValue: unknown, exemptionsValue?: unknown) => Promise<{
|
|
102
126
|
previous: IRuntimeNetworkProtectedAuthority;
|
|
103
127
|
next: IRuntimeNetworkProtectedAuthority;
|
|
104
128
|
fences: IRuntimeNetworkEgressRetirement[];
|
|
129
|
+
exemptions: IRuntimeNetworkEgressRetirement[];
|
|
105
130
|
}>;
|
|
@@ -10,8 +10,16 @@ export const runtimeNetworkEgressRetirementContract = Object.freeze({
|
|
|
10
10
|
maximumClearedProjections: runtimeNetworkAuthorityContract.maximumEgressAuthorities - 1,
|
|
11
11
|
/** Fences one step may consume. Each is read on its own, so one step stays bounded. */
|
|
12
12
|
maximumFencesPerStep: 16,
|
|
13
|
-
/**
|
|
14
|
-
|
|
13
|
+
/**
|
|
14
|
+
* Lost fences one step may hold as exemptions: owners it keeps that no consumed fence's clearance
|
|
15
|
+
* has to name. At least one owner is kept, so this is one fewer than the owners an authority has.
|
|
16
|
+
*/
|
|
17
|
+
maximumExemptionsPerStep: runtimeNetworkAuthorityContract.maximumEgressAuthorities - 1,
|
|
18
|
+
/**
|
|
19
|
+
* Retired owners one step may be given: the caller's history restricted to owners `previous` or
|
|
20
|
+
* `next` names, which is at most every owner of both.
|
|
21
|
+
*/
|
|
22
|
+
maximumRetiredOwners: 2 * runtimeNetworkAuthorityContract.maximumEgressAuthorities,
|
|
15
23
|
removal: 'absent-owner-requires-fence-bound-to-exact-previous-authority',
|
|
16
24
|
reentry: 'a-fenced-owner-never-returns',
|
|
17
25
|
});
|
|
@@ -55,23 +63,33 @@ export const computeRuntimeNetworkEgressRetirementDigest = (value) => networkHas
|
|
|
55
63
|
/**
|
|
56
64
|
* Whether `next` may succeed `previous`, judged on its egress owners and the address space it keeps.
|
|
57
65
|
*
|
|
58
|
-
* Pure and fail-closed. `fences` are the egress retirements this step consumes
|
|
59
|
-
*
|
|
60
|
-
*
|
|
66
|
+
* Pure and fail-closed. `fences` are the egress retirements this step consumes. `exemptions` are
|
|
67
|
+
* `lost` fences of owners this step keeps, recorded against the same `previous`: such an owner never
|
|
68
|
+
* acknowledges another projection head, so no consumed fence's clearance can wait for it. They are
|
|
69
|
+
* read, not consumed, and default to none. `retiredOwners` is the caller's durable history of
|
|
70
|
+
* fenced owners restricted to the owners `previous` or `next` names, in canonical owner order. The
|
|
71
|
+
* step is accepted only when:
|
|
61
72
|
*
|
|
62
73
|
* - `next` is the exact successor of `previous` under the same controller, and both digests verify;
|
|
63
74
|
* - an owner of `previous` is absent from `next` only when exactly one fence, recorded against the
|
|
64
75
|
* exact `previous` reference and verified by its digest, names it — a fence for an owner `next`
|
|
65
76
|
* still names, or for an owner `previous` does not name, refuses the step;
|
|
66
|
-
* - every
|
|
67
|
-
*
|
|
77
|
+
* - every exemption verifies by its digest, is `lost`, is recorded under the same controller against
|
|
78
|
+
* the exact `previous` reference, and names an owner both `previous` and `next` name, no fence
|
|
79
|
+
* names and no other exemption names; at most `maximumExemptionsPerStep`, in canonical owner order;
|
|
80
|
+
* - every fence's `clearedProjections` names exactly the owners of `previous` this step keeps, less
|
|
81
|
+
* the exempt owners; an exemption's own clearance is not judged here, only when its owner leaves;
|
|
82
|
+
* - `retiredOwners` is empty: any entry is either an owner a side names that was fenced before, or
|
|
83
|
+
* not part of the restriction at all, so a fenced owner never returns;
|
|
68
84
|
* - every pool of `previous` is kept unchanged and the prefixes of `next` cover those of `previous`;
|
|
69
85
|
* a step that removes an owner also keeps every resolver of `previous` unchanged.
|
|
70
86
|
*
|
|
71
87
|
* Owners that join in the same step are admitted. With no fence this is the additive owner rule:
|
|
72
|
-
* nobody leaves. It verifies no fence evidence against live state and
|
|
88
|
+
* nobody leaves, and exemptions relax nothing. It verifies no fence evidence against live state and
|
|
89
|
+
* fences no record: the caller fences every fence and exemption it read together with the authority
|
|
90
|
+
* it stages.
|
|
73
91
|
*/
|
|
74
|
-
export const bindRuntimeNetworkProtectedAuthorityRetirement = async (previousValue, nextValue, fencesValue, retiredOwnersValue) => {
|
|
92
|
+
export const bindRuntimeNetworkProtectedAuthorityRetirement = async (previousValue, nextValue, fencesValue, retiredOwnersValue, exemptionsValue = []) => {
|
|
75
93
|
try {
|
|
76
94
|
const contract = runtimeNetworkEgressRetirementContract;
|
|
77
95
|
const previous = snapshotRuntimeNetworkProtectedAuthority(captureNetwork(previousValue));
|
|
@@ -79,6 +97,9 @@ export const bindRuntimeNetworkProtectedAuthorityRetirement = async (previousVal
|
|
|
79
97
|
const elements = readDataElements(fencesValue, contract.maximumFencesPerStep);
|
|
80
98
|
requireNetwork(elements);
|
|
81
99
|
const fences = networkSorted(elements.map(snapshotRuntimeNetworkEgressRetirement), ownerKey);
|
|
100
|
+
const exemptionElements = readDataElements(exemptionsValue, contract.maximumExemptionsPerStep);
|
|
101
|
+
requireNetwork(exemptionElements);
|
|
102
|
+
const exemptions = networkSorted(exemptionElements.map(snapshotRuntimeNetworkEgressRetirement), ownerKey);
|
|
82
103
|
const retiredOwners = networkSorted(networkList(captureNetwork(retiredOwnersValue), contract.maximumRetiredOwners, readOwner), ownerKey);
|
|
83
104
|
requireNetwork(previous.digest === await computeRuntimeNetworkProtectedAuthorityDigest(previous)
|
|
84
105
|
&& next.digest === await computeRuntimeNetworkProtectedAuthorityDigest(next));
|
|
@@ -94,20 +115,28 @@ export const bindRuntimeNetworkProtectedAuthorityRetirement = async (previousVal
|
|
|
94
115
|
&& previousOwners.has(ownerKey(fence)) && !nextOwners.has(ownerKey(fence)));
|
|
95
116
|
}
|
|
96
117
|
requireNetwork([...previousOwners].every(owner => nextOwners.has(owner) || fenced.has(owner)));
|
|
97
|
-
const
|
|
118
|
+
for (const exemption of exemptions) {
|
|
119
|
+
requireNetwork(exemption.digest === await computeRuntimeNetworkEgressRetirementDigest(exemption)
|
|
120
|
+
&& exemption.disposition === 'lost' && networkEqual(exemption.controller, previous.controller)
|
|
121
|
+
&& networkEqual(exemption.protectedAuthority, reference) && previousOwners.has(ownerKey(exemption))
|
|
122
|
+
&& nextOwners.has(ownerKey(exemption)));
|
|
123
|
+
}
|
|
124
|
+
// A fence's owner is never named by `next`, so no exemption names an owner a fence names.
|
|
125
|
+
const exempt = new Set(exemptions.map(ownerKey));
|
|
126
|
+
const cleared = previous.egressAuthorities.map(ownerKey).filter(owner => !fenced.has(owner) && !exempt.has(owner));
|
|
98
127
|
for (const fence of fences) {
|
|
99
|
-
requireNetwork(networkEqual(fence.clearedProjections.map(ownerKey),
|
|
128
|
+
requireNetwork(networkEqual(fence.clearedProjections.map(ownerKey), cleared));
|
|
100
129
|
}
|
|
101
|
-
requireNetwork(retiredOwners.
|
|
130
|
+
requireNetwork(retiredOwners.length === 0);
|
|
102
131
|
requireNetwork(previous.pools.every(pool => next.pools.some(candidate => networkEqual(candidate, pool)))
|
|
103
132
|
&& previous.prefixes.every(prefix => networkCoveredBy(next.prefixes, prefix)));
|
|
104
133
|
if (fences.length > 0) {
|
|
105
134
|
requireNetwork(previous.resolvers.every(resolver => next.resolvers.some(candidate => networkEqual(candidate, resolver))));
|
|
106
135
|
}
|
|
107
|
-
return { previous, next, fences };
|
|
136
|
+
return { previous, next, fences, exemptions };
|
|
108
137
|
}
|
|
109
138
|
catch {
|
|
110
139
|
return failNetwork();
|
|
111
140
|
}
|
|
112
141
|
};
|
|
113
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
142
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29ya2VncmVzc3JldGlyZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL25ldHdvcmtlZ3Jlc3NyZXRpcmVtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFBRSw2Q0FBNkMsRUFBRSwrQkFBK0IsRUFDckYsd0NBQXdDLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsaUNBQWlDLEVBQTBDLE1BQU0scUJBQXFCLENBQUM7QUFDaEgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pELE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUNuSCxXQUFXLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFDcEgsWUFBWSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQXFFckYsTUFBTSxDQUFDLE1BQU0sc0NBQXNDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNsRSxZQUFZLEVBQUUsOENBQThDO0lBQzVELDBCQUEwQixFQUFFLCtCQUErQixDQUFDLDRCQUE0QjtJQUN4RiwyQkFBMkIsRUFBRSxHQUFHO0lBQ2hDLHlCQUF5QixFQUFFLCtCQUErQixDQUFDLHdCQUF3QixHQUFHLENBQUM7SUFDdkYsdUZBQXVGO0lBQ3ZGLG9CQUFvQixFQUFFLEVBQUU7SUFDeEI7OztPQUdHO0lBQ0gsd0JBQXdCLEVBQUUsK0JBQStCLENBQUMsd0JBQXdCLEdBQUcsQ0FBQztJQUN0Rjs7O09BR0c7SUFDSCxvQkFBb0IsRUFBRSxDQUFDLEdBQUcsK0JBQStCLENBQUMs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
|
|
@@ -5,6 +5,7 @@ import type { IPrivateNetwork, IServicePrivateNetworks, IServicePrivateNetworkDn
|
|
|
5
5
|
import { type IRuntimeNetworkRouterPacketGrant, type IRuntimeNetworkRouterProjection } from './networkrouter.js';
|
|
6
6
|
import { type IRuntimeNetworkHostPacketGrant, type IRuntimeNetworkHostProjection } from './networkhost.js';
|
|
7
7
|
import { type IRuntimeNetworkWorkloadIngressPacketGrant, type IRuntimeNetworkWorkloadIngressProjection } from './networkworkloadingress.js';
|
|
8
|
+
import { type IRuntimeNetworkProjectionRetirement } from './networkprojectionretirement.js';
|
|
8
9
|
export interface IRuntimeNetworkNodeScope {
|
|
9
10
|
controller: IRuntimeController;
|
|
10
11
|
nodeId: string;
|
|
@@ -283,6 +284,15 @@ export interface IRuntimeNetworkProjection extends IRuntimeNetworkNodeScope {
|
|
|
283
284
|
* It grants nothing: a workload still reaches only the endpoints it selects.
|
|
284
285
|
*/
|
|
285
286
|
hostPlatformEndpointIds?: string[];
|
|
287
|
+
/**
|
|
288
|
+
* Present once Cloudly retires this node's egress ownership with the `withdrawn` disposition:
|
|
289
|
+
* the node withdraws its allocation protection with the null-barrier successor of its receipt
|
|
290
|
+
* chain and mints no positive receipt for it again (`IRuntimeNetworkProjectionRetirement`). Only
|
|
291
|
+
* a `cloudly` projection may carry it; it first appears naming exactly the projection's current
|
|
292
|
+
* `protectedAuthority`, and every successor carries it unchanged. Omitted, it keeps the canonical
|
|
293
|
+
* bytes and asks for nothing.
|
|
294
|
+
*/
|
|
295
|
+
retirement?: IRuntimeNetworkProjectionRetirement;
|
|
286
296
|
digest: TSha256Digest;
|
|
287
297
|
}
|
|
288
298
|
export interface IRuntimeNetworkDnsView {
|