(deps: ServerDependencies)
| 967 | |
| 968 | return { code: 1011, reason: event.reason || 'PTY upstream closed' }; |
| 969 | } |
| 970 | |
| 971 | type BunUpgradeServer = { |
| 972 | upgrade: (req: Request, options: { data: WrapperWebSocketData }) => boolean; |
| 973 | }; |
| 974 | |
| 975 | function createWebSocketHandlers(config: ServerConfig, deps: ServerDependencies) { |
| 976 | const ptyUpstreams = new WeakMap<object, WebSocket>(); |
| 977 | |
| 978 | return { |
| 979 | open(ws: Bun.ServerWebSocket<WrapperWebSocketData>) { |
| 980 | const ptyId = ws.data.ptyId; |
| 981 | if (!ptyId) { |
| 982 | ws.close(1011, 'Missing PTY'); |
| 983 | return; |
| 984 | } |
| 985 | |
| 986 | const upstream = new WebSocket(buildPtyUpstreamUrl(config, deps, ptyId)); |
| 987 | upstream.binaryType = 'arraybuffer'; |
| 988 | ptyUpstreams.set(ws, upstream); |
| 989 | |
| 990 | upstream.onmessage = event => { |
| 991 | try { |
| 992 | ws.send(event.data instanceof ArrayBuffer ? event.data : String(event.data)); |
| 993 | } catch { |
| 994 | // Client disconnected. |
| 995 | } |
| 996 | }; |
| 997 | upstream.onclose = event => { |
| 998 | const close = resolvePtyClientClose({ code: event.code, reason: event.reason }); |
| 999 | try { |
| 1000 | ws.close(close.code, close.reason); |
| 1001 | } catch { |
| 1002 | // Already closed. |
| 1003 | } |
| 1004 | }; |
| 1005 | upstream.onerror = () => { |
| 1006 | try { |
| 1007 | ws.close(1011, 'PTY upstream error'); |
no test coverage detected