rightsize 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -4
- package/dist/backend-docker/backend.d.ts +53 -1
- package/dist/backend-docker/backend.d.ts.map +1 -1
- package/dist/backend-docker/backend.js +106 -13
- package/dist/backend-docker/backend.js.map +1 -1
- package/dist/backend-docker/labels.d.ts +27 -5
- package/dist/backend-docker/labels.d.ts.map +1 -1
- package/dist/backend-docker/labels.js +33 -5
- package/dist/backend-docker/labels.js.map +1 -1
- package/dist/backend-msb/backend.d.ts +35 -6
- package/dist/backend-msb/backend.d.ts.map +1 -1
- package/dist/backend-msb/backend.js +69 -14
- package/dist/backend-msb/backend.js.map +1 -1
- package/dist/backend-msb/provider.d.ts.map +1 -1
- package/dist/backend-msb/provider.js +7 -11
- package/dist/backend-msb/provider.js.map +1 -1
- package/dist/backend-msb/provisioner.d.ts.map +1 -1
- package/dist/backend-msb/provisioner.js +1 -20
- package/dist/backend-msb/provisioner.js.map +1 -1
- package/dist/core/backend.d.ts +73 -0
- package/dist/core/backend.d.ts.map +1 -1
- package/dist/core/backends.d.ts +16 -2
- package/dist/core/backends.d.ts.map +1 -1
- package/dist/core/backends.js +39 -5
- package/dist/core/backends.js.map +1 -1
- package/dist/core/cache-dir.d.ts +17 -0
- package/dist/core/cache-dir.d.ts.map +1 -0
- package/dist/core/cache-dir.js +29 -0
- package/dist/core/cache-dir.js.map +1 -0
- package/dist/core/cleanup.d.ts +19 -4
- package/dist/core/cleanup.d.ts.map +1 -1
- package/dist/core/cleanup.js +14 -27
- package/dist/core/cleanup.js.map +1 -1
- package/dist/core/diagnostics.d.ts +33 -0
- package/dist/core/diagnostics.d.ts.map +1 -0
- package/dist/core/diagnostics.js +76 -0
- package/dist/core/diagnostics.js.map +1 -0
- package/dist/core/errors.d.ts +41 -0
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +56 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/generic-container.d.ts +107 -1
- package/dist/core/generic-container.d.ts.map +1 -1
- package/dist/core/generic-container.js +417 -3
- package/dist/core/generic-container.js.map +1 -1
- package/dist/core/model.d.ts +22 -0
- package/dist/core/model.d.ts.map +1 -1
- package/dist/core/network.d.ts.map +1 -1
- package/dist/core/network.js +2 -0
- package/dist/core/network.js.map +1 -1
- package/dist/core/reaper/env.d.ts +14 -0
- package/dist/core/reaper/env.d.ts.map +1 -0
- package/dist/core/reaper/env.js +22 -0
- package/dist/core/reaper/env.js.map +1 -0
- package/dist/core/reaper/init.d.ts +39 -0
- package/dist/core/reaper/init.d.ts.map +1 -0
- package/dist/core/reaper/init.js +140 -0
- package/dist/core/reaper/init.js.map +1 -0
- package/dist/core/reaper/ledger.d.ts +32 -0
- package/dist/core/reaper/ledger.d.ts.map +1 -0
- package/dist/core/reaper/ledger.js +160 -0
- package/dist/core/reaper/ledger.js.map +1 -0
- package/dist/core/reaper/process-liveness.d.ts +39 -0
- package/dist/core/reaper/process-liveness.d.ts.map +1 -0
- package/dist/core/reaper/process-liveness.js +117 -0
- package/dist/core/reaper/process-liveness.js.map +1 -0
- package/dist/core/reaper/run-record.d.ts +48 -0
- package/dist/core/reaper/run-record.d.ts.map +1 -0
- package/dist/core/reaper/run-record.js +58 -0
- package/dist/core/reaper/run-record.js.map +1 -0
- package/dist/core/reaper/sweep.d.ts +23 -0
- package/dist/core/reaper/sweep.d.ts.map +1 -0
- package/dist/core/reaper/sweep.js +76 -0
- package/dist/core/reaper/sweep.js.map +1 -0
- package/dist/core/reaper/watchdog.d.ts +100 -0
- package/dist/core/reaper/watchdog.d.ts.map +1 -0
- package/dist/core/reaper/watchdog.js +412 -0
- package/dist/core/reaper/watchdog.js.map +1 -0
- package/dist/core/reuse/env.d.ts +12 -0
- package/dist/core/reuse/env.d.ts.map +1 -0
- package/dist/core/reuse/env.js +15 -0
- package/dist/core/reuse/env.js.map +1 -0
- package/dist/core/reuse/hash.d.ts +34 -0
- package/dist/core/reuse/hash.d.ts.map +1 -0
- package/dist/core/reuse/hash.js +52 -0
- package/dist/core/reuse/hash.js.map +1 -0
- package/dist/core/reuse/registry.d.ts +50 -0
- package/dist/core/reuse/registry.d.ts.map +1 -0
- package/dist/core/reuse/registry.js +75 -0
- package/dist/core/reuse/registry.js.map +1 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/backend-msb/reaper.d.ts +0 -10
- package/dist/backend-msb/reaper.d.ts.map +0 -1
- package/dist/backend-msb/reaper.js +0 -73
- package/dist/backend-msb/reaper.js.map +0 -1
|
@@ -1,10 +1,17 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
1
2
|
import { FreePorts } from "./free-ports.js";
|
|
2
3
|
import { RunId } from "./run-id.js";
|
|
3
4
|
import { Network } from "./network.js";
|
|
4
|
-
import { PortBindConflictError } from "./errors.js";
|
|
5
|
+
import { PortBindConflictError, IsolationRequiredError, CheckpointUnsupportedError } from "./errors.js";
|
|
5
6
|
import { Wait } from "./wait.js";
|
|
6
7
|
import { registerSyncCleanup, unregisterSyncCleanup } from "./cleanup.js";
|
|
7
8
|
import { Backends } from "./backends.js";
|
|
9
|
+
import { trackSandbox, untrackSandbox, trackNetwork } from "./reaper/init.js";
|
|
10
|
+
import { cacheDir } from "./cache-dir.js";
|
|
11
|
+
import { ReuseWithNetworkError } from "./errors.js";
|
|
12
|
+
import { reuseEnabled } from "./reuse/env.js";
|
|
13
|
+
import { reuseHash, reuseName } from "./reuse/hash.js";
|
|
14
|
+
import { readRegistry, writeRegistryAtomic, removeRegistry } from "./reuse/registry.js";
|
|
8
15
|
const MAX_START_ATTEMPTS = 5;
|
|
9
16
|
let sequence = 0;
|
|
10
17
|
function nextSequence() {
|
|
@@ -40,6 +47,22 @@ async function swallow(fn) {
|
|
|
40
47
|
// Best-effort teardown: never let a stop/remove failure escape.
|
|
41
48
|
}
|
|
42
49
|
}
|
|
50
|
+
/** `Map<guestPort, hostPort>` → the registry's `{"<guestPort>": <hostPort>}` shape — JSON object keys are always strings. */
|
|
51
|
+
function portsToRegistryRecord(ports) {
|
|
52
|
+
const record = {};
|
|
53
|
+
for (const [guestPort, hostPort] of ports) {
|
|
54
|
+
record[String(guestPort)] = hostPort;
|
|
55
|
+
}
|
|
56
|
+
return record;
|
|
57
|
+
}
|
|
58
|
+
/** The inverse of `portsToRegistryRecord`. */
|
|
59
|
+
function registryRecordToPorts(record) {
|
|
60
|
+
const ports = new Map();
|
|
61
|
+
for (const [guestPort, hostPort] of Object.entries(record)) {
|
|
62
|
+
ports.set(Number(guestPort), hostPort);
|
|
63
|
+
}
|
|
64
|
+
return ports;
|
|
65
|
+
}
|
|
43
66
|
/**
|
|
44
67
|
* The builder, launcher, and lifecycle guard for a single container — the
|
|
45
68
|
* one class every module (`RedisContainer`, `PostgresContainer`, …)
|
|
@@ -69,6 +92,8 @@ export class GenericContainer {
|
|
|
69
92
|
waitStrategy = Wait.forListeningPort();
|
|
70
93
|
memoryLimitMb;
|
|
71
94
|
backendOverride;
|
|
95
|
+
reuseRequested = false;
|
|
96
|
+
requireIsolationRequested = false;
|
|
72
97
|
handle;
|
|
73
98
|
backend;
|
|
74
99
|
mappedPorts = new Map();
|
|
@@ -81,6 +106,34 @@ export class GenericContainer {
|
|
|
81
106
|
static async start(image) {
|
|
82
107
|
return new GenericContainer(image).start();
|
|
83
108
|
}
|
|
109
|
+
/**
|
|
110
|
+
* Builds a normal, ephemeral `GenericContainer` from a `Checkpoint`
|
|
111
|
+
* (`checkpoint()`'s return value): image is `cp.imageRef`, and
|
|
112
|
+
* env/command/exposed ports/memory limit default to `cp.spec` — chain
|
|
113
|
+
* further builder calls (a different `waitingFor`, `withBackend`, …)
|
|
114
|
+
* before `start()`, the same as any other container. Never carries over
|
|
115
|
+
* `cp.spec`'s network/aliases/mounts — the committed image already has
|
|
116
|
+
* the filesystem baked in, and (as with `withReuse()`'s own network
|
|
117
|
+
* restriction) network topology is never part of what a checkpoint
|
|
118
|
+
* captures. Once started, a restored container is ordinary in every
|
|
119
|
+
* respect: fresh host ports, normal reaping-ledger tracking, normal stop.
|
|
120
|
+
*/
|
|
121
|
+
static fromCheckpoint(cp) {
|
|
122
|
+
const container = new GenericContainer(cp.imageRef);
|
|
123
|
+
for (const [key, value] of cp.spec.env) {
|
|
124
|
+
container.withEnv(key, value);
|
|
125
|
+
}
|
|
126
|
+
if (cp.spec.command !== undefined) {
|
|
127
|
+
container.withCommand(...cp.spec.command);
|
|
128
|
+
}
|
|
129
|
+
if (cp.spec.ports.length > 0) {
|
|
130
|
+
container.withExposedPorts(...cp.spec.ports.map((p) => p.guestPort));
|
|
131
|
+
}
|
|
132
|
+
if (cp.spec.memoryLimitMb !== undefined) {
|
|
133
|
+
container.withMemoryLimit(cp.spec.memoryLimitMb);
|
|
134
|
+
}
|
|
135
|
+
return container;
|
|
136
|
+
}
|
|
84
137
|
/** Sets an environment variable visible to the workload. Last-write-wins if called again with the same key; insertion order is otherwise preserved. */
|
|
85
138
|
withEnv(key, value) {
|
|
86
139
|
// Last-write-wins, insertion-ordered: drop any prior entry for this key
|
|
@@ -130,6 +183,32 @@ export class GenericContainer {
|
|
|
130
183
|
this.backendOverride = backend;
|
|
131
184
|
return this;
|
|
132
185
|
}
|
|
186
|
+
/**
|
|
187
|
+
* Marks this container for reuse: survive process exit and be ADOPTED —
|
|
188
|
+
* not re-created — by the next equivalent container's `start()`, in this
|
|
189
|
+
* process or a later one. Double opt-in: this API marker alone does
|
|
190
|
+
* nothing unless `RIGHTSIZE_REUSE` is also `"true"` or `"1"` at `start()`
|
|
191
|
+
* time. Marked-but-not-enabled starts as an ordinary ephemeral container
|
|
192
|
+
* (Testcontainers semantics), with a one-time stderr note. See the
|
|
193
|
+
* [reuse guide](/guide/reuse) for identity rules, the network
|
|
194
|
+
* restriction, and manual cleanup.
|
|
195
|
+
*/
|
|
196
|
+
withReuse() {
|
|
197
|
+
this.reuseRequested = true;
|
|
198
|
+
return this;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Demands hardware-virtualized isolation: `start()` throws
|
|
202
|
+
* `IsolationRequiredError` before any create/network work if the active
|
|
203
|
+
* backend's `capabilities.hardwareIsolated` is `false` (the docker
|
|
204
|
+
* fallback, which shares the host kernel), instead of silently degrading.
|
|
205
|
+
* Use for tests that run untrusted code. See the
|
|
206
|
+
* [isolation guide](/guide/isolation).
|
|
207
|
+
*/
|
|
208
|
+
withRequireIsolation() {
|
|
209
|
+
this.requireIsolationRequested = true;
|
|
210
|
+
return this;
|
|
211
|
+
}
|
|
133
212
|
/** Module hook: override to adjust the spec once mapped host ports are known (e.g. advertised listeners). */
|
|
134
213
|
customizeSpec(spec, _mapped) {
|
|
135
214
|
return spec;
|
|
@@ -181,6 +260,11 @@ export class GenericContainer {
|
|
|
181
260
|
aliases: this.aliasNames,
|
|
182
261
|
runId: RunId.value,
|
|
183
262
|
memoryLimitMb: this.memoryLimitMb,
|
|
263
|
+
// This ephemeral path is never taken by an active reuse container —
|
|
264
|
+
// that's buildReuseSpec()'s job, always with keepAlive: true. A
|
|
265
|
+
// requested-but-env-disabled reuse container falls through to here
|
|
266
|
+
// deliberately (Testcontainers semantics), so it must stay false.
|
|
267
|
+
keepAlive: false,
|
|
184
268
|
};
|
|
185
269
|
return this.customizeSpec(spec, (guest) => {
|
|
186
270
|
const p = ports.get(guest);
|
|
@@ -190,6 +274,45 @@ export class GenericContainer {
|
|
|
190
274
|
return p;
|
|
191
275
|
});
|
|
192
276
|
}
|
|
277
|
+
/** The reuse-active counterpart of `buildSpec`: always `keepAlive: true`, named `rz-reuse-<hash12>` rather than the run-scoped `rz-<runId>-<seq>`, and never joined to a `Network` (rejected earlier in `start()`). */
|
|
278
|
+
buildReuseSpec(name, ports) {
|
|
279
|
+
const spec = {
|
|
280
|
+
name,
|
|
281
|
+
image: this.image,
|
|
282
|
+
env: this.envPairs.map(([k, v]) => [k, v]),
|
|
283
|
+
command: this.command,
|
|
284
|
+
ports: this.exposedPorts.map((guestPort) => ({
|
|
285
|
+
hostPort: ports.get(guestPort) ?? (() => {
|
|
286
|
+
throw new Error(`no allocated host port for guest port ${guestPort}`);
|
|
287
|
+
})(),
|
|
288
|
+
guestPort,
|
|
289
|
+
})),
|
|
290
|
+
mounts: this.mounts,
|
|
291
|
+
networkId: undefined,
|
|
292
|
+
aliases: this.aliasNames,
|
|
293
|
+
runId: RunId.value,
|
|
294
|
+
memoryLimitMb: this.memoryLimitMb,
|
|
295
|
+
keepAlive: true,
|
|
296
|
+
};
|
|
297
|
+
return this.customizeSpec(spec, (guest) => {
|
|
298
|
+
const p = ports.get(guest);
|
|
299
|
+
if (p === undefined) {
|
|
300
|
+
throw new Error(`no allocated host port for guest port ${guest}`);
|
|
301
|
+
}
|
|
302
|
+
return p;
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
/** This container's reuse identity hash — the reuse-relevant subset of its builder state, hashed per `reuseHash`'s canonical form. Reads every `withCopyFileToContainer` source file's CURRENT content, so a mutated source file between two `start()` calls changes identity. */
|
|
306
|
+
async computeReuseHash() {
|
|
307
|
+
return reuseHash({
|
|
308
|
+
image: this.image,
|
|
309
|
+
env: this.envPairs.map(([k, v]) => [k, v]),
|
|
310
|
+
command: this.command,
|
|
311
|
+
exposedPorts: this.exposedPorts,
|
|
312
|
+
memoryLimitMb: this.memoryLimitMb,
|
|
313
|
+
copies: this.mounts.map((m) => ({ guestPath: m.guestPath, hostPath: m.hostPath })),
|
|
314
|
+
});
|
|
315
|
+
}
|
|
193
316
|
async allocatePorts() {
|
|
194
317
|
const ports = new Map();
|
|
195
318
|
for (const guestPort of this.exposedPorts) {
|
|
@@ -218,9 +341,40 @@ export class GenericContainer {
|
|
|
218
341
|
*/
|
|
219
342
|
async start() {
|
|
220
343
|
const backend = this.resolveBackend();
|
|
344
|
+
// Only the env-resolved path (never an explicit withBackend() override)
|
|
345
|
+
// drives the reaper: writes this process's run record, sweeps dead runs
|
|
346
|
+
// on first use, and spawns the watchdog. Skipping it for overrides is
|
|
347
|
+
// deliberate (see the feature's own addendum) — the ledger's per-call
|
|
348
|
+
// no-op guard means every trackSandbox/trackNetwork call below is
|
|
349
|
+
// automatically inert for a process that never resolves a backend this
|
|
350
|
+
// way, so nothing else here needs to branch on backendOverride too.
|
|
351
|
+
if (this.backendOverride === undefined) {
|
|
352
|
+
await Backends.reaperReady();
|
|
353
|
+
}
|
|
354
|
+
// Checked before the containerIsStarting hook and before any
|
|
355
|
+
// network/port/create work — see withRequireIsolation()'s own doc. No
|
|
356
|
+
// sandbox is ever created for a rejected request.
|
|
357
|
+
if (this.requireIsolationRequested && !backend.capabilities.hardwareIsolated) {
|
|
358
|
+
throw new IsolationRequiredError(backend.name);
|
|
359
|
+
}
|
|
221
360
|
await this.containerIsStarting(backend);
|
|
361
|
+
// Double opt-in (see withReuse()'s own doc): both the API marker AND
|
|
362
|
+
// RIGHTSIZE_REUSE must be set for reuse to actually engage. Requested-
|
|
363
|
+
// but-not-enabled falls straight through to the ordinary ephemeral flow
|
|
364
|
+
// below — ONE note on stderr, then Testcontainers-standard behavior.
|
|
365
|
+
if (this.reuseRequested) {
|
|
366
|
+
if (reuseEnabled(process.env)) {
|
|
367
|
+
if (this.network !== undefined) {
|
|
368
|
+
throw new ReuseWithNetworkError();
|
|
369
|
+
}
|
|
370
|
+
return this.startReuse(backend);
|
|
371
|
+
}
|
|
372
|
+
process.stderr.write(`[rightsize] reuse was requested via withReuse() for '${this.image}' but RIGHTSIZE_REUSE is not ` +
|
|
373
|
+
`enabled — starting as an ordinary (non-reused) container.\n`);
|
|
374
|
+
}
|
|
222
375
|
if (this.network !== undefined) {
|
|
223
376
|
await backend.ensureNetwork(this.network.id);
|
|
377
|
+
await trackNetwork(this.network.id);
|
|
224
378
|
}
|
|
225
379
|
let handle;
|
|
226
380
|
let allocatedPorts;
|
|
@@ -229,6 +383,15 @@ export class GenericContainer {
|
|
|
229
383
|
const ports = await this.allocatePorts();
|
|
230
384
|
const name = `rz-${RunId.value}-${nextSequence()}`;
|
|
231
385
|
const spec = this.buildSpec(name, ports);
|
|
386
|
+
// Appended BEFORE create() — the ledger's `.sandboxes` file is always
|
|
387
|
+
// a superset of this run's live sandboxes, never a subset. `keepAlive`
|
|
388
|
+
// containers are never listed at all, so a sweep can never reach one
|
|
389
|
+
// — this path only ever builds a spec via buildSpec(), which is
|
|
390
|
+
// always keepAlive: false (see its own doc); an active reuse
|
|
391
|
+
// container takes the entirely separate startReuse() path below.
|
|
392
|
+
if (!spec.keepAlive) {
|
|
393
|
+
await trackSandbox(name);
|
|
394
|
+
}
|
|
232
395
|
let createdHandle;
|
|
233
396
|
try {
|
|
234
397
|
createdHandle = await backend.create(spec);
|
|
@@ -242,6 +405,9 @@ export class GenericContainer {
|
|
|
242
405
|
await swallow(() => backend.stop(createdHandle));
|
|
243
406
|
await swallow(() => backend.remove(createdHandle));
|
|
244
407
|
}
|
|
408
|
+
if (!spec.keepAlive) {
|
|
409
|
+
await untrackSandbox(name);
|
|
410
|
+
}
|
|
245
411
|
this.releasePorts(ports);
|
|
246
412
|
if (isPortBindConflict(err)) {
|
|
247
413
|
lastConflict = err;
|
|
@@ -264,8 +430,14 @@ export class GenericContainer {
|
|
|
264
430
|
// hook in cleanup.ts calls straight into the backend's own blocking
|
|
265
431
|
// cleanupSync — the same mechanism a crash-recovery reaper would find
|
|
266
432
|
// necessary, just invoked proactively instead of on the next process's
|
|
267
|
-
// startup sweep.
|
|
268
|
-
|
|
433
|
+
// startup sweep. `keepAlive` containers are kept OUT of this registry
|
|
434
|
+
// entirely, the same way they're kept out of the ledger above: they're
|
|
435
|
+
// meant to outlive this process, so the exit path must never tear one
|
|
436
|
+
// down — see the note on the ledger append above for why this path
|
|
437
|
+
// never sees keepAlive: true in practice.
|
|
438
|
+
if (!handle.spec.keepAlive) {
|
|
439
|
+
registerSyncCleanup(handle, backend, () => backend.cleanupSync(handle.id));
|
|
440
|
+
}
|
|
269
441
|
try {
|
|
270
442
|
const links = this.network?.linksForNewMember() ?? [];
|
|
271
443
|
await backend.installNetworkLinks(handle, links);
|
|
@@ -286,6 +458,209 @@ export class GenericContainer {
|
|
|
286
458
|
await this.containerIsStarted();
|
|
287
459
|
return this;
|
|
288
460
|
}
|
|
461
|
+
/**
|
|
462
|
+
* The reuse-active start path — an entirely separate flow from the
|
|
463
|
+
* ephemeral one above, never joining `MAX_START_ATTEMPTS`'s port-conflict
|
|
464
|
+
* retry loop, the ledger, or the sync-cleanup registry (all deliberate:
|
|
465
|
+
* see `withReuse()`'s own doc and the reaping addendum). Computes this
|
|
466
|
+
* container's identity hash, then adopts an existing sandbox or creates a
|
|
467
|
+
* fresh one under the deterministic `rz-reuse-<hash12>` name.
|
|
468
|
+
*/
|
|
469
|
+
async startReuse(backend) {
|
|
470
|
+
const dir = cacheDir();
|
|
471
|
+
const hash = await this.computeReuseHash();
|
|
472
|
+
const name = reuseName(hash);
|
|
473
|
+
const { handle, mappedPorts } = await this.adoptOrCreate(backend, dir, hash, name, false);
|
|
474
|
+
this.handle = handle;
|
|
475
|
+
this.backend = backend;
|
|
476
|
+
this.mappedPorts = mappedPorts;
|
|
477
|
+
this.running = true;
|
|
478
|
+
// Deliberately no registerSyncCleanup and no ledger trackSandbox call —
|
|
479
|
+
// a keepAlive sandbox must outlive this process, which is exactly what
|
|
480
|
+
// both of those exist to prevent (see start()'s own doc on the
|
|
481
|
+
// ephemeral path for the symmetric reasoning).
|
|
482
|
+
await this.containerIsStarted();
|
|
483
|
+
return this;
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Reads the registry once and either adopts (registry hit, running,
|
|
487
|
+
* wait ok) or falls through to a fresh create — see the reuse spec's own
|
|
488
|
+
* "Start flow when reuse is active" for the full state table this
|
|
489
|
+
* implements. `isRetry` caps the name-collision recursion at one retry
|
|
490
|
+
* (`adoptOrCreate` re-enters itself exactly once, from the create/start
|
|
491
|
+
* failure branch below): "another process won the race" is expected to
|
|
492
|
+
* resolve within one retry (by then its own registry write has very
|
|
493
|
+
* likely landed); anything still colliding after that is a genuine
|
|
494
|
+
* failure, not a race, and propagates.
|
|
495
|
+
*/
|
|
496
|
+
async adoptOrCreate(backend, dir, hash, name, isRetry) {
|
|
497
|
+
const read = await readRegistry(dir, hash);
|
|
498
|
+
if (read.kind === "found") {
|
|
499
|
+
const adopted = await this.tryAdopt(backend, dir, hash, name, read.entry);
|
|
500
|
+
if (adopted !== undefined) {
|
|
501
|
+
return adopted;
|
|
502
|
+
}
|
|
503
|
+
// tryAdopt already best-effort-removed the stale sandbox + registry
|
|
504
|
+
// file; fall through to a fresh create below, same as "missing".
|
|
505
|
+
}
|
|
506
|
+
else if (read.kind === "corrupt") {
|
|
507
|
+
// Unparseable: don't trust anything about what's there, but the name
|
|
508
|
+
// is deterministic from `hash` regardless of registry content, so a
|
|
509
|
+
// best-effort removal is still possible — see the reuse spec's
|
|
510
|
+
// stale/corrupt-registry fallback.
|
|
511
|
+
await this.cleanupStaleReuse(backend, dir, hash, name);
|
|
512
|
+
}
|
|
513
|
+
else {
|
|
514
|
+
// read.kind === "missing": the common first-time-ever case, but ALSO
|
|
515
|
+
// exactly the crash-mid-boot orphan window (see the reuse guide's
|
|
516
|
+
// "recovering from a crash mid-boot" note): the registry entry is
|
|
517
|
+
// only ever written AFTER a fresh-created reuse sandbox passes its
|
|
518
|
+
// OWN wait strategy, so a process that crashed — or failed that wait
|
|
519
|
+
// — between create() and that write can leave a sandbox RUNNING under
|
|
520
|
+
// this exact deterministic name with no registry entry to say so.
|
|
521
|
+
// `keepAlive` makes it invisible to reaping, so nothing else in this
|
|
522
|
+
// library will ever clear it. Ask the backend directly whether that
|
|
523
|
+
// name is live before racing a fresh create() against it.
|
|
524
|
+
await this.removeOrphanedRunningReuse(backend, name);
|
|
525
|
+
}
|
|
526
|
+
// Same host-port-bind-conflict retry as the ephemeral flow in start()
|
|
527
|
+
// (see MAX_START_ATTEMPTS there): a pre-allocated port can still lose an
|
|
528
|
+
// allocate-then-bind race to an unrelated process, and a reuse create is
|
|
529
|
+
// no less exposed to that than an ephemeral one.
|
|
530
|
+
let handle;
|
|
531
|
+
let allocatedPorts;
|
|
532
|
+
let lastConflict;
|
|
533
|
+
for (let attempt = 0; attempt < MAX_START_ATTEMPTS; attempt++) {
|
|
534
|
+
const ports = await this.allocatePorts();
|
|
535
|
+
const spec = this.buildReuseSpec(name, ports);
|
|
536
|
+
let createdHandle;
|
|
537
|
+
try {
|
|
538
|
+
createdHandle = await backend.create(spec);
|
|
539
|
+
await backend.start(createdHandle);
|
|
540
|
+
handle = createdHandle;
|
|
541
|
+
allocatedPorts = ports;
|
|
542
|
+
break;
|
|
543
|
+
}
|
|
544
|
+
catch (err) {
|
|
545
|
+
if (createdHandle !== undefined) {
|
|
546
|
+
await swallow(() => backend.stop(createdHandle));
|
|
547
|
+
await swallow(() => backend.remove(createdHandle));
|
|
548
|
+
}
|
|
549
|
+
this.releasePorts(ports);
|
|
550
|
+
if (isPortBindConflict(err)) {
|
|
551
|
+
lastConflict = err;
|
|
552
|
+
continue;
|
|
553
|
+
}
|
|
554
|
+
if (!isRetry) {
|
|
555
|
+
// "Another process won the race": if the name is running NOW,
|
|
556
|
+
// this failure was very likely that collision rather than a
|
|
557
|
+
// genuine backend error — re-enter the adopt path once rather
|
|
558
|
+
// than surfacing a spurious create() failure. A create/start
|
|
559
|
+
// failure for an unrelated reason leaves findRunning reporting
|
|
560
|
+
// nothing, so the original error still propagates below.
|
|
561
|
+
const runningNow = await backend.findRunning(spec).catch(() => undefined);
|
|
562
|
+
if (runningNow !== undefined) {
|
|
563
|
+
return this.adoptOrCreate(backend, dir, hash, name, true);
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
throw err;
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
if (handle === undefined || allocatedPorts === undefined) {
|
|
570
|
+
throw new Error(`Failed to start reuse container '${this.image}' after ${MAX_START_ATTEMPTS} attempts: every attempt hit a host port already in use by another process.`, { cause: lastConflict });
|
|
571
|
+
}
|
|
572
|
+
const ports = allocatedPorts;
|
|
573
|
+
try {
|
|
574
|
+
await this.waitStrategy.waitUntilReady(this.waitTargetFor(backend, handle, ports));
|
|
575
|
+
}
|
|
576
|
+
catch (err) {
|
|
577
|
+
await swallow(() => backend.stop(handle));
|
|
578
|
+
await swallow(() => backend.remove(handle));
|
|
579
|
+
this.releasePorts(ports);
|
|
580
|
+
throw err;
|
|
581
|
+
}
|
|
582
|
+
const entry = {
|
|
583
|
+
name,
|
|
584
|
+
image: this.image,
|
|
585
|
+
ports: portsToRegistryRecord(ports),
|
|
586
|
+
createdIso: new Date().toISOString(),
|
|
587
|
+
backend: backend.name,
|
|
588
|
+
};
|
|
589
|
+
await writeRegistryAtomic(dir, hash, entry);
|
|
590
|
+
return { handle, mappedPorts: ports };
|
|
591
|
+
}
|
|
592
|
+
/**
|
|
593
|
+
* Registry hit → verify: confirm the name is actually running (backend
|
|
594
|
+
* query, never trusted from the file alone), then re-run this
|
|
595
|
+
* container's OWN wait strategy against the recorded ports — a running
|
|
596
|
+
* sandbox that never became ready for THIS workload is exactly as
|
|
597
|
+
* unadoptable as one that isn't running at all. `undefined` means adopt
|
|
598
|
+
* failed for any reason (not running, or the wait failed); the caller's
|
|
599
|
+
* best-effort cleanup already ran by the time this returns.
|
|
600
|
+
*/
|
|
601
|
+
async tryAdopt(backend, dir, hash, name, entry) {
|
|
602
|
+
const mappedPorts = registryRecordToPorts(entry.ports);
|
|
603
|
+
const spec = this.buildReuseSpec(name, mappedPorts);
|
|
604
|
+
const handle = await backend.findRunning(spec).catch(() => undefined);
|
|
605
|
+
if (handle === undefined) {
|
|
606
|
+
await this.cleanupStaleReuse(backend, dir, hash, name);
|
|
607
|
+
return undefined;
|
|
608
|
+
}
|
|
609
|
+
try {
|
|
610
|
+
await this.waitStrategy.waitUntilReady(this.waitTargetFor(backend, handle, mappedPorts));
|
|
611
|
+
}
|
|
612
|
+
catch {
|
|
613
|
+
await this.cleanupStaleReuse(backend, dir, hash, name);
|
|
614
|
+
return undefined;
|
|
615
|
+
}
|
|
616
|
+
return { handle, mappedPorts };
|
|
617
|
+
}
|
|
618
|
+
/** Best-effort: remove whatever's running under `name` (by name — this call never held a handle for it) and delete the registry file. Never throws. */
|
|
619
|
+
async cleanupStaleReuse(backend, dir, hash, name) {
|
|
620
|
+
await swallow(() => backend.removeByName(name));
|
|
621
|
+
await removeRegistry(dir, hash);
|
|
622
|
+
}
|
|
623
|
+
/**
|
|
624
|
+
* The crash-mid-boot-orphan guard for the "no registry entry at all"
|
|
625
|
+
* fresh-create path: confirms with the backend whether `name` is actually
|
|
626
|
+
* running BEFORE this container's own create() attempt, and only then
|
|
627
|
+
* best-effort-removes it — never a blind `removeByName` the way
|
|
628
|
+
* `cleanupStaleReuse` above does for the corrupt/failed-verification
|
|
629
|
+
* cases, where a registry entry (however stale) already proved something
|
|
630
|
+
* about this identity once existed. Here nothing has ever proved that, so
|
|
631
|
+
* the common empty-cache case (nothing running) pays no removal call at
|
|
632
|
+
* all, and a concurrent creator that's already past ITS OWN create()-and-
|
|
633
|
+
* register cycle by the time this runs is instead caught by the
|
|
634
|
+
* name-collision-retry-into-adopt path below (a registry entry appearing
|
|
635
|
+
* for it means that process won the race — adopt, don't remove). The spec
|
|
636
|
+
* handed to `findRunning` here is a throwaway: any exposed ports serve
|
|
637
|
+
* only to satisfy `ContainerSpec`'s shape, since every backend's
|
|
638
|
+
* `findRunning` matches on `spec.name` alone.
|
|
639
|
+
*/
|
|
640
|
+
async removeOrphanedRunningReuse(backend, name) {
|
|
641
|
+
const probePorts = new Map(this.exposedPorts.map((guestPort) => [guestPort, 0]));
|
|
642
|
+
const probeSpec = this.buildReuseSpec(name, probePorts);
|
|
643
|
+
const running = await backend.findRunning(probeSpec).catch(() => undefined);
|
|
644
|
+
if (running !== undefined) {
|
|
645
|
+
await swallow(() => backend.removeByName(name));
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
/** The `WaitTarget` for a specific (backend, handle, ports) triple, independent of this instance's own `this.handle`/`this.backend`/`this.mappedPorts` — needed because reuse's adopt-verification wait runs BEFORE those fields are ever assigned. */
|
|
649
|
+
waitTargetFor(backend, handle, ports) {
|
|
650
|
+
return {
|
|
651
|
+
host: this.host,
|
|
652
|
+
mappedPort: (guestPort) => {
|
|
653
|
+
const p = ports.get(guestPort);
|
|
654
|
+
if (p === undefined) {
|
|
655
|
+
throw new Error(`Port ${guestPort} is not exposed — call withExposedPorts(${guestPort}).`);
|
|
656
|
+
}
|
|
657
|
+
return p;
|
|
658
|
+
},
|
|
659
|
+
exposedGuestPorts: this.exposedPorts,
|
|
660
|
+
currentLogs: () => backend.logs(handle),
|
|
661
|
+
describe: () => `container '${handle.spec.name}' (image ${this.image})`,
|
|
662
|
+
};
|
|
663
|
+
}
|
|
289
664
|
/**
|
|
290
665
|
* Stops and removes the backend-native resource, releases its host ports,
|
|
291
666
|
* and clears the port map. Idempotent — stopping a container that never
|
|
@@ -300,9 +675,26 @@ export class GenericContainer {
|
|
|
300
675
|
const handle = this.handle;
|
|
301
676
|
const backend = this.backend;
|
|
302
677
|
this.running = false;
|
|
678
|
+
// keepAlive (reuse) is the one case that is NOT teardown: the sandbox
|
|
679
|
+
// is deliberately LEFT RUNNING — that's the whole feature — so none of
|
|
680
|
+
// the backend-native stop/remove, the sync-cleanup registration (never
|
|
681
|
+
// made in the first place, see start()), or the ledger untracking
|
|
682
|
+
// (never tracked in the first place) apply here. Only this instance's
|
|
683
|
+
// OWN bookkeeping (running flag, port map) is cleared below.
|
|
684
|
+
if (handle.spec.keepAlive) {
|
|
685
|
+
// The sandbox's host ports stay genuinely bound for as long as it
|
|
686
|
+
// keeps running (indefinitely, past this call) — returning them to
|
|
687
|
+
// FreePorts here would let an unrelated later allocation in THIS
|
|
688
|
+
// process collide with a port that is still very much in use. They
|
|
689
|
+
// simply stay marked issued for the rest of this process's lifetime;
|
|
690
|
+
// only this instance's own view of them is cleared below.
|
|
691
|
+
this.mappedPorts = new Map();
|
|
692
|
+
return;
|
|
693
|
+
}
|
|
303
694
|
await swallow(() => backend.stop(handle));
|
|
304
695
|
await swallow(() => backend.remove(handle));
|
|
305
696
|
unregisterSyncCleanup(handle.id);
|
|
697
|
+
await untrackSandbox(handle.spec.name);
|
|
306
698
|
this.releasePorts(this.mappedPorts);
|
|
307
699
|
this.mappedPorts = new Map();
|
|
308
700
|
}
|
|
@@ -352,6 +744,28 @@ export class GenericContainer {
|
|
|
352
744
|
}
|
|
353
745
|
return { handle: this.handle, backend: this.backend };
|
|
354
746
|
}
|
|
747
|
+
/**
|
|
748
|
+
* Commits this running container's filesystem to a new image and returns
|
|
749
|
+
* a `Checkpoint` — a FILESYSTEM capture, not a memory snapshot:
|
|
750
|
+
* `fromCheckpoint()` boots a fresh container from the committed image
|
|
751
|
+
* with processes restarting from scratch, not resuming. Requires the
|
|
752
|
+
* active backend's `capabilities.checkpoint` (docker: `true`, via image
|
|
753
|
+
* commit; microsandbox: `false`, no upstream microVM snapshot support
|
|
754
|
+
* yet) — checked BEFORE any backend call, so an unsupported backend never
|
|
755
|
+
* attempts one. Throws a state error (same shape as `exec`/`logs`) if
|
|
756
|
+
* this container isn't currently running. Checkpoint images are never
|
|
757
|
+
* auto-reaped (they're images, not containers) — see the checkpoints
|
|
758
|
+
* guide for the manual cleanup one-liner.
|
|
759
|
+
*/
|
|
760
|
+
async checkpoint() {
|
|
761
|
+
const { handle, backend } = this.requireHandle();
|
|
762
|
+
if (!backend.capabilities.checkpoint) {
|
|
763
|
+
throw new CheckpointUnsupportedError(backend.name);
|
|
764
|
+
}
|
|
765
|
+
const imageRef = `rightsize/checkpoint:${randomBytes(6).toString("hex")}`;
|
|
766
|
+
await backend.commitToImage(handle, imageRef);
|
|
767
|
+
return { imageRef, spec: handle.spec };
|
|
768
|
+
}
|
|
355
769
|
/** Runs a one-shot command inside the running container and waits for it to exit. Throws if the container is not running. */
|
|
356
770
|
async exec(...cmd) {
|
|
357
771
|
const { handle, backend } = this.requireHandle();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generic-container.js","sourceRoot":"","sources":["../../src/core/generic-container.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"generic-container.js","sourceRoot":"","sources":["../../src/core/generic-container.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACxG,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAI1E,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAA2B,MAAM,qBAAqB,CAAC;AAEjH,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B,IAAI,QAAQ,GAAG,CAAC,CAAC;AACjB,SAAS,YAAY;IACnB,QAAQ,IAAI,CAAC,CAAC;IACd,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,mIAAmI;AACnI,SAAS,kBAAkB,CAAC,GAAY;IACtC,IAAI,OAAO,GAAY,GAAG,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAW,CAAC;IAChC,OAAO,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClB,IAAI,OAAO,YAAY,qBAAqB,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,YAAY,KAAK,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAC9C,IAAI,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBACxF,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,GAAI,OAAuC,CAAC,KAAK,CAAC;YACzD,SAAS;QACX,CAAC;QACD,MAAM;IACR,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,EAAuB;IAC5C,IAAI,CAAC;QACH,MAAM,EAAE,EAAE,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,gEAAgE;IAClE,CAAC;AACH,CAAC;AAED,6HAA6H;AAC7H,SAAS,qBAAqB,CAAC,KAAkC;IAC/D,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,QAAQ,CAAC;IACvC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8CAA8C;AAC9C,SAAS,qBAAqB,CAAC,MAA8B;IAC3D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,KAAK,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3D,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,gBAAgB;IACV,KAAK,CAAS;IACvB,QAAQ,GAA4B,EAAE,CAAC;IACvC,YAAY,GAAa,EAAE,CAAC;IAC5B,OAAO,CAAuB;IAC9B,OAAO,CAAsB;IAC7B,UAAU,GAAa,EAAE,CAAC;IAC1B,MAAM,GAAgB,EAAE,CAAC;IACzB,YAAY,GAAiB,IAAI,CAAC,gBAAgB,EAAE,CAAC;IACrD,aAAa,CAAqB;IAClC,eAAe,CAA6B;IAC5C,cAAc,GAAG,KAAK,CAAC;IACvB,yBAAyB,GAAG,KAAK,CAAC;IAElC,MAAM,CAA4B;IAClC,OAAO,CAA6B;IACpC,WAAW,GAAwB,IAAI,GAAG,EAAE,CAAC;IAC7C,OAAO,GAAG,KAAK,CAAC;IAExB,0FAA0F;IAC1F,YAAY,KAAa;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,0DAA0D;IAC1D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAa;QAC9B,OAAO,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IAC7C,CAAC;IAED;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,cAAc,CAAC,EAAc;QAClC,MAAM,SAAS,GAAG,IAAI,gBAAgB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QACpD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACvC,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAClC,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,SAAS,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,EAAE,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACxC,SAAS,CAAC,eAAe,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,uJAAuJ;IACvJ,OAAO,CAAC,GAAW,EAAE,KAAa;QAChC,wEAAwE;QACxE,wEAAwE;QACxE,iEAAiE;QACjE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;QACzD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iHAAiH;IACjH,gBAAgB,CAAC,GAAG,KAAe;QACjC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,yGAAyG;IACzG,WAAW,CAAC,GAAG,GAAa;QAC1B,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,sGAAsG;IACtG,WAAW,CAAC,GAAY;QACtB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qHAAqH;IACrH,kBAAkB,CAAC,GAAG,KAAe;QACnC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uMAAuM;IACvM,uBAAuB,CAAC,IAAmB,EAAE,SAAiB;QAC5D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2GAA2G;IAC3G,UAAU,CAAC,QAAsB;QAC/B,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8JAA8J;IAC9J,eAAe,CAAC,SAAiB;QAC/B,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oFAAoF;IACpF,WAAW,CAAC,OAAuB;QACjC,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;OASG;IACH,SAAS;QACP,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;OAOG;IACH,oBAAoB;QAClB,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6GAA6G;IACnG,aAAa,CAAC,IAAmB,EAAE,OAAkC;QAC7E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mGAAmG;IACzF,kBAAkB;QAC1B,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED;;;;;;;;OAQG;IACO,mBAAmB,CAAC,QAAwB;QACpD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED;;;;;;;OAOG;IACO,cAAc;QACtB,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC;IACtC,CAAC;IAEO,cAAc;QACpB,OAAO,IAAI,CAAC,eAAe,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;IACnD,CAAC;IAEO,SAAS,CAAC,IAAY,EAAE,KAA0B;QACxD,MAAM,IAAI,GAAkB;YAC1B,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAU,CAAC;YACnD,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;gBAC3C,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE;oBACtC,MAAM,IAAI,KAAK,CAAC,yCAAyC,SAAS,EAAE,CAAC,CAAC;gBACxE,CAAC,CAAC,EAAE;gBACJ,SAAS;aACV,CAAC,CAAC;YACH,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE;YAC3B,OAAO,EAAE,IAAI,CAAC,UAAU;YACxB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,oEAAoE;YACpE,gEAAgE;YAChE,mEAAmE;YACnE,kEAAkE;YAClE,SAAS,EAAE,KAAK;SACjB,CAAC;QACF,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;YACxC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC3B,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,yCAAyC,KAAK,EAAE,CAAC,CAAC;YACpE,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC;IAED,uNAAuN;IAC/M,cAAc,CAAC,IAAY,EAAE,KAA0B;QAC7D,MAAM,IAAI,GAAkB;YAC1B,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAU,CAAC;YACnD,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;gBAC3C,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE;oBACtC,MAAM,IAAI,KAAK,CAAC,yCAAyC,SAAS,EAAE,CAAC,CAAC;gBACxE,CAAC,CAAC,EAAE;gBACJ,SAAS;aACV,CAAC,CAAC;YACH,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,SAAS;YACpB,OAAO,EAAE,IAAI,CAAC,UAAU;YACxB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,SAAS,EAAE,IAAI;SAChB,CAAC;QACF,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;YACxC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC3B,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,yCAAyC,KAAK,EAAE,CAAC,CAAC;YACpE,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC;IAED,kRAAkR;IAC1Q,KAAK,CAAC,gBAAgB;QAC5B,OAAO,SAAS,CAAC;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAU,CAAC;YACnD,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;SACnF,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,aAAa;QACzB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;QACxC,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC1C,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,YAAY,CAAC,KAA0B;QAC7C,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACtC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACtC,wEAAwE;QACxE,wEAAwE;QACxE,sEAAsE;QACtE,sEAAsE;QACtE,kEAAkE;QAClE,uEAAuE;QACvE,oEAAoE;QACpE,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YACvC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC/B,CAAC;QACD,6DAA6D;QAC7D,sEAAsE;QACtE,kDAAkD;QAClD,IAAI,IAAI,CAAC,yBAAyB,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC;YAC7E,MAAM,IAAI,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAExC,qEAAqE;QACrE,uEAAuE;QACvE,wEAAwE;QACxE,qEAAqE;QACrE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9B,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC/B,MAAM,IAAI,qBAAqB,EAAE,CAAC;gBACpC,CAAC;gBACD,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAClC,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wDAAwD,IAAI,CAAC,KAAK,+BAA+B;gBAC/F,6DAA6D,CAChE,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC7C,MAAM,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,MAAiC,CAAC;QACtC,IAAI,cAA+C,CAAC;QACpD,IAAI,YAAqB,CAAC;QAE1B,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,kBAAkB,EAAE,OAAO,EAAE,EAAE,CAAC;YAC9D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,KAAK,IAAI,YAAY,EAAE,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAEzC,sEAAsE;YACtE,uEAAuE;YACvE,qEAAqE;YACrE,gEAAgE;YAChE,6DAA6D;YAC7D,iEAAiE;YACjE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACpB,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;YAED,IAAI,aAAwC,CAAC;YAC7C,IAAI,CAAC;gBACH,aAAa,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC3C,MAAM,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBACnC,MAAM,GAAG,aAAa,CAAC;gBACvB,cAAc,GAAG,KAAK,CAAC;gBACvB,MAAM;YACR,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;oBAChC,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,aAA8B,CAAC,CAAC,CAAC;oBAClE,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,aAA8B,CAAC,CAAC,CAAC;gBACtE,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;oBACpB,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;gBAC7B,CAAC;gBACD,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBACzB,IAAI,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC5B,YAAY,GAAG,GAAG,CAAC;oBACnB,SAAS;gBACX,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;QAED,IAAI,MAAM,KAAK,SAAS,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CACb,oBAAoB,IAAI,CAAC,KAAK,WAAW,kBAAkB,6EAA6E,EACxI,EAAE,KAAK,EAAE,YAAY,EAAE,CACxB,CAAC;QACJ,CAAC;QAED,uEAAuE;QACvE,2DAA2D;QAC3D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,cAAc,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,qEAAqE;QACrE,sEAAsE;QACtE,oEAAoE;QACpE,sEAAsE;QACtE,uEAAuE;QACvE,sEAAsE;QACtE,uEAAuE;QACvE,sEAAsE;QACtE,mEAAmE;QACnE,0CAA0C;QAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAC3B,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;YACtD,MAAM,OAAO,CAAC,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACjD,iEAAiE;YACjE,wDAAwD;YACxD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC/B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACxD,CAAC;YACD,MAAM,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,gEAAgE;YAChE,qEAAqE;YACrE,6DAA6D;YAC7D,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,UAAU,CAAC,OAAuB;QAC9C,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAE7B,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAE1F,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,wEAAwE;QACxE,uEAAuE;QACvE,+DAA+D;QAC/D,+CAA+C;QAE/C,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;OAUG;IACK,KAAK,CAAC,aAAa,CACzB,OAAuB,EACvB,GAAW,EACX,IAAY,EACZ,IAAY,EACZ,OAAgB;QAEhB,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1E,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,oEAAoE;YACpE,iEAAiE;QACnE,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACnC,qEAAqE;YACrE,oEAAoE;YACpE,+DAA+D;YAC/D,mCAAmC;YACnC,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,qEAAqE;YACrE,kEAAkE;YAClE,kEAAkE;YAClE,mEAAmE;YACnE,qEAAqE;YACrE,sEAAsE;YACtE,kEAAkE;YAClE,qEAAqE;YACrE,oEAAoE;YACpE,0DAA0D;YAC1D,MAAM,IAAI,CAAC,0BAA0B,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACvD,CAAC;QAED,sEAAsE;QACtE,yEAAyE;QACzE,yEAAyE;QACzE,iDAAiD;QACjD,IAAI,MAAiC,CAAC;QACtC,IAAI,cAA+C,CAAC;QACpD,IAAI,YAAqB,CAAC;QAE1B,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,kBAAkB,EAAE,OAAO,EAAE,EAAE,CAAC;YAC9D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAE9C,IAAI,aAAwC,CAAC;YAC7C,IAAI,CAAC;gBACH,aAAa,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC3C,MAAM,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBACnC,MAAM,GAAG,aAAa,CAAC;gBACvB,cAAc,GAAG,KAAK,CAAC;gBACvB,MAAM;YACR,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;oBAChC,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,aAA8B,CAAC,CAAC,CAAC;oBAClE,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,aAA8B,CAAC,CAAC,CAAC;gBACtE,CAAC;gBACD,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBACzB,IAAI,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC5B,YAAY,GAAG,GAAG,CAAC;oBACnB,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,8DAA8D;oBAC9D,4DAA4D;oBAC5D,8DAA8D;oBAC9D,6DAA6D;oBAC7D,+DAA+D;oBAC/D,yDAAyD;oBACzD,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;oBAC1E,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;wBAC7B,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;oBAC5D,CAAC;gBACH,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;QAED,IAAI,MAAM,KAAK,SAAS,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CACb,oCAAoC,IAAI,CAAC,KAAK,WAAW,kBAAkB,6EAA6E,EACxJ,EAAE,KAAK,EAAE,YAAY,EAAE,CACxB,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,cAAc,CAAC;QAE7B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QACrF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAC1C,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAC5C,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YACzB,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,MAAM,KAAK,GAAuB;YAChC,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,qBAAqB,CAAC,KAAK,CAAC;YACnC,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,OAAO,EAAE,OAAO,CAAC,IAAI;SACtB,CAAC;QACF,MAAM,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAE5C,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IAED;;;;;;;;OAQG;IACK,KAAK,CAAC,QAAQ,CACpB,OAAuB,EACvB,GAAW,EACX,IAAY,EACZ,IAAY,EACZ,KAAyB;QAEzB,MAAM,WAAW,GAAG,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAEpD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACtE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACvD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;QAC3F,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACvD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACjC,CAAC;IAED,uJAAuJ;IAC/I,KAAK,CAAC,iBAAiB,CAAC,OAAuB,EAAE,GAAW,EAAE,IAAY,EAAE,IAAY;QAC9F,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QAChD,MAAM,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACK,KAAK,CAAC,0BAA0B,CAAC,OAAuB,EAAE,IAAY;QAC5E,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACjF,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5E,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,uPAAuP;IAC/O,aAAa,CAAC,OAAuB,EAAE,MAAqB,EAAE,KAA0B;QAC9F,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,UAAU,EAAE,CAAC,SAAiB,EAAU,EAAE;gBACxC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC/B,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;oBACpB,MAAM,IAAI,KAAK,CAAC,QAAQ,SAAS,2CAA2C,SAAS,IAAI,CAAC,CAAC;gBAC7F,CAAC;gBACD,OAAO,CAAC,CAAC;YACX,CAAC;YACD,iBAAiB,EAAE,IAAI,CAAC,YAAY;YACpC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;YACvC,QAAQ,EAAE,GAAG,EAAE,CAAC,cAAc,MAAM,CAAC,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,KAAK,GAAG;SACxE,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC7E,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QAErB,sEAAsE;QACtE,uEAAuE;QACvE,uEAAuE;QACvE,kEAAkE;QAClE,sEAAsE;QACtE,6DAA6D;QAC7D,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1B,kEAAkE;YAClE,mEAAmE;YACnE,iEAAiE;YACjE,mEAAmE;YACnE,qEAAqE;YACrE,0DAA0D;YAC1D,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1C,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5C,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEvC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpC,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;IAC/B,CAAC;IAED,oHAAoH;IACpH,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;QACzB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IAED,oEAAoE;IACpE,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,4FAA4F;IAC5F,IAAI,IAAI;QACN,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,2JAA2J;IAC3J,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,oJAAoJ;IACpJ,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAAC,SAAiB;QAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,QAAQ,SAAS,2CAA2C,SAAS,IAAI,CAAC,CAAC;QAC7F,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0HAA0H;IAC1H,UAAU,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC7E,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IACxD,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACjD,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;YACrC,MAAM,IAAI,0BAA0B,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,QAAQ,GAAG,wBAAwB,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1E,MAAM,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC9C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IACzC,CAAC;IAED,6HAA6H;IAC7H,KAAK,CAAC,IAAI,CAAC,GAAG,GAAa;QACzB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACjD,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,uHAAuH;IACvH,KAAK,CAAC,IAAI;QACR,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACjD,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAAC,QAAgC;QACjD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACjD,OAAO,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAEO,YAAY;QAClB,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,UAAU,EAAE,CAAC,SAAiB,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;YAChE,iBAAiB,EAAE,IAAI,CAAC,YAAY;YACpC,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE;YAC9B,QAAQ,EAAE,GAAG,EAAE,CAAC,cAAc,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,YAAY,IAAI,CAAC,KAAK,GAAG;SAC5F,CAAC;IACJ,CAAC;CACF"}
|
package/dist/core/model.d.ts
CHANGED
|
@@ -56,5 +56,27 @@ export interface ContainerSpec {
|
|
|
56
56
|
readonly runId: string;
|
|
57
57
|
/** An explicit memory ceiling in MB, if the module or caller set one via `withMemoryLimit`. */
|
|
58
58
|
readonly memoryLimitMb: number | undefined;
|
|
59
|
+
/**
|
|
60
|
+
* `true` for a container meant to outlive this process — set by
|
|
61
|
+
* `GenericContainer`'s reuse builder (`.withReuse()`), `false` otherwise.
|
|
62
|
+
* Backends and the reaping ledger consult it to keep a reusable sandbox
|
|
63
|
+
* out of every own-run cleanup path; a container carrying this flag is
|
|
64
|
+
* never appended to the ledger's `.sandboxes` file at all, so a sweep can
|
|
65
|
+
* never reach it.
|
|
66
|
+
*/
|
|
67
|
+
readonly keepAlive: boolean;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* The result of `GenericContainer.checkpoint()`: a committed image plus the
|
|
71
|
+
* source container's spec, everything `GenericContainer.fromCheckpoint()`
|
|
72
|
+
* needs to boot an equivalent container. A checkpoint is a FILESYSTEM
|
|
73
|
+
* capture, not a memory snapshot — a restored container's processes start
|
|
74
|
+
* from scratch against the committed filesystem.
|
|
75
|
+
*/
|
|
76
|
+
export interface Checkpoint {
|
|
77
|
+
/** The committed image reference, `rightsize/checkpoint:<12-hex>` — random per checkpoint, never reused. */
|
|
78
|
+
readonly imageRef: string;
|
|
79
|
+
/** The source container's spec (env, command, exposed ports, memory limit — everything needed to boot an equivalent container from `imageRef`). */
|
|
80
|
+
readonly spec: ContainerSpec;
|
|
59
81
|
}
|
|
60
82
|
//# sourceMappingURL=model.d.ts.map
|
package/dist/core/model.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/core/model.ts"],"names":[],"mappings":"AAAA,2HAA2H;AAC3H,MAAM,WAAW,WAAW;IAC1B,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,yDAAyD;IACzD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,gIAAgI;AAChI,MAAM,WAAW,SAAS;IACxB,uCAAuC;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,yCAAyC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,2HAA2H;IAC3H,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,kEAAkE;AAClE,MAAM,WAAW,UAAU;IACzB,uCAAuC;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD,wEAAwE;IACxE,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IACpD;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IAC3C,iEAAiE;IACjE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAC1C,qDAAqD;IACrD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,sDAAsD;IACtD,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACxC,gEAAgE;IAChE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,+FAA+F;IAC/F,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/core/model.ts"],"names":[],"mappings":"AAAA,2HAA2H;AAC3H,MAAM,WAAW,WAAW;IAC1B,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,yDAAyD;IACzD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,gIAAgI;AAChI,MAAM,WAAW,SAAS;IACxB,uCAAuC;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,yCAAyC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,2HAA2H;IAC3H,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,kEAAkE;AAClE,MAAM,WAAW,UAAU;IACzB,uCAAuC;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD,wEAAwE;IACxE,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IACpD;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IAC3C,iEAAiE;IACjE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAC1C,qDAAqD;IACrD,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,sDAAsD;IACtD,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACxC,gEAAgE;IAChE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,+FAA+F;IAC/F,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C;;;;;;;OAOG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB,4GAA4G;IAC5G,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,mJAAmJ;IACnJ,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;CAC9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/core/network.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/core/network.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhE;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACxC,sFAAsF;IACtF,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,2CAA2C;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAClD,0CAA0C;IAC1C,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;CACvC;AAMD;;;;;;;;;;GAUG;AACH,qBAAa,OAAQ,YAAW,eAAe;IAC7C,yDAAyD;IACzD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA0C;IACrE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,WAAW,CAA6B;IAEhD,OAAO;IAIP,2HAA2H;IAC3H,MAAM,CAAC,UAAU,IAAI,OAAO;IAI5B,qGAAqG;IACrG,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAQjD;;;;;OAKG;IACH,iBAAiB,IAAI,aAAa,CAAC,WAAW,CAAC;IAe/C;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAe9F,oGAAoG;IAC9F,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B,sFAAsF;IAChF,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7C"}
|
package/dist/core/network.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { untrackNetwork } from "./reaper/init.js";
|
|
2
3
|
/**
|
|
3
4
|
* Alias-based connectivity between containers, on both backends. Docker
|
|
4
5
|
* implements it with a native bridge network; msb — where each container is
|
|
@@ -75,6 +76,7 @@ export class Network {
|
|
|
75
76
|
if (this.lastBackend !== undefined) {
|
|
76
77
|
await this.lastBackend.removeNetwork(this.id);
|
|
77
78
|
}
|
|
79
|
+
await untrackNetwork(this.id);
|
|
78
80
|
}
|
|
79
81
|
/** `= close()`. What `await using net = Network.newNetwork()` calls at scope exit. */
|
|
80
82
|
async [Symbol.asyncDispose]() {
|