UrgentcareCLI 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (308) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/Gemfile.lock +60 -25
  4. data/Notes +1 -1
  5. data/README.md +5 -5
  6. data/Rakefile +2 -0
  7. data/UrgentCare.gemspec +3 -3
  8. data/background.jpg +0 -0
  9. data/lib/UrgentCare.rb +3 -0
  10. data/lib/UrgentCare/CLI.rb +6 -2
  11. data/lib/UrgentCare/version.rb +1 -1
  12. data/lib/Urgentcare/Scraper.rb +65 -23
  13. data/node_modules/.bin/rimraf +1 -0
  14. data/node_modules/.package-lock.json +250 -0
  15. data/node_modules/balanced-match/.github/FUNDING.yml +2 -0
  16. data/node_modules/balanced-match/LICENSE.md +21 -0
  17. data/node_modules/balanced-match/README.md +97 -0
  18. data/node_modules/balanced-match/index.js +62 -0
  19. data/node_modules/balanced-match/package.json +48 -0
  20. data/node_modules/brace-expansion/LICENSE +21 -0
  21. data/node_modules/brace-expansion/README.md +129 -0
  22. data/node_modules/brace-expansion/index.js +201 -0
  23. data/node_modules/brace-expansion/package.json +47 -0
  24. data/node_modules/concat-map/.travis.yml +4 -0
  25. data/node_modules/concat-map/LICENSE +18 -0
  26. data/node_modules/concat-map/README.markdown +62 -0
  27. data/node_modules/concat-map/example/map.js +6 -0
  28. data/node_modules/concat-map/index.js +13 -0
  29. data/node_modules/concat-map/package.json +43 -0
  30. data/node_modules/concat-map/test/map.js +39 -0
  31. data/node_modules/core-util-is/LICENSE +19 -0
  32. data/node_modules/core-util-is/README.md +3 -0
  33. data/node_modules/core-util-is/float.patch +604 -0
  34. data/node_modules/core-util-is/lib/util.js +107 -0
  35. data/node_modules/core-util-is/package.json +32 -0
  36. data/node_modules/core-util-is/test.js +68 -0
  37. data/node_modules/fs.realpath/LICENSE +43 -0
  38. data/node_modules/fs.realpath/README.md +33 -0
  39. data/node_modules/fs.realpath/index.js +66 -0
  40. data/node_modules/fs.realpath/old.js +303 -0
  41. data/node_modules/fs.realpath/package.json +26 -0
  42. data/node_modules/glob/LICENSE +21 -0
  43. data/node_modules/glob/README.md +375 -0
  44. data/node_modules/glob/changelog.md +67 -0
  45. data/node_modules/glob/common.js +234 -0
  46. data/node_modules/glob/glob.js +788 -0
  47. data/node_modules/glob/package.json +51 -0
  48. data/node_modules/glob/sync.js +484 -0
  49. data/node_modules/immediate/LICENSE.txt +20 -0
  50. data/node_modules/immediate/README.md +93 -0
  51. data/node_modules/immediate/dist/immediate.js +75 -0
  52. data/node_modules/immediate/dist/immediate.min.js +1 -0
  53. data/node_modules/immediate/lib/browser.js +69 -0
  54. data/node_modules/immediate/lib/index.js +73 -0
  55. data/node_modules/immediate/package.json +42 -0
  56. data/node_modules/inflight/LICENSE +15 -0
  57. data/node_modules/inflight/README.md +37 -0
  58. data/node_modules/inflight/inflight.js +54 -0
  59. data/node_modules/inflight/package.json +29 -0
  60. data/node_modules/inherits/LICENSE +16 -0
  61. data/node_modules/inherits/README.md +42 -0
  62. data/node_modules/inherits/inherits.js +9 -0
  63. data/node_modules/inherits/inherits_browser.js +27 -0
  64. data/node_modules/inherits/package.json +29 -0
  65. data/node_modules/isarray/.npmignore +1 -0
  66. data/node_modules/isarray/.travis.yml +4 -0
  67. data/node_modules/isarray/Makefile +6 -0
  68. data/node_modules/isarray/README.md +60 -0
  69. data/node_modules/isarray/component.json +19 -0
  70. data/node_modules/isarray/index.js +5 -0
  71. data/node_modules/isarray/package.json +45 -0
  72. data/node_modules/isarray/test.js +20 -0
  73. data/node_modules/jszip/.codeclimate.yml +16 -0
  74. data/node_modules/jszip/.editorconfig +8 -0
  75. data/node_modules/jszip/.jshintignore +1 -0
  76. data/node_modules/jszip/.jshintrc +21 -0
  77. data/node_modules/jszip/.travis.yml +17 -0
  78. data/node_modules/jszip/CHANGES.md +163 -0
  79. data/node_modules/jszip/LICENSE.markdown +651 -0
  80. data/node_modules/jszip/README.markdown +35 -0
  81. data/node_modules/jszip/dist/jszip.js +30 -0
  82. data/node_modules/jszip/dist/jszip.min.js +13 -0
  83. data/node_modules/jszip/index.d.ts +270 -0
  84. data/node_modules/jszip/lib/base64.js +106 -0
  85. data/node_modules/jszip/lib/compressedObject.js +74 -0
  86. data/node_modules/jszip/lib/compressions.js +14 -0
  87. data/node_modules/jszip/lib/crc32.js +77 -0
  88. data/node_modules/jszip/lib/defaults.js +11 -0
  89. data/node_modules/jszip/lib/external.js +19 -0
  90. data/node_modules/jszip/lib/flate.js +85 -0
  91. data/node_modules/jszip/lib/generate/ZipFileWorker.js +540 -0
  92. data/node_modules/jszip/lib/generate/index.js +57 -0
  93. data/node_modules/jszip/lib/index.js +52 -0
  94. data/node_modules/jszip/lib/license_header.js +11 -0
  95. data/node_modules/jszip/lib/load.js +81 -0
  96. data/node_modules/jszip/lib/nodejs/NodejsStreamInputAdapter.js +74 -0
  97. data/node_modules/jszip/lib/nodejs/NodejsStreamOutputAdapter.js +42 -0
  98. data/node_modules/jszip/lib/nodejsUtils.js +57 -0
  99. data/node_modules/jszip/lib/object.js +389 -0
  100. data/node_modules/jszip/lib/readable-stream-browser.js +9 -0
  101. data/node_modules/jszip/lib/reader/ArrayReader.js +57 -0
  102. data/node_modules/jszip/lib/reader/DataReader.js +116 -0
  103. data/node_modules/jszip/lib/reader/NodeBufferReader.js +19 -0
  104. data/node_modules/jszip/lib/reader/StringReader.js +38 -0
  105. data/node_modules/jszip/lib/reader/Uint8ArrayReader.js +22 -0
  106. data/node_modules/jszip/lib/reader/readerFor.js +28 -0
  107. data/node_modules/jszip/lib/signature.js +7 -0
  108. data/node_modules/jszip/lib/stream/ConvertWorker.js +26 -0
  109. data/node_modules/jszip/lib/stream/Crc32Probe.js +24 -0
  110. data/node_modules/jszip/lib/stream/DataLengthProbe.js +29 -0
  111. data/node_modules/jszip/lib/stream/DataWorker.js +116 -0
  112. data/node_modules/jszip/lib/stream/GenericWorker.js +263 -0
  113. data/node_modules/jszip/lib/stream/StreamHelper.js +212 -0
  114. data/node_modules/jszip/lib/support.js +38 -0
  115. data/node_modules/jszip/lib/utf8.js +275 -0
  116. data/node_modules/jszip/lib/utils.js +476 -0
  117. data/node_modules/jszip/lib/zipEntries.js +262 -0
  118. data/node_modules/jszip/lib/zipEntry.js +294 -0
  119. data/node_modules/jszip/lib/zipObject.js +133 -0
  120. data/node_modules/jszip/package.json +63 -0
  121. data/node_modules/jszip/vendor/FileSaver.js +247 -0
  122. data/node_modules/lie/README.md +62 -0
  123. data/node_modules/lie/dist/lie.js +350 -0
  124. data/node_modules/lie/dist/lie.min.js +1 -0
  125. data/node_modules/lie/dist/lie.polyfill.js +358 -0
  126. data/node_modules/lie/dist/lie.polyfill.min.js +1 -0
  127. data/node_modules/lie/lib/browser.js +273 -0
  128. data/node_modules/lie/lib/index.js +298 -0
  129. data/node_modules/lie/license.md +7 -0
  130. data/node_modules/lie/lie.d.ts +244 -0
  131. data/node_modules/lie/package.json +69 -0
  132. data/node_modules/lie/polyfill.js +4 -0
  133. data/node_modules/minimatch/LICENSE +15 -0
  134. data/node_modules/minimatch/README.md +209 -0
  135. data/node_modules/minimatch/minimatch.js +923 -0
  136. data/node_modules/minimatch/package.json +30 -0
  137. data/node_modules/once/LICENSE +15 -0
  138. data/node_modules/once/README.md +79 -0
  139. data/node_modules/once/once.js +42 -0
  140. data/node_modules/once/package.json +33 -0
  141. data/node_modules/pako/CHANGELOG.md +164 -0
  142. data/node_modules/pako/LICENSE +21 -0
  143. data/node_modules/pako/README.md +191 -0
  144. data/node_modules/pako/dist/pako.js +6818 -0
  145. data/node_modules/pako/dist/pako.min.js +1 -0
  146. data/node_modules/pako/dist/pako_deflate.js +3997 -0
  147. data/node_modules/pako/dist/pako_deflate.min.js +1 -0
  148. data/node_modules/pako/dist/pako_inflate.js +3300 -0
  149. data/node_modules/pako/dist/pako_inflate.min.js +1 -0
  150. data/node_modules/pako/index.js +14 -0
  151. data/node_modules/pako/lib/deflate.js +400 -0
  152. data/node_modules/pako/lib/inflate.js +423 -0
  153. data/node_modules/pako/lib/utils/common.js +105 -0
  154. data/node_modules/pako/lib/utils/strings.js +187 -0
  155. data/node_modules/pako/lib/zlib/README +59 -0
  156. data/node_modules/pako/lib/zlib/adler32.js +51 -0
  157. data/node_modules/pako/lib/zlib/constants.js +68 -0
  158. data/node_modules/pako/lib/zlib/crc32.js +59 -0
  159. data/node_modules/pako/lib/zlib/deflate.js +1874 -0
  160. data/node_modules/pako/lib/zlib/gzheader.js +58 -0
  161. data/node_modules/pako/lib/zlib/inffast.js +345 -0
  162. data/node_modules/pako/lib/zlib/inflate.js +1556 -0
  163. data/node_modules/pako/lib/zlib/inftrees.js +343 -0
  164. data/node_modules/pako/lib/zlib/messages.js +32 -0
  165. data/node_modules/pako/lib/zlib/trees.js +1222 -0
  166. data/node_modules/pako/lib/zlib/zstream.js +47 -0
  167. data/node_modules/pako/package.json +44 -0
  168. data/node_modules/path-is-absolute/index.js +20 -0
  169. data/node_modules/path-is-absolute/license +21 -0
  170. data/node_modules/path-is-absolute/package.json +43 -0
  171. data/node_modules/path-is-absolute/readme.md +59 -0
  172. data/node_modules/process-nextick-args/index.js +45 -0
  173. data/node_modules/process-nextick-args/license.md +19 -0
  174. data/node_modules/process-nextick-args/package.json +25 -0
  175. data/node_modules/process-nextick-args/readme.md +18 -0
  176. data/node_modules/readable-stream/.travis.yml +34 -0
  177. data/node_modules/readable-stream/CONTRIBUTING.md +38 -0
  178. data/node_modules/readable-stream/GOVERNANCE.md +136 -0
  179. data/node_modules/readable-stream/LICENSE +47 -0
  180. data/node_modules/readable-stream/README.md +58 -0
  181. data/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md +60 -0
  182. data/node_modules/readable-stream/duplex-browser.js +1 -0
  183. data/node_modules/readable-stream/duplex.js +1 -0
  184. data/node_modules/readable-stream/lib/_stream_duplex.js +131 -0
  185. data/node_modules/readable-stream/lib/_stream_passthrough.js +47 -0
  186. data/node_modules/readable-stream/lib/_stream_readable.js +1019 -0
  187. data/node_modules/readable-stream/lib/_stream_transform.js +214 -0
  188. data/node_modules/readable-stream/lib/_stream_writable.js +687 -0
  189. data/node_modules/readable-stream/lib/internal/streams/BufferList.js +79 -0
  190. data/node_modules/readable-stream/lib/internal/streams/destroy.js +74 -0
  191. data/node_modules/readable-stream/lib/internal/streams/stream-browser.js +1 -0
  192. data/node_modules/readable-stream/lib/internal/streams/stream.js +1 -0
  193. data/node_modules/readable-stream/package.json +52 -0
  194. data/node_modules/readable-stream/passthrough.js +1 -0
  195. data/node_modules/readable-stream/readable-browser.js +7 -0
  196. data/node_modules/readable-stream/readable.js +19 -0
  197. data/node_modules/readable-stream/transform.js +1 -0
  198. data/node_modules/readable-stream/writable-browser.js +1 -0
  199. data/node_modules/readable-stream/writable.js +8 -0
  200. data/node_modules/rimraf/LICENSE +15 -0
  201. data/node_modules/rimraf/README.md +101 -0
  202. data/node_modules/rimraf/bin.js +50 -0
  203. data/node_modules/rimraf/package.json +29 -0
  204. data/node_modules/rimraf/rimraf.js +372 -0
  205. data/node_modules/safe-buffer/LICENSE +21 -0
  206. data/node_modules/safe-buffer/README.md +584 -0
  207. data/node_modules/safe-buffer/index.d.ts +187 -0
  208. data/node_modules/safe-buffer/index.js +62 -0
  209. data/node_modules/safe-buffer/package.json +37 -0
  210. data/node_modules/selenium-webdriver/CHANGES.md +1114 -0
  211. data/node_modules/selenium-webdriver/LICENSE +202 -0
  212. data/node_modules/selenium-webdriver/NOTICE +2 -0
  213. data/node_modules/selenium-webdriver/README.md +229 -0
  214. data/node_modules/selenium-webdriver/chrome.js +295 -0
  215. data/node_modules/selenium-webdriver/chromium.js +829 -0
  216. data/node_modules/selenium-webdriver/devtools/CDPConnection.js +35 -0
  217. data/node_modules/selenium-webdriver/edge.js +224 -0
  218. data/node_modules/selenium-webdriver/example/chrome_android.js +45 -0
  219. data/node_modules/selenium-webdriver/example/chrome_mobile_emulation.js +46 -0
  220. data/node_modules/selenium-webdriver/example/firefox_channels.js +84 -0
  221. data/node_modules/selenium-webdriver/example/google_search.js +50 -0
  222. data/node_modules/selenium-webdriver/example/google_search_test.js +70 -0
  223. data/node_modules/selenium-webdriver/example/headless.js +63 -0
  224. data/node_modules/selenium-webdriver/example/logging.js +64 -0
  225. data/node_modules/selenium-webdriver/firefox.js +789 -0
  226. data/node_modules/selenium-webdriver/http/index.js +324 -0
  227. data/node_modules/selenium-webdriver/http/util.js +172 -0
  228. data/node_modules/selenium-webdriver/ie.js +503 -0
  229. data/node_modules/selenium-webdriver/index.js +825 -0
  230. data/node_modules/selenium-webdriver/io/exec.js +162 -0
  231. data/node_modules/selenium-webdriver/io/index.js +348 -0
  232. data/node_modules/selenium-webdriver/io/zip.js +223 -0
  233. data/node_modules/selenium-webdriver/lib/atoms/find-elements.js +123 -0
  234. data/node_modules/selenium-webdriver/lib/atoms/get-attribute.js +101 -0
  235. data/node_modules/selenium-webdriver/lib/atoms/is-displayed.js +101 -0
  236. data/node_modules/selenium-webdriver/lib/atoms/mutation-listener.js +55 -0
  237. data/node_modules/selenium-webdriver/lib/by.js +415 -0
  238. data/node_modules/selenium-webdriver/lib/capabilities.js +553 -0
  239. data/node_modules/selenium-webdriver/lib/command.js +206 -0
  240. data/node_modules/selenium-webdriver/lib/error.js +605 -0
  241. data/node_modules/selenium-webdriver/lib/http.js +704 -0
  242. data/node_modules/selenium-webdriver/lib/input.js +946 -0
  243. data/node_modules/selenium-webdriver/lib/logging.js +661 -0
  244. data/node_modules/selenium-webdriver/lib/promise.js +285 -0
  245. data/node_modules/selenium-webdriver/lib/proxy.js +212 -0
  246. data/node_modules/selenium-webdriver/lib/session.js +77 -0
  247. data/node_modules/selenium-webdriver/lib/symbols.js +37 -0
  248. data/node_modules/selenium-webdriver/lib/until.js +429 -0
  249. data/node_modules/selenium-webdriver/lib/webdriver.js +2919 -0
  250. data/node_modules/selenium-webdriver/net/index.js +107 -0
  251. data/node_modules/selenium-webdriver/net/portprober.js +75 -0
  252. data/node_modules/selenium-webdriver/opera.js +406 -0
  253. data/node_modules/selenium-webdriver/package.json +54 -0
  254. data/node_modules/selenium-webdriver/proxy.js +32 -0
  255. data/node_modules/selenium-webdriver/remote/index.js +624 -0
  256. data/node_modules/selenium-webdriver/safari.js +168 -0
  257. data/node_modules/selenium-webdriver/testing/index.js +504 -0
  258. data/node_modules/set-immediate-shim/index.js +7 -0
  259. data/node_modules/set-immediate-shim/package.json +34 -0
  260. data/node_modules/set-immediate-shim/readme.md +31 -0
  261. data/node_modules/string_decoder/.travis.yml +50 -0
  262. data/node_modules/string_decoder/LICENSE +48 -0
  263. data/node_modules/string_decoder/README.md +47 -0
  264. data/node_modules/string_decoder/lib/string_decoder.js +296 -0
  265. data/node_modules/string_decoder/package.json +31 -0
  266. data/node_modules/tmp/CHANGELOG.md +288 -0
  267. data/node_modules/tmp/LICENSE +21 -0
  268. data/node_modules/tmp/README.md +365 -0
  269. data/node_modules/tmp/lib/tmp.js +780 -0
  270. data/node_modules/tmp/node_modules/.bin/rimraf +1 -0
  271. data/node_modules/tmp/node_modules/rimraf/CHANGELOG.md +65 -0
  272. data/node_modules/tmp/node_modules/rimraf/LICENSE +15 -0
  273. data/node_modules/tmp/node_modules/rimraf/README.md +101 -0
  274. data/node_modules/tmp/node_modules/rimraf/bin.js +68 -0
  275. data/node_modules/tmp/node_modules/rimraf/package.json +32 -0
  276. data/node_modules/tmp/node_modules/rimraf/rimraf.js +360 -0
  277. data/node_modules/tmp/package.json +58 -0
  278. data/node_modules/util-deprecate/History.md +16 -0
  279. data/node_modules/util-deprecate/LICENSE +24 -0
  280. data/node_modules/util-deprecate/README.md +53 -0
  281. data/node_modules/util-deprecate/browser.js +67 -0
  282. data/node_modules/util-deprecate/node.js +6 -0
  283. data/node_modules/util-deprecate/package.json +27 -0
  284. data/node_modules/wrappy/LICENSE +15 -0
  285. data/node_modules/wrappy/README.md +36 -0
  286. data/node_modules/wrappy/package.json +29 -0
  287. data/node_modules/wrappy/wrappy.js +33 -0
  288. data/node_modules/ws/LICENSE +21 -0
  289. data/node_modules/ws/README.md +496 -0
  290. data/node_modules/ws/browser.js +8 -0
  291. data/node_modules/ws/index.js +10 -0
  292. data/node_modules/ws/lib/buffer-util.js +129 -0
  293. data/node_modules/ws/lib/constants.js +10 -0
  294. data/node_modules/ws/lib/event-target.js +184 -0
  295. data/node_modules/ws/lib/extension.js +223 -0
  296. data/node_modules/ws/lib/limiter.js +55 -0
  297. data/node_modules/ws/lib/permessage-deflate.js +517 -0
  298. data/node_modules/ws/lib/receiver.js +507 -0
  299. data/node_modules/ws/lib/sender.js +405 -0
  300. data/node_modules/ws/lib/stream.js +165 -0
  301. data/node_modules/ws/lib/validation.js +104 -0
  302. data/node_modules/ws/lib/websocket-server.js +418 -0
  303. data/node_modules/ws/lib/websocket.js +942 -0
  304. data/node_modules/ws/package.json +56 -0
  305. data/package-lock.json +458 -0
  306. data/package.json +5 -0
  307. data/selenium.log +1 -0
  308. metadata +314 -19
