MITM Warning
This commit is contained in:
parent
18f87f43ca
commit
b5979dfbd6
37 changed files with 137 additions and 64 deletions
|
|
@ -60,19 +60,45 @@ function isBetterSqliteBinaryValid() {
|
|||
} catch { return false; }
|
||||
}
|
||||
|
||||
function npmInstall(pkgs, opts = {}) {
|
||||
const cwd = ensureRuntimeDir();
|
||||
const args = ["install", ...pkgs, "--no-audit", "--no-fund", "--prefer-online"];
|
||||
if (opts.optional) args.push("--no-save");
|
||||
// Extract a short, user-friendly reason from npm stderr.
|
||||
function summarizeNpmError(stderr = "") {
|
||||
const text = String(stderr);
|
||||
if (/ENOTFOUND|ETIMEDOUT|EAI_AGAIN|network|getaddrinfo/i.test(text)) return "No internet connection or registry unreachable";
|
||||
if (/EACCES|EPERM|permission denied/i.test(text)) return "Permission denied (check folder permissions)";
|
||||
if (/ENOSPC|no space/i.test(text)) return "Not enough disk space";
|
||||
if (/node-gyp|gyp ERR|python|MSBuild|Visual Studio|Xcode/i.test(text)) return "Missing build tools (Xcode CLT / Python / VS Build Tools)";
|
||||
if (/ETARGET|version.*not found/i.test(text)) return "Package version not found on registry";
|
||||
const m = text.match(/npm ERR! (.+)/);
|
||||
if (m) return m[1].slice(0, 200);
|
||||
const lastLine = text.trim().split(/\r?\n/).filter(Boolean).pop();
|
||||
return lastLine ? lastLine.slice(0, 200) : "Unknown error";
|
||||
}
|
||||
|
||||
function runNpmInstall({ cwd, pkgs, extraArgs = [], timeout = 180000 }) {
|
||||
const args = ["install", ...pkgs, "--no-audit", "--no-fund", "--prefer-online", ...extraArgs];
|
||||
const npmCmd = process.platform === "win32" ? "npm.cmd" : "npm";
|
||||
console.log(`[9router][runtime] ${npmCmd} ${args.join(" ")} (cwd: ${cwd})`);
|
||||
const res = spawnSync(npmCmd, args, {
|
||||
cwd,
|
||||
stdio: opts.silent ? "ignore" : "inherit",
|
||||
timeout: opts.timeout || 180000,
|
||||
stdio: ["ignore", "pipe", "pipe"],
|
||||
timeout,
|
||||
shell: process.platform === "win32",
|
||||
encoding: "utf8",
|
||||
});
|
||||
return res.status === 0;
|
||||
return { ok: res.status === 0, code: res.status, stderr: res.stderr || "", stdout: res.stdout || "" };
|
||||
}
|
||||
|
||||
function npmInstall(pkgs, opts = {}) {
|
||||
const cwd = ensureRuntimeDir();
|
||||
const extra = opts.optional ? ["--no-save"] : [];
|
||||
if (!opts.silent) console.log("⏳ Installing SQLite engine (first run)...");
|
||||
const res = runNpmInstall({ cwd, pkgs, extraArgs: extra, timeout: opts.timeout || 180000 });
|
||||
if (!res.ok && !opts.silent) {
|
||||
const reason = summarizeNpmError(res.stderr);
|
||||
console.warn("⚠️ SQLite engine install failed — using fallback");
|
||||
console.warn(` Reason: ${reason}`);
|
||||
console.warn(` Retry: cd "${cwd}" && npm install ${pkgs.join(" ")}`);
|
||||
}
|
||||
return res.ok;
|
||||
}
|
||||
|
||||
// Public: ensure better-sqlite3 native module is installed in user-writable
|
||||
|
|
@ -83,14 +109,11 @@ function ensureSqliteRuntime({ silent = false } = {}) {
|
|||
|
||||
const needBetterSqlite = !hasModule("better-sqlite3") || !isBetterSqliteBinaryValid();
|
||||
if (!needBetterSqlite) {
|
||||
if (!silent) console.log("[9router][runtime] better-sqlite3 OK");
|
||||
if (!silent) console.log("✅ SQLite engine ready");
|
||||
return { betterSqlite: true };
|
||||
}
|
||||
|
||||
const ok = npmInstall([`better-sqlite3@${BETTER_SQLITE3_VERSION}`], { optional: true, silent });
|
||||
if (!ok && !silent) {
|
||||
console.warn("[9router][runtime] better-sqlite3 install failed (will use node:sqlite or sql.js fallback)");
|
||||
}
|
||||
return {
|
||||
betterSqlite: ok && hasModule("better-sqlite3") && isBetterSqliteBinaryValid(),
|
||||
};
|
||||
|
|
@ -111,4 +134,6 @@ module.exports = {
|
|||
buildEnvWithRuntime,
|
||||
getRuntimeDir,
|
||||
getRuntimeNodeModules,
|
||||
runNpmInstall,
|
||||
summarizeNpmError,
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue