@@ -4,6 +4,7 @@ import {WsFrameEncoder} from '../../codec/WsFrameEncoder';
44import { until } from 'thingies' ;
55import { WsFrameOpcode } from '../../codec' ;
66import { bufferToUint8Array } from '../../../../../util/buffers/bufferToUint8Array' ;
7+ import { listToUint8 } from '../../../../../util/buffers/concat' ;
78
89const setup = ( ) => {
910 const socket = new stream . PassThrough ( ) ;
@@ -80,15 +81,40 @@ describe('.onmessage', () => {
8081 messages . push ( [ data , isUtf8 ] ) ;
8182 } ;
8283 const pingFrame = encoder . encodePong ( Buffer . from ( [ 0x01 , 0x02 , 0x03 ] ) ) ;
83- const closeFrame = encoder . encodeHdr ( 1 , WsFrameOpcode . BINARY , 3 , 0 ) ;
84+ const frame = encoder . encodeHdr ( 1 , WsFrameOpcode . BINARY , 3 , 0 ) ;
8485 encoder . writer . buf ( Buffer . from ( [ 0x01 , 0x02 , 0x03 ] ) , 3 ) ;
8586 const payload = encoder . writer . flush ( ) ;
8687 socket . write ( pingFrame ) ;
87- socket . write ( closeFrame ) ;
88+ socket . write ( frame ) ;
8889 socket . write ( payload ) ;
8990 await until ( ( ) => messages . length === 1 ) ;
9091 expect ( messages [ 0 ] ) . toEqual ( [ new Uint8Array ( [ 0x01 , 0x02 , 0x03 ] ) , false ] ) ;
9192 } ) ;
93+
94+ test ( 'two binary data frames' , async ( ) => {
95+ const { socket, encoder, connection} = setup ( ) ;
96+ const messages : [ data : Uint8Array , isUtf8 : boolean ] [ ] = [ ] ;
97+ connection . onmessage = ( data : Uint8Array , isUtf8 : boolean ) : void => {
98+ messages . push ( [ data , isUtf8 ] ) ;
99+ } ;
100+ const pingFrame = encoder . encodePong ( Buffer . from ( [ 0x01 , 0x02 , 0x03 ] ) ) ;
101+ const frame1 = encoder . encodeHdr ( 1 , WsFrameOpcode . BINARY , 3 , 0 ) ;
102+ encoder . writer . buf ( Buffer . from ( [ 0x01 , 0x02 , 0x03 ] ) , 3 ) ;
103+ const payload1 = encoder . writer . flush ( ) ;
104+ const frame2 = encoder . encodeHdr ( 1 , WsFrameOpcode . BINARY , 3 , 0 ) ;
105+ encoder . writer . buf ( Buffer . from ( [ 0x04 , 0x05 , 0x06 ] ) , 3 ) ;
106+ const payload2 = encoder . writer . flush ( ) ;
107+ socket . write ( pingFrame ) ;
108+ socket . write ( listToUint8 ( [
109+ frame1 ,
110+ payload1 ,
111+ frame2 ,
112+ payload2 ,
113+ ] ) ) ;
114+ await until ( ( ) => messages . length === 2 ) ;
115+ expect ( messages [ 0 ] ) . toEqual ( [ new Uint8Array ( [ 0x01 , 0x02 , 0x03 ] ) , false ] ) ;
116+ expect ( messages [ 1 ] ) . toEqual ( [ new Uint8Array ( [ 0x04 , 0x05 , 0x06 ] ) , false ] ) ;
117+ } ) ;
92118
93119 test ( 'text frame' , async ( ) => {
94120 const { socket, encoder, connection} = setup ( ) ;
@@ -148,3 +174,36 @@ describe('.onmessage', () => {
148174 } ) ;
149175 } ) ;
150176} ) ;
177+
178+ describe ( '.fragment' , ( ) => {
179+ test ( 'parses out message fragments' , async ( ) => {
180+ const { socket, encoder, connection} = setup ( ) ;
181+ const fragments : [ isLast : boolean , data : Uint8Array , isUtf8 : boolean ] [ ] = [ ] ;
182+ connection . onfragment = ( isLast : boolean , data : Uint8Array , isUtf8 : boolean ) : void => {
183+ fragments . push ( [ isLast , data , isUtf8 ] ) ;
184+ } ;
185+ const pingFrame = encoder . encodePong ( Buffer . from ( [ 0x01 , 0x02 , 0x03 ] ) ) ;
186+ const buf1 = encoder . encodeHdr ( 0 , WsFrameOpcode . BINARY , 3 , 0 ) ;
187+ encoder . writer . buf ( Buffer . from ( [ 0x01 , 0x02 , 0x03 ] ) , 3 ) ;
188+ const buf2 = encoder . writer . flush ( ) ;
189+ const buf3 = encoder . encodeHdr ( 0 , WsFrameOpcode . CONTINUE , 3 , 0 ) ;
190+ encoder . writer . buf ( Buffer . from ( [ 0x04 , 0x05 , 0x06 ] ) , 3 ) ;
191+ const buf4 = encoder . writer . flush ( ) ;
192+ const buf5 = encoder . encodeHdr ( 1 , WsFrameOpcode . CONTINUE , 3 , 0 ) ;
193+ encoder . writer . buf ( Buffer . from ( [ 0x07 , 0x08 , 0x09 ] ) , 3 ) ;
194+ const buf6 = encoder . writer . flush ( ) ;
195+ socket . write ( pingFrame ) ;
196+ socket . write ( buf1 ) ;
197+ socket . write ( buf2 ) ;
198+ socket . write ( buf3 ) ;
199+ socket . write ( buf4 ) ;
200+ socket . write ( buf5 ) ;
201+ socket . write ( buf6 ) ;
202+ await until ( ( ) => fragments . length === 3 ) ;
203+ expect ( fragments ) . toEqual ( [
204+ [ false , new Uint8Array ( [ 0x01 , 0x02 , 0x03 ] ) , false ] ,
205+ [ false , new Uint8Array ( [ 0x04 , 0x05 , 0x06 ] ) , false ] ,
206+ [ true , new Uint8Array ( [ 0x07 , 0x08 , 0x09 ] ) , false ] ,
207+ ] ) ;
208+ } ) ;
209+ } ) ;
0 commit comments