baa-conductor


baa-conductor / apps / claude-coded / src
im_wower  ·  2026-03-29

stream-json-transport.test.js

 1import assert from "node:assert/strict";
 2import { EventEmitter } from "node:events";
 3import test from "node:test";
 4
 5import { createStreamJsonTransport } from "../dist/index.js";
 6
 7class MockReadable extends EventEmitter {
 8  setEncoding() {}
 9}
10
11class MockWritable {
12  endCallCount = 0;
13  writes = [];
14
15  end(chunk) {
16    this.endCallCount += 1;
17    if (chunk != null) {
18      this.writes.push(chunk);
19    }
20  }
21
22  write(chunk) {
23    this.writes.push(chunk);
24    return true;
25  }
26}
27
28class MockProcess extends EventEmitter {
29  constructor() {
30    super();
31    this.stdin = new MockWritable();
32    this.stdout = new MockReadable();
33    this.stderr = new MockReadable();
34  }
35}
36
37test("createStreamJsonTransport removes stdio listeners on close", () => {
38  const child = new MockProcess();
39  const transport = createStreamJsonTransport({ process: child });
40
41  transport.connect();
42
43  assert.equal(child.stdout.listenerCount("data"), 1);
44  assert.equal(child.stdout.listenerCount("end"), 1);
45  assert.equal(child.stdout.listenerCount("error"), 1);
46  assert.equal(child.stderr.listenerCount("data"), 1);
47  assert.equal(child.stderr.listenerCount("error"), 1);
48  assert.equal(child.listenerCount("error"), 1);
49  assert.equal(child.listenerCount("exit"), 1);
50
51  transport.close();
52
53  assert.equal(child.stdout.listenerCount("data"), 0);
54  assert.equal(child.stdout.listenerCount("end"), 0);
55  assert.equal(child.stdout.listenerCount("error"), 0);
56  assert.equal(child.stderr.listenerCount("data"), 0);
57  assert.equal(child.stderr.listenerCount("error"), 0);
58  assert.equal(child.listenerCount("error"), 0);
59  assert.equal(child.listenerCount("exit"), 0);
60  assert.equal(child.stdin.endCallCount, 1);
61  assert.equal(transport.closed, true);
62  assert.equal(transport.connected, false);
63});
64
65test("createStreamJsonTransport captures stderr stream errors without closing", () => {
66  const child = new MockProcess();
67  const diagnostics = [];
68  const stderrMessages = [];
69  const transport = createStreamJsonTransport({
70    process: child,
71    onCloseDiagnostic: (diagnostic) => diagnostics.push(diagnostic),
72    onStderr: (text) => stderrMessages.push(text)
73  });
74
75  transport.connect();
76  child.stderr.emit("error", new Error("stderr failed"));
77
78  assert.equal(transport.closed, false);
79  assert.equal(transport.connected, true);
80  assert.deepEqual(stderrMessages, [
81    "Claude Code stderr stream error: stderr failed"
82  ]);
83  assert.deepEqual(diagnostics, [
84    {
85      source: "stderr.error",
86      message: "Claude Code stderr stream error: stderr failed"
87    }
88  ]);
89});