UNPKG

one

Version:

One is a new React Framework that makes Vite serve both native and web.

240 lines (238 loc) 8.67 kB
"use strict"; 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