miter
Version:
A typescript web framework based on ExpressJs based loosely on SailsJs
99 lines • 4.08 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const _ = require("lodash");
var encodeUrl = require('encodeurl');
const escapeHtml = require("escape-html");
const parseUrl = require("parseurl");
var resolvePath = require('path').resolve;
const send = require("send");
var url = require('url');
function sendFiles(req, path, options) {
return __awaiter(this, void 0, void 0, function* () {
if (!path)
throw new TypeError('root path required');
if (typeof path !== 'string')
throw new TypeError('root path must be a string');
var opts = _.clone(options) || {};
var redirect = opts.redirect !== false;
var setHeaders = opts.setHeaders;
if (setHeaders && typeof setHeaders !== 'function')
throw new TypeError('option setHeaders must be function');
opts.maxage = opts.maxage || opts.maxAge || 0;
opts.root = resolvePath(path);
let matchedFile = false;
var onDirectory = notFoundDirectoryListener;
if (redirect)
onDirectory = createRedirectDirectoryListener(req);
return new Promise((resolve, reject) => {
var originalUrl = parseUrl.original(req);
var path = parseUrl(req).pathname;
if (path === '/' && originalUrl.pathname.substr(-1) !== '/')
path = '';
var stream = send(req, path, opts);
stream.on('directory', onDirectory);
if (setHeaders)
stream.on('headers', setHeaders);
stream.on('file', () => matchedFile = true);
stream.on('error', function error(err) {
if (err.code !== 'ENOENT' && (!matchedFile || err.statusCode >= 500)) {
reject(err);
return;
}
resolve(false);
});
stream.pipe(this);
});
});
}
exports.sendFiles = sendFiles;
function collapseLeadingSlashes(str) {
let i = 0;
for (i = 0; i < str.length; i++) {
if (str[i] !== '/')
break;
}
return i > 1 ? '/' + str.substr(i) : str;
}
function createHtmlDocument(title, body) {
return '<!DOCTYPE html>\n' +
'<html lang="en">\n' +
'<head>\n' +
'<meta charset="utf-8">\n' +
'<title>' + title + '</title>\n' +
'</head>\n' +
'<body>\n' +
'<pre>' + body + '</pre>\n' +
'</body>\n';
}
function notFoundDirectoryListener() {
this.error(404);
}
function createRedirectDirectoryListener(req) {
return function redirect(res) {
if (this.hasTrailingSlash()) {
this.error(404);
return;
}
var originalUrl = parseUrl.original(req);
delete originalUrl.path;
originalUrl.pathname = collapseLeadingSlashes(originalUrl.pathname + '/');
var loc = encodeUrl(url.format(originalUrl));
var doc = createHtmlDocument('Redirecting', 'Redirecting to <a href="' + escapeHtml(loc) + '">' + escapeHtml(loc) + '</a>');
res.statusCode = 301;
res.setHeader('Content-Type', 'text/html; charset=UTF-8');
res.setHeader('Content-Length', '' + Buffer.byteLength(doc));
res.setHeader('Content-Security-Policy', "default-src 'self'");
res.setHeader('X-Content-Type-Options', 'nosniff');
res.setHeader('Location', loc);
res.end(doc);
};
}
//# sourceMappingURL=static-send-files.js.map