@serve.zone/pallet-bundle 35.3.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 (40) hide show
  1. package/dist_ts_bundle/classes.controlprocess.d.ts +71 -0
  2. package/dist_ts_bundle/classes.controlprocess.js +441 -0
  3. package/dist_ts_bundle/classes.controlstderr.d.ts +36 -0
  4. package/dist_ts_bundle/classes.controlstderr.js +95 -0
  5. package/dist_ts_bundle/classes.releaseclient.d.ts +38 -0
  6. package/dist_ts_bundle/classes.releaseclient.js +285 -0
  7. package/dist_ts_bundle/errors.d.ts +35 -0
  8. package/dist_ts_bundle/errors.js +20 -0
  9. package/dist_ts_bundle/index.d.ts +10 -0
  10. package/dist_ts_bundle/index.js +11 -0
  11. package/dist_ts_bundle/inventory.d.ts +90 -0
  12. package/dist_ts_bundle/inventory.js +78 -0
  13. package/dist_ts_bundle/paths.d.ts +12 -0
  14. package/dist_ts_bundle/paths.js +76 -0
  15. package/dist_ts_bundle/plugins.d.ts +14 -0
  16. package/dist_ts_bundle/plugins.js +19 -0
  17. package/dist_ts_bundle/protocol.d.ts +48 -0
  18. package/dist_ts_bundle/protocol.js +47 -0
  19. package/dist_ts_bundle/units.d.ts +67 -0
  20. package/dist_ts_bundle/units.js +128 -0
  21. package/dist_ts_bundle/verify.d.ts +75 -0
  22. package/dist_ts_bundle/verify.js +263 -0
  23. package/dist_ts_bundle/version.d.ts +7 -0
  24. package/dist_ts_bundle/version.js +17 -0
  25. package/license.md +21 -0
  26. package/package.json +35 -0
  27. package/readme.md +176 -0
  28. package/ts_bundle/classes.controlprocess.ts +453 -0
  29. package/ts_bundle/classes.controlstderr.ts +92 -0
  30. package/ts_bundle/classes.releaseclient.ts +288 -0
  31. package/ts_bundle/errors.ts +40 -0
  32. package/ts_bundle/index.ts +10 -0
  33. package/ts_bundle/inventory.ts +104 -0
  34. package/ts_bundle/paths.ts +74 -0
  35. package/ts_bundle/plugins.ts +25 -0
  36. package/ts_bundle/protocol.ts +56 -0
  37. package/ts_bundle/readme.md +176 -0
  38. package/ts_bundle/units.ts +165 -0
  39. package/ts_bundle/verify.ts +353 -0
  40. package/ts_bundle/version.ts +18 -0
