summaryrefslogtreecommitdiff
path: root/packages/core/src/tools/tool-registry.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/core/src/tools/tool-registry.ts')
-rw-r--r--packages/core/src/tools/tool-registry.ts53
1 files changed, 38 insertions, 15 deletions
diff --git a/packages/core/src/tools/tool-registry.ts b/packages/core/src/tools/tool-registry.ts
index 2b27a703..f3162ac0 100644
--- a/packages/core/src/tools/tool-registry.ts
+++ b/packages/core/src/tools/tool-registry.ts
@@ -53,28 +53,51 @@ Signal: Signal number or \`(none)\` if no signal was received.
const child = spawn(callCommand, [this.name]);
child.stdin.write(JSON.stringify(params));
child.stdin.end();
+
let stdout = '';
let stderr = '';
- child.stdout.on('data', (data) => {
- stdout += data?.toString();
- });
- child.stderr.on('data', (data) => {
- stderr += data?.toString();
- });
let error: Error | null = null;
- child.on('error', (err: Error) => {
- error = err;
- });
let code: number | null = null;
let signal: NodeJS.Signals | null = null;
- child.on(
- 'close',
- (_code: number | null, _signal: NodeJS.Signals | null) => {
+
+ await new Promise<void>((resolve) => {
+ const onStdout = (data: Buffer) => {
+ stdout += data?.toString();
+ };
+
+ const onStderr = (data: Buffer) => {
+ stderr += data?.toString();
+ };
+
+ const onError = (err: Error) => {
+ error = err;
+ };
+
+ const onClose = (
+ _code: number | null,
+ _signal: NodeJS.Signals | null,
+ ) => {
code = _code;
signal = _signal;
- },
- );
- await new Promise((resolve) => child.on('close', resolve));
+ cleanup();
+ resolve();
+ };
+
+ const cleanup = () => {
+ child.stdout.removeListener('data', onStdout);
+ child.stderr.removeListener('data', onStderr);
+ child.removeListener('error', onError);
+ child.removeListener('close', onClose);
+ if (child.connected) {
+ child.disconnect();
+ }
+ };
+
+ child.stdout.on('data', onStdout);
+ child.stderr.on('data', onStderr);
+ child.on('error', onError);
+ child.on('close', onClose);
+ });
// if there is any error, non-zero exit code, signal, or stderr, return error details instead of stdout
if (error || code !== 0 || signal || stderr) {