one 1.12.1 → 1.12.3

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.
Files changed (155) hide show
  1. package/dist/cjs/Root.cjs +7 -1
  2. package/dist/cjs/Root.js +7 -2
  3. package/dist/cjs/Root.js.map +1 -1
  4. package/dist/cjs/Root.native.js +8 -2
  5. package/dist/cjs/Root.native.js.map +1 -1
  6. package/dist/cjs/cli/build.cjs +24 -10
  7. package/dist/cjs/cli/build.js +24 -9
  8. package/dist/cjs/cli/build.js.map +1 -1
  9. package/dist/cjs/cli/build.native.js +29 -14
  10. package/dist/cjs/cli/build.native.js.map +1 -1
  11. package/dist/cjs/createApp.cjs +2 -2
  12. package/dist/cjs/createApp.js +2 -2
  13. package/dist/cjs/createApp.js.map +1 -1
  14. package/dist/cjs/createHandleRequest.cjs +5 -1
  15. package/dist/cjs/createHandleRequest.js +6 -2
  16. package/dist/cjs/createHandleRequest.js.map +1 -1
  17. package/dist/cjs/createHandleRequest.native.js +5 -1
  18. package/dist/cjs/createHandleRequest.native.js.map +1 -1
  19. package/dist/cjs/fork/SSRNavigationContainer.cjs +18 -9
  20. package/dist/cjs/fork/SSRNavigationContainer.js +17 -6
  21. package/dist/cjs/fork/SSRNavigationContainer.js.map +1 -1
  22. package/dist/cjs/fork/SSRNavigationContainer.native.js +21 -10
  23. package/dist/cjs/fork/SSRNavigationContainer.native.js.map +1 -1
  24. package/dist/cjs/router/linkingConfig.cjs +2 -1
  25. package/dist/cjs/router/linkingConfig.js +2 -2
  26. package/dist/cjs/router/linkingConfig.js.map +1 -1
  27. package/dist/cjs/router/linkingConfig.native.js +2 -1
  28. package/dist/cjs/router/linkingConfig.native.js.map +1 -1
  29. package/dist/cjs/serve.cjs +67 -28
  30. package/dist/cjs/serve.js +68 -28
  31. package/dist/cjs/serve.js.map +1 -1
  32. package/dist/cjs/serve.native.js +96 -35
  33. package/dist/cjs/serve.native.js.map +1 -1
  34. package/dist/cjs/server/oneServe.cjs +112 -39
  35. package/dist/cjs/server/oneServe.js +94 -41
  36. package/dist/cjs/server/oneServe.js.map +2 -2
  37. package/dist/cjs/server/oneServe.native.js +180 -80
  38. package/dist/cjs/server/oneServe.native.js.map +1 -1
  39. package/dist/cjs/utils/evictOldest.cjs +34 -0
  40. package/dist/cjs/utils/evictOldest.js +29 -0
  41. package/dist/cjs/utils/evictOldest.js.map +6 -0
  42. package/dist/cjs/utils/evictOldest.native.js +34 -0
  43. package/dist/cjs/utils/evictOldest.native.js.map +1 -0
  44. package/dist/cjs/utils/isResponse.cjs +1 -1
  45. package/dist/cjs/utils/isResponse.js +1 -1
  46. package/dist/cjs/utils/isResponse.js.map +1 -1
  47. package/dist/cjs/utils/isResponse.native.js +1 -1
  48. package/dist/cjs/utils/isResponse.native.js.map +1 -1
  49. package/dist/cjs/vite/one-server-only.cjs +9 -6
  50. package/dist/cjs/vite/one-server-only.js +8 -7
  51. package/dist/cjs/vite/one-server-only.js.map +1 -1
  52. package/dist/cjs/vite/resolveResponse.cjs +17 -4
  53. package/dist/cjs/vite/resolveResponse.js +15 -2
  54. package/dist/cjs/vite/resolveResponse.js.map +1 -1
  55. package/dist/cjs/vite/resolveResponse.native.js +17 -4
  56. package/dist/cjs/vite/resolveResponse.native.js.map +1 -1
  57. package/dist/esm/Root.js +7 -1
  58. package/dist/esm/Root.js.map +1 -1
  59. package/dist/esm/Root.mjs +7 -1
  60. package/dist/esm/Root.mjs.map +1 -1
  61. package/dist/esm/Root.native.js +7 -1
  62. package/dist/esm/Root.native.js.map +1 -1
  63. package/dist/esm/cli/build.js +24 -9
  64. package/dist/esm/cli/build.js.map +1 -1
  65. package/dist/esm/cli/build.mjs +26 -12
  66. package/dist/esm/cli/build.mjs.map +1 -1
  67. package/dist/esm/cli/build.native.js +29 -14
  68. package/dist/esm/cli/build.native.js.map +1 -1
  69. package/dist/esm/createApp.js +2 -2
  70. package/dist/esm/createApp.js.map +1 -1
  71. package/dist/esm/createApp.mjs +2 -2
  72. package/dist/esm/createApp.mjs.map +1 -1
  73. package/dist/esm/createHandleRequest.js +6 -2
  74. package/dist/esm/createHandleRequest.js.map +1 -1
  75. package/dist/esm/createHandleRequest.mjs +5 -2
  76. package/dist/esm/createHandleRequest.mjs.map +1 -1
  77. package/dist/esm/createHandleRequest.native.js +5 -2
  78. package/dist/esm/createHandleRequest.native.js.map +1 -1
  79. package/dist/esm/fork/SSRNavigationContainer.js +17 -6
  80. package/dist/esm/fork/SSRNavigationContainer.js.map +1 -1
  81. package/dist/esm/fork/SSRNavigationContainer.mjs +18 -9
  82. package/dist/esm/fork/SSRNavigationContainer.mjs.map +1 -1
  83. package/dist/esm/fork/SSRNavigationContainer.native.js +21 -10
  84. package/dist/esm/fork/SSRNavigationContainer.native.js.map +1 -1
  85. package/dist/esm/router/linkingConfig.js +2 -1
  86. package/dist/esm/router/linkingConfig.js.map +1 -1
  87. package/dist/esm/router/linkingConfig.mjs +2 -1
  88. package/dist/esm/router/linkingConfig.mjs.map +1 -1
  89. package/dist/esm/router/linkingConfig.native.js +2 -1
  90. package/dist/esm/router/linkingConfig.native.js.map +1 -1
  91. package/dist/esm/serve.js +68 -28
  92. package/dist/esm/serve.js.map +1 -1
  93. package/dist/esm/serve.mjs +67 -28
  94. package/dist/esm/serve.mjs.map +1 -1
  95. package/dist/esm/serve.native.js +96 -35
  96. package/dist/esm/serve.native.js.map +1 -1
  97. package/dist/esm/server/oneServe.js +95 -42
  98. package/dist/esm/server/oneServe.js.map +2 -2
  99. package/dist/esm/server/oneServe.mjs +113 -40
  100. package/dist/esm/server/oneServe.mjs.map +1 -1
  101. package/dist/esm/server/oneServe.native.js +181 -81
  102. package/dist/esm/server/oneServe.native.js.map +1 -1
  103. package/dist/esm/utils/evictOldest.js +13 -0
  104. package/dist/esm/utils/evictOldest.js.map +6 -0
  105. package/dist/esm/utils/evictOldest.mjs +11 -0
  106. package/dist/esm/utils/evictOldest.mjs.map +1 -0
  107. package/dist/esm/utils/evictOldest.native.js +8 -0
  108. package/dist/esm/utils/evictOldest.native.js.map +1 -0
  109. package/dist/esm/utils/isResponse.js +1 -1
  110. package/dist/esm/utils/isResponse.js.map +1 -1
  111. package/dist/esm/utils/isResponse.mjs +1 -1
  112. package/dist/esm/utils/isResponse.mjs.map +1 -1
  113. package/dist/esm/utils/isResponse.native.js +1 -1
  114. package/dist/esm/utils/isResponse.native.js.map +1 -1
  115. package/dist/esm/vite/one-server-only.js +8 -7
  116. package/dist/esm/vite/one-server-only.js.map +1 -1
  117. package/dist/esm/vite/one-server-only.mjs +9 -6
  118. package/dist/esm/vite/one-server-only.mjs.map +1 -1
  119. package/dist/esm/vite/resolveResponse.js +15 -2
  120. package/dist/esm/vite/resolveResponse.js.map +1 -1
  121. package/dist/esm/vite/resolveResponse.mjs +16 -4
  122. package/dist/esm/vite/resolveResponse.mjs.map +1 -1
  123. package/dist/esm/vite/resolveResponse.native.js +16 -4
  124. package/dist/esm/vite/resolveResponse.native.js.map +1 -1
  125. package/package.json +13 -11
  126. package/src/Root.tsx +14 -1
  127. package/src/cli/build.ts +38 -12
  128. package/src/createApp.tsx +8 -2
  129. package/src/createHandleRequest.ts +9 -2
  130. package/src/fork/SSRNavigationContainer.tsx +30 -7
  131. package/src/router/linkingConfig.ts +2 -2
  132. package/src/serve.ts +134 -48
  133. package/src/server/oneServe.ts +153 -47
  134. package/src/utils/evictOldest.ts +13 -0
  135. package/src/utils/isResponse.ts +4 -4
  136. package/src/vite/one-server-only.tsx +25 -11
  137. package/src/vite/resolveResponse.ts +20 -1
  138. package/src/vite/types.ts +20 -2
  139. package/types/Root.d.ts.map +1 -1
  140. package/types/cli/build.d.ts.map +1 -1
  141. package/types/createApp.d.ts.map +1 -1
  142. package/types/createHandleRequest.d.ts +4 -0
  143. package/types/createHandleRequest.d.ts.map +1 -1
  144. package/types/fork/SSRNavigationContainer.d.ts.map +1 -1
  145. package/types/router/linkingConfig.d.ts.map +1 -1
  146. package/types/serve.d.ts.map +1 -1
  147. package/types/server/oneServe.d.ts.map +1 -1
  148. package/types/utils/evictOldest.d.ts +6 -0
  149. package/types/utils/evictOldest.d.ts.map +1 -0
  150. package/types/vite/one-server-only.d.ts +9 -3
  151. package/types/vite/one-server-only.d.ts.map +1 -1
  152. package/types/vite/resolveResponse.d.ts +4 -0
  153. package/types/vite/resolveResponse.d.ts.map +1 -1
  154. package/types/vite/types.d.ts +18 -2
  155. package/types/vite/types.d.ts.map +1 -1
