isomorfeus-puppetmaster 0.5.2 → 0.5.6

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