@@ -10,7 +10,7 @@ import {
1010 pause ,
1111} from '../common.ts' ;
1212
13- let serverSynclet : Synclet < 1 > ;
13+ let synclet : Synclet < 1 > ;
1414
1515const connect = async (
1616 port : number ,
@@ -30,31 +30,30 @@ const connect = async (
3030
3131describeCommonBrokerTests (
3232 async ( ) => {
33- serverSynclet = await createSynclet ( {
33+ synclet = await createSynclet ( {
3434 transport : createWsBrokerTransport ( {
3535 webSocketServer : new WebSocketServer ( {
3636 port : allocatePort ( ) ,
3737 } ) . setMaxListeners ( 0 ) ,
3838 } ) ,
3939 } ) ;
40- await serverSynclet . start ( ) ;
40+ await synclet . start ( ) ;
4141
4242 return [
4343 ( path : string ) =>
4444 connect (
45- (
46- serverSynclet . getTransport ( ) [ 0 ] as WsBrokerTransport
47- ) . getWebSocketServer ( ) . options . port ! ,
45+ ( synclet . getTransport ( ) [ 0 ] as WsBrokerTransport ) . getWebSocketServer ( )
46+ . options . port ! ,
4847 path ,
4948 ) ,
5049 async ( ) =>
51- ( serverSynclet . getTransport ( ) [ 0 ] as WsBrokerTransport ) . getClientIds ( ) ,
50+ ( synclet . getTransport ( ) [ 0 ] as WsBrokerTransport ) . getClientIds ( ) ,
5251 ] as const ;
5352 } ,
5453
5554 async ( ) => {
56- serverSynclet . destroy ( ) ;
57- ( serverSynclet . getTransport ( ) [ 0 ] as WsBrokerTransport )
55+ synclet . destroy ( ) ;
56+ ( synclet . getTransport ( ) [ 0 ] as WsBrokerTransport )
5857 . getWebSocketServer ( )
5958 . close ( ) ;
6059 } ,
@@ -79,24 +78,23 @@ describe('external httpServer', () => {
7978 } ) ;
8079 } ) ;
8180
82- test ( 'single webSocketServer serving both paths' , async ( ) => {
83- serverSynclet = await createSynclet ( {
81+ test ( 'single webSocketServer, two paths' , async ( ) => {
82+ const synclet = await createSynclet ( {
8483 transport : createWsBrokerTransport ( {
8584 webSocketServer : new WebSocketServer ( {
8685 server : httpServer ,
8786 } ) . setMaxListeners ( 0 ) ,
8887 } ) ,
8988 } ) ;
90- await serverSynclet . start ( ) ;
89+ await synclet . start ( ) ;
9190
9291 const [ [ ws1 , ws2 ] , [ received1 , received2 ] ] = await createClients (
9392 2 ,
9493 ( path : string ) => connect ( port , path ) ,
9594 ) ;
9695
9796 expect (
98- ( serverSynclet . getTransport ( ) [ 0 ] as WsBrokerTransport ) . getClientIds ( )
99- . length ,
97+ ( synclet . getTransport ( ) [ 0 ] as WsBrokerTransport ) . getClientIds ( ) . length ,
10098 ) . toEqual ( 2 ) ;
10199
102100 ws1 . send ( '* from1To*' ) ;
@@ -112,9 +110,134 @@ describe('external httpServer', () => {
112110
113111 ws1 . close ( ) ;
114112 ws2 . close ( ) ;
115- await serverSynclet . destroy ( ) ;
116- ( serverSynclet . getTransport ( ) [ 0 ] as WsBrokerTransport )
113+ await synclet . destroy ( ) ;
114+ ( synclet . getTransport ( ) [ 0 ] as WsBrokerTransport )
117115 . getWebSocketServer ( )
118116 . close ( ) ;
119117 } ) ;
118+
119+ test ( 'single webSocketServer, manual upgrade, two paths' , async ( ) => {
120+ const wss = new WebSocketServer ( { noServer : true } ) . setMaxListeners ( 0 ) ;
121+ const synclet = await createSynclet ( {
122+ transport : createWsBrokerTransport ( {
123+ webSocketServer : wss ,
124+ } ) ,
125+ } ) ;
126+ await synclet . start ( ) ;
127+
128+ httpServer . on ( 'upgrade' , ( request , socket , head ) =>
129+ wss . handleUpgrade ( request , socket , head , ( ws ) =>
130+ wss . emit ( 'connection' , ws , request ) ,
131+ ) ,
132+ ) ;
133+
134+ const [ [ ws1 , ws2 ] , [ received1 , received2 ] ] = await createClients (
135+ 2 ,
136+ ( path : string ) => connect ( port , path ) ,
137+ ) ;
138+
139+ expect (
140+ ( synclet . getTransport ( ) [ 0 ] as WsBrokerTransport ) . getClientIds ( ) . length ,
141+ ) . toEqual ( 2 ) ;
142+
143+ ws1 . send ( '* from1To*' ) ;
144+ await pause ( transportPause ) ;
145+
146+ ws2 . send ( '* from2To*' ) ;
147+ await pause ( transportPause ) ;
148+
149+ expect ( received1 . length ) . toEqual ( 1 ) ;
150+ expect ( received1 [ 0 ] [ 1 ] ) . toEqual ( 'from2To*' ) ;
151+ expect ( received2 . length ) . toEqual ( 1 ) ;
152+ expect ( received2 [ 0 ] [ 1 ] ) . toEqual ( 'from1To*' ) ;
153+
154+ ws1 . close ( ) ;
155+ ws2 . close ( ) ;
156+ await synclet . destroy ( ) ;
157+ wss . close ( ) ;
158+ } ) ;
159+
160+ test ( 'two webSocketServers, manual upgrade, two paths' , async ( ) => {
161+ const wss1 = new WebSocketServer ( { noServer : true } ) . setMaxListeners ( 0 ) ;
162+ const synclet1 = await createSynclet ( {
163+ transport : createWsBrokerTransport ( {
164+ webSocketServer : wss1 ,
165+ } ) ,
166+ } ) ;
167+ await synclet1 . start ( ) ;
168+
169+ const wss2 = new WebSocketServer ( { noServer : true } ) . setMaxListeners ( 0 ) ;
170+ const synclet2 = await createSynclet ( {
171+ transport : createWsBrokerTransport ( {
172+ webSocketServer : wss2 ,
173+ } ) ,
174+ } ) ;
175+ await synclet2 . start ( ) ;
176+
177+ httpServer . on ( 'upgrade' , ( request , socket , head ) => {
178+ const pathname = new URL ( request . url ! , 'ws://localhost' ) . pathname ;
179+ if ( pathname === '/p1' ) {
180+ wss1 . handleUpgrade ( request , socket , head , ( ws ) =>
181+ wss1 . emit ( 'connection' , ws , request ) ,
182+ ) ;
183+ } else if ( pathname === '/p2' ) {
184+ wss2 . handleUpgrade ( request , socket , head , ( ws ) =>
185+ wss2 . emit ( 'connection' , ws , request ) ,
186+ ) ;
187+ }
188+ } ) ;
189+
190+ const [ [ ws1p1 , ws2p1 ] , [ received1p1 , received2p1 ] ] = await createClients (
191+ 2 ,
192+ ( path : string ) => connect ( port , path ) ,
193+ ( ) => 'p1' ,
194+ ) ;
195+
196+ const [ [ ws1p2 , ws2p2 ] , [ received1p2 , received2p2 ] ] = await createClients (
197+ 2 ,
198+ ( path : string ) => connect ( port , path ) ,
199+ ( ) => 'p2' ,
200+ ) ;
201+
202+ expect (
203+ ( synclet1 . getTransport ( ) [ 0 ] as WsBrokerTransport ) . getClientIds ( ) . length ,
204+ ) . toEqual ( 2 ) ;
205+ expect (
206+ ( synclet2 . getTransport ( ) [ 0 ] as WsBrokerTransport ) . getClientIds ( ) . length ,
207+ ) . toEqual ( 2 ) ;
208+
209+ ws1p1 . send ( '* from1p1To*' ) ;
210+ await pause ( transportPause ) ;
211+ ws2p1 . send ( '* from2p1To*' ) ;
212+ await pause ( transportPause ) ;
213+
214+ expect ( received1p1 . length ) . toEqual ( 1 ) ;
215+ expect ( received1p1 [ 0 ] [ 1 ] ) . toEqual ( 'from2p1To*' ) ;
216+ expect ( received2p1 . length ) . toEqual ( 1 ) ;
217+ expect ( received2p1 [ 0 ] [ 1 ] ) . toEqual ( 'from1p1To*' ) ;
218+ expect ( received1p2 . length ) . toEqual ( 0 ) ;
219+ expect ( received1p2 . length ) . toEqual ( 0 ) ;
220+
221+ ws1p2 . send ( '* from1p2To*' ) ;
222+ await pause ( transportPause ) ;
223+ ws2p2 . send ( '* from2p2To*' ) ;
224+ await pause ( transportPause ) ;
225+
226+ expect ( received1p1 . length ) . toEqual ( 1 ) ;
227+ expect ( received1p1 . length ) . toEqual ( 1 ) ;
228+ expect ( received1p2 . length ) . toEqual ( 1 ) ;
229+ expect ( received1p2 [ 0 ] [ 1 ] ) . toEqual ( 'from2p2To*' ) ;
230+ expect ( received2p2 . length ) . toEqual ( 1 ) ;
231+ expect ( received2p2 [ 0 ] [ 1 ] ) . toEqual ( 'from1p2To*' ) ;
232+
233+ ws1p1 . close ( ) ;
234+ ws2p1 . close ( ) ;
235+ ws1p2 . close ( ) ;
236+ ws2p2 . close ( ) ;
237+
238+ await synclet1 . destroy ( ) ;
239+ await synclet2 . destroy ( ) ;
240+ wss1 . close ( ) ;
241+ wss2 . close ( ) ;
242+ } ) ;
120243} ) ;
0 commit comments