postdoc 0.1.2 → 0.2.0.beta4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (372) hide show
  1. checksums.yaml +5 -5
  2. data/lib/pdf.js +27 -0
  3. data/lib/postdoc.rb +3 -7
  4. data/node_modules/agent-base/History.md +113 -0
  5. data/node_modules/agent-base/README.md +145 -0
  6. data/node_modules/agent-base/index.js +160 -0
  7. data/node_modules/agent-base/package.json +35 -0
  8. data/node_modules/agent-base/patch-core.js +37 -0
  9. data/node_modules/agent-base/test/ssl-cert-snakeoil.key +15 -0
  10. data/node_modules/agent-base/test/ssl-cert-snakeoil.pem +12 -0
  11. data/node_modules/agent-base/test/test.js +673 -0
  12. data/node_modules/async-limiter/LICENSE +8 -0
  13. data/node_modules/async-limiter/coverage/coverage.json +1 -0
  14. data/node_modules/async-limiter/coverage/lcov-report/async-throttle/index.html +73 -0
  15. data/node_modules/async-limiter/coverage/lcov-report/async-throttle/index.js.html +246 -0
  16. data/node_modules/async-limiter/coverage/lcov-report/base.css +182 -0
  17. data/node_modules/async-limiter/coverage/lcov-report/index.html +73 -0
  18. data/node_modules/async-limiter/coverage/lcov-report/prettify.css +1 -0
  19. data/node_modules/async-limiter/coverage/lcov-report/prettify.js +1 -0
  20. data/node_modules/async-limiter/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  21. data/node_modules/async-limiter/coverage/lcov-report/sorter.js +156 -0
  22. data/node_modules/async-limiter/coverage/lcov.info +74 -0
  23. data/node_modules/async-limiter/index.js +67 -0
  24. data/node_modules/async-limiter/package.json +35 -0
  25. data/node_modules/async-limiter/readme.md +132 -0
  26. data/node_modules/balanced-match/LICENSE.md +21 -0
  27. data/node_modules/balanced-match/README.md +91 -0
  28. data/node_modules/balanced-match/index.js +59 -0
  29. data/node_modules/balanced-match/package.json +49 -0
  30. data/node_modules/brace-expansion/LICENSE +21 -0
  31. data/node_modules/brace-expansion/README.md +129 -0
  32. data/node_modules/brace-expansion/index.js +201 -0
  33. data/node_modules/brace-expansion/package.json +47 -0
  34. data/node_modules/buffer-from/index.js +69 -0
  35. data/node_modules/buffer-from/package.json +16 -0
  36. data/node_modules/buffer-from/readme.md +69 -0
  37. data/node_modules/buffer-from/test.js +12 -0
  38. data/node_modules/concat-map/LICENSE +18 -0
  39. data/node_modules/concat-map/README.markdown +62 -0
  40. data/node_modules/concat-map/example/map.js +6 -0
  41. data/node_modules/concat-map/index.js +13 -0
  42. data/node_modules/concat-map/package.json +43 -0
  43. data/node_modules/concat-map/test/map.js +39 -0
  44. data/node_modules/concat-stream/LICENSE +24 -0
  45. data/node_modules/concat-stream/index.js +144 -0
  46. data/node_modules/concat-stream/package.json +55 -0
  47. data/node_modules/concat-stream/readme.md +102 -0
  48. data/node_modules/core-util-is/LICENSE +19 -0
  49. data/node_modules/core-util-is/README.md +3 -0
  50. data/node_modules/core-util-is/float.patch +604 -0
  51. data/node_modules/core-util-is/lib/util.js +107 -0
  52. data/node_modules/core-util-is/package.json +32 -0
  53. data/node_modules/core-util-is/test.js +68 -0
  54. data/node_modules/debug/CHANGELOG.md +395 -0
  55. data/node_modules/debug/LICENSE +19 -0
  56. data/node_modules/debug/Makefile +58 -0
  57. data/node_modules/debug/README.md +368 -0
  58. data/node_modules/debug/karma.conf.js +70 -0
  59. data/node_modules/debug/node.js +1 -0
  60. data/node_modules/debug/package.json +43 -0
  61. data/node_modules/debug/src/browser.js +195 -0
  62. data/node_modules/debug/src/debug.js +225 -0
  63. data/node_modules/debug/src/index.js +10 -0
  64. data/node_modules/debug/src/node.js +186 -0
  65. data/node_modules/es6-promise/CHANGELOG.md +151 -0
  66. data/node_modules/es6-promise/LICENSE +19 -0
  67. data/node_modules/es6-promise/README.md +97 -0
  68. data/node_modules/es6-promise/auto.js +4 -0
  69. data/node_modules/es6-promise/dist/es6-promise.auto.js +1181 -0
  70. data/node_modules/es6-promise/dist/es6-promise.auto.map +1 -0
  71. data/node_modules/es6-promise/dist/es6-promise.auto.min.js +1 -0
  72. data/node_modules/es6-promise/dist/es6-promise.auto.min.map +1 -0
  73. data/node_modules/es6-promise/dist/es6-promise.js +1179 -0
  74. data/node_modules/es6-promise/dist/es6-promise.map +1 -0
  75. data/node_modules/es6-promise/dist/es6-promise.min.js +1 -0
  76. data/node_modules/es6-promise/dist/es6-promise.min.map +1 -0
  77. data/node_modules/es6-promise/es6-promise.d.ts +81 -0
  78. data/node_modules/es6-promise/lib/es6-promise/-internal.js +266 -0
  79. data/node_modules/es6-promise/lib/es6-promise/asap.js +119 -0
  80. data/node_modules/es6-promise/lib/es6-promise/enumerator.js +113 -0
  81. data/node_modules/es6-promise/lib/es6-promise/polyfill.js +35 -0
  82. data/node_modules/es6-promise/lib/es6-promise/promise/all.js +52 -0
  83. data/node_modules/es6-promise/lib/es6-promise/promise/race.js +84 -0
  84. data/node_modules/es6-promise/lib/es6-promise/promise/reject.js +46 -0
  85. data/node_modules/es6-promise/lib/es6-promise/promise/resolve.js +48 -0
  86. data/node_modules/es6-promise/lib/es6-promise/promise.js +427 -0
  87. data/node_modules/es6-promise/lib/es6-promise/then.js +32 -0
  88. data/node_modules/es6-promise/lib/es6-promise/utils.js +21 -0
  89. data/node_modules/es6-promise/lib/es6-promise.auto.js +3 -0
  90. data/node_modules/es6-promise/lib/es6-promise.js +7 -0
  91. data/node_modules/es6-promise/package.json +75 -0
  92. data/node_modules/es6-promisify/README.md +89 -0
  93. data/node_modules/es6-promisify/dist/promise.js +73 -0
  94. data/node_modules/es6-promisify/dist/promisify.js +85 -0
  95. data/node_modules/es6-promisify/package.json +41 -0
  96. data/node_modules/extract-zip/CONTRIBUTING.md +1 -0
  97. data/node_modules/extract-zip/LICENSE +23 -0
  98. data/node_modules/extract-zip/cli.js +20 -0
  99. data/node_modules/extract-zip/index.js +205 -0
  100. data/node_modules/extract-zip/node_modules/debug/CHANGELOG.md +362 -0
  101. data/node_modules/extract-zip/node_modules/debug/LICENSE +19 -0
  102. data/node_modules/extract-zip/node_modules/debug/Makefile +50 -0
  103. data/node_modules/extract-zip/node_modules/debug/README.md +312 -0
  104. data/node_modules/extract-zip/node_modules/debug/component.json +19 -0
  105. data/node_modules/extract-zip/node_modules/debug/karma.conf.js +70 -0
  106. data/node_modules/extract-zip/node_modules/debug/node.js +1 -0
  107. data/node_modules/extract-zip/node_modules/debug/package.json +49 -0
  108. data/node_modules/extract-zip/node_modules/debug/src/browser.js +185 -0
  109. data/node_modules/extract-zip/node_modules/debug/src/debug.js +202 -0
  110. data/node_modules/extract-zip/node_modules/debug/src/index.js +10 -0
  111. data/node_modules/extract-zip/node_modules/debug/src/inspector-log.js +15 -0
  112. data/node_modules/extract-zip/node_modules/debug/src/node.js +248 -0
  113. data/node_modules/extract-zip/package.json +35 -0
  114. data/node_modules/extract-zip/readme.md +49 -0
  115. data/node_modules/fd-slicer/CHANGELOG.md +49 -0
  116. data/node_modules/fd-slicer/LICENSE +21 -0
  117. data/node_modules/fd-slicer/README.md +189 -0
  118. data/node_modules/fd-slicer/index.js +277 -0
  119. data/node_modules/fd-slicer/package.json +36 -0
  120. data/node_modules/fd-slicer/test/test.js +350 -0
  121. data/node_modules/fs.realpath/LICENSE +43 -0
  122. data/node_modules/fs.realpath/README.md +33 -0
  123. data/node_modules/fs.realpath/index.js +66 -0
  124. data/node_modules/fs.realpath/old.js +303 -0
  125. data/node_modules/fs.realpath/package.json +26 -0
  126. data/node_modules/glob/LICENSE +15 -0
  127. data/node_modules/glob/README.md +368 -0
  128. data/node_modules/glob/changelog.md +67 -0
  129. data/node_modules/glob/common.js +240 -0
  130. data/node_modules/glob/glob.js +790 -0
  131. data/node_modules/glob/package.json +43 -0
  132. data/node_modules/glob/sync.js +486 -0
  133. data/node_modules/https-proxy-agent/History.md +124 -0
  134. data/node_modules/https-proxy-agent/README.md +137 -0
  135. data/node_modules/https-proxy-agent/index.js +229 -0
  136. data/node_modules/https-proxy-agent/package.json +35 -0
  137. data/node_modules/https-proxy-agent/test/ssl-cert-snakeoil.key +15 -0
  138. data/node_modules/https-proxy-agent/test/ssl-cert-snakeoil.pem +12 -0
  139. data/node_modules/https-proxy-agent/test/test.js +342 -0
  140. data/node_modules/inflight/LICENSE +15 -0
  141. data/node_modules/inflight/README.md +37 -0
  142. data/node_modules/inflight/inflight.js +54 -0
  143. data/node_modules/inflight/package.json +29 -0
  144. data/node_modules/inherits/LICENSE +16 -0
  145. data/node_modules/inherits/README.md +42 -0
  146. data/node_modules/inherits/inherits.js +7 -0
  147. data/node_modules/inherits/inherits_browser.js +23 -0
  148. data/node_modules/inherits/package.json +29 -0
  149. data/node_modules/isarray/Makefile +6 -0
  150. data/node_modules/isarray/README.md +60 -0
  151. data/node_modules/isarray/component.json +19 -0
  152. data/node_modules/isarray/index.js +5 -0
  153. data/node_modules/isarray/package.json +45 -0
  154. data/node_modules/isarray/test.js +20 -0
  155. data/node_modules/mime/CHANGELOG.md +225 -0
  156. data/node_modules/mime/CONTRIBUTING.md +5 -0
  157. data/node_modules/mime/LICENSE +21 -0
  158. data/node_modules/mime/Mime.js +89 -0
  159. data/node_modules/mime/README.md +188 -0
  160. data/node_modules/mime/cli.js +10 -0
  161. data/node_modules/mime/index.js +4 -0
  162. data/node_modules/mime/lite.js +4 -0
  163. data/node_modules/mime/package.json +43 -0
  164. data/node_modules/mime/src/README_js.md +179 -0
  165. data/node_modules/mime/src/build.js +71 -0
  166. data/node_modules/mime/src/test.js +257 -0
  167. data/node_modules/mime/types/other.json +1 -0
  168. data/node_modules/mime/types/standard.json +1 -0
  169. data/node_modules/minimatch/LICENSE +15 -0
  170. data/node_modules/minimatch/README.md +209 -0
  171. data/node_modules/minimatch/minimatch.js +923 -0
  172. data/node_modules/minimatch/package.json +30 -0
  173. data/node_modules/minimist/LICENSE +18 -0
  174. data/node_modules/minimist/example/parse.js +2 -0
  175. data/node_modules/minimist/index.js +187 -0
  176. data/node_modules/minimist/package.json +40 -0
  177. data/node_modules/minimist/readme.markdown +73 -0
  178. data/node_modules/minimist/test/dash.js +24 -0
  179. data/node_modules/minimist/test/default_bool.js +20 -0
  180. data/node_modules/minimist/test/dotted.js +16 -0
  181. data/node_modules/minimist/test/long.js +31 -0
  182. data/node_modules/minimist/test/parse.js +318 -0
  183. data/node_modules/minimist/test/parse_modified.js +9 -0
  184. data/node_modules/minimist/test/short.js +67 -0
  185. data/node_modules/minimist/test/whitespace.js +8 -0
  186. data/node_modules/mkdirp/LICENSE +21 -0
  187. data/node_modules/mkdirp/bin/cmd.js +33 -0
  188. data/node_modules/mkdirp/bin/usage.txt +12 -0
  189. data/node_modules/mkdirp/examples/pow.js +6 -0
  190. data/node_modules/mkdirp/index.js +98 -0
  191. data/node_modules/mkdirp/package.json +27 -0
  192. data/node_modules/mkdirp/readme.markdown +100 -0
  193. data/node_modules/mkdirp/test/chmod.js +41 -0
  194. data/node_modules/mkdirp/test/clobber.js +38 -0
  195. data/node_modules/mkdirp/test/mkdirp.js +28 -0
  196. data/node_modules/mkdirp/test/opts_fs.js +29 -0
  197. data/node_modules/mkdirp/test/opts_fs_sync.js +27 -0
  198. data/node_modules/mkdirp/test/perm.js +32 -0
  199. data/node_modules/mkdirp/test/perm_sync.js +36 -0
  200. data/node_modules/mkdirp/test/race.js +37 -0
  201. data/node_modules/mkdirp/test/rel.js +32 -0
  202. data/node_modules/mkdirp/test/return.js +25 -0
  203. data/node_modules/mkdirp/test/return_sync.js +24 -0
  204. data/node_modules/mkdirp/test/root.js +19 -0
  205. data/node_modules/mkdirp/test/sync.js +32 -0
  206. data/node_modules/mkdirp/test/umask.js +28 -0
  207. data/node_modules/mkdirp/test/umask_sync.js +32 -0
  208. data/node_modules/ms/index.js +152 -0
  209. data/node_modules/ms/license.md +21 -0
  210. data/node_modules/ms/package.json +37 -0
  211. data/node_modules/ms/readme.md +51 -0
  212. data/node_modules/once/LICENSE +15 -0
  213. data/node_modules/once/README.md +79 -0
  214. data/node_modules/once/once.js +42 -0
  215. data/node_modules/once/package.json +33 -0
  216. data/node_modules/path-is-absolute/index.js +20 -0
  217. data/node_modules/path-is-absolute/license +21 -0
  218. data/node_modules/path-is-absolute/package.json +43 -0
  219. data/node_modules/path-is-absolute/readme.md +59 -0
  220. data/node_modules/pend/LICENSE +23 -0
  221. data/node_modules/pend/README.md +41 -0
  222. data/node_modules/pend/index.js +55 -0
  223. data/node_modules/pend/package.json +18 -0
  224. data/node_modules/pend/test.js +137 -0
  225. data/node_modules/process-nextick-args/index.js +44 -0
  226. data/node_modules/process-nextick-args/license.md +19 -0
  227. data/node_modules/process-nextick-args/package.json +25 -0
  228. data/node_modules/process-nextick-args/readme.md +18 -0
  229. data/node_modules/progress/CHANGELOG.md +115 -0
  230. data/node_modules/progress/LICENSE +22 -0
  231. data/node_modules/progress/Makefile +8 -0
  232. data/node_modules/progress/README.md +146 -0
  233. data/node_modules/progress/index.js +1 -0
  234. data/node_modules/progress/lib/node-progress.js +231 -0
  235. data/node_modules/progress/package.json +25 -0
  236. data/node_modules/proxy-from-env/README.md +131 -0
  237. data/node_modules/proxy-from-env/index.js +103 -0
  238. data/node_modules/proxy-from-env/package.json +35 -0
  239. data/node_modules/proxy-from-env/test.js +393 -0
  240. data/node_modules/puppeteer/CONTRIBUTING.md +206 -0
  241. data/node_modules/puppeteer/DeviceDescriptors.js +704 -0
  242. data/node_modules/puppeteer/LICENSE +202 -0
  243. data/node_modules/puppeteer/README.md +306 -0
  244. data/node_modules/puppeteer/index.js +28 -0
  245. data/node_modules/puppeteer/install.js +122 -0
  246. data/node_modules/puppeteer/lib/Browser.js +186 -0
  247. data/node_modules/puppeteer/lib/BrowserFetcher.js +279 -0
  248. data/node_modules/puppeteer/lib/Connection.js +246 -0
  249. data/node_modules/puppeteer/lib/Coverage.js +301 -0
  250. data/node_modules/puppeteer/lib/Dialog.js +84 -0
  251. data/node_modules/puppeteer/lib/ElementHandle.js +328 -0
  252. data/node_modules/puppeteer/lib/EmulationManager.js +89 -0
  253. data/node_modules/puppeteer/lib/ExecutionContext.js +232 -0
  254. data/node_modules/puppeteer/lib/FrameManager.js +997 -0
  255. data/node_modules/puppeteer/lib/Input.js +309 -0
  256. data/node_modules/puppeteer/lib/Launcher.js +310 -0
  257. data/node_modules/puppeteer/lib/Multimap.js +95 -0
  258. data/node_modules/puppeteer/lib/NavigatorWatcher.js +137 -0
  259. data/node_modules/puppeteer/lib/NetworkManager.js +796 -0
  260. data/node_modules/puppeteer/lib/Page.js +1098 -0
  261. data/node_modules/puppeteer/lib/Pipe.js +69 -0
  262. data/node_modules/puppeteer/lib/Puppeteer.js +60 -0
  263. data/node_modules/puppeteer/lib/Target.js +88 -0
  264. data/node_modules/puppeteer/lib/TaskQueue.js +17 -0
  265. data/node_modules/puppeteer/lib/Tracing.js +99 -0
  266. data/node_modules/puppeteer/lib/USKeyboardLayout.js +281 -0
  267. data/node_modules/puppeteer/lib/helper.js +248 -0
  268. data/node_modules/puppeteer/node6/lib/Browser.js +394 -0
  269. data/node_modules/puppeteer/node6/lib/BrowserFetcher.js +357 -0
  270. data/node_modules/puppeteer/node6/lib/Connection.js +350 -0
  271. data/node_modules/puppeteer/node6/lib/Coverage.js +561 -0
  272. data/node_modules/puppeteer/node6/lib/Dialog.js +136 -0
  273. data/node_modules/puppeteer/node6/lib/ElementHandle.js +796 -0
  274. data/node_modules/puppeteer/node6/lib/EmulationManager.js +115 -0
  275. data/node_modules/puppeteer/node6/lib/ExecutionContext.js +414 -0
  276. data/node_modules/puppeteer/node6/lib/FrameManager.js +1621 -0
  277. data/node_modules/puppeteer/node6/lib/Input.js +569 -0
  278. data/node_modules/puppeteer/node6/lib/Launcher.js +362 -0
  279. data/node_modules/puppeteer/node6/lib/Multimap.js +95 -0
  280. data/node_modules/puppeteer/node6/lib/NavigatorWatcher.js +163 -0
  281. data/node_modules/puppeteer/node6/lib/NetworkManager.js +1108 -0
  282. data/node_modules/puppeteer/node6/lib/Page.js +2242 -0
  283. data/node_modules/puppeteer/node6/lib/Pipe.js +69 -0
  284. data/node_modules/puppeteer/node6/lib/Puppeteer.js +60 -0
  285. data/node_modules/puppeteer/node6/lib/Target.js +114 -0
  286. data/node_modules/puppeteer/node6/lib/TaskQueue.js +17 -0
  287. data/node_modules/puppeteer/node6/lib/Tracing.js +177 -0
  288. data/node_modules/puppeteer/node6/lib/USKeyboardLayout.js +281 -0
  289. data/node_modules/puppeteer/node6/lib/helper.js +274 -0
  290. data/node_modules/puppeteer/package.json +61 -0
  291. data/node_modules/readable-stream/CONTRIBUTING.md +38 -0
  292. data/node_modules/readable-stream/GOVERNANCE.md +136 -0
  293. data/node_modules/readable-stream/LICENSE +47 -0
  294. data/node_modules/readable-stream/README.md +58 -0
  295. data/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md +60 -0
  296. data/node_modules/readable-stream/duplex-browser.js +1 -0
  297. data/node_modules/readable-stream/duplex.js +1 -0
  298. data/node_modules/readable-stream/lib/_stream_duplex.js +131 -0
  299. data/node_modules/readable-stream/lib/_stream_passthrough.js +47 -0
  300. data/node_modules/readable-stream/lib/_stream_readable.js +1019 -0
  301. data/node_modules/readable-stream/lib/_stream_transform.js +214 -0
  302. data/node_modules/readable-stream/lib/_stream_writable.js +687 -0
  303. data/node_modules/readable-stream/lib/internal/streams/BufferList.js +79 -0
  304. data/node_modules/readable-stream/lib/internal/streams/destroy.js +74 -0
  305. data/node_modules/readable-stream/lib/internal/streams/stream-browser.js +1 -0
  306. data/node_modules/readable-stream/lib/internal/streams/stream.js +1 -0
  307. data/node_modules/readable-stream/package.json +52 -0
  308. data/node_modules/readable-stream/passthrough.js +1 -0
  309. data/node_modules/readable-stream/readable-browser.js +7 -0
  310. data/node_modules/readable-stream/readable.js +19 -0
  311. data/node_modules/readable-stream/transform.js +1 -0
  312. data/node_modules/readable-stream/writable-browser.js +1 -0
  313. data/node_modules/readable-stream/writable.js +8 -0
  314. data/node_modules/rimraf/LICENSE +15 -0
  315. data/node_modules/rimraf/README.md +101 -0
  316. data/node_modules/rimraf/bin.js +50 -0
  317. data/node_modules/rimraf/package.json +26 -0
  318. data/node_modules/rimraf/rimraf.js +364 -0
  319. data/node_modules/safe-buffer/LICENSE +21 -0
  320. data/node_modules/safe-buffer/README.md +584 -0
  321. data/node_modules/safe-buffer/index.d.ts +187 -0
  322. data/node_modules/safe-buffer/index.js +62 -0
  323. data/node_modules/safe-buffer/package.json +37 -0
  324. data/node_modules/string_decoder/LICENSE +48 -0
  325. data/node_modules/string_decoder/README.md +47 -0
  326. data/node_modules/string_decoder/lib/string_decoder.js +296 -0
  327. data/node_modules/string_decoder/package.json +31 -0
  328. data/node_modules/typedarray/LICENSE +35 -0
  329. data/node_modules/typedarray/example/tarray.js +4 -0
  330. data/node_modules/typedarray/index.js +630 -0
  331. data/node_modules/typedarray/package.json +55 -0
  332. data/node_modules/typedarray/readme.markdown +61 -0
  333. data/node_modules/typedarray/test/server/undef_globals.js +19 -0
  334. data/node_modules/typedarray/test/tarray.js +10 -0
  335. data/node_modules/ultron/LICENSE +22 -0
  336. data/node_modules/ultron/README.md +113 -0
  337. data/node_modules/ultron/index.js +136 -0
  338. data/node_modules/ultron/package.json +41 -0
  339. data/node_modules/util-deprecate/History.md +16 -0
  340. data/node_modules/util-deprecate/LICENSE +24 -0
  341. data/node_modules/util-deprecate/README.md +53 -0
  342. data/node_modules/util-deprecate/browser.js +67 -0
  343. data/node_modules/util-deprecate/node.js +6 -0
  344. data/node_modules/util-deprecate/package.json +27 -0
  345. data/node_modules/wrappy/LICENSE +15 -0
  346. data/node_modules/wrappy/README.md +36 -0
  347. data/node_modules/wrappy/package.json +29 -0
  348. data/node_modules/wrappy/wrappy.js +33 -0
  349. data/node_modules/ws/LICENSE +21 -0
  350. data/node_modules/ws/README.md +341 -0
  351. data/node_modules/ws/index.js +15 -0
  352. data/node_modules/ws/lib/BufferUtil.js +71 -0
  353. data/node_modules/ws/lib/Constants.js +10 -0
  354. data/node_modules/ws/lib/ErrorCodes.js +28 -0
  355. data/node_modules/ws/lib/EventTarget.js +151 -0
  356. data/node_modules/ws/lib/Extensions.js +203 -0
  357. data/node_modules/ws/lib/PerMessageDeflate.js +507 -0
  358. data/node_modules/ws/lib/Receiver.js +553 -0
  359. data/node_modules/ws/lib/Sender.js +412 -0
  360. data/node_modules/ws/lib/Validation.js +17 -0
  361. data/node_modules/ws/lib/WebSocket.js +717 -0
  362. data/node_modules/ws/lib/WebSocketServer.js +326 -0
  363. data/node_modules/ws/package.json +46 -0
  364. data/node_modules/yauzl/LICENSE +21 -0
  365. data/node_modules/yauzl/README.md +467 -0
  366. data/node_modules/yauzl/index.js +626 -0
  367. data/node_modules/yauzl/package.json +36 -0
  368. data/package.json +5 -0
  369. data/yarn.lock +240 -0
  370. metadata +372 -7
  371. data/app/assets/stylesheets/default.css +0 -4
  372. data/lib/postdoc/postdoc_view_helper.rb +0 -22
