@serve.zone/interfaces 32.35.0 → 32.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/changelog.md +55 -0
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts/data/deploymentlegacyimport.d.ts +92 -0
  4. package/dist_ts/data/deploymentlegacyimport.js +237 -0
  5. package/dist_ts/data/deploymentoperation.d.ts +63 -38
  6. package/dist_ts/data/deploymentoperation.js +12 -2
  7. package/dist_ts/data/deploymentpreflight.d.ts +42 -10
  8. package/dist_ts/data/deploymentpreflight.js +47 -10
  9. package/dist_ts/data/immutableimage.d.ts +26 -2
  10. package/dist_ts/data/immutableimage.js +12 -2
  11. package/dist_ts/data/index.d.ts +5 -0
  12. package/dist_ts/data/index.js +6 -1
  13. package/dist_ts/data/runtimeassignmentexec.d.ts +110 -0
  14. package/dist_ts/data/runtimeassignmentexec.js +164 -0
  15. package/dist_ts/data/runtimeassignmentlogs.d.ts +121 -0
  16. package/dist_ts/data/runtimeassignmentlogs.js +139 -0
  17. package/dist_ts/data/runtimeassignmentstats.d.ts +60 -0
  18. package/dist_ts/data/runtimeassignmentstats.js +93 -0
  19. package/dist_ts/data/runtimelocalvolumearchive.d.ts +103 -0
  20. package/dist_ts/data/runtimelocalvolumearchive.js +111 -0
  21. package/dist_ts/data/user.d.ts +6 -1
  22. package/dist_ts/data/user.js +6 -1
  23. package/dist_ts/requests/runtimesession.d.ts +81 -0
  24. package/dist_ts/requests/service.d.ts +51 -0
  25. package/package.json +1 -1
  26. package/readme.md +105 -0
  27. package/ts/00_commitinfo_data.ts +1 -1
  28. package/ts/data/deploymentlegacyimport.ts +371 -0
  29. package/ts/data/deploymentoperation.ts +83 -39
  30. package/ts/data/deploymentpreflight.ts +86 -18
  31. package/ts/data/immutableimage.ts +42 -3
  32. package/ts/data/index.ts +5 -0
  33. package/ts/data/runtimeassignmentexec.ts +271 -0
  34. package/ts/data/runtimeassignmentlogs.ts +249 -0
  35. package/ts/data/runtimeassignmentstats.ts +149 -0
  36. package/ts/data/runtimelocalvolumearchive.ts +207 -0
  37. package/ts/data/user.ts +10 -0
  38. package/ts/requests/runtimesession.ts +102 -0
  39. package/ts/requests/service.ts +66 -0
