one
Version:
One is a new React Framework that makes Vite serve both native and web.
240 lines (238 loc) • 8.67 kB
JavaScript
;
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all) __defProp(target, name, {
get: all[name],
enumerable: true
});
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
get: () => from[key],
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
});
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
value: mod,
enumerable: true
}) : target, mod));
var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
value: true
}), mod);
var serve_exports = {};
__export(serve_exports, {
serve: () => serve
});
module.exports = __toCommonJS(serve_exports);
var import_polyfills_server = require("./polyfills-server.native.js");
var import_fs_extra = __toESM(require("fs-extra"), 1);
var import_setServerGlobals = require("./server/setServerGlobals.native.js");
var import_setupBuildOptions = require("./server/setupBuildOptions.native.js");
var import_ensureExists = require("./utils/ensureExists.native.js");
process.on("uncaughtException", function (err) {
console.error(`[one] Uncaught exception`, (err === null || err === void 0 ? void 0 : err.stack) || err);
});
async function serve() {
var args = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
if (args.cluster) {
var {
cpus,
platform
} = await import("os");
var numWorkers = typeof args.cluster === "number" ? args.cluster : cpus().length;
var isBun = typeof process.versions.bun !== "undefined";
var canReusePort = !["win32", "darwin"].includes(platform()) && (isBun || function () {
var [major, minor] = process.versions.node.split(".").map(Number);
return major > 22 || major === 22 && minor >= 12 || major >= 23;
}());
if (canReusePort) {
return await serveWithReusePort(args, numWorkers);
} else if (!isBun) {
return await serveWithCluster(args, numWorkers);
} else {
console.warn(`[one] cluster mode not supported on ${platform()} with bun, running single process`);
return await startWorker(args);
}
}
return await startWorker(args);
}
async function serveWithReusePort(args, numWorkers) {
var {
fork
} = await import("child_process");
console.info(`[one] cluster: starting ${numWorkers} workers (SO_REUSEPORT)`);
var workers = [];
var recentCrashes = 0;
var lastCrashTime = 0;
function spawnWorker() {
var child = fork(process.argv[1], process.argv.slice(2).filter(function (a) {
return !a.startsWith("--cluster");
}), {
env: {
...process.env,
ONE_CLUSTER_WORKER: "1"
},
stdio: "inherit"
});
workers.push(child);
child.on("exit", function (code, signal) {
var idx = workers.indexOf(child);
if (idx >= 0) workers.splice(idx, 1);
if (code === 0 || signal === "SIGTERM" || signal === "SIGINT") return;
var now = Date.now();
if (now - lastCrashTime < 5e3) {
recentCrashes++;
} else {
recentCrashes = 1;
}
lastCrashTime = now;
if (recentCrashes > numWorkers * 2) {
console.error(`[one] too many worker crashes, stopping`);
process.exit(1);
}
console.error(`[one] worker ${child.pid} died (code ${code}, signal ${signal}), restarting`);
setTimeout(spawnWorker, Math.min(recentCrashes * 500, 5e3));
});
}
for (var i = 0; i < numWorkers; i++) {
spawnWorker();
}
var shutdown = function () {
var _iteratorNormalCompletion = true,
_didIteratorError = false,
_iteratorError = void 0;
try {
for (var _iterator = workers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var w = _step.value;
w.kill("SIGTERM");
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return != null) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
setTimeout(function () {
return process.exit(0);
}, 5e3);
};
process.on("SIGINT", shutdown);
process.on("SIGTERM", shutdown);
await new Promise(function () {});
}
async function serveWithCluster(args, numWorkers) {
var cluster = await import("cluster");
if (cluster.default.isPrimary) {
console.info(`[one] cluster: starting ${numWorkers} workers (IPC)`);
for (var i = 0; i < numWorkers; i++) {
cluster.default.fork();
}
var recentCrashes = 0;
var lastCrashTime = 0;
cluster.default.on("exit", function (worker, code, signal) {
if (code === 0 || signal === "SIGTERM" || signal === "SIGINT") return;
var now = Date.now();
if (now - lastCrashTime < 5e3) {
recentCrashes++;
} else {
recentCrashes = 1;
}
lastCrashTime = now;
if (recentCrashes > numWorkers * 2) {
console.error(`[one] too many worker crashes, stopping`);
process.exit(1);
}
console.error(`[one] worker ${worker.process.pid} died (code ${code}, signal ${signal}), restarting`);
setTimeout(function () {
return cluster.default.fork();
}, Math.min(recentCrashes * 500, 5e3));
});
var shutdown = function () {
for (var id in cluster.default.workers) {
var _cluster_default_workers_id;
(_cluster_default_workers_id = cluster.default.workers[id]) === null || _cluster_default_workers_id === void 0 ? void 0 : _cluster_default_workers_id.process.kill("SIGTERM");
}
setTimeout(function () {
return process.exit(0);
}, 5e3);
};
process.on("SIGINT", shutdown);
process.on("SIGTERM", shutdown);
return;
}
return await startWorker(args);
}
async function startWorker(args) {
var _oneOptions_server;
var outDir = (args === null || args === void 0 ? void 0 : args.outDir) || (import_fs_extra.default.existsSync("buildInfo.json") ? "." : null) || "dist";
var buildInfo = await import_fs_extra.default.readJSON(`${outDir}/buildInfo.json`);
var {
oneOptions
} = buildInfo;
(0, import_setServerGlobals.setServerGlobals)();
(0, import_setupBuildOptions.setupBuildInfo)(buildInfo);
(0, import_ensureExists.ensureExists)(oneOptions);
var {
labelProcess
} = await import("./cli/label-process");
var {
removeUndefined
} = await import("./utils/removeUndefined");
var {
loadEnv,
serve: vxrnServe,
serveStaticAssets,
compileCacheRules
} = await import("vxrn/serve");
var {
oneServe
} = await import("./server/oneServe");
labelProcess("serve");
if (args === null || args === void 0 ? void 0 : args.loadEnv) {
await loadEnv("production");
}
var cacheRules = ((_oneOptions_server = oneOptions.server) === null || _oneOptions_server === void 0 ? void 0 : _oneOptions_server.cacheControl) ? compileCacheRules(oneOptions.server.cacheControl) : void 0;
return await vxrnServe({
outDir: buildInfo.outDir || outDir,
app: args === null || args === void 0 ? void 0 : args.app,
...oneOptions.server,
...removeUndefined({
port: (args === null || args === void 0 ? void 0 : args.port) ? +args.port : void 0,
host: args === null || args === void 0 ? void 0 : args.host,
compress: args === null || args === void 0 ? void 0 : args.compress
}),
async beforeRegisterRoutes(options, app) {
await oneServe(oneOptions, buildInfo, app, {
serveStaticAssets: function (ctx) {
return serveStaticAssets({
...ctx,
cacheRules
});
}
});
},
async afterRegisterRoutes(options, app) {}
});
}
//# sourceMappingURL=serve.native.js.map