@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.
Files changed (59) hide show
  1. package/changelog.md +77 -0
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts/data/clusterruntime.d.ts +39 -0
  4. package/dist_ts/data/clusterruntime.js +11 -0
  5. package/dist_ts/data/index.d.ts +5 -0
  6. package/dist_ts/data/index.js +6 -1
  7. package/dist_ts/data/networkaddressplan.d.ts +78 -0
  8. package/dist_ts/data/networkaddressplan.js +114 -0
  9. package/dist_ts/data/networkauthority.js +5 -17
  10. package/dist_ts/data/networkcredential.d.ts +10 -4
  11. package/dist_ts/data/networkcredential.js +14 -8
  12. package/dist_ts/data/networkdelivery.d.ts +21 -0
  13. package/dist_ts/data/networkdelivery.js +35 -7
  14. package/dist_ts/data/networklease.d.ts +110 -0
  15. package/dist_ts/data/networklease.js +159 -0
  16. package/dist_ts/data/networknode.d.ts +37 -0
  17. package/dist_ts/data/networknode.js +6 -0
  18. package/dist_ts/data/networkprojection.d.ts +10 -5
  19. package/dist_ts/data/networkprojection.js +15 -22
  20. package/dist_ts/data/networksigning.js +5 -4
  21. package/dist_ts/data/runtimeconfig.js +14 -77
  22. package/dist_ts/data/serviceruntime.d.ts +128 -0
  23. package/dist_ts/data/serviceruntime.js +92 -0
  24. package/dist_ts/private/networkcontract.d.ts +20 -0
  25. package/dist_ts/private/networkcontract.js +45 -1
  26. package/dist_ts/private/producercontract.d.ts +11 -0
  27. package/dist_ts/private/producercontract.js +21 -0
  28. package/dist_ts/private/runtimepolicy.d.ts +31 -0
  29. package/dist_ts/private/runtimepolicy.js +90 -0
  30. package/dist_ts/requests/cluster.d.ts +53 -0
  31. package/dist_ts/requests/cluster.js +1 -1
  32. package/dist_ts/requests/network.d.ts +57 -1
  33. package/dist_ts/requests/runtimesession.d.ts +14 -0
  34. package/dist_ts/requests/service.d.ts +60 -0
  35. package/dist_ts/runtime.networkprojection.d.ts +14 -0
  36. package/dist_ts/runtime.networkprojection.js +68 -19
  37. package/package.json +2 -2
  38. package/readme.md +251 -3
  39. package/ts/00_commitinfo_data.ts +1 -1
  40. package/ts/data/clusterruntime.ts +45 -0
  41. package/ts/data/index.ts +5 -0
  42. package/ts/data/networkaddressplan.ts +175 -0
  43. package/ts/data/networkauthority.ts +4 -16
  44. package/ts/data/networkcredential.ts +19 -9
  45. package/ts/data/networkdelivery.ts +49 -6
  46. package/ts/data/networklease.ts +229 -0
  47. package/ts/data/networknode.ts +37 -0
  48. package/ts/data/networkprojection.ts +28 -26
  49. package/ts/data/networksigning.ts +5 -4
  50. package/ts/data/runtimeconfig.ts +17 -76
  51. package/ts/data/serviceruntime.ts +208 -0
  52. package/ts/private/networkcontract.ts +48 -0
  53. package/ts/private/producercontract.ts +19 -0
  54. package/ts/private/runtimepolicy.ts +105 -0
  55. package/ts/requests/cluster.ts +65 -0
  56. package/ts/requests/network.ts +50 -1
  57. package/ts/requests/runtimesession.ts +17 -0
  58. package/ts/requests/service.ts +81 -0
  59. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2x1c3Rlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3JlcXVlc3RzL2NsdXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLGNBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssaUJBQWlCLE1BQU0sb0JBQW9CLENBQUM7QUFDeEQsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUMifQ==
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 { failNetwork, networkCanonical, networkEqual, networkReferenceOf, requireNetwork } from './private/networkcontract.js';
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 signatureBytes = (authority, projection) => new TextEncoder().encode(networkCanonical({ domain: runtimeNetworkSigningV1Contract.signatureDomain, schemaVersion: 1, authority, projection }));
13
- const validateAuthority = async (authority, projection) => {
14
- requireNetwork(authority.publicKey !== null && networkEqual(authority.controller, projection.controller)
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 validateAuthority(authority, projection);
26
- const reference = networkReferenceOf(authority);
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(networkEqual(signed.authority, networkReferenceOf(authority))
45
- && signed.projection.nodeId === trusted.nodeId && signed.projection.runtimeNamespace === trusted.runtimeNamespace
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
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5uZXR3b3JrcHJvamVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3J1bnRpbWUubmV0d29ya3Byb2plY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxzQkFBc0IsQ0FBQztBQUdoRCxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsa0NBQWtDLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV4SixPQUFPLEVBQUUsNkNBQTZDLEVBQUUsK0JBQStCLEVBQ3JGLHdDQUF3QyxFQUFFLHdDQUF3QyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkgsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFL0gsNEdBQTRHO0FBQzVHLE1BQU0sQ0FBQyxNQUFNLGdDQUFnQyxHQUFHLEdBQWdFLEVBQUU7SUFDaEgsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLEtBQUssSUFBSSxHQUFHLENBQUMsR0FBRyxLQUFLLFNBQVMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUM7SUFDeEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDckcsQ0FBQyxDQUFDO0FB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
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5uZXR3b3JrcHJvamVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3J1bnRpbWUubmV0d29ya3Byb2plY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxzQkFBc0IsQ0FBQztBQUdoRCxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsa0NBQWtDLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV4SixPQUFPLEVBQUUsNkNBQTZDLEVBQUUsK0JBQStCLEVBQ3JGLHdDQUF3QyxFQUFFLHdDQUF3QyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFdkgsT0FBTyxFQUFFLHFDQUFxQyxFQUFFLHFDQUFxQyxFQUNuRiwyQ0FBMkMsRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JILE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFDeEcsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFekUsNEdBQTRHO0FBQzVHLE1BQU0sQ0FBQyxNQUFNLGdDQUFnQyxHQUFHLEdBQWdFLEVBQUU7SUFDaEgsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLEtBQUssSUFBSSxHQUFHLENBQUMsR0FBRyxLQUFLLFNBQVMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUM7SUFDeEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDckcsQ0FBQyxDQUFDO0FBUUYsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLFNBQXVDLEVBQUUsVUFBdUMsRUFBRSxFQUFFLENBQzlHLENBQUMsRUFBRSxNQUFNLEVBQUUsK0JBQStCLENBQUMsZUFBZSxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7QUFDekcsTUFBTSxlQUFlLEdBQUcsQ0FBQyxTQUF1QyxFQUFFLE9BQXVDLEVBQUUsRUFBRSxDQUMzRyxDQUFDLEVBQUUsTUFBTSxFQUFFLHFDQUFxQyxDQUFDLGVBQWUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUMxRixNQUFNLGFBQWEsR0FBRyxDQUFDLFFBQWdCLEVBQWMsRUFBRSxDQUFDLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFFN0csa0hBQWtIO0FBQ2xILE1BQU0sU0FBUyxHQUFHLEtBQUssRUFBRSxTQUE0QyxFQUFFLGlCQUF1QyxFQUFtQixFQUFFO0lBQ2pJLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxTQUFTLENBQUM7SUFDaEMsY0FBYyxDQUFDLFNBQVMsS0FBSyxJQUFJLElBQUksWUFBWSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUM7V0FDckYsU0FBUyxDQUFDLE1BQU0sS0FBSyxNQUFNLDZDQUE2QyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDMUYsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyxDQUFDO0FBRUYsd0ZBQXdGO0FBQ3hGLE1BQU0sTUFBTSxHQUFHLEtBQUssRUFDbEIsU0FBNEMsRUFBRSxVQUFvQyxFQUFFLGlCQUF1QyxFQUMzSCxVQUErRCxFQUNqQyxFQUFFO0lBQ2hDLGNBQWMsQ0FBQyxVQUFVLFlBQVksT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksVUFBVSxDQUFDLGlCQUFpQixLQUFLLFNBQVMsQ0FBQyxDQUFDO0lBQzlJLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3JGLE1BQU0sU0FBUyxHQUFHLE1BQU0sU0FBUyxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2hFLGNBQWMsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxDQUFDLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUM7SUFDbkgsTUFBTSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7QUFDMUksQ0FBQyxDQUFDO0FBRUYscUdBQXFHO0FBQ3JHLE1BQU0sZUFBZSxHQUFHLEtBQUssRUFDM0IsT0FBMEMsRUFBRSxNQUEyQixFQUFFLGlCQUF1QyxFQUFFLFFBQWdCLEVBQ25ILEVBQUU7SUFDakIsY0FBYyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RSxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUztZQUMzRixDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLFNBQVMsQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDaEcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEgsQ0FBQyxDQUFDO0FBRUYsK0VBQStFO0FBQy9FLE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFHLEtBQUssRUFDakQsZUFBd0IsRUFBRSxjQUF1QixFQUFFLFVBQW9DLEVBQzNDLEVBQUU7SUFDOUMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxLQUFLLEdBQUcsa0NBQWtDLENBQUMsZUFBZSxDQUFDLEVBQUUsU0FBUyxHQUFHLHdDQUF3QyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3hJLE1BQU0sVUFBVSxHQUFHLE1BQU0sa0NBQWtDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkUsTUFBTSxNQUFNLEdBQUcsTUFBTSxNQUFNLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDbEksT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDcEcsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUFDLE9BQU8sV0FBVyxFQUFFLENBQUM7SUFBQyxDQUFDO0FBQ25DLENBQUMsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBRyxLQUFLLEVBQ25ELEtBQWMsRUFBRSxxQkFBOEIsRUFBRSxpQkFBMEIsRUFDOUIsRUFBRTtJQUM5QyxJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyx3Q0FBd0MsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvRCxNQUFNLFNBQVMsR0FBRyx3Q0FBd0MsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2xGLE1BQU0sT0FBTyxHQUFHLGlDQUFpQyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDckUsY0FBYyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM3RCxNQUFNLGVBQWUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDaEksTUFBTSxrQ0FBa0MsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUFDLE9BQU8sV0FBVyxFQUFFLENBQUM7SUFBQyxDQUFDO0FBQ25DLENBQUMsQ0FBQztBQUVGLDhHQUE4RztBQUM5RyxNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBRyxLQUFLLEVBQ3BELFlBQXFCLEVBQUUsY0FBdUIsRUFBRSxVQUFvQyxFQUNyQyxFQUFFO0lBQ2pELElBQUksQ0FBQztRQUNILE1BQU0sS0FBSyxHQUFHLHFDQUFxQyxDQUFDLFlBQVksQ0FBQyxFQUFFLFNBQVMsR0FBRyx3Q0FBd0MsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN4SSxNQUFNLE9BQU8sR0FBRyxNQUFNLHFDQUFxQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25FLE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUN6SCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDL0UsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUFDLE9BQU8sV0FBVyxFQUFFLENBQUM7SUFBQyxDQUFDO0FBQ25DLENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1DQUFtQyxHQUFHLEtBQUssRUFDdEQsS0FBYyxFQUFFLHFCQUE4QixFQUFFLGlCQUEwQixFQUFFLHdCQUFpQyxFQUM5RCxFQUFFO0lBQ2pELElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLDJDQUEyQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sU0FBUyxHQUFHLHdDQUF3QyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDbEYsTUFBTSxPQUFPLEdBQUcsaUNBQWlDLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNyRSxNQUFNLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUM7UUFDdkYsY0FBYyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1FBQ2pILE1BQU0sZUFBZSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsZUFBZSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDdkgsTUFBTSxxQ0FBcUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUFDLE9BQU8sV0FBVyxFQUFFLENBQUM7SUFBQyxDQUFDO0FBQ25DLENBQUMsQ0FBQyJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@serve.zone/interfaces",
3
- "version": "31.7.0",
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.0"
34
+ "@types/node": "26.5.1"
35
35
  },
36
36
  "files": [
37
37
  "ts/**/*",