UNPKG

3.33 kBJavaScriptView Raw
1"use strict";
2var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3 return new (P || (P = Promise))(function (resolve, reject) {
4 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6 function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
7 step((generator = generator.apply(thisArg, _arguments || [])).next());
8 });
9};
10Object.defineProperty(exports, "__esModule", { value: true });
11const childProcess = require("child_process");
12const path = require("path");
13const process = require("process");
14const worker_rpc_1 = require("worker-rpc");
15const NormalizedMessage_1 = require("./NormalizedMessage");
16const RpcTypes_1 = require("./RpcTypes");
17// fork workers...
18const division = parseInt(process.env.WORK_DIVISION || '', 10);
19const workers = [];
20for (let num = 0; num < division; num++) {
21 workers.push(childProcess.fork(path.resolve(__dirname, './service.js'), [], {
22 execArgv: ['--max-old-space-size=' + process.env.MEMORY_LIMIT],
23 env: Object.assign({}, process.env, { WORK_NUMBER: num }),
24 stdio: ['inherit', 'inherit', 'inherit', 'ipc']
25 }));
26}
27// communication with parent process
28const parentRpc = new worker_rpc_1.RpcProvider(message => {
29 try {
30 process.send(message);
31 }
32 catch (e) {
33 // channel closed...
34 process.exit();
35 }
36});
37process.on('message', message => parentRpc.dispatch(message));
38// communication with worker processes
39const workerRpcs = workers.map(worker => {
40 const rpc = new worker_rpc_1.RpcProvider(message => {
41 try {
42 worker.send(message);
43 }
44 catch (e) {
45 // channel closed - something went wrong - close cluster...
46 process.exit();
47 }
48 });
49 worker.on('message', message => rpc.dispatch(message));
50 return rpc;
51});
52parentRpc.registerRpcHandler(RpcTypes_1.RUN, (message) => __awaiter(this, void 0, void 0, function* () {
53 const workerResults = yield Promise.all(workerRpcs.map(workerRpc => workerRpc.rpc(RpcTypes_1.RUN, message)));
54 function workerFinished(workerResult) {
55 return workerResult.every(result => typeof result !== 'undefined');
56 }
57 if (!workerFinished(workerResults)) {
58 return undefined;
59 }
60 const merged = workerResults.reduce((innerMerged, innerResult) => ({
61 diagnostics: innerMerged.diagnostics.concat(innerResult.diagnostics.map(NormalizedMessage_1.NormalizedMessage.createFromJSON)),
62 lints: innerMerged.lints.concat(innerResult.lints.map(NormalizedMessage_1.NormalizedMessage.createFromJSON))
63 }), { diagnostics: [], lints: [] });
64 merged.diagnostics = NormalizedMessage_1.NormalizedMessage.deduplicate(merged.diagnostics);
65 merged.lints = NormalizedMessage_1.NormalizedMessage.deduplicate(merged.lints);
66 return merged;
67}));
68process.on('SIGINT', () => {
69 process.exit();
70});
71process.on('exit', () => {
72 workers.forEach(worker => {
73 try {
74 worker.kill();
75 }
76 catch (e) {
77 // do nothing...
78 }
79 });
80});
81//# sourceMappingURL=cluster.js.map
\No newline at end of file