@@ -0,0 +1,55 @@
1
+ 'use strict';
2
+
3
+ const kDone = Symbol('kDone');
4
+ const kRun = Symbol('kRun');
5
+
6
+ /**
7
+ * A very simple job queue with adjustable concurrency. Adapted from
8
+ * https://github.com/STRML/async-limiter
9
+ */
10
+ class Limiter {
11
+ /**
12
+ * Creates a new `Limiter`.
13
+ *
14
+ * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed
15
+ * to run concurrently
16
+ */
17
+ constructor(concurrency) {
18
+ this[kDone] = () => {
19
+ this.pending--;
20
+ this[kRun]();
21
+ };
22
+ this.concurrency = concurrency || Infinity;
23
+ this.jobs = [];
24
+ this.pending = 0;
25
+ }
26
+
27
+ /**
28
+ * Adds a job to the queue.
29
+ *
30
+ * @param {Function} job The job to run
31
+ * @public
32
+ */
33
+ add(job) {
34
+ this.jobs.push(job);
35
+ this[kRun]();
36
+ }
37
+
38
+ /**
39
+ * Removes a job from the queue and runs it if possible.
40
+ *
41
+ * @private
42
+ */
43
+ [kRun]() {
44
+ if (this.pending === this.concurrency) return;
45
+
46
+ if (this.jobs.length) {
47
+ const job = this.jobs.shift();
48
+
49
+ this.pending++;
50
+ job(this[kDone]);
51
+ }
52
+ }
53
+ }
54
+
55
+ module.exports = Limiter;
@@ -0,0 +1,517 @@
1
+ 'use strict';
2
+
3
+ const zlib = require('zlib');
4
+
5
+ const bufferUtil = require('./buffer-util');
6
+ const Limiter = require('./limiter');
7
+ const { kStatusCode, NOOP } = require('./constants');
8
+
9
+ const TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]);
10
+ const kPerMessageDeflate = Symbol('permessage-deflate');
11
+ const kTotalLength = Symbol('total-length');
12
+ const kCallback = Symbol('callback');
13
+ const kBuffers = Symbol('buffers');
14
+ const kError = Symbol('error');
15
+
16
+ //
17
+ // We limit zlib concurrency, which prevents severe memory fragmentation
18
+ // as documented in https://github.com/nodejs/node/issues/8871#issuecomment-250915913
19
+ // and https://github.com/websockets/ws/issues/1202
20
+ //
21
+ // Intentionally global; it's the global thread pool that's an issue.
22
+ //
23
+ let zlibLimiter;
24
+
25
+ /**
26
+ * permessage-deflate implementation.
27
+ */
28
+ class PerMessageDeflate {
29
+ /**
30
+ * Creates a PerMessageDeflate instance.
31
+ *
32
+ * @param {Object} [options] Configuration options
33
+ * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept
34
+ * disabling of server context takeover
35
+ * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/
36
+ * acknowledge disabling of client context takeover
37
+ * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the
38
+ * use of a custom server window size
39
+ * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support
40
+ * for, or request, a custom client window size
41
+ * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on
42
+ * deflate
43
+ * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on
44
+ * inflate
45
+ * @param {Number} [options.threshold=1024] Size (in bytes) below which
46
+ * messages should not be compressed
47
+ * @param {Number} [options.concurrencyLimit=10] The number of concurrent
48
+ * calls to zlib
49
+ * @param {Boolean} [isServer=false] Create the instance in either server or
50
+ * client mode
51
+ * @param {Number} [maxPayload=0] The maximum allowed message length
52
+ */
53
+ constructor(options, isServer, maxPayload) {
54
+ this._maxPayload = maxPayload | 0;
55
+ this._options = options || {};
56
+ this._threshold =
57
+ this._options.threshold !== undefined ? this._options.threshold : 1024;
58
+ this._isServer = !!isServer;
59
+ this._deflate = null;
60
+ this._inflate = null;
61
+
62
+ this.params = null;
63
+
64
+ if (!zlibLimiter) {
65
+ const concurrency =
66
+ this._options.concurrencyLimit !== undefined
67
+ ? this._options.concurrencyLimit
68
+ : 10;
69
+ zlibLimiter = new Limiter(concurrency);
70
+ }
71
+ }
72
+
73
+ /**
74
+ * @type {String}
75
+ */
76
+ static get extensionName() {
77
+ return 'permessage-deflate';
78
+ }
79
+
80
+ /**
81
+ * Create an extension negotiation offer.
82
+ *
83
+ * @return {Object} Extension parameters
84
+ * @public
85
+ */
86
+ offer() {
87
+ const params = {};
88
+
89
+ if (this._options.serverNoContextTakeover) {
90
+ params.server_no_context_takeover = true;
91
+ }
92
+ if (this._options.clientNoContextTakeover) {
93
+ params.client_no_context_takeover = true;
94
+ }
95
+ if (this._options.serverMaxWindowBits) {
96
+ params.server_max_window_bits = this._options.serverMaxWindowBits;
97
+ }
98
+ if (this._options.clientMaxWindowBits) {
99
+ params.client_max_window_bits = this._options.clientMaxWindowBits;
100
+ } else if (this._options.clientMaxWindowBits == null) {
101
+ params.client_max_window_bits = true;
102
+ }
103
+
104
+ return params;
105
+ }
106
+
107
+ /**
108
+ * Accept an extension negotiation offer/response.
109
+ *
110
+ * @param {Array} configurations The extension negotiation offers/reponse
111
+ * @return {Object} Accepted configuration
112
+ * @public
113
+ */
114
+ accept(configurations) {
115
+ configurations = this.normalizeParams(configurations);
116
+
117
+ this.params = this._isServer
118
+ ? this.acceptAsServer(configurations)
119
+ : this.acceptAsClient(configurations);
120
+
121
+ return this.params;
122
+ }
123
+
124
+ /**
125
+ * Releases all resources used by the extension.
126
+ *
127
+ * @public
128
+ */
129
+ cleanup() {
130
+ if (this._inflate) {
131
+ this._inflate.close();
132
+ this._inflate = null;
133
+ }
134
+
135
+ if (this._deflate) {
136
+ const callback = this._deflate[kCallback];
137
+
138
+ this._deflate.close();
139
+ this._deflate = null;
140
+
141
+ if (callback) {
142
+ callback(
143
+ new Error(
144
+ 'The deflate stream was closed while data was being processed'
145
+ )
146
+ );
147
+ }
148
+ }
149
+ }
150
+
151
+ /**
152
+ * Accept an extension negotiation offer.
153
+ *
154
+ * @param {Array} offers The extension negotiation offers
155
+ * @return {Object} Accepted configuration
156
+ * @private
157
+ */
158
+ acceptAsServer(offers) {
159
+ const opts = this._options;
160
+ const accepted = offers.find((params) => {
161
+ if (
162
+ (opts.serverNoContextTakeover === false &&
163
+ params.server_no_context_takeover) ||
164
+ (params.server_max_window_bits &&
165
+ (opts.serverMaxWindowBits === false ||
166
+ (typeof opts.serverMaxWindowBits === 'number' &&
167
+ opts.serverMaxWindowBits > params.server_max_window_bits))) ||
168
+ (typeof opts.clientMaxWindowBits === 'number' &&
169
+ !params.client_max_window_bits)
170
+ ) {
171
+ return false;
172
+ }
173
+
174
+ return true;
175
+ });
176
+
177
+ if (!accepted) {
178
+ throw new Error('None of the extension offers can be accepted');
179
+ }
180
+
181
+ if (opts.serverNoContextTakeover) {
182
+ accepted.server_no_context_takeover = true;
183
+ }
184
+ if (opts.clientNoContextTakeover) {
185
+ accepted.client_no_context_takeover = true;
186
+ }
187
+ if (typeof opts.serverMaxWindowBits === 'number') {
188
+ accepted.server_max_window_bits = opts.serverMaxWindowBits;
189
+ }
190
+ if (typeof opts.clientMaxWindowBits === 'number') {
191
+ accepted.client_max_window_bits = opts.clientMaxWindowBits;
192
+ } else if (
193
+ accepted.client_max_window_bits === true ||
194
+ opts.clientMaxWindowBits === false
195
+ ) {
196
+ delete accepted.client_max_window_bits;
197
+ }
198
+
199
+ return accepted;
200
+ }
201
+
202
+ /**
203
+ * Accept the extension negotiation response.
204
+ *
205
+ * @param {Array} response The extension negotiation response
206
+ * @return {Object} Accepted configuration
207
+ * @private
208
+ */
209
+ acceptAsClient(response) {
210
+ const params = response[0];
211
+
212
+ if (
213
+ this._options.clientNoContextTakeover === false &&
214
+ params.client_no_context_takeover
215
+ ) {
216
+ throw new Error('Unexpected parameter "client_no_context_takeover"');
217
+ }
218
+
219
+ if (!params.client_max_window_bits) {
220
+ if (typeof this._options.clientMaxWindowBits === 'number') {
221
+ params.client_max_window_bits = this._options.clientMaxWindowBits;
222
+ }
223
+ } else if (
224
+ this._options.clientMaxWindowBits === false ||
225
+ (typeof this._options.clientMaxWindowBits === 'number' &&
226
+ params.client_max_window_bits > this._options.clientMaxWindowBits)
227
+ ) {
228
+ throw new Error(
229
+ 'Unexpected or invalid parameter "client_max_window_bits"'
230
+ );
231
+ }
232
+
233
+ return params;
234
+ }
235
+
236
+ /**
237
+ * Normalize parameters.
238
+ *
239
+ * @param {Array} configurations The extension negotiation offers/reponse
240
+ * @return {Array} The offers/response with normalized parameters
241
+ * @private
242
+ */
243
+ normalizeParams(configurations) {
244
+ configurations.forEach((params) => {
245
+ Object.keys(params).forEach((key) => {
246
+ let value = params[key];
247
+
248
+ if (value.length > 1) {
249
+ throw new Error(`Parameter "${key}" must have only a single value`);
250
+ }
251
+
252
+ value = value[0];
253
+
254
+ if (key === 'client_max_window_bits') {
255
+ if (value !== true) {
256
+ const num = +value;
257
+ if (!Number.isInteger(num) || num < 8 || num > 15) {
258
+ throw new TypeError(
259
+ `Invalid value for parameter "${key}": ${value}`
260
+ );
261
+ }
262
+ value = num;
263
+ } else if (!this._isServer) {
264
+ throw new TypeError(
265
+ `Invalid value for parameter "${key}": ${value}`
266
+ );
267
+ }
268
+ } else if (key === 'server_max_window_bits') {
269
+ const num = +value;
270
+ if (!Number.isInteger(num) || num < 8 || num > 15) {
271
+ throw new TypeError(
272
+ `Invalid value for parameter "${key}": ${value}`
273
+ );
274
+ }
275
+ value = num;
276
+ } else if (
277
+ key === 'client_no_context_takeover' ||
278
+ key === 'server_no_context_takeover'
279
+ ) {
280
+ if (value !== true) {
281
+ throw new TypeError(
282
+ `Invalid value for parameter "${key}": ${value}`
283
+ );
284
+ }
285
+ } else {
286
+ throw new Error(`Unknown parameter "${key}"`);
287
+ }
288
+
289
+ params[key] = value;
290
+ });
291
+ });
292
+
293
+ return configurations;
294
+ }
295
+
296
+ /**
297
+ * Decompress data. Concurrency limited.
298
+ *
299
+ * @param {Buffer} data Compressed data
300
+ * @param {Boolean} fin Specifies whether or not this is the last fragment
301
+ * @param {Function} callback Callback
302
+ * @public
303
+ */
304
+ decompress(data, fin, callback) {
305
+ zlibLimiter.add((done) => {
306
+ this._decompress(data, fin, (err, result) => {
307
+ done();
308
+ callback(err, result);
309
+ });
310
+ });
311
+ }
312
+
313
+ /**
314
+ * Compress data. Concurrency limited.
315
+ *
316
+ * @param {Buffer} data Data to compress
317
+ * @param {Boolean} fin Specifies whether or not this is the last fragment
318
+ * @param {Function} callback Callback
319
+ * @public
320
+ */
321
+ compress(data, fin, callback) {
322
+ zlibLimiter.add((done) => {
323
+ this._compress(data, fin, (err, result) => {
324
+ done();
325
+ callback(err, result);
326
+ });
327
+ });
328
+ }
329
+
330
+ /**
331
+ * Decompress data.
332
+ *
333
+ * @param {Buffer} data Compressed data
334
+ * @param {Boolean} fin Specifies whether or not this is the last fragment
335
+ * @param {Function} callback Callback
336
+ * @private
337
+ */
338
+ _decompress(data, fin, callback) {
339
+ const endpoint = this._isServer ? 'client' : 'server';
340
+
341
+ if (!this._inflate) {
342
+ const key = `${endpoint}_max_window_bits`;
343
+ const windowBits =
344
+ typeof this.params[key] !== 'number'
345
+ ? zlib.Z_DEFAULT_WINDOWBITS
346
+ : this.params[key];
347
+
348
+ this._inflate = zlib.createInflateRaw({
349
+ ...this._options.zlibInflateOptions,
350
+ windowBits
351
+ });
352
+ this._inflate[kPerMessageDeflate] = this;
353
+ this._inflate[kTotalLength] = 0;
354
+ this._inflate[kBuffers] = [];
355
+ this._inflate.on('error', inflateOnError);
356
+ this._inflate.on('data', inflateOnData);
357
+ }
358
+
359
+ this._inflate[kCallback] = callback;
360
+
361
+ this._inflate.write(data);
362
+ if (fin) this._inflate.write(TRAILER);
363
+
364
+ this._inflate.flush(() => {
365
+ const err = this._inflate[kError];
366
+
367
+ if (err) {
368
+ this._inflate.close();
369
+ this._inflate = null;
370
+ callback(err);
371
+ return;
372
+ }
373
+
374
+ const data = bufferUtil.concat(
375
+ this._inflate[kBuffers],
376
+ this._inflate[kTotalLength]
377
+ );
378
+
379
+ if (this._inflate._readableState.endEmitted) {
380
+ this._inflate.close();
381
+ this._inflate = null;
382
+ } else {
383
+ this._inflate[kTotalLength] = 0;
384
+ this._inflate[kBuffers] = [];
385
+
386
+ if (fin && this.params[`${endpoint}_no_context_takeover`]) {
387
+ this._inflate.reset();
388
+ }
389
+ }
390
+
391
+ callback(null, data);
392
+ });
393
+ }
394
+
395
+ /**
396
+ * Compress data.
397
+ *
398
+ * @param {Buffer} data Data to compress
399
+ * @param {Boolean} fin Specifies whether or not this is the last fragment
400
+ * @param {Function} callback Callback
401
+ * @private
402
+ */
403
+ _compress(data, fin, callback) {
404
+ const endpoint = this._isServer ? 'server' : 'client';
405
+
406
+ if (!this._deflate) {
407
+ const key = `${endpoint}_max_window_bits`;
408
+ const windowBits =
409
+ typeof this.params[key] !== 'number'
410
+ ? zlib.Z_DEFAULT_WINDOWBITS
411
+ : this.params[key];
412
+
413
+ this._deflate = zlib.createDeflateRaw({
414
+ ...this._options.zlibDeflateOptions,
415
+ windowBits
416
+ });
417
+
418
+ this._deflate[kTotalLength] = 0;
419
+ this._deflate[kBuffers] = [];
420
+
421
+ //
422
+ // An `'error'` event is emitted, only on Node.js < 10.0.0, if the
423
+ // `zlib.DeflateRaw` instance is closed while data is being processed.
424
+ // This can happen if `PerMessageDeflate#cleanup()` is called at the wrong
425
+ // time due to an abnormal WebSocket closure.
426
+ //
427
+ this._deflate.on('error', NOOP);
428
+ this._deflate.on('data', deflateOnData);
429
+ }
430
+
431
+ this._deflate[kCallback] = callback;
432
+
433
+ this._deflate.write(data);
434
+ this._deflate.flush(zlib.Z_SYNC_FLUSH, () => {
435
+ if (!this._deflate) {
436
+ //
437
+ // The deflate stream was closed while data was being processed.
438
+ //
439
+ return;
440
+ }
441
+
442
+ let data = bufferUtil.concat(
443
+ this._deflate[kBuffers],
444
+ this._deflate[kTotalLength]
445
+ );
446
+
447
+ if (fin) data = data.slice(0, data.length - 4);
448
+
449
+ //
450
+ // Ensure that the callback will not be called again in
451
+ // `PerMessageDeflate#cleanup()`.
452
+ //
453
+ this._deflate[kCallback] = null;
454
+
455
+ this._deflate[kTotalLength] = 0;
456
+ this._deflate[kBuffers] = [];
457
+
458
+ if (fin && this.params[`${endpoint}_no_context_takeover`]) {
459
+ this._deflate.reset();
460
+ }
461
+
462
+ callback(null, data);
463
+ });
464
+ }
465
+ }
466
+
467
+ module.exports = PerMessageDeflate;
468
+
469
+ /**
470
+ * The listener of the `zlib.DeflateRaw` stream `'data'` event.
471
+ *
472
+ * @param {Buffer} chunk A chunk of data
473
+ * @private
474
+ */
475
+ function deflateOnData(chunk) {
476
+ this[kBuffers].push(chunk);
477
+ this[kTotalLength] += chunk.length;
478
+ }
479
+
480
+ /**
481
+ * The listener of the `zlib.InflateRaw` stream `'data'` event.
482
+ *
483
+ * @param {Buffer} chunk A chunk of data
484
+ * @private
485
+ */
486
+ function inflateOnData(chunk) {
487
+ this[kTotalLength] += chunk.length;
488
+
489
+ if (
490
+ this[kPerMessageDeflate]._maxPayload < 1 ||
491
+ this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload
492
+ ) {
493
+ this[kBuffers].push(chunk);
494
+ return;
495
+ }
496
+
497
+ this[kError] = new RangeError('Max payload size exceeded');
498
+ this[kError][kStatusCode] = 1009;
499
+ this.removeListener('data', inflateOnData);
500
+ this.reset();
501
+ }
502
+
503
+ /**
504
+ * The listener of the `zlib.InflateRaw` stream `'error'` event.
505
+ *
506
+ * @param {Error} err The emitted error
507
+ * @private
508
+ */
509
+ function inflateOnError(err) {
510
+ //
511
+ // There is no need to call `Zlib#close()` as the handle is automatically
512
+ // closed when an error is emitted.
513
+ //
514
+ this[kPerMessageDeflate]._inflate = null;
515
+ err[kStatusCode] = 1007;
516
+ this[kCallback](err);
517
+ }