MITM Warning

This commit is contained in:
decolua 2026-05-16 11:39:39 +07:00
parent 18f87f43ca
commit b5979dfbd6
37 changed files with 137 additions and 64 deletions

View file

@ -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,
};