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});