@serve.zone/interfaces 30.8.1 → 30.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/changelog.md +6 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/data/index.d.ts +1 -0
- package/dist_ts/data/index.js +2 -1
- package/dist_ts/data/networkprotection.d.ts +68 -0
- package/dist_ts/data/networkprotection.js +129 -0
- package/dist_ts/requests/runtimesession.d.ts +7 -0
- package/package.json +1 -1
- package/readme.md +20 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/data/index.ts +1 -0
- package/ts/data/networkprotection.ts +175 -0
- package/ts/requests/runtimesession.ts +10 -0
package/changelog.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@serve.zone/interfaces',
|
|
6
|
-
version: '30.
|
|
6
|
+
version: '30.9.0',
|
|
7
7
|
description: 'Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLHVGQUF1RjtDQUNyRyxDQUFBIn0=
|
package/dist_ts/data/index.d.ts
CHANGED
|
@@ -25,6 +25,7 @@ export * from './nodeenrollment.js';
|
|
|
25
25
|
export * from './networkauthority.js';
|
|
26
26
|
export * from './networkdelivery.js';
|
|
27
27
|
export * from './networkprojection.js';
|
|
28
|
+
export * from './networkprotection.js';
|
|
28
29
|
export * from './networksigning.js';
|
|
29
30
|
export * from './privatenetwork.js';
|
|
30
31
|
export * from './registry.js';
|
package/dist_ts/data/index.js
CHANGED
|
@@ -25,6 +25,7 @@ export * from './nodeenrollment.js';
|
|
|
25
25
|
export * from './networkauthority.js';
|
|
26
26
|
export * from './networkdelivery.js';
|
|
27
27
|
export * from './networkprojection.js';
|
|
28
|
+
export * from './networkprotection.js';
|
|
28
29
|
export * from './networksigning.js';
|
|
29
30
|
export * from './privatenetwork.js';
|
|
30
31
|
export * from './registry.js';
|
|
@@ -48,4 +49,4 @@ export * from './traffic.js';
|
|
|
48
49
|
export * from './user.js';
|
|
49
50
|
export * from './version.js';
|
|
50
51
|
export * from './webpush.js';
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsY0FBYyxDQUFDIn0=
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { TSha256Digest } from './immutableimage.js';
|
|
2
|
+
import type { IRuntimeAuthorityReferenceV1 } from './runtimeassignment.js';
|
|
3
|
+
import type { IRuntimeNetworkNodeScopeV1 } from './networkprojection.js';
|
|
4
|
+
import type { IRuntimeNetworkProtectedAuthorityV1 } from './networkauthority.js';
|
|
5
|
+
import type { IRuntimeSessionBindingV1 } from './runtimesession.js';
|
|
6
|
+
/**
|
|
7
|
+
* Durable native protection report, independent of projection admission and DNS.
|
|
8
|
+
* The producer owns a joined native journal covering ALL affected local egress
|
|
9
|
+
* paths. nativeBarrier identifies that complete journal, never an admission ACK,
|
|
10
|
+
* a single table inspection, a boot event or a caller-selected success flag.
|
|
11
|
+
* A null nativeBarrier explicitly withdraws this node's allocation eligibility.
|
|
12
|
+
*/
|
|
13
|
+
export interface IRuntimeNetworkProtectionReceiptV1 extends IRuntimeNetworkNodeScopeV1 {
|
|
14
|
+
schemaVersion: 1;
|
|
15
|
+
id: string;
|
|
16
|
+
generation: number;
|
|
17
|
+
previous: IRuntimeAuthorityReferenceV1 | null;
|
|
18
|
+
protectedAuthority: IRuntimeAuthorityReferenceV1;
|
|
19
|
+
reporterSessionId: string;
|
|
20
|
+
bootId: string;
|
|
21
|
+
nativeBarrier: IRuntimeAuthorityReferenceV1 | null;
|
|
22
|
+
digest: TSha256Digest;
|
|
23
|
+
}
|
|
24
|
+
export interface IReportRuntimeNetworkProtectionRequestV1 {
|
|
25
|
+
session: IRuntimeSessionBindingV1;
|
|
26
|
+
receipt: IRuntimeNetworkProtectionReceiptV1;
|
|
27
|
+
}
|
|
28
|
+
export interface IReportRuntimeNetworkProtectionResponseV1 {
|
|
29
|
+
status: 'accepted' | 'replay';
|
|
30
|
+
receipt: IRuntimeAuthorityReferenceV1;
|
|
31
|
+
authorityUse: 'current' | 'historical';
|
|
32
|
+
}
|
|
33
|
+
export declare const runtimeNetworkProtectionV1Contract: Readonly<{
|
|
34
|
+
readonly digestDomain: "serve.zone/runtime-network-protection-receipt-v1";
|
|
35
|
+
readonly maximumAuthorities: 256;
|
|
36
|
+
readonly allocation: "all-current-affected-egress-receipts-before-reserving-any-lease";
|
|
37
|
+
readonly receiptSource: "joined-complete-native-protection-journal";
|
|
38
|
+
readonly unavailable: "null-native-barrier-removes-allocation-eligibility";
|
|
39
|
+
readonly historical: "retain-for-outbox-replay-never-current-allocation-eligibility";
|
|
40
|
+
readonly quarantine: "no-release-authority";
|
|
41
|
+
}>;
|
|
42
|
+
export declare const snapshotRuntimeNetworkProtectionReceiptV1: (value: unknown) => IRuntimeNetworkProtectionReceiptV1;
|
|
43
|
+
export declare const computeRuntimeNetworkProtectionReceiptV1Digest: (value: IRuntimeNetworkProtectionReceiptV1) => Promise<TSha256Digest>;
|
|
44
|
+
/** Pure revision binding. The owner must authenticate the reporter and fence all DB writes. */
|
|
45
|
+
export declare const admitRuntimeNetworkProtectionReceiptV1: (value: unknown, previousValue: unknown | null, trustedScopeValue: unknown, knownProtectionValue: unknown) => Promise<{
|
|
46
|
+
status: "accepted" | "replay";
|
|
47
|
+
receipt: IRuntimeNetworkProtectionReceiptV1;
|
|
48
|
+
}>;
|
|
49
|
+
export declare const snapshotReportRuntimeNetworkProtectionRequestV1: (value: unknown) => IReportRuntimeNetworkProtectionRequestV1;
|
|
50
|
+
/** Both trusted bindings come from the receiver's fenced physical-session/history owner. */
|
|
51
|
+
export declare const bindReportRuntimeNetworkProtectionRequestV1: (value: unknown, trustedCurrentSessionValue: unknown, trustedReporterSessionValue: unknown) => {
|
|
52
|
+
request: IReportRuntimeNetworkProtectionRequestV1;
|
|
53
|
+
authorityUse: "current" | "historical";
|
|
54
|
+
};
|
|
55
|
+
export declare const snapshotReportRuntimeNetworkProtectionResponseV1: (value: unknown) => IReportRuntimeNetworkProtectionResponseV1;
|
|
56
|
+
export declare const bindReportRuntimeNetworkProtectionResponseV1: (value: unknown, sentReceiptValue: unknown) => IReportRuntimeNetworkProtectionResponseV1;
|
|
57
|
+
/**
|
|
58
|
+
* Complete allocation prerequisite, not authentication or a native inspector.
|
|
59
|
+
* Inputs MUST be the current receiver-persisted receipts and CURRENT durable
|
|
60
|
+
* sessions, fenced together with protection and lease insertion. Never supply
|
|
61
|
+
* worker-authored lists or just online peers. Missing/offline/unavailable owners
|
|
62
|
+
* cannot be omitted. Independent fences need their own verified owning contract;
|
|
63
|
+
* this helper supplies no generic override, expiry or quorum escape hatch.
|
|
64
|
+
*/
|
|
65
|
+
export declare const bindRuntimeNetworkAllocationProtectionV1: (protectionValue: unknown, receiptsValue: unknown, currentSessionsValue: unknown) => Promise<{
|
|
66
|
+
protection: IRuntimeNetworkProtectedAuthorityV1;
|
|
67
|
+
receipts: IRuntimeNetworkProtectionReceiptV1[];
|
|
68
|
+
}>;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { snapshotRuntimeNetworkNodeScopeV1 } from './networkprojection.js';
|
|
2
|
+
import { computeRuntimeNetworkProtectedAuthorityV1Digest, snapshotRuntimeNetworkProtectedAuthorityV1 } from './networkauthority.js';
|
|
3
|
+
import { snapshotRuntimeSessionBindingV1 } from './runtimesession.js';
|
|
4
|
+
import { captureNetwork, failNetwork, networkCanonical, networkDigest, networkEqual, networkHash, networkId, networkList, networkRecord, networkReference, networkReferenceOf, networkRevision, networkSafe, networkSorted, requireNetwork } from '../private/networkcontract.js';
|
|
5
|
+
export const runtimeNetworkProtectionV1Contract = Object.freeze({
|
|
6
|
+
digestDomain: 'serve.zone/runtime-network-protection-receipt-v1',
|
|
7
|
+
maximumAuthorities: 256,
|
|
8
|
+
allocation: 'all-current-affected-egress-receipts-before-reserving-any-lease',
|
|
9
|
+
receiptSource: 'joined-complete-native-protection-journal',
|
|
10
|
+
unavailable: 'null-native-barrier-removes-allocation-eligibility',
|
|
11
|
+
historical: 'retain-for-outbox-replay-never-current-allocation-eligibility',
|
|
12
|
+
quarantine: 'no-release-authority',
|
|
13
|
+
});
|
|
14
|
+
const scopeOf = (value) => ({ controller: value.controller, nodeId: value.nodeId, runtimeNamespace: value.runtimeNamespace });
|
|
15
|
+
const scopeKey = (value) => networkCanonical([value.nodeId, value.runtimeNamespace]);
|
|
16
|
+
export const snapshotRuntimeNetworkProtectionReceiptV1 = (value) => networkSafe(() => {
|
|
17
|
+
const item = networkRecord(captureNetwork(value), ['schemaVersion', 'id', 'generation', 'previous',
|
|
18
|
+
'controller', 'nodeId', 'runtimeNamespace', 'protectedAuthority', 'reporterSessionId', 'bootId', 'nativeBarrier', 'digest']);
|
|
19
|
+
requireNetwork(item.schemaVersion === 1 && typeof item.bootId === 'string'
|
|
20
|
+
&& /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.test(item.bootId)
|
|
21
|
+
&& item.bootId !== '00000000-0000-0000-0000-000000000000');
|
|
22
|
+
const scope = snapshotRuntimeNetworkNodeScopeV1({ controller: item.controller, nodeId: item.nodeId, runtimeNamespace: item.runtimeNamespace });
|
|
23
|
+
return { schemaVersion: 1, ...networkRevision(item), ...scope,
|
|
24
|
+
protectedAuthority: networkReference(item.protectedAuthority), reporterSessionId: networkId(item.reporterSessionId),
|
|
25
|
+
bootId: item.bootId, nativeBarrier: item.nativeBarrier === null ? null : networkReference(item.nativeBarrier),
|
|
26
|
+
digest: networkDigest(item.digest) };
|
|
27
|
+
});
|
|
28
|
+
export const computeRuntimeNetworkProtectionReceiptV1Digest = (value) => networkHash(runtimeNetworkProtectionV1Contract.digestDomain, snapshotRuntimeNetworkProtectionReceiptV1(value));
|
|
29
|
+
/** Pure revision binding. The owner must authenticate the reporter and fence all DB writes. */
|
|
30
|
+
export const admitRuntimeNetworkProtectionReceiptV1 = async (value, previousValue, trustedScopeValue, knownProtectionValue) => {
|
|
31
|
+
try {
|
|
32
|
+
const receipt = snapshotRuntimeNetworkProtectionReceiptV1(value);
|
|
33
|
+
const previous = previousValue === null ? null : snapshotRuntimeNetworkProtectionReceiptV1(previousValue);
|
|
34
|
+
const scope = snapshotRuntimeNetworkNodeScopeV1(captureNetwork(trustedScopeValue));
|
|
35
|
+
const protection = snapshotRuntimeNetworkProtectedAuthorityV1(captureNetwork(knownProtectionValue));
|
|
36
|
+
requireNetwork(networkEqual(scopeOf(receipt), scope) && networkEqual(receipt.controller, protection.controller)
|
|
37
|
+
&& networkEqual(receipt.protectedAuthority, networkReferenceOf(protection))
|
|
38
|
+
&& protection.egressAuthorities.some(owner => scopeKey(owner) === scopeKey(receipt)));
|
|
39
|
+
requireNetwork(receipt.digest === await computeRuntimeNetworkProtectionReceiptV1Digest(receipt)
|
|
40
|
+
&& protection.digest === await computeRuntimeNetworkProtectedAuthorityV1Digest(protection));
|
|
41
|
+
if (!previous)
|
|
42
|
+
requireNetwork(receipt.generation === 1 && receipt.previous === null);
|
|
43
|
+
else {
|
|
44
|
+
requireNetwork(networkEqual(scopeOf(previous), scope)
|
|
45
|
+
&& previous.digest === await computeRuntimeNetworkProtectionReceiptV1Digest(previous));
|
|
46
|
+
if (networkEqual(receipt, previous))
|
|
47
|
+
return { status: 'replay', receipt };
|
|
48
|
+
requireNetwork(receipt.id === previous.id && receipt.generation === previous.generation + 1
|
|
49
|
+
&& networkEqual(receipt.previous, networkReferenceOf(previous))
|
|
50
|
+
&& receipt.protectedAuthority.id === previous.protectedAuthority.id
|
|
51
|
+
&& receipt.protectedAuthority.generation >= previous.protectedAuthority.generation);
|
|
52
|
+
if (receipt.protectedAuthority.generation === previous.protectedAuthority.generation) {
|
|
53
|
+
requireNetwork(networkEqual(receipt.protectedAuthority, previous.protectedAuthority));
|
|
54
|
+
}
|
|
55
|
+
if (receipt.nativeBarrier && previous.nativeBarrier) {
|
|
56
|
+
if (receipt.bootId !== previous.bootId || !networkEqual(receipt.protectedAuthority, previous.protectedAuthority)) {
|
|
57
|
+
requireNetwork(!networkEqual(receipt.nativeBarrier, previous.nativeBarrier));
|
|
58
|
+
}
|
|
59
|
+
if (receipt.nativeBarrier.id === previous.nativeBarrier.id) {
|
|
60
|
+
requireNetwork(receipt.nativeBarrier.generation >= previous.nativeBarrier.generation);
|
|
61
|
+
if (receipt.nativeBarrier.generation === previous.nativeBarrier.generation) {
|
|
62
|
+
requireNetwork(networkEqual(receipt.nativeBarrier, previous.nativeBarrier));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return { status: 'accepted', receipt };
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return failNetwork();
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
export const snapshotReportRuntimeNetworkProtectionRequestV1 = (value) => networkSafe(() => {
|
|
74
|
+
const item = networkRecord(captureNetwork(value), ['session', 'receipt']);
|
|
75
|
+
return { session: snapshotRuntimeSessionBindingV1(item.session), receipt: snapshotRuntimeNetworkProtectionReceiptV1(item.receipt) };
|
|
76
|
+
});
|
|
77
|
+
/** Both trusted bindings come from the receiver's fenced physical-session/history owner. */
|
|
78
|
+
export const bindReportRuntimeNetworkProtectionRequestV1 = (value, trustedCurrentSessionValue, trustedReporterSessionValue) => networkSafe(() => {
|
|
79
|
+
const request = snapshotReportRuntimeNetworkProtectionRequestV1(value);
|
|
80
|
+
const current = snapshotRuntimeSessionBindingV1(captureNetwork(trustedCurrentSessionValue));
|
|
81
|
+
const reporter = snapshotRuntimeSessionBindingV1(captureNetwork(trustedReporterSessionValue));
|
|
82
|
+
requireNetwork(networkEqual(request.session, current) && networkEqual(scopeOf(request.receipt), scopeOf(current))
|
|
83
|
+
&& networkEqual(scopeOf(reporter), scopeOf(current)) && reporter.reporterSessionId === request.receipt.reporterSessionId);
|
|
84
|
+
const authorityUse = reporter.reporterSessionId === current.reporterSessionId ? 'current' : 'historical';
|
|
85
|
+
requireNetwork(authorityUse === 'current' ? networkEqual(reporter, current)
|
|
86
|
+
: reporter.sessionEpoch < current.sessionEpoch && reporter.credentialGeneration <= current.credentialGeneration);
|
|
87
|
+
return { request, authorityUse };
|
|
88
|
+
});
|
|
89
|
+
export const snapshotReportRuntimeNetworkProtectionResponseV1 = (value) => networkSafe(() => {
|
|
90
|
+
const item = networkRecord(captureNetwork(value), ['status', 'receipt', 'authorityUse']);
|
|
91
|
+
requireNetwork((item.status === 'accepted' || item.status === 'replay')
|
|
92
|
+
&& (item.authorityUse === 'current' || item.authorityUse === 'historical'));
|
|
93
|
+
return { status: item.status, receipt: networkReference(item.receipt), authorityUse: item.authorityUse };
|
|
94
|
+
});
|
|
95
|
+
export const bindReportRuntimeNetworkProtectionResponseV1 = (value, sentReceiptValue) => networkSafe(() => {
|
|
96
|
+
const response = snapshotReportRuntimeNetworkProtectionResponseV1(value);
|
|
97
|
+
requireNetwork(networkEqual(response.receipt, networkReference(captureNetwork(sentReceiptValue))));
|
|
98
|
+
return response;
|
|
99
|
+
});
|
|
100
|
+
/**
|
|
101
|
+
* Complete allocation prerequisite, not authentication or a native inspector.
|
|
102
|
+
* Inputs MUST be the current receiver-persisted receipts and CURRENT durable
|
|
103
|
+
* sessions, fenced together with protection and lease insertion. Never supply
|
|
104
|
+
* worker-authored lists or just online peers. Missing/offline/unavailable owners
|
|
105
|
+
* cannot be omitted. Independent fences need their own verified owning contract;
|
|
106
|
+
* this helper supplies no generic override, expiry or quorum escape hatch.
|
|
107
|
+
*/
|
|
108
|
+
export const bindRuntimeNetworkAllocationProtectionV1 = async (protectionValue, receiptsValue, currentSessionsValue) => {
|
|
109
|
+
try {
|
|
110
|
+
const protection = snapshotRuntimeNetworkProtectedAuthorityV1(captureNetwork(protectionValue));
|
|
111
|
+
const receipts = networkSorted(networkList(captureNetwork(receiptsValue), 256, snapshotRuntimeNetworkProtectionReceiptV1), scopeKey);
|
|
112
|
+
const sessions = networkSorted(networkList(captureNetwork(currentSessionsValue), 256, snapshotRuntimeSessionBindingV1), scopeKey);
|
|
113
|
+
requireNetwork(protection.digest === await computeRuntimeNetworkProtectedAuthorityV1Digest(protection)
|
|
114
|
+
&& receipts.length === protection.egressAuthorities.length && sessions.length === receipts.length);
|
|
115
|
+
for (const [index, owner] of protection.egressAuthorities.entries()) {
|
|
116
|
+
const receipt = receipts[index], session = sessions[index];
|
|
117
|
+
requireNetwork(scopeKey(receipt) === scopeKey(owner) && scopeKey(session) === scopeKey(owner)
|
|
118
|
+
&& networkEqual(receipt.controller, protection.controller) && networkEqual(session.controller, protection.controller)
|
|
119
|
+
&& receipt.reporterSessionId === session.reporterSessionId && receipt.nativeBarrier !== null
|
|
120
|
+
&& networkEqual(receipt.protectedAuthority, networkReferenceOf(protection))
|
|
121
|
+
&& receipt.digest === await computeRuntimeNetworkProtectionReceiptV1Digest(receipt));
|
|
122
|
+
}
|
|
123
|
+
return { protection, receipts };
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return failNetwork();
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29ya3Byb3RlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL25ldHdvcmtwcm90ZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTNFLE9BQU8sRUFBRSwrQ0FBK0MsRUFBRSwwQ0FBMEMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXBJLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUM5RixTQUFTLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQzVGLFdBQVcsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUErQnBGLE1BQU0sQ0FBQyxNQUFNLGtDQUFrQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDOUQsWUFBWSxFQUFFLGtEQUFrRDtJQUNoRSxrQkFBa0IsRUFBRSxHQUFHO0lBQ3ZCLFVBQVUsRUFBRSxpRUFBaUU7SUFDN0UsYUFBYSxFQUFFLDJDQUEyQztJQUMxRCxXQUFXLEVBQUUsb0RBQW9EO0lBQ2pFLFVBQVUsRUFBRSwrREFBK0Q7SUFDM0UsVUFBVSxFQUFFLHNCQUFzQjtDQUMxQixDQUFDLENBQUM7QUFFWixNQUFNLE9BQU8sR0FBRyxDQUFDLEtBQWlDLEVBQThCLEVBQUUsQ0FDaEYsQ0FBQyxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7QUFDckcsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUFtRCxFQUFVLEVB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
|
|
@@ -2,6 +2,13 @@ import * as plugins from '../plugins.js';
|
|
|
2
2
|
import type * as data from '../data/runtimesession.js';
|
|
3
3
|
import type * as terminal from '../data/runtimeterminalreceipt.js';
|
|
4
4
|
import type * as network from '../data/networkdelivery.js';
|
|
5
|
+
import type * as protection from '../data/networkprotection.js';
|
|
6
|
+
/** Current authenticated peer reports its durable complete native protection journal. */
|
|
7
|
+
export interface IReq_Pallet_Controller_ReportRuntimeNetworkProtectionV1 extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Pallet_Controller_ReportRuntimeNetworkProtectionV1> {
|
|
8
|
+
method: 'reportRuntimeNetworkProtectionV1';
|
|
9
|
+
request: protection.IReportRuntimeNetworkProtectionRequestV1;
|
|
10
|
+
response: protection.IReportRuntimeNetworkProtectionResponseV1;
|
|
11
|
+
}
|
|
5
12
|
/** Dedicated signing trust installed only through the current authenticated physical peer. */
|
|
6
13
|
export interface IReq_Controller_Pallet_ApplyRuntimeNetworkSigningAuthorityV1 extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Controller_Pallet_ApplyRuntimeNetworkSigningAuthorityV1> {
|
|
7
14
|
method: 'applyRuntimeNetworkSigningAuthorityV1';
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -265,6 +265,26 @@ the declaration is not a revocation acknowledgement. Prefix arrays are sorted
|
|
|
265
265
|
lexically and nonoverlapping; pools and endpoints are sorted by ID; egress owners
|
|
266
266
|
are ordered by canonical JSON of `[nodeId, runtimeNamespace]`.
|
|
267
267
|
|
|
268
|
+
`IRuntimeNetworkProtectionReceiptV1` reports a worker's durable, joined native
|
|
269
|
+
protection journal separately from projection admission. It binds a complete
|
|
270
|
+
protected-authority reference, node/controller scope, authenticated reporter,
|
|
271
|
+
boot identity and exact native journal reference to a monotonic receipt chain.
|
|
272
|
+
A null `nativeBarrier` explicitly removes allocation eligibility. A boot or
|
|
273
|
+
protection change requires new native journal evidence. These portable values
|
|
274
|
+
do not inspect a kernel or authenticate their own producer.
|
|
275
|
+
|
|
276
|
+
`reportRuntimeNetworkProtectionV1` uses the current authenticated physical peer.
|
|
277
|
+
Its request binder accepts a historical outbox only against receiver-owned
|
|
278
|
+
reporter history and identifies that use as historical. The response must match
|
|
279
|
+
the exact sent receipt. `bindRuntimeNetworkAllocationProtectionV1` requires the
|
|
280
|
+
current persisted protection receipt and durable session for every declared
|
|
281
|
+
egress owner, in canonical owner order. Missing, unavailable, stale-protection
|
|
282
|
+
and superseded-session evidence reject. An offline owner cannot be omitted.
|
|
283
|
+
The controller must fence all those records together with lease insertion, before
|
|
284
|
+
reserving any handoff or workload address. No generic independent-fence flag is
|
|
285
|
+
provided; such a mechanism needs its own verified owner. Protection receipts
|
|
286
|
+
neither prove workload readiness nor release packet/address/name quarantine.
|
|
287
|
+
|
|
268
288
|
`IRuntimeNetworkHandoffLeaseV1` binds an immutable node/router incarnation to its
|
|
269
289
|
protected-authority reference, transit subnet and peers, protocol-qualified source
|
|
270
290
|
ports, nonzero conntrack zone and 128-bit label. The label is exactly 32 lowercase
|
package/ts/00_commitinfo_data.ts
CHANGED
package/ts/data/index.ts
CHANGED
|
@@ -25,6 +25,7 @@ export * from './nodeenrollment.js';
|
|
|
25
25
|
export * from './networkauthority.js';
|
|
26
26
|
export * from './networkdelivery.js';
|
|
27
27
|
export * from './networkprojection.js';
|
|
28
|
+
export * from './networkprotection.js';
|
|
28
29
|
export * from './networksigning.js';
|
|
29
30
|
export * from './privatenetwork.js';
|
|
30
31
|
export * from './registry.js';
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import type { TSha256Digest } from './immutableimage.js';
|
|
2
|
+
import type { IRuntimeAuthorityReferenceV1 } from './runtimeassignment.js';
|
|
3
|
+
import type { IRuntimeNetworkNodeScopeV1 } from './networkprojection.js';
|
|
4
|
+
import { snapshotRuntimeNetworkNodeScopeV1 } from './networkprojection.js';
|
|
5
|
+
import type { IRuntimeNetworkProtectedAuthorityV1 } from './networkauthority.js';
|
|
6
|
+
import { computeRuntimeNetworkProtectedAuthorityV1Digest, snapshotRuntimeNetworkProtectedAuthorityV1 } from './networkauthority.js';
|
|
7
|
+
import type { IRuntimeSessionBindingV1 } from './runtimesession.js';
|
|
8
|
+
import { snapshotRuntimeSessionBindingV1 } from './runtimesession.js';
|
|
9
|
+
import { captureNetwork, failNetwork, networkCanonical, networkDigest, networkEqual, networkHash,
|
|
10
|
+
networkId, networkList, networkRecord, networkReference, networkReferenceOf, networkRevision,
|
|
11
|
+
networkSafe, networkSorted, requireNetwork } from '../private/networkcontract.js';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Durable native protection report, independent of projection admission and DNS.
|
|
15
|
+
* The producer owns a joined native journal covering ALL affected local egress
|
|
16
|
+
* paths. nativeBarrier identifies that complete journal, never an admission ACK,
|
|
17
|
+
* a single table inspection, a boot event or a caller-selected success flag.
|
|
18
|
+
* A null nativeBarrier explicitly withdraws this node's allocation eligibility.
|
|
19
|
+
*/
|
|
20
|
+
export interface IRuntimeNetworkProtectionReceiptV1 extends IRuntimeNetworkNodeScopeV1 {
|
|
21
|
+
schemaVersion: 1;
|
|
22
|
+
id: string;
|
|
23
|
+
generation: number;
|
|
24
|
+
previous: IRuntimeAuthorityReferenceV1 | null;
|
|
25
|
+
protectedAuthority: IRuntimeAuthorityReferenceV1;
|
|
26
|
+
reporterSessionId: string;
|
|
27
|
+
bootId: string;
|
|
28
|
+
nativeBarrier: IRuntimeAuthorityReferenceV1 | null;
|
|
29
|
+
digest: TSha256Digest;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface IReportRuntimeNetworkProtectionRequestV1 {
|
|
33
|
+
session: IRuntimeSessionBindingV1;
|
|
34
|
+
receipt: IRuntimeNetworkProtectionReceiptV1;
|
|
35
|
+
}
|
|
36
|
+
export interface IReportRuntimeNetworkProtectionResponseV1 {
|
|
37
|
+
status: 'accepted' | 'replay';
|
|
38
|
+
receipt: IRuntimeAuthorityReferenceV1;
|
|
39
|
+
authorityUse: 'current' | 'historical';
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export const runtimeNetworkProtectionV1Contract = Object.freeze({
|
|
43
|
+
digestDomain: 'serve.zone/runtime-network-protection-receipt-v1',
|
|
44
|
+
maximumAuthorities: 256,
|
|
45
|
+
allocation: 'all-current-affected-egress-receipts-before-reserving-any-lease',
|
|
46
|
+
receiptSource: 'joined-complete-native-protection-journal',
|
|
47
|
+
unavailable: 'null-native-barrier-removes-allocation-eligibility',
|
|
48
|
+
historical: 'retain-for-outbox-replay-never-current-allocation-eligibility',
|
|
49
|
+
quarantine: 'no-release-authority',
|
|
50
|
+
} as const);
|
|
51
|
+
|
|
52
|
+
const scopeOf = (value: IRuntimeNetworkNodeScopeV1): IRuntimeNetworkNodeScopeV1 =>
|
|
53
|
+
({ controller: value.controller, nodeId: value.nodeId, runtimeNamespace: value.runtimeNamespace });
|
|
54
|
+
const scopeKey = (value: { nodeId: string; runtimeNamespace: string }): string =>
|
|
55
|
+
networkCanonical([value.nodeId, value.runtimeNamespace]);
|
|
56
|
+
|
|
57
|
+
export const snapshotRuntimeNetworkProtectionReceiptV1 = (value: unknown): IRuntimeNetworkProtectionReceiptV1 => networkSafe(() => {
|
|
58
|
+
const item = networkRecord(captureNetwork(value), ['schemaVersion', 'id', 'generation', 'previous',
|
|
59
|
+
'controller', 'nodeId', 'runtimeNamespace', 'protectedAuthority', 'reporterSessionId', 'bootId', 'nativeBarrier', 'digest']);
|
|
60
|
+
requireNetwork(item.schemaVersion === 1 && typeof item.bootId === 'string'
|
|
61
|
+
&& /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.test(item.bootId)
|
|
62
|
+
&& item.bootId !== '00000000-0000-0000-0000-000000000000');
|
|
63
|
+
const scope = snapshotRuntimeNetworkNodeScopeV1({ controller: item.controller, nodeId: item.nodeId, runtimeNamespace: item.runtimeNamespace });
|
|
64
|
+
return { schemaVersion: 1, ...networkRevision(item), ...scope,
|
|
65
|
+
protectedAuthority: networkReference(item.protectedAuthority), reporterSessionId: networkId(item.reporterSessionId),
|
|
66
|
+
bootId: item.bootId, nativeBarrier: item.nativeBarrier === null ? null : networkReference(item.nativeBarrier),
|
|
67
|
+
digest: networkDigest(item.digest) };
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
export const computeRuntimeNetworkProtectionReceiptV1Digest = (value: IRuntimeNetworkProtectionReceiptV1): Promise<TSha256Digest> =>
|
|
71
|
+
networkHash(runtimeNetworkProtectionV1Contract.digestDomain, snapshotRuntimeNetworkProtectionReceiptV1(value));
|
|
72
|
+
|
|
73
|
+
/** Pure revision binding. The owner must authenticate the reporter and fence all DB writes. */
|
|
74
|
+
export const admitRuntimeNetworkProtectionReceiptV1 = async (
|
|
75
|
+
value: unknown, previousValue: unknown | null, trustedScopeValue: unknown, knownProtectionValue: unknown,
|
|
76
|
+
): Promise<{ status: 'accepted' | 'replay'; receipt: IRuntimeNetworkProtectionReceiptV1 }> => {
|
|
77
|
+
try {
|
|
78
|
+
const receipt = snapshotRuntimeNetworkProtectionReceiptV1(value);
|
|
79
|
+
const previous = previousValue === null ? null : snapshotRuntimeNetworkProtectionReceiptV1(previousValue);
|
|
80
|
+
const scope = snapshotRuntimeNetworkNodeScopeV1(captureNetwork(trustedScopeValue));
|
|
81
|
+
const protection = snapshotRuntimeNetworkProtectedAuthorityV1(captureNetwork(knownProtectionValue));
|
|
82
|
+
requireNetwork(networkEqual(scopeOf(receipt), scope) && networkEqual(receipt.controller, protection.controller)
|
|
83
|
+
&& networkEqual(receipt.protectedAuthority, networkReferenceOf(protection))
|
|
84
|
+
&& protection.egressAuthorities.some(owner => scopeKey(owner) === scopeKey(receipt)));
|
|
85
|
+
requireNetwork(receipt.digest === await computeRuntimeNetworkProtectionReceiptV1Digest(receipt)
|
|
86
|
+
&& protection.digest === await computeRuntimeNetworkProtectedAuthorityV1Digest(protection));
|
|
87
|
+
if (!previous) requireNetwork(receipt.generation === 1 && receipt.previous === null);
|
|
88
|
+
else {
|
|
89
|
+
requireNetwork(networkEqual(scopeOf(previous), scope)
|
|
90
|
+
&& previous.digest === await computeRuntimeNetworkProtectionReceiptV1Digest(previous));
|
|
91
|
+
if (networkEqual(receipt, previous)) return { status: 'replay', receipt };
|
|
92
|
+
requireNetwork(receipt.id === previous.id && receipt.generation === previous.generation + 1
|
|
93
|
+
&& networkEqual(receipt.previous, networkReferenceOf(previous))
|
|
94
|
+
&& receipt.protectedAuthority.id === previous.protectedAuthority.id
|
|
95
|
+
&& receipt.protectedAuthority.generation >= previous.protectedAuthority.generation);
|
|
96
|
+
if (receipt.protectedAuthority.generation === previous.protectedAuthority.generation) {
|
|
97
|
+
requireNetwork(networkEqual(receipt.protectedAuthority, previous.protectedAuthority));
|
|
98
|
+
}
|
|
99
|
+
if (receipt.nativeBarrier && previous.nativeBarrier) {
|
|
100
|
+
if (receipt.bootId !== previous.bootId || !networkEqual(receipt.protectedAuthority, previous.protectedAuthority)) {
|
|
101
|
+
requireNetwork(!networkEqual(receipt.nativeBarrier, previous.nativeBarrier));
|
|
102
|
+
}
|
|
103
|
+
if (receipt.nativeBarrier.id === previous.nativeBarrier.id) {
|
|
104
|
+
requireNetwork(receipt.nativeBarrier.generation >= previous.nativeBarrier.generation);
|
|
105
|
+
if (receipt.nativeBarrier.generation === previous.nativeBarrier.generation) {
|
|
106
|
+
requireNetwork(networkEqual(receipt.nativeBarrier, previous.nativeBarrier));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return { status: 'accepted', receipt };
|
|
112
|
+
} catch { return failNetwork(); }
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
export const snapshotReportRuntimeNetworkProtectionRequestV1 = (value: unknown): IReportRuntimeNetworkProtectionRequestV1 => networkSafe(() => {
|
|
116
|
+
const item = networkRecord(captureNetwork(value), ['session', 'receipt']);
|
|
117
|
+
return { session: snapshotRuntimeSessionBindingV1(item.session), receipt: snapshotRuntimeNetworkProtectionReceiptV1(item.receipt) };
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
/** Both trusted bindings come from the receiver's fenced physical-session/history owner. */
|
|
121
|
+
export const bindReportRuntimeNetworkProtectionRequestV1 = (
|
|
122
|
+
value: unknown, trustedCurrentSessionValue: unknown, trustedReporterSessionValue: unknown,
|
|
123
|
+
): { request: IReportRuntimeNetworkProtectionRequestV1; authorityUse: 'current' | 'historical' } => networkSafe(() => {
|
|
124
|
+
const request = snapshotReportRuntimeNetworkProtectionRequestV1(value);
|
|
125
|
+
const current = snapshotRuntimeSessionBindingV1(captureNetwork(trustedCurrentSessionValue));
|
|
126
|
+
const reporter = snapshotRuntimeSessionBindingV1(captureNetwork(trustedReporterSessionValue));
|
|
127
|
+
requireNetwork(networkEqual(request.session, current) && networkEqual(scopeOf(request.receipt), scopeOf(current))
|
|
128
|
+
&& networkEqual(scopeOf(reporter), scopeOf(current)) && reporter.reporterSessionId === request.receipt.reporterSessionId);
|
|
129
|
+
const authorityUse = reporter.reporterSessionId === current.reporterSessionId ? 'current' : 'historical';
|
|
130
|
+
requireNetwork(authorityUse === 'current' ? networkEqual(reporter, current)
|
|
131
|
+
: reporter.sessionEpoch < current.sessionEpoch && reporter.credentialGeneration <= current.credentialGeneration);
|
|
132
|
+
return { request, authorityUse };
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
export const snapshotReportRuntimeNetworkProtectionResponseV1 = (value: unknown): IReportRuntimeNetworkProtectionResponseV1 => networkSafe(() => {
|
|
136
|
+
const item = networkRecord(captureNetwork(value), ['status', 'receipt', 'authorityUse']);
|
|
137
|
+
requireNetwork((item.status === 'accepted' || item.status === 'replay')
|
|
138
|
+
&& (item.authorityUse === 'current' || item.authorityUse === 'historical'));
|
|
139
|
+
return { status: item.status, receipt: networkReference(item.receipt), authorityUse: item.authorityUse };
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
export const bindReportRuntimeNetworkProtectionResponseV1 = (value: unknown, sentReceiptValue: unknown): IReportRuntimeNetworkProtectionResponseV1 => networkSafe(() => {
|
|
143
|
+
const response = snapshotReportRuntimeNetworkProtectionResponseV1(value);
|
|
144
|
+
requireNetwork(networkEqual(response.receipt, networkReference(captureNetwork(sentReceiptValue))));
|
|
145
|
+
return response;
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Complete allocation prerequisite, not authentication or a native inspector.
|
|
150
|
+
* Inputs MUST be the current receiver-persisted receipts and CURRENT durable
|
|
151
|
+
* sessions, fenced together with protection and lease insertion. Never supply
|
|
152
|
+
* worker-authored lists or just online peers. Missing/offline/unavailable owners
|
|
153
|
+
* cannot be omitted. Independent fences need their own verified owning contract;
|
|
154
|
+
* this helper supplies no generic override, expiry or quorum escape hatch.
|
|
155
|
+
*/
|
|
156
|
+
export const bindRuntimeNetworkAllocationProtectionV1 = async (
|
|
157
|
+
protectionValue: unknown, receiptsValue: unknown, currentSessionsValue: unknown,
|
|
158
|
+
): Promise<{ protection: IRuntimeNetworkProtectedAuthorityV1; receipts: IRuntimeNetworkProtectionReceiptV1[] }> => {
|
|
159
|
+
try {
|
|
160
|
+
const protection = snapshotRuntimeNetworkProtectedAuthorityV1(captureNetwork(protectionValue));
|
|
161
|
+
const receipts = networkSorted(networkList(captureNetwork(receiptsValue), 256, snapshotRuntimeNetworkProtectionReceiptV1), scopeKey);
|
|
162
|
+
const sessions = networkSorted(networkList(captureNetwork(currentSessionsValue), 256, snapshotRuntimeSessionBindingV1), scopeKey);
|
|
163
|
+
requireNetwork(protection.digest === await computeRuntimeNetworkProtectedAuthorityV1Digest(protection)
|
|
164
|
+
&& receipts.length === protection.egressAuthorities.length && sessions.length === receipts.length);
|
|
165
|
+
for (const [index, owner] of protection.egressAuthorities.entries()) {
|
|
166
|
+
const receipt = receipts[index], session = sessions[index];
|
|
167
|
+
requireNetwork(scopeKey(receipt) === scopeKey(owner) && scopeKey(session) === scopeKey(owner)
|
|
168
|
+
&& networkEqual(receipt.controller, protection.controller) && networkEqual(session.controller, protection.controller)
|
|
169
|
+
&& receipt.reporterSessionId === session.reporterSessionId && receipt.nativeBarrier !== null
|
|
170
|
+
&& networkEqual(receipt.protectedAuthority, networkReferenceOf(protection))
|
|
171
|
+
&& receipt.digest === await computeRuntimeNetworkProtectionReceiptV1Digest(receipt));
|
|
172
|
+
}
|
|
173
|
+
return { protection, receipts };
|
|
174
|
+
} catch { return failNetwork(); }
|
|
175
|
+
};
|
|
@@ -2,6 +2,16 @@ import * as plugins from '../plugins.js';
|
|
|
2
2
|
import type * as data from '../data/runtimesession.js';
|
|
3
3
|
import type * as terminal from '../data/runtimeterminalreceipt.js';
|
|
4
4
|
import type * as network from '../data/networkdelivery.js';
|
|
5
|
+
import type * as protection from '../data/networkprotection.js';
|
|
6
|
+
|
|
7
|
+
/** Current authenticated peer reports its durable complete native protection journal. */
|
|
8
|
+
export interface IReq_Pallet_Controller_ReportRuntimeNetworkProtectionV1 extends plugins.typedrequestInterfaces.implementsTR<
|
|
9
|
+
plugins.typedrequestInterfaces.ITypedRequest, IReq_Pallet_Controller_ReportRuntimeNetworkProtectionV1
|
|
10
|
+
> {
|
|
11
|
+
method: 'reportRuntimeNetworkProtectionV1';
|
|
12
|
+
request: protection.IReportRuntimeNetworkProtectionRequestV1;
|
|
13
|
+
response: protection.IReportRuntimeNetworkProtectionResponseV1;
|
|
14
|
+
}
|
|
5
15
|
|
|
6
16
|
/** Dedicated signing trust installed only through the current authenticated physical peer. */
|
|
7
17
|
export interface IReq_Controller_Pallet_ApplyRuntimeNetworkSigningAuthorityV1 extends plugins.typedrequestInterfaces.implementsTR<
|