1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | var errors_1 = require("./util/errors");
|
4 | var helpers_1 = require("./util/helpers");
|
5 | var logger_1 = require("./logger/logger");
|
6 | var child_process_1 = require("child_process");
|
7 | var path_1 = require("path");
|
8 | function runWorker(taskModule, taskWorker, context, workerConfig) {
|
9 | return new Promise(function (resolve, reject) {
|
10 | var worker = createWorker(taskModule);
|
11 | var msg = {
|
12 | taskModule: taskModule,
|
13 | taskWorker: taskWorker,
|
14 | context: {
|
15 |
|
16 |
|
17 | rootDir: context.rootDir,
|
18 | tmpDir: context.tmpDir,
|
19 | srcDir: context.srcDir,
|
20 | wwwDir: context.wwwDir,
|
21 | wwwIndex: context.wwwIndex,
|
22 | buildDir: context.buildDir,
|
23 | bundledFilePaths: context.bundledFilePaths,
|
24 | isProd: context.isProd,
|
25 | isWatch: context.isWatch,
|
26 | runAot: context.runAot,
|
27 | runMinifyJs: context.runMinifyJs,
|
28 | runMinifyCss: context.runMinifyCss,
|
29 | optimizeJs: context.optimizeJs,
|
30 | bundler: context.bundler,
|
31 | inlineTemplates: context.inlineTemplates,
|
32 | },
|
33 | workerConfig: workerConfig
|
34 | };
|
35 | worker.on('message', function (msg) {
|
36 | if (msg.error) {
|
37 | reject(new errors_1.BuildError(msg.error));
|
38 | }
|
39 | else if (msg.reject) {
|
40 | var buildError = helpers_1.jsonToBuildError(msg.reject);
|
41 | reject(buildError);
|
42 | }
|
43 | else {
|
44 | resolve(msg.resolve);
|
45 | }
|
46 | killWorker(msg.pid);
|
47 | });
|
48 | worker.on('error', function (err) {
|
49 | logger_1.Logger.error("worker error, taskModule: " + taskModule + ", pid: " + worker.pid + ", error: " + err);
|
50 | });
|
51 | worker.on('exit', function (code) {
|
52 | logger_1.Logger.debug("worker exited, taskModule: " + taskModule + ", pid: " + worker.pid);
|
53 | });
|
54 | worker.send(msg);
|
55 | });
|
56 | }
|
57 | exports.runWorker = runWorker;
|
58 | function killWorker(pid) {
|
59 | for (var i = exports.workers.length - 1; i >= 0; i--) {
|
60 | if (exports.workers[i].worker.pid === pid) {
|
61 | try {
|
62 | exports.workers[i].worker.kill('SIGKILL');
|
63 | }
|
64 | catch (e) {
|
65 | logger_1.Logger.error("killWorker, " + pid + ": " + e);
|
66 | }
|
67 | finally {
|
68 | delete exports.workers[i].worker;
|
69 | exports.workers.splice(i, 1);
|
70 | }
|
71 | }
|
72 | }
|
73 | }
|
74 | function createWorker(taskModule) {
|
75 | for (var i = exports.workers.length - 1; i >= 0; i--) {
|
76 | if (exports.workers[i].task === taskModule) {
|
77 | try {
|
78 | exports.workers[i].worker.kill('SIGKILL');
|
79 | }
|
80 | catch (e) {
|
81 | logger_1.Logger.debug("createWorker, " + taskModule + " kill('SIGKILL'): " + e);
|
82 | }
|
83 | finally {
|
84 | delete exports.workers[i].worker;
|
85 | exports.workers.splice(i, 1);
|
86 | }
|
87 | }
|
88 | }
|
89 | try {
|
90 | var workerModule = path_1.join(__dirname, 'worker-process.js');
|
91 | var worker = child_process_1.fork(workerModule, process.argv, {
|
92 | env: {
|
93 | FORCE_COLOR: true,
|
94 | npm_config_argv: process.env.npm_config_argv
|
95 | }
|
96 | });
|
97 | logger_1.Logger.debug("worker created, taskModule: " + taskModule + ", pid: " + worker.pid);
|
98 | exports.workers.push({
|
99 | task: taskModule,
|
100 | worker: worker
|
101 | });
|
102 | return worker;
|
103 | }
|
104 | catch (e) {
|
105 | throw new errors_1.BuildError("unable to create worker-process, task: " + taskModule + ": " + e);
|
106 | }
|
107 | }
|
108 | exports.createWorker = createWorker;
|
109 | exports.workers = [];
|