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,47 @@
1
+ Node.js is licensed for use as follows:
2
+
3
+ """
4
+ Copyright Node.js contributors. All rights reserved.
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to
8
+ deal in the Software without restriction, including without limitation the
9
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10
+ sell copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in
14
+ all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22
+ IN THE SOFTWARE.
23
+ """
24
+
25
+ This license applies to parts of Node.js originating from the
26
+ https://github.com/joyent/node repository:
27
+
28
+ """
29
+ Copyright Joyent, Inc. and other Node contributors. All rights reserved.
30
+ Permission is hereby granted, free of charge, to any person obtaining a copy
31
+ of this software and associated documentation files (the "Software"), to
32
+ deal in the Software without restriction, including without limitation the
33
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
34
+ sell copies of the Software, and to permit persons to whom the Software is
35
+ furnished to do so, subject to the following conditions:
36
+
37
+ The above copyright notice and this permission notice shall be included in
38
+ all copies or substantial portions of the Software.
39
+
40
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
41
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
42
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
43
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
44
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
45
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
46
+ IN THE SOFTWARE.
47
+ """
@@ -0,0 +1,58 @@
1
+ # readable-stream
2
+
3
+ ***Node-core v8.11.1 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream)
4
+
5
+
6
+ [![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/)
7
+ [![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/)
8
+
9
+
10
+ [![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream)
11
+
12
+ ```bash
13
+ npm install --save readable-stream
14
+ ```
15
+
16
+ ***Node-core streams for userland***
17
+
18
+ This package is a mirror of the Streams2 and Streams3 implementations in
19
+ Node-core.
20
+
21
+ Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.11.1/docs/api/stream.html).
22
+
23
+ If you want to guarantee a stable streams base, regardless of what version of
24
+ Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html).
25
+
26
+ As of version 2.0.0 **readable-stream** uses semantic versioning.
27
+
28
+ # Streams Working Group
29
+
30
+ `readable-stream` is maintained by the Streams Working Group, which
31
+ oversees the development and maintenance of the Streams API within
32
+ Node.js. The responsibilities of the Streams Working Group include:
33
+
34
+ * Addressing stream issues on the Node.js issue tracker.
35
+ * Authoring and editing stream documentation within the Node.js project.
36
+ * Reviewing changes to stream subclasses within the Node.js project.
37
+ * Redirecting changes to streams from the Node.js project to this
38
+ project.
39
+ * Assisting in the implementation of stream providers within Node.js.
40
+ * Recommending versions of `readable-stream` to be included in Node.js.
41
+ * Messaging about the future of streams to give the community advance
42
+ notice of changes.
43
+
44
+ <a name="members"></a>
45
+ ## Team Members
46
+
47
+ * **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) &lt;christopher.s.dickinson@gmail.com&gt;
48
+ - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B
49
+ * **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) &lt;calvin.metcalf@gmail.com&gt;
50
+ - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242
51
+ * **Rod Vagg** ([@rvagg](https://github.com/rvagg)) &lt;rod@vagg.org&gt;
52
+ - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D
53
+ * **Sam Newman** ([@sonewman](https://github.com/sonewman)) &lt;newmansam@outlook.com&gt;
54
+ * **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) &lt;mathiasbuus@gmail.com&gt;
55
+ * **Domenic Denicola** ([@domenic](https://github.com/domenic)) &lt;d@domenic.me&gt;
56
+ * **Matteo Collina** ([@mcollina](https://github.com/mcollina)) &lt;matteo.collina@gmail.com&gt;
57
+ - Release GPG key: 3ABC01543F22DD2239285CDD818674489FBC127E
58
+ * **Irina Shestak** ([@lrlna](https://github.com/lrlna)) &lt;shestak.irina@gmail.com&gt;
@@ -0,0 +1,60 @@
1
+ # streams WG Meeting 2015-01-30
2
+
3
+ ## Links
4
+
5
+ * **Google Hangouts Video**: http://www.youtube.com/watch?v=I9nDOSGfwZg
6
+ * **GitHub Issue**: https://github.com/iojs/readable-stream/issues/106
7
+ * **Original Minutes Google Doc**: https://docs.google.com/document/d/17aTgLnjMXIrfjgNaTUnHQO7m3xgzHR2VXBTmi03Qii4/
8
+
9
+ ## Agenda
10
+
11
+ Extracted from https://github.com/iojs/readable-stream/labels/wg-agenda prior to meeting.
12
+
13
+ * adopt a charter [#105](https://github.com/iojs/readable-stream/issues/105)
14
+ * release and versioning strategy [#101](https://github.com/iojs/readable-stream/issues/101)
15
+ * simpler stream creation [#102](https://github.com/iojs/readable-stream/issues/102)
16
+ * proposal: deprecate implicit flowing of streams [#99](https://github.com/iojs/readable-stream/issues/99)
17
+
18
+ ## Minutes
19
+
20
+ ### adopt a charter
21
+
22
+ * group: +1's all around
23
+
24
+ ### What versioning scheme should be adopted?
25
+ * group: +1’s 3.0.0
26
+ * domenic+group: pulling in patches from other sources where appropriate
27
+ * mikeal: version independently, suggesting versions for io.js
28
+ * mikeal+domenic: work with TC to notify in advance of changes
29
+ simpler stream creation
30
+
31
+ ### streamline creation of streams
32
+ * sam: streamline creation of streams
33
+ * domenic: nice simple solution posted
34
+ but, we lose the opportunity to change the model
35
+ may not be backwards incompatible (double check keys)
36
+
37
+ **action item:** domenic will check
38
+
39
+ ### remove implicit flowing of streams on(‘data’)
40
+ * add isFlowing / isPaused
41
+ * mikeal: worrying that we’re documenting polyfill methods – confuses users
42
+ * domenic: more reflective API is probably good, with warning labels for users
43
+ * new section for mad scientists (reflective stream access)
44
+ * calvin: name the “third state”
45
+ * mikeal: maybe borrow the name from whatwg?
46
+ * domenic: we’re missing the “third state”
47
+ * consensus: kind of difficult to name the third state
48
+ * mikeal: figure out differences in states / compat
49
+ * mathias: always flow on data – eliminates third state
50
+ * explore what it breaks
51
+
52
+ **action items:**
53
+ * ask isaac for ability to list packages by what public io.js APIs they use (esp. Stream)
54
+ * ask rod/build for infrastructure
55
+ * **chris**: explore the “flow on data” approach
56
+ * add isPaused/isFlowing
57
+ * add new docs section
58
+ * move isPaused to that section
59
+
60
+
@@ -0,0 +1 @@
1
+ module.exports = require('./lib/_stream_duplex.js');
@@ -0,0 +1 @@
1
+ module.exports = require('./readable').Duplex
@@ -0,0 +1,131 @@
1
+ // Copyright Joyent, Inc. and other Node contributors.
2
+ //
3
+ // Permission is hereby granted, free of charge, to any person obtaining a
4
+ // copy of this software and associated documentation files (the
5
+ // "Software"), to deal in the Software without restriction, including
6
+ // without limitation the rights to use, copy, modify, merge, publish,
7
+ // distribute, sublicense, and/or sell copies of the Software, and to permit
8
+ // persons to whom the Software is furnished to do so, subject to the
9
+ // following conditions:
10
+ //
11
+ // The above copyright notice and this permission notice shall be included
12
+ // in all copies or substantial portions of the Software.
13
+ //
14
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15
+ // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
17
+ // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18
+ // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19
+ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20
+ // USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ // a duplex stream is just a stream that is both readable and writable.
23
+ // Since JS doesn't have multiple prototypal inheritance, this class
24
+ // prototypally inherits from Readable, and then parasitically from
25
+ // Writable.
26
+
27
+ 'use strict';
28
+
29
+ /*<replacement>*/
30
+
31
+ var pna = require('process-nextick-args');
32
+ /*</replacement>*/
33
+
34
+ /*<replacement>*/
35
+ var objectKeys = Object.keys || function (obj) {
36
+ var keys = [];
37
+ for (var key in obj) {
38
+ keys.push(key);
39
+ }return keys;
40
+ };
41
+ /*</replacement>*/
42
+
43
+ module.exports = Duplex;
44
+
45
+ /*<replacement>*/
46
+ var util = Object.create(require('core-util-is'));
47
+ util.inherits = require('inherits');
48
+ /*</replacement>*/
49
+
50
+ var Readable = require('./_stream_readable');
51
+ var Writable = require('./_stream_writable');
52
+
53
+ util.inherits(Duplex, Readable);
54
+
55
+ {
56
+ // avoid scope creep, the keys array can then be collected
57
+ var keys = objectKeys(Writable.prototype);
58
+ for (var v = 0; v < keys.length; v++) {
59
+ var method = keys[v];
60
+ if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
61
+ }
62
+ }
63
+
64
+ function Duplex(options) {
65
+ if (!(this instanceof Duplex)) return new Duplex(options);
66
+
67
+ Readable.call(this, options);
68
+ Writable.call(this, options);
69
+
70
+ if (options && options.readable === false) this.readable = false;
71
+
72
+ if (options && options.writable === false) this.writable = false;
73
+
74
+ this.allowHalfOpen = true;
75
+ if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;
76
+
77
+ this.once('end', onend);
78
+ }
79
+
80
+ Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', {
81
+ // making it explicit this property is not enumerable
82
+ // because otherwise some prototype manipulation in
83
+ // userland will fail
84
+ enumerable: false,
85
+ get: function () {
86
+ return this._writableState.highWaterMark;
87
+ }
88
+ });
89
+
90
+ // the no-half-open enforcer
91
+ function onend() {
92
+ // if we allow half-open state, or if the writable side ended,
93
+ // then we're ok.
94
+ if (this.allowHalfOpen || this._writableState.ended) return;
95
+
96
+ // no more data can be written.
97
+ // But allow more writes to happen in this tick.
98
+ pna.nextTick(onEndNT, this);
99
+ }
100
+
101
+ function onEndNT(self) {
102
+ self.end();
103
+ }
104
+
105
+ Object.defineProperty(Duplex.prototype, 'destroyed', {
106
+ get: function () {
107
+ if (this._readableState === undefined || this._writableState === undefined) {
108
+ return false;
109
+ }
110
+ return this._readableState.destroyed && this._writableState.destroyed;
111
+ },
112
+ set: function (value) {
113
+ // we ignore the value if the stream
114
+ // has not been initialized yet
115
+ if (this._readableState === undefined || this._writableState === undefined) {
116
+ return;
117
+ }
118
+
119
+ // backward compatibility, the user is explicitly
120
+ // managing destroyed
121
+ this._readableState.destroyed = value;
122
+ this._writableState.destroyed = value;
123
+ }
124
+ });
125
+
126
+ Duplex.prototype._destroy = function (err, cb) {
127
+ this.push(null);
128
+ this.end();
129
+
130
+ pna.nextTick(cb, err);
131
+ };
@@ -0,0 +1,47 @@
1
+ // Copyright Joyent, Inc. and other Node contributors.
2
+ //
3
+ // Permission is hereby granted, free of charge, to any person obtaining a
4
+ // copy of this software and associated documentation files (the
5
+ // "Software"), to deal in the Software without restriction, including
6
+ // without limitation the rights to use, copy, modify, merge, publish,
7
+ // distribute, sublicense, and/or sell copies of the Software, and to permit
8
+ // persons to whom the Software is furnished to do so, subject to the
9
+ // following conditions:
10
+ //
11
+ // The above copyright notice and this permission notice shall be included
12
+ // in all copies or substantial portions of the Software.
13
+ //
14
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15
+ // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
17
+ // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18
+ // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19
+ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20
+ // USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ // a passthrough stream.
23
+ // basically just the most minimal sort of Transform stream.
24
+ // Every written chunk gets output as-is.
25
+
26
+ 'use strict';
27
+
28
+ module.exports = PassThrough;
29
+
30
+ var Transform = require('./_stream_transform');
31
+
32
+ /*<replacement>*/
33
+ var util = Object.create(require('core-util-is'));
34
+ util.inherits = require('inherits');
35
+ /*</replacement>*/
36
+
37
+ util.inherits(PassThrough, Transform);
38
+
39
+ function PassThrough(options) {
40
+ if (!(this instanceof PassThrough)) return new PassThrough(options);
41
+
42
+ Transform.call(this, options);
43
+ }
44
+
45
+ PassThrough.prototype._transform = function (chunk, encoding, cb) {
46
+ cb(null, chunk);
47
+ };
@@ -0,0 +1,1019 @@
1
+ // Copyright Joyent, Inc. and other Node contributors.
2
+ //
3
+ // Permission is hereby granted, free of charge, to any person obtaining a
4
+ // copy of this software and associated documentation files (the
5
+ // "Software"), to deal in the Software without restriction, including
6
+ // without limitation the rights to use, copy, modify, merge, publish,
7
+ // distribute, sublicense, and/or sell copies of the Software, and to permit
8
+ // persons to whom the Software is furnished to do so, subject to the
9
+ // following conditions:
10
+ //
11
+ // The above copyright notice and this permission notice shall be included
12
+ // in all copies or substantial portions of the Software.
13
+ //
14
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15
+ // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
17
+ // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18
+ // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19
+ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20
+ // USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ 'use strict';
23
+
24
+ /*<replacement>*/
25
+
26
+ var pna = require('process-nextick-args');
27
+ /*</replacement>*/
28
+
29
+ module.exports = Readable;
30
+
31
+ /*<replacement>*/
32
+ var isArray = require('isarray');
33
+ /*</replacement>*/
34
+
35
+ /*<replacement>*/
36
+ var Duplex;
37
+ /*</replacement>*/
38
+
39
+ Readable.ReadableState = ReadableState;
40
+
41
+ /*<replacement>*/
42
+ var EE = require('events').EventEmitter;
43
+
44
+ var EElistenerCount = function (emitter, type) {
45
+ return emitter.listeners(type).length;
46
+ };
47
+ /*</replacement>*/
48
+
49
+ /*<replacement>*/
50
+ var Stream = require('./internal/streams/stream');
51
+ /*</replacement>*/
52
+
53
+ /*<replacement>*/
54
+
55
+ var Buffer = require('safe-buffer').Buffer;
56
+ var OurUint8Array = global.Uint8Array || function () {};
57
+ function _uint8ArrayToBuffer(chunk) {
58
+ return Buffer.from(chunk);
59
+ }
60
+ function _isUint8Array(obj) {
61
+ return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
62
+ }
63
+
64
+ /*</replacement>*/
65
+
66
+ /*<replacement>*/
67
+ var util = Object.create(require('core-util-is'));
68
+ util.inherits = require('inherits');
69
+ /*</replacement>*/
70
+
71
+ /*<replacement>*/
72
+ var debugUtil = require('util');
73
+ var debug = void 0;
74
+ if (debugUtil && debugUtil.debuglog) {
75
+ debug = debugUtil.debuglog('stream');
76
+ } else {
77
+ debug = function () {};
78
+ }
79
+ /*</replacement>*/
80
+
81
+ var BufferList = require('./internal/streams/BufferList');
82
+ var destroyImpl = require('./internal/streams/destroy');
83
+ var StringDecoder;
84
+
85
+ util.inherits(Readable, Stream);
86
+
87
+ var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];
88
+
89
+ function prependListener(emitter, event, fn) {
90
+ // Sadly this is not cacheable as some libraries bundle their own
91
+ // event emitter implementation with them.
92
+ if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);
93
+
94
+ // This is a hack to make sure that our error handler is attached before any
95
+ // userland ones. NEVER DO THIS. This is here only because this code needs
96
+ // to continue to work with older versions of Node.js that do not include
97
+ // the prependListener() method. The goal is to eventually remove this hack.
98
+ if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
99
+ }
100
+
101
+ function ReadableState(options, stream) {
102
+ Duplex = Duplex || require('./_stream_duplex');
103
+
104
+ options = options || {};
105
+
106
+ // Duplex streams are both readable and writable, but share
107
+ // the same options object.
108
+ // However, some cases require setting options to different
109
+ // values for the readable and the writable sides of the duplex stream.
110
+ // These options can be provided separately as readableXXX and writableXXX.
111
+ var isDuplex = stream instanceof Duplex;
112
+
113
+ // object stream flag. Used to make read(n) ignore n and to
114
+ // make all the buffer merging and length checks go away
115
+ this.objectMode = !!options.objectMode;
116
+
117
+ if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;
118
+
119
+ // the point at which it stops calling _read() to fill the buffer
120
+ // Note: 0 is a valid value, means "don't call _read preemptively ever"
121
+ var hwm = options.highWaterMark;
122
+ var readableHwm = options.readableHighWaterMark;
123
+ var defaultHwm = this.objectMode ? 16 : 16 * 1024;
124
+
125
+ if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm;
126
+
127
+ // cast to ints.
128
+ this.highWaterMark = Math.floor(this.highWaterMark);
129
+
130
+ // A linked list is used to store data chunks instead of an array because the
131
+ // linked list can remove elements from the beginning faster than
132
+ // array.shift()
133
+ this.buffer = new BufferList();
134
+ this.length = 0;
135
+ this.pipes = null;
136
+ this.pipesCount = 0;
137
+ this.flowing = null;
138
+ this.ended = false;
139
+ this.endEmitted = false;
140
+ this.reading = false;
141
+
142
+ // a flag to be able to tell if the event 'readable'/'data' is emitted
143
+ // immediately, or on a later tick. We set this to true at first, because
144
+ // any actions that shouldn't happen until "later" should generally also
145
+ // not happen before the first read call.
146
+ this.sync = true;
147
+
148
+ // whenever we return null, then we set a flag to say
149
+ // that we're awaiting a 'readable' event emission.
150
+ this.needReadable = false;
151
+ this.emittedReadable = false;
152
+ this.readableListening = false;
153
+ this.resumeScheduled = false;
154
+
155
+ // has it been destroyed
156
+ this.destroyed = false;
157
+
158
+ // Crypto is kind of old and crusty. Historically, its default string
159
+ // encoding is 'binary' so we have to make this configurable.
160
+ // Everything else in the universe uses 'utf8', though.
161
+ this.defaultEncoding = options.defaultEncoding || 'utf8';
162
+
163
+ // the number of writers that are awaiting a drain event in .pipe()s
164
+ this.awaitDrain = 0;
165
+
166
+ // if true, a maybeReadMore has been scheduled
167
+ this.readingMore = false;
168
+
169
+ this.decoder = null;
170
+ this.encoding = null;
171
+ if (options.encoding) {
172
+ if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
173
+ this.decoder = new StringDecoder(options.encoding);
174
+ this.encoding = options.encoding;
175
+ }
176
+ }
177
+
178
+ function Readable(options) {
179
+ Duplex = Duplex || require('./_stream_duplex');
180
+
181
+ if (!(this instanceof Readable)) return new Readable(options);
182
+
183
+ this._readableState = new ReadableState(options, this);
184
+
185
+ // legacy
186
+ this.readable = true;
187
+
188
+ if (options) {
189
+ if (typeof options.read === 'function') this._read = options.read;
190
+
191
+ if (typeof options.destroy === 'function') this._destroy = options.destroy;
192
+ }
193
+
194
+ Stream.call(this);
195
+ }
196
+
197
+ Object.defineProperty(Readable.prototype, 'destroyed', {
198
+ get: function () {
199
+ if (this._readableState === undefined) {
200
+ return false;
201
+ }
202
+ return this._readableState.destroyed;
203
+ },
204
+ set: function (value) {
205
+ // we ignore the value if the stream
206
+ // has not been initialized yet
207
+ if (!this._readableState) {
208
+ return;
209
+ }
210
+
211
+ // backward compatibility, the user is explicitly
212
+ // managing destroyed
213
+ this._readableState.destroyed = value;
214
+ }
215
+ });
216
+
217
+ Readable.prototype.destroy = destroyImpl.destroy;
218
+ Readable.prototype._undestroy = destroyImpl.undestroy;
219
+ Readable.prototype._destroy = function (err, cb) {
220
+ this.push(null);
221
+ cb(err);
222
+ };
223
+
224
+ // Manually shove something into the read() buffer.
225
+ // This returns true if the highWaterMark has not been hit yet,
226
+ // similar to how Writable.write() returns true if you should
227
+ // write() some more.
228
+ Readable.prototype.push = function (chunk, encoding) {
229
+ var state = this._readableState;
230
+ var skipChunkCheck;
231
+
232
+ if (!state.objectMode) {
233
+ if (typeof chunk === 'string') {
234
+ encoding = encoding || state.defaultEncoding;
235
+ if (encoding !== state.encoding) {
236
+ chunk = Buffer.from(chunk, encoding);
237
+ encoding = '';
238
+ }
239
+ skipChunkCheck = true;
240
+ }
241
+ } else {
242
+ skipChunkCheck = true;
243
+ }
244
+
245
+ return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
246
+ };
247
+
248
+ // Unshift should *always* be something directly out of read()
249
+ Readable.prototype.unshift = function (chunk) {
250
+ return readableAddChunk(this, chunk, null, true, false);
251
+ };
252
+
253
+ function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
254
+ var state = stream._readableState;
255
+ if (chunk === null) {
256
+ state.reading = false;
257
+ onEofChunk(stream, state);
258
+ } else {
259
+ var er;
260
+ if (!skipChunkCheck) er = chunkInvalid(state, chunk);
261
+ if (er) {
262
+ stream.emit('error', er);
263
+ } else if (state.objectMode || chunk && chunk.length > 0) {
264
+ if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
265
+ chunk = _uint8ArrayToBuffer(chunk);
266
+ }
267
+
268
+ if (addToFront) {
269
+ if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true);
270
+ } else if (state.ended) {
271
+ stream.emit('error', new Error('stream.push() after EOF'));
272
+ } else {
273
+ state.reading = false;
274
+ if (state.decoder && !encoding) {
275
+ chunk = state.decoder.write(chunk);
276
+ if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
277
+ } else {
278
+ addChunk(stream, state, chunk, false);
279
+ }
280
+ }
281
+ } else if (!addToFront) {
282
+ state.reading = false;
283
+ }
284
+ }
285
+
286
+ return needMoreData(state);
287
+ }
288
+
289
+ function addChunk(stream, state, chunk, addToFront) {
290
+ if (state.flowing && state.length === 0 && !state.sync) {
291
+ stream.emit('data', chunk);
292
+ stream.read(0);
293
+ } else {
294
+ // update the buffer info.
295
+ state.length += state.objectMode ? 1 : chunk.length;
296
+ if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
297
+
298
+ if (state.needReadable) emitReadable(stream);
299
+ }
300
+ maybeReadMore(stream, state);
301
+ }
302
+
303
+ function chunkInvalid(state, chunk) {
304
+ var er;
305
+ if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
306
+ er = new TypeError('Invalid non-string/buffer chunk');
307
+ }
308
+ return er;
309
+ }
310
+
311
+ // if it's past the high water mark, we can push in some more.
312
+ // Also, if we have no data yet, we can stand some
313
+ // more bytes. This is to work around cases where hwm=0,
314
+ // such as the repl. Also, if the push() triggered a
315
+ // readable event, and the user called read(largeNumber) such that
316
+ // needReadable was set, then we ought to push more, so that another
317
+ // 'readable' event will be triggered.
318
+ function needMoreData(state) {
319
+ return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);
320
+ }
321
+
322
+ Readable.prototype.isPaused = function () {
323
+ return this._readableState.flowing === false;
324
+ };
325
+
326
+ // backwards compatibility.
327
+ Readable.prototype.setEncoding = function (enc) {
328
+ if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
329
+ this._readableState.decoder = new StringDecoder(enc);
330
+ this._readableState.encoding = enc;
331
+ return this;
332
+ };
333
+
334
+ // Don't raise the hwm > 8MB
335
+ var MAX_HWM = 0x800000;
336
+ function computeNewHighWaterMark(n) {
337
+ if (n >= MAX_HWM) {
338
+ n = MAX_HWM;
339
+ } else {
340
+ // Get the next highest power of 2 to prevent increasing hwm excessively in
341
+ // tiny amounts
342
+ n--;
343
+ n |= n >>> 1;
344
+ n |= n >>> 2;
345
+ n |= n >>> 4;
346
+ n |= n >>> 8;
347
+ n |= n >>> 16;
348
+ n++;
349
+ }
350
+ return n;
351
+ }
352
+
353
+ // This function is designed to be inlinable, so please take care when making
354
+ // changes to the function body.
355
+ function howMuchToRead(n, state) {
356
+ if (n <= 0 || state.length === 0 && state.ended) return 0;
357
+ if (state.objectMode) return 1;
358
+ if (n !== n) {
359
+ // Only flow one buffer at a time
360
+ if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
361
+ }
362
+ // If we're asking for more than the current hwm, then raise the hwm.
363
+ if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
364
+ if (n <= state.length) return n;
365
+ // Don't have enough
366
+ if (!state.ended) {
367
+ state.needReadable = true;
368
+ return 0;
369
+ }
370
+ return state.length;
371
+ }
372
+
373
+ // you can override either this method, or the async _read(n) below.
374
+ Readable.prototype.read = function (n) {
375
+ debug('read', n);
376
+ n = parseInt(n, 10);
377
+ var state = this._readableState;
378
+ var nOrig = n;
379
+
380
+ if (n !== 0) state.emittedReadable = false;
381
+
382
+ // if we're doing read(0) to trigger a readable event, but we
383
+ // already have a bunch of data in the buffer, then just trigger
384
+ // the 'readable' event and move on.
385
+ if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {
386
+ debug('read: emitReadable', state.length, state.ended);
387
+ if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
388
+ return null;
389
+ }
390
+
391
+ n = howMuchToRead(n, state);
392
+
393
+ // if we've ended, and we're now clear, then finish it up.
394
+ if (n === 0 && state.ended) {
395
+ if (state.length === 0) endReadable(this);
396
+ return null;
397
+ }
398
+
399
+ // All the actual chunk generation logic needs to be
400
+ // *below* the call to _read. The reason is that in certain
401
+ // synthetic stream cases, such as passthrough streams, _read
402
+ // may be a completely synchronous operation which may change
403
+ // the state of the read buffer, providing enough data when
404
+ // before there was *not* enough.
405
+ //
406
+ // So, the steps are:
407
+ // 1. Figure out what the state of things will be after we do
408
+ // a read from the buffer.
409
+ //
410
+ // 2. If that resulting state will trigger a _read, then call _read.
411
+ // Note that this may be asynchronous, or synchronous. Yes, it is
412
+ // deeply ugly to write APIs this way, but that still doesn't mean
413
+ // that the Readable class should behave improperly, as streams are
414
+ // designed to be sync/async agnostic.
415
+ // Take note if the _read call is sync or async (ie, if the read call
416
+ // has returned yet), so that we know whether or not it's safe to emit
417
+ // 'readable' etc.
418
+ //
419
+ // 3. Actually pull the requested chunks out of the buffer and return.
420
+
421
+ // if we need a readable event, then we need to do some reading.
422
+ var doRead = state.needReadable;
423
+ debug('need readable', doRead);
424
+
425
+ // if we currently have less than the highWaterMark, then also read some
426
+ if (state.length === 0 || state.length - n < state.highWaterMark) {
427
+ doRead = true;
428
+ debug('length less than watermark', doRead);
429
+ }
430
+
431
+ // however, if we've ended, then there's no point, and if we're already
432
+ // reading, then it's unnecessary.
433
+ if (state.ended || state.reading) {
434
+ doRead = false;
435
+ debug('reading or ended', doRead);
436
+ } else if (doRead) {
437
+ debug('do read');
438
+ state.reading = true;
439
+ state.sync = true;
440
+ // if the length is currently zero, then we *need* a readable event.
441
+ if (state.length === 0) state.needReadable = true;
442
+ // call internal read method
443
+ this._read(state.highWaterMark);
444
+ state.sync = false;
445
+ // If _read pushed data synchronously, then `reading` will be false,
446
+ // and we need to re-evaluate how much data we can return to the user.
447
+ if (!state.reading) n = howMuchToRead(nOrig, state);
448
+ }
449
+
450
+ var ret;
451
+ if (n > 0) ret = fromList(n, state);else ret = null;
452
+
453
+ if (ret === null) {
454
+ state.needReadable = true;
455
+ n = 0;
456
+ } else {
457
+ state.length -= n;
458
+ }
459
+
460
+ if (state.length === 0) {
461
+ // If we have nothing in the buffer, then we want to know
462
+ // as soon as we *do* get something into the buffer.
463
+ if (!state.ended) state.needReadable = true;
464
+
465
+ // If we tried to read() past the EOF, then emit end on the next tick.
466
+ if (nOrig !== n && state.ended) endReadable(this);
467
+ }
468
+
469
+ if (ret !== null) this.emit('data', ret);
470
+
471
+ return ret;
472
+ };
473
+
474
+ function onEofChunk(stream, state) {
475
+ if (state.ended) return;
476
+ if (state.decoder) {
477
+ var chunk = state.decoder.end();
478
+ if (chunk && chunk.length) {
479
+ state.buffer.push(chunk);
480
+ state.length += state.objectMode ? 1 : chunk.length;
481
+ }
482
+ }
483
+ state.ended = true;
484
+
485
+ // emit 'readable' now to make sure it gets picked up.
486
+ emitReadable(stream);
487
+ }
488
+
489
+ // Don't emit readable right away in sync mode, because this can trigger
490
+ // another read() call => stack overflow. This way, it might trigger
491
+ // a nextTick recursion warning, but that's not so bad.
492
+ function emitReadable(stream) {
493
+ var state = stream._readableState;
494
+ state.needReadable = false;
495
+ if (!state.emittedReadable) {
496
+ debug('emitReadable', state.flowing);
497
+ state.emittedReadable = true;
498
+ if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream);
499
+ }
500
+ }
501
+
502
+ function emitReadable_(stream) {
503
+ debug('emit readable');
504
+ stream.emit('readable');
505
+ flow(stream);
506
+ }
507
+
508
+ // at this point, the user has presumably seen the 'readable' event,
509
+ // and called read() to consume some data. that may have triggered
510
+ // in turn another _read(n) call, in which case reading = true if
511
+ // it's in progress.
512
+ // However, if we're not ended, or reading, and the length < hwm,
513
+ // then go ahead and try to read some more preemptively.
514
+ function maybeReadMore(stream, state) {
515
+ if (!state.readingMore) {
516
+ state.readingMore = true;
517
+ pna.nextTick(maybeReadMore_, stream, state);
518
+ }
519
+ }
520
+
521
+ function maybeReadMore_(stream, state) {
522
+ var len = state.length;
523
+ while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {
524
+ debug('maybeReadMore read 0');
525
+ stream.read(0);
526
+ if (len === state.length)
527
+ // didn't get any data, stop spinning.
528
+ break;else len = state.length;
529
+ }
530
+ state.readingMore = false;
531
+ }
532
+
533
+ // abstract method. to be overridden in specific implementation classes.
534
+ // call cb(er, data) where data is <= n in length.
535
+ // for virtual (non-string, non-buffer) streams, "length" is somewhat
536
+ // arbitrary, and perhaps not very meaningful.
537
+ Readable.prototype._read = function (n) {
538
+ this.emit('error', new Error('_read() is not implemented'));
539
+ };
540
+
541
+ Readable.prototype.pipe = function (dest, pipeOpts) {
542
+ var src = this;
543
+ var state = this._readableState;
544
+
545
+ switch (state.pipesCount) {
546
+ case 0:
547
+ state.pipes = dest;
548
+ break;
549
+ case 1:
550
+ state.pipes = [state.pipes, dest];
551
+ break;
552
+ default:
553
+ state.pipes.push(dest);
554
+ break;
555
+ }
556
+ state.pipesCount += 1;
557
+ debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
558
+
559
+ var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
560
+
561
+ var endFn = doEnd ? onend : unpipe;
562
+ if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn);
563
+
564
+ dest.on('unpipe', onunpipe);
565
+ function onunpipe(readable, unpipeInfo) {
566
+ debug('onunpipe');
567
+ if (readable === src) {
568
+ if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
569
+ unpipeInfo.hasUnpiped = true;
570
+ cleanup();
571
+ }
572
+ }
573
+ }
574
+
575
+ function onend() {
576
+ debug('onend');
577
+ dest.end();
578
+ }
579
+
580
+ // when the dest drains, it reduces the awaitDrain counter
581
+ // on the source. This would be more elegant with a .once()
582
+ // handler in flow(), but adding and removing repeatedly is
583
+ // too slow.
584
+ var ondrain = pipeOnDrain(src);
585
+ dest.on('drain', ondrain);
586
+
587
+ var cleanedUp = false;
588
+ function cleanup() {
589
+ debug('cleanup');
590
+ // cleanup event handlers once the pipe is broken
591
+ dest.removeListener('close', onclose);
592
+ dest.removeListener('finish', onfinish);
593
+ dest.removeListener('drain', ondrain);
594
+ dest.removeListener('error', onerror);
595
+ dest.removeListener('unpipe', onunpipe);
596
+ src.removeListener('end', onend);
597
+ src.removeListener('end', unpipe);
598
+ src.removeListener('data', ondata);
599
+
600
+ cleanedUp = true;
601
+
602
+ // if the reader is waiting for a drain event from this
603
+ // specific writer, then it would cause it to never start
604
+ // flowing again.
605
+ // So, if this is awaiting a drain, then we just call it now.
606
+ // If we don't know, then assume that we are waiting for one.
607
+ if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
608
+ }
609
+
610
+ // If the user pushes more data while we're writing to dest then we'll end up
611
+ // in ondata again. However, we only want to increase awaitDrain once because
612
+ // dest will only emit one 'drain' event for the multiple writes.
613
+ // => Introduce a guard on increasing awaitDrain.
614
+ var increasedAwaitDrain = false;
615
+ src.on('data', ondata);
616
+ function ondata(chunk) {
617
+ debug('ondata');
618
+ increasedAwaitDrain = false;
619
+ var ret = dest.write(chunk);
620
+ if (false === ret && !increasedAwaitDrain) {
621
+ // If the user unpiped during `dest.write()`, it is possible
622
+ // to get stuck in a permanently paused state if that write
623
+ // also returned false.
624
+ // => Check whether `dest` is still a piping destination.
625
+ if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
626
+ debug('false write response, pause', src._readableState.awaitDrain);
627
+ src._readableState.awaitDrain++;
628
+ increasedAwaitDrain = true;
629
+ }
630
+ src.pause();
631
+ }
632
+ }
633
+
634
+ // if the dest has an error, then stop piping into it.
635
+ // however, don't suppress the throwing behavior for this.
636
+ function onerror(er) {
637
+ debug('onerror', er);
638
+ unpipe();
639
+ dest.removeListener('error', onerror);
640
+ if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);
641
+ }
642
+
643
+ // Make sure our error handler is attached before userland ones.
644
+ prependListener(dest, 'error', onerror);
645
+
646
+ // Both close and finish should trigger unpipe, but only once.
647
+ function onclose() {
648
+ dest.removeListener('finish', onfinish);
649
+ unpipe();
650
+ }
651
+ dest.once('close', onclose);
652
+ function onfinish() {
653
+ debug('onfinish');
654
+ dest.removeListener('close', onclose);
655
+ unpipe();
656
+ }
657
+ dest.once('finish', onfinish);
658
+
659
+ function unpipe() {
660
+ debug('unpipe');
661
+ src.unpipe(dest);
662
+ }
663
+
664
+ // tell the dest that it's being piped to
665
+ dest.emit('pipe', src);
666
+
667
+ // start the flow if it hasn't been started already.
668
+ if (!state.flowing) {
669
+ debug('pipe resume');
670
+ src.resume();
671
+ }
672
+
673
+ return dest;
674
+ };
675
+
676
+ function pipeOnDrain(src) {
677
+ return function () {
678
+ var state = src._readableState;
679
+ debug('pipeOnDrain', state.awaitDrain);
680
+ if (state.awaitDrain) state.awaitDrain--;
681
+ if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
682
+ state.flowing = true;
683
+ flow(src);
684
+ }
685
+ };
686
+ }
687
+
688
+ Readable.prototype.unpipe = function (dest) {
689
+ var state = this._readableState;
690
+ var unpipeInfo = { hasUnpiped: false };
691
+
692
+ // if we're not piping anywhere, then do nothing.
693
+ if (state.pipesCount === 0) return this;
694
+
695
+ // just one destination. most common case.
696
+ if (state.pipesCount === 1) {
697
+ // passed in one, but it's not the right one.
698
+ if (dest && dest !== state.pipes) return this;
699
+
700
+ if (!dest) dest = state.pipes;
701
+
702
+ // got a match.
703
+ state.pipes = null;
704
+ state.pipesCount = 0;
705
+ state.flowing = false;
706
+ if (dest) dest.emit('unpipe', this, unpipeInfo);
707
+ return this;
708
+ }
709
+
710
+ // slow case. multiple pipe destinations.
711
+
712
+ if (!dest) {
713
+ // remove all.
714
+ var dests = state.pipes;
715
+ var len = state.pipesCount;
716
+ state.pipes = null;
717
+ state.pipesCount = 0;
718
+ state.flowing = false;
719
+
720
+ for (var i = 0; i < len; i++) {
721
+ dests[i].emit('unpipe', this, unpipeInfo);
722
+ }return this;
723
+ }
724
+
725
+ // try to find the right one.
726
+ var index = indexOf(state.pipes, dest);
727
+ if (index === -1) return this;
728
+
729
+ state.pipes.splice(index, 1);
730
+ state.pipesCount -= 1;
731
+ if (state.pipesCount === 1) state.pipes = state.pipes[0];
732
+
733
+ dest.emit('unpipe', this, unpipeInfo);
734
+
735
+ return this;
736
+ };
737
+
738
+ // set up data events if they are asked for
739
+ // Ensure readable listeners eventually get something
740
+ Readable.prototype.on = function (ev, fn) {
741
+ var res = Stream.prototype.on.call(this, ev, fn);
742
+
743
+ if (ev === 'data') {
744
+ // Start flowing on next tick if stream isn't explicitly paused
745
+ if (this._readableState.flowing !== false) this.resume();
746
+ } else if (ev === 'readable') {
747
+ var state = this._readableState;
748
+ if (!state.endEmitted && !state.readableListening) {
749
+ state.readableListening = state.needReadable = true;
750
+ state.emittedReadable = false;
751
+ if (!state.reading) {
752
+ pna.nextTick(nReadingNextTick, this);
753
+ } else if (state.length) {
754
+ emitReadable(this);
755
+ }
756
+ }
757
+ }
758
+
759
+ return res;
760
+ };
761
+ Readable.prototype.addListener = Readable.prototype.on;
762
+
763
+ function nReadingNextTick(self) {
764
+ debug('readable nexttick read 0');
765
+ self.read(0);
766
+ }
767
+
768
+ // pause() and resume() are remnants of the legacy readable stream API
769
+ // If the user uses them, then switch into old mode.
770
+ Readable.prototype.resume = function () {
771
+ var state = this._readableState;
772
+ if (!state.flowing) {
773
+ debug('resume');
774
+ state.flowing = true;
775
+ resume(this, state);
776
+ }
777
+ return this;
778
+ };
779
+
780
+ function resume(stream, state) {
781
+ if (!state.resumeScheduled) {
782
+ state.resumeScheduled = true;
783
+ pna.nextTick(resume_, stream, state);
784
+ }
785
+ }
786
+
787
+ function resume_(stream, state) {
788
+ if (!state.reading) {
789
+ debug('resume read 0');
790
+ stream.read(0);
791
+ }
792
+
793
+ state.resumeScheduled = false;
794
+ state.awaitDrain = 0;
795
+ stream.emit('resume');
796
+ flow(stream);
797
+ if (state.flowing && !state.reading) stream.read(0);
798
+ }
799
+
800
+ Readable.prototype.pause = function () {
801
+ debug('call pause flowing=%j', this._readableState.flowing);
802
+ if (false !== this._readableState.flowing) {
803
+ debug('pause');
804
+ this._readableState.flowing = false;
805
+ this.emit('pause');
806
+ }
807
+ return this;
808
+ };
809
+
810
+ function flow(stream) {
811
+ var state = stream._readableState;
812
+ debug('flow', state.flowing);
813
+ while (state.flowing && stream.read() !== null) {}
814
+ }
815
+
816
+ // wrap an old-style stream as the async data source.
817
+ // This is *not* part of the readable stream interface.
818
+ // It is an ugly unfortunate mess of history.
819
+ Readable.prototype.wrap = function (stream) {
820
+ var _this = this;
821
+
822
+ var state = this._readableState;
823
+ var paused = false;
824
+
825
+ stream.on('end', function () {
826
+ debug('wrapped end');
827
+ if (state.decoder && !state.ended) {
828
+ var chunk = state.decoder.end();
829
+ if (chunk && chunk.length) _this.push(chunk);
830
+ }
831
+
832
+ _this.push(null);
833
+ });
834
+
835
+ stream.on('data', function (chunk) {
836
+ debug('wrapped data');
837
+ if (state.decoder) chunk = state.decoder.write(chunk);
838
+
839
+ // don't skip over falsy values in objectMode
840
+ if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
841
+
842
+ var ret = _this.push(chunk);
843
+ if (!ret) {
844
+ paused = true;
845
+ stream.pause();
846
+ }
847
+ });
848
+
849
+ // proxy all the other methods.
850
+ // important when wrapping filters and duplexes.
851
+ for (var i in stream) {
852
+ if (this[i] === undefined && typeof stream[i] === 'function') {
853
+ this[i] = function (method) {
854
+ return function () {
855
+ return stream[method].apply(stream, arguments);
856
+ };
857
+ }(i);
858
+ }
859
+ }
860
+
861
+ // proxy certain important events.
862
+ for (var n = 0; n < kProxyEvents.length; n++) {
863
+ stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));
864
+ }
865
+
866
+ // when we try to consume some more bytes, simply unpause the
867
+ // underlying stream.
868
+ this._read = function (n) {
869
+ debug('wrapped _read', n);
870
+ if (paused) {
871
+ paused = false;
872
+ stream.resume();
873
+ }
874
+ };
875
+
876
+ return this;
877
+ };
878
+
879
+ Object.defineProperty(Readable.prototype, 'readableHighWaterMark', {
880
+ // making it explicit this property is not enumerable
881
+ // because otherwise some prototype manipulation in
882
+ // userland will fail
883
+ enumerable: false,
884
+ get: function () {
885
+ return this._readableState.highWaterMark;
886
+ }
887
+ });
888
+
889
+ // exposed for testing purposes only.
890
+ Readable._fromList = fromList;
891
+
892
+ // Pluck off n bytes from an array of buffers.
893
+ // Length is the combined lengths of all the buffers in the list.
894
+ // This function is designed to be inlinable, so please take care when making
895
+ // changes to the function body.
896
+ function fromList(n, state) {
897
+ // nothing buffered
898
+ if (state.length === 0) return null;
899
+
900
+ var ret;
901
+ if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
902
+ // read it all, truncate the list
903
+ if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);
904
+ state.buffer.clear();
905
+ } else {
906
+ // read part of list
907
+ ret = fromListPartial(n, state.buffer, state.decoder);
908
+ }
909
+
910
+ return ret;
911
+ }
912
+
913
+ // Extracts only enough buffered data to satisfy the amount requested.
914
+ // This function is designed to be inlinable, so please take care when making
915
+ // changes to the function body.
916
+ function fromListPartial(n, list, hasStrings) {
917
+ var ret;
918
+ if (n < list.head.data.length) {
919
+ // slice is the same for buffers and strings
920
+ ret = list.head.data.slice(0, n);
921
+ list.head.data = list.head.data.slice(n);
922
+ } else if (n === list.head.data.length) {
923
+ // first chunk is a perfect match
924
+ ret = list.shift();
925
+ } else {
926
+ // result spans more than one buffer
927
+ ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);
928
+ }
929
+ return ret;
930
+ }
931
+
932
+ // Copies a specified amount of characters from the list of buffered data
933
+ // chunks.
934
+ // This function is designed to be inlinable, so please take care when making
935
+ // changes to the function body.
936
+ function copyFromBufferString(n, list) {
937
+ var p = list.head;
938
+ var c = 1;
939
+ var ret = p.data;
940
+ n -= ret.length;
941
+ while (p = p.next) {
942
+ var str = p.data;
943
+ var nb = n > str.length ? str.length : n;
944
+ if (nb === str.length) ret += str;else ret += str.slice(0, n);
945
+ n -= nb;
946
+ if (n === 0) {
947
+ if (nb === str.length) {
948
+ ++c;
949
+ if (p.next) list.head = p.next;else list.head = list.tail = null;
950
+ } else {
951
+ list.head = p;
952
+ p.data = str.slice(nb);
953
+ }
954
+ break;
955
+ }
956
+ ++c;
957
+ }
958
+ list.length -= c;
959
+ return ret;
960
+ }
961
+
962
+ // Copies a specified amount of bytes from the list of buffered data chunks.
963
+ // This function is designed to be inlinable, so please take care when making
964
+ // changes to the function body.
965
+ function copyFromBuffer(n, list) {
966
+ var ret = Buffer.allocUnsafe(n);
967
+ var p = list.head;
968
+ var c = 1;
969
+ p.data.copy(ret);
970
+ n -= p.data.length;
971
+ while (p = p.next) {
972
+ var buf = p.data;
973
+ var nb = n > buf.length ? buf.length : n;
974
+ buf.copy(ret, ret.length - n, 0, nb);
975
+ n -= nb;
976
+ if (n === 0) {
977
+ if (nb === buf.length) {
978
+ ++c;
979
+ if (p.next) list.head = p.next;else list.head = list.tail = null;
980
+ } else {
981
+ list.head = p;
982
+ p.data = buf.slice(nb);
983
+ }
984
+ break;
985
+ }
986
+ ++c;
987
+ }
988
+ list.length -= c;
989
+ return ret;
990
+ }
991
+
992
+ function endReadable(stream) {
993
+ var state = stream._readableState;
994
+
995
+ // If we get here before consuming all the bytes, then that is a
996
+ // bug in node. Should never happen.
997
+ if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream');
998
+
999
+ if (!state.endEmitted) {
1000
+ state.ended = true;
1001
+ pna.nextTick(endReadableNT, state, stream);
1002
+ }
1003
+ }
1004
+
1005
+ function endReadableNT(state, stream) {
1006
+ // Check that we didn't get one last unshift.
1007
+ if (!state.endEmitted && state.length === 0) {
1008
+ state.endEmitted = true;
1009
+ stream.readable = false;
1010
+ stream.emit('end');
1011
+ }
1012
+ }
1013
+
1014
+ function indexOf(xs, x) {
1015
+ for (var i = 0, l = xs.length; i < l; i++) {
1016
+ if (xs[i] === x) return i;
1017
+ }
1018
+ return -1;
1019
+ }