@halsp/http
Version:
支持 Halsp HTTP 请求
117 lines • 4.32 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;
};
Object.defineProperty(exports, "__esModule", { value: true });
const stream_1 = require("stream");
const mime = __importStar(require("mime-types"));
const core_1 = require("@halsp/core");
const exceptions_1 = require("./exceptions/index.cjs");
const map_matcher_1 = require("./map-matcher.cjs");
const usedMap = new WeakMap();
core_1.Startup.prototype.useHttp = function (options = {}) {
if (usedMap.get(this)) {
return this;
}
usedMap.set(this, true);
process.env.HALSP_ENV = "http";
Object.defineProperty(this, "parsedRegisters", {
enumerable: true,
configurable: true,
get: () => this.registers.map((r) => (0, map_matcher_1.parsePattern)(r)),
});
return this.use(async (ctx, next) => {
await new map_matcher_1.MapMatcher(ctx, options).match();
await next();
setType(ctx.res);
}).hook(core_1.HookType.Unhandled, (ctx, md, error) => {
const catchError = (err) => {
if (err instanceof exceptions_1.HttpException) {
ctx.res
.setHeaders(err.headers)
.setStatus(err.status)
.setBody(err.toPlainObject());
}
else if (err instanceof Error) {
const msg = err.message || undefined;
const ex = new exceptions_1.InternalServerErrorException(msg);
ex.inner = err;
catchError(ex);
}
else if ((0, core_1.isObject)(err)) {
const ex = new exceptions_1.InternalServerErrorException(err);
ex.inner = err;
catchError(ex);
}
else {
const error = (!(0, core_1.isNil)(err) && String(err)) || undefined;
const ex = new exceptions_1.InternalServerErrorException(error);
ex.inner = err;
catchError(ex);
}
};
catchError(error);
});
};
function setType(res) {
const body = res.body;
if (!body) {
res.removeHeader("content-type");
res.removeHeader("content-length");
return res;
}
const writeType = !res.hasHeader("content-type");
const writeLength = !res.hasHeader("content-length");
if (Buffer.isBuffer(body)) {
if (writeLength) {
res.setHeader("content-length", body.byteLength);
}
if (writeType) {
res.setHeader("content-type", mime.contentType("bin"));
}
}
else if (body instanceof stream_1.Stream) {
if (writeType) {
res.setHeader("content-type", mime.contentType("bin"));
}
}
else if ((0, core_1.isString)(body)) {
if (writeLength) {
res.setHeader("content-length", Buffer.byteLength(body));
}
if (writeType) {
const type = /^\s*</.test(body) ? "html" : "text";
res.setHeader("content-type", mime.contentType(type));
}
}
else {
if (writeLength) {
res.setHeader("content-length", Buffer.byteLength(JSON.stringify(body)));
}
if (writeType) {
res.setHeader("content-type", mime.contentType("json"));
}
}
return res;
}
//# sourceMappingURL=startup.js.map
;