downloadChromeExtension.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.downloadChromeExtension = void 0;
  4. const fs = require("fs");
  5. const path = require("path");
  6. const utils_1 = require("./utils");
  7. const unzip = require('unzip-crx-3');
  8. const downloadChromeExtension = async (chromeStoreID, { forceDownload = false, attempts = 5, } = {}) => {
  9. const extensionsStore = (0, utils_1.getPath)();
  10. if (!fs.existsSync(extensionsStore)) {
  11. await fs.promises.mkdir(extensionsStore, { recursive: true });
  12. }
  13. const extensionFolder = path.resolve(`${extensionsStore}/${chromeStoreID}`);
  14. if (!fs.existsSync(extensionFolder) || forceDownload) {
  15. if (fs.existsSync(extensionFolder)) {
  16. await fs.promises.rmdir(extensionFolder, {
  17. recursive: true,
  18. });
  19. }
  20. const fileURL = `https://clients2.google.com/service/update2/crx?response=redirect&acceptformat=crx2,crx3&x=id%3D${chromeStoreID}%26uc&prodversion=${process.versions.chrome}`; // eslint-disable-line
  21. const filePath = path.resolve(`${extensionFolder}.crx`);
  22. try {
  23. await (0, utils_1.downloadFile)(fileURL, filePath);
  24. try {
  25. await unzip(filePath, extensionFolder);
  26. (0, utils_1.changePermissions)(extensionFolder, 755);
  27. return extensionFolder;
  28. }
  29. catch (err) {
  30. if (!fs.existsSync(path.resolve(extensionFolder, 'manifest.json'))) {
  31. throw err;
  32. }
  33. }
  34. }
  35. catch (err) {
  36. console.error(`Failed to fetch extension, trying ${attempts - 1} more times`); // eslint-disable-line
  37. if (attempts <= 1) {
  38. throw err;
  39. }
  40. await new Promise((resolve) => setTimeout(resolve, 200));
  41. return await (0, exports.downloadChromeExtension)(chromeStoreID, {
  42. forceDownload,
  43. attempts: attempts - 1,
  44. });
  45. }
  46. }
  47. return extensionFolder;
  48. };
  49. exports.downloadChromeExtension = downloadChromeExtension;
  50. //# sourceMappingURL=downloadChromeExtension.js.map