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,186 @@
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
+
17
+ const { helper } = require('./helper');
18
+ const Target = require('./Target');
19
+ const EventEmitter = require('events');
20
+ const TaskQueue = require('./TaskQueue');
21
+
22
+ class Browser extends EventEmitter {
23
+ /**
24
+ * @param {!Puppeteer.Connection} connection
25
+ * @param {!BrowserOptions=} options
26
+ * @param {?Puppeteer.ChildProcess} process
27
+ * @param {(function():Promise)=} closeCallback
28
+ */
29
+ constructor(connection, options = {}, process, closeCallback) {
30
+ super();
31
+ this._ignoreHTTPSErrors = !!options.ignoreHTTPSErrors;
32
+ this._appMode = !!options.appMode;
33
+ this._process = process;
34
+ this._screenshotTaskQueue = new TaskQueue();
35
+ this._connection = connection;
36
+ this._closeCallback = closeCallback || new Function();
37
+ /** @type {Map<string, Target>} */
38
+ this._targets = new Map();
39
+ this._connection.setClosedCallback(() => {
40
+ this.emit(Browser.Events.Disconnected);
41
+ });
42
+ this._connection.on('Target.targetCreated', this._targetCreated.bind(this));
43
+ this._connection.on('Target.targetDestroyed', this._targetDestroyed.bind(this));
44
+ this._connection.on('Target.targetInfoChanged', this._targetInfoChanged.bind(this));
45
+ }
46
+
47
+ /**
48
+ * @return {?Puppeteer.ChildProcess}
49
+ */
50
+ process() {
51
+ return this._process;
52
+ }
53
+
54
+ /**
55
+ * @param {!Puppeteer.Connection} connection
56
+ * @param {!BrowserOptions=} options
57
+ * @param {?Puppeteer.ChildProcess} process
58
+ * @param {function()=} closeCallback
59
+ */
60
+ static async create(connection, options, process, closeCallback) {
61
+ const browser = new Browser(connection, options, process, closeCallback);
62
+ await connection.send('Target.setDiscoverTargets', {discover: true});
63
+ return browser;
64
+ }
65
+
66
+ /**
67
+ * @param {{targetInfo: !Puppeteer.TargetInfo}} event
68
+ */
69
+ async _targetCreated(event) {
70
+ const targetInfo = event.targetInfo;
71
+ const target = new Target(targetInfo, this, () => this._connection.createSession(targetInfo.targetId), this._ignoreHTTPSErrors, !this._appMode, this._screenshotTaskQueue);
72
+ console.assert(!this._targets.has(event.targetInfo.targetId), 'Target should not exist before targetCreated');
73
+ this._targets.set(event.targetInfo.targetId, target);
74
+
75
+ if (await target._initializedPromise)
76
+ this.emit(Browser.Events.TargetCreated, target);
77
+ }
78
+
79
+ /**
80
+ * @param {{targetId: string}} event
81
+ */
82
+ async _targetDestroyed(event) {
83
+ const target = this._targets.get(event.targetId);
84
+ target._initializedCallback(false);
85
+ this._targets.delete(event.targetId);
86
+ target._closedCallback();
87
+ if (await target._initializedPromise)
88
+ this.emit(Browser.Events.TargetDestroyed, target);
89
+ }
90
+
91
+ /**
92
+ * @param {{targetInfo: !Puppeteer.TargetInfo}} event
93
+ */
94
+ _targetInfoChanged(event) {
95
+ const target = this._targets.get(event.targetInfo.targetId);
96
+ console.assert(target, 'target should exist before targetInfoChanged');
97
+ const previousURL = target.url();
98
+ const wasInitialized = target._isInitialized;
99
+ target._targetInfoChanged(event.targetInfo);
100
+ if (wasInitialized && previousURL !== target.url())
101
+ this.emit(Browser.Events.TargetChanged, target);
102
+ }
103
+
104
+ /**
105
+ * @return {string}
106
+ */
107
+ wsEndpoint() {
108
+ return this._connection.url();
109
+ }
110
+
111
+ /**
112
+ * @return {!Promise<!Puppeteer.Page>}
113
+ */
114
+ async newPage() {
115
+ const {targetId} = await this._connection.send('Target.createTarget', {url: 'about:blank'});
116
+ const target = await this._targets.get(targetId);
117
+ console.assert(await target._initializedPromise, 'Failed to create target for page');
118
+ const page = await target.page();
119
+ return page;
120
+ }
121
+
122
+ /**
123
+ * @return {!Array<!Target>}
124
+ */
125
+ targets() {
126
+ return Array.from(this._targets.values()).filter(target => target._isInitialized);
127
+ }
128
+
129
+ /**
130
+ * @return {!Promise<!Array<!Puppeteer.Page>>}
131
+ */
132
+ async pages() {
133
+ const pages = await Promise.all(this.targets().map(target => target.page()));
134
+ return pages.filter(page => !!page);
135
+ }
136
+
137
+ /**
138
+ * @return {!Promise<string>}
139
+ */
140
+ async version() {
141
+ const version = await this._getVersion();
142
+ return version.product;
143
+ }
144
+
145
+ /**
146
+ * @return {!Promise<string>}
147
+ */
148
+ async userAgent() {
149
+ const version = await this._getVersion();
150
+ return version.userAgent;
151
+ }
152
+
153
+ async close() {
154
+ await this._closeCallback.call(null);
155
+ this.disconnect();
156
+ }
157
+
158
+ disconnect() {
159
+ this._connection.dispose();
160
+ }
161
+
162
+ /**
163
+ * @return {!Promise<!Object>}
164
+ */
165
+ _getVersion() {
166
+ return this._connection.send('Browser.getVersion');
167
+ }
168
+ }
169
+
170
+ /** @enum {string} */
171
+ Browser.Events = {
172
+ TargetCreated: 'targetcreated',
173
+ TargetDestroyed: 'targetdestroyed',
174
+ TargetChanged: 'targetchanged',
175
+ Disconnected: 'disconnected'
176
+ };
177
+
178
+ helper.tracePublicAPI(Browser);
179
+
180
+ module.exports = Browser;
181
+
182
+ /**
183
+ * @typedef {Object} BrowserOptions
184
+ * @property {boolean=} appMode
185
+ * @property {boolean=} ignoreHTTPSErrors
186
+ */
@@ -0,0 +1,279 @@
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
+
17
+ const os = require('os');
18
+ const fs = require('fs');
19
+ const path = require('path');
20
+ const extract = require('extract-zip');
21
+ const util = require('util');
22
+ const URL = require('url');
23
+ const {helper} = require('./helper');
24
+ const removeRecursive = require('rimraf');
25
+ // @ts-ignore
26
+ const ProxyAgent = require('https-proxy-agent');
27
+ // @ts-ignore
28
+ const getProxyForUrl = require('proxy-from-env').getProxyForUrl;
29
+
30
+ const DEFAULT_DOWNLOAD_HOST = 'https://storage.googleapis.com';
31
+ const downloadURLs = {
32
+ linux: '%s/chromium-browser-snapshots/Linux_x64/%d/chrome-linux.zip',
33
+ mac: '%s/chromium-browser-snapshots/Mac/%d/chrome-mac.zip',
34
+ win32: '%s/chromium-browser-snapshots/Win/%d/chrome-win32.zip',
35
+ win64: '%s/chromium-browser-snapshots/Win_x64/%d/chrome-win32.zip',
36
+ };
37
+
38
+ const readdirAsync = helper.promisify(fs.readdir.bind(fs));
39
+ const mkdirAsync = helper.promisify(fs.mkdir.bind(fs));
40
+ const unlinkAsync = helper.promisify(fs.unlink.bind(fs));
41
+ const chmodAsync = helper.promisify(fs.chmod.bind(fs));
42
+
43
+ function existsAsync(filePath) {
44
+ let fulfill = null;
45
+ const promise = new Promise(x => fulfill = x);
46
+ fs.access(filePath, err => fulfill(!err));
47
+ return promise;
48
+ }
49
+
50
+ class BrowserFetcher {
51
+ /**
52
+ * @param {!BrowserFetcher.Options=} options
53
+ */
54
+ constructor(options = {}) {
55
+ this._downloadsFolder = options.path || path.join(helper.projectRoot(), '.local-chromium');
56
+ this._downloadHost = options.host || DEFAULT_DOWNLOAD_HOST;
57
+ this._platform = options.platform || '';
58
+ if (!this._platform) {
59
+ const platform = os.platform();
60
+ if (platform === 'darwin')
61
+ this._platform = 'mac';
62
+ else if (platform === 'linux')
63
+ this._platform = 'linux';
64
+ else if (platform === 'win32')
65
+ this._platform = os.arch() === 'x64' ? 'win64' : 'win32';
66
+ console.assert(this._platform, 'Unsupported platform: ' + os.platform());
67
+ }
68
+ const supportedPlatforms = ['mac', 'linux', 'win32', 'win64'];
69
+ console.assert(supportedPlatforms.includes(this._platform), 'Unsupported platform: ' + this._platform);
70
+ }
71
+
72
+ /**
73
+ * @return {string}
74
+ */
75
+ platform() {
76
+ return this._platform;
77
+ }
78
+
79
+ /**
80
+ * @param {string} revision
81
+ * @return {!Promise<boolean>}
82
+ */
83
+ canDownload(revision) {
84
+ const url = util.format(downloadURLs[this._platform], this._downloadHost, revision);
85
+
86
+ let resolve;
87
+ const promise = new Promise(x => resolve = x);
88
+ const request = httpRequest(url, 'HEAD', response => {
89
+ resolve(response.statusCode === 200);
90
+ });
91
+ request.on('error', error => {
92
+ console.error(error);
93
+ resolve(false);
94
+ });
95
+ return promise;
96
+ }
97
+
98
+ /**
99
+ * @param {string} revision
100
+ * @param {?function(number, number)} progressCallback
101
+ * @return {!Promise<!BrowserFetcher.RevisionInfo>}
102
+ */
103
+ async download(revision, progressCallback) {
104
+ let url = downloadURLs[this._platform];
105
+ url = util.format(url, this._downloadHost, revision);
106
+ const zipPath = path.join(this._downloadsFolder, `download-${this._platform}-${revision}.zip`);
107
+ const folderPath = this._getFolderPath(revision);
108
+ if (await existsAsync(folderPath))
109
+ return this.revisionInfo(revision);
110
+ if (!(await existsAsync(this._downloadsFolder)))
111
+ await mkdirAsync(this._downloadsFolder);
112
+ try {
113
+ await downloadFile(url, zipPath, progressCallback);
114
+ await extractZip(zipPath, folderPath);
115
+ } finally {
116
+ if (await existsAsync(zipPath))
117
+ await unlinkAsync(zipPath);
118
+ }
119
+ const revisionInfo = this.revisionInfo(revision);
120
+ if (revisionInfo)
121
+ await chmodAsync(revisionInfo.executablePath, 0o755);
122
+ return revisionInfo;
123
+ }
124
+
125
+ /**
126
+ * @return {!Promise<!Array<string>>}
127
+ */
128
+ async localRevisions() {
129
+ if (!await existsAsync(this._downloadsFolder))
130
+ return [];
131
+ const fileNames = await readdirAsync(this._downloadsFolder);
132
+ return fileNames.map(fileName => parseFolderPath(fileName)).filter(entry => entry && entry.platform === this._platform).map(entry => entry.revision);
133
+ }
134
+
135
+ /**
136
+ * @param {string} revision
137
+ * @return {!Promise}
138
+ */
139
+ async remove(revision) {
140
+ const folderPath = this._getFolderPath(revision);
141
+ console.assert(await existsAsync(folderPath), `Failed to remove: revision ${revision} is not downloaded`);
142
+ await new Promise(fulfill => removeRecursive(folderPath, fulfill));
143
+ }
144
+
145
+ /**
146
+ * @param {string} revision
147
+ * @return {!BrowserFetcher.RevisionInfo}
148
+ */
149
+ revisionInfo(revision) {
150
+ const folderPath = this._getFolderPath(revision);
151
+ let executablePath = '';
152
+ if (this._platform === 'mac')
153
+ executablePath = path.join(folderPath, 'chrome-mac', 'Chromium.app', 'Contents', 'MacOS', 'Chromium');
154
+ else if (this._platform === 'linux')
155
+ executablePath = path.join(folderPath, 'chrome-linux', 'chrome');
156
+ else if (this._platform === 'win32' || this._platform === 'win64')
157
+ executablePath = path.join(folderPath, 'chrome-win32', 'chrome.exe');
158
+ else
159
+ throw 'Unsupported platform: ' + this._platform;
160
+ let url = downloadURLs[this._platform];
161
+ url = util.format(url, this._downloadHost, revision);
162
+ const local = fs.existsSync(folderPath);
163
+ return {revision, executablePath, folderPath, local, url};
164
+ }
165
+
166
+ /**
167
+ * @param {string} revision
168
+ * @return {string}
169
+ */
170
+ _getFolderPath(revision) {
171
+ return path.join(this._downloadsFolder, this._platform + '-' + revision);
172
+ }
173
+ }
174
+
175
+ module.exports = BrowserFetcher;
176
+
177
+ /**
178
+ * @param {string} folderPath
179
+ * @return {?{platform: string, revision: string}}
180
+ */
181
+ function parseFolderPath(folderPath) {
182
+ const name = path.basename(folderPath);
183
+ const splits = name.split('-');
184
+ if (splits.length !== 2)
185
+ return null;
186
+ const [platform, revision] = splits;
187
+ if (!downloadURLs[platform])
188
+ return null;
189
+ return {platform, revision};
190
+ }
191
+
192
+ /**
193
+ * @param {string} url
194
+ * @param {string} destinationPath
195
+ * @param {?function(number, number)} progressCallback
196
+ * @return {!Promise}
197
+ */
198
+ function downloadFile(url, destinationPath, progressCallback) {
199
+ let fulfill, reject;
200
+ let downloadedBytes = 0;
201
+ let totalBytes = 0;
202
+
203
+ const promise = new Promise((x, y) => { fulfill = x; reject = y; });
204
+
205
+ const request = httpRequest(url, 'GET', response => {
206
+ if (response.statusCode !== 200) {
207
+ const error = new Error(`Download failed: server returned code ${response.statusCode}. URL: ${url}`);
208
+ // consume response data to free up memory
209
+ response.resume();
210
+ reject(error);
211
+ return;
212
+ }
213
+ const file = fs.createWriteStream(destinationPath);
214
+ file.on('finish', () => fulfill());
215
+ file.on('error', error => reject(error));
216
+ response.pipe(file);
217
+ totalBytes = parseInt(/** @type {string} */ (response.headers['content-length']), 10);
218
+ if (progressCallback)
219
+ response.on('data', onData);
220
+ });
221
+ request.on('error', error => reject(error));
222
+ return promise;
223
+
224
+ function onData(chunk) {
225
+ downloadedBytes += chunk.length;
226
+ progressCallback(downloadedBytes, totalBytes);
227
+ }
228
+ }
229
+
230
+ /**
231
+ * @param {string} zipPath
232
+ * @param {string} folderPath
233
+ * @return {!Promise<?Error>}
234
+ */
235
+ function extractZip(zipPath, folderPath) {
236
+ return new Promise(fulfill => extract(zipPath, {dir: folderPath}, fulfill));
237
+ }
238
+
239
+ function httpRequest(url, method, response) {
240
+ /** @type {Object} */
241
+ const options = URL.parse(url);
242
+ options.method = method;
243
+
244
+ const proxyURL = getProxyForUrl(url);
245
+ if (proxyURL) {
246
+ /** @type {Object} */
247
+ const parsedProxyURL = URL.parse(proxyURL);
248
+ parsedProxyURL.secureProxy = parsedProxyURL.protocol === 'https:';
249
+
250
+ options.agent = new ProxyAgent(parsedProxyURL);
251
+ options.rejectUnauthorized = false;
252
+ }
253
+
254
+ const driver = options.protocol === 'https:' ? 'https' : 'http';
255
+ const request = require(driver).request(options, res => {
256
+ if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location)
257
+ httpRequest(res.headers.location, method, response);
258
+ else
259
+ response(res);
260
+ });
261
+ request.end();
262
+ return request;
263
+ }
264
+
265
+ /**
266
+ * @typedef {Object} BrowserFetcher.Options
267
+ * @property {string=} platform
268
+ * @property {string=} path
269
+ * @property {string=} host
270
+ */
271
+
272
+ /**
273
+ * @typedef {Object} BrowserFetcher.RevisionInfo
274
+ * @property {string} folderPath
275
+ * @property {string} executablePath
276
+ * @property {string} url
277
+ * @property {boolean} local
278
+ * @property {string} revision
279
+ */
@@ -0,0 +1,246 @@
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 {helper} = require('./helper');
17
+ const debugProtocol = require('debug')('puppeteer:protocol');
18
+ const debugSession = require('debug')('puppeteer:session');
19
+
20
+ const EventEmitter = require('events');
21
+ const WebSocket = require('ws');
22
+ const Pipe = require('./Pipe');
23
+
24
+ class Connection extends EventEmitter {
25
+ /**
26
+ * @param {string} url
27
+ * @param {number=} delay
28
+ * @return {!Promise<!Connection>}
29
+ */
30
+ static async createForWebSocket(url, delay = 0) {
31
+ return new Promise((resolve, reject) => {
32
+ const ws = new WebSocket(url, { perMessageDeflate: false });
33
+ ws.on('open', () => resolve(new Connection(url, ws, delay)));
34
+ ws.on('error', reject);
35
+ });
36
+ }
37
+
38
+ /**
39
+ * @param {!NodeJS.WritableStream} pipeWrite
40
+ * @param {!NodeJS.ReadableStream} pipeRead
41
+ * @param {number=} delay
42
+ * @return {!Connection}
43
+ */
44
+ static createForPipe(pipeWrite, pipeRead, delay = 0) {
45
+ return new Connection('', new Pipe(pipeWrite, pipeRead), delay);
46
+ }
47
+
48
+ /**
49
+ * @param {string} url
50
+ * @param {!Puppeteer.ConnectionTransport} transport
51
+ * @param {number=} delay
52
+ */
53
+ constructor(url, transport, delay = 0) {
54
+ super();
55
+ this._url = url;
56
+ this._lastId = 0;
57
+ /** @type {!Map<number, {resolve: function, reject: function, error: !Error, method: string}>}*/
58
+ this._callbacks = new Map();
59
+ this._delay = delay;
60
+
61
+ this._transport = transport;
62
+ this._transport.on('message', this._onMessage.bind(this));
63
+ this._transport.on('close', this._onClose.bind(this));
64
+ /** @type {!Map<string, !CDPSession>}*/
65
+ this._sessions = new Map();
66
+ }
67
+
68
+ /**
69
+ * @return {string}
70
+ */
71
+ url() {
72
+ return this._url;
73
+ }
74
+
75
+ /**
76
+ * @param {string} method
77
+ * @param {!Object=} params
78
+ * @return {!Promise<?Object>}
79
+ */
80
+ send(method, params = {}) {
81
+ const id = ++this._lastId;
82
+ const message = JSON.stringify({id, method, params});
83
+ debugProtocol('SEND ► ' + message);
84
+ this._transport.send(message);
85
+ return new Promise((resolve, reject) => {
86
+ this._callbacks.set(id, {resolve, reject, error: new Error(), method});
87
+ });
88
+ }
89
+
90
+ /**
91
+ * @param {function()} callback
92
+ */
93
+ setClosedCallback(callback) {
94
+ this._closeCallback = callback;
95
+ }
96
+
97
+ /**
98
+ * @param {string} message
99
+ */
100
+ async _onMessage(message) {
101
+ if (this._delay)
102
+ await new Promise(f => setTimeout(f, this._delay));
103
+ debugProtocol('◀ RECV ' + message);
104
+ const object = JSON.parse(message);
105
+ if (object.id) {
106
+ const callback = this._callbacks.get(object.id);
107
+ // Callbacks could be all rejected if someone has called `.dispose()`.
108
+ if (callback) {
109
+ this._callbacks.delete(object.id);
110
+ if (object.error)
111
+ callback.reject(rewriteError(callback.error, `Protocol error (${callback.method}): ${object.error.message} ${object.error.data}`));
112
+ else
113
+ callback.resolve(object.result);
114
+ }
115
+ } else {
116
+ if (object.method === 'Target.receivedMessageFromTarget') {
117
+ const session = this._sessions.get(object.params.sessionId);
118
+ if (session)
119
+ session._onMessage(object.params.message);
120
+ } else if (object.method === 'Target.detachedFromTarget') {
121
+ const session = this._sessions.get(object.params.sessionId);
122
+ if (session)
123
+ session._onClosed();
124
+ this._sessions.delete(object.params.sessionId);
125
+ } else {
126
+ this.emit(object.method, object.params);
127
+ }
128
+ }
129
+ }
130
+
131
+ _onClose() {
132
+ if (this._closeCallback) {
133
+ this._closeCallback();
134
+ this._closeCallback = null;
135
+ }
136
+ this._transport.removeAllListeners();
137
+ // If transport throws any error at this point of time, we don't care and should swallow it.
138
+ this._transport.on('error', () => {});
139
+ for (const callback of this._callbacks.values())
140
+ callback.reject(rewriteError(callback.error, `Protocol error (${callback.method}): Target closed.`));
141
+ this._callbacks.clear();
142
+ for (const session of this._sessions.values())
143
+ session._onClosed();
144
+ this._sessions.clear();
145
+ }
146
+
147
+ dispose() {
148
+ this._onClose();
149
+ this._transport.close();
150
+ }
151
+
152
+ /**
153
+ * @param {string} targetId
154
+ * @return {!Promise<!CDPSession>}
155
+ */
156
+ async createSession(targetId) {
157
+ const {sessionId} = await this.send('Target.attachToTarget', {targetId});
158
+ const session = new CDPSession(this, targetId, sessionId);
159
+ this._sessions.set(sessionId, session);
160
+ return session;
161
+ }
162
+ }
163
+
164
+ class CDPSession extends EventEmitter {
165
+ /**
166
+ * @param {!Connection} connection
167
+ * @param {string} targetId
168
+ * @param {string} sessionId
169
+ */
170
+ constructor(connection, targetId, sessionId) {
171
+ super();
172
+ this._lastId = 0;
173
+ /** @type {!Map<number, {resolve: function, reject: function, error: !Error, method: string}>}*/
174
+ this._callbacks = new Map();
175
+ this._connection = connection;
176
+ this._targetId = targetId;
177
+ this._sessionId = sessionId;
178
+ }
179
+
180
+ /**
181
+ * @param {string} method
182
+ * @param {!Object=} params
183
+ * @return {!Promise<?Object>}
184
+ */
185
+ send(method, params = {}) {
186
+ if (!this._connection)
187
+ return Promise.reject(new Error(`Protocol error (${method}): Session closed. Most likely the page has been closed.`));
188
+ const id = ++this._lastId;
189
+ const message = JSON.stringify({id, method, params});
190
+ debugSession('SEND ► ' + message);
191
+ this._connection.send('Target.sendMessageToTarget', {sessionId: this._sessionId, message}).catch(e => {
192
+ // The response from target might have been already dispatched.
193
+ if (!this._callbacks.has(id))
194
+ return;
195
+ const callback = this._callbacks.get(id);
196
+ this._callbacks.delete(id);
197
+ callback.reject(rewriteError(callback.error, e && e.message));
198
+ });
199
+ return new Promise((resolve, reject) => {
200
+ this._callbacks.set(id, {resolve, reject, error: new Error(), method});
201
+ });
202
+ }
203
+
204
+ /**
205
+ * @param {string} message
206
+ */
207
+ _onMessage(message) {
208
+ debugSession('◀ RECV ' + message);
209
+ const object = JSON.parse(message);
210
+ if (object.id && this._callbacks.has(object.id)) {
211
+ const callback = this._callbacks.get(object.id);
212
+ this._callbacks.delete(object.id);
213
+ if (object.error)
214
+ callback.reject(rewriteError(callback.error, `Protocol error (${callback.method}): ${object.error.message} ${object.error.data}`));
215
+ else
216
+ callback.resolve(object.result);
217
+ } else {
218
+ console.assert(!object.id);
219
+ this.emit(object.method, object.params);
220
+ }
221
+ }
222
+
223
+ async detach() {
224
+ await this._connection.send('Target.detachFromTarget', {sessionId: this._sessionId});
225
+ }
226
+
227
+ _onClosed() {
228
+ for (const callback of this._callbacks.values())
229
+ callback.reject(rewriteError(callback.error, `Protocol error (${callback.method}): Target closed.`));
230
+ this._callbacks.clear();
231
+ this._connection = null;
232
+ }
233
+ }
234
+ helper.tracePublicAPI(CDPSession);
235
+
236
+ /**
237
+ * @param {!Error} error
238
+ * @param {string} message
239
+ * @return {!Error}
240
+ */
241
+ function rewriteError(error, message) {
242
+ error.message = message;
243
+ return error;
244
+ }
245
+
246
+ module.exports = {Connection, CDPSession};