55
66import * as http from "node:http" ;
77import * as https from "node:https" ;
8- import { WebSocket , WebSocketServer } from "ws " ;
8+ import * as net from "node:net " ;
99import * as event from "node:events" ;
1010
1111
1212export class fallbackServer extends event . EventEmitter {
13- #wsServer: WebSocketServer ;
13+ #wsServer: net . Server ;
1414 #httpServer = http . createServer ( ) ;
1515 #listening = false ;
1616
1717 constructor ( httpPort :number , wsPort :number , hostAddr :string , httpUrl :string , wsUrl :string ) {
1818 super ( ) ;
19- this . #wsServer = new WebSocketServer ( { port : wsPort , host : hostAddr } ) ;
19+ this . #wsServer = net . createServer ( ) ;
2020 https . globalAgent . options . keepAlive = true ;
2121
2222 this . #wsServer. on ( 'listening' , ( ) => {
@@ -95,60 +95,49 @@ export class fallbackServer extends event.EventEmitter{
9595 console . warn ( '[fallbackServer][http][err] res raise error.' , '\n' , e ) ;
9696 } ) ;
9797 } ) ;
98- this . #wsServer. on ( 'connection' , ( socket , req ) => {
98+ this . #wsServer. on ( 'connection' , ( socket ) => {
9999 socket . on ( 'error' , ( e ) => {
100100 console . warn ( '[fallbackServer][ws][err] socket raise error.' , '\n' , e ) ;
101- try { socket . close ( ) ; } catch ( ee ) { }
101+ try { socket . destroy ( ) ; } catch ( ee ) { }
102102 } ) ;
103103 let url : URL ;
104104 try {
105105 url = new URL ( wsUrl ) ;
106106 } catch ( e ) {
107107 console . warn ( '[fallbackServer][ws][err] not a vaild ws url "' , httpUrl , '". \n' , e ) ;
108- socket . send ( 'Please check you fallback url settings. ' ) ;
109- socket . close ( ) ;
108+ socket . write ( 'Please check you fallback url settings. ' ) ;
109+ socket . destroy ( ) ;
110110 return ;
111111 }
112112 if ( url . protocol != 'ws:' && url . protocol != 'wss:' ) {
113113 console . warn ( '[fallbackServer][ws][err] we only accept ws and wss target, but receive "' + url . protocol + '". ' ) ;
114- socket . send ( 'Please check you fallback url settings. ' ) ;
115- socket . close ( ) ;
114+ socket . write ( 'Please check you fallback url settings. ' ) ;
115+ socket . destroy ( ) ;
116116 return ;
117117 }
118- let header = req . headers ;
119- // on('ws',header,url)
120- this . emit ( 'ws' , req . headers , req . url ) ;
121- header [ 'host' ] = url . host ;
122- let remote = new WebSocket ( wsUrl , { headers :header } ) ;
118+ let remote = net . connect ( {
119+ host : url . host ,
120+ port : url . port
121+ } ) ;
123122 remote . on ( 'error' , ( e ) => {
124123 console . warn ( '[fallbackServer][ws][err] remote raise error.' , '\n' , e ) ;
125- socket . send ( `${ e . name } ${ e . message } ${ e . cause } ` ) ;
126- socket . close ( ) ;
127- } ) ;
128- remote . on ( 'close' , ( code , reason ) => {
129- socket . close ( code ) ;
124+ socket . write ( `${ e . name } ${ e . message } ${ e . cause } ` ) ;
125+ socket . destroy ( ) ;
130126 } ) ;
131- remote . on ( 'message' , ( data ) => {
132- // on('remoteMsg',data)
133- this . emit ( 'remoteMsg' , data ) ;
134- socket . send ( data ) ;
135- } ) ;
136- remote . on ( 'open' , ( ) => {
137- socket . on ( 'message' , ( data ) => {
138- // on('localMsg',data)
139- this . emit ( 'localMsg' , data ) ;
140- remote . send ( data ) ;
141- } ) ;
142- socket . on ( 'close' , ( code , reason ) => {
143- remote . close ( code ) ;
144- } ) ;
127+ remote . on ( 'connection' , ( ) => {
128+ remote . pipe ( socket ) ;
129+ socket . pipe ( remote ) ;
145130 } ) ;
146131 } ) ;
147132 this . #httpServer. listen ( httpPort , hostAddr ) ;
133+ this . #wsServer. listen ( {
134+ host : hostAddr ,
135+ port : wsPort
136+ } ) ;
148137 }
149138
150139 isListening ( ) {
151140 return this . #listening;
152141 }
153142
154- }
143+ }
0 commit comments