@serve.zone/interfaces 31.7.0 → 31.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 +77 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/data/clusterruntime.d.ts +39 -0
- package/dist_ts/data/clusterruntime.js +11 -0
- package/dist_ts/data/index.d.ts +5 -0
- package/dist_ts/data/index.js +6 -1
- package/dist_ts/data/networkaddressplan.d.ts +78 -0
- package/dist_ts/data/networkaddressplan.js +114 -0
- package/dist_ts/data/networkauthority.js +5 -17
- package/dist_ts/data/networkcredential.d.ts +10 -4
- package/dist_ts/data/networkcredential.js +14 -8
- package/dist_ts/data/networkdelivery.d.ts +21 -0
- package/dist_ts/data/networkdelivery.js +35 -7
- package/dist_ts/data/networklease.d.ts +110 -0
- package/dist_ts/data/networklease.js +159 -0
- package/dist_ts/data/networknode.d.ts +37 -0
- package/dist_ts/data/networknode.js +6 -0
- package/dist_ts/data/networkprojection.d.ts +10 -5
- package/dist_ts/data/networkprojection.js +15 -22
- package/dist_ts/data/networksigning.js +5 -4
- package/dist_ts/data/runtimeconfig.js +14 -77
- package/dist_ts/data/serviceruntime.d.ts +128 -0
- package/dist_ts/data/serviceruntime.js +92 -0
- package/dist_ts/private/networkcontract.d.ts +20 -0
- package/dist_ts/private/networkcontract.js +45 -1
- package/dist_ts/private/producercontract.d.ts +11 -0
- package/dist_ts/private/producercontract.js +21 -0
- package/dist_ts/private/runtimepolicy.d.ts +31 -0
- package/dist_ts/private/runtimepolicy.js +90 -0
- package/dist_ts/requests/cluster.d.ts +53 -0
- package/dist_ts/requests/cluster.js +1 -1
- package/dist_ts/requests/network.d.ts +57 -1
- package/dist_ts/requests/runtimesession.d.ts +14 -0
- package/dist_ts/requests/service.d.ts +60 -0
- package/dist_ts/runtime.networkprojection.d.ts +14 -0
- package/dist_ts/runtime.networkprojection.js +68 -19
- package/package.json +2 -2
- package/readme.md +251 -3
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/data/clusterruntime.ts +45 -0
- package/ts/data/index.ts +5 -0
- package/ts/data/networkaddressplan.ts +175 -0
- package/ts/data/networkauthority.ts +4 -16
- package/ts/data/networkcredential.ts +19 -9
- package/ts/data/networkdelivery.ts +49 -6
- package/ts/data/networklease.ts +229 -0
- package/ts/data/networknode.ts +37 -0
- package/ts/data/networkprojection.ts +28 -26
- package/ts/data/networksigning.ts +5 -4
- package/ts/data/runtimeconfig.ts +17 -76
- package/ts/data/serviceruntime.ts +208 -0
- package/ts/private/networkcontract.ts +48 -0
- package/ts/private/producercontract.ts +19 -0
- package/ts/private/runtimepolicy.ts +105 -0
- package/ts/requests/cluster.ts +65 -0
- package/ts/requests/network.ts +50 -1
- package/ts/requests/runtimesession.ts +17 -0
- package/ts/requests/service.ts +81 -0
- package/ts/runtime.networkprojection.ts +87 -20
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import * as userInterfaces from '../data/user.js';
|
|
2
2
|
import * as clusterInterfaces from '../data/cluster.js';
|
|
3
|
+
import type { IClusterRuntime, TClusterRuntimeBlocker } from '../data/clusterruntime.js';
|
|
4
|
+
import type { IServiceRuntimeAssignmentView } from '../data/serviceruntime.js';
|
|
5
|
+
import type * as leaseInterfaces from '../data/networklease.js';
|
|
3
6
|
import * as plugins from '../plugins.js';
|
|
4
7
|
/**
|
|
5
8
|
* get all clusters
|
|
@@ -112,6 +115,21 @@ export interface IReq_Relay_Cloudly_RegisterClusterRelayV1 extends plugins.typed
|
|
|
112
115
|
request: clusterInterfaces.IClusterRelayRegistrationV1;
|
|
113
116
|
response: clusterInterfaces.IClusterRelayRegistrationResponseV1;
|
|
114
117
|
}
|
|
118
|
+
/**
|
|
119
|
+
* Cloudly hands the cluster relay the DNS lease renewals it has signed ahead of time for one node.
|
|
120
|
+
*
|
|
121
|
+
* A cluster is outbound-only, so a node that loses Cloudly loses the only signer of its DNS
|
|
122
|
+
* window. The relay holds this run in memory, replacing whatever it held for that node, and
|
|
123
|
+
* releases from it only the renewal whose window is current (`notBefore <= now < expiresAt`), and
|
|
124
|
+
* only while it has no Cloudly session: a node refuses a window that is not current. It signs nothing and verifies
|
|
125
|
+
* nothing: each renewal is Cloudly's statement and the node verifies it against its own pinned
|
|
126
|
+
* authority.
|
|
127
|
+
*/
|
|
128
|
+
export interface IReq_Cloudly_Relay_HoldRuntimeNetworkDnsLeaseRenewals extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Cloudly_Relay_HoldRuntimeNetworkDnsLeaseRenewals> {
|
|
129
|
+
method: 'holdRuntimeNetworkDnsLeaseRenewals';
|
|
130
|
+
request: leaseInterfaces.IHoldRuntimeNetworkDnsLeaseRenewalsRequest;
|
|
131
|
+
response: leaseInterfaces.IHoldRuntimeNetworkDnsLeaseRenewalsResponse;
|
|
132
|
+
}
|
|
115
133
|
/**
|
|
116
134
|
* deletes a cluster
|
|
117
135
|
*/
|
|
@@ -125,3 +143,38 @@ export interface IReq_Any_Cloudly_DeleteClusterById extends plugins.typedrequest
|
|
|
125
143
|
ok: boolean;
|
|
126
144
|
};
|
|
127
145
|
}
|
|
146
|
+
/**
|
|
147
|
+
* A cluster's runtime phase, and what still blocks it from leaving `swarm`.
|
|
148
|
+
*
|
|
149
|
+
* Cloudly refuses a cluster without a phase record as `cluster-runtime-missing` rather than
|
|
150
|
+
* assuming one. `blockers` is empty once nothing blocks the cutover.
|
|
151
|
+
*/
|
|
152
|
+
export interface IReq_Any_Cloudly_GetClusterRuntime extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Any_Cloudly_GetClusterRuntime> {
|
|
153
|
+
method: 'getClusterRuntime';
|
|
154
|
+
request: {
|
|
155
|
+
identity: userInterfaces.IIdentity;
|
|
156
|
+
clusterId: string;
|
|
157
|
+
};
|
|
158
|
+
response: {
|
|
159
|
+
runtime: IClusterRuntime;
|
|
160
|
+
blockers: TClusterRuntimeBlocker[];
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Every current runtime assignment on one cluster's nodes, a page at a time: a cluster carries
|
|
165
|
+
* every node's slots of every service, which no single response bounds. `limit` runs from 1 to
|
|
166
|
+
* `serviceRuntimeContract.maximumAssignmentPageSize`; Cloudly refuses any other.
|
|
167
|
+
*/
|
|
168
|
+
export interface IReq_Any_Cloudly_GetClusterRuntimeAssignments extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Any_Cloudly_GetClusterRuntimeAssignments> {
|
|
169
|
+
method: 'getClusterRuntimeAssignments';
|
|
170
|
+
request: {
|
|
171
|
+
identity: userInterfaces.IIdentity;
|
|
172
|
+
clusterId: string;
|
|
173
|
+
cursor: string | null;
|
|
174
|
+
limit: number;
|
|
175
|
+
};
|
|
176
|
+
response: {
|
|
177
|
+
assignments: IServiceRuntimeAssignmentView[];
|
|
178
|
+
nextCursor: string | null;
|
|
179
|
+
};
|
|
180
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import * as userInterfaces from '../data/user.js';
|
|
2
2
|
import * as clusterInterfaces from '../data/cluster.js';
|
|
3
3
|
import * as plugins from '../plugins.js';
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2x1c3Rlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3JlcXVlc3RzL2NsdXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLGNBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssaUJBQWlCLE1BQU0sb0JBQW9CLENBQUM7QUFJeEQsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUMifQ==
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
|
-
import type { IIdentityCredential } from '../data/user.js';
|
|
2
|
+
import type { IIdentity, IIdentityCredential } from '../data/user.js';
|
|
3
|
+
import type { IRuntimeNetworkAddressPlan, TRuntimeNetworkAddressPlanWritableData } from '../data/networkaddressplan.js';
|
|
4
|
+
import type { IRuntimeNetworkNodeReadiness, IRuntimeRouterIncarnation } from '../data/networknode.js';
|
|
3
5
|
import type { IPrivateNetworkV1, IServicePrivateNetworksV1, ISetServicePrivateNetworksV1, TPrivateNetworkMutationV1 } from '../data/privatenetwork.js';
|
|
4
6
|
import type { IServicePublishedPortsV1, ISetServicePublishedPortsV1 } from '../data/networkprojection.js';
|
|
5
7
|
/** Current organization picker data. Entries are never cached authorization grants. */
|
|
@@ -130,3 +132,57 @@ export interface IRequest_Any_Cloudly_GetNetworkNodes {
|
|
|
130
132
|
networkNodes: plugins.tsclass.network.INetworkNode[];
|
|
131
133
|
};
|
|
132
134
|
}
|
|
135
|
+
/**
|
|
136
|
+
* Writes the runtime network's address plan.
|
|
137
|
+
*
|
|
138
|
+
* `expectedRevision` is the revision the caller read, or `null` when no plan exists yet. Cloudly
|
|
139
|
+
* validates the plan with `snapshotRuntimeNetworkAddressPlan`, decides the change with
|
|
140
|
+
* `admitRuntimeNetworkAddressPlanChange`, refuses the change while a resolver or platform endpoint
|
|
141
|
+
* it removes or changes is still referenced, and answers with the stored plan: at its new revision,
|
|
142
|
+
* or unchanged.
|
|
143
|
+
*/
|
|
144
|
+
export interface IReq_Any_Cloudly_SetRuntimeNetworkAddressPlan extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Any_Cloudly_SetRuntimeNetworkAddressPlan> {
|
|
145
|
+
method: 'setRuntimeNetworkAddressPlan';
|
|
146
|
+
request: {
|
|
147
|
+
identity: IIdentity;
|
|
148
|
+
expectedRevision: number | null;
|
|
149
|
+
plan: TRuntimeNetworkAddressPlanWritableData;
|
|
150
|
+
};
|
|
151
|
+
response: {
|
|
152
|
+
plan: IRuntimeNetworkAddressPlan;
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/** `null` until an administrator sets the first plan; the runtime network stays unconfigured until then. */
|
|
156
|
+
export interface IReq_Any_Cloudly_GetRuntimeNetworkAddressPlan extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Any_Cloudly_GetRuntimeNetworkAddressPlan> {
|
|
157
|
+
method: 'getRuntimeNetworkAddressPlan';
|
|
158
|
+
request: {
|
|
159
|
+
identity: IIdentity;
|
|
160
|
+
};
|
|
161
|
+
response: {
|
|
162
|
+
plan: IRuntimeNetworkAddressPlan | null;
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/** Whether one node's runtime network is ready for workloads, and every condition still missing. */
|
|
166
|
+
export interface IReq_Any_Cloudly_GetRuntimeNetworkNodeReadiness extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Any_Cloudly_GetRuntimeNetworkNodeReadiness> {
|
|
167
|
+
method: 'getRuntimeNetworkNodeReadiness';
|
|
168
|
+
request: {
|
|
169
|
+
identity: IIdentity;
|
|
170
|
+
nodeId: string;
|
|
171
|
+
};
|
|
172
|
+
response: IRuntimeNetworkNodeReadiness;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Advances one node's router incarnation, so the node producer reserves the router a fresh handoff.
|
|
176
|
+
* `expectedIncarnation` is the incarnation the caller read; any other refuses the request.
|
|
177
|
+
*/
|
|
178
|
+
export interface IReq_Any_Cloudly_ReincarnateRuntimeNetworkRouter extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Any_Cloudly_ReincarnateRuntimeNetworkRouter> {
|
|
179
|
+
method: 'reincarnateRuntimeNetworkRouter';
|
|
180
|
+
request: {
|
|
181
|
+
identity: IIdentity;
|
|
182
|
+
nodeId: string;
|
|
183
|
+
expectedIncarnation: number;
|
|
184
|
+
};
|
|
185
|
+
response: {
|
|
186
|
+
incarnation: IRuntimeRouterIncarnation;
|
|
187
|
+
};
|
|
188
|
+
}
|
|
@@ -28,6 +28,20 @@ export interface IReq_Controller_Pallet_ApplyRuntimeNetworkProjectionV1 extends
|
|
|
28
28
|
request: network.IApplyRuntimeNetworkProjectionRequestV1;
|
|
29
29
|
response: network.IApplyRuntimeNetworkAuthorityResponseV1;
|
|
30
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* A fresh DNS window for the node's exact admitted projection; an ACK asserts admission only.
|
|
33
|
+
*
|
|
34
|
+
* The controller sends it while it is reachable. A cluster relay sends the renewals it holds
|
|
35
|
+
* while it has no controller session, under the binding the node obtained itself, which is why
|
|
36
|
+
* a node admits it from whoever holds its current connection and trusts only the signature.
|
|
37
|
+
* Either sender delivers a window once its slot has opened and never before, because a node
|
|
38
|
+
* refuses a renewal it could not use at once; delivering it again once the slot opens is enough.
|
|
39
|
+
*/
|
|
40
|
+
export interface IReq_Controller_Pallet_ApplyRuntimeNetworkDnsLeaseRenewal extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Controller_Pallet_ApplyRuntimeNetworkDnsLeaseRenewal> {
|
|
41
|
+
method: 'applyRuntimeNetworkDnsLeaseRenewal';
|
|
42
|
+
request: network.IApplyRuntimeNetworkDnsLeaseRenewalRequest;
|
|
43
|
+
response: network.IApplyRuntimeNetworkDnsLeaseRenewalResponse;
|
|
44
|
+
}
|
|
31
45
|
/**
|
|
32
46
|
* WSS-only Pallet bootstrap. Derive physical peer/idempotency server-side; the registering
|
|
33
47
|
* node process is named by `request.nodeInstanceNonce`, because one relay socket may carry
|
|
@@ -8,6 +8,7 @@ import type { IImageRelease } from '../data/immutableimage.js';
|
|
|
8
8
|
import type { IDeploymentPreflightReport, IDeploymentPreflightRequestData } from '../data/deploymentpreflight.js';
|
|
9
9
|
import type { IDeploymentReservationInput, IServiceDeploymentOperation, IServiceDeploymentStatus } from '../data/deploymentoperation.js';
|
|
10
10
|
import type { TSha256Digest } from '../data/immutableimage.js';
|
|
11
|
+
import type { IServiceRuntimeAssignmentView, IServiceRuntimeSpec, IServiceRuntimeStatus, TServiceRuntimeSpecWritableData } from '../data/serviceruntime.js';
|
|
11
12
|
import type { IServiceDeploymentAdoptionInput, IServiceDeploymentAdoptionImagePromotionInput, IServiceDeploymentAdoptionImagePromotionResult, IServiceDeploymentAdoptionRolloutInput, IServiceDeploymentAdoptionRolloutResult, IServiceDeploymentAdoptionPreflightInput, IServiceDeploymentAdoptionReport, IServiceDeploymentAdoptionResult } from '../data/deploymentadoption.js';
|
|
12
13
|
export interface IRequest_Any_Cloudly_BootstrapServiceDeploymentAdoptionRollout extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IRequest_Any_Cloudly_BootstrapServiceDeploymentAdoptionRollout> {
|
|
13
14
|
method: 'bootstrapServiceDeploymentAdoptionRollout';
|
|
@@ -253,3 +254,62 @@ export interface IRequest_Any_Cloudly_DeleteServiceById extends plugins.typedreq
|
|
|
253
254
|
success: boolean;
|
|
254
255
|
};
|
|
255
256
|
}
|
|
257
|
+
/**
|
|
258
|
+
* Writes the complete runtime spec of one service.
|
|
259
|
+
*
|
|
260
|
+
* `expectedRevision` is the revision the caller read, or `null` when the service has never had a
|
|
261
|
+
* spec; any other stored revision refuses the write. Cloudly copies the organization from the
|
|
262
|
+
* service and answers with the stored spec at its new revision.
|
|
263
|
+
*/
|
|
264
|
+
export interface IRequest_Any_Cloudly_SetServiceRuntimeSpec extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IRequest_Any_Cloudly_SetServiceRuntimeSpec> {
|
|
265
|
+
method: 'setServiceRuntimeSpec';
|
|
266
|
+
request: {
|
|
267
|
+
identity: IIdentity;
|
|
268
|
+
serviceId: string;
|
|
269
|
+
expectedRevision: number | null;
|
|
270
|
+
spec: TServiceRuntimeSpecWritableData;
|
|
271
|
+
};
|
|
272
|
+
response: {
|
|
273
|
+
spec: IServiceRuntimeSpec;
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* A service's runtime spec and the producer's verdict on it. Both are `null` before the first spec;
|
|
278
|
+
* a spec's status is `null` until the producer first decides it.
|
|
279
|
+
*/
|
|
280
|
+
export interface IRequest_Any_Cloudly_GetServiceRuntimeSpec extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IRequest_Any_Cloudly_GetServiceRuntimeSpec> {
|
|
281
|
+
method: 'getServiceRuntimeSpec';
|
|
282
|
+
request: {
|
|
283
|
+
identity: IIdentity;
|
|
284
|
+
serviceId: string;
|
|
285
|
+
};
|
|
286
|
+
response: {
|
|
287
|
+
spec: null;
|
|
288
|
+
status: null;
|
|
289
|
+
} | {
|
|
290
|
+
spec: IServiceRuntimeSpec;
|
|
291
|
+
status: IServiceRuntimeStatus | null;
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
/** Every current runtime assignment of one service, one per replica slot. */
|
|
295
|
+
export interface IRequest_Any_Cloudly_GetServiceRuntimeAssignments extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IRequest_Any_Cloudly_GetServiceRuntimeAssignments> {
|
|
296
|
+
method: 'getServiceRuntimeAssignments';
|
|
297
|
+
request: {
|
|
298
|
+
identity: IIdentity;
|
|
299
|
+
serviceId: string;
|
|
300
|
+
};
|
|
301
|
+
response: {
|
|
302
|
+
assignments: IServiceRuntimeAssignmentView[];
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Cloudly -> admin UIs: a service's runtime spec, status or assignments changed. It carries no
|
|
307
|
+
* state, so a late or repeated push can never overwrite a newer read; the UI reads the views again.
|
|
308
|
+
*/
|
|
309
|
+
export interface IReq_Cloudly_Any_PushServiceRuntimeChanged extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Cloudly_Any_PushServiceRuntimeChanged> {
|
|
310
|
+
method: 'pushServiceRuntimeChanged';
|
|
311
|
+
request: {
|
|
312
|
+
serviceId: string;
|
|
313
|
+
};
|
|
314
|
+
response: Record<string, never>;
|
|
315
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as plugins from './plugins.runtime.js';
|
|
2
2
|
import type { ISignedRuntimeNetworkProjectionV1 } from './data/networksigning.js';
|
|
3
|
+
import type { ISignedRuntimeNetworkDnsLeaseRenewal } from './data/networklease.js';
|
|
3
4
|
/** The private KeyObject is process-local. Persist only through the controller's encrypted secret store. */
|
|
4
5
|
export declare const createRuntimeNetworkSigningKeyV1: () => {
|
|
5
6
|
publicKey: string;
|
|
@@ -13,3 +14,16 @@ export declare const signRuntimeNetworkProjectionV1: (projectionValue: unknown,
|
|
|
13
14
|
* admission, live-session fencing, allocation barriers and conservative DNS time checks.
|
|
14
15
|
*/
|
|
15
16
|
export declare const verifyRuntimeNetworkProjectionV1: (value: unknown, trustedAuthorityValue: unknown, trustedScopeValue: unknown) => Promise<ISignedRuntimeNetworkProjectionV1>;
|
|
17
|
+
/** Sign only a validated renewal, with the same authority and key that sign this controller's projections. */
|
|
18
|
+
export declare const signRuntimeNetworkDnsLeaseRenewal: (renewalValue: unknown, authorityValue: unknown, privateKey: plugins.crypto.KeyObject) => Promise<ISignedRuntimeNetworkDnsLeaseRenewal>;
|
|
19
|
+
/**
|
|
20
|
+
* trustedAuthorityValue is receiver-owned persisted trust, NEVER envelope material, and a relay
|
|
21
|
+
* that delivers the renewal adds no trust to it. projectionAuthorityValue is the authority
|
|
22
|
+
* reference that signed the projection this renewal extends, which the receiver kept when it
|
|
23
|
+
* admitted that projection: a renewal is only ever valid under the exact revision that signed its
|
|
24
|
+
* projection, so a rotated key renews nothing and DNS still waits for a newly signed projection.
|
|
25
|
+
* This verifies content, scope and signature only: the owner still admits it against its own
|
|
26
|
+
* admitted projection with `admitRuntimeNetworkDnsLeaseRenewal`, fences the live session and
|
|
27
|
+
* converts the window with a qualified clock.
|
|
28
|
+
*/
|
|
29
|
+
export declare const verifyRuntimeNetworkDnsLeaseRenewal: (value: unknown, trustedAuthorityValue: unknown, trustedScopeValue: unknown, projectionAuthorityValue: unknown) => Promise<ISignedRuntimeNetworkDnsLeaseRenewal>;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import * as plugins from './plugins.runtime.js';
|
|
2
2
|
import { snapshotRuntimeNetworkNodeScopeV1, snapshotRuntimeNetworkProjectionV1, validateRuntimeNetworkProjectionV1 } from './data/networkprojection.js';
|
|
3
3
|
import { computeRuntimeNetworkSigningAuthorityV1Digest, runtimeNetworkSigningV1Contract, snapshotRuntimeNetworkSigningAuthorityV1, snapshotSignedRuntimeNetworkProjectionV1 } from './data/networksigning.js';
|
|
4
|
-
import {
|
|
4
|
+
import { runtimeNetworkDnsLeaseRenewalContract, snapshotRuntimeNetworkDnsLeaseRenewal, snapshotSignedRuntimeNetworkDnsLeaseRenewal, validateRuntimeNetworkDnsLeaseRenewal } from './data/networklease.js';
|
|
5
|
+
import { captureNetwork, failNetwork, networkCanonical, networkEqual, networkReference, networkReferenceOf, networkSameScope, requireNetwork } from './private/networkcontract.js';
|
|
5
6
|
/** The private KeyObject is process-local. Persist only through the controller's encrypted secret store. */
|
|
6
7
|
export const createRuntimeNetworkSigningKeyV1 = () => {
|
|
7
8
|
const pair = plugins.crypto.generateKeyPairSync('ed25519');
|
|
@@ -9,23 +10,39 @@ export const createRuntimeNetworkSigningKeyV1 = () => {
|
|
|
9
10
|
requireNetwork(jwk.kty === 'OKP' && jwk.crv === 'Ed25519' && typeof jwk.x === 'string');
|
|
10
11
|
return { publicKey: Buffer.from(jwk.x, 'base64url').toString('hex'), privateKey: pair.privateKey };
|
|
11
12
|
};
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
|
|
13
|
+
const projectionEnvelope = (authority, projection) => ({ domain: runtimeNetworkSigningV1Contract.signatureDomain, schemaVersion: 1, authority, projection });
|
|
14
|
+
const renewalEnvelope = (authority, renewal) => ({ domain: runtimeNetworkDnsLeaseRenewalContract.signatureDomain, authority, renewal });
|
|
15
|
+
const envelopeBytes = (envelope) => new TextEncoder().encode(networkCanonical(envelope));
|
|
16
|
+
/** A revoked revision has no key; any other must be intact and belong to the controller that owns the content. */
|
|
17
|
+
const liveKeyOf = async (authority, contentController) => {
|
|
18
|
+
const { publicKey } = authority;
|
|
19
|
+
requireNetwork(publicKey !== null && networkEqual(authority.controller, contentController)
|
|
15
20
|
&& authority.digest === await computeRuntimeNetworkSigningAuthorityV1Digest(authority));
|
|
21
|
+
return publicKey;
|
|
22
|
+
};
|
|
23
|
+
/** Sign as the authority's revision, and only with the private half of its live key. */
|
|
24
|
+
const signAs = async (authority, privateKey, contentController, envelopeOf) => {
|
|
25
|
+
requireNetwork(privateKey instanceof plugins.crypto.KeyObject && privateKey.type === 'private' && privateKey.asymmetricKeyType === 'ed25519');
|
|
26
|
+
const derived = plugins.crypto.createPublicKey(privateKey).export({ format: 'jwk' });
|
|
27
|
+
const publicKey = await liveKeyOf(authority, contentController);
|
|
28
|
+
requireNetwork(typeof derived.x === 'string' && Buffer.from(derived.x, 'base64url').toString('hex') === publicKey);
|
|
29
|
+
const reference = networkReferenceOf(authority);
|
|
30
|
+
return { authority: reference, signature: plugins.crypto.sign(null, envelopeBytes(envelopeOf(reference)), privateKey).toString('hex') };
|
|
31
|
+
};
|
|
32
|
+
/** The receiver's own trusted revision decides; the envelope only names which revision it claims. */
|
|
33
|
+
const requireSignedBy = async (trusted, signed, contentController, envelope) => {
|
|
34
|
+
requireNetwork(networkEqual(signed.authority, networkReferenceOf(trusted)));
|
|
35
|
+
const key = plugins.crypto.createPublicKey({ format: 'jwk', key: { kty: 'OKP', crv: 'Ed25519',
|
|
36
|
+
x: Buffer.from(await liveKeyOf(trusted, contentController), 'hex').toString('base64url') } });
|
|
37
|
+
requireNetwork(plugins.crypto.verify(null, envelopeBytes(envelope), key, Buffer.from(signed.signature, 'hex')));
|
|
16
38
|
};
|
|
17
39
|
/** Sign only validated complete state and a matching dedicated private key. */
|
|
18
40
|
export const signRuntimeNetworkProjectionV1 = async (projectionValue, authorityValue, privateKey) => {
|
|
19
41
|
try {
|
|
20
42
|
const input = snapshotRuntimeNetworkProjectionV1(projectionValue), authority = snapshotRuntimeNetworkSigningAuthorityV1(authorityValue);
|
|
21
|
-
requireNetwork(privateKey instanceof plugins.crypto.KeyObject && privateKey.type === 'private' && privateKey.asymmetricKeyType === 'ed25519');
|
|
22
|
-
const publicKey = plugins.crypto.createPublicKey(privateKey).export({ format: 'jwk' });
|
|
23
|
-
requireNetwork(typeof publicKey.x === 'string' && Buffer.from(publicKey.x, 'base64url').toString('hex') === authority.publicKey);
|
|
24
43
|
const projection = await validateRuntimeNetworkProjectionV1(input);
|
|
25
|
-
await
|
|
26
|
-
|
|
27
|
-
const signature = plugins.crypto.sign(null, signatureBytes(reference, projection), privateKey).toString('hex');
|
|
28
|
-
return { schemaVersion: 1, authority: reference, projection, signature };
|
|
44
|
+
const signed = await signAs(authority, privateKey, projection.controller, reference => projectionEnvelope(reference, projection));
|
|
45
|
+
return { schemaVersion: 1, authority: signed.authority, projection, signature: signed.signature };
|
|
29
46
|
}
|
|
30
47
|
catch {
|
|
31
48
|
return failNetwork();
|
|
@@ -41,13 +58,8 @@ export const verifyRuntimeNetworkProjectionV1 = async (value, trustedAuthorityVa
|
|
|
41
58
|
const signed = snapshotSignedRuntimeNetworkProjectionV1(value);
|
|
42
59
|
const authority = snapshotRuntimeNetworkSigningAuthorityV1(trustedAuthorityValue);
|
|
43
60
|
const trusted = snapshotRuntimeNetworkNodeScopeV1(trustedScopeValue);
|
|
44
|
-
requireNetwork(
|
|
45
|
-
|
|
46
|
-
&& networkEqual(signed.projection.controller, trusted.controller));
|
|
47
|
-
await validateAuthority(authority, signed.projection);
|
|
48
|
-
const key = plugins.crypto.createPublicKey({ format: 'jwk', key: { kty: 'OKP', crv: 'Ed25519',
|
|
49
|
-
x: Buffer.from(authority.publicKey, 'hex').toString('base64url') } });
|
|
50
|
-
requireNetwork(plugins.crypto.verify(null, signatureBytes(signed.authority, signed.projection), key, Buffer.from(signed.signature, 'hex')));
|
|
61
|
+
requireNetwork(networkSameScope(signed.projection, trusted));
|
|
62
|
+
await requireSignedBy(authority, signed, signed.projection.controller, projectionEnvelope(signed.authority, signed.projection));
|
|
51
63
|
await validateRuntimeNetworkProjectionV1(signed.projection);
|
|
52
64
|
return signed;
|
|
53
65
|
}
|
|
@@ -55,4 +67,41 @@ export const verifyRuntimeNetworkProjectionV1 = async (value, trustedAuthorityVa
|
|
|
55
67
|
return failNetwork();
|
|
56
68
|
}
|
|
57
69
|
};
|
|
58
|
-
|
|
70
|
+
/** Sign only a validated renewal, with the same authority and key that sign this controller's projections. */
|
|
71
|
+
export const signRuntimeNetworkDnsLeaseRenewal = async (renewalValue, authorityValue, privateKey) => {
|
|
72
|
+
try {
|
|
73
|
+
const input = snapshotRuntimeNetworkDnsLeaseRenewal(renewalValue), authority = snapshotRuntimeNetworkSigningAuthorityV1(authorityValue);
|
|
74
|
+
const renewal = await validateRuntimeNetworkDnsLeaseRenewal(input);
|
|
75
|
+
const signed = await signAs(authority, privateKey, renewal.controller, reference => renewalEnvelope(reference, renewal));
|
|
76
|
+
return { authority: signed.authority, renewal, signature: signed.signature };
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return failNetwork();
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* trustedAuthorityValue is receiver-owned persisted trust, NEVER envelope material, and a relay
|
|
84
|
+
* that delivers the renewal adds no trust to it. projectionAuthorityValue is the authority
|
|
85
|
+
* reference that signed the projection this renewal extends, which the receiver kept when it
|
|
86
|
+
* admitted that projection: a renewal is only ever valid under the exact revision that signed its
|
|
87
|
+
* projection, so a rotated key renews nothing and DNS still waits for a newly signed projection.
|
|
88
|
+
* This verifies content, scope and signature only: the owner still admits it against its own
|
|
89
|
+
* admitted projection with `admitRuntimeNetworkDnsLeaseRenewal`, fences the live session and
|
|
90
|
+
* converts the window with a qualified clock.
|
|
91
|
+
*/
|
|
92
|
+
export const verifyRuntimeNetworkDnsLeaseRenewal = async (value, trustedAuthorityValue, trustedScopeValue, projectionAuthorityValue) => {
|
|
93
|
+
try {
|
|
94
|
+
const signed = snapshotSignedRuntimeNetworkDnsLeaseRenewal(value);
|
|
95
|
+
const authority = snapshotRuntimeNetworkSigningAuthorityV1(trustedAuthorityValue);
|
|
96
|
+
const trusted = snapshotRuntimeNetworkNodeScopeV1(trustedScopeValue);
|
|
97
|
+
const projectionAuthority = networkReference(captureNetwork(projectionAuthorityValue));
|
|
98
|
+
requireNetwork(networkSameScope(signed.renewal, trusted) && networkEqual(signed.authority, projectionAuthority));
|
|
99
|
+
await requireSignedBy(authority, signed, signed.renewal.controller, renewalEnvelope(signed.authority, signed.renewal));
|
|
100
|
+
await validateRuntimeNetworkDnsLeaseRenewal(signed.renewal);
|
|
101
|
+
return signed;
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return failNetwork();
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5uZXR3b3JrcHJvamVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3J1bnRpbWUubmV0d29ya3Byb2plY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxzQkFBc0IsQ0FBQztBQUdoRCxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsa0NBQWtDLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV4SixPQUFPLEVBQUUsNkNBQTZDLEVBQUUsK0JBQStCLEVBQ3JGLHdDQUF3QyxFQUFFLHdDQUF3QyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFdkgsT0FBTyxFQUFFLHFDQUFxQyxFQUFFLHFDQUFxQyxFQUNuRiwyQ0FBMkMsRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JILE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFDeEcsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFekUsNEdBQTRHO0FBQzVHLE1BQU0sQ0FBQyxNQUFNLGdDQUFnQyxHQUFHLEdBQWdFLEVBQUU7SUFDaEgsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLEtBQUssSUFBSSxHQUFHLENBQUMsR0FBRyxLQUFLLFNBQVMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUM7SUFDeEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsSUFBSSxD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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@serve.zone/interfaces",
|
|
3
|
-
"version": "31.
|
|
3
|
+
"version": "31.9.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.",
|
|
6
6
|
"exports": {
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"@git.zone/tsdoc": "^2.2.0",
|
|
32
32
|
"@git.zone/tsrun": "^2.0.6",
|
|
33
33
|
"@git.zone/tstest": "6.1.1",
|
|
34
|
-
"@types/node": "26.5.
|
|
34
|
+
"@types/node": "26.5.1"
|
|
35
35
|
},
|
|
36
36
|
"files": [
|
|
37
37
|
"ts/**/*",
|