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
35 lines
1.1 KiB
TypeScript
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}`),
|
|
});
|
|
});
|
|
});
|
|
}
|