All files / packages/utils/src/server promise.ts

0% Statements 0/17
0% Branches 0/7
0% Functions 0/8
0% Lines 0/17

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48                                                                                               
import type { IncomingMessage, Server, ServerResponse } from "node:http";
import { format } from "node:url";
 
import { promisifyEvent } from "~utils/promise";
 
export const promisifyServer = <
	Request extends typeof IncomingMessage = typeof IncomingMessage,
	Response extends typeof ServerResponse<InstanceType<Request>> =
		typeof ServerResponse,
>(
	server: Server<Request, Response>,
) => ({
	listen: (port = 0) =>
		promisifyEvent<URL>((listener, errorListener) => {
			server.listen(port, () => {
				const address = server.address();
				if (address === null || typeof address === "string") {
					errorListener(new Error("Expected an internet server address"));
				} else {
					listener(
						new URL(
							format({
								protocol: "http:",
								hostname: address.address,
								port: address.port,
							}),
						),
					);
				}
			});
			server.on("error", errorListener);
			return () => {
				server.off("error", errorListener);
			};
		}),
	close: () =>
		promisifyEvent((listener, errorListener) => {
			server.closeAllConnections();
			server.close((error) => {
				if (error) {
					errorListener(error);
				} else {
					listener();
				}
			});
		}),
});