3
3
const assert = require ( 'assert' ) ;
4
4
5
5
const PerMessageDeflate = require ( '../lib/permessage-deflate' ) ;
6
+ const extension = require ( '../lib/extension' ) ;
6
7
const Sender = require ( '../lib/sender' ) ;
7
8
8
9
class MockSocket {
@@ -49,7 +50,7 @@ describe('Sender', () => {
49
50
50
51
describe ( '#send' , ( ) => {
51
52
it ( 'compresses data if compress option is enabled' , ( done ) => {
52
- const perMessageDeflate = new PerMessageDeflate ( { threshold : 0 } ) ;
53
+ const perMessageDeflate = new PerMessageDeflate ( ) ;
53
54
let count = 0 ;
54
55
const mockSocket = new MockSocket ( {
55
56
write : ( data ) => {
@@ -71,139 +72,156 @@ describe('Sender', () => {
71
72
sender . send ( 'hi' , options ) ;
72
73
} ) ;
73
74
74
- it ( 'does not compress data for small payloads' , ( done ) => {
75
- const perMessageDeflate = new PerMessageDeflate ( ) ;
76
- const mockSocket = new MockSocket ( {
77
- write : ( data ) => {
78
- assert . notStrictEqual ( data [ 0 ] & 0x40 , 0x40 ) ;
79
- done ( ) ;
80
- }
81
- } ) ;
82
- const sender = new Sender ( mockSocket , {
83
- 'permessage-deflate' : perMessageDeflate
84
- } ) ;
85
-
86
- perMessageDeflate . accept ( [ { } ] ) ;
75
+ describe ( 'when context takeover is disabled' , ( ) => {
76
+ it ( 'honors the compression threshold' , ( done ) => {
77
+ const perMessageDeflate = new PerMessageDeflate ( ) ;
78
+ const mockSocket = new MockSocket ( {
79
+ write : ( data ) => {
80
+ assert . notStrictEqual ( data [ 0 ] & 0x40 , 0x40 ) ;
81
+ done ( ) ;
82
+ }
83
+ } ) ;
84
+ const sender = new Sender ( mockSocket , {
85
+ 'permessage-deflate' : perMessageDeflate
86
+ } ) ;
87
+ const extensions = extension . parse (
88
+ 'permessage-deflate; client_no_context_takeover'
89
+ ) ;
87
90
88
- sender . send ( 'hi' , { compress : true , fin : true } ) ;
89
- } ) ;
91
+ perMessageDeflate . accept ( extensions [ 'permessage-deflate' ] ) ;
90
92
91
- it ( 'compresses all frames in a fragmented message' , ( done ) => {
92
- const chunks = [ ] ;
93
- const perMessageDeflate = new PerMessageDeflate ( { threshold : 3 } ) ;
94
- const mockSocket = new MockSocket ( {
95
- write : ( chunk ) => {
96
- chunks . push ( chunk ) ;
97
- if ( chunks . length !== 4 ) return ;
98
-
99
- assert . strictEqual ( chunks [ 0 ] . length , 2 ) ;
100
- assert . strictEqual ( chunks [ 0 ] [ 0 ] & 0x40 , 0x40 ) ;
101
- assert . strictEqual ( chunks [ 1 ] . length , 9 ) ;
102
-
103
- assert . strictEqual ( chunks [ 2 ] . length , 2 ) ;
104
- assert . strictEqual ( chunks [ 2 ] [ 0 ] & 0x40 , 0x00 ) ;
105
- assert . strictEqual ( chunks [ 3 ] . length , 4 ) ;
106
- done ( ) ;
107
- }
108
- } ) ;
109
- const sender = new Sender ( mockSocket , {
110
- 'permessage-deflate' : perMessageDeflate
93
+ sender . send ( 'hi' , { compress : true , fin : true } ) ;
111
94
} ) ;
112
95
113
- perMessageDeflate . accept ( [ { } ] ) ;
114
-
115
- sender . send ( '123' , { compress : true , fin : false } ) ;
116
- sender . send ( '12' , { compress : true , fin : true } ) ;
117
- } ) ;
118
-
119
- it ( 'compresses no frames in a fragmented message' , ( done ) => {
120
- const chunks = [ ] ;
121
- const perMessageDeflate = new PerMessageDeflate ( { threshold : 3 } ) ;
122
- const mockSocket = new MockSocket ( {
123
- write : ( chunk ) => {
124
- chunks . push ( chunk ) ;
125
- if ( chunks . length !== 4 ) return ;
126
-
127
- assert . strictEqual ( chunks [ 0 ] . length , 2 ) ;
128
- assert . strictEqual ( chunks [ 0 ] [ 0 ] & 0x40 , 0x00 ) ;
129
- assert . strictEqual ( chunks [ 1 ] . length , 2 ) ;
130
-
131
- assert . strictEqual ( chunks [ 2 ] . length , 2 ) ;
132
- assert . strictEqual ( chunks [ 2 ] [ 0 ] & 0x40 , 0x00 ) ;
133
- assert . strictEqual ( chunks [ 3 ] . length , 3 ) ;
134
- done ( ) ;
135
- }
136
- } ) ;
137
- const sender = new Sender ( mockSocket , {
138
- 'permessage-deflate' : perMessageDeflate
96
+ it ( 'compresses all fragments of a fragmented message' , ( done ) => {
97
+ const chunks = [ ] ;
98
+ const perMessageDeflate = new PerMessageDeflate ( { threshold : 3 } ) ;
99
+ const mockSocket = new MockSocket ( {
100
+ write : ( chunk ) => {
101
+ chunks . push ( chunk ) ;
102
+ if ( chunks . length !== 4 ) return ;
103
+
104
+ assert . strictEqual ( chunks [ 0 ] . length , 2 ) ;
105
+ assert . strictEqual ( chunks [ 0 ] [ 0 ] & 0x40 , 0x40 ) ;
106
+ assert . strictEqual ( chunks [ 1 ] . length , 9 ) ;
107
+
108
+ assert . strictEqual ( chunks [ 2 ] . length , 2 ) ;
109
+ assert . strictEqual ( chunks [ 2 ] [ 0 ] & 0x40 , 0x00 ) ;
110
+ assert . strictEqual ( chunks [ 3 ] . length , 4 ) ;
111
+ done ( ) ;
112
+ }
113
+ } ) ;
114
+ const sender = new Sender ( mockSocket , {
115
+ 'permessage-deflate' : perMessageDeflate
116
+ } ) ;
117
+ const extensions = extension . parse (
118
+ 'permessage-deflate; client_no_context_takeover'
119
+ ) ;
120
+
121
+ perMessageDeflate . accept ( extensions [ 'permessage-deflate' ] ) ;
122
+
123
+ sender . send ( '123' , { compress : true , fin : false } ) ;
124
+ sender . send ( '12' , { compress : true , fin : true } ) ;
139
125
} ) ;
140
126
141
- perMessageDeflate . accept ( [ { } ] ) ;
142
-
143
- sender . send ( '12' , { compress : true , fin : false } ) ;
144
- sender . send ( '123' , { compress : true , fin : true } ) ;
145
- } ) ;
146
-
147
- it ( 'compresses empty buffer as first fragment' , ( done ) => {
148
- const chunks = [ ] ;
149
- const perMessageDeflate = new PerMessageDeflate ( { threshold : 0 } ) ;
150
- const mockSocket = new MockSocket ( {
151
- write : ( chunk ) => {
152
- chunks . push ( chunk ) ;
153
- if ( chunks . length !== 4 ) return ;
154
-
155
- assert . strictEqual ( chunks [ 0 ] . length , 2 ) ;
156
- assert . strictEqual ( chunks [ 0 ] [ 0 ] & 0x40 , 0x40 ) ;
157
- assert . strictEqual ( chunks [ 1 ] . length , 5 ) ;
158
-
159
- assert . strictEqual ( chunks [ 2 ] . length , 2 ) ;
160
- assert . strictEqual ( chunks [ 2 ] [ 0 ] & 0x40 , 0x00 ) ;
161
- assert . strictEqual ( chunks [ 3 ] . length , 6 ) ;
162
- done ( ) ;
163
- }
164
- } ) ;
165
- const sender = new Sender ( mockSocket , {
166
- 'permessage-deflate' : perMessageDeflate
127
+ it ( 'does not compress any fragments of a fragmented message' , ( done ) => {
128
+ const chunks = [ ] ;
129
+ const perMessageDeflate = new PerMessageDeflate ( { threshold : 3 } ) ;
130
+ const mockSocket = new MockSocket ( {
131
+ write : ( chunk ) => {
132
+ chunks . push ( chunk ) ;
133
+ if ( chunks . length !== 4 ) return ;
134
+
135
+ assert . strictEqual ( chunks [ 0 ] . length , 2 ) ;
136
+ assert . strictEqual ( chunks [ 0 ] [ 0 ] & 0x40 , 0x00 ) ;
137
+ assert . strictEqual ( chunks [ 1 ] . length , 2 ) ;
138
+
139
+ assert . strictEqual ( chunks [ 2 ] . length , 2 ) ;
140
+ assert . strictEqual ( chunks [ 2 ] [ 0 ] & 0x40 , 0x00 ) ;
141
+ assert . strictEqual ( chunks [ 3 ] . length , 3 ) ;
142
+ done ( ) ;
143
+ }
144
+ } ) ;
145
+ const sender = new Sender ( mockSocket , {
146
+ 'permessage-deflate' : perMessageDeflate
147
+ } ) ;
148
+ const extensions = extension . parse (
149
+ 'permessage-deflate; client_no_context_takeover'
150
+ ) ;
151
+
152
+ perMessageDeflate . accept ( extensions [ 'permessage-deflate' ] ) ;
153
+
154
+ sender . send ( '12' , { compress : true , fin : false } ) ;
155
+ sender . send ( '123' , { compress : true , fin : true } ) ;
167
156
} ) ;
168
157
169
- perMessageDeflate . accept ( [ { } ] ) ;
170
-
171
- sender . send ( Buffer . alloc ( 0 ) , { compress : true , fin : false } ) ;
172
- sender . send ( 'data' , { compress : true , fin : true } ) ;
173
- } ) ;
174
-
175
- it ( 'compresses empty buffer as last fragment' , ( done ) => {
176
- const chunks = [ ] ;
177
- const perMessageDeflate = new PerMessageDeflate ( { threshold : 0 } ) ;
178
- const mockSocket = new MockSocket ( {
179
- write : ( chunk ) => {
180
- chunks . push ( chunk ) ;
181
- if ( chunks . length !== 4 ) return ;
182
-
183
- assert . strictEqual ( chunks [ 0 ] . length , 2 ) ;
184
- assert . strictEqual ( chunks [ 0 ] [ 0 ] & 0x40 , 0x40 ) ;
185
- assert . strictEqual ( chunks [ 1 ] . length , 10 ) ;
186
-
187
- assert . strictEqual ( chunks [ 2 ] . length , 2 ) ;
188
- assert . strictEqual ( chunks [ 2 ] [ 0 ] & 0x40 , 0x00 ) ;
189
- assert . strictEqual ( chunks [ 3 ] . length , 1 ) ;
190
- done ( ) ;
191
- }
192
- } ) ;
193
- const sender = new Sender ( mockSocket , {
194
- 'permessage-deflate' : perMessageDeflate
158
+ it ( 'compresses empty buffer as first fragment' , ( done ) => {
159
+ const chunks = [ ] ;
160
+ const perMessageDeflate = new PerMessageDeflate ( { threshold : 0 } ) ;
161
+ const mockSocket = new MockSocket ( {
162
+ write : ( chunk ) => {
163
+ chunks . push ( chunk ) ;
164
+ if ( chunks . length !== 4 ) return ;
165
+
166
+ assert . strictEqual ( chunks [ 0 ] . length , 2 ) ;
167
+ assert . strictEqual ( chunks [ 0 ] [ 0 ] & 0x40 , 0x40 ) ;
168
+ assert . strictEqual ( chunks [ 1 ] . length , 5 ) ;
169
+
170
+ assert . strictEqual ( chunks [ 2 ] . length , 2 ) ;
171
+ assert . strictEqual ( chunks [ 2 ] [ 0 ] & 0x40 , 0x00 ) ;
172
+ assert . strictEqual ( chunks [ 3 ] . length , 6 ) ;
173
+ done ( ) ;
174
+ }
175
+ } ) ;
176
+ const sender = new Sender ( mockSocket , {
177
+ 'permessage-deflate' : perMessageDeflate
178
+ } ) ;
179
+ const extensions = extension . parse (
180
+ 'permessage-deflate; client_no_context_takeover'
181
+ ) ;
182
+
183
+ perMessageDeflate . accept ( extensions [ 'permessage-deflate' ] ) ;
184
+
185
+ sender . send ( Buffer . alloc ( 0 ) , { compress : true , fin : false } ) ;
186
+ sender . send ( 'data' , { compress : true , fin : true } ) ;
195
187
} ) ;
196
188
197
- perMessageDeflate . accept ( [ { } ] ) ;
198
-
199
- sender . send ( 'data' , { compress : true , fin : false } ) ;
200
- sender . send ( Buffer . alloc ( 0 ) , { compress : true , fin : true } ) ;
189
+ it ( 'compresses empty buffer as last fragment' , ( done ) => {
190
+ const chunks = [ ] ;
191
+ const perMessageDeflate = new PerMessageDeflate ( { threshold : 0 } ) ;
192
+ const mockSocket = new MockSocket ( {
193
+ write : ( chunk ) => {
194
+ chunks . push ( chunk ) ;
195
+ if ( chunks . length !== 4 ) return ;
196
+
197
+ assert . strictEqual ( chunks [ 0 ] . length , 2 ) ;
198
+ assert . strictEqual ( chunks [ 0 ] [ 0 ] & 0x40 , 0x40 ) ;
199
+ assert . strictEqual ( chunks [ 1 ] . length , 10 ) ;
200
+
201
+ assert . strictEqual ( chunks [ 2 ] . length , 2 ) ;
202
+ assert . strictEqual ( chunks [ 2 ] [ 0 ] & 0x40 , 0x00 ) ;
203
+ assert . strictEqual ( chunks [ 3 ] . length , 1 ) ;
204
+ done ( ) ;
205
+ }
206
+ } ) ;
207
+ const sender = new Sender ( mockSocket , {
208
+ 'permessage-deflate' : perMessageDeflate
209
+ } ) ;
210
+ const extensions = extension . parse (
211
+ 'permessage-deflate; client_no_context_takeover'
212
+ ) ;
213
+
214
+ perMessageDeflate . accept ( extensions [ 'permessage-deflate' ] ) ;
215
+
216
+ sender . send ( 'data' , { compress : true , fin : false } ) ;
217
+ sender . send ( Buffer . alloc ( 0 ) , { compress : true , fin : true } ) ;
218
+ } ) ;
201
219
} ) ;
202
220
} ) ;
203
221
204
222
describe ( '#ping' , ( ) => {
205
223
it ( 'works with multiple types of data' , ( done ) => {
206
- const perMessageDeflate = new PerMessageDeflate ( { threshold : 0 } ) ;
224
+ const perMessageDeflate = new PerMessageDeflate ( ) ;
207
225
let count = 0 ;
208
226
const mockSocket = new MockSocket ( {
209
227
write : ( data ) => {
@@ -235,7 +253,7 @@ describe('Sender', () => {
235
253
236
254
describe ( '#pong' , ( ) => {
237
255
it ( 'works with multiple types of data' , ( done ) => {
238
- const perMessageDeflate = new PerMessageDeflate ( { threshold : 0 } ) ;
256
+ const perMessageDeflate = new PerMessageDeflate ( ) ;
239
257
let count = 0 ;
240
258
const mockSocket = new MockSocket ( {
241
259
write : ( data ) => {
@@ -292,7 +310,7 @@ describe('Sender', () => {
292
310
} ) ;
293
311
294
312
it ( 'should consume all data before closing' , ( done ) => {
295
- const perMessageDeflate = new PerMessageDeflate ( { threshold : 0 } ) ;
313
+ const perMessageDeflate = new PerMessageDeflate ( ) ;
296
314
297
315
let count = 0 ;
298
316
const mockSocket = new MockSocket ( {
0 commit comments