@@ -0,0 +1,110 @@
1
+ import type { IRuntimeAssignment, IRuntimeAssignmentReference } from './runtimeassignment.js';
2
+ import type { IRuntimeSessionBinding } from './runtimesession.js';
3
+ /** A terminal's size in character cells. */
4
+ export interface IRuntimeTerminalSize {
5
+ columns: number;
6
+ rows: number;
7
+ }
8
+ /**
9
+ * A controller's request to run one command inside one running attempt's container.
10
+ *
11
+ * `command` is the argument vector the runtime executes directly: no shell parses it unless its
12
+ * first element names one. With `tty` the process runs on a terminal of `terminalSize`, which is
13
+ * stated exactly then; its output arrives on one stream. Without it stdout and stderr arrive on
14
+ * separate streams. Standard input is the optional stream the TypedRequest carries beside this
15
+ * body; its end is the process's end of input.
16
+ */
17
+ export interface IOpenRuntimeAssignmentExecRequest {
18
+ session: IRuntimeSessionBinding;
19
+ /** The exact current revision of a `run` assignment on this node. */
20
+ assignment: IRuntimeAssignmentReference;
21
+ command: string[];
22
+ tty: boolean;
23
+ terminalSize: IRuntimeTerminalSize | null;
24
+ }
25
+ /**
26
+ * The node's answer once the process runs. `execId` names the session in later requests;
27
+ * `idleTimeoutMs` is how long the session may carry no byte in either direction before the node
28
+ * ends it.
29
+ */
30
+ export interface IOpenRuntimeAssignmentExecResponse {
31
+ execId: string;
32
+ assignment: IRuntimeAssignmentReference;
33
+ tty: boolean;
34
+ idleTimeoutMs: number;
35
+ }
36
+ /** A new terminal size for a `tty` session. */
37
+ export interface IResizeRuntimeAssignmentExecRequest {
38
+ session: IRuntimeSessionBinding;
39
+ execId: string;
40
+ terminalSize: IRuntimeTerminalSize;
41
+ }
42
+ export interface IResizeRuntimeAssignmentExecResponse {
43
+ execId: string;
44
+ }
45
+ /** Ends a session and releases its slot, whether or not its process has exited. */
46
+ export interface ICloseRuntimeAssignmentExecRequest {
47
+ session: IRuntimeSessionBinding;
48
+ execId: string;
49
+ }
50
+ /**
51
+ * Why the node ended a process before it exited: `closed` by this request, `idle-timeout` after
52
+ * `idleTimeoutMs` without a byte, `container-stopped` because its container stopped.
53
+ */
54
+ export type TRuntimeAssignmentExecTermination = 'closed' | 'idle-timeout' | 'container-stopped';
55
+ /**
56
+ * How the session ended. `exited` carries the process's `exitCode`, 128 plus the signal number
57
+ * for a process a signal ended; `terminated` states why the node ended it and carries no code.
58
+ */
59
+ export interface ICloseRuntimeAssignmentExecResponse {
60
+ execId: string;
61
+ outcome: 'exited' | 'terminated';
62
+ exitCode: number | null;
63
+ termination: TRuntimeAssignmentExecTermination | null;
64
+ }
65
+ /**
66
+ * Exec runs only for a controller on the node's own host (`controller.kind: 'onebox'`, which only a
67
+ * local controller binding carries), and only on the connection that holds its session. A session
68
+ * lives until it is closed, or until the node ends it: after `idleTimeoutMs` without a byte, when
69
+ * its container stops, or when the controller session it was opened under ends, in which case its
70
+ * `execId` is gone with it. An ended session keeps its slot and its outcome until it is closed.
71
+ */
72
+ export declare const runtimeAssignmentExecContract: Readonly<{
73
+ readonly error: "Runtime assignment exec contract rejected.";
74
+ readonly controllerKind: "onebox";
75
+ /** Open sessions per node, ended ones not yet closed included; one more is refused. */
76
+ readonly maximumSessions: 4;
77
+ readonly idleTimeoutMs: 900000;
78
+ readonly maximumCommandArguments: 256;
79
+ /** The UTF-8 bytes of every argument together. */
80
+ readonly maximumCommandBytes: 65536;
81
+ /** The largest terminal dimension, the width of the runtime's own size field. */
82
+ readonly maximumTerminalDimension: 65535;
83
+ readonly maximumExitCode: 255;
84
+ }>;
85
+ export declare const snapshotOpenRuntimeAssignmentExecRequest: (valueArg: unknown) => IOpenRuntimeAssignmentExecRequest;
86
+ export declare const snapshotOpenRuntimeAssignmentExecResponse: (valueArg: unknown) => IOpenRuntimeAssignmentExecResponse;
87
+ export declare const snapshotResizeRuntimeAssignmentExecRequest: (valueArg: unknown) => IResizeRuntimeAssignmentExecRequest;
88
+ export declare const snapshotResizeRuntimeAssignmentExecResponse: (valueArg: unknown) => IResizeRuntimeAssignmentExecResponse;
89
+ export declare const snapshotCloseRuntimeAssignmentExecRequest: (valueArg: unknown) => ICloseRuntimeAssignmentExecRequest;
90
+ export declare const snapshotCloseRuntimeAssignmentExecResponse: (valueArg: unknown) => ICloseRuntimeAssignmentExecResponse;
91
+ /**
92
+ * Node-side content binding, not authentication. `trustedSessionArg` is the node's CURRENT
93
+ * session, the request must have arrived on that session's own connection, and that session must
94
+ * be a local controller's. `assignmentArg` is the node's current admitted revision of the named
95
+ * assignment: the request must name exactly it, it must be a `run` assignment, and it must belong
96
+ * to the session's controller, node and runtime namespace. Whether its container runs is the
97
+ * node's own check.
98
+ */
99
+ export declare const bindOpenRuntimeAssignmentExecRequest: (valueArg: unknown, assignmentArg: unknown, trustedSessionArg: unknown) => Promise<{
100
+ request: IOpenRuntimeAssignmentExecRequest;
101
+ assignment: IRuntimeAssignment;
102
+ }>;
103
+ /** Matches an opened session to the request: the same assignment revision and terminal mode. */
104
+ export declare const bindOpenRuntimeAssignmentExecResponse: (valueArg: unknown, requestArg: unknown) => IOpenRuntimeAssignmentExecResponse;
105
+ /** Node-side content binding of a resize; which sessions exist and are `tty` is the node's check. */
106
+ export declare const bindResizeRuntimeAssignmentExecRequest: (valueArg: unknown, trustedSessionArg: unknown) => IResizeRuntimeAssignmentExecRequest;
107
+ export declare const bindResizeRuntimeAssignmentExecResponse: (valueArg: unknown, requestArg: unknown) => IResizeRuntimeAssignmentExecResponse;
108
+ /** Node-side content binding of a close; which sessions exist is the node's check. */
109
+ export declare const bindCloseRuntimeAssignmentExecRequest: (valueArg: unknown, trustedSessionArg: unknown) => ICloseRuntimeAssignmentExecRequest;
110
+ export declare const bindCloseRuntimeAssignmentExecResponse: (valueArg: unknown, requestArg: unknown) => ICloseRuntimeAssignmentExecResponse;
@@ -0,0 +1,164 @@
1
+ import { getRuntimeAssignmentReference, snapshotRuntimeAssignment, validateRuntimeAssignment } from './runtimeassignment.js';
2
+ import { snapshotRuntimeSessionBinding } from './runtimesession.js';
3
+ import { captureNetwork, networkCounter, networkDigest, networkEqual, networkId, networkRecord, requireNetwork, } from '../private/networkcontract.js';
4
+ /**
5
+ * Exec runs only for a controller on the node's own host (`controller.kind: 'onebox'`, which only a
6
+ * local controller binding carries), and only on the connection that holds its session. A session
7
+ * lives until it is closed, or until the node ends it: after `idleTimeoutMs` without a byte, when
8
+ * its container stops, or when the controller session it was opened under ends, in which case its
9
+ * `execId` is gone with it. An ended session keeps its slot and its outcome until it is closed.
10
+ */
11
+ export const runtimeAssignmentExecContract = Object.freeze({
12
+ error: 'Runtime assignment exec contract rejected.',
13
+ controllerKind: 'onebox',
14
+ /** Open sessions per node, ended ones not yet closed included; one more is refused. */
15
+ maximumSessions: 4,
16
+ idleTimeoutMs: 900_000,
17
+ maximumCommandArguments: 256,
18
+ /** The UTF-8 bytes of every argument together. */
19
+ maximumCommandBytes: 65_536,
20
+ /** The largest terminal dimension, the width of the runtime's own size field. */
21
+ maximumTerminalDimension: 65_535,
22
+ maximumExitCode: 255,
23
+ });
24
+ const fail = () => { throw new Error(runtimeAssignmentExecContract.error); };
25
+ const safe = (operationArg) => { try {
26
+ return operationArg();
27
+ }
28
+ catch {
29
+ return fail();
30
+ } };
31
+ const encoder = new TextEncoder();
32
+ const terminations = ['closed', 'idle-timeout', 'container-stopped'];
33
+ const referenceOf = (valueArg) => {
34
+ const value = networkRecord(valueArg, ['assignmentId', 'generation', 'digest']);
35
+ return {
36
+ assignmentId: networkId(value.assignmentId), generation: networkCounter(value.generation),
37
+ digest: networkDigest(value.digest),
38
+ };
39
+ };
40
+ const terminalSizeOf = (valueArg) => {
41
+ const value = networkRecord(valueArg, ['columns', 'rows']);
42
+ return {
43
+ columns: networkCounter(value.columns, runtimeAssignmentExecContract.maximumTerminalDimension),
44
+ rows: networkCounter(value.rows, runtimeAssignmentExecContract.maximumTerminalDimension),
45
+ };
46
+ };
47
+ const commandOf = (valueArg) => {
48
+ requireNetwork(Array.isArray(valueArg) && valueArg.length > 0
49
+ && valueArg.length <= runtimeAssignmentExecContract.maximumCommandArguments);
50
+ let bytes = 0;
51
+ const command = valueArg.map((argumentArg) => {
52
+ requireNetwork(typeof argumentArg === 'string' && !argumentArg.includes('\0'));
53
+ bytes += encoder.encode(argumentArg).byteLength;
54
+ return argumentArg;
55
+ });
56
+ requireNetwork(command[0].length > 0 && bytes <= runtimeAssignmentExecContract.maximumCommandBytes);
57
+ return command;
58
+ };
59
+ export const snapshotOpenRuntimeAssignmentExecRequest = (valueArg) => safe(() => {
60
+ const value = networkRecord(captureNetwork(valueArg), ['session', 'assignment', 'command', 'tty', 'terminalSize']);
61
+ requireNetwork(typeof value.tty === 'boolean' && (value.tty === (value.terminalSize !== null)));
62
+ return {
63
+ session: snapshotRuntimeSessionBinding(value.session), assignment: referenceOf(value.assignment),
64
+ command: commandOf(value.command), tty: value.tty,
65
+ terminalSize: value.terminalSize === null ? null : terminalSizeOf(value.terminalSize),
66
+ };
67
+ });
68
+ export const snapshotOpenRuntimeAssignmentExecResponse = (valueArg) => safe(() => {
69
+ const value = networkRecord(captureNetwork(valueArg), ['execId', 'assignment', 'tty', 'idleTimeoutMs']);
70
+ requireNetwork(typeof value.tty === 'boolean'
71
+ && value.idleTimeoutMs === runtimeAssignmentExecContract.idleTimeoutMs);
72
+ return {
73
+ execId: networkId(value.execId), assignment: referenceOf(value.assignment), tty: value.tty,
74
+ idleTimeoutMs: runtimeAssignmentExecContract.idleTimeoutMs,
75
+ };
76
+ });
77
+ export const snapshotResizeRuntimeAssignmentExecRequest = (valueArg) => safe(() => {
78
+ const value = networkRecord(captureNetwork(valueArg), ['session', 'execId', 'terminalSize']);
79
+ return {
80
+ session: snapshotRuntimeSessionBinding(value.session), execId: networkId(value.execId),
81
+ terminalSize: terminalSizeOf(value.terminalSize),
82
+ };
83
+ });
84
+ export const snapshotResizeRuntimeAssignmentExecResponse = (valueArg) => safe(() => {
85
+ const value = networkRecord(captureNetwork(valueArg), ['execId']);
86
+ return { execId: networkId(value.execId) };
87
+ });
88
+ export const snapshotCloseRuntimeAssignmentExecRequest = (valueArg) => safe(() => {
89
+ const value = networkRecord(captureNetwork(valueArg), ['session', 'execId']);
90
+ return { session: snapshotRuntimeSessionBinding(value.session), execId: networkId(value.execId) };
91
+ });
92
+ export const snapshotCloseRuntimeAssignmentExecResponse = (valueArg) => safe(() => {
93
+ const value = networkRecord(captureNetwork(valueArg), ['execId', 'outcome', 'exitCode', 'termination']);
94
+ const execId = networkId(value.execId);
95
+ if (value.outcome === 'exited') {
96
+ requireNetwork(typeof value.exitCode === 'number' && Number.isSafeInteger(value.exitCode)
97
+ && value.exitCode >= 0 && !Object.is(value.exitCode, -0)
98
+ && value.exitCode <= runtimeAssignmentExecContract.maximumExitCode && value.termination === null);
99
+ return { execId, outcome: 'exited', exitCode: value.exitCode, termination: null };
100
+ }
101
+ requireNetwork(value.outcome === 'terminated' && value.exitCode === null
102
+ && terminations.includes(value.termination));
103
+ return {
104
+ execId, outcome: 'terminated', exitCode: null,
105
+ termination: value.termination,
106
+ };
107
+ });
108
+ /** Exec is a local controller's alone; `trustedSessionArg` decides, never a request field. */
109
+ const requireLocalSession = (requestSessionArg, trustedSessionArg) => {
110
+ const trustedSession = safe(() => snapshotRuntimeSessionBinding(trustedSessionArg));
111
+ safe(() => requireNetwork(networkEqual(requestSessionArg, trustedSession)
112
+ && trustedSession.controller.kind === runtimeAssignmentExecContract.controllerKind));
113
+ };
114
+ /**
115
+ * Node-side content binding, not authentication. `trustedSessionArg` is the node's CURRENT
116
+ * session, the request must have arrived on that session's own connection, and that session must
117
+ * be a local controller's. `assignmentArg` is the node's current admitted revision of the named
118
+ * assignment: the request must name exactly it, it must be a `run` assignment, and it must belong
119
+ * to the session's controller, node and runtime namespace. Whether its container runs is the
120
+ * node's own check.
121
+ */
122
+ export const bindOpenRuntimeAssignmentExecRequest = async (valueArg, assignmentArg, trustedSessionArg) => {
123
+ const request = snapshotOpenRuntimeAssignmentExecRequest(valueArg);
124
+ requireLocalSession(request.session, trustedSessionArg);
125
+ const assignment = safe(() => snapshotRuntimeAssignment(assignmentArg));
126
+ if ((await validateRuntimeAssignment(assignment)).length)
127
+ fail();
128
+ safe(() => requireNetwork(assignment.disposition === 'run'
129
+ && networkEqual(assignment.controller, request.session.controller)
130
+ && assignment.nodeId === request.session.nodeId
131
+ && assignment.runtimeNamespace === request.session.runtimeNamespace
132
+ && networkEqual(request.assignment, getRuntimeAssignmentReference(assignment))));
133
+ return { request, assignment };
134
+ };
135
+ /** Matches an opened session to the request: the same assignment revision and terminal mode. */
136
+ export const bindOpenRuntimeAssignmentExecResponse = (valueArg, requestArg) => safe(() => {
137
+ const response = snapshotOpenRuntimeAssignmentExecResponse(valueArg);
138
+ const request = snapshotOpenRuntimeAssignmentExecRequest(requestArg);
139
+ requireNetwork(networkEqual(response.assignment, request.assignment) && response.tty === request.tty);
140
+ return response;
141
+ });
142
+ /** Node-side content binding of a resize; which sessions exist and are `tty` is the node's check. */
143
+ export const bindResizeRuntimeAssignmentExecRequest = (valueArg, trustedSessionArg) => {
144
+ const request = snapshotResizeRuntimeAssignmentExecRequest(valueArg);
145
+ requireLocalSession(request.session, trustedSessionArg);
146
+ return request;
147
+ };
148
+ export const bindResizeRuntimeAssignmentExecResponse = (valueArg, requestArg) => safe(() => {
149
+ const response = snapshotResizeRuntimeAssignmentExecResponse(valueArg);
150
+ requireNetwork(response.execId === snapshotResizeRuntimeAssignmentExecRequest(requestArg).execId);
151
+ return response;
152
+ });
153
+ /** Node-side content binding of a close; which sessions exist is the node's check. */
154
+ export const bindCloseRuntimeAssignmentExecRequest = (valueArg, trustedSessionArg) => {
155
+ const request = snapshotCloseRuntimeAssignmentExecRequest(valueArg);
156
+ requireLocalSession(request.session, trustedSessionArg);
157
+ return request;
158
+ };
159
+ export const bindCloseRuntimeAssignmentExecResponse = (valueArg, requestArg) => safe(() => {
160
+ const response = snapshotCloseRuntimeAssignmentExecResponse(valueArg);
161
+ requireNetwork(response.execId === snapshotCloseRuntimeAssignmentExecRequest(requestArg).execId);
162
+ return response;
163
+ });
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZWFzc2lnbm1lbnRleGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZGF0YS9ydW50aW1lYXNzaWdubWVudGV4ZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLDZCQUE2QixFQUFFLHlCQUF5QixFQUFFLHlCQUF5QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFN0gsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUNMLGNBQWMsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLGNBQWMsR0FDdEcsTUFBTSwrQkFBK0IsQ0FBQztBQXdFdkM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUN6RCxLQUFLLEVBQUUsNENBQTRDO0lBQ25ELGNBQWMsRUFBRSxRQUFRO0lBQ3hCLHVGQUF1RjtJQUN2RixlQUFlLEVBQUUsQ0FBQztJQUNsQixhQUFhLEVBQUUsT0FBTztJQUN0Qix1QkFBdUIsRUFBRSxHQUFHO0lBQzVCLGtEQUFrRDtJQUNsRCxtQkFBbUIsRUFBRSxNQUFNO0lBQzNCLGlGQUFpRjtJQUNqRix3QkFBd0IsRUFBRSxNQUFNO0lBQ2hDLGVBQWUsRUFBRSxHQUFHO0NBQ1osQ0FBQyxDQUFDO0FBRVosTUFBTSxJQUFJLEdBQUcsR0FBVSxFQUFFLEdBQUcsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRixNQUFNLElBQUksR0FBRyxDQUFJLFlBQXFCLEVBQUssRUFBRSxHQUFHLElBQUksQ0FBQztJQUFDLE9BQU8sWUFBWSxFQUFFLENBQUM7QUFBQyxDQUFDO0FBQUMsTUFBTSxDQUFDO0lBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztBQUFDLENBQUMsQ0FBQyxD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
@@ -0,0 +1,121 @@
1
+ import type { IRuntimeAssignment } from './runtimeassignment.js';
2
+ import type { IRuntimeConfigLogPolicy } from './runtimeconfig.js';
3
+ import type { IRuntimeSessionBinding } from './runtimesession.js';
4
+ /** The container output a log line was written to. */
5
+ export type TRuntimeAssignmentLogStream = 'stdout' | 'stderr';
6
+ /**
7
+ * One piece of one line a container wrote, as the runtime captured it.
8
+ *
9
+ * `text` holds no line terminator and no `\n`; the node decodes the captured bytes as UTF-8 and
10
+ * replaces an invalid sequence with U+FFFD. A line longer than one entry travels as consecutive
11
+ * entries of the same stream: every piece but the last states `partial: true`, and the receiver
12
+ * joins them. The joined line is at most the config's `logs.maximumLineBytes` UTF-8 bytes; the node
13
+ * cuts a longer one there and follows its last piece with a `line-cut` loss of the same stream.
14
+ */
15
+ export interface IRuntimeAssignmentLogLine {
16
+ kind: 'line';
17
+ stream: TRuntimeAssignmentLogStream;
18
+ /** When the runtime captured the piece, in nanoseconds since the Unix epoch, as decimal digits. */
19
+ timestampNs: string;
20
+ text: string;
21
+ /** The line continues in the next `line` entry of the same stream. */
22
+ partial: boolean;
23
+ }
24
+ /**
25
+ * Why output did not reach the controller.
26
+ *
27
+ * - `buffer-overflow`: the node's buffer held `logs.maximumBufferedBytes` unacknowledged bytes and
28
+ * the oldest were dropped to keep capturing;
29
+ * - `line-cut`: the rest of a line beyond `logs.maximumLineBytes`;
30
+ * - `capture-restart`: the node's capture restarted without its buffer, for example after a reboot
31
+ * emptied its disposable capture directory; how much was lost is unknown;
32
+ * - `not-captured`: the container was started without output capture, so none of its output is
33
+ * available; how much there was is unknown.
34
+ */
35
+ export type TRuntimeAssignmentLogLossReason = 'buffer-overflow' | 'line-cut' | 'capture-restart' | 'not-captured';
36
+ /**
37
+ * Evidence of output that was lost, in the position of the stream where it was lost.
38
+ *
39
+ * `bytes` and `lines` count exactly what was dropped; both are `null` for `capture-restart` and
40
+ * `not-captured`, whose extent the node cannot know, and both are stated for the other reasons.
41
+ * A `line-cut` counts the cut bytes and no line, because the line itself was delivered; it names
42
+ * the stream of that line. A `buffer-overflow` counts the dropped bytes and the whole lines among
43
+ * them, and names a stream only when every dropped byte came from it.
44
+ */
45
+ export interface IRuntimeAssignmentLogLoss {
46
+ kind: 'lost';
47
+ reason: TRuntimeAssignmentLogLossReason;
48
+ stream: TRuntimeAssignmentLogStream | null;
49
+ /** When the node detected the loss, in nanoseconds since the Unix epoch, as decimal digits. */
50
+ timestampNs: string;
51
+ bytes: number | null;
52
+ lines: number | null;
53
+ }
54
+ export type TRuntimeAssignmentLogEntry = IRuntimeAssignmentLogLine | IRuntimeAssignmentLogLoss;
55
+ /**
56
+ * One delivery of one attempt's captured output, in capture order.
57
+ *
58
+ * `captureId` names one capture of the attempt on its node: the node starts a new capture, with a
59
+ * new id and `sequence` 1, whenever it cannot continue the previous one, and opens it with a
60
+ * `capture-restart` loss. Within a capture `sequence` counts batches from 1 without gaps, and the
61
+ * node sends the next batch only after the controller acknowledged the previous one, so a batch is
62
+ * the one unit of retry. `final` states that no batch follows in this capture: the container is gone
63
+ * and its output is drained. Only a final batch may be empty.
64
+ */
65
+ export interface IRuntimeAssignmentLogBatch {
66
+ assignmentId: string;
67
+ attemptId: string;
68
+ captureId: string;
69
+ sequence: number;
70
+ entries: TRuntimeAssignmentLogEntry[];
71
+ final: boolean;
72
+ }
73
+ /** Pallet push over its current authenticated session. */
74
+ export interface IReportRuntimeAssignmentLogsRequest {
75
+ session: IRuntimeSessionBinding;
76
+ batch: IRuntimeAssignmentLogBatch;
77
+ }
78
+ /**
79
+ * The controller holds the batch durably. `replay` answers a batch it already holds, which it does
80
+ * not store again. It never refuses a batch for a gap in `sequence`: the node discards only what
81
+ * was acknowledged, so a missing batch can only be the controller's own loss, which it records.
82
+ */
83
+ export interface IReportRuntimeAssignmentLogsResponse {
84
+ status: 'accepted' | 'replay';
85
+ assignmentId: string;
86
+ captureId: string;
87
+ sequence: number;
88
+ }
89
+ export declare const runtimeAssignmentLogContract: Readonly<{
90
+ readonly error: "Runtime assignment log contract rejected.";
91
+ /** Pallet pushes; the controller persists metadata and payloads and acknowledges by sequence. */
92
+ readonly delivery: "node-pushes-controller-acknowledges-each-batch";
93
+ /** The most entries in one batch. */
94
+ readonly maximumEntriesPerBatch: 1024;
95
+ /** The most UTF-8 bytes of `text` in one entry; a longer line travels as `partial` pieces. */
96
+ readonly maximumEntryTextBytes: 65536;
97
+ /**
98
+ * The canonical JSON of a whole report is at most one mebibyte, the bound every runtime network
99
+ * contract captures with; the node closes a batch before the next entry would cross it.
100
+ */
101
+ readonly maximumReportCanonicalBytes: 1048576;
102
+ }>;
103
+ /** Detached exact-schema snapshot of one batch, bounded like a whole report. */
104
+ export declare const snapshotRuntimeAssignmentLogBatch: (valueArg: unknown) => IRuntimeAssignmentLogBatch;
105
+ export declare const snapshotReportRuntimeAssignmentLogsRequest: (valueArg: unknown) => IReportRuntimeAssignmentLogsRequest;
106
+ export declare const snapshotReportRuntimeAssignmentLogsResponse: (valueArg: unknown) => IReportRuntimeAssignmentLogsResponse;
107
+ /**
108
+ * Controller-side content binding, not authentication. `trustedSessionArg` is the controller's
109
+ * CURRENT session with the node the report arrived on, never read from the request. `assignmentArg`
110
+ * is the controller's own record of the batch's assignment, any generation of it, and
111
+ * `logPolicyArg` the `logs` policy of the config it runs with. The request's session must equal the
112
+ * trusted one, the assignment must be this node's and carry the batch's attempt, and every line
113
+ * the batch holds, its pieces joined, must fit the policy's `maximumLineBytes`. A line whose first
114
+ * pieces travelled in an earlier batch is judged by the pieces this batch holds.
115
+ */
116
+ export declare const bindReportRuntimeAssignmentLogsRequest: (valueArg: unknown, assignmentArg: unknown, logPolicyArg: IRuntimeConfigLogPolicy, trustedSessionArg: unknown) => Promise<{
117
+ request: IReportRuntimeAssignmentLogsRequest;
118
+ assignment: IRuntimeAssignment;
119
+ }>;
120
+ /** Matches an acknowledgement to the exact batch that was sent. */
121
+ export declare const bindReportRuntimeAssignmentLogsResponse: (valueArg: unknown, requestArg: unknown) => IReportRuntimeAssignmentLogsResponse;
@@ -0,0 +1,139 @@
1
+ import { snapshotRuntimeAssignment, validateRuntimeAssignment } from './runtimeassignment.js';
2
+ import { snapshotRuntimeSessionBinding } from './runtimesession.js';
3
+ import { captureNetwork, networkCounter, networkEqual, networkId, networkList, networkRecord, requireNetwork, } from '../private/networkcontract.js';
4
+ import { isRuntimeLogPolicy } from '../private/runtimepolicy.js';
5
+ export const runtimeAssignmentLogContract = Object.freeze({
6
+ error: 'Runtime assignment log contract rejected.',
7
+ /** Pallet pushes; the controller persists metadata and payloads and acknowledges by sequence. */
8
+ delivery: 'node-pushes-controller-acknowledges-each-batch',
9
+ /** The most entries in one batch. */
10
+ maximumEntriesPerBatch: 1024,
11
+ /** The most UTF-8 bytes of `text` in one entry; a longer line travels as `partial` pieces. */
12
+ maximumEntryTextBytes: 65_536,
13
+ /**
14
+ * The canonical JSON of a whole report is at most one mebibyte, the bound every runtime network
15
+ * contract captures with; the node closes a batch before the next entry would cross it.
16
+ */
17
+ maximumReportCanonicalBytes: 1_048_576,
18
+ });
19
+ const fail = () => { throw new Error(runtimeAssignmentLogContract.error); };
20
+ const safe = (operationArg) => { try {
21
+ return operationArg();
22
+ }
23
+ catch {
24
+ return fail();
25
+ } };
26
+ const encoder = new TextEncoder();
27
+ const streams = ['stdout', 'stderr'];
28
+ const lossReasons = ['buffer-overflow', 'line-cut', 'capture-restart', 'not-captured'];
29
+ const statuses = ['accepted', 'replay'];
30
+ const literalOf = (valueArg, allowedArg) => {
31
+ requireNetwork(allowedArg.includes(valueArg));
32
+ return valueArg;
33
+ };
34
+ /** Nanoseconds since the Unix epoch as canonical decimal digits: no sign, no leading zero. */
35
+ const timestampOf = (valueArg) => {
36
+ requireNetwork(typeof valueArg === 'string' && /^[1-9][0-9]{0,19}$/.test(valueArg)
37
+ && BigInt(valueArg) <= 18446744073709551615n);
38
+ return valueArg;
39
+ };
40
+ const countOf = (valueArg) => {
41
+ requireNetwork(typeof valueArg === 'number' && Number.isSafeInteger(valueArg) && valueArg >= 0
42
+ && !Object.is(valueArg, -0));
43
+ return valueArg;
44
+ };
45
+ const lineOf = (valueArg) => {
46
+ const value = networkRecord(valueArg, ['kind', 'stream', 'timestampNs', 'text', 'partial']);
47
+ requireNetwork(value.kind === 'line' && typeof value.text === 'string' && !value.text.includes('\n')
48
+ && encoder.encode(value.text).byteLength <= runtimeAssignmentLogContract.maximumEntryTextBytes
49
+ && typeof value.partial === 'boolean');
50
+ return {
51
+ kind: 'line', stream: literalOf(value.stream, streams), timestampNs: timestampOf(value.timestampNs),
52
+ text: value.text, partial: value.partial,
53
+ };
54
+ };
55
+ const lossOf = (valueArg) => {
56
+ const value = networkRecord(valueArg, ['kind', 'reason', 'stream', 'timestampNs', 'bytes', 'lines']);
57
+ requireNetwork(value.kind === 'lost');
58
+ const reason = literalOf(value.reason, lossReasons);
59
+ const stream = value.stream === null ? null : literalOf(value.stream, streams);
60
+ const unknownExtent = reason === 'capture-restart' || reason === 'not-captured';
61
+ if (unknownExtent) {
62
+ requireNetwork(value.bytes === null && value.lines === null && stream === null);
63
+ return { kind: 'lost', reason, stream, timestampNs: timestampOf(value.timestampNs), bytes: null, lines: null };
64
+ }
65
+ const bytes = networkCounter(value.bytes);
66
+ const lines = countOf(value.lines);
67
+ requireNetwork(reason !== 'line-cut' || (stream !== null && lines === 0));
68
+ return { kind: 'lost', reason, stream, timestampNs: timestampOf(value.timestampNs), bytes, lines };
69
+ };
70
+ const entryOf = (valueArg) => {
71
+ requireNetwork(valueArg !== null && typeof valueArg === 'object');
72
+ return valueArg.kind === 'lost' ? lossOf(valueArg) : lineOf(valueArg);
73
+ };
74
+ const batchOf = (valueArg) => {
75
+ const value = networkRecord(valueArg, ['assignmentId', 'attemptId', 'captureId', 'sequence', 'entries', 'final']);
76
+ const entries = networkList(value.entries, runtimeAssignmentLogContract.maximumEntriesPerBatch, entryOf);
77
+ requireNetwork(typeof value.final === 'boolean' && (entries.length > 0 || value.final));
78
+ return {
79
+ assignmentId: networkId(value.assignmentId), attemptId: networkId(value.attemptId),
80
+ captureId: networkId(value.captureId), sequence: networkCounter(value.sequence), entries, final: value.final,
81
+ };
82
+ };
83
+ /** Detached exact-schema snapshot of one batch, bounded like a whole report. */
84
+ export const snapshotRuntimeAssignmentLogBatch = (valueArg) => safe(() => batchOf(captureNetwork(valueArg)));
85
+ export const snapshotReportRuntimeAssignmentLogsRequest = (valueArg) => safe(() => {
86
+ const value = networkRecord(captureNetwork(valueArg), ['session', 'batch']);
87
+ return { session: snapshotRuntimeSessionBinding(value.session), batch: batchOf(value.batch) };
88
+ });
89
+ export const snapshotReportRuntimeAssignmentLogsResponse = (valueArg) => safe(() => {
90
+ const value = networkRecord(captureNetwork(valueArg), ['status', 'assignmentId', 'captureId', 'sequence']);
91
+ return {
92
+ status: literalOf(value.status, statuses), assignmentId: networkId(value.assignmentId),
93
+ captureId: networkId(value.captureId), sequence: networkCounter(value.sequence),
94
+ };
95
+ });
96
+ /**
97
+ * Controller-side content binding, not authentication. `trustedSessionArg` is the controller's
98
+ * CURRENT session with the node the report arrived on, never read from the request. `assignmentArg`
99
+ * is the controller's own record of the batch's assignment, any generation of it, and
100
+ * `logPolicyArg` the `logs` policy of the config it runs with. The request's session must equal the
101
+ * trusted one, the assignment must be this node's and carry the batch's attempt, and every line
102
+ * the batch holds, its pieces joined, must fit the policy's `maximumLineBytes`. A line whose first
103
+ * pieces travelled in an earlier batch is judged by the pieces this batch holds.
104
+ */
105
+ export const bindReportRuntimeAssignmentLogsRequest = async (valueArg, assignmentArg, logPolicyArg, trustedSessionArg) => {
106
+ const request = snapshotReportRuntimeAssignmentLogsRequest(valueArg);
107
+ const assignment = safe(() => snapshotRuntimeAssignment(assignmentArg));
108
+ const trustedSession = safe(() => snapshotRuntimeSessionBinding(trustedSessionArg));
109
+ if ((await validateRuntimeAssignment(assignment)).length)
110
+ fail();
111
+ safe(() => {
112
+ requireNetwork(isRuntimeLogPolicy(logPolicyArg));
113
+ requireNetwork(networkEqual(request.session, trustedSession)
114
+ && networkEqual(assignment.controller, trustedSession.controller)
115
+ && assignment.nodeId === trustedSession.nodeId
116
+ && assignment.runtimeNamespace === trustedSession.runtimeNamespace
117
+ && assignment.assignmentId === request.batch.assignmentId
118
+ && assignment.attemptId === request.batch.attemptId);
119
+ const joined = { stdout: 0, stderr: 0 };
120
+ for (const entry of request.batch.entries) {
121
+ if (entry.kind !== 'line')
122
+ continue;
123
+ joined[entry.stream] += encoder.encode(entry.text).byteLength;
124
+ requireNetwork(joined[entry.stream] <= logPolicyArg.maximumLineBytes);
125
+ if (!entry.partial)
126
+ joined[entry.stream] = 0;
127
+ }
128
+ });
129
+ return { request, assignment };
130
+ };
131
+ /** Matches an acknowledgement to the exact batch that was sent. */
132
+ export const bindReportRuntimeAssignmentLogsResponse = (valueArg, requestArg) => safe(() => {
133
+ const response = snapshotReportRuntimeAssignmentLogsResponse(valueArg);
134
+ const { batch } = snapshotReportRuntimeAssignmentLogsRequest(requestArg);
135
+ requireNetwork(response.assignmentId === batch.assignmentId && response.captureId === batch.captureId
136
+ && response.sequence === batch.sequence);
137
+ return response;
138
+ });
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZWFzc2lnbm1lbnRsb2dzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZGF0YS9ydW50aW1lYXNzaWdubWVudGxvZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHlCQUF5QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHOUYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUNMLGNBQWMsRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLGNBQWMsR0FDcEcsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQStGakUsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUN4RCxLQUFLLEVBQUUsMkNBQTJDO0lBQ2xELGlHQUFpRztJQUNqRyxRQUFRLEVBQUUsZ0RBQWdEO0lBQzFELHFDQUFxQztJQUNyQyxzQkFBc0IsRUFBRSxJQUFJO0lBQzVCLDhGQUE4RjtJQUM5RixxQkFBcUIsRUFBRSxNQUFNO0lBQzdCOzs7T0FHRztJQUNILDJCQUEyQixFQUFFLFNBQVM7Q0FDOUIsQ0FBQyxDQUFDO0FBRVosTUFBTSxJQUFJLEdBQUcsR0FBVSxFQUFFLEdBQUcsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuRixNQUFNLElBQUksR0FBRyxDQUFJLFlBQXFCLEVBQUssRUFBRSxHQUFHLElBQUksQ0FBQztJQUFDLE9BQU8sWUFBWSxFQUFFLENBQUM7QUFBQyxDQUFDO0FBQUMsTUFBTSxDQUFDO0lBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztBQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUcsTUFBTSxPQUFPLEdBQUcs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
@@ -0,0 +1,60 @@
1
+ import type { IRuntimeAssignment, IRuntimeAssignmentReference } from './runtimeassignment.js';
2
+ import type { IRuntimeSessionBinding } from './runtimesession.js';
3
+ /** Bytes the workload's network namespace received and sent since the sandbox started. */
4
+ export interface IRuntimeAssignmentNetworkStats {
5
+ receivedBytes: number;
6
+ transmittedBytes: number;
7
+ }
8
+ /**
9
+ * One resource sample of one running attempt, as the runtime reports it.
10
+ *
11
+ * `cpuUsageCoreNanoseconds` is cumulative CPU time across every core since the container started,
12
+ * as decimal digits because it outgrows a JSON number; a reader derives utilisation from two
13
+ * samples and their `timestampNs`. `memoryLimitBytes` is the limit the node enforces, the sealed
14
+ * config's `memoryBytes`. `network` is `null` when the runtime reports no interface of the
15
+ * sandbox, and `writableLayerBytes` is `null` when it reports no usage of the container's writable
16
+ * layer.
17
+ */
18
+ export interface IRuntimeAssignmentStatsSample {
19
+ /** When the runtime took the sample, in nanoseconds since the Unix epoch, as decimal digits. */
20
+ timestampNs: string;
21
+ cpuUsageCoreNanoseconds: string;
22
+ memoryWorkingSetBytes: number;
23
+ memoryLimitBytes: number;
24
+ network: IRuntimeAssignmentNetworkStats | null;
25
+ writableLayerBytes: number | null;
26
+ }
27
+ /** Controller read over the node's current authenticated session. */
28
+ export interface IReadRuntimeAssignmentStatsRequest {
29
+ session: IRuntimeSessionBinding;
30
+ /** The exact current revision of an assignment on this node. */
31
+ assignment: IRuntimeAssignmentReference;
32
+ }
33
+ /**
34
+ * `sampled` carries one sample; `not-running` states that the attempt has no running container to
35
+ * sample, and carries none.
36
+ */
37
+ export interface IReadRuntimeAssignmentStatsResponse {
38
+ status: 'sampled' | 'not-running';
39
+ assignment: IRuntimeAssignmentReference;
40
+ sample: IRuntimeAssignmentStatsSample | null;
41
+ }
42
+ export declare const runtimeAssignmentStatsContract: Readonly<{
43
+ readonly error: "Runtime assignment stats contract rejected.";
44
+ /** The node answers one read per assignment at a time and refuses a concurrent one. */
45
+ readonly concurrency: "one-read-per-assignment";
46
+ }>;
47
+ export declare const snapshotReadRuntimeAssignmentStatsRequest: (valueArg: unknown) => IReadRuntimeAssignmentStatsRequest;
48
+ export declare const snapshotReadRuntimeAssignmentStatsResponse: (valueArg: unknown) => IReadRuntimeAssignmentStatsResponse;
49
+ /**
50
+ * Node-side content binding, not authentication. `trustedSessionArg` is the node's CURRENT
51
+ * session, and the request must have arrived on that session's own connection. `assignmentArg` is
52
+ * the node's current admitted revision of the named assignment: the request must name exactly it,
53
+ * and it must belong to the session's controller, node and runtime namespace.
54
+ */
55
+ export declare const bindReadRuntimeAssignmentStatsRequest: (valueArg: unknown, assignmentArg: unknown, trustedSessionArg: unknown) => Promise<{
56
+ request: IReadRuntimeAssignmentStatsRequest;
57
+ assignment: IRuntimeAssignment;
58
+ }>;
59
+ /** Matches a sample to the exact assignment revision the read named. */
60
+ export declare const bindReadRuntimeAssignmentStatsResponse: (valueArg: unknown, requestArg: unknown) => IReadRuntimeAssignmentStatsResponse;