alinea
Version:
[](https://npmjs.org/package/alinea) [](https://packagephobia.com/result?p=alinea)
51 lines (49 loc) • 1.41 kB
JavaScript
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
};