UNPKG

node-web-mvc

Version:
63 lines (62 loc) 2.22 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); /** * @module MessageConverter * @description 内容转换器 */ const HttpMediaTypeNotSupportedException_1 = __importDefault(require("../../../errors/HttpMediaTypeNotSupportedException")); const HttpMethod_1 = __importDefault(require("../HttpMethod")); const NO_VALUE = {}; const SUPPORTED_METHODS = new Set([ HttpMethod_1.default.POST, HttpMethod_1.default.PUT, HttpMethod_1.default.PATCH, ]); class MessageConverter { constructor() { this.registerConverters = []; } /** * 注册一个消息转换器 * @param servletContext */ addMessageConverters(...converter) { this.registerConverters.push(...converter); } forEach(handler) { return this.registerConverters.forEach(handler); } /** * 当前当前http的内容 */ async read(servletContext, dataType) { const request = servletContext.request; const mediaType = request.mediaType; const httpMethod = request.method; const converter = this.registerConverters.find((converter) => converter.canRead(dataType, mediaType)); let body = NO_VALUE; if (converter) { body = await converter.read(servletContext, dataType); } if (body !== NO_VALUE) { return body; } if (!httpMethod || !SUPPORTED_METHODS.has(httpMethod) || (mediaType.isEmpty() && request.nativeRequest.readableLength < 1)) { return null; } throw new HttpMediaTypeNotSupportedException_1.default(mediaType); } /** * 写出内容到response中 */ async write(body, mediaType, servletContext) { const data = await Promise.resolve(body); const dataType = data === null || data === void 0 ? void 0 : data.constructor; const converter = this.registerConverters.find((converter) => converter.canWrite(dataType, mediaType)); return converter.write(data, servletContext); } } exports.default = MessageConverter;