UNPKG

node-web-mvc

Version:
59 lines (58 loc) 2.63 kB
"use strict"; /** * @module ResourceRegionHttpMessageConverter */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const AbstractHttpMessageConverter_1 = __importDefault(require("./AbstractHttpMessageConverter")); const HttpHeaders_1 = __importDefault(require("../HttpHeaders")); const HttpStatus_1 = __importDefault(require("../HttpStatus")); const MediaType_1 = __importDefault(require("../MediaType")); const Javascript_1 = __importDefault(require("../../../interface/Javascript")); const RegionsResource_1 = __importDefault(require("../../resources/RegionsResource")); const GzipResource_1 = __importDefault(require("../../resources/GzipResource")); class ResourceRegionHttpMessageConverter extends AbstractHttpMessageConverter_1.default { constructor() { super(MediaType_1.default.ALL); } supports(clazz) { return Javascript_1.default.createTyper(clazz).isType(RegionsResource_1.default); } async readInternal(servletContext) { throw new Error('ResourceRegionHttpMessageConverter not support read'); } async writeInternal(resource, servletContext) { const regions = resource.regions; const response = servletContext.response; for (const region of regions) { await this.writeRegion(region, servletContext.response); } return response.end(); } async writeRegion(region, response) { if (!(region === null || region === void 0 ? void 0 : region.resource)) { return; } const resource = region.resource; const start = region.position; let end = region.end; const resourceLength = resource.contentLength; end = Math.min(end, resourceLength - 1); const rangeLength = end - start + 1; const nativeResponse = response.nativeResponse; response.setHeader(HttpHeaders_1.default.CONTENT_RANGE, `bytes ${start}-${end}/${resourceLength}`); if (!(resource instanceof GzipResource_1.default)) { // gzip下不返回content-length response.setHeader(HttpHeaders_1.default.CONTENT_LENGTH, rangeLength); } else { response.setHeader(HttpHeaders_1.default.TRANSFER_ENCODING, 'chunked'); } response.setStatus(HttpStatus_1.default.PARTIAL_CONTENT); response.nativeResponse.statusCode = 206; await resource.pipe(nativeResponse, start, end); } } exports.default = ResourceRegionHttpMessageConverter;