@serve.zone/interfaces 32.10.0 → 32.11.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 +16 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/data/clusterruntime.d.ts +10 -0
- package/dist_ts/data/clusterruntime.js +7 -1
- package/dist_ts/data/index.d.ts +1 -0
- package/dist_ts/data/index.js +2 -1
- package/dist_ts/data/noderuntimebinding.d.ts +64 -0
- package/dist_ts/data/noderuntimebinding.js +134 -0
- package/dist_ts/data/runtimesession.d.ts +2 -0
- package/dist_ts/data/runtimesession.js +5 -3
- package/dist_ts/requests/node.d.ts +11 -0
- package/dist_ts/requests/pallet.d.ts +23 -0
- package/dist_ts/runtime.assignmentsecret.d.ts +4 -3
- package/dist_ts/runtime.assignmentsecret.js +9 -7
- package/package.json +1 -1
- package/readme.md +40 -5
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/data/clusterruntime.ts +16 -0
- package/ts/data/index.ts +1 -0
- package/ts/data/noderuntimebinding.ts +191 -0
- package/ts/data/runtimesession.ts +6 -2
- package/ts/requests/node.ts +15 -0
- package/ts/requests/pallet.ts +28 -0
- package/ts/runtime.assignmentsecret.ts +8 -6
package/changelog.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-09-20 - 32.11.0
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- Add the Spark-authenticated current node runtime routing read and immutable root-local Pallet
|
|
8
|
+
bind/readback contracts. Both paths bind the routing identity to the exact current Cloudly
|
|
9
|
+
enrollment origin and node. The persisted binding names routing only; current authenticated
|
|
10
|
+
runtime sessions remain the sole workload authority.
|
|
11
|
+
|
|
12
|
+
## 2026-09-20 - 32.10.1
|
|
13
|
+
|
|
14
|
+
### Fixes
|
|
15
|
+
|
|
16
|
+
- Bind every runtime session to the cluster from the controller-owned node record, and use that
|
|
17
|
+
authenticated binding when validating assignment-secret material.
|
|
18
|
+
|
|
3
19
|
## 2026-09-19 - 32.10.0
|
|
4
20
|
|
|
5
21
|
### Features
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@serve.zone/interfaces',
|
|
6
|
-
version: '32.
|
|
6
|
+
version: '32.11.0',
|
|
7
7
|
description: 'Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsV0FBVyxFQUFFLHVGQUF1RjtDQUNyRyxDQUFBIn0=
|
|
@@ -21,6 +21,14 @@ export interface IClusterRuntime {
|
|
|
21
21
|
/** The administrator or producer that made the change. */
|
|
22
22
|
changedBy: string;
|
|
23
23
|
}
|
|
24
|
+
/** Current phase reference without its administrative audit metadata. */
|
|
25
|
+
export interface IClusterRuntimeReference {
|
|
26
|
+
/** The cluster id. */
|
|
27
|
+
id: string;
|
|
28
|
+
phase: TClusterRuntimePhase;
|
|
29
|
+
/** Exact compare-and-swap generation observed with this phase. */
|
|
30
|
+
generation: number;
|
|
31
|
+
}
|
|
24
32
|
/**
|
|
25
33
|
* Why a cluster cannot leave `swarm` yet. Each blocker names the node or service it is about, so an
|
|
26
34
|
* administrator can act on it without a second query.
|
|
@@ -36,4 +44,6 @@ export type TClusterRuntimeBlocker = {
|
|
|
36
44
|
};
|
|
37
45
|
/** Structural snapshot for exact persistence; which phase may follow which is the cutover's decision. */
|
|
38
46
|
export declare const snapshotClusterRuntime: (value: unknown) => IClusterRuntime;
|
|
47
|
+
/** Structural snapshot for node routing reads; it grants no right to move or run a phase. */
|
|
48
|
+
export declare const snapshotClusterRuntimeReference: (value: unknown) => IClusterRuntimeReference;
|
|
39
49
|
export {};
|
|
@@ -8,4 +8,10 @@ export const snapshotClusterRuntime = (value) => producerSafe(() => {
|
|
|
8
8
|
return { id: networkId(item.id), phase: item.phase, generation: networkCounter(item.generation),
|
|
9
9
|
changedAt: networkCounter(item.changedAt), changedBy: networkId(item.changedBy) };
|
|
10
10
|
});
|
|
11
|
-
|
|
11
|
+
/** Structural snapshot for node routing reads; it grants no right to move or run a phase. */
|
|
12
|
+
export const snapshotClusterRuntimeReference = (value) => producerSafe(() => {
|
|
13
|
+
const item = networkRecord(captureNetwork(value), ['id', 'phase', 'generation']);
|
|
14
|
+
requireNetwork(isOneOf(clusterRuntimePhases, item.phase));
|
|
15
|
+
return { id: networkId(item.id), phase: item.phase, generation: networkCounter(item.generation) };
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2x1c3RlcnJ1bnRpbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2NsdXN0ZXJydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDekgsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV2RSxNQUFNLG9CQUFvQixHQUFHLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFVLENBQUM7QUE0Q25GLHlHQUF5RztBQUN6RyxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLEtBQWMsRUFBbUIsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7SUFDM0YsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQzNHLGNBQWMsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDMUQsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUM3RixTQUFTLEVBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO0FBQ3RGLENBQUMsQ0FBQyxDQUFDO0FBRUgsNkZBQTZGO0FBQzdGLE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLENBQUMsS0FBYyxFQUE0QixFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRTtJQUM3RyxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLGNBQWMsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDMUQsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7QUFDcEcsQ0FBQyxDQUFDLENBQUMifQ==
|
package/dist_ts/data/index.d.ts
CHANGED
|
@@ -26,6 +26,7 @@ export * from './isolatedrestore.golden.js';
|
|
|
26
26
|
export * from './mail.js';
|
|
27
27
|
export * from './nodecredential.js';
|
|
28
28
|
export * from './nodeenrollment.js';
|
|
29
|
+
export * from './noderuntimebinding.js';
|
|
29
30
|
export * from './noderetirement.js';
|
|
30
31
|
export * from './networkaddressplan.js';
|
|
31
32
|
export * from './networkauthority.js';
|
package/dist_ts/data/index.js
CHANGED
|
@@ -26,6 +26,7 @@ export * from './isolatedrestore.golden.js';
|
|
|
26
26
|
export * from './mail.js';
|
|
27
27
|
export * from './nodecredential.js';
|
|
28
28
|
export * from './nodeenrollment.js';
|
|
29
|
+
export * from './noderuntimebinding.js';
|
|
29
30
|
export * from './noderetirement.js';
|
|
30
31
|
export * from './networkaddressplan.js';
|
|
31
32
|
export * from './networkauthority.js';
|
|
@@ -60,4 +61,4 @@ export * from './traffic.js';
|
|
|
60
61
|
export * from './user.js';
|
|
61
62
|
export * from './version.js';
|
|
62
63
|
export * from './webpush.js';
|
|
63
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLHdCQUF3QixDQUFDO0FBRXZDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsY0FBYyxDQUFDIn0=
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { IClusterRelay } from './cluster.js';
|
|
2
|
+
import type { IClusterRuntimeReference } from './clusterruntime.js';
|
|
3
|
+
import type { IRuntimeController } from './runtimeassignment.js';
|
|
4
|
+
/**
|
|
5
|
+
* Durable routing identity for one Pallet node.
|
|
6
|
+
*
|
|
7
|
+
* This is not a runtime session, a workload grant or a cluster-phase authority. It only names the
|
|
8
|
+
* Cloudly controller and relay through which the node obtains fresh authenticated session state.
|
|
9
|
+
*/
|
|
10
|
+
export interface INodeRuntimeRoutingBinding {
|
|
11
|
+
/** Exact immutable enrollment authority; Pallet compares it with its current active identity. */
|
|
12
|
+
cloudlyOrigin: string;
|
|
13
|
+
nodeId: string;
|
|
14
|
+
clusterId: string;
|
|
15
|
+
controller: IRuntimeController & {
|
|
16
|
+
kind: 'cloudly';
|
|
17
|
+
};
|
|
18
|
+
runtimeNamespace: string;
|
|
19
|
+
relay: IClusterRelay;
|
|
20
|
+
}
|
|
21
|
+
/** Sensitive authenticated read input; never persist, log, put in a URL or return it. */
|
|
22
|
+
export interface INodeRuntimeBindingRequest {
|
|
23
|
+
nodeId: string;
|
|
24
|
+
nodeToken: string;
|
|
25
|
+
}
|
|
26
|
+
/** Current server-owned answer to an authenticated Spark-node read. */
|
|
27
|
+
export interface INodeRuntimeBindingRead {
|
|
28
|
+
binding: INodeRuntimeRoutingBinding;
|
|
29
|
+
runtime: IClusterRuntimeReference;
|
|
30
|
+
/** Generation of the Spark bearer that authenticated this exact answer. */
|
|
31
|
+
credentialGeneration: number;
|
|
32
|
+
/** Current Spark session fence; it is observation metadata, not part of the routing binding. */
|
|
33
|
+
sessionEpoch: number;
|
|
34
|
+
}
|
|
35
|
+
export declare const nodeRuntimeBindingContract: Readonly<{
|
|
36
|
+
readonly localMutation: "first-bind-or-exact-replay";
|
|
37
|
+
readonly persistedAuthority: "routing-only";
|
|
38
|
+
readonly runtimeAuthority: "fresh-authenticated-controller-session-only";
|
|
39
|
+
}>;
|
|
40
|
+
/** Exact detached snapshot; shape checks are not authentication. */
|
|
41
|
+
export declare const snapshotNodeRuntimeRoutingBinding: (valueArg: unknown) => INodeRuntimeRoutingBinding;
|
|
42
|
+
/** Exact detached authenticated-read request; validation never logs or returns the bearer. */
|
|
43
|
+
export declare const snapshotNodeRuntimeBindingRequest: (valueArg: unknown) => INodeRuntimeBindingRequest;
|
|
44
|
+
/** Exact detached current read; its runtime must name the binding's cluster. */
|
|
45
|
+
export declare const snapshotNodeRuntimeBindingRead: (valueArg: unknown) => INodeRuntimeBindingRead;
|
|
46
|
+
/**
|
|
47
|
+
* Bind a server answer to the Spark identity that made the authenticated read.
|
|
48
|
+
* Authentication and the current credential transaction remain Cloudly's responsibility.
|
|
49
|
+
*/
|
|
50
|
+
export declare const bindNodeRuntimeBindingRead: (valueArg: unknown, expectedArg: {
|
|
51
|
+
cloudlyOrigin: string;
|
|
52
|
+
nodeId: string;
|
|
53
|
+
credentialGeneration: number;
|
|
54
|
+
}) => INodeRuntimeBindingRead;
|
|
55
|
+
/**
|
|
56
|
+
* Pure content binding for the root-local bind reply. `activeEnrollmentArg` must come from the
|
|
57
|
+
* Pallet owner's current durable state; a historical activation receipt is insufficient.
|
|
58
|
+
*/
|
|
59
|
+
export declare const bindPalletNodeRuntimeBinding: (responseArg: unknown, requestArg: unknown, activeEnrollmentArg: unknown) => INodeRuntimeRoutingBinding;
|
|
60
|
+
/**
|
|
61
|
+
* Pure content binding for offline readback. `activeEnrollmentArg` must come from the Pallet
|
|
62
|
+
* owner's current durable state; a historical activation receipt is insufficient.
|
|
63
|
+
*/
|
|
64
|
+
export declare const bindPalletNodeRuntimeBindingRead: (responseArg: unknown, requestArg: unknown, activeEnrollmentArg: unknown) => INodeRuntimeRoutingBinding;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { validateClusterRelay } from './cluster.js';
|
|
2
|
+
import { snapshotClusterRuntimeReference } from './clusterruntime.js';
|
|
3
|
+
import { snapshotPalletNodeEnrollmentConfirmation } from './nodeenrollment.js';
|
|
4
|
+
import { deepFreezeValue } from '../private/canonicaljson.js';
|
|
5
|
+
import { readExactDataRecord } from '../private/dataproperties.js';
|
|
6
|
+
import { isClusterNodeId } from '../private/nodeidentifier.js';
|
|
7
|
+
import { networkController, networkId } from '../private/networkcontract.js';
|
|
8
|
+
export const nodeRuntimeBindingContract = Object.freeze({
|
|
9
|
+
localMutation: 'first-bind-or-exact-replay',
|
|
10
|
+
persistedAuthority: 'routing-only',
|
|
11
|
+
runtimeAuthority: 'fresh-authenticated-controller-session-only',
|
|
12
|
+
});
|
|
13
|
+
const fail = () => { throw new Error('Node runtime binding contract rejected.'); };
|
|
14
|
+
function requireValue(conditionArg) {
|
|
15
|
+
if (!conditionArg)
|
|
16
|
+
fail();
|
|
17
|
+
}
|
|
18
|
+
const record = (valueArg, keysArg) => {
|
|
19
|
+
const result = readExactDataRecord(valueArg, keysArg);
|
|
20
|
+
requireValue(result !== null);
|
|
21
|
+
return result;
|
|
22
|
+
};
|
|
23
|
+
const positive = (valueArg) => {
|
|
24
|
+
requireValue(typeof valueArg === 'number' && Number.isSafeInteger(valueArg)
|
|
25
|
+
&& valueArg > 0 && !Object.is(valueArg, -0));
|
|
26
|
+
return valueArg;
|
|
27
|
+
};
|
|
28
|
+
const nonNegative = (valueArg) => {
|
|
29
|
+
requireValue(typeof valueArg === 'number' && Number.isSafeInteger(valueArg)
|
|
30
|
+
&& valueArg >= 0 && !Object.is(valueArg, -0));
|
|
31
|
+
return valueArg;
|
|
32
|
+
};
|
|
33
|
+
const nodeId = (valueArg) => isClusterNodeId(valueArg) ? valueArg : fail();
|
|
34
|
+
const nodeToken = (valueArg) => {
|
|
35
|
+
requireValue(typeof valueArg === 'string' && /^secureToken[a-f0-9]{64}$/.test(valueArg));
|
|
36
|
+
return valueArg;
|
|
37
|
+
};
|
|
38
|
+
const relay = (valueArg) => {
|
|
39
|
+
const value = record(valueArg, ['origin']);
|
|
40
|
+
requireValue(validateClusterRelay(value).length === 0);
|
|
41
|
+
return { origin: value.origin };
|
|
42
|
+
};
|
|
43
|
+
const cloudlyOrigin = (valueArg) => relay({ origin: valueArg }).origin;
|
|
44
|
+
const activeEnrollment = (valueArg) => {
|
|
45
|
+
const value = snapshotPalletNodeEnrollmentConfirmation(valueArg);
|
|
46
|
+
requireValue(value.phase === 'active');
|
|
47
|
+
return value;
|
|
48
|
+
};
|
|
49
|
+
/** Exact detached snapshot; shape checks are not authentication. */
|
|
50
|
+
export const snapshotNodeRuntimeRoutingBinding = (valueArg) => {
|
|
51
|
+
try {
|
|
52
|
+
const value = record(valueArg, ['cloudlyOrigin', 'nodeId', 'clusterId', 'controller', 'runtimeNamespace', 'relay']);
|
|
53
|
+
const controller = networkController(record(value.controller, ['kind', 'id', 'epoch']));
|
|
54
|
+
requireValue(controller.kind === 'cloudly');
|
|
55
|
+
return deepFreezeValue({
|
|
56
|
+
cloudlyOrigin: cloudlyOrigin(value.cloudlyOrigin),
|
|
57
|
+
nodeId: nodeId(value.nodeId), clusterId: networkId(value.clusterId),
|
|
58
|
+
controller: { kind: 'cloudly', id: controller.id, epoch: controller.epoch },
|
|
59
|
+
runtimeNamespace: networkId(value.runtimeNamespace), relay: relay(value.relay),
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return fail();
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
/** Exact detached authenticated-read request; validation never logs or returns the bearer. */
|
|
67
|
+
export const snapshotNodeRuntimeBindingRequest = (valueArg) => {
|
|
68
|
+
try {
|
|
69
|
+
const value = record(valueArg, ['nodeId', 'nodeToken']);
|
|
70
|
+
return deepFreezeValue({ nodeId: nodeId(value.nodeId), nodeToken: nodeToken(value.nodeToken) });
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return fail();
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
/** Exact detached current read; its runtime must name the binding's cluster. */
|
|
77
|
+
export const snapshotNodeRuntimeBindingRead = (valueArg) => {
|
|
78
|
+
try {
|
|
79
|
+
const value = record(valueArg, ['binding', 'runtime', 'credentialGeneration', 'sessionEpoch']);
|
|
80
|
+
const binding = snapshotNodeRuntimeRoutingBinding(value.binding);
|
|
81
|
+
const runtime = snapshotClusterRuntimeReference(value.runtime);
|
|
82
|
+
requireValue(runtime.id === binding.clusterId);
|
|
83
|
+
return deepFreezeValue({ binding, runtime,
|
|
84
|
+
credentialGeneration: positive(value.credentialGeneration),
|
|
85
|
+
sessionEpoch: nonNegative(value.sessionEpoch) });
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return fail();
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Bind a server answer to the Spark identity that made the authenticated read.
|
|
93
|
+
* Authentication and the current credential transaction remain Cloudly's responsibility.
|
|
94
|
+
*/
|
|
95
|
+
export const bindNodeRuntimeBindingRead = (valueArg, expectedArg) => {
|
|
96
|
+
try {
|
|
97
|
+
const expected = record(expectedArg, ['cloudlyOrigin', 'nodeId', 'credentialGeneration']);
|
|
98
|
+
const value = snapshotNodeRuntimeBindingRead(valueArg);
|
|
99
|
+
requireValue(value.binding.cloudlyOrigin === cloudlyOrigin(expected.cloudlyOrigin)
|
|
100
|
+
&& value.binding.nodeId === nodeId(expected.nodeId)
|
|
101
|
+
&& value.credentialGeneration === positive(expected.credentialGeneration));
|
|
102
|
+
return value;
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return fail();
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
/**
|
|
109
|
+
* Pure content binding for the root-local bind reply. `activeEnrollmentArg` must come from the
|
|
110
|
+
* Pallet owner's current durable state; a historical activation receipt is insufficient.
|
|
111
|
+
*/
|
|
112
|
+
export const bindPalletNodeRuntimeBinding = (responseArg, requestArg, activeEnrollmentArg) => {
|
|
113
|
+
const response = snapshotNodeRuntimeRoutingBinding(responseArg);
|
|
114
|
+
const request = snapshotNodeRuntimeRoutingBinding(requestArg);
|
|
115
|
+
const active = activeEnrollment(activeEnrollmentArg);
|
|
116
|
+
requireValue(request.cloudlyOrigin === active.cloudlyOrigin && request.nodeId === active.nodeId
|
|
117
|
+
&& JSON.stringify(response) === JSON.stringify(request));
|
|
118
|
+
return response;
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* Pure content binding for offline readback. `activeEnrollmentArg` must come from the Pallet
|
|
122
|
+
* owner's current durable state; a historical activation receipt is insufficient.
|
|
123
|
+
*/
|
|
124
|
+
export const bindPalletNodeRuntimeBindingRead = (responseArg, requestArg, activeEnrollmentArg) => {
|
|
125
|
+
const request = record(requestArg, ['cloudlyOrigin', 'nodeId']);
|
|
126
|
+
const response = snapshotNodeRuntimeRoutingBinding(responseArg);
|
|
127
|
+
const active = activeEnrollment(activeEnrollmentArg);
|
|
128
|
+
const requestedOrigin = cloudlyOrigin(request.cloudlyOrigin);
|
|
129
|
+
const requestedNodeId = nodeId(request.nodeId);
|
|
130
|
+
requireValue(response.cloudlyOrigin === requestedOrigin && response.nodeId === requestedNodeId
|
|
131
|
+
&& requestedOrigin === active.cloudlyOrigin && requestedNodeId === active.nodeId);
|
|
132
|
+
return response;
|
|
133
|
+
};
|
|
134
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZXJ1bnRpbWViaW5kaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZGF0YS9ub2RlcnVudGltZWJpbmRpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXBELE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXRFLE9BQU8sRUFBRSx3Q0FBd0MsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBa0M3RSxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3RELGFBQWEsRUFBRSw0QkFBNEI7SUFDM0Msa0JBQWtCLEVBQUUsY0FBYztJQUNsQyxnQkFBZ0IsRUFBRSw2Q0FBNkM7Q0FDdkQsQ0FBQyxDQUFDO0FBRVosTUFBTSxJQUFJLEdBQUcsR0FBVSxFQUFFLEdBQUcsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFGLFNBQVMsWUFBWSxDQUFDLFlBQXFCO0lBQ3pDLElBQUksQ0FBQyxZQUFZO1FBQUUsSUFBSSxFQUFFLENBQUM7QUFDNUIsQ0FBQztBQUNELE1BQU0sTUFBTSxHQUFHLENBQUMsUUFBaUIsRUFBRSxPQUEwQixFQUEyQixFQUFFO0lBQ3hGLE1BQU0sTUFBTSxHQUFHLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0RCxZQUFZLENBQUMsTUFBTSxLQUFLLElBQUks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
|
|
@@ -11,6 +11,8 @@ import type { IRuntimeConfig } from './runtimeconfig.js';
|
|
|
11
11
|
export interface IRuntimeSessionBinding {
|
|
12
12
|
reporterSessionId: string;
|
|
13
13
|
nodeId: string;
|
|
14
|
+
/** Cluster read from the controller's owned node record when this session is admitted. */
|
|
15
|
+
clusterId: string;
|
|
14
16
|
credentialGeneration: number;
|
|
15
17
|
sessionEpoch: number;
|
|
16
18
|
controllerInstanceId: string;
|
|
@@ -126,12 +126,13 @@ const reference = (valueArg) => {
|
|
|
126
126
|
return { assignmentId: identifier(value.assignmentId), generation: positive(value.generation), digest: value.digest };
|
|
127
127
|
};
|
|
128
128
|
const session = (valueArg) => {
|
|
129
|
-
const value = record(valueArg, ['reporterSessionId', 'nodeId', 'credentialGeneration',
|
|
129
|
+
const value = record(valueArg, ['reporterSessionId', 'nodeId', 'clusterId', 'credentialGeneration',
|
|
130
130
|
'sessionEpoch', 'controllerInstanceId', 'controller', 'runtimeNamespace']);
|
|
131
131
|
const controller = record(value.controller, ['kind', 'id', 'epoch']);
|
|
132
132
|
requireValue(controller.kind === 'cloudly' || controller.kind === 'onebox');
|
|
133
133
|
return {
|
|
134
134
|
reporterSessionId: identifier(value.reporterSessionId), nodeId: nodeId(value.nodeId),
|
|
135
|
+
clusterId: identifier(value.clusterId),
|
|
135
136
|
credentialGeneration: positive(value.credentialGeneration), sessionEpoch: positive(value.sessionEpoch),
|
|
136
137
|
controllerInstanceId: identifier(value.controllerInstanceId),
|
|
137
138
|
controller: { kind: controller.kind, id: identifier(controller.id), epoch: identifier(controller.epoch) },
|
|
@@ -139,7 +140,8 @@ const session = (valueArg) => {
|
|
|
139
140
|
};
|
|
140
141
|
};
|
|
141
142
|
const sameSession = (leftArg, rightArg) => canonical(leftArg) === canonical(rightArg);
|
|
142
|
-
const sameOwner = (leftArg, rightArg) => leftArg.nodeId === rightArg.nodeId && leftArg.
|
|
143
|
+
const sameOwner = (leftArg, rightArg) => leftArg.nodeId === rightArg.nodeId && leftArg.clusterId === rightArg.clusterId
|
|
144
|
+
&& leftArg.runtimeNamespace === rightArg.runtimeNamespace
|
|
143
145
|
&& canonical(leftArg.controller) === canonical(rightArg.controller);
|
|
144
146
|
const matchesAssignment = (sessionArg, assignmentArg) => sessionArg.nodeId === assignmentArg.nodeId && sessionArg.runtimeNamespace === assignmentArg.runtimeNamespace
|
|
145
147
|
&& canonical(sessionArg.controller) === canonical(assignmentArg.controller);
|
|
@@ -322,4 +324,4 @@ export const bindGetRuntimeRegistryCredentialRequest = async (valueArg, assignme
|
|
|
322
324
|
return fail();
|
|
323
325
|
}
|
|
324
326
|
};
|
|
325
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZXNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL3J1bnRpbWVzZXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUtyRCxPQUFPLEVBQ0wsNkJBQTZCLEVBQUUsNkJBQTZCLEVBQUUsb0NBQW9DLEVBQ2xHLHlCQUF5QixFQUFFLG9DQUFvQyxFQUFFLHlCQUF5QixHQUMzRixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBdUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRixPQUFPLEVBQUUsNkJBQTZCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFnSS9EOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNsRCx5QkFBeUIsRUFBRSxPQUFPO0lBQ2xDLHNCQUFzQixFQUFFLE1BQU07SUFDOUIsNEJBQTRCLEVBQUUsSUFBSTtJQUNsQyxpQkFBaUIsRUFBRSx5REFBeUQ7SUFDNUUsOEJBQThCLEVBQUUsOEJBQThCO0lBQzlELHVCQUF1QixFQUFFLDJDQUEyQztJQUNwRSw4RkFBOEY7SUFDOUYsb0JBQW9CLEVBQUUsMkRBQTJEO0lBQ2pGLEtBQUssRUFBRSxvQ0FBb0M7Q0FDbkMsQ0FBQyxDQUFDO0FBRVosTUFBTSxJQUFJLEdBQUcsR0FBVSxFQUFFLEdBQUcsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RSxTQUFTLFlBQVksQ0FBQyxZQUFxQjtJQUN6QyxJ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
|
|
327
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZXNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL3J1bnRpbWVzZXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUtyRCxPQUFPLEVBQ0wsNkJBQTZCLEVBQUUsNkJBQTZCLEVBQUUsb0NBQW9DLEVBQ2xHLHlCQUF5QixFQUFFLG9DQUFvQyxFQUFFLHlCQUF5QixHQUMzRixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBdUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRixPQUFPLEVBQUUsNkJBQTZCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFrSS9EOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNsRCx5QkFBeUIsRUFBRSxPQUFPO0lBQ2xDLHNCQUFzQixFQUFFLE1BQU07SUFDOUIsNEJBQTRCLEVBQUUsSUFBSTtJQUNsQyxpQkFBaUIsRUFBRSx5REFBeUQ7SUFDNUUsOEJBQThCLEVBQUUsOEJBQThCO0lBQzlELHVCQUF1QixFQUFFLDJDQUEyQztJQUNwRSw4RkFBOEY7SUFDOUYsb0JBQW9CLEVBQUUsMkRBQTJEO0lBQ2pGLEtBQUssRUFBRSxvQ0FBb0M7Q0FDbkMsQ0FBQyxDQUFDO0FBRVosTUFBTSxJQUFJLEdBQUcsR0FBVSxFQUFFLEdBQUcsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RSxTQUFTLFlBQVksQ0FBQyxZQUFxQjtJQUN6QyxJ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
|
|
@@ -6,6 +6,7 @@ import type { IDeployment } from '../data/deployment.js';
|
|
|
6
6
|
import type { IIdentity } from '../data/user.js';
|
|
7
7
|
import type { INodeCredentialMetadata, INodeCredentialMutationPreconditions, INodeCredentialMutationResult, TNodeCredentialPurpose } from '../data/nodecredential.js';
|
|
8
8
|
import type { INodeRuntimeRetirement } from '../data/noderetirement.js';
|
|
9
|
+
import type { INodeRuntimeBindingRead, INodeRuntimeBindingRequest } from '../data/noderuntimebinding.js';
|
|
9
10
|
import type { INodeEnrollmentRequest, INodeEnrollmentAcknowledgement, INodeEnrollmentState } from '../data/nodeenrollment.js';
|
|
10
11
|
/** Node-self adoption preconditions, not an admin or workload RBAC grant. */
|
|
11
12
|
export interface IReq_Spark_Cloudly_GetNodeEnrollmentState extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Spark_Cloudly_GetNodeEnrollmentState> {
|
|
@@ -24,6 +25,16 @@ export interface IReq_Spark_Cloudly_EnrollNode extends plugins.typedrequestInter
|
|
|
24
25
|
/** Replays require the exact receipt AND both current credential authorities. */
|
|
25
26
|
response: INodeEnrollmentAcknowledgement;
|
|
26
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Current Spark-node-authenticated routing read. Cloudly derives every response identity from its
|
|
30
|
+
* node, cluster, runtime-controller, relay and credential records in one consistent read.
|
|
31
|
+
*/
|
|
32
|
+
export interface IReq_Spark_Cloudly_GetNodeRuntimeBinding extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Spark_Cloudly_GetNodeRuntimeBinding> {
|
|
33
|
+
method: 'getNodeRuntimeBinding';
|
|
34
|
+
request: INodeRuntimeBindingRequest;
|
|
35
|
+
/** Routing and current phase observation only; this grants no workload or phase authority. */
|
|
36
|
+
response: INodeRuntimeBindingRead;
|
|
37
|
+
}
|
|
27
38
|
/** Requires verified platform-infrastructure admin authority; returns public data only. */
|
|
28
39
|
export interface IRequest_Any_Cloudly_GetNodeConfig extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IRequest_Any_Cloudly_GetNodeConfig> {
|
|
29
40
|
method: 'getNodeConfig';
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
2
|
import type { INodeEnrollment, IPalletNodeEnrollmentActivation, IPalletNodeEnrollmentPreparation, IPalletNodeEnrollmentBound, IPalletNodeEnrollmentActive } from '../data/nodeenrollment.js';
|
|
3
|
+
import type { INodeRuntimeRoutingBinding } from '../data/noderuntimebinding.js';
|
|
3
4
|
/** Root-authenticated node-local IPC only; never expose on a network router. */
|
|
4
5
|
export interface IReq_Spark_Pallet_PrepareNodeEnrollment extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Spark_Pallet_PrepareNodeEnrollment> {
|
|
5
6
|
method: 'preparePalletNodeEnrollment';
|
|
@@ -21,3 +22,25 @@ export interface IReq_Spark_Pallet_ActivateNodeEnrollment extends plugins.typedr
|
|
|
21
22
|
/** Prove the exact current local identity after activation; a historical receipt is insufficient. */
|
|
22
23
|
response: IPalletNodeEnrollmentActive;
|
|
23
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* First immutable routing bind or exact replay. The local owner rejects unless `cloudlyOrigin` and
|
|
27
|
+
* `nodeId` match its current active enrollment; this never mutates credentials, workload state or runtime phase.
|
|
28
|
+
*/
|
|
29
|
+
export interface IReq_Spark_Pallet_BindNodeRuntimeBinding extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Spark_Pallet_BindNodeRuntimeBinding> {
|
|
30
|
+
method: 'bindPalletNodeRuntimeBinding';
|
|
31
|
+
request: INodeRuntimeRoutingBinding;
|
|
32
|
+
/** Exact currently persisted binding, answered only after the durable write or exact replay. */
|
|
33
|
+
response: INodeRuntimeRoutingBinding;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Offline routing readback. The root-local owner rejects an absent binding, an inactive enrollment
|
|
37
|
+
* or a requested origin/node different from both its active enrollment and persisted binding.
|
|
38
|
+
*/
|
|
39
|
+
export interface IReq_Spark_Pallet_ReadNodeRuntimeBinding extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Spark_Pallet_ReadNodeRuntimeBinding> {
|
|
40
|
+
method: 'readPalletNodeRuntimeBinding';
|
|
41
|
+
request: {
|
|
42
|
+
cloudlyOrigin: string;
|
|
43
|
+
nodeId: string;
|
|
44
|
+
};
|
|
45
|
+
response: INodeRuntimeRoutingBinding;
|
|
46
|
+
}
|
|
@@ -145,7 +145,8 @@ export declare const createRuntimeAssignmentSecretMaterialEnvelopeContext: (cont
|
|
|
145
145
|
export declare const bindGetRuntimeAssignmentSecretMaterialRequest: (valueArg: unknown, assignmentArg: unknown, trustedSessionArg: unknown, activeRecipientArg: unknown) => Promise<IGetRuntimeAssignmentSecretMaterialRequest>;
|
|
146
146
|
/**
|
|
147
147
|
* Verify one complete response without opening a private key. The caller must
|
|
148
|
-
* supply its authenticated current session, current assignment, pinned config
|
|
149
|
-
*
|
|
148
|
+
* supply its authenticated current session, current assignment, pinned config
|
|
149
|
+
* and active recipient from their respective trusted owners. The controller-issued
|
|
150
|
+
* session binding supplies the enrolled cluster.
|
|
150
151
|
*/
|
|
151
|
-
export declare const bindGetRuntimeAssignmentSecretMaterialResponse: (valueArg: unknown, requestArg: unknown, assignmentArg: unknown, configArg: unknown, trustedSessionArg: unknown,
|
|
152
|
+
export declare const bindGetRuntimeAssignmentSecretMaterialResponse: (valueArg: unknown, requestArg: unknown, assignmentArg: unknown, configArg: unknown, trustedSessionArg: unknown, activeRecipientArg: unknown) => Promise<IGetRuntimeAssignmentSecretMaterialResponse>;
|
|
@@ -351,21 +351,23 @@ export const bindGetRuntimeAssignmentSecretMaterialRequest = async (valueArg, as
|
|
|
351
351
|
};
|
|
352
352
|
/**
|
|
353
353
|
* Verify one complete response without opening a private key. The caller must
|
|
354
|
-
* supply its authenticated current session, current assignment, pinned config
|
|
355
|
-
*
|
|
354
|
+
* supply its authenticated current session, current assignment, pinned config
|
|
355
|
+
* and active recipient from their respective trusted owners. The controller-issued
|
|
356
|
+
* session binding supplies the enrolled cluster.
|
|
356
357
|
*/
|
|
357
|
-
export const bindGetRuntimeAssignmentSecretMaterialResponse = async (valueArg, requestArg, assignmentArg, configArg, trustedSessionArg,
|
|
358
|
+
export const bindGetRuntimeAssignmentSecretMaterialResponse = async (valueArg, requestArg, assignmentArg, configArg, trustedSessionArg, activeRecipientArg) => {
|
|
358
359
|
try {
|
|
359
360
|
const value = exact(capture(valueArg, runtimeAssignmentSecretContract.maximumMaterialBytes), ['material']);
|
|
361
|
+
const trustedSession = session(capture(trustedSessionArg));
|
|
360
362
|
const material = exact(value.material, [
|
|
361
363
|
'assignment', 'nodeId', 'secrets', 'recipientKeyId', 'recipientGeneration',
|
|
362
364
|
'authority', 'manifest', 'workloadInit', 'entries',
|
|
363
365
|
]);
|
|
364
|
-
const request = await bindGetRuntimeAssignmentSecretMaterialRequest(requestArg, assignmentArg,
|
|
366
|
+
const request = await bindGetRuntimeAssignmentSecretMaterialRequest(requestArg, assignmentArg, trustedSession, activeRecipientArg);
|
|
365
367
|
const assignment = snapshotRuntimeAssignment(assignmentArg);
|
|
366
|
-
const authority = await bindRuntimeAssignmentSecretAuthority(material.authority, material.manifest, assignment, configArg,
|
|
368
|
+
const authority = await bindRuntimeAssignmentSecretAuthority(material.authority, material.manifest, assignment, configArg, trustedSession.clusterId);
|
|
367
369
|
const manifest = material.manifest;
|
|
368
|
-
requireValue(
|
|
370
|
+
requireValue(trustedSession.clusterId === manifest.clusterId
|
|
369
371
|
&& material.nodeId === assignment.nodeId
|
|
370
372
|
&& same(assignmentReference(material.assignment), request.assignment)
|
|
371
373
|
&& same(authorityReference(material.secrets), request.secrets)
|
|
@@ -424,4 +426,4 @@ export const bindGetRuntimeAssignmentSecretMaterialResponse = async (valueArg, r
|
|
|
424
426
|
return fail();
|
|
425
427
|
}
|
|
426
428
|
};
|
|
427
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5hc3NpZ25tZW50c2VjcmV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvcnVudGltZS5hc3NpZ25tZW50c2VjcmV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBTXhDLE9BQU8sRUFDTCw2QkFBNkIsRUFBRSw2QkFBNkIsRUFBRSxjQUFjLEVBQzVFLHlCQUF5QixFQUFFLDZCQUE2QixFQUFFLHlCQUF5QixFQUNuRiw4QkFBOEIsRUFBRSx1Q0FBdUMsRUFDdkUsK0JBQStCLEVBQUUsMEJBQTBCLEVBQUUsa0NBQWtDLEVBQy9GLDJCQUEyQixHQUM1QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3JELE9BQU8sRUFDTCwyQ0FBMkMsRUFBRSw4Q0FBOEMsR0FHNUYsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFOUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDM0QsZ0JBQWdCLEVBQUUsZ0RBQWdEO0lBQ2xFLG1CQUFtQixFQUFFLE9BQU87SUFDNUIsb0JBQW9CLEVBQUUsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJO0lBQ3ZDLEtBQUssRUFBRSw4Q0FBOEM7Q0FDN0MsQ0FBQyxDQUFDO0FBRVosTUFBTSxJQUFJLEdBQUcsR0FBVSxFQUFFLEdBQUcsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RixTQUFTLFlBQVksQ0FBQyxZQUFxQjtJQUN6QyxJQUFJLENBQUMsWUFBWTtRQUFF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
|
|
429
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5hc3NpZ25tZW50c2VjcmV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvcnVudGltZS5hc3NpZ25tZW50c2VjcmV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBTXhDLE9BQU8sRUFDTCw2QkFBNkIsRUFBRSw2QkFBNkIsRUFBRSxjQUFjLEVBQzVFLHlCQUF5QixFQUFFLDZCQUE2QixFQUFFLHlCQUF5QixFQUNuRiw4QkFBOEIsRUFBRSx1Q0FBdUMsRUFDdkUsK0JBQStCLEVBQUUsMEJBQTBCLEVBQUUsa0NBQWtDLEVBQy9GLDJCQUEyQixHQUM1QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3JELE9BQU8sRUFDTCwyQ0FBMkMsRUFBRSw4Q0FBOEMsR0FHNUYsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFOUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDM0QsZ0JBQWdCLEVBQUUsZ0RBQWdEO0lBQ2xFLG1CQUFtQixFQUFFLE9BQU87SUFDNUIsb0JBQW9CLEVBQUUsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJO0lBQ3ZDLEtBQUssRUFBRSw4Q0FBOEM7Q0FDN0MsQ0FBQyxDQUFDO0FBRVosTUFBTSxJQUFJLEdBQUcsR0FBVSxFQUFFLEdBQUcsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RixTQUFTLFlBQVksQ0FBQyxZQUFxQjtJQUN6QyxJQUFJLENBQUMsWUFBWTtRQUFF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
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -266,6 +266,37 @@ bounded time/concurrency, root-only directory/socket permissions and drained
|
|
|
266
266
|
cleanup. The package supplies no listener, permission checks or persistent state.
|
|
267
267
|
No bearer, generic rotation operation or database access is part of this IPC API.
|
|
268
268
|
|
|
269
|
+
### Node Runtime Routing Binding
|
|
270
|
+
|
|
271
|
+
`requests.node.getNodeRuntimeBinding { nodeId, nodeToken }` is a current
|
|
272
|
+
Spark-node-authenticated read. Cloudly derives `data.INodeRuntimeBindingRead`
|
|
273
|
+
from its current credential, node, cluster, durable runtime-controller, relay and
|
|
274
|
+
cluster-runtime records. The answer contains the exact routing identity
|
|
275
|
+
`{ cloudlyOrigin, nodeId, clusterId, controller, runtimeNamespace, relay }`, the
|
|
276
|
+
current `{ id, phase, generation }` runtime reference and the Spark credential
|
|
277
|
+
generation and session epoch that authenticated the read.
|
|
278
|
+
`snapshotNodeRuntimeBindingRead` requires the runtime id to equal the routing
|
|
279
|
+
cluster, and `bindNodeRuntimeBindingRead` binds the answer to Spark's exact
|
|
280
|
+
immutable Cloudly origin, node and credential generation. Neither helper
|
|
281
|
+
authenticates the server.
|
|
282
|
+
|
|
283
|
+
`requests.pallet.bindPalletNodeRuntimeBinding` and
|
|
284
|
+
`readPalletNodeRuntimeBinding` belong on the existing root-owned Pallet enrollment
|
|
285
|
+
control socket. Bind is absent-to-present only: the current active Pallet
|
|
286
|
+
enrollment must name the same canonical Cloudly origin and node, an exact replay
|
|
287
|
+
is idempotent and every different origin, node, cluster, controller, namespace
|
|
288
|
+
or relay conflicts. Read requires the requested origin and node to equal both
|
|
289
|
+
the active enrollment and the stored binding; an absent binding rejects. Spark
|
|
290
|
+
applies and reads back the binding before starting `runtime-serve`. On an
|
|
291
|
+
offline reboot it may read the exact persisted routing identity to select the
|
|
292
|
+
relay, but that record grants no workload permission and no right to advance or
|
|
293
|
+
run a cluster phase. Fresh authenticated runtime-session state remains the only
|
|
294
|
+
workload authority.
|
|
295
|
+
|
|
296
|
+
The local operations carry no bearer, signing key, generic configuration field,
|
|
297
|
+
phase mutation or caller-authored permission. `nodeRuntimeBindingContract`
|
|
298
|
+
states the immutable local mutation and routing-only persistence rules.
|
|
299
|
+
|
|
269
300
|
### Service Machine Credentials
|
|
270
301
|
|
|
271
302
|
`requests.admin.getServiceMachineCredential` inspects redacted metadata;
|
|
@@ -839,7 +870,10 @@ cluster publishes in [`ICluster.data.relay`](#cluster-relay-block) while Cloudly
|
|
|
839
870
|
remains the credential authority. The receiver derives the physical peer, process instance
|
|
840
871
|
and registration idempotency; callers cannot supply those authorities. A serialized
|
|
841
872
|
`IRuntimeSessionBinding` provides content to compare with authenticated peer
|
|
842
|
-
state and does not itself authenticate a connection.
|
|
873
|
+
state and does not itself authenticate a connection. Its `clusterId` is issued
|
|
874
|
+
from the controller-owned node record during registration; it is never selected
|
|
875
|
+
by Pallet, and a current-session check must fence the node to that same cluster.
|
|
876
|
+
Registry credentials are
|
|
843
877
|
ephemeral, bounded and authorized against an exact current `run` assignment.
|
|
844
878
|
|
|
845
879
|
After reconnect or credential rotation, the current authenticated session may
|
|
@@ -931,10 +965,11 @@ manifest, exact sorted version coverage, an approved immutable WorkloadInit
|
|
|
931
965
|
authority when launcher delivery requires it, and X25519 envelopes. Each
|
|
932
966
|
envelope context binds the final assignment digest, node, organization, cluster,
|
|
933
967
|
service, descriptor digest, image/invocation/secret rollouts, secret version and
|
|
934
|
-
recipient generation. `bindGetRuntimeAssignmentSecretMaterialRequest`
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
968
|
+
recipient generation. `bindGetRuntimeAssignmentSecretMaterialRequest` validates
|
|
969
|
+
the request against server-owned current assignment/session and active recipient
|
|
970
|
+
inputs. `bindGetRuntimeAssignmentSecretMaterialResponse` additionally validates
|
|
971
|
+
the response against the pinned config and cluster bound into that authenticated
|
|
972
|
+
session; neither helper decrypts. A serialized
|
|
938
973
|
`IRuntimeSessionBinding` does not authenticate a peer. Cloudly still owns
|
|
939
974
|
node-session authentication and peer or relay ownership, current slot/service authority, recipient CAS,
|
|
940
975
|
accepted-version retention and issuance policy. Pallet owns recipient
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -27,6 +27,15 @@ export interface IClusterRuntime {
|
|
|
27
27
|
changedBy: string;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
+
/** Current phase reference without its administrative audit metadata. */
|
|
31
|
+
export interface IClusterRuntimeReference {
|
|
32
|
+
/** The cluster id. */
|
|
33
|
+
id: string;
|
|
34
|
+
phase: TClusterRuntimePhase;
|
|
35
|
+
/** Exact compare-and-swap generation observed with this phase. */
|
|
36
|
+
generation: number;
|
|
37
|
+
}
|
|
38
|
+
|
|
30
39
|
/**
|
|
31
40
|
* Why a cluster cannot leave `swarm` yet. Each blocker names the node or service it is about, so an
|
|
32
41
|
* administrator can act on it without a second query.
|
|
@@ -43,3 +52,10 @@ export const snapshotClusterRuntime = (value: unknown): IClusterRuntime => produ
|
|
|
43
52
|
return { id: networkId(item.id), phase: item.phase, generation: networkCounter(item.generation),
|
|
44
53
|
changedAt: networkCounter(item.changedAt), changedBy: networkId(item.changedBy) };
|
|
45
54
|
});
|
|
55
|
+
|
|
56
|
+
/** Structural snapshot for node routing reads; it grants no right to move or run a phase. */
|
|
57
|
+
export const snapshotClusterRuntimeReference = (value: unknown): IClusterRuntimeReference => producerSafe(() => {
|
|
58
|
+
const item = networkRecord(captureNetwork(value), ['id', 'phase', 'generation']);
|
|
59
|
+
requireNetwork(isOneOf(clusterRuntimePhases, item.phase));
|
|
60
|
+
return { id: networkId(item.id), phase: item.phase, generation: networkCounter(item.generation) };
|
|
61
|
+
});
|
package/ts/data/index.ts
CHANGED
|
@@ -26,6 +26,7 @@ export * from './isolatedrestore.golden.js';
|
|
|
26
26
|
export * from './mail.js';
|
|
27
27
|
export * from './nodecredential.js';
|
|
28
28
|
export * from './nodeenrollment.js';
|
|
29
|
+
export * from './noderuntimebinding.js';
|
|
29
30
|
export * from './noderetirement.js';
|
|
30
31
|
export * from './networkaddressplan.js';
|
|
31
32
|
export * from './networkauthority.js';
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import type { IClusterRelay } from './cluster.js';
|
|
2
|
+
import { validateClusterRelay } from './cluster.js';
|
|
3
|
+
import type { IClusterRuntimeReference } from './clusterruntime.js';
|
|
4
|
+
import { snapshotClusterRuntimeReference } from './clusterruntime.js';
|
|
5
|
+
import type { IPalletNodeEnrollmentActive } from './nodeenrollment.js';
|
|
6
|
+
import { snapshotPalletNodeEnrollmentConfirmation } from './nodeenrollment.js';
|
|
7
|
+
import type { IRuntimeController } from './runtimeassignment.js';
|
|
8
|
+
import { deepFreezeValue } from '../private/canonicaljson.js';
|
|
9
|
+
import { readExactDataRecord } from '../private/dataproperties.js';
|
|
10
|
+
import { isClusterNodeId } from '../private/nodeidentifier.js';
|
|
11
|
+
import { networkController, networkId } from '../private/networkcontract.js';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Durable routing identity for one Pallet node.
|
|
15
|
+
*
|
|
16
|
+
* This is not a runtime session, a workload grant or a cluster-phase authority. It only names the
|
|
17
|
+
* Cloudly controller and relay through which the node obtains fresh authenticated session state.
|
|
18
|
+
*/
|
|
19
|
+
export interface INodeRuntimeRoutingBinding {
|
|
20
|
+
/** Exact immutable enrollment authority; Pallet compares it with its current active identity. */
|
|
21
|
+
cloudlyOrigin: string;
|
|
22
|
+
nodeId: string;
|
|
23
|
+
clusterId: string;
|
|
24
|
+
controller: IRuntimeController & { kind: 'cloudly' };
|
|
25
|
+
runtimeNamespace: string;
|
|
26
|
+
relay: IClusterRelay;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Sensitive authenticated read input; never persist, log, put in a URL or return it. */
|
|
30
|
+
export interface INodeRuntimeBindingRequest {
|
|
31
|
+
nodeId: string;
|
|
32
|
+
nodeToken: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Current server-owned answer to an authenticated Spark-node read. */
|
|
36
|
+
export interface INodeRuntimeBindingRead {
|
|
37
|
+
binding: INodeRuntimeRoutingBinding;
|
|
38
|
+
runtime: IClusterRuntimeReference;
|
|
39
|
+
/** Generation of the Spark bearer that authenticated this exact answer. */
|
|
40
|
+
credentialGeneration: number;
|
|
41
|
+
/** Current Spark session fence; it is observation metadata, not part of the routing binding. */
|
|
42
|
+
sessionEpoch: number;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export const nodeRuntimeBindingContract = Object.freeze({
|
|
46
|
+
localMutation: 'first-bind-or-exact-replay',
|
|
47
|
+
persistedAuthority: 'routing-only',
|
|
48
|
+
runtimeAuthority: 'fresh-authenticated-controller-session-only',
|
|
49
|
+
} as const);
|
|
50
|
+
|
|
51
|
+
const fail = (): never => { throw new Error('Node runtime binding contract rejected.'); };
|
|
52
|
+
function requireValue(conditionArg: unknown): asserts conditionArg {
|
|
53
|
+
if (!conditionArg) fail();
|
|
54
|
+
}
|
|
55
|
+
const record = (valueArg: unknown, keysArg: readonly string[]): Record<string, unknown> => {
|
|
56
|
+
const result = readExactDataRecord(valueArg, keysArg);
|
|
57
|
+
requireValue(result !== null);
|
|
58
|
+
return result;
|
|
59
|
+
};
|
|
60
|
+
const positive = (valueArg: unknown): number => {
|
|
61
|
+
requireValue(typeof valueArg === 'number' && Number.isSafeInteger(valueArg)
|
|
62
|
+
&& valueArg > 0 && !Object.is(valueArg, -0));
|
|
63
|
+
return valueArg;
|
|
64
|
+
};
|
|
65
|
+
const nonNegative = (valueArg: unknown): number => {
|
|
66
|
+
requireValue(typeof valueArg === 'number' && Number.isSafeInteger(valueArg)
|
|
67
|
+
&& valueArg >= 0 && !Object.is(valueArg, -0));
|
|
68
|
+
return valueArg;
|
|
69
|
+
};
|
|
70
|
+
const nodeId = (valueArg: unknown): string => isClusterNodeId(valueArg) ? valueArg : fail();
|
|
71
|
+
const nodeToken = (valueArg: unknown): string => {
|
|
72
|
+
requireValue(typeof valueArg === 'string' && /^secureToken[a-f0-9]{64}$/.test(valueArg));
|
|
73
|
+
return valueArg;
|
|
74
|
+
};
|
|
75
|
+
const relay = (valueArg: unknown): IClusterRelay => {
|
|
76
|
+
const value = record(valueArg, ['origin']);
|
|
77
|
+
requireValue(validateClusterRelay(value).length === 0);
|
|
78
|
+
return { origin: value.origin as string };
|
|
79
|
+
};
|
|
80
|
+
const cloudlyOrigin = (valueArg: unknown): string => relay({ origin: valueArg }).origin;
|
|
81
|
+
const activeEnrollment = (valueArg: unknown): IPalletNodeEnrollmentActive => {
|
|
82
|
+
const value = snapshotPalletNodeEnrollmentConfirmation(valueArg);
|
|
83
|
+
requireValue(value.phase === 'active');
|
|
84
|
+
return value;
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
/** Exact detached snapshot; shape checks are not authentication. */
|
|
88
|
+
export const snapshotNodeRuntimeRoutingBinding = (
|
|
89
|
+
valueArg: unknown,
|
|
90
|
+
): INodeRuntimeRoutingBinding => {
|
|
91
|
+
try {
|
|
92
|
+
const value = record(valueArg,
|
|
93
|
+
['cloudlyOrigin', 'nodeId', 'clusterId', 'controller', 'runtimeNamespace', 'relay']);
|
|
94
|
+
const controller = networkController(record(value.controller, ['kind', 'id', 'epoch']));
|
|
95
|
+
requireValue(controller.kind === 'cloudly');
|
|
96
|
+
return deepFreezeValue({
|
|
97
|
+
cloudlyOrigin: cloudlyOrigin(value.cloudlyOrigin),
|
|
98
|
+
nodeId: nodeId(value.nodeId), clusterId: networkId(value.clusterId),
|
|
99
|
+
controller: { kind: 'cloudly', id: controller.id, epoch: controller.epoch },
|
|
100
|
+
runtimeNamespace: networkId(value.runtimeNamespace), relay: relay(value.relay),
|
|
101
|
+
});
|
|
102
|
+
} catch {
|
|
103
|
+
return fail();
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
/** Exact detached authenticated-read request; validation never logs or returns the bearer. */
|
|
108
|
+
export const snapshotNodeRuntimeBindingRequest = (
|
|
109
|
+
valueArg: unknown,
|
|
110
|
+
): INodeRuntimeBindingRequest => {
|
|
111
|
+
try {
|
|
112
|
+
const value = record(valueArg, ['nodeId', 'nodeToken']);
|
|
113
|
+
return deepFreezeValue({ nodeId: nodeId(value.nodeId), nodeToken: nodeToken(value.nodeToken) });
|
|
114
|
+
} catch {
|
|
115
|
+
return fail();
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
/** Exact detached current read; its runtime must name the binding's cluster. */
|
|
120
|
+
export const snapshotNodeRuntimeBindingRead = (
|
|
121
|
+
valueArg: unknown,
|
|
122
|
+
): INodeRuntimeBindingRead => {
|
|
123
|
+
try {
|
|
124
|
+
const value = record(valueArg,
|
|
125
|
+
['binding', 'runtime', 'credentialGeneration', 'sessionEpoch']);
|
|
126
|
+
const binding = snapshotNodeRuntimeRoutingBinding(value.binding);
|
|
127
|
+
const runtime = snapshotClusterRuntimeReference(value.runtime);
|
|
128
|
+
requireValue(runtime.id === binding.clusterId);
|
|
129
|
+
return deepFreezeValue({ binding, runtime,
|
|
130
|
+
credentialGeneration: positive(value.credentialGeneration),
|
|
131
|
+
sessionEpoch: nonNegative(value.sessionEpoch) });
|
|
132
|
+
} catch {
|
|
133
|
+
return fail();
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Bind a server answer to the Spark identity that made the authenticated read.
|
|
139
|
+
* Authentication and the current credential transaction remain Cloudly's responsibility.
|
|
140
|
+
*/
|
|
141
|
+
export const bindNodeRuntimeBindingRead = (
|
|
142
|
+
valueArg: unknown,
|
|
143
|
+
expectedArg: { cloudlyOrigin: string; nodeId: string; credentialGeneration: number },
|
|
144
|
+
): INodeRuntimeBindingRead => {
|
|
145
|
+
try {
|
|
146
|
+
const expected = record(expectedArg, ['cloudlyOrigin', 'nodeId', 'credentialGeneration']);
|
|
147
|
+
const value = snapshotNodeRuntimeBindingRead(valueArg);
|
|
148
|
+
requireValue(value.binding.cloudlyOrigin === cloudlyOrigin(expected.cloudlyOrigin)
|
|
149
|
+
&& value.binding.nodeId === nodeId(expected.nodeId)
|
|
150
|
+
&& value.credentialGeneration === positive(expected.credentialGeneration));
|
|
151
|
+
return value;
|
|
152
|
+
} catch {
|
|
153
|
+
return fail();
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Pure content binding for the root-local bind reply. `activeEnrollmentArg` must come from the
|
|
159
|
+
* Pallet owner's current durable state; a historical activation receipt is insufficient.
|
|
160
|
+
*/
|
|
161
|
+
export const bindPalletNodeRuntimeBinding = (
|
|
162
|
+
responseArg: unknown,
|
|
163
|
+
requestArg: unknown,
|
|
164
|
+
activeEnrollmentArg: unknown,
|
|
165
|
+
): INodeRuntimeRoutingBinding => {
|
|
166
|
+
const response = snapshotNodeRuntimeRoutingBinding(responseArg);
|
|
167
|
+
const request = snapshotNodeRuntimeRoutingBinding(requestArg);
|
|
168
|
+
const active = activeEnrollment(activeEnrollmentArg);
|
|
169
|
+
requireValue(request.cloudlyOrigin === active.cloudlyOrigin && request.nodeId === active.nodeId
|
|
170
|
+
&& JSON.stringify(response) === JSON.stringify(request));
|
|
171
|
+
return response;
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Pure content binding for offline readback. `activeEnrollmentArg` must come from the Pallet
|
|
176
|
+
* owner's current durable state; a historical activation receipt is insufficient.
|
|
177
|
+
*/
|
|
178
|
+
export const bindPalletNodeRuntimeBindingRead = (
|
|
179
|
+
responseArg: unknown,
|
|
180
|
+
requestArg: unknown,
|
|
181
|
+
activeEnrollmentArg: unknown,
|
|
182
|
+
): INodeRuntimeRoutingBinding => {
|
|
183
|
+
const request = record(requestArg, ['cloudlyOrigin', 'nodeId']);
|
|
184
|
+
const response = snapshotNodeRuntimeRoutingBinding(responseArg);
|
|
185
|
+
const active = activeEnrollment(activeEnrollmentArg);
|
|
186
|
+
const requestedOrigin = cloudlyOrigin(request.cloudlyOrigin);
|
|
187
|
+
const requestedNodeId = nodeId(request.nodeId);
|
|
188
|
+
requireValue(response.cloudlyOrigin === requestedOrigin && response.nodeId === requestedNodeId
|
|
189
|
+
&& requestedOrigin === active.cloudlyOrigin && requestedNodeId === active.nodeId);
|
|
190
|
+
return response;
|
|
191
|
+
};
|
|
@@ -23,6 +23,8 @@ import { isClusterNodeId } from '../private/nodeidentifier.js';
|
|
|
23
23
|
export interface IRuntimeSessionBinding {
|
|
24
24
|
reporterSessionId: string;
|
|
25
25
|
nodeId: string;
|
|
26
|
+
/** Cluster read from the controller's owned node record when this session is admitted. */
|
|
27
|
+
clusterId: string;
|
|
26
28
|
credentialGeneration: number;
|
|
27
29
|
sessionEpoch: number;
|
|
28
30
|
controllerInstanceId: string;
|
|
@@ -254,12 +256,13 @@ const reference = (valueArg: unknown): IRuntimeAssignmentReference => {
|
|
|
254
256
|
return { assignmentId: identifier(value.assignmentId), generation: positive(value.generation), digest: value.digest };
|
|
255
257
|
};
|
|
256
258
|
const session = (valueArg: unknown): IRuntimeSessionBinding => {
|
|
257
|
-
const value = record(valueArg, ['reporterSessionId', 'nodeId', 'credentialGeneration',
|
|
259
|
+
const value = record(valueArg, ['reporterSessionId', 'nodeId', 'clusterId', 'credentialGeneration',
|
|
258
260
|
'sessionEpoch', 'controllerInstanceId', 'controller', 'runtimeNamespace']);
|
|
259
261
|
const controller = record(value.controller, ['kind', 'id', 'epoch']);
|
|
260
262
|
requireValue(controller.kind === 'cloudly' || controller.kind === 'onebox');
|
|
261
263
|
return {
|
|
262
264
|
reporterSessionId: identifier(value.reporterSessionId), nodeId: nodeId(value.nodeId),
|
|
265
|
+
clusterId: identifier(value.clusterId),
|
|
263
266
|
credentialGeneration: positive(value.credentialGeneration), sessionEpoch: positive(value.sessionEpoch),
|
|
264
267
|
controllerInstanceId: identifier(value.controllerInstanceId),
|
|
265
268
|
controller: { kind: controller.kind, id: identifier(controller.id), epoch: identifier(controller.epoch) },
|
|
@@ -269,7 +272,8 @@ const session = (valueArg: unknown): IRuntimeSessionBinding => {
|
|
|
269
272
|
const sameSession = (leftArg: IRuntimeSessionBinding, rightArg: IRuntimeSessionBinding): boolean =>
|
|
270
273
|
canonical(leftArg) === canonical(rightArg);
|
|
271
274
|
const sameOwner = (leftArg: IRuntimeSessionBinding, rightArg: IRuntimeSessionBinding): boolean =>
|
|
272
|
-
leftArg.nodeId === rightArg.nodeId && leftArg.
|
|
275
|
+
leftArg.nodeId === rightArg.nodeId && leftArg.clusterId === rightArg.clusterId
|
|
276
|
+
&& leftArg.runtimeNamespace === rightArg.runtimeNamespace
|
|
273
277
|
&& canonical(leftArg.controller) === canonical(rightArg.controller);
|
|
274
278
|
const matchesAssignment = (sessionArg: IRuntimeSessionBinding, assignmentArg: IRuntimeAssignment): boolean =>
|
|
275
279
|
sessionArg.nodeId === assignmentArg.nodeId && sessionArg.runtimeNamespace === assignmentArg.runtimeNamespace
|
package/ts/requests/node.ts
CHANGED
|
@@ -11,6 +11,7 @@ import type {
|
|
|
11
11
|
TNodeCredentialPurpose,
|
|
12
12
|
} from '../data/nodecredential.js';
|
|
13
13
|
import type { INodeRuntimeRetirement } from '../data/noderetirement.js';
|
|
14
|
+
import type { INodeRuntimeBindingRead, INodeRuntimeBindingRequest } from '../data/noderuntimebinding.js';
|
|
14
15
|
import type {
|
|
15
16
|
INodeEnrollmentRequest,
|
|
16
17
|
INodeEnrollmentAcknowledgement,
|
|
@@ -39,6 +40,20 @@ export interface IReq_Spark_Cloudly_EnrollNode extends plugins.typedrequestInter
|
|
|
39
40
|
response: INodeEnrollmentAcknowledgement;
|
|
40
41
|
}
|
|
41
42
|
|
|
43
|
+
/**
|
|
44
|
+
* Current Spark-node-authenticated routing read. Cloudly derives every response identity from its
|
|
45
|
+
* node, cluster, runtime-controller, relay and credential records in one consistent read.
|
|
46
|
+
*/
|
|
47
|
+
export interface IReq_Spark_Cloudly_GetNodeRuntimeBinding extends plugins.typedrequestInterfaces.implementsTR<
|
|
48
|
+
plugins.typedrequestInterfaces.ITypedRequest,
|
|
49
|
+
IReq_Spark_Cloudly_GetNodeRuntimeBinding
|
|
50
|
+
> {
|
|
51
|
+
method: 'getNodeRuntimeBinding';
|
|
52
|
+
request: INodeRuntimeBindingRequest;
|
|
53
|
+
/** Routing and current phase observation only; this grants no workload or phase authority. */
|
|
54
|
+
response: INodeRuntimeBindingRead;
|
|
55
|
+
}
|
|
56
|
+
|
|
42
57
|
/** Requires verified platform-infrastructure admin authority; returns public data only. */
|
|
43
58
|
export interface IRequest_Any_Cloudly_GetNodeConfig extends plugins.typedrequestInterfaces.implementsTR<
|
|
44
59
|
plugins.typedrequestInterfaces.ITypedRequest,
|
package/ts/requests/pallet.ts
CHANGED
|
@@ -3,6 +3,7 @@ import type {
|
|
|
3
3
|
INodeEnrollment, IPalletNodeEnrollmentActivation, IPalletNodeEnrollmentPreparation,
|
|
4
4
|
IPalletNodeEnrollmentBound, IPalletNodeEnrollmentActive,
|
|
5
5
|
} from '../data/nodeenrollment.js';
|
|
6
|
+
import type { INodeRuntimeRoutingBinding } from '../data/noderuntimebinding.js';
|
|
6
7
|
|
|
7
8
|
/** Root-authenticated node-local IPC only; never expose on a network router. */
|
|
8
9
|
export interface IReq_Spark_Pallet_PrepareNodeEnrollment extends plugins.typedrequestInterfaces.implementsTR<
|
|
@@ -36,3 +37,30 @@ export interface IReq_Spark_Pallet_ActivateNodeEnrollment extends plugins.typedr
|
|
|
36
37
|
/** Prove the exact current local identity after activation; a historical receipt is insufficient. */
|
|
37
38
|
response: IPalletNodeEnrollmentActive;
|
|
38
39
|
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* First immutable routing bind or exact replay. The local owner rejects unless `cloudlyOrigin` and
|
|
43
|
+
* `nodeId` match its current active enrollment; this never mutates credentials, workload state or runtime phase.
|
|
44
|
+
*/
|
|
45
|
+
export interface IReq_Spark_Pallet_BindNodeRuntimeBinding extends plugins.typedrequestInterfaces.implementsTR<
|
|
46
|
+
plugins.typedrequestInterfaces.ITypedRequest,
|
|
47
|
+
IReq_Spark_Pallet_BindNodeRuntimeBinding
|
|
48
|
+
> {
|
|
49
|
+
method: 'bindPalletNodeRuntimeBinding';
|
|
50
|
+
request: INodeRuntimeRoutingBinding;
|
|
51
|
+
/** Exact currently persisted binding, answered only after the durable write or exact replay. */
|
|
52
|
+
response: INodeRuntimeRoutingBinding;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Offline routing readback. The root-local owner rejects an absent binding, an inactive enrollment
|
|
57
|
+
* or a requested origin/node different from both its active enrollment and persisted binding.
|
|
58
|
+
*/
|
|
59
|
+
export interface IReq_Spark_Pallet_ReadNodeRuntimeBinding extends plugins.typedrequestInterfaces.implementsTR<
|
|
60
|
+
plugins.typedrequestInterfaces.ITypedRequest,
|
|
61
|
+
IReq_Spark_Pallet_ReadNodeRuntimeBinding
|
|
62
|
+
> {
|
|
63
|
+
method: 'readPalletNodeRuntimeBinding';
|
|
64
|
+
request: { cloudlyOrigin: string; nodeId: string };
|
|
65
|
+
response: INodeRuntimeRoutingBinding;
|
|
66
|
+
}
|
|
@@ -501,28 +501,30 @@ export const bindGetRuntimeAssignmentSecretMaterialRequest = async (
|
|
|
501
501
|
|
|
502
502
|
/**
|
|
503
503
|
* Verify one complete response without opening a private key. The caller must
|
|
504
|
-
* supply its authenticated current session, current assignment, pinned config
|
|
505
|
-
*
|
|
504
|
+
* supply its authenticated current session, current assignment, pinned config
|
|
505
|
+
* and active recipient from their respective trusted owners. The controller-issued
|
|
506
|
+
* session binding supplies the enrolled cluster.
|
|
506
507
|
*/
|
|
507
508
|
export const bindGetRuntimeAssignmentSecretMaterialResponse = async (
|
|
508
509
|
valueArg: unknown, requestArg: unknown, assignmentArg: unknown, configArg: unknown,
|
|
509
|
-
trustedSessionArg: unknown,
|
|
510
|
+
trustedSessionArg: unknown, activeRecipientArg: unknown,
|
|
510
511
|
): Promise<IGetRuntimeAssignmentSecretMaterialResponse> => {
|
|
511
512
|
try {
|
|
512
513
|
const value = exact(capture(valueArg, runtimeAssignmentSecretContract.maximumMaterialBytes), ['material']);
|
|
514
|
+
const trustedSession = session(capture(trustedSessionArg));
|
|
513
515
|
const material = exact(value.material, [
|
|
514
516
|
'assignment', 'nodeId', 'secrets', 'recipientKeyId', 'recipientGeneration',
|
|
515
517
|
'authority', 'manifest', 'workloadInit', 'entries',
|
|
516
518
|
]);
|
|
517
519
|
const request = await bindGetRuntimeAssignmentSecretMaterialRequest(
|
|
518
|
-
requestArg, assignmentArg,
|
|
520
|
+
requestArg, assignmentArg, trustedSession, activeRecipientArg,
|
|
519
521
|
);
|
|
520
522
|
const assignment = snapshotRuntimeAssignment(assignmentArg);
|
|
521
523
|
const authority = await bindRuntimeAssignmentSecretAuthority(
|
|
522
|
-
material.authority, material.manifest, assignment, configArg,
|
|
524
|
+
material.authority, material.manifest, assignment, configArg, trustedSession.clusterId,
|
|
523
525
|
);
|
|
524
526
|
const manifest = material.manifest as IResolvedSecretManifest;
|
|
525
|
-
requireValue(
|
|
527
|
+
requireValue(trustedSession.clusterId === manifest.clusterId
|
|
526
528
|
&& material.nodeId === assignment.nodeId
|
|
527
529
|
&& same(assignmentReference(material.assignment), request.assignment)
|
|
528
530
|
&& same(authorityReference(material.secrets), request.secrets)
|