UNPKG

node-web-mvc

Version:
71 lines (70 loc) 3.05 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const path_1 = __importDefault(require("path")); const worker_threads_1 = require("worker_threads"); const WorkerInvoker_1 = __importDefault(require("./WorkerInvoker")); class WorkerResourceResolver { constructor(workerJs) { const options = {}; const myGlobal = global; options.env = process.env; options.workerData = { workerJs: workerJs, }; if (myGlobal.nodeWebMvcStarter && path_1.default.extname(workerJs) == '.ts') { // 如果是开发模式 options.workerData.dev = true; options.workerData.rootDir = myGlobal.nodeWebMvcStarter.rootDir; options.workerData.outDir = myGlobal.nodeWebMvcStarter.outDir; } this.worker = new worker_threads_1.Worker(require.resolve('./WorkerEntry'), options); } sendRequest(request) { return new Promise((resolve, reject) => { const { port1, port2 } = new MessageChannel(); const response = request.servletContext.response; const onFinished = (ev) => { const value = ev.data; switch (value.type) { case 'bind-event': WorkerInvoker_1.default.bindEventListener(value, port1, request.nativeRequest, response.nativeResponse); return; case 'error': reject(value.error); break; case 'finished': resolve(null); break; case 'invoke': WorkerInvoker_1.default.onInvoke(value, port1, request.nativeRequest, response.nativeResponse); if (!(value.invoke.method == 'end' && value.invoke.target == 'response')) { return; } } // 关闭消息通道 port1.removeEventListener('message', onFinished); port1.close(); port2.close(); }; port1.addEventListener('message', onFinished); this.worker.postMessage({ request: WorkerInvoker_1.default.serializeRequest(request.nativeRequest), port: port2, }, [port2]); }); } async resolveResource(request, requestPath, locations, next) { const response = await this.sendRequest(request); if ((response === null || response === void 0 ? void 0 : response.statusCode) == 404) { return next.resolveResource(request, requestPath, locations); } return null; } resolveUrlPath(resourcePath, locations, chain) { return chain.resolveUrlPath(resourcePath, locations); } } exports.default = WorkerResourceResolver;