64 lines
2.3 KiB
JavaScript
64 lines
2.3 KiB
JavaScript
/**
|
|
* Creates an ACP Stream from a pair of newline-delimited JSON streams.
|
|
*
|
|
* This is the typical way to handle ACP connections over stdio, converting
|
|
* between AnyMessage objects and newline-delimited JSON.
|
|
*
|
|
* @param output - The writable stream to send encoded messages to
|
|
* @param input - The readable stream to receive encoded messages from
|
|
* @returns A Stream for bidirectional ACP communication
|
|
*/
|
|
export function ndJsonStream(output, input) {
|
|
const textEncoder = new TextEncoder();
|
|
const textDecoder = new TextDecoder();
|
|
const readable = new ReadableStream({
|
|
async start(controller) {
|
|
let content = "";
|
|
const reader = input.getReader();
|
|
try {
|
|
while (true) {
|
|
const { value, done } = await reader.read();
|
|
if (done) {
|
|
break;
|
|
}
|
|
if (!value) {
|
|
continue;
|
|
}
|
|
content += textDecoder.decode(value, { stream: true });
|
|
const lines = content.split("\n");
|
|
content = lines.pop() || "";
|
|
for (const line of lines) {
|
|
const trimmedLine = line.trim();
|
|
if (trimmedLine) {
|
|
try {
|
|
const message = JSON.parse(trimmedLine);
|
|
controller.enqueue(message);
|
|
}
|
|
catch (err) {
|
|
console.error("Failed to parse JSON message:", trimmedLine, err);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
finally {
|
|
reader.releaseLock();
|
|
controller.close();
|
|
}
|
|
},
|
|
});
|
|
const writable = new WritableStream({
|
|
async write(message) {
|
|
const content = JSON.stringify(message) + "\n";
|
|
const writer = output.getWriter();
|
|
try {
|
|
await writer.write(textEncoder.encode(content));
|
|
}
|
|
finally {
|
|
writer.releaseLock();
|
|
}
|
|
},
|
|
});
|
|
return { readable, writable };
|
|
}
|
|
//# sourceMappingURL=stream.js.map
|