opal 1.6.1 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/build.yml +17 -0
  3. data/CHANGELOG.md +35 -1
  4. data/Gemfile +1 -0
  5. data/HACKING.md +47 -26
  6. data/benchmark/benchmarks +415 -103
  7. data/benchmark/bm_call_overhead.yml +28 -0
  8. data/benchmark/run.rb +61 -40
  9. data/docs/cdp_common.json +3364 -0
  10. data/docs/cdp_common.md +18 -0
  11. data/docs/{headless_chrome.md → headless_browsers.md} +31 -12
  12. data/lib/opal/ast/builder.rb +1 -1
  13. data/lib/opal/builder.rb +6 -1
  14. data/lib/opal/builder_processors.rb +5 -3
  15. data/lib/opal/cache.rb +1 -7
  16. data/lib/opal/cli_options.rb +72 -58
  17. data/lib/opal/cli_runners/chrome.rb +47 -9
  18. data/lib/opal/cli_runners/chrome_cdp_interface.rb +238 -112
  19. data/lib/opal/cli_runners/compiler.rb +146 -13
  20. data/lib/opal/cli_runners/deno.rb +32 -0
  21. data/lib/opal/cli_runners/firefox.rb +350 -0
  22. data/lib/opal/cli_runners/firefox_cdp_interface.rb +212 -0
  23. data/lib/opal/cli_runners/node_modules/.bin/chrome-remote-interface.cmd +17 -0
  24. data/lib/opal/cli_runners/node_modules/.bin/chrome-remote-interface.ps1 +28 -0
  25. data/lib/opal/cli_runners/node_modules/.package-lock.json +41 -0
  26. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/LICENSE +1 -1
  27. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/README.md +322 -182
  28. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/bin/client.js +99 -114
  29. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/chrome-remote-interface.js +1 -11
  30. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/index.js +16 -11
  31. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/api.js +41 -33
  32. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/chrome.js +224 -214
  33. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/devtools.js +71 -191
  34. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/external-request.js +26 -6
  35. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/protocol.json +20788 -9049
  36. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/lib/websocket-wrapper.js +10 -3
  37. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/package.json +59 -123
  38. data/lib/opal/cli_runners/node_modules/chrome-remote-interface/webpack.config.js +25 -32
  39. data/lib/opal/cli_runners/node_modules/commander/History.md +298 -0
  40. data/lib/opal/cli_runners/node_modules/commander/LICENSE +22 -0
  41. data/lib/opal/cli_runners/node_modules/commander/Readme.md +217 -61
  42. data/lib/opal/cli_runners/node_modules/commander/index.js +431 -145
  43. data/lib/opal/cli_runners/node_modules/commander/package.json +16 -79
  44. data/lib/opal/cli_runners/node_modules/ws/README.md +334 -98
  45. data/lib/opal/cli_runners/node_modules/ws/browser.js +8 -0
  46. data/lib/opal/cli_runners/node_modules/ws/index.js +5 -10
  47. data/lib/opal/cli_runners/node_modules/ws/lib/buffer-util.js +129 -0
  48. data/lib/opal/cli_runners/node_modules/ws/lib/constants.js +10 -0
  49. data/lib/opal/cli_runners/node_modules/ws/lib/event-target.js +184 -0
  50. data/lib/opal/cli_runners/node_modules/ws/lib/extension.js +223 -0
  51. data/lib/opal/cli_runners/node_modules/ws/lib/limiter.js +55 -0
  52. data/lib/opal/cli_runners/node_modules/ws/lib/permessage-deflate.js +518 -0
  53. data/lib/opal/cli_runners/node_modules/ws/lib/receiver.js +607 -0
  54. data/lib/opal/cli_runners/node_modules/ws/lib/sender.js +409 -0
  55. data/lib/opal/cli_runners/node_modules/ws/lib/stream.js +180 -0
  56. data/lib/opal/cli_runners/node_modules/ws/lib/validation.js +104 -0
  57. data/lib/opal/cli_runners/node_modules/ws/lib/websocket-server.js +447 -0
  58. data/lib/opal/cli_runners/node_modules/ws/lib/websocket.js +1195 -0
  59. data/lib/opal/cli_runners/node_modules/ws/package.json +40 -106
  60. data/lib/opal/cli_runners/package-lock.json +62 -0
  61. data/lib/opal/cli_runners/package.json +1 -1
  62. data/lib/opal/cli_runners.rb +26 -4
  63. data/lib/opal/nodes/args/prepare_post_args.rb +2 -2
  64. data/lib/opal/nodes/def.rb +8 -8
  65. data/lib/opal/nodes/iter.rb +12 -12
  66. data/lib/opal/nodes/logic.rb +1 -1
  67. data/lib/opal/nodes/masgn.rb +2 -2
  68. data/lib/opal/parser/with_ruby_lexer.rb +1 -1
  69. data/lib/opal/paths.rb +14 -0
  70. data/lib/opal/rewriter.rb +2 -0
  71. data/lib/opal/rewriters/forward_args.rb +52 -4
  72. data/lib/opal/rewriters/targeted_patches.rb +94 -0
  73. data/lib/opal/version.rb +1 -1
  74. data/opal/corelib/basic_object.rb +1 -1
  75. data/opal/corelib/boolean.rb +2 -2
  76. data/opal/corelib/class.rb +11 -0
  77. data/opal/corelib/constants.rb +3 -3
  78. data/opal/corelib/enumerable.rb +4 -0
  79. data/opal/corelib/enumerator.rb +1 -1
  80. data/opal/corelib/hash.rb +2 -2
  81. data/opal/corelib/helpers.rb +1 -1
  82. data/opal/corelib/kernel.rb +3 -3
  83. data/opal/corelib/method.rb +1 -1
  84. data/opal/corelib/module.rb +29 -8
  85. data/opal/corelib/proc.rb +7 -5
  86. data/opal/corelib/runtime.js +141 -78
  87. data/opal/corelib/set.rb +252 -0
  88. data/opal/corelib/string.rb +2 -1
  89. data/opal/corelib/time.rb +2 -2
  90. data/opal/opal.rb +1 -0
  91. data/opal.gemspec +1 -0
  92. data/spec/filters/bugs/array.rb +22 -13
  93. data/spec/filters/bugs/base64.rb +5 -5
  94. data/spec/filters/bugs/basicobject.rb +16 -8
  95. data/spec/filters/bugs/bigdecimal.rb +161 -160
  96. data/spec/filters/bugs/binding.rb +10 -10
  97. data/spec/filters/bugs/class.rb +8 -8
  98. data/spec/filters/bugs/complex.rb +2 -1
  99. data/spec/filters/bugs/date.rb +79 -81
  100. data/spec/filters/bugs/datetime.rb +29 -29
  101. data/spec/filters/bugs/delegate.rb +1 -3
  102. data/spec/filters/bugs/encoding.rb +69 -69
  103. data/spec/filters/bugs/enumerable.rb +22 -20
  104. data/spec/filters/bugs/enumerator.rb +88 -85
  105. data/spec/filters/bugs/exception.rb +46 -40
  106. data/spec/filters/bugs/file.rb +32 -32
  107. data/spec/filters/bugs/float.rb +26 -21
  108. data/spec/filters/bugs/freeze.rb +88 -0
  109. data/spec/filters/bugs/hash.rb +39 -38
  110. data/spec/filters/bugs/integer.rb +57 -44
  111. data/spec/filters/bugs/io.rb +1 -1
  112. data/spec/filters/bugs/kernel.rb +349 -269
  113. data/spec/filters/bugs/language.rb +220 -188
  114. data/spec/filters/bugs/main.rb +5 -3
  115. data/spec/filters/bugs/marshal.rb +38 -38
  116. data/spec/filters/bugs/math.rb +2 -1
  117. data/spec/filters/bugs/method.rb +73 -62
  118. data/spec/filters/bugs/module.rb +163 -143
  119. data/spec/filters/bugs/numeric.rb +6 -6
  120. data/spec/filters/bugs/objectspace.rb +16 -16
  121. data/spec/filters/bugs/openstruct.rb +1 -1
  122. data/spec/filters/bugs/pack_unpack.rb +51 -51
  123. data/spec/filters/bugs/pathname.rb +7 -7
  124. data/spec/filters/bugs/proc.rb +63 -63
  125. data/spec/filters/bugs/random.rb +7 -6
  126. data/spec/filters/bugs/range.rb +12 -9
  127. data/spec/filters/bugs/rational.rb +8 -7
  128. data/spec/filters/bugs/regexp.rb +49 -48
  129. data/spec/filters/bugs/ruby-32.rb +56 -0
  130. data/spec/filters/bugs/set.rb +30 -30
  131. data/spec/filters/bugs/singleton.rb +4 -4
  132. data/spec/filters/bugs/string.rb +187 -99
  133. data/spec/filters/bugs/stringio.rb +7 -0
  134. data/spec/filters/bugs/stringscanner.rb +68 -68
  135. data/spec/filters/bugs/struct.rb +11 -9
  136. data/spec/filters/bugs/symbol.rb +1 -1
  137. data/spec/filters/bugs/time.rb +78 -63
  138. data/spec/filters/bugs/trace_point.rb +4 -4
  139. data/spec/filters/bugs/unboundmethod.rb +32 -17
  140. data/spec/filters/bugs/warnings.rb +8 -12
  141. data/spec/filters/unsupported/array.rb +24 -107
  142. data/spec/filters/unsupported/basicobject.rb +12 -12
  143. data/spec/filters/unsupported/bignum.rb +27 -52
  144. data/spec/filters/unsupported/class.rb +1 -2
  145. data/spec/filters/unsupported/delegator.rb +3 -3
  146. data/spec/filters/unsupported/enumerable.rb +2 -9
  147. data/spec/filters/unsupported/enumerator.rb +2 -11
  148. data/spec/filters/unsupported/file.rb +1 -1
  149. data/spec/filters/unsupported/float.rb +28 -47
  150. data/spec/filters/unsupported/hash.rb +8 -14
  151. data/spec/filters/unsupported/integer.rb +75 -91
  152. data/spec/filters/unsupported/kernel.rb +17 -35
  153. data/spec/filters/unsupported/language.rb +11 -19
  154. data/spec/filters/unsupported/marshal.rb +22 -41
  155. data/spec/filters/unsupported/matchdata.rb +28 -52
  156. data/spec/filters/unsupported/math.rb +1 -1
  157. data/spec/filters/unsupported/privacy.rb +229 -285
  158. data/spec/filters/unsupported/range.rb +1 -5
  159. data/spec/filters/unsupported/regexp.rb +40 -66
  160. data/spec/filters/unsupported/set.rb +2 -2
  161. data/spec/filters/unsupported/singleton.rb +4 -4
  162. data/spec/filters/unsupported/string.rb +305 -508
  163. data/spec/filters/unsupported/struct.rb +3 -4
  164. data/spec/filters/unsupported/symbol.rb +15 -18
  165. data/spec/filters/unsupported/thread.rb +1 -7
  166. data/spec/filters/unsupported/time.rb +159 -202
  167. data/spec/filters/unsupported/usage_of_files.rb +170 -259
  168. data/spec/lib/builder_spec.rb +4 -4
  169. data/spec/lib/rewriters/forward_args_spec.rb +32 -12
  170. data/spec/mspec-opal/runner.rb +2 -0
  171. data/spec/ruby_specs +4 -0
  172. data/stdlib/deno/base.rb +28 -0
  173. data/stdlib/deno/file.rb +340 -0
  174. data/stdlib/{headless_chrome.rb → headless_browser/base.rb} +1 -1
  175. data/stdlib/headless_browser/file.rb +15 -0
  176. data/stdlib/headless_browser.rb +4 -0
  177. data/stdlib/native.rb +1 -1
  178. data/stdlib/nodejs/file.rb +5 -0
  179. data/stdlib/opal/platform.rb +8 -6
  180. data/stdlib/opal-platform.rb +14 -8
  181. data/stdlib/set.rb +1 -258
  182. data/tasks/benchmarking.rake +62 -19
  183. data/tasks/performance.rake +1 -1
  184. data/tasks/testing.rake +5 -3
  185. data/test/nodejs/test_file.rb +29 -10
  186. data/test/opal/http_server.rb +28 -11
  187. data/test/opal/unsupported_and_bugs.rb +2 -1
  188. metadata +89 -50
  189. data/lib/opal/cli_runners/node_modules/ultron/LICENSE +0 -22
  190. data/lib/opal/cli_runners/node_modules/ultron/index.js +0 -138
  191. data/lib/opal/cli_runners/node_modules/ultron/package.json +0 -112
  192. data/lib/opal/cli_runners/node_modules/ws/SECURITY.md +0 -33
  193. data/lib/opal/cli_runners/node_modules/ws/lib/BufferUtil.fallback.js +0 -56
  194. data/lib/opal/cli_runners/node_modules/ws/lib/BufferUtil.js +0 -15
  195. data/lib/opal/cli_runners/node_modules/ws/lib/ErrorCodes.js +0 -28
  196. data/lib/opal/cli_runners/node_modules/ws/lib/EventTarget.js +0 -158
  197. data/lib/opal/cli_runners/node_modules/ws/lib/Extensions.js +0 -69
  198. data/lib/opal/cli_runners/node_modules/ws/lib/PerMessageDeflate.js +0 -339
  199. data/lib/opal/cli_runners/node_modules/ws/lib/Receiver.js +0 -520
  200. data/lib/opal/cli_runners/node_modules/ws/lib/Sender.js +0 -438
  201. data/lib/opal/cli_runners/node_modules/ws/lib/Validation.fallback.js +0 -9
  202. data/lib/opal/cli_runners/node_modules/ws/lib/Validation.js +0 -17
  203. data/lib/opal/cli_runners/node_modules/ws/lib/WebSocket.js +0 -705
  204. data/lib/opal/cli_runners/node_modules/ws/lib/WebSocketServer.js +0 -336
  205. data/spec/filters/bugs/boolean.rb +0 -3
  206. data/spec/filters/bugs/matrix.rb +0 -3
  207. data/spec/filters/unsupported/fixnum.rb +0 -15
  208. data/spec/filters/unsupported/freeze.rb +0 -102
  209. data/spec/filters/unsupported/pathname.rb +0 -4
  210. data/spec/filters/unsupported/proc.rb +0 -4
  211. data/spec/filters/unsupported/random.rb +0 -5
  212. data/spec/filters/unsupported/taint.rb +0 -162
