UNPKG

@halsp/http

Version:

支持 Halsp HTTP 请求

117 lines 4.32 kB
"use strict"; 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