@@ -0,0 +1,71 @@
1
+ import { type TPalletControlLifetimeMode, type TPalletControlOneshotMode } from './protocol.js';
2
+ /** Why a supervised `pallet-control` process did not complete. */
3
+ export type TPalletControlProcessFailure = 'invalid_input' | 'already_started'
4
+ /** The executable is not the trusted one: unsafe path, other digest, or it could not start. */
5
+ | 'artifact_rejected' | 'cancelled' | 'startup_timeout' | 'operation_timeout' | 'owner_failed'
6
+ /** Pallet refused the `DENO_TLS_CA_STORE` it was started with. */
7
+ | 'invalid_ca_store'
8
+ /** Pallet's packet engine refused the running kernel. */
9
+ | 'unsupported_kernel' | 'protocol_invalid' | 'shutdown_failed';
10
+ /** The operator's remedy for `unsupported_kernel`, from Pallet's host kernel requirements. */
11
+ export declare const palletUnsupportedKernelRemedy: string;
12
+ export declare class PalletControlProcessError extends Error {
13
+ readonly code: TPalletControlProcessFailure;
14
+ constructor(code: TPalletControlProcessFailure);
15
+ }
16
+ /**
17
+ * The failure a `failed` line's reason names, or `undefined` for a reason outside the protocol. A
18
+ * reason whose remedy lies on this host is named apart; every other reason is Pallet's own failure.
19
+ */
20
+ export declare const palletControlFailure: (reasonArg: unknown) => "unsupported_kernel" | "invalid_ca_store" | "owner_failed" | undefined;
21
+ export interface IPalletControlProcessOptions {
22
+ /** Trusted installed bundle identity (`IPalletControlBundle.executables.control`), never read from CLI or environment. */
23
+ binaryPath: string;
24
+ binarySha256: string;
25
+ /** Owning-code qualification only; production supervises as root. */
26
+ expectedUid?: number;
27
+ /** Where the child's standard-error lines go, bounded; defaults to this process's standard error. */
28
+ stderr?: (lineArg: string) => void;
29
+ }
30
+ export interface IPalletControlOneshotOptions extends IPalletControlProcessOptions {
31
+ operationTimeoutMs?: number;
32
+ shutdownTimeoutMs?: number;
33
+ terminationGraceMs?: number;
34
+ }
35
+ /**
36
+ * One null-stdin oneshot: `guard-recover`, `guard-commission`, `network-acquire`,
37
+ * `network-acquire-local` or `store-provision`. Success requires the complete protocol (`ready`,
38
+ * then `stopped`), drained pipes and a successful exit. Cancellation and the operation deadline
39
+ * signal the child and still wait for its actual exit.
40
+ */
41
+ export declare class PalletControlOneshot {
42
+ private readonly options;
43
+ private used;
44
+ constructor(optionsArg: IPalletControlOneshotOptions);
45
+ run(modeArg: TPalletControlOneshotMode, signalArg: AbortSignal): Promise<void>;
46
+ private runOnce;
47
+ }
48
+ export interface IPalletControlLifetimeOptions extends IPalletControlProcessOptions {
49
+ mode: TPalletControlLifetimeMode;
50
+ startupTimeoutMs?: number;
51
+ /** How long a stop may take after stdin closes before the child is signalled. */
52
+ shutdownTimeoutMs?: number;
53
+ terminationGraceMs?: number;
54
+ }
55
+ /**
56
+ * One supervised child lifetime: `enrollment-serve`, `enrollment-provision` or `runtime-serve`. The
57
+ * child holds its stdin pipe for the lifetime; closing it is the graceful stop, and only a missed
58
+ * shutdown deadline signals. The operation runs while the child reports `ready`, and the lifetime
59
+ * never restarts a child.
60
+ */
61
+ export declare class PalletControlLifetime {
62
+ private readonly options;
63
+ private readonly mode;
64
+ private used;
65
+ private available;
66
+ constructor(optionsArg: IPalletControlLifetimeOptions);
67
+ get running(): boolean;
68
+ /** The operation must drain its admitted work after cancellation; references must not escape. */
69
+ run<TResult>(signalArg: AbortSignal, operationArg: (signalArg: AbortSignal) => Promise<TResult>): Promise<TResult>;
70
+ private runOnce;
71
+ }
@@ -0,0 +1,441 @@
1
+ import * as plugins from './plugins.js';
2
+ import { canonicalPath, verifyExecutable } from './paths.js';
3
+ import { PalletControlStderr } from './classes.controlstderr.js';
4
+ import { palletControlLifetimeModes, palletControlLinePrefix, palletControlOneshotModes, } from './protocol.js';
5
+ /** The operator's remedy for `unsupported_kernel`, from Pallet's host kernel requirements. */
6
+ export const palletUnsupportedKernelRemedy = "Pallet's packet engine refused this host's kernel: boot Linux 6.9 or newer with the nftables filter and NAT " +
7
+ 'modules (nf_tables, nft_nat, nft_chain_nat, nf_nat and the reject modules) available; see Pallet\'s readme, ' +
8
+ '"Host kernel requirements".';
9
+ export class PalletControlProcessError extends Error {
10
+ code;
11
+ constructor(code) {
12
+ super(`Pallet control process failed: ${code}.${code === 'unsupported_kernel' ? ` ${palletUnsupportedKernelRemedy}` : ''}`);
13
+ this.code = code;
14
+ this.name = 'PalletControlProcessError';
15
+ }
16
+ }
17
+ const failures = new Map([
18
+ ['invalid_arguments', 'owner_failed'],
19
+ ['invalid_ca_store', 'invalid_ca_store'],
20
+ ['invalid_stdin', 'owner_failed'],
21
+ ['owner_failed', 'owner_failed'],
22
+ ['unsupported_kernel', 'unsupported_kernel'],
23
+ ]);
24
+ /**
25
+ * The failure a `failed` line's reason names, or `undefined` for a reason outside the protocol. A
26
+ * reason whose remedy lies on this host is named apart; every other reason is Pallet's own failure.
27
+ */
28
+ export const palletControlFailure = (reasonArg) => typeof reasonArg === 'string' ? failures.get(reasonArg) : undefined;
29
+ /**
30
+ * Starts the verified executable in one mode with a clean environment and reads its protocol.
31
+ * `onLine` receives each complete stdout line and throws on a protocol violation; `onInvalid` is
32
+ * told once when either pipe violates the protocol or its bounds.
33
+ */
34
+ function spawnControl(optionsArg) {
35
+ const child = plugins.childProcess.spawn(optionsArg.binaryPath, [optionsArg.mode], {
36
+ cwd: '/', env: { PATH: '/usr/bin:/bin' }, stdio: [optionsArg.stdin, 'pipe', 'pipe'],
37
+ });
38
+ let exited = false;
39
+ let outputDone = false;
40
+ let outputBytes = 0;
41
+ child.stdin?.on('error', () => undefined);
42
+ const exit = new Promise((resolve) => {
43
+ child.once('exit', (code, signal) => { exited = true; resolve({ code, signal, spawned: true }); });
44
+ child.on('error', () => {
45
+ if (child.pid === undefined) {
46
+ exited = true;
47
+ resolve({ code: null, signal: null, spawned: false });
48
+ }
49
+ });
50
+ });
51
+ const read = async (streamArg, stdoutArg) => {
52
+ const decoder = new TextDecoder('utf-8', { fatal: true });
53
+ const diagnostics = stdoutArg ? undefined : new PalletControlStderr(optionsArg.mode, optionsArg.stderr);
54
+ let pending = '';
55
+ try {
56
+ for await (const chunk of streamArg) {
57
+ // No encoding is set on the pipes, so every chunk is bytes.
58
+ if (typeof chunk === 'string')
59
+ throw new Error('Unexpected text chunk.');
60
+ if (chunk.length > 1024 * 1024)
61
+ throw new Error('Oversized chunk.');
62
+ outputBytes += chunk.length;
63
+ if (optionsArg.maximumOutputBytes !== null && outputBytes > optionsArg.maximumOutputBytes) {
64
+ throw new Error('Output exceeds its bound.');
65
+ }
66
+ if (diagnostics) {
67
+ diagnostics.accept(chunk);
68
+ continue;
69
+ }
70
+ pending += decoder.decode(chunk, { stream: true });
71
+ for (let index; (index = pending.indexOf('\n')) !== -1;) {
72
+ const line = pending.slice(0, index);
73
+ pending = pending.slice(index + 1);
74
+ if (line.length > 4096)
75
+ throw new Error('Oversized line.');
76
+ optionsArg.onLine(line);
77
+ }
78
+ if (pending.length > 4096)
79
+ throw new Error('Oversized line.');
80
+ }
81
+ if (stdoutArg && (decoder.decode().length !== 0 || pending.length !== 0))
82
+ throw new Error('Unterminated line.');
83
+ }
84
+ catch {
85
+ optionsArg.onInvalid();
86
+ streamArg.destroy();
87
+ }
88
+ finally {
89
+ diagnostics?.close();
90
+ }
91
+ };
92
+ const output = Promise.all([read(child.stdout, true), read(child.stderr, false)]).then(() => { outputDone = true; });
93
+ // Safety net only: a descendant holding the pipes must not keep this lifetime open.
94
+ void exit.then(() => {
95
+ const timer = setTimeout(() => {
96
+ if (outputDone)
97
+ return;
98
+ optionsArg.onDrainExpired();
99
+ child.stdout?.destroy();
100
+ child.stderr?.destroy();
101
+ }, optionsArg.terminationGraceMs);
102
+ void output.then(() => clearTimeout(timer));
103
+ });
104
+ return {
105
+ process: child, exit, output, exited: () => exited,
106
+ send: (signalArg) => !exited && child.kill(signalArg),
107
+ };
108
+ }
109
+ const validated = (optionsArg, allowedArg, timeoutsArg) => {
110
+ try {
111
+ const allowed = ['binaryPath', 'binarySha256', 'expectedUid', 'stderr', ...allowedArg, ...timeoutsArg.map(([key]) => key)];
112
+ if (!optionsArg || typeof optionsArg !== 'object' || plugins.nodeUtil.types.isProxy(optionsArg) ||
113
+ Object.getPrototypeOf(optionsArg) !== Object.prototype || Object.keys(optionsArg).some((key) => !allowed.includes(key))) {
114
+ throw new Error();
115
+ }
116
+ const options = optionsArg;
117
+ const expectedUid = options.expectedUid ?? 0;
118
+ if (typeof options.binarySha256 !== 'string' || !/^[0-9a-f]{64}$/.test(options.binarySha256) ||
119
+ !Number.isSafeInteger(expectedUid) || expectedUid < 0 || process.platform !== 'linux' || process.getuid?.() !== expectedUid ||
120
+ (options.stderr !== undefined && typeof options.stderr !== 'function'))
121
+ throw new Error();
122
+ const timeouts = {};
123
+ for (const [key, fallback, maximum] of timeoutsArg) {
124
+ const value = options[key] ?? fallback;
125
+ if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 1 || value > maximum)
126
+ throw new Error();
127
+ timeouts[key] = value;
128
+ }
129
+ return {
130
+ binaryPath: canonicalPath(options.binaryPath), binarySha256: options.binarySha256, expectedUid,
131
+ stderr: options.stderr ?? ((lineArg) => console.error(lineArg)), timeouts,
132
+ };
133
+ }
134
+ catch {
135
+ throw new PalletControlProcessError('invalid_input');
136
+ }
137
+ };
138
+ /**
139
+ * One null-stdin oneshot: `guard-recover`, `guard-commission`, `network-acquire`,
140
+ * `network-acquire-local` or `store-provision`. Success requires the complete protocol (`ready`,
141
+ * then `stopped`), drained pipes and a successful exit. Cancellation and the operation deadline
142
+ * signal the child and still wait for its actual exit.
143
+ */
144
+ export class PalletControlOneshot {
145
+ options;
146
+ used = false;
147
+ constructor(optionsArg) {
148
+ this.options = validated(optionsArg, [], [
149
+ ['operationTimeoutMs', 360_000, 600_000], ['shutdownTimeoutMs', 330_000, 600_000], ['terminationGraceMs', 1_000, 60_000],
150
+ ]);
151
+ }
152
+ run(modeArg, signalArg) {
153
+ if (!(signalArg instanceof AbortSignal) || !Object.hasOwn(palletControlOneshotModes, modeArg)) {
154
+ return Promise.reject(new PalletControlProcessError('invalid_input'));
155
+ }
156
+ if (this.used)
157
+ return Promise.reject(new PalletControlProcessError('already_started'));
158
+ this.used = true;
159
+ return this.runOnce(modeArg, signalArg);
160
+ }
161
+ async runOnce(modeArg, signalArg) {
162
+ const protocol = palletControlOneshotModes[modeArg];
163
+ const { timeouts } = this.options;
164
+ const abort = new AbortController();
165
+ let child;
166
+ // Classification is decided only once the exit and both drained pipes are joined: the child's
167
+ // own protocol evidence is read after its exit whenever the scheduler says so.
168
+ let evidence;
169
+ let failure;
170
+ let shutdownFailed = false;
171
+ let drainExpired = false;
172
+ let stopping = false;
173
+ // Written by the protocol reader, read after the child and its pipes are joined.
174
+ const progress = { phase: 'initial' };
175
+ let killTimer;
176
+ let status;
177
+ const stop = (reasonArg) => {
178
+ if (reasonArg && (!failure || failure === 'cancelled'))
179
+ failure = reasonArg;
180
+ abort.abort();
181
+ if (stopping)
182
+ return;
183
+ stopping = true;
184
+ if (child && !child.exited()) {
185
+ // Null stdin is normal for this protocol. Signals request joined Pallet cleanup.
186
+ child.send('SIGTERM');
187
+ killTimer = setTimeout(() => { if (child.send('SIGKILL'))
188
+ shutdownFailed = true; }, timeouts.shutdownTimeoutMs);
189
+ }
190
+ };
191
+ const reject = (reasonArg) => {
192
+ // Reads cut short by the drain deadline carry no evidence about the child.
193
+ if (!drainExpired)
194
+ evidence ??= reasonArg;
195
+ stop();
196
+ };
197
+ const onAbort = () => stop('cancelled');
198
+ signalArg.addEventListener('abort', onAbort, { once: true });
199
+ const timer = setTimeout(() => stop('operation_timeout'), timeouts.operationTimeoutMs);
200
+ const line = (lineArg) => {
201
+ if (!lineArg.startsWith(palletControlLinePrefix))
202
+ return;
203
+ const value = JSON.parse(lineArg.slice(palletControlLinePrefix.length));
204
+ if (!value || typeof value !== 'object' || Array.isArray(value) || value.protocol !== protocol ||
205
+ progress.phase === 'stopped' || progress.phase === 'failed')
206
+ throw new Error('Unexpected protocol line.');
207
+ const keys = Object.keys(value).sort().join(',');
208
+ const named = palletControlFailure(value.reason);
209
+ if (value.event === 'ready' && keys === 'event,protocol' && progress.phase === 'initial')
210
+ progress.phase = 'ready';
211
+ else if (value.event === 'stopped' && keys === 'event,protocol' && progress.phase === 'ready')
212
+ progress.phase = 'stopped';
213
+ else if (value.event === 'failed' && keys === 'event,protocol,reason' && named !== undefined) {
214
+ progress.phase = 'failed';
215
+ reject(named);
216
+ }
217
+ else
218
+ throw new Error('Unexpected protocol event.');
219
+ };
220
+ try {
221
+ if (signalArg.aborted)
222
+ onAbort();
223
+ await verifyExecutable(this.options.binaryPath, this.options.binarySha256, this.options.expectedUid, abort.signal);
224
+ abort.signal.throwIfAborted();
225
+ child = spawnControl({
226
+ binaryPath: this.options.binaryPath, mode: modeArg, stdin: 'ignore', stderr: this.options.stderr,
227
+ maximumOutputBytes: 1024 * 1024, terminationGraceMs: timeouts.terminationGraceMs, onLine: line,
228
+ onInvalid: () => reject('protocol_invalid'),
229
+ onDrainExpired: () => { drainExpired = true; shutdownFailed = true; },
230
+ });
231
+ status = await child.exit;
232
+ await child.output;
233
+ }
234
+ catch {
235
+ stop(failure ?? (child ? 'owner_failed' : 'artifact_rejected'));
236
+ }
237
+ finally {
238
+ // Never release this lifetime on a timeout alone: wait for the actual child and pipes.
239
+ if (child) {
240
+ status = await child.exit;
241
+ await child.output;
242
+ }
243
+ signalArg.removeEventListener('abort', onAbort);
244
+ clearTimeout(timer);
245
+ clearTimeout(killTimer);
246
+ }
247
+ const code = evidence ?? (shutdownFailed ? 'shutdown_failed' : failure) ??
248
+ (status && !status.spawned ? 'artifact_rejected' : undefined) ??
249
+ (status && status.code !== 0 ? 'owner_failed' : undefined) ??
250
+ (progress.phase !== 'stopped' ? 'protocol_invalid' : undefined);
251
+ if (code)
252
+ throw new PalletControlProcessError(code);
253
+ }
254
+ }
255
+ /**
256
+ * One supervised child lifetime: `enrollment-serve`, `enrollment-provision` or `runtime-serve`. The
257
+ * child holds its stdin pipe for the lifetime; closing it is the graceful stop, and only a missed
258
+ * shutdown deadline signals. The operation runs while the child reports `ready`, and the lifetime
259
+ * never restarts a child.
260
+ */
261
+ export class PalletControlLifetime {
262
+ options;
263
+ mode;
264
+ used = false;
265
+ available = false;
266
+ constructor(optionsArg) {
267
+ const mode = optionsArg?.mode;
268
+ if (typeof mode !== 'string' || !Object.hasOwn(palletControlLifetimeModes, mode)) {
269
+ throw new PalletControlProcessError('invalid_input');
270
+ }
271
+ const runtime = mode === 'runtime-serve';
272
+ this.mode = mode;
273
+ // The runtime may join a five-minute native operation, then database cleanup.
274
+ this.options = validated(optionsArg, ['mode'], [
275
+ ['startupTimeoutMs', 15_000, 60_000], ['shutdownTimeoutMs', runtime ? 330_000 : 15_000, runtime ? 600_000 : 60_000],
276
+ ['terminationGraceMs', 1_000, 60_000],
277
+ ]);
278
+ }
279
+ get running() {
280
+ return this.available;
281
+ }
282
+ /** The operation must drain its admitted work after cancellation; references must not escape. */
283
+ run(signalArg, operationArg) {
284
+ if (!(signalArg instanceof AbortSignal) || typeof operationArg !== 'function') {
285
+ return Promise.reject(new PalletControlProcessError('invalid_input'));
286
+ }
287
+ if (this.used)
288
+ return Promise.reject(new PalletControlProcessError('already_started'));
289
+ this.used = true;
290
+ return this.runOnce(signalArg, operationArg);
291
+ }
292
+ async runOnce(signalArg, operationArg) {
293
+ const protocol = palletControlLifetimeModes[this.mode];
294
+ const { timeouts } = this.options;
295
+ const abort = new AbortController();
296
+ let child;
297
+ let evidence;
298
+ let failure;
299
+ let shutdownFailed = false;
300
+ let drainExpired = false;
301
+ let exitFailed = false;
302
+ let stopping = false;
303
+ let readySeen = false;
304
+ let stoppedSeen = false;
305
+ let terminalSeen = false;
306
+ let termTimer;
307
+ let killTimer;
308
+ let resolveReady;
309
+ let rejectReady;
310
+ const ready = new Promise((resolve, reject) => { resolveReady = resolve; rejectReady = reject; });
311
+ void ready.catch(() => undefined);
312
+ const send = (signalArg) => {
313
+ // Only a missed shutdown deadline signals: a delivered signal proves forced cleanup.
314
+ if (child?.send(signalArg))
315
+ shutdownFailed = true;
316
+ };
317
+ const stop = (reasonArg) => {
318
+ // Cancellation is only graceful if the child subsequently proves clean shutdown.
319
+ if (reasonArg && (!failure || failure === 'cancelled'))
320
+ failure = reasonArg;
321
+ this.available = false;
322
+ abort.abort();
323
+ rejectReady(new PalletControlProcessError(failure ?? 'cancelled'));
324
+ if (stopping)
325
+ return;
326
+ stopping = true;
327
+ if (child && !child.exited()) {
328
+ // EOF is the graceful parent-lifetime signal. No configuration or bearer is written.
329
+ child.process.stdin?.end();
330
+ termTimer = setTimeout(() => {
331
+ send('SIGTERM');
332
+ killTimer = setTimeout(() => send('SIGKILL'), timeouts.terminationGraceMs);
333
+ }, timeouts.shutdownTimeoutMs);
334
+ }
335
+ };
336
+ const reject = (reasonArg) => {
337
+ if (!drainExpired)
338
+ evidence ??= reasonArg;
339
+ stop();
340
+ };
341
+ const onAbort = () => stop('cancelled');
342
+ signalArg.addEventListener('abort', onAbort, { once: true });
343
+ const startupTimer = setTimeout(() => stop('startup_timeout'), timeouts.startupTimeoutMs);
344
+ const line = (lineArg) => {
345
+ if (!lineArg.startsWith(palletControlLinePrefix))
346
+ return;
347
+ const value = JSON.parse(lineArg.slice(palletControlLinePrefix.length));
348
+ if (!value || typeof value !== 'object' || Array.isArray(value) || terminalSeen || value.protocol !== protocol) {
349
+ throw new Error('Unexpected protocol line.');
350
+ }
351
+ const keys = Object.keys(value).sort().join(',');
352
+ const named = palletControlFailure(value.reason);
353
+ if (value.event === 'ready' && keys === 'event,protocol' && !readySeen) {
354
+ readySeen = true;
355
+ if (!stopping && !child?.exited()) {
356
+ this.available = true;
357
+ resolveReady();
358
+ }
359
+ }
360
+ else if (value.event === 'stopped' && keys === 'event,protocol') {
361
+ stoppedSeen = true;
362
+ terminalSeen = true;
363
+ if (!stopping)
364
+ reject('owner_failed');
365
+ }
366
+ else if (value.event === 'failed' && keys === 'event,protocol,reason' && named !== undefined) {
367
+ terminalSeen = true;
368
+ reject(named);
369
+ }
370
+ else
371
+ throw new Error('Unexpected protocol event.');
372
+ };
373
+ let outcome;
374
+ let operationFailed = false;
375
+ let operationError;
376
+ try {
377
+ if (signalArg.aborted)
378
+ onAbort();
379
+ await verifyExecutable(this.options.binaryPath, this.options.binarySha256, this.options.expectedUid, abort.signal);
380
+ abort.signal.throwIfAborted();
381
+ child = spawnControl({
382
+ binaryPath: this.options.binaryPath, mode: this.mode, stdin: 'pipe', stderr: this.options.stderr,
383
+ // The runtime reports for its whole lifetime; only the enrollment owner's output is bounded in total.
384
+ maximumOutputBytes: this.mode === 'runtime-serve' ? null : 1024 * 1024,
385
+ terminationGraceMs: timeouts.terminationGraceMs, onLine: line, onInvalid: () => reject('protocol_invalid'),
386
+ onDrainExpired: () => { drainExpired = true; shutdownFailed = true; },
387
+ });
388
+ void child.exit.then((status) => {
389
+ this.available = false;
390
+ // An exit nobody requested, or an unsuccessful one, is a Pallet failure.
391
+ if (!status.spawned)
392
+ failure ??= 'artifact_rejected';
393
+ else if (!stopping || status.code !== 0)
394
+ exitFailed = true;
395
+ stop();
396
+ });
397
+ await ready;
398
+ clearTimeout(startupTimer);
399
+ if (abort.signal.aborted || !this.available)
400
+ throw new PalletControlProcessError(failure ?? 'owner_failed');
401
+ try {
402
+ outcome = { value: await operationArg(abort.signal) };
403
+ }
404
+ catch (error) {
405
+ operationFailed = true;
406
+ operationError = error;
407
+ }
408
+ }
409
+ catch (error) {
410
+ // Own rejections only report that the lifetime ended; the joined facts below classify it.
411
+ if (!(error instanceof PalletControlProcessError))
412
+ failure ??= 'artifact_rejected';
413
+ }
414
+ finally {
415
+ clearTimeout(startupTimer);
416
+ stop();
417
+ // Escalation is bounded; an unconfirmed OS exit keeps this owner and its promise alive.
418
+ if (child) {
419
+ await child.exit;
420
+ await child.output;
421
+ }
422
+ signalArg.removeEventListener('abort', onAbort);
423
+ clearTimeout(termTimer);
424
+ clearTimeout(killTimer);
425
+ }
426
+ const spawned = child !== undefined && (await child.exit).spawned;
427
+ const code = evidence ?? (shutdownFailed ? 'shutdown_failed' : undefined) ??
428
+ (failure !== 'cancelled' ? failure : undefined) ?? (exitFailed ? 'owner_failed' : undefined) ??
429
+ // Cancellation is only graceful if the child confirmed its stop.
430
+ (spawned && !stoppedSeen ? 'shutdown_failed' : failure);
431
+ if (code)
432
+ throw new PalletControlProcessError(code);
433
+ if (operationFailed)
434
+ throw operationError;
435
+ // Unreachable: a lifetime that never ran its operation always names a failure above.
436
+ if (!outcome)
437
+ throw new PalletControlProcessError('owner_failed');
438
+ return outcome.value;
439
+ }
440
+ }
441
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jb250cm9scHJvY2Vzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2J1bmRsZS9jbGFzc2VzLmNvbnRyb2xwcm9jZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDN0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakUsT0FBTyxFQUNMLDBCQUEwQixFQUFFLHVCQUF1QixFQUFFLHlCQUF5QixHQUUvRSxNQUFNLGVBQWUsQ0FBQztBQW1CdkIsOEZBQThGO0FBQzlGLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUN4Qyw4R0FBOEc7SUFDOUcsOEdBQThHO0lBQzlHLDZCQUE2QixDQUFDO0FBRWhDLE1BQU0sT0FBTyx5QkFBMEIsU0FBUSxLQUFLO0lBQ3RCO0lBQTVCLFlBQTRCLElBQWtDO1FBQzVELEtBQUssQ0FBQyxrQ0FBa0MsSUFBSSxJQUFJLElBQUksS0FBSyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsSUFBSSw2QkFBNkIsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRGxHLFNBQUksR0FBSixJQUFJLENBQThCO1FBRTVELElBQUksQ0FBQyxJQUFJLEdBQUcsMkJBQTJCLENBQUM7SUFDMUMsQ0FBQztDQUNGO0FBRUQsTUFBTSxRQUFRLEdBQW9GLElBQUksR0FBRyxDQUFDO0lBQ3hHLENBQUMsbUJBQW1CLEVBQUUsY0FBYyxDQUFDO0lBQ3JDLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7SUFDeEMsQ0FBQyxlQUFlLEVBQUUsY0FBYyxDQUFDO0lBQ2pDLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQztJQUNoQyxDQUFDLG9CQUFvQixFQUFFLG9CQUFvQixDQUFDO0NBQzdDLENBQUMsQ0FBQztB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
@@ -0,0 +1,36 @@
1
+ /** The longest forwarded line, in characters after escaping; the rest of the line is cut. */
2
+ export declare const palletControlStderrLineLength = 512;
3
+ /** The most lines forwarded per window; the lines beyond it are counted, not written. */
4
+ export declare const palletControlStderrWindowLines = 64;
5
+ /** The length of one forwarding window. */
6
+ export declare const palletControlStderrWindowMs = 60000;
7
+ /**
8
+ * Forwards a `pallet-control` child's standard error, one line per line as
9
+ * `Pallet <mode> stderr: <line>`.
10
+ *
11
+ * Pallet writes no diagnostics of its own there except the one line naming the owner behind an
12
+ * `owner_failed` failure; its native owners' output stays inside Pallet and its errors are
13
+ * value-free codes. What else reaches this stream is the Deno runtime's report of an error Pallet
14
+ * did not handle. Every line is bounded: control characters are escaped, a line is cut at
15
+ * {@link palletControlStderrLineLength} characters, and at most {@link palletControlStderrWindowLines}
16
+ * lines are written per window; a later line or the end of the stream states how many were not.
17
+ */
18
+ export declare class PalletControlStderr {
19
+ private readonly mode;
20
+ private readonly write;
21
+ private readonly now;
22
+ private readonly decoder;
23
+ private pending;
24
+ private cut;
25
+ private windowStart;
26
+ private windowLines;
27
+ private suppressed;
28
+ private closed;
29
+ constructor(mode: string, write?: (lineArg: string) => void, now?: () => number);
30
+ /** Accepts one chunk as read from the pipe. */
31
+ accept(chunkArg: Uint8Array): void;
32
+ /** Ends the stream: writes an unterminated last line and the count of lines not written. */
33
+ close(): void;
34
+ private line;
35
+ private flushSuppressed;
36
+ }