@impz/testing 6.8.0 → 6.9.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/dist/index.js +376 -205
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -18924,7 +18924,7 @@ var BACKUP_TREE = {
|
|
|
18924
18924
|
};
|
|
18925
18925
|
|
|
18926
18926
|
// packages/daemon/src/test-utils/start-test-impd.ts
|
|
18927
|
-
import { copyFileSync as copyFileSync5, mkdirSync as mkdirSync31, mkdtempSync, writeFileSync as
|
|
18927
|
+
import { copyFileSync as copyFileSync5, mkdirSync as mkdirSync31, mkdtempSync, writeFileSync as writeFileSync17 } from "fs";
|
|
18928
18928
|
import { rm as rm2 } from "fs/promises";
|
|
18929
18929
|
import { tmpdir } from "os";
|
|
18930
18930
|
|
|
@@ -18994,7 +18994,7 @@ function readBusyPorts() {
|
|
|
18994
18994
|
// packages/daemon/src/test-utils/start-test-impd.ts
|
|
18995
18995
|
import { createORPCClient as createORPCClient2 } from "@orpc/client";
|
|
18996
18996
|
import { RPCLink } from "@orpc/client/fetch";
|
|
18997
|
-
import
|
|
18997
|
+
import invariant8 from "tiny-invariant";
|
|
18998
18998
|
|
|
18999
18999
|
// packages/daemon/src/config.ts
|
|
19000
19000
|
import { join as join4 } from "path";
|
|
@@ -21739,6 +21739,7 @@ var EnvSchema = z53.object({
|
|
|
21739
21739
|
IMP_KSM_HEADROOM_PERCENT: z53.string().default("100"),
|
|
21740
21740
|
IMP_HUGE_PAGES: z53.enum(["off", "2M"]).default("off"),
|
|
21741
21741
|
IMP_UFFD_HANDLER: z53.string().default("uffd-handler"),
|
|
21742
|
+
IMP_WARM_CAP_MIB: CountSchema3.default(256),
|
|
21742
21743
|
IMP_DNS: z53.string().default("1.1.1.1,8.8.8.8").transform(splitList).pipe(DnsServersSchema),
|
|
21743
21744
|
IMP_SUBNET: z53.cidrv4().default("10.66.0.0/16"),
|
|
21744
21745
|
IMP_SUBNET6: z53.string().default("auto"),
|
|
@@ -21908,7 +21909,7 @@ function loadConfig(env) {
|
|
|
21908
21909
|
jailerBin: parsed.IMP_JAILER === "true" ? parsed.IMP_JAILER_BIN : null,
|
|
21909
21910
|
jailDir: join4(parsed.IMP_DATA_DIR, "jail"),
|
|
21910
21911
|
ksm: parseKsmConfig(parsed),
|
|
21911
|
-
hugePages: parsed.IMP_HUGE_PAGES === "2M" ? { handlerBin: parsed.IMP_UFFD_HANDLER } : null,
|
|
21912
|
+
hugePages: parsed.IMP_HUGE_PAGES === "2M" ? { handlerBin: parsed.IMP_UFFD_HANDLER, warmCapMib: parsed.IMP_WARM_CAP_MIB } : null,
|
|
21912
21913
|
kernelPath: join4(parsed.IMP_DATA_DIR, "system", "vmlinux"),
|
|
21913
21914
|
kernelSource: parsed.IMP_KERNEL ?? null,
|
|
21914
21915
|
systemDriveSource: parsed.IMP_SYSTEM_DRIVE ?? join4(parsed.IMP_DATA_DIR, "system", "imp-system.squashfs"),
|
|
@@ -21991,7 +21992,7 @@ import { join as join48 } from "path";
|
|
|
21991
21992
|
// packages/daemon/package.json
|
|
21992
21993
|
var package_default = {
|
|
21993
21994
|
name: "@impz/daemon",
|
|
21994
|
-
version: "6.
|
|
21995
|
+
version: "6.9.0",
|
|
21995
21996
|
private: true,
|
|
21996
21997
|
description: "impd: the imp host daemon",
|
|
21997
21998
|
type: "module",
|
|
@@ -38658,6 +38659,7 @@ function createImpCommands(parts) {
|
|
|
38658
38659
|
const leases = parts.leases;
|
|
38659
38660
|
const removeLockedImp = async (imp) => {
|
|
38660
38661
|
const paths = context.findPaths(imp.id);
|
|
38662
|
+
await context.memoryWarm?.stop(imp.id, "destroyed");
|
|
38661
38663
|
if (imp.pid !== null) {
|
|
38662
38664
|
await context.vms.stopVm(imp.pid, paths, false);
|
|
38663
38665
|
}
|
|
@@ -39701,6 +39703,113 @@ function splitRun(run) {
|
|
|
39701
39703
|
});
|
|
39702
39704
|
}
|
|
39703
39705
|
|
|
39706
|
+
// packages/daemon/src/vm/vmm/create-memory-warm.ts
|
|
39707
|
+
import invariant5 from "tiny-invariant";
|
|
39708
|
+
import { match as match11 } from "ts-pattern";
|
|
39709
|
+
import * as z76 from "zod";
|
|
39710
|
+
var BLOCK_MIB2 = 2;
|
|
39711
|
+
var WARM_CONCURRENCY = 2;
|
|
39712
|
+
var WarmReportSchema = z76.object({ blocks: z76.int().nonnegative() });
|
|
39713
|
+
function createMemoryWarm(deps) {
|
|
39714
|
+
const running = new Map;
|
|
39715
|
+
const lifetime = { isStopped: false };
|
|
39716
|
+
const slots = createSemaphore(WARM_CONCURRENCY);
|
|
39717
|
+
const readBlocks = async (mode, memFile, signal) => {
|
|
39718
|
+
signal.throwIfAborted();
|
|
39719
|
+
const argv = [deps.handlerBin, mode, memFile];
|
|
39720
|
+
const stdout = await runChecked(argv, { signal }, deps.run);
|
|
39721
|
+
return WarmReportSchema.parse(JSON.parse(stdout)).blocks;
|
|
39722
|
+
};
|
|
39723
|
+
const runWarm = async (memFile, signal) => {
|
|
39724
|
+
const startedMs = performance.now();
|
|
39725
|
+
try {
|
|
39726
|
+
const blocks = await readBlocks("--count-data", memFile, signal);
|
|
39727
|
+
if (blocks * BLOCK_MIB2 > deps.capMib) {
|
|
39728
|
+
return { kind: "overCap", blocks };
|
|
39729
|
+
}
|
|
39730
|
+
const read = await readBlocks("--warm", memFile, signal);
|
|
39731
|
+
return { kind: "warmed", blocks: read, warmMs: Math.round(performance.now() - startedMs) };
|
|
39732
|
+
} catch (error) {
|
|
39733
|
+
return { kind: "failed", error: getErrorMessage(error) };
|
|
39734
|
+
}
|
|
39735
|
+
};
|
|
39736
|
+
const stop = async (impID, end) => {
|
|
39737
|
+
const warm = running.get(impID);
|
|
39738
|
+
if (warm === undefined) {
|
|
39739
|
+
return;
|
|
39740
|
+
}
|
|
39741
|
+
warm.state.end = end;
|
|
39742
|
+
warm.controller.abort();
|
|
39743
|
+
if (warm.state.phase === "running") {
|
|
39744
|
+
await warm.done;
|
|
39745
|
+
return;
|
|
39746
|
+
}
|
|
39747
|
+
running.delete(impID);
|
|
39748
|
+
const warmMs = Math.round(performance.now() - warm.startedMs);
|
|
39749
|
+
logWarm(warm.target, { kind: "ended", end, warmMs }, deps.capMib);
|
|
39750
|
+
};
|
|
39751
|
+
return {
|
|
39752
|
+
start: (target) => {
|
|
39753
|
+
if (lifetime.isStopped) {
|
|
39754
|
+
logWarm(target, { kind: "closed" }, deps.capMib);
|
|
39755
|
+
return;
|
|
39756
|
+
}
|
|
39757
|
+
invariant5(!running.has(target.impID), `imp ${target.impID} slept with its warm running`);
|
|
39758
|
+
const controller = new AbortController;
|
|
39759
|
+
const state = { phase: "queued", end: null };
|
|
39760
|
+
const startedMs = performance.now();
|
|
39761
|
+
const runInSlot = () => {
|
|
39762
|
+
if (controller.signal.aborted) {
|
|
39763
|
+
return Promise.resolve(null);
|
|
39764
|
+
}
|
|
39765
|
+
state.phase = "running";
|
|
39766
|
+
return runWarm(target.memFile, controller.signal);
|
|
39767
|
+
};
|
|
39768
|
+
const runAndLog = async () => {
|
|
39769
|
+
const outcome = await slots.run(runInSlot);
|
|
39770
|
+
if (outcome === null) {
|
|
39771
|
+
return;
|
|
39772
|
+
}
|
|
39773
|
+
running.delete(target.impID);
|
|
39774
|
+
const end = state.end;
|
|
39775
|
+
const warmMs = Math.round(performance.now() - startedMs);
|
|
39776
|
+
const isEnded = outcome.kind === "failed" && end !== null;
|
|
39777
|
+
const logged = isEnded ? { kind: "ended", end, warmMs } : outcome;
|
|
39778
|
+
logWarm(target, logged, deps.capMib);
|
|
39779
|
+
};
|
|
39780
|
+
running.set(target.impID, { target, controller, state, startedMs, done: runAndLog() });
|
|
39781
|
+
},
|
|
39782
|
+
stop,
|
|
39783
|
+
stopAll: async () => {
|
|
39784
|
+
lifetime.isStopped = true;
|
|
39785
|
+
await Promise.all([...running.keys()].map((impID) => stop(impID, "impdStopped")));
|
|
39786
|
+
}
|
|
39787
|
+
};
|
|
39788
|
+
}
|
|
39789
|
+
function logWarm(target, outcome, capMib) {
|
|
39790
|
+
const logger = getImpdLogger("imps").with({ imp: target.name });
|
|
39791
|
+
match11(outcome).with({ kind: "warmed" }, (warmed) => {
|
|
39792
|
+
logger.info("warmed the memory file in {warmMs}ms: {blocks} blocks of 2 MiB", {
|
|
39793
|
+
warmMs: String(warmed.warmMs),
|
|
39794
|
+
blocks: String(warmed.blocks)
|
|
39795
|
+
});
|
|
39796
|
+
}).with({ kind: "overCap" }, (over) => {
|
|
39797
|
+
logger.info("left the memory file cold: its {dataMib} MiB of data pass the warm cap of {capMib} MiB", { dataMib: String(over.blocks * BLOCK_MIB2), capMib: String(capMib) });
|
|
39798
|
+
}).with({ kind: "ended" }, (ended) => {
|
|
39799
|
+
logger.info("stopped the memory file's warm after {warmMs}ms: {reason}", {
|
|
39800
|
+
warmMs: String(ended.warmMs),
|
|
39801
|
+
reason: formatWarmEnd(ended.end)
|
|
39802
|
+
});
|
|
39803
|
+
}).with({ kind: "closed" }, () => {
|
|
39804
|
+
logger.info("left the memory file cold: impd is stopping");
|
|
39805
|
+
}).with({ kind: "failed" }, (failed) => {
|
|
39806
|
+
logger.warning("the memory file's warm failed: {error}", { error: failed.error });
|
|
39807
|
+
}).exhaustive();
|
|
39808
|
+
}
|
|
39809
|
+
function formatWarmEnd(end) {
|
|
39810
|
+
return match11(end).with("woke", () => "the imp woke").with("stopped", () => "the imp stopped").with("destroyed", () => "the imp is destroyed").with("impdStopped", () => "impd stopped").exhaustive();
|
|
39811
|
+
}
|
|
39812
|
+
|
|
39704
39813
|
// packages/daemon/src/vm/vmm/vm-stats.ts
|
|
39705
39814
|
import { readFileSync as readFileSync19, readdirSync as readdirSync4 } from "fs";
|
|
39706
39815
|
import { readFile as readFile3 } from "fs/promises";
|
|
@@ -40017,7 +40126,7 @@ function readStep(last, current) {
|
|
|
40017
40126
|
}
|
|
40018
40127
|
|
|
40019
40128
|
// packages/daemon/src/imps/imps/session-logs/session-log-service.ts
|
|
40020
|
-
import * as
|
|
40129
|
+
import * as z78 from "zod";
|
|
40021
40130
|
|
|
40022
40131
|
// packages/daemon/src/imps/imps/session-logs/build-log-key.ts
|
|
40023
40132
|
function buildLogKey(impId, generation) {
|
|
@@ -40036,7 +40145,7 @@ import { basename as basename2, dirname as dirname8, join as join20, resolve as
|
|
|
40036
40145
|
import { existsSync as existsSync10, readFileSync as readFileSync20, readdirSync as readdirSync5, rmSync as rmSync16 } from "fs";
|
|
40037
40146
|
import { mkdir, open as open4, stat, truncate, unlink } from "fs/promises";
|
|
40038
40147
|
import { join as join19 } from "path";
|
|
40039
|
-
import * as
|
|
40148
|
+
import * as z77 from "zod";
|
|
40040
40149
|
|
|
40041
40150
|
// packages/daemon/src/imps/imps/session-logs/plan-log-read.ts
|
|
40042
40151
|
function getLogBounds(segments, origin) {
|
|
@@ -40081,20 +40190,20 @@ function planLogRead(segments, origin, from, limit) {
|
|
|
40081
40190
|
var META_FILE = "meta.json";
|
|
40082
40191
|
var SEGMENT_SUFFIX = ".seg";
|
|
40083
40192
|
var COMMIT_DELAY_MS = 1000;
|
|
40084
|
-
var OffsetSchema2 =
|
|
40085
|
-
var GenerationMetaSchema =
|
|
40086
|
-
version:
|
|
40193
|
+
var OffsetSchema2 = z77.int().nonnegative();
|
|
40194
|
+
var GenerationMetaSchema = z77.object({
|
|
40195
|
+
version: z77.literal(1),
|
|
40087
40196
|
session: AgentSessionNameSchema,
|
|
40088
40197
|
executionGeneration: AgentGenerationSchema,
|
|
40089
40198
|
bootId: AgentBootIdSchema,
|
|
40090
|
-
startedAt:
|
|
40199
|
+
startedAt: z77.int(),
|
|
40091
40200
|
origin: OffsetSchema2,
|
|
40092
|
-
segments:
|
|
40093
|
-
state:
|
|
40094
|
-
endedAt:
|
|
40201
|
+
segments: z77.array(z77.object({ start: OffsetSchema2, length: OffsetSchema2 })),
|
|
40202
|
+
state: z77.enum(["live", "ended"]),
|
|
40203
|
+
endedAt: z77.int().optional(),
|
|
40095
40204
|
end: OffsetSchema2.optional(),
|
|
40096
|
-
exitCode:
|
|
40097
|
-
stopped:
|
|
40205
|
+
exitCode: z77.int().nullable().optional(),
|
|
40206
|
+
stopped: z77.enum(["disk_full", "imp_limit"]).optional()
|
|
40098
40207
|
});
|
|
40099
40208
|
function getSegmentPath(directory, start) {
|
|
40100
40209
|
return join19(directory, `${String(start)}${SEGMENT_SUFFIX}`);
|
|
@@ -40874,7 +40983,7 @@ function toExitCode(code, signal) {
|
|
|
40874
40983
|
}
|
|
40875
40984
|
|
|
40876
40985
|
// packages/daemon/src/imps/imps/session-logs/session-log-service.ts
|
|
40877
|
-
var NoSessionPreviousSchema =
|
|
40986
|
+
var NoSessionPreviousSchema = z78.object({ previous: PreviousGenerationSchema.optional() });
|
|
40878
40987
|
function createSessionLogs(deps) {
|
|
40879
40988
|
const openTap = deps.openTap ?? openTapStream;
|
|
40880
40989
|
const createLog = deps.createLog ?? createGenerationLog;
|
|
@@ -41266,6 +41375,11 @@ function createImpContext(deps) {
|
|
|
41266
41375
|
readNetBytes: deps.readNetBytes,
|
|
41267
41376
|
readMemory: deps.readVmMemory,
|
|
41268
41377
|
readThreadIds: deps.readThreadIds
|
|
41378
|
+
}),
|
|
41379
|
+
memoryWarm: deps.config.hugePages === null ? null : createMemoryWarm({
|
|
41380
|
+
handlerBin: deps.config.hugePages.handlerBin,
|
|
41381
|
+
capMib: deps.config.hugePages.warmCapMib,
|
|
41382
|
+
run: deps.runCommand
|
|
41269
41383
|
})
|
|
41270
41384
|
};
|
|
41271
41385
|
const guest = {
|
|
@@ -42344,6 +42458,7 @@ function createImpRuntime(parts) {
|
|
|
42344
42458
|
},
|
|
42345
42459
|
tracker: context.tracker,
|
|
42346
42460
|
bootTemplates: context.templates,
|
|
42461
|
+
memoryWarm: context.memoryWarm,
|
|
42347
42462
|
readDiskFullError: () => lastDiskFull.error
|
|
42348
42463
|
};
|
|
42349
42464
|
}
|
|
@@ -42568,13 +42683,17 @@ function makeSleepImpVm(deps) {
|
|
|
42568
42683
|
const sessions = await readSessionsForSleep(imp, paths);
|
|
42569
42684
|
const services = await sendServicesList(paths.vsockSocket, SERVICES_FOR_SLEEP_MS).catch(() => null);
|
|
42570
42685
|
const started = context.sleepTiming.now();
|
|
42571
|
-
const slept = {
|
|
42686
|
+
const slept = {
|
|
42687
|
+
detail: { trigger: reason },
|
|
42688
|
+
isOnHugePages: false
|
|
42689
|
+
};
|
|
42572
42690
|
removeSnapshotMeta(paths);
|
|
42573
42691
|
const hasOomKill = startOomWatch(context.cgroups, imp.id);
|
|
42574
42692
|
try {
|
|
42575
42693
|
const cgroup = context.cgroups.setup(imp.id, imp.cpu, imp.memoryMib);
|
|
42576
42694
|
const timings = await deps.withSleepSlot(() => context.vms.sleepVm(pid, paths, cgroup, paths));
|
|
42577
42695
|
const booted = readVmIdentity(paths);
|
|
42696
|
+
slept.isOnHugePages = booted?.hugePages === "2M";
|
|
42578
42697
|
writeSnapshotMeta(paths, {
|
|
42579
42698
|
...buildSnapshotIdentity(booted, context.identity),
|
|
42580
42699
|
createdAt: Date.now(),
|
|
@@ -42627,13 +42746,17 @@ function makeSleepImpVm(deps) {
|
|
|
42627
42746
|
throw isOomKill ? new Error(`sleep failed: ${OOM_KILL_TRIGGER}`, { cause: error }) : error;
|
|
42628
42747
|
}
|
|
42629
42748
|
context.admission.release(imp.id);
|
|
42630
|
-
|
|
42749
|
+
const sleeping = await updateState(imp, {
|
|
42631
42750
|
reason: "slept",
|
|
42632
42751
|
detail: slept.detail,
|
|
42633
42752
|
state: "sleeping",
|
|
42634
42753
|
pid: null,
|
|
42635
42754
|
sleptAt: new Date
|
|
42636
42755
|
});
|
|
42756
|
+
if (slept.isOnHugePages) {
|
|
42757
|
+
context.memoryWarm?.start({ impID: imp.id, name: imp.name, memFile: paths.memFile });
|
|
42758
|
+
}
|
|
42759
|
+
return sleeping;
|
|
42637
42760
|
};
|
|
42638
42761
|
const sleepImpVm = async (imp, reason, youngGuest = ALWAYS_WAIT) => {
|
|
42639
42762
|
requireTransition(imp.state, "sleeping", "sleep");
|
|
@@ -42710,6 +42833,7 @@ function makeWakeImpVm(deps) {
|
|
|
42710
42833
|
throw buildStoppingError();
|
|
42711
42834
|
}
|
|
42712
42835
|
requireNoOopsHold(context, imp);
|
|
42836
|
+
await context.memoryWarm?.stop(imp.id, "woke");
|
|
42713
42837
|
const paths = context.findPaths(imp.id);
|
|
42714
42838
|
const meta = readSnapshotMeta(paths);
|
|
42715
42839
|
const mismatch = meta === null ? "no snapshot it can load" : readColdBootReason(meta, context.identity);
|
|
@@ -42907,18 +43031,18 @@ async function waitForAgent(vsockPath, options) {
|
|
|
42907
43031
|
}
|
|
42908
43032
|
|
|
42909
43033
|
// packages/daemon/src/vm/vmm/firecracker-client.ts
|
|
42910
|
-
import * as
|
|
42911
|
-
var InstanceInfoSchema =
|
|
42912
|
-
var MachineConfigSchema =
|
|
42913
|
-
track_dirty_pages:
|
|
42914
|
-
huge_pages:
|
|
43034
|
+
import * as z79 from "zod";
|
|
43035
|
+
var InstanceInfoSchema = z79.object({ state: z79.enum(["Not started", "Running", "Paused"]) });
|
|
43036
|
+
var MachineConfigSchema = z79.object({
|
|
43037
|
+
track_dirty_pages: z79.boolean().optional(),
|
|
43038
|
+
huge_pages: z79.string().optional()
|
|
42915
43039
|
});
|
|
42916
|
-
var BalloonStatsSchema =
|
|
42917
|
-
var HotplugMemorySchema =
|
|
42918
|
-
plugged_size_mib:
|
|
42919
|
-
requested_size_mib:
|
|
43040
|
+
var BalloonStatsSchema = z79.object({ total_memory: z79.number(), available_memory: z79.number() });
|
|
43041
|
+
var HotplugMemorySchema = z79.object({
|
|
43042
|
+
plugged_size_mib: z79.number(),
|
|
43043
|
+
requested_size_mib: z79.number()
|
|
42920
43044
|
});
|
|
42921
|
-
var VersionSchema =
|
|
43045
|
+
var VersionSchema = z79.object({ firecracker_version: z79.string() });
|
|
42922
43046
|
var DEFAULT_TIMEOUTS = { requestMs: 1e4, snapshotMs: 120000 };
|
|
42923
43047
|
|
|
42924
43048
|
class FirecrackerApiError extends Error {
|
|
@@ -43909,6 +44033,7 @@ function createImpVmOps(host) {
|
|
|
43909
44033
|
const startNewImpVm = (imp, diskReady) => startColdImpVm(imp, "start", null, diskReady);
|
|
43910
44034
|
const stopImpVm = async (imp, graceful = true) => {
|
|
43911
44035
|
const paths = context.findPaths(imp.id);
|
|
44036
|
+
await context.memoryWarm?.stop(imp.id, "stopped");
|
|
43912
44037
|
if (imp.pid !== null) {
|
|
43913
44038
|
await context.vms.stopVm(imp.pid, paths, graceful);
|
|
43914
44039
|
}
|
|
@@ -44016,7 +44141,7 @@ function countStepsMs(timings) {
|
|
|
44016
44141
|
}
|
|
44017
44142
|
|
|
44018
44143
|
// packages/daemon/src/imps/imps/services/service-api.ts
|
|
44019
|
-
import { match as
|
|
44144
|
+
import { match as match12 } from "ts-pattern";
|
|
44020
44145
|
|
|
44021
44146
|
// packages/daemon/src/imps/imps/services/create-log-decoders.ts
|
|
44022
44147
|
function createLogDecoders() {
|
|
@@ -44240,7 +44365,7 @@ function handleAgentError(service) {
|
|
|
44240
44365
|
if (!(error instanceof AgentError)) {
|
|
44241
44366
|
throw error;
|
|
44242
44367
|
}
|
|
44243
|
-
throw
|
|
44368
|
+
throw match12(error.code).with("NO_SERVICE", () => buildNotFoundError("service", service)).with("SERVICE_EXISTS", () => buildConflictError("service", service)).with("BAD_REQUEST", () => new ImpdError("BAD_REQUEST", { message: error.detail })).with("AGENT_OUTDATED", () => buildAgentOutdatedApiError(error.message)).otherwise(() => error);
|
|
44244
44369
|
};
|
|
44245
44370
|
}
|
|
44246
44371
|
function stopStreams(streams) {
|
|
@@ -45676,6 +45801,7 @@ function createImpdImps(config, deps, parts) {
|
|
|
45676
45801
|
cgroups,
|
|
45677
45802
|
memoryLimit,
|
|
45678
45803
|
readExecEnv: parts.broker.readExecEnv,
|
|
45804
|
+
runCommand: deps.runCommand ?? runCommand,
|
|
45679
45805
|
storageGate: parts.storage.storageGate,
|
|
45680
45806
|
diskBudget: parts.storage.diskBudget,
|
|
45681
45807
|
readDiskUsage: parts.storage.diskUsage.read,
|
|
@@ -45876,79 +46002,79 @@ function buildOfferedDigests(digest, receivedDigest) {
|
|
|
45876
46002
|
var COMMIT_WINDOW_MS = 24 * 60 * 60 * 1000;
|
|
45877
46003
|
|
|
45878
46004
|
// packages/daemon/src/imp-ops/moves/move-header.ts
|
|
45879
|
-
import * as
|
|
45880
|
-
var CpuSchema =
|
|
45881
|
-
var EgressSchema =
|
|
45882
|
-
var CheckpointSchema3 =
|
|
45883
|
-
label:
|
|
45884
|
-
createdAt:
|
|
45885
|
-
diskBytes:
|
|
46005
|
+
import * as z80 from "zod";
|
|
46006
|
+
var CpuSchema = z80.object({ limit: z80.number().positive().nullable(), weight: z80.int() }).readonly();
|
|
46007
|
+
var EgressSchema = z80.object({ mode: z80.string(), allow: z80.array(z80.string()).readonly() }).readonly();
|
|
46008
|
+
var CheckpointSchema3 = z80.object({
|
|
46009
|
+
label: z80.string().nullable(),
|
|
46010
|
+
createdAt: z80.coerce.date(),
|
|
46011
|
+
diskBytes: z80.int().positive()
|
|
45886
46012
|
}).readonly();
|
|
45887
|
-
var MovedBootSchema =
|
|
46013
|
+
var MovedBootSchema = z80.object({ bootId: z80.uuid(), cause: ColdBootCauseSchema, at: z80.iso.datetime() }).readonly();
|
|
45888
46014
|
var MAX_MOVED_LEASES = 1024;
|
|
45889
46015
|
var MAX_LEASE_REMAINING_MS = 100 * 365 * 24 * 60 * 60 * 1000;
|
|
45890
|
-
var LeaseOwnerTextSchema =
|
|
45891
|
-
var MovedLeaseOwnerSchema =
|
|
46016
|
+
var LeaseOwnerTextSchema = z80.string().min(1).max(256);
|
|
46017
|
+
var MovedLeaseOwnerSchema = z80.object({
|
|
45892
46018
|
principal: LeaseOwnerTextSchema,
|
|
45893
46019
|
label: LeaseLabelSchema,
|
|
45894
46020
|
display: LeaseOwnerTextSchema
|
|
45895
46021
|
});
|
|
45896
46022
|
var MovedLeaseSchema = MovedLeaseOwnerSchema.extend({
|
|
45897
|
-
remainingMs:
|
|
45898
|
-
createdAt:
|
|
46023
|
+
remainingMs: z80.int().nonnegative().max(MAX_LEASE_REMAINING_MS).nullable(),
|
|
46024
|
+
createdAt: z80.coerce.date()
|
|
45899
46025
|
}).readonly();
|
|
45900
|
-
var FilteredGrantSchema2 =
|
|
45901
|
-
var ImpSchema2 =
|
|
45902
|
-
id:
|
|
45903
|
-
name:
|
|
45904
|
-
clonedDigest:
|
|
45905
|
-
vcpus:
|
|
45906
|
-
memoryMib:
|
|
45907
|
-
maxMemoryMib:
|
|
45908
|
-
httpPort:
|
|
45909
|
-
diskBytes:
|
|
46026
|
+
var FilteredGrantSchema2 = z80.object({ secret: z80.string(), filter: GrantFilterSchema }).readonly();
|
|
46027
|
+
var ImpSchema2 = z80.object({
|
|
46028
|
+
id: z80.uuid(),
|
|
46029
|
+
name: z80.string(),
|
|
46030
|
+
clonedDigest: z80.string().optional(),
|
|
46031
|
+
vcpus: z80.int().positive(),
|
|
46032
|
+
memoryMib: z80.int().positive(),
|
|
46033
|
+
maxMemoryMib: z80.int().positive().optional(),
|
|
46034
|
+
httpPort: z80.int().positive(),
|
|
46035
|
+
diskBytes: z80.int().positive(),
|
|
45910
46036
|
cpu: CpuSchema,
|
|
45911
46037
|
egress: EgressSchema,
|
|
45912
|
-
grants:
|
|
45913
|
-
filteredGrants:
|
|
45914
|
-
isIdentityResetPending:
|
|
45915
|
-
isDiskGrowPending:
|
|
45916
|
-
isBackedUp:
|
|
45917
|
-
coldBoots:
|
|
45918
|
-
leases:
|
|
46038
|
+
grants: z80.array(z80.string()).readonly(),
|
|
46039
|
+
filteredGrants: z80.array(FilteredGrantSchema2).readonly().default([]),
|
|
46040
|
+
isIdentityResetPending: z80.boolean(),
|
|
46041
|
+
isDiskGrowPending: z80.boolean().default(false),
|
|
46042
|
+
isBackedUp: z80.boolean().default(true),
|
|
46043
|
+
coldBoots: z80.array(MovedBootSchema).max(4).readonly().default([]),
|
|
46044
|
+
leases: z80.array(MovedLeaseSchema).max(MAX_MOVED_LEASES).readonly().optional()
|
|
45919
46045
|
}).readonly();
|
|
45920
|
-
var StreamStepSchema =
|
|
45921
|
-
checkpoint:
|
|
45922
|
-
dataset:
|
|
45923
|
-
base:
|
|
46046
|
+
var StreamStepSchema = z80.object({
|
|
46047
|
+
checkpoint: z80.int().nonnegative().nullable(),
|
|
46048
|
+
dataset: z80.int().nonnegative(),
|
|
46049
|
+
base: z80.int().nonnegative().nullable()
|
|
45924
46050
|
}).readonly();
|
|
45925
|
-
var HeldAnswerSchema =
|
|
45926
|
-
names:
|
|
45927
|
-
address:
|
|
45928
|
-
ttlS:
|
|
46051
|
+
var HeldAnswerSchema = z80.object({
|
|
46052
|
+
names: z80.array(z80.string()).readonly(),
|
|
46053
|
+
address: z80.string(),
|
|
46054
|
+
ttlS: z80.int().positive()
|
|
45929
46055
|
}).readonly();
|
|
45930
|
-
var WarmSchema =
|
|
46056
|
+
var WarmSchema = z80.object({
|
|
45931
46057
|
move: WarmMoveSchema,
|
|
45932
46058
|
meta: SnapshotMetaSchema.extend({ systemDrive: SystemDriveSchema }),
|
|
45933
46059
|
vm: VmIdentitySchema.nullable(),
|
|
45934
|
-
isDriveIncluded:
|
|
45935
|
-
answers:
|
|
46060
|
+
isDriveIncluded: z80.boolean(),
|
|
46061
|
+
answers: z80.array(HeldAnswerSchema).readonly()
|
|
45936
46062
|
}).readonly();
|
|
45937
|
-
var MoveHeaderSchema =
|
|
45938
|
-
version:
|
|
46063
|
+
var MoveHeaderSchema = z80.object({
|
|
46064
|
+
version: z80.literal(1),
|
|
45939
46065
|
imp: ImpSchema2,
|
|
45940
|
-
image:
|
|
45941
|
-
name:
|
|
45942
|
-
ref:
|
|
45943
|
-
digest:
|
|
45944
|
-
receivedDigest:
|
|
45945
|
-
sizeBytes:
|
|
46066
|
+
image: z80.object({
|
|
46067
|
+
name: z80.string(),
|
|
46068
|
+
ref: z80.string(),
|
|
46069
|
+
digest: z80.string(),
|
|
46070
|
+
receivedDigest: z80.string().nullable().default(null),
|
|
46071
|
+
sizeBytes: z80.int().nonnegative(),
|
|
45946
46072
|
source: ImageSourceSchema,
|
|
45947
|
-
sourceImp:
|
|
45948
|
-
isIncluded:
|
|
46073
|
+
sourceImp: z80.string().nullable(),
|
|
46074
|
+
isIncluded: z80.boolean()
|
|
45949
46075
|
}),
|
|
45950
|
-
checkpoints:
|
|
45951
|
-
streams:
|
|
46076
|
+
checkpoints: z80.array(CheckpointSchema3).readonly(),
|
|
46077
|
+
streams: z80.array(StreamStepSchema).readonly().nullable(),
|
|
45952
46078
|
warm: WarmSchema.nullable().default(null)
|
|
45953
46079
|
}).readonly();
|
|
45954
46080
|
var MOVE_PART_HEADER = "x-imp-move-part";
|
|
@@ -46110,7 +46236,7 @@ class MoveRequestError extends ImpdError {
|
|
|
46110
46236
|
}
|
|
46111
46237
|
|
|
46112
46238
|
// packages/daemon/src/imp-ops/moves/move-tickets.ts
|
|
46113
|
-
import * as
|
|
46239
|
+
import * as z81 from "zod";
|
|
46114
46240
|
var MOVE_AUTH_SCHEME = "ImpMove";
|
|
46115
46241
|
var MOVE_TICKET_PREFIX = "";
|
|
46116
46242
|
function isSameHash(leftItem, rightItem) {
|
|
@@ -46124,19 +46250,19 @@ function readTicketHeader(request) {
|
|
|
46124
46250
|
function buildTicketHeader(ticket) {
|
|
46125
46251
|
return { authorization: `${MOVE_AUTH_SCHEME} ${ticket}` };
|
|
46126
46252
|
}
|
|
46127
|
-
var ReceiptFileSchema =
|
|
46128
|
-
kind:
|
|
46129
|
-
index:
|
|
46130
|
-
sha256:
|
|
46131
|
-
bytes:
|
|
46253
|
+
var ReceiptFileSchema = z81.object({
|
|
46254
|
+
kind: z81.string(),
|
|
46255
|
+
index: z81.int().nonnegative().optional(),
|
|
46256
|
+
sha256: z81.string(),
|
|
46257
|
+
bytes: z81.int().nonnegative()
|
|
46132
46258
|
});
|
|
46133
|
-
var ReceiptBodySchema =
|
|
46134
|
-
ticketId:
|
|
46135
|
-
name:
|
|
46136
|
-
impId:
|
|
46137
|
-
files:
|
|
46259
|
+
var ReceiptBodySchema = z81.object({
|
|
46260
|
+
ticketId: z81.string(),
|
|
46261
|
+
name: z81.string(),
|
|
46262
|
+
impId: z81.string(),
|
|
46263
|
+
files: z81.array(ReceiptFileSchema)
|
|
46138
46264
|
});
|
|
46139
|
-
var ReceiptSchema =
|
|
46265
|
+
var ReceiptSchema = z81.object({ body: z81.string(), mac: z81.string() });
|
|
46140
46266
|
function buildReceipt(body, secret) {
|
|
46141
46267
|
const text = JSON.stringify(body);
|
|
46142
46268
|
return { body: text, mac: sign(secret, text).toString("hex") };
|
|
@@ -46152,7 +46278,7 @@ function readReceipt(receipt, secret) {
|
|
|
46152
46278
|
import { mkdirSync as mkdirSync19, rmSync as rmSync23 } from "fs";
|
|
46153
46279
|
import { open as open7 } from "fs/promises";
|
|
46154
46280
|
import { join as join25 } from "path";
|
|
46155
|
-
import
|
|
46281
|
+
import invariant6 from "tiny-invariant";
|
|
46156
46282
|
|
|
46157
46283
|
// packages/daemon/src/imp-ops/moves/build-received-digest.ts
|
|
46158
46284
|
import { createHash as createHash5 } from "crypto";
|
|
@@ -46361,7 +46487,7 @@ function createByteCounter(limit) {
|
|
|
46361
46487
|
// packages/daemon/src/imp-ops/moves/move-frames.ts
|
|
46362
46488
|
import { createHash as createHash8 } from "crypto";
|
|
46363
46489
|
import { open as open6 } from "fs/promises";
|
|
46364
|
-
import * as
|
|
46490
|
+
import * as z82 from "zod";
|
|
46365
46491
|
|
|
46366
46492
|
// packages/daemon/src/imp-ops/moves/create-content-hash.ts
|
|
46367
46493
|
import { createHash as createHash7 } from "crypto";
|
|
@@ -46399,8 +46525,8 @@ var MOVE_BLOCK_BYTES = 1024 * 1024;
|
|
|
46399
46525
|
var OFFSET_BYTES = 8;
|
|
46400
46526
|
var HEADER_BYTES3 = 5;
|
|
46401
46527
|
var MAX_PAYLOAD_BYTES = MOVE_BLOCK_BYTES + OFFSET_BYTES;
|
|
46402
|
-
var MoveFileSchema =
|
|
46403
|
-
kind:
|
|
46528
|
+
var MoveFileSchema = z82.object({
|
|
46529
|
+
kind: z82.enum([
|
|
46404
46530
|
"image-rootfs",
|
|
46405
46531
|
"image-config",
|
|
46406
46532
|
"checkpoint",
|
|
@@ -46410,13 +46536,13 @@ var MoveFileSchema = z81.object({
|
|
|
46410
46536
|
"vmstate",
|
|
46411
46537
|
"mem"
|
|
46412
46538
|
]),
|
|
46413
|
-
index:
|
|
46414
|
-
sizeBytes:
|
|
46539
|
+
index: z82.int().nonnegative().optional(),
|
|
46540
|
+
sizeBytes: z82.int().nonnegative()
|
|
46415
46541
|
});
|
|
46416
46542
|
function createFileContentHash(file) {
|
|
46417
46543
|
return file.kind === "image-rootfs" || file.kind === "image-config" ? createContentHash(file.sizeBytes) : null;
|
|
46418
46544
|
}
|
|
46419
|
-
var FileEndSchema =
|
|
46545
|
+
var FileEndSchema = z82.object({ sha256: z82.string() });
|
|
46420
46546
|
function encodeFrame2(type, payload) {
|
|
46421
46547
|
const frame = new Uint8Array(HEADER_BYTES3 + payload.length);
|
|
46422
46548
|
const view = new DataView(frame.buffer);
|
|
@@ -46943,7 +47069,7 @@ async function requireImage(deps, options) {
|
|
|
46943
47069
|
{ kind: "image-rootfs", sha256: rootfs.sha256, bytes: rootfs.bytes },
|
|
46944
47070
|
{ kind: "image-config", sha256: config.sha256, bytes: config.bytes }
|
|
46945
47071
|
];
|
|
46946
|
-
|
|
47072
|
+
invariant6(rootfs.contentSha256 !== null && config.contentSha256 !== null);
|
|
46947
47073
|
const digest = buildReceivedDigest(rootfs.contentSha256, config.contentSha256);
|
|
46948
47074
|
const known = await readImageInUse(deps.db, [digest], deps.now());
|
|
46949
47075
|
if (known !== undefined) {
|
|
@@ -47252,8 +47378,8 @@ function readSettled2(row, imp) {
|
|
|
47252
47378
|
}
|
|
47253
47379
|
|
|
47254
47380
|
// packages/daemon/src/imp-ops/moves/move-sender.ts
|
|
47255
|
-
import
|
|
47256
|
-
import { match as
|
|
47381
|
+
import invariant7 from "tiny-invariant";
|
|
47382
|
+
import { match as match13 } from "ts-pattern";
|
|
47257
47383
|
|
|
47258
47384
|
// packages/daemon/src/platform/db/move-send-steps.ts
|
|
47259
47385
|
var MOVE_SEND_STEPS = [
|
|
@@ -47816,7 +47942,7 @@ function createMoveSender(deps) {
|
|
|
47816
47942
|
};
|
|
47817
47943
|
const recoverSend = async (imp, row) => {
|
|
47818
47944
|
const log = getImpdLogger("move").with({ imp: imp.name });
|
|
47819
|
-
await
|
|
47945
|
+
await match13(pickSendRecovery(imp.moveState, row?.step)).with("unmark", () => removeMark(imp)).with("wait", () => {
|
|
47820
47946
|
log.info("a prepared send waits for its send after a restart");
|
|
47821
47947
|
}).with("abort", async () => {
|
|
47822
47948
|
const isUndone = await resetSend(imp, row?.peer_url ?? null, row?.ticket ?? null);
|
|
@@ -47824,7 +47950,7 @@ function createMoveSender(deps) {
|
|
|
47824
47950
|
log.info("a send cut short by a restart was undone");
|
|
47825
47951
|
}
|
|
47826
47952
|
}).with("commit", async () => {
|
|
47827
|
-
|
|
47953
|
+
invariant7(row !== undefined && row.peer_url !== null && row.ticket !== null);
|
|
47828
47954
|
const moved = imp.moveState === "moved" ? imp : await updateImpMove(deps.db, imp.id, "moved");
|
|
47829
47955
|
await runCommitAfterRestart(moved, row.peer_url, row.ticket);
|
|
47830
47956
|
}).with("none", () => {}).exhaustive();
|
|
@@ -47938,7 +48064,7 @@ function buildPublicError(name) {
|
|
|
47938
48064
|
}
|
|
47939
48065
|
function pickSendRecovery(moveState, step) {
|
|
47940
48066
|
if (moveState === "sending") {
|
|
47941
|
-
return
|
|
48067
|
+
return match13(step).with(undefined, () => "unmark").with("prepared", () => "wait").with("streaming", () => "abort").with("sent", () => "commit").exhaustive();
|
|
47942
48068
|
}
|
|
47943
48069
|
return moveState === "moved" && step === "sent" ? "commit" : "none";
|
|
47944
48070
|
}
|
|
@@ -47990,7 +48116,7 @@ function createMoveService(deps) {
|
|
|
47990
48116
|
// packages/daemon/src/surface/moves/create-move-peer-handler.ts
|
|
47991
48117
|
import { OpenAPIHandler } from "@orpc/openapi/fetch";
|
|
47992
48118
|
import { ORPCError as ORPCError7, implement as implement3, onError as onError3 } from "@orpc/server";
|
|
47993
|
-
import { match as
|
|
48119
|
+
import { match as match14 } from "ts-pattern";
|
|
47994
48120
|
function createMovePeerHandler(deps) {
|
|
47995
48121
|
const withTicket = async (step, context, call) => {
|
|
47996
48122
|
const startedAt = deps.now();
|
|
@@ -48041,7 +48167,7 @@ function createMovePeerHandler(deps) {
|
|
|
48041
48167
|
const respondReceive = async (context) => {
|
|
48042
48168
|
try {
|
|
48043
48169
|
const received = await withTicket("receive", context, (checked) => deps.calls.receive(checked, context.request));
|
|
48044
|
-
return
|
|
48170
|
+
return match14(received).with({ kind: "part" }, (sent) => Response.json({ part: sent.part }, { status: 202 })).with({ kind: "receipt" }, (sent) => Response.json(sent.receipt)).exhaustive();
|
|
48045
48171
|
} catch (error) {
|
|
48046
48172
|
const failure = toPeerError(error);
|
|
48047
48173
|
return Response.json(encodePeerError(failure), { status: failure.status });
|
|
@@ -48085,7 +48211,7 @@ import {
|
|
|
48085
48211
|
} from "@orpc/client";
|
|
48086
48212
|
import { ResponseValidationPlugin } from "@orpc/contract/plugins";
|
|
48087
48213
|
import { OpenAPILink } from "@orpc/openapi-client/fetch";
|
|
48088
|
-
import * as
|
|
48214
|
+
import * as z83 from "zod";
|
|
48089
48215
|
function makeConnectMovePeer(deps) {
|
|
48090
48216
|
return (target) => {
|
|
48091
48217
|
const sendLinkRequest = async (request) => {
|
|
@@ -48131,7 +48257,7 @@ function makeConnectMovePeer(deps) {
|
|
|
48131
48257
|
};
|
|
48132
48258
|
};
|
|
48133
48259
|
}
|
|
48134
|
-
var PeerErrorBodySchema =
|
|
48260
|
+
var PeerErrorBodySchema = z83.looseObject({ error: z83.string().optional() });
|
|
48135
48261
|
function decodePeerError(body, response) {
|
|
48136
48262
|
const parsed = PeerErrorBodySchema.safeParse(body);
|
|
48137
48263
|
if (!parsed.success) {
|
|
@@ -48891,7 +49017,7 @@ import { join as join30, posix as posix3 } from "path";
|
|
|
48891
49017
|
|
|
48892
49018
|
// packages/local-tar/src/extract-local.ts
|
|
48893
49019
|
import tar from "tar-stream";
|
|
48894
|
-
import * as
|
|
49020
|
+
import * as z84 from "zod";
|
|
48895
49021
|
// packages/local-tar/src/pack-build-context.ts
|
|
48896
49022
|
import { existsSync as existsSync18 } from "fs";
|
|
48897
49023
|
import { lstat, readFile as readFile4, readdir } from "fs/promises";
|
|
@@ -50021,14 +50147,14 @@ function renderPinnedDockerfile(dockerfile, pins, platform) {
|
|
|
50021
50147
|
}
|
|
50022
50148
|
|
|
50023
50149
|
// packages/daemon/src/imps/images/pull/image-pin.ts
|
|
50024
|
-
import * as
|
|
50150
|
+
import * as z85 from "zod";
|
|
50025
50151
|
var PIN_INSPECT_FORMAT = '{"Id":{{json .Id}},"RepoDigests":{{json .RepoDigests}},"Os":{{json .Os}},"Architecture":{{json .Architecture}},"Config":{{json .Config}}}';
|
|
50026
|
-
var ConfigSchema =
|
|
50027
|
-
var PinInspectSchema =
|
|
50028
|
-
Id:
|
|
50029
|
-
RepoDigests:
|
|
50030
|
-
Os:
|
|
50031
|
-
Architecture:
|
|
50152
|
+
var ConfigSchema = z85.object({ OnBuild: z85.array(z85.unknown()).readonly().nullish() }).nullable();
|
|
50153
|
+
var PinInspectSchema = z85.object({
|
|
50154
|
+
Id: z85.string(),
|
|
50155
|
+
RepoDigests: z85.array(z85.string()).readonly().nullable(),
|
|
50156
|
+
Os: z85.string(),
|
|
50157
|
+
Architecture: z85.string(),
|
|
50032
50158
|
Config: ConfigSchema
|
|
50033
50159
|
}).transform((inspect) => ({
|
|
50034
50160
|
Id: inspect.Id,
|
|
@@ -50090,7 +50216,7 @@ impd pinned ${pinned}. On the containerd image store a retag of a multi-platform
|
|
|
50090
50216
|
}
|
|
50091
50217
|
|
|
50092
50218
|
// packages/daemon/src/imps/images/build/build-engine.ts
|
|
50093
|
-
import * as
|
|
50219
|
+
import * as z86 from "zod";
|
|
50094
50220
|
|
|
50095
50221
|
// packages/daemon/src/imps/docker-contract/dockerfile-frontend.ts
|
|
50096
50222
|
var DOCKERFILE_FRONTEND = "docker/dockerfile:1.28@sha256:bb22d9815c728170f72750f4e5b0d672e06176142e1d602c7e66c050100b7e5b";
|
|
@@ -50124,7 +50250,7 @@ function createBuildEngine(run) {
|
|
|
50124
50250
|
if (version.exitCode !== 0) {
|
|
50125
50251
|
throw new Error(`docker version: ${version.stderr.trim()}`);
|
|
50126
50252
|
}
|
|
50127
|
-
const [os, arch] =
|
|
50253
|
+
const [os, arch] = z86.tuple([z86.string(), z86.string()]).parse(version.stdout.trim().split(" ").map((part) => JSON.parse(part)));
|
|
50128
50254
|
return normalizePlatform(os, arch);
|
|
50129
50255
|
},
|
|
50130
50256
|
loadImage: async (image, signal) => {
|
|
@@ -50226,7 +50352,7 @@ class DockerBuildError extends Error {
|
|
|
50226
50352
|
}
|
|
50227
50353
|
|
|
50228
50354
|
// packages/daemon/src/imps/images/build/guest-build.ts
|
|
50229
|
-
import * as
|
|
50355
|
+
import * as z87 from "zod";
|
|
50230
50356
|
|
|
50231
50357
|
// packages/daemon/src/imps/images/build/image-limit-error.ts
|
|
50232
50358
|
class ImageLimitError extends ImpdError {
|
|
@@ -50498,8 +50624,8 @@ function createPlainLines(output) {
|
|
|
50498
50624
|
// packages/daemon/src/imps/images/build/guest-build.ts
|
|
50499
50625
|
var GUEST_BUILD_TAG = "imp-build:latest";
|
|
50500
50626
|
var LOG_MAX_CHARS = 8000;
|
|
50501
|
-
var ContainerIdSchema =
|
|
50502
|
-
var OciConfigSchema =
|
|
50627
|
+
var ContainerIdSchema = z87.string().regex(/^[a-f0-9]{64}$/v);
|
|
50628
|
+
var OciConfigSchema = z87.record(z87.string(), z87.unknown()).nullable();
|
|
50503
50629
|
async function runGuestBuild(exec, options) {
|
|
50504
50630
|
const lines = options.output === undefined ? null : createPlainLines(options.output);
|
|
50505
50631
|
const result = await exec([
|
|
@@ -50854,7 +50980,7 @@ function normalizeDockerfilePath(path) {
|
|
|
50854
50980
|
}
|
|
50855
50981
|
|
|
50856
50982
|
// packages/daemon/src/imps/images/image-naming.ts
|
|
50857
|
-
import * as
|
|
50983
|
+
import * as z88 from "zod";
|
|
50858
50984
|
var MAX_NAME_LENGTH2 = 31;
|
|
50859
50985
|
function deriveImageName(ref) {
|
|
50860
50986
|
const lastSegment = parseImageReference(ref).path.split("/").at(-1) ?? "";
|
|
@@ -50864,10 +50990,10 @@ function deriveImageName(ref) {
|
|
|
50864
50990
|
}
|
|
50865
50991
|
return name;
|
|
50866
50992
|
}
|
|
50867
|
-
var OciConfigSchema2 =
|
|
50868
|
-
Env:
|
|
50869
|
-
WorkingDir:
|
|
50870
|
-
User:
|
|
50993
|
+
var OciConfigSchema2 = z88.object({
|
|
50994
|
+
Env: z88.array(z88.string()).nullish(),
|
|
50995
|
+
WorkingDir: z88.string().nullish(),
|
|
50996
|
+
User: z88.string().nullish()
|
|
50871
50997
|
}).nullish();
|
|
50872
50998
|
function buildImageRuntimeConfig(ociConfig) {
|
|
50873
50999
|
const parsed = OciConfigSchema2.parse(ociConfig);
|
|
@@ -50883,10 +51009,10 @@ import { existsSync as existsSync20, mkdirSync as mkdirSync22, rmSync as rmSync2
|
|
|
50883
51009
|
import { join as join32 } from "path";
|
|
50884
51010
|
|
|
50885
51011
|
// packages/daemon/src/imps/images/rootfs/read-oci-config.ts
|
|
50886
|
-
import * as
|
|
50887
|
-
var OciConfigSchema3 =
|
|
50888
|
-
digest:
|
|
50889
|
-
config:
|
|
51012
|
+
import * as z89 from "zod";
|
|
51013
|
+
var OciConfigSchema3 = z89.object({
|
|
51014
|
+
digest: z89.string().regex(/^sha256:[a-f0-9]{64}$/v),
|
|
51015
|
+
config: z89.record(z89.string(), z89.unknown()).nullable()
|
|
50890
51016
|
});
|
|
50891
51017
|
async function readOciConfig(ref, signal, run) {
|
|
50892
51018
|
const argv = ["oci-fetch", "config", ref];
|
|
@@ -51710,11 +51836,11 @@ function createImpdStorage(config, deps) {
|
|
|
51710
51836
|
}
|
|
51711
51837
|
|
|
51712
51838
|
// packages/daemon/src/host-net/net/tailscale-status.ts
|
|
51713
|
-
import * as
|
|
51714
|
-
var IpListSchema =
|
|
51715
|
-
var StatusSchema =
|
|
51716
|
-
BackendState:
|
|
51717
|
-
Self:
|
|
51839
|
+
import * as z90 from "zod";
|
|
51840
|
+
var IpListSchema = z90.array(z90.string()).nullable().optional();
|
|
51841
|
+
var StatusSchema = z90.object({
|
|
51842
|
+
BackendState: z90.string(),
|
|
51843
|
+
Self: z90.object({ HostName: z90.string(), DNSName: z90.string().optional(), TailscaleIPs: IpListSchema }).optional()
|
|
51718
51844
|
});
|
|
51719
51845
|
var UNKNOWN = { state: null, hostname: null, dnsName: null, ip: null, ips: [] };
|
|
51720
51846
|
var STATUS_TTL_MS = 30000;
|
|
@@ -51997,18 +52123,18 @@ import { getOAuthProviderApi } from "@better-auth/oauth-provider";
|
|
|
51997
52123
|
import { createAuthEndpoint } from "better-auth/api";
|
|
51998
52124
|
import { setSessionCookie } from "better-auth/cookies";
|
|
51999
52125
|
import { generateRandomString } from "better-auth/crypto";
|
|
52000
|
-
import * as
|
|
52126
|
+
import * as z91 from "zod";
|
|
52001
52127
|
var CLIENT_SCOPES = [...ScopeSchema.options, "offline_access"];
|
|
52002
52128
|
var APPROVAL_EMAIL_DOMAIN = "approval.imp.invalid";
|
|
52003
|
-
var SignInBodySchema =
|
|
52004
|
-
oauth_query:
|
|
52005
|
-
tokenID:
|
|
52006
|
-
tokenName:
|
|
52007
|
-
imps:
|
|
52129
|
+
var SignInBodySchema = z91.object({
|
|
52130
|
+
oauth_query: z91.string(),
|
|
52131
|
+
tokenID: z91.string().min(1),
|
|
52132
|
+
tokenName: z91.string().min(1),
|
|
52133
|
+
imps: z91.array(z91.string()).nullable()
|
|
52008
52134
|
});
|
|
52009
|
-
var FixedClientBodySchema =
|
|
52010
|
-
name:
|
|
52011
|
-
redirectURIs:
|
|
52135
|
+
var FixedClientBodySchema = z91.object({
|
|
52136
|
+
name: z91.string().min(1),
|
|
52137
|
+
redirectURIs: z91.array(z91.string()).min(1)
|
|
52012
52138
|
});
|
|
52013
52139
|
function createApproverPlugin() {
|
|
52014
52140
|
return {
|
|
@@ -52034,7 +52160,7 @@ function createApproverPlugin() {
|
|
|
52034
52160
|
}),
|
|
52035
52161
|
verifyMCPAccessToken: createAuthEndpoint("/imp/verify-access-token", {
|
|
52036
52162
|
method: "POST",
|
|
52037
|
-
body:
|
|
52163
|
+
body: z91.object({ token: z91.string() }),
|
|
52038
52164
|
metadata: { SERVER_ONLY: true }
|
|
52039
52165
|
}, async (ctx) => {
|
|
52040
52166
|
const provider = ctx.context.getPlugin("oauth-provider");
|
|
@@ -52078,7 +52204,7 @@ function createApproverPlugin() {
|
|
|
52078
52204
|
|
|
52079
52205
|
// packages/daemon/src/identity/oauth/create-oauth-handlers.ts
|
|
52080
52206
|
import { verifyOAuthQueryParams } from "@better-auth/oauth-provider";
|
|
52081
|
-
import * as
|
|
52207
|
+
import * as z92 from "zod";
|
|
52082
52208
|
|
|
52083
52209
|
// packages/daemon/src/identity/oauth/build-bad-token-request.ts
|
|
52084
52210
|
function buildBadTokenRequest() {
|
|
@@ -52306,14 +52432,14 @@ function expandScopes(asked) {
|
|
|
52306
52432
|
}
|
|
52307
52433
|
|
|
52308
52434
|
// packages/daemon/src/platform/http/render-html.ts
|
|
52309
|
-
import { P as P4, match as
|
|
52435
|
+
import { P as P4, match as match15 } from "ts-pattern";
|
|
52310
52436
|
var MARKUP = Symbol("markup");
|
|
52311
52437
|
function renderHTML(strings, ...parts) {
|
|
52312
52438
|
const html = parts.reduce((text, part, index) => `${text}${toHTML(part)}${strings[index + 1] ?? ""}`, strings[0] ?? "");
|
|
52313
52439
|
return { [MARKUP]: true, html };
|
|
52314
52440
|
}
|
|
52315
52441
|
function toHTML(part) {
|
|
52316
|
-
return
|
|
52442
|
+
return match15(part).with(P4.string, (text) => escapeHTML(text)).with(P4.array(), (list) => list.map((each) => each.html).join("")).with({ html: P4.string }, (markup) => markup.html).exhaustive();
|
|
52317
52443
|
}
|
|
52318
52444
|
function escapeHTML(text) {
|
|
52319
52445
|
return text.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
@@ -52450,9 +52576,9 @@ var MINUTE_MS2 = 60000;
|
|
|
52450
52576
|
var CONSENT_MS = 10 * MINUTE_MS2;
|
|
52451
52577
|
var MAX_FORM_BYTES = 16 * 1024;
|
|
52452
52578
|
var METADATA_HEADERS = { "cache-control": "no-store" };
|
|
52453
|
-
var PKCEMissSchema =
|
|
52454
|
-
error:
|
|
52455
|
-
error_description:
|
|
52579
|
+
var PKCEMissSchema = z92.object({
|
|
52580
|
+
error: z92.literal("invalid_request"),
|
|
52581
|
+
error_description: z92.literal("code verification failed")
|
|
52456
52582
|
});
|
|
52457
52583
|
function createOAuthHandlers(deps) {
|
|
52458
52584
|
const host = new URL(deps.origin).host;
|
|
@@ -53144,8 +53270,8 @@ function loadOrCreateHostId(dataDir) {
|
|
|
53144
53270
|
|
|
53145
53271
|
// packages/daemon/src/network/tailnet-names/oauth-credential.ts
|
|
53146
53272
|
import { readFileSync as readFileSync29, statSync as statSync14 } from "fs";
|
|
53147
|
-
import * as
|
|
53148
|
-
var CredentialSchema =
|
|
53273
|
+
import * as z93 from "zod";
|
|
53274
|
+
var CredentialSchema = z93.object({ clientId: z93.string().min(1), clientSecret: z93.string().min(1) });
|
|
53149
53275
|
function readOAuthCredential(path) {
|
|
53150
53276
|
const mode = statSync14(path).mode & 511;
|
|
53151
53277
|
if ((mode & 63) !== 0) {
|
|
@@ -53166,17 +53292,17 @@ function readJson(path) {
|
|
|
53166
53292
|
}
|
|
53167
53293
|
|
|
53168
53294
|
// packages/daemon/src/host-net/net/tailscale-serve.ts
|
|
53169
|
-
import * as
|
|
53170
|
-
var HandlerSchema =
|
|
53171
|
-
var WebSchema =
|
|
53172
|
-
Handlers:
|
|
53295
|
+
import * as z94 from "zod";
|
|
53296
|
+
var HandlerSchema = z94.object({ Proxy: z94.string().optional() });
|
|
53297
|
+
var WebSchema = z94.object({
|
|
53298
|
+
Handlers: z94.record(z94.string(), HandlerSchema).nullable().optional()
|
|
53173
53299
|
});
|
|
53174
|
-
var ServiceConfigSchema =
|
|
53175
|
-
Web:
|
|
53300
|
+
var ServiceConfigSchema = z94.object({
|
|
53301
|
+
Web: z94.record(z94.string(), WebSchema).nullable().optional()
|
|
53176
53302
|
});
|
|
53177
|
-
var ServeStatusSchema =
|
|
53178
|
-
TCP:
|
|
53179
|
-
Services:
|
|
53303
|
+
var ServeStatusSchema = z94.object({
|
|
53304
|
+
TCP: z94.record(z94.string(), z94.unknown()).optional(),
|
|
53305
|
+
Services: z94.record(z94.string(), ServiceConfigSchema).nullable().optional()
|
|
53180
53306
|
});
|
|
53181
53307
|
function parseServeStatus(json) {
|
|
53182
53308
|
try {
|
|
@@ -53227,17 +53353,17 @@ function createServiceServe(run = runChecked) {
|
|
|
53227
53353
|
}
|
|
53228
53354
|
|
|
53229
53355
|
// packages/daemon/src/network/tailnet-names/services-api.ts
|
|
53230
|
-
import * as
|
|
53356
|
+
import * as z95 from "zod";
|
|
53231
53357
|
var TAILSCALE_API = "https://api.tailscale.com/api/v2";
|
|
53232
53358
|
var TOKEN_MARGIN_MS = 60000;
|
|
53233
|
-
var ServiceSchema2 =
|
|
53234
|
-
name:
|
|
53235
|
-
comment:
|
|
53236
|
-
ports:
|
|
53237
|
-
tags:
|
|
53359
|
+
var ServiceSchema2 = z95.object({
|
|
53360
|
+
name: z95.string(),
|
|
53361
|
+
comment: z95.string().optional(),
|
|
53362
|
+
ports: z95.array(z95.string()).readonly().optional(),
|
|
53363
|
+
tags: z95.array(z95.string()).readonly().nullable().optional()
|
|
53238
53364
|
}).readonly();
|
|
53239
|
-
var ServiceListSchema2 =
|
|
53240
|
-
var TokenSchema3 =
|
|
53365
|
+
var ServiceListSchema2 = z95.object({ vipServices: z95.array(ServiceSchema2).nullable().optional() });
|
|
53366
|
+
var TokenSchema3 = z95.object({ access_token: z95.string(), expires_in: z95.number().positive() });
|
|
53241
53367
|
|
|
53242
53368
|
class TailscaleApiError extends Error {
|
|
53243
53369
|
status;
|
|
@@ -53326,7 +53452,7 @@ function createServicesApi(options) {
|
|
|
53326
53452
|
}
|
|
53327
53453
|
};
|
|
53328
53454
|
}
|
|
53329
|
-
var ErrorSchema =
|
|
53455
|
+
var ErrorSchema = z95.object({ message: z95.string() });
|
|
53330
53456
|
function readErrorText(text) {
|
|
53331
53457
|
try {
|
|
53332
53458
|
return ErrorSchema.parse(JSON.parse(text)).message;
|
|
@@ -53753,14 +53879,14 @@ function formatAcmeError(error) {
|
|
|
53753
53879
|
// packages/daemon/src/network/https/acme/cert-store.ts
|
|
53754
53880
|
import { existsSync as existsSync23, mkdirSync as mkdirSync24, readFileSync as readFileSync30, rmSync as rmSync29 } from "fs";
|
|
53755
53881
|
import { join as join37 } from "path";
|
|
53756
|
-
import * as
|
|
53757
|
-
var AttemptStateSchema =
|
|
53758
|
-
failures:
|
|
53759
|
-
lastAttemptAt:
|
|
53760
|
-
lastError:
|
|
53882
|
+
import * as z96 from "zod";
|
|
53883
|
+
var AttemptStateSchema = z96.object({
|
|
53884
|
+
failures: z96.int().nonnegative(),
|
|
53885
|
+
lastAttemptAt: z96.number().nullable(),
|
|
53886
|
+
lastError: z96.string().nullable()
|
|
53761
53887
|
});
|
|
53762
|
-
var AccountSchema =
|
|
53763
|
-
var LegacyAccountSchema =
|
|
53888
|
+
var AccountSchema = z96.object({ directoryUrl: z96.string(), url: z96.string(), keyPem: z96.string() });
|
|
53889
|
+
var LegacyAccountSchema = z96.object({ directoryUrl: z96.string(), url: z96.string() });
|
|
53764
53890
|
var NO_ATTEMPTS = { failures: 0, lastAttemptAt: null, lastError: null };
|
|
53765
53891
|
function createCertStore(dataDir) {
|
|
53766
53892
|
const directory = join37(dataDir, "tls");
|
|
@@ -53898,7 +54024,7 @@ function createChalltestsrvProvider(apiUrl) {
|
|
|
53898
54024
|
}
|
|
53899
54025
|
|
|
53900
54026
|
// packages/daemon/src/network/https/dns/cloudflare-provider.ts
|
|
53901
|
-
import * as
|
|
54027
|
+
import * as z97 from "zod";
|
|
53902
54028
|
|
|
53903
54029
|
// packages/daemon/src/network/https/dns/wait-for-txt.ts
|
|
53904
54030
|
import { Resolver as Resolver2 } from "dns/promises";
|
|
@@ -53960,30 +54086,30 @@ var CLOUDFLARE_API = "https://api.cloudflare.com/client/v4";
|
|
|
53960
54086
|
var TXT_TTL_S = 60;
|
|
53961
54087
|
var A_TTL_S = 300;
|
|
53962
54088
|
var PAGE_SIZE = 500;
|
|
53963
|
-
var ApiErrorSchema =
|
|
53964
|
-
var EnvelopeSchema =
|
|
53965
|
-
success:
|
|
53966
|
-
errors:
|
|
53967
|
-
result:
|
|
53968
|
-
result_info:
|
|
54089
|
+
var ApiErrorSchema = z97.object({ code: z97.number().optional(), message: z97.string() });
|
|
54090
|
+
var EnvelopeSchema = z97.object({
|
|
54091
|
+
success: z97.boolean(),
|
|
54092
|
+
errors: z97.array(ApiErrorSchema).default([]),
|
|
54093
|
+
result: z97.unknown().optional(),
|
|
54094
|
+
result_info: z97.object({ page: z97.number(), total_pages: z97.number() }).optional()
|
|
53969
54095
|
});
|
|
53970
|
-
var ZoneSchema =
|
|
53971
|
-
id:
|
|
53972
|
-
name:
|
|
53973
|
-
name_servers:
|
|
54096
|
+
var ZoneSchema = z97.object({
|
|
54097
|
+
id: z97.string(),
|
|
54098
|
+
name: z97.string(),
|
|
54099
|
+
name_servers: z97.array(z97.string())
|
|
53974
54100
|
});
|
|
53975
|
-
var RecordSchema =
|
|
53976
|
-
id:
|
|
53977
|
-
name:
|
|
53978
|
-
type:
|
|
53979
|
-
content:
|
|
53980
|
-
proxied:
|
|
53981
|
-
comment:
|
|
54101
|
+
var RecordSchema = z97.object({
|
|
54102
|
+
id: z97.string(),
|
|
54103
|
+
name: z97.string().optional(),
|
|
54104
|
+
type: z97.string().optional(),
|
|
54105
|
+
content: z97.string(),
|
|
54106
|
+
proxied: z97.boolean().optional(),
|
|
54107
|
+
comment: z97.string().nullable().optional()
|
|
53982
54108
|
});
|
|
53983
54109
|
var MANAGED_COMMENT = "managed by impd";
|
|
53984
54110
|
var ADDRESS_TYPES = new Set(["A", "AAAA", "CNAME"]);
|
|
53985
|
-
var ZoneListSchema =
|
|
53986
|
-
var RecordListSchema =
|
|
54111
|
+
var ZoneListSchema = z97.array(ZoneSchema);
|
|
54112
|
+
var RecordListSchema = z97.array(RecordSchema);
|
|
53987
54113
|
function createCloudflareProvider(options) {
|
|
53988
54114
|
const base = options.apiUrl ?? CLOUDFLARE_API;
|
|
53989
54115
|
const send = options.fetch ?? fetch;
|
|
@@ -56380,6 +56506,7 @@ async function stopImpd(parts, options) {
|
|
|
56380
56506
|
if (imps !== undefined) {
|
|
56381
56507
|
state.settled = options.sleepImps ? await runStep("sleep", readLeftMs(), () => imps.sleepAllImps()) : await runStep("lifecycle", readLeftMs(), () => imps.waitForLifecycle());
|
|
56382
56508
|
await runStep("templates", readStepMs(), () => imps.bootTemplates?.stop());
|
|
56509
|
+
await runStep("memory-warms", readStepMs(), () => imps.memoryWarm?.stopAll());
|
|
56383
56510
|
if (options.sleepImps) {
|
|
56384
56511
|
const sleptMs = Math.round(performance.now() - started);
|
|
56385
56512
|
getImpdLogger("stop").info("every imp asleep in {sleptMs}ms", { sleptMs: String(sleptMs) });
|
|
@@ -56479,8 +56606,8 @@ import {
|
|
|
56479
56606
|
statSync as statSync15
|
|
56480
56607
|
} from "fs";
|
|
56481
56608
|
import { basename as basename5, dirname as dirname11, join as join39 } from "path";
|
|
56482
|
-
import * as
|
|
56483
|
-
var CopiesSchema =
|
|
56609
|
+
import * as z98 from "zod";
|
|
56610
|
+
var CopiesSchema = z98.record(z98.string(), z98.object({ ino: z98.string(), ctimeNs: z98.string(), size: z98.string() }));
|
|
56484
56611
|
function createXfsBackups(ctx) {
|
|
56485
56612
|
const backup = buildBackupPaths(ctx.dataDir);
|
|
56486
56613
|
const freshCopies = new Set;
|
|
@@ -59156,6 +59283,45 @@ log tail`);
|
|
|
59156
59283
|
};
|
|
59157
59284
|
}
|
|
59158
59285
|
|
|
59286
|
+
// packages/daemon/src/test-utils/vm/create-stub-uffd-handler.ts
|
|
59287
|
+
import { existsSync as existsSync34, readFileSync as readFileSync39, writeFileSync as writeFileSync16 } from "fs";
|
|
59288
|
+
import { join as join49 } from "path";
|
|
59289
|
+
import * as z99 from "zod";
|
|
59290
|
+
var StartSchema = z99.object({
|
|
59291
|
+
options: z99.object({
|
|
59292
|
+
socket: z99.string().optional(),
|
|
59293
|
+
uid: z99.string().optional(),
|
|
59294
|
+
gid: z99.string().optional()
|
|
59295
|
+
}),
|
|
59296
|
+
served: z99.string()
|
|
59297
|
+
});
|
|
59298
|
+
var WarmRunSchema = z99.object({
|
|
59299
|
+
mode: z99.enum(["--count-data", "--warm"]),
|
|
59300
|
+
memFile: z99.string(),
|
|
59301
|
+
pid: z99.int()
|
|
59302
|
+
});
|
|
59303
|
+
function createStubUffdHandler(directory, mode = "serve") {
|
|
59304
|
+
const path = join49(directory, `uffd-handler-${mode}`);
|
|
59305
|
+
const recorded = join49(directory, `uffd-handler-${mode}.starts`);
|
|
59306
|
+
const warmAnswer = join49(directory, `uffd-handler-${mode}.warm.json`);
|
|
59307
|
+
const script = join49(import.meta.dir, "run-stub-uffd-handler.ts");
|
|
59308
|
+
writeFileSync16(path, `#!/bin/sh
|
|
59309
|
+
exec '${process.execPath}' '${script}' '${mode}' '${recorded}' '${warmAnswer}' "$@"
|
|
59310
|
+
`, { mode: 493 });
|
|
59311
|
+
return {
|
|
59312
|
+
path,
|
|
59313
|
+
readStarts: () => readRecords(recorded, StartSchema),
|
|
59314
|
+
readWarmRuns: () => readRecords(`${recorded}.warms`, WarmRunSchema),
|
|
59315
|
+
answerWarm: (answer) => {
|
|
59316
|
+
writeFileSync16(warmAnswer, JSON.stringify(answer));
|
|
59317
|
+
}
|
|
59318
|
+
};
|
|
59319
|
+
}
|
|
59320
|
+
function readRecords(path, schema) {
|
|
59321
|
+
return existsSync34(path) ? readFileSync39(path, "utf8").trimEnd().split(`
|
|
59322
|
+
`).map((line) => schema.parse(JSON.parse(line))) : [];
|
|
59323
|
+
}
|
|
59324
|
+
|
|
59159
59325
|
// packages/daemon/src/test-utils/start-test-impd.ts
|
|
59160
59326
|
var FAKE_VM_RAM_MIB = 300;
|
|
59161
59327
|
var FAKE_VM_RSS_MIB = 340;
|
|
@@ -59172,6 +59338,9 @@ async function startTestImpd(stack, options = {}) {
|
|
|
59172
59338
|
if (options.dataDir === undefined) {
|
|
59173
59339
|
stack.defer(() => rm2(dataDir, { recursive: true, force: true }));
|
|
59174
59340
|
}
|
|
59341
|
+
const handlerDir = mkdtempSync(`${tmpdir()}/${formatRunPrefix(readRunOwner())}uffd-handler-`);
|
|
59342
|
+
stack.defer(() => rm2(handlerDir, { recursive: true, force: true }));
|
|
59343
|
+
const uffdHandler = createStubUffdHandler(handlerDir);
|
|
59175
59344
|
const db = await openMigratedCopy();
|
|
59176
59345
|
stack.defer(async () => {
|
|
59177
59346
|
await db.destroy();
|
|
@@ -59190,6 +59359,7 @@ async function startTestImpd(stack, options = {}) {
|
|
|
59190
59359
|
IMP_BROKER_PORT: String(ports.take()),
|
|
59191
59360
|
IMP_EGRESS_DNS_PORT: String(ports.take()),
|
|
59192
59361
|
IMP_SSH_PORT: "0",
|
|
59362
|
+
IMP_UFFD_HANDLER: uffdHandler.path,
|
|
59193
59363
|
...options.env
|
|
59194
59364
|
}),
|
|
59195
59365
|
defaultDiskBytes: 0
|
|
@@ -59224,7 +59394,7 @@ async function startTestImpd(stack, options = {}) {
|
|
|
59224
59394
|
const createSystemDrive = (drive) => {
|
|
59225
59395
|
const identity = buildTestIdentity(dataDir, drive);
|
|
59226
59396
|
mkdirSync31(buildSystemDrivesDir(dataDir), { recursive: true });
|
|
59227
|
-
|
|
59397
|
+
writeFileSync17(identity.systemDrivePath, drive);
|
|
59228
59398
|
return identity;
|
|
59229
59399
|
};
|
|
59230
59400
|
const host = { identity: createSystemDrive(TEST_DRIVE) };
|
|
@@ -59398,6 +59568,7 @@ async function startTestImpd(stack, options = {}) {
|
|
|
59398
59568
|
db,
|
|
59399
59569
|
dataDir,
|
|
59400
59570
|
fake,
|
|
59571
|
+
uffdHandler,
|
|
59401
59572
|
tickers,
|
|
59402
59573
|
taps,
|
|
59403
59574
|
removedTaps,
|
|
@@ -59416,7 +59587,7 @@ async function startTestImpd(stack, options = {}) {
|
|
|
59416
59587
|
clock.offsetMs += durationMs;
|
|
59417
59588
|
},
|
|
59418
59589
|
setClock: (nowMs) => {
|
|
59419
|
-
|
|
59590
|
+
invariant8(options.frozenClockMs !== undefined, "setClock needs a frozen clock");
|
|
59420
59591
|
clock.frozenAt = nowMs;
|
|
59421
59592
|
clock.offsetMs = 0;
|
|
59422
59593
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@impz/testing",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.9.0",
|
|
4
4
|
"description": "A real impd on stand-ins, for Bun tests of code that drives impd through @impz/client",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"ts-pattern": "^5.9.2",
|
|
44
44
|
"xstate": "^5.33.3",
|
|
45
45
|
"zod": "^4.6.7",
|
|
46
|
-
"@impz/client": "6.
|
|
46
|
+
"@impz/client": "6.9.0"
|
|
47
47
|
},
|
|
48
48
|
"engines": {
|
|
49
49
|
"bun": ">=1.4.3"
|