11'use strict' ;
22
3+ const http = require ( 'node:http' ) ;
34const timers = require ( 'node:timers/promises' ) ;
45const { Blob } = require ( 'node:buffer' ) ;
56const { test } = require ( 'node:test' ) ;
67const assert = require ( 'node:assert' ) ;
7- const { WebSocketServer } = require ( 'ws' ) ;
88const metautil = require ( 'metautil' ) ;
9+ const { WebsocketServer } = require ( '#ws' ) ;
910const { randomUUID } = require ( 'node:crypto' ) ;
1011const { Metacom } = require ( '../lib/metacom.js' ) ;
1112const { chunkEncode, chunkDecode } = require ( '../lib/chunks.js' ) ;
@@ -16,6 +17,17 @@ process.emitWarning = (warning, type, ...args) => {
1617 emitWarning ( warning , type , ...args ) ;
1718} ;
1819
20+ const createWsServer = ( ) => {
21+ const httpServer = http . createServer ( ) ;
22+ const wsServer = new WebsocketServer ( { server : httpServer } ) ;
23+ return { httpServer, wsServer } ;
24+ } ;
25+
26+ const listen = ( httpServer , port ) =>
27+ new Promise ( ( resolve , reject ) => {
28+ httpServer . listen ( port , ( error ) => ( error ? reject ( error ) : resolve ( ) ) ) ;
29+ } ) ;
30+
1931test ( 'Client / calls' , async ( t ) => {
2032 const api = {
2133 system : {
@@ -43,11 +55,12 @@ test('Client / calls', async (t) => {
4355 } ;
4456
4557 let serverWs = null ;
46- const mockServer = new WebSocketServer ( { port : 8000 } ) ;
58+ const { httpServer, wsServer : mockServer } = createWsServer ( ) ;
59+ await listen ( httpServer , 8000 ) ;
4760 mockServer . on ( 'connection' , ( ws ) => {
4861 serverWs = ws ;
4962 ws . on ( 'message' , async ( raw ) => {
50- const packet = metautil . jsonParse ( raw ) || { } ;
63+ const packet = metautil . jsonParse ( raw . toString ( ) ) || { } ;
5164 const { type, id, method } = packet ;
5265 const [ unit , name ] = method . split ( '/' ) ;
5366 if ( type !== 'call' ) return ;
@@ -63,7 +76,7 @@ test('Client / calls', async (t) => {
6376
6477 let client ;
6578
66- t . after ( ( ) => void mockServer . close ( ) ) ;
79+ t . after ( ( ) => void httpServer . close ( ) ) ;
6780
6881 t . beforeEach ( async ( ) => {
6982 const options = { callTimeout : 300 } ;
@@ -123,10 +136,11 @@ test('Client / stale callback', async (t) => {
123136 } ,
124137 } ;
125138
126- const mockServer = new WebSocketServer ( { port : 8010 } ) ;
139+ const { httpServer, wsServer : mockServer } = createWsServer ( ) ;
140+ await listen ( httpServer , 8010 ) ;
127141 mockServer . on ( 'connection' , ( ws ) => {
128142 ws . on ( 'message' , async ( raw ) => {
129- const packet = metautil . jsonParse ( raw ) || { } ;
143+ const packet = metautil . jsonParse ( raw . toString ( ) ) || { } ;
130144 const { type, id, method } = packet ;
131145 const [ unit , name ] = method ?. split ( '/' ) || [ ] ;
132146 if ( type !== 'call' ) return ;
@@ -152,7 +166,7 @@ test('Client / stale callback', async (t) => {
152166 } ) ;
153167 } ) ;
154168
155- t . after ( ( ) => void mockServer . close ( ) ) ;
169+ t . after ( ( ) => void httpServer . close ( ) ) ;
156170
157171 await t . test ( 'throws on stale callback for unknown id' , async ( ) => {
158172 const client = await Metacom . connect ( 'ws://localhost:8010/' ) ;
@@ -190,15 +204,16 @@ test('Client / events', async (t) => {
190204 } ,
191205 } ;
192206
193- const mockServer = new WebSocketServer ( { port : 8001 } ) ;
207+ const { httpServer, wsServer : mockServer } = createWsServer ( ) ;
208+ await listen ( httpServer , 8001 ) ;
194209 mockServer . on ( 'connection' , ( ws ) => {
195210 const pingInterval = setInterval ( ( ) => {
196211 const packet = { type : 'event' , name : 'test/ping' , data : { ping : true } } ;
197212 ws . send ( JSON . stringify ( packet ) ) ;
198213 } , 100 ) ;
199214 ws . on ( 'close' , ( ) => void clearInterval ( pingInterval ) ) ;
200215 ws . on ( 'message' , async ( raw ) => {
201- const packet = metautil . jsonParse ( raw ) || { } ;
216+ const packet = metautil . jsonParse ( raw . toString ( ) ) || { } ;
202217 if ( packet . type === 'call' && packet . method === 'system/introspect' ) {
203218 const introspection = { type : 'callback' , id : packet . id , result : api } ;
204219 ws . send ( JSON . stringify ( introspection ) ) ;
@@ -214,7 +229,7 @@ test('Client / events', async (t) => {
214229
215230 let client ;
216231
217- t . after ( ( ) => void mockServer . close ( ) ) ;
232+ t . after ( ( ) => void httpServer . close ( ) ) ;
218233
219234 t . beforeEach ( async ( ) => {
220235 client = await Metacom . connect ( 'ws://localhost:8001/' ) ;
@@ -249,7 +264,7 @@ test('Client / stream', async (t) => {
249264 const reader = blob . stream ( ) . getReader ( ) ;
250265 let chunk ;
251266 while ( ! ( chunk = await reader . read ( ) ) . done ) {
252- ws . send ( chunkEncode ( id , chunk . value ) ) ;
267+ ws . sendBinary ( Buffer . from ( chunkEncode ( id , chunk . value ) ) ) ;
253268 }
254269 ws . send ( JSON . stringify ( endPacket ) ) ;
255270 } ;
@@ -291,7 +306,8 @@ test('Client / stream', async (t) => {
291306 } ,
292307 } ;
293308
294- const mockServer = new WebSocketServer ( { port : 8002 } ) ;
309+ const { httpServer, wsServer : mockServer } = createWsServer ( ) ;
310+ await listen ( httpServer , 8002 ) ;
295311 mockServer . on ( 'connection' , ( ws ) => {
296312 const pingInterval = setInterval ( ( ) => {
297313 const packet = { type : 'event' , name : 'test/ping' , data : { ping : true } } ;
@@ -300,7 +316,7 @@ test('Client / stream', async (t) => {
300316 ws . on ( 'close' , ( ) => void clearInterval ( pingInterval ) ) ;
301317 ws . on ( 'message' , async ( raw , isBinary ) => {
302318 if ( isBinary ) return void handleBinary ( new Uint8Array ( raw ) ) ;
303- const packet = metautil . jsonParse ( raw ) || { } ;
319+ const packet = metautil . jsonParse ( raw . toString ( ) ) || { } ;
304320 if ( packet . type === 'call' && packet . method === 'system/introspect' ) {
305321 const introspection = { type : 'callback' , id : packet . id , result : api } ;
306322 return void ws . send ( JSON . stringify ( introspection ) ) ;
@@ -316,7 +332,7 @@ test('Client / stream', async (t) => {
316332
317333 let client ;
318334
319- t . after ( ( ) => void mockServer . close ( ) ) ;
335+ t . after ( ( ) => void httpServer . close ( ) ) ;
320336
321337 t . beforeEach ( async ( ) => {
322338 client = await Metacom . connect ( 'ws://localhost:8002/' ) ;
@@ -364,10 +380,11 @@ test('Client / different ID generation strategies', async (t) => {
364380 } ,
365381 } ;
366382
367- const mockServer = new WebSocketServer ( { port : 8004 } ) ;
383+ const { httpServer, wsServer : mockServer } = createWsServer ( ) ;
384+ await listen ( httpServer , 8004 ) ;
368385 mockServer . on ( 'connection' , ( ws ) => {
369386 ws . on ( 'message' , async ( raw ) => {
370- const packet = metautil . jsonParse ( raw ) || { } ;
387+ const packet = metautil . jsonParse ( raw . toString ( ) ) || { } ;
371388 const { type, id, method } = packet ;
372389 const [ unit , name ] = method . split ( '/' ) ;
373390 if ( type !== 'call' ) return ;
@@ -381,7 +398,7 @@ test('Client / different ID generation strategies', async (t) => {
381398 } ) ;
382399 } ) ;
383400
384- t . after ( ( ) => void mockServer . close ( ) ) ;
401+ t . after ( ( ) => void httpServer . close ( ) ) ;
385402
386403 await t . test ( 'works with UUID generation' , async ( ) => {
387404 const client = await Metacom . connect ( 'ws://localhost:8004/' ) ;
0 commit comments