@@ -136,19 +136,26 @@ static size_t base64_encode(const unsigned char *in, size_t len, char *out) {
136136
137137/* ---- uv helpers ---- */
138138
139+ static void ws_format_conn_id (uv_tcp_t * h , char * buf , size_t sz ) {
140+ snprintf (buf , sz , "%p" , (void * )h );
141+ }
142+
139143static void on_close (uv_handle_t * handle ) {
140144 http_conn_t * conn = (http_conn_t * )handle ;
141145 if (conn -> type == CONN_WEBSOCKET ) {
142146 ws_track_remove (& conn -> handle );
143147 if (g_ws_handler ) {
144- char * evt_mem = (char * )GC_malloc (16 );
148+ char * evt_mem = (char * )GC_malloc (24 );
145149 char * * evt = (char * * )evt_mem ;
146150 char * empty = (char * )GC_malloc_atomic (1 );
147151 empty [0 ] = '\0' ;
148152 evt [0 ] = empty ;
149153 char * close_str = (char * )GC_malloc_atomic (6 );
150154 memcpy (close_str , "close" , 6 );
151155 evt [1 ] = close_str ;
156+ char * conn_id_str = (char * )GC_malloc_atomic (20 );
157+ ws_format_conn_id (& conn -> handle , conn_id_str , 20 );
158+ evt [2 ] = conn_id_str ;
152159 g_ws_handler (evt_mem );
153160 }
154161 }
@@ -470,14 +477,17 @@ static void ws_handle_upgrade(http_conn_t *conn) {
470477 send_raw (& conn -> handle , response , (size_t )rlen );
471478
472479 if (g_ws_handler ) {
473- char * evt_mem = (char * )GC_malloc (16 );
480+ char * evt_mem = (char * )GC_malloc (24 );
474481 char * * evt = (char * * )evt_mem ;
475482 char * empty = (char * )GC_malloc_atomic (1 );
476483 empty [0 ] = '\0' ;
477484 evt [0 ] = empty ;
478485 char * open_str = (char * )GC_malloc_atomic (5 );
479486 memcpy (open_str , "open" , 5 );
480487 evt [1 ] = open_str ;
488+ char * conn_id_str = (char * )GC_malloc_atomic (20 );
489+ ws_format_conn_id (& conn -> handle , conn_id_str , 20 );
490+ evt [2 ] = conn_id_str ;
481491
482492 char * reply = g_ws_handler (evt_mem );
483493 if (reply && reply [0 ]) {
@@ -526,12 +536,15 @@ static void ws_process_frame(http_conn_t *conn) {
526536 memcpy (data , payload , payload_len );
527537 data [payload_len ] = '\0' ;
528538
529- char * evt_mem = (char * )GC_malloc (16 );
539+ char * evt_mem = (char * )GC_malloc (24 );
530540 char * * evt = (char * * )evt_mem ;
531541 evt [0 ] = data ;
532542 char * msg_str = (char * )GC_malloc_atomic (8 );
533543 memcpy (msg_str , "message" , 8 );
534544 evt [1 ] = msg_str ;
545+ char * conn_id_str = (char * )GC_malloc_atomic (20 );
546+ ws_format_conn_id (& conn -> handle , conn_id_str , 20 );
547+ evt [2 ] = conn_id_str ;
535548
536549 char * reply = g_ws_handler (evt_mem );
537550 if (reply && reply [0 ]) {
@@ -787,3 +800,14 @@ void lws_bridge_ws_broadcast(const char *data, int len) {
787800 ws_send_frame (g_ws_conns [i ], 0x1 , data , (size_t )len );
788801 }
789802}
803+
804+ void lws_bridge_ws_send_to (const char * conn_id , const char * data , int len ) {
805+ unsigned long long val = strtoull (conn_id , NULL , 0 );
806+ uv_tcp_t * handle = (uv_tcp_t * )(uintptr_t )val ;
807+ for (int i = 0 ; i < g_ws_conn_count ; i ++ ) {
808+ if (g_ws_conns [i ] == handle ) {
809+ ws_send_frame (handle , 0x1 , data , (size_t )len );
810+ return ;
811+ }
812+ }
813+ }
0 commit comments