1- import type { ServerWebSocket } from "bun"
2- import { manager } from "../../../plugin/pty/manager"
3- import { type WSMessageServerSessionList , type WSMessageClientSubscribeSession , type WSMessageServerError , type WSMessageClientUnsubscribeSession , type WSMessageClientSessionList , type WSMessageClient , type WSMessageClientSpawnSession , type WSMessageClientInput , type WSMessageClientReadRaw , type WSMessageServerReadRawResponse , type WSMessageServerSubscribedSession , CustomError , type WSMessageServerUnsubscribedSession } from "../../shared/types"
1+ import type { ServerWebSocket } from 'bun'
2+ import { manager } from '../../../plugin/pty/manager'
3+ import {
4+ type WSMessageServerSessionList ,
5+ type WSMessageClientSubscribeSession ,
6+ type WSMessageServerError ,
7+ type WSMessageClientUnsubscribeSession ,
8+ type WSMessageClientSessionList ,
9+ type WSMessageClient ,
10+ type WSMessageClientSpawnSession ,
11+ type WSMessageClientInput ,
12+ type WSMessageClientReadRaw ,
13+ type WSMessageServerReadRawResponse ,
14+ type WSMessageServerSubscribedSession ,
15+ CustomError ,
16+ type WSMessageServerUnsubscribedSession ,
17+ } from '../../shared/types'
418
519class WebSocketHandler {
6- private sendSessionList ( ws : ServerWebSocket < any > ) : void {
7- const sessions = manager . list ( )
8- const message : WSMessageServerSessionList = { type : 'session_list' , sessions }
9- ws . send ( JSON . stringify ( message ) )
20+ private sendSessionList ( ws : ServerWebSocket < any > ) : void {
21+ const sessions = manager . list ( )
22+ const message : WSMessageServerSessionList = { type : 'session_list' , sessions }
23+ ws . send ( JSON . stringify ( message ) )
24+ }
25+
26+ private handleSubscribe (
27+ ws : ServerWebSocket < any > ,
28+ message : WSMessageClientSubscribeSession
29+ ) : void {
30+ const session = manager . get ( message . sessionId )
31+ if ( ! session ) {
32+ const error : WSMessageServerError = {
33+ type : 'error' ,
34+ error : new CustomError ( `Session ${ message . sessionId } not found` ) ,
35+ }
36+ ws . send ( JSON . stringify ( error ) )
37+ } else {
38+ ws . subscribe ( `session:${ message . sessionId } ` )
39+ const response : WSMessageServerSubscribedSession = {
40+ type : 'subscribed' ,
41+ sessionId : message . sessionId ,
42+ }
43+ ws . send ( JSON . stringify ( response ) )
1044 }
11-
12- private handleSubscribe ( ws : ServerWebSocket < any > , message : WSMessageClientSubscribeSession ) : void {
13- const session = manager . get ( message . sessionId )
14- if ( ! session ) {
15- const error : WSMessageServerError = { type : 'error' , error : new CustomError ( `Session ${ message . sessionId } not found` ) }
16- ws . send ( JSON . stringify ( error ) )
17- } else {
18- ws . subscribe ( `session: ${ message . sessionId } ` )
19- const response : WSMessageServerSubscribedSession = { type : 'subscribed' , sessionId : message . sessionId }
20- ws . send ( JSON . stringify ( response ) )
21- }
45+ }
46+
47+ private handleUnsubscribe (
48+ ws : ServerWebSocket < any > ,
49+ message : WSMessageClientUnsubscribeSession
50+ ) : void {
51+ const topic = `session: ${ message . sessionId } `
52+ ws . unsubscribe ( topic )
53+ const response : WSMessageServerUnsubscribedSession = {
54+ type : 'unsubscribed' ,
55+ sessionId : message . sessionId ,
2256 }
23-
24- private handleUnsubscribe ( ws : ServerWebSocket < any > , message : WSMessageClientUnsubscribeSession ) : void {
25- const topic = `session:${ message . sessionId } `
26- ws . unsubscribe ( topic )
27- const response : WSMessageServerUnsubscribedSession = { type : 'unsubscribed' , sessionId : message . sessionId }
28- ws . send ( JSON . stringify ( response ) )
57+ ws . send ( JSON . stringify ( response ) )
58+ }
59+
60+ private handleSessionListRequest (
61+ ws : ServerWebSocket < any > ,
62+ _message : WSMessageClientSessionList
63+ ) : void {
64+ this . sendSessionList ( ws )
65+ }
66+
67+ private handleUnknownMessage ( ws : ServerWebSocket < any > , message : WSMessageClient ) : void {
68+ const error : WSMessageServerError = {
69+ type : 'error' ,
70+ error : new CustomError ( `Unknown message type ${ message . type } ` ) ,
2971 }
30-
31- private handleSessionListRequest ( ws : ServerWebSocket < any > , _message : WSMessageClientSessionList ) : void {
32- this . sendSessionList ( ws )
72+ ws . send ( JSON . stringify ( error ) )
73+ }
74+
75+ public handleWebSocketMessage (
76+ ws : ServerWebSocket < any > ,
77+ data : string | Buffer < ArrayBuffer >
78+ ) : void {
79+ if ( typeof data !== 'string' ) {
80+ const error : WSMessageServerError = {
81+ type : 'error' ,
82+ error : new CustomError ( 'Binary messages are not supported yet. File an issue.' ) ,
83+ }
84+ ws . send ( JSON . stringify ( error ) )
85+ return
3386 }
34-
35- private handleUnknownMessage ( ws : ServerWebSocket < any > , message : WSMessageClient ) : void {
36- const error : WSMessageServerError = { type : 'error' , error : new CustomError ( `Unknown message type ${ message . type } ` ) }
37- ws . send ( JSON . stringify ( error ) )
87+ try {
88+ const message : WSMessageClient = JSON . parse ( data )
89+
90+ switch ( message . type ) {
91+ case 'subscribe' :
92+ this . handleSubscribe ( ws , message as WSMessageClientSubscribeSession )
93+ break
94+
95+ case 'unsubscribe' :
96+ this . handleUnsubscribe ( ws , message as WSMessageClientUnsubscribeSession )
97+ break
98+
99+ case 'session_list' :
100+ this . handleSessionListRequest ( ws , message as WSMessageClientSessionList )
101+ break
102+
103+ case 'spawn' :
104+ this . handleSpawn ( ws , message as WSMessageClientSpawnSession )
105+ break
106+
107+ case 'input' :
108+ this . handleInput ( message as WSMessageClientInput )
109+ break
110+
111+ case 'readRaw' :
112+ this . handleReadRaw ( ws , message as WSMessageClientReadRaw )
113+ break
114+
115+ default :
116+ this . handleUnknownMessage ( ws , message )
117+ }
118+ } catch ( err ) {
119+ const error : WSMessageServerError = {
120+ type : 'error' ,
121+ error : new CustomError ( Bun . inspect ( err ) ) ,
122+ }
123+ ws . send ( JSON . stringify ( error ) )
38124 }
125+ }
39126
40- public handleWebSocketMessage ( ws : ServerWebSocket < any > , data : string | Buffer < ArrayBuffer > ) : void {
41- if ( typeof data !== 'string' ) {
42- const error : WSMessageServerError = { type : 'error' , error : new CustomError ( 'Binary messages are not supported yet. File an issue.' ) }
43- ws . send ( JSON . stringify ( error ) )
44- return
45- }
46- try {
47- const message : WSMessageClient = JSON . parse ( data )
48-
49- switch ( message . type ) {
50- case 'subscribe' :
51- this . handleSubscribe ( ws , message as WSMessageClientSubscribeSession )
52- break
53-
54- case 'unsubscribe' :
55- this . handleUnsubscribe ( ws , message as WSMessageClientUnsubscribeSession )
56- break
57-
58- case 'session_list' :
59- this . handleSessionListRequest ( ws , message as WSMessageClientSessionList )
60- break
61-
62- case 'spawn' :
63- this . handleSpawn ( ws , message as WSMessageClientSpawnSession )
64- break
65-
66- case 'input' :
67- this . handleInput ( message as WSMessageClientInput )
68- break
69-
70- case 'readRaw' :
71- this . handleReadRaw ( ws , message as WSMessageClientReadRaw )
72- break
73-
74- default :
75- this . handleUnknownMessage ( ws , message )
76- }
77- } catch ( err ) {
78- const error : WSMessageServerError = { type : 'error' , error : new CustomError ( Bun . inspect ( err ) ) }
79- ws . send ( JSON . stringify ( error ) )
80- }
127+ private handleSpawn ( ws : ServerWebSocket < any > , message : WSMessageClientSpawnSession ) {
128+ const sessionInfo = manager . spawn ( message )
129+ if ( message . subscribe ) {
130+ this . handleSubscribe ( ws , { type : 'subscribe' , sessionId : sessionInfo . id } )
81131 }
82-
83- private handleSpawn ( ws : ServerWebSocket < any > , message : WSMessageClientSpawnSession ) {
84- const sessionInfo = manager . spawn ( message )
85- if ( message . subscribe ) {
86- this . handleSubscribe ( ws , { type : 'subscribe' , sessionId : sessionInfo . id } )
87- }
132+ }
133+
134+ private handleInput ( message : WSMessageClientInput ) {
135+ manager . write ( message . sessionId , message . data )
136+ }
137+
138+ private handleReadRaw ( ws : ServerWebSocket < any > , message : WSMessageClientReadRaw ) {
139+ const rawData = manager . getRawBuffer ( message . sessionId )
140+ if ( ! rawData ) {
141+ const error : WSMessageServerError = {
142+ type : 'error' ,
143+ error : new CustomError ( `Session ${ message . sessionId } not found` ) ,
144+ }
145+ ws . send ( JSON . stringify ( error ) )
146+ return
88147 }
89-
90- private handleInput ( message : WSMessageClientInput ) {
91- manager . write ( message . sessionId , message . data )
92- }
93-
94- private handleReadRaw ( ws : ServerWebSocket < any > , message : WSMessageClientReadRaw ) {
95- const rawData = manager . getRawBuffer ( message . sessionId )
96- if ( ! rawData ) {
97- const error : WSMessageServerError = { type : 'error' , error : new CustomError ( `Session ${ message . sessionId } not found` ) }
98- ws . send ( JSON . stringify ( error ) )
99- return
100- }
101- const response : WSMessageServerReadRawResponse = {
102- type : 'readRawResponse' ,
103- sessionId : message . sessionId ,
104- rawData : rawData . raw
105- }
106- ws . send ( JSON . stringify ( response ) )
148+ const response : WSMessageServerReadRawResponse = {
149+ type : 'readRawResponse' ,
150+ sessionId : message . sessionId ,
151+ rawData : rawData . raw ,
107152 }
153+ ws . send ( JSON . stringify ( response ) )
154+ }
108155}
109156
110- export function handleWebSocketMessage ( ws : ServerWebSocket < any > , data : string | Buffer < ArrayBuffer > ) : void {
111- const handler = new WebSocketHandler ( )
112- handler . handleWebSocketMessage ( ws , data )
113- }
157+ export function handleWebSocketMessage (
158+ ws : ServerWebSocket < any > ,
159+ data : string | Buffer < ArrayBuffer >
160+ ) : void {
161+ const handler = new WebSocketHandler ( )
162+ handler . handleWebSocketMessage ( ws , data )
163+ }
0 commit comments