71 lines
2.4 KiB
JavaScript
71 lines
2.4 KiB
JavaScript
|
|
//#region src/_utils.ts
|
||
|
|
function resolvePortAndHost(opts) {
|
||
|
|
const _port = opts.port ?? globalThis.process?.env.PORT ?? 3e3;
|
||
|
|
const port = typeof _port === "number" ? _port : Number.parseInt(_port, 10);
|
||
|
|
if (port < 0 || port > 65535) throw new RangeError(`Port must be between 0 and 65535 (got "${port}").`);
|
||
|
|
return {
|
||
|
|
port,
|
||
|
|
hostname: opts.hostname ?? globalThis.process?.env.HOST
|
||
|
|
};
|
||
|
|
}
|
||
|
|
function fmtURL(host, port, secure) {
|
||
|
|
if (!host || !port) return;
|
||
|
|
if (host.includes(":")) host = `[${host}]`;
|
||
|
|
return `http${secure ? "s" : ""}://${host}:${port}/`;
|
||
|
|
}
|
||
|
|
function printListening(opts, url) {
|
||
|
|
if (!url || (opts.silent ?? globalThis.process?.env?.TEST)) return;
|
||
|
|
const _url = new URL(url);
|
||
|
|
const allInterfaces = _url.hostname === "[::]" || _url.hostname === "0.0.0.0";
|
||
|
|
if (allInterfaces) {
|
||
|
|
_url.hostname = "localhost";
|
||
|
|
url = _url.href;
|
||
|
|
}
|
||
|
|
let listeningOn = `➜ Listening on:`;
|
||
|
|
let additionalInfo = allInterfaces ? " (all interfaces)" : "";
|
||
|
|
if (globalThis.process.stdout?.isTTY) {
|
||
|
|
listeningOn = `\u001B[32m${listeningOn}\u001B[0m`;
|
||
|
|
url = `\u001B[36m${url}\u001B[0m`;
|
||
|
|
additionalInfo = `\u001B[2m${additionalInfo}\u001B[0m`;
|
||
|
|
}
|
||
|
|
console.log(`${listeningOn} ${url}${additionalInfo}`);
|
||
|
|
}
|
||
|
|
function resolveTLSOptions(opts) {
|
||
|
|
if (!opts.tls || opts.protocol === "http") return;
|
||
|
|
const cert = resolveCertOrKey(opts.tls.cert);
|
||
|
|
const key = resolveCertOrKey(opts.tls.key);
|
||
|
|
if (!cert && !key) {
|
||
|
|
if (opts.protocol === "https") throw new TypeError("TLS `cert` and `key` must be provided for `https` protocol.");
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
if (!cert || !key) throw new TypeError("TLS `cert` and `key` must be provided together.");
|
||
|
|
return {
|
||
|
|
cert,
|
||
|
|
key,
|
||
|
|
passphrase: opts.tls.passphrase
|
||
|
|
};
|
||
|
|
}
|
||
|
|
function resolveCertOrKey(value) {
|
||
|
|
if (!value) return;
|
||
|
|
if (typeof value !== "string") throw new TypeError("TLS certificate and key must be strings in PEM format or file paths.");
|
||
|
|
if (value.startsWith("-----BEGIN ")) return value;
|
||
|
|
const { readFileSync } = process.getBuiltinModule("node:fs");
|
||
|
|
return readFileSync(value, "utf8");
|
||
|
|
}
|
||
|
|
function createWaitUntil() {
|
||
|
|
const promises = /* @__PURE__ */ new Set();
|
||
|
|
return {
|
||
|
|
waitUntil: (promise) => {
|
||
|
|
if (typeof promise?.then !== "function") return;
|
||
|
|
promises.add(Promise.resolve(promise).catch(console.error).finally(() => {
|
||
|
|
promises.delete(promise);
|
||
|
|
}));
|
||
|
|
},
|
||
|
|
wait: () => {
|
||
|
|
return Promise.all(promises);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
//#endregion
|
||
|
|
export { resolveTLSOptions as a, resolvePortAndHost as i, fmtURL as n, printListening as r, createWaitUntil as t };
|