@@ -1,438 +0,0 @@
1
- /*!
2
- * ws: a node.js websocket client
3
- * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
4
- * MIT Licensed
5
- */
6
-
7
- 'use strict';
8
-
9
- const crypto = require('crypto');
10
-
11
- const PerMessageDeflate = require('./PerMessageDeflate');
12
- const bufferUtil = require('./BufferUtil');
13
- const ErrorCodes = require('./ErrorCodes');
14
-
15
- /**
16
- * HyBi Sender implementation.
17
- */
18
- class Sender {
19
- /**
20
- * Creates a Sender instance.
21
- *
22
- * @param {net.Socket} socket The connection socket
23
- * @param {Object} extensions An object containing the negotiated extensions
24
- */
25
- constructor (socket, extensions) {
26
- this.perMessageDeflate = (extensions || {})[PerMessageDeflate.extensionName];
27
- this._socket = socket;
28
-
29
- this.firstFragment = true;
30
- this.compress = false;
31
-
32
- this.processing = false;
33
- this.bufferedBytes = 0;
34
- this.queue = [];
35
-
36
- this.onerror = null;
37
- }
38
-
39
- /**
40
- * Sends a close message to the other peer.
41
- *
42
- * @param {(Number|undefined)} code The status code component of the body
43
- * @param {String} data The message component of the body
44
- * @param {Boolean} mask Specifies whether or not to mask the message
45
- * @param {Function} cb Callback
46
- * @public
47
- */
48
- close (code, data, mask, cb) {
49
- if (code !== undefined && (typeof code !== 'number' || !ErrorCodes.isValidErrorCode(code))) {
50
- throw new Error('first argument must be a valid error code number');
51
- }
52
-
53
- const buf = Buffer.allocUnsafe(2 + (data ? Buffer.byteLength(data) : 0));
54
-
55
- buf.writeUInt16BE(code || 1000, 0, true);
56
- if (buf.length > 2) buf.write(data, 2);
57
-
58
- if (this.perMessageDeflate) {
59
- this.enqueue([this.doClose, buf, mask, cb]);
60
- } else {
61
- this.doClose(buf, mask, cb);
62
- }
63
- }
64
-
65
- /**
66
- * Frames and sends a close message.
67
- *
68
- * @param {Buffer} data The message to send
69
- * @param {Boolean} mask Specifies whether or not to mask `data`
70
- * @param {Function} cb Callback
71
- * @private
72
- */
73
- doClose (data, mask, cb) {
74
- this.frameAndSend(data, {
75
- readOnly: false,
76
- opcode: 0x08,
77
- rsv1: false,
78
- fin: true,
79
- mask
80
- }, cb);
81
-
82
- if (this.perMessageDeflate) this.continue();
83
- }
84
-
85
- /**
86
- * Sends a ping message to the other peer.
87
- *
88
- * @param {*} data The message to send
89
- * @param {Boolean} mask Specifies whether or not to mask `data`
90
- * @public
91
- */
92
- ping (data, mask) {
93
- var readOnly = true;
94
-
95
- if (data && !Buffer.isBuffer(data)) {
96
- if (data instanceof ArrayBuffer) {
97
- data = Buffer.from(data);
98
- } else if (ArrayBuffer.isView(data)) {
99
- data = viewToBuffer(data);
100
- } else {
101
- data = Buffer.from(data);
102
- readOnly = false;
103
- }
104
- }
105
-
106
- if (this.perMessageDeflate) {
107
- this.enqueue([this.doPing, data, mask, readOnly]);
108
- } else {
109
- this.doPing(data, mask, readOnly);
110
- }
111
- }
112
-
113
- /**
114
- * Frames and sends a ping message.
115
- *
116
- * @param {*} data The message to send
117
- * @param {Boolean} mask Specifies whether or not to mask `data`
118
- * @param {Boolean} readOnly Specifies whether `data` can be modified
119
- * @private
120
- */
121
- doPing (data, mask, readOnly) {
122
- this.frameAndSend(data, {
123
- opcode: 0x09,
124
- rsv1: false,
125
- fin: true,
126
- readOnly,
127
- mask
128
- });
129
-
130
- if (this.perMessageDeflate) this.continue();
131
- }
132
-
133
- /**
134
- * Sends a pong message to the other peer.
135
- *
136
- * @param {*} data The message to send
137
- * @param {Boolean} mask Specifies whether or not to mask `data`
138
- * @public
139
- */
140
- pong (data, mask) {
141
- var readOnly = true;
142
-
143
- if (data && !Buffer.isBuffer(data)) {
144
- if (data instanceof ArrayBuffer) {
145
- data = Buffer.from(data);
146
- } else if (ArrayBuffer.isView(data)) {
147
- data = viewToBuffer(data);
148
- } else {
149
- data = Buffer.from(data);
150
- readOnly = false;
151
- }
152
- }
153
-
154
- if (this.perMessageDeflate) {
155
- this.enqueue([this.doPong, data, mask, readOnly]);
156
- } else {
157
- this.doPong(data, mask, readOnly);
158
- }
159
- }
160
-
161
- /**
162
- * Frames and sends a pong message.
163
- *
164
- * @param {*} data The message to send
165
- * @param {Boolean} mask Specifies whether or not to mask `data`
166
- * @param {Boolean} readOnly Specifies whether `data` can be modified
167
- * @private
168
- */
169
- doPong (data, mask, readOnly) {
170
- this.frameAndSend(data, {
171
- opcode: 0x0a,
172
- rsv1: false,
173
- fin: true,
174
- readOnly,
175
- mask
176
- });
177
-
178
- if (this.perMessageDeflate) this.continue();
179
- }
180
-
181
- /**
182
- * Sends a data message to the other peer.
183
- *
184
- * @param {*} data The message to send
185
- * @param {Object} options Options object
186
- * @param {Boolean} options.compress Specifies whether or not to compress `data`
187
- * @param {Boolean} options.binary Specifies whether `data` is binary or text
188
- * @param {Boolean} options.fin Specifies whether the fragment is the last one
189
- * @param {Boolean} options.mask Specifies whether or not to mask `data`
190
- * @param {Function} cb Callback
191
- * @public
192
- */
193
- send (data, options, cb) {
194
- var opcode = options.binary ? 2 : 1;
195
- var rsv1 = options.compress;
196
- var readOnly = true;
197
-
198
- if (data && !Buffer.isBuffer(data)) {
199
- if (data instanceof ArrayBuffer) {
200
- data = Buffer.from(data);
201
- } else if (ArrayBuffer.isView(data)) {
202
- data = viewToBuffer(data);
203
- } else {
204
- data = Buffer.from(data);
205
- readOnly = false;
206
- }
207
- }
208
-
209
- if (this.firstFragment) {
210
- this.firstFragment = false;
211
- if (rsv1 && data && this.perMessageDeflate) {
212
- rsv1 = data.length >= this.perMessageDeflate.threshold;
213
- }
214
- this.compress = rsv1;
215
- } else {
216
- rsv1 = false;
217
- opcode = 0;
218
- }
219
-
220
- if (options.fin) this.firstFragment = true;
221
-
222
- if (this.perMessageDeflate) {
223
- this.enqueue([this.dispatch, data, {
224
- compress: this.compress,
225
- mask: options.mask,
226
- fin: options.fin,
227
- readOnly,
228
- opcode,
229
- rsv1
230
- }, cb]);
231
- } else {
232
- this.frameAndSend(data, {
233
- mask: options.mask,
234
- fin: options.fin,
235
- rsv1: false,
236
- readOnly,
237
- opcode
238
- }, cb);
239
- }
240
- }
241
-
242
- /**
243
- * Dispatches a data message.
244
- *
245
- * @param {Buffer} data The message to send
246
- * @param {Object} options Options object
247
- * @param {Number} options.opcode The opcode
248
- * @param {Boolean} options.readOnly Specifies whether `data` can be modified
249
- * @param {Boolean} options.fin Specifies whether or not to set the FIN bit
250
- * @param {Boolean} options.compress Specifies whether or not to compress `data`
251
- * @param {Boolean} options.mask Specifies whether or not to mask `data`
252
- * @param {Boolean} options.rsv1 Specifies whether or not to set the RSV1 bit
253
- * @param {Function} cb Callback
254
- * @private
255
- */
256
- dispatch (data, options, cb) {
257
- if (!options.compress) {
258
- this.frameAndSend(data, options, cb);
259
- this.continue();
260
- return;
261
- }
262
-
263
- this.perMessageDeflate.compress(data, options.fin, (err, buf) => {
264
- if (err) {
265
- if (cb) cb(err);
266
- else this.onerror(err);
267
- return;
268
- }
269
-
270
- options.readOnly = false;
271
- this.frameAndSend(buf, options, cb);
272
- this.continue();
273
- });
274
- }
275
-
276
- /**
277
- * Frames and sends a piece of data according to the HyBi WebSocket protocol.
278
- *
279
- * @param {Buffer} data The data to send
280
- * @param {Object} options Options object
281
- * @param {Number} options.opcode The opcode
282
- * @param {Boolean} options.readOnly Specifies whether `data` can be modified
283
- * @param {Boolean} options.fin Specifies whether or not to set the FIN bit
284
- * @param {Boolean} options.mask Specifies whether or not to mask `data`
285
- * @param {Boolean} options.rsv1 Specifies whether or not to set the RSV1 bit
286
- * @param {Function} cb Callback
287
- * @private
288
- */
289
- frameAndSend (data, options, cb) {
290
- if (!data) {
291
- const bytes = [options.opcode, 0];
292
-
293
- if (options.fin) bytes[0] |= 0x80;
294
- if (options.mask) {
295
- bytes[1] |= 0x80;
296
- bytes.push(0, 0, 0, 0);
297
- }
298
-
299
- sendFramedData(this, Buffer.from(bytes), null, cb);
300
- return;
301
- }
302
-
303
- const mergeBuffers = data.length < 1024 || options.mask && options.readOnly;
304
- var dataOffset = options.mask ? 6 : 2;
305
- var payloadLength = data.length;
306
-
307
- if (data.length >= 65536) {
308
- dataOffset += 8;
309
- payloadLength = 127;
310
- } else if (data.length > 125) {
311
- dataOffset += 2;
312
- payloadLength = 126;
313
- }
314
-
315
- const outputBuffer = Buffer.allocUnsafe(
316
- mergeBuffers ? data.length + dataOffset : dataOffset
317
- );
318
-
319
- outputBuffer[0] = options.fin ? options.opcode | 0x80 : options.opcode;
320
- if (options.rsv1) outputBuffer[0] |= 0x40;
321
-
322
- if (payloadLength === 126) {
323
- outputBuffer.writeUInt16BE(data.length, 2, true);
324
- } else if (payloadLength === 127) {
325
- outputBuffer.writeUInt32BE(0, 2, true);
326
- outputBuffer.writeUInt32BE(data.length, 6, true);
327
- }
328
-
329
- if (options.mask) {
330
- const mask = getRandomMask();
331
-
332
- outputBuffer[1] = payloadLength | 0x80;
333
- outputBuffer[dataOffset - 4] = mask[0];
334
- outputBuffer[dataOffset - 3] = mask[1];
335
- outputBuffer[dataOffset - 2] = mask[2];
336
- outputBuffer[dataOffset - 1] = mask[3];
337
-
338
- if (mergeBuffers) {
339
- bufferUtil.mask(data, mask, outputBuffer, dataOffset, data.length);
340
- } else {
341
- bufferUtil.mask(data, mask, data, 0, data.length);
342
- }
343
- } else {
344
- outputBuffer[1] = payloadLength;
345
- if (mergeBuffers) data.copy(outputBuffer, dataOffset);
346
- }
347
-
348
- sendFramedData(this, outputBuffer, mergeBuffers ? null : data, cb);
349
- }
350
-
351
- /**
352
- * Executes a queued send operation.
353
- *
354
- * @private
355
- */
356
- dequeue () {
357
- if (this.processing) return;
358
-
359
- const params = this.queue.shift();
360
- if (!params) return;
361
-
362
- if (params[1]) this.bufferedBytes -= params[1].length;
363
- this.processing = true;
364
-
365
- params[0].apply(this, params.slice(1));
366
- }
367
-
368
- /**
369
- * Signals the completion of a send operation.
370
- *
371
- * @private
372
- */
373
- continue () {
374
- process.nextTick(() => {
375
- this.processing = false;
376
- this.dequeue();
377
- });
378
- }
379
-
380
- /**
381
- * Enqueues a send operation.
382
- *
383
- * @param {Array} params Send operation parameters.
384
- * @private
385
- */
386
- enqueue (params) {
387
- if (params[1]) this.bufferedBytes += params[1].length;
388
- this.queue.push(params);
389
- this.dequeue();
390
- }
391
- }
392
-
393
- module.exports = Sender;
394
-
395
- /**
396
- * Converts an `ArrayBuffer` view into a buffer.
397
- *
398
- * @param {(DataView|TypedArray)} view The view to convert
399
- * @return {Buffer} Converted view
400
- * @private
401
- */
402
- function viewToBuffer (view) {
403
- const buf = Buffer.from(view.buffer);
404
-
405
- if (view.byteLength !== view.buffer.byteLength) {
406
- return buf.slice(view.byteOffset, view.byteOffset + view.byteLength);
407
- }
408
-
409
- return buf;
410
- }
411
-
412
- /**
413
- * Generates a random mask.
414
- *
415
- * @return {Buffer} The mask
416
- * @private
417
- */
418
- function getRandomMask () {
419
- return crypto.randomBytes(4);
420
- }
421
-
422
- /**
423
- * Sends a frame.
424
- *
425
- * @param {Sender} sender Sender instance
426
- * @param {Buffer} outputBuffer The data to send
427
- * @param {Buffer} data Additional data to send if frame is split into two buffers
428
- * @param {Function} cb Callback
429
- * @private
430
- */
431
- function sendFramedData (sender, outputBuffer, data, cb) {
432
- if (data) {
433
- sender._socket.write(outputBuffer);
434
- sender._socket.write(data, cb);
435
- } else {
436
- sender._socket.write(outputBuffer, cb);
437
- }
438
- }
@@ -1,9 +0,0 @@
1
- /*!
2
- * ws: a node.js websocket client
3
- * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
4
- * MIT Licensed
5
- */
6
-
7
- 'use strict';
8
-
9
- module.exports = () => true;
@@ -1,17 +0,0 @@
1
- /*!
2
- * ws: a node.js websocket client
3
- * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
4
- * MIT Licensed
5
- */
6
-
7
- 'use strict';
8
-
9
- try {
10
- const isValidUTF8 = require('utf-8-validate');
11
-
12
- module.exports = typeof isValidUTF8 === 'object'
13
- ? isValidUTF8.Validation.isValidUTF8 // utf-8-validate@<3.0.0
14
- : isValidUTF8;
15
- } catch (e) {
16
- module.exports = require('./Validation.fallback');
17
- }