vxrn 1.21.6 → 1.21.7
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.
- package/dist/config/getOptionsFilled.mjs +3 -5
- package/dist/config/getOptionsFilled.mjs.map +1 -1
- package/dist/config/getOptionsFilled.native.js +3 -5
- package/dist/config/getOptionsFilled.native.js.map +1 -1
- package/dist/exports/clean.mjs +84 -16
- package/dist/exports/clean.mjs.map +1 -1
- package/dist/exports/clean.native.js +89 -16
- package/dist/exports/clean.native.js.map +1 -1
- package/dist/exports/clean.test.mjs +81 -0
- package/dist/exports/clean.test.mjs.map +1 -0
- package/dist/exports/clean.test.native.js +88 -0
- package/dist/exports/clean.test.native.js.map +1 -0
- package/dist/exports/dev.mjs +8 -3
- package/dist/exports/dev.mjs.map +1 -1
- package/dist/exports/dev.native.js +8 -3
- package/dist/exports/dev.native.js.map +1 -1
- package/dist/serve/node.mjs +20 -24
- package/dist/serve/node.mjs.map +1 -1
- package/dist/serve/node.native.js +20 -22
- package/dist/serve/node.native.js.map +1 -1
- package/dist/serve/node.test.mjs +60 -0
- package/dist/serve/node.test.mjs.map +1 -0
- package/dist/serve/node.test.native.js +72 -0
- package/dist/serve/node.test.native.js.map +1 -0
- package/dist/utils/state.mjs +11 -1
- package/dist/utils/state.mjs.map +1 -1
- package/dist/utils/state.native.js +11 -1
- package/dist/utils/state.native.js.map +1 -1
- package/package.json +11 -11
- package/src/config/getOptionsFilled.ts +2 -4
- package/src/exports/clean.test.ts +82 -0
- package/src/exports/clean.ts +90 -26
- package/src/exports/dev.ts +8 -3
- package/src/serve/node.test.ts +63 -0
- package/src/serve/node.ts +22 -26
- package/src/utils/state.ts +9 -1
- package/types/config/getOptionsFilled.d.ts +2 -0
- package/types/config/getOptionsFilled.d.ts.map +1 -1
- package/types/exports/build.d.ts +1 -0
- package/types/exports/build.d.ts.map +1 -1
- package/types/exports/clean.d.ts +6 -9
- package/types/exports/clean.d.ts.map +1 -1
- package/types/exports/clean.test.d.ts.map +1 -0
- package/types/exports/dev.d.ts.map +1 -1
- package/types/serve/node.d.ts.map +1 -1
- package/types/serve/node.test.d.ts.map +1 -0
- package/types/utils/state.d.ts.map +1 -1
|
@@ -41,7 +41,7 @@ var dev = async function (optionsIn) {
|
|
|
41
41
|
printServerUrls
|
|
42
42
|
} = await import("../utils/printServerUrls.native.js");
|
|
43
43
|
var {
|
|
44
|
-
|
|
44
|
+
prepareCacheForVersion
|
|
45
45
|
} = await import("./clean.native.js");
|
|
46
46
|
var {
|
|
47
47
|
filterViteServerResolvedUrls
|
|
@@ -109,8 +109,13 @@ export default defineConfig({
|
|
|
109
109
|
cacheDir
|
|
110
110
|
} = options;
|
|
111
111
|
bindKeypressInput();
|
|
112
|
-
|
|
113
|
-
|
|
112
|
+
var cacheWasCleaned = await prepareCacheForVersion({
|
|
113
|
+
root: options.root,
|
|
114
|
+
cacheDir,
|
|
115
|
+
versionHash: options.versionHash,
|
|
116
|
+
forceClean: optionsIn.clean === true
|
|
117
|
+
});
|
|
118
|
+
if (options.clean || cacheWasCleaned) {
|
|
114
119
|
process.env.METRO_RESET_CACHE = "1";
|
|
115
120
|
}
|
|
116
121
|
await ensureDir(cacheDir);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["FSExtra","colors","debounce","normalizePath","ensureDir","setupOrphanDetection","process","platform","initialPpid","ppid","interval","setInterval","exit","unref","dev","optionsIn","_ref","_config_plugins_find____get","_config_plugins_find_","_config_plugins_find","_config_plugins","devStartTime","Date","now","env","IS_VXRN_CLI","debug","_process_env","DEBUG","startUserInterface","bindKeypressInput","fillOptions","getViteServerConfig","printServerUrls","
|
|
1
|
+
{"version":3,"names":["FSExtra","colors","debounce","normalizePath","ensureDir","setupOrphanDetection","process","platform","initialPpid","ppid","interval","setInterval","exit","unref","dev","optionsIn","_ref","_config_plugins_find____get","_config_plugins_find_","_config_plugins_find","_config_plugins","devStartTime","Date","now","env","IS_VXRN_CLI","debug","_process_env","DEBUG","startUserInterface","bindKeypressInput","fillOptions","getViteServerConfig","printServerUrls","prepareCacheForVersion","filterViteServerResolvedUrls","removeUndefined","createServer","loadConfigFromFile","config","mode","command","console","error","extraConfig","resolve","extraConfigPath","extraResult","mergeConfig","info","cyan","warn","yellow","oneServerConfig","plugins","find","x","_x_","Array","isArray","server","options","cacheDir","cacheWasCleaned","root","versionHash","forceClean","clean","METRO_RESET_CACHE","serverConfig","viteServer","isClosing","start","_viteServer_httpServer","connectedNativeClients","pendingTransforms","Map","watcher","addListener","path","normalizedPath","includes","normalizedCwd","cwd","id","replace","endsWith","has","set","transformRequest","err","get","httpServer","on","listen","totalStartupTime","bold","viteServerResolvedUrls","resolvedUrls","logger","closePromise","Promise","res","_viteServer_httpServer2","stop","removeAllListeners"],"sources":["../../src/exports/dev.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/dist/serve/node.mjs
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { createServer } from "node:http";
|
|
2
2
|
import { networkInterfaces, platform } from "node:os";
|
|
3
3
|
import { getRequestListener } from "@hono/node-server";
|
|
4
|
-
import { serve as honoServe } from "@hono/node-server";
|
|
5
4
|
import colors from "picocolors";
|
|
6
5
|
function getNetworkAddress() {
|
|
7
6
|
for (const addresses of Object.values(networkInterfaces())) {
|
|
@@ -20,22 +19,20 @@ const canReusePort = !["win32", "darwin"].includes(platform()) && (isBun || (()
|
|
|
20
19
|
async function honoServeNode(app, options) {
|
|
21
20
|
const port = options.port ?? 3e3;
|
|
22
21
|
const host = options.host ?? "0.0.0.0";
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
22
|
+
const listener = getRequestListener((request, env) => {
|
|
23
|
+
request.headers.delete("x-vxrn-peer-address");
|
|
24
|
+
const address = env.incoming.socket.remoteAddress;
|
|
25
|
+
if (address) request.headers.set("x-vxrn-peer-address", address);
|
|
26
|
+
return app.fetch(request, env);
|
|
27
|
+
});
|
|
28
|
+
const server = createServer(listener);
|
|
29
|
+
server.listen({
|
|
30
|
+
port,
|
|
31
|
+
host,
|
|
32
|
+
...(canReusePort && process.env.ONE_CLUSTER_WORKER === "1" ? {
|
|
30
33
|
reusePort: true
|
|
31
|
-
})
|
|
32
|
-
}
|
|
33
|
-
server = honoServe({
|
|
34
|
-
fetch: app.fetch,
|
|
35
|
-
port,
|
|
36
|
-
hostname: host
|
|
37
|
-
});
|
|
38
|
-
}
|
|
34
|
+
} : {})
|
|
35
|
+
});
|
|
39
36
|
const colorUrl = url => colors.cyan(url.replace(/:(\d+)\//, (_, port2) => `:${colors.bold(port2)}/`));
|
|
40
37
|
const displayHost = host === "0.0.0.0" ? "localhost" : host;
|
|
41
38
|
const localUrl = `http://${displayHost}:${port}/`;
|
|
@@ -49,15 +46,14 @@ async function honoServeNode(app, options) {
|
|
|
49
46
|
}
|
|
50
47
|
}
|
|
51
48
|
console.info();
|
|
52
|
-
const shutdown = () =>
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
process.on("SIGINT", shutdown);
|
|
58
|
-
process.on("SIGTERM", shutdown);
|
|
59
|
-
await new Promise(res => {
|
|
49
|
+
const shutdown = () => server.close();
|
|
50
|
+
process.once("SIGINT", shutdown);
|
|
51
|
+
process.once("SIGTERM", shutdown);
|
|
52
|
+
await new Promise((res, rej) => {
|
|
53
|
+
server.once("error", rej);
|
|
60
54
|
server.on("close", () => {
|
|
55
|
+
process.off("SIGINT", shutdown);
|
|
56
|
+
process.off("SIGTERM", shutdown);
|
|
61
57
|
res();
|
|
62
58
|
});
|
|
63
59
|
});
|
package/dist/serve/node.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createServer","networkInterfaces","platform","getRequestListener","
|
|
1
|
+
{"version":3,"names":["createServer","networkInterfaces","platform","getRequestListener","colors","getNetworkAddress","addresses","Object","values","addr","family","internal","address","isBun","process","versions","bun","canReusePort","includes","major","minor","node","split","map","Number","honoServeNode","app","options","port","host","listener","request","env","headers","delete","incoming","socket","remoteAddress","set","fetch","server","listen","ONE_CLUSTER_WORKER","reusePort","colorUrl","url","cyan","replace","_","port2","bold","displayHost","localUrl","console","info","green","networkHost","networkUrl","shutdown","close","once","Promise","res","rej","on","off"],"sources":["../../src/serve/node.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { createServer } from "http";
|
|
2
2
|
import { networkInterfaces, platform } from "os";
|
|
3
3
|
import { getRequestListener } from "@hono/node-server";
|
|
4
|
-
import { serve as honoServe } from "@hono/node-server";
|
|
5
4
|
import colors from "picocolors";
|
|
6
5
|
function getNetworkAddress() {
|
|
7
6
|
var _iteratorNormalCompletion = true,
|
|
@@ -59,22 +58,20 @@ async function honoServeNode(app, options) {
|
|
|
59
58
|
var _options_port, _options_host;
|
|
60
59
|
var port = (_options_port = options.port) !== null && _options_port !== void 0 ? _options_port : 3e3;
|
|
61
60
|
var host = (_options_host = options.host) !== null && _options_host !== void 0 ? _options_host : "0.0.0.0";
|
|
62
|
-
var
|
|
63
|
-
|
|
64
|
-
var
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
61
|
+
var listener = getRequestListener(function (request, env) {
|
|
62
|
+
request.headers.delete("x-vxrn-peer-address");
|
|
63
|
+
var address = env.incoming.socket.remoteAddress;
|
|
64
|
+
if (address) request.headers.set("x-vxrn-peer-address", address);
|
|
65
|
+
return app.fetch(request, env);
|
|
66
|
+
});
|
|
67
|
+
var server = createServer(listener);
|
|
68
|
+
server.listen({
|
|
69
|
+
port,
|
|
70
|
+
host,
|
|
71
|
+
...(canReusePort && process.env.ONE_CLUSTER_WORKER === "1" ? {
|
|
69
72
|
reusePort: true
|
|
70
|
-
})
|
|
71
|
-
}
|
|
72
|
-
server = honoServe({
|
|
73
|
-
fetch: app.fetch,
|
|
74
|
-
port,
|
|
75
|
-
hostname: host
|
|
76
|
-
});
|
|
77
|
-
}
|
|
73
|
+
} : {})
|
|
74
|
+
});
|
|
78
75
|
var colorUrl = function (url) {
|
|
79
76
|
return colors.cyan(url.replace(/:(\d+)\//, function (_, port2) {
|
|
80
77
|
return `:${colors.bold(port2)}/`;
|
|
@@ -93,14 +90,15 @@ async function honoServeNode(app, options) {
|
|
|
93
90
|
}
|
|
94
91
|
console.info();
|
|
95
92
|
var shutdown = function () {
|
|
96
|
-
server.close(
|
|
97
|
-
process.exit(0);
|
|
98
|
-
});
|
|
93
|
+
return server.close();
|
|
99
94
|
};
|
|
100
|
-
process.
|
|
101
|
-
process.
|
|
102
|
-
await new Promise(function (res) {
|
|
95
|
+
process.once("SIGINT", shutdown);
|
|
96
|
+
process.once("SIGTERM", shutdown);
|
|
97
|
+
await new Promise(function (res, rej) {
|
|
98
|
+
server.once("error", rej);
|
|
103
99
|
server.on("close", function () {
|
|
100
|
+
process.off("SIGINT", shutdown);
|
|
101
|
+
process.off("SIGTERM", shutdown);
|
|
104
102
|
res();
|
|
105
103
|
});
|
|
106
104
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createServer","networkInterfaces","platform","getRequestListener","
|
|
1
|
+
{"version":3,"names":["createServer","networkInterfaces","platform","getRequestListener","colors","getNetworkAddress","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","Object","values","Symbol","iterator","_step","next","done","addresses","value","_iteratorNormalCompletion1","_didIteratorError1","_iteratorError1","_iterator1","_step1","addr","family","internal","address","err","return","isBun","process","versions","bun","canReusePort","includes","major","minor","node","split","map","Number","honoServeNode","app","options","_options_port","_options_host","port","host","listener","request","env"],"sources":["../../src/serve/node.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,YAAA,QAAoB;AAC7B,SAASC,iBAAA,EAAmBC,QAAA,QAAgB;AAC5C,SAASC,kBAAA,QAA0B;AAEnC,OAAOC,MAAA,MAAY;AAGnB,SAASC,kBAAA,EAAwC;EAC/C,IAAAC,yBAAwB,GAAO;IAAOC,iBAAA,GAAmB,KAAG;IAAAC,cAAA;EAC1D;IACE,SAAIC,SAAK,GAAAC,MAAW,CAAAC,MAAW,CAAAV,iBAAe,IAAAW,MAAA,CAAAC,QAAA,KAAAC,KAAA,IAAAR,yBAAA,IAAAQ,KAAA,GAAAL,SAAA,CAAAM,IAAA,IAAAC,IAAA,GAAAV,yBAAA;MAC5C,IAAAW,SAAO,GAAKH,KAAA,CAAAI,KAAA;MACd,IAAAC,0BAAA;QAAAC,kBAAA;QAAAC,eAAA;MACF;QACF,SAAAC,UAAA,IAAAL,SAAA,QAAAL,MAAA,CAAAC,QAAA,KAAAU,MAAA,IAAAJ,0BAAA,IAAAI,MAAA,GAAAD,UAAA,CAAAP,IAAA,IAAAC,IAAA,GAAAG,0BAAA;UACF,IAAAK,IAAA,GAAAD,MAAA,CAAAL,KAAA;UAEM,IAAQM,IAAA,CAAAC,MAAO,KAAQ,UAAS,CAAAD,IAAA,CAAQE,QAAA;YAIxC,OAAAF,IACF,CAAAG,OAAA;UAGS;QACP;MACC,SAAAC,GAAA;QAIPR,kBAAsB,GAAc;QAC5BC,eAAe,GAAAO,GAAA;MACrB,UAAa;QAEP;UACJ,IAAQ,CAAAT,0BAAe,IAAAG,UAAqB,CAAAO,MAAA;YACtCP,UAAU,CAAAO,MAAI;UAChB;QACJ,UAAW;UACZ,IAAAT,kBAAA;YACK,MAASC,eAAa;UACrB;QACL;MACA;IACA;EAGF,CAAC,QAAAO,GAAA;IAEDrB,iBAAkB,OAChB;IAEFC,cAAM,GAAAoB,GAAc;EACpB,UAAM;IAEN;MACA,IAAQ,CAAAtB,yBAAuB,IAAAG,SAAS,CAAAoB,MAAO,IAAK,MAAO;QAEvDpB,SAAS,CAAAoB,MAAA,EAAW;MACtB;IACA,UAAI;MACF,IAAAtB,iBAAmB;QACnB,MAAQC,cAAA;MAAA;IACoE;EAC5E;AACF;AAEF,IAAAsB,KAAA,GAAQ,OAAKC,OAAA,CAAAC,QAAA,CAAAC,GAAA;AAEb,IAAAC,YAAM,GAAW,EAEjB,SACA,QAAQ,CAER,CAAAC,QAAM,CAAAjC,QAAI,CAAc,CAAC,MAAK4B,KAAA,IAAQ;EACpC,KAAAM,KAAO,EAAAC,KAAK,IAAAN,OAAY,CAAAC,QAAA,CAAAM,IAAA,CAAAC,KAAA,MAAAC,GAAA,CAAAC,MAAA;EACxB,OAAAL,KAAU,SAASA,KAAA,KAAM,MAAAC,KAAA,UAAAD,KAAA;AACvB;AACA,eAAQM,aAAIA,CAAWC,GAAA,EAAAC,OAAQ;EAC/B,IAAAC,aAAI,EAAAC,aAAA;EAAA,IACLC,IAAA,IAAAF,aAAA,GAAAD,OAAA,CAAAG,IAAA,cAAAF,aAAA,cAAAA,aAAA;EACH,IAACG,IAAA,IAAAF,aAAA,GAAAF,OAAA,CAAAI,IAAA,cAAAF,aAAA,cAAAA,aAAA;EACH,IAAAG,QAAA,GAAA9C,kBAAA,WAAA+C,OAAA,EAAAC,GAAA","ignoreList":[]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { createServer } from "node:http";
|
|
2
|
+
import { Hono } from "hono";
|
|
3
|
+
import { describe, expect, test } from "vitest";
|
|
4
|
+
import { honoServeNode } from "./node.mjs";
|
|
5
|
+
describe("honoServeNode", () => {
|
|
6
|
+
test("rejects when the listener cannot bind", async () => {
|
|
7
|
+
const occupied = createServer();
|
|
8
|
+
await new Promise((resolve, reject) => {
|
|
9
|
+
occupied.once("error", reject);
|
|
10
|
+
occupied.listen(0, "127.0.0.1", resolve);
|
|
11
|
+
});
|
|
12
|
+
const address = occupied.address();
|
|
13
|
+
if (!address || typeof address === "string") throw new Error("missing test port");
|
|
14
|
+
const app = new Hono().get("/health", context => context.text("ok"));
|
|
15
|
+
await expect(honoServeNode(app, {
|
|
16
|
+
host: "127.0.0.1",
|
|
17
|
+
port: address.port
|
|
18
|
+
})).rejects.toMatchObject({
|
|
19
|
+
code: "EADDRINUSE"
|
|
20
|
+
});
|
|
21
|
+
await new Promise((resolve, reject) => occupied.close(error => error ? reject(error) : resolve()));
|
|
22
|
+
});
|
|
23
|
+
test("overwrites the trusted peer address header from the socket", async () => {
|
|
24
|
+
const reservation = createServer();
|
|
25
|
+
await new Promise((resolve, reject) => {
|
|
26
|
+
reservation.once("error", reject);
|
|
27
|
+
reservation.listen(0, "127.0.0.1", resolve);
|
|
28
|
+
});
|
|
29
|
+
const address = reservation.address();
|
|
30
|
+
if (!address || typeof address === "string") throw new Error("missing test port");
|
|
31
|
+
await new Promise((resolve, reject) => reservation.close(error => error ? reject(error) : resolve()));
|
|
32
|
+
const app = new Hono().get("/peer", context => context.text(context.req.header("x-vxrn-peer-address") || ""));
|
|
33
|
+
const running = honoServeNode(app, {
|
|
34
|
+
host: "127.0.0.1",
|
|
35
|
+
port: address.port
|
|
36
|
+
});
|
|
37
|
+
await new Promise((resolve, reject) => {
|
|
38
|
+
const startedAt = Date.now();
|
|
39
|
+
const probe = async () => {
|
|
40
|
+
try {
|
|
41
|
+
const response = await fetch(`http://127.0.0.1:${address.port}/peer`, {
|
|
42
|
+
headers: {
|
|
43
|
+
"x-vxrn-peer-address": "203.0.113.9"
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
expect(await response.text()).toBe("127.0.0.1");
|
|
47
|
+
resolve();
|
|
48
|
+
} catch (error) {
|
|
49
|
+
if (Date.now() - startedAt > 2e3) reject(error);else setTimeout(probe, 20);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
void probe();
|
|
53
|
+
});
|
|
54
|
+
const shutdown = process.listeners("SIGTERM").at(-1);
|
|
55
|
+
expect(shutdown).toBeTypeOf("function");
|
|
56
|
+
shutdown?.("SIGTERM");
|
|
57
|
+
await running;
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=node.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createServer","Hono","describe","expect","test","honoServeNode","occupied","Promise","resolve","reject","once","listen","address","Error","app","get","context","text","host","port","rejects","toMatchObject","code","close","error","reservation","req","header","running","startedAt","Date","now","probe","response","fetch","headers","toBe","setTimeout","shutdown","process","listeners","at","toBeTypeOf"],"sources":["../../src/serve/node.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { createServer } from "http";
|
|
2
|
+
import { Hono } from "hono";
|
|
3
|
+
import { describe, expect, test } from "vitest";
|
|
4
|
+
import { honoServeNode } from "./node.native.js";
|
|
5
|
+
describe("honoServeNode", function () {
|
|
6
|
+
test("rejects when the listener cannot bind", async function () {
|
|
7
|
+
var occupied = createServer();
|
|
8
|
+
await new Promise(function (resolve, reject) {
|
|
9
|
+
occupied.once("error", reject);
|
|
10
|
+
occupied.listen(0, "127.0.0.1", resolve);
|
|
11
|
+
});
|
|
12
|
+
var address = occupied.address();
|
|
13
|
+
if (!address || typeof address === "string") throw new Error("missing test port");
|
|
14
|
+
var app = new Hono().get("/health", function (context) {
|
|
15
|
+
return context.text("ok");
|
|
16
|
+
});
|
|
17
|
+
await expect(honoServeNode(app, {
|
|
18
|
+
host: "127.0.0.1",
|
|
19
|
+
port: address.port
|
|
20
|
+
})).rejects.toMatchObject({
|
|
21
|
+
code: "EADDRINUSE"
|
|
22
|
+
});
|
|
23
|
+
await new Promise(function (resolve, reject) {
|
|
24
|
+
return occupied.close(function (error) {
|
|
25
|
+
return error ? reject(error) : resolve();
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
test("overwrites the trusted peer address header from the socket", async function () {
|
|
30
|
+
var reservation = createServer();
|
|
31
|
+
await new Promise(function (resolve, reject) {
|
|
32
|
+
reservation.once("error", reject);
|
|
33
|
+
reservation.listen(0, "127.0.0.1", resolve);
|
|
34
|
+
});
|
|
35
|
+
var address = reservation.address();
|
|
36
|
+
if (!address || typeof address === "string") throw new Error("missing test port");
|
|
37
|
+
await new Promise(function (resolve, reject) {
|
|
38
|
+
return reservation.close(function (error) {
|
|
39
|
+
return error ? reject(error) : resolve();
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
var app = new Hono().get("/peer", function (context) {
|
|
43
|
+
return context.text(context.req.header("x-vxrn-peer-address") || "");
|
|
44
|
+
});
|
|
45
|
+
var running = honoServeNode(app, {
|
|
46
|
+
host: "127.0.0.1",
|
|
47
|
+
port: address.port
|
|
48
|
+
});
|
|
49
|
+
await new Promise(function (resolve, reject) {
|
|
50
|
+
var startedAt = Date.now();
|
|
51
|
+
var probe = async function () {
|
|
52
|
+
try {
|
|
53
|
+
var response = await fetch(`http://127.0.0.1:${address.port}/peer`, {
|
|
54
|
+
headers: {
|
|
55
|
+
"x-vxrn-peer-address": "203.0.113.9"
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
expect(await response.text()).toBe("127.0.0.1");
|
|
59
|
+
resolve();
|
|
60
|
+
} catch (error) {
|
|
61
|
+
if (Date.now() - startedAt > 2e3) reject(error);else setTimeout(probe, 20);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
void probe();
|
|
65
|
+
});
|
|
66
|
+
var shutdown = process.listeners("SIGTERM").at(-1);
|
|
67
|
+
expect(shutdown).toBeTypeOf("function");
|
|
68
|
+
shutdown === null || shutdown === void 0 ? void 0 : shutdown("SIGTERM");
|
|
69
|
+
await running;
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=node.test.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createServer","Hono","describe","expect","test","honoServeNode","occupied","Promise","resolve","reject","once","listen","address","Error","app","get","context","text","host","port","rejects","toMatchObject","code","close","error","reservation","req","header","running","startedAt","Date","now","probe","response","fetch","headers","toBe"],"sources":["../../src/serve/node.test.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,YAAA,QAAoB;AAC7B,SAASC,IAAA,QAAY;AACrB,SAASC,QAAA,EAAUC,MAAA,EAAQC,IAAA,QAAY;AACvC,SAASC,aAAA,QAAqB;AAE9BH,QAAA,CAAS,iBAAiB,YAAM;EAC9BE,IAAA,CAAK,yCAAyC,kBAAY;IACxD,IAAAE,QAAM,GAAAN,YAAW;IACjB,MAAM,IAAIO,OAAA,CAAc,UAACC,OAAS,EAAAC,MAAW;MAC3CH,QAAA,CAASI,IAAA,CAAK,SAASD,MAAM;MAC7BH,QAAA,CAASK,MAAA,CAAO,GAAG,aAAaH,OAAO;IACzC,CAAC;IACD,IAAAI,OAAM,GAAAN,QAAU,CAAAM,OAAS;IACzB,IAAI,CAACA,OAAA,IAAW,OAAOA,OAAA,KAAY,UAAU,MAAM,IAAIC,KAAA,CAAM,mBAAmB;IAEhF,IAAAC,GAAM,OAAMb,IAAI,GAAKc,GAAE,UAAI,YAAYC,OAAY;MACnD,OAAMA,OAAA,CAAAC,IAAA;IAAA,EACJ;IACF,MAAEd,MAAQ,CAAAE,aAAgB,CAAAS,GAAA,EAAM;MAEhCI,IAAM,aAAI;MAAcC,IAAC,EAAAP,OAAS,CAAAO;IAElC,IAAAC,OAAA,CAAAC,aAAA;MACDC,IAAA;IAED;IACE,MAAM,IAAAf,OAAA,WAAcC,OAAa,EAAAC,MAAA;MACjC,OAAMH,QAAI,CAAciB,KAAC,WAASC,KAAA,EAAW;QAC3C,OAAAA,KAAY,GAAKf,MAAA,CAAAe,KAAS,IAAMhB,OAAA;MAChC;IACF,CAAC;EACD;EACAJ,IAAA,6DAA6D,oBAAmB;IAChF,IAAAqB,WAAU,GAAAzB,YAAA;IAAA,MAAe,IAAAO,OAAS,WAChCC,OAAA,EAAYC,MAAO;MACrBgB,WAAA,CAAAf,IAAA,UAAAD,MAAA;MAEAgB,WAAY,CAAAd,MAAI,CAAK,GAAE,aAAAH,OAAA;IAAA,EAAI;IAAA,IAAUI,OAAA,GAAAa,WAC3B,CAAAb,OAAK;IACf,KAAAA,OAAA,WAAAA,OAAA,yBAAAC,KAAA;IACA,MAAM,IAAAN,OAAU,WAAAC,OAAc,EAAKC,MAAE,EAAM;MAC3C,OAAMgB,WAAmB,CAAAF,KAAA,WAASC,KAAW;QAC3C,OAAMA,KAAA,GAAAf,MAAiB,CAAAe,KAAI,IAAAhB,OAAA;MAC3B;IACE;IACE,IAAAM,GAAA,OAAMb,IAAA,GAAAc,GAAW,QAAM,YAAMC,OAAA;MAAyC,OACpEA,OAAA,CAASC,IAAE,CAAAD,OAAA,CAAAU,GAAA,CAAAC,MAAA,sBAAqC;IAAA;IAElD,IAAAC,OAAA,GAAOvB,aAAM,CAASS,GAAA,EAAK;MAC3BI,IAAA,aAAQ;MAAAC,IACV,EAAAP,OAAS,CAAAO;IACP;IAAgD,UAC3CZ,OAAA,WAAWC,OAAS,EAAAC,MAAA;MAAA,IAC3BoB,SAAA,GAAAC,IAAA,CAAAC,GAAA;MACF,IAAAC,KAAA,kBAAAA,CAAA;QACA,IAAK;UACN,IAAAC,QAAA,SAAAC,KAAA,qBAAAtB,OAAA,CAAAO,IAAA;YACKgB,OAAA,EAAW;cACV,qBAAqB;YAC5B;UACM;UACPhC,MAAA,OAAA8B,QAAA,CAAAhB,IAAA,IAAAmB,IAAA;UACF5B,OAAA","ignoreList":[]}
|
package/dist/utils/state.mjs
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import FSExtra from "fs-extra";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { rename, rm } from "node:fs/promises";
|
|
2
4
|
import { join } from "node:path";
|
|
3
5
|
async function readState(cacheDir) {
|
|
4
6
|
const statePath = join(cacheDir, "state.json");
|
|
@@ -11,8 +13,16 @@ async function readState(cacheDir) {
|
|
|
11
13
|
}
|
|
12
14
|
async function writeState(cacheDir, state) {
|
|
13
15
|
const statePath = join(cacheDir, "state.json");
|
|
16
|
+
const pendingStatePath = `${statePath}.${process.pid}.${randomUUID()}.tmp`;
|
|
14
17
|
await FSExtra.ensureDir(cacheDir);
|
|
15
|
-
|
|
18
|
+
try {
|
|
19
|
+
await FSExtra.writeJSON(pendingStatePath, state);
|
|
20
|
+
await rename(pendingStatePath, statePath);
|
|
21
|
+
} finally {
|
|
22
|
+
await rm(pendingStatePath, {
|
|
23
|
+
force: true
|
|
24
|
+
});
|
|
25
|
+
}
|
|
16
26
|
}
|
|
17
27
|
export { readState, writeState };
|
|
18
28
|
//# sourceMappingURL=state.mjs.map
|
package/dist/utils/state.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["FSExtra","join","readState","cacheDir","statePath","state","pathExists","readJSON","writeState","ensureDir","writeJSON"],"sources":["../../src/utils/state.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAOA,OAAA,MAAa;AACpB,SAASC,IAAA,QAAY;AAMrB,eAAsBC,UAAUC,QAAA,EAAkB;EAChD,MAAMC,SAAA,GAAYH,IAAA,CAAKE,QAAA,EAAU,YAAY;EAC7C,IAAI;IACF,MAAME,KAAA,GAAgB,
|
|
1
|
+
{"version":3,"names":["FSExtra","randomUUID","rename","rm","join","readState","cacheDir","statePath","state","pathExists","readJSON","writeState","pendingStatePath","process","pid","ensureDir","writeJSON","force"],"sources":["../../src/utils/state.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAOA,OAAA,MAAa;AACpB,SAASC,UAAA,QAAkB;AAC3B,SAASC,MAAA,EAAQC,EAAA,QAAU;AAC3B,SAASC,IAAA,QAAY;AAMrB,eAAsBC,UAAUC,QAAA,EAAkB;EAChD,MAAMC,SAAA,GAAYH,IAAA,CAAKE,QAAA,EAAU,YAAY;EAC7C,IAAI;IACF,MAAME,KAAA,GAAgB,OAAMR,OAAA,CAAQS,UAAA,CAAWF,SAAS,KACpD,MAAMP,OAAA,CAAQU,QAAA,CAASH,SAAS,IAChC,CAAC;IACL,OAAOC,KAAA;EACT,QAAQ;IAEN,OAAO,CAAC;EACV;AACF;AAEA,eAAsBG,WAAWL,QAAA,EAAkBE,KAAA,EAAc;EAC/D,MAAMD,SAAA,GAAYH,IAAA,CAAKE,QAAA,EAAU,YAAY;EAC7C,MAAMM,gBAAA,GAAmB,GAAGL,SAAS,IAAIM,OAAA,CAAQC,GAAG,IAAIb,UAAA,CAAW,CAAC;EACpE,MAAMD,OAAA,CAAQe,SAAA,CAAUT,QAAQ;EAChC,IAAI;IACF,MAAMN,OAAA,CAAQgB,SAAA,CAAUJ,gBAAA,EAAkBJ,KAAK;IAC/C,MAAMN,MAAA,CAAOU,gBAAA,EAAkBL,SAAS;EAC1C,UAAE;IACA,MAAMJ,EAAA,CAAGS,gBAAA,EAAkB;MAAEK,KAAA,EAAO;IAAK,CAAC;EAC5C;AACF","ignoreList":[]}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import FSExtra from "fs-extra";
|
|
2
|
+
import { randomUUID } from "crypto";
|
|
3
|
+
import { rename, rm } from "fs/promises";
|
|
2
4
|
import { join } from "path";
|
|
3
5
|
async function readState(cacheDir) {
|
|
4
6
|
var statePath = join(cacheDir, "state.json");
|
|
@@ -11,8 +13,16 @@ async function readState(cacheDir) {
|
|
|
11
13
|
}
|
|
12
14
|
async function writeState(cacheDir, state) {
|
|
13
15
|
var statePath = join(cacheDir, "state.json");
|
|
16
|
+
var pendingStatePath = `${statePath}.${process.pid}.${randomUUID()}.tmp`;
|
|
14
17
|
await FSExtra.ensureDir(cacheDir);
|
|
15
|
-
|
|
18
|
+
try {
|
|
19
|
+
await FSExtra.writeJSON(pendingStatePath, state);
|
|
20
|
+
await rename(pendingStatePath, statePath);
|
|
21
|
+
} finally {
|
|
22
|
+
await rm(pendingStatePath, {
|
|
23
|
+
force: true
|
|
24
|
+
});
|
|
25
|
+
}
|
|
16
26
|
}
|
|
17
27
|
export { readState, writeState };
|
|
18
28
|
//# sourceMappingURL=state.native.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["FSExtra","join","readState","cacheDir","statePath","state","pathExists","readJSON","unused","writeState","ensureDir","writeJSON"],"sources":["../../src/utils/state.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAOA,OAAA,MAAa;AACpB,SAASC,IAAA,QAAY;AAMrB,eAAsBC,UAAUC,QAAA,EAAkB;EAChD,IAAAC,SAAM,GAAAH,IAAY,CAAAE,QAAK,cAAU;EACjC,IAAI;IACF,IAAAE,KAAM,
|
|
1
|
+
{"version":3,"names":["FSExtra","randomUUID","rename","rm","join","readState","cacheDir","statePath","state","pathExists","readJSON","unused","writeState","pendingStatePath","process","pid","ensureDir","writeJSON","force"],"sources":["../../src/utils/state.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAOA,OAAA,MAAa;AACpB,SAASC,UAAA,QAAkB;AAC3B,SAASC,MAAA,EAAQC,EAAA,QAAU;AAC3B,SAASC,IAAA,QAAY;AAMrB,eAAsBC,UAAUC,QAAA,EAAkB;EAChD,IAAAC,SAAM,GAAAH,IAAY,CAAAE,QAAK,cAAU;EACjC,IAAI;IACF,IAAAE,KAAM,UAAgBR,OAAM,CAAAS,UAAQ,CAAAF,SAAW,KAAS,MACpDP,OAAM,CAAAU,QAAQ,CAAAH,SAAS,IAAS,EAChC;IACJ,OAAOC,KAAA;EACT,SAAQG,MAAA;IAEN,OAAO,CAAC;EACV;AACF;AAEA,eAAsBC,WAAWN,QAAA,EAAkBE,KAAA,EAAc;EAC/D,IAAAD,SAAM,GAAAH,IAAY,CAAAE,QAAK,cAAU;EACjC,IAAAO,gBAAM,MAAmBN,SAAG,IAASO,OAAI,CAAAC,GAAQ,IAAGd,UAAI,QAAY;EACpE,MAAMD,OAAA,CAAQgB,SAAA,CAAUV,QAAQ;EAChC,IAAI;IACF,MAAMN,OAAA,CAAQiB,SAAA,CAAUJ,gBAAA,EAAkBL,KAAK;IAC/C,MAAMN,MAAA,CAAOW,gBAAA,EAAkBN,SAAS;EAC1C,UAAE;IACA,MAAMJ,EAAA,CAAGU,gBAAA,EAAkB;MAC7BK,KAAA;IACF","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vxrn",
|
|
3
|
-
"version": "1.21.
|
|
3
|
+
"version": "1.21.7",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -60,16 +60,16 @@
|
|
|
60
60
|
"@expo/config-plugins": "~55.0.6",
|
|
61
61
|
"@hono/node-server": "^1.19.14",
|
|
62
62
|
"@react-native/dev-middleware": "^0.83.4",
|
|
63
|
-
"@vxrn/compiler": "1.21.
|
|
64
|
-
"@vxrn/debug": "1.21.
|
|
65
|
-
"@vxrn/query-string": "1.21.
|
|
66
|
-
"@vxrn/resolve": "1.21.
|
|
67
|
-
"@vxrn/safe-area": "1.21.
|
|
68
|
-
"@vxrn/url-parse": "1.21.
|
|
69
|
-
"@vxrn/utils": "1.21.
|
|
70
|
-
"@vxrn/vendor": "1.21.
|
|
71
|
-
"@vxrn/vite-flow": "1.21.
|
|
72
|
-
"@vxrn/vite-plugin-metro": "1.21.
|
|
63
|
+
"@vxrn/compiler": "1.21.7",
|
|
64
|
+
"@vxrn/debug": "1.21.7",
|
|
65
|
+
"@vxrn/query-string": "1.21.7",
|
|
66
|
+
"@vxrn/resolve": "1.21.7",
|
|
67
|
+
"@vxrn/safe-area": "1.21.7",
|
|
68
|
+
"@vxrn/url-parse": "1.21.7",
|
|
69
|
+
"@vxrn/utils": "1.21.7",
|
|
70
|
+
"@vxrn/vendor": "1.21.7",
|
|
71
|
+
"@vxrn/vite-flow": "1.21.7",
|
|
72
|
+
"@vxrn/vite-plugin-metro": "1.21.7",
|
|
73
73
|
"citty": "^0.1.6",
|
|
74
74
|
"dotenv": "^17.2.1",
|
|
75
75
|
"dotenv-expand": "^12.0.2",
|
|
@@ -5,7 +5,7 @@ import { join } from 'node:path'
|
|
|
5
5
|
import { readPackageJSON } from 'pkg-types'
|
|
6
6
|
import type { Mode, VXRNOptions } from '../types'
|
|
7
7
|
import { getServerOptionsFilled } from './getServerOptionsFilled'
|
|
8
|
-
import { readState
|
|
8
|
+
import { readState } from '../utils/state'
|
|
9
9
|
import { getCacheDir } from '../utils/getCacheDir'
|
|
10
10
|
|
|
11
11
|
const require = createRequire(import.meta.url)
|
|
@@ -71,9 +71,6 @@ export async function fillOptions(
|
|
|
71
71
|
? 'vite'
|
|
72
72
|
: false
|
|
73
73
|
|
|
74
|
-
// no need to wait to write state
|
|
75
|
-
void writeState(cacheDir, { versionHash })
|
|
76
|
-
|
|
77
74
|
if (typeof options.build?.server !== 'boolean' && !options.build?.server) {
|
|
78
75
|
// default building server to off
|
|
79
76
|
options.build ||= {}
|
|
@@ -106,6 +103,7 @@ export async function fillOptions(
|
|
|
106
103
|
state,
|
|
107
104
|
packageRootDir,
|
|
108
105
|
cacheDir,
|
|
106
|
+
versionHash,
|
|
109
107
|
} as const
|
|
110
108
|
|
|
111
109
|
optionsFilled = final
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process'
|
|
2
|
+
import { mkdtemp, mkdir, readFile, rm, writeFile } from 'node:fs/promises'
|
|
3
|
+
import { tmpdir } from 'node:os'
|
|
4
|
+
import { dirname, join } from 'node:path'
|
|
5
|
+
import { pathToFileURL } from 'node:url'
|
|
6
|
+
import { promisify } from 'node:util'
|
|
7
|
+
import { afterEach, describe, expect, it } from 'vitest'
|
|
8
|
+
|
|
9
|
+
const execFileAsync = promisify(execFile)
|
|
10
|
+
|
|
11
|
+
describe('prepareCacheForVersion', () => {
|
|
12
|
+
let root: string | undefined
|
|
13
|
+
|
|
14
|
+
afterEach(async () => {
|
|
15
|
+
if (root) {
|
|
16
|
+
await rm(root, { recursive: true, force: true })
|
|
17
|
+
}
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
it('lets one process clean a stale same-root cache', async () => {
|
|
21
|
+
root = await mkdtemp(join(tmpdir(), 'vxrn-concurrent-clean-'))
|
|
22
|
+
const cacheDir = join(root, 'node_modules', '.vxrn')
|
|
23
|
+
const viteDir = join(root, 'node_modules', '.vite')
|
|
24
|
+
const participantsDir = join(root, 'participants')
|
|
25
|
+
const participantCount = 4
|
|
26
|
+
|
|
27
|
+
await Promise.all([
|
|
28
|
+
mkdir(cacheDir, { recursive: true }),
|
|
29
|
+
mkdir(viteDir, { recursive: true }),
|
|
30
|
+
mkdir(participantsDir, { recursive: true }),
|
|
31
|
+
])
|
|
32
|
+
await Promise.all([
|
|
33
|
+
writeFile(join(cacheDir, 'state.json'), JSON.stringify({ versionHash: 'old' })),
|
|
34
|
+
writeFile(join(cacheDir, 'stale'), 'stale'),
|
|
35
|
+
writeFile(join(viteDir, 'stale'), 'stale'),
|
|
36
|
+
])
|
|
37
|
+
|
|
38
|
+
const moduleUrl = pathToFileURL(join(dirname(import.meta.filename), 'clean.ts')).href
|
|
39
|
+
const workerScript = (participant: number) => `
|
|
40
|
+
import { readdir, writeFile } from 'node:fs/promises'
|
|
41
|
+
import { join } from 'node:path'
|
|
42
|
+
import { prepareCacheForVersion } from ${JSON.stringify(moduleUrl)}
|
|
43
|
+
|
|
44
|
+
const root = ${JSON.stringify(root)}
|
|
45
|
+
const participantsDir = ${JSON.stringify(participantsDir)}
|
|
46
|
+
await writeFile(join(participantsDir, ${JSON.stringify(String(participant))}), '')
|
|
47
|
+
while ((await readdir(participantsDir)).length < ${participantCount}) {
|
|
48
|
+
await Bun.sleep(5)
|
|
49
|
+
}
|
|
50
|
+
const cleaned = await prepareCacheForVersion({
|
|
51
|
+
root,
|
|
52
|
+
cacheDir: join(root, 'node_modules', '.vxrn'),
|
|
53
|
+
versionHash: 'new',
|
|
54
|
+
})
|
|
55
|
+
console.info(cleaned ? 'cleaned-by-worker' : 'cache-already-current')
|
|
56
|
+
`
|
|
57
|
+
|
|
58
|
+
const results = await Promise.all(
|
|
59
|
+
Array.from({ length: participantCount }, (_, participant) =>
|
|
60
|
+
execFileAsync('bun', ['-e', workerScript(participant)], {
|
|
61
|
+
env: { ...process.env, VXRN_DONT_CLEAN_SELF: '' },
|
|
62
|
+
})
|
|
63
|
+
)
|
|
64
|
+
)
|
|
65
|
+
const output = results.map(({ stdout }) => stdout).join('\n')
|
|
66
|
+
|
|
67
|
+
expect(output.match(/\[vxrn\] cleaning/g)).toHaveLength(1)
|
|
68
|
+
expect(output.match(/cleaned-by-worker/g)).toHaveLength(1)
|
|
69
|
+
expect(JSON.parse(await readFile(join(cacheDir, 'state.json'), 'utf8'))).toEqual({
|
|
70
|
+
versionHash: 'new',
|
|
71
|
+
})
|
|
72
|
+
await expect(readFile(join(cacheDir, 'stale'))).rejects.toMatchObject({
|
|
73
|
+
code: 'ENOENT',
|
|
74
|
+
})
|
|
75
|
+
await expect(readFile(join(viteDir, 'stale'))).rejects.toMatchObject({
|
|
76
|
+
code: 'ENOENT',
|
|
77
|
+
})
|
|
78
|
+
await expect(
|
|
79
|
+
readFile(join(root, 'node_modules', '.vxrn-clean.lock'))
|
|
80
|
+
).rejects.toMatchObject({ code: 'ENOENT' })
|
|
81
|
+
}, 20_000)
|
|
82
|
+
})
|