UrgentcareCLI 0.1.1 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (318) hide show
  1. checksums.yaml +4 -4
  2. data/lib/UrgentCare/CLI.rb +57 -22
  3. data/lib/UrgentCare/Office.rb +1 -5
  4. data/lib/UrgentCare/Scraper.rb +71 -0
  5. data/lib/UrgentCare/version.rb +2 -2
  6. data/lib/UrgentCare.rb +2 -1
  7. metadata +27 -321
  8. data/.gitignore +0 -11
  9. data/.rspec +0 -3
  10. data/.travis.yml +0 -5
  11. data/CODE_OF_CONDUCT.md +0 -74
  12. data/Gemfile +0 -12
  13. data/Gemfile.lock +0 -84
  14. data/LICENSE.txt +0 -21
  15. data/Notes +0 -41
  16. data/README.md +0 -41
  17. data/Rakefile +0 -8
  18. data/UrgentCare.gemspec +0 -39
  19. data/background.jpg +0 -0
  20. data/data.txt +0 -4
  21. data/lib/Urgentcare/Scraper.rb +0 -78
  22. data/node_modules/.bin/rimraf +0 -1
  23. data/node_modules/.package-lock.json +0 -250
  24. data/node_modules/balanced-match/.github/FUNDING.yml +0 -2
  25. data/node_modules/balanced-match/LICENSE.md +0 -21
  26. data/node_modules/balanced-match/README.md +0 -97
  27. data/node_modules/balanced-match/index.js +0 -62
  28. data/node_modules/balanced-match/package.json +0 -48
  29. data/node_modules/brace-expansion/LICENSE +0 -21
  30. data/node_modules/brace-expansion/README.md +0 -129
  31. data/node_modules/brace-expansion/index.js +0 -201
  32. data/node_modules/brace-expansion/package.json +0 -47
  33. data/node_modules/concat-map/.travis.yml +0 -4
  34. data/node_modules/concat-map/LICENSE +0 -18
  35. data/node_modules/concat-map/README.markdown +0 -62
  36. data/node_modules/concat-map/example/map.js +0 -6
  37. data/node_modules/concat-map/index.js +0 -13
  38. data/node_modules/concat-map/package.json +0 -43
  39. data/node_modules/concat-map/test/map.js +0 -39
  40. data/node_modules/core-util-is/LICENSE +0 -19
  41. data/node_modules/core-util-is/README.md +0 -3
  42. data/node_modules/core-util-is/float.patch +0 -604
  43. data/node_modules/core-util-is/lib/util.js +0 -107
  44. data/node_modules/core-util-is/package.json +0 -32
  45. data/node_modules/core-util-is/test.js +0 -68
  46. data/node_modules/fs.realpath/LICENSE +0 -43
  47. data/node_modules/fs.realpath/README.md +0 -33
  48. data/node_modules/fs.realpath/index.js +0 -66
  49. data/node_modules/fs.realpath/old.js +0 -303
  50. data/node_modules/fs.realpath/package.json +0 -26
  51. data/node_modules/glob/LICENSE +0 -21
  52. data/node_modules/glob/README.md +0 -375
  53. data/node_modules/glob/changelog.md +0 -67
  54. data/node_modules/glob/common.js +0 -234
  55. data/node_modules/glob/glob.js +0 -788
  56. data/node_modules/glob/package.json +0 -51
  57. data/node_modules/glob/sync.js +0 -484
  58. data/node_modules/immediate/LICENSE.txt +0 -20
  59. data/node_modules/immediate/README.md +0 -93
  60. data/node_modules/immediate/dist/immediate.js +0 -75
  61. data/node_modules/immediate/dist/immediate.min.js +0 -1
  62. data/node_modules/immediate/lib/browser.js +0 -69
  63. data/node_modules/immediate/lib/index.js +0 -73
  64. data/node_modules/immediate/package.json +0 -42
  65. data/node_modules/inflight/LICENSE +0 -15
  66. data/node_modules/inflight/README.md +0 -37
  67. data/node_modules/inflight/inflight.js +0 -54
  68. data/node_modules/inflight/package.json +0 -29
  69. data/node_modules/inherits/LICENSE +0 -16
  70. data/node_modules/inherits/README.md +0 -42
  71. data/node_modules/inherits/inherits.js +0 -9
  72. data/node_modules/inherits/inherits_browser.js +0 -27
  73. data/node_modules/inherits/package.json +0 -29
  74. data/node_modules/isarray/.npmignore +0 -1
  75. data/node_modules/isarray/.travis.yml +0 -4
  76. data/node_modules/isarray/Makefile +0 -6
  77. data/node_modules/isarray/README.md +0 -60
  78. data/node_modules/isarray/component.json +0 -19
  79. data/node_modules/isarray/index.js +0 -5
  80. data/node_modules/isarray/package.json +0 -45
  81. data/node_modules/isarray/test.js +0 -20
  82. data/node_modules/jszip/.codeclimate.yml +0 -16
  83. data/node_modules/jszip/.editorconfig +0 -8
  84. data/node_modules/jszip/.jshintignore +0 -1
  85. data/node_modules/jszip/.jshintrc +0 -21
  86. data/node_modules/jszip/.travis.yml +0 -17
  87. data/node_modules/jszip/CHANGES.md +0 -163
  88. data/node_modules/jszip/LICENSE.markdown +0 -651
  89. data/node_modules/jszip/README.markdown +0 -35
  90. data/node_modules/jszip/dist/jszip.js +0 -30
  91. data/node_modules/jszip/dist/jszip.min.js +0 -13
  92. data/node_modules/jszip/index.d.ts +0 -270
  93. data/node_modules/jszip/lib/base64.js +0 -106
  94. data/node_modules/jszip/lib/compressedObject.js +0 -74
  95. data/node_modules/jszip/lib/compressions.js +0 -14
  96. data/node_modules/jszip/lib/crc32.js +0 -77
  97. data/node_modules/jszip/lib/defaults.js +0 -11
  98. data/node_modules/jszip/lib/external.js +0 -19
  99. data/node_modules/jszip/lib/flate.js +0 -85
  100. data/node_modules/jszip/lib/generate/ZipFileWorker.js +0 -540
  101. data/node_modules/jszip/lib/generate/index.js +0 -57
  102. data/node_modules/jszip/lib/index.js +0 -52
  103. data/node_modules/jszip/lib/license_header.js +0 -11
  104. data/node_modules/jszip/lib/load.js +0 -81
  105. data/node_modules/jszip/lib/nodejs/NodejsStreamInputAdapter.js +0 -74
  106. data/node_modules/jszip/lib/nodejs/NodejsStreamOutputAdapter.js +0 -42
  107. data/node_modules/jszip/lib/nodejsUtils.js +0 -57
  108. data/node_modules/jszip/lib/object.js +0 -389
  109. data/node_modules/jszip/lib/readable-stream-browser.js +0 -9
  110. data/node_modules/jszip/lib/reader/ArrayReader.js +0 -57
  111. data/node_modules/jszip/lib/reader/DataReader.js +0 -116
  112. data/node_modules/jszip/lib/reader/NodeBufferReader.js +0 -19
  113. data/node_modules/jszip/lib/reader/StringReader.js +0 -38
  114. data/node_modules/jszip/lib/reader/Uint8ArrayReader.js +0 -22
  115. data/node_modules/jszip/lib/reader/readerFor.js +0 -28
  116. data/node_modules/jszip/lib/signature.js +0 -7
  117. data/node_modules/jszip/lib/stream/ConvertWorker.js +0 -26
  118. data/node_modules/jszip/lib/stream/Crc32Probe.js +0 -24
  119. data/node_modules/jszip/lib/stream/DataLengthProbe.js +0 -29
  120. data/node_modules/jszip/lib/stream/DataWorker.js +0 -116
  121. data/node_modules/jszip/lib/stream/GenericWorker.js +0 -263
  122. data/node_modules/jszip/lib/stream/StreamHelper.js +0 -212
  123. data/node_modules/jszip/lib/support.js +0 -38
  124. data/node_modules/jszip/lib/utf8.js +0 -275
  125. data/node_modules/jszip/lib/utils.js +0 -476
  126. data/node_modules/jszip/lib/zipEntries.js +0 -262
  127. data/node_modules/jszip/lib/zipEntry.js +0 -294
  128. data/node_modules/jszip/lib/zipObject.js +0 -133
  129. data/node_modules/jszip/package.json +0 -63
  130. data/node_modules/jszip/vendor/FileSaver.js +0 -247
  131. data/node_modules/lie/README.md +0 -62
  132. data/node_modules/lie/dist/lie.js +0 -350
  133. data/node_modules/lie/dist/lie.min.js +0 -1
  134. data/node_modules/lie/dist/lie.polyfill.js +0 -358
  135. data/node_modules/lie/dist/lie.polyfill.min.js +0 -1
  136. data/node_modules/lie/lib/browser.js +0 -273
  137. data/node_modules/lie/lib/index.js +0 -298
  138. data/node_modules/lie/license.md +0 -7
  139. data/node_modules/lie/lie.d.ts +0 -244
  140. data/node_modules/lie/package.json +0 -69
  141. data/node_modules/lie/polyfill.js +0 -4
  142. data/node_modules/minimatch/LICENSE +0 -15
  143. data/node_modules/minimatch/README.md +0 -209
  144. data/node_modules/minimatch/minimatch.js +0 -923
  145. data/node_modules/minimatch/package.json +0 -30
  146. data/node_modules/once/LICENSE +0 -15
  147. data/node_modules/once/README.md +0 -79
  148. data/node_modules/once/once.js +0 -42
  149. data/node_modules/once/package.json +0 -33
  150. data/node_modules/pako/CHANGELOG.md +0 -164
  151. data/node_modules/pako/LICENSE +0 -21
  152. data/node_modules/pako/README.md +0 -191
  153. data/node_modules/pako/dist/pako.js +0 -6818
  154. data/node_modules/pako/dist/pako.min.js +0 -1
  155. data/node_modules/pako/dist/pako_deflate.js +0 -3997
  156. data/node_modules/pako/dist/pako_deflate.min.js +0 -1
  157. data/node_modules/pako/dist/pako_inflate.js +0 -3300
  158. data/node_modules/pako/dist/pako_inflate.min.js +0 -1
  159. data/node_modules/pako/index.js +0 -14
  160. data/node_modules/pako/lib/deflate.js +0 -400
  161. data/node_modules/pako/lib/inflate.js +0 -423
  162. data/node_modules/pako/lib/utils/common.js +0 -105
  163. data/node_modules/pako/lib/utils/strings.js +0 -187
  164. data/node_modules/pako/lib/zlib/README +0 -59
  165. data/node_modules/pako/lib/zlib/adler32.js +0 -51
  166. data/node_modules/pako/lib/zlib/constants.js +0 -68
  167. data/node_modules/pako/lib/zlib/crc32.js +0 -59
  168. data/node_modules/pako/lib/zlib/deflate.js +0 -1874
  169. data/node_modules/pako/lib/zlib/gzheader.js +0 -58
  170. data/node_modules/pako/lib/zlib/inffast.js +0 -345
  171. data/node_modules/pako/lib/zlib/inflate.js +0 -1556
  172. data/node_modules/pako/lib/zlib/inftrees.js +0 -343
  173. data/node_modules/pako/lib/zlib/messages.js +0 -32
  174. data/node_modules/pako/lib/zlib/trees.js +0 -1222
  175. data/node_modules/pako/lib/zlib/zstream.js +0 -47
  176. data/node_modules/pako/package.json +0 -44
  177. data/node_modules/path-is-absolute/index.js +0 -20
  178. data/node_modules/path-is-absolute/license +0 -21
  179. data/node_modules/path-is-absolute/package.json +0 -43
  180. data/node_modules/path-is-absolute/readme.md +0 -59
  181. data/node_modules/process-nextick-args/index.js +0 -45
  182. data/node_modules/process-nextick-args/license.md +0 -19
  183. data/node_modules/process-nextick-args/package.json +0 -25
  184. data/node_modules/process-nextick-args/readme.md +0 -18
  185. data/node_modules/readable-stream/.travis.yml +0 -34
  186. data/node_modules/readable-stream/CONTRIBUTING.md +0 -38
  187. data/node_modules/readable-stream/GOVERNANCE.md +0 -136
  188. data/node_modules/readable-stream/LICENSE +0 -47
  189. data/node_modules/readable-stream/README.md +0 -58
  190. data/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md +0 -60
  191. data/node_modules/readable-stream/duplex-browser.js +0 -1
  192. data/node_modules/readable-stream/duplex.js +0 -1
  193. data/node_modules/readable-stream/lib/_stream_duplex.js +0 -131
  194. data/node_modules/readable-stream/lib/_stream_passthrough.js +0 -47
  195. data/node_modules/readable-stream/lib/_stream_readable.js +0 -1019
  196. data/node_modules/readable-stream/lib/_stream_transform.js +0 -214
  197. data/node_modules/readable-stream/lib/_stream_writable.js +0 -687
  198. data/node_modules/readable-stream/lib/internal/streams/BufferList.js +0 -79
  199. data/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -74
  200. data/node_modules/readable-stream/lib/internal/streams/stream-browser.js +0 -1
  201. data/node_modules/readable-stream/lib/internal/streams/stream.js +0 -1
  202. data/node_modules/readable-stream/package.json +0 -52
  203. data/node_modules/readable-stream/passthrough.js +0 -1
  204. data/node_modules/readable-stream/readable-browser.js +0 -7
  205. data/node_modules/readable-stream/readable.js +0 -19
  206. data/node_modules/readable-stream/transform.js +0 -1
  207. data/node_modules/readable-stream/writable-browser.js +0 -1
  208. data/node_modules/readable-stream/writable.js +0 -8
  209. data/node_modules/rimraf/LICENSE +0 -15
  210. data/node_modules/rimraf/README.md +0 -101
  211. data/node_modules/rimraf/bin.js +0 -50
  212. data/node_modules/rimraf/package.json +0 -29
  213. data/node_modules/rimraf/rimraf.js +0 -372
  214. data/node_modules/safe-buffer/LICENSE +0 -21
  215. data/node_modules/safe-buffer/README.md +0 -584
  216. data/node_modules/safe-buffer/index.d.ts +0 -187
  217. data/node_modules/safe-buffer/index.js +0 -62
  218. data/node_modules/safe-buffer/package.json +0 -37
  219. data/node_modules/selenium-webdriver/CHANGES.md +0 -1114
  220. data/node_modules/selenium-webdriver/LICENSE +0 -202
  221. data/node_modules/selenium-webdriver/NOTICE +0 -2
  222. data/node_modules/selenium-webdriver/README.md +0 -229
  223. data/node_modules/selenium-webdriver/chrome.js +0 -295
  224. data/node_modules/selenium-webdriver/chromium.js +0 -829
  225. data/node_modules/selenium-webdriver/devtools/CDPConnection.js +0 -35
  226. data/node_modules/selenium-webdriver/edge.js +0 -224
  227. data/node_modules/selenium-webdriver/example/chrome_android.js +0 -45
  228. data/node_modules/selenium-webdriver/example/chrome_mobile_emulation.js +0 -46
  229. data/node_modules/selenium-webdriver/example/firefox_channels.js +0 -84
  230. data/node_modules/selenium-webdriver/example/google_search.js +0 -50
  231. data/node_modules/selenium-webdriver/example/google_search_test.js +0 -70
  232. data/node_modules/selenium-webdriver/example/headless.js +0 -63
  233. data/node_modules/selenium-webdriver/example/logging.js +0 -64
  234. data/node_modules/selenium-webdriver/firefox.js +0 -789
  235. data/node_modules/selenium-webdriver/http/index.js +0 -324
  236. data/node_modules/selenium-webdriver/http/util.js +0 -172
  237. data/node_modules/selenium-webdriver/ie.js +0 -503
  238. data/node_modules/selenium-webdriver/index.js +0 -825
  239. data/node_modules/selenium-webdriver/io/exec.js +0 -162
  240. data/node_modules/selenium-webdriver/io/index.js +0 -348
  241. data/node_modules/selenium-webdriver/io/zip.js +0 -223
  242. data/node_modules/selenium-webdriver/lib/atoms/find-elements.js +0 -123
  243. data/node_modules/selenium-webdriver/lib/atoms/get-attribute.js +0 -101
  244. data/node_modules/selenium-webdriver/lib/atoms/is-displayed.js +0 -101
  245. data/node_modules/selenium-webdriver/lib/atoms/mutation-listener.js +0 -55
  246. data/node_modules/selenium-webdriver/lib/by.js +0 -415
  247. data/node_modules/selenium-webdriver/lib/capabilities.js +0 -553
  248. data/node_modules/selenium-webdriver/lib/command.js +0 -206
  249. data/node_modules/selenium-webdriver/lib/error.js +0 -605
  250. data/node_modules/selenium-webdriver/lib/http.js +0 -704
  251. data/node_modules/selenium-webdriver/lib/input.js +0 -946
  252. data/node_modules/selenium-webdriver/lib/logging.js +0 -661
  253. data/node_modules/selenium-webdriver/lib/promise.js +0 -285
  254. data/node_modules/selenium-webdriver/lib/proxy.js +0 -212
  255. data/node_modules/selenium-webdriver/lib/session.js +0 -77
  256. data/node_modules/selenium-webdriver/lib/symbols.js +0 -37
  257. data/node_modules/selenium-webdriver/lib/until.js +0 -429
  258. data/node_modules/selenium-webdriver/lib/webdriver.js +0 -2919
  259. data/node_modules/selenium-webdriver/net/index.js +0 -107
  260. data/node_modules/selenium-webdriver/net/portprober.js +0 -75
  261. data/node_modules/selenium-webdriver/opera.js +0 -406
  262. data/node_modules/selenium-webdriver/package.json +0 -54
  263. data/node_modules/selenium-webdriver/proxy.js +0 -32
  264. data/node_modules/selenium-webdriver/remote/index.js +0 -624
  265. data/node_modules/selenium-webdriver/safari.js +0 -168
  266. data/node_modules/selenium-webdriver/testing/index.js +0 -504
  267. data/node_modules/set-immediate-shim/index.js +0 -7
  268. data/node_modules/set-immediate-shim/package.json +0 -34
  269. data/node_modules/set-immediate-shim/readme.md +0 -31
  270. data/node_modules/string_decoder/.travis.yml +0 -50
  271. data/node_modules/string_decoder/LICENSE +0 -48
  272. data/node_modules/string_decoder/README.md +0 -47
  273. data/node_modules/string_decoder/lib/string_decoder.js +0 -296
  274. data/node_modules/string_decoder/package.json +0 -31
  275. data/node_modules/tmp/CHANGELOG.md +0 -288
  276. data/node_modules/tmp/LICENSE +0 -21
  277. data/node_modules/tmp/README.md +0 -365
  278. data/node_modules/tmp/lib/tmp.js +0 -780
  279. data/node_modules/tmp/node_modules/.bin/rimraf +0 -1
  280. data/node_modules/tmp/node_modules/rimraf/CHANGELOG.md +0 -65
  281. data/node_modules/tmp/node_modules/rimraf/LICENSE +0 -15
  282. data/node_modules/tmp/node_modules/rimraf/README.md +0 -101
  283. data/node_modules/tmp/node_modules/rimraf/bin.js +0 -68
  284. data/node_modules/tmp/node_modules/rimraf/package.json +0 -32
  285. data/node_modules/tmp/node_modules/rimraf/rimraf.js +0 -360
  286. data/node_modules/tmp/package.json +0 -58
  287. data/node_modules/util-deprecate/History.md +0 -16
  288. data/node_modules/util-deprecate/LICENSE +0 -24
  289. data/node_modules/util-deprecate/README.md +0 -53
  290. data/node_modules/util-deprecate/browser.js +0 -67
  291. data/node_modules/util-deprecate/node.js +0 -6
  292. data/node_modules/util-deprecate/package.json +0 -27
  293. data/node_modules/wrappy/LICENSE +0 -15
  294. data/node_modules/wrappy/README.md +0 -36
  295. data/node_modules/wrappy/package.json +0 -29
  296. data/node_modules/wrappy/wrappy.js +0 -33
  297. data/node_modules/ws/LICENSE +0 -21
  298. data/node_modules/ws/README.md +0 -496
  299. data/node_modules/ws/browser.js +0 -8
  300. data/node_modules/ws/index.js +0 -10
  301. data/node_modules/ws/lib/buffer-util.js +0 -129
  302. data/node_modules/ws/lib/constants.js +0 -10
  303. data/node_modules/ws/lib/event-target.js +0 -184
  304. data/node_modules/ws/lib/extension.js +0 -223
  305. data/node_modules/ws/lib/limiter.js +0 -55
  306. data/node_modules/ws/lib/permessage-deflate.js +0 -517
  307. data/node_modules/ws/lib/receiver.js +0 -507
  308. data/node_modules/ws/lib/sender.js +0 -405
  309. data/node_modules/ws/lib/stream.js +0 -165
  310. data/node_modules/ws/lib/validation.js +0 -104
  311. data/node_modules/ws/lib/websocket-server.js +0 -418
  312. data/node_modules/ws/lib/websocket.js +0 -942
  313. data/node_modules/ws/package.json +0 -56
  314. data/package-lock.json +0 -458
  315. data/package.json +0 -5
  316. data/selenium.log +0 -1
  317. data/spec.md +0 -6
  318. data/test.data +0 -2110
