|
1 | 1 | import { readFileSync, writeFileSync } from 'fs';
|
2 | 2 | import * as dotenv from 'dotenv';
|
3 |
| -import { ChildProcess, fork } from 'child_process'; |
| 3 | +import { ChildProcess, fork, Serializable } from 'child_process'; |
4 | 4 | import { workspaceRoot } from '../utils/workspace-root';
|
5 | 5 | import { DefaultTasksRunnerOptions } from './default-tasks-runner';
|
6 | 6 | import { output } from '../utils/output';
|
@@ -30,7 +30,7 @@ export class ForkedProcessTaskRunner {
|
30 | 30 | private processes = new Set<ChildProcess>();
|
31 | 31 |
|
32 | 32 | constructor(private readonly options: DefaultTasksRunnerOptions) {
|
33 |
| - this.setupOnProcessExitListener(); |
| 33 | + this.setupProcessEventListeners(); |
34 | 34 | }
|
35 | 35 |
|
36 | 36 | // TODO: vsavkin delegate terminal output printing
|
@@ -79,6 +79,14 @@ export class ForkedProcessTaskRunner {
|
79 | 79 | switch (message.type) {
|
80 | 80 | case BatchMessageType.Complete: {
|
81 | 81 | res(message.results);
|
| 82 | + break; |
| 83 | + } |
| 84 | + case BatchMessageType.Tasks: { |
| 85 | + break; |
| 86 | + } |
| 87 | + default: { |
| 88 | + // Re-emit any non-batch messages from the task process |
| 89 | + process.send(message); |
82 | 90 | }
|
83 | 91 | }
|
84 | 92 | });
|
@@ -126,6 +134,12 @@ export class ForkedProcessTaskRunner {
|
126 | 134 | ),
|
127 | 135 | });
|
128 | 136 | this.processes.add(p);
|
| 137 | + |
| 138 | + // Re-emit any messages from the task process |
| 139 | + p.on('message', (message) => { |
| 140 | + process.send(message); |
| 141 | + }); |
| 142 | + |
129 | 143 | let out = [];
|
130 | 144 | let outWithErr = [];
|
131 | 145 | p.stdout.on('data', (chunk) => {
|
@@ -199,6 +213,12 @@ export class ForkedProcessTaskRunner {
|
199 | 213 | ),
|
200 | 214 | });
|
201 | 215 | this.processes.add(p);
|
| 216 | + |
| 217 | + // Re-emit any messages from the task process |
| 218 | + p.on('message', (message) => { |
| 219 | + process.send(message); |
| 220 | + }); |
| 221 | + |
202 | 222 | p.on('exit', (code, signal) => {
|
203 | 223 | if (code === null) code = this.signalToCode(signal);
|
204 | 224 | // we didn't print any output as we were running the command
|
@@ -369,7 +389,15 @@ export class ForkedProcessTaskRunner {
|
369 | 389 | return 128;
|
370 | 390 | }
|
371 | 391 |
|
372 |
| - private setupOnProcessExitListener() { |
| 392 | + private setupProcessEventListeners() { |
| 393 | + // When the nx process gets a message, it will be sent into the task's process |
| 394 | + process.on('message', (message: Serializable) => { |
| 395 | + this.processes.forEach((p) => { |
| 396 | + p.send(message); |
| 397 | + }); |
| 398 | + }); |
| 399 | + |
| 400 | + // Terminate any task processes on exit |
373 | 401 | process.on('SIGINT', () => {
|
374 | 402 | this.processes.forEach((p) => {
|
375 | 403 | p.kill('SIGTERM');
|
|
0 commit comments