node-web-mvc
Version:
node spring mvc
81 lines (80 loc) • 2.41 kB
JavaScript
;
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;