UNPKG

miter

Version:

A typescript web framework based on ExpressJs based loosely on SailsJs

99 lines 4.08 kB
"use strict"; 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