UNPKG

node-web-mvc

Version:
62 lines (61 loc) 3.03 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const MediaType_1 = __importDefault(require("../../http/MediaType")); const HttpMediaTypeNotAcceptableException_1 = __importDefault(require("../../../errors/HttpMediaTypeNotAcceptableException")); const HandlerMapping_1 = require("../../mapping/HandlerMapping"); const ALL_APPLICATION_MEDIA_TYPES = [ MediaType_1.default.ALL, new MediaType_1.default('application'), ]; class AbstractMessageConverterMethodProcessor { constructor(messageConverters, contentNegotiationManager) { this.messageConverters = messageConverters; this.contentNegotiationManager = contentNegotiationManager; } writeWithMessageConverters(data, servletContext) { const mediaType = this.selectMediaType(servletContext, data); return this.messageConverters.write(data, mediaType, servletContext); } readWithMessageConverters(servletContext, dataType) { return this.messageConverters.read(servletContext, dataType); } getProducibleMediaTypes(servletContext, data) { const configMediaTypes = servletContext.request.getAttribute(HandlerMapping_1.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE) || []; if (configMediaTypes.length > 0) { return configMediaTypes; } const mediaTypes = []; const messageConverters = this.messageConverters; messageConverters.forEach((converter) => { if (converter.canWrite(data, null)) { mediaTypes.push(...converter.getSupportedMediaTypes()); } }); return mediaTypes; } getMostSpecifiMediaType(requestType, producibleType) { const mediaType = producibleType.copyQualityValue(requestType); return MediaType_1.default.specificityCompare(requestType, mediaType) <= 0 ? requestType : mediaType; } selectMediaType(servletContext, data) { const requestedTypes = this.contentNegotiationManager.resolveMediaTypes(servletContext.request); const dataType = data === null || data === void 0 ? void 0 : data.constructor; const producibleTypes = this.getProducibleMediaTypes(servletContext, dataType); const mediaTypesToUse = []; for (const requestType of requestedTypes) { for (const producibleType of producibleTypes) { if (requestType.isCompatibleWith(producibleType)) { mediaTypesToUse.push(this.getMostSpecifiMediaType(requestType, producibleType)); } } } if (mediaTypesToUse.length < 1) { throw new HttpMediaTypeNotAcceptableException_1.default(producibleTypes); } return mediaTypesToUse.find((m) => m.isConcrete || m.isPresentIn(ALL_APPLICATION_MEDIA_TYPES)) || MediaType_1.default.ALL; } } exports.default = AbstractMessageConverterMethodProcessor;