UNPKG

alinea

Version:

[![npm](https://img.shields.io/npm/v/alinea.svg)](https://npmjs.org/package/alinea) [![install size](https://packagephobia.com/badge?p=alinea)](https://packagephobia.com/result?p=alinea)

51 lines (49 loc) 1.41 kB
import "../../chunks/chunk-U5RRZUYZ.js"; // src/cli/serve/StartNodeServer.ts import { fromNodeRequest, respondTo } from "alinea/backend/router/NodeHandler"; import http from "node:http"; import { Emitter, createEmitter } from "../util/Emitter.js"; async function startNodeServer(port = 4500, attempt = 0) { const messages = createEmitter(); function serve(incoming, outgoing) { messages.emit({ request: fromNodeRequest(incoming), respondWith(response) { return respondTo(outgoing, response); } }); } return new Promise((resolve, reject) => { const server = http.createServer(serve); server.on("error", reject); server.on("listening", () => resolve(server)); server.on("close", () => messages.return()); server.listen(port); }).then(() => ({ port, async *serve(until) { until?.then(() => messages.cancel()); try { yield* messages; } catch (e) { if (e === Emitter.CANCELLED) return; throw e; } } })).catch((err) => { if (attempt > 10) throw err; const incrementedPort = port + 1; if (err.code === "EADDRINUSE" && incrementedPort < 65535) { console.log( `> Port ${port} is in use, attempting ${incrementedPort} instead` ); return startNodeServer(incrementedPort, attempt++); } throw err; }); } export { startNodeServer };