@@ -0,0 +1,1108 @@
1
+ /**
2
+ * Copyright 2017 Google Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ const EventEmitter = require('events');
17
+ const {helper, debugError} = require('./helper');
18
+ const Multimap = require('./Multimap');
19
+
20
+ class NetworkManager extends EventEmitter {
21
+ /**
22
+ * @param {!Puppeteer.CDPSession} client
23
+ * @param {!Puppeteer.FrameManager} frameManager
24
+ */
25
+ constructor(client, frameManager) {
26
+ super();
27
+ this._client = client;
28
+ this._frameManager = frameManager;
29
+ /** @type {!Map<string, !Request>} */
30
+ this._requestIdToRequest = new Map();
31
+ /** @type {!Map<string, !Request>} */
32
+ this._interceptionIdToRequest = new Map();
33
+ /** @type {!Object<string, string>} */
34
+ this._extraHTTPHeaders = {};
35
+
36
+ this._offline = false;
37
+
38
+ /** @type {?{username: string, password: string}} */
39
+ this._credentials = null;
40
+ /** @type {!Set<string>} */
41
+ this._attemptedAuthentications = new Set();
42
+ this._userRequestInterceptionEnabled = false;
43
+ this._protocolRequestInterceptionEnabled = false;
44
+ /** @type {!Multimap} */
45
+ this._requestHashToRequestIds = new Multimap();
46
+ /** @type {!Multimap} */
47
+ this._requestHashToInterceptionIds = new Multimap();
48
+
49
+ this._client.on('Network.requestWillBeSent', this._onRequestWillBeSent.bind(this));
50
+ this._client.on('Network.requestIntercepted', this._onRequestIntercepted.bind(this));
51
+ this._client.on('Network.requestServedFromCache', this._onRequestServedFromCache.bind(this));
52
+ this._client.on('Network.responseReceived', this._onResponseReceived.bind(this));
53
+ this._client.on('Network.loadingFinished', this._onLoadingFinished.bind(this));
54
+ this._client.on('Network.loadingFailed', this._onLoadingFailed.bind(this));
55
+ }
56
+
57
+ /**
58
+ * @param {?{username: string, password: string}} credentials
59
+ */
60
+ /* async */ authenticate(credentials) {return (fn => {
61
+ const gen = fn.call(this);
62
+ return new Promise((resolve, reject) => {
63
+ function step(key, arg) {
64
+ let info, value;
65
+ try {
66
+ info = gen[key](arg);
67
+ value = info.value;
68
+ } catch (error) {
69
+ reject(error);
70
+ return;
71
+ }
72
+ if (info.done) {
73
+ resolve(value);
74
+ } else {
75
+ return Promise.resolve(value).then(
76
+ value => {
77
+ step('next', value);
78
+ },
79
+ err => {
80
+ step('throw', err);
81
+ });
82
+ }
83
+ }
84
+ return step('next');
85
+ });
86
+ })(function*(){
87
+ this._credentials = credentials;
88
+ (yield this._updateProtocolRequestInterception());
89
+ });}
90
+
91
+ /**
92
+ * @param {!Object<string, string>} extraHTTPHeaders
93
+ */
94
+ /* async */ setExtraHTTPHeaders(extraHTTPHeaders) {return (fn => {
95
+ const gen = fn.call(this);
96
+ return new Promise((resolve, reject) => {
97
+ function step(key, arg) {
98
+ let info, value;
99
+ try {
100
+ info = gen[key](arg);
101
+ value = info.value;
102
+ } catch (error) {
103
+ reject(error);
104
+ return;
105
+ }
106
+ if (info.done) {
107
+ resolve(value);
108
+ } else {
109
+ return Promise.resolve(value).then(
110
+ value => {
111
+ step('next', value);
112
+ },
113
+ err => {
114
+ step('throw', err);
115
+ });
116
+ }
117
+ }
118
+ return step('next');
119
+ });
120
+ })(function*(){
121
+ this._extraHTTPHeaders = {};
122
+ for (const key of Object.keys(extraHTTPHeaders)) {
123
+ const value = extraHTTPHeaders[key];
124
+ console.assert(helper.isString(value), `Expected value of header "${key}" to be String, but "${typeof value}" is found.`);
125
+ this._extraHTTPHeaders[key.toLowerCase()] = value;
126
+ }
127
+ (yield this._client.send('Network.setExtraHTTPHeaders', { headers: this._extraHTTPHeaders }));
128
+ });}
129
+
130
+ /**
131
+ * @return {!Object<string, string>}
132
+ */
133
+ extraHTTPHeaders() {
134
+ return Object.assign({}, this._extraHTTPHeaders);
135
+ }
136
+
137
+ /**
138
+ * @param {boolean} value
139
+ */
140
+ /* async */ setOfflineMode(value) {return (fn => {
141
+ const gen = fn.call(this);
142
+ return new Promise((resolve, reject) => {
143
+ function step(key, arg) {
144
+ let info, value;
145
+ try {
146
+ info = gen[key](arg);
147
+ value = info.value;
148
+ } catch (error) {
149
+ reject(error);
150
+ return;
151
+ }
152
+ if (info.done) {
153
+ resolve(value);
154
+ } else {
155
+ return Promise.resolve(value).then(
156
+ value => {
157
+ step('next', value);
158
+ },
159
+ err => {
160
+ step('throw', err);
161
+ });
162
+ }
163
+ }
164
+ return step('next');
165
+ });
166
+ })(function*(){
167
+ if (this._offline === value)
168
+ return;
169
+ this._offline = value;
170
+ (yield this._client.send('Network.emulateNetworkConditions', {
171
+ offline: this._offline,
172
+ // values of 0 remove any active throttling. crbug.com/456324#c9
173
+ latency: 0,
174
+ downloadThroughput: -1,
175
+ uploadThroughput: -1
176
+ }));
177
+ });}
178
+
179
+ /**
180
+ * @param {string} userAgent
181
+ */
182
+ /* async */ setUserAgent(userAgent) {return (fn => {
183
+ const gen = fn.call(this);
184
+ return new Promise((resolve, reject) => {
185
+ function step(key, arg) {
186
+ let info, value;
187
+ try {
188
+ info = gen[key](arg);
189
+ value = info.value;
190
+ } catch (error) {
191
+ reject(error);
192
+ return;
193
+ }
194
+ if (info.done) {
195
+ resolve(value);
196
+ } else {
197
+ return Promise.resolve(value).then(
198
+ value => {
199
+ step('next', value);
200
+ },
201
+ err => {
202
+ step('throw', err);
203
+ });
204
+ }
205
+ }
206
+ return step('next');
207
+ });
208
+ })(function*(){
209
+ (yield this._client.send('Network.setUserAgentOverride', { userAgent }));
210
+ });}
211
+
212
+ /**
213
+ * @param {boolean} value
214
+ */
215
+ /* async */ setRequestInterception(value) {return (fn => {
216
+ const gen = fn.call(this);
217
+ return new Promise((resolve, reject) => {
218
+ function step(key, arg) {
219
+ let info, value;
220
+ try {
221
+ info = gen[key](arg);
222
+ value = info.value;
223
+ } catch (error) {
224
+ reject(error);
225
+ return;
226
+ }
227
+ if (info.done) {
228
+ resolve(value);
229
+ } else {
230
+ return Promise.resolve(value).then(
231
+ value => {
232
+ step('next', value);
233
+ },
234
+ err => {
235
+ step('throw', err);
236
+ });
237
+ }
238
+ }
239
+ return step('next');
240
+ });
241
+ })(function*(){
242
+ this._userRequestInterceptionEnabled = value;
243
+ (yield this._updateProtocolRequestInterception());
244
+ });}
245
+
246
+ /* async */ _updateProtocolRequestInterception() {return (fn => {
247
+ const gen = fn.call(this);
248
+ return new Promise((resolve, reject) => {
249
+ function step(key, arg) {
250
+ let info, value;
251
+ try {
252
+ info = gen[key](arg);
253
+ value = info.value;
254
+ } catch (error) {
255
+ reject(error);
256
+ return;
257
+ }
258
+ if (info.done) {
259
+ resolve(value);
260
+ } else {
261
+ return Promise.resolve(value).then(
262
+ value => {
263
+ step('next', value);
264
+ },
265
+ err => {
266
+ step('throw', err);
267
+ });
268
+ }
269
+ }
270
+ return step('next');
271
+ });
272
+ })(function*(){
273
+ const enabled = this._userRequestInterceptionEnabled || !!this._credentials;
274
+ if (enabled === this._protocolRequestInterceptionEnabled)
275
+ return;
276
+ this._protocolRequestInterceptionEnabled = enabled;
277
+ const patterns = enabled ? [{urlPattern: '*'}] : [];
278
+ (yield Promise.all([
279
+ this._client.send('Network.setCacheDisabled', {cacheDisabled: enabled}),
280
+ this._client.send('Network.setRequestInterception', {patterns})
281
+ ]));
282
+ });}
283
+
284
+ /**
285
+ * @param {!Protocol.Network.requestInterceptedPayload} event
286
+ */
287
+ _onRequestIntercepted(event) {
288
+ if (event.authChallenge) {
289
+ /** @type {"Default"|"CancelAuth"|"ProvideCredentials"} */
290
+ let response = 'Default';
291
+ if (this._attemptedAuthentications.has(event.interceptionId)) {
292
+ response = 'CancelAuth';
293
+ } else if (this._credentials) {
294
+ response = 'ProvideCredentials';
295
+ this._attemptedAuthentications.add(event.interceptionId);
296
+ }
297
+ const {username, password} = this._credentials || {username: undefined, password: undefined};
298
+ this._client.send('Network.continueInterceptedRequest', {
299
+ interceptionId: event.interceptionId,
300
+ authChallengeResponse: { response, username, password }
301
+ }).catch(debugError);
302
+ return;
303
+ }
304
+ if (!this._userRequestInterceptionEnabled && this._protocolRequestInterceptionEnabled) {
305
+ this._client.send('Network.continueInterceptedRequest', {
306
+ interceptionId: event.interceptionId
307
+ }).catch(debugError);
308
+ }
309
+
310
+ if (event.redirectUrl) {
311
+ const request = this._interceptionIdToRequest.get(event.interceptionId);
312
+ if (request) {
313
+ this._handleRequestRedirect(request, event.responseStatusCode, event.responseHeaders, false /* fromDiskCache */, false /* fromServiceWorker */, null /* securityDetails */);
314
+ this._handleRequestStart(request._requestId, event.interceptionId, event.redirectUrl, event.resourceType, event.request, event.frameId, request._redirectChain);
315
+ }
316
+ return;
317
+ }
318
+ const requestHash = generateRequestHash(event.request);
319
+ const requestId = this._requestHashToRequestIds.firstValue(requestHash);
320
+ if (requestId) {
321
+ this._requestHashToRequestIds.delete(requestHash, requestId);
322
+ this._handleRequestStart(requestId, event.interceptionId, event.request.url, event.resourceType, event.request, event.frameId, []);
323
+ } else {
324
+ this._requestHashToInterceptionIds.set(requestHash, event.interceptionId);
325
+ this._handleRequestStart(null, event.interceptionId, event.request.url, event.resourceType, event.request, event.frameId, []);
326
+ }
327
+ }
328
+
329
+ /**
330
+ * @param {!Protocol.Network.requestServedFromCachePayload} event
331
+ */
332
+ _onRequestServedFromCache(event) {
333
+ const request = this._requestIdToRequest.get(event.requestId);
334
+ if (request)
335
+ request._fromMemoryCache = true;
336
+ }
337
+
338
+ /**
339
+ * @param {!Request} request
340
+ * @param {number} redirectStatus
341
+ * @param {!Object} redirectHeaders
342
+ * @param {boolean} fromDiskCache
343
+ * @param {boolean} fromServiceWorker
344
+ * @param {?Object} securityDetails
345
+ */
346
+ _handleRequestRedirect(request, redirectStatus, redirectHeaders, fromDiskCache, fromServiceWorker, securityDetails) {
347
+ const response = new Response(this._client, request, redirectStatus, redirectHeaders, fromDiskCache, fromServiceWorker, securityDetails);
348
+ request._response = response;
349
+ request._redirectChain.push(request);
350
+ response._bodyLoadedPromiseFulfill.call(null, new Error('Response body is unavailable for redirect responses'));
351
+ this._requestIdToRequest.delete(request._requestId);
352
+ this._interceptionIdToRequest.delete(request._interceptionId);
353
+ this._attemptedAuthentications.delete(request._interceptionId);
354
+ this.emit(NetworkManager.Events.Response, response);
355
+ this.emit(NetworkManager.Events.RequestFinished, request);
356
+ }
357
+
358
+ /**
359
+ * @param {?string} requestId
360
+ * @param {?string} interceptionId
361
+ * @param {string} url
362
+ * @param {string} resourceType
363
+ * @param {!Protocol.Network.Request} requestPayload
364
+ * @param {?string} frameId
365
+ * @param {!Array<!Request>} redirectChain
366
+ */
367
+ _handleRequestStart(requestId, interceptionId, url, resourceType, requestPayload, frameId, redirectChain) {
368
+ let frame = null;
369
+ if (frameId)
370
+ frame = this._frameManager.frame(frameId);
371
+ const request = new Request(this._client, requestId, interceptionId, this._userRequestInterceptionEnabled, url, resourceType, requestPayload, frame, redirectChain);
372
+ if (requestId)
373
+ this._requestIdToRequest.set(requestId, request);
374
+ if (interceptionId)
375
+ this._interceptionIdToRequest.set(interceptionId, request);
376
+ this.emit(NetworkManager.Events.Request, request);
377
+ }
378
+
379
+ /**
380
+ * @param {!Protocol.Network.requestWillBeSentPayload} event
381
+ */
382
+ _onRequestWillBeSent(event) {
383
+ if (this._protocolRequestInterceptionEnabled) {
384
+ // All redirects are handled in requestIntercepted.
385
+ if (event.redirectResponse)
386
+ return;
387
+ const requestHash = generateRequestHash(event.request);
388
+ const interceptionId = this._requestHashToInterceptionIds.firstValue(requestHash);
389
+ const request = interceptionId ? this._interceptionIdToRequest.get(interceptionId) : null;
390
+ if (request) {
391
+ request._requestId = event.requestId;
392
+ this._requestIdToRequest.set(event.requestId, request);
393
+ this._requestHashToInterceptionIds.delete(requestHash, interceptionId);
394
+ } else {
395
+ this._requestHashToRequestIds.set(requestHash, event.requestId);
396
+ }
397
+ return;
398
+ }
399
+ let redirectChain = [];
400
+ if (event.redirectResponse) {
401
+ const request = this._requestIdToRequest.get(event.requestId);
402
+ // If we connect late to the target, we could have missed the requestWillBeSent event.
403
+ if (request) {
404
+ this._handleRequestRedirect(request, event.redirectResponse.status, event.redirectResponse.headers, event.redirectResponse.fromDiskCache, event.redirectResponse.fromServiceWorker, event.redirectResponse.securityDetails);
405
+ redirectChain = request._redirectChain;
406
+ }
407
+ }
408
+ this._handleRequestStart(event.requestId, null, event.request.url, event.type, event.request, event.frameId, redirectChain);
409
+ }
410
+
411
+ /**
412
+ * @param {!Protocol.Network.responseReceivedPayload} event
413
+ */
414
+ _onResponseReceived(event) {
415
+ const request = this._requestIdToRequest.get(event.requestId);
416
+ // FileUpload sends a response without a matching request.
417
+ if (!request)
418
+ return;
419
+ const response = new Response(this._client, request, event.response.status, event.response.headers,
420
+ event.response.fromDiskCache, event.response.fromServiceWorker, event.response.securityDetails);
421
+ request._response = response;
422
+ this.emit(NetworkManager.Events.Response, response);
423
+ }
424
+
425
+ /**
426
+ * @param {!Protocol.Network.loadingFinishedPayload} event
427
+ */
428
+ _onLoadingFinished(event) {
429
+ const request = this._requestIdToRequest.get(event.requestId);
430
+ // For certain requestIds we never receive requestWillBeSent event.
431
+ // @see https://crbug.com/750469
432
+ if (!request)
433
+ return;
434
+ request.response()._bodyLoadedPromiseFulfill.call(null);
435
+ this._requestIdToRequest.delete(request._requestId);
436
+ this._interceptionIdToRequest.delete(request._interceptionId);
437
+ this._attemptedAuthentications.delete(request._interceptionId);
438
+ this.emit(NetworkManager.Events.RequestFinished, request);
439
+ }
440
+
441
+ /**
442
+ * @param {!Protocol.Network.loadingFailedPayload} event
443
+ */
444
+ _onLoadingFailed(event) {
445
+ const request = this._requestIdToRequest.get(event.requestId);
446
+ // For certain requestIds we never receive requestWillBeSent event.
447
+ // @see https://crbug.com/750469
448
+ if (!request)
449
+ return;
450
+ request._failureText = event.errorText;
451
+ const response = request.response();
452
+ if (response)
453
+ response._bodyLoadedPromiseFulfill.call(null);
454
+ this._requestIdToRequest.delete(request._requestId);
455
+ this._interceptionIdToRequest.delete(request._interceptionId);
456
+ this._attemptedAuthentications.delete(request._interceptionId);
457
+ this.emit(NetworkManager.Events.RequestFailed, request);
458
+ }
459
+ }
460
+
461
+ class Request {
462
+ /**
463
+ * @param {!Puppeteer.CDPSession} client
464
+ * @param {?string} requestId
465
+ * @param {string} interceptionId
466
+ * @param {boolean} allowInterception
467
+ * @param {string} url
468
+ * @param {string} resourceType
469
+ * @param {!Protocol.Network.Request} payload
470
+ * @param {?Puppeteer.Frame} frame
471
+ * @param {!Array<!Request>} redirectChain
472
+ */
473
+ constructor(client, requestId, interceptionId, allowInterception, url, resourceType, payload, frame, redirectChain) {
474
+ this._client = client;
475
+ this._requestId = requestId;
476
+ this._interceptionId = interceptionId;
477
+ this._allowInterception = allowInterception;
478
+ this._interceptionHandled = false;
479
+ this._response = null;
480
+ this._failureText = null;
481
+
482
+ this._url = url;
483
+ this._resourceType = resourceType.toLowerCase();
484
+ this._method = payload.method;
485
+ this._postData = payload.postData;
486
+ this._headers = {};
487
+ this._frame = frame;
488
+ this._redirectChain = redirectChain;
489
+ for (const key of Object.keys(payload.headers))
490
+ this._headers[key.toLowerCase()] = payload.headers[key];
491
+
492
+ this._fromMemoryCache = false;
493
+ }
494
+
495
+ /**
496
+ * @return {string}
497
+ */
498
+ url() {
499
+ return this._url;
500
+ }
501
+
502
+ /**
503
+ * @return {string}
504
+ */
505
+ resourceType() {
506
+ return this._resourceType;
507
+ }
508
+
509
+ /**
510
+ * @return {string}
511
+ */
512
+ method() {
513
+ return this._method;
514
+ }
515
+
516
+ /**
517
+ * @return {string}
518
+ */
519
+ postData() {
520
+ return this._postData;
521
+ }
522
+
523
+ /**
524
+ * @return {!Object}
525
+ */
526
+ headers() {
527
+ return this._headers;
528
+ }
529
+
530
+ /**
531
+ * @return {?Response}
532
+ */
533
+ response() {
534
+ return this._response;
535
+ }
536
+
537
+ /**
538
+ * @return {?Puppeteer.Frame}
539
+ */
540
+ frame() {
541
+ return this._frame;
542
+ }
543
+
544
+ /**
545
+ * @return {!Array<!Request>}
546
+ */
547
+ redirectChain() {
548
+ return this._redirectChain.slice();
549
+ }
550
+
551
+ /**
552
+ * @return {?{errorText: string}}
553
+ */
554
+ failure() {
555
+ if (!this._failureText)
556
+ return null;
557
+ return {
558
+ errorText: this._failureText
559
+ };
560
+ }
561
+
562
+ /**
563
+ * @param {!Object=} overrides
564
+ */
565
+ /* async */ continue(overrides = {}) {return (fn => {
566
+ const gen = fn.call(this);
567
+ return new Promise((resolve, reject) => {
568
+ function step(key, arg) {
569
+ let info, value;
570
+ try {
571
+ info = gen[key](arg);
572
+ value = info.value;
573
+ } catch (error) {
574
+ reject(error);
575
+ return;
576
+ }
577
+ if (info.done) {
578
+ resolve(value);
579
+ } else {
580
+ return Promise.resolve(value).then(
581
+ value => {
582
+ step('next', value);
583
+ },
584
+ err => {
585
+ step('throw', err);
586
+ });
587
+ }
588
+ }
589
+ return step('next');
590
+ });
591
+ })(function*(){
592
+ console.assert(this._allowInterception, 'Request Interception is not enabled!');
593
+ console.assert(!this._interceptionHandled, 'Request is already handled!');
594
+ this._interceptionHandled = true;
595
+ (yield this._client.send('Network.continueInterceptedRequest', {
596
+ interceptionId: this._interceptionId,
597
+ url: overrides.url,
598
+ method: overrides.method,
599
+ postData: overrides.postData,
600
+ headers: overrides.headers,
601
+ }).catch(error => {
602
+ // In certain cases, protocol will return error if the request was already canceled
603
+ // or the page was closed. We should tolerate these errors.
604
+ debugError(error);
605
+ }));
606
+ });}
607
+
608
+ /**
609
+ * @param {!{status: number, headers: Object, contentType: string, body: (string|Buffer)}} response
610
+ */
611
+ /* async */ respond(response) {return (fn => {
612
+ const gen = fn.call(this);
613
+ return new Promise((resolve, reject) => {
614
+ function step(key, arg) {
615
+ let info, value;
616
+ try {
617
+ info = gen[key](arg);
618
+ value = info.value;
619
+ } catch (error) {
620
+ reject(error);
621
+ return;
622
+ }
623
+ if (info.done) {
624
+ resolve(value);
625
+ } else {
626
+ return Promise.resolve(value).then(
627
+ value => {
628
+ step('next', value);
629
+ },
630
+ err => {
631
+ step('throw', err);
632
+ });
633
+ }
634
+ }
635
+ return step('next');
636
+ });
637
+ })(function*(){
638
+ // Mocking responses for dataURL requests is not currently supported.
639
+ if (this._url.startsWith('data:'))
640
+ return;
641
+ console.assert(this._allowInterception, 'Request Interception is not enabled!');
642
+ console.assert(!this._interceptionHandled, 'Request is already handled!');
643
+ this._interceptionHandled = true;
644
+
645
+ const responseBody = response.body && helper.isString(response.body) ? Buffer.from(/** @type {string} */(response.body)) : /** @type {?Buffer} */(response.body || null);
646
+
647
+ const responseHeaders = {};
648
+ if (response.headers) {
649
+ for (const header of Object.keys(response.headers))
650
+ responseHeaders[header.toLowerCase()] = response.headers[header];
651
+ }
652
+ if (response.contentType)
653
+ responseHeaders['content-type'] = response.contentType;
654
+ if (responseBody && !('content-length' in responseHeaders)) {
655
+ // @ts-ignore
656
+ responseHeaders['content-length'] = Buffer.byteLength(responseBody);
657
+ }
658
+
659
+ const statusCode = response.status || 200;
660
+ const statusText = statusTexts[statusCode] || '';
661
+ const statusLine = `HTTP/1.1 ${statusCode} ${statusText}`;
662
+
663
+ const CRLF = '\r\n';
664
+ let text = statusLine + CRLF;
665
+ for (const header of Object.keys(responseHeaders))
666
+ text += header + ': ' + responseHeaders[header] + CRLF;
667
+ text += CRLF;
668
+ let responseBuffer = Buffer.from(text, 'utf8');
669
+ if (responseBody)
670
+ responseBuffer = Buffer.concat([responseBuffer, responseBody]);
671
+
672
+ (yield this._client.send('Network.continueInterceptedRequest', {
673
+ interceptionId: this._interceptionId,
674
+ rawResponse: responseBuffer.toString('base64')
675
+ }).catch(error => {
676
+ // In certain cases, protocol will return error if the request was already canceled
677
+ // or the page was closed. We should tolerate these errors.
678
+ debugError(error);
679
+ }));
680
+ });}
681
+
682
+ /**
683
+ * @param {string=} errorCode
684
+ */
685
+ /* async */ abort(errorCode = 'failed') {return (fn => {
686
+ const gen = fn.call(this);
687
+ return new Promise((resolve, reject) => {
688
+ function step(key, arg) {
689
+ let info, value;
690
+ try {
691
+ info = gen[key](arg);
692
+ value = info.value;
693
+ } catch (error) {
694
+ reject(error);
695
+ return;
696
+ }
697
+ if (info.done) {
698
+ resolve(value);
699
+ } else {
700
+ return Promise.resolve(value).then(
701
+ value => {
702
+ step('next', value);
703
+ },
704
+ err => {
705
+ step('throw', err);
706
+ });
707
+ }
708
+ }
709
+ return step('next');
710
+ });
711
+ })(function*(){
712
+ const errorReason = errorReasons[errorCode];
713
+ console.assert(errorReason, 'Unknown error code: ' + errorCode);
714
+ console.assert(this._allowInterception, 'Request Interception is not enabled!');
715
+ console.assert(!this._interceptionHandled, 'Request is already handled!');
716
+ this._interceptionHandled = true;
717
+ (yield this._client.send('Network.continueInterceptedRequest', {
718
+ interceptionId: this._interceptionId,
719
+ errorReason
720
+ }).catch(error => {
721
+ // In certain cases, protocol will return error if the request was already canceled
722
+ // or the page was closed. We should tolerate these errors.
723
+ debugError(error);
724
+ }));
725
+ });}
726
+ }
727
+
728
+ const errorReasons = {
729
+ 'aborted': 'Aborted',
730
+ 'accessdenied': 'AccessDenied',
731
+ 'addressunreachable': 'AddressUnreachable',
732
+ 'connectionaborted': 'ConnectionAborted',
733
+ 'connectionclosed': 'ConnectionClosed',
734
+ 'connectionfailed': 'ConnectionFailed',
735
+ 'connectionrefused': 'ConnectionRefused',
736
+ 'connectionreset': 'ConnectionReset',
737
+ 'internetdisconnected': 'InternetDisconnected',
738
+ 'namenotresolved': 'NameNotResolved',
739
+ 'timedout': 'TimedOut',
740
+ 'failed': 'Failed',
741
+ };
742
+
743
+ helper.tracePublicAPI(Request);
744
+
745
+ class Response {
746
+ /**
747
+ * @param {!Puppeteer.CDPSession} client
748
+ * @param {!Request} request
749
+ * @param {number} status
750
+ * @param {!Object} headers
751
+ * @param {boolean} fromDiskCache
752
+ * @param {boolean} fromServiceWorker
753
+ * @param {?Object} securityDetails
754
+ */
755
+ constructor(client, request, status, headers, fromDiskCache, fromServiceWorker, securityDetails) {
756
+ this._client = client;
757
+ this._request = request;
758
+ this._contentPromise = null;
759
+
760
+ this._bodyLoadedPromise = new Promise(fulfill => {
761
+ this._bodyLoadedPromiseFulfill = fulfill;
762
+ });
763
+
764
+ this._status = status;
765
+ this._url = request.url();
766
+ this._fromDiskCache = fromDiskCache;
767
+ this._fromServiceWorker = fromServiceWorker;
768
+ this._headers = {};
769
+ for (const key of Object.keys(headers))
770
+ this._headers[key.toLowerCase()] = headers[key];
771
+ this._securityDetails = null;
772
+ if (securityDetails) {
773
+ this._securityDetails = new SecurityDetails(
774
+ securityDetails['subjectName'],
775
+ securityDetails['issuer'],
776
+ securityDetails['validFrom'],
777
+ securityDetails['validTo'],
778
+ securityDetails['protocol']);
779
+ }
780
+ }
781
+
782
+ /**
783
+ * @return {string}
784
+ */
785
+ url() {
786
+ return this._url;
787
+ }
788
+
789
+ /**
790
+ * @return {boolean}
791
+ */
792
+ ok() {
793
+ return this._status === 0 || (this._status >= 200 && this._status <= 299);
794
+ }
795
+
796
+ /**
797
+ * @return {number}
798
+ */
799
+ status() {
800
+ return this._status;
801
+ }
802
+
803
+ /**
804
+ * @return {!Object}
805
+ */
806
+ headers() {
807
+ return this._headers;
808
+ }
809
+
810
+ /**
811
+ * @return {?SecurityDetails}
812
+ */
813
+ securityDetails() {
814
+ return this._securityDetails;
815
+ }
816
+
817
+ /**
818
+ * @return {!Promise<!Buffer>}
819
+ */
820
+ buffer() {
821
+ if (!this._contentPromise) {
822
+ this._contentPromise = this._bodyLoadedPromise.then(/* async */ error => {return (fn => {
823
+ const gen = fn.call(this);
824
+ return new Promise((resolve, reject) => {
825
+ function step(key, arg) {
826
+ let info, value;
827
+ try {
828
+ info = gen[key](arg);
829
+ value = info.value;
830
+ } catch (error) {
831
+ reject(error);
832
+ return;
833
+ }
834
+ if (info.done) {
835
+ resolve(value);
836
+ } else {
837
+ return Promise.resolve(value).then(
838
+ value => {
839
+ step('next', value);
840
+ },
841
+ err => {
842
+ step('throw', err);
843
+ });
844
+ }
845
+ }
846
+ return step('next');
847
+ });
848
+ })(function*(){
849
+ if (error)
850
+ throw error;
851
+ const response = (yield this._client.send('Network.getResponseBody', {
852
+ requestId: this._request._requestId
853
+ }));
854
+ return Buffer.from(response.body, response.base64Encoded ? 'base64' : 'utf8');
855
+ });});
856
+ }
857
+ return this._contentPromise;
858
+ }
859
+
860
+ /**
861
+ * @return {!Promise<string>}
862
+ */
863
+ /* async */ text() {return (fn => {
864
+ const gen = fn.call(this);
865
+ return new Promise((resolve, reject) => {
866
+ function step(key, arg) {
867
+ let info, value;
868
+ try {
869
+ info = gen[key](arg);
870
+ value = info.value;
871
+ } catch (error) {
872
+ reject(error);
873
+ return;
874
+ }
875
+ if (info.done) {
876
+ resolve(value);
877
+ } else {
878
+ return Promise.resolve(value).then(
879
+ value => {
880
+ step('next', value);
881
+ },
882
+ err => {
883
+ step('throw', err);
884
+ });
885
+ }
886
+ }
887
+ return step('next');
888
+ });
889
+ })(function*(){
890
+ const content = (yield this.buffer());
891
+ return content.toString('utf8');
892
+ });}
893
+
894
+ /**
895
+ * @return {!Promise<!Object>}
896
+ */
897
+ /* async */ json() {return (fn => {
898
+ const gen = fn.call(this);
899
+ return new Promise((resolve, reject) => {
900
+ function step(key, arg) {
901
+ let info, value;
902
+ try {
903
+ info = gen[key](arg);
904
+ value = info.value;
905
+ } catch (error) {
906
+ reject(error);
907
+ return;
908
+ }
909
+ if (info.done) {
910
+ resolve(value);
911
+ } else {
912
+ return Promise.resolve(value).then(
913
+ value => {
914
+ step('next', value);
915
+ },
916
+ err => {
917
+ step('throw', err);
918
+ });
919
+ }
920
+ }
921
+ return step('next');
922
+ });
923
+ })(function*(){
924
+ const content = (yield this.text());
925
+ return JSON.parse(content);
926
+ });}
927
+
928
+ /**
929
+ * @return {!Request}
930
+ */
931
+ request() {
932
+ return this._request;
933
+ }
934
+
935
+ /**
936
+ * @return {boolean}
937
+ */
938
+ fromCache() {
939
+ return this._fromDiskCache || this._request._fromMemoryCache;
940
+ }
941
+
942
+ /**
943
+ * @return {boolean}
944
+ */
945
+ fromServiceWorker() {
946
+ return this._fromServiceWorker;
947
+ }
948
+ }
949
+ helper.tracePublicAPI(Response);
950
+
951
+ /**
952
+ * @param {!Protocol.Network.Request} request
953
+ * @return {string}
954
+ */
955
+ function generateRequestHash(request) {
956
+ let normalizedURL = request.url;
957
+ try {
958
+ // Decoding is necessary to normalize URLs. @see crbug.com/759388
959
+ // The method will throw if the URL is malformed. In this case,
960
+ // consider URL to be normalized as-is.
961
+ normalizedURL = decodeURI(request.url);
962
+ } catch (e) {
963
+ }
964
+ const hash = {
965
+ url: normalizedURL,
966
+ method: request.method,
967
+ postData: request.postData,
968
+ headers: {},
969
+ };
970
+
971
+ if (!normalizedURL.startsWith('data:')) {
972
+ const headers = Object.keys(request.headers);
973
+ headers.sort();
974
+ for (let header of headers) {
975
+ const headerValue = request.headers[header];
976
+ header = header.toLowerCase();
977
+ if (header === 'accept' || header === 'referer' || header === 'x-devtools-emulate-network-conditions-client-id')
978
+ continue;
979
+ hash.headers[header] = headerValue;
980
+ }
981
+ }
982
+ return JSON.stringify(hash);
983
+ }
984
+
985
+ class SecurityDetails {
986
+ /**
987
+ * @param {string} subjectName
988
+ * @param {string} issuer
989
+ * @param {number} validFrom
990
+ * @param {number} validTo
991
+ * @param {string} protocol
992
+ */
993
+
994
+ constructor(subjectName, issuer, validFrom, validTo, protocol) {
995
+ this._subjectName = subjectName;
996
+ this._issuer = issuer;
997
+ this._validFrom = validFrom;
998
+ this._validTo = validTo;
999
+ this._protocol = protocol;
1000
+ }
1001
+
1002
+ /**
1003
+ * @return {string}
1004
+ */
1005
+ subjectName() {
1006
+ return this._subjectName;
1007
+ }
1008
+
1009
+ /**
1010
+ * @return {string}
1011
+ */
1012
+ issuer() {
1013
+ return this._issuer;
1014
+ }
1015
+
1016
+ /**
1017
+ * @return {number}
1018
+ */
1019
+ validFrom() {
1020
+ return this._validFrom;
1021
+ }
1022
+
1023
+ /**
1024
+ * @return {number}
1025
+ */
1026
+ validTo() {
1027
+ return this._validTo;
1028
+ }
1029
+
1030
+ /**
1031
+ * @return {string}
1032
+ */
1033
+ protocol() {
1034
+ return this._protocol;
1035
+ }
1036
+ }
1037
+
1038
+ NetworkManager.Events = {
1039
+ Request: 'request',
1040
+ Response: 'response',
1041
+ RequestFailed: 'requestfailed',
1042
+ RequestFinished: 'requestfinished',
1043
+ };
1044
+
1045
+ const statusTexts = {
1046
+ '100': 'Continue',
1047
+ '101': 'Switching Protocols',
1048
+ '102': 'Processing',
1049
+ '200': 'OK',
1050
+ '201': 'Created',
1051
+ '202': 'Accepted',
1052
+ '203': 'Non-Authoritative Information',
1053
+ '204': 'No Content',
1054
+ '206': 'Partial Content',
1055
+ '207': 'Multi-Status',
1056
+ '208': 'Already Reported',
1057
+ '209': 'IM Used',
1058
+ '300': 'Multiple Choices',
1059
+ '301': 'Moved Permanently',
1060
+ '302': 'Found',
1061
+ '303': 'See Other',
1062
+ '304': 'Not Modified',
1063
+ '305': 'Use Proxy',
1064
+ '306': 'Switch Proxy',
1065
+ '307': 'Temporary Redirect',
1066
+ '308': 'Permanent Redirect',
1067
+ '400': 'Bad Request',
1068
+ '401': 'Unauthorized',
1069
+ '402': 'Payment Required',
1070
+ '403': 'Forbidden',
1071
+ '404': 'Not Found',
1072
+ '405': 'Method Not Allowed',
1073
+ '406': 'Not Acceptable',
1074
+ '407': 'Proxy Authentication Required',
1075
+ '408': 'Request Timeout',
1076
+ '409': 'Conflict',
1077
+ '410': 'Gone',
1078
+ '411': 'Length Required',
1079
+ '412': 'Precondition Failed',
1080
+ '413': 'Payload Too Large',
1081
+ '414': 'URI Too Long',
1082
+ '415': 'Unsupported Media Type',
1083
+ '416': 'Range Not Satisfiable',
1084
+ '417': 'Expectation Failed',
1085
+ '418': 'I\'m a teapot',
1086
+ '421': 'Misdirected Request',
1087
+ '422': 'Unprocessable Entity',
1088
+ '423': 'Locked',
1089
+ '424': 'Failed Dependency',
1090
+ '426': 'Upgrade Required',
1091
+ '428': 'Precondition Required',
1092
+ '429': 'Too Many Requests',
1093
+ '431': 'Request Header Fields Too Large',
1094
+ '451': 'Unavailable For Legal Reasons',
1095
+ '500': 'Internal Server Error',
1096
+ '501': 'Not Implemented',
1097
+ '502': 'Bad Gateway',
1098
+ '503': 'Service Unavailable',
1099
+ '504': 'Gateway Timeout',
1100
+ '505': 'HTTP Version Not Supported',
1101
+ '506': 'Variant Also Negotiates',
1102
+ '507': 'Insufficient Storage',
1103
+ '508': 'Loop Detected',
1104
+ '510': 'Not Extended',
1105
+ '511': 'Network Authentication Required',
1106
+ };
1107
+
1108
+ module.exports = {Request, Response, NetworkManager};