@@ -1,405 +0,0 @@
1
- 'use strict';
2
-
3
- const { randomFillSync } = require('crypto');
4
-
5
- const PerMessageDeflate = require('./permessage-deflate');
6
- const { EMPTY_BUFFER } = require('./constants');
7
- const { isValidStatusCode } = require('./validation');
8
- const { mask: applyMask, toBuffer } = require('./buffer-util');
9
-
10
- const mask = Buffer.alloc(4);
11
-
12
- /**
13
- * HyBi Sender implementation.
14
- */
15
- class Sender {
16
- /**
17
- * Creates a Sender instance.
18
- *
19
- * @param {net.Socket} socket The connection socket
20
- * @param {Object} [extensions] An object containing the negotiated extensions
21
- */
22
- constructor(socket, extensions) {
23
- this._extensions = extensions || {};
24
- this._socket = socket;
25
-
26
- this._firstFragment = true;
27
- this._compress = false;
28
-
29
- this._bufferedBytes = 0;
30
- this._deflating = false;
31
- this._queue = [];
32
- }
33
-
34
- /**
35
- * Frames a piece of data according to the HyBi WebSocket protocol.
36
- *
37
- * @param {Buffer} data The data to frame
38
- * @param {Object} options Options object
39
- * @param {Number} options.opcode The opcode
40
- * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be
41
- * modified
42
- * @param {Boolean} [options.fin=false] Specifies whether or not to set the
43
- * FIN bit
44
- * @param {Boolean} [options.mask=false] Specifies whether or not to mask
45
- * `data`
46
- * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the
47
- * RSV1 bit
48
- * @return {Buffer[]} The framed data as a list of `Buffer` instances
49
- * @public
50
- */
51
- static frame(data, options) {
52
- const merge = options.mask && options.readOnly;
53
- let offset = options.mask ? 6 : 2;
54
- let payloadLength = data.length;
55
-
56
- if (data.length >= 65536) {
57
- offset += 8;
58
- payloadLength = 127;
59
- } else if (data.length > 125) {
60
- offset += 2;
61
- payloadLength = 126;
62
- }
63
-
64
- const target = Buffer.allocUnsafe(merge ? data.length + offset : offset);
65
-
66
- target[0] = options.fin ? options.opcode | 0x80 : options.opcode;
67
- if (options.rsv1) target[0] |= 0x40;
68
-
69
- target[1] = payloadLength;
70
-
71
- if (payloadLength === 126) {
72
- target.writeUInt16BE(data.length, 2);
73
- } else if (payloadLength === 127) {
74
- target.writeUInt32BE(0, 2);
75
- target.writeUInt32BE(data.length, 6);
76
- }
77
-
78
- if (!options.mask) return [target, data];
79
-
80
- randomFillSync(mask, 0, 4);
81
-
82
- target[1] |= 0x80;
83
- target[offset - 4] = mask[0];
84
- target[offset - 3] = mask[1];
85
- target[offset - 2] = mask[2];
86
- target[offset - 1] = mask[3];
87
-
88
- if (merge) {
89
- applyMask(data, mask, target, offset, data.length);
90
- return [target];
91
- }
92
-
93
- applyMask(data, mask, data, 0, data.length);
94
- return [target, data];
95
- }
96
-
97
- /**
98
- * Sends a close message to the other peer.
99
- *
100
- * @param {Number} [code] The status code component of the body
101
- * @param {String} [data] The message component of the body
102
- * @param {Boolean} [mask=false] Specifies whether or not to mask the message
103
- * @param {Function} [cb] Callback
104
- * @public
105
- */
106
- close(code, data, mask, cb) {
107
- let buf;
108
-
109
- if (code === undefined) {
110
- buf = EMPTY_BUFFER;
111
- } else if (typeof code !== 'number' || !isValidStatusCode(code)) {
112
- throw new TypeError('First argument must be a valid error code number');
113
- } else if (data === undefined || data === '') {
114
- buf = Buffer.allocUnsafe(2);
115
- buf.writeUInt16BE(code, 0);
116
- } else {
117
- const length = Buffer.byteLength(data);
118
-
119
- if (length > 123) {
120
- throw new RangeError('The message must not be greater than 123 bytes');
121
- }
122
-
123
- buf = Buffer.allocUnsafe(2 + length);
124
- buf.writeUInt16BE(code, 0);
125
- buf.write(data, 2);
126
- }
127
-
128
- if (this._deflating) {
129
- this.enqueue([this.doClose, buf, mask, cb]);
130
- } else {
131
- this.doClose(buf, mask, cb);
132
- }
133
- }
134
-
135
- /**
136
- * Frames and sends a close message.
137
- *
138
- * @param {Buffer} data The message to send
139
- * @param {Boolean} [mask=false] Specifies whether or not to mask `data`
140
- * @param {Function} [cb] Callback
141
- * @private
142
- */
143
- doClose(data, mask, cb) {
144
- this.sendFrame(
145
- Sender.frame(data, {
146
- fin: true,
147
- rsv1: false,
148
- opcode: 0x08,
149
- mask,
150
- readOnly: false
151
- }),
152
- cb
153
- );
154
- }
155
-
156
- /**
157
- * Sends a ping message to the other peer.
158
- *
159
- * @param {*} data The message to send
160
- * @param {Boolean} [mask=false] Specifies whether or not to mask `data`
161
- * @param {Function} [cb] Callback
162
- * @public
163
- */
164
- ping(data, mask, cb) {
165
- const buf = toBuffer(data);
166
-
167
- if (buf.length > 125) {
168
- throw new RangeError('The data size must not be greater than 125 bytes');
169
- }
170
-
171
- if (this._deflating) {
172
- this.enqueue([this.doPing, buf, mask, toBuffer.readOnly, cb]);
173
- } else {
174
- this.doPing(buf, mask, toBuffer.readOnly, cb);
175
- }
176
- }
177
-
178
- /**
179
- * Frames and sends a ping message.
180
- *
181
- * @param {Buffer} data The message to send
182
- * @param {Boolean} [mask=false] Specifies whether or not to mask `data`
183
- * @param {Boolean} [readOnly=false] Specifies whether `data` can be modified
184
- * @param {Function} [cb] Callback
185
- * @private
186
- */
187
- doPing(data, mask, readOnly, cb) {
188
- this.sendFrame(
189
- Sender.frame(data, {
190
- fin: true,
191
- rsv1: false,
192
- opcode: 0x09,
193
- mask,
194
- readOnly
195
- }),
196
- cb
197
- );
198
- }
199
-
200
- /**
201
- * Sends a pong message to the other peer.
202
- *
203
- * @param {*} data The message to send
204
- * @param {Boolean} [mask=false] Specifies whether or not to mask `data`
205
- * @param {Function} [cb] Callback
206
- * @public
207
- */
208
- pong(data, mask, cb) {
209
- const buf = toBuffer(data);
210
-
211
- if (buf.length > 125) {
212
- throw new RangeError('The data size must not be greater than 125 bytes');
213
- }
214
-
215
- if (this._deflating) {
216
- this.enqueue([this.doPong, buf, mask, toBuffer.readOnly, cb]);
217
- } else {
218
- this.doPong(buf, mask, toBuffer.readOnly, cb);
219
- }
220
- }
221
-
222
- /**
223
- * Frames and sends a pong message.
224
- *
225
- * @param {Buffer} data The message to send
226
- * @param {Boolean} [mask=false] Specifies whether or not to mask `data`
227
- * @param {Boolean} [readOnly=false] Specifies whether `data` can be modified
228
- * @param {Function} [cb] Callback
229
- * @private
230
- */
231
- doPong(data, mask, readOnly, cb) {
232
- this.sendFrame(
233
- Sender.frame(data, {
234
- fin: true,
235
- rsv1: false,
236
- opcode: 0x0a,
237
- mask,
238
- readOnly
239
- }),
240
- cb
241
- );
242
- }
243
-
244
- /**
245
- * Sends a data message to the other peer.
246
- *
247
- * @param {*} data The message to send
248
- * @param {Object} options Options object
249
- * @param {Boolean} [options.compress=false] Specifies whether or not to
250
- * compress `data`
251
- * @param {Boolean} [options.binary=false] Specifies whether `data` is binary
252
- * or text
253
- * @param {Boolean} [options.fin=false] Specifies whether the fragment is the
254
- * last one
255
- * @param {Boolean} [options.mask=false] Specifies whether or not to mask
256
- * `data`
257
- * @param {Function} [cb] Callback
258
- * @public
259
- */
260
- send(data, options, cb) {
261
- const buf = toBuffer(data);
262
- const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];
263
- let opcode = options.binary ? 2 : 1;
264
- let rsv1 = options.compress;
265
-
266
- if (this._firstFragment) {
267
- this._firstFragment = false;
268
- if (rsv1 && perMessageDeflate) {
269
- rsv1 = buf.length >= perMessageDeflate._threshold;
270
- }
271
- this._compress = rsv1;
272
- } else {
273
- rsv1 = false;
274
- opcode = 0;
275
- }
276
-
277
- if (options.fin) this._firstFragment = true;
278
-
279
- if (perMessageDeflate) {
280
- const opts = {
281
- fin: options.fin,
282
- rsv1,
283
- opcode,
284
- mask: options.mask,
285
- readOnly: toBuffer.readOnly
286
- };
287
-
288
- if (this._deflating) {
289
- this.enqueue([this.dispatch, buf, this._compress, opts, cb]);
290
- } else {
291
- this.dispatch(buf, this._compress, opts, cb);
292
- }
293
- } else {
294
- this.sendFrame(
295
- Sender.frame(buf, {
296
- fin: options.fin,
297
- rsv1: false,
298
- opcode,
299
- mask: options.mask,
300
- readOnly: toBuffer.readOnly
301
- }),
302
- cb
303
- );
304
- }
305
- }
306
-
307
- /**
308
- * Dispatches a data message.
309
- *
310
- * @param {Buffer} data The message to send
311
- * @param {Boolean} [compress=false] Specifies whether or not to compress
312
- * `data`
313
- * @param {Object} options Options object
314
- * @param {Number} options.opcode The opcode
315
- * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be
316
- * modified
317
- * @param {Boolean} [options.fin=false] Specifies whether or not to set the
318
- * FIN bit
319
- * @param {Boolean} [options.mask=false] Specifies whether or not to mask
320
- * `data`
321
- * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the
322
- * RSV1 bit
323
- * @param {Function} [cb] Callback
324
- * @private
325
- */
326
- dispatch(data, compress, options, cb) {
327
- if (!compress) {
328
- this.sendFrame(Sender.frame(data, options), cb);
329
- return;
330
- }
331
-
332
- const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];
333
-
334
- this._bufferedBytes += data.length;
335
- this._deflating = true;
336
- perMessageDeflate.compress(data, options.fin, (_, buf) => {
337
- if (this._socket.destroyed) {
338
- const err = new Error(
339
- 'The socket was closed while data was being compressed'
340
- );
341
-
342
- if (typeof cb === 'function') cb(err);
343
-
344
- for (let i = 0; i < this._queue.length; i++) {
345
- const callback = this._queue[i][4];
346
-
347
- if (typeof callback === 'function') callback(err);
348
- }
349
-
350
- return;
351
- }
352
-
353
- this._bufferedBytes -= data.length;
354
- this._deflating = false;
355
- options.readOnly = false;
356
- this.sendFrame(Sender.frame(buf, options), cb);
357
- this.dequeue();
358
- });
359
- }
360
-
361
- /**
362
- * Executes queued send operations.
363
- *
364
- * @private
365
- */
366
- dequeue() {
367
- while (!this._deflating && this._queue.length) {
368
- const params = this._queue.shift();
369
-
370
- this._bufferedBytes -= params[1].length;
371
- Reflect.apply(params[0], this, params.slice(1));
372
- }
373
- }
374
-
375
- /**
376
- * Enqueues a send operation.
377
- *
378
- * @param {Array} params Send operation parameters.
379
- * @private
380
- */
381
- enqueue(params) {
382
- this._bufferedBytes += params[1].length;
383
- this._queue.push(params);
384
- }
385
-
386
- /**
387
- * Sends a frame.
388
- *
389
- * @param {Buffer[]} list The frame to send
390
- * @param {Function} [cb] Callback
391
- * @private
392
- */
393
- sendFrame(list, cb) {
394
- if (list.length === 2) {
395
- this._socket.cork();
396
- this._socket.write(list[0]);
397
- this._socket.write(list[1], cb);
398
- this._socket.uncork();
399
- } else {
400
- this._socket.write(list[0], cb);
401
- }
402
- }
403
- }
404
-
405
- module.exports = Sender;
@@ -1,165 +0,0 @@
1
- 'use strict';
2
-
3
- const { Duplex } = require('stream');
4
-
5
- /**
6
- * Emits the `'close'` event on a stream.
7
- *
8
- * @param {stream.Duplex} The stream.
9
- * @private
10
- */
11
- function emitClose(stream) {
12
- stream.emit('close');
13
- }
14
-
15
- /**
16
- * The listener of the `'end'` event.
17
- *
18
- * @private
19
- */
20
- function duplexOnEnd() {
21
- if (!this.destroyed && this._writableState.finished) {
22
- this.destroy();
23
- }
24
- }
25
-
26
- /**
27
- * The listener of the `'error'` event.
28
- *
29
- * @param {Error} err The error
30
- * @private
31
- */
32
- function duplexOnError(err) {
33
- this.removeListener('error', duplexOnError);
34
- this.destroy();
35
- if (this.listenerCount('error') === 0) {
36
- // Do not suppress the throwing behavior.
37
- this.emit('error', err);
38
- }
39
- }
40
-
41
- /**
42
- * Wraps a `WebSocket` in a duplex stream.
43
- *
44
- * @param {WebSocket} ws The `WebSocket` to wrap
45
- * @param {Object} [options] The options for the `Duplex` constructor
46
- * @return {stream.Duplex} The duplex stream
47
- * @public
48
- */
49
- function createWebSocketStream(ws, options) {
50
- let resumeOnReceiverDrain = true;
51
-
52
- function receiverOnDrain() {
53
- if (resumeOnReceiverDrain) ws._socket.resume();
54
- }
55
-
56
- if (ws.readyState === ws.CONNECTING) {
57
- ws.once('open', function open() {
58
- ws._receiver.removeAllListeners('drain');
59
- ws._receiver.on('drain', receiverOnDrain);
60
- });
61
- } else {
62
- ws._receiver.removeAllListeners('drain');
63
- ws._receiver.on('drain', receiverOnDrain);
64
- }
65
-
66
- const duplex = new Duplex({
67
- ...options,
68
- autoDestroy: false,
69
- emitClose: false,
70
- objectMode: false,
71
- writableObjectMode: false
72
- });
73
-
74
- ws.on('message', function message(msg) {
75
- if (!duplex.push(msg)) {
76
- resumeOnReceiverDrain = false;
77
- ws._socket.pause();
78
- }
79
- });
80
-
81
- ws.once('error', function error(err) {
82
- if (duplex.destroyed) return;
83
-
84
- duplex.destroy(err);
85
- });
86
-
87
- ws.once('close', function close() {
88
- if (duplex.destroyed) return;
89
-
90
- duplex.push(null);
91
- });
92
-
93
- duplex._destroy = function (err, callback) {
94
- if (ws.readyState === ws.CLOSED) {
95
- callback(err);
96
- process.nextTick(emitClose, duplex);
97
- return;
98
- }
99
-
100
- let called = false;
101
-
102
- ws.once('error', function error(err) {
103
- called = true;
104
- callback(err);
105
- });
106
-
107
- ws.once('close', function close() {
108
- if (!called) callback(err);
109
- process.nextTick(emitClose, duplex);
110
- });
111
- ws.terminate();
112
- };
113
-
114
- duplex._final = function (callback) {
115
- if (ws.readyState === ws.CONNECTING) {
116
- ws.once('open', function open() {
117
- duplex._final(callback);
118
- });
119
- return;
120
- }
121
-
122
- // If the value of the `_socket` property is `null` it means that `ws` is a
123
- // client websocket and the handshake failed. In fact, when this happens, a
124
- // socket is never assigned to the websocket. Wait for the `'error'` event
125
- // that will be emitted by the websocket.
126
- if (ws._socket === null) return;
127
-
128
- if (ws._socket._writableState.finished) {
129
- callback();
130
- if (duplex._readableState.endEmitted) duplex.destroy();
131
- } else {
132
- ws._socket.once('finish', function finish() {
133
- // `duplex` is not destroyed here because the `'end'` event will be
134
- // emitted on `duplex` after this `'finish'` event. The EOF signaling
135
- // `null` chunk is, in fact, pushed when the websocket emits `'close'`.
136
- callback();
137
- });
138
- ws.close();
139
- }
140
- };
141
-
142
- duplex._read = function () {
143
- if (ws.readyState === ws.OPEN && !resumeOnReceiverDrain) {
144
- resumeOnReceiverDrain = true;
145
- if (!ws._receiver._writableState.needDrain) ws._socket.resume();
146
- }
147
- };
148
-
149
- duplex._write = function (chunk, encoding, callback) {
150
- if (ws.readyState === ws.CONNECTING) {
151
- ws.once('open', function open() {
152
- duplex._write(chunk, encoding, callback);
153
- });
154
- return;
155
- }
156
-
157
- ws.send(chunk, callback);
158
- };
159
-
160
- duplex.on('end', duplexOnEnd);
161
- duplex.on('error', duplexOnError);
162
- return duplex;
163
- }
164
-
165
- module.exports = createWebSocketStream;
@@ -1,104 +0,0 @@
1
- 'use strict';
2
-
3
- /**
4
- * Checks if a status code is allowed in a close frame.
5
- *
6
- * @param {Number} code The status code
7
- * @return {Boolean} `true` if the status code is valid, else `false`
8
- * @public
9
- */
10
- function isValidStatusCode(code) {
11
- return (
12
- (code >= 1000 &&
13
- code <= 1014 &&
14
- code !== 1004 &&
15
- code !== 1005 &&
16
- code !== 1006) ||
17
- (code >= 3000 && code <= 4999)
18
- );
19
- }
20
-
21
- /**
22
- * Checks if a given buffer contains only correct UTF-8.
23
- * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by
24
- * Markus Kuhn.
25
- *
26
- * @param {Buffer} buf The buffer to check
27
- * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false`
28
- * @public
29
- */
30
- function _isValidUTF8(buf) {
31
- const len = buf.length;
32
- let i = 0;
33
-
34
- while (i < len) {
35
- if ((buf[i] & 0x80) === 0) {
36
- // 0xxxxxxx
37
- i++;
38
- } else if ((buf[i] & 0xe0) === 0xc0) {
39
- // 110xxxxx 10xxxxxx
40
- if (
41
- i + 1 === len ||
42
- (buf[i + 1] & 0xc0) !== 0x80 ||
43
- (buf[i] & 0xfe) === 0xc0 // Overlong
44
- ) {
45
- return false;
46
- }
47
-
48
- i += 2;
49
- } else if ((buf[i] & 0xf0) === 0xe0) {
50
- // 1110xxxx 10xxxxxx 10xxxxxx
51
- if (
52
- i + 2 >= len ||
53
- (buf[i + 1] & 0xc0) !== 0x80 ||
54
- (buf[i + 2] & 0xc0) !== 0x80 ||
55
- (buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80) || // Overlong
56
- (buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0) // Surrogate (U+D800 - U+DFFF)
57
- ) {
58
- return false;
59
- }
60
-
61
- i += 3;
62
- } else if ((buf[i] & 0xf8) === 0xf0) {
63
- // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
64
- if (
65
- i + 3 >= len ||
66
- (buf[i + 1] & 0xc0) !== 0x80 ||
67
- (buf[i + 2] & 0xc0) !== 0x80 ||
68
- (buf[i + 3] & 0xc0) !== 0x80 ||
69
- (buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80) || // Overlong
70
- (buf[i] === 0xf4 && buf[i + 1] > 0x8f) ||
71
- buf[i] > 0xf4 // > U+10FFFF
72
- ) {
73
- return false;
74
- }
75
-
76
- i += 4;
77
- } else {
78
- return false;
79
- }
80
- }
81
-
82
- return true;
83
- }
84
-
85
- try {
86
- let isValidUTF8 = require('utf-8-validate');
87
-
88
- /* istanbul ignore if */
89
- if (typeof isValidUTF8 === 'object') {
90
- isValidUTF8 = isValidUTF8.Validation.isValidUTF8; // utf-8-validate@<3.0.0
91
- }
92
-
93
- module.exports = {
94
- isValidStatusCode,
95
- isValidUTF8(buf) {
96
- return buf.length < 150 ? _isValidUTF8(buf) : isValidUTF8(buf);
97
- }
98
- };
99
- } catch (e) /* istanbul ignore next */ {
100
- module.exports = {
101
- isValidStatusCode,
102
- isValidUTF8: _isValidUTF8
103
- };
104
- }