@almyty/runner 1.5.2 → 1.5.4
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/README.md +28 -14
- package/dist/binaries.js +8 -1
- package/dist/binaries.js.map +1 -1
- package/dist/cli-args.d.ts +6 -0
- package/dist/cli-args.js +19 -0
- package/dist/cli-args.js.map +1 -1
- package/dist/cli.d.ts +8 -5
- package/dist/cli.js +34 -19
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +11 -0
- package/dist/config.js +21 -8
- package/dist/config.js.map +1 -1
- package/dist/daemon.d.ts +34 -0
- package/dist/daemon.js +117 -18
- package/dist/daemon.js.map +1 -1
- package/dist/enroll.d.ts +91 -0
- package/dist/enroll.js +261 -0
- package/dist/enroll.js.map +1 -0
- package/dist/hosted-setup.d.ts +43 -0
- package/dist/hosted-setup.js +196 -0
- package/dist/hosted-setup.js.map +1 -0
- package/dist/policy.d.ts +26 -0
- package/dist/policy.js +143 -0
- package/dist/policy.js.map +1 -1
- package/dist/streamable-client.d.ts +23 -5
- package/dist/streamable-client.js +32 -5
- package/dist/streamable-client.js.map +1 -1
- package/dist/types.d.ts +9 -0
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
package/dist/daemon.js
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync, chmodSync } from 'fs';
|
|
2
|
-
import { homedir } from 'os';
|
|
2
|
+
import { homedir, hostname } from 'os';
|
|
3
3
|
import { join } from 'path';
|
|
4
4
|
import { resolveCredentialsOrExit } from '@almyty/client';
|
|
5
|
-
import { describeIsolationPosture, loadConfig } from './config.js';
|
|
5
|
+
import { DEFAULT_BINARY_PROBE_LIST, describeIsolationPosture, loadConfig, runnerNameFromHostname } from './config.js';
|
|
6
6
|
import { detectRuntimeInfo, RUNNER_VERSION } from './runtime-info.js';
|
|
7
7
|
import { createDefaultAdapterFactory, ProcessManager } from './process-manager.js';
|
|
8
8
|
import { StreamableClient, envelope } from './streamable-client.js';
|
|
9
9
|
import { dispatchHandler } from './handlers.js';
|
|
10
10
|
import { CodingSessionManager } from './coding-sessions.js';
|
|
11
11
|
import { WorkspaceReclaimer } from './workspace-reclaimer.js';
|
|
12
|
-
|
|
12
|
+
import { enroll, EnrollmentError, readEnrollSettings, RunnerCredential } from './enroll.js';
|
|
13
|
+
import { parseAllowBinaries, withAllowBinaries } from './policy.js';
|
|
14
|
+
import { prepareHostedWorkspace } from './hosted-setup.js';
|
|
15
|
+
// An override keeps independent local test/demo daemons away from the user's runner.
|
|
16
|
+
const STATE_DIR = process.env.ALMYTY_RUNNER_STATE_DIR || join(homedir(), '.almyty', 'runner');
|
|
13
17
|
const PID_FILE = join(STATE_DIR, 'daemon.pid');
|
|
14
18
|
const STATUS_FILE = join(STATE_DIR, 'status.json');
|
|
15
19
|
const HEARTBEAT_INTERVAL_MS = 30_000;
|
|
@@ -44,6 +48,8 @@ export class RunnerDaemon {
|
|
|
44
48
|
runnerId = null;
|
|
45
49
|
heartbeatTimer = null;
|
|
46
50
|
status = null;
|
|
51
|
+
/** A hosted runner's renewable credential (enroll mode only). */
|
|
52
|
+
credential = null;
|
|
47
53
|
/** Guards against overlapping re-establish attempts. */
|
|
48
54
|
reestablishing = false;
|
|
49
55
|
/** Consecutive failed re-establish attempts; bounds the retry loop. */
|
|
@@ -55,9 +61,9 @@ export class RunnerDaemon {
|
|
|
55
61
|
* register/connect — just prints and dies.
|
|
56
62
|
*/
|
|
57
63
|
async start(flags) {
|
|
58
|
-
const resolved = loadConfig({ flags });
|
|
59
|
-
this.resolved = resolved;
|
|
60
64
|
const credentials = resolveCredentialsOrExit();
|
|
65
|
+
const resolved = loadConfig({ flags, credentials });
|
|
66
|
+
this.resolved = resolved;
|
|
61
67
|
const backendUrl = resolved.backendUrl || credentials.url;
|
|
62
68
|
process.stdout.write(`almyty-runner v${RUNNER_VERSION} starting\n`);
|
|
63
69
|
process.stdout.write(`name=${resolved.name} url=${backendUrl}\n`);
|
|
@@ -89,7 +95,7 @@ export class RunnerDaemon {
|
|
|
89
95
|
...(resolved.organizationId ? { 'X-Organization-Id': resolved.organizationId } : {}),
|
|
90
96
|
},
|
|
91
97
|
body: JSON.stringify({
|
|
92
|
-
name: resolved.name,
|
|
98
|
+
...(resolved.explicitName ? { name: resolved.name } : {}),
|
|
93
99
|
labels: resolved.labels,
|
|
94
100
|
runtimeInfo: runtime,
|
|
95
101
|
config: resolved.config,
|
|
@@ -101,11 +107,99 @@ export class RunnerDaemon {
|
|
|
101
107
|
}
|
|
102
108
|
const regBody = await regResp.json();
|
|
103
109
|
this.runnerId = regBody.data.runner.id;
|
|
110
|
+
resolved.name = regBody.data.runner.name;
|
|
104
111
|
process.stdout.write(`registered as ${this.runnerId}\n`);
|
|
105
|
-
//
|
|
106
|
-
//
|
|
107
|
-
|
|
108
|
-
|
|
112
|
+
// The process manager takes the effective config (backend may have
|
|
113
|
+
// constrained max_concurrent below what we requested).
|
|
114
|
+
await this.connect({
|
|
115
|
+
backendUrl,
|
|
116
|
+
token: credentials.token,
|
|
117
|
+
organizationId: resolved.organizationId,
|
|
118
|
+
effective: regBody.data.effectiveConfig,
|
|
119
|
+
installSignals: true,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Enroll mode, for a runner inside a hosted pod (enroll.ts). Trades the
|
|
124
|
+
* pod's single-use enrollment token for a runner credential, sets the
|
|
125
|
+
* workspace up on its first start (hosted-setup.ts), and then holds the
|
|
126
|
+
* hosted stream like any runner holds its own. Throws EnrollmentError
|
|
127
|
+
* when enrollment fails; the CLI exits non-zero and Kubernetes restarts
|
|
128
|
+
* the container.
|
|
129
|
+
*/
|
|
130
|
+
async startEnrolled(opts = {}) {
|
|
131
|
+
const env = opts.env ?? process.env;
|
|
132
|
+
const fetchImpl = opts.fetch ?? globalThis.fetch;
|
|
133
|
+
const exit = opts.exit ?? ((code) => process.exit(code));
|
|
134
|
+
const settings = readEnrollSettings(env, { url: opts.url });
|
|
135
|
+
// Read before the token is spent: a list the runner cannot read stops
|
|
136
|
+
// it here (exit 1, the pod restarts) rather than running unrestricted.
|
|
137
|
+
let allowBinaries;
|
|
138
|
+
try {
|
|
139
|
+
allowBinaries = parseAllowBinaries(env.ALMYTY_ALLOW_BINARIES);
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
throw new EnrollmentError(err.message);
|
|
143
|
+
}
|
|
144
|
+
process.stdout.write(`almyty-runner v${RUNNER_VERSION} starting in enroll mode\n`);
|
|
145
|
+
process.stdout.write(`url=${settings.backendUrl}\n`);
|
|
146
|
+
const runtime = await detectRuntimeInfo({ binaries: DEFAULT_BINARY_PROBE_LIST });
|
|
147
|
+
process.stdout.write(`detected ${Object.values(runtime.binaries).filter(v => v).length}/${DEFAULT_BINARY_PROBE_LIST.length} binaries on PATH\n`);
|
|
148
|
+
const enrolled = await enroll(settings, { runtimeInfo: runtime }, fetchImpl);
|
|
149
|
+
// Spent either way; nothing else needs it.
|
|
150
|
+
settings.token = '';
|
|
151
|
+
this.runnerId = enrolled.runnerId;
|
|
152
|
+
process.stdout.write(`enrolled as ${enrolled.runnerId}; credential valid until ${enrolled.expiresAt.toISOString()}\n`);
|
|
153
|
+
this.credential = new RunnerCredential({
|
|
154
|
+
backendUrl: settings.backendUrl,
|
|
155
|
+
renewPath: enrolled.renewPath,
|
|
156
|
+
credential: enrolled.credential,
|
|
157
|
+
expiresAt: enrolled.expiresAt,
|
|
158
|
+
fetch: fetchImpl,
|
|
159
|
+
log: (line) => process.stdout.write(`${line}\n`),
|
|
160
|
+
onFatal: (reason) => {
|
|
161
|
+
process.stderr.write(`${reason}; exiting\n`);
|
|
162
|
+
this.updateState({ connectionState: 'fatal' });
|
|
163
|
+
void this.shutdown().finally(() => exit(1));
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
this.credential.start();
|
|
167
|
+
// The pod is the sandbox: the backend decides the policy (host
|
|
168
|
+
// isolation, cwd limited to the workspace volume), narrowed by the
|
|
169
|
+
// environment's binary allowlist when it has one.
|
|
170
|
+
const config = withAllowBinaries(enrolled.effectiveConfig, allowBinaries);
|
|
171
|
+
process.stdout.write(`${describeIsolationPosture(config)}\n`);
|
|
172
|
+
// Before the stream opens, so the machine reports ready only once its
|
|
173
|
+
// checkout and setup are in place. The credential renews meanwhile.
|
|
174
|
+
await (opts.prepare ?? prepareHostedWorkspace)({ env });
|
|
175
|
+
this.resolved = {
|
|
176
|
+
name: runnerNameFromHostname(hostname()) || 'hosted-runner',
|
|
177
|
+
labels: {},
|
|
178
|
+
config,
|
|
179
|
+
binaryProbeList: DEFAULT_BINARY_PROBE_LIST,
|
|
180
|
+
backendUrl: settings.backendUrl,
|
|
181
|
+
};
|
|
182
|
+
await this.connect({
|
|
183
|
+
backendUrl: settings.backendUrl,
|
|
184
|
+
token: () => this.credential?.current() ?? '',
|
|
185
|
+
streamPath: enrolled.streamPath,
|
|
186
|
+
effective: config,
|
|
187
|
+
fetch: opts.fetch,
|
|
188
|
+
installSignals: opts.installSignals ?? true,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
/** Stop heartbeats, renewal and the stream; tell the backend it is draining. */
|
|
192
|
+
async shutdown() {
|
|
193
|
+
await this.gracefulShutdown();
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Everything after the runner knows who it is: the process manager,
|
|
197
|
+
* the stream, the heartbeat loop and the state file. Shared by the
|
|
198
|
+
* login path and enroll mode.
|
|
199
|
+
*/
|
|
200
|
+
async connect(o) {
|
|
201
|
+
const resolved = this.resolved;
|
|
202
|
+
this.processes = new ProcessManager(createDefaultAdapterFactory(), o.effective.maxConcurrent);
|
|
109
203
|
// Coding-session registry for the chat bridge. Output events are sent
|
|
110
204
|
// through the same streamable client the heartbeats ride; the client is
|
|
111
205
|
// captured lazily so construction order doesn't matter.
|
|
@@ -125,15 +219,17 @@ export class RunnerDaemon {
|
|
|
125
219
|
});
|
|
126
220
|
// Open the Streamable HTTP stream.
|
|
127
221
|
this.client = new StreamableClient({
|
|
128
|
-
baseUrl: backendUrl,
|
|
129
|
-
token:
|
|
130
|
-
organizationId:
|
|
222
|
+
baseUrl: o.backendUrl,
|
|
223
|
+
token: o.token,
|
|
224
|
+
organizationId: o.organizationId,
|
|
225
|
+
streamPath: o.streamPath,
|
|
226
|
+
fetch: o.fetch,
|
|
131
227
|
});
|
|
132
228
|
this.wireClient();
|
|
133
229
|
// First POST mints the session id; send a hello envelope so the
|
|
134
230
|
// backend's worker stream (WorkerStreamTransport) assigns one.
|
|
135
231
|
await this.client.send(envelope('event', { kind: 'runner.hello', runnerId: this.runnerId }));
|
|
136
|
-
await this.client.
|
|
232
|
+
await this.client.startStream();
|
|
137
233
|
// Heartbeat loop. This timer is deliberately REF'd: it is the daemon's
|
|
138
234
|
// keep-alive. The GET command stream can briefly drop (e.g. a reconnect
|
|
139
235
|
// after a wrong-replica 404), and during that gap the fetch handle is
|
|
@@ -149,12 +245,13 @@ export class RunnerDaemon {
|
|
|
149
245
|
void this.heartbeat().catch(err => {
|
|
150
246
|
process.stderr.write(`initial heartbeat failed: ${err.message}\n`);
|
|
151
247
|
});
|
|
152
|
-
|
|
248
|
+
if (o.installSignals)
|
|
249
|
+
this.installSignalHandlers();
|
|
153
250
|
this.writeState({
|
|
154
251
|
pid: process.pid,
|
|
155
252
|
startedAt: new Date().toISOString(),
|
|
156
253
|
runnerName: resolved.name,
|
|
157
|
-
backendUrl,
|
|
254
|
+
backendUrl: o.backendUrl,
|
|
158
255
|
runnerId: this.runnerId,
|
|
159
256
|
sessionId: this.client.getSessionId(),
|
|
160
257
|
inUseProcesses: 0,
|
|
@@ -184,6 +281,8 @@ export class RunnerDaemon {
|
|
|
184
281
|
try {
|
|
185
282
|
if (this.heartbeatTimer)
|
|
186
283
|
clearInterval(this.heartbeatTimer);
|
|
284
|
+
this.heartbeatTimer = null;
|
|
285
|
+
this.credential?.stop();
|
|
187
286
|
if (this.client) {
|
|
188
287
|
await this.client.send(envelope('event', { kind: 'runner.draining' })).catch(() => { });
|
|
189
288
|
this.client.stop();
|
|
@@ -293,8 +392,8 @@ export class RunnerDaemon {
|
|
|
293
392
|
await new Promise(r => setTimeout(r, delay));
|
|
294
393
|
// Re-mint a session (client already cleared the stale id) and reopen.
|
|
295
394
|
await this.client.send(envelope('event', { kind: 'runner.hello', runnerId: this.runnerId }));
|
|
296
|
-
await this.client.
|
|
297
|
-
//
|
|
395
|
+
await this.client.startStream();
|
|
396
|
+
// The stream's 'open' event resets connectionState to 'online'; a clean
|
|
298
397
|
// reopen means the streak is broken.
|
|
299
398
|
this.sessionLostStreak = 0;
|
|
300
399
|
this.updateState({ connectionState: 'online', sessionId: this.client.getSessionId() });
|
package/dist/daemon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
|
package/dist/enroll.d.ts
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { RunnerConfig, RunnerRuntimeInfo } from './types.js';
|
|
2
|
+
/** Where a pod finds the token: the Secret, through envFrom. */
|
|
3
|
+
export declare const ENROLLMENT_TOKEN_ENV = "ALMYTY_ENROLLMENT_TOKEN";
|
|
4
|
+
/** Or a file, for a pod that mounts the Secret instead of injecting it. */
|
|
5
|
+
export declare const ENROLLMENT_TOKEN_FILE_ENV = "ALMYTY_ENROLLMENT_TOKEN_FILE";
|
|
6
|
+
export declare const DEFAULT_ENROLL_PATH = "/runners/enroll";
|
|
7
|
+
export declare const DEFAULT_HOSTED_STREAM_PATH = "/runners/hosted/stream";
|
|
8
|
+
export declare const DEFAULT_HOSTED_RENEW_PATH = "/runners/hosted/credential";
|
|
9
|
+
/** Enrollment could not happen; the process should exit non-zero. */
|
|
10
|
+
export declare class EnrollmentError extends Error {
|
|
11
|
+
readonly status?: number | undefined;
|
|
12
|
+
constructor(message: string, status?: number | undefined);
|
|
13
|
+
}
|
|
14
|
+
export interface EnrollSettings {
|
|
15
|
+
backendUrl: string;
|
|
16
|
+
enrollPath: string;
|
|
17
|
+
/** Kept off every log line and error message. */
|
|
18
|
+
token: string;
|
|
19
|
+
}
|
|
20
|
+
type Env = Record<string, string | undefined>;
|
|
21
|
+
/**
|
|
22
|
+
* The token and where to send it, from the environment the Deployment
|
|
23
|
+
* sets. Removes the token variables from `env` once read, so nothing the
|
|
24
|
+
* runner spawns later inherits them.
|
|
25
|
+
*/
|
|
26
|
+
export declare function readEnrollSettings(env?: Env, opts?: {
|
|
27
|
+
url?: string;
|
|
28
|
+
readFile?: (path: string) => string;
|
|
29
|
+
}): EnrollSettings;
|
|
30
|
+
export interface EnrollResult {
|
|
31
|
+
runnerId: string;
|
|
32
|
+
credential: string;
|
|
33
|
+
expiresAt: Date;
|
|
34
|
+
effectiveConfig: RunnerConfig;
|
|
35
|
+
streamPath: string;
|
|
36
|
+
renewPath: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Trade the token for a runner credential, once. Throws EnrollmentError
|
|
40
|
+
* on any refusal or malformed answer; the message never carries the token
|
|
41
|
+
* or a credential.
|
|
42
|
+
*/
|
|
43
|
+
export declare function enroll(settings: EnrollSettings, body: {
|
|
44
|
+
runtimeInfo: RunnerRuntimeInfo;
|
|
45
|
+
config?: Partial<RunnerConfig>;
|
|
46
|
+
}, fetchImpl?: typeof globalThis.fetch): Promise<EnrollResult>;
|
|
47
|
+
export interface RunnerCredentialOptions {
|
|
48
|
+
backendUrl: string;
|
|
49
|
+
renewPath: string;
|
|
50
|
+
credential: string;
|
|
51
|
+
expiresAt: Date;
|
|
52
|
+
/** Renewal is impossible: the process should stop. */
|
|
53
|
+
onFatal: (reason: string) => void;
|
|
54
|
+
log?: (line: string) => void;
|
|
55
|
+
fetch?: typeof globalThis.fetch;
|
|
56
|
+
setTimeoutFn?: typeof setTimeout;
|
|
57
|
+
clearTimeoutFn?: typeof clearTimeout;
|
|
58
|
+
now?: () => number;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Holds the runner credential and renews it before it expires. `current()`
|
|
62
|
+
* is what every request reads, so a renewed credential is used from the
|
|
63
|
+
* next request on without reconnecting.
|
|
64
|
+
*/
|
|
65
|
+
export declare class RunnerCredential {
|
|
66
|
+
private readonly opts;
|
|
67
|
+
private credential;
|
|
68
|
+
private expiresAt;
|
|
69
|
+
private timer;
|
|
70
|
+
private stopped;
|
|
71
|
+
private readonly fetchImpl;
|
|
72
|
+
private readonly setTimeoutFn;
|
|
73
|
+
private readonly clearTimeoutFn;
|
|
74
|
+
private readonly now;
|
|
75
|
+
constructor(opts: RunnerCredentialOptions);
|
|
76
|
+
current(): string;
|
|
77
|
+
expiry(): Date;
|
|
78
|
+
/** Arm the renewal timer for the current credential. */
|
|
79
|
+
start(): void;
|
|
80
|
+
stop(): void;
|
|
81
|
+
/** When the current credential should be renewed, from now. */
|
|
82
|
+
renewDelay(): number;
|
|
83
|
+
/**
|
|
84
|
+
* One renewal attempt. Resolves true when a new credential is in place;
|
|
85
|
+
* otherwise schedules a retry, or reports fatal when the server refused
|
|
86
|
+
* or the credential will expire before another try.
|
|
87
|
+
*/
|
|
88
|
+
renew(): Promise<boolean>;
|
|
89
|
+
private schedule;
|
|
90
|
+
}
|
|
91
|
+
export {};
|
package/dist/enroll.js
ADDED
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enroll mode: how a runner inside a hosted pod gets its identity.
|
|
3
|
+
*
|
|
4
|
+
* A hosted pod never holds anybody's login (docs/hosted-runners.md). The
|
|
5
|
+
* reconcile loop writes a single-use enrollment token into the pod's
|
|
6
|
+
* Secret, which the Deployment hands to the container as
|
|
7
|
+
* ALMYTY_ENROLLMENT_TOKEN (envFrom). This module trades that token once,
|
|
8
|
+
* at POST /runners/enroll, for a runner credential that only works on the
|
|
9
|
+
* runner's own stream and its renewal, and then keeps the credential fresh.
|
|
10
|
+
*
|
|
11
|
+
* The rules this file keeps:
|
|
12
|
+
*
|
|
13
|
+
* - The credential lives in memory only. It is never written to disk,
|
|
14
|
+
* never put in process.env (where every spawned command would inherit
|
|
15
|
+
* it) and never printed: errors name the status and the server's
|
|
16
|
+
* words, not the request.
|
|
17
|
+
* - The enrollment token is removed from process.env as soon as it is
|
|
18
|
+
* read, for the same reason. It is spent after one use anyway.
|
|
19
|
+
* - Enrollment failing is fatal (EnrollmentError). The CLI exits
|
|
20
|
+
* non-zero, Kubernetes restarts the container, and the reconcile loop
|
|
21
|
+
* writes a fresh token if the pod does not enroll in time.
|
|
22
|
+
* - The credential is renewed well before it expires. A renewal the
|
|
23
|
+
* server refuses (401, 404: the hosted runner is gone) or one that
|
|
24
|
+
* cannot succeed before expiry is fatal too.
|
|
25
|
+
*/
|
|
26
|
+
import { readFileSync } from 'node:fs';
|
|
27
|
+
import { assertSecureBackendUrl } from './config.js';
|
|
28
|
+
/** Where a pod finds the token: the Secret, through envFrom. */
|
|
29
|
+
export const ENROLLMENT_TOKEN_ENV = 'ALMYTY_ENROLLMENT_TOKEN';
|
|
30
|
+
/** Or a file, for a pod that mounts the Secret instead of injecting it. */
|
|
31
|
+
export const ENROLLMENT_TOKEN_FILE_ENV = 'ALMYTY_ENROLLMENT_TOKEN_FILE';
|
|
32
|
+
export const DEFAULT_ENROLL_PATH = '/runners/enroll';
|
|
33
|
+
export const DEFAULT_HOSTED_STREAM_PATH = '/runners/hosted/stream';
|
|
34
|
+
export const DEFAULT_HOSTED_RENEW_PATH = '/runners/hosted/credential';
|
|
35
|
+
/** Renew once this share of the credential's lifetime has passed. */
|
|
36
|
+
const RENEW_AT_FRACTION = 0.75;
|
|
37
|
+
/** Delay between renewal attempts that failed for a reason worth retrying. */
|
|
38
|
+
const RENEW_RETRY_MS = 30_000;
|
|
39
|
+
/** Enrollment could not happen; the process should exit non-zero. */
|
|
40
|
+
export class EnrollmentError extends Error {
|
|
41
|
+
status;
|
|
42
|
+
constructor(message, status) {
|
|
43
|
+
super(message);
|
|
44
|
+
this.status = status;
|
|
45
|
+
this.name = 'EnrollmentError';
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* The token and where to send it, from the environment the Deployment
|
|
50
|
+
* sets. Removes the token variables from `env` once read, so nothing the
|
|
51
|
+
* runner spawns later inherits them.
|
|
52
|
+
*/
|
|
53
|
+
export function readEnrollSettings(env = process.env, opts = {}) {
|
|
54
|
+
const readFile = opts.readFile ?? ((p) => readFileSync(p, 'utf-8'));
|
|
55
|
+
let token = (env[ENROLLMENT_TOKEN_ENV] ?? '').trim();
|
|
56
|
+
const file = (env[ENROLLMENT_TOKEN_FILE_ENV] ?? '').trim();
|
|
57
|
+
if (!token && file) {
|
|
58
|
+
try {
|
|
59
|
+
token = readFile(file).trim();
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
throw new EnrollmentError(`cannot read ${ENROLLMENT_TOKEN_FILE_ENV} (${file}): ${err?.code ?? err?.message ?? err}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
delete env[ENROLLMENT_TOKEN_ENV];
|
|
66
|
+
delete env[ENROLLMENT_TOKEN_FILE_ENV];
|
|
67
|
+
if (!token) {
|
|
68
|
+
throw new EnrollmentError(`no enrollment token: set ${ENROLLMENT_TOKEN_ENV} or ${ENROLLMENT_TOKEN_FILE_ENV}`);
|
|
69
|
+
}
|
|
70
|
+
const backendUrl = (opts.url ?? env.ALMYTY_API_URL ?? env.ALMYTY_URL ?? '').trim().replace(/\/+$/, '');
|
|
71
|
+
if (!backendUrl)
|
|
72
|
+
throw new EnrollmentError('no API URL: set ALMYTY_API_URL (or pass --url)');
|
|
73
|
+
try {
|
|
74
|
+
assertSecureBackendUrl(backendUrl);
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
throw new EnrollmentError(err.message);
|
|
78
|
+
}
|
|
79
|
+
return { backendUrl, enrollPath: pathOr(env.ALMYTY_ENROLL_PATH, DEFAULT_ENROLL_PATH), token };
|
|
80
|
+
}
|
|
81
|
+
function pathOr(value, fallback) {
|
|
82
|
+
const v = (value ?? '').trim();
|
|
83
|
+
return v.startsWith('/') ? v : fallback;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Trade the token for a runner credential, once. Throws EnrollmentError
|
|
87
|
+
* on any refusal or malformed answer; the message never carries the token
|
|
88
|
+
* or a credential.
|
|
89
|
+
*/
|
|
90
|
+
export async function enroll(settings, body, fetchImpl = globalThis.fetch) {
|
|
91
|
+
let res;
|
|
92
|
+
try {
|
|
93
|
+
res = await fetchImpl(`${settings.backendUrl}${settings.enrollPath}`, {
|
|
94
|
+
method: 'POST',
|
|
95
|
+
headers: { 'Content-Type': 'application/json' },
|
|
96
|
+
body: JSON.stringify({ token: settings.token, runtimeInfo: body.runtimeInfo, ...(body.config ? { config: body.config } : {}) }),
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
throw new EnrollmentError(`enrollment request failed: ${networkReason(err)}`);
|
|
101
|
+
}
|
|
102
|
+
if (!res.ok) {
|
|
103
|
+
throw new EnrollmentError(`enrollment refused: ${res.status} ${serverMessage(await safeText(res), settings.token)}`, res.status);
|
|
104
|
+
}
|
|
105
|
+
const json = (await res.json().catch(() => null));
|
|
106
|
+
const d = json?.data;
|
|
107
|
+
const expiresAt = new Date(d?.expiresAt);
|
|
108
|
+
if (!d || typeof d.runnerId !== 'string' || typeof d.credential !== 'string' || !d.credential ||
|
|
109
|
+
Number.isNaN(expiresAt.getTime()) || !d.effectiveConfig || typeof d.effectiveConfig !== 'object') {
|
|
110
|
+
throw new EnrollmentError('enrollment answered without a runner id, credential, expiry and config');
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
runnerId: d.runnerId,
|
|
114
|
+
credential: d.credential,
|
|
115
|
+
expiresAt,
|
|
116
|
+
effectiveConfig: d.effectiveConfig,
|
|
117
|
+
streamPath: pathOr(d.streamPath, DEFAULT_HOSTED_STREAM_PATH),
|
|
118
|
+
renewPath: pathOr(d.renewPath, DEFAULT_HOSTED_RENEW_PATH),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Holds the runner credential and renews it before it expires. `current()`
|
|
123
|
+
* is what every request reads, so a renewed credential is used from the
|
|
124
|
+
* next request on without reconnecting.
|
|
125
|
+
*/
|
|
126
|
+
export class RunnerCredential {
|
|
127
|
+
opts;
|
|
128
|
+
credential;
|
|
129
|
+
expiresAt;
|
|
130
|
+
timer = null;
|
|
131
|
+
stopped = false;
|
|
132
|
+
fetchImpl;
|
|
133
|
+
setTimeoutFn;
|
|
134
|
+
clearTimeoutFn;
|
|
135
|
+
now;
|
|
136
|
+
constructor(opts) {
|
|
137
|
+
this.opts = opts;
|
|
138
|
+
this.credential = opts.credential;
|
|
139
|
+
this.expiresAt = opts.expiresAt;
|
|
140
|
+
this.fetchImpl = opts.fetch ?? globalThis.fetch;
|
|
141
|
+
this.setTimeoutFn = opts.setTimeoutFn ?? setTimeout;
|
|
142
|
+
this.clearTimeoutFn = opts.clearTimeoutFn ?? clearTimeout;
|
|
143
|
+
this.now = opts.now ?? Date.now;
|
|
144
|
+
}
|
|
145
|
+
current() {
|
|
146
|
+
return this.credential;
|
|
147
|
+
}
|
|
148
|
+
expiry() {
|
|
149
|
+
return this.expiresAt;
|
|
150
|
+
}
|
|
151
|
+
/** Arm the renewal timer for the current credential. */
|
|
152
|
+
start() {
|
|
153
|
+
this.schedule(this.renewDelay());
|
|
154
|
+
}
|
|
155
|
+
stop() {
|
|
156
|
+
this.stopped = true;
|
|
157
|
+
if (this.timer)
|
|
158
|
+
this.clearTimeoutFn(this.timer);
|
|
159
|
+
this.timer = null;
|
|
160
|
+
}
|
|
161
|
+
/** When the current credential should be renewed, from now. */
|
|
162
|
+
renewDelay() {
|
|
163
|
+
const left = this.expiresAt.getTime() - this.now();
|
|
164
|
+
return Math.max(0, Math.floor(left * RENEW_AT_FRACTION));
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* One renewal attempt. Resolves true when a new credential is in place;
|
|
168
|
+
* otherwise schedules a retry, or reports fatal when the server refused
|
|
169
|
+
* or the credential will expire before another try.
|
|
170
|
+
*/
|
|
171
|
+
async renew() {
|
|
172
|
+
if (this.stopped)
|
|
173
|
+
return false;
|
|
174
|
+
let status = 0;
|
|
175
|
+
let detail = '';
|
|
176
|
+
try {
|
|
177
|
+
const res = await this.fetchImpl(`${this.opts.backendUrl}${this.opts.renewPath}`, {
|
|
178
|
+
method: 'POST',
|
|
179
|
+
headers: { Authorization: `Bearer ${this.credential}` },
|
|
180
|
+
});
|
|
181
|
+
status = res.status;
|
|
182
|
+
if (res.ok) {
|
|
183
|
+
const json = (await res.json().catch(() => null));
|
|
184
|
+
const next = json?.data?.credential;
|
|
185
|
+
const expiresAt = new Date(json?.data?.expiresAt);
|
|
186
|
+
if (typeof next === 'string' && next && !Number.isNaN(expiresAt.getTime())) {
|
|
187
|
+
this.credential = next;
|
|
188
|
+
this.expiresAt = expiresAt;
|
|
189
|
+
this.opts.log?.(`runner credential renewed; next renewal in ${Math.round(this.renewDelay() / 1000)}s`);
|
|
190
|
+
this.schedule(this.renewDelay());
|
|
191
|
+
return true;
|
|
192
|
+
}
|
|
193
|
+
detail = 'answer carried no credential';
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
detail = serverMessage(await safeText(res), this.credential);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
detail = networkReason(err);
|
|
201
|
+
}
|
|
202
|
+
if (this.stopped)
|
|
203
|
+
return false;
|
|
204
|
+
// 401: the credential is no longer accepted. 404: the hosted runner is
|
|
205
|
+
// gone or being torn down. Neither gets better by asking again.
|
|
206
|
+
if (status === 401 || status === 403 || status === 404) {
|
|
207
|
+
this.opts.onFatal(`credential renewal refused: ${status} ${detail}`.trim());
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
const left = this.expiresAt.getTime() - this.now();
|
|
211
|
+
if (left <= RENEW_RETRY_MS) {
|
|
212
|
+
this.opts.onFatal(`credential renewal failed and the credential expires before another try: ${status || ''} ${detail}`.trim());
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
this.opts.log?.(`credential renewal failed (${status || 'no answer'} ${detail}); retrying in ${RENEW_RETRY_MS / 1000}s`);
|
|
216
|
+
this.schedule(RENEW_RETRY_MS);
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
schedule(delay) {
|
|
220
|
+
if (this.stopped)
|
|
221
|
+
return;
|
|
222
|
+
if (this.timer)
|
|
223
|
+
this.clearTimeoutFn(this.timer);
|
|
224
|
+
this.timer = this.setTimeoutFn(() => {
|
|
225
|
+
this.timer = null;
|
|
226
|
+
void this.renew();
|
|
227
|
+
}, delay);
|
|
228
|
+
// Not the keep-alive: the heartbeat timer holds the process up.
|
|
229
|
+
this.timer?.unref?.();
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/** The server's words, short, with anything secret-shaped removed. */
|
|
233
|
+
function serverMessage(text, ...secrets) {
|
|
234
|
+
let out = text;
|
|
235
|
+
try {
|
|
236
|
+
const parsed = JSON.parse(text);
|
|
237
|
+
if (typeof parsed?.message === 'string')
|
|
238
|
+
out = parsed.message;
|
|
239
|
+
else if (Array.isArray(parsed?.message))
|
|
240
|
+
out = parsed.message.join('; ');
|
|
241
|
+
}
|
|
242
|
+
catch { /* plain text */ }
|
|
243
|
+
for (const s of secrets)
|
|
244
|
+
if (s)
|
|
245
|
+
out = out.split(s).join('[redacted]');
|
|
246
|
+
return out.replace(/\s+/g, ' ').slice(0, 200);
|
|
247
|
+
}
|
|
248
|
+
/** fetch's own "fetch failed" says nothing; the cause names the socket error. */
|
|
249
|
+
function networkReason(err) {
|
|
250
|
+
const code = err?.cause?.code ?? err?.cause?.errors?.[0]?.code;
|
|
251
|
+
return [err?.message ?? String(err), code].filter(Boolean).join(': ');
|
|
252
|
+
}
|
|
253
|
+
async function safeText(res) {
|
|
254
|
+
try {
|
|
255
|
+
return await res.text();
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
return '';
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=enroll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enroll.js","sourceRoot":"","sources":["../src/enroll.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAGrD,gEAAgE;AAChE,MAAM,CAAC,MAAM,oBAAoB,GAAG,yBAAyB,CAAC;AAC9D,2EAA2E;AAC3E,MAAM,CAAC,MAAM,yBAAyB,GAAG,8BAA8B,CAAC;AAExE,MAAM,CAAC,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AACrD,MAAM,CAAC,MAAM,0BAA0B,GAAG,wBAAwB,CAAC;AACnE,MAAM,CAAC,MAAM,yBAAyB,GAAG,4BAA4B,CAAC;AAEtE,qEAAqE;AACrE,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAC/B,8EAA8E;AAC9E,MAAM,cAAc,GAAG,MAAM,CAAC;AAE9B,qEAAqE;AACrE,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACF;IAAtC,YAAY,OAAe,EAAW,MAAe;QACnD,KAAK,CAAC,OAAO,CAAC,CAAC;QADqB,WAAM,GAAN,MAAM,CAAS;QAEnD,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAWD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAW,OAAO,CAAC,GAAG,EACtB,OAA8D,EAAE;IAEhE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5E,IAAI,KAAK,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrD,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,yBAAyB,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QAChC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,eAAe,CAAC,eAAe,yBAAyB,KAAK,IAAI,MAAM,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,CAAC,CAAC;QACvH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACjC,OAAO,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,eAAe,CAAC,4BAA4B,oBAAoB,OAAO,yBAAyB,EAAE,CAAC,CAAC;IAChH,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACvG,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,eAAe,CAAC,gDAAgD,CAAC,CAAC;IAC7F,IAAI,CAAC;QACH,sBAAsB,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,IAAI,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,EAAE,KAAK,EAAE,CAAC;AAChG,CAAC;AAED,SAAS,MAAM,CAAC,KAAyB,EAAE,QAAgB;IACzD,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/B,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC1C,CAAC;AAWD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,QAAwB,EACxB,IAAwE,EACxE,YAAqC,UAAU,CAAC,KAAK;IAErD,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE;YACpE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;SAChI,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,IAAI,eAAe,CAAC,8BAA8B,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,eAAe,CAAC,uBAAuB,GAAG,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnI,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAA0B,CAAC;IAC3E,MAAM,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC;IACrB,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACzC,IACE,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,UAAU;QACzF,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,IAAI,OAAO,CAAC,CAAC,eAAe,KAAK,QAAQ,EAChG,CAAC;QACD,MAAM,IAAI,eAAe,CAAC,wEAAwE,CAAC,CAAC;IACtG,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,SAAS;QACT,eAAe,EAAE,CAAC,CAAC,eAAe;QAClC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,0BAA0B,CAAC;QAC5D,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,yBAAyB,CAAC;KAC1D,CAAC;AACJ,CAAC;AAgBD;;;;GAIG;AACH,MAAM,OAAO,gBAAgB;IAUE;IATrB,UAAU,CAAS;IACnB,SAAS,CAAO;IAChB,KAAK,GAAyC,IAAI,CAAC;IACnD,OAAO,GAAG,KAAK,CAAC;IACP,SAAS,CAA0B;IACnC,YAAY,CAAoB;IAChC,cAAc,CAAsB;IACpC,GAAG,CAAe;IAEnC,YAA6B,IAA6B;QAA7B,SAAI,GAAJ,IAAI,CAAyB;QACxD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;QAChD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,UAAU,CAAC;QACpD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,YAAY,CAAC;QAC1D,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IAClC,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,wDAAwD;IACxD,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,+DAA+D;IAC/D,UAAU;QACR,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,iBAAiB,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAC/B,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;gBAChF,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,UAAU,EAAE,EAAE;aACxD,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YACpB,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBACX,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAA0B,CAAC;gBAC3E,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC;gBACpC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;gBAClD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;oBAC3E,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;oBACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;oBAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,8CAA8C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;oBACvG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;oBACjC,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,MAAM,GAAG,8BAA8B,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,aAAa,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAC/B,uEAAuE;QACvE,gEAAgE;QAChE,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACvD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,+BAA+B,MAAM,IAAI,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5E,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACnD,IAAI,IAAI,IAAI,cAAc,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,4EAA4E,MAAM,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YAC/H,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,8BAA8B,MAAM,IAAI,WAAW,IAAI,MAAM,kBAAkB,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC;QACzH,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,QAAQ,CAAC,KAAa;QAC5B,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE;YAClC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,gEAAgE;QAC/D,IAAI,CAAC,KAAa,EAAE,KAAK,EAAE,EAAE,CAAC;IACjC,CAAC;CACF;AAED,sEAAsE;AACtE,SAAS,aAAa,CAAC,IAAY,EAAE,GAAG,OAAiB;IACvD,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,MAAM,EAAE,OAAO,KAAK,QAAQ;YAAE,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC;aACzD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;YAAE,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,OAAO;QAAE,IAAI,CAAC;YAAE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACtE,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAChD,CAAC;AAED,iFAAiF;AACjF,SAAS,aAAa,CAAC,GAAQ;IAC7B,MAAM,IAAI,GAAG,GAAG,EAAE,KAAK,EAAE,IAAI,IAAI,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;IAC/D,OAAO,CAAC,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxE,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,GAAa;IACnC,IAAI,CAAC;QAAC,OAAO,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AACvD,CAAC"}
|