isomorfeus-puppetmaster 0.5.5 → 0.5.6

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 (710) hide show
  1. checksums.yaml +4 -4
  2. data/lib/isomorfeus/puppetmaster/console_message.rb +18 -18
  3. data/lib/isomorfeus/puppetmaster/cookie.rb +46 -46
  4. data/lib/isomorfeus/puppetmaster/driver/puppeteer.rb +413 -415
  5. data/lib/isomorfeus/puppetmaster/driver/puppeteer_document.rb +953 -953
  6. data/lib/isomorfeus/puppetmaster/driver/puppeteer_node.rb +851 -851
  7. data/lib/isomorfeus/puppetmaster/errors.rb +90 -90
  8. data/lib/isomorfeus/puppetmaster/iframe.rb +16 -16
  9. data/lib/isomorfeus/puppetmaster/node/content_editable.rb +17 -17
  10. data/lib/isomorfeus/puppetmaster/node/input.rb +20 -20
  11. data/lib/isomorfeus/puppetmaster/node/select.rb +35 -35
  12. data/lib/isomorfeus/puppetmaster/node.rb +279 -279
  13. data/lib/isomorfeus/puppetmaster/request.rb +16 -16
  14. data/lib/isomorfeus/puppetmaster/response.rb +25 -25
  15. data/lib/isomorfeus/puppetmaster/self_forwardable.rb +38 -38
  16. data/lib/isomorfeus/puppetmaster/version.rb +3 -3
  17. data/lib/isomorfeus/puppetmaster.rb +85 -85
  18. data/lib/isomorfeus-puppetmaster.rb +1 -0
  19. data/node_modules/.bin/extract-zip +12 -12
  20. data/node_modules/.bin/extract-zip.ps1 +28 -28
  21. data/node_modules/.bin/rimraf +12 -12
  22. data/node_modules/.bin/rimraf.ps1 +28 -28
  23. data/node_modules/.package-lock.json +530 -585
  24. data/node_modules/@types/node/LICENSE +21 -21
  25. data/node_modules/@types/node/assert/strict.d.ts +8 -8
  26. data/node_modules/@types/node/assert.d.ts +912 -912
  27. data/node_modules/@types/node/async_hooks.d.ts +497 -497
  28. data/node_modules/@types/node/buffer.d.ts +2142 -2142
  29. data/node_modules/@types/node/child_process.d.ts +1355 -1355
  30. data/node_modules/@types/node/cluster.d.ts +414 -414
  31. data/node_modules/@types/node/console.d.ts +407 -407
  32. data/node_modules/@types/node/constants.d.ts +18 -18
  33. data/node_modules/@types/node/crypto.d.ts +3224 -3224
  34. data/node_modules/@types/node/dgram.d.ts +545 -545
  35. data/node_modules/@types/node/diagnostics_channel.d.ts +128 -128
  36. data/node_modules/@types/node/dns/promises.d.ts +357 -357
  37. data/node_modules/@types/node/dns.d.ts +643 -643
  38. data/node_modules/@types/node/domain.d.ts +169 -169
  39. data/node_modules/@types/node/events.d.ts +623 -623
  40. data/node_modules/@types/node/fs/promises.d.ts +997 -997
  41. data/node_modules/@types/node/fs.d.ts +3723 -3723
  42. data/node_modules/@types/node/globals.d.ts +285 -285
  43. data/node_modules/@types/node/globals.global.d.ts +1 -1
  44. data/node_modules/@types/node/http.d.ts +1358 -1358
  45. data/node_modules/@types/node/http2.d.ts +2100 -2100
  46. data/node_modules/@types/node/https.d.ts +391 -391
  47. data/node_modules/@types/node/index.d.ts +131 -131
  48. data/node_modules/@types/node/inspector.d.ts +2738 -2738
  49. data/node_modules/@types/node/module.d.ts +114 -114
  50. data/node_modules/@types/node/net.d.ts +783 -783
  51. data/node_modules/@types/node/os.d.ts +455 -455
  52. data/node_modules/@types/node/package.json +229 -229
  53. data/node_modules/@types/node/path.d.ts +172 -172
  54. data/node_modules/@types/node/perf_hooks.d.ts +555 -555
  55. data/node_modules/@types/node/process.d.ts +1477 -1477
  56. data/node_modules/@types/node/punycode.d.ts +117 -117
  57. data/node_modules/@types/node/querystring.d.ts +131 -131
  58. data/node_modules/@types/node/readline.d.ts +542 -542
  59. data/node_modules/@types/node/repl.d.ts +424 -424
  60. data/node_modules/@types/node/stream/consumers.d.ts +24 -24
  61. data/node_modules/@types/node/stream/promises.d.ts +42 -42
  62. data/node_modules/@types/node/stream/web.d.ts +6 -6
  63. data/node_modules/@types/node/stream.d.ts +1181 -1181
  64. data/node_modules/@types/node/string_decoder.d.ts +67 -67
  65. data/node_modules/@types/node/timers/promises.d.ts +68 -68
  66. data/node_modules/@types/node/timers.d.ts +94 -94
  67. data/node_modules/@types/node/tls.d.ts +1019 -1019
  68. data/node_modules/@types/node/trace_events.d.ts +161 -161
  69. data/node_modules/@types/node/tty.d.ts +206 -206
  70. data/node_modules/@types/node/url.d.ts +798 -798
  71. data/node_modules/@types/node/util.d.ts +1556 -1556
  72. data/node_modules/@types/node/v8.d.ts +378 -378
  73. data/node_modules/@types/node/vm.d.ts +504 -504
  74. data/node_modules/@types/node/wasi.d.ts +153 -153
  75. data/node_modules/@types/node/worker_threads.d.ts +649 -649
  76. data/node_modules/@types/node/zlib.d.ts +517 -517
  77. data/node_modules/@types/yauzl/LICENSE +21 -21
  78. data/node_modules/@types/yauzl/index.d.ts +98 -98
  79. data/node_modules/@types/yauzl/package.json +26 -26
  80. data/node_modules/agent-base/README.md +145 -145
  81. data/node_modules/agent-base/dist/src/index.d.ts +78 -78
  82. data/node_modules/agent-base/dist/src/index.js +202 -202
  83. data/node_modules/agent-base/dist/src/promisify.d.ts +4 -4
  84. data/node_modules/agent-base/dist/src/promisify.js +17 -17
  85. data/node_modules/agent-base/package.json +64 -64
  86. data/node_modules/agent-base/src/index.ts +345 -345
  87. data/node_modules/agent-base/src/promisify.ts +33 -33
  88. data/node_modules/balanced-match/.github/FUNDING.yml +2 -2
  89. data/node_modules/balanced-match/LICENSE.md +21 -21
  90. data/node_modules/balanced-match/README.md +97 -97
  91. data/node_modules/balanced-match/index.js +62 -62
  92. data/node_modules/balanced-match/package.json +48 -48
  93. data/node_modules/base64-js/LICENSE +21 -21
  94. data/node_modules/base64-js/README.md +34 -34
  95. data/node_modules/base64-js/index.d.ts +3 -3
  96. data/node_modules/base64-js/index.js +150 -150
  97. data/node_modules/base64-js/package.json +47 -47
  98. data/node_modules/bl/.travis.yml +17 -17
  99. data/node_modules/bl/BufferList.js +396 -396
  100. data/node_modules/bl/LICENSE.md +13 -13
  101. data/node_modules/bl/README.md +247 -247
  102. data/node_modules/bl/bl.js +84 -84
  103. data/node_modules/bl/package.json +37 -37
  104. data/node_modules/bl/test/convert.js +21 -21
  105. data/node_modules/bl/test/indexOf.js +492 -492
  106. data/node_modules/bl/test/isBufferList.js +32 -32
  107. data/node_modules/bl/test/test.js +869 -869
  108. data/node_modules/brace-expansion/LICENSE +21 -21
  109. data/node_modules/brace-expansion/README.md +129 -129
  110. data/node_modules/brace-expansion/index.js +201 -201
  111. data/node_modules/brace-expansion/package.json +47 -47
  112. data/node_modules/buffer/AUTHORS.md +70 -70
  113. data/node_modules/buffer/LICENSE +21 -21
  114. data/node_modules/buffer/README.md +410 -410
  115. data/node_modules/buffer/index.d.ts +186 -186
  116. data/node_modules/buffer/index.js +1817 -1817
  117. data/node_modules/buffer/package.json +96 -96
  118. data/node_modules/buffer-crc32/LICENSE +19 -19
  119. data/node_modules/buffer-crc32/README.md +47 -47
  120. data/node_modules/buffer-crc32/index.js +111 -111
  121. data/node_modules/buffer-crc32/package.json +39 -39
  122. data/node_modules/chownr/LICENSE +15 -15
  123. data/node_modules/chownr/README.md +3 -3
  124. data/node_modules/chownr/chownr.js +167 -167
  125. data/node_modules/chownr/package.json +29 -29
  126. data/node_modules/concat-map/.travis.yml +4 -4
  127. data/node_modules/concat-map/LICENSE +18 -18
  128. data/node_modules/concat-map/README.markdown +62 -62
  129. data/node_modules/concat-map/example/map.js +6 -6
  130. data/node_modules/concat-map/index.js +13 -13
  131. data/node_modules/concat-map/package.json +43 -43
  132. data/node_modules/concat-map/test/map.js +39 -39
  133. data/node_modules/debug/LICENSE +19 -19
  134. data/node_modules/debug/README.md +455 -455
  135. data/node_modules/debug/package.json +59 -59
  136. data/node_modules/debug/src/browser.js +269 -269
  137. data/node_modules/debug/src/common.js +274 -274
  138. data/node_modules/debug/src/index.js +10 -10
  139. data/node_modules/debug/src/node.js +263 -263
  140. data/node_modules/devtools-protocol/LICENSE +27 -27
  141. data/node_modules/devtools-protocol/README.md +12 -12
  142. data/node_modules/devtools-protocol/json/browser_protocol.json +20985 -20640
  143. data/node_modules/devtools-protocol/json/js_protocol.json +3531 -3580
  144. data/node_modules/devtools-protocol/package.json +17 -18
  145. data/node_modules/devtools-protocol/pdl/browser_protocol.pdl +9849 -9637
  146. data/node_modules/devtools-protocol/pdl/js_protocol.pdl +1653 -1678
  147. data/node_modules/devtools-protocol/types/protocol-mapping.d.ts +4333 -4321
  148. data/node_modules/devtools-protocol/types/protocol-proxy-api.d.ts +3695 -3683
  149. data/node_modules/devtools-protocol/types/protocol.d.ts +15714 -15538
  150. data/node_modules/end-of-stream/LICENSE +20 -20
  151. data/node_modules/end-of-stream/README.md +54 -54
  152. data/node_modules/end-of-stream/index.js +94 -94
  153. data/node_modules/end-of-stream/package.json +37 -37
  154. data/node_modules/extract-zip/LICENSE +23 -23
  155. data/node_modules/extract-zip/cli.js +19 -19
  156. data/node_modules/extract-zip/index.d.ts +21 -21
  157. data/node_modules/extract-zip/index.js +173 -173
  158. data/node_modules/extract-zip/package.json +80 -80
  159. data/node_modules/extract-zip/readme.md +57 -57
  160. data/node_modules/fd-slicer/.npmignore +2 -2
  161. data/node_modules/fd-slicer/.travis.yml +7 -7
  162. data/node_modules/fd-slicer/CHANGELOG.md +49 -49
  163. data/node_modules/fd-slicer/LICENSE +21 -21
  164. data/node_modules/fd-slicer/README.md +199 -199
  165. data/node_modules/fd-slicer/index.js +296 -296
  166. data/node_modules/fd-slicer/package.json +36 -36
  167. data/node_modules/fd-slicer/test/test.js +350 -350
  168. data/node_modules/find-up/index.d.ts +137 -137
  169. data/node_modules/find-up/index.js +89 -89
  170. data/node_modules/find-up/license +9 -9
  171. data/node_modules/find-up/package.json +53 -53
  172. data/node_modules/find-up/readme.md +156 -156
  173. data/node_modules/fs-constants/LICENSE +21 -21
  174. data/node_modules/fs-constants/README.md +26 -26
  175. data/node_modules/fs-constants/browser.js +1 -1
  176. data/node_modules/fs-constants/index.js +1 -1
  177. data/node_modules/fs-constants/package.json +19 -19
  178. data/node_modules/fs.realpath/LICENSE +43 -43
  179. data/node_modules/fs.realpath/README.md +33 -33
  180. data/node_modules/fs.realpath/index.js +66 -66
  181. data/node_modules/fs.realpath/old.js +303 -303
  182. data/node_modules/fs.realpath/package.json +26 -26
  183. data/node_modules/get-stream/buffer-stream.js +52 -52
  184. data/node_modules/get-stream/index.d.ts +108 -108
  185. data/node_modules/get-stream/index.js +60 -60
  186. data/node_modules/get-stream/license +9 -9
  187. data/node_modules/get-stream/package.json +50 -50
  188. data/node_modules/get-stream/readme.md +124 -124
  189. data/node_modules/glob/LICENSE +21 -21
  190. data/node_modules/glob/README.md +375 -375
  191. data/node_modules/glob/changelog.md +67 -67
  192. data/node_modules/glob/common.js +234 -234
  193. data/node_modules/glob/glob.js +788 -788
  194. data/node_modules/glob/package.json +51 -51
  195. data/node_modules/glob/sync.js +484 -484
  196. data/node_modules/https-proxy-agent/README.md +137 -137
  197. data/node_modules/https-proxy-agent/dist/agent.d.ts +30 -30
  198. data/node_modules/https-proxy-agent/dist/agent.js +179 -179
  199. data/node_modules/https-proxy-agent/dist/index.d.ts +23 -23
  200. data/node_modules/https-proxy-agent/dist/index.js +13 -13
  201. data/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts +7 -7
  202. data/node_modules/https-proxy-agent/dist/parse-proxy-response.js +65 -65
  203. data/node_modules/https-proxy-agent/package.json +56 -56
  204. data/node_modules/ieee754/LICENSE +11 -11
  205. data/node_modules/ieee754/README.md +51 -51
  206. data/node_modules/ieee754/index.d.ts +9 -9
  207. data/node_modules/ieee754/index.js +85 -85
  208. data/node_modules/ieee754/package.json +52 -52
  209. data/node_modules/inflight/LICENSE +15 -15
  210. data/node_modules/inflight/README.md +37 -37
  211. data/node_modules/inflight/inflight.js +54 -54
  212. data/node_modules/inflight/package.json +29 -29
  213. data/node_modules/inherits/LICENSE +16 -16
  214. data/node_modules/inherits/README.md +42 -42
  215. data/node_modules/inherits/inherits.js +9 -9
  216. data/node_modules/inherits/inherits_browser.js +27 -27
  217. data/node_modules/inherits/package.json +29 -29
  218. data/node_modules/locate-path/index.d.ts +83 -83
  219. data/node_modules/locate-path/index.js +65 -65
  220. data/node_modules/locate-path/license +9 -9
  221. data/node_modules/locate-path/package.json +45 -45
  222. data/node_modules/locate-path/readme.md +122 -122
  223. data/node_modules/minimatch/LICENSE +15 -15
  224. data/node_modules/minimatch/README.md +209 -209
  225. data/node_modules/minimatch/minimatch.js +923 -923
  226. data/node_modules/minimatch/package.json +30 -30
  227. data/node_modules/mkdirp-classic/LICENSE +21 -21
  228. data/node_modules/mkdirp-classic/README.md +18 -18
  229. data/node_modules/mkdirp-classic/index.js +98 -98
  230. data/node_modules/mkdirp-classic/package.json +18 -18
  231. data/node_modules/ms/index.js +162 -162
  232. data/node_modules/ms/license.md +21 -21
  233. data/node_modules/ms/package.json +37 -37
  234. data/node_modules/ms/readme.md +60 -60
  235. data/node_modules/node-fetch/LICENSE.md +22 -22
  236. data/node_modules/node-fetch/README.md +590 -590
  237. data/node_modules/node-fetch/browser.js +24 -24
  238. data/node_modules/node-fetch/lib/index.es.js +1662 -1662
  239. data/node_modules/node-fetch/lib/index.js +1671 -1671
  240. data/node_modules/node-fetch/lib/index.mjs +1660 -1660
  241. data/node_modules/node-fetch/package.json +68 -68
  242. data/node_modules/once/LICENSE +15 -15
  243. data/node_modules/once/README.md +79 -79
  244. data/node_modules/once/once.js +42 -42
  245. data/node_modules/once/package.json +33 -33
  246. data/node_modules/p-limit/index.d.ts +38 -38
  247. data/node_modules/p-limit/index.js +57 -57
  248. data/node_modules/p-limit/license +9 -9
  249. data/node_modules/p-limit/package.json +52 -52
  250. data/node_modules/p-limit/readme.md +101 -101
  251. data/node_modules/p-locate/index.d.ts +64 -64
  252. data/node_modules/p-locate/index.js +52 -52
  253. data/node_modules/p-locate/license +9 -9
  254. data/node_modules/p-locate/package.json +53 -53
  255. data/node_modules/p-locate/readme.md +90 -90
  256. data/node_modules/p-try/index.d.ts +39 -39
  257. data/node_modules/p-try/index.js +9 -9
  258. data/node_modules/p-try/license +9 -9
  259. data/node_modules/p-try/package.json +42 -42
  260. data/node_modules/p-try/readme.md +58 -58
  261. data/node_modules/path-exists/index.d.ts +28 -28
  262. data/node_modules/path-exists/index.js +23 -23
  263. data/node_modules/path-exists/license +9 -9
  264. data/node_modules/path-exists/package.json +39 -39
  265. data/node_modules/path-exists/readme.md +52 -52
  266. data/node_modules/path-is-absolute/index.js +20 -20
  267. data/node_modules/path-is-absolute/license +21 -21
  268. data/node_modules/path-is-absolute/package.json +43 -43
  269. data/node_modules/path-is-absolute/readme.md +59 -59
  270. data/node_modules/pend/LICENSE +23 -23
  271. data/node_modules/pend/README.md +41 -41
  272. data/node_modules/pend/index.js +55 -55
  273. data/node_modules/pend/package.json +18 -18
  274. data/node_modules/pend/test.js +137 -137
  275. data/node_modules/pkg-dir/index.d.ts +44 -44
  276. data/node_modules/pkg-dir/index.js +17 -17
  277. data/node_modules/pkg-dir/license +9 -9
  278. data/node_modules/pkg-dir/package.json +56 -56
  279. data/node_modules/pkg-dir/readme.md +66 -66
  280. data/node_modules/progress/CHANGELOG.md +115 -115
  281. data/node_modules/progress/LICENSE +22 -22
  282. data/node_modules/progress/Makefile +8 -8
  283. data/node_modules/progress/Readme.md +146 -146
  284. data/node_modules/progress/index.js +1 -1
  285. data/node_modules/progress/lib/node-progress.js +236 -236
  286. data/node_modules/progress/package.json +26 -26
  287. data/node_modules/proxy-from-env/.eslintrc +29 -29
  288. data/node_modules/proxy-from-env/.travis.yml +10 -10
  289. data/node_modules/proxy-from-env/LICENSE +20 -20
  290. data/node_modules/proxy-from-env/README.md +131 -131
  291. data/node_modules/proxy-from-env/index.js +108 -108
  292. data/node_modules/proxy-from-env/package.json +34 -34
  293. data/node_modules/proxy-from-env/test.js +483 -483
  294. data/node_modules/pump/.travis.yml +5 -5
  295. data/node_modules/pump/LICENSE +20 -20
  296. data/node_modules/pump/README.md +65 -65
  297. data/node_modules/pump/index.js +82 -82
  298. data/node_modules/pump/package.json +24 -24
  299. data/node_modules/pump/test-browser.js +66 -66
  300. data/node_modules/pump/test-node.js +53 -53
  301. data/node_modules/puppeteer-core/CHANGELOG.md +319 -290
  302. data/node_modules/puppeteer-core/LICENSE +202 -202
  303. data/node_modules/puppeteer-core/README.md +481 -481
  304. data/node_modules/puppeteer-core/cjs-entry-core.js +29 -29
  305. data/node_modules/puppeteer-core/cjs-entry.js +29 -29
  306. data/node_modules/puppeteer-core/install.js +89 -89
  307. data/node_modules/puppeteer-core/lib/cjs/puppeteer/api-docs-entry.d.ts +110 -110
  308. data/node_modules/puppeteer-core/lib/cjs/puppeteer/api-docs-entry.js +80 -80
  309. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Accessibility.d.ts +175 -175
  310. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Accessibility.js +360 -360
  311. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/AriaQueryHandler.d.ts +20 -20
  312. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/AriaQueryHandler.js +84 -84
  313. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/AriaQueryHandler.js.map +1 -1
  314. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Browser.d.ts +455 -455
  315. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Browser.js +540 -540
  316. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/BrowserConnector.d.ts +53 -53
  317. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/BrowserConnector.js +97 -97
  318. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/BrowserWebSocketTransport.d.ts +25 -25
  319. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/BrowserWebSocketTransport.js +34 -34
  320. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Connection.d.ts +135 -135
  321. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Connection.js +298 -298
  322. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ConnectionTransport.d.ts +24 -24
  323. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ConnectionTransport.js +17 -17
  324. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ConsoleMessage.d.ts +72 -72
  325. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ConsoleMessage.js +64 -64
  326. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Coverage.d.ts +204 -204
  327. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Coverage.js +335 -335
  328. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/DOMWorld.d.ts +175 -175
  329. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/DOMWorld.js +662 -662
  330. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Debug.d.ts +52 -52
  331. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Debug.js +81 -81
  332. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/DeviceDescriptors.d.ts +40 -40
  333. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/DeviceDescriptors.js +1070 -1070
  334. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Dialog.d.ts +74 -74
  335. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Dialog.js +97 -97
  336. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/EmulationManager.d.ts +24 -24
  337. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/EmulationManager.js +37 -37
  338. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Errors.d.ts +50 -50
  339. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Errors.js +56 -56
  340. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/EvalTypes.d.ts +60 -60
  341. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/EvalTypes.js +17 -17
  342. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/EventEmitter.d.ts +92 -92
  343. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/EventEmitter.js +116 -116
  344. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Events.d.ts +81 -81
  345. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Events.js +86 -86
  346. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ExecutionContext.d.ts +193 -193
  347. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ExecutionContext.js +321 -321
  348. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/FileChooser.d.ts +58 -58
  349. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/FileChooser.js +71 -71
  350. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/FrameManager.d.ts +744 -744
  351. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/FrameManager.js +1047 -1047
  352. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/FrameManager.js.map +1 -1
  353. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPRequest.d.ts +350 -345
  354. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPRequest.d.ts.map +1 -1
  355. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPRequest.js +549 -549
  356. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPRequest.js.map +1 -1
  357. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPResponse.d.ts +134 -125
  358. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPResponse.d.ts.map +1 -1
  359. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPResponse.js +184 -164
  360. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPResponse.js.map +1 -1
  361. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Input.d.ts +358 -358
  362. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Input.js +543 -543
  363. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/JSHandle.d.ts +490 -490
  364. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/JSHandle.js +827 -827
  365. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/LifecycleWatcher.d.ts +65 -65
  366. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/LifecycleWatcher.d.ts.map +1 -1
  367. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/LifecycleWatcher.js +149 -148
  368. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/LifecycleWatcher.js.map +1 -1
  369. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/NetworkConditions.d.ts +26 -26
  370. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/NetworkConditions.js +33 -33
  371. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/NetworkManager.d.ts +126 -97
  372. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/NetworkManager.d.ts.map +1 -1
  373. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/NetworkManager.js +467 -342
  374. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/NetworkManager.js.map +1 -1
  375. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/PDFOptions.d.ts +161 -161
  376. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/PDFOptions.js +34 -34
  377. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Page.d.ts +2055 -2055
  378. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Page.js +2533 -2533
  379. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Product.d.ts +20 -20
  380. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Product.js +17 -17
  381. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Puppeteer.d.ts +159 -159
  382. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Puppeteer.js +161 -161
  383. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/PuppeteerViewport.d.ts +51 -51
  384. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/PuppeteerViewport.js +2 -2
  385. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/QueryHandler.d.ts +64 -64
  386. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/QueryHandler.js +165 -165
  387. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/SecurityDetails.d.ts +60 -60
  388. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/SecurityDetails.js +76 -76
  389. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Target.d.ts +100 -100
  390. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Target.js +145 -145
  391. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/TaskQueue.d.ts +20 -20
  392. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/TaskQueue.js +29 -29
  393. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/TimeoutSettings.d.ts +27 -27
  394. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/TimeoutSettings.js +47 -47
  395. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Tracing.d.ts +46 -46
  396. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Tracing.js +109 -109
  397. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/USKeyboardLayout.d.ts +39 -39
  398. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/USKeyboardLayout.js +406 -406
  399. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/WebWorker.d.ts +98 -98
  400. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/WebWorker.js +112 -112
  401. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/assert.d.ts +22 -22
  402. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/assert.js +33 -33
  403. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/fetch.d.ts +16 -16
  404. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/fetch.js +43 -43
  405. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/helper.d.ts +84 -84
  406. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/helper.js +327 -327
  407. data/node_modules/puppeteer-core/lib/cjs/puppeteer/environment.d.ts +16 -16
  408. data/node_modules/puppeteer-core/lib/cjs/puppeteer/environment.js +19 -19
  409. data/node_modules/puppeteer-core/lib/cjs/puppeteer/global.d.ts +16 -16
  410. data/node_modules/puppeteer-core/lib/cjs/puppeteer/global.js +2 -2
  411. data/node_modules/puppeteer-core/lib/cjs/puppeteer/initialize-node.d.ts +17 -17
  412. data/node_modules/puppeteer-core/lib/cjs/puppeteer/initialize-node.js +44 -44
  413. data/node_modules/puppeteer-core/lib/cjs/puppeteer/initialize-web.d.ts +17 -17
  414. data/node_modules/puppeteer-core/lib/cjs/puppeteer/initialize-web.js +26 -26
  415. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserFetcher.d.ts +133 -133
  416. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserFetcher.js +500 -500
  417. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserRunner.d.ts +40 -39
  418. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserRunner.d.ts.map +1 -1
  419. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserRunner.js +256 -230
  420. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserRunner.js.map +1 -1
  421. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/LaunchOptions.d.ts +134 -134
  422. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/LaunchOptions.js +17 -17
  423. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Launcher.d.ts +16 -16
  424. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Launcher.d.ts.map +1 -1
  425. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Launcher.js +655 -588
  426. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Launcher.js.map +1 -1
  427. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/NodeWebSocketTransport.d.ts +26 -26
  428. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/NodeWebSocketTransport.js +47 -47
  429. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/PipeTransport.d.ts +29 -29
  430. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/PipeTransport.js +64 -64
  431. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Puppeteer.d.ts +153 -153
  432. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Puppeteer.js +188 -188
  433. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/install.d.ts +17 -17
  434. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/install.js +173 -173
  435. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node-puppeteer-core.d.ts +17 -17
  436. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node-puppeteer-core.js +24 -24
  437. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node.d.ts +17 -17
  438. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node.js +23 -23
  439. data/node_modules/puppeteer-core/lib/cjs/puppeteer/revisions.d.ts +21 -21
  440. data/node_modules/puppeteer-core/lib/cjs/puppeteer/revisions.js +22 -22
  441. data/node_modules/puppeteer-core/lib/cjs/puppeteer/web.d.ts +17 -17
  442. data/node_modules/puppeteer-core/lib/cjs/puppeteer/web.js +23 -23
  443. data/node_modules/puppeteer-core/lib/cjs/vendor/mitt/src/index.d.ts +27 -27
  444. data/node_modules/puppeteer-core/lib/cjs/vendor/mitt/src/index.js +56 -56
  445. data/node_modules/puppeteer-core/lib/esm/puppeteer/api-docs-entry.d.ts +110 -110
  446. data/node_modules/puppeteer-core/lib/esm/puppeteer/api-docs-entry.js +80 -80
  447. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Accessibility.d.ts +175 -175
  448. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Accessibility.js +356 -356
  449. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/AriaQueryHandler.d.ts +20 -20
  450. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/AriaQueryHandler.js +81 -81
  451. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/AriaQueryHandler.js.map +1 -1
  452. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Browser.d.ts +455 -455
  453. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Browser.js +535 -535
  454. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/BrowserConnector.d.ts +53 -53
  455. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/BrowserConnector.js +74 -74
  456. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/BrowserWebSocketTransport.d.ts +25 -25
  457. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/BrowserWebSocketTransport.js +30 -30
  458. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Connection.d.ts +135 -135
  459. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Connection.js +293 -293
  460. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/ConnectionTransport.d.ts +24 -24
  461. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/ConnectionTransport.js +16 -16
  462. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/ConsoleMessage.d.ts +72 -72
  463. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/ConsoleMessage.js +60 -60
  464. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Coverage.d.ts +204 -204
  465. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Coverage.js +329 -329
  466. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/DOMWorld.d.ts +175 -175
  467. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/DOMWorld.js +657 -657
  468. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Debug.d.ts +52 -52
  469. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Debug.js +77 -77
  470. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/DeviceDescriptors.d.ts +40 -40
  471. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/DeviceDescriptors.js +1067 -1067
  472. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Dialog.d.ts +74 -74
  473. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Dialog.js +93 -93
  474. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/EmulationManager.d.ts +24 -24
  475. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/EmulationManager.js +33 -33
  476. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Errors.d.ts +50 -50
  477. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Errors.js +50 -50
  478. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/EvalTypes.d.ts +60 -60
  479. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/EvalTypes.js +16 -16
  480. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/EventEmitter.d.ts +92 -92
  481. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/EventEmitter.js +109 -109
  482. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Events.d.ts +81 -81
  483. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Events.js +83 -83
  484. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/ExecutionContext.d.ts +193 -193
  485. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/ExecutionContext.js +317 -317
  486. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/FileChooser.d.ts +58 -58
  487. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/FileChooser.js +67 -67
  488. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/FrameManager.d.ts +744 -744
  489. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/FrameManager.js +1042 -1042
  490. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/FrameManager.js.map +1 -1
  491. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPRequest.d.ts +350 -345
  492. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPRequest.d.ts.map +1 -1
  493. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPRequest.js +545 -545
  494. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPRequest.js.map +1 -1
  495. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPResponse.d.ts +134 -125
  496. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPResponse.d.ts.map +1 -1
  497. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPResponse.js +180 -160
  498. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPResponse.js.map +1 -1
  499. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Input.d.ts +358 -358
  500. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Input.js +537 -537
  501. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/JSHandle.d.ts +490 -490
  502. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/JSHandle.js +802 -802
  503. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/LifecycleWatcher.d.ts +65 -65
  504. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/LifecycleWatcher.d.ts.map +1 -1
  505. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/LifecycleWatcher.js +145 -144
  506. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/LifecycleWatcher.js.map +1 -1
  507. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/NetworkConditions.d.ts +26 -26
  508. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/NetworkConditions.js +30 -30
  509. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/NetworkManager.d.ts +126 -97
  510. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/NetworkManager.d.ts.map +1 -1
  511. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/NetworkManager.js +463 -338
  512. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/NetworkManager.js.map +1 -1
  513. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/PDFOptions.d.ts +161 -161
  514. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/PDFOptions.js +31 -31
  515. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Page.d.ts +2055 -2055
  516. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Page.js +2529 -2529
  517. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Product.d.ts +20 -20
  518. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Product.js +16 -16
  519. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Puppeteer.d.ts +159 -159
  520. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Puppeteer.js +157 -157
  521. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/PuppeteerViewport.d.ts +51 -51
  522. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/PuppeteerViewport.js +1 -1
  523. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/QueryHandler.d.ts +64 -64
  524. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/QueryHandler.js +157 -157
  525. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/SecurityDetails.d.ts +60 -60
  526. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/SecurityDetails.js +72 -72
  527. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Target.d.ts +100 -100
  528. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Target.js +141 -141
  529. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/TaskQueue.d.ts +20 -20
  530. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/TaskQueue.js +25 -25
  531. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/TimeoutSettings.d.ts +27 -27
  532. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/TimeoutSettings.js +43 -43
  533. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Tracing.d.ts +46 -46
  534. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Tracing.js +105 -105
  535. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/USKeyboardLayout.d.ts +39 -39
  536. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/USKeyboardLayout.js +403 -403
  537. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/WebWorker.d.ts +98 -98
  538. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/WebWorker.js +108 -108
  539. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/assert.d.ts +22 -22
  540. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/assert.js +28 -28
  541. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/fetch.d.ts +16 -16
  542. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/fetch.js +20 -20
  543. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/helper.d.ts +84 -84
  544. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/helper.js +305 -305
  545. data/node_modules/puppeteer-core/lib/esm/puppeteer/environment.d.ts +16 -16
  546. data/node_modules/puppeteer-core/lib/esm/puppeteer/environment.js +16 -16
  547. data/node_modules/puppeteer-core/lib/esm/puppeteer/global.d.ts +16 -16
  548. data/node_modules/puppeteer-core/lib/esm/puppeteer/global.js +1 -1
  549. data/node_modules/puppeteer-core/lib/esm/puppeteer/initialize-node.d.ts +17 -17
  550. data/node_modules/puppeteer-core/lib/esm/puppeteer/initialize-node.js +37 -37
  551. data/node_modules/puppeteer-core/lib/esm/puppeteer/initialize-web.d.ts +17 -17
  552. data/node_modules/puppeteer-core/lib/esm/puppeteer/initialize-web.js +22 -22
  553. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserFetcher.d.ts +133 -133
  554. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserFetcher.js +474 -474
  555. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserRunner.d.ts +40 -39
  556. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserRunner.d.ts.map +1 -1
  557. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserRunner.js +230 -204
  558. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserRunner.js.map +1 -1
  559. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/LaunchOptions.d.ts +134 -134
  560. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/LaunchOptions.js +16 -16
  561. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/Launcher.d.ts +16 -16
  562. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/Launcher.d.ts.map +1 -1
  563. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/Launcher.js +633 -566
  564. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/Launcher.js.map +1 -1
  565. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/NodeWebSocketTransport.d.ts +26 -26
  566. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/NodeWebSocketTransport.js +40 -40
  567. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/PipeTransport.d.ts +29 -29
  568. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/PipeTransport.js +60 -60
  569. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/Puppeteer.d.ts +153 -153
  570. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/Puppeteer.js +181 -181
  571. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/install.d.ts +17 -17
  572. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/install.js +165 -165
  573. data/node_modules/puppeteer-core/lib/esm/puppeteer/node-puppeteer-core.d.ts +17 -17
  574. data/node_modules/puppeteer-core/lib/esm/puppeteer/node-puppeteer-core.js +22 -22
  575. data/node_modules/puppeteer-core/lib/esm/puppeteer/node.d.ts +17 -17
  576. data/node_modules/puppeteer-core/lib/esm/puppeteer/node.js +21 -21
  577. data/node_modules/puppeteer-core/lib/esm/puppeteer/revisions.d.ts +21 -21
  578. data/node_modules/puppeteer-core/lib/esm/puppeteer/revisions.js +19 -19
  579. data/node_modules/puppeteer-core/lib/esm/puppeteer/web.d.ts +17 -17
  580. data/node_modules/puppeteer-core/lib/esm/puppeteer/web.js +21 -21
  581. data/node_modules/puppeteer-core/lib/esm/vendor/mitt/src/index.d.ts +27 -27
  582. data/node_modules/puppeteer-core/lib/esm/vendor/mitt/src/index.js +53 -53
  583. data/node_modules/puppeteer-core/lib/types.d.ts +67 -25
  584. data/node_modules/puppeteer-core/package.json +115 -115
  585. data/node_modules/puppeteer-core/typescript-if-required.js +61 -61
  586. data/node_modules/readable-stream/CONTRIBUTING.md +38 -38
  587. data/node_modules/readable-stream/GOVERNANCE.md +136 -136
  588. data/node_modules/readable-stream/LICENSE +47 -47
  589. data/node_modules/readable-stream/README.md +106 -106
  590. data/node_modules/readable-stream/errors-browser.js +127 -127
  591. data/node_modules/readable-stream/errors.js +116 -116
  592. data/node_modules/readable-stream/experimentalWarning.js +17 -17
  593. data/node_modules/readable-stream/lib/_stream_duplex.js +138 -138
  594. data/node_modules/readable-stream/lib/_stream_passthrough.js +38 -38
  595. data/node_modules/readable-stream/lib/_stream_readable.js +1123 -1123
  596. data/node_modules/readable-stream/lib/_stream_transform.js +200 -200
  597. data/node_modules/readable-stream/lib/_stream_writable.js +696 -696
  598. data/node_modules/readable-stream/lib/internal/streams/async_iterator.js +206 -206
  599. data/node_modules/readable-stream/lib/internal/streams/buffer_list.js +209 -209
  600. data/node_modules/readable-stream/lib/internal/streams/destroy.js +104 -104
  601. data/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +103 -103
  602. data/node_modules/readable-stream/lib/internal/streams/from-browser.js +3 -3
  603. data/node_modules/readable-stream/lib/internal/streams/from.js +63 -63
  604. data/node_modules/readable-stream/lib/internal/streams/pipeline.js +96 -96
  605. data/node_modules/readable-stream/lib/internal/streams/state.js +26 -26
  606. data/node_modules/readable-stream/lib/internal/streams/stream-browser.js +1 -1
  607. data/node_modules/readable-stream/lib/internal/streams/stream.js +1 -1
  608. data/node_modules/readable-stream/package.json +68 -68
  609. data/node_modules/readable-stream/readable-browser.js +9 -9
  610. data/node_modules/readable-stream/readable.js +16 -16
  611. data/node_modules/rimraf/CHANGELOG.md +65 -65
  612. data/node_modules/rimraf/LICENSE +15 -15
  613. data/node_modules/rimraf/README.md +101 -101
  614. data/node_modules/rimraf/bin.js +68 -68
  615. data/node_modules/rimraf/package.json +32 -32
  616. data/node_modules/rimraf/rimraf.js +360 -360
  617. data/node_modules/safe-buffer/LICENSE +21 -21
  618. data/node_modules/safe-buffer/README.md +584 -584
  619. data/node_modules/safe-buffer/index.d.ts +186 -186
  620. data/node_modules/safe-buffer/index.js +65 -65
  621. data/node_modules/safe-buffer/package.json +51 -51
  622. data/node_modules/string_decoder/LICENSE +48 -48
  623. data/node_modules/string_decoder/README.md +47 -47
  624. data/node_modules/string_decoder/lib/string_decoder.js +295 -295
  625. data/node_modules/string_decoder/package.json +34 -34
  626. data/node_modules/tar-fs/.travis.yml +6 -6
  627. data/node_modules/tar-fs/LICENSE +20 -20
  628. data/node_modules/tar-fs/README.md +165 -165
  629. data/node_modules/tar-fs/index.js +351 -351
  630. data/node_modules/tar-fs/package.json +41 -41
  631. data/node_modules/tar-fs/test/fixtures/a/hello.txt +1 -1
  632. data/node_modules/tar-fs/test/fixtures/b/a/test.txt +1 -1
  633. data/node_modules/tar-fs/test/index.js +346 -346
  634. data/node_modules/tar-stream/LICENSE +20 -20
  635. data/node_modules/tar-stream/README.md +168 -168
  636. data/node_modules/tar-stream/extract.js +257 -257
  637. data/node_modules/tar-stream/headers.js +295 -295
  638. data/node_modules/tar-stream/index.js +2 -2
  639. data/node_modules/tar-stream/pack.js +255 -255
  640. data/node_modules/tar-stream/package.json +58 -58
  641. data/node_modules/tar-stream/sandbox.js +11 -11
  642. data/node_modules/through/.travis.yml +5 -5
  643. data/node_modules/through/LICENSE.APACHE2 +15 -15
  644. data/node_modules/through/LICENSE.MIT +24 -24
  645. data/node_modules/through/index.js +108 -108
  646. data/node_modules/through/package.json +36 -36
  647. data/node_modules/through/readme.markdown +64 -64
  648. data/node_modules/through/test/async.js +28 -28
  649. data/node_modules/through/test/auto-destroy.js +30 -30
  650. data/node_modules/through/test/buffering.js +71 -71
  651. data/node_modules/through/test/end.js +45 -45
  652. data/node_modules/through/test/index.js +133 -133
  653. data/node_modules/tr46/.npmignore +4 -4
  654. data/node_modules/tr46/index.js +193 -193
  655. data/node_modules/tr46/package.json +31 -31
  656. data/node_modules/unbzip2-stream/LICENSE +24 -24
  657. data/node_modules/unbzip2-stream/README.md +59 -59
  658. data/node_modules/unbzip2-stream/dist/unbzip2-stream.min.js +1 -1
  659. data/node_modules/unbzip2-stream/index.js +93 -93
  660. data/node_modules/unbzip2-stream/lib/bit_iterator.js +39 -39
  661. data/node_modules/unbzip2-stream/lib/bzip2.js +365 -365
  662. data/node_modules/unbzip2-stream/package.json +51 -51
  663. data/node_modules/util-deprecate/History.md +16 -16
  664. data/node_modules/util-deprecate/LICENSE +24 -24
  665. data/node_modules/util-deprecate/README.md +53 -53
  666. data/node_modules/util-deprecate/browser.js +67 -67
  667. data/node_modules/util-deprecate/node.js +6 -6
  668. data/node_modules/util-deprecate/package.json +27 -27
  669. data/node_modules/webidl-conversions/LICENSE.md +12 -12
  670. data/node_modules/webidl-conversions/README.md +53 -53
  671. data/node_modules/webidl-conversions/lib/index.js +189 -189
  672. data/node_modules/webidl-conversions/package.json +23 -23
  673. data/node_modules/whatwg-url/LICENSE.txt +21 -21
  674. data/node_modules/whatwg-url/README.md +67 -67
  675. data/node_modules/whatwg-url/lib/URL-impl.js +200 -200
  676. data/node_modules/whatwg-url/lib/URL.js +196 -196
  677. data/node_modules/whatwg-url/lib/public-api.js +11 -11
  678. data/node_modules/whatwg-url/lib/utils.js +20 -20
  679. data/node_modules/whatwg-url/package.json +32 -32
  680. data/node_modules/wrappy/LICENSE +15 -15
  681. data/node_modules/wrappy/README.md +36 -36
  682. data/node_modules/wrappy/package.json +29 -29
  683. data/node_modules/wrappy/wrappy.js +33 -33
  684. data/node_modules/ws/LICENSE +19 -19
  685. data/node_modules/ws/README.md +493 -493
  686. data/node_modules/ws/browser.js +8 -8
  687. data/node_modules/ws/index.js +13 -13
  688. data/node_modules/ws/lib/buffer-util.js +126 -126
  689. data/node_modules/ws/lib/constants.js +12 -12
  690. data/node_modules/ws/lib/event-target.js +266 -266
  691. data/node_modules/ws/lib/extension.js +203 -203
  692. data/node_modules/ws/lib/limiter.js +55 -55
  693. data/node_modules/ws/lib/permessage-deflate.js +511 -511
  694. data/node_modules/ws/lib/receiver.js +612 -612
  695. data/node_modules/ws/lib/sender.js +422 -422
  696. data/node_modules/ws/lib/stream.js +180 -180
  697. data/node_modules/ws/lib/subprotocol.js +62 -62
  698. data/node_modules/ws/lib/validation.js +124 -124
  699. data/node_modules/ws/lib/websocket-server.js +485 -485
  700. data/node_modules/ws/lib/websocket.js +1149 -1149
  701. data/node_modules/ws/package.json +61 -61
  702. data/node_modules/ws/wrapper.mjs +8 -8
  703. data/node_modules/yauzl/LICENSE +21 -21
  704. data/node_modules/yauzl/README.md +658 -658
  705. data/node_modules/yauzl/index.js +796 -796
  706. data/node_modules/yauzl/package.json +40 -40
  707. data/package.json +1 -1
  708. metadata +23 -25
  709. data/node_modules/devtools-protocol/changelog.md +0 -10491
  710. data/node_modules/devtools-protocol/externs/protocol_externs.js +0 -9734
