@serve.zone/interfaces 31.9.0 → 32.0.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/.smartconfig.json +1 -0
- package/changelog.md +467 -0
- package/dist_ts/00_commitinfo_data.js +3 -3
- package/dist_ts/appstore/types.d.ts +4 -6
- package/dist_ts/appstore/types.js +5 -5
- package/dist_ts/data/backup.d.ts +3 -26
- package/dist_ts/data/cluster.d.ts +36 -11
- package/dist_ts/data/cluster.js +33 -22
- package/dist_ts/data/clusteringress.d.ts +8 -0
- package/dist_ts/data/clusteringress.js +13 -8
- package/dist_ts/data/clusternode.d.ts +121 -74
- package/dist_ts/data/clusternode.js +109 -132
- package/dist_ts/data/coremail.d.ts +3 -7
- package/dist_ts/data/coremail.js +2 -2
- package/dist_ts/data/coremail.runtime.d.ts +0 -1
- package/dist_ts/data/coremail.runtime.js +5 -22
- package/dist_ts/data/deploymentadoption.d.ts +0 -2
- package/dist_ts/data/deploymentadoption.js +40 -6
- package/dist_ts/data/deploymentoperation.js +16 -3
- package/dist_ts/data/deploymentpreflight.d.ts +0 -2
- package/dist_ts/data/deploymentpreflight.js +1 -1
- package/dist_ts/data/immutableimage.d.ts +38 -21
- package/dist_ts/data/immutableimage.js +45 -5
- package/dist_ts/data/index.d.ts +1 -1
- package/dist_ts/data/isolatedrestore.d.ts +139 -21
- package/dist_ts/data/isolatedrestore.golden.d.ts +0 -1
- package/dist_ts/data/isolatedrestore.golden.js +6 -9
- package/dist_ts/data/isolatedrestore.js +176 -40
- package/dist_ts/data/mail.d.ts +1 -1
- package/dist_ts/data/networkaddressplan.d.ts +8 -8
- package/dist_ts/data/networkaddressplan.js +4 -4
- package/dist_ts/data/networkauthority.d.ts +20 -22
- package/dist_ts/data/networkauthority.js +26 -28
- package/dist_ts/data/networkcredential.d.ts +10 -10
- package/dist_ts/data/networkcredential.js +16 -16
- package/dist_ts/data/networkdelivery.d.ts +18 -18
- package/dist_ts/data/networkdelivery.js +16 -16
- package/dist_ts/data/networklease.d.ts +18 -7
- package/dist_ts/data/networklease.js +29 -7
- package/dist_ts/data/networknode.d.ts +2 -2
- package/dist_ts/data/networkprojection.d.ts +59 -60
- package/dist_ts/data/networkprojection.js +53 -57
- package/dist_ts/data/networkprotection.d.ts +27 -28
- package/dist_ts/data/networkprotection.js +36 -36
- package/dist_ts/data/networkrouter.d.ts +11 -11
- package/dist_ts/data/networkrouter.js +1 -1
- package/dist_ts/data/networksigning.d.ts +16 -18
- package/dist_ts/data/networksigning.js +20 -21
- package/dist_ts/data/nodecredential.d.ts +4 -6
- package/dist_ts/data/nodeenrollment.d.ts +35 -40
- package/dist_ts/data/nodeenrollment.js +57 -72
- package/dist_ts/data/privatenetwork.d.ts +21 -24
- package/dist_ts/data/privatenetwork.js +39 -54
- package/dist_ts/data/runtimeassignment.d.ts +50 -34
- package/dist_ts/data/runtimeassignment.js +79 -45
- package/dist_ts/data/runtimeconfig.d.ts +21 -22
- package/dist_ts/data/runtimeconfig.js +24 -24
- package/dist_ts/data/runtimesession.d.ts +100 -62
- package/dist_ts/data/runtimesession.js +98 -79
- package/dist_ts/data/runtimeterminalreceipt.d.ts +28 -29
- package/dist_ts/data/runtimeterminalreceipt.js +42 -42
- package/dist_ts/data/secret.d.ts +18 -25
- package/dist_ts/data/secret.js +12 -52
- package/dist_ts/data/servicecredential.d.ts +14 -16
- package/dist_ts/data/servicecredential.js +17 -28
- package/dist_ts/data/serviceruntime.d.ts +7 -7
- package/dist_ts/data/serviceruntime.js +4 -4
- package/dist_ts/data/sparknodereport.d.ts +27 -14
- package/dist_ts/data/sparknodereport.js +35 -28
- package/dist_ts/data/webpush.d.ts +0 -1
- package/dist_ts/index.d.ts +2 -1
- package/dist_ts/index.js +3 -2
- package/dist_ts/platform/objectstorageretention.d.ts +21 -24
- package/dist_ts/platform/objectstorageretention.js +6 -18
- package/dist_ts/platform/storage.d.ts +1 -3
- package/dist_ts/platform/storagemigration.d.ts +0 -7
- package/dist_ts/platform/storagemigration.golden.d.ts +0 -1
- package/dist_ts/platform/storagemigration.golden.js +8 -12
- package/dist_ts/platform/storagemigration.js +6 -51
- package/dist_ts/platform/types.d.ts +2 -2
- package/dist_ts/private/canonicaljson.d.ts +9 -1
- package/dist_ts/private/canonicaljson.js +14 -2
- package/dist_ts/private/dataproperties.d.ts +62 -0
- package/dist_ts/private/dataproperties.js +117 -0
- package/dist_ts/private/networkcontract.d.ts +10 -10
- package/dist_ts/private/networkcontract.js +1 -1
- package/dist_ts/private/releaseversion.d.ts +37 -0
- package/dist_ts/private/releaseversion.js +48 -0
- package/dist_ts/private/runtimepolicy.d.ts +2 -2
- package/dist_ts/private/runtimepolicy.js +1 -1
- package/dist_ts/private/tokenlist.d.ts +9 -0
- package/dist_ts/private/tokenlist.js +23 -0
- package/dist_ts/protocol.d.ts +137 -0
- package/dist_ts/protocol.js +255 -0
- package/dist_ts/requests/admin.d.ts +8 -8
- package/dist_ts/requests/backup.d.ts +102 -112
- package/dist_ts/requests/cluster.d.ts +10 -10
- package/dist_ts/requests/clusteringress.d.ts +9 -0
- package/dist_ts/requests/clusteringress.js +1 -1
- package/dist_ts/requests/config.d.ts +3 -3
- package/dist_ts/requests/corestore.d.ts +0 -3
- package/dist_ts/requests/corestore.js +5 -9
- package/dist_ts/requests/network.d.ts +30 -30
- package/dist_ts/requests/node.d.ts +15 -28
- package/dist_ts/requests/pallet.d.ts +13 -13
- package/dist_ts/requests/runtimesession.d.ts +53 -41
- package/dist_ts/requests/secret.d.ts +4 -5
- package/dist_ts/requests/secret.js +1 -5
- package/dist_ts/runtime.corestore.d.ts +56 -74
- package/dist_ts/runtime.corestore.databaseexportpackage.d.ts +30 -36
- package/dist_ts/runtime.corestore.databaseexportpackage.golden.d.ts +11 -12
- package/dist_ts/runtime.corestore.databaseexportpackage.golden.js +54 -71
- package/dist_ts/runtime.corestore.databaseexportpackage.js +9 -25
- package/dist_ts/runtime.corestore.js +35 -135
- package/dist_ts/runtime.corestore.relay.js +2 -7
- package/dist_ts/runtime.d.ts +38 -48
- package/dist_ts/runtime.js +20 -77
- package/dist_ts/runtime.networkprojection.d.ts +4 -4
- package/dist_ts/runtime.networkprojection.js +18 -18
- package/dist_ts/runtime.workloadinit.d.ts +23 -24
- package/dist_ts/runtime.workloadinit.js +6 -13
- package/package.json +2 -2
- package/readme.md +421 -270
- package/ts/00_commitinfo_data.ts +3 -3
- package/ts/appstore/types.ts +4 -6
- package/ts/data/backup.ts +3 -38
- package/ts/data/cluster.ts +51 -34
- package/ts/data/clusteringress.ts +12 -12
- package/ts/data/clusternode.ts +204 -232
- package/ts/data/coremail.runtime.ts +4 -21
- package/ts/data/coremail.ts +3 -7
- package/ts/data/deploymentadoption.ts +46 -4
- package/ts/data/deploymentoperation.ts +16 -1
- package/ts/data/deploymentpreflight.ts +0 -2
- package/ts/data/immutableimage.ts +71 -24
- package/ts/data/index.ts +1 -1
- package/ts/data/isolatedrestore.golden.ts +5 -9
- package/ts/data/isolatedrestore.ts +339 -54
- package/ts/data/mail.ts +1 -1
- package/ts/data/networkaddressplan.ts +13 -13
- package/ts/data/networkauthority.ts +42 -46
- package/ts/data/networkcredential.ts +24 -24
- package/ts/data/networkdelivery.ts +27 -27
- package/ts/data/networklease.ts +40 -13
- package/ts/data/networknode.ts +2 -2
- package/ts/data/networkprojection.ts +119 -124
- package/ts/data/networkprotection.ts +54 -55
- package/ts/data/networkrouter.ts +14 -14
- package/ts/data/networksigning.ts +29 -32
- package/ts/data/nodecredential.ts +4 -6
- package/ts/data/nodeenrollment.ts +96 -114
- package/ts/data/privatenetwork.ts +58 -74
- package/ts/data/runtimeassignment.ts +143 -94
- package/ts/data/runtimeconfig.ts +45 -46
- package/ts/data/runtimesession.ts +185 -138
- package/ts/data/runtimeterminalreceipt.ts +72 -73
- package/ts/data/secret.ts +28 -76
- package/ts/data/servicecredential.ts +33 -43
- package/ts/data/serviceruntime.ts +11 -11
- package/ts/data/sparknodereport.ts +48 -36
- package/ts/data/webpush.ts +0 -1
- package/ts/index.ts +2 -0
- package/ts/platform/objectstorageretention.ts +36 -55
- package/ts/platform/storage.ts +1 -3
- package/ts/platform/storagemigration.golden.ts +7 -11
- package/ts/platform/storagemigration.ts +5 -55
- package/ts/platform/types.ts +2 -2
- package/ts/private/canonicaljson.ts +13 -1
- package/ts/private/dataproperties.ts +139 -0
- package/ts/private/networkcontract.ts +9 -9
- package/ts/private/releaseversion.ts +70 -0
- package/ts/private/runtimepolicy.ts +2 -2
- package/ts/private/tokenlist.ts +30 -0
- package/ts/protocol.ts +364 -0
- package/ts/requests/admin.ts +11 -11
- package/ts/requests/backup.ts +112 -117
- package/ts/requests/cluster.ts +13 -13
- package/ts/requests/clusteringress.ts +9 -0
- package/ts/requests/config.ts +3 -3
- package/ts/requests/corestore.ts +4 -16
- package/ts/requests/network.ts +40 -40
- package/ts/requests/node.ts +21 -38
- package/ts/requests/pallet.ts +17 -17
- package/ts/requests/runtimesession.ts +63 -51
- package/ts/requests/secret.ts +5 -10
- package/ts/runtime.corestore.databaseexportpackage.golden.ts +77 -95
- package/ts/runtime.corestore.databaseexportpackage.ts +51 -73
- package/ts/runtime.corestore.relay.ts +1 -10
- package/ts/runtime.corestore.ts +118 -268
- package/ts/runtime.networkprojection.ts +30 -30
- package/ts/runtime.ts +83 -158
- package/ts/runtime.workloadinit.ts +36 -48
- package/dist_ts/runtime.cloudlylegacydeploymentsettlement.d.ts +0 -902
- package/dist_ts/runtime.cloudlylegacydeploymentsettlement.golden.d.ts +0 -35
- package/dist_ts/runtime.cloudlylegacydeploymentsettlement.golden.js +0 -315
- package/dist_ts/runtime.cloudlylegacydeploymentsettlement.js +0 -3315
- package/dist_ts/runtime.cloudlylegacydeploymentsettlement.offlineexport.d.ts +0 -291
- package/dist_ts/runtime.cloudlylegacydeploymentsettlement.offlineexport.golden.d.ts +0 -30
- package/dist_ts/runtime.cloudlylegacydeploymentsettlement.offlineexport.golden.js +0 -408
- package/dist_ts/runtime.cloudlylegacydeploymentsettlement.offlineexport.js +0 -1126
- package/ts/runtime.cloudlylegacydeploymentsettlement.golden.ts +0 -421
- package/ts/runtime.cloudlylegacydeploymentsettlement.offlineexport.golden.ts +0 -510
- package/ts/runtime.cloudlylegacydeploymentsettlement.offlineexport.ts +0 -2470
- package/ts/runtime.cloudlylegacydeploymentsettlement.ts +0 -6630
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { TNodeCredentialPurpose } from './nodecredential.js';
|
|
2
|
-
export interface
|
|
2
|
+
export interface INodeEnrollmentCredentialProposal {
|
|
3
3
|
purpose: TNodeCredentialPurpose;
|
|
4
4
|
installationId: string;
|
|
5
5
|
mutationId: string;
|
|
@@ -9,8 +9,7 @@ export interface INodeEnrollmentCredentialProposalV1 {
|
|
|
9
9
|
expectedSessionEpoch: number;
|
|
10
10
|
}
|
|
11
11
|
/** Value-free, immutable proposal. Hashes are still sensitive transport fields. */
|
|
12
|
-
export interface
|
|
13
|
-
schemaVersion: 1;
|
|
12
|
+
export interface INodeEnrollment {
|
|
14
13
|
/** 32 CSPRNG bytes encoded as lowercase hexadecimal; retain across every retry. */
|
|
15
14
|
enrollmentId: string;
|
|
16
15
|
cloudlyOrigin: string;
|
|
@@ -24,23 +23,23 @@ export interface INodeEnrollmentV1 {
|
|
|
24
23
|
proofHash: string;
|
|
25
24
|
};
|
|
26
25
|
credentials: [
|
|
27
|
-
|
|
26
|
+
INodeEnrollmentCredentialProposal & {
|
|
28
27
|
purpose: 'spark';
|
|
29
28
|
},
|
|
30
|
-
|
|
29
|
+
INodeEnrollmentCredentialProposal & {
|
|
31
30
|
purpose: 'pallet';
|
|
32
31
|
}
|
|
33
32
|
];
|
|
34
33
|
}
|
|
35
|
-
export interface
|
|
36
|
-
enrollment:
|
|
34
|
+
export interface INodeEnrollmentRequest {
|
|
35
|
+
enrollment: INodeEnrollment;
|
|
37
36
|
/** Never persist on the server, log, put in URLs, or expose in transport hooks. */
|
|
38
37
|
proof: {
|
|
39
38
|
kind: 'bootstrap' | 'pending-spark';
|
|
40
39
|
bearer: string;
|
|
41
40
|
};
|
|
42
41
|
}
|
|
43
|
-
export interface
|
|
42
|
+
export interface INodeEnrollmentCredentialAcknowledgement {
|
|
44
43
|
purpose: TNodeCredentialPurpose;
|
|
45
44
|
installationId: string;
|
|
46
45
|
mutationId: string;
|
|
@@ -48,24 +47,22 @@ export interface INodeEnrollmentCredentialAcknowledgementV1 {
|
|
|
48
47
|
generation: number;
|
|
49
48
|
}
|
|
50
49
|
/** Immutable commit evidence, not authorization or workload readiness. */
|
|
51
|
-
export interface
|
|
52
|
-
schemaVersion: 1;
|
|
50
|
+
export interface INodeEnrollmentAcknowledgement {
|
|
53
51
|
enrollmentId: string;
|
|
54
52
|
cloudlyOrigin: string;
|
|
55
53
|
nodeId: string;
|
|
56
54
|
requestDigest: string;
|
|
57
55
|
credentials: [
|
|
58
|
-
|
|
56
|
+
INodeEnrollmentCredentialAcknowledgement & {
|
|
59
57
|
purpose: 'spark';
|
|
60
58
|
},
|
|
61
|
-
|
|
59
|
+
INodeEnrollmentCredentialAcknowledgement & {
|
|
62
60
|
purpose: 'pallet';
|
|
63
61
|
}
|
|
64
62
|
];
|
|
65
63
|
}
|
|
66
64
|
/** Returned only after current Spark authentication and proof that Pallet is absent. */
|
|
67
|
-
export interface
|
|
68
|
-
schemaVersion: 1;
|
|
65
|
+
export interface INodeEnrollmentState {
|
|
69
66
|
nodeId: string;
|
|
70
67
|
spark: {
|
|
71
68
|
generation: number;
|
|
@@ -74,8 +71,7 @@ export interface INodeEnrollmentStateV1 {
|
|
|
74
71
|
pallet: 'absent';
|
|
75
72
|
}
|
|
76
73
|
/** Root-authenticated, node-local IPC only. Initial Pallet authority is always absent. */
|
|
77
|
-
export interface
|
|
78
|
-
schemaVersion: 1;
|
|
74
|
+
export interface IPalletNodeEnrollmentPreparation {
|
|
79
75
|
purpose: 'pallet';
|
|
80
76
|
installationId: string;
|
|
81
77
|
mutationId: string;
|
|
@@ -83,70 +79,69 @@ export interface IPalletNodeEnrollmentPreparationV1 {
|
|
|
83
79
|
nodeId: string | null;
|
|
84
80
|
}
|
|
85
81
|
/** Full exact activation wire body; Cloudly authentication remains the coordinator's responsibility. */
|
|
86
|
-
export interface
|
|
87
|
-
enrollment:
|
|
88
|
-
acknowledgement:
|
|
82
|
+
export interface IPalletNodeEnrollmentActivation {
|
|
83
|
+
enrollment: INodeEnrollment;
|
|
84
|
+
acknowledgement: INodeEnrollmentAcknowledgement;
|
|
89
85
|
}
|
|
90
|
-
interface
|
|
91
|
-
schemaVersion: 1;
|
|
86
|
+
interface IPalletNodeEnrollmentConfirmationBase {
|
|
92
87
|
purpose: 'pallet';
|
|
93
88
|
enrollmentId: string;
|
|
94
89
|
cloudlyOrigin: string;
|
|
95
90
|
requestDigest: string;
|
|
96
91
|
}
|
|
97
92
|
/** The exact pending binding is durable now, not merely a historical receipt. */
|
|
98
|
-
export interface
|
|
93
|
+
export interface IPalletNodeEnrollmentBound extends IPalletNodeEnrollmentConfirmationBase {
|
|
99
94
|
phase: 'bound';
|
|
100
95
|
/** Null before Cloudly assigns a fresh Jump node; exact existing node for adoption. */
|
|
101
96
|
nodeId: string | null;
|
|
102
97
|
}
|
|
103
98
|
/** Exact CURRENT local Pallet identity, not Spark activation or remote authorization. */
|
|
104
|
-
export interface
|
|
99
|
+
export interface IPalletNodeEnrollmentActive extends IPalletNodeEnrollmentConfirmationBase {
|
|
105
100
|
phase: 'active';
|
|
106
101
|
nodeId: string;
|
|
107
102
|
}
|
|
108
|
-
export type
|
|
103
|
+
export type TPalletNodeEnrollmentConfirmation = IPalletNodeEnrollmentBound | IPalletNodeEnrollmentActive;
|
|
109
104
|
/** Wire bounds, not a listener, permission check, timeout implementation or storage API. */
|
|
110
|
-
export declare const
|
|
105
|
+
export declare const palletNodeEnrollmentContract: Readonly<{
|
|
111
106
|
readonly socketPath: "/run/serve.zone/pallet/control.sock";
|
|
112
107
|
readonly frame: "u32be-length-prefixed-utf8-json-then-write-half-close";
|
|
113
108
|
readonly requestsPerConnection: 1;
|
|
114
109
|
readonly maxRequestBytes: 32768;
|
|
115
110
|
readonly maxResponseBytes: 16384;
|
|
116
111
|
}>;
|
|
117
|
-
export declare const
|
|
118
|
-
readonly digestDomain: "serve.zone/node-enrollment
|
|
112
|
+
export declare const nodeEnrollmentContract: Readonly<{
|
|
113
|
+
readonly digestDomain: "serve.zone/node-enrollment";
|
|
119
114
|
readonly localActivation: "independently-durable-convergence";
|
|
120
115
|
readonly bootstrapProof: "first-commit-only";
|
|
121
116
|
readonly pendingSparkProof: "committed-exact-receipt-only";
|
|
122
117
|
}>;
|
|
123
118
|
/** Detached frozen snapshot, captured synchronously before hashing or other awaits. */
|
|
124
|
-
export declare const
|
|
125
|
-
export declare const
|
|
126
|
-
export declare const
|
|
119
|
+
export declare const snapshotNodeEnrollment: (valueArg: unknown) => INodeEnrollment;
|
|
120
|
+
export declare const computeNodeEnrollmentDigest: (valueArg: INodeEnrollment) => Promise<string>;
|
|
121
|
+
export declare const snapshotNodeEnrollmentRequest: (valueArg: unknown) => INodeEnrollmentRequest;
|
|
127
122
|
/**
|
|
128
123
|
* Pure proof binding/mode check only, NOT authentication. The server must derive
|
|
129
124
|
* receiptState from its owned transaction, compare the complete stored proposal,
|
|
130
125
|
* and fence current Jump/Spark/Pallet authority before any commit or replay.
|
|
131
126
|
*/
|
|
132
|
-
export declare const
|
|
133
|
-
export declare const
|
|
127
|
+
export declare const verifyNodeEnrollmentProof: (valueArg: INodeEnrollmentRequest, receiptStateArg: "absent" | "committed") => Promise<boolean>;
|
|
128
|
+
export declare const snapshotNodeEnrollmentAcknowledgement: (valueArg: unknown) => INodeEnrollmentAcknowledgement;
|
|
134
129
|
/** Content binding only. Authenticate Cloudly first; persist only the returned snapshot. */
|
|
135
|
-
export declare const
|
|
136
|
-
export declare const
|
|
130
|
+
export declare const bindNodeEnrollmentAcknowledgement: (enrollmentArg: INodeEnrollment, acknowledgementArg: INodeEnrollmentAcknowledgement) => Promise<INodeEnrollmentAcknowledgement>;
|
|
131
|
+
export declare const snapshotNodeEnrollmentState: (valueArg: unknown) => INodeEnrollmentState;
|
|
137
132
|
/** Decoded JSON/data records only, captured synchronously; never invokes getters. */
|
|
138
|
-
export declare const
|
|
133
|
+
export declare const snapshotPalletNodeEnrollmentPreparation: (valueArg: unknown) => IPalletNodeEnrollmentPreparation;
|
|
139
134
|
/** Content binding only. Authenticate the local Pallet transport before trusting this proposal. */
|
|
140
|
-
export declare const
|
|
135
|
+
export declare const bindPalletNodeEnrollmentPreparation: (preparationArg: IPalletNodeEnrollmentPreparation, proposalArg: unknown) => INodeEnrollment["credentials"][1];
|
|
141
136
|
/** Capture the exact wrapper and both nested values before any asynchronous content binding. */
|
|
142
|
-
export declare const
|
|
143
|
-
export declare const
|
|
137
|
+
export declare const snapshotPalletNodeEnrollmentActivation: (valueArg: unknown) => IPalletNodeEnrollmentActivation;
|
|
138
|
+
export declare const snapshotPalletNodeEnrollmentConfirmation: (valueArg: unknown) => TPalletNodeEnrollmentConfirmation;
|
|
144
139
|
/** Pure binding only. Pallet must prove its durable pending binding before issuing this response. */
|
|
145
|
-
export declare const
|
|
140
|
+
export declare const bindPalletNodeEnrollmentBound: (enrollmentArg: INodeEnrollment, confirmationArg: IPalletNodeEnrollmentBound) => Promise<IPalletNodeEnrollmentBound>;
|
|
146
141
|
/**
|
|
147
142
|
* Pure binding only, NOT authentication or a database check. The root-authenticated
|
|
148
143
|
* Pallet owner must first prove its exact CURRENT local identity, not just a receipt.
|
|
149
144
|
* This does not assert Spark activation, current Cloudly authority or workload readiness.
|
|
150
145
|
*/
|
|
151
|
-
export declare const
|
|
146
|
+
export declare const bindPalletNodeEnrollmentActive: (activationArg: IPalletNodeEnrollmentActivation, confirmationArg: IPalletNodeEnrollmentActive) => Promise<IPalletNodeEnrollmentActive>;
|
|
152
147
|
export {};
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { canonicalizeStrictJson, createCanonicalJsonSha256Hex, createSha256Hex, deepFreezeValue, } from '../private/canonicaljson.js';
|
|
2
|
+
import { readDataElements, readDataProperty, readExactDataRecord, } from '../private/dataproperties.js';
|
|
2
3
|
/** Wire bounds, not a listener, permission check, timeout implementation or storage API. */
|
|
3
|
-
export const
|
|
4
|
+
export const palletNodeEnrollmentContract = Object.freeze({
|
|
4
5
|
socketPath: '/run/serve.zone/pallet/control.sock',
|
|
5
6
|
frame: 'u32be-length-prefixed-utf8-json-then-write-half-close',
|
|
6
7
|
requestsPerConnection: 1,
|
|
7
8
|
maxRequestBytes: 32768,
|
|
8
9
|
maxResponseBytes: 16384,
|
|
9
10
|
});
|
|
10
|
-
export const
|
|
11
|
-
digestDomain: 'serve.zone/node-enrollment
|
|
11
|
+
export const nodeEnrollmentContract = Object.freeze({
|
|
12
|
+
digestDomain: 'serve.zone/node-enrollment',
|
|
12
13
|
localActivation: 'independently-durable-convergence',
|
|
13
14
|
bootstrapProof: 'first-commit-only',
|
|
14
15
|
pendingSparkProof: 'committed-exact-receipt-only',
|
|
@@ -18,30 +19,17 @@ function requireValue(valueArg) {
|
|
|
18
19
|
if (!valueArg)
|
|
19
20
|
fail();
|
|
20
21
|
}
|
|
21
|
-
/**
|
|
22
|
+
/** Exactly this shape's keys, read once as data; an accessor is refused, never invoked. */
|
|
22
23
|
const record = (valueArg, keysArg) => {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
requireValue(prototype === Object.prototype || prototype === null);
|
|
26
|
-
const keys = Reflect.ownKeys(valueArg);
|
|
27
|
-
requireValue(keys.length === keysArg.length);
|
|
28
|
-
const snapshot = Object.create(null);
|
|
29
|
-
for (const key of keys) {
|
|
30
|
-
requireValue(typeof key === 'string' && keysArg.includes(key));
|
|
31
|
-
const descriptor = Object.getOwnPropertyDescriptor(valueArg, key);
|
|
32
|
-
requireValue(descriptor?.enumerable && Object.hasOwn(descriptor, 'value'));
|
|
33
|
-
snapshot[key] = descriptor.value;
|
|
34
|
-
}
|
|
24
|
+
const snapshot = readExactDataRecord(valueArg, keysArg);
|
|
25
|
+
requireValue(snapshot !== null);
|
|
35
26
|
return snapshot;
|
|
36
27
|
};
|
|
28
|
+
/** The dense two-element credential tuple, read the same way as a record. */
|
|
37
29
|
const pair = (valueArg) => {
|
|
38
|
-
|
|
39
|
-
requireValue(
|
|
40
|
-
|
|
41
|
-
const second = Object.getOwnPropertyDescriptor(valueArg, '1');
|
|
42
|
-
requireValue(first?.enumerable && Object.hasOwn(first, 'value'));
|
|
43
|
-
requireValue(second?.enumerable && Object.hasOwn(second, 'value'));
|
|
44
|
-
return [first.value, second.value];
|
|
30
|
+
const elements = readDataElements(valueArg, 2);
|
|
31
|
+
requireValue(elements !== null && elements.length === 2);
|
|
32
|
+
return [elements[0], elements[1]];
|
|
45
33
|
};
|
|
46
34
|
const id = (valueArg) => {
|
|
47
35
|
requireValue(typeof valueArg === 'string' && /^[A-Za-z0-9_-]{1,128}$/.test(valueArg));
|
|
@@ -87,14 +75,12 @@ const distinctOwners = (sparkArg, palletArg) => {
|
|
|
87
75
|
&& sparkArg.mutationId !== palletArg.mutationId && sparkArg.tokenHash !== palletArg.tokenHash);
|
|
88
76
|
};
|
|
89
77
|
/** Detached frozen snapshot, captured synchronously before hashing or other awaits. */
|
|
90
|
-
export const
|
|
91
|
-
const value = record(valueArg, ['
|
|
78
|
+
export const snapshotNodeEnrollment = (valueArg) => {
|
|
79
|
+
const value = record(valueArg, ['enrollmentId', 'cloudlyOrigin', 'hostname',
|
|
92
80
|
'bootstrap', 'credentials']);
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
requireValue(
|
|
96
|
-
const kind = Object.getOwnPropertyDescriptor(value.bootstrap, 'kind');
|
|
97
|
-
requireValue(kind && Object.hasOwn(kind, 'value'));
|
|
81
|
+
// Read the discriminant as data, never through an input getter.
|
|
82
|
+
const kind = readDataProperty(value.bootstrap, 'kind');
|
|
83
|
+
requireValue(kind !== null);
|
|
98
84
|
const bootstrap = record(value.bootstrap, kind.value === 'jump'
|
|
99
85
|
? ['kind', 'proofHash'] : ['kind', 'nodeId', 'proofHash']);
|
|
100
86
|
requireValue(bootstrap.kind === 'jump' || bootstrap.kind === 'adopt-existing');
|
|
@@ -106,22 +92,22 @@ export const snapshotNodeEnrollmentV1 = (valueArg) => {
|
|
|
106
92
|
requireValue(bootstrap.kind === 'jump'
|
|
107
93
|
? spark.expectedGeneration === 0 && spark.expectedSessionEpoch === 0
|
|
108
94
|
: spark.expectedGeneration > 0);
|
|
109
|
-
return deepFreezeValue({
|
|
95
|
+
return deepFreezeValue({ enrollmentId: hash(value.enrollmentId),
|
|
110
96
|
cloudlyOrigin: origin(value.cloudlyOrigin), hostname: hostname(value.hostname),
|
|
111
97
|
bootstrap: bootstrap.kind === 'jump'
|
|
112
98
|
? { kind: 'jump', proofHash: hash(bootstrap.proofHash) }
|
|
113
99
|
: { kind: 'adopt-existing', nodeId: id(bootstrap.nodeId), proofHash: hash(bootstrap.proofHash) },
|
|
114
100
|
credentials: [spark, pallet] });
|
|
115
101
|
};
|
|
116
|
-
export const
|
|
117
|
-
const payload =
|
|
102
|
+
export const computeNodeEnrollmentDigest = async (valueArg) => {
|
|
103
|
+
const payload = snapshotNodeEnrollment(valueArg);
|
|
118
104
|
return createCanonicalJsonSha256Hex(canonicalizeStrictJson({
|
|
119
|
-
domain:
|
|
105
|
+
domain: nodeEnrollmentContract.digestDomain, payload,
|
|
120
106
|
}, fail), fail);
|
|
121
107
|
};
|
|
122
|
-
export const
|
|
108
|
+
export const snapshotNodeEnrollmentRequest = (valueArg) => {
|
|
123
109
|
const value = record(valueArg, ['enrollment', 'proof']);
|
|
124
|
-
const enrollment =
|
|
110
|
+
const enrollment = snapshotNodeEnrollment(value.enrollment);
|
|
125
111
|
const proof = record(value.proof, ['kind', 'bearer']);
|
|
126
112
|
requireValue(proof.kind === 'bootstrap' || proof.kind === 'pending-spark');
|
|
127
113
|
requireValue(typeof proof.bearer === 'string');
|
|
@@ -134,9 +120,9 @@ export const snapshotNodeEnrollmentRequestV1 = (valueArg) => {
|
|
|
134
120
|
* receiptState from its owned transaction, compare the complete stored proposal,
|
|
135
121
|
* and fence current Jump/Spark/Pallet authority before any commit or replay.
|
|
136
122
|
*/
|
|
137
|
-
export const
|
|
123
|
+
export const verifyNodeEnrollmentProof = async (valueArg, receiptStateArg) => {
|
|
138
124
|
try {
|
|
139
|
-
const { enrollment, proof } =
|
|
125
|
+
const { enrollment, proof } = snapshotNodeEnrollmentRequest(valueArg);
|
|
140
126
|
if (!(proof.kind === 'bootstrap' && receiptStateArg === 'absent')
|
|
141
127
|
&& !(proof.kind === 'pending-spark' && receiptStateArg === 'committed'))
|
|
142
128
|
return false;
|
|
@@ -155,23 +141,22 @@ const credentialAcknowledgement = (valueArg, purposeArg) => {
|
|
|
155
141
|
return { purpose: purposeArg, installationId: id(value.installationId), mutationId: id(value.mutationId),
|
|
156
142
|
tokenHash: hash(value.tokenHash), generation: counter(value.generation, 1) };
|
|
157
143
|
};
|
|
158
|
-
export const
|
|
159
|
-
const value = record(valueArg, ['
|
|
144
|
+
export const snapshotNodeEnrollmentAcknowledgement = (valueArg) => {
|
|
145
|
+
const value = record(valueArg, ['enrollmentId', 'cloudlyOrigin', 'nodeId',
|
|
160
146
|
'requestDigest', 'credentials']);
|
|
161
|
-
requireValue(value.schemaVersion === 1);
|
|
162
147
|
const [sparkInput, palletInput] = pair(value.credentials);
|
|
163
148
|
const spark = credentialAcknowledgement(sparkInput, 'spark');
|
|
164
149
|
const pallet = credentialAcknowledgement(palletInput, 'pallet');
|
|
165
150
|
distinctOwners(spark, pallet);
|
|
166
151
|
requireValue(pallet.generation === 1);
|
|
167
|
-
return deepFreezeValue({
|
|
152
|
+
return deepFreezeValue({ enrollmentId: hash(value.enrollmentId),
|
|
168
153
|
cloudlyOrigin: origin(value.cloudlyOrigin), nodeId: id(value.nodeId),
|
|
169
154
|
requestDigest: hash(value.requestDigest), credentials: [spark, pallet] });
|
|
170
155
|
};
|
|
171
156
|
/** Content binding only. Authenticate Cloudly first; persist only the returned snapshot. */
|
|
172
|
-
export const
|
|
173
|
-
const enrollment =
|
|
174
|
-
const ack =
|
|
157
|
+
export const bindNodeEnrollmentAcknowledgement = async (enrollmentArg, acknowledgementArg) => {
|
|
158
|
+
const enrollment = snapshotNodeEnrollment(enrollmentArg);
|
|
159
|
+
const ack = snapshotNodeEnrollmentAcknowledgement(acknowledgementArg);
|
|
175
160
|
requireValue(ack.enrollmentId === enrollment.enrollmentId && ack.cloudlyOrigin === enrollment.cloudlyOrigin
|
|
176
161
|
&& (enrollment.bootstrap.kind === 'jump' || ack.nodeId === enrollment.bootstrap.nodeId));
|
|
177
162
|
for (const index of [0, 1]) {
|
|
@@ -181,28 +166,28 @@ export const bindNodeEnrollmentAcknowledgementV1 = async (enrollmentArg, acknowl
|
|
|
181
166
|
&& actual.mutationId === expected.mutationId && actual.tokenHash === expected.tokenHash
|
|
182
167
|
&& actual.generation === expected.expectedGeneration + 1);
|
|
183
168
|
}
|
|
184
|
-
requireValue(ack.requestDigest === await
|
|
169
|
+
requireValue(ack.requestDigest === await computeNodeEnrollmentDigest(enrollment));
|
|
185
170
|
return ack;
|
|
186
171
|
};
|
|
187
|
-
export const
|
|
188
|
-
const value = record(valueArg, ['
|
|
189
|
-
requireValue(value.
|
|
172
|
+
export const snapshotNodeEnrollmentState = (valueArg) => {
|
|
173
|
+
const value = record(valueArg, ['nodeId', 'spark', 'pallet']);
|
|
174
|
+
requireValue(value.pallet === 'absent');
|
|
190
175
|
const spark = record(value.spark, ['generation', 'sessionEpoch']);
|
|
191
|
-
return deepFreezeValue({
|
|
176
|
+
return deepFreezeValue({ nodeId: id(value.nodeId), pallet: 'absent',
|
|
192
177
|
spark: { generation: counter(spark.generation, 1, true), sessionEpoch: counter(spark.sessionEpoch, 0, true) } });
|
|
193
178
|
};
|
|
194
179
|
/** Decoded JSON/data records only, captured synchronously; never invokes getters. */
|
|
195
|
-
export const
|
|
196
|
-
const value = record(valueArg, ['
|
|
180
|
+
export const snapshotPalletNodeEnrollmentPreparation = (valueArg) => {
|
|
181
|
+
const value = record(valueArg, ['purpose', 'installationId', 'mutationId',
|
|
197
182
|
'cloudlyOrigin', 'nodeId']);
|
|
198
|
-
requireValue(value.
|
|
199
|
-
return deepFreezeValue({
|
|
183
|
+
requireValue(value.purpose === 'pallet');
|
|
184
|
+
return deepFreezeValue({ purpose: 'pallet',
|
|
200
185
|
installationId: id(value.installationId), mutationId: id(value.mutationId),
|
|
201
186
|
cloudlyOrigin: origin(value.cloudlyOrigin), nodeId: value.nodeId === null ? null : id(value.nodeId) });
|
|
202
187
|
};
|
|
203
188
|
/** Content binding only. Authenticate the local Pallet transport before trusting this proposal. */
|
|
204
|
-
export const
|
|
205
|
-
const preparation =
|
|
189
|
+
export const bindPalletNodeEnrollmentPreparation = (preparationArg, proposalArg) => {
|
|
190
|
+
const preparation = snapshotPalletNodeEnrollmentPreparation(preparationArg);
|
|
206
191
|
const result = proposal(proposalArg, 'pallet');
|
|
207
192
|
requireValue(result.installationId === preparation.installationId
|
|
208
193
|
&& result.mutationId === preparation.mutationId
|
|
@@ -210,17 +195,17 @@ export const bindPalletNodeEnrollmentPreparationV1 = (preparationArg, proposalAr
|
|
|
210
195
|
return deepFreezeValue(result);
|
|
211
196
|
};
|
|
212
197
|
/** Capture the exact wrapper and both nested values before any asynchronous content binding. */
|
|
213
|
-
export const
|
|
198
|
+
export const snapshotPalletNodeEnrollmentActivation = (valueArg) => {
|
|
214
199
|
const value = record(valueArg, ['enrollment', 'acknowledgement']);
|
|
215
|
-
return deepFreezeValue({ enrollment:
|
|
216
|
-
acknowledgement:
|
|
200
|
+
return deepFreezeValue({ enrollment: snapshotNodeEnrollment(value.enrollment),
|
|
201
|
+
acknowledgement: snapshotNodeEnrollmentAcknowledgement(value.acknowledgement) });
|
|
217
202
|
};
|
|
218
|
-
export const
|
|
219
|
-
const value = record(valueArg, ['
|
|
203
|
+
export const snapshotPalletNodeEnrollmentConfirmation = (valueArg) => {
|
|
204
|
+
const value = record(valueArg, ['purpose', 'enrollmentId', 'cloudlyOrigin',
|
|
220
205
|
'requestDigest', 'phase', 'nodeId']);
|
|
221
|
-
requireValue(value.
|
|
206
|
+
requireValue(value.purpose === 'pallet'
|
|
222
207
|
&& (value.phase === 'bound' || value.phase === 'active'));
|
|
223
|
-
const common = {
|
|
208
|
+
const common = { purpose: 'pallet',
|
|
224
209
|
enrollmentId: hash(value.enrollmentId), cloudlyOrigin: origin(value.cloudlyOrigin),
|
|
225
210
|
requestDigest: hash(value.requestDigest) };
|
|
226
211
|
return deepFreezeValue(value.phase === 'bound'
|
|
@@ -228,13 +213,13 @@ export const snapshotPalletNodeEnrollmentConfirmationV1 = (valueArg) => {
|
|
|
228
213
|
: { ...common, phase: 'active', nodeId: id(value.nodeId) });
|
|
229
214
|
};
|
|
230
215
|
/** Pure binding only. Pallet must prove its durable pending binding before issuing this response. */
|
|
231
|
-
export const
|
|
232
|
-
const enrollment =
|
|
233
|
-
const confirmation =
|
|
216
|
+
export const bindPalletNodeEnrollmentBound = async (enrollmentArg, confirmationArg) => {
|
|
217
|
+
const enrollment = snapshotNodeEnrollment(enrollmentArg);
|
|
218
|
+
const confirmation = snapshotPalletNodeEnrollmentConfirmation(confirmationArg);
|
|
234
219
|
requireValue(confirmation.phase === 'bound' && confirmation.enrollmentId === enrollment.enrollmentId
|
|
235
220
|
&& confirmation.cloudlyOrigin === enrollment.cloudlyOrigin
|
|
236
221
|
&& confirmation.nodeId === (enrollment.bootstrap.kind === 'jump' ? null : enrollment.bootstrap.nodeId));
|
|
237
|
-
requireValue(confirmation.requestDigest === await
|
|
222
|
+
requireValue(confirmation.requestDigest === await computeNodeEnrollmentDigest(enrollment));
|
|
238
223
|
return confirmation;
|
|
239
224
|
};
|
|
240
225
|
/**
|
|
@@ -242,14 +227,14 @@ export const bindPalletNodeEnrollmentBoundV1 = async (enrollmentArg, confirmatio
|
|
|
242
227
|
* Pallet owner must first prove its exact CURRENT local identity, not just a receipt.
|
|
243
228
|
* This does not assert Spark activation, current Cloudly authority or workload readiness.
|
|
244
229
|
*/
|
|
245
|
-
export const
|
|
230
|
+
export const bindPalletNodeEnrollmentActive = async (activationArg, confirmationArg) => {
|
|
246
231
|
// Capture every caller-owned value before the asynchronous shared acknowledgement binder.
|
|
247
|
-
const { enrollment, acknowledgement } =
|
|
248
|
-
const confirmation =
|
|
232
|
+
const { enrollment, acknowledgement } = snapshotPalletNodeEnrollmentActivation(activationArg);
|
|
233
|
+
const confirmation = snapshotPalletNodeEnrollmentConfirmation(confirmationArg);
|
|
249
234
|
requireValue(confirmation.phase === 'active');
|
|
250
|
-
const ack = await
|
|
235
|
+
const ack = await bindNodeEnrollmentAcknowledgement(enrollment, acknowledgement);
|
|
251
236
|
requireValue(confirmation.enrollmentId === ack.enrollmentId && confirmation.cloudlyOrigin === ack.cloudlyOrigin
|
|
252
237
|
&& confirmation.nodeId === ack.nodeId && confirmation.requestDigest === ack.requestDigest);
|
|
253
238
|
return confirmation;
|
|
254
239
|
};
|
|
255
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZWVucm9sbG1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL25vZGVlbnJvbGxtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsNEJBQTRCLEVBQzVCLGVBQWUsRUFDZixlQUFlLEdBQ2hCLE1BQU0sNkJBQTZCLENBQUM7QUF1R3JDLDRGQUE0RjtBQUM1RixNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzFELFVBQVUsRUFBRSxxQ0FBcUM7SUFDakQsS0FBSyxFQUFFLHVEQUF1RDtJQUM5RCxxQkFBcUIsRUFBRSxDQUFDO0lBQ3hCLGVBQWUsRUFBRSxLQUFLO0lBQ3RCLGdCQUFnQixFQUFFLEtBQUs7Q0FDZixDQUFDLENBQUM7QUFFWixNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3BELFlBQVksRUFBRSwrQkFBK0I7SUFDN0MsZUFBZSxFQUFFLG1DQUFtQztJQUNwRCxjQUFjLEVBQUUsbUJBQW1CO0lBQ25DLGlCQUFpQixFQUFFLDhCQUE4QjtDQUN6QyxDQUFDLENBQUM7QUFFWixNQUFNLElBQUksR0FBRyxHQUFVLEVBQUUsR0FBRyxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckYsU0FBUyxZQUFZLENBQUMsUUFBaUI7SUFDckMsSUFBSSxDQUFDLFFBQVE7UUFBRSxJQUFJLEVBQUUsQ0FBQztBQUN4QixDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLE1BQU0sTUFBTSxHQUFHLENBQUMsUUFBaUIsRUFBRSxPQUEwQixFQUEyQixFQUFFO0lBQ3hGLFlBQVksQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJ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
|
|
240
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZWVucm9sbG1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL25vZGVlbnJvbGxtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsNEJBQTRCLEVBQzVCLGVBQWUsRUFDZixlQUFlLEdBQ2hCLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUNMLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixHQUN4RCxNQUFNLDhCQUE4QixDQUFDO0FBa0d0Qyw0RkFBNEY7QUFDNUYsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUN4RCxVQUFVLEVBQUUscUNBQXFDO0lBQ2pELEtBQUssRUFBRSx1REFBdUQ7SUFDOUQscUJBQXFCLEVBQUUsQ0FBQztJQUN4QixlQUFlLEVBQUUsS0FBSztJQUN0QixnQkFBZ0IsRUFBRSxLQUFLO0NBQ2YsQ0FBQyxDQUFDO0FBRVosTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNsRCxZQUFZLEVBQUUsNEJBQTRCO0lBQzFDLGVBQWUsRUFBRSxtQ0FBbUM7SUFDcEQsY0FBYyxFQUFFLG1CQUFtQjtJQUNuQyxpQkFBaUIsRUFBRSw4QkFBOEI7Q0FDekMsQ0FBQyxDQUFDO0FBRVosTUFBTSxJQUFJLEdBQUcsR0FBVSxFQUFFLEdBQUcsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JGLFNBQVMsWUFBWSxDQUFDLFFBQWlCO0lBQ3JDLElBQUksQ0FBQyxRQUFRO1FBQUUsSUFBSSxFQUFFLENBQUM7QUFDeEIsQ0FBQztBQUVELDJGQUEyRjtBQUMzRixNQUFNLE1BQU0sR0FBRyxDQUFDLFFBQWlCLEVBQUUsT0FBMEIsRUFBMkIsRUFBRTtJQUN4RixNQUFNLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxRQUFR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
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Cloudly owns these definitions. Membership never follows node placement. */
|
|
2
|
-
export interface
|
|
2
|
+
export interface IPrivateNetworkPolicy {
|
|
3
3
|
connectivity: 'member-full-mesh';
|
|
4
4
|
/** null denies external resolution; private names are never forwarded. */
|
|
5
5
|
externalDns: {
|
|
@@ -12,8 +12,7 @@ export interface IPrivateNetworkPolicyV1 {
|
|
|
12
12
|
permittedSuffixes: string[];
|
|
13
13
|
} | null;
|
|
14
14
|
}
|
|
15
|
-
export interface
|
|
16
|
-
schemaVersion: 1;
|
|
15
|
+
export interface IPrivateNetwork {
|
|
17
16
|
id: string;
|
|
18
17
|
organizationId: string;
|
|
19
18
|
/** Immutable server-owned keys; display-name changes do not rename DNS. */
|
|
@@ -22,43 +21,41 @@ export interface IPrivateNetworkV1 {
|
|
|
22
21
|
name: string;
|
|
23
22
|
revision: number;
|
|
24
23
|
state: 'active' | 'retiring' | 'retired';
|
|
25
|
-
policy:
|
|
24
|
+
policy: IPrivateNetworkPolicy;
|
|
26
25
|
createdAt: number;
|
|
27
26
|
updatedAt: number;
|
|
28
27
|
}
|
|
29
|
-
export interface
|
|
28
|
+
export interface IPrivateNetworkAttachment {
|
|
30
29
|
networkId: string;
|
|
31
30
|
/** Sorted unique single-label aliases, reserved per network for this service. */
|
|
32
31
|
aliases: string[];
|
|
33
32
|
}
|
|
34
33
|
/** Desired membership only. Acceptance is neither packet enforcement nor DNS readiness. */
|
|
35
|
-
export interface
|
|
36
|
-
schemaVersion: 1;
|
|
34
|
+
export interface IServicePrivateNetworks {
|
|
37
35
|
organizationId: string;
|
|
38
36
|
serviceId: string;
|
|
39
37
|
revision: number;
|
|
40
38
|
/** Sorted by networkId; every network must have the same canonical organization. */
|
|
41
|
-
attachments:
|
|
39
|
+
attachments: IPrivateNetworkAttachment[];
|
|
42
40
|
/** Exactly the sole attachment, or explicit selection/null when several exist. */
|
|
43
41
|
defaultNetworkId: string | null;
|
|
44
42
|
}
|
|
45
|
-
interface
|
|
46
|
-
schemaVersion: 1;
|
|
43
|
+
interface IPrivateNetworkMutationBase {
|
|
47
44
|
organizationId: string;
|
|
48
45
|
/** Retain the exact body and this identifier across retries. */
|
|
49
46
|
mutationId: string;
|
|
50
47
|
}
|
|
51
|
-
export type
|
|
48
|
+
export type TPrivateNetworkMutation = IPrivateNetworkMutationBase & ({
|
|
52
49
|
operation: 'create';
|
|
53
50
|
expectedRevision: null;
|
|
54
51
|
name: string;
|
|
55
|
-
policy:
|
|
52
|
+
policy: IPrivateNetworkPolicy;
|
|
56
53
|
} | {
|
|
57
54
|
operation: 'update';
|
|
58
55
|
networkId: string;
|
|
59
56
|
expectedRevision: number;
|
|
60
57
|
name: string;
|
|
61
|
-
policy:
|
|
58
|
+
policy: IPrivateNetworkPolicy;
|
|
62
59
|
}
|
|
63
60
|
/** Retirement completes only after outstanding grants are denied or independently fenced. */
|
|
64
61
|
| {
|
|
@@ -66,14 +63,14 @@ export type TPrivateNetworkMutationV1 = IPrivateNetworkMutationBaseV1 & ({
|
|
|
66
63
|
networkId: string;
|
|
67
64
|
expectedRevision: number;
|
|
68
65
|
});
|
|
69
|
-
export interface
|
|
66
|
+
export interface ISetServicePrivateNetworks extends IPrivateNetworkMutationBase {
|
|
70
67
|
serviceId: string;
|
|
71
68
|
/** null means the service has never had a membership document; not an empty list. */
|
|
72
69
|
expectedRevision: number | null;
|
|
73
|
-
attachments:
|
|
70
|
+
attachments: IPrivateNetworkAttachment[];
|
|
74
71
|
defaultNetworkId: string | null;
|
|
75
72
|
}
|
|
76
|
-
export declare const
|
|
73
|
+
export declare const privateNetworkContract: Readonly<{
|
|
77
74
|
readonly privateRoot: "internal.";
|
|
78
75
|
readonly maximumAttachments: 16;
|
|
79
76
|
readonly maximumAliasesPerAttachment: 32;
|
|
@@ -86,14 +83,14 @@ export declare const privateNetworkV1Contract: Readonly<{
|
|
|
86
83
|
readonly omission: "no-effect";
|
|
87
84
|
}>;
|
|
88
85
|
/** Structural validation only; backend IP ownership/reachability and policy fences are required. */
|
|
89
|
-
export declare const
|
|
90
|
-
export declare const
|
|
91
|
-
export declare const
|
|
92
|
-
export declare const
|
|
93
|
-
export declare const
|
|
86
|
+
export declare const snapshotPrivateNetworkPolicy: (value: unknown) => IPrivateNetworkPolicy;
|
|
87
|
+
export declare const snapshotPrivateNetwork: (value: unknown) => IPrivateNetwork;
|
|
88
|
+
export declare const snapshotServicePrivateNetworks: (value: unknown) => IServicePrivateNetworks;
|
|
89
|
+
export declare const snapshotSetServicePrivateNetworks: (value: unknown) => ISetServicePrivateNetworks;
|
|
90
|
+
export declare const snapshotPrivateNetworkMutation: (value: unknown) => TPrivateNetworkMutation;
|
|
94
91
|
/** Pure naming helper; it does not reserve a name or create any public DNS/ingress record. */
|
|
95
|
-
export declare const
|
|
96
|
-
export interface
|
|
92
|
+
export declare const buildPrivateNetworkFqdn: (networkValue: unknown, aliasValue: unknown) => string;
|
|
93
|
+
export interface IServicePrivateNetworkDnsPolicy {
|
|
97
94
|
organizationId: string;
|
|
98
95
|
serviceId: string;
|
|
99
96
|
membershipRevision: number;
|
|
@@ -120,5 +117,5 @@ export interface IServicePrivateNetworkDnsPolicyV1 {
|
|
|
120
117
|
* The caller must fence these exact revisions before issuing runtime authority.
|
|
121
118
|
* An inactive/missing/extra network is rejected, never silently omitted.
|
|
122
119
|
*/
|
|
123
|
-
export declare const
|
|
120
|
+
export declare const composeServicePrivateNetworkDnsPolicy: (membershipValue: unknown, networksValue: unknown) => IServicePrivateNetworkDnsPolicy;
|
|
124
121
|
export {};
|