Files
wehub-resource-sync 70bf21e064
Deploy (to testing) and Test Playground Preview Worker / Deploy Playground Preview Worker (testing) (push) Has been skipped
Deploy Workers Shared Staging / Deploy Workers Shared Staging (push) Failing after 0s
Prerelease / build (push) Has been skipped
Handle Changesets / Handle Changesets (push) Has been cancelled
Semgrep OSS scan / semgrep-oss (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:30:11 +08:00

35 lines
1.1 KiB
TypeScript

import http from "node:http";
import { URL } from "node:url";
import stoppable from "stoppable";
import { onTestFinished } from "vitest";
import { WebSocketServer } from "ws";
import type { AddressInfo } from "node:net";
import type NodeWebSocket from "ws";
export async function useServer(
listener: http.RequestListener,
webSocketListener?: (socket: NodeWebSocket, req: http.IncomingMessage) => void
): Promise<{ http: URL; ws: URL }> {
return new Promise((resolve) => {
const server = stoppable(http.createServer(listener), /* grace */ 0);
// Only setup web socket server if listener provided
if (webSocketListener) {
const wss = new WebSocketServer({ server });
wss.on("connection", webSocketListener);
}
// 0 binds to random unused port
server.listen(0, () => {
onTestFinished(() => {
return new Promise((resolve, reject) =>
server.stop((err) => (err ? reject(err) : resolve()))
);
});
const port = (server.address() as AddressInfo).port;
resolve({
http: new URL(`http://localhost:${port}`),
ws: new URL(`ws://localhost:${port}`),
});
});
});
}