node-web-mvc
Version:
node spring mvc
71 lines (70 loc) • 3.05 kB
JavaScript
;
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;