File tree Expand file tree Collapse file tree 4 files changed +48
-5
lines changed Expand file tree Collapse file tree 4 files changed +48
-5
lines changed Original file line number Diff line number Diff line change @@ -45,7 +45,8 @@ class WebsocketFrameSend {
45
45
if ( payloadLength === 126 ) {
46
46
new DataView ( buffer . buffer ) . setUint16 ( 2 , bodyLength )
47
47
} else if ( payloadLength === 127 ) {
48
- // TODO: optimize this once tests are added for payloads >= 2^16 bytes
48
+ // Clear extended payload length
49
+ buffer [ 2 ] = buffer [ 3 ] = 0
49
50
buffer . writeUIntBE ( bodyLength , 4 , 6 )
50
51
}
51
52
Original file line number Diff line number Diff line change @@ -196,10 +196,10 @@ class ByteParser extends Writable {
196
196
}
197
197
198
198
const buffer = this . consume ( 8 )
199
+ const upper = buffer . readUInt32BE ( 0 )
200
+ const lower = buffer . readUInt32BE ( 4 )
199
201
200
- // TODO: optimize this
201
- // TODO: this likely doesn't work because it returns a bigint
202
- this . #info. payloadLength = buffer . readBigUint64BE ( 0 )
202
+ this . #info. payloadLength = ( upper << 8 ) + lower
203
203
this . #state = parserStates . READ_DATA
204
204
} else if ( this . #state === parserStates . READ_DATA ) {
205
205
if ( this . #byteOffset < this . #info. payloadLength ) {
Original file line number Diff line number Diff line change @@ -314,7 +314,14 @@ class WebSocket extends EventTarget {
314
314
// by the length of data’s buffer in bytes.
315
315
316
316
const ab = new ArrayBuffer ( data . byteLength )
317
- new data . constructor ( ab ) . set ( data )
317
+
318
+ if ( Buffer . isBuffer ( data ) ) {
319
+ // new Buffer signature is deprecated
320
+ Buffer . from ( ab ) . set ( data )
321
+ } else {
322
+ new data . constructor ( ab ) . set ( data )
323
+ }
324
+
318
325
const value = Buffer . from ( ab )
319
326
320
327
const frame = new WebsocketFrameSend ( value )
Original file line number Diff line number Diff line change
1
+ 'use strict'
2
+
3
+ const { test } = require ( 'tap' )
4
+ const { WebSocketServer } = require ( 'ws' )
5
+ const { Blob } = require ( 'buffer' )
6
+ const { WebSocket } = require ( '../..' )
7
+
8
+ test ( 'Sending > 2^16 bytes' , ( t ) => {
9
+ t . plan ( 3 )
10
+
11
+ const server = new WebSocketServer ( { port : 0 } )
12
+
13
+ server . on ( 'connection' , ( ws ) => {
14
+ ws . on ( 'message' , ( m , isBinary ) => {
15
+ ws . send ( m , { binary : isBinary } )
16
+ } )
17
+ } )
18
+
19
+ const payload = Buffer . allocUnsafe ( 2 ** 16 ) . fill ( 'Hello' )
20
+
21
+ const ws = new WebSocket ( `ws://localhost:${ server . address ( ) . port } ` )
22
+
23
+ ws . addEventListener ( 'open' , ( ) => {
24
+ ws . send ( payload )
25
+ } )
26
+
27
+ ws . addEventListener ( 'message' , async ( { data } ) => {
28
+ t . type ( data , Blob )
29
+ t . equal ( data . size , payload . length )
30
+ t . same ( Buffer . from ( await data . arrayBuffer ( ) ) , payload )
31
+
32
+ ws . close ( )
33
+ server . close ( )
34
+ } )
35
+ } )
You can’t perform that action at this time.
0 commit comments