fetch-prebuilt-wda.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. const path = require('path');
  2. const axios = require('axios');
  3. const { asyncify } = require('asyncbox');
  4. const { logger, fs, mkdirp, net } = require('@appium/support');
  5. const _ = require('lodash');
  6. const B = require('bluebird');
  7. const log = logger.getLogger('WDA');
  8. async function fetchPrebuiltWebDriverAgentAssets () {
  9. const tag = require('../package.json').version;
  10. log.info(`Getting links to webdriveragent release ${tag}`);
  11. const downloadUrl = `https://api.github.com/repos/appium/webdriveragent/releases/tags/v${tag}`;
  12. log.info(`Getting WDA release ${downloadUrl}`);
  13. let releases;
  14. try {
  15. releases = (await axios({
  16. url: downloadUrl,
  17. headers: {
  18. 'user-agent': 'appium',
  19. 'accept': 'application/json, */*',
  20. },
  21. })).data;
  22. } catch (e) {
  23. throw new Error(`Could not fetch endpoint ${downloadUrl}. Reason: ${e.message}`);
  24. }
  25. const webdriveragentsDir = path.resolve(__dirname, '..', 'prebuilt-agents');
  26. log.info(`Creating webdriveragents directory at: ${webdriveragentsDir}`);
  27. await fs.rimraf(webdriveragentsDir);
  28. await mkdirp(webdriveragentsDir);
  29. // Define a method that does a streaming download of an asset
  30. async function downloadAgent (url, targetPath) {
  31. try {
  32. await net.downloadFile(url, targetPath);
  33. } catch (err) {
  34. throw new Error(`Problem downloading webdriveragent from url ${url}: ${err.message}`);
  35. }
  36. }
  37. log.info(`Downloading assets to: ${webdriveragentsDir}`);
  38. const agentsDownloading = [];
  39. for (const asset of releases.assets) {
  40. const url = asset.browser_download_url;
  41. log.info(`Downloading: ${url}`);
  42. try {
  43. const nameOfAgent = _.last(url.split('/'));
  44. agentsDownloading.push(downloadAgent(url, path.join(webdriveragentsDir, nameOfAgent)));
  45. } catch { }
  46. }
  47. // Wait for them all to finish
  48. return await B.all(agentsDownloading);
  49. }
  50. if (require.main === module) {
  51. asyncify(fetchPrebuiltWebDriverAgentAssets);
  52. }
  53. module.exports = fetchPrebuiltWebDriverAgentAssets;