PuppeteerのBrowserFetcherクラス

今回はPuppeteerのBrowserFetcherクラスについて書いていきたいと思います。

## BrowserFetcherクラス
BrowserFetcherはChromiumとFirefoxの異なるバージョンをダウンロードして、管理することができます。

BrowserFetcherはChromiumのバージョンを（"533271"にたいな）指定するrevision string上で操作します。revision stringは[omahaproxy.appspot.com](https://omahaproxy.appspot.com/)から得ることができます。と、言いたいところなのですが、確認したところ、存在しないものが多いので、[こちら](https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html)の方を見てください。

Firefoxの場合、BrowserFetcherはFirefox Nightlyをダウンロードして、（"75"にたいな）バージョン番号を操作します。Firefox Nightlyのホストは[こちら](https://archive.mozilla.org/pub/firefox/nightly/latest-mozilla-central)を見てください。

### canDownloadメソッド
revisionが利用可能かどうかを確かめるメソッド。

ホストからダウンロード可能であれば、`true`を返してくれます。

例（createBrowserFetcherの設定によって結果が変わります）：

```js
const puppeteer = require('puppeteer');

async function checkRevision(revision) {
  const browserFetcher = puppeteer.createBrowserFetcher();
  const isAvailable = await browserFetcher.canDownload(revision);

  if(isAvailable) {
    console.info('This revision is available.');
  } else {
    console.info('This revision isn\'t available.');
  }
}

checkRevision('756066');  // win64
checkRevision('1000583'); // This may release from now on but this isn't release at the moment.
checkRevision('78.0a1'); // If this product is Firefox, this result is true.
```

結果：

```
This revision is available.
This revision isn't available.
This revision isn't available.
```

### downloadメソッド
ChromiumもしくはFirefox Nightlyをダウンロードするメソッド。

```
browserFetcher.download(revision[, progressCallback])

revision         string ダウンロードするためのrevision
progressCallback function(number, number)
    downloadedBytes number ダウンロードされたバイト数。
    totalBytes      number 合計ダウンロードバイト数。
```

簡単な例：

```js
const puppeteer = require('puppeteer');

(async () => {
  const browserFetcher = puppeteer.createBrowserFetcher();
  await browserFetcher.download('771731', (downloadedBytes, totalBytes) => {
    // any code...
  });
})();
```

### hostメソッド
使用されているダウンロードホストを返すメソッドです。

### localRevisionsメソッド
ディスク上でローカルに利用可能な（現在の`product`の）すべてのrevisionのリストを返すメソッド。

### platformメソッド
`mac`、`linux`、`win32`、または`win64`のいずれかを返すメソッド。

### productメソッド
`chrome`もしくは`firefox`のいずれかを返すメソッド。

### removeメソッド
ダウンロードされたChromiumもしくはfiredfoxをrevisionを指定して削除するメソッド。

### revisionInfoメソッド
revisionを指定してそのrevisionの情報を出すメソッド。

### サンプル
ローカルにはrevision：389298と771731がダウンロード済み。

```js
const puppeteer = require('puppeteer');

(async () => {
  const browserFetcher = puppeteer.createBrowserFetcher();

  console.info('host: ' + await browserFetcher.host());

  await (browserFetcher.localRevisions()).then(revisions => console.info(revisions));

  console.info('platform: ' + await browserFetcher.platform());
  console.info('product: ' + await browserFetcher.product());

  const info1 = await browserFetcher.revisionInfo('389298');
  const info2 = await browserFetcher.revisionInfo('771731');
  const info3 = await browserFetcher.revisionInfo('385798');

  console.info(info1);
  console.info(info2);
  console.info(info3);
})();
```

結果：

```
[ '389298', '771731' ]
platform: win64
product: chrome

{ revision: '389298',
  executablePath:
   'path\\node_modules\\puppeteer\\.local-chromium\\win64-389298\\chrome-win32\\chrome.exe',
  folderPath:
   'path\\node_modules\\puppeteer\\.local-chromium\\win64-389298',
  local: true,
  url:
   'https://storage.googleapis.com/chromium-browser-snapshots/Win_x64/389298/chrome-win32.zip',
  product: 'chrome' }

{ revision: '771731',
  executablePath:
   'path\\node_modules\\puppeteer\\.local-chromium\\win64-771731\\chrome-win\\chrome.exe',
  folderPath:
   'pathp\\node_modules\\puppeteer\\.local-chromium\\win64-771731',
  local: true,
  url:
   'https://storage.googleapis.com/chromium-browser-snapshots/Win_x64/771731/chrome-win.zip',
  product: 'chrome' }

{ revision: '385798',
  executablePath:
   'path\\node_modules\\puppeteer\\.local-chromium\\win64-385798\\chrome-win32\\chrome.exe',
  folderPath:
   'path\\node_modules\\puppeteer\\.local-chromium\\win64-385798',
  local: false,
  url:
   'https://storage.googleapis.com/chromium-browser-snapshots/Win_x64/385798/chrome-win32.zip',
  product: 'chrome' }
```

# さいごに
次はBrowserクラスをやっていきたいと思います。