UNPKG

node-web-mvc

Version:
81 lines (80 loc) 2.41 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); /** * @module Resource * @description 静态资源对象 */ const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const MediaFactory_1 = __importDefault(require("../http/MediaFactory")); class Resource { /** * 当前资源内容长度 */ get contentLength() { return this.stat ? this.stat.size : null; } /** * 最后修改时间 */ get lastModified() { return this.stat ? this.stat.mtime.getTime() : null; } /** * 获取当前文件的mediaType */ get mediaType() { return MediaFactory_1.default.getMediaType(this.url); } get isReadable() { return !!this.stat && this.stat.isFile(); } constructor(filename) { this.url = filename; this.stat = fs_1.default.existsSync(filename) ? fs_1.default.lstatSync(filename) : null; } createRelative(relativePath) { return new Resource(path_1.default.join(this.url, relativePath)); } /** * 获取当前资源的读取流 */ getInputStream() { return fs_1.default.createReadStream(this.url); } /** * 获取当前资源,指定位置的读取流 * @param start * @param end */ getInputRangeStream(start, end) { return fs_1.default.createReadStream(this.url, { start, end }); } /** * 将资源文件附加到response * @param response 原始返回对象 * @param start 如果是http-ragen则设置开始位置 * @param end 如果是http-ragen则设置结束位置 * @returns */ pipe(response, start, end) { return new Promise((resolve, reject) => { const stream = start > 0 ? this.getInputRangeStream(start, end) : this.getInputStream(); const destory = () => { stream.close(); }; stream.pipe(response); stream.on('end', () => { stream.close(); resolve({}); }); stream.on('error', reject); response.on('error', destory); response.on('close', destory); }); } } exports.default = Resource;