@boxes-dev/dvb 1.0.576 → 1.0.578
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 +259 -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,182 @@ 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(import_node_path11.default.dirname(process.execPath), "version.json");
|
|
3061
|
+
return (0, import_node_fs7.existsSync)(versionJsonPath);
|
|
3062
|
+
};
|
|
3063
|
+
var readLocalVersionMeta = () => {
|
|
3064
|
+
const versionJsonPath = import_node_path11.default.join(import_node_path11.default.dirname(process.execPath), "version.json");
|
|
3065
|
+
if (!(0, import_node_fs7.existsSync)(versionJsonPath)) return null;
|
|
3066
|
+
try {
|
|
3067
|
+
return JSON.parse((0, import_node_fs7.readFileSync)(versionJsonPath, "utf-8"));
|
|
3068
|
+
} catch {
|
|
3069
|
+
return null;
|
|
3070
|
+
}
|
|
3071
|
+
};
|
|
3072
|
+
var resolveStandaloneDir = (homeDir) => import_node_path11.default.join(resolveDevboxDir(homeDir), "standalone");
|
|
3073
|
+
var resolveCurrentLink = (homeDir) => import_node_path11.default.join(resolveStandaloneDir(homeDir), "current");
|
|
3074
|
+
var checkStandaloneUpdate = async (homeDir = import_node_os2.default.homedir()) => {
|
|
3075
|
+
const local = readLocalVersionMeta();
|
|
3076
|
+
if (!local) return null;
|
|
3077
|
+
const manifestUrl = resolveManifestUrl();
|
|
3078
|
+
const res = await fetch(manifestUrl, {
|
|
3079
|
+
signal: AbortSignal.timeout(1e4)
|
|
3080
|
+
});
|
|
3081
|
+
if (!res.ok) {
|
|
3082
|
+
throw new Error(
|
|
3083
|
+
`Failed to fetch standalone manifest: ${res.status} ${res.statusText}`
|
|
3084
|
+
);
|
|
3085
|
+
}
|
|
3086
|
+
const manifest = await res.json();
|
|
3087
|
+
if (manifest.version === local.version) {
|
|
3088
|
+
return null;
|
|
3089
|
+
}
|
|
3090
|
+
const platformKey = `${local.platform}-${local.arch}`;
|
|
3091
|
+
const archive = manifest.archives?.[platformKey];
|
|
3092
|
+
if (!archive) {
|
|
3093
|
+
throw new Error(
|
|
3094
|
+
`No standalone archive for ${platformKey} in manifest v${manifest.version}`
|
|
3095
|
+
);
|
|
3096
|
+
}
|
|
3097
|
+
return {
|
|
3098
|
+
manifest,
|
|
3099
|
+
archive,
|
|
3100
|
+
currentVersion: local.version
|
|
3101
|
+
};
|
|
3102
|
+
};
|
|
3103
|
+
var downloadStandaloneUpdate = async (manifest, archive, homeDir = import_node_os2.default.homedir()) => {
|
|
3104
|
+
const standaloneDir = resolveStandaloneDir(homeDir);
|
|
3105
|
+
await import_promises2.default.mkdir(standaloneDir, { recursive: true });
|
|
3106
|
+
const local = readLocalVersionMeta();
|
|
3107
|
+
const platformKey = local ? `${local.platform}-${local.arch}` : `${process.platform}-${process.arch}`;
|
|
3108
|
+
const version = manifest.version;
|
|
3109
|
+
const versionDir = import_node_path11.default.join(standaloneDir, `${version}-${platformKey}`);
|
|
3110
|
+
const currentLink = resolveCurrentLink(homeDir);
|
|
3111
|
+
if ((0, import_node_fs7.existsSync)(import_node_path11.default.join(versionDir, "dvb"))) {
|
|
3112
|
+
await atomicSymlink(standaloneDir, currentLink, versionDir);
|
|
3113
|
+
return;
|
|
3114
|
+
}
|
|
3115
|
+
const tmpSuffix = `${version}-${platformKey}-${Date.now()}`;
|
|
3116
|
+
const tmpDir = import_node_path11.default.join(standaloneDir, `.tmp-${tmpSuffix}`);
|
|
3117
|
+
const tarballPath = import_node_path11.default.join(standaloneDir, `.download-${tmpSuffix}.tar.gz`);
|
|
3118
|
+
try {
|
|
3119
|
+
const res = await fetch(archive.url, {
|
|
3120
|
+
signal: AbortSignal.timeout(5 * 60 * 1e3)
|
|
3121
|
+
// 5 minute timeout for large download
|
|
3122
|
+
});
|
|
3123
|
+
if (!res.ok) {
|
|
3124
|
+
throw new Error(`Failed to download ${archive.url}: ${res.status}`);
|
|
3125
|
+
}
|
|
3126
|
+
const body = await res.arrayBuffer();
|
|
3127
|
+
(0, import_node_fs7.writeFileSync)(tarballPath, Buffer.from(body));
|
|
3128
|
+
const hash = (0, import_node_crypto2.createHash)("sha256");
|
|
3129
|
+
hash.update((0, import_node_fs7.readFileSync)(tarballPath));
|
|
3130
|
+
const actualHash = hash.digest("hex");
|
|
3131
|
+
if (actualHash !== archive.sha256) {
|
|
3132
|
+
throw new Error(
|
|
3133
|
+
`SHA256 mismatch: expected ${archive.sha256}, got ${actualHash}`
|
|
3134
|
+
);
|
|
3135
|
+
}
|
|
3136
|
+
await import_promises2.default.mkdir(tmpDir, { recursive: true });
|
|
3137
|
+
(0, import_node_child_process.execFileSync)("tar", [
|
|
3138
|
+
"xzf",
|
|
3139
|
+
tarballPath,
|
|
3140
|
+
"-C",
|
|
3141
|
+
tmpDir,
|
|
3142
|
+
"--strip-components=1"
|
|
3143
|
+
]);
|
|
3144
|
+
try {
|
|
3145
|
+
(0, import_node_child_process.execFileSync)(import_node_path11.default.join(tmpDir, "dvb"), ["--help"], {
|
|
3146
|
+
stdio: "pipe",
|
|
3147
|
+
timeout: 15e3
|
|
3148
|
+
});
|
|
3149
|
+
} catch (err) {
|
|
3150
|
+
const exitErr = err;
|
|
3151
|
+
throw new Error(
|
|
3152
|
+
`Validation failed: dvb --help exited with code ${exitErr.status}`
|
|
3153
|
+
);
|
|
3154
|
+
}
|
|
3155
|
+
if ((0, import_node_fs7.existsSync)(versionDir)) {
|
|
3156
|
+
await import_promises2.default.rm(versionDir, { recursive: true });
|
|
3157
|
+
}
|
|
3158
|
+
await import_promises2.default.rename(tmpDir, versionDir);
|
|
3159
|
+
await atomicSymlink(standaloneDir, currentLink, versionDir);
|
|
3160
|
+
await pruneOldVersions(standaloneDir, version, platformKey);
|
|
3161
|
+
} finally {
|
|
3162
|
+
try {
|
|
3163
|
+
await import_promises2.default.rm(tmpDir, { recursive: true, force: true });
|
|
3164
|
+
} catch {
|
|
3165
|
+
}
|
|
3166
|
+
try {
|
|
3167
|
+
await import_promises2.default.unlink(tarballPath);
|
|
3168
|
+
} catch {
|
|
3169
|
+
}
|
|
3170
|
+
}
|
|
3171
|
+
};
|
|
3172
|
+
var updateStandaloneOnce = async (homeDir = import_node_os2.default.homedir()) => {
|
|
3173
|
+
const check = await checkStandaloneUpdate(homeDir);
|
|
3174
|
+
if (!check) {
|
|
3175
|
+
const local = readLocalVersionMeta();
|
|
3176
|
+
return {
|
|
3177
|
+
changed: false,
|
|
3178
|
+
previousVersion: local?.version ?? null,
|
|
3179
|
+
currentVersion: local?.version ?? "unknown"
|
|
3180
|
+
};
|
|
3181
|
+
}
|
|
3182
|
+
await downloadStandaloneUpdate(check.manifest, check.archive, homeDir);
|
|
3183
|
+
return {
|
|
3184
|
+
changed: true,
|
|
3185
|
+
previousVersion: check.currentVersion,
|
|
3186
|
+
currentVersion: check.manifest.version
|
|
3187
|
+
};
|
|
3188
|
+
};
|
|
3189
|
+
var atomicSymlink = async (parentDir, linkPath, target) => {
|
|
3190
|
+
const relTarget = import_node_path11.default.relative(parentDir, target);
|
|
3191
|
+
const tmpLink = import_node_path11.default.join(parentDir, `.current-tmp-${Date.now()}`);
|
|
3192
|
+
try {
|
|
3193
|
+
await import_promises2.default.symlink(relTarget, tmpLink);
|
|
3194
|
+
await import_promises2.default.rename(tmpLink, linkPath);
|
|
3195
|
+
} catch {
|
|
3196
|
+
try {
|
|
3197
|
+
await import_promises2.default.unlink(tmpLink);
|
|
3198
|
+
} catch {
|
|
3199
|
+
}
|
|
3200
|
+
try {
|
|
3201
|
+
await import_promises2.default.unlink(linkPath);
|
|
3202
|
+
} catch {
|
|
3203
|
+
}
|
|
3204
|
+
await import_promises2.default.symlink(relTarget, linkPath);
|
|
3205
|
+
}
|
|
3206
|
+
};
|
|
3207
|
+
var pruneOldVersions = async (standaloneDir, currentVersion, platformKey) => {
|
|
3208
|
+
try {
|
|
3209
|
+
const entries = await import_promises2.default.readdir(standaloneDir, { withFileTypes: true });
|
|
3210
|
+
const versionDirs = entries.filter(
|
|
3211
|
+
(e) => e.isDirectory() && !e.name.startsWith(".") && e.name !== "current" && e.name.endsWith(`-${platformKey}`)
|
|
3212
|
+
).map((e) => e.name).sort().reverse();
|
|
3213
|
+
const toRemove = versionDirs.slice(2);
|
|
3214
|
+
for (const dir of toRemove) {
|
|
3215
|
+
await import_promises2.default.rm(import_node_path11.default.join(standaloneDir, dir), { recursive: true, force: true });
|
|
3216
|
+
}
|
|
3217
|
+
} catch {
|
|
3218
|
+
}
|
|
3219
|
+
};
|
|
3220
|
+
|
|
3045
3221
|
// src/bootstrap/runtimeManager.ts
|
|
3046
3222
|
var MIN_NODE_MAJOR = 22;
|
|
3047
3223
|
var RUNTIME_PACKAGE_NAME = "@boxes-dev/dvb-runtime";
|
|
@@ -3070,10 +3246,10 @@ var resolveBasePath = () => {
|
|
|
3070
3246
|
return __filename;
|
|
3071
3247
|
}
|
|
3072
3248
|
const argv1 = typeof process.argv[1] === "string" ? process.argv[1] : "";
|
|
3073
|
-
return argv1 ||
|
|
3249
|
+
return argv1 || import_node_path12.default.join(process.cwd(), "dvb");
|
|
3074
3250
|
};
|
|
3075
3251
|
var readJsonFile = async (filePath) => {
|
|
3076
|
-
const raw = await
|
|
3252
|
+
const raw = await import_promises3.default.readFile(filePath, "utf8");
|
|
3077
3253
|
return JSON.parse(raw);
|
|
3078
3254
|
};
|
|
3079
3255
|
var readJsonFileIfExists = async (filePath) => {
|
|
@@ -3088,14 +3264,14 @@ var readJsonFileIfExists = async (filePath) => {
|
|
|
3088
3264
|
};
|
|
3089
3265
|
var writeJsonFileAtomic = async (filePath, value) => {
|
|
3090
3266
|
const tempPath = `${filePath}.tmp-${process.pid}-${Date.now()}`;
|
|
3091
|
-
await
|
|
3092
|
-
await
|
|
3093
|
-
await
|
|
3267
|
+
await import_promises3.default.mkdir(import_node_path12.default.dirname(filePath), { recursive: true, mode: 448 });
|
|
3268
|
+
await import_promises3.default.writeFile(tempPath, JSON.stringify(value, null, 2), "utf8");
|
|
3269
|
+
await import_promises3.default.rename(tempPath, filePath);
|
|
3094
3270
|
};
|
|
3095
3271
|
var readStageVersion = async (runtimeDir) => {
|
|
3096
3272
|
try {
|
|
3097
3273
|
const manifest = await readJsonFile(
|
|
3098
|
-
|
|
3274
|
+
import_node_path12.default.join(runtimeDir, "package.json")
|
|
3099
3275
|
);
|
|
3100
3276
|
if (typeof manifest.version !== "string") return null;
|
|
3101
3277
|
const version = manifest.version.trim();
|
|
@@ -3104,25 +3280,25 @@ var readStageVersion = async (runtimeDir) => {
|
|
|
3104
3280
|
return null;
|
|
3105
3281
|
}
|
|
3106
3282
|
};
|
|
3107
|
-
var resolveRuntimeBinPath = (runtimeDir, kind) =>
|
|
3283
|
+
var resolveRuntimeBinPath = (runtimeDir, kind) => import_node_path12.default.join(runtimeDir, "dist", "bin", `${kind}.cjs`);
|
|
3108
3284
|
var readLinkedRuntimeVersion = async (linkPath) => {
|
|
3109
3285
|
try {
|
|
3110
|
-
const runtimeDir = await
|
|
3111
|
-
const version =
|
|
3286
|
+
const runtimeDir = await import_promises3.default.realpath(linkPath);
|
|
3287
|
+
const version = import_node_path12.default.basename(runtimeDir).trim();
|
|
3112
3288
|
return version.length > 0 ? version : null;
|
|
3113
3289
|
} catch {
|
|
3114
3290
|
return null;
|
|
3115
3291
|
}
|
|
3116
3292
|
};
|
|
3117
|
-
var readCurrentRuntime = async (homeDir =
|
|
3293
|
+
var readCurrentRuntime = async (homeDir = import_node_os3.default.homedir()) => {
|
|
3118
3294
|
const currentLink = resolveCurrentRuntimeLink(homeDir);
|
|
3119
3295
|
try {
|
|
3120
|
-
const runtimeDir = await
|
|
3296
|
+
const runtimeDir = await import_promises3.default.realpath(currentLink);
|
|
3121
3297
|
const version = await readStageVersion(runtimeDir);
|
|
3122
3298
|
if (!version) return null;
|
|
3123
3299
|
const dvbBin = resolveRuntimeBinPath(runtimeDir, "dvb");
|
|
3124
3300
|
const dvbdBin = resolveRuntimeBinPath(runtimeDir, "dvbd");
|
|
3125
|
-
if (!(0,
|
|
3301
|
+
if (!(0, import_node_fs8.existsSync)(dvbBin) || !(0, import_node_fs8.existsSync)(dvbdBin)) {
|
|
3126
3302
|
return null;
|
|
3127
3303
|
}
|
|
3128
3304
|
return { version, runtimeDir };
|
|
@@ -3130,9 +3306,9 @@ var readCurrentRuntime = async (homeDir = import_node_os2.default.homedir()) =>
|
|
|
3130
3306
|
return null;
|
|
3131
3307
|
}
|
|
3132
3308
|
};
|
|
3133
|
-
var listLiveRuntimeVersions = async (homeDir =
|
|
3309
|
+
var listLiveRuntimeVersions = async (homeDir = import_node_os3.default.homedir()) => {
|
|
3134
3310
|
const releasesDir = resolveRuntimeReleasesDir(homeDir);
|
|
3135
|
-
const ps2 = (0,
|
|
3311
|
+
const ps2 = (0, import_node_child_process2.spawnSync)("ps", ["eww", "-Ao", "command="], {
|
|
3136
3312
|
encoding: "utf8"
|
|
3137
3313
|
});
|
|
3138
3314
|
if (ps2.error || ps2.status !== 0 || typeof ps2.stdout !== "string") {
|
|
@@ -3154,7 +3330,7 @@ var listLiveRuntimeVersions = async (homeDir = import_node_os2.default.homedir()
|
|
|
3154
3330
|
}
|
|
3155
3331
|
return [...versions];
|
|
3156
3332
|
};
|
|
3157
|
-
var pruneRuntimeReleases = async (homeDir =
|
|
3333
|
+
var pruneRuntimeReleases = async (homeDir = import_node_os3.default.homedir()) => {
|
|
3158
3334
|
const releasesDir = resolveRuntimeReleasesDir(homeDir);
|
|
3159
3335
|
const keep = /* @__PURE__ */ new Set();
|
|
3160
3336
|
const current = await readCurrentRuntime(homeDir);
|
|
@@ -3175,7 +3351,7 @@ var pruneRuntimeReleases = async (homeDir = import_node_os2.default.homedir()) =
|
|
|
3175
3351
|
}
|
|
3176
3352
|
}
|
|
3177
3353
|
try {
|
|
3178
|
-
const entries = await
|
|
3354
|
+
const entries = await import_promises3.default.readdir(releasesDir, { withFileTypes: true });
|
|
3179
3355
|
for (const entry of entries) {
|
|
3180
3356
|
if (!entry.isDirectory()) {
|
|
3181
3357
|
continue;
|
|
@@ -3186,7 +3362,7 @@ var pruneRuntimeReleases = async (homeDir = import_node_os2.default.homedir()) =
|
|
|
3186
3362
|
if (keep.has(entry.name)) {
|
|
3187
3363
|
continue;
|
|
3188
3364
|
}
|
|
3189
|
-
await
|
|
3365
|
+
await import_promises3.default.rm(import_node_path12.default.join(releasesDir, entry.name), {
|
|
3190
3366
|
recursive: true,
|
|
3191
3367
|
force: true
|
|
3192
3368
|
});
|
|
@@ -3201,7 +3377,7 @@ var pruneRuntimeReleases = async (homeDir = import_node_os2.default.homedir()) =
|
|
|
3201
3377
|
var resolveBundledRuntimeRoot = () => {
|
|
3202
3378
|
const require2 = (0, import_node_module.createRequire)(resolveBasePath());
|
|
3203
3379
|
const manifestPath = require2.resolve(`${RUNTIME_PACKAGE_NAME}/package.json`);
|
|
3204
|
-
return
|
|
3380
|
+
return import_node_path12.default.dirname(manifestPath);
|
|
3205
3381
|
};
|
|
3206
3382
|
var readBundledRuntime = async () => {
|
|
3207
3383
|
const runtimeDir = resolveBundledRuntimeRoot();
|
|
@@ -3211,20 +3387,20 @@ var readBundledRuntime = async () => {
|
|
|
3211
3387
|
}
|
|
3212
3388
|
return { version, runtimeDir };
|
|
3213
3389
|
};
|
|
3214
|
-
var ensureReleasesDir = async (homeDir =
|
|
3390
|
+
var ensureReleasesDir = async (homeDir = import_node_os3.default.homedir()) => {
|
|
3215
3391
|
const releasesDir = resolveRuntimeReleasesDir(homeDir);
|
|
3216
|
-
await
|
|
3392
|
+
await import_promises3.default.mkdir(releasesDir, { recursive: true, mode: 448 });
|
|
3217
3393
|
try {
|
|
3218
|
-
await
|
|
3394
|
+
await import_promises3.default.chmod(releasesDir, 448);
|
|
3219
3395
|
} catch {
|
|
3220
3396
|
}
|
|
3221
3397
|
return releasesDir;
|
|
3222
3398
|
};
|
|
3223
|
-
var ensureUpdaterDir = async (homeDir =
|
|
3399
|
+
var ensureUpdaterDir = async (homeDir = import_node_os3.default.homedir()) => {
|
|
3224
3400
|
const updaterDir = resolveUpdaterDir(homeDir);
|
|
3225
|
-
await
|
|
3401
|
+
await import_promises3.default.mkdir(updaterDir, { recursive: true, mode: 448 });
|
|
3226
3402
|
try {
|
|
3227
|
-
await
|
|
3403
|
+
await import_promises3.default.chmod(updaterDir, 448);
|
|
3228
3404
|
} catch {
|
|
3229
3405
|
}
|
|
3230
3406
|
return updaterDir;
|
|
@@ -3246,23 +3422,23 @@ var isProcessAlive = (pid) => {
|
|
|
3246
3422
|
return code === "EPERM";
|
|
3247
3423
|
}
|
|
3248
3424
|
};
|
|
3249
|
-
var createStageDir = async (version, homeDir =
|
|
3425
|
+
var createStageDir = async (version, homeDir = import_node_os3.default.homedir()) => {
|
|
3250
3426
|
const releasesDir = await ensureReleasesDir(homeDir);
|
|
3251
|
-
return await
|
|
3252
|
-
|
|
3427
|
+
return await import_promises3.default.mkdtemp(
|
|
3428
|
+
import_node_path12.default.join(
|
|
3253
3429
|
releasesDir,
|
|
3254
3430
|
`.tmp-${version.replace(/[^a-zA-Z0-9._-]+/g, "-")}-`
|
|
3255
3431
|
)
|
|
3256
3432
|
);
|
|
3257
3433
|
};
|
|
3258
3434
|
var copyBundledRuntimeToStage = async (bundled, stageDir) => {
|
|
3259
|
-
await
|
|
3260
|
-
|
|
3261
|
-
|
|
3435
|
+
await import_promises3.default.copyFile(
|
|
3436
|
+
import_node_path12.default.join(bundled.runtimeDir, "package.json"),
|
|
3437
|
+
import_node_path12.default.join(stageDir, "package.json")
|
|
3262
3438
|
);
|
|
3263
|
-
await
|
|
3264
|
-
|
|
3265
|
-
|
|
3439
|
+
await import_promises3.default.cp(
|
|
3440
|
+
import_node_path12.default.join(bundled.runtimeDir, "dist"),
|
|
3441
|
+
import_node_path12.default.join(stageDir, "dist"),
|
|
3266
3442
|
{
|
|
3267
3443
|
recursive: true
|
|
3268
3444
|
}
|
|
@@ -3299,7 +3475,7 @@ var downloadTarball = async (url, filePath) => {
|
|
|
3299
3475
|
throw new Error(`Runtime tarball download failed with ${response.status}.`);
|
|
3300
3476
|
}
|
|
3301
3477
|
const buffer = Buffer.from(await response.arrayBuffer());
|
|
3302
|
-
await
|
|
3478
|
+
await import_promises3.default.writeFile(filePath, buffer);
|
|
3303
3479
|
};
|
|
3304
3480
|
var extractRuntimeTarballToStage = async (tarballPath, stageDir) => {
|
|
3305
3481
|
await lo({
|
|
@@ -3444,21 +3620,21 @@ var terminateChild = async (child) => {
|
|
|
3444
3620
|
});
|
|
3445
3621
|
};
|
|
3446
3622
|
var validateRuntimeStage = async (stageDir, expectedVersion) => {
|
|
3447
|
-
const socketDir =
|
|
3623
|
+
const socketDir = import_node_path12.default.join(
|
|
3448
3624
|
"/tmp",
|
|
3449
|
-
`dvb-runtime-validate-${process.pid}-${(0,
|
|
3625
|
+
`dvb-runtime-validate-${process.pid}-${(0, import_node_crypto3.randomUUID)().slice(0, 8)}`
|
|
3450
3626
|
);
|
|
3451
|
-
const socketPath =
|
|
3627
|
+
const socketPath = import_node_path12.default.join(socketDir, "devboxd.sock");
|
|
3452
3628
|
const daemonBinPath = resolveRuntimeBinPath(stageDir, "dvbd");
|
|
3453
|
-
if (!(0,
|
|
3629
|
+
if (!(0, import_node_fs8.existsSync)(daemonBinPath)) {
|
|
3454
3630
|
throw new Error(`Runtime stage is missing ${daemonBinPath}.`);
|
|
3455
3631
|
}
|
|
3456
3632
|
const cliBinPath = resolveRuntimeBinPath(stageDir, "dvb");
|
|
3457
|
-
if (!(0,
|
|
3633
|
+
if (!(0, import_node_fs8.existsSync)(cliBinPath)) {
|
|
3458
3634
|
throw new Error(`Runtime stage is missing ${cliBinPath}.`);
|
|
3459
3635
|
}
|
|
3460
|
-
await
|
|
3461
|
-
const child = (0,
|
|
3636
|
+
await import_promises3.default.mkdir(socketDir, { recursive: true, mode: 448 });
|
|
3637
|
+
const child = (0, import_node_child_process2.spawn)(process.execPath, [daemonBinPath], {
|
|
3462
3638
|
env: {
|
|
3463
3639
|
...process.env,
|
|
3464
3640
|
DEVBOX_SOCKET_PATH: socketPath
|
|
@@ -3479,9 +3655,9 @@ var validateRuntimeStage = async (stageDir, expectedVersion) => {
|
|
|
3479
3655
|
`Runtime stage reported version ${validated.version}; expected ${expectedVersion}.`
|
|
3480
3656
|
);
|
|
3481
3657
|
}
|
|
3482
|
-
const cliHomeDir =
|
|
3483
|
-
await
|
|
3484
|
-
const cliChild = (0,
|
|
3658
|
+
const cliHomeDir = import_node_path12.default.join(socketDir, "home");
|
|
3659
|
+
await import_promises3.default.mkdir(cliHomeDir, { recursive: true, mode: 448 });
|
|
3660
|
+
const cliChild = (0, import_node_child_process2.spawn)(process.execPath, [cliBinPath, "--help"], {
|
|
3485
3661
|
env: {
|
|
3486
3662
|
...process.env,
|
|
3487
3663
|
HOME: cliHomeDir
|
|
@@ -3502,22 +3678,22 @@ var validateRuntimeStage = async (stageDir, expectedVersion) => {
|
|
|
3502
3678
|
}
|
|
3503
3679
|
} finally {
|
|
3504
3680
|
await terminateChild(child);
|
|
3505
|
-
await
|
|
3681
|
+
await import_promises3.default.rm(socketDir, { recursive: true, force: true });
|
|
3506
3682
|
}
|
|
3507
3683
|
};
|
|
3508
3684
|
var writeSymlinkAtomic = async (linkPath, target) => {
|
|
3509
3685
|
const tempPath = `${linkPath}.tmp-${process.pid}-${Date.now()}`;
|
|
3510
|
-
await
|
|
3686
|
+
await import_promises3.default.symlink(target, tempPath);
|
|
3511
3687
|
try {
|
|
3512
|
-
await
|
|
3688
|
+
await import_promises3.default.rename(tempPath, linkPath);
|
|
3513
3689
|
} catch (error) {
|
|
3514
|
-
await
|
|
3515
|
-
await
|
|
3690
|
+
await import_promises3.default.rm(linkPath, { recursive: true, force: true });
|
|
3691
|
+
await import_promises3.default.rename(tempPath, linkPath);
|
|
3516
3692
|
if (error instanceof Error) {
|
|
3517
3693
|
}
|
|
3518
3694
|
}
|
|
3519
3695
|
};
|
|
3520
|
-
var writeUpdaterHeartbeat = async (homeDir =
|
|
3696
|
+
var writeUpdaterHeartbeat = async (homeDir = import_node_os3.default.homedir()) => {
|
|
3521
3697
|
const current = await readJsonFileIfExists(
|
|
3522
3698
|
resolveUpdaterDaemonPath(homeDir)
|
|
3523
3699
|
);
|
|
@@ -3529,7 +3705,7 @@ var writeUpdaterHeartbeat = async (homeDir = import_node_os2.default.homedir())
|
|
|
3529
3705
|
heartbeatAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
3530
3706
|
});
|
|
3531
3707
|
};
|
|
3532
|
-
var claimUpdaterDaemon = async (homeDir =
|
|
3708
|
+
var claimUpdaterDaemon = async (homeDir = import_node_os3.default.homedir()) => {
|
|
3533
3709
|
await ensureUpdaterDir(homeDir);
|
|
3534
3710
|
const daemonPath = resolveUpdaterDaemonPath(homeDir);
|
|
3535
3711
|
const record = {
|
|
@@ -3540,7 +3716,7 @@ var claimUpdaterDaemon = async (homeDir = import_node_os2.default.homedir()) =>
|
|
|
3540
3716
|
};
|
|
3541
3717
|
for (let attempt = 0; attempt < 2; attempt += 1) {
|
|
3542
3718
|
try {
|
|
3543
|
-
await
|
|
3719
|
+
await import_promises3.default.writeFile(daemonPath, JSON.stringify(record, null, 2), {
|
|
3544
3720
|
encoding: "utf8",
|
|
3545
3721
|
flag: "wx"
|
|
3546
3722
|
});
|
|
@@ -3554,20 +3730,20 @@ var claimUpdaterDaemon = async (homeDir = import_node_os2.default.homedir()) =>
|
|
|
3554
3730
|
if (existing && isProcessAlive(existing.pid)) {
|
|
3555
3731
|
return false;
|
|
3556
3732
|
}
|
|
3557
|
-
await
|
|
3733
|
+
await import_promises3.default.rm(daemonPath, { force: true });
|
|
3558
3734
|
}
|
|
3559
3735
|
}
|
|
3560
3736
|
return false;
|
|
3561
3737
|
};
|
|
3562
|
-
var releaseUpdaterDaemon = async (homeDir =
|
|
3738
|
+
var releaseUpdaterDaemon = async (homeDir = import_node_os3.default.homedir()) => {
|
|
3563
3739
|
const daemonPath = resolveUpdaterDaemonPath(homeDir);
|
|
3564
3740
|
const current = await readJsonFileIfExists(daemonPath);
|
|
3565
3741
|
if (!current || current.pid !== process.pid) {
|
|
3566
3742
|
return;
|
|
3567
3743
|
}
|
|
3568
|
-
await
|
|
3744
|
+
await import_promises3.default.rm(daemonPath, { force: true });
|
|
3569
3745
|
};
|
|
3570
|
-
var writeUpdaterState = async (state, homeDir =
|
|
3746
|
+
var writeUpdaterState = async (state, homeDir = import_node_os3.default.homedir()) => {
|
|
3571
3747
|
await ensureUpdaterDir(homeDir);
|
|
3572
3748
|
await writeJsonFileAtomic(resolveUpdaterStatePath(homeDir), state);
|
|
3573
3749
|
};
|
|
@@ -3583,12 +3759,12 @@ var waitWithShutdown = async (shutdown, timeoutMs) => {
|
|
|
3583
3759
|
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
3584
3760
|
}
|
|
3585
3761
|
};
|
|
3586
|
-
var promoteRuntimeStage = async (stageDir, version, homeDir =
|
|
3762
|
+
var promoteRuntimeStage = async (stageDir, version, homeDir = import_node_os3.default.homedir()) => {
|
|
3587
3763
|
const previous = await readCurrentRuntime(homeDir);
|
|
3588
3764
|
const versionDir = resolveRuntimeVersionDir(version, homeDir);
|
|
3589
3765
|
if (stageDir !== versionDir) {
|
|
3590
|
-
await
|
|
3591
|
-
await
|
|
3766
|
+
await import_promises3.default.rm(versionDir, { recursive: true, force: true });
|
|
3767
|
+
await import_promises3.default.rename(stageDir, versionDir);
|
|
3592
3768
|
}
|
|
3593
3769
|
if (previous && previous.version !== version) {
|
|
3594
3770
|
await writeSymlinkAtomic(
|
|
@@ -3602,7 +3778,7 @@ var promoteRuntimeStage = async (stageDir, version, homeDir = import_node_os2.de
|
|
|
3602
3778
|
} catch {
|
|
3603
3779
|
}
|
|
3604
3780
|
};
|
|
3605
|
-
var installBundledRuntime = async (bundled, homeDir =
|
|
3781
|
+
var installBundledRuntime = async (bundled, homeDir = import_node_os3.default.homedir()) => {
|
|
3606
3782
|
const stageDir = await createStageDir(bundled.version, homeDir);
|
|
3607
3783
|
try {
|
|
3608
3784
|
await copyBundledRuntimeToStage(bundled, stageDir);
|
|
@@ -3613,21 +3789,21 @@ var installBundledRuntime = async (bundled, homeDir = import_node_os2.default.ho
|
|
|
3613
3789
|
runtimeDir: resolveRuntimeVersionDir(bundled.version, homeDir)
|
|
3614
3790
|
};
|
|
3615
3791
|
} catch (error) {
|
|
3616
|
-
await
|
|
3792
|
+
await import_promises3.default.rm(stageDir, { recursive: true, force: true });
|
|
3617
3793
|
throw error;
|
|
3618
3794
|
}
|
|
3619
3795
|
};
|
|
3620
|
-
var installDownloadedRuntime = async (manifest, homeDir =
|
|
3796
|
+
var installDownloadedRuntime = async (manifest, homeDir = import_node_os3.default.homedir()) => {
|
|
3621
3797
|
const tarball = manifest.dist?.tarball?.trim();
|
|
3622
3798
|
if (!tarball) {
|
|
3623
3799
|
throw new Error("Runtime manifest is missing dist.tarball.");
|
|
3624
3800
|
}
|
|
3625
3801
|
const stageDir = await createStageDir(manifest.version, homeDir);
|
|
3626
|
-
const tarballPath =
|
|
3802
|
+
const tarballPath = import_node_path12.default.join(stageDir, "runtime.tgz");
|
|
3627
3803
|
try {
|
|
3628
3804
|
await downloadTarball(tarball, tarballPath);
|
|
3629
3805
|
await extractRuntimeTarballToStage(tarballPath, stageDir);
|
|
3630
|
-
await
|
|
3806
|
+
await import_promises3.default.rm(tarballPath, { force: true });
|
|
3631
3807
|
await validateRuntimeStage(stageDir, manifest.version);
|
|
3632
3808
|
await promoteRuntimeStage(stageDir, manifest.version, homeDir);
|
|
3633
3809
|
return {
|
|
@@ -3635,11 +3811,11 @@ var installDownloadedRuntime = async (manifest, homeDir = import_node_os2.defaul
|
|
|
3635
3811
|
runtimeDir: resolveRuntimeVersionDir(manifest.version, homeDir)
|
|
3636
3812
|
};
|
|
3637
3813
|
} catch (error) {
|
|
3638
|
-
await
|
|
3814
|
+
await import_promises3.default.rm(stageDir, { recursive: true, force: true });
|
|
3639
3815
|
throw error;
|
|
3640
3816
|
}
|
|
3641
3817
|
};
|
|
3642
|
-
var ensureBundledRuntimeStaged = async (homeDir =
|
|
3818
|
+
var ensureBundledRuntimeStaged = async (homeDir = import_node_os3.default.homedir()) => {
|
|
3643
3819
|
const bundled = await readBundledRuntime();
|
|
3644
3820
|
const current = await readCurrentRuntime(homeDir);
|
|
3645
3821
|
if (current && compareSemver(current.version, bundled.version) === 0) {
|
|
@@ -3657,7 +3833,7 @@ var ensureBundledRuntimeStaged = async (homeDir = import_node_os2.default.homedi
|
|
|
3657
3833
|
throw error;
|
|
3658
3834
|
}
|
|
3659
3835
|
};
|
|
3660
|
-
var updateRuntimeOnce = async (homeDir = process.env.HOME?.trim() ||
|
|
3836
|
+
var updateRuntimeOnce = async (homeDir = process.env.HOME?.trim() || import_node_os3.default.homedir()) => {
|
|
3661
3837
|
assertNodeVersion();
|
|
3662
3838
|
const bundled = await readBundledRuntime();
|
|
3663
3839
|
const current = await ensureBundledRuntimeStaged(homeDir);
|
|
@@ -3678,7 +3854,7 @@ var updateRuntimeOnce = async (homeDir = process.env.HOME?.trim() || import_node
|
|
|
3678
3854
|
source: "downloaded"
|
|
3679
3855
|
};
|
|
3680
3856
|
};
|
|
3681
|
-
var writeUpdatePassState = async (result, homeDir =
|
|
3857
|
+
var writeUpdatePassState = async (result, homeDir = import_node_os3.default.homedir()) => {
|
|
3682
3858
|
await writeUpdaterState(
|
|
3683
3859
|
{
|
|
3684
3860
|
status: "ok",
|
|
@@ -3691,7 +3867,7 @@ var writeUpdatePassState = async (result, homeDir = import_node_os2.default.home
|
|
|
3691
3867
|
homeDir
|
|
3692
3868
|
);
|
|
3693
3869
|
};
|
|
3694
|
-
var writeUpdatePassErrorState = async (currentVersion, error, homeDir =
|
|
3870
|
+
var writeUpdatePassErrorState = async (currentVersion, error, homeDir = import_node_os3.default.homedir()) => {
|
|
3695
3871
|
await writeUpdaterState(
|
|
3696
3872
|
{
|
|
3697
3873
|
status: "error",
|
|
@@ -3704,7 +3880,7 @@ var writeUpdatePassErrorState = async (currentVersion, error, homeDir = import_n
|
|
|
3704
3880
|
homeDir
|
|
3705
3881
|
);
|
|
3706
3882
|
};
|
|
3707
|
-
var runUpdaterPass = async (homeDir =
|
|
3883
|
+
var runUpdaterPass = async (homeDir = import_node_os3.default.homedir()) => {
|
|
3708
3884
|
const current = await readCurrentRuntime(homeDir);
|
|
3709
3885
|
try {
|
|
3710
3886
|
const result = await updateRuntimeOnce(homeDir);
|
|
@@ -3715,7 +3891,7 @@ var runUpdaterPass = async (homeDir = import_node_os2.default.homedir()) => {
|
|
|
3715
3891
|
throw error;
|
|
3716
3892
|
}
|
|
3717
3893
|
};
|
|
3718
|
-
var runBackgroundUpdaterDaemon = async (homeDir = process.env.HOME?.trim() ||
|
|
3894
|
+
var runBackgroundUpdaterDaemon = async (homeDir = process.env.HOME?.trim() || import_node_os3.default.homedir()) => {
|
|
3719
3895
|
assertNodeVersion();
|
|
3720
3896
|
const claimed = await claimUpdaterDaemon(homeDir);
|
|
3721
3897
|
if (!claimed) {
|
|
@@ -3735,6 +3911,12 @@ var runBackgroundUpdaterDaemon = async (homeDir = process.env.HOME?.trim() || im
|
|
|
3735
3911
|
await runUpdaterPass(homeDir);
|
|
3736
3912
|
} catch {
|
|
3737
3913
|
}
|
|
3914
|
+
if (isStandaloneMode()) {
|
|
3915
|
+
try {
|
|
3916
|
+
await updateStandaloneOnce(homeDir);
|
|
3917
|
+
} catch {
|
|
3918
|
+
}
|
|
3919
|
+
}
|
|
3738
3920
|
await writeUpdaterHeartbeat(homeDir);
|
|
3739
3921
|
await waitWithShutdown(shutdown, UPDATER_INTERVAL_MS);
|
|
3740
3922
|
}
|