@boxes-dev/dvb 1.0.576 → 1.0.579
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/bin/dvb-update.cjs +268 -77
- package/dist/bin/dvb-update.cjs.map +4 -4
- package/dist/bin/dvb.cjs.map +2 -2
- package/dist/bin/dvbd.cjs.map +2 -2
- package/package.json +1 -1
package/dist/bin/dvb-update.cjs
CHANGED
|
@@ -24,14 +24,14 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
24
24
|
));
|
|
25
25
|
|
|
26
26
|
// src/bootstrap/runtimeManager.ts
|
|
27
|
-
var
|
|
28
|
-
var
|
|
27
|
+
var import_node_child_process2 = require("node:child_process");
|
|
28
|
+
var import_node_crypto3 = require("node:crypto");
|
|
29
29
|
var import_node_module = require("node:module");
|
|
30
|
-
var
|
|
31
|
-
var
|
|
30
|
+
var import_promises3 = __toESM(require("node:fs/promises"), 1);
|
|
31
|
+
var import_node_fs8 = require("node:fs");
|
|
32
32
|
var import_node_http = __toESM(require("node:http"), 1);
|
|
33
|
-
var
|
|
34
|
-
var
|
|
33
|
+
var import_node_os3 = __toESM(require("node:os"), 1);
|
|
34
|
+
var import_node_path12 = __toESM(require("node:path"), 1);
|
|
35
35
|
|
|
36
36
|
// ../../node_modules/tar/dist/esm/index.min.js
|
|
37
37
|
var import_events = __toESM(require("events"), 1);
|
|
@@ -3042,6 +3042,191 @@ var isSemverGreater = (candidateVersion, currentVersion) => {
|
|
|
3042
3042
|
return comparison !== null && comparison > 0;
|
|
3043
3043
|
};
|
|
3044
3044
|
|
|
3045
|
+
// src/bootstrap/standaloneManager.ts
|
|
3046
|
+
var import_node_child_process = require("node:child_process");
|
|
3047
|
+
var import_node_crypto2 = require("node:crypto");
|
|
3048
|
+
var import_node_fs7 = require("node:fs");
|
|
3049
|
+
var import_promises2 = __toESM(require("node:fs/promises"), 1);
|
|
3050
|
+
var import_node_os2 = __toESM(require("node:os"), 1);
|
|
3051
|
+
var import_node_path11 = __toESM(require("node:path"), 1);
|
|
3052
|
+
var DEFAULT_MANIFEST_URL = "https://deploy.boxes.dev/cli/latest.json";
|
|
3053
|
+
var resolveManifestUrl = () => {
|
|
3054
|
+
if ("https://deploy.boxes.dev/cli/latest.json") {
|
|
3055
|
+
return "https://deploy.boxes.dev/cli/latest.json";
|
|
3056
|
+
}
|
|
3057
|
+
return DEFAULT_MANIFEST_URL;
|
|
3058
|
+
};
|
|
3059
|
+
var isStandaloneMode = () => {
|
|
3060
|
+
const versionJsonPath = import_node_path11.default.join(
|
|
3061
|
+
import_node_path11.default.dirname(process.execPath),
|
|
3062
|
+
"version.json"
|
|
3063
|
+
);
|
|
3064
|
+
return (0, import_node_fs7.existsSync)(versionJsonPath);
|
|
3065
|
+
};
|
|
3066
|
+
var readLocalVersionMeta = () => {
|
|
3067
|
+
const versionJsonPath = import_node_path11.default.join(
|
|
3068
|
+
import_node_path11.default.dirname(process.execPath),
|
|
3069
|
+
"version.json"
|
|
3070
|
+
);
|
|
3071
|
+
if (!(0, import_node_fs7.existsSync)(versionJsonPath)) return null;
|
|
3072
|
+
try {
|
|
3073
|
+
return JSON.parse((0, import_node_fs7.readFileSync)(versionJsonPath, "utf-8"));
|
|
3074
|
+
} catch {
|
|
3075
|
+
return null;
|
|
3076
|
+
}
|
|
3077
|
+
};
|
|
3078
|
+
var resolveStandaloneDir = (homeDir) => import_node_path11.default.join(resolveDevboxDir(homeDir), "standalone");
|
|
3079
|
+
var resolveCurrentLink = (homeDir) => import_node_path11.default.join(resolveStandaloneDir(homeDir), "current");
|
|
3080
|
+
var checkStandaloneUpdate = async (homeDir = import_node_os2.default.homedir()) => {
|
|
3081
|
+
const local = readLocalVersionMeta();
|
|
3082
|
+
if (!local) return null;
|
|
3083
|
+
const manifestUrl = resolveManifestUrl();
|
|
3084
|
+
const res = await fetch(manifestUrl, {
|
|
3085
|
+
signal: AbortSignal.timeout(1e4)
|
|
3086
|
+
});
|
|
3087
|
+
if (!res.ok) {
|
|
3088
|
+
throw new Error(
|
|
3089
|
+
`Failed to fetch standalone manifest: ${res.status} ${res.statusText}`
|
|
3090
|
+
);
|
|
3091
|
+
}
|
|
3092
|
+
const manifest = await res.json();
|
|
3093
|
+
if (manifest.version === local.version) {
|
|
3094
|
+
return null;
|
|
3095
|
+
}
|
|
3096
|
+
const platformKey = `${local.platform}-${local.arch}`;
|
|
3097
|
+
const archive = manifest.archives?.[platformKey];
|
|
3098
|
+
if (!archive) {
|
|
3099
|
+
throw new Error(
|
|
3100
|
+
`No standalone archive for ${platformKey} in manifest v${manifest.version}`
|
|
3101
|
+
);
|
|
3102
|
+
}
|
|
3103
|
+
return {
|
|
3104
|
+
manifest,
|
|
3105
|
+
archive,
|
|
3106
|
+
currentVersion: local.version
|
|
3107
|
+
};
|
|
3108
|
+
};
|
|
3109
|
+
var downloadStandaloneUpdate = async (manifest, archive, homeDir = import_node_os2.default.homedir()) => {
|
|
3110
|
+
const standaloneDir = resolveStandaloneDir(homeDir);
|
|
3111
|
+
await import_promises2.default.mkdir(standaloneDir, { recursive: true });
|
|
3112
|
+
const local = readLocalVersionMeta();
|
|
3113
|
+
const platformKey = local ? `${local.platform}-${local.arch}` : `${process.platform}-${process.arch}`;
|
|
3114
|
+
const version = manifest.version;
|
|
3115
|
+
const versionDir = import_node_path11.default.join(standaloneDir, `${version}-${platformKey}`);
|
|
3116
|
+
const currentLink = resolveCurrentLink(homeDir);
|
|
3117
|
+
if ((0, import_node_fs7.existsSync)(import_node_path11.default.join(versionDir, "dvb"))) {
|
|
3118
|
+
await atomicSymlink(standaloneDir, currentLink, versionDir);
|
|
3119
|
+
return;
|
|
3120
|
+
}
|
|
3121
|
+
const tmpSuffix = `${version}-${platformKey}-${Date.now()}`;
|
|
3122
|
+
const tmpDir = import_node_path11.default.join(standaloneDir, `.tmp-${tmpSuffix}`);
|
|
3123
|
+
const tarballPath = import_node_path11.default.join(standaloneDir, `.download-${tmpSuffix}.tar.gz`);
|
|
3124
|
+
try {
|
|
3125
|
+
const res = await fetch(archive.url, {
|
|
3126
|
+
signal: AbortSignal.timeout(5 * 60 * 1e3)
|
|
3127
|
+
// 5 minute timeout for large download
|
|
3128
|
+
});
|
|
3129
|
+
if (!res.ok) {
|
|
3130
|
+
throw new Error(`Failed to download ${archive.url}: ${res.status}`);
|
|
3131
|
+
}
|
|
3132
|
+
const body = await res.arrayBuffer();
|
|
3133
|
+
(0, import_node_fs7.writeFileSync)(tarballPath, Buffer.from(body));
|
|
3134
|
+
const hash = (0, import_node_crypto2.createHash)("sha256");
|
|
3135
|
+
hash.update((0, import_node_fs7.readFileSync)(tarballPath));
|
|
3136
|
+
const actualHash = hash.digest("hex");
|
|
3137
|
+
if (actualHash !== archive.sha256) {
|
|
3138
|
+
throw new Error(
|
|
3139
|
+
`SHA256 mismatch: expected ${archive.sha256}, got ${actualHash}`
|
|
3140
|
+
);
|
|
3141
|
+
}
|
|
3142
|
+
await import_promises2.default.mkdir(tmpDir, { recursive: true });
|
|
3143
|
+
(0, import_node_child_process.execFileSync)("tar", [
|
|
3144
|
+
"xzf",
|
|
3145
|
+
tarballPath,
|
|
3146
|
+
"-C",
|
|
3147
|
+
tmpDir,
|
|
3148
|
+
"--strip-components=1"
|
|
3149
|
+
]);
|
|
3150
|
+
try {
|
|
3151
|
+
(0, import_node_child_process.execFileSync)(import_node_path11.default.join(tmpDir, "dvb"), ["--help"], {
|
|
3152
|
+
stdio: "pipe",
|
|
3153
|
+
timeout: 15e3
|
|
3154
|
+
});
|
|
3155
|
+
} catch (err) {
|
|
3156
|
+
const exitErr = err;
|
|
3157
|
+
throw new Error(
|
|
3158
|
+
`Validation failed: dvb --help exited with code ${exitErr.status}`
|
|
3159
|
+
);
|
|
3160
|
+
}
|
|
3161
|
+
if ((0, import_node_fs7.existsSync)(versionDir)) {
|
|
3162
|
+
await import_promises2.default.rm(versionDir, { recursive: true });
|
|
3163
|
+
}
|
|
3164
|
+
await import_promises2.default.rename(tmpDir, versionDir);
|
|
3165
|
+
await atomicSymlink(standaloneDir, currentLink, versionDir);
|
|
3166
|
+
await pruneOldVersions(standaloneDir, version, platformKey);
|
|
3167
|
+
} finally {
|
|
3168
|
+
try {
|
|
3169
|
+
await import_promises2.default.rm(tmpDir, { recursive: true, force: true });
|
|
3170
|
+
} catch {
|
|
3171
|
+
}
|
|
3172
|
+
try {
|
|
3173
|
+
await import_promises2.default.unlink(tarballPath);
|
|
3174
|
+
} catch {
|
|
3175
|
+
}
|
|
3176
|
+
}
|
|
3177
|
+
};
|
|
3178
|
+
var updateStandaloneOnce = async (homeDir = import_node_os2.default.homedir()) => {
|
|
3179
|
+
const check = await checkStandaloneUpdate(homeDir);
|
|
3180
|
+
if (!check) {
|
|
3181
|
+
const local = readLocalVersionMeta();
|
|
3182
|
+
return {
|
|
3183
|
+
changed: false,
|
|
3184
|
+
previousVersion: local?.version ?? null,
|
|
3185
|
+
currentVersion: local?.version ?? "unknown"
|
|
3186
|
+
};
|
|
3187
|
+
}
|
|
3188
|
+
await downloadStandaloneUpdate(check.manifest, check.archive, homeDir);
|
|
3189
|
+
return {
|
|
3190
|
+
changed: true,
|
|
3191
|
+
previousVersion: check.currentVersion,
|
|
3192
|
+
currentVersion: check.manifest.version
|
|
3193
|
+
};
|
|
3194
|
+
};
|
|
3195
|
+
var atomicSymlink = async (parentDir, linkPath, target) => {
|
|
3196
|
+
const relTarget = import_node_path11.default.relative(parentDir, target);
|
|
3197
|
+
const tmpLink = import_node_path11.default.join(parentDir, `.current-tmp-${Date.now()}`);
|
|
3198
|
+
try {
|
|
3199
|
+
await import_promises2.default.symlink(relTarget, tmpLink);
|
|
3200
|
+
await import_promises2.default.rename(tmpLink, linkPath);
|
|
3201
|
+
} catch {
|
|
3202
|
+
try {
|
|
3203
|
+
await import_promises2.default.unlink(tmpLink);
|
|
3204
|
+
} catch {
|
|
3205
|
+
}
|
|
3206
|
+
try {
|
|
3207
|
+
await import_promises2.default.unlink(linkPath);
|
|
3208
|
+
} catch {
|
|
3209
|
+
}
|
|
3210
|
+
await import_promises2.default.symlink(relTarget, linkPath);
|
|
3211
|
+
}
|
|
3212
|
+
};
|
|
3213
|
+
var pruneOldVersions = async (standaloneDir, currentVersion, platformKey) => {
|
|
3214
|
+
try {
|
|
3215
|
+
const entries = await import_promises2.default.readdir(standaloneDir, { withFileTypes: true });
|
|
3216
|
+
const versionDirs = entries.filter(
|
|
3217
|
+
(e) => e.isDirectory() && !e.name.startsWith(".") && e.name !== "current" && e.name.endsWith(`-${platformKey}`)
|
|
3218
|
+
).map((e) => e.name).sort().reverse();
|
|
3219
|
+
const toRemove = versionDirs.slice(2);
|
|
3220
|
+
for (const dir of toRemove) {
|
|
3221
|
+
await import_promises2.default.rm(import_node_path11.default.join(standaloneDir, dir), {
|
|
3222
|
+
recursive: true,
|
|
3223
|
+
force: true
|
|
3224
|
+
});
|
|
3225
|
+
}
|
|
3226
|
+
} catch {
|
|
3227
|
+
}
|
|
3228
|
+
};
|
|
3229
|
+
|
|
3045
3230
|
// src/bootstrap/runtimeManager.ts
|
|
3046
3231
|
var MIN_NODE_MAJOR = 22;
|
|
3047
3232
|
var RUNTIME_PACKAGE_NAME = "@boxes-dev/dvb-runtime";
|
|
@@ -3070,10 +3255,10 @@ var resolveBasePath = () => {
|
|
|
3070
3255
|
return __filename;
|
|
3071
3256
|
}
|
|
3072
3257
|
const argv1 = typeof process.argv[1] === "string" ? process.argv[1] : "";
|
|
3073
|
-
return argv1 ||
|
|
3258
|
+
return argv1 || import_node_path12.default.join(process.cwd(), "dvb");
|
|
3074
3259
|
};
|
|
3075
3260
|
var readJsonFile = async (filePath) => {
|
|
3076
|
-
const raw = await
|
|
3261
|
+
const raw = await import_promises3.default.readFile(filePath, "utf8");
|
|
3077
3262
|
return JSON.parse(raw);
|
|
3078
3263
|
};
|
|
3079
3264
|
var readJsonFileIfExists = async (filePath) => {
|
|
@@ -3088,14 +3273,14 @@ var readJsonFileIfExists = async (filePath) => {
|
|
|
3088
3273
|
};
|
|
3089
3274
|
var writeJsonFileAtomic = async (filePath, value) => {
|
|
3090
3275
|
const tempPath = `${filePath}.tmp-${process.pid}-${Date.now()}`;
|
|
3091
|
-
await
|
|
3092
|
-
await
|
|
3093
|
-
await
|
|
3276
|
+
await import_promises3.default.mkdir(import_node_path12.default.dirname(filePath), { recursive: true, mode: 448 });
|
|
3277
|
+
await import_promises3.default.writeFile(tempPath, JSON.stringify(value, null, 2), "utf8");
|
|
3278
|
+
await import_promises3.default.rename(tempPath, filePath);
|
|
3094
3279
|
};
|
|
3095
3280
|
var readStageVersion = async (runtimeDir) => {
|
|
3096
3281
|
try {
|
|
3097
3282
|
const manifest = await readJsonFile(
|
|
3098
|
-
|
|
3283
|
+
import_node_path12.default.join(runtimeDir, "package.json")
|
|
3099
3284
|
);
|
|
3100
3285
|
if (typeof manifest.version !== "string") return null;
|
|
3101
3286
|
const version = manifest.version.trim();
|
|
@@ -3104,25 +3289,25 @@ var readStageVersion = async (runtimeDir) => {
|
|
|
3104
3289
|
return null;
|
|
3105
3290
|
}
|
|
3106
3291
|
};
|
|
3107
|
-
var resolveRuntimeBinPath = (runtimeDir, kind) =>
|
|
3292
|
+
var resolveRuntimeBinPath = (runtimeDir, kind) => import_node_path12.default.join(runtimeDir, "dist", "bin", `${kind}.cjs`);
|
|
3108
3293
|
var readLinkedRuntimeVersion = async (linkPath) => {
|
|
3109
3294
|
try {
|
|
3110
|
-
const runtimeDir = await
|
|
3111
|
-
const version =
|
|
3295
|
+
const runtimeDir = await import_promises3.default.realpath(linkPath);
|
|
3296
|
+
const version = import_node_path12.default.basename(runtimeDir).trim();
|
|
3112
3297
|
return version.length > 0 ? version : null;
|
|
3113
3298
|
} catch {
|
|
3114
3299
|
return null;
|
|
3115
3300
|
}
|
|
3116
3301
|
};
|
|
3117
|
-
var readCurrentRuntime = async (homeDir =
|
|
3302
|
+
var readCurrentRuntime = async (homeDir = import_node_os3.default.homedir()) => {
|
|
3118
3303
|
const currentLink = resolveCurrentRuntimeLink(homeDir);
|
|
3119
3304
|
try {
|
|
3120
|
-
const runtimeDir = await
|
|
3305
|
+
const runtimeDir = await import_promises3.default.realpath(currentLink);
|
|
3121
3306
|
const version = await readStageVersion(runtimeDir);
|
|
3122
3307
|
if (!version) return null;
|
|
3123
3308
|
const dvbBin = resolveRuntimeBinPath(runtimeDir, "dvb");
|
|
3124
3309
|
const dvbdBin = resolveRuntimeBinPath(runtimeDir, "dvbd");
|
|
3125
|
-
if (!(0,
|
|
3310
|
+
if (!(0, import_node_fs8.existsSync)(dvbBin) || !(0, import_node_fs8.existsSync)(dvbdBin)) {
|
|
3126
3311
|
return null;
|
|
3127
3312
|
}
|
|
3128
3313
|
return { version, runtimeDir };
|
|
@@ -3130,9 +3315,9 @@ var readCurrentRuntime = async (homeDir = import_node_os2.default.homedir()) =>
|
|
|
3130
3315
|
return null;
|
|
3131
3316
|
}
|
|
3132
3317
|
};
|
|
3133
|
-
var listLiveRuntimeVersions = async (homeDir =
|
|
3318
|
+
var listLiveRuntimeVersions = async (homeDir = import_node_os3.default.homedir()) => {
|
|
3134
3319
|
const releasesDir = resolveRuntimeReleasesDir(homeDir);
|
|
3135
|
-
const ps2 = (0,
|
|
3320
|
+
const ps2 = (0, import_node_child_process2.spawnSync)("ps", ["eww", "-Ao", "command="], {
|
|
3136
3321
|
encoding: "utf8"
|
|
3137
3322
|
});
|
|
3138
3323
|
if (ps2.error || ps2.status !== 0 || typeof ps2.stdout !== "string") {
|
|
@@ -3154,7 +3339,7 @@ var listLiveRuntimeVersions = async (homeDir = import_node_os2.default.homedir()
|
|
|
3154
3339
|
}
|
|
3155
3340
|
return [...versions];
|
|
3156
3341
|
};
|
|
3157
|
-
var pruneRuntimeReleases = async (homeDir =
|
|
3342
|
+
var pruneRuntimeReleases = async (homeDir = import_node_os3.default.homedir()) => {
|
|
3158
3343
|
const releasesDir = resolveRuntimeReleasesDir(homeDir);
|
|
3159
3344
|
const keep = /* @__PURE__ */ new Set();
|
|
3160
3345
|
const current = await readCurrentRuntime(homeDir);
|
|
@@ -3175,7 +3360,7 @@ var pruneRuntimeReleases = async (homeDir = import_node_os2.default.homedir()) =
|
|
|
3175
3360
|
}
|
|
3176
3361
|
}
|
|
3177
3362
|
try {
|
|
3178
|
-
const entries = await
|
|
3363
|
+
const entries = await import_promises3.default.readdir(releasesDir, { withFileTypes: true });
|
|
3179
3364
|
for (const entry of entries) {
|
|
3180
3365
|
if (!entry.isDirectory()) {
|
|
3181
3366
|
continue;
|
|
@@ -3186,7 +3371,7 @@ var pruneRuntimeReleases = async (homeDir = import_node_os2.default.homedir()) =
|
|
|
3186
3371
|
if (keep.has(entry.name)) {
|
|
3187
3372
|
continue;
|
|
3188
3373
|
}
|
|
3189
|
-
await
|
|
3374
|
+
await import_promises3.default.rm(import_node_path12.default.join(releasesDir, entry.name), {
|
|
3190
3375
|
recursive: true,
|
|
3191
3376
|
force: true
|
|
3192
3377
|
});
|
|
@@ -3201,7 +3386,7 @@ var pruneRuntimeReleases = async (homeDir = import_node_os2.default.homedir()) =
|
|
|
3201
3386
|
var resolveBundledRuntimeRoot = () => {
|
|
3202
3387
|
const require2 = (0, import_node_module.createRequire)(resolveBasePath());
|
|
3203
3388
|
const manifestPath = require2.resolve(`${RUNTIME_PACKAGE_NAME}/package.json`);
|
|
3204
|
-
return
|
|
3389
|
+
return import_node_path12.default.dirname(manifestPath);
|
|
3205
3390
|
};
|
|
3206
3391
|
var readBundledRuntime = async () => {
|
|
3207
3392
|
const runtimeDir = resolveBundledRuntimeRoot();
|
|
@@ -3211,20 +3396,20 @@ var readBundledRuntime = async () => {
|
|
|
3211
3396
|
}
|
|
3212
3397
|
return { version, runtimeDir };
|
|
3213
3398
|
};
|
|
3214
|
-
var ensureReleasesDir = async (homeDir =
|
|
3399
|
+
var ensureReleasesDir = async (homeDir = import_node_os3.default.homedir()) => {
|
|
3215
3400
|
const releasesDir = resolveRuntimeReleasesDir(homeDir);
|
|
3216
|
-
await
|
|
3401
|
+
await import_promises3.default.mkdir(releasesDir, { recursive: true, mode: 448 });
|
|
3217
3402
|
try {
|
|
3218
|
-
await
|
|
3403
|
+
await import_promises3.default.chmod(releasesDir, 448);
|
|
3219
3404
|
} catch {
|
|
3220
3405
|
}
|
|
3221
3406
|
return releasesDir;
|
|
3222
3407
|
};
|
|
3223
|
-
var ensureUpdaterDir = async (homeDir =
|
|
3408
|
+
var ensureUpdaterDir = async (homeDir = import_node_os3.default.homedir()) => {
|
|
3224
3409
|
const updaterDir = resolveUpdaterDir(homeDir);
|
|
3225
|
-
await
|
|
3410
|
+
await import_promises3.default.mkdir(updaterDir, { recursive: true, mode: 448 });
|
|
3226
3411
|
try {
|
|
3227
|
-
await
|
|
3412
|
+
await import_promises3.default.chmod(updaterDir, 448);
|
|
3228
3413
|
} catch {
|
|
3229
3414
|
}
|
|
3230
3415
|
return updaterDir;
|
|
@@ -3246,23 +3431,23 @@ var isProcessAlive = (pid) => {
|
|
|
3246
3431
|
return code === "EPERM";
|
|
3247
3432
|
}
|
|
3248
3433
|
};
|
|
3249
|
-
var createStageDir = async (version, homeDir =
|
|
3434
|
+
var createStageDir = async (version, homeDir = import_node_os3.default.homedir()) => {
|
|
3250
3435
|
const releasesDir = await ensureReleasesDir(homeDir);
|
|
3251
|
-
return await
|
|
3252
|
-
|
|
3436
|
+
return await import_promises3.default.mkdtemp(
|
|
3437
|
+
import_node_path12.default.join(
|
|
3253
3438
|
releasesDir,
|
|
3254
3439
|
`.tmp-${version.replace(/[^a-zA-Z0-9._-]+/g, "-")}-`
|
|
3255
3440
|
)
|
|
3256
3441
|
);
|
|
3257
3442
|
};
|
|
3258
3443
|
var copyBundledRuntimeToStage = async (bundled, stageDir) => {
|
|
3259
|
-
await
|
|
3260
|
-
|
|
3261
|
-
|
|
3444
|
+
await import_promises3.default.copyFile(
|
|
3445
|
+
import_node_path12.default.join(bundled.runtimeDir, "package.json"),
|
|
3446
|
+
import_node_path12.default.join(stageDir, "package.json")
|
|
3262
3447
|
);
|
|
3263
|
-
await
|
|
3264
|
-
|
|
3265
|
-
|
|
3448
|
+
await import_promises3.default.cp(
|
|
3449
|
+
import_node_path12.default.join(bundled.runtimeDir, "dist"),
|
|
3450
|
+
import_node_path12.default.join(stageDir, "dist"),
|
|
3266
3451
|
{
|
|
3267
3452
|
recursive: true
|
|
3268
3453
|
}
|
|
@@ -3299,7 +3484,7 @@ var downloadTarball = async (url, filePath) => {
|
|
|
3299
3484
|
throw new Error(`Runtime tarball download failed with ${response.status}.`);
|
|
3300
3485
|
}
|
|
3301
3486
|
const buffer = Buffer.from(await response.arrayBuffer());
|
|
3302
|
-
await
|
|
3487
|
+
await import_promises3.default.writeFile(filePath, buffer);
|
|
3303
3488
|
};
|
|
3304
3489
|
var extractRuntimeTarballToStage = async (tarballPath, stageDir) => {
|
|
3305
3490
|
await lo({
|
|
@@ -3444,21 +3629,21 @@ var terminateChild = async (child) => {
|
|
|
3444
3629
|
});
|
|
3445
3630
|
};
|
|
3446
3631
|
var validateRuntimeStage = async (stageDir, expectedVersion) => {
|
|
3447
|
-
const socketDir =
|
|
3632
|
+
const socketDir = import_node_path12.default.join(
|
|
3448
3633
|
"/tmp",
|
|
3449
|
-
`dvb-runtime-validate-${process.pid}-${(0,
|
|
3634
|
+
`dvb-runtime-validate-${process.pid}-${(0, import_node_crypto3.randomUUID)().slice(0, 8)}`
|
|
3450
3635
|
);
|
|
3451
|
-
const socketPath =
|
|
3636
|
+
const socketPath = import_node_path12.default.join(socketDir, "devboxd.sock");
|
|
3452
3637
|
const daemonBinPath = resolveRuntimeBinPath(stageDir, "dvbd");
|
|
3453
|
-
if (!(0,
|
|
3638
|
+
if (!(0, import_node_fs8.existsSync)(daemonBinPath)) {
|
|
3454
3639
|
throw new Error(`Runtime stage is missing ${daemonBinPath}.`);
|
|
3455
3640
|
}
|
|
3456
3641
|
const cliBinPath = resolveRuntimeBinPath(stageDir, "dvb");
|
|
3457
|
-
if (!(0,
|
|
3642
|
+
if (!(0, import_node_fs8.existsSync)(cliBinPath)) {
|
|
3458
3643
|
throw new Error(`Runtime stage is missing ${cliBinPath}.`);
|
|
3459
3644
|
}
|
|
3460
|
-
await
|
|
3461
|
-
const child = (0,
|
|
3645
|
+
await import_promises3.default.mkdir(socketDir, { recursive: true, mode: 448 });
|
|
3646
|
+
const child = (0, import_node_child_process2.spawn)(process.execPath, [daemonBinPath], {
|
|
3462
3647
|
env: {
|
|
3463
3648
|
...process.env,
|
|
3464
3649
|
DEVBOX_SOCKET_PATH: socketPath
|
|
@@ -3479,9 +3664,9 @@ var validateRuntimeStage = async (stageDir, expectedVersion) => {
|
|
|
3479
3664
|
`Runtime stage reported version ${validated.version}; expected ${expectedVersion}.`
|
|
3480
3665
|
);
|
|
3481
3666
|
}
|
|
3482
|
-
const cliHomeDir =
|
|
3483
|
-
await
|
|
3484
|
-
const cliChild = (0,
|
|
3667
|
+
const cliHomeDir = import_node_path12.default.join(socketDir, "home");
|
|
3668
|
+
await import_promises3.default.mkdir(cliHomeDir, { recursive: true, mode: 448 });
|
|
3669
|
+
const cliChild = (0, import_node_child_process2.spawn)(process.execPath, [cliBinPath, "--help"], {
|
|
3485
3670
|
env: {
|
|
3486
3671
|
...process.env,
|
|
3487
3672
|
HOME: cliHomeDir
|
|
@@ -3502,22 +3687,22 @@ var validateRuntimeStage = async (stageDir, expectedVersion) => {
|
|
|
3502
3687
|
}
|
|
3503
3688
|
} finally {
|
|
3504
3689
|
await terminateChild(child);
|
|
3505
|
-
await
|
|
3690
|
+
await import_promises3.default.rm(socketDir, { recursive: true, force: true });
|
|
3506
3691
|
}
|
|
3507
3692
|
};
|
|
3508
3693
|
var writeSymlinkAtomic = async (linkPath, target) => {
|
|
3509
3694
|
const tempPath = `${linkPath}.tmp-${process.pid}-${Date.now()}`;
|
|
3510
|
-
await
|
|
3695
|
+
await import_promises3.default.symlink(target, tempPath);
|
|
3511
3696
|
try {
|
|
3512
|
-
await
|
|
3697
|
+
await import_promises3.default.rename(tempPath, linkPath);
|
|
3513
3698
|
} catch (error) {
|
|
3514
|
-
await
|
|
3515
|
-
await
|
|
3699
|
+
await import_promises3.default.rm(linkPath, { recursive: true, force: true });
|
|
3700
|
+
await import_promises3.default.rename(tempPath, linkPath);
|
|
3516
3701
|
if (error instanceof Error) {
|
|
3517
3702
|
}
|
|
3518
3703
|
}
|
|
3519
3704
|
};
|
|
3520
|
-
var writeUpdaterHeartbeat = async (homeDir =
|
|
3705
|
+
var writeUpdaterHeartbeat = async (homeDir = import_node_os3.default.homedir()) => {
|
|
3521
3706
|
const current = await readJsonFileIfExists(
|
|
3522
3707
|
resolveUpdaterDaemonPath(homeDir)
|
|
3523
3708
|
);
|
|
@@ -3529,7 +3714,7 @@ var writeUpdaterHeartbeat = async (homeDir = import_node_os2.default.homedir())
|
|
|
3529
3714
|
heartbeatAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
3530
3715
|
});
|
|
3531
3716
|
};
|
|
3532
|
-
var claimUpdaterDaemon = async (homeDir =
|
|
3717
|
+
var claimUpdaterDaemon = async (homeDir = import_node_os3.default.homedir()) => {
|
|
3533
3718
|
await ensureUpdaterDir(homeDir);
|
|
3534
3719
|
const daemonPath = resolveUpdaterDaemonPath(homeDir);
|
|
3535
3720
|
const record = {
|
|
@@ -3540,7 +3725,7 @@ var claimUpdaterDaemon = async (homeDir = import_node_os2.default.homedir()) =>
|
|
|
3540
3725
|
};
|
|
3541
3726
|
for (let attempt = 0; attempt < 2; attempt += 1) {
|
|
3542
3727
|
try {
|
|
3543
|
-
await
|
|
3728
|
+
await import_promises3.default.writeFile(daemonPath, JSON.stringify(record, null, 2), {
|
|
3544
3729
|
encoding: "utf8",
|
|
3545
3730
|
flag: "wx"
|
|
3546
3731
|
});
|
|
@@ -3554,20 +3739,20 @@ var claimUpdaterDaemon = async (homeDir = import_node_os2.default.homedir()) =>
|
|
|
3554
3739
|
if (existing && isProcessAlive(existing.pid)) {
|
|
3555
3740
|
return false;
|
|
3556
3741
|
}
|
|
3557
|
-
await
|
|
3742
|
+
await import_promises3.default.rm(daemonPath, { force: true });
|
|
3558
3743
|
}
|
|
3559
3744
|
}
|
|
3560
3745
|
return false;
|
|
3561
3746
|
};
|
|
3562
|
-
var releaseUpdaterDaemon = async (homeDir =
|
|
3747
|
+
var releaseUpdaterDaemon = async (homeDir = import_node_os3.default.homedir()) => {
|
|
3563
3748
|
const daemonPath = resolveUpdaterDaemonPath(homeDir);
|
|
3564
3749
|
const current = await readJsonFileIfExists(daemonPath);
|
|
3565
3750
|
if (!current || current.pid !== process.pid) {
|
|
3566
3751
|
return;
|
|
3567
3752
|
}
|
|
3568
|
-
await
|
|
3753
|
+
await import_promises3.default.rm(daemonPath, { force: true });
|
|
3569
3754
|
};
|
|
3570
|
-
var writeUpdaterState = async (state, homeDir =
|
|
3755
|
+
var writeUpdaterState = async (state, homeDir = import_node_os3.default.homedir()) => {
|
|
3571
3756
|
await ensureUpdaterDir(homeDir);
|
|
3572
3757
|
await writeJsonFileAtomic(resolveUpdaterStatePath(homeDir), state);
|
|
3573
3758
|
};
|
|
@@ -3583,12 +3768,12 @@ var waitWithShutdown = async (shutdown, timeoutMs) => {
|
|
|
3583
3768
|
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
3584
3769
|
}
|
|
3585
3770
|
};
|
|
3586
|
-
var promoteRuntimeStage = async (stageDir, version, homeDir =
|
|
3771
|
+
var promoteRuntimeStage = async (stageDir, version, homeDir = import_node_os3.default.homedir()) => {
|
|
3587
3772
|
const previous = await readCurrentRuntime(homeDir);
|
|
3588
3773
|
const versionDir = resolveRuntimeVersionDir(version, homeDir);
|
|
3589
3774
|
if (stageDir !== versionDir) {
|
|
3590
|
-
await
|
|
3591
|
-
await
|
|
3775
|
+
await import_promises3.default.rm(versionDir, { recursive: true, force: true });
|
|
3776
|
+
await import_promises3.default.rename(stageDir, versionDir);
|
|
3592
3777
|
}
|
|
3593
3778
|
if (previous && previous.version !== version) {
|
|
3594
3779
|
await writeSymlinkAtomic(
|
|
@@ -3602,7 +3787,7 @@ var promoteRuntimeStage = async (stageDir, version, homeDir = import_node_os2.de
|
|
|
3602
3787
|
} catch {
|
|
3603
3788
|
}
|
|
3604
3789
|
};
|
|
3605
|
-
var installBundledRuntime = async (bundled, homeDir =
|
|
3790
|
+
var installBundledRuntime = async (bundled, homeDir = import_node_os3.default.homedir()) => {
|
|
3606
3791
|
const stageDir = await createStageDir(bundled.version, homeDir);
|
|
3607
3792
|
try {
|
|
3608
3793
|
await copyBundledRuntimeToStage(bundled, stageDir);
|
|
@@ -3613,21 +3798,21 @@ var installBundledRuntime = async (bundled, homeDir = import_node_os2.default.ho
|
|
|
3613
3798
|
runtimeDir: resolveRuntimeVersionDir(bundled.version, homeDir)
|
|
3614
3799
|
};
|
|
3615
3800
|
} catch (error) {
|
|
3616
|
-
await
|
|
3801
|
+
await import_promises3.default.rm(stageDir, { recursive: true, force: true });
|
|
3617
3802
|
throw error;
|
|
3618
3803
|
}
|
|
3619
3804
|
};
|
|
3620
|
-
var installDownloadedRuntime = async (manifest, homeDir =
|
|
3805
|
+
var installDownloadedRuntime = async (manifest, homeDir = import_node_os3.default.homedir()) => {
|
|
3621
3806
|
const tarball = manifest.dist?.tarball?.trim();
|
|
3622
3807
|
if (!tarball) {
|
|
3623
3808
|
throw new Error("Runtime manifest is missing dist.tarball.");
|
|
3624
3809
|
}
|
|
3625
3810
|
const stageDir = await createStageDir(manifest.version, homeDir);
|
|
3626
|
-
const tarballPath =
|
|
3811
|
+
const tarballPath = import_node_path12.default.join(stageDir, "runtime.tgz");
|
|
3627
3812
|
try {
|
|
3628
3813
|
await downloadTarball(tarball, tarballPath);
|
|
3629
3814
|
await extractRuntimeTarballToStage(tarballPath, stageDir);
|
|
3630
|
-
await
|
|
3815
|
+
await import_promises3.default.rm(tarballPath, { force: true });
|
|
3631
3816
|
await validateRuntimeStage(stageDir, manifest.version);
|
|
3632
3817
|
await promoteRuntimeStage(stageDir, manifest.version, homeDir);
|
|
3633
3818
|
return {
|
|
@@ -3635,11 +3820,11 @@ var installDownloadedRuntime = async (manifest, homeDir = import_node_os2.defaul
|
|
|
3635
3820
|
runtimeDir: resolveRuntimeVersionDir(manifest.version, homeDir)
|
|
3636
3821
|
};
|
|
3637
3822
|
} catch (error) {
|
|
3638
|
-
await
|
|
3823
|
+
await import_promises3.default.rm(stageDir, { recursive: true, force: true });
|
|
3639
3824
|
throw error;
|
|
3640
3825
|
}
|
|
3641
3826
|
};
|
|
3642
|
-
var ensureBundledRuntimeStaged = async (homeDir =
|
|
3827
|
+
var ensureBundledRuntimeStaged = async (homeDir = import_node_os3.default.homedir()) => {
|
|
3643
3828
|
const bundled = await readBundledRuntime();
|
|
3644
3829
|
const current = await readCurrentRuntime(homeDir);
|
|
3645
3830
|
if (current && compareSemver(current.version, bundled.version) === 0) {
|
|
@@ -3657,7 +3842,7 @@ var ensureBundledRuntimeStaged = async (homeDir = import_node_os2.default.homedi
|
|
|
3657
3842
|
throw error;
|
|
3658
3843
|
}
|
|
3659
3844
|
};
|
|
3660
|
-
var updateRuntimeOnce = async (homeDir = process.env.HOME?.trim() ||
|
|
3845
|
+
var updateRuntimeOnce = async (homeDir = process.env.HOME?.trim() || import_node_os3.default.homedir()) => {
|
|
3661
3846
|
assertNodeVersion();
|
|
3662
3847
|
const bundled = await readBundledRuntime();
|
|
3663
3848
|
const current = await ensureBundledRuntimeStaged(homeDir);
|
|
@@ -3678,7 +3863,7 @@ var updateRuntimeOnce = async (homeDir = process.env.HOME?.trim() || import_node
|
|
|
3678
3863
|
source: "downloaded"
|
|
3679
3864
|
};
|
|
3680
3865
|
};
|
|
3681
|
-
var writeUpdatePassState = async (result, homeDir =
|
|
3866
|
+
var writeUpdatePassState = async (result, homeDir = import_node_os3.default.homedir()) => {
|
|
3682
3867
|
await writeUpdaterState(
|
|
3683
3868
|
{
|
|
3684
3869
|
status: "ok",
|
|
@@ -3691,7 +3876,7 @@ var writeUpdatePassState = async (result, homeDir = import_node_os2.default.home
|
|
|
3691
3876
|
homeDir
|
|
3692
3877
|
);
|
|
3693
3878
|
};
|
|
3694
|
-
var writeUpdatePassErrorState = async (currentVersion, error, homeDir =
|
|
3879
|
+
var writeUpdatePassErrorState = async (currentVersion, error, homeDir = import_node_os3.default.homedir()) => {
|
|
3695
3880
|
await writeUpdaterState(
|
|
3696
3881
|
{
|
|
3697
3882
|
status: "error",
|
|
@@ -3704,7 +3889,7 @@ var writeUpdatePassErrorState = async (currentVersion, error, homeDir = import_n
|
|
|
3704
3889
|
homeDir
|
|
3705
3890
|
);
|
|
3706
3891
|
};
|
|
3707
|
-
var runUpdaterPass = async (homeDir =
|
|
3892
|
+
var runUpdaterPass = async (homeDir = import_node_os3.default.homedir()) => {
|
|
3708
3893
|
const current = await readCurrentRuntime(homeDir);
|
|
3709
3894
|
try {
|
|
3710
3895
|
const result = await updateRuntimeOnce(homeDir);
|
|
@@ -3715,7 +3900,7 @@ var runUpdaterPass = async (homeDir = import_node_os2.default.homedir()) => {
|
|
|
3715
3900
|
throw error;
|
|
3716
3901
|
}
|
|
3717
3902
|
};
|
|
3718
|
-
var runBackgroundUpdaterDaemon = async (homeDir = process.env.HOME?.trim() ||
|
|
3903
|
+
var runBackgroundUpdaterDaemon = async (homeDir = process.env.HOME?.trim() || import_node_os3.default.homedir()) => {
|
|
3719
3904
|
assertNodeVersion();
|
|
3720
3905
|
const claimed = await claimUpdaterDaemon(homeDir);
|
|
3721
3906
|
if (!claimed) {
|
|
@@ -3735,6 +3920,12 @@ var runBackgroundUpdaterDaemon = async (homeDir = process.env.HOME?.trim() || im
|
|
|
3735
3920
|
await runUpdaterPass(homeDir);
|
|
3736
3921
|
} catch {
|
|
3737
3922
|
}
|
|
3923
|
+
if (isStandaloneMode()) {
|
|
3924
|
+
try {
|
|
3925
|
+
await updateStandaloneOnce(homeDir);
|
|
3926
|
+
} catch {
|
|
3927
|
+
}
|
|
3928
|
+
}
|
|
3738
3929
|
await writeUpdaterHeartbeat(homeDir);
|
|
3739
3930
|
await waitWithShutdown(shutdown, UPDATER_INTERVAL_MS);
|
|
3740
3931
|
}
|