@@ -1,1149 +1,1149 @@
1
- /* eslint no-unused-vars: ["error", { "varsIgnorePattern": "^Readable$" }] */
2
-
3
- 'use strict';
4
-
5
- const EventEmitter = require('events');
6
- const https = require('https');
7
- const http = require('http');
8
- const net = require('net');
9
- const tls = require('tls');
10
- const { randomBytes, createHash } = require('crypto');
11
- const { Readable } = require('stream');
12
- const { URL } = require('url');
13
-
14
- const PerMessageDeflate = require('./permessage-deflate');
15
- const Receiver = require('./receiver');
16
- const Sender = require('./sender');
17
- const {
18
- BINARY_TYPES,
19
- EMPTY_BUFFER,
20
- GUID,
21
- kForOnEventAttribute,
22
- kListener,
23
- kStatusCode,
24
- kWebSocket,
25
- NOOP
26
- } = require('./constants');
27
- const {
28
- EventTarget: { addEventListener, removeEventListener }
29
- } = require('./event-target');
30
- const { format, parse } = require('./extension');
31
- const { toBuffer } = require('./buffer-util');
32
-
33
- const readyStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'];
34
- const subprotocolRegex = /^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/;
35
- const protocolVersions = [8, 13];
36
- const closeTimeout = 30 * 1000;
37
-
38
- /**
39
- * Class representing a WebSocket.
40
- *
41
- * @extends EventEmitter
42
- */
43
- class WebSocket extends EventEmitter {
44
- /**
45
- * Create a new `WebSocket`.
46
- *
47
- * @param {(String|URL)} address The URL to which to connect
48
- * @param {(String|String[])} [protocols] The subprotocols
49
- * @param {Object} [options] Connection options
50
- */
51
- constructor(address, protocols, options) {
52
- super();
53
-
54
- this._binaryType = BINARY_TYPES[0];
55
- this._closeCode = 1006;
56
- this._closeFrameReceived = false;
57
- this._closeFrameSent = false;
58
- this._closeMessage = EMPTY_BUFFER;
59
- this._closeTimer = null;
60
- this._extensions = {};
61
- this._protocol = '';
62
- this._readyState = WebSocket.CONNECTING;
63
- this._receiver = null;
64
- this._sender = null;
65
- this._socket = null;
66
-
67
- if (address !== null) {
68
- this._bufferedAmount = 0;
69
- this._isServer = false;
70
- this._redirects = 0;
71
-
72
- if (protocols === undefined) {
73
- protocols = [];
74
- } else if (!Array.isArray(protocols)) {
75
- if (typeof protocols === 'object' && protocols !== null) {
76
- options = protocols;
77
- protocols = [];
78
- } else {
79
- protocols = [protocols];
80
- }
81
- }
82
-
83
- initAsClient(this, address, protocols, options);
84
- } else {
85
- this._isServer = true;
86
- }
87
- }
88
-
89
- /**
90
- * This deviates from the WHATWG interface since ws doesn't support the
91
- * required default "blob" type (instead we define a custom "nodebuffer"
92
- * type).
93
- *
94
- * @type {String}
95
- */
96
- get binaryType() {
97
- return this._binaryType;
98
- }
99
-
100
- set binaryType(type) {
101
- if (!BINARY_TYPES.includes(type)) return;
102
-
103
- this._binaryType = type;
104
-
105
- //
106
- // Allow to change `binaryType` on the fly.
107
- //
108
- if (this._receiver) this._receiver._binaryType = type;
109
- }
110
-
111
- /**
112
- * @type {Number}
113
- */
114
- get bufferedAmount() {
115
- if (!this._socket) return this._bufferedAmount;
116
-
117
- return this._socket._writableState.length + this._sender._bufferedBytes;
118
- }
119
-
120
- /**
121
- * @type {String}
122
- */
123
- get extensions() {
124
- return Object.keys(this._extensions).join();
125
- }
126
-
127
- /**
128
- * @type {Function}
129
- */
130
- /* istanbul ignore next */
131
- get onclose() {
132
- return null;
133
- }
134
-
135
- /**
136
- * @type {Function}
137
- */
138
- /* istanbul ignore next */
139
- get onerror() {
140
- return null;
141
- }
142
-
143
- /**
144
- * @type {Function}
145
- */
146
- /* istanbul ignore next */
147
- get onopen() {
148
- return null;
149
- }
150
-
151
- /**
152
- * @type {Function}
153
- */
154
- /* istanbul ignore next */
155
- get onmessage() {
156
- return null;
157
- }
158
-
159
- /**
160
- * @type {String}
161
- */
162
- get protocol() {
163
- return this._protocol;
164
- }
165
-
166
- /**
167
- * @type {Number}
168
- */
169
- get readyState() {
170
- return this._readyState;
171
- }
172
-
173
- /**
174
- * @type {String}
175
- */
176
- get url() {
177
- return this._url;
178
- }
179
-
180
- /**
181
- * Set up the socket and the internal resources.
182
- *
183
- * @param {(net.Socket|tls.Socket)} socket The network socket between the
184
- * server and client
185
- * @param {Buffer} head The first packet of the upgraded stream
186
- * @param {Object} options Options object
187
- * @param {Number} [options.maxPayload=0] The maximum allowed message size
188
- * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or
189
- * not to skip UTF-8 validation for text and close messages
190
- * @private
191
- */
192
- setSocket(socket, head, options) {
193
- const receiver = new Receiver({
194
- binaryType: this.binaryType,
195
- extensions: this._extensions,
196
- isServer: this._isServer,
197
- maxPayload: options.maxPayload,
198
- skipUTF8Validation: options.skipUTF8Validation
199
- });
200
-
201
- this._sender = new Sender(socket, this._extensions);
202
- this._receiver = receiver;
203
- this._socket = socket;
204
-
205
- receiver[kWebSocket] = this;
206
- socket[kWebSocket] = this;
207
-
208
- receiver.on('conclude', receiverOnConclude);
209
- receiver.on('drain', receiverOnDrain);
210
- receiver.on('error', receiverOnError);
211
- receiver.on('message', receiverOnMessage);
212
- receiver.on('ping', receiverOnPing);
213
- receiver.on('pong', receiverOnPong);
214
-
215
- socket.setTimeout(0);
216
- socket.setNoDelay();
217
-
218
- if (head.length > 0) socket.unshift(head);
219
-
220
- socket.on('close', socketOnClose);
221
- socket.on('data', socketOnData);
222
- socket.on('end', socketOnEnd);
223
- socket.on('error', socketOnError);
224
-
225
- this._readyState = WebSocket.OPEN;
226
- this.emit('open');
227
- }
228
-
229
- /**
230
- * Emit the `'close'` event.
231
- *
232
- * @private
233
- */
234
- emitClose() {
235
- if (!this._socket) {
236
- this._readyState = WebSocket.CLOSED;
237
- this.emit('close', this._closeCode, this._closeMessage);
238
- return;
239
- }
240
-
241
- if (this._extensions[PerMessageDeflate.extensionName]) {
242
- this._extensions[PerMessageDeflate.extensionName].cleanup();
243
- }
244
-
245
- this._receiver.removeAllListeners();
246
- this._readyState = WebSocket.CLOSED;
247
- this.emit('close', this._closeCode, this._closeMessage);
248
- }
249
-
250
- /**
251
- * Start a closing handshake.
252
- *
253
- * +----------+ +-----------+ +----------+
254
- * - - -|ws.close()|-->|close frame|-->|ws.close()|- - -
255
- * | +----------+ +-----------+ +----------+ |
256
- * +----------+ +-----------+ |
257
- * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING
258
- * +----------+ +-----------+ |
259
- * | | | +---+ |
260
- * +------------------------+-->|fin| - - - -
261
- * | +---+ | +---+
262
- * - - - - -|fin|<---------------------+
263
- * +---+
264
- *
265
- * @param {Number} [code] Status code explaining why the connection is closing
266
- * @param {(String|Buffer)} [data] The reason why the connection is
267
- * closing
268
- * @public
269
- */
270
- close(code, data) {
271
- if (this.readyState === WebSocket.CLOSED) return;
272
- if (this.readyState === WebSocket.CONNECTING) {
273
- const msg = 'WebSocket was closed before the connection was established';
274
- return abortHandshake(this, this._req, msg);
275
- }
276
-
277
- if (this.readyState === WebSocket.CLOSING) {
278
- if (
279
- this._closeFrameSent &&
280
- (this._closeFrameReceived || this._receiver._writableState.errorEmitted)
281
- ) {
282
- this._socket.end();
283
- }
284
-
285
- return;
286
- }
287
-
288
- this._readyState = WebSocket.CLOSING;
289
- this._sender.close(code, data, !this._isServer, (err) => {
290
- //
291
- // This error is handled by the `'error'` listener on the socket. We only
292
- // want to know if the close frame has been sent here.
293
- //
294
- if (err) return;
295
-
296
- this._closeFrameSent = true;
297
-
298
- if (
299
- this._closeFrameReceived ||
300
- this._receiver._writableState.errorEmitted
301
- ) {
302
- this._socket.end();
303
- }
304
- });
305
-
306
- //
307
- // Specify a timeout for the closing handshake to complete.
308
- //
309
- this._closeTimer = setTimeout(
310
- this._socket.destroy.bind(this._socket),
311
- closeTimeout
312
- );
313
- }
314
-
315
- /**
316
- * Send a ping.
317
- *
318
- * @param {*} [data] The data to send
319
- * @param {Boolean} [mask] Indicates whether or not to mask `data`
320
- * @param {Function} [cb] Callback which is executed when the ping is sent
321
- * @public
322
- */
323
- ping(data, mask, cb) {
324
- if (this.readyState === WebSocket.CONNECTING) {
325
- throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');
326
- }
327
-
328
- if (typeof data === 'function') {
329
- cb = data;
330
- data = mask = undefined;
331
- } else if (typeof mask === 'function') {
332
- cb = mask;
333
- mask = undefined;
334
- }
335
-
336
- if (typeof data === 'number') data = data.toString();
337
-
338
- if (this.readyState !== WebSocket.OPEN) {
339
- sendAfterClose(this, data, cb);
340
- return;
341
- }
342
-
343
- if (mask === undefined) mask = !this._isServer;
344
- this._sender.ping(data || EMPTY_BUFFER, mask, cb);
345
- }
346
-
347
- /**
348
- * Send a pong.
349
- *
350
- * @param {*} [data] The data to send
351
- * @param {Boolean} [mask] Indicates whether or not to mask `data`
352
- * @param {Function} [cb] Callback which is executed when the pong is sent
353
- * @public
354
- */
355
- pong(data, mask, cb) {
356
- if (this.readyState === WebSocket.CONNECTING) {
357
- throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');
358
- }
359
-
360
- if (typeof data === 'function') {
361
- cb = data;
362
- data = mask = undefined;
363
- } else if (typeof mask === 'function') {
364
- cb = mask;
365
- mask = undefined;
366
- }
367
-
368
- if (typeof data === 'number') data = data.toString();
369
-
370
- if (this.readyState !== WebSocket.OPEN) {
371
- sendAfterClose(this, data, cb);
372
- return;
373
- }
374
-
375
- if (mask === undefined) mask = !this._isServer;
376
- this._sender.pong(data || EMPTY_BUFFER, mask, cb);
377
- }
378
-
379
- /**
380
- * Send a data message.
381
- *
382
- * @param {*} data The message to send
383
- * @param {Object} [options] Options object
384
- * @param {Boolean} [options.binary] Specifies whether `data` is binary or
385
- * text
386
- * @param {Boolean} [options.compress] Specifies whether or not to compress
387
- * `data`
388
- * @param {Boolean} [options.fin=true] Specifies whether the fragment is the
389
- * last one
390
- * @param {Boolean} [options.mask] Specifies whether or not to mask `data`
391
- * @param {Function} [cb] Callback which is executed when data is written out
392
- * @public
393
- */
394
- send(data, options, cb) {
395
- if (this.readyState === WebSocket.CONNECTING) {
396
- throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');
397
- }
398
-
399
- if (typeof options === 'function') {
400
- cb = options;
401
- options = {};
402
- }
403
-
404
- if (typeof data === 'number') data = data.toString();
405
-
406
- if (this.readyState !== WebSocket.OPEN) {
407
- sendAfterClose(this, data, cb);
408
- return;
409
- }
410
-
411
- const opts = {
412
- binary: typeof data !== 'string',
413
- mask: !this._isServer,
414
- compress: true,
415
- fin: true,
416
- ...options
417
- };
418
-
419
- if (!this._extensions[PerMessageDeflate.extensionName]) {
420
- opts.compress = false;
421
- }
422
-
423
- this._sender.send(data || EMPTY_BUFFER, opts, cb);
424
- }
425
-
426
- /**
427
- * Forcibly close the connection.
428
- *
429
- * @public
430
- */
431
- terminate() {
432
- if (this.readyState === WebSocket.CLOSED) return;
433
- if (this.readyState === WebSocket.CONNECTING) {
434
- const msg = 'WebSocket was closed before the connection was established';
435
- return abortHandshake(this, this._req, msg);
436
- }
437
-
438
- if (this._socket) {
439
- this._readyState = WebSocket.CLOSING;
440
- this._socket.destroy();
441
- }
442
- }
443
- }
444
-
445
- /**
446
- * @constant {Number} CONNECTING
447
- * @memberof WebSocket
448
- */
449
- Object.defineProperty(WebSocket, 'CONNECTING', {
450
- enumerable: true,
451
- value: readyStates.indexOf('CONNECTING')
452
- });
453
-
454
- /**
455
- * @constant {Number} CONNECTING
456
- * @memberof WebSocket.prototype
457
- */
458
- Object.defineProperty(WebSocket.prototype, 'CONNECTING', {
459
- enumerable: true,
460
- value: readyStates.indexOf('CONNECTING')
461
- });
462
-
463
- /**
464
- * @constant {Number} OPEN
465
- * @memberof WebSocket
466
- */
467
- Object.defineProperty(WebSocket, 'OPEN', {
468
- enumerable: true,
469
- value: readyStates.indexOf('OPEN')
470
- });
471
-
472
- /**
473
- * @constant {Number} OPEN
474
- * @memberof WebSocket.prototype
475
- */
476
- Object.defineProperty(WebSocket.prototype, 'OPEN', {
477
- enumerable: true,
478
- value: readyStates.indexOf('OPEN')
479
- });
480
-
481
- /**
482
- * @constant {Number} CLOSING
483
- * @memberof WebSocket
484
- */
485
- Object.defineProperty(WebSocket, 'CLOSING', {
486
- enumerable: true,
487
- value: readyStates.indexOf('CLOSING')
488
- });
489
-
490
- /**
491
- * @constant {Number} CLOSING
492
- * @memberof WebSocket.prototype
493
- */
494
- Object.defineProperty(WebSocket.prototype, 'CLOSING', {
495
- enumerable: true,
496
- value: readyStates.indexOf('CLOSING')
497
- });
498
-
499
- /**
500
- * @constant {Number} CLOSED
501
- * @memberof WebSocket
502
- */
503
- Object.defineProperty(WebSocket, 'CLOSED', {
504
- enumerable: true,
505
- value: readyStates.indexOf('CLOSED')
506
- });
507
-
508
- /**
509
- * @constant {Number} CLOSED
510
- * @memberof WebSocket.prototype
511
- */
512
- Object.defineProperty(WebSocket.prototype, 'CLOSED', {
513
- enumerable: true,
514
- value: readyStates.indexOf('CLOSED')
515
- });
516
-
517
- [
518
- 'binaryType',
519
- 'bufferedAmount',
520
- 'extensions',
521
- 'protocol',
522
- 'readyState',
523
- 'url'
524
- ].forEach((property) => {
525
- Object.defineProperty(WebSocket.prototype, property, { enumerable: true });
526
- });
527
-
528
- //
529
- // Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes.
530
- // See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface
531
- //
532
- ['open', 'error', 'close', 'message'].forEach((method) => {
533
- Object.defineProperty(WebSocket.prototype, `on${method}`, {
534
- enumerable: true,
535
- get() {
536
- for (const listener of this.listeners(method)) {
537
- if (listener[kForOnEventAttribute]) return listener[kListener];
538
- }
539
-
540
- return null;
541
- },
542
- set(handler) {
543
- for (const listener of this.listeners(method)) {
544
- if (listener[kForOnEventAttribute]) {
545
- this.removeListener(method, listener);
546
- break;
547
- }
548
- }
549
-
550
- if (typeof handler !== 'function') return;
551
-
552
- this.addEventListener(method, handler, {
553
- [kForOnEventAttribute]: true
554
- });
555
- }
556
- });
557
- });
558
-
559
- WebSocket.prototype.addEventListener = addEventListener;
560
- WebSocket.prototype.removeEventListener = removeEventListener;
561
-
562
- module.exports = WebSocket;
563
-
564
- /**
565
- * Initialize a WebSocket client.
566
- *
567
- * @param {WebSocket} websocket The client to initialize
568
- * @param {(String|URL)} address The URL to which to connect
569
- * @param {Array} protocols The subprotocols
570
- * @param {Object} [options] Connection options
571
- * @param {Boolean} [options.followRedirects=false] Whether or not to follow
572
- * redirects
573
- * @param {Number} [options.handshakeTimeout] Timeout in milliseconds for the
574
- * handshake request
575
- * @param {Number} [options.maxPayload=104857600] The maximum allowed message
576
- * size
577
- * @param {Number} [options.maxRedirects=10] The maximum number of redirects
578
- * allowed
579
- * @param {String} [options.origin] Value of the `Origin` or
580
- * `Sec-WebSocket-Origin` header
581
- * @param {(Boolean|Object)} [options.perMessageDeflate=true] Enable/disable
582
- * permessage-deflate
583
- * @param {Number} [options.protocolVersion=13] Value of the
584
- * `Sec-WebSocket-Version` header
585
- * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or
586
- * not to skip UTF-8 validation for text and close messages
587
- * @private
588
- */
589
- function initAsClient(websocket, address, protocols, options) {
590
- const opts = {
591
- protocolVersion: protocolVersions[1],
592
- maxPayload: 100 * 1024 * 1024,
593
- skipUTF8Validation: false,
594
- perMessageDeflate: true,
595
- followRedirects: false,
596
- maxRedirects: 10,
597
- ...options,
598
- createConnection: undefined,
599
- socketPath: undefined,
600
- hostname: undefined,
601
- protocol: undefined,
602
- timeout: undefined,
603
- method: undefined,
604
- host: undefined,
605
- path: undefined,
606
- port: undefined
607
- };
608
-
609
- if (!protocolVersions.includes(opts.protocolVersion)) {
610
- throw new RangeError(
611
- `Unsupported protocol version: ${opts.protocolVersion} ` +
612
- `(supported versions: ${protocolVersions.join(', ')})`
613
- );
614
- }
615
-
616
- let parsedUrl;
617
-
618
- if (address instanceof URL) {
619
- parsedUrl = address;
620
- websocket._url = address.href;
621
- } else {
622
- try {
623
- parsedUrl = new URL(address);
624
- } catch (e) {
625
- throw new SyntaxError(`Invalid URL: ${address}`);
626
- }
627
-
628
- websocket._url = address;
629
- }
630
-
631
- const isSecure = parsedUrl.protocol === 'wss:';
632
- const isUnixSocket = parsedUrl.protocol === 'ws+unix:';
633
-
634
- if (parsedUrl.protocol !== 'ws:' && !isSecure && !isUnixSocket) {
635
- throw new SyntaxError(
636
- 'The URL\'s protocol must be one of "ws:", "wss:", or "ws+unix:"'
637
- );
638
- }
639
-
640
- if (isUnixSocket && !parsedUrl.pathname) {
641
- throw new SyntaxError("The URL's pathname is empty");
642
- }
643
-
644
- if (parsedUrl.hash) {
645
- throw new SyntaxError('The URL contains a fragment identifier');
646
- }
647
-
648
- const defaultPort = isSecure ? 443 : 80;
649
- const key = randomBytes(16).toString('base64');
650
- const get = isSecure ? https.get : http.get;
651
- const protocolSet = new Set();
652
- let perMessageDeflate;
653
-
654
- opts.createConnection = isSecure ? tlsConnect : netConnect;
655
- opts.defaultPort = opts.defaultPort || defaultPort;
656
- opts.port = parsedUrl.port || defaultPort;
657
- opts.host = parsedUrl.hostname.startsWith('[')
658
- ? parsedUrl.hostname.slice(1, -1)
659
- : parsedUrl.hostname;
660
- opts.headers = {
661
- 'Sec-WebSocket-Version': opts.protocolVersion,
662
- 'Sec-WebSocket-Key': key,
663
- Connection: 'Upgrade',
664
- Upgrade: 'websocket',
665
- ...opts.headers
666
- };
667
- opts.path = parsedUrl.pathname + parsedUrl.search;
668
- opts.timeout = opts.handshakeTimeout;
669
-
670
- if (opts.perMessageDeflate) {
671
- perMessageDeflate = new PerMessageDeflate(
672
- opts.perMessageDeflate !== true ? opts.perMessageDeflate : {},
673
- false,
674
- opts.maxPayload
675
- );
676
- opts.headers['Sec-WebSocket-Extensions'] = format({
677
- [PerMessageDeflate.extensionName]: perMessageDeflate.offer()
678
- });
679
- }
680
- if (protocols.length) {
681
- for (const protocol of protocols) {
682
- if (
683
- typeof protocol !== 'string' ||
684
- !subprotocolRegex.test(protocol) ||
685
- protocolSet.has(protocol)
686
- ) {
687
- throw new SyntaxError(
688
- 'An invalid or duplicated subprotocol was specified'
689
- );
690
- }
691
-
692
- protocolSet.add(protocol);
693
- }
694
-
695
- opts.headers['Sec-WebSocket-Protocol'] = protocols.join(',');
696
- }
697
- if (opts.origin) {
698
- if (opts.protocolVersion < 13) {
699
- opts.headers['Sec-WebSocket-Origin'] = opts.origin;
700
- } else {
701
- opts.headers.Origin = opts.origin;
702
- }
703
- }
704
- if (parsedUrl.username || parsedUrl.password) {
705
- opts.auth = `${parsedUrl.username}:${parsedUrl.password}`;
706
- }
707
-
708
- if (isUnixSocket) {
709
- const parts = opts.path.split(':');
710
-
711
- opts.socketPath = parts[0];
712
- opts.path = parts[1];
713
- }
714
-
715
- let req = (websocket._req = get(opts));
716
-
717
- if (opts.timeout) {
718
- req.on('timeout', () => {
719
- abortHandshake(websocket, req, 'Opening handshake has timed out');
720
- });
721
- }
722
-
723
- req.on('error', (err) => {
724
- if (req === null || req.aborted) return;
725
-
726
- req = websocket._req = null;
727
- websocket._readyState = WebSocket.CLOSING;
728
- websocket.emit('error', err);
729
- websocket.emitClose();
730
- });
731
-
732
- req.on('response', (res) => {
733
- const location = res.headers.location;
734
- const statusCode = res.statusCode;
735
-
736
- if (
737
- location &&
738
- opts.followRedirects &&
739
- statusCode >= 300 &&
740
- statusCode < 400
741
- ) {
742
- if (++websocket._redirects > opts.maxRedirects) {
743
- abortHandshake(websocket, req, 'Maximum redirects exceeded');
744
- return;
745
- }
746
-
747
- req.abort();
748
-
749
- const addr = new URL(location, address);
750
-
751
- initAsClient(websocket, addr, protocols, options);
752
- } else if (!websocket.emit('unexpected-response', req, res)) {
753
- abortHandshake(
754
- websocket,
755
- req,
756
- `Unexpected server response: ${res.statusCode}`
757
- );
758
- }
759
- });
760
-
761
- req.on('upgrade', (res, socket, head) => {
762
- websocket.emit('upgrade', res);
763
-
764
- //
765
- // The user may have closed the connection from a listener of the `upgrade`
766
- // event.
767
- //
768
- if (websocket.readyState !== WebSocket.CONNECTING) return;
769
-
770
- req = websocket._req = null;
771
-
772
- const digest = createHash('sha1')
773
- .update(key + GUID)
774
- .digest('base64');
775
-
776
- if (res.headers['sec-websocket-accept'] !== digest) {
777
- abortHandshake(websocket, socket, 'Invalid Sec-WebSocket-Accept header');
778
- return;
779
- }
780
-
781
- const serverProt = res.headers['sec-websocket-protocol'];
782
- let protError;
783
-
784
- if (serverProt !== undefined) {
785
- if (!protocolSet.size) {
786
- protError = 'Server sent a subprotocol but none was requested';
787
- } else if (!protocolSet.has(serverProt)) {
788
- protError = 'Server sent an invalid subprotocol';
789
- }
790
- } else if (protocolSet.size) {
791
- protError = 'Server sent no subprotocol';
792
- }
793
-
794
- if (protError) {
795
- abortHandshake(websocket, socket, protError);
796
- return;
797
- }
798
-
799
- if (serverProt) websocket._protocol = serverProt;
800
-
801
- const secWebSocketExtensions = res.headers['sec-websocket-extensions'];
802
-
803
- if (secWebSocketExtensions !== undefined) {
804
- if (!perMessageDeflate) {
805
- const message =
806
- 'Server sent a Sec-WebSocket-Extensions header but no extension ' +
807
- 'was requested';
808
- abortHandshake(websocket, socket, message);
809
- return;
810
- }
811
-
812
- let extensions;
813
-
814
- try {
815
- extensions = parse(secWebSocketExtensions);
816
- } catch (err) {
817
- const message = 'Invalid Sec-WebSocket-Extensions header';
818
- abortHandshake(websocket, socket, message);
819
- return;
820
- }
821
-
822
- const extensionNames = Object.keys(extensions);
823
-
824
- if (
825
- extensionNames.length !== 1 ||
826
- extensionNames[0] !== PerMessageDeflate.extensionName
827
- ) {
828
- const message = 'Server indicated an extension that was not requested';
829
- abortHandshake(websocket, socket, message);
830
- return;
831
- }
832
-
833
- try {
834
- perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]);
835
- } catch (err) {
836
- const message = 'Invalid Sec-WebSocket-Extensions header';
837
- abortHandshake(websocket, socket, message);
838
- return;
839
- }
840
-
841
- websocket._extensions[PerMessageDeflate.extensionName] =
842
- perMessageDeflate;
843
- }
844
-
845
- websocket.setSocket(socket, head, {
846
- maxPayload: opts.maxPayload,
847
- skipUTF8Validation: opts.skipUTF8Validation
848
- });
849
- });
850
- }
851
-
852
- /**
853
- * Create a `net.Socket` and initiate a connection.
854
- *
855
- * @param {Object} options Connection options
856
- * @return {net.Socket} The newly created socket used to start the connection
857
- * @private
858
- */
859
- function netConnect(options) {
860
- options.path = options.socketPath;
861
- return net.connect(options);
862
- }
863
-
864
- /**
865
- * Create a `tls.TLSSocket` and initiate a connection.
866
- *
867
- * @param {Object} options Connection options
868
- * @return {tls.TLSSocket} The newly created socket used to start the connection
869
- * @private
870
- */
871
- function tlsConnect(options) {
872
- options.path = undefined;
873
-
874
- if (!options.servername && options.servername !== '') {
875
- options.servername = net.isIP(options.host) ? '' : options.host;
876
- }
877
-
878
- return tls.connect(options);
879
- }
880
-
881
- /**
882
- * Abort the handshake and emit an error.
883
- *
884
- * @param {WebSocket} websocket The WebSocket instance
885
- * @param {(http.ClientRequest|net.Socket|tls.Socket)} stream The request to
886
- * abort or the socket to destroy
887
- * @param {String} message The error message
888
- * @private
889
- */
890
- function abortHandshake(websocket, stream, message) {
891
- websocket._readyState = WebSocket.CLOSING;
892
-
893
- const err = new Error(message);
894
- Error.captureStackTrace(err, abortHandshake);
895
-
896
- if (stream.setHeader) {
897
- stream.abort();
898
-
899
- if (stream.socket && !stream.socket.destroyed) {
900
- //
901
- // On Node.js >= 14.3.0 `request.abort()` does not destroy the socket if
902
- // called after the request completed. See
903
- // https://github.com/websockets/ws/issues/1869.
904
- //
905
- stream.socket.destroy();
906
- }
907
-
908
- stream.once('abort', websocket.emitClose.bind(websocket));
909
- websocket.emit('error', err);
910
- } else {
911
- stream.destroy(err);
912
- stream.once('error', websocket.emit.bind(websocket, 'error'));
913
- stream.once('close', websocket.emitClose.bind(websocket));
914
- }
915
- }
916
-
917
- /**
918
- * Handle cases where the `ping()`, `pong()`, or `send()` methods are called
919
- * when the `readyState` attribute is `CLOSING` or `CLOSED`.
920
- *
921
- * @param {WebSocket} websocket The WebSocket instance
922
- * @param {*} [data] The data to send
923
- * @param {Function} [cb] Callback
924
- * @private
925
- */
926
- function sendAfterClose(websocket, data, cb) {
927
- if (data) {
928
- const length = toBuffer(data).length;
929
-
930
- //
931
- // The `_bufferedAmount` property is used only when the peer is a client and
932
- // the opening handshake fails. Under these circumstances, in fact, the
933
- // `setSocket()` method is not called, so the `_socket` and `_sender`
934
- // properties are set to `null`.
935
- //
936
- if (websocket._socket) websocket._sender._bufferedBytes += length;
937
- else websocket._bufferedAmount += length;
938
- }
939
-
940
- if (cb) {
941
- const err = new Error(
942
- `WebSocket is not open: readyState ${websocket.readyState} ` +
943
- `(${readyStates[websocket.readyState]})`
944
- );
945
- cb(err);
946
- }
947
- }
948
-
949
- /**
950
- * The listener of the `Receiver` `'conclude'` event.
951
- *
952
- * @param {Number} code The status code
953
- * @param {Buffer} reason The reason for closing
954
- * @private
955
- */
956
- function receiverOnConclude(code, reason) {
957
- const websocket = this[kWebSocket];
958
-
959
- websocket._closeFrameReceived = true;
960
- websocket._closeMessage = reason;
961
- websocket._closeCode = code;
962
-
963
- if (websocket._socket[kWebSocket] === undefined) return;
964
-
965
- websocket._socket.removeListener('data', socketOnData);
966
- process.nextTick(resume, websocket._socket);
967
-
968
- if (code === 1005) websocket.close();
969
- else websocket.close(code, reason);
970
- }
971
-
972
- /**
973
- * The listener of the `Receiver` `'drain'` event.
974
- *
975
- * @private
976
- */
977
- function receiverOnDrain() {
978
- this[kWebSocket]._socket.resume();
979
- }
980
-
981
- /**
982
- * The listener of the `Receiver` `'error'` event.
983
- *
984
- * @param {(RangeError|Error)} err The emitted error
985
- * @private
986
- */
987
- function receiverOnError(err) {
988
- const websocket = this[kWebSocket];
989
-
990
- if (websocket._socket[kWebSocket] !== undefined) {
991
- websocket._socket.removeListener('data', socketOnData);
992
-
993
- //
994
- // On Node.js < 14.0.0 the `'error'` event is emitted synchronously. See
995
- // https://github.com/websockets/ws/issues/1940.
996
- //
997
- process.nextTick(resume, websocket._socket);
998
-
999
- websocket.close(err[kStatusCode]);
1000
- }
1001
-
1002
- websocket.emit('error', err);
1003
- }
1004
-
1005
- /**
1006
- * The listener of the `Receiver` `'finish'` event.
1007
- *
1008
- * @private
1009
- */
1010
- function receiverOnFinish() {
1011
- this[kWebSocket].emitClose();
1012
- }
1013
-
1014
- /**
1015
- * The listener of the `Receiver` `'message'` event.
1016
- *
1017
- * @param {Buffer|ArrayBuffer|Buffer[])} data The message
1018
- * @param {Boolean} isBinary Specifies whether the message is binary or not
1019
- * @private
1020
- */
1021
- function receiverOnMessage(data, isBinary) {
1022
- this[kWebSocket].emit('message', data, isBinary);
1023
- }
1024
-
1025
- /**
1026
- * The listener of the `Receiver` `'ping'` event.
1027
- *
1028
- * @param {Buffer} data The data included in the ping frame
1029
- * @private
1030
- */
1031
- function receiverOnPing(data) {
1032
- const websocket = this[kWebSocket];
1033
-
1034
- websocket.pong(data, !websocket._isServer, NOOP);
1035
- websocket.emit('ping', data);
1036
- }
1037
-
1038
- /**
1039
- * The listener of the `Receiver` `'pong'` event.
1040
- *
1041
- * @param {Buffer} data The data included in the pong frame
1042
- * @private
1043
- */
1044
- function receiverOnPong(data) {
1045
- this[kWebSocket].emit('pong', data);
1046
- }
1047
-
1048
- /**
1049
- * Resume a readable stream
1050
- *
1051
- * @param {Readable} stream The readable stream
1052
- * @private
1053
- */
1054
- function resume(stream) {
1055
- stream.resume();
1056
- }
1057
-
1058
- /**
1059
- * The listener of the `net.Socket` `'close'` event.
1060
- *
1061
- * @private
1062
- */
1063
- function socketOnClose() {
1064
- const websocket = this[kWebSocket];
1065
-
1066
- this.removeListener('close', socketOnClose);
1067
- this.removeListener('data', socketOnData);
1068
- this.removeListener('end', socketOnEnd);
1069
-
1070
- websocket._readyState = WebSocket.CLOSING;
1071
-
1072
- let chunk;
1073
-
1074
- //
1075
- // The close frame might not have been received or the `'end'` event emitted,
1076
- // for example, if the socket was destroyed due to an error. Ensure that the
1077
- // `receiver` stream is closed after writing any remaining buffered data to
1078
- // it. If the readable side of the socket is in flowing mode then there is no
1079
- // buffered data as everything has been already written and `readable.read()`
1080
- // will return `null`. If instead, the socket is paused, any possible buffered
1081
- // data will be read as a single chunk.
1082
- //
1083
- if (
1084
- !this._readableState.endEmitted &&
1085
- !websocket._closeFrameReceived &&
1086
- !websocket._receiver._writableState.errorEmitted &&
1087
- (chunk = websocket._socket.read()) !== null
1088
- ) {
1089
- websocket._receiver.write(chunk);
1090
- }
1091
-
1092
- websocket._receiver.end();
1093
-
1094
- this[kWebSocket] = undefined;
1095
-
1096
- clearTimeout(websocket._closeTimer);
1097
-
1098
- if (
1099
- websocket._receiver._writableState.finished ||
1100
- websocket._receiver._writableState.errorEmitted
1101
- ) {
1102
- websocket.emitClose();
1103
- } else {
1104
- websocket._receiver.on('error', receiverOnFinish);
1105
- websocket._receiver.on('finish', receiverOnFinish);
1106
- }
1107
- }
1108
-
1109
- /**
1110
- * The listener of the `net.Socket` `'data'` event.
1111
- *
1112
- * @param {Buffer} chunk A chunk of data
1113
- * @private
1114
- */
1115
- function socketOnData(chunk) {
1116
- if (!this[kWebSocket]._receiver.write(chunk)) {
1117
- this.pause();
1118
- }
1119
- }
1120
-
1121
- /**
1122
- * The listener of the `net.Socket` `'end'` event.
1123
- *
1124
- * @private
1125
- */
1126
- function socketOnEnd() {
1127
- const websocket = this[kWebSocket];
1128
-
1129
- websocket._readyState = WebSocket.CLOSING;
1130
- websocket._receiver.end();
1131
- this.end();
1132
- }
1133
-
1134
- /**
1135
- * The listener of the `net.Socket` `'error'` event.
1136
- *
1137
- * @private
1138
- */
1139
- function socketOnError() {
1140
- const websocket = this[kWebSocket];
1141
-
1142
- this.removeListener('error', socketOnError);
1143
- this.on('error', NOOP);
1144
-
1145
- if (websocket) {
1146
- websocket._readyState = WebSocket.CLOSING;
1147
- this.destroy();
1148
- }
1149
- }
1
+ /* eslint no-unused-vars: ["error", { "varsIgnorePattern": "^Readable$" }] */
2
+
3
+ 'use strict';
4
+
5
+ const EventEmitter = require('events');
6
+ const https = require('https');
7
+ const http = require('http');
8
+ const net = require('net');
9
+ const tls = require('tls');
10
+ const { randomBytes, createHash } = require('crypto');
11
+ const { Readable } = require('stream');
12
+ const { URL } = require('url');
13
+
14
+ const PerMessageDeflate = require('./permessage-deflate');
15
+ const Receiver = require('./receiver');
16
+ const Sender = require('./sender');
17
+ const {
18
+ BINARY_TYPES,
19
+ EMPTY_BUFFER,
20
+ GUID,
21
+ kForOnEventAttribute,
22
+ kListener,
23
+ kStatusCode,
24
+ kWebSocket,
25
+ NOOP
26
+ } = require('./constants');
27
+ const {
28
+ EventTarget: { addEventListener, removeEventListener }
29
+ } = require('./event-target');
30
+ const { format, parse } = require('./extension');
31
+ const { toBuffer } = require('./buffer-util');
32
+
33
+ const readyStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'];
34
+ const subprotocolRegex = /^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/;
35
+ const protocolVersions = [8, 13];
36
+ const closeTimeout = 30 * 1000;
37
+
38
+ /**
39
+ * Class representing a WebSocket.
40
+ *
41
+ * @extends EventEmitter
42
+ */
43
+ class WebSocket extends EventEmitter {
44
+ /**
45
+ * Create a new `WebSocket`.
46
+ *
47
+ * @param {(String|URL)} address The URL to which to connect
48
+ * @param {(String|String[])} [protocols] The subprotocols
49
+ * @param {Object} [options] Connection options
50
+ */
51
+ constructor(address, protocols, options) {
52
+ super();
53
+
54
+ this._binaryType = BINARY_TYPES[0];
55
+ this._closeCode = 1006;
56
+ this._closeFrameReceived = false;
57
+ this._closeFrameSent = false;
58
+ this._closeMessage = EMPTY_BUFFER;
59
+ this._closeTimer = null;
60
+ this._extensions = {};
61
+ this._protocol = '';
62
+ this._readyState = WebSocket.CONNECTING;
63
+ this._receiver = null;
64
+ this._sender = null;
65
+ this._socket = null;
66
+
67
+ if (address !== null) {
68
+ this._bufferedAmount = 0;
69
+ this._isServer = false;
70
+ this._redirects = 0;
71
+
72
+ if (protocols === undefined) {
73
+ protocols = [];
74
+ } else if (!Array.isArray(protocols)) {
75
+ if (typeof protocols === 'object' && protocols !== null) {
76
+ options = protocols;
77
+ protocols = [];
78
+ } else {
79
+ protocols = [protocols];
80
+ }
81
+ }
82
+
83
+ initAsClient(this, address, protocols, options);
84
+ } else {
85
+ this._isServer = true;
86
+ }
87
+ }
88
+
89
+ /**
90
+ * This deviates from the WHATWG interface since ws doesn't support the
91
+ * required default "blob" type (instead we define a custom "nodebuffer"
92
+ * type).
93
+ *
94
+ * @type {String}
95
+ */
96
+ get binaryType() {
97
+ return this._binaryType;
98
+ }
99
+
100
+ set binaryType(type) {
101
+ if (!BINARY_TYPES.includes(type)) return;
102
+
103
+ this._binaryType = type;
104
+
105
+ //
106
+ // Allow to change `binaryType` on the fly.
107
+ //
108
+ if (this._receiver) this._receiver._binaryType = type;
109
+ }
110
+
111
+ /**
112
+ * @type {Number}
113
+ */
114
+ get bufferedAmount() {
115
+ if (!this._socket) return this._bufferedAmount;
116
+
117
+ return this._socket._writableState.length + this._sender._bufferedBytes;
118
+ }
119
+
120
+ /**
121
+ * @type {String}
122
+ */
123
+ get extensions() {
124
+ return Object.keys(this._extensions).join();
125
+ }
126
+
127
+ /**
128
+ * @type {Function}
129
+ */
130
+ /* istanbul ignore next */
131
+ get onclose() {
132
+ return null;
133
+ }
134
+
135
+ /**
136
+ * @type {Function}
137
+ */
138
+ /* istanbul ignore next */
139
+ get onerror() {
140
+ return null;
141
+ }
142
+
143
+ /**
144
+ * @type {Function}
145
+ */
146
+ /* istanbul ignore next */
147
+ get onopen() {
148
+ return null;
149
+ }
150
+
151
+ /**
152
+ * @type {Function}
153
+ */
154
+ /* istanbul ignore next */
155
+ get onmessage() {
156
+ return null;
157
+ }
158
+
159
+ /**
160
+ * @type {String}
161
+ */
162
+ get protocol() {
163
+ return this._protocol;
164
+ }
165
+
166
+ /**
167
+ * @type {Number}
168
+ */
169
+ get readyState() {
170
+ return this._readyState;
171
+ }
172
+
173
+ /**
174
+ * @type {String}
175
+ */
176
+ get url() {
177
+ return this._url;
178
+ }
179
+
180
+ /**
181
+ * Set up the socket and the internal resources.
182
+ *
183
+ * @param {(net.Socket|tls.Socket)} socket The network socket between the
184
+ * server and client
185
+ * @param {Buffer} head The first packet of the upgraded stream
186
+ * @param {Object} options Options object
187
+ * @param {Number} [options.maxPayload=0] The maximum allowed message size
188
+ * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or
189
+ * not to skip UTF-8 validation for text and close messages
190
+ * @private
191
+ */
192
+ setSocket(socket, head, options) {
193
+ const receiver = new Receiver({
194
+ binaryType: this.binaryType,
195
+ extensions: this._extensions,
196
+ isServer: this._isServer,
197
+ maxPayload: options.maxPayload,
198
+ skipUTF8Validation: options.skipUTF8Validation
199
+ });
200
+
201
+ this._sender = new Sender(socket, this._extensions);
202
+ this._receiver = receiver;
203
+ this._socket = socket;
204
+
205
+ receiver[kWebSocket] = this;
206
+ socket[kWebSocket] = this;
207
+
208
+ receiver.on('conclude', receiverOnConclude);
209
+ receiver.on('drain', receiverOnDrain);
210
+ receiver.on('error', receiverOnError);
211
+ receiver.on('message', receiverOnMessage);
212
+ receiver.on('ping', receiverOnPing);
213
+ receiver.on('pong', receiverOnPong);
214
+
215
+ socket.setTimeout(0);
216
+ socket.setNoDelay();
217
+
218
+ if (head.length > 0) socket.unshift(head);
219
+
220
+ socket.on('close', socketOnClose);
221
+ socket.on('data', socketOnData);
222
+ socket.on('end', socketOnEnd);
223
+ socket.on('error', socketOnError);
224
+
225
+ this._readyState = WebSocket.OPEN;
226
+ this.emit('open');
227
+ }
228
+
229
+ /**
230
+ * Emit the `'close'` event.
231
+ *
232
+ * @private
233
+ */
234
+ emitClose() {
235
+ if (!this._socket) {
236
+ this._readyState = WebSocket.CLOSED;
237
+ this.emit('close', this._closeCode, this._closeMessage);
238
+ return;
239
+ }
240
+
241
+ if (this._extensions[PerMessageDeflate.extensionName]) {
242
+ this._extensions[PerMessageDeflate.extensionName].cleanup();
243
+ }
244
+
245
+ this._receiver.removeAllListeners();
246
+ this._readyState = WebSocket.CLOSED;
247
+ this.emit('close', this._closeCode, this._closeMessage);
248
+ }
249
+
250
+ /**
251
+ * Start a closing handshake.
252
+ *
253
+ * +----------+ +-----------+ +----------+
254
+ * - - -|ws.close()|-->|close frame|-->|ws.close()|- - -
255
+ * | +----------+ +-----------+ +----------+ |
256
+ * +----------+ +-----------+ |
257
+ * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING
258
+ * +----------+ +-----------+ |
259
+ * | | | +---+ |
260
+ * +------------------------+-->|fin| - - - -
261
+ * | +---+ | +---+
262
+ * - - - - -|fin|<---------------------+
263
+ * +---+
264
+ *
265
+ * @param {Number} [code] Status code explaining why the connection is closing
266
+ * @param {(String|Buffer)} [data] The reason why the connection is
267
+ * closing
268
+ * @public
269
+ */
270
+ close(code, data) {
271
+ if (this.readyState === WebSocket.CLOSED) return;
272
+ if (this.readyState === WebSocket.CONNECTING) {
273
+ const msg = 'WebSocket was closed before the connection was established';
274
+ return abortHandshake(this, this._req, msg);
275
+ }
276
+
277
+ if (this.readyState === WebSocket.CLOSING) {
278
+ if (
279
+ this._closeFrameSent &&
280
+ (this._closeFrameReceived || this._receiver._writableState.errorEmitted)
281
+ ) {
282
+ this._socket.end();
283
+ }
284
+
285
+ return;
286
+ }
287
+
288
+ this._readyState = WebSocket.CLOSING;
289
+ this._sender.close(code, data, !this._isServer, (err) => {
290
+ //
291
+ // This error is handled by the `'error'` listener on the socket. We only
292
+ // want to know if the close frame has been sent here.
293
+ //
294
+ if (err) return;
295
+
296
+ this._closeFrameSent = true;
297
+
298
+ if (
299
+ this._closeFrameReceived ||
300
+ this._receiver._writableState.errorEmitted
301
+ ) {
302
+ this._socket.end();
303
+ }
304
+ });
305
+
306
+ //
307
+ // Specify a timeout for the closing handshake to complete.
308
+ //
309
+ this._closeTimer = setTimeout(
310
+ this._socket.destroy.bind(this._socket),
311
+ closeTimeout
312
+ );
313
+ }
314
+
315
+ /**
316
+ * Send a ping.
317
+ *
318
+ * @param {*} [data] The data to send
319
+ * @param {Boolean} [mask] Indicates whether or not to mask `data`
320
+ * @param {Function} [cb] Callback which is executed when the ping is sent
321
+ * @public
322
+ */
323
+ ping(data, mask, cb) {
324
+ if (this.readyState === WebSocket.CONNECTING) {
325
+ throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');
326
+ }
327
+
328
+ if (typeof data === 'function') {
329
+ cb = data;
330
+ data = mask = undefined;
331
+ } else if (typeof mask === 'function') {
332
+ cb = mask;
333
+ mask = undefined;
334
+ }
335
+
336
+ if (typeof data === 'number') data = data.toString();
337
+
338
+ if (this.readyState !== WebSocket.OPEN) {
339
+ sendAfterClose(this, data, cb);
340
+ return;
341
+ }
342
+
343
+ if (mask === undefined) mask = !this._isServer;
344
+ this._sender.ping(data || EMPTY_BUFFER, mask, cb);
345
+ }
346
+
347
+ /**
348
+ * Send a pong.
349
+ *
350
+ * @param {*} [data] The data to send
351
+ * @param {Boolean} [mask] Indicates whether or not to mask `data`
352
+ * @param {Function} [cb] Callback which is executed when the pong is sent
353
+ * @public
354
+ */
355
+ pong(data, mask, cb) {
356
+ if (this.readyState === WebSocket.CONNECTING) {
357
+ throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');
358
+ }
359
+
360
+ if (typeof data === 'function') {
361
+ cb = data;
362
+ data = mask = undefined;
363
+ } else if (typeof mask === 'function') {
364
+ cb = mask;
365
+ mask = undefined;
366
+ }
367
+
368
+ if (typeof data === 'number') data = data.toString();
369
+
370
+ if (this.readyState !== WebSocket.OPEN) {
371
+ sendAfterClose(this, data, cb);
372
+ return;
373
+ }
374
+
375
+ if (mask === undefined) mask = !this._isServer;
376
+ this._sender.pong(data || EMPTY_BUFFER, mask, cb);
377
+ }
378
+
379
+ /**
380
+ * Send a data message.
381
+ *
382
+ * @param {*} data The message to send
383
+ * @param {Object} [options] Options object
384
+ * @param {Boolean} [options.binary] Specifies whether `data` is binary or
385
+ * text
386
+ * @param {Boolean} [options.compress] Specifies whether or not to compress
387
+ * `data`
388
+ * @param {Boolean} [options.fin=true] Specifies whether the fragment is the
389
+ * last one
390
+ * @param {Boolean} [options.mask] Specifies whether or not to mask `data`
391
+ * @param {Function} [cb] Callback which is executed when data is written out
392
+ * @public
393
+ */
394
+ send(data, options, cb) {
395
+ if (this.readyState === WebSocket.CONNECTING) {
396
+ throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');
397
+ }
398
+
399
+ if (typeof options === 'function') {
400
+ cb = options;
401
+ options = {};
402
+ }
403
+
404
+ if (typeof data === 'number') data = data.toString();
405
+
406
+ if (this.readyState !== WebSocket.OPEN) {
407
+ sendAfterClose(this, data, cb);
408
+ return;
409
+ }
410
+
411
+ const opts = {
412
+ binary: typeof data !== 'string',
413
+ mask: !this._isServer,
414
+ compress: true,
415
+ fin: true,
416
+ ...options
417
+ };
418
+
419
+ if (!this._extensions[PerMessageDeflate.extensionName]) {
420
+ opts.compress = false;
421
+ }
422
+
423
+ this._sender.send(data || EMPTY_BUFFER, opts, cb);
424
+ }
425
+
426
+ /**
427
+ * Forcibly close the connection.
428
+ *
429
+ * @public
430
+ */
431
+ terminate() {
432
+ if (this.readyState === WebSocket.CLOSED) return;
433
+ if (this.readyState === WebSocket.CONNECTING) {
434
+ const msg = 'WebSocket was closed before the connection was established';
435
+ return abortHandshake(this, this._req, msg);
436
+ }
437
+
438
+ if (this._socket) {
439
+ this._readyState = WebSocket.CLOSING;
440
+ this._socket.destroy();
441
+ }
442
+ }
443
+ }
444
+
445
+ /**
446
+ * @constant {Number} CONNECTING
447
+ * @memberof WebSocket
448
+ */
449
+ Object.defineProperty(WebSocket, 'CONNECTING', {
450
+ enumerable: true,
451
+ value: readyStates.indexOf('CONNECTING')
452
+ });
453
+
454
+ /**
455
+ * @constant {Number} CONNECTING
456
+ * @memberof WebSocket.prototype
457
+ */
458
+ Object.defineProperty(WebSocket.prototype, 'CONNECTING', {
459
+ enumerable: true,
460
+ value: readyStates.indexOf('CONNECTING')
461
+ });
462
+
463
+ /**
464
+ * @constant {Number} OPEN
465
+ * @memberof WebSocket
466
+ */
467
+ Object.defineProperty(WebSocket, 'OPEN', {
468
+ enumerable: true,
469
+ value: readyStates.indexOf('OPEN')
470
+ });
471
+
472
+ /**
473
+ * @constant {Number} OPEN
474
+ * @memberof WebSocket.prototype
475
+ */
476
+ Object.defineProperty(WebSocket.prototype, 'OPEN', {
477
+ enumerable: true,
478
+ value: readyStates.indexOf('OPEN')
479
+ });
480
+
481
+ /**
482
+ * @constant {Number} CLOSING
483
+ * @memberof WebSocket
484
+ */
485
+ Object.defineProperty(WebSocket, 'CLOSING', {
486
+ enumerable: true,
487
+ value: readyStates.indexOf('CLOSING')
488
+ });
489
+
490
+ /**
491
+ * @constant {Number} CLOSING
492
+ * @memberof WebSocket.prototype
493
+ */
494
+ Object.defineProperty(WebSocket.prototype, 'CLOSING', {
495
+ enumerable: true,
496
+ value: readyStates.indexOf('CLOSING')
497
+ });
498
+
499
+ /**
500
+ * @constant {Number} CLOSED
501
+ * @memberof WebSocket
502
+ */
503
+ Object.defineProperty(WebSocket, 'CLOSED', {
504
+ enumerable: true,
505
+ value: readyStates.indexOf('CLOSED')
506
+ });
507
+
508
+ /**
509
+ * @constant {Number} CLOSED
510
+ * @memberof WebSocket.prototype
511
+ */
512
+ Object.defineProperty(WebSocket.prototype, 'CLOSED', {
513
+ enumerable: true,
514
+ value: readyStates.indexOf('CLOSED')
515
+ });
516
+
517
+ [
518
+ 'binaryType',
519
+ 'bufferedAmount',
520
+ 'extensions',
521
+ 'protocol',
522
+ 'readyState',
523
+ 'url'
524
+ ].forEach((property) => {
525
+ Object.defineProperty(WebSocket.prototype, property, { enumerable: true });
526
+ });
527
+
528
+ //
529
+ // Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes.
530
+ // See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface
531
+ //
532
+ ['open', 'error', 'close', 'message'].forEach((method) => {
533
+ Object.defineProperty(WebSocket.prototype, `on${method}`, {
534
+ enumerable: true,
535
+ get() {
536
+ for (const listener of this.listeners(method)) {
537
+ if (listener[kForOnEventAttribute]) return listener[kListener];
538
+ }
539
+
540
+ return null;
541
+ },
542
+ set(handler) {
543
+ for (const listener of this.listeners(method)) {
544
+ if (listener[kForOnEventAttribute]) {
545
+ this.removeListener(method, listener);
546
+ break;
547
+ }
548
+ }
549
+
550
+ if (typeof handler !== 'function') return;
551
+
552
+ this.addEventListener(method, handler, {
553
+ [kForOnEventAttribute]: true
554
+ });
555
+ }
556
+ });
557
+ });
558
+
559
+ WebSocket.prototype.addEventListener = addEventListener;
560
+ WebSocket.prototype.removeEventListener = removeEventListener;
561
+
562
+ module.exports = WebSocket;
563
+
564
+ /**
565
+ * Initialize a WebSocket client.
566
+ *
567
+ * @param {WebSocket} websocket The client to initialize
568
+ * @param {(String|URL)} address The URL to which to connect
569
+ * @param {Array} protocols The subprotocols
570
+ * @param {Object} [options] Connection options
571
+ * @param {Boolean} [options.followRedirects=false] Whether or not to follow
572
+ * redirects
573
+ * @param {Number} [options.handshakeTimeout] Timeout in milliseconds for the
574
+ * handshake request
575
+ * @param {Number} [options.maxPayload=104857600] The maximum allowed message
576
+ * size
577
+ * @param {Number} [options.maxRedirects=10] The maximum number of redirects
578
+ * allowed
579
+ * @param {String} [options.origin] Value of the `Origin` or
580
+ * `Sec-WebSocket-Origin` header
581
+ * @param {(Boolean|Object)} [options.perMessageDeflate=true] Enable/disable
582
+ * permessage-deflate
583
+ * @param {Number} [options.protocolVersion=13] Value of the
584
+ * `Sec-WebSocket-Version` header
585
+ * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or
586
+ * not to skip UTF-8 validation for text and close messages
587
+ * @private
588
+ */
589
+ function initAsClient(websocket, address, protocols, options) {
590
+ const opts = {
591
+ protocolVersion: protocolVersions[1],
592
+ maxPayload: 100 * 1024 * 1024,
593
+ skipUTF8Validation: false,
594
+ perMessageDeflate: true,
595
+ followRedirects: false,
596
+ maxRedirects: 10,
597
+ ...options,
598
+ createConnection: undefined,
599
+ socketPath: undefined,
600
+ hostname: undefined,
601
+ protocol: undefined,
602
+ timeout: undefined,
603
+ method: undefined,
604
+ host: undefined,
605
+ path: undefined,
606
+ port: undefined
607
+ };
608
+
609
+ if (!protocolVersions.includes(opts.protocolVersion)) {
610
+ throw new RangeError(
611
+ `Unsupported protocol version: ${opts.protocolVersion} ` +
612
+ `(supported versions: ${protocolVersions.join(', ')})`
613
+ );
614
+ }
615
+
616
+ let parsedUrl;
617
+
618
+ if (address instanceof URL) {
619
+ parsedUrl = address;
620
+ websocket._url = address.href;
621
+ } else {
622
+ try {
623
+ parsedUrl = new URL(address);
624
+ } catch (e) {
625
+ throw new SyntaxError(`Invalid URL: ${address}`);
626
+ }
627
+
628
+ websocket._url = address;
629
+ }
630
+
631
+ const isSecure = parsedUrl.protocol === 'wss:';
632
+ const isUnixSocket = parsedUrl.protocol === 'ws+unix:';
633
+
634
+ if (parsedUrl.protocol !== 'ws:' && !isSecure && !isUnixSocket) {
635
+ throw new SyntaxError(
636
+ 'The URL\'s protocol must be one of "ws:", "wss:", or "ws+unix:"'
637
+ );
638
+ }
639
+
640
+ if (isUnixSocket && !parsedUrl.pathname) {
641
+ throw new SyntaxError("The URL's pathname is empty");
642
+ }
643
+
644
+ if (parsedUrl.hash) {
645
+ throw new SyntaxError('The URL contains a fragment identifier');
646
+ }
647
+
648
+ const defaultPort = isSecure ? 443 : 80;
649
+ const key = randomBytes(16).toString('base64');
650
+ const get = isSecure ? https.get : http.get;
651
+ const protocolSet = new Set();
652
+ let perMessageDeflate;
653
+
654
+ opts.createConnection = isSecure ? tlsConnect : netConnect;
655
+ opts.defaultPort = opts.defaultPort || defaultPort;
656
+ opts.port = parsedUrl.port || defaultPort;
657
+ opts.host = parsedUrl.hostname.startsWith('[')
658
+ ? parsedUrl.hostname.slice(1, -1)
659
+ : parsedUrl.hostname;
660
+ opts.headers = {
661
+ 'Sec-WebSocket-Version': opts.protocolVersion,
662
+ 'Sec-WebSocket-Key': key,
663
+ Connection: 'Upgrade',
664
+ Upgrade: 'websocket',
665
+ ...opts.headers
666
+ };
667
+ opts.path = parsedUrl.pathname + parsedUrl.search;
668
+ opts.timeout = opts.handshakeTimeout;
669
+
670
+ if (opts.perMessageDeflate) {
671
+ perMessageDeflate = new PerMessageDeflate(
672
+ opts.perMessageDeflate !== true ? opts.perMessageDeflate : {},
673
+ false,
674
+ opts.maxPayload
675
+ );
676
+ opts.headers['Sec-WebSocket-Extensions'] = format({
677
+ [PerMessageDeflate.extensionName]: perMessageDeflate.offer()
678
+ });
679
+ }
680
+ if (protocols.length) {
681
+ for (const protocol of protocols) {
682
+ if (
683
+ typeof protocol !== 'string' ||
684
+ !subprotocolRegex.test(protocol) ||
685
+ protocolSet.has(protocol)
686
+ ) {
687
+ throw new SyntaxError(
688
+ 'An invalid or duplicated subprotocol was specified'
689
+ );
690
+ }
691
+
692
+ protocolSet.add(protocol);
693
+ }
694
+
695
+ opts.headers['Sec-WebSocket-Protocol'] = protocols.join(',');
696
+ }
697
+ if (opts.origin) {
698
+ if (opts.protocolVersion < 13) {
699
+ opts.headers['Sec-WebSocket-Origin'] = opts.origin;
700
+ } else {
701
+ opts.headers.Origin = opts.origin;
702
+ }
703
+ }
704
+ if (parsedUrl.username || parsedUrl.password) {
705
+ opts.auth = `${parsedUrl.username}:${parsedUrl.password}`;
706
+ }
707
+
708
+ if (isUnixSocket) {
709
+ const parts = opts.path.split(':');
710
+
711
+ opts.socketPath = parts[0];
712
+ opts.path = parts[1];
713
+ }
714
+
715
+ let req = (websocket._req = get(opts));
716
+
717
+ if (opts.timeout) {
718
+ req.on('timeout', () => {
719
+ abortHandshake(websocket, req, 'Opening handshake has timed out');
720
+ });
721
+ }
722
+
723
+ req.on('error', (err) => {
724
+ if (req === null || req.aborted) return;
725
+
726
+ req = websocket._req = null;
727
+ websocket._readyState = WebSocket.CLOSING;
728
+ websocket.emit('error', err);
729
+ websocket.emitClose();
730
+ });
731
+
732
+ req.on('response', (res) => {
733
+ const location = res.headers.location;
734
+ const statusCode = res.statusCode;
735
+
736
+ if (
737
+ location &&
738
+ opts.followRedirects &&
739
+ statusCode >= 300 &&
740
+ statusCode < 400
741
+ ) {
742
+ if (++websocket._redirects > opts.maxRedirects) {
743
+ abortHandshake(websocket, req, 'Maximum redirects exceeded');
744
+ return;
745
+ }
746
+
747
+ req.abort();
748
+
749
+ const addr = new URL(location, address);
750
+
751
+ initAsClient(websocket, addr, protocols, options);
752
+ } else if (!websocket.emit('unexpected-response', req, res)) {
753
+ abortHandshake(
754
+ websocket,
755
+ req,
756
+ `Unexpected server response: ${res.statusCode}`
757
+ );
758
+ }
759
+ });
760
+
761
+ req.on('upgrade', (res, socket, head) => {
762
+ websocket.emit('upgrade', res);
763
+
764
+ //
765
+ // The user may have closed the connection from a listener of the `upgrade`
766
+ // event.
767
+ //
768
+ if (websocket.readyState !== WebSocket.CONNECTING) return;
769
+
770
+ req = websocket._req = null;
771
+
772
+ const digest = createHash('sha1')
773
+ .update(key + GUID)
774
+ .digest('base64');
775
+
776
+ if (res.headers['sec-websocket-accept'] !== digest) {
777
+ abortHandshake(websocket, socket, 'Invalid Sec-WebSocket-Accept header');
778
+ return;
779
+ }
780
+
781
+ const serverProt = res.headers['sec-websocket-protocol'];
782
+ let protError;
783
+
784
+ if (serverProt !== undefined) {
785
+ if (!protocolSet.size) {
786
+ protError = 'Server sent a subprotocol but none was requested';
787
+ } else if (!protocolSet.has(serverProt)) {
788
+ protError = 'Server sent an invalid subprotocol';
789
+ }
790
+ } else if (protocolSet.size) {
791
+ protError = 'Server sent no subprotocol';
792
+ }
793
+
794
+ if (protError) {
795
+ abortHandshake(websocket, socket, protError);
796
+ return;
797
+ }
798
+
799
+ if (serverProt) websocket._protocol = serverProt;
800
+
801
+ const secWebSocketExtensions = res.headers['sec-websocket-extensions'];
802
+
803
+ if (secWebSocketExtensions !== undefined) {
804
+ if (!perMessageDeflate) {
805
+ const message =
806
+ 'Server sent a Sec-WebSocket-Extensions header but no extension ' +
807
+ 'was requested';
808
+ abortHandshake(websocket, socket, message);
809
+ return;
810
+ }
811
+
812
+ let extensions;
813
+
814
+ try {
815
+ extensions = parse(secWebSocketExtensions);
816
+ } catch (err) {
817
+ const message = 'Invalid Sec-WebSocket-Extensions header';
818
+ abortHandshake(websocket, socket, message);
819
+ return;
820
+ }
821
+
822
+ const extensionNames = Object.keys(extensions);
823
+
824
+ if (
825
+ extensionNames.length !== 1 ||
826
+ extensionNames[0] !== PerMessageDeflate.extensionName
827
+ ) {
828
+ const message = 'Server indicated an extension that was not requested';
829
+ abortHandshake(websocket, socket, message);
830
+ return;
831
+ }
832
+
833
+ try {
834
+ perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]);
835
+ } catch (err) {
836
+ const message = 'Invalid Sec-WebSocket-Extensions header';
837
+ abortHandshake(websocket, socket, message);
838
+ return;
839
+ }
840
+
841
+ websocket._extensions[PerMessageDeflate.extensionName] =
842
+ perMessageDeflate;
843
+ }
844
+
845
+ websocket.setSocket(socket, head, {
846
+ maxPayload: opts.maxPayload,
847
+ skipUTF8Validation: opts.skipUTF8Validation
848
+ });
849
+ });
850
+ }
851
+
852
+ /**
853
+ * Create a `net.Socket` and initiate a connection.
854
+ *
855
+ * @param {Object} options Connection options
856
+ * @return {net.Socket} The newly created socket used to start the connection
857
+ * @private
858
+ */
859
+ function netConnect(options) {
860
+ options.path = options.socketPath;
861
+ return net.connect(options);
862
+ }
863
+
864
+ /**
865
+ * Create a `tls.TLSSocket` and initiate a connection.
866
+ *
867
+ * @param {Object} options Connection options
868
+ * @return {tls.TLSSocket} The newly created socket used to start the connection
869
+ * @private
870
+ */
871
+ function tlsConnect(options) {
872
+ options.path = undefined;
873
+
874
+ if (!options.servername && options.servername !== '') {
875
+ options.servername = net.isIP(options.host) ? '' : options.host;
876
+ }
877
+
878
+ return tls.connect(options);
879
+ }
880
+
881
+ /**
882
+ * Abort the handshake and emit an error.
883
+ *
884
+ * @param {WebSocket} websocket The WebSocket instance
885
+ * @param {(http.ClientRequest|net.Socket|tls.Socket)} stream The request to
886
+ * abort or the socket to destroy
887
+ * @param {String} message The error message
888
+ * @private
889
+ */
890
+ function abortHandshake(websocket, stream, message) {
891
+ websocket._readyState = WebSocket.CLOSING;
892
+
893
+ const err = new Error(message);
894
+ Error.captureStackTrace(err, abortHandshake);
895
+
896
+ if (stream.setHeader) {
897
+ stream.abort();
898
+
899
+ if (stream.socket && !stream.socket.destroyed) {
900
+ //
901
+ // On Node.js >= 14.3.0 `request.abort()` does not destroy the socket if
902
+ // called after the request completed. See
903
+ // https://github.com/websockets/ws/issues/1869.
904
+ //
905
+ stream.socket.destroy();
906
+ }
907
+
908
+ stream.once('abort', websocket.emitClose.bind(websocket));
909
+ websocket.emit('error', err);
910
+ } else {
911
+ stream.destroy(err);
912
+ stream.once('error', websocket.emit.bind(websocket, 'error'));
913
+ stream.once('close', websocket.emitClose.bind(websocket));
914
+ }
915
+ }
916
+
917
+ /**
918
+ * Handle cases where the `ping()`, `pong()`, or `send()` methods are called
919
+ * when the `readyState` attribute is `CLOSING` or `CLOSED`.
920
+ *
921
+ * @param {WebSocket} websocket The WebSocket instance
922
+ * @param {*} [data] The data to send
923
+ * @param {Function} [cb] Callback
924
+ * @private
925
+ */
926
+ function sendAfterClose(websocket, data, cb) {
927
+ if (data) {
928
+ const length = toBuffer(data).length;
929
+
930
+ //
931
+ // The `_bufferedAmount` property is used only when the peer is a client and
932
+ // the opening handshake fails. Under these circumstances, in fact, the
933
+ // `setSocket()` method is not called, so the `_socket` and `_sender`
934
+ // properties are set to `null`.
935
+ //
936
+ if (websocket._socket) websocket._sender._bufferedBytes += length;
937
+ else websocket._bufferedAmount += length;
938
+ }
939
+
940
+ if (cb) {
941
+ const err = new Error(
942
+ `WebSocket is not open: readyState ${websocket.readyState} ` +
943
+ `(${readyStates[websocket.readyState]})`
944
+ );
945
+ cb(err);
946
+ }
947
+ }
948
+
949
+ /**
950
+ * The listener of the `Receiver` `'conclude'` event.
951
+ *
952
+ * @param {Number} code The status code
953
+ * @param {Buffer} reason The reason for closing
954
+ * @private
955
+ */
956
+ function receiverOnConclude(code, reason) {
957
+ const websocket = this[kWebSocket];
958
+
959
+ websocket._closeFrameReceived = true;
960
+ websocket._closeMessage = reason;
961
+ websocket._closeCode = code;
962
+
963
+ if (websocket._socket[kWebSocket] === undefined) return;
964
+
965
+ websocket._socket.removeListener('data', socketOnData);
966
+ process.nextTick(resume, websocket._socket);
967
+
968
+ if (code === 1005) websocket.close();
969
+ else websocket.close(code, reason);
970
+ }
971
+
972
+ /**
973
+ * The listener of the `Receiver` `'drain'` event.
974
+ *
975
+ * @private
976
+ */
977
+ function receiverOnDrain() {
978
+ this[kWebSocket]._socket.resume();
979
+ }
980
+
981
+ /**
982
+ * The listener of the `Receiver` `'error'` event.
983
+ *
984
+ * @param {(RangeError|Error)} err The emitted error
985
+ * @private
986
+ */
987
+ function receiverOnError(err) {
988
+ const websocket = this[kWebSocket];
989
+
990
+ if (websocket._socket[kWebSocket] !== undefined) {
991
+ websocket._socket.removeListener('data', socketOnData);
992
+
993
+ //
994
+ // On Node.js < 14.0.0 the `'error'` event is emitted synchronously. See
995
+ // https://github.com/websockets/ws/issues/1940.
996
+ //
997
+ process.nextTick(resume, websocket._socket);
998
+
999
+ websocket.close(err[kStatusCode]);
1000
+ }
1001
+
1002
+ websocket.emit('error', err);
1003
+ }
1004
+
1005
+ /**
1006
+ * The listener of the `Receiver` `'finish'` event.
1007
+ *
1008
+ * @private
1009
+ */
1010
+ function receiverOnFinish() {
1011
+ this[kWebSocket].emitClose();
1012
+ }
1013
+
1014
+ /**
1015
+ * The listener of the `Receiver` `'message'` event.
1016
+ *
1017
+ * @param {Buffer|ArrayBuffer|Buffer[])} data The message
1018
+ * @param {Boolean} isBinary Specifies whether the message is binary or not
1019
+ * @private
1020
+ */
1021
+ function receiverOnMessage(data, isBinary) {
1022
+ this[kWebSocket].emit('message', data, isBinary);
1023
+ }
1024
+
1025
+ /**
1026
+ * The listener of the `Receiver` `'ping'` event.
1027
+ *
1028
+ * @param {Buffer} data The data included in the ping frame
1029
+ * @private
1030
+ */
1031
+ function receiverOnPing(data) {
1032
+ const websocket = this[kWebSocket];
1033
+
1034
+ websocket.pong(data, !websocket._isServer, NOOP);
1035
+ websocket.emit('ping', data);
1036
+ }
1037
+
1038
+ /**
1039
+ * The listener of the `Receiver` `'pong'` event.
1040
+ *
1041
+ * @param {Buffer} data The data included in the pong frame
1042
+ * @private
1043
+ */
1044
+ function receiverOnPong(data) {
1045
+ this[kWebSocket].emit('pong', data);
1046
+ }
1047
+
1048
+ /**
1049
+ * Resume a readable stream
1050
+ *
1051
+ * @param {Readable} stream The readable stream
1052
+ * @private
1053
+ */
1054
+ function resume(stream) {
1055
+ stream.resume();
1056
+ }
1057
+
1058
+ /**
1059
+ * The listener of the `net.Socket` `'close'` event.
1060
+ *
1061
+ * @private
1062
+ */
1063
+ function socketOnClose() {
1064
+ const websocket = this[kWebSocket];
1065
+
1066
+ this.removeListener('close', socketOnClose);
1067
+ this.removeListener('data', socketOnData);
1068
+ this.removeListener('end', socketOnEnd);
1069
+
1070
+ websocket._readyState = WebSocket.CLOSING;
1071
+
1072
+ let chunk;
1073
+
1074
+ //
1075
+ // The close frame might not have been received or the `'end'` event emitted,
1076
+ // for example, if the socket was destroyed due to an error. Ensure that the
1077
+ // `receiver` stream is closed after writing any remaining buffered data to
1078
+ // it. If the readable side of the socket is in flowing mode then there is no
1079
+ // buffered data as everything has been already written and `readable.read()`
1080
+ // will return `null`. If instead, the socket is paused, any possible buffered
1081
+ // data will be read as a single chunk.
1082
+ //
1083
+ if (
1084
+ !this._readableState.endEmitted &&
1085
+ !websocket._closeFrameReceived &&
1086
+ !websocket._receiver._writableState.errorEmitted &&
1087
+ (chunk = websocket._socket.read()) !== null
1088
+ ) {
1089
+ websocket._receiver.write(chunk);
1090
+ }
1091
+
1092
+ websocket._receiver.end();
1093
+
1094
+ this[kWebSocket] = undefined;
1095
+
1096
+ clearTimeout(websocket._closeTimer);
1097
+
1098
+ if (
1099
+ websocket._receiver._writableState.finished ||
1100
+ websocket._receiver._writableState.errorEmitted
1101
+ ) {
1102
+ websocket.emitClose();
1103
+ } else {
1104
+ websocket._receiver.on('error', receiverOnFinish);
1105
+ websocket._receiver.on('finish', receiverOnFinish);
1106
+ }
1107
+ }
1108
+
1109
+ /**
1110
+ * The listener of the `net.Socket` `'data'` event.
1111
+ *
1112
+ * @param {Buffer} chunk A chunk of data
1113
+ * @private
1114
+ */
1115
+ function socketOnData(chunk) {
1116
+ if (!this[kWebSocket]._receiver.write(chunk)) {
1117
+ this.pause();
1118
+ }
1119
+ }
1120
+
1121
+ /**
1122
+ * The listener of the `net.Socket` `'end'` event.
1123
+ *
1124
+ * @private
1125
+ */
1126
+ function socketOnEnd() {
1127
+ const websocket = this[kWebSocket];
1128
+
1129
+ websocket._readyState = WebSocket.CLOSING;
1130
+ websocket._receiver.end();
1131
+ this.end();
1132
+ }
1133
+
1134
+ /**
1135
+ * The listener of the `net.Socket` `'error'` event.
1136
+ *
1137
+ * @private
1138
+ */
1139
+ function socketOnError() {
1140
+ const websocket = this[kWebSocket];
1141
+
1142
+ this.removeListener('error', socketOnError);
1143
+ this.on('error', NOOP);
1144
+
1145
+ if (websocket) {
1146
+ websocket._readyState = WebSocket.CLOSING;
1147
+ this.destroy();
1148
+ }
1149
+ }