2017-06-13 07:28:29 +00:00
# Puppeteer API
2017-06-27 19:15:21 +00:00
##### Table of Contents
2017-07-07 16:36:45 +00:00
<!-- toc -->
- [class: Browser ](#class-browser )
* [new Browser([options])](#new-browseroptions)
* [browser.close() ](#browserclose )
2017-07-12 00:01:58 +00:00
* [browser.closePage(page) ](#browserclosepagepage )
2017-07-07 16:36:45 +00:00
* [browser.newPage() ](#browsernewpage )
2017-07-12 15:01:21 +00:00
* [browser.stderr ](#browserstderr )
* [browser.stdout ](#browserstdout )
2017-07-14 05:52:02 +00:00
* [browser.version() ](#browserversion )
2017-07-07 16:36:45 +00:00
- [class: Page ](#class-page )
* [page.addScriptTag(url) ](#pageaddscripttagurl )
2017-07-12 00:01:58 +00:00
* [page.click(selector) ](#pageclickselector )
2017-07-07 16:36:45 +00:00
* [page.close() ](#pageclose )
2017-07-11 15:57:26 +00:00
* [page.evaluate(fun, ...args) ](#pageevaluatefun-args )
* [page.evaluateOnInitialized(fun, ...args) ](#pageevaluateoninitializedfun-args )
2017-07-12 00:01:58 +00:00
* [page.focus(selector) ](#pagefocusselector )
2017-07-07 16:36:45 +00:00
* [page.frames() ](#pageframes )
2017-07-07 17:34:35 +00:00
* [page.httpHeaders() ](#pagehttpheaders )
2017-07-07 16:36:45 +00:00
* [page.injectFile(filePath) ](#pageinjectfilefilepath )
* [page.mainFrame() ](#pagemainframe )
2017-07-10 22:09:52 +00:00
* [page.navigate(url, options) ](#pagenavigateurl-options )
2017-07-07 16:36:45 +00:00
* [page.plainText() ](#pageplaintext )
* [page.printToPDF(filePath[, options])](#pageprinttopdffilepath-options)
* [page.screenshot([options])](#pagescreenshotoptions)
* [page.setContent(html) ](#pagesetcontenthtml )
* [page.setHTTPHeaders(headers) ](#pagesethttpheadersheaders )
* [page.setInPageCallback(name, callback) ](#pagesetinpagecallbackname-callback )
2017-07-12 00:01:58 +00:00
* [page.setRequestInterceptor(interceptor) ](#pagesetrequestinterceptorinterceptor )
2017-07-07 16:36:45 +00:00
* [page.setUserAgent(userAgent) ](#pagesetuseragentuseragent )
* [page.setViewportSize(size) ](#pagesetviewportsizesize )
* [page.title() ](#pagetitle )
2017-07-12 00:01:58 +00:00
* [page.type(text) ](#pagetypetext )
2017-07-10 18:21:46 +00:00
* [page.uploadFile(selector, ...filePaths) ](#pageuploadfileselector-filepaths )
2017-07-07 16:36:45 +00:00
* [page.url() ](#pageurl )
* [page.userAgent() ](#pageuseragent )
* [page.viewportSize() ](#pageviewportsize )
2017-07-07 22:39:02 +00:00
* [page.waitFor(selector) ](#pagewaitforselector )
2017-07-07 16:36:45 +00:00
- [class: Dialog ](#class-dialog )
2017-07-12 00:01:58 +00:00
* [dialog.accept([promptText])](#dialogacceptprompttext)
2017-07-07 16:36:45 +00:00
* [dialog.dismiss() ](#dialogdismiss )
* [dialog.message() ](#dialogmessage )
2017-07-12 15:01:21 +00:00
* [dialog.type ](#dialogtype )
2017-07-07 16:36:45 +00:00
- [class: Frame ](#class-frame )
* [frame.childFrames() ](#framechildframes )
2017-07-11 15:57:26 +00:00
* [frame.evaluate(fun, ...args) ](#frameevaluatefun-args )
2017-07-07 16:36:45 +00:00
* [frame.isDetached() ](#frameisdetached )
* [frame.isMainFrame() ](#frameismainframe )
* [frame.name() ](#framename )
* [frame.parentFrame() ](#frameparentframe )
* [frame.securityOrigin() ](#framesecurityorigin )
* [frame.url() ](#frameurl )
2017-07-07 22:39:02 +00:00
* [frame.waitFor(selector) ](#framewaitforselector )
2017-07-07 16:36:45 +00:00
- [class: Request ](#class-request )
2017-07-12 15:01:21 +00:00
* [request.headers ](#requestheaders )
* [request.method ](#requestmethod )
2017-07-14 05:52:02 +00:00
* [request.response() ](#requestresponse )
2017-07-12 15:01:21 +00:00
* [request.url ](#requesturl )
2017-07-07 17:34:35 +00:00
- [class: Response ](#class-response )
2017-07-12 15:01:21 +00:00
* [response.headers ](#responseheaders )
* [response.ok ](#responseok )
2017-07-14 05:52:02 +00:00
* [response.request() ](#responserequest )
2017-07-12 15:01:21 +00:00
* [response.status ](#responsestatus )
* [response.statusText ](#responsestatustext )
* [response.url ](#responseurl )
2017-07-07 17:34:35 +00:00
- [class: InterceptedRequest ](#class-interceptedrequest )
* [interceptedRequest.abort() ](#interceptedrequestabort )
* [interceptedRequest.continue() ](#interceptedrequestcontinue )
2017-07-14 05:52:02 +00:00
* [interceptedRequest.headers ](#interceptedrequestheaders )
2017-07-07 17:34:35 +00:00
* [interceptedRequest.isHandled() ](#interceptedrequestishandled )
2017-07-14 05:52:02 +00:00
* [interceptedRequest.method ](#interceptedrequestmethod )
* [interceptedRequest.postData ](#interceptedrequestpostdata )
* [interceptedRequest.url ](#interceptedrequesturl )
2017-07-07 17:34:35 +00:00
- [class: Headers ](#class-headers )
2017-07-12 00:01:58 +00:00
* [headers.append(name, value) ](#headersappendname-value )
* [headers.delete(name) ](#headersdeletename )
2017-07-07 17:34:35 +00:00
* [headers.entries() ](#headersentries )
2017-07-12 00:01:58 +00:00
* [headers.get(name) ](#headersgetname )
* [headers.has(name) ](#headershasname )
2017-07-07 17:34:35 +00:00
* [headers.keys() ](#headerskeys )
2017-07-12 00:01:58 +00:00
* [headers.set(name, value) ](#headerssetname-value )
2017-07-07 17:34:35 +00:00
* [headers.values() ](#headersvalues )
- [class: Body ](#class-body )
* [body.arrayBuffer() ](#bodyarraybuffer )
2017-07-14 06:11:39 +00:00
* [body.bodyUsed ](#bodybodyused )
2017-07-07 17:34:35 +00:00
* [body.buffer() ](#bodybuffer )
* [body.json() ](#bodyjson )
* [body.text() ](#bodytext )
2017-07-07 16:36:45 +00:00
<!-- tocstop -->
2017-06-13 07:28:29 +00:00
### class: Browser
Browser manages a browser instance, creating it with a predefined
settings, opening and closing pages. Instantiating Browser class does
not necessarily result in launching browser; the instance will be launched when the need will arise.
#### new Browser([options])
2017-06-21 18:17:35 +00:00
- `options` < [Object]> Set of configurable options to set on the browser. Can have the following fields:
- `headless` < [boolean]> Wether to run chromium in headless mode. Defaults to `true` .
- `executablePath` < [string]> Path to a chromium executable to run instead of bundled chromium.
- `args` < [Array]< [string]>> Additional arguments to pass to the chromium instance. List of chromium flags could be found [here ](http://peter.sh/experiments/chromium-command-line-switches/ ).
2017-06-13 07:28:29 +00:00
2017-06-27 19:15:21 +00:00
#### browser.close()
2017-06-13 07:28:29 +00:00
2017-06-27 19:15:21 +00:00
Closes chromium application with all the pages (if any were opened). The browser object itself is considered to be disposed and could not be used anymore.
2017-06-13 07:28:29 +00:00
2017-07-12 00:01:58 +00:00
#### browser.closePage(page)
2017-06-13 07:28:29 +00:00
2017-07-12 00:01:58 +00:00
- `page` < [Page]> A page to be closed.
- returns: < [Promise]> Promise which resolves when the page is closed.
2017-06-13 07:28:29 +00:00
2017-06-27 19:15:21 +00:00
#### browser.newPage()
2017-06-13 07:28:29 +00:00
2017-06-27 19:15:21 +00:00
- returns: < [Promise]< [Page]>>
2017-06-13 07:28:29 +00:00
2017-06-27 19:15:21 +00:00
Create a new page in browser and returns a promise which gets resolved with a Page object.
2017-06-13 07:28:29 +00:00
2017-07-12 15:01:21 +00:00
#### browser.stderr
- < [stream.Readable]>
A Readable Stream that represents the browser process's stderr.
#### browser.stdout
- < [stream.Readable]>
A Readable Stream that represents the browser process's stdout.
2017-07-14 05:52:02 +00:00
#### browser.version()
- returns: < [Promise]< [string]>>
2017-06-13 07:28:29 +00:00
### class: Page
Page provides interface to interact with a tab in a browser. Pages are created by browser:
```javascript
var browser = new Browser();
browser.newPage().then(page => {
...
});
```
Pages could be closed by `page.close()` method.
#### page.addScriptTag(url)
2017-06-21 18:17:35 +00:00
- `url` < [string]> Url of a script to be added
- returns: < [Promise]> Promise which resolves as the script gets added and loads.
2017-06-13 07:28:29 +00:00
2017-07-12 00:01:58 +00:00
#### page.click(selector)
- `selector` < [string]> A query selector of element to click. If there are multiple elements satisfying the selector, the first will be clicked.
2017-07-07 17:34:35 +00:00
2017-06-27 19:15:21 +00:00
#### page.close()
2017-06-13 07:28:29 +00:00
2017-06-27 19:15:21 +00:00
- returns: < [Promise]> Returns promise which resolves when page gets closed.
2017-06-13 07:28:29 +00:00
2017-07-11 15:57:26 +00:00
#### page.evaluate(fun, ...args)
2017-06-13 07:28:29 +00:00
2017-06-27 19:15:21 +00:00
- `fun` < [function]> Function to be evaluated in browser context
2017-07-11 15:57:26 +00:00
- `...args` < ... [ string ] > Arguments to pass to `fun`
2017-06-27 19:15:21 +00:00
- returns: < [Promise]< [Object]>> Promise which resolves to function return value
2017-06-13 07:28:29 +00:00
2017-07-11 15:57:26 +00:00
#### page.evaluateOnInitialized(fun, ...args)
2017-06-13 07:28:29 +00:00
2017-06-27 19:15:21 +00:00
- `fun` < [function]> Function to be evaluated in browser context
2017-07-11 15:57:26 +00:00
- `...args` < ... [ string ] > Arguments to pass to `fun`
2017-06-27 19:15:21 +00:00
- returns: < [Promise]< [Object]>> Promise which resolves to function
2017-06-13 07:28:29 +00:00
2017-07-12 00:01:58 +00:00
#### page.focus(selector)
- `selector` < [string]> A query selector of element to focus. If there are multiple elements satisfying the selector, the first will be focused.
2017-07-07 17:34:35 +00:00
#### page.frames()
2017-06-29 06:09:28 +00:00
#### page.httpHeaders()
2017-06-13 07:28:29 +00:00
2017-06-21 18:17:35 +00:00
- returns: < [Object]> Key-value set of additional http headers, which will be sent with every request.
2017-06-13 07:28:29 +00:00
2017-06-27 19:15:21 +00:00
#### page.injectFile(filePath)
2017-06-13 07:28:29 +00:00
2017-07-11 15:57:26 +00:00
- `filePath` < [string]> Path to the javascript file to be injected into page.
2017-06-27 19:15:21 +00:00
- returns: < [Promise]> Promise which resolves when file gets successfully evaluated in page.
2017-06-13 07:28:29 +00:00
2017-06-27 19:15:21 +00:00
#### page.mainFrame()
2017-06-13 07:28:29 +00:00
2017-07-10 22:09:52 +00:00
#### page.navigate(url, options)
2017-06-13 07:28:29 +00:00
2017-06-21 18:17:35 +00:00
- `url` < [string]> URL to navigate page to
2017-07-10 22:09:52 +00:00
- `options` < [Object]> Navigation parameters which might have the following properties:
- `maxTime` < [number]> Maximum navigation time in milliseconds, defaults to 30 seconds.
- `waitFor` < [string]> When to consider navigation succeeded, defaults to `load` . Could be either:
- `load` - consider navigation to be finished when the `load` event is fired.
- `networkidle` - consider navigation to be finished when the network activity stays "idle" for at least `networkIdleTimeout` ms.
- `networkIdleInflight` < [number]> Maximum amount of inflight requests which are considered "idle". Takes effect only with `waitFor: 'networkidle'` parameter.
- `networkIdleTimeout` < [number]> A timeout to wait before completing navigation. Takes effect only with `waitFor: 'networkidle'` parameter.
- returns: < [Promise]< [Response]>> Promise which resolves to the main resource response. In case of multiple redirects, the navigation will resolve with the response of the last redirect.
The `page.navigate` will throw an error if:
- there's an SSL error (e.g. in case of self-signed certificates).
- target URL is invalid.
- the `maxTime` is exceeded during navigation.
2017-06-13 07:28:29 +00:00
2017-06-27 19:15:21 +00:00
#### page.plainText()
2017-06-13 07:28:29 +00:00
2017-06-27 19:15:21 +00:00
- returns: < [Promise]< [string]>> Returns page's inner text.
2017-06-13 07:28:29 +00:00
2017-06-27 19:15:21 +00:00
#### page.printToPDF(filePath[, options])
2017-06-13 07:28:29 +00:00
2017-06-27 19:15:21 +00:00
- `filePath` < [string]> The file path to save the image to. The screenshot type will be inferred from file extension
- `options` < [Object]> Options object which might have the following properties:
- `scale` < [number]>
- `displayHeaderFooter` < [boolean]>
- `printBackground` < [boolean]>
- `landscape` < [boolean]>
- `pageRanges` < [string]>
- `format` < [string]>
- `width` < [number]>
- `height` < [number]>
- returns: < [Promise]> Promise which resolves when the PDF is saved.
2017-06-13 07:28:29 +00:00
2017-06-19 22:01:14 +00:00
#### page.screenshot([options])
2017-06-13 07:28:29 +00:00
2017-06-21 18:17:35 +00:00
- `options` < [Object]> Options object which might have the following properties:
- `path` < [string]> The file path to save the image to. The screenshot type will be inferred from file extension.
- `type` < [string]> Specify screenshot type, could be either `jpeg` or `png` .
2017-07-10 21:15:20 +00:00
- `quality` < [number]> The quality of the image, between 0-100. Not applicable to `.png` images.
2017-06-21 18:17:35 +00:00
- `fullPage` < [boolean]> When true, takes a screenshot of the full scrollable page.
- `clip` < [Object]> An object which specifies clipping region of the page. Should have the following fields:
- `x` < [number]> x-coordinate of top-left corner of clip area
- `y` < [number]> y-coordinate of top-left corner of clip area
- `width` < [number]> width of clipping area
- `height` < [number]> height of clipping area
- returns: < [Promise]< [Buffer]>> Promise which resolves to buffer with captured screenshot
2017-06-13 07:28:29 +00:00
2017-06-27 19:15:21 +00:00
#### page.setContent(html)
2017-06-13 07:28:29 +00:00
2017-06-27 19:15:21 +00:00
- `html` < [string]> HTML markup to assign to the page.
- returns: < [Promise]> Promise which resolves when the content is successfully assigned.
2017-06-13 07:28:29 +00:00
2017-06-29 06:09:28 +00:00
#### page.setHTTPHeaders(headers)
2017-06-13 07:28:29 +00:00
2017-06-27 19:15:21 +00:00
- `headers` < [Object]> Key-value set of additional http headers to be sent with every request.
- returns: < [Promise]> Promise which resolves when additional headers are installed
#### page.setInPageCallback(name, callback)
2017-07-11 15:57:26 +00:00
- `name` < [string]> Name of the callback to be assigned on window object
2017-06-27 19:15:21 +00:00
- `callback` < [function]> Callback function which will be called in node.js
- returns: < [Promise]> Promise which resolves when callback is successfully initialized
2017-07-12 00:01:58 +00:00
#### page.setRequestInterceptor(interceptor)
- `interceptor` < [function]> Callback function which accepts a single argument of type < [InterceptedRequest]>.
2017-06-27 19:15:21 +00:00
2017-06-29 06:09:28 +00:00
#### page.setUserAgent(userAgent)
2017-06-27 19:15:21 +00:00
- `userAgent` < [string]> Specific user agent to use in this page
- returns: < [Promise]> Promise which resolves when the user agent is set.
#### page.setViewportSize(size)
- `size` < [Object]> An object with two fields:
- `width` < [number]> Specify page's width in pixels.
- `height` < [number]> Specify page's height in pixels.
- returns: < [Promise]> Promise which resolves when the dimensions are updated.
2017-06-13 07:28:29 +00:00
#### page.title()
2017-06-21 18:17:35 +00:00
- returns: < [Promise]< [string]>> Returns page's title.
2017-06-13 07:28:29 +00:00
2017-07-12 00:01:58 +00:00
#### page.type(text)
- `text` < [string]> A text to type into a focused element.
2017-06-13 07:28:29 +00:00
2017-07-10 18:21:46 +00:00
#### page.uploadFile(selector, ...filePaths)
- `selector` < [string]> A query selector to a file input
- `...filePaths` < [string]> Sets the value of the file input these paths
- returns: < [Promise]> Promise which resolves when the value is set.
2017-06-27 19:15:21 +00:00
#### page.url()
- returns: < [Promise]< [string]>> Promise which resolves with the current page url.
2017-06-29 06:09:28 +00:00
#### page.userAgent()
2017-06-27 19:15:21 +00:00
2017-06-29 06:09:28 +00:00
- returns: < [string]> Returns user agent.
2017-06-27 19:15:21 +00:00
#### page.viewportSize()
- returns: < [Object]> An object with two fields:
- `width` < [number]> Page's width in pixels.
- `height` < [number]> Page's height in pixels.
2017-07-07 22:39:02 +00:00
#### page.waitFor(selector)
2017-07-11 15:57:26 +00:00
- `selector` < [string]> A query selector to wait for on the page.
Wait for the `selector` to appear in page. If at the moment of calling
the method the `selector` already exists, the method will return
immediately.
2017-07-07 22:39:02 +00:00
Shortcut for [page.mainFrame().waitFor(selector) ](#framewaitforselector ).
2017-06-27 19:15:21 +00:00
### class: Dialog
2017-07-12 00:01:58 +00:00
#### dialog.accept([promptText])
- `promptText` < [string]> A text to enter in prompt. Does not cause any effects if the dialog type is not prompt.
2017-06-27 19:15:21 +00:00
#### dialog.dismiss()
2017-07-12 15:01:21 +00:00
2017-06-27 19:15:21 +00:00
#### dialog.message()
2017-07-12 15:01:21 +00:00
#### dialog.type
- < [string]>
Dialog's type, could be one of the `alert` , `beforeunload` , `confirm` and `prompt` .
2017-06-27 19:15:21 +00:00
### class: Frame
#### frame.childFrames()
2017-07-11 15:57:26 +00:00
#### frame.evaluate(fun, ...args)
2017-06-27 19:40:46 +00:00
- `fun` < [function]> Function to be evaluated in browser context
2017-07-11 15:57:26 +00:00
- `...args` < [Array]< [string]>> Arguments to pass to `fun`
2017-06-27 19:40:46 +00:00
- returns: < [Promise]< [Object]>> Promise which resolves to function return value
2017-06-27 19:15:21 +00:00
#### frame.isDetached()
#### frame.isMainFrame()
#### frame.name()
#### frame.parentFrame()
#### frame.securityOrigin()
#### frame.url()
2017-07-07 22:39:02 +00:00
#### frame.waitFor(selector)
- `selector` < [string]> CSS selector of awaited element,
- returns: < [Promise]> Promise which resolves when element specified by selector string is added to DOM.
2017-06-27 19:15:21 +00:00
### class: Request
2017-07-12 15:01:21 +00:00
#### request.headers
- < [Headers]>
Contains the associated [Headers] object of the request.
#### request.method
- < [string]>
Contains the request's method (GET, POST, etc.)
2017-07-14 05:52:02 +00:00
#### request.response()
2017-07-12 15:01:21 +00:00
#### request.url
- < [string]>
Contains the URL of the request.
2017-07-07 17:34:35 +00:00
### class: Response
2017-07-12 15:01:21 +00:00
#### response.headers
- < [Headers]>
Contains the [Headers] object associated with the response.
#### response.ok
- < [boolean]>
Contains a boolean stating whether the response was successful (status in the range 200-299) or not.
2017-07-14 05:52:02 +00:00
#### response.request()
2017-07-12 15:01:21 +00:00
#### response.status
- < [number]>
Contains the status code of the response (e.g., 200 for a success).
#### response.statusText
- < [string]>
Contains the status message corresponding to the status code (e.g., OK for 200).
2017-07-14 05:52:02 +00:00
2017-07-12 15:01:21 +00:00
#### response.url
- < [string]>
Contains the URL of the response.
2017-07-14 05:52:02 +00:00
2017-07-07 17:34:35 +00:00
### class: InterceptedRequest
2017-07-12 15:01:21 +00:00
2017-07-14 05:52:02 +00:00
#### interceptedRequest.abort()
#### interceptedRequest.continue()
2017-07-12 15:01:21 +00:00
#### interceptedRequest.headers
- < [Headers]>
Contains the [Headers] object associated with the request.
2017-07-14 05:52:02 +00:00
#### interceptedRequest.isHandled()
2017-07-12 15:01:21 +00:00
#### interceptedRequest.method
- < [string]>
Contains the request's method (GET, POST, etc.)
#### interceptedRequest.postData
- < [string]>
In case of a `POST` request, contains `POST` data.
2017-07-14 05:52:02 +00:00
#### interceptedRequest.url
- < [string]>
Contains the URL of the request.
2017-07-07 17:34:35 +00:00
### class: Headers
2017-07-12 00:01:58 +00:00
#### headers.append(name, value)
- `name` < [string]> Case-insensetive header name.
- `value` < [string]> Header value
If there's already a header with name `name` , the header gets overwritten.
#### headers.delete(name)
- `name` < [string]> Case-insensetive name of the header to be deleted. If there's no header with such name, the method does nothing.
2017-07-07 17:34:35 +00:00
#### headers.entries()
2017-07-12 00:01:58 +00:00
#### headers.get(name)
- `name` < [string]> Case-insensetive name of the header.
- returns: < [string]> Header value of `null` , if there's no such header.
#### headers.has(name)
- `name` < [string]> Case-insensetive name of the header.
- returns: < [boolean]> Returns `true` if the header with such name exists, or `false` otherwise.
2017-07-07 17:34:35 +00:00
#### headers.keys()
2017-07-12 00:01:58 +00:00
#### headers.set(name, value)
- `name` < [string]> Case-insensetive header name.
- `value` < [string]> Header value
If there's already a header with name `name` , the header gets overwritten.
2017-07-07 17:34:35 +00:00
#### headers.values()
### class: Body
#### body.arrayBuffer()
2017-07-14 06:11:39 +00:00
#### body.bodyUsed
2017-07-07 17:34:35 +00:00
#### body.buffer()
#### body.json()
#### body.text()
2017-06-21 18:17:35 +00:00
[Array]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array "Array"
[boolean]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type "Boolean"
[Buffer]: https://nodejs.org/api/buffer.html#buffer_class_buffer "Buffer"
[function]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function "Function"
[number]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type "Number"
[Object]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object "Object"
[Page]: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-page "Page"
2017-07-12 15:01:21 +00:00
[Headers]: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-headers "Headers"
2017-07-12 00:07:06 +00:00
[InterceptedRequest]: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-interceptedrequest "Page"
2017-06-21 18:17:35 +00:00
[Promise]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise "Promise"
[string]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type "String"
2017-07-12 15:01:21 +00:00
[stream.Readable]: https://nodejs.org/api/stream.html#stream_class_stream_readable