@halsp/native
Version:
Halsp 的 NodeJS 原生环境
130 lines • 4.39 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const http = __importStar(require("http"));
const https = __importStar(require("https"));
const core_1 = require("@halsp/core");
require("@halsp/http");
require("@halsp/body");
const qs_1 = __importDefault(require("qs"));
const stream_1 = require("stream");
const usedMap = new WeakMap();
core_1.Startup.prototype.useNative = function (options) {
if (usedMap.get(this))
return this;
usedMap.set(this, true);
initStartup.call(this, options);
return this.useHttp().useHttpJsonBody();
};
async function requestListener(reqStream, resStream) {
const ctx = new core_1.Context();
Object.defineProperty(ctx, "resStream", {
get: () => resStream,
});
Object.defineProperty(ctx, "reqStream", {
get: () => reqStream,
});
const pathname = reqStream.url.split("?")[0];
const query = qs_1.default.parse(reqStream.url.split("?")[1]);
ctx.req
.setPath(pathname)
.setMethod(reqStream.method)
.setQuery(query)
.setHeaders(reqStream.headers);
resStream.statusCode = 404;
const res = await this["invoke"](ctx);
if (!resStream.writableEnded) {
resStream.statusCode = res.status;
writeHead(res, resStream);
writeBody(res, resStream);
}
}
function initStartup(options) {
const listener = requestListener.bind(this);
let server;
if (!!options?.https) {
server = https.createServer(options.https, listener);
}
else if (!!options) {
server = http.createServer(options, listener);
}
else {
server = http.createServer(listener);
}
Object.defineProperty(this, "nativeServer", {
configurable: true,
enumerable: true,
get: () => server,
});
this.extend("listen", async () => {
await (0, core_1.closeServer)(server);
await this["initialize"]();
await new Promise((resolve) => {
server.listen({
...options,
port: (0, core_1.getHalspPort)(options?.port ?? 9504),
}, () => resolve());
});
return server;
});
this.extend("close", async () => {
await (0, core_1.closeServer)(server);
this.logger.info("Server shutdown success");
});
server.on("listening", () => {
(0, core_1.logAddress)(server, this.logger, "http://localhost");
});
}
function writeHead(halspRes, resStream) {
if (resStream.headersSent)
return;
Object.keys(halspRes.headers)
.filter((key) => !!halspRes.headers[key])
.forEach((key) => {
resStream.setHeader(key, halspRes.headers[key]);
});
}
function writeBody(halspRes, resStream) {
if (!halspRes.body) {
resStream.end();
return;
}
if (halspRes.body instanceof stream_1.Stream) {
halspRes.body.pipe(resStream);
}
else if (Buffer.isBuffer(halspRes.body)) {
resStream.end(halspRes.body);
}
else if ((0, core_1.isString)(halspRes.body)) {
resStream.end(halspRes.body);
}
else {
resStream.end(JSON.stringify(halspRes.body));
}
}
//# sourceMappingURL=startup.js.map