fork-ts-checker-webpack-plugin-alt
Version:
Runs typescript type checker and linter on separate process.
73 lines (72 loc) • 2.61 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var childProcess = require("child_process");
var path = require("path");
var process = require("process");
var WorkResult_1 = require("./WorkResult");
var NormalizedMessage_1 = require("./NormalizedMessage");
// fork workers...
var division = parseInt(process.env.WORK_DIVISION, 10);
var workers = [];
for (var num = 0; num < division; num++) {
workers.push(childProcess.fork(path.resolve(__dirname, './service.js'), [], {
execArgv: ['--max-old-space-size=' + process.env.MEMORY_LIMIT],
env: Object.assign({}, process.env, { WORK_NUMBER: num }),
stdio: ['inherit', 'inherit', 'inherit', 'ipc']
}));
}
var pids = workers.map(function (worker) { return worker.pid; });
var result = new WorkResult_1.WorkResult(pids);
process.on('message', function (message) {
// broadcast message to all workers
workers.forEach(function (worker) {
try {
worker.send(message);
}
catch (e) {
// channel closed - something went wrong - close cluster...
process.exit();
}
});
// clear previous result set
result.clear();
});
// listen to all workers
workers.forEach(function (worker) {
worker.on('message', function (message) {
// set result from worker
result.set(worker.pid, {
diagnostics: message.diagnostics.map(NormalizedMessage_1.NormalizedMessage.createFromJSON),
lints: message.lints.map(NormalizedMessage_1.NormalizedMessage.createFromJSON)
});
// if we have result from all workers, send merged
if (result.hasAll()) {
var merged = result.reduce(function (innerMerged, innerResult) { return ({
diagnostics: innerMerged.diagnostics.concat(innerResult.diagnostics),
lints: innerMerged.lints.concat(innerResult.lints)
}); }, { diagnostics: [], lints: [] });
merged.diagnostics = NormalizedMessage_1.NormalizedMessage.deduplicate(merged.diagnostics);
merged.lints = NormalizedMessage_1.NormalizedMessage.deduplicate(merged.lints);
try {
process.send(merged);
}
catch (e) {
// channel closed...
process.exit();
}
}
});
});
process.on('SIGINT', function () {
process.exit();
});
process.on('exit', function () {
workers.forEach(function (worker) {
try {
worker.kill();
}
catch (e) {
// do nothing...
}
});
});