package/dist/esm/serve.js CHANGED
@@ -8,40 +8,80 @@ process.on("uncaughtException", (err) => {
8
8
  });
9
9
  async function serve(args = {}) {
10
10
  if (args.cluster) {
11
- const cluster = await import("node:cluster"), { cpus } = await import("node:os");
12
- if (cluster.default.isPrimary) {
13
- const numWorkers = typeof args.cluster == "number" ? args.cluster : cpus().length;
14
- console.info(`[one] cluster: starting ${numWorkers} workers`);
15
- for (let i = 0; i < numWorkers; i++)
16
- cluster.default.fork();
17
- let recentCrashes = 0, lastCrashTime = 0;
18
- cluster.default.on("exit", (worker, code, signal) => {
19
- if (code === 0 || signal === "SIGTERM" || signal === "SIGINT") return;
20
- const now = Date.now();
21
- now - lastCrashTime < 5e3 ? recentCrashes++ : recentCrashes = 1, lastCrashTime = now, recentCrashes > numWorkers * 2 && (console.error("[one] too many worker crashes, stopping"), process.exit(1)), console.error(
22
- `[one] worker ${worker.process.pid} died (code ${code}, signal ${signal}), restarting`
23
- ), setTimeout(() => cluster.default.fork(), Math.min(recentCrashes * 500, 5e3));
24
- });
25
- const shutdown = () => {
26
- for (const id in cluster.default.workers)
27
- cluster.default.workers[id]?.process.kill("SIGTERM");
28
- setTimeout(() => process.exit(0), 5e3);
29
- };
30
- process.on("SIGINT", shutdown), process.on("SIGTERM", shutdown);
31
- return;
32
- }
11
+ const { cpus, platform } = await import("node:os"), numWorkers = typeof args.cluster == "number" ? args.cluster : cpus().length, [major, minor] = process.versions.node.split(".").map(Number);
12
+ return !["win32", "darwin"].includes(platform()) && (major > 22 || major === 22 && minor >= 12 || major >= 23) ? await serveWithReusePort(args, numWorkers) : await serveWithCluster(args, numWorkers);
13
+ }
14
+ return await startWorker(args);
15
+ }
16
+ async function serveWithReusePort(args, numWorkers) {
17
+ const { fork } = await import("node:child_process");
18
+ console.info(`[one] cluster: starting ${numWorkers} workers (SO_REUSEPORT)`);
19
+ const workers = [];
20
+ let recentCrashes = 0, lastCrashTime = 0;
21
+ function spawnWorker() {
22
+ const child = fork(
23
+ process.argv[1],
24
+ process.argv.slice(2).filter((a) => !a.startsWith("--cluster")),
25
+ {
26
+ env: { ...process.env, ONE_CLUSTER_WORKER: "1" },
27
+ stdio: "inherit"
28
+ }
29
+ );
30
+ workers.push(child), child.on("exit", (code, signal) => {
31
+ const idx = workers.indexOf(child);
32
+ if (idx >= 0 && workers.splice(idx, 1), code === 0 || signal === "SIGTERM" || signal === "SIGINT") return;
33
+ const now = Date.now();
34
+ now - lastCrashTime < 5e3 ? recentCrashes++ : recentCrashes = 1, lastCrashTime = now, recentCrashes > numWorkers * 2 && (console.error("[one] too many worker crashes, stopping"), process.exit(1)), console.error(
35
+ `[one] worker ${child.pid} died (code ${code}, signal ${signal}), restarting`
36
+ ), setTimeout(spawnWorker, Math.min(recentCrashes * 500, 5e3));
37
+ });
33
38
  }
34
- const outDir = args.outDir || (FSExtra.existsSync("buildInfo.json") ? "." : null) || "dist", buildInfo = await FSExtra.readJSON(`${outDir}/buildInfo.json`), { oneOptions } = buildInfo;
39
+ for (let i = 0; i < numWorkers; i++)
40
+ spawnWorker();
41
+ const shutdown = () => {
42
+ for (const w of workers)
43
+ w.kill("SIGTERM");
44
+ setTimeout(() => process.exit(0), 5e3);
45
+ };
46
+ process.on("SIGINT", shutdown), process.on("SIGTERM", shutdown), await new Promise(() => {
47
+ });
48
+ }
49
+ async function serveWithCluster(args, numWorkers) {
50
+ const cluster = await import("node:cluster");
51
+ if (cluster.default.isPrimary) {
52
+ console.info(`[one] cluster: starting ${numWorkers} workers (IPC)`);
53
+ for (let i = 0; i < numWorkers; i++)
54
+ cluster.default.fork();
55
+ let recentCrashes = 0, lastCrashTime = 0;
56
+ cluster.default.on("exit", (worker, code, signal) => {
57
+ if (code === 0 || signal === "SIGTERM" || signal === "SIGINT") return;
58
+ const now = Date.now();
59
+ now - lastCrashTime < 5e3 ? recentCrashes++ : recentCrashes = 1, lastCrashTime = now, recentCrashes > numWorkers * 2 && (console.error("[one] too many worker crashes, stopping"), process.exit(1)), console.error(
60
+ `[one] worker ${worker.process.pid} died (code ${code}, signal ${signal}), restarting`
61
+ ), setTimeout(() => cluster.default.fork(), Math.min(recentCrashes * 500, 5e3));
62
+ });
63
+ const shutdown = () => {
64
+ for (const id in cluster.default.workers)
65
+ cluster.default.workers[id]?.process.kill("SIGTERM");
66
+ setTimeout(() => process.exit(0), 5e3);
67
+ };
68
+ process.on("SIGINT", shutdown), process.on("SIGTERM", shutdown);
69
+ return;
70
+ }
71
+ return await startWorker(args);
72
+ }
73
+ async function startWorker(args) {
74
+ const outDir = args?.outDir || (FSExtra.existsSync("buildInfo.json") ? "." : null) || "dist", buildInfo = await FSExtra.readJSON(`${outDir}/buildInfo.json`), { oneOptions } = buildInfo;
35
75
  setServerGlobals(), setupBuildInfo(buildInfo), ensureExists(oneOptions);
36
76
  const { labelProcess } = await import("./cli/label-process"), { removeUndefined } = await import("./utils/removeUndefined"), { loadEnv, serve: vxrnServe, serveStaticAssets } = await import("vxrn/serve"), { oneServe } = await import("./server/oneServe");
37
- return labelProcess("serve"), args.loadEnv && await loadEnv("production"), await vxrnServe({
77
+ return labelProcess("serve"), args?.loadEnv && await loadEnv("production"), await vxrnServe({
38
78
  outDir: buildInfo.outDir || outDir,
39
- app: args.app,
79
+ app: args?.app,
40
80
  ...oneOptions.server,
41
81
  ...removeUndefined({
42
- port: args.port ? +args.port : void 0,
43
- host: args.host,
44
- compress: args.compress
82
+ port: args?.port ? +args.port : void 0,
83
+ host: args?.host,
84
+ compress: args?.compress
45
85
  }),
46
86
  async beforeRegisterRoutes(options, app) {
47
87
  await oneServe(oneOptions, buildInfo, app, { serveStaticAssets });
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/serve.ts"],
4
- "mappings": "AAAA,OAAO;AAEP,OAAO,aAAa;AAGpB,SAAS,wBAAwB;AACjC,SAAS,sBAAsB;AAC/B,SAAS,oBAAoB;AAG7B,QAAQ,GAAG,qBAAqB,CAAC,QAAQ;AACvC,UAAQ,MAAM,4BAA4B,KAAK,SAAS,GAAG;AAC7D,CAAC;AAED,eAAsB,MACpB,OAII,CAAC,GACL;AAEA,MAAI,KAAK,SAAS;AAChB,UAAM,UAAU,MAAM,OAAO,cAAc,GACrC,EAAE,KAAK,IAAI,MAAM,OAAO,SAAS;AAEvC,QAAI,QAAQ,QAAQ,WAAW;AAC7B,YAAM,aAAa,OAAO,KAAK,WAAY,WAAW,KAAK,UAAU,KAAK,EAAE;AAE5E,cAAQ,KAAK,2BAA2B,UAAU,UAAU;AAE5D,eAAS,IAAI,GAAG,IAAI,YAAY;AAC9B,gBAAQ,QAAQ,KAAK;AAIvB,UAAI,gBAAgB,GAChB,gBAAgB;AAEpB,cAAQ,QAAQ,GAAG,QAAQ,CAAC,QAAQ,MAAM,WAAW;AACnD,YAAI,SAAS,KAAK,WAAW,aAAa,WAAW,SAAU;AAE/D,cAAM,MAAM,KAAK,IAAI;AACrB,QAAI,MAAM,gBAAgB,MACxB,kBAEA,gBAAgB,GAElB,gBAAgB,KAEZ,gBAAgB,aAAa,MAC/B,QAAQ,MAAM,yCAAyC,GACvD,QAAQ,KAAK,CAAC,IAGhB,QAAQ;AAAA,UACN,gBAAgB,OAAO,QAAQ,GAAG,eAAe,IAAI,YAAY,MAAM;AAAA,QACzE,GACA,WAAW,MAAM,QAAQ,QAAQ,KAAK,GAAG,KAAK,IAAI,gBAAgB,KAAK,GAAI,CAAC;AAAA,MAC9E,CAAC;AAED,YAAM,WAAW,MAAM;AACrB,mBAAW,MAAM,QAAQ,QAAQ;AAC/B,kBAAQ,QAAQ,QAAQ,EAAE,GAAG,QAAQ,KAAK,SAAS;AAErD,mBAAW,MAAM,QAAQ,KAAK,CAAC,GAAG,GAAI;AAAA,MACxC;AACA,cAAQ,GAAG,UAAU,QAAQ,GAC7B,QAAQ,GAAG,WAAW,QAAQ;AAE9B;AAAA,IACF;AAAA,EACF;AAGA,QAAM,SACJ,KAAK,WAAW,QAAQ,WAAW,gBAAgB,IAAI,MAAM,SAAS,QAClE,YAAa,MAAM,QAAQ,SAAS,GAAG,MAAM,iBAAiB,GAC9D,EAAE,WAAW,IAAI;AAEvB,mBAAiB,GACjB,eAAe,SAAS,GACxB,aAAa,UAAU;AAEvB,QAAM,EAAE,aAAa,IAAI,MAAM,OAAO,qBAAqB,GACrD,EAAE,gBAAgB,IAAI,MAAM,OAAO,yBAAyB,GAC5D,EAAE,SAAS,OAAO,WAAW,kBAAkB,IAAI,MAAM,OAAO,YAAY,GAC5E,EAAE,SAAS,IAAI,MAAM,OAAO,mBAAmB;AAErD,sBAAa,OAAO,GAEhB,KAAK,WACP,MAAM,QAAQ,YAAY,GAGrB,MAAM,UAAU;AAAA,IACrB,QAAQ,UAAU,UAAU;AAAA,IAC5B,KAAK,KAAK;AAAA,IACV,GAAG,WAAW;AAAA,IACd,GAAG,gBAAgB;AAAA,MACjB,MAAM,KAAK,OAAO,CAAC,KAAK,OAAO;AAAA,MAC/B,MAAM,KAAK;AAAA,MACX,UAAU,KAAK;AAAA,IACjB,CAAC;AAAA,IAED,MAAM,qBAAqB,SAAS,KAAK;AACvC,YAAM,SAAS,YAAY,WAAW,KAAK,EAAE,kBAAkB,CAAC;AAAA,IAClE;AAAA,IAEA,MAAM,oBAAoB,SAAS,KAAK;AAAA,IAAC;AAAA,EAC3C,CAAC;AACH;",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
@@ -8,30 +8,69 @@ process.on("uncaughtException", err => {
8
8
  });
9
9
  async function serve(args = {}) {
10
10
  if (args.cluster) {
11
- const cluster = await import("node:cluster"),
12
- {
13
- cpus
14
- } = await import("node:os");
15
- if (cluster.default.isPrimary) {
16
- const numWorkers = typeof args.cluster == "number" ? args.cluster : cpus().length;
17
- console.info(`[one] cluster: starting ${numWorkers} workers`);
18
- for (let i = 0; i < numWorkers; i++) cluster.default.fork();
19
- let recentCrashes = 0,
20
- lastCrashTime = 0;
21
- cluster.default.on("exit", (worker, code, signal) => {
22
- if (code === 0 || signal === "SIGTERM" || signal === "SIGINT") return;
23
- const now = Date.now();
24
- now - lastCrashTime < 5e3 ? recentCrashes++ : recentCrashes = 1, lastCrashTime = now, 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(() => cluster.default.fork(), Math.min(recentCrashes * 500, 5e3));
25
- });
26
- const shutdown = () => {
27
- for (const id in cluster.default.workers) cluster.default.workers[id]?.process.kill("SIGTERM");
28
- setTimeout(() => process.exit(0), 5e3);
29
- };
30
- process.on("SIGINT", shutdown), process.on("SIGTERM", shutdown);
31
- return;
32
- }
11
+ const {
12
+ cpus,
13
+ platform
14
+ } = await import("node:os"),
15
+ numWorkers = typeof args.cluster == "number" ? args.cluster : cpus().length,
16
+ [major, minor] = process.versions.node.split(".").map(Number);
17
+ return !["win32", "darwin"].includes(platform()) && (major > 22 || major === 22 && minor >= 12 || major >= 23) ? await serveWithReusePort(args, numWorkers) : await serveWithCluster(args, numWorkers);
18
+ }
19
+ return await startWorker(args);
20
+ }
21
+ async function serveWithReusePort(args, numWorkers) {
22
+ const {
23
+ fork
24
+ } = await import("node:child_process");
25
+ console.info(`[one] cluster: starting ${numWorkers} workers (SO_REUSEPORT)`);
26
+ const workers = [];
27
+ let recentCrashes = 0,
28
+ lastCrashTime = 0;
29
+ function spawnWorker() {
30
+ const child = fork(process.argv[1], process.argv.slice(2).filter(a => !a.startsWith("--cluster")), {
31
+ env: {
32
+ ...process.env,
33
+ ONE_CLUSTER_WORKER: "1"
34
+ },
35
+ stdio: "inherit"
36
+ });
37
+ workers.push(child), child.on("exit", (code, signal) => {
38
+ const idx = workers.indexOf(child);
39
+ if (idx >= 0 && workers.splice(idx, 1), code === 0 || signal === "SIGTERM" || signal === "SIGINT") return;
40
+ const now = Date.now();
41
+ now - lastCrashTime < 5e3 ? recentCrashes++ : recentCrashes = 1, lastCrashTime = now, 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));
42
+ });
33
43
  }
34
- const outDir = args.outDir || (FSExtra.existsSync("buildInfo.json") ? "." : null) || "dist",
44
+ for (let i = 0; i < numWorkers; i++) spawnWorker();
45
+ const shutdown = () => {
46
+ for (const w of workers) w.kill("SIGTERM");
47
+ setTimeout(() => process.exit(0), 5e3);
48
+ };
49
+ process.on("SIGINT", shutdown), process.on("SIGTERM", shutdown), await new Promise(() => {});
50
+ }
51
+ async function serveWithCluster(args, numWorkers) {
52
+ const cluster = await import("node:cluster");
53
+ if (cluster.default.isPrimary) {
54
+ console.info(`[one] cluster: starting ${numWorkers} workers (IPC)`);
55
+ for (let i = 0; i < numWorkers; i++) cluster.default.fork();
56
+ let recentCrashes = 0,
57
+ lastCrashTime = 0;
58
+ cluster.default.on("exit", (worker, code, signal) => {
59
+ if (code === 0 || signal === "SIGTERM" || signal === "SIGINT") return;
60
+ const now = Date.now();
61
+ now - lastCrashTime < 5e3 ? recentCrashes++ : recentCrashes = 1, lastCrashTime = now, 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(() => cluster.default.fork(), Math.min(recentCrashes * 500, 5e3));
62
+ });
63
+ const shutdown = () => {
64
+ for (const id in cluster.default.workers) cluster.default.workers[id]?.process.kill("SIGTERM");
65
+ setTimeout(() => process.exit(0), 5e3);
66
+ };
67
+ process.on("SIGINT", shutdown), process.on("SIGTERM", shutdown);
68
+ return;
69
+ }
70
+ return await startWorker(args);
71
+ }
72
+ async function startWorker(args) {
73
+ const outDir = args?.outDir || (FSExtra.existsSync("buildInfo.json") ? "." : null) || "dist",
35
74
  buildInfo = await FSExtra.readJSON(`${outDir}/buildInfo.json`),
36
75
  {
37
76
  oneOptions
@@ -51,14 +90,14 @@ async function serve(args = {}) {
51
90
  {
52
91
  oneServe
53
92
  } = await import("./server/oneServe.mjs");
54
- return labelProcess("serve"), args.loadEnv && (await loadEnv("production")), await vxrnServe({
93
+ return labelProcess("serve"), args?.loadEnv && (await loadEnv("production")), await vxrnServe({
55
94
  outDir: buildInfo.outDir || outDir,
56
- app: args.app,
95
+ app: args?.app,
57
96
  ...oneOptions.server,
58
97
  ...removeUndefined({
59
- port: args.port ? +args.port : void 0,
60
- host: args.host,
61
- compress: args.compress
98
+ port: args?.port ? +args.port : void 0,
99
+ host: args?.host,
100
+ compress: args?.compress
62
101
  }),
63
102
  async beforeRegisterRoutes(options, app) {
64
103
  await oneServe(oneOptions, buildInfo, app, {
@@ -1 +1 @@
1
- {"version":3,"names":["FSExtra","setServerGlobals","setupBuildInfo","ensureExists","process","on","err","console","error","stack","serve","args","cluster","cpus","default","isPrimary","numWorkers","length","info","i","fork","recentCrashes","lastCrashTime","worker","code","signal","now","Date","exit","pid","setTimeout","Math","min","shutdown","id","workers","kill","outDir","existsSync","buildInfo","readJSON","oneOptions","labelProcess","removeUndefined","loadEnv","vxrnServe","serveStaticAssets","oneServe","app","server","port","host","compress","beforeRegisterRoutes","options","afterRegisterRoutes"],"sources":["../../src/serve.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["FSExtra","setServerGlobals","setupBuildInfo","ensureExists","process","on","err","console","error","stack","serve","args","cluster","cpus","platform","numWorkers","length","major","minor","versions","node","split","map","Number","includes","serveWithReusePort","serveWithCluster","startWorker","fork","info","workers","recentCrashes","lastCrashTime","spawnWorker","child","argv","slice","filter","a","startsWith","env","ONE_CLUSTER_WORKER","stdio","push","code","signal","idx","indexOf","splice","now","Date","exit","pid","setTimeout","Math","min","i","shutdown","w","kill","Promise","default","isPrimary","worker","id","outDir","existsSync","buildInfo","readJSON","oneOptions","labelProcess","removeUndefined","loadEnv","vxrnServe","serveStaticAssets","oneServe","app","server","port","host","compress","beforeRegisterRoutes","options","afterRegisterRoutes"],"sources":["../../src/serve.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -9,38 +9,99 @@ process.on("uncaughtException", function (err) {
9
9
  async function serve() {
10
10
  var args = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
11
11
  if (args.cluster) {
12
- var cluster = await import("cluster"),
13
- {
14
- cpus
15
- } = await import("os");
16
- if (cluster.default.isPrimary) {
17
- var numWorkers = typeof args.cluster == "number" ? args.cluster : cpus().length;
18
- console.info(`[one] cluster: starting ${numWorkers} workers`);
19
- for (var i = 0; i < numWorkers; i++) cluster.default.fork();
20
- var recentCrashes = 0,
21
- lastCrashTime = 0;
22
- cluster.default.on("exit", function (worker, code, signal) {
23
- if (!(code === 0 || signal === "SIGTERM" || signal === "SIGINT")) {
24
- var now = Date.now();
25
- now - lastCrashTime < 5e3 ? recentCrashes++ : recentCrashes = 1, lastCrashTime = now, 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 () {
26
- return cluster.default.fork();
27
- }, Math.min(recentCrashes * 500, 5e3));
28
- }
29
- });
30
- var shutdown = function () {
31
- for (var id in cluster.default.workers) {
32
- var _cluster_default_workers_id;
33
- (_cluster_default_workers_id = cluster.default.workers[id]) === null || _cluster_default_workers_id === void 0 || _cluster_default_workers_id.process.kill("SIGTERM");
34
- }
35
- setTimeout(function () {
36
- return process.exit(0);
37
- }, 5e3);
38
- };
39
- process.on("SIGINT", shutdown), process.on("SIGTERM", shutdown);
40
- return;
12
+ var {
13
+ cpus,
14
+ platform
15
+ } = await import("os"),
16
+ numWorkers = typeof args.cluster == "number" ? args.cluster : cpus().length,
17
+ [major, minor] = process.versions.node.split(".").map(Number),
18
+ canReusePort = !["win32", "darwin"].includes(platform()) && (major > 22 || major === 22 && minor >= 12 || major >= 23);
19
+ return canReusePort ? await serveWithReusePort(args, numWorkers) : await serveWithCluster(args, numWorkers);
20
+ }
21
+ return await startWorker(args);
22
+ }
23
+ async function serveWithReusePort(args, numWorkers) {
24
+ var {
25
+ fork
26
+ } = await import("child_process");
27
+ console.info(`[one] cluster: starting ${numWorkers} workers (SO_REUSEPORT)`);
28
+ var workers = [],
29
+ recentCrashes = 0,
30
+ lastCrashTime = 0;
31
+ function spawnWorker() {
32
+ var child = fork(process.argv[1], process.argv.slice(2).filter(function (a) {
33
+ return !a.startsWith("--cluster");
34
+ }), {
35
+ env: {
36
+ ...process.env,
37
+ ONE_CLUSTER_WORKER: "1"
38
+ },
39
+ stdio: "inherit"
40
+ });
41
+ workers.push(child), child.on("exit", function (code, signal) {
42
+ var idx = workers.indexOf(child);
43
+ if (idx >= 0 && workers.splice(idx, 1), !(code === 0 || signal === "SIGTERM" || signal === "SIGINT")) {
44
+ var now = Date.now();
45
+ now - lastCrashTime < 5e3 ? recentCrashes++ : recentCrashes = 1, lastCrashTime = now, 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));
46
+ }
47
+ });
48
+ }
49
+ for (var i = 0; i < numWorkers; i++) spawnWorker();
50
+ var shutdown = function () {
51
+ var _iteratorNormalCompletion = !0,
52
+ _didIteratorError = !1,
53
+ _iteratorError = void 0;
54
+ try {
55
+ for (var _iterator = workers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) {
56
+ var w = _step.value;
57
+ w.kill("SIGTERM");
58
+ }
59
+ } catch (err) {
60
+ _didIteratorError = !0, _iteratorError = err;
61
+ } finally {
62
+ try {
63
+ !_iteratorNormalCompletion && _iterator.return != null && _iterator.return();
64
+ } finally {
65
+ if (_didIteratorError) throw _iteratorError;
66
+ }
41
67
  }
68
+ setTimeout(function () {
69
+ return process.exit(0);
70
+ }, 5e3);
71
+ };
72
+ process.on("SIGINT", shutdown), process.on("SIGTERM", shutdown), await new Promise(function () {});
73
+ }
74
+ async function serveWithCluster(args, numWorkers) {
75
+ var cluster = await import("cluster");
76
+ if (cluster.default.isPrimary) {
77
+ console.info(`[one] cluster: starting ${numWorkers} workers (IPC)`);
78
+ for (var i = 0; i < numWorkers; i++) cluster.default.fork();
79
+ var recentCrashes = 0,
80
+ lastCrashTime = 0;
81
+ cluster.default.on("exit", function (worker, code, signal) {
82
+ if (!(code === 0 || signal === "SIGTERM" || signal === "SIGINT")) {
83
+ var now = Date.now();
84
+ now - lastCrashTime < 5e3 ? recentCrashes++ : recentCrashes = 1, lastCrashTime = now, 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 () {
85
+ return cluster.default.fork();
86
+ }, Math.min(recentCrashes * 500, 5e3));
87
+ }
88
+ });
89
+ var shutdown = function () {
90
+ for (var id in cluster.default.workers) {
91
+ var _cluster_default_workers_id;
92
+ (_cluster_default_workers_id = cluster.default.workers[id]) === null || _cluster_default_workers_id === void 0 || _cluster_default_workers_id.process.kill("SIGTERM");
93
+ }
94
+ setTimeout(function () {
95
+ return process.exit(0);
96
+ }, 5e3);
97
+ };
98
+ process.on("SIGINT", shutdown), process.on("SIGTERM", shutdown);
99
+ return;
42
100
  }
43
- var outDir = args.outDir || (FSExtra.existsSync("buildInfo.json") ? "." : null) || "dist",
101
+ return await startWorker(args);
102
+ }
103
+ async function startWorker(args) {
104
+ var outDir = args?.outDir || (FSExtra.existsSync("buildInfo.json") ? "." : null) || "dist",
44
105
  buildInfo = await FSExtra.readJSON(`${outDir}/buildInfo.json`),
45
106
  {
46
107
  oneOptions
@@ -60,14 +121,14 @@ async function serve() {
60
121
  {
61
122
  oneServe
62
123
  } = await import("./server/oneServe.native.js");
63
- return labelProcess("serve"), args.loadEnv && (await loadEnv("production")), await vxrnServe({
124
+ return labelProcess("serve"), args?.loadEnv && (await loadEnv("production")), await vxrnServe({
64
125
  outDir: buildInfo.outDir || outDir,
65
- app: args.app,
126
+ app: args?.app,
66
127
  ...oneOptions.server,
67
128
  ...removeUndefined({
68
- port: args.port ? +args.port : void 0,
69
- host: args.host,
70
- compress: args.compress
129
+ port: args?.port ? +args.port : void 0,
130
+ host: args?.host,
131
+ compress: args?.compress
71
132
  }),
72
133
  async beforeRegisterRoutes(options, app) {
73
134
  await oneServe(oneOptions, buildInfo, app, {
@@ -1 +1 @@
1
- {"version":3,"names":["FSExtra","setServerGlobals","setupBuildInfo","ensureExists","process","on","err","console","error","stack","serve","args","arguments","length","cluster","cpus","default","isPrimary","numWorkers","info","i","fork","recentCrashes","lastCrashTime","worker","code","signal","now","Date","exit","pid","setTimeout","Math","min","shutdown","id","workers","_cluster_default_workers_id","kill","outDir","existsSync","buildInfo","readJSON","oneOptions","labelProcess","removeUndefined","loadEnv","vxrnServe","serveStaticAssets","oneServe","app","server","port","host","compress","beforeRegisterRoutes","options"],"sources":["../../src/serve.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["FSExtra","setServerGlobals","setupBuildInfo","ensureExists","process","on","err","console","error","stack","serve","args","arguments","length","cluster","cpus","platform","numWorkers","major","minor","versions","node","split","map","Number","canReusePort","includes","serveWithReusePort","serveWithCluster","startWorker","fork","info","workers","recentCrashes","lastCrashTime","spawnWorker","child","argv","slice","filter","a","startsWith","env","ONE_CLUSTER_WORKER","stdio","push","code","signal","idx","indexOf","splice","now","Date","exit","pid","setTimeout","Math","min","i","shutdown","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","Symbol","iterator","_step","next","done","w","value","kill","return","Promise","default","isPrimary","worker","id","_cluster_default_workers_id"],"sources":["../../src/serve.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}