MCPcopy Create free account
hub / github.com/TanStack/ai / webSocketFrameToAcpStream

Function webSocketFrameToAcpStream

packages/ai-acp/src/transport/websocket.ts:67–108  ·  view source on GitHub ↗
(ws: WebSocket)

Source from the content-addressed store, hash-verified

65 * One JSON-RPC object per WebSocket text frame (e.g. `grok agent serve`).
66 */
67export function webSocketFrameToAcpStream(ws: WebSocket): AcpJsonRpcStream {
68 const decoder = new TextDecoder()
69
70 const readable = new ReadableStream<unknown>({
71 start(rawController) {
72 const controller = idempotentController(rawController)
73 ws.addEventListener('message', (event) => {
74 const text =
75 typeof event.data === 'string'
76 ? event.data
77 : decoder.decode(event.data as ArrayBuffer)
78 const trimmed = text.trim()
79 if (trimmed === '') return
80 try {
81 controller.enqueue(JSON.parse(trimmed))
82 } catch (error) {
83 controller.error(
84 error instanceof Error ? error : new Error(String(error)),
85 )
86 }
87 })
88 ws.addEventListener('close', () => controller.close())
89 ws.addEventListener('error', () =>
90 controller.error(new Error('WebSocket connection error')),
91 )
92 },
93 cancel() {
94 ws.close()
95 },
96 })
97
98 const writable = new WritableStream({
99 write(message) {
100 ws.send(JSON.stringify(message))
101 },
102 close() {
103 ws.close()
104 },
105 })
106
107 return { readable, writable } as AcpJsonRpcStream
108}
109
110function webSocketNdjsonToAcpStream(ws: WebSocket): AcpJsonRpcStream {
111 const encoder = new TextEncoder()

Callers 2

connectAcpWebSocketFunction · 0.85
transport.test.tsFile · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected