AtlatestRepositorysigil-websocket

sigil-websocket / tree / test / integrationtest-native-websocket-upgrade-timeout.mjs

1import net from "node:net";
2import path from "node:path";
3import { fileURLToPath } from "node:url";
4import { spawn } from "node:child_process";
5
6const here = path.dirname(fileURLToPath(import.meta.url));
7const repo = path.resolve(here, "../..");
8const server = net.createServer((socket) => {
9 // Consume the request but deliberately never send the HTTP 101 response.
10 socket.on("data", () => {});
11});
12await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
13const port = server.address().port;
15const dependencyRoots = [
16 "sigil-stdlib", "sigil-socket", "sigil-tls", "sigil-crypto",
17].map((name) => path.join(repo, ".sigil", "deps", name, "src"));
18const args = [
19 "-L", path.join(repo, "build/dev/lib"),
20 ...dependencyRoots.flatMap((root) => ["-L", root]),
21 path.join(here, "native-upgrade-timeout-client.sgl"),
22];
23const child = spawn("sigil", args, {
24 cwd: repo,
25 env: { ...process.env, SIGIL_WS_TEST_PORT: String(port) },
26 stdio: ["ignore", "pipe", "pipe"],
27});
28let stdout = "";
29let stderr = "";
30child.stdout.on("data", (chunk) => { stdout += chunk; });
31child.stderr.on("data", (chunk) => { stderr += chunk; });
32const watchdog = setTimeout(() => child.kill("SIGKILL"), 3000);
33const status = await new Promise((resolve) => child.on("close", resolve));
34clearTimeout(watchdog);
35server.close();
37if (status !== 0 || !stdout.includes("native-websocket-upgrade-timeout-ok")) {
38 throw new Error(`native timeout client failed (${status})\nstdout:\n${stdout}\nstderr:\n${stderr}`);
40console.log("native-websocket-upgrade-timeout-integration-ok");