@serve.zone/interfaces 28.5.0 → 29.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/changelog.md +10 -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/runtimeconfig.d.ts +15 -5
- package/dist_ts/data/runtimeconfig.js +5 -5
- package/dist_ts/data/runtimesession.d.ts +127 -0
- package/dist_ts/data/runtimesession.js +275 -0
- package/dist_ts/requests/index.d.ts +2 -1
- package/dist_ts/requests/index.js +3 -2
- package/dist_ts/requests/runtimesession.d.ts +32 -0
- package/dist_ts/requests/runtimesession.js +2 -0
- package/package.json +1 -1
- package/readme.md +43 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/data/index.ts +1 -0
- package/ts/data/runtimeconfig.ts +19 -9
- package/ts/data/runtimesession.ts +403 -0
- package/ts/requests/index.ts +2 -0
- package/ts/requests/runtimesession.ts +52 -0
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { isSha256Digest } from './immutableimage.js';
|
|
2
|
+
import { getRuntimeAssignmentV1Reference, snapshotRuntimeAssignmentObservationV1, snapshotRuntimeAssignmentV1, validateRuntimeAssignmentObservationV1, validateRuntimeAssignmentV1, } from './runtimeassignment.js';
|
|
3
|
+
import { bindRuntimeConfigV1ToAssignment, snapshotRuntimeConfigV1 } from './runtimeconfig.js';
|
|
4
|
+
import { canonicalizeStrictJson } from '../private/canonicaljson.js';
|
|
5
|
+
export const runtimeSessionV1Contract = Object.freeze({
|
|
6
|
+
maximumWireCanonicalBytes: 327_680,
|
|
7
|
+
maximumCredentialBytes: 16_384,
|
|
8
|
+
maximumRegistryPasswordBytes: 8192,
|
|
9
|
+
registerTransport: 'pallet-initiated-wss-on-configured-cloudly-https-origin',
|
|
10
|
+
historicalObservationAuthority: 'durable-counter-and-ack-only',
|
|
11
|
+
error: 'Runtime session contract rejected.',
|
|
12
|
+
});
|
|
13
|
+
const fail = () => { throw new Error(runtimeSessionV1Contract.error); };
|
|
14
|
+
function requireValue(conditionArg) {
|
|
15
|
+
if (!conditionArg)
|
|
16
|
+
fail();
|
|
17
|
+
}
|
|
18
|
+
const safe = (operationArg) => {
|
|
19
|
+
try {
|
|
20
|
+
return operationArg();
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return fail();
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
const encoder = new TextEncoder();
|
|
27
|
+
const canonical = (valueArg) => canonicalizeStrictJson(valueArg, fail);
|
|
28
|
+
const positive = (valueArg) => {
|
|
29
|
+
requireValue(typeof valueArg === 'number' && Number.isSafeInteger(valueArg) && valueArg > 0);
|
|
30
|
+
return valueArg;
|
|
31
|
+
};
|
|
32
|
+
const identifier = (valueArg) => {
|
|
33
|
+
requireValue(typeof valueArg === 'string' && /^[A-Za-z0-9][A-Za-z0-9:._-]{0,199}$/.test(valueArg));
|
|
34
|
+
return valueArg;
|
|
35
|
+
};
|
|
36
|
+
const nodeId = (valueArg) => {
|
|
37
|
+
requireValue(typeof valueArg === 'string' && /^[A-Za-z0-9_-]{1,128}$/.test(valueArg));
|
|
38
|
+
return valueArg;
|
|
39
|
+
};
|
|
40
|
+
/** Bound decoded JSON before canonicalization; copy data descriptors, never getters. */
|
|
41
|
+
const capture = (valueArg) => safe(() => {
|
|
42
|
+
let nodes = 0;
|
|
43
|
+
let stringBytes = 0;
|
|
44
|
+
const ancestors = new Set();
|
|
45
|
+
const account = (value) => {
|
|
46
|
+
requireValue(value.length <= runtimeSessionV1Contract.maximumWireCanonicalBytes);
|
|
47
|
+
stringBytes += encoder.encode(value).byteLength;
|
|
48
|
+
requireValue(stringBytes <= runtimeSessionV1Contract.maximumWireCanonicalBytes);
|
|
49
|
+
};
|
|
50
|
+
const copy = (value, depth) => {
|
|
51
|
+
requireValue(++nodes <= 10_240 && depth <= 16);
|
|
52
|
+
if (typeof value === 'string') {
|
|
53
|
+
account(value);
|
|
54
|
+
return value;
|
|
55
|
+
}
|
|
56
|
+
if (value === null || typeof value === 'boolean' || typeof value === 'number')
|
|
57
|
+
return value;
|
|
58
|
+
requireValue(value !== null && typeof value === 'object' && !ancestors.has(value));
|
|
59
|
+
ancestors.add(value);
|
|
60
|
+
try {
|
|
61
|
+
const array = Array.isArray(value);
|
|
62
|
+
const prototype = Object.getPrototypeOf(value);
|
|
63
|
+
requireValue(array ? prototype === Array.prototype : prototype === Object.prototype || prototype === null);
|
|
64
|
+
const keys = Reflect.ownKeys(value);
|
|
65
|
+
requireValue(keys.length <= 257);
|
|
66
|
+
if (array) {
|
|
67
|
+
const length = Object.getOwnPropertyDescriptor(value, 'length')?.value;
|
|
68
|
+
requireValue(Number.isSafeInteger(length) && length >= 0 && length <= 256 && keys.length === length + 1);
|
|
69
|
+
const result = [];
|
|
70
|
+
for (let index = 0; index < length; index++) {
|
|
71
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
|
|
72
|
+
requireValue(descriptor?.enumerable && Object.hasOwn(descriptor, 'value'));
|
|
73
|
+
result.push(copy(descriptor.value, depth + 1));
|
|
74
|
+
}
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
77
|
+
const result = Object.create(null);
|
|
78
|
+
for (const key of keys) {
|
|
79
|
+
requireValue(typeof key === 'string');
|
|
80
|
+
account(key);
|
|
81
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
82
|
+
requireValue(descriptor?.enumerable && Object.hasOwn(descriptor, 'value'));
|
|
83
|
+
result[key] = copy(descriptor.value, depth + 1);
|
|
84
|
+
}
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
ancestors.delete(value);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
const serialized = canonical(copy(valueArg, 0));
|
|
92
|
+
requireValue(encoder.encode(serialized).byteLength <= runtimeSessionV1Contract.maximumWireCanonicalBytes);
|
|
93
|
+
return JSON.parse(serialized);
|
|
94
|
+
});
|
|
95
|
+
const record = (valueArg, keysArg) => {
|
|
96
|
+
requireValue(valueArg !== null && typeof valueArg === 'object' && !Array.isArray(valueArg));
|
|
97
|
+
const keys = Object.keys(valueArg);
|
|
98
|
+
requireValue(keys.length === keysArg.length && keys.every((key) => keysArg.includes(key)));
|
|
99
|
+
return valueArg;
|
|
100
|
+
};
|
|
101
|
+
const reference = (valueArg) => {
|
|
102
|
+
const value = record(valueArg, ['assignmentId', 'generation', 'digest']);
|
|
103
|
+
requireValue(typeof value.digest === 'string' && isSha256Digest(value.digest));
|
|
104
|
+
return { assignmentId: identifier(value.assignmentId), generation: positive(value.generation), digest: value.digest };
|
|
105
|
+
};
|
|
106
|
+
const session = (valueArg) => {
|
|
107
|
+
const value = record(valueArg, ['schemaVersion', 'reporterSessionId', 'nodeId', 'credentialGeneration',
|
|
108
|
+
'sessionEpoch', 'controllerInstanceId', 'controller', 'runtimeNamespace']);
|
|
109
|
+
const controller = record(value.controller, ['kind', 'id', 'epoch']);
|
|
110
|
+
requireValue(value.schemaVersion === 1 && (controller.kind === 'cloudly' || controller.kind === 'onebox'));
|
|
111
|
+
return {
|
|
112
|
+
schemaVersion: 1, reporterSessionId: identifier(value.reporterSessionId), nodeId: nodeId(value.nodeId),
|
|
113
|
+
credentialGeneration: positive(value.credentialGeneration), sessionEpoch: positive(value.sessionEpoch),
|
|
114
|
+
controllerInstanceId: identifier(value.controllerInstanceId),
|
|
115
|
+
controller: { kind: controller.kind, id: identifier(controller.id), epoch: identifier(controller.epoch) },
|
|
116
|
+
runtimeNamespace: identifier(value.runtimeNamespace),
|
|
117
|
+
};
|
|
118
|
+
};
|
|
119
|
+
const sameSession = (leftArg, rightArg) => canonical(leftArg) === canonical(rightArg);
|
|
120
|
+
const sameOwner = (leftArg, rightArg) => leftArg.nodeId === rightArg.nodeId && leftArg.runtimeNamespace === rightArg.runtimeNamespace
|
|
121
|
+
&& canonical(leftArg.controller) === canonical(rightArg.controller);
|
|
122
|
+
const matchesAssignment = (sessionArg, assignmentArg) => sessionArg.nodeId === assignmentArg.nodeId && sessionArg.runtimeNamespace === assignmentArg.runtimeNamespace
|
|
123
|
+
&& canonical(sessionArg.controller) === canonical(assignmentArg.controller);
|
|
124
|
+
/** Synchronous detached structural assertion only; never an authentication check. */
|
|
125
|
+
export const snapshotRuntimeSessionBindingV1 = (valueArg) => safe(() => session(capture(valueArg)));
|
|
126
|
+
export const snapshotRegisterPalletRuntimeSessionRequestV1 = (valueArg) => safe(() => {
|
|
127
|
+
const value = record(capture(valueArg), ['schemaVersion', 'nodeId', 'credentialGeneration', 'bearer']);
|
|
128
|
+
requireValue(value.schemaVersion === 1 && typeof value.bearer === 'string'
|
|
129
|
+
&& /^palletToken[0-9a-f]{64}$/.test(value.bearer));
|
|
130
|
+
return { schemaVersion: 1, nodeId: nodeId(value.nodeId),
|
|
131
|
+
credentialGeneration: positive(value.credentialGeneration), bearer: value.bearer };
|
|
132
|
+
});
|
|
133
|
+
export const snapshotApplyRuntimeAssignmentRequestV1 = (valueArg) => safe(() => {
|
|
134
|
+
const value = record(capture(valueArg), ['session', 'assignment', 'config', 'predecessor']);
|
|
135
|
+
const assignment = snapshotRuntimeAssignmentV1(value.assignment);
|
|
136
|
+
const predecessor = value.predecessor === null ? null : reference(value.predecessor);
|
|
137
|
+
// Assignment revisions use assignment.previous; a replacement names a different attempt.
|
|
138
|
+
requireValue(predecessor === null || predecessor.assignmentId !== assignment.assignmentId);
|
|
139
|
+
return { session: session(value.session), assignment, config: snapshotRuntimeConfigV1(value.config), predecessor };
|
|
140
|
+
});
|
|
141
|
+
export const snapshotApplyRuntimeAssignmentResponseV1 = (valueArg) => safe(() => {
|
|
142
|
+
const value = record(capture(valueArg), ['status', 'assignment']);
|
|
143
|
+
requireValue(value.status === 'accepted' || value.status === 'replay' || value.status === 'historical');
|
|
144
|
+
return { status: value.status, assignment: reference(value.assignment) };
|
|
145
|
+
});
|
|
146
|
+
export const snapshotReportRuntimeAssignmentObservationRequestV1 = (valueArg) => safe(() => {
|
|
147
|
+
const value = record(capture(valueArg), ['session', 'observation']);
|
|
148
|
+
return { session: session(value.session), observation: snapshotRuntimeAssignmentObservationV1(value.observation) };
|
|
149
|
+
});
|
|
150
|
+
export const snapshotReportRuntimeAssignmentObservationResponseV1 = (valueArg) => safe(() => {
|
|
151
|
+
const value = record(capture(valueArg), ['observation', 'authorityUse']);
|
|
152
|
+
requireValue(value.authorityUse === 'current-session' || value.authorityUse === 'historical-recovery');
|
|
153
|
+
return { observation: snapshotRuntimeAssignmentObservationV1(value.observation), authorityUse: value.authorityUse };
|
|
154
|
+
});
|
|
155
|
+
export const snapshotGetRuntimeRegistryCredentialRequestV1 = (valueArg) => safe(() => {
|
|
156
|
+
const value = record(capture(valueArg), ['session', 'assignment']);
|
|
157
|
+
return { session: session(value.session), assignment: reference(value.assignment) };
|
|
158
|
+
});
|
|
159
|
+
export const snapshotGetRuntimeRegistryCredentialResponseV1 = (valueArg) => safe(() => {
|
|
160
|
+
const value = record(capture(valueArg), ['username', 'password', 'expiresAt']);
|
|
161
|
+
requireValue(typeof value.username === 'string' && value.username.length > 0
|
|
162
|
+
&& encoder.encode(value.username).byteLength <= 1024 && !/[\s:\u0000-\u001f\u007f]/.test(value.username));
|
|
163
|
+
requireValue(typeof value.password === 'string' && value.password.length > 0
|
|
164
|
+
&& encoder.encode(value.password).byteLength <= runtimeSessionV1Contract.maximumRegistryPasswordBytes
|
|
165
|
+
&& !/[\u0000-\u001f\u007f]/.test(value.password));
|
|
166
|
+
return { username: value.username, password: value.password, expiresAt: positive(value.expiresAt) };
|
|
167
|
+
});
|
|
168
|
+
export const snapshotRegisterCloudlyClientSessionRequestV1 = (valueArg) => safe(() => {
|
|
169
|
+
const value = record(capture(valueArg), ['schemaVersion', 'identity']);
|
|
170
|
+
const identity = record(value.identity, ['jwt']);
|
|
171
|
+
requireValue(value.schemaVersion === 1 && typeof identity.jwt === 'string'
|
|
172
|
+
&& identity.jwt.length <= runtimeSessionV1Contract.maximumCredentialBytes
|
|
173
|
+
&& /^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/.test(identity.jwt));
|
|
174
|
+
return { schemaVersion: 1, identity: { jwt: identity.jwt } };
|
|
175
|
+
});
|
|
176
|
+
export const snapshotRegisterCloudlyClientSessionResponseV1 = (valueArg) => safe(() => {
|
|
177
|
+
const value = record(capture(valueArg), ['registered']);
|
|
178
|
+
requireValue(value.registered === true);
|
|
179
|
+
return { registered: true };
|
|
180
|
+
});
|
|
181
|
+
/** Bind the authenticated Cloudly registration reply to the node and credential sent. */
|
|
182
|
+
export const bindRegisterPalletRuntimeSessionResponseV1 = (valueArg, requestArg) => safe(() => {
|
|
183
|
+
const response = snapshotRuntimeSessionBindingV1(valueArg);
|
|
184
|
+
const request = snapshotRegisterPalletRuntimeSessionRequestV1(requestArg);
|
|
185
|
+
requireValue(response.controller.kind === 'cloudly' && response.nodeId === request.nodeId
|
|
186
|
+
&& response.credentialGeneration === request.credentialGeneration);
|
|
187
|
+
return response;
|
|
188
|
+
});
|
|
189
|
+
/** Reject already expired material; issuance policy and current assignment authority remain server-owned. */
|
|
190
|
+
export const bindGetRuntimeRegistryCredentialResponseV1 = (valueArg, nowArg) => safe(() => {
|
|
191
|
+
const response = snapshotGetRuntimeRegistryCredentialResponseV1(valueArg);
|
|
192
|
+
requireValue(response.expiresAt > positive(nowArg));
|
|
193
|
+
return response;
|
|
194
|
+
});
|
|
195
|
+
/**
|
|
196
|
+
* Capture every input before awaiting digest verification. trustedSessionArg must
|
|
197
|
+
* come from the receiving live connection, never from another request field.
|
|
198
|
+
* This binds content only; durable CAS, slot admission and authority remain owners.
|
|
199
|
+
*/
|
|
200
|
+
export const bindApplyRuntimeAssignmentRequestV1 = async (valueArg, trustedSessionArg) => {
|
|
201
|
+
try {
|
|
202
|
+
const request = snapshotApplyRuntimeAssignmentRequestV1(valueArg);
|
|
203
|
+
const trustedSession = snapshotRuntimeSessionBindingV1(trustedSessionArg);
|
|
204
|
+
requireValue(sameSession(request.session, trustedSession) && matchesAssignment(trustedSession, request.assignment));
|
|
205
|
+
await bindRuntimeConfigV1ToAssignment(request.config, request.assignment);
|
|
206
|
+
return request;
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
return fail();
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
/** Match an admission acknowledgement to the exact sent revision, including historical replies. */
|
|
213
|
+
export const bindApplyRuntimeAssignmentResponseV1 = (valueArg, requestArg) => safe(() => {
|
|
214
|
+
const response = snapshotApplyRuntimeAssignmentResponseV1(valueArg);
|
|
215
|
+
const request = snapshotApplyRuntimeAssignmentRequestV1(requestArg);
|
|
216
|
+
requireValue(canonical(response.assignment) === canonical(getRuntimeAssignmentV1Reference(request.assignment)));
|
|
217
|
+
return response;
|
|
218
|
+
});
|
|
219
|
+
/**
|
|
220
|
+
* trustedSessionArg is the CURRENT authenticated physical peer. reporterHistoryArg
|
|
221
|
+
* must be server-indexed immutable session history, obtained by the original
|
|
222
|
+
* observation's reporterSessionId; never accept caller-supplied history. All V1
|
|
223
|
+
* runtime sessions are Pallet-purpose sessions, so Spark history cannot qualify.
|
|
224
|
+
*
|
|
225
|
+
* This verifies content and classifies recovery, not authentication, history
|
|
226
|
+
* provenance, sequence admission or current authority. The server must transact
|
|
227
|
+
* receipt/counter acceptance under current credential and peer authority. A
|
|
228
|
+
* historical result MUST NOT restore active readiness, routes or liveness.
|
|
229
|
+
*/
|
|
230
|
+
export const bindReportRuntimeAssignmentObservationRequestV1 = async (valueArg, assignmentArg, trustedSessionArg, reporterHistoryArg) => {
|
|
231
|
+
try {
|
|
232
|
+
const request = snapshotReportRuntimeAssignmentObservationRequestV1(valueArg);
|
|
233
|
+
const assignment = snapshotRuntimeAssignmentV1(capture(assignmentArg));
|
|
234
|
+
const trustedSession = snapshotRuntimeSessionBindingV1(trustedSessionArg);
|
|
235
|
+
const reporterHistory = snapshotRuntimeSessionBindingV1(reporterHistoryArg);
|
|
236
|
+
requireValue(sameSession(request.session, trustedSession) && matchesAssignment(trustedSession, assignment)
|
|
237
|
+
&& request.observation.reporterSessionId === reporterHistory.reporterSessionId
|
|
238
|
+
&& sameOwner(trustedSession, reporterHistory));
|
|
239
|
+
const current = sameSession(reporterHistory, trustedSession);
|
|
240
|
+
requireValue(current || (reporterHistory.reporterSessionId !== trustedSession.reporterSessionId
|
|
241
|
+
&& reporterHistory.sessionEpoch < trustedSession.sessionEpoch
|
|
242
|
+
&& reporterHistory.credentialGeneration <= trustedSession.credentialGeneration));
|
|
243
|
+
requireValue((await validateRuntimeAssignmentObservationV1(request.observation, assignment)).length === 0);
|
|
244
|
+
return { request, authorityUse: current ? 'current-session' : 'historical-recovery' };
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
return fail();
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
/** Reject body rewriting and a historical receipt mislabeled as current authority. */
|
|
251
|
+
export const bindReportRuntimeAssignmentObservationResponseV1 = (valueArg, requestArg) => safe(() => {
|
|
252
|
+
const response = snapshotReportRuntimeAssignmentObservationResponseV1(valueArg);
|
|
253
|
+
const request = snapshotReportRuntimeAssignmentObservationRequestV1(requestArg);
|
|
254
|
+
requireValue(canonical(response.observation) === canonical(request.observation)
|
|
255
|
+
&& response.authorityUse === (request.observation.reporterSessionId === request.session.reporterSessionId
|
|
256
|
+
? 'current-session' : 'historical-recovery'));
|
|
257
|
+
return response;
|
|
258
|
+
});
|
|
259
|
+
/** Current assignment lookup and live peer authorization remain mandatory server-owned inputs. */
|
|
260
|
+
export const bindGetRuntimeRegistryCredentialRequestV1 = async (valueArg, assignmentArg, trustedSessionArg) => {
|
|
261
|
+
try {
|
|
262
|
+
const request = snapshotGetRuntimeRegistryCredentialRequestV1(valueArg);
|
|
263
|
+
const assignment = snapshotRuntimeAssignmentV1(capture(assignmentArg));
|
|
264
|
+
const trustedSession = snapshotRuntimeSessionBindingV1(trustedSessionArg);
|
|
265
|
+
requireValue(sameSession(request.session, trustedSession) && matchesAssignment(trustedSession, assignment)
|
|
266
|
+
&& assignment.disposition === 'run'
|
|
267
|
+
&& canonical(request.assignment) === canonical(getRuntimeAssignmentV1Reference(assignment)));
|
|
268
|
+
requireValue((await validateRuntimeAssignmentV1(assignment)).length === 0);
|
|
269
|
+
return request;
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
return fail();
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZXNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL3J1bnRpbWVzZXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUtyRCxPQUFPLEVBQ0wsK0JBQStCLEVBQUUsc0NBQXNDLEVBQ3ZFLDJCQUEyQixFQUFFLHNDQUFzQyxFQUFFLDJCQUEyQixHQUNqRyxNQUFNLHdCQUF3QixDQUFDO0FBRWhDLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBdUZyRSxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3BELHlCQUF5QixFQUFFLE9BQU87SUFDbEMsc0JBQXNCLEVBQUUsTUFBTTtJQUM5Qiw0QkFBNEIsRUFBRSxJQUFJO0lBQ2xDLGlCQUFpQixFQUFFLHlEQUF5RDtJQUM1RSw4QkFBOEIsRUFBRSw4QkFBOEI7SUFDOUQsS0FBSyxFQUFFLG9DQUFvQztDQUNuQyxDQUFDLENBQUM7QUFFWixNQUFNLElBQUksR0FBRyxHQUFVLEVBQUUsR0FBRyxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9FLFNBQVMsWUFBWSxDQUFDLFlBQXFCO0lBQ3pDLElBQUksQ0FBQyxZQUFZO1FBQUUsSUFBSSxFQUFFLENBQUM7QUFDNUIsQ0FBQztBQUNELE1BQU0sSUFBSSxHQUFHLENBQUksWUFBcUIsRUFBSyxFQUFFO0lBQzNDLElBQUksQ0FBQztRQUFDLE9BQU8sWUFBWSxFQUFFLENBQUM7SUFBQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUFDLENBQUM7QUFDekQs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
|
|
@@ -25,6 +25,7 @@ import * as nodeRequests from './node.js';
|
|
|
25
25
|
import * as palletRequests from './pallet.js';
|
|
26
26
|
import * as platformRequests from './platform.js';
|
|
27
27
|
import * as routingRequests from './routing.js';
|
|
28
|
+
import * as runtimeSessionRequests from './runtimesession.js';
|
|
28
29
|
import * as secretRequests from './secret.js';
|
|
29
30
|
import * as serverRequests from './server.js';
|
|
30
31
|
import * as serviceRequests from './service.js';
|
|
@@ -33,7 +34,7 @@ import * as statusRequests from './status.js';
|
|
|
33
34
|
import * as taskRequests from './task.js';
|
|
34
35
|
import * as versionRequests from './version.js';
|
|
35
36
|
import * as webPushRequests from './webpush.js';
|
|
36
|
-
export { adminRequests as admin, appStoreRequests as appstore, baremetalRequests as baremetal, baseOsRequests as baseos, backupRequests as backup, certificateRequests as certificate, clusterRequests as cluster, configRequests as config, coreMailRequests as coremail, corestoreRequests as corestore, deploymentRequests as deployment, dnsRequests as dns, domainRequests as domain, externalRegistryRequests as externalRegistry, gatewayRequests as gateway, hostedAppRequests as hostedapp, identityRequests as identity, imageRequests as image, informRequests as inform, logRequests as log, mailRequests as mail, migrationRequests as migration, networkRequests as network, nodeRequests as node, palletRequests as pallet, platformRequests as platform, routingRequests as routing, secretRequests as secret, serverRequests as server, serviceRequests as service, settingsRequests as settings, statusRequests as status, taskRequests as task, versionRequests as version, webPushRequests as webpush, };
|
|
37
|
+
export { adminRequests as admin, appStoreRequests as appstore, baremetalRequests as baremetal, baseOsRequests as baseos, backupRequests as backup, certificateRequests as certificate, clusterRequests as cluster, configRequests as config, coreMailRequests as coremail, corestoreRequests as corestore, deploymentRequests as deployment, dnsRequests as dns, domainRequests as domain, externalRegistryRequests as externalRegistry, gatewayRequests as gateway, hostedAppRequests as hostedapp, identityRequests as identity, imageRequests as image, informRequests as inform, logRequests as log, mailRequests as mail, migrationRequests as migration, networkRequests as network, nodeRequests as node, palletRequests as pallet, platformRequests as platform, routingRequests as routing, runtimeSessionRequests as runtimesession, secretRequests as secret, serverRequests as server, serviceRequests as service, settingsRequests as settings, statusRequests as status, taskRequests as task, versionRequests as version, webPushRequests as webpush, };
|
|
37
38
|
export * from './inform.js';
|
|
38
39
|
export * from './hostedapp.js';
|
|
39
40
|
export * from './mail.js';
|
|
@@ -26,6 +26,7 @@ import * as nodeRequests from './node.js';
|
|
|
26
26
|
import * as palletRequests from './pallet.js';
|
|
27
27
|
import * as platformRequests from './platform.js';
|
|
28
28
|
import * as routingRequests from './routing.js';
|
|
29
|
+
import * as runtimeSessionRequests from './runtimesession.js';
|
|
29
30
|
import * as secretRequests from './secret.js';
|
|
30
31
|
import * as serverRequests from './server.js';
|
|
31
32
|
import * as serviceRequests from './service.js';
|
|
@@ -34,9 +35,9 @@ import * as statusRequests from './status.js';
|
|
|
34
35
|
import * as taskRequests from './task.js';
|
|
35
36
|
import * as versionRequests from './version.js';
|
|
36
37
|
import * as webPushRequests from './webpush.js';
|
|
37
|
-
export { adminRequests as admin, appStoreRequests as appstore, baremetalRequests as baremetal, baseOsRequests as baseos, backupRequests as backup, certificateRequests as certificate, clusterRequests as cluster, configRequests as config, coreMailRequests as coremail, corestoreRequests as corestore, deploymentRequests as deployment, dnsRequests as dns, domainRequests as domain, externalRegistryRequests as externalRegistry, gatewayRequests as gateway, hostedAppRequests as hostedapp, identityRequests as identity, imageRequests as image, informRequests as inform, logRequests as log, mailRequests as mail, migrationRequests as migration, networkRequests as network, nodeRequests as node, palletRequests as pallet, platformRequests as platform, routingRequests as routing, secretRequests as secret, serverRequests as server, serviceRequests as service, settingsRequests as settings, statusRequests as status, taskRequests as task, versionRequests as version, webPushRequests as webpush, };
|
|
38
|
+
export { adminRequests as admin, appStoreRequests as appstore, baremetalRequests as baremetal, baseOsRequests as baseos, backupRequests as backup, certificateRequests as certificate, clusterRequests as cluster, configRequests as config, coreMailRequests as coremail, corestoreRequests as corestore, deploymentRequests as deployment, dnsRequests as dns, domainRequests as domain, externalRegistryRequests as externalRegistry, gatewayRequests as gateway, hostedAppRequests as hostedapp, identityRequests as identity, imageRequests as image, informRequests as inform, logRequests as log, mailRequests as mail, migrationRequests as migration, networkRequests as network, nodeRequests as node, palletRequests as pallet, platformRequests as platform, routingRequests as routing, runtimeSessionRequests as runtimesession, secretRequests as secret, serverRequests as server, serviceRequests as service, settingsRequests as settings, statusRequests as status, taskRequests as task, versionRequests as version, webPushRequests as webpush, };
|
|
38
39
|
export * from './inform.js';
|
|
39
40
|
export * from './hostedapp.js';
|
|
40
41
|
export * from './mail.js';
|
|
41
42
|
export * from './webpush.js';
|
|
42
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9yZXF1ZXN0cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEtBQUssYUFBYSxNQUFNLFlBQVksQ0FBQztBQUM1QyxPQUFPLEtBQUssZ0JBQWdCLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sS0FBSyxpQkFBaUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRCxPQUFPLEtBQUssY0FBYyxNQUFNLGFBQWEsQ0FBQztBQUM5QyxPQUFPLEtBQUssY0FBYyxNQUFNLGFBQWEsQ0FBQztBQUM5QyxPQUFPLEtBQUssbUJBQW1CLE1BQU0sa0JBQWtCLENBQUM7QUFDeEQsT0FBTyxLQUFLLGVBQWUsTUFBTSxjQUFjLENBQUM7QUFDaEQsT0FBTyxLQUFLLGNBQWMsTUFBTSxhQUFhLENBQUM7QUFDOUMsT0FBTyxLQUFLLGdCQUFnQixNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEtBQUssaUJBQWlCLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxLQUFLLGtCQUFrQixNQUFNLGlCQUFpQixDQUFDO0FBQ3RELE9BQU8sS0FBSyxXQUFXLE1BQU0sVUFBVSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxjQUFjLE1BQU0sYUFBYSxDQUFDO0FBQzlDLE9BQU8sS0FBSyx3QkFBd0IsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRSxPQUFPLEtBQUssZUFBZSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxPQUFPLEtBQUssaUJBQWlCLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxLQUFLLGdCQUFnQixNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEtBQUssYUFBYSxNQUFNLFlBQVksQ0FBQztBQUM1QyxPQUFPLEtBQUssY0FBYyxNQUFNLGFBQWEsQ0FBQztBQUM5QyxPQUFPLEtBQUssV0FBVyxNQUFNLFVBQVUsQ0FBQztBQUN4QyxPQUFPLEtBQUssWUFBWSxNQUFNLFdBQVcsQ0FBQztBQUMxQyxPQUFPLEtBQUssaUJBQWlCLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxLQUFLLGVBQWUsTUFBTSxjQUFjLENBQUM7QUFDaEQsT0FBTyxLQUFLLFlBQVksTUFBTSxXQUFXLENBQUM7QUFDMUMsT0FBTyxLQUFLLGNBQWMsTUFBTSxhQUFhLENBQUM7QUFDOUMsT0FBTyxLQUFLLGdCQUFnQixNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEtBQUssZUFBZSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxPQUFPLEtBQUssc0JBQXNCLE1BQU0scUJBQXFCLENBQUM7QUFDOUQsT0FBTyxLQUFLLGNBQWMsTUFBTSxhQUFhLENBQUM7QUFDOUMsT0FBTyxLQUFLLGNBQWMsTUFBTSxhQUFhLENBQUM7QUFDOUMsT0FBTyxLQUFLLGVBQWUsTUFBTSxjQUFjLENBQUM7QUFDaEQsT0FBTyxLQUFLLGdCQUFnQixNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEtBQUssY0FBYyxNQUFNLGFBQWEsQ0FBQztBQUM5QyxPQUFPLEtBQUssWUFBWSxNQUFNLFdBQVcsQ0FBQztBQUMxQyxPQUFPLEtBQUssZUFBZSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxPQUFPLEtBQUssZUFBZSxNQUFNLGNBQWMsQ0FBQztBQUVoRCxPQUFPLEVBQ0wsYUFBYSxJQUFJLEtBQUssRUFDdEIsZ0JBQWdCLElBQUksUUFBUSxFQUM1QixpQkFBaUIsSUFBSSxTQUFTLEVBQzlCLGNBQWMsSUFBSSxNQUFNLEVBQ3hCLGNBQWMsSUFBSSxNQUFNLEVBQ3hCLG1CQUFtQixJQUFJLFdBQVcsRUFDbEMsZUFBZSxJQUFJLE9BQU8sRUFDMUIsY0FBYyxJQUFJLE1BQU0sRUFDeEIsZ0JBQWdCLElBQUksUUFBUSxFQUM1QixpQkFBaUIsSUFBSSxTQUFTLEVBQzlCLGtCQUFrQixJQUFJLFVBQVUsRUFDaEMsV0FBVyxJQUFJLEdBQUcsRUFDbEIsY0FBYyxJQUFJLE1BQU0sRUFDeEIsd0JBQXdCLElBQUksZ0JBQWdCLEVBQzVDLGVBQWUsSUFBSSxPQUFPLEVBQzFCLGlCQUFpQixJQUFJLFNBQVMsRUFDOUIsZ0JBQWdCLElBQUksUUFBUSxFQUM1QixhQUFhLElBQUksS0FBSyxFQUN0QixjQUFjLElBQUksTUFBTSxFQUN4QixXQUFXLElBQUksR0FBRyxFQUNsQixZQUFZLElBQUksSUFBSSxFQUNwQixpQkFBaUIsSUFBSSxTQUFTLEVBQzlCLGVBQWUsSUFBSSxPQUFPLEVBQzFCLFlBQVksSUFBSSxJQUFJLEVBQ3BCLGNBQWMsSUFBSSxNQUFNLEVBQ3hCLGdCQUFnQixJQUFJLFFBQVEsRUFDNUIsZUFBZSxJQUFJLE9BQU8sRUFDMUIsc0JBQXNCLElBQUksY0FBYyxFQUN4QyxjQUFjLElBQUksTUFBTSxFQUN4QixjQUFjLElBQUksTUFBTSxFQUN4QixlQUFlLElBQUksT0FBTyxFQUMxQixnQkFBZ0IsSUFBSSxRQUFRLEVBQzVCLGNBQWMsSUFBSSxNQUFNLEVBQ3hCLFlBQVksSUFBSSxJQUFJLEVBQ3BCLGVBQWUsSUFBSSxPQUFPLEVBQzFCLGVBQWUsSUFBSSxPQUFPLEdBQzNCLENBQUM7QUFFRixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsY0FBYyxDQUFDIn0=
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import type * as data from '../data/runtimesession.js';
|
|
3
|
+
/** WSS-only Pallet bootstrap. Derive physical peer/process/idempotency server-side. */
|
|
4
|
+
export interface IReq_Pallet_Cloudly_RegisterPalletRuntimeSessionV1 extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Pallet_Cloudly_RegisterPalletRuntimeSessionV1> {
|
|
5
|
+
method: 'registerPalletRuntimeSessionV1';
|
|
6
|
+
request: data.IRegisterPalletRuntimeSessionRequestV1;
|
|
7
|
+
response: data.IRuntimeSessionBindingV1;
|
|
8
|
+
}
|
|
9
|
+
/** Controller push over the already authenticated Pallet-initiated connection. */
|
|
10
|
+
export interface IReq_Controller_Pallet_ApplyRuntimeAssignmentV1 extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Controller_Pallet_ApplyRuntimeAssignmentV1> {
|
|
11
|
+
method: 'applyRuntimeAssignmentV1';
|
|
12
|
+
request: data.IApplyRuntimeAssignmentRequestV1;
|
|
13
|
+
response: data.IApplyRuntimeAssignmentResponseV1;
|
|
14
|
+
}
|
|
15
|
+
/** Current-peer report, including exact historical outbox recovery after reconnect. */
|
|
16
|
+
export interface IReq_Pallet_Controller_ReportRuntimeAssignmentObservationV1 extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Pallet_Controller_ReportRuntimeAssignmentObservationV1> {
|
|
17
|
+
method: 'reportRuntimeAssignmentObservationV1';
|
|
18
|
+
request: data.IReportRuntimeAssignmentObservationRequestV1;
|
|
19
|
+
response: data.IReportRuntimeAssignmentObservationResponseV1;
|
|
20
|
+
}
|
|
21
|
+
/** Current-peer, exact current assignment authorization; response is secret material. */
|
|
22
|
+
export interface IReq_Pallet_Controller_GetRuntimeRegistryCredentialV1 extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Pallet_Controller_GetRuntimeRegistryCredentialV1> {
|
|
23
|
+
method: 'getRuntimeRegistryCredentialV1';
|
|
24
|
+
request: data.IGetRuntimeRegistryCredentialRequestV1;
|
|
25
|
+
response: data.IGetRuntimeRegistryCredentialResponseV1;
|
|
26
|
+
}
|
|
27
|
+
/** WSS-only JWT authentication; server-owned identity tag, never client-authored claims. */
|
|
28
|
+
export interface IReq_Any_Cloudly_RegisterCloudlyClientSessionV1 extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Any_Cloudly_RegisterCloudlyClientSessionV1> {
|
|
29
|
+
method: 'registerCloudlyClientSessionV1';
|
|
30
|
+
request: data.IRegisterCloudlyClientSessionRequestV1;
|
|
31
|
+
response: data.IRegisterCloudlyClientSessionResponseV1;
|
|
32
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZXNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9yZXF1ZXN0cy9ydW50aW1lc2Vzc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQyJ9
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -184,6 +184,49 @@ the receiving service. Readiness requires matching running image evidence and
|
|
|
184
184
|
can describe drift (such as a removed runtime while intent remains `run`), and
|
|
185
185
|
does not authorize storage relocation or prove fencing.
|
|
186
186
|
|
|
187
|
+
### Resolved Runtime Configuration
|
|
188
|
+
|
|
189
|
+
`data.IRuntimeConfigV1` seals the public environment, working directory, resource
|
|
190
|
+
and identity policies, target ports, readiness timing and log limits together with
|
|
191
|
+
the immutable image invocation. `computeRuntimeConfigV1Digest` hashes that exact
|
|
192
|
+
content; `bindRuntimeConfigV1ToAssignment` checks the config reference, service,
|
|
193
|
+
organization, image and selected platform against one assignment. Secret material,
|
|
194
|
+
registry credentials and host paths remain outside the configuration.
|
|
195
|
+
|
|
196
|
+
Both CPU and identity policies are required. `cpuMillis: null` explicitly means
|
|
197
|
+
no CPU quota; a positive number sets a quota. `runAsUser` and `runAsGroup` must
|
|
198
|
+
either both be numeric overrides or both be `null`. The null pair selects the
|
|
199
|
+
pinned platform image's OCI user and group resolution against its immutable root
|
|
200
|
+
filesystem. A consumer must not guess a group for a UID-only or named image user.
|
|
201
|
+
Version 29 widens these numeric TypeScript fields to include those explicit null
|
|
202
|
+
policies; consumers must handle them before accepting configurations from v29.
|
|
203
|
+
Existing numeric configurations retain their exact meaning and digest.
|
|
204
|
+
|
|
205
|
+
### Authenticated Runtime Sessions
|
|
206
|
+
|
|
207
|
+
`requests.runtimesession` defines `registerPalletRuntimeSessionV1`,
|
|
208
|
+
`applyRuntimeAssignmentV1`, `reportRuntimeAssignmentObservationV1`, and
|
|
209
|
+
`getRuntimeRegistryCredentialV1`. Pallet initiates WSS through its configured
|
|
210
|
+
Cloudly HTTPS origin. The receiver derives the physical peer, process instance
|
|
211
|
+
and registration idempotency; callers cannot supply those authorities. A serialized
|
|
212
|
+
`IRuntimeSessionBindingV1` provides content to compare with authenticated peer
|
|
213
|
+
state and does not itself authenticate a connection. Registry credentials are
|
|
214
|
+
ephemeral, bounded and authorized against an exact current `run` assignment.
|
|
215
|
+
|
|
216
|
+
After reconnect or credential rotation, the current authenticated session may
|
|
217
|
+
submit an unchanged historical observation from its durable outbox. Server-indexed
|
|
218
|
+
history must prove the same node, runtime namespace and durable controller, an
|
|
219
|
+
older session epoch and an eligible credential generation. A
|
|
220
|
+
`historical-recovery` receipt can advance the durable counter and acknowledge the
|
|
221
|
+
exact body; it cannot restore active readiness, routes or liveness. Those require
|
|
222
|
+
a fresh observation from the current session. The contract helpers validate and
|
|
223
|
+
classify content; authentication and atomic receipt persistence remain server-owned.
|
|
224
|
+
|
|
225
|
+
`registerCloudlyClientSessionV1` separately authenticates a current human or
|
|
226
|
+
machine JWT on a physical TypedSocket so the server can own its identity tag.
|
|
227
|
+
Both registration methods reject HTTP transport. Sensitive requests and registry
|
|
228
|
+
responses must be excluded from hooks, logs, diagnostics and durable journals.
|
|
229
|
+
|
|
187
230
|
### Offline SmartDB Settlement And Packaging
|
|
188
231
|
|
|
189
232
|
The Node-only `@serve.zone/interfaces/runtime` export includes isolated V1
|
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 './registry.js';
|
|
26
26
|
export * from './runtimeassignment.js';
|
|
27
27
|
export * from './runtimeconfig.js';
|
|
28
|
+
export * from './runtimesession.js';
|
|
28
29
|
export * from './secret.js';
|
|
29
30
|
export * from './baremetal.js';
|
|
30
31
|
export * from './baseos.js';
|
package/ts/data/runtimeconfig.ts
CHANGED
|
@@ -71,8 +71,8 @@ export interface IRuntimeConfigLogPolicyV1 {
|
|
|
71
71
|
|
|
72
72
|
/**
|
|
73
73
|
* Controller-owned resolved nonsecret execution intent. OCI command, effective
|
|
74
|
-
* environment, working directory and identity must be resolved before
|
|
75
|
-
* consumers must not
|
|
74
|
+
* environment, working directory and identity policy must be resolved before
|
|
75
|
+
* sealing; consumers must not choose resource limits or identity policies.
|
|
76
76
|
* Secrets, network identity and storage claims remain separately assignment-bound
|
|
77
77
|
* owner references. This document contains no registry credentials or host paths.
|
|
78
78
|
*/
|
|
@@ -90,11 +90,21 @@ export interface IRuntimeConfigV1 extends IRuntimeAuthorityReferenceV1 {
|
|
|
90
90
|
/** Complete effective public environment; secret values must never be inlined. */
|
|
91
91
|
environment: Record<string, string>;
|
|
92
92
|
workingDirectory: string;
|
|
93
|
-
|
|
93
|
+
/** null explicitly requests no CPU quota; zero and omitted values are invalid. */
|
|
94
|
+
cpuMillis: number | null;
|
|
94
95
|
memoryBytes: number;
|
|
95
96
|
readonlyRootfs: boolean;
|
|
96
|
-
|
|
97
|
-
|
|
97
|
+
/**
|
|
98
|
+
* Both identity fields must be numbers or both must be null. The null pair
|
|
99
|
+
* explicitly selects the pinned platform image's OCI User, including primary
|
|
100
|
+
* and supplemental group resolution against its immutable root filesystem.
|
|
101
|
+
* An absent OCI User retains the image/runtime specification's root identity.
|
|
102
|
+
* The execution owner must delegate that resolution to the qualified runtime;
|
|
103
|
+
* it must not guess a GID for a UID-only or named image user.
|
|
104
|
+
*/
|
|
105
|
+
runAsUser: number | null;
|
|
106
|
+
/** Numeric override paired with runAsUser, or null for the image identity policy. */
|
|
107
|
+
runAsGroup: number | null;
|
|
98
108
|
/** Sorted unique names, with no overlapping ranges for the same transport. */
|
|
99
109
|
targetPorts: IRuntimeConfigTargetPortV1[];
|
|
100
110
|
readiness: TRuntimeConfigReadinessV1;
|
|
@@ -287,12 +297,12 @@ const assertConfig = (valueArg: unknown): IRuntimeConfigV1 => {
|
|
|
287
297
|
if (typeof directory !== 'string' || !directory.startsWith('/')
|
|
288
298
|
|| encoder.encode(directory).byteLength > 4096 || /[\u0000-\u001f\u007f]/.test(directory)
|
|
289
299
|
|| (directory !== '/' && directory.split('/').slice(1).some((partArg) => !partArg || partArg === '.' || partArg === '..'))
|
|
290
|
-
|| !isInteger(valueArg.cpuMillis, 1, 1_000_000)
|
|
300
|
+
|| !(valueArg.cpuMillis === null || isInteger(valueArg.cpuMillis, 1, 1_000_000))
|
|
291
301
|
|| !isInteger(valueArg.memoryBytes, 16 * 1024 * 1024, 2 ** 50)
|
|
292
302
|
|| typeof valueArg.readonlyRootfs !== 'boolean'
|
|
293
|
-
|| !
|
|
294
|
-
|
|
295
|
-
fail('runtime config requires canonical directory
|
|
303
|
+
|| !((valueArg.runAsUser === null && valueArg.runAsGroup === null)
|
|
304
|
+
|| (isInteger(valueArg.runAsUser, 0, 2 ** 31 - 1) && isInteger(valueArg.runAsGroup, 0, 2 ** 31 - 1)))) {
|
|
305
|
+
fail('runtime config requires canonical directory and explicit resource and identity policies');
|
|
296
306
|
}
|
|
297
307
|
const ports = valueArg.targetPorts;
|
|
298
308
|
if (!Array.isArray(ports) || ports.length > runtimeConfigV1Contract.maximumTargetPorts) {
|