teen_process 2.3.0 → 2.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -5
- package/build/lib/subprocess.d.ts +27 -11
- package/build/lib/subprocess.d.ts.map +1 -1
- package/build/lib/subprocess.js +31 -16
- package/build/lib/subprocess.js.map +1 -1
- package/lib/subprocess.js +40 -24
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -111,6 +111,21 @@ async function tailFileForABit () {
|
|
|
111
111
|
|
|
112
112
|
Errors with start/stop are thrown in the calling context.
|
|
113
113
|
|
|
114
|
+
### Options
|
|
115
|
+
|
|
116
|
+
The instance constructor accepts same options that Node.js's
|
|
117
|
+
[spawn](https://nodejs.org/api/child_process.html#child_processspawncommand-args-options)
|
|
118
|
+
API plus some custom options:
|
|
119
|
+
|
|
120
|
+
* `isBuffer` - If set to `true` then both stdout and stderr chunks are delivered
|
|
121
|
+
as buffers rather than strings to the following entities:
|
|
122
|
+
- `startDetector` argument
|
|
123
|
+
- `output` event
|
|
124
|
+
* `encoding` - If provided then arguments of the `startDetector` argument and of the
|
|
125
|
+
`output` event will be encoded to strings using this given encoding, unless `isBuffer`
|
|
126
|
+
is set to `true`. If no explicit encoding is provided then `utf8` encoding is used by
|
|
127
|
+
default.
|
|
128
|
+
|
|
114
129
|
### Events
|
|
115
130
|
|
|
116
131
|
You can listen to 8 events:
|
|
@@ -151,11 +166,9 @@ proc.on('output', (stdout, stderr) => {
|
|
|
151
166
|
console.log(`stderr: ${stderr}`);
|
|
152
167
|
});
|
|
153
168
|
|
|
154
|
-
//
|
|
155
|
-
proc.on('
|
|
156
|
-
console.log(
|
|
157
|
-
// ['foo', 'bar', 'baz']
|
|
158
|
-
// automatically handles rejoining lines across stream chunks
|
|
169
|
+
// line-stderr is just the same
|
|
170
|
+
proc.on('line-stdout', (line) => {
|
|
171
|
+
console.log(line);
|
|
159
172
|
});
|
|
160
173
|
|
|
161
174
|
// stream-line gives you one line at a time, with [STDOUT] or [STDERR]
|
|
@@ -1,13 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @template {SubProcessOptions} TSubProcessOptions
|
|
3
|
+
*/
|
|
4
|
+
export class SubProcess<TSubProcessOptions extends SubProcessOptions> extends EventEmitter<[never]> {
|
|
4
5
|
/**
|
|
5
6
|
* @param {string} cmd
|
|
6
|
-
* @param {string[]} [args]
|
|
7
|
-
* @param {
|
|
7
|
+
* @param {string[]} [args=[]]
|
|
8
|
+
* @param {TSubProcessOptions} [opts]
|
|
9
|
+
*/
|
|
10
|
+
constructor(cmd: string, args?: string[], opts?: TSubProcessOptions);
|
|
11
|
+
/**
|
|
12
|
+
* @callback StartDetector
|
|
13
|
+
* @param {TSubProcessOptions extends TIsBufferOpts ? Buffer : string} stdout
|
|
14
|
+
* @param {TSubProcessOptions extends TIsBufferOpts ? Buffer : string} [stderr]
|
|
15
|
+
* @returns {any}
|
|
8
16
|
*/
|
|
9
|
-
|
|
10
|
-
/** @type {import('child_process').ChildProcess?} */
|
|
17
|
+
/** @type {import('child_process').ChildProcess | null} */
|
|
11
18
|
proc: import("child_process").ChildProcess | null;
|
|
12
19
|
/** @type {string[]} */
|
|
13
20
|
args: string[];
|
|
@@ -16,9 +23,9 @@ export class SubProcess extends events<[never]> {
|
|
|
16
23
|
*/
|
|
17
24
|
cmd: string;
|
|
18
25
|
/**
|
|
19
|
-
* @type {
|
|
26
|
+
* @type {SubProcessOptions}
|
|
20
27
|
*/
|
|
21
|
-
opts:
|
|
28
|
+
opts: SubProcessOptions;
|
|
22
29
|
/**
|
|
23
30
|
* @type {boolean}
|
|
24
31
|
*/
|
|
@@ -43,7 +50,7 @@ export class SubProcess extends events<[never]> {
|
|
|
43
50
|
* @param {boolean} detach
|
|
44
51
|
* @returns {Promise<void>}
|
|
45
52
|
*/
|
|
46
|
-
start(startDetector?:
|
|
53
|
+
start(startDetector?: ((stdout: TSubProcessOptions extends TIsBufferOpts ? Buffer : string, stderr?: (TSubProcessOptions extends TIsBufferOpts ? Buffer<ArrayBufferLike> : string) | undefined) => any) | (number | null), timeoutMs?: number | null, detach?: boolean): Promise<void>;
|
|
47
54
|
/**
|
|
48
55
|
* @deprecated This method is deprecated and will be removed
|
|
49
56
|
*/
|
|
@@ -59,5 +66,14 @@ export class SubProcess extends events<[never]> {
|
|
|
59
66
|
detachProcess(): void;
|
|
60
67
|
get pid(): number | null | undefined;
|
|
61
68
|
}
|
|
62
|
-
|
|
69
|
+
export default SubProcess;
|
|
70
|
+
export type SubProcessCustomOptions = {
|
|
71
|
+
isBuffer?: boolean | undefined;
|
|
72
|
+
encoding?: string | undefined;
|
|
73
|
+
};
|
|
74
|
+
export type SubProcessOptions = SubProcessCustomOptions & import("child_process").SpawnOptionsWithoutStdio;
|
|
75
|
+
export type TIsBufferOpts = {
|
|
76
|
+
isBuffer: true;
|
|
77
|
+
};
|
|
78
|
+
import { EventEmitter } from 'events';
|
|
63
79
|
//# sourceMappingURL=subprocess.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subprocess.d.ts","sourceRoot":"","sources":["../../lib/subprocess.js"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"subprocess.d.ts","sourceRoot":"","sources":["../../lib/subprocess.js"],"names":[],"mappings":"AAQA;;GAEG;AACH,wBAFiC,kBAAkB,SAArC,iBAAkB;IA+B9B;;;;OAIG;IACH,iBAJW,MAAM,SACN,MAAM,EAAE,SACR,kBAAkB,EAgB5B;IA/CD;;;;;OAKG;IAEH,0DAA0D;IAC1D,MADW,OAAO,eAAe,EAAE,YAAY,GAAG,IAAI,CACjD;IACL,uBAAuB;IACvB,MADW,MAAM,EAAE,CACd;IACL;;OAEG;IACH,KAFU,MAAM,CAEZ;IACJ;;MAEE;IACF,MAFU,iBAAiB,CAEtB;IACL;;OAEG;IACH,eAFU,OAAO,CAEH;IACd;;OAEG;IACH,KAFU,MAAM,CAEZ;IAuBJ,yBAGC;IAED;;;;OAIG;IACH,sBAHW,MAAM,SACN,QAAQ,CAAC,MAAM,CAAC,GAAC,MAAM,QAYjC;IAED;;;;;;;;OAQG;IACH,sBALW,UAzEA,kBAAkB,SAAS,aAAa,GAAG,MAAM,GAAG,MAAM,yGAExD,GAAG,KAuES,MAAM,OAAC,CAAA,cACrB,MAAM,OAAC,WACP,OAAO,GACL,OAAO,CAAC,IAAI,CAAC,CAiKzB;IAED;;OAEG;IACH,wBAGC;IAED;;;;;OAKG;IACH,cAJW,MAAM,CAAC,OAAO,YACd,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED,gDAcC;IAKD,sBAQC;IAED,qCAEC;CACF;;;;;;gCAWY,uBAAuB,GAAG,OAAO,eAAe,EAAE,wBAAwB;4BAC1E;IAAC,QAAQ,EAAE,IAAI,CAAA;CAAC;6BAtUA,QAAQ"}
|
package/build/lib/subprocess.js
CHANGED
|
@@ -5,20 +5,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.SubProcess = void 0;
|
|
7
7
|
const child_process_1 = require("child_process");
|
|
8
|
-
const events_1 =
|
|
9
|
-
const { EventEmitter } = events_1.default;
|
|
8
|
+
const events_1 = require("events");
|
|
10
9
|
const bluebird_1 = __importDefault(require("bluebird"));
|
|
11
10
|
const shell_quote_1 = require("shell-quote");
|
|
12
11
|
const lodash_1 = __importDefault(require("lodash"));
|
|
13
12
|
const helpers_1 = require("./helpers");
|
|
14
13
|
const node_readline_1 = require("node:readline");
|
|
15
|
-
|
|
14
|
+
/**
|
|
15
|
+
* @template {SubProcessOptions} TSubProcessOptions
|
|
16
|
+
*/
|
|
17
|
+
class SubProcess extends events_1.EventEmitter {
|
|
16
18
|
/**
|
|
17
19
|
* @param {string} cmd
|
|
18
|
-
* @param {string[]} [args]
|
|
19
|
-
* @param {
|
|
20
|
+
* @param {string[]} [args=[]]
|
|
21
|
+
* @param {TSubProcessOptions} [opts]
|
|
20
22
|
*/
|
|
21
|
-
constructor(cmd, args = [], opts
|
|
23
|
+
constructor(cmd, args = [], opts) {
|
|
22
24
|
super();
|
|
23
25
|
if (!cmd)
|
|
24
26
|
throw new Error('Command is required'); // eslint-disable-line curly
|
|
@@ -29,7 +31,7 @@ class SubProcess extends EventEmitter {
|
|
|
29
31
|
this.cmd = cmd;
|
|
30
32
|
this.args = args;
|
|
31
33
|
this.proc = null;
|
|
32
|
-
this.opts = opts;
|
|
34
|
+
this.opts = opts ?? {};
|
|
33
35
|
this.expectingExit = false;
|
|
34
36
|
// get a quoted representation of the command for error strings
|
|
35
37
|
this.rep = (0, shell_quote_1.quote)([cmd, ...args]);
|
|
@@ -99,8 +101,10 @@ class SubProcess extends EventEmitter {
|
|
|
99
101
|
this.proc = (0, child_process_1.spawn)(this.cmd, this.args, this.opts);
|
|
100
102
|
// this function handles output that we collect from the subproc
|
|
101
103
|
/**
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
+
* @param { {
|
|
105
|
+
* stdout: TSubProcessOptions extends TIsBufferOpts ? Buffer : string,
|
|
106
|
+
* stderr: TSubProcessOptions extends TIsBufferOpts ? Buffer : string
|
|
107
|
+
* } } streams
|
|
104
108
|
*/
|
|
105
109
|
const handleOutput = (streams) => {
|
|
106
110
|
const { stdout, stderr } = streams;
|
|
@@ -123,7 +127,7 @@ class SubProcess extends EventEmitter {
|
|
|
123
127
|
this.proc?.removeAllListeners('exit');
|
|
124
128
|
this.proc?.kill('SIGINT');
|
|
125
129
|
if (err.code === 'ENOENT') {
|
|
126
|
-
err = await (0, helpers_1.formatEnoent)(err, this.cmd, this.opts?.cwd);
|
|
130
|
+
err = await (0, helpers_1.formatEnoent)(err, this.cmd, this.opts?.cwd?.toString());
|
|
127
131
|
}
|
|
128
132
|
reject(err);
|
|
129
133
|
this.proc?.unref();
|
|
@@ -146,11 +150,19 @@ class SubProcess extends EventEmitter {
|
|
|
146
150
|
const isBuffer = Boolean(this.opts.isBuffer);
|
|
147
151
|
const encoding = this.opts.encoding || 'utf8';
|
|
148
152
|
if (this.proc.stdout) {
|
|
149
|
-
this.proc.stdout.on('data', (chunk) => handleOutput({
|
|
153
|
+
this.proc.stdout.on('data', (chunk) => handleOutput({
|
|
154
|
+
stdout: isBuffer ? chunk : chunk.toString(encoding),
|
|
155
|
+
// @ts-ignore This is OK
|
|
156
|
+
stderr: isBuffer ? Buffer.alloc(0) : '',
|
|
157
|
+
}));
|
|
150
158
|
handleStreamLines('stdout', this.proc.stdout);
|
|
151
159
|
}
|
|
152
160
|
if (this.proc.stderr) {
|
|
153
|
-
this.proc.stderr.on('data', (chunk) => handleOutput({
|
|
161
|
+
this.proc.stderr.on('data', (chunk) => handleOutput({
|
|
162
|
+
// @ts-ignore This is OK
|
|
163
|
+
stdout: isBuffer ? Buffer.alloc(0) : '',
|
|
164
|
+
stderr: isBuffer ? chunk : chunk.toString(encoding)
|
|
165
|
+
}));
|
|
154
166
|
handleStreamLines('stderr', this.proc.stderr);
|
|
155
167
|
}
|
|
156
168
|
// when the proc exits, we might still have a buffer of lines we were
|
|
@@ -254,9 +266,12 @@ class SubProcess extends EventEmitter {
|
|
|
254
266
|
exports.SubProcess = SubProcess;
|
|
255
267
|
exports.default = SubProcess;
|
|
256
268
|
/**
|
|
257
|
-
* @
|
|
258
|
-
* @
|
|
259
|
-
* @
|
|
260
|
-
|
|
269
|
+
* @typedef {Object} SubProcessCustomOptions
|
|
270
|
+
* @property {boolean} [isBuffer]
|
|
271
|
+
* @property {string} [encoding]
|
|
272
|
+
*/
|
|
273
|
+
/**
|
|
274
|
+
* @typedef {SubProcessCustomOptions & import('child_process').SpawnOptionsWithoutStdio} SubProcessOptions
|
|
275
|
+
* @typedef {{isBuffer: true}} TIsBufferOpts
|
|
261
276
|
*/
|
|
262
277
|
//# sourceMappingURL=subprocess.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subprocess.js","sourceRoot":"","sources":["../../lib/subprocess.js"],"names":[],"mappings":";;;;;;AAAA,iDAAsC;AACtC,
|
|
1
|
+
{"version":3,"file":"subprocess.js","sourceRoot":"","sources":["../../lib/subprocess.js"],"names":[],"mappings":"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"}
|
package/lib/subprocess.js
CHANGED
|
@@ -1,35 +1,38 @@
|
|
|
1
1
|
import { spawn } from 'child_process';
|
|
2
|
-
import
|
|
3
|
-
const { EventEmitter } = events;
|
|
2
|
+
import { EventEmitter } from 'events';
|
|
4
3
|
import B from 'bluebird';
|
|
5
4
|
import { quote } from 'shell-quote';
|
|
6
5
|
import _ from 'lodash';
|
|
7
6
|
import { formatEnoent } from './helpers';
|
|
8
7
|
import { createInterface } from 'node:readline';
|
|
9
8
|
|
|
10
|
-
|
|
9
|
+
/**
|
|
10
|
+
* @template {SubProcessOptions} TSubProcessOptions
|
|
11
|
+
*/
|
|
12
|
+
export class SubProcess extends EventEmitter {
|
|
13
|
+
/**
|
|
14
|
+
* @callback StartDetector
|
|
15
|
+
* @param {TSubProcessOptions extends TIsBufferOpts ? Buffer : string} stdout
|
|
16
|
+
* @param {TSubProcessOptions extends TIsBufferOpts ? Buffer : string} [stderr]
|
|
17
|
+
* @returns {any}
|
|
18
|
+
*/
|
|
11
19
|
|
|
12
|
-
/** @type {import('child_process').ChildProcess
|
|
20
|
+
/** @type {import('child_process').ChildProcess | null} */
|
|
13
21
|
proc;
|
|
14
|
-
|
|
15
22
|
/** @type {string[]} */
|
|
16
23
|
args;
|
|
17
|
-
|
|
18
24
|
/**
|
|
19
25
|
* @type {string}
|
|
20
26
|
*/
|
|
21
27
|
cmd;
|
|
22
|
-
|
|
23
28
|
/**
|
|
24
|
-
* @type {
|
|
29
|
+
* @type {SubProcessOptions}
|
|
25
30
|
*/
|
|
26
31
|
opts;
|
|
27
|
-
|
|
28
32
|
/**
|
|
29
33
|
* @type {boolean}
|
|
30
34
|
*/
|
|
31
35
|
expectingExit;
|
|
32
|
-
|
|
33
36
|
/**
|
|
34
37
|
* @type {string}
|
|
35
38
|
*/
|
|
@@ -37,10 +40,10 @@ class SubProcess extends EventEmitter {
|
|
|
37
40
|
|
|
38
41
|
/**
|
|
39
42
|
* @param {string} cmd
|
|
40
|
-
* @param {string[]} [args]
|
|
41
|
-
* @param {
|
|
43
|
+
* @param {string[]} [args=[]]
|
|
44
|
+
* @param {TSubProcessOptions} [opts]
|
|
42
45
|
*/
|
|
43
|
-
constructor (cmd, args = [], opts
|
|
46
|
+
constructor (cmd, args = [], opts) {
|
|
44
47
|
super();
|
|
45
48
|
if (!cmd) throw new Error('Command is required'); // eslint-disable-line curly
|
|
46
49
|
if (!_.isString(cmd)) throw new Error('Command must be a string'); // eslint-disable-line curly
|
|
@@ -49,7 +52,7 @@ class SubProcess extends EventEmitter {
|
|
|
49
52
|
this.cmd = cmd;
|
|
50
53
|
this.args = args;
|
|
51
54
|
this.proc = null;
|
|
52
|
-
this.opts = opts;
|
|
55
|
+
this.opts = opts ?? {};
|
|
53
56
|
this.expectingExit = false;
|
|
54
57
|
|
|
55
58
|
// get a quoted representation of the command for error strings
|
|
@@ -128,8 +131,10 @@ class SubProcess extends EventEmitter {
|
|
|
128
131
|
|
|
129
132
|
// this function handles output that we collect from the subproc
|
|
130
133
|
/**
|
|
131
|
-
*
|
|
132
|
-
*
|
|
134
|
+
* @param { {
|
|
135
|
+
* stdout: TSubProcessOptions extends TIsBufferOpts ? Buffer : string,
|
|
136
|
+
* stderr: TSubProcessOptions extends TIsBufferOpts ? Buffer : string
|
|
137
|
+
* } } streams
|
|
133
138
|
*/
|
|
134
139
|
const handleOutput = (streams) => {
|
|
135
140
|
const {stdout, stderr} = streams;
|
|
@@ -154,7 +159,7 @@ class SubProcess extends EventEmitter {
|
|
|
154
159
|
this.proc?.kill('SIGINT');
|
|
155
160
|
|
|
156
161
|
if (err.code === 'ENOENT') {
|
|
157
|
-
err = await formatEnoent(err, this.cmd, this.opts?.cwd);
|
|
162
|
+
err = await formatEnoent(err, this.cmd, this.opts?.cwd?.toString());
|
|
158
163
|
}
|
|
159
164
|
reject(err);
|
|
160
165
|
|
|
@@ -182,14 +187,22 @@ class SubProcess extends EventEmitter {
|
|
|
182
187
|
|
|
183
188
|
if (this.proc.stdout) {
|
|
184
189
|
this.proc.stdout.on('data', (chunk) =>
|
|
185
|
-
handleOutput({
|
|
190
|
+
handleOutput({
|
|
191
|
+
stdout: isBuffer ? chunk : chunk.toString(encoding),
|
|
192
|
+
// @ts-ignore This is OK
|
|
193
|
+
stderr: isBuffer ? Buffer.alloc(0) : '',
|
|
194
|
+
}),
|
|
186
195
|
);
|
|
187
196
|
handleStreamLines('stdout', this.proc.stdout);
|
|
188
197
|
}
|
|
189
198
|
|
|
190
199
|
if (this.proc.stderr) {
|
|
191
200
|
this.proc.stderr.on('data', (chunk) =>
|
|
192
|
-
handleOutput({
|
|
201
|
+
handleOutput({
|
|
202
|
+
// @ts-ignore This is OK
|
|
203
|
+
stdout: isBuffer ? Buffer.alloc(0) : '',
|
|
204
|
+
stderr: isBuffer ? chunk : chunk.toString(encoding)
|
|
205
|
+
}),
|
|
193
206
|
);
|
|
194
207
|
handleStreamLines('stderr', this.proc.stderr);
|
|
195
208
|
}
|
|
@@ -302,12 +315,15 @@ class SubProcess extends EventEmitter {
|
|
|
302
315
|
}
|
|
303
316
|
}
|
|
304
317
|
|
|
305
|
-
export { SubProcess };
|
|
306
318
|
export default SubProcess;
|
|
307
319
|
|
|
308
320
|
/**
|
|
309
|
-
* @
|
|
310
|
-
* @
|
|
311
|
-
* @
|
|
312
|
-
|
|
321
|
+
* @typedef {Object} SubProcessCustomOptions
|
|
322
|
+
* @property {boolean} [isBuffer]
|
|
323
|
+
* @property {string} [encoding]
|
|
324
|
+
*/
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* @typedef {SubProcessCustomOptions & import('child_process').SpawnOptionsWithoutStdio} SubProcessOptions
|
|
328
|
+
* @typedef {{isBuffer: true}} TIsBufferOpts
|
|
313
329
|
*/
|