my-anywhere
Version:
NodeJs static file server
110 lines (109 loc) • 4.48 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
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) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const mime_types_1 = __importDefault(require("mime-types"));
const http_1 = __importDefault(require("http"));
const reader_1 = __importDefault(require("./reader"));
const consts_1 = require("./consts");
const renderer_1 = __importDefault(require("./renderer"));
const resolver_1 = __importDefault(require("./resolver"));
const transformer_1 = __importDefault(require("./transformer"));
const helpers_1 = require("./helpers");
let pkg = require('../package.json');
/**
* Node.js 进程时传入的命令行参数
*/
let argvList = process.argv;
// 打印当前版本
if (['--version', '-v'].includes(argvList[2]) && pkg.version) {
console.log(pkg.version);
// 退出node进程
process.exit();
}
// 获取命令行输入参数
let args = helpers_1.getCommandArgs(argvList);
let cwd = process.cwd();
main();
function main() {
/**
* Server 监听的端口
*/
let port = args['--port'] || args['-p'] || 9900;
let options = {
publicPath: '/',
};
let virtualDirectory = args['--vd'] || args['-vd'];
if (virtualDirectory) {
options.vd = virtualDirectory;
}
let publicPath = args['--public-path'] || args['-publicPath'];
if (publicPath) {
options.publicPath = publicPath;
}
let handleRequest = staticServer(options);
http_1.default.createServer(handleRequest).listen({ port }, () => {
let serverAddress = `http://localhost:${port}`;
console.log(`File system RootPath: ${cwd}`);
console.log('Server is running at ' + serverAddress);
let argsKeys = Object.keys(args);
if (argsKeys.includes('-s') || argsKeys.includes(('--s'))) {
// don't open browser
return;
}
helpers_1.openBrowser(serverAddress);
});
}
function staticServer(options) {
let { vd, publicPath } = options;
let finalRenderer = options.renderer || renderer_1.default;
return (req, res) => __awaiter(this, void 0, void 0, function* () {
// 1 url-resolver req.url -> { pathname }
let { pathname, isVdActived, disablePublicPath } = resolver_1.default.resolve(
// @ts-ignore
req.url, vd);
let rootPath = path_1.default.join(cwd, publicPath);
if (disablePublicPath) {
rootPath = cwd;
}
// 2 fs-reader pathname -> result
let result = yield reader_1.default.read(pathname, { rootPath });
// 3 transformer result -> renderableData
let data = transformer_1.default.transform(result, {
pathname,
isVdActived,
vd,
rootPath,
});
// 4.1 send static file
if (data.type === consts_1.FileType.FILE) {
let ext = path_1.default.extname(data.filename) || '.txt';
let contentType = mime_types_1.default.contentType(ext);
res.setHeader('Content-Type', contentType);
fs_1.default.createReadStream(data.filename).pipe(res);
return;
}
let isError = consts_1.FileType.ERROR === data.type;
// 4.2 show directory / not-found / error
if (data.type === consts_1.FileType.DIRECTORY || data.type === consts_1.FileType.NOT_FOUND || isError) {
let html = finalRenderer.render(data);
if (isError) {
res.statusCode = 500;
}
res.setHeader('Content-Type', mime_types_1.default.contentType('.html') || '');
res.end(html);
}
});
}