From e3e0bb0b178cdb0aad769852c07688ee66ea9822 Mon Sep 17 00:00:00 2001 From: Oj Date: Thu, 9 Dec 2021 16:25:14 +0000 Subject: [PATCH] Initial Proper Commit --- .gitignore | 2 + README.md | 16 +- src/Constants.js | 34 + src/GPUSettings.js | 6 + src/appSettings.js | 7 + src/autoStart/index.js | 6 + src/bootstrap.js | 63 ++ src/crashReporterSetup.js | 5 + src/errorHandler.js | 40 + src/firstRun/index.js | 3 + src/index.js | 7 + src/ipcMain.js | 5 + src/package-lock.json | 873 ++++++++++++++++ src/package.json | 5 +- src/paths.js | 25 + src/splash/index.html | 89 ++ src/splash/preload.js | 36 + src/splash/splashScreen.js | 486 +++++++++ src/splash/splashScreen.js.self | 95 ++ .../web/a934ab008c7f6a2274ec441f6be0696a.woff | Bin 0 -> 15488 bytes .../web/abddffb32a4a35627c3857a06c751424.png | Bin 0 -> 6378 bytes .../web/d153359b5d87601d2b9c708b7ae2db02.woff | Bin 0 -> 23456 bytes src/splash/web/index.html | 11 + src/splash/web/index.js | 41 + src/splash/web/variables.json | 6 + src/updater/appUpdater.js | 73 ++ src/updater/hostUpdater.js | 199 ++++ src/updater/moduleUpdater.js | 967 ++++++++++++++++++ src/updater/request.js | 186 ++++ src/updater/squirrelUpdate.js | 218 ++++ src/updater/updater.js | 460 +++++++++ src/updater/windowsUtils.js | 82 ++ src/utils/Backoff.js | 94 ++ src/utils/Settings.js | 64 ++ src/utils/buildInfo.js | 8 + src/utils/log.js | 3 + src/utils/requireNative.js | 3 + src/utils/securityUtils.js | 45 + src/utils/stub.js | 13 + test.sh | 13 + 40 files changed, 4281 insertions(+), 8 deletions(-) create mode 100644 .gitignore create mode 100644 src/Constants.js create mode 100644 src/GPUSettings.js create mode 100644 src/appSettings.js create mode 100644 src/autoStart/index.js create mode 100644 src/bootstrap.js create mode 100644 src/crashReporterSetup.js create mode 100644 src/errorHandler.js create mode 100644 src/firstRun/index.js create mode 100644 src/index.js create mode 100644 src/ipcMain.js create mode 100644 src/package-lock.json create mode 100644 src/paths.js create mode 100644 src/splash/index.html create mode 100644 src/splash/preload.js create mode 100644 src/splash/splashScreen.js create mode 100644 src/splash/splashScreen.js.self create mode 100644 src/splash/web/a934ab008c7f6a2274ec441f6be0696a.woff create mode 100644 src/splash/web/abddffb32a4a35627c3857a06c751424.png create mode 100644 src/splash/web/d153359b5d87601d2b9c708b7ae2db02.woff create mode 100644 src/splash/web/index.html create mode 100644 src/splash/web/index.js create mode 100644 src/splash/web/variables.json create mode 100644 src/updater/appUpdater.js create mode 100644 src/updater/hostUpdater.js create mode 100644 src/updater/moduleUpdater.js create mode 100644 src/updater/request.js create mode 100644 src/updater/squirrelUpdate.js create mode 100644 src/updater/updater.js create mode 100644 src/updater/windowsUtils.js create mode 100644 src/utils/Backoff.js create mode 100644 src/utils/Settings.js create mode 100644 src/utils/buildInfo.js create mode 100644 src/utils/log.js create mode 100644 src/utils/requireNative.js create mode 100644 src/utils/securityUtils.js create mode 100644 src/utils/stub.js create mode 100755 test.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b12bd55 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +*.asar diff --git a/README.md b/README.md index f76b972..101b037 100644 --- a/README.md +++ b/README.md @@ -4,15 +4,17 @@ ## Goals - **Hotpluggable** - just swap the asar file, nothing else needed - **Lightweight** - it should be at least as fast or lightweight, hopefully more -- **No Tracking** - no crash reporting, etc +- **No Tracking** - no crash reporting, error tracking, etc - **Minimal** - generally only doing what is needed (see: implementation) ## Implementation Below is a list in order of priority, marked as complete when finished: -- [ ] Stub everything -- [ ] Bootstrapping -- [ ] Splash screen +- [X] Bootstrapping +- [X] Splash screen +- [X] Error handling +- [ ] A bunch of specific minor fixes / features + - [ ] Handle hardware acceleration - [ ] Auto start -- [ ] Updating - - [ ] Updater v1 - - [ ] Updater v2 \ No newline at end of file +- [ ] First run +- [ ] Self-write updater code (currently mostly copied) +- [ ] Self-write some small parts of internals \ No newline at end of file diff --git a/src/Constants.js b/src/Constants.js new file mode 100644 index 0000000..2f0f862 --- /dev/null +++ b/src/Constants.js @@ -0,0 +1,34 @@ +// Bootstrap consts, heavily copied as don't want to mess with it +const { releaseChannel } = require('./utils/buildInfo'); + +const { getSettings } = require('./appSettings'); + +const settings = getSettings(); + +function capitalizeFirstLetter(s) { + return s.charAt(0).toUpperCase() + s.slice(1); +} + +const appNameSuffix = releaseChannel === 'stable' ? '' : capitalizeFirstLetter(releaseChannel); +const APP_COMPANY = 'Discord Inc'; +const APP_DESCRIPTION = 'Discord - https://discord.com'; +const APP_NAME = 'Discord' + appNameSuffix; +const APP_NAME_FOR_HUMANS = 'Discord' + (appNameSuffix !== '' ? ' ' + appNameSuffix : ''); +const APP_ID_BASE = 'com.squirrel'; +const APP_ID = `${APP_ID_BASE}.${APP_NAME}.${APP_NAME}`; +const APP_PROTOCOL = 'Discord'; +const API_ENDPOINT = settings.get('API_ENDPOINT') || 'https://discord.com/api'; +const UPDATE_ENDPOINT = settings.get('UPDATE_ENDPOINT') || API_ENDPOINT; +const NEW_UPDATE_ENDPOINT = settings.get('NEW_UPDATE_ENDPOINT') || 'https://discord.com/api/updates/'; + +module.exports = { + APP_COMPANY, + APP_DESCRIPTION, + APP_NAME, + APP_NAME_FOR_HUMANS, + APP_ID, + APP_PROTOCOL, + API_ENDPOINT, + NEW_UPDATE_ENDPOINT, + UPDATE_ENDPOINT +}; \ No newline at end of file diff --git a/src/GPUSettings.js b/src/GPUSettings.js new file mode 100644 index 0000000..6012783 --- /dev/null +++ b/src/GPUSettings.js @@ -0,0 +1,6 @@ +// Idk why Discord has to use this +exports.replace = (GPUSettings) => { + for (const name of Object.keys(GPUSettings)) { + exports[name] = GPUSettings[name]; + } +}; \ No newline at end of file diff --git a/src/appSettings.js b/src/appSettings.js new file mode 100644 index 0000000..509014a --- /dev/null +++ b/src/appSettings.js @@ -0,0 +1,7 @@ +const Settings = require('./utils/Settings'); +const paths = require('./paths'); + +const settings = new Settings(paths.getUserData()); + +exports.getSettings = () => settings; +exports.init = () => {}; // Stub as we setup on require \ No newline at end of file diff --git a/src/autoStart/index.js b/src/autoStart/index.js new file mode 100644 index 0000000..5ad5088 --- /dev/null +++ b/src/autoStart/index.js @@ -0,0 +1,6 @@ +// Stub for now at least + +exports.install = (callback) => { callback(); }; +exports.update = (callback) => { callback(); }; +exports.uninstall = (callback) => { callback(); }; +exports.isInstalled = (callback) => { callback(true); }; // Stub to true or false? \ No newline at end of file diff --git a/src/bootstrap.js b/src/bootstrap.js new file mode 100644 index 0000000..50c9940 --- /dev/null +++ b/src/bootstrap.js @@ -0,0 +1,63 @@ +const { join } = require('path'); +const NodeModule = require('module'); +const { app } = require('electron'); + +const log = require('./utils/log'); +const requireNative = require('./utils/requireNative'); +const paths = require('./paths'); +const buildInfo = require('./utils/buildInfo'); + +// Just required for startup +const appSettings = require('./appSettings'); +const GPUSettings = require('./GPUSettings'); +const crashReporterSetup = require('./crashReporterSetup'); +const splashScreen = require('./splash/splashScreen'); +const Constants = require('./Constants'); +const autoStart = require('./autoStart'); + +const updater = require('./updater/updater'); +const moduleUpdater = require('./updater/moduleUpdater'); +const appUpdater = require('./updater/appUpdater'); + +let desktopCore; +const startCore = () => { + desktopCore = requireNative('discord_desktop_core'); + log('Bootstrap', 'Required desktop_core:', desktopCore); + + desktopCore.startup({ + paths, + splashScreen, + moduleUpdater, + autoStart, + buildInfo, + appSettings, + Constants, + GPUSettings, + updater, + crashReporterSetup + }); +}; + +const startUpdate = () => { + appUpdater.update(false, () => { + startCore(); + }, () => { + desktopCore.setMainWindowVisible(true); + }); +}; + +module.exports = () => { + // Paths logging + log('Paths', `Init! Returns: +getUserData: ${paths.getUserData()} +getUserDataVersioned: ${paths.getUserDataVersioned()} +getResources: ${paths.getResources()} +getModuleDataPath: ${paths.getModuleDataPath()} +getInstallPath: ${paths.getInstallPath()}`); + + if (app.isReady()) { + startUpdate(); + } else { + app.once('ready', startUpdate); + } +}; \ No newline at end of file diff --git a/src/crashReporterSetup.js b/src/crashReporterSetup.js new file mode 100644 index 0000000..119c733 --- /dev/null +++ b/src/crashReporterSetup.js @@ -0,0 +1,5 @@ +// Much crash reporting, such wow +exports.init = () => {}; +exports.isInitialized = () => true; + +exports.metadata = {}; \ No newline at end of file diff --git a/src/errorHandler.js b/src/errorHandler.js new file mode 100644 index 0000000..b19f545 --- /dev/null +++ b/src/errorHandler.js @@ -0,0 +1,40 @@ +const { app } = require("electron"); + +const log = require('./utils/log'); + +exports.init = () => { + /* process.on('uncaughtException', error => { + const stack = error.stack ? error.stack : String(error); + const message = `Uncaught exception:\n ${stack}`; + console.warn(message); + + if (!isErrorSafeToSuppress(error)) { + _electron.dialog.showErrorBox('A JavaScript error occurred in the main process', message); + } + }); */ +}; + + +exports.fatal = (err) => { + const options = { + type: 'error', + message: 'A fatal Javascript error occured', + detail: err && err.stack ? err.stack : String(err) + }; + + const callback = _ => app.quit(); + + const electronMajor = parseInt(process.versions.electron.split('.')[0]); + + if (electronMajor >= 6) { + _electron.dialog.showMessageBox(null, options).then(callback); + } else { + _electron.dialog.showMessageBox(options, callback); + } + + log('ErrorHandler', 'Fatal:', err); +}; + +exports.handled = (err) => { + log('ErrorHandler', 'Handled:', err); +}; \ No newline at end of file diff --git a/src/firstRun/index.js b/src/firstRun/index.js new file mode 100644 index 0000000..e51a75c --- /dev/null +++ b/src/firstRun/index.js @@ -0,0 +1,3 @@ +// Stub for now at least + +exports.update = (callback) => { callback(); }; \ No newline at end of file diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..3505e7d --- /dev/null +++ b/src/index.js @@ -0,0 +1,7 @@ +const log = require('./utils/log'); + +log('', 'Initing...'); + +const bootstrap = require('./bootstrap'); + +bootstrap(); // Start bootstrap \ No newline at end of file diff --git a/src/ipcMain.js b/src/ipcMain.js new file mode 100644 index 0000000..a8a663e --- /dev/null +++ b/src/ipcMain.js @@ -0,0 +1,5 @@ +// Discord's wrapper around ipcMain +const { ipcMain } = require('electron'); + +exports.on = (event, callback) => ipcMain.on('DISCORD_' + event, callback); +exports.removeListener = (event, callback) => ipcMain.removeListener('DISCORD_' + event, callback); \ No newline at end of file diff --git a/src/package-lock.json b/src/package-lock.json new file mode 100644 index 0000000..43c94eb --- /dev/null +++ b/src/package-lock.json @@ -0,0 +1,873 @@ +{ + "name": "openasar", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "openasar", + "dependencies": { + "mkdirp": "^0.5.1", + "request": "2.88.0", + "yauzl": "^2.10.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "engines": { + "node": "*" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dependencies": { + "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dependencies": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "requires": { + "pend": "~1.2.0" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" + }, + "mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "requires": { + "mime-db": "1.51.0" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/src/package.json b/src/package.json index c8d0056..7810b7f 100644 --- a/src/package.json +++ b/src/package.json @@ -1,9 +1,12 @@ { "name": "openasar", - "description": "Discord Client for Desktop - Bootstrapper", + "description": "Open-source alternative of Discord desktop's app.asar", "main": "index.js", "dependencies": { + "mkdirp": "^0.5.1", + "request": "2.88.0", + "yauzl": "^2.10.0" } } \ No newline at end of file diff --git a/src/paths.js b/src/paths.js new file mode 100644 index 0000000..bdae911 --- /dev/null +++ b/src/paths.js @@ -0,0 +1,25 @@ +const { join, dirname, basename } = require('path'); +const { app } = require('electron'); + +const log = require('./utils/log'); +const buildInfo = require('./utils/buildInfo'); + + +const appDir = 'discord' + (buildInfo.releaseChannel === 'stable' ? '' : buildInfo.releaseChannel); // Clean channel naming up later to util? +const userData = join(app.getPath('appData'), appDir); +const userDataVersioned = join(userData, buildInfo.version); + +const exeDir = dirname(app.getPath('exe')); +const installPath = /^app-[0-9]+\.[0-9]+\.[0-9]+/.test(basename(exeDir)) ? join(exeDir, '..') : null; + +const moduleData = buildInfo.newUpdater ? join(userData, 'module_data') : join(userDataVersioned, 'modules'); + + +exports.getUserData = () => userData; +exports.getUserDataVersioned = () => userDataVersioned; + +exports.getResources = () => process.resourcesPath; // Discord uses path and require.main.filename here because ?? +exports.getModuleDataPath = () => moduleData; +exports.getInstallPath = () => installPath; + +exports.init = () => {}; // Stub as we setup on require \ No newline at end of file diff --git a/src/splash/index.html b/src/splash/index.html new file mode 100644 index 0000000..9066141 --- /dev/null +++ b/src/splash/index.html @@ -0,0 +1,89 @@ +
openasar go brr
+ +
+
+ + + + + \ No newline at end of file diff --git a/src/splash/preload.js b/src/splash/preload.js new file mode 100644 index 0000000..a475675 --- /dev/null +++ b/src/splash/preload.js @@ -0,0 +1,36 @@ +"use strict"; + +const { + app, + contextBridge, + ipcRenderer +} = require('electron'); + +const { + saferShellOpenExternal +} = require('../utils/securityUtils'); + +contextBridge.exposeInMainWorld('DiscordSplash', { + getReleaseChannel: () => { + const buildInfo = require('../utils/buildInfo'); + + return buildInfo.releaseChannel; + }, + signalReady: () => { + ipcRenderer.send('DISCORD_SPLASH_SCREEN_READY'); + }, + onStateUpdate: callback => { + ipcRenderer.on('DISCORD_SPLASH_UPDATE_STATE', (_, state) => { + callback(state); + }); + }, + onQuoteUpdate: callback => { + ipcRenderer.on('DISCORD_SPLASH_SCREEN_QUOTE', (_, quote) => { + callback(quote); + }); + }, + openUrl: saferShellOpenExternal, + quitDiscord: () => { + ipcRenderer.send('DISCORD_SPLASH_SCREEN_QUIT'); + } +}); \ No newline at end of file diff --git a/src/splash/splashScreen.js b/src/splash/splashScreen.js new file mode 100644 index 0000000..b647cba --- /dev/null +++ b/src/splash/splashScreen.js @@ -0,0 +1,486 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.initSplash = initSplash; +exports.focusWindow = focusWindow; +exports.pageReady = pageReady; +exports.events = exports.APP_SHOULD_SHOW = exports.APP_SHOULD_LAUNCH = void 0; + +var _electron = require("electron"); + +var _events = require("events"); + +var _fs = _interopRequireDefault(require("fs")); + +var _path = _interopRequireDefault(require("path")); + +var _url = _interopRequireDefault(require("url")); + +var _Backoff = _interopRequireDefault(require("../utils/Backoff")); + +var moduleUpdater = _interopRequireWildcard(require("../updater/moduleUpdater")); + +var paths = _interopRequireWildcard(require("../paths")); + +var _securityUtils = require("../utils/securityUtils"); + +var _updater = require("../updater/updater"); + +var _ipcMain = _interopRequireDefault(require("../ipcMain")); + +function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } + +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const UPDATE_TIMEOUT_WAIT = 10000; +const RETRY_CAP_SECONDS = 60; // citron note: atom seems to add about 50px height to the frame on mac but not windows +// TODO: see if we can eliminate fudge by using useContentSize BrowserWindow option + +const LOADING_WINDOW_WIDTH = 300; +const LOADING_WINDOW_HEIGHT = process.platform === 'darwin' ? 300 : 350; // TODO: addModulesListener events should use Module's constants + +const CHECKING_FOR_UPDATES = 'checking-for-updates'; +const UPDATE_CHECK_FINISHED = 'update-check-finished'; +const UPDATE_FAILURE = 'update-failure'; +const LAUNCHING = 'launching'; +const DOWNLOADING_MODULE = 'downloading-module'; +const DOWNLOADING_UPDATES = 'downloading-updates'; +const DOWNLOADING_MODULES_FINISHED = 'downloading-modules-finished'; +const DOWNLOADING_MODULE_PROGRESS = 'downloading-module-progress'; +const DOWNLOADED_MODULE = 'downloaded-module'; +const NO_PENDING_UPDATES = 'no-pending-updates'; +const INSTALLING_MODULE = 'installing-module'; +const INSTALLING_UPDATES = 'installing-updates'; +const INSTALLED_MODULE = 'installed-module'; +const INSTALLING_MODULE_PROGRESS = 'installing-module-progress'; +const INSTALLING_MODULES_FINISHED = 'installing-modules-finished'; +const UPDATE_MANUALLY = 'update-manually'; +const APP_SHOULD_LAUNCH = 'APP_SHOULD_LAUNCH'; +exports.APP_SHOULD_LAUNCH = APP_SHOULD_LAUNCH; +const APP_SHOULD_SHOW = 'APP_SHOULD_SHOW'; +exports.APP_SHOULD_SHOW = APP_SHOULD_SHOW; +const events = new _events.EventEmitter(); +exports.events = events; + +function webContentsSend(win, event, ...args) { + if (win != null && win.webContents != null) { + win.webContents.send(`DISCORD_${event}`, ...args); + } +} + +let splashWindow; +let modulesListeners; +let updateTimeout; +let updateAttempt; +let splashState; +let launchedMainWindow; +let quoteCachePath; +let restartRequired = false; +let newUpdater; +const updateBackoff = new _Backoff.default(1000, 30000); // TODO(eiz): some of this logic should probably not live in the splash. +// +// Disabled because Rust interop stuff is going on in here. + +/* eslint-disable camelcase */ + +class TaskProgress { + constructor() { + this.inProgress = new Map(); + this.finished = new Set(); + this.allTasks = new Set(); + } + + recordProgress(progress, task) { + this.allTasks.add(task.package_sha256); + + if (progress.state !== _updater.TASK_STATE_WAITING) { + this.inProgress.set(task.package_sha256, progress.percent); + + if (progress.state === _updater.TASK_STATE_COMPLETE) { + this.finished.add(task.package_sha256); + } + } + } + + updateSplashState(newState) { + if (this.inProgress.size > 0 && this.inProgress.size > this.finished.size) { + let totalPercent = 0; + + for (const item of this.inProgress.values()) { + totalPercent += item; + } + + totalPercent /= this.allTasks.size; + splashState = { + current: this.finished.size + 1, + total: this.allTasks.size, + progress: totalPercent + }; + updateSplashState(newState); + return true; + } + + return false; + } + +} + +async function updateUntilCurrent() { + const retryOptions = { + skip_host_delta: false, + skip_module_delta: {} + }; + + while (true) { + updateSplashState(CHECKING_FOR_UPDATES); + + try { + let installedAnything = false; + const downloads = new TaskProgress(); + const installs = new TaskProgress(); + await newUpdater.updateToLatestWithOptions(retryOptions, progress => { + const task = progress.task; + const downloadTask = task.HostDownload || task.ModuleDownload; + const installTask = task.HostInstall || task.ModuleInstall; + installedAnything = true; + + if (downloadTask != null) { + downloads.recordProgress(progress, downloadTask); + } + + if (installTask != null) { + installs.recordProgress(progress, installTask); + + if (progress.state.Failed != null) { + if (task.HostInstall != null) { + retryOptions.skip_host_delta = true; + } else if (task.ModuleInstall != null) { + retryOptions.skip_module_delta[installTask.version.module.name] = true; + } + } + } + + if (!downloads.updateSplashState(DOWNLOADING_UPDATES)) { + installs.updateSplashState(INSTALLING_UPDATES); + } + }); + + if (!installedAnything) { + await newUpdater.startCurrentVersion(); + newUpdater.setRunningInBackground(); + newUpdater.collectGarbage(); + launchMainWindow(); + updateBackoff.succeed(); + updateSplashState(LAUNCHING); + return; + } + } catch (e) { + console.error('Update failed', e); + await new Promise(resolve => { + const delayMs = updateBackoff.fail(resolve); + splashState.seconds = Math.round(delayMs / 1000); + updateSplashState(UPDATE_FAILURE); + }); + } + } +} +/* eslint-enable camelcase */ + + +function initOldUpdater() { + modulesListeners = {}; + addModulesListener(CHECKING_FOR_UPDATES, () => { + startUpdateTimeout(); + updateSplashState(CHECKING_FOR_UPDATES); + }); + addModulesListener(UPDATE_CHECK_FINISHED, ({ + succeeded, + updateCount, + manualRequired + }) => { + stopUpdateTimeout(); + + if (!succeeded) { + scheduleUpdateCheck(); + updateSplashState(UPDATE_FAILURE); + } else if (updateCount === 0) { + moduleUpdater.setInBackground(); + launchMainWindow(); + updateSplashState(LAUNCHING); + } + }); + addModulesListener(DOWNLOADING_MODULE, ({ + name, + current, + total + }) => { + stopUpdateTimeout(); + splashState = { + current, + total + }; + updateSplashState(DOWNLOADING_UPDATES); + }); + addModulesListener(DOWNLOADING_MODULE_PROGRESS, ({ + name, + progress + }) => { + splashState.progress = progress; + updateSplashState(DOWNLOADING_UPDATES); + }); + addModulesListener(DOWNLOADED_MODULE, ({ + name, + current, + total, + succeeded + }) => { + delete splashState.progress; + + if (name === 'host') { + restartRequired = true; + } + }); + addModulesListener(DOWNLOADING_MODULES_FINISHED, ({ + succeeded, + failed + }) => { + if (failed > 0) { + scheduleUpdateCheck(); + updateSplashState(UPDATE_FAILURE); + } else { + process.nextTick(() => { + if (restartRequired) { + moduleUpdater.quitAndInstallUpdates(); + } else { + moduleUpdater.installPendingUpdates(); + } + }); + } + }); + addModulesListener(NO_PENDING_UPDATES, () => moduleUpdater.checkForUpdates()); + addModulesListener(INSTALLING_MODULE, ({ + name, + current, + total + }) => { + splashState = { + current, + total + }; + updateSplashState(INSTALLING_UPDATES); + }); + addModulesListener(INSTALLED_MODULE, ({ + name, + current, + total, + succeeded + }) => delete splashState.progress); + addModulesListener(INSTALLING_MODULE_PROGRESS, ({ + name, + progress + }) => { + splashState.progress = progress; + updateSplashState(INSTALLING_UPDATES); + }); + addModulesListener(INSTALLING_MODULES_FINISHED, ({ + succeeded, + failed + }) => moduleUpdater.checkForUpdates()); + addModulesListener(UPDATE_MANUALLY, ({ + newVersion + }) => { + splashState.newVersion = newVersion; + updateSplashState(UPDATE_MANUALLY); + }); +} + +function initSplash(startMinimized = false) { + splashState = {}; + launchedMainWindow = false; + updateAttempt = 0; + newUpdater = (0, _updater.getUpdater)(); + + if (newUpdater == null) { + initOldUpdater(); + } + + launchSplashWindow(startMinimized); + quoteCachePath = _path.default.join(paths.getUserData(), 'quotes.json'); + + _ipcMain.default.on('UPDATED_QUOTES', (_event, quotes) => cacheLatestQuotes(quotes)); +} + +function destroySplash() { + stopUpdateTimeout(); + + if (splashWindow) { + splashWindow.setSkipTaskbar(true); // defer the window hiding for a short moment so it gets covered by the main window + + const _nukeWindow = () => { + if (splashWindow != null) { + splashWindow.hide(); + splashWindow.close(); + splashWindow = null; + } + }; + + setTimeout(_nukeWindow, 100); + } +} + +function addModulesListener(event, listener) { + if (newUpdater != null) return; + modulesListeners[event] = listener; + moduleUpdater.events.addListener(event, listener); +} + +function removeModulesListeners() { + if (newUpdater != null) return; + + for (const event of Object.keys(modulesListeners)) { + moduleUpdater.events.removeListener(event, modulesListeners[event]); + } +} + +function startUpdateTimeout() { + if (!updateTimeout) { + updateTimeout = setTimeout(() => scheduleUpdateCheck(), UPDATE_TIMEOUT_WAIT); + } +} + +function stopUpdateTimeout() { + if (updateTimeout) { + clearTimeout(updateTimeout); + updateTimeout = null; + } +} + +function updateSplashState(event) { + if (splashWindow != null && !splashWindow.isDestroyed() && !splashWindow.webContents.isDestroyed()) { + webContentsSend(splashWindow, 'SPLASH_UPDATE_STATE', { + status: event, + ...splashState + }); + } +} + +function launchSplashWindow(startMinimized) { + const windowConfig = { + width: LOADING_WINDOW_WIDTH, + height: LOADING_WINDOW_HEIGHT, + transparent: false, + frame: false, + resizable: false, + center: true, + show: false, + webPreferences: { + nodeIntegration: false, + enableRemoteModule: false, + contextIsolation: true, + preload: _path.default.join(__dirname, 'preload.js') + } + }; + splashWindow = new _electron.BrowserWindow(windowConfig); // prevent users from dropping links to navigate in splash window + + splashWindow.webContents.on('will-navigate', e => e.preventDefault()); + splashWindow.webContents.on('new-window', (e, windowURL) => { + e.preventDefault(); + (0, _securityUtils.saferShellOpenExternal)(windowURL); // exit, but delay half a second because openExternal is about to fire + // some events to things that are freed by app.quit. + + setTimeout(_electron.app.quit, 500); + }); + + if (process.platform !== 'darwin') { + // citron note: this causes a crash on quit while the window is open on osx + splashWindow.on('closed', () => { + splashWindow = null; + + if (!launchedMainWindow) { + // user has closed this window before we launched the app, so let's quit + _electron.app.quit(); + } + }); + } + + _ipcMain.default.on('SPLASH_SCREEN_READY', () => { + const cachedQuote = chooseCachedQuote(); + + if (cachedQuote) { + webContentsSend(splashWindow, 'SPLASH_SCREEN_QUOTE', cachedQuote); + } + + if (splashWindow && !startMinimized) { + splashWindow.show(); + } + + if (newUpdater != null) { + updateUntilCurrent(); + } else { + moduleUpdater.installPendingUpdates(); + } + }); + + _ipcMain.default.on('SPLASH_SCREEN_QUIT', () => { + _electron.app.quit(); + }); + + const splashUrl = _url.default.format({ + protocol: 'file', + slashes: true, + pathname: _path.default.join(__dirname, 'index.html') + }); + + splashWindow.loadURL(splashUrl); +} + +function launchMainWindow() { + removeModulesListeners(); + + if (!launchedMainWindow && splashWindow != null) { + launchedMainWindow = true; + events.emit(APP_SHOULD_LAUNCH); + } +} + +function scheduleUpdateCheck() { + // TODO: can we use backoff here? + updateAttempt += 1; + const retryInSeconds = Math.min(updateAttempt * 10, RETRY_CAP_SECONDS); + splashState.seconds = retryInSeconds; + setTimeout(() => moduleUpdater.checkForUpdates(), retryInSeconds * 1000); +} + +function focusWindow() { + if (splashWindow != null) { + splashWindow.focus(); + } +} + +function pageReady() { + destroySplash(); + process.nextTick(() => events.emit(APP_SHOULD_SHOW)); +} + +function cacheLatestQuotes(quotes) { + _fs.default.writeFile(quoteCachePath, JSON.stringify(quotes), e => { + if (e) { + console.warn('Failed updating quote cache with error: ', e); + } + }); +} + +function chooseCachedQuote() { + let cachedQuote = null; + + try { + const cachedQuotes = JSON.parse(_fs.default.readFileSync(quoteCachePath)); + cachedQuote = cachedQuotes[Math.floor(Math.random() * cachedQuotes.length)]; + } catch (_err) {} + + return cachedQuote; +} \ No newline at end of file diff --git a/src/splash/splashScreen.js.self b/src/splash/splashScreen.js.self new file mode 100644 index 0000000..d76e875 --- /dev/null +++ b/src/splash/splashScreen.js.self @@ -0,0 +1,95 @@ +const { BrowserWindow, app } = require('electron'); + +const { format } = require('url'); +const { join } = require('path'); + +const ipcMain = require('../ipcMain'); + + +const LOADING_WINDOW_WIDTH = 300; +const LOADING_WINDOW_HEIGHT = process.platform === 'darwin' ? 300 : 350; // TODO: addModulesListener events should use Module's constants + +let window; + +const APP_SHOULD_LAUNCH = 'APP_SHOULD_LAUNCH'; +exports.APP_SHOULD_LAUNCH = APP_SHOULD_LAUNCH; +const APP_SHOULD_SHOW = 'APP_SHOULD_SHOW'; +exports.APP_SHOULD_SHOW = APP_SHOULD_SHOW; +const events = new (require('events')).EventEmitter(); + +exports.events = events; + +exports.initSplash = (startMinimized = false) => { // Make splash window + const windowConfig = { + width: LOADING_WINDOW_WIDTH, + height: LOADING_WINDOW_HEIGHT, + transparent: false, + frame: false, + resizable: false, + center: true, + show: false, + webPreferences: { + nodeIntegration: false, + enableRemoteModule: false, + contextIsolation: true, + preload: join(__dirname, 'preload.js') + } + }; + + window = new BrowserWindow(windowConfig); + + window.on('closed', () => { // Quit app on splash screen close + app.quit(); + window = null; + }); + + + // IPC "handlers" + ipcMain.on('SPLASH_SCREEN_READY', () => { + if (!startMinimized && window) window.show(); + + // Update and stuff + + events.emit(APP_SHOULD_LAUNCH); + }); + + if (!startMinimized && window) window.show(); + + // Update and stuff + + events.emit(APP_SHOULD_LAUNCH); + + ipcMain.on('SPLASH_SCREEN_QUIT', () => { + app.quit(); + }); + + const splashUrl = format({ + protocol: 'file', + slashes: true, + pathname: join(__dirname, 'index.html') + }); + + window.loadURL(splashUrl); +}; + +exports.focusWindow = () => { // Focus splash window + if (window) window.focus(); +}; + +const killWindow = () => { + if (!window) return; + + window.setSkipTaskbar(true); + + setTimeout(() => { + window.hide(); + window.close(); + window = null; + }, 100); +}; + +exports.pageReady = () => { // Kill splash window, emit + killWindow(); + + process.nextTick(() => events.emit(APP_SHOULD_SHOW)); +}; \ No newline at end of file diff --git a/src/splash/web/a934ab008c7f6a2274ec441f6be0696a.woff b/src/splash/web/a934ab008c7f6a2274ec441f6be0696a.woff new file mode 100644 index 0000000000000000000000000000000000000000..98aa23958fa0ca00f03fd2d00400d0307ed12e43 GIT binary patch literal 15488 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 CQ9i){ literal 0 HcmV?d00001 diff --git a/src/splash/web/abddffb32a4a35627c3857a06c751424.png b/src/splash/web/abddffb32a4a35627c3857a06c751424.png new file mode 100644 index 0000000000000000000000000000000000000000..909b7290936c50e51226b0661d686d21c207b749 GIT binary patch literal 6378 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 literal 0 HcmV?d00001 diff --git a/src/splash/web/d153359b5d87601d2b9c708b7ae2db02.woff b/src/splash/web/d153359b5d87601d2b9c708b7ae2db02.woff new file mode 100644 index 0000000000000000000000000000000000000000..2a2f65a5f2547329b1c17c3079824202837e2b64 GIT binary patch literal 23456 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 literal 0 HcmV?d00001 diff --git a/src/splash/web/index.html b/src/splash/web/index.html new file mode 100644 index 0000000..5dec1de --- /dev/null +++ b/src/splash/web/index.html @@ -0,0 +1,11 @@ + + + + + Discord Updater + + +
+ + + diff --git a/src/splash/web/index.js b/src/splash/web/index.js new file mode 100644 index 0000000..9ea6c28 --- /dev/null +++ b/src/splash/web/index.js @@ -0,0 +1,41 @@ +!function(e){var t={};function n(r){if(t[r])return t[r].exports;var a=t[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,n),a.l=!0,a.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)n.d(r,a,function(t){return e[t]}.bind(null,a));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=27)}([function(e,t,n){e.exports=n(25)()},function(e,t,n){"use strict";e.exports=n(18)},function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE){0;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}}(),e.exports=n(19)},function(e,t,n){var r; +/*! + Copyright (c) 2018 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/classnames +*/!function(){"use strict";var n={}.hasOwnProperty;function a(){for(var e=[],t=0;t=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}(this.props,[]);return function(e){c.forEach((function(t){return delete e[t]}))}(a),a.className=this.props.inputClassName,a.id=this.state.inputId,a.style=n,l.default.createElement("div",{className:this.props.className,style:t},this.renderStyles(),l.default.createElement("input",r({},a,{ref:this.inputRef})),l.default.createElement("div",{ref:this.sizerRef,style:s},e),this.props.placeholder?l.default.createElement("div",{ref:this.placeHolderSizerRef,style:s},this.props.placeholder):null)}}]),t}(o.Component);h.propTypes={className:i.default.string,defaultValue:i.default.any,extraWidth:i.default.oneOfType([i.default.number,i.default.string]),id:i.default.string,injectStyles:i.default.bool,inputClassName:i.default.string,inputRef:i.default.func,inputStyle:i.default.object,minWidth:i.default.oneOfType([i.default.number,i.default.string]),onAutosize:i.default.func,onChange:i.default.func,placeholder:i.default.string,placeholderIsMinWidth:i.default.bool,style:i.default.object,value:i.default.any},h.defaultProps={minWidth:1,injectStyles:!0},t.default=h},function(e,t,n){var r=n(10);"string"==typeof r&&(r=[[e.i,r,""]]);var a={hmr:!0,transform:void 0};n(16)(r,a);r.locals&&(e.exports=r.locals)},function(e,t,n){var r=n(11);(t=e.exports=n(6)(!1)).i(n(12),""),t.push([e.i,"@font-face {\n font-family: Whitney;\n font-style: normal;\n font-weight: 400;\n src: url("+r(n(13))+") format('woff');\n}\n@font-face {\n font-family: Whitney;\n font-style: medium;\n font-weight: 600;\n src: url("+r(n(14))+') format(\'woff\');\n}\n* {\n box-sizing: border-box;\n -webkit-user-select: none;\n cursor: default;\n}\nbody,\nhtml {\n -webkit-app-region: drag;\n padding: 0;\n margin: 0;\n overflow: hidden;\n width: 300px;\n height: 300px;\n}\n#splash {\n -webkit-app-region: drag;\n background: #282b30;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 3000;\n transform: translateZ(0);\n padding-bottom: 10px;\n}\n#splash .splash-inner {\n text-align: center;\n}\n#splash .splash-inner img,\n#splash .splash-inner video {\n size: 200px;\n}\n#splash .splash-inner video {\n visibility: hidden;\n}\n#splash .splash-inner video.loaded {\n visibility: visible;\n}\n#splash .splash-inner .splash-text {\n position: relative;\n top: -30px;\n}\n#splash .splash-inner .splash-text > span {\n color: #8a8e94;\n font-size: 12px;\n font-family: Whitney, "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;\n font-weight: 600;\n text-transform: uppercase;\n display: block;\n}\n#splash .splash-inner .splash-text > span.splash-status {\n color: #fff;\n font-weight: 400;\n font-style: italic;\n font-size: 16px;\n}\n#splash .splash-inner-dl .dice-image {\n position: absolute;\n left: 77px;\n top: 45px;\n width: 146px;\n height: 100px;\n background: url('+r(n(15))+') center center no-repeat;\n background-size: 146px 100px;\n}\n#splash .splash-inner-dl .dl-update-message {\n font-family: Whitney, "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;\n font-style: medium;\n font-size: 18px;\n color: #fff;\n padding-left: 20px;\n padding-right: 20px;\n top: 169px;\n left: 0;\n margin: 0;\n position: absolute;\n text-align: center;\n}\n#splash .splash-inner-dl .dl-version-message {\n font-family: Whitney, "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;\n font-style: medium;\n font-size: 12px;\n color: #8a8e94;\n text-transform: uppercase;\n position: absolute;\n width: 100%;\n bottom: 12px;\n left: 0;\n margin: 0;\n text-align: center;\n}\n#splash .splash-inner-dl .dl-select-frame {\n -webkit-app-region: no-drag;\n font-family: Whitney, "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;\n overflow: hidden;\n position: absolute;\n width: 100%;\n height: 130px;\n top: 220px;\n left: 0;\n margin: 0;\n}\n#splash .splash-inner-dl .dl-select-frame .Select {\n position: absolute;\n left: 0;\n top: 0;\n width: 165px;\n height: 44px;\n margin-left: 20px;\n margin-right: 10px;\n color: #fff;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-control {\n border: 1px solid;\n border-color: rgba(255,255,255,0.3);\n border-radius: 3px;\n background: #282b30;\n height: 44px;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-menu-outer {\n background: #282b30;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-menu {\n max-height: 80px;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-option {\n color: #8a8e94;\n line-height: 15px;\n padding: 5px 10px;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-option.is-focused {\n color: #fff;\n background-color: #4e59e0;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-value {\n color: #fff;\n bottom: 0;\n align-items: center;\n display: flex;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-input {\n outline: none;\n}\n#splash .splash-inner-dl .dl-select-frame .dl-button {\n position: absolute;\n left: 195px;\n top: 0;\n width: 85px;\n height: 44px;\n background-color: #5865f2;\n color: #fff;\n font-size: 14px;\n font-weight: 600;\n border-radius: 3px;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n#splash .splash-inner-dl .dl-select-frame .dl-button:hover {\n background-color: #4e59e0;\n}\n.progress {\n display: flex;\n justify-content: center;\n margin-top: 10px;\n}\n.progress .progress-bar {\n height: 8px;\n border-radius: 4px;\n width: 180px;\n background-color: rgba(255,255,255,0.1);\n}\n.progress .progress-bar .complete {\n border-radius: 4px;\n box-shadow: 0px 2px 4px 0px rgba(0,0,0,0.1), inset 0px 1px 0px 0px rgba(255,255,255,0.1);\n height: 100%;\n background-color: #737f8d;\n}\n.progress-placeholder {\n margin-top: 10px;\n height: 8px;\n}\n',""])},function(e,t){e.exports=function(e){return"string"!=typeof e?e:(/^['"].*['"]$/.test(e)&&(e=e.slice(1,-1)),/["'() \t\n]/.test(e)?'"'+e.replace(/"/g,'\\"').replace(/\n/g,"\\n")+'"':e)}},function(e,t,n){(e.exports=n(6)(!1)).push([e.i,"/**\n * React Select\n * ============\n * Created by Jed Watson and Joss Mackison for KeystoneJS, http://www.keystonejs.com/\n * https://twitter.com/jedwatson https://twitter.com/jossmackison https://twitter.com/keystonejs\n * MIT License: https://github.com/keystonejs/react-select\n*/\n.Select {\n position: relative;\n}\n.Select,\n.Select div,\n.Select input,\n.Select span {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n.Select.is-disabled > .Select-control {\n background-color: #f6f6f6;\n}\n.Select.is-disabled .Select-arrow-zone {\n cursor: default;\n pointer-events: none;\n}\n.Select-control {\n background-color: #fff;\n border-color: #d9d9d9 #ccc #b3b3b3;\n border-radius: 4px;\n border: 1px solid #ccc;\n color: #333;\n cursor: default;\n display: table;\n height: 36px;\n outline: none;\n overflow: hidden;\n position: relative;\n width: 100%;\n}\n.Select-control:hover {\n box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06);\n}\n.is-searchable.is-open > .Select-control {\n cursor: text;\n}\n.is-open > .Select-control {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n background: #fff;\n border-color: #b3b3b3 #ccc #d9d9d9;\n}\n.is-open > .Select-control > .Select-arrow {\n border-color: transparent transparent #999;\n border-width: 0 5px 5px;\n}\n.is-searchable.is-focused:not(.is-open) > .Select-control {\n cursor: text;\n}\n.is-focused:not(.is-open) > .Select-control {\n border-color: #08c #0099e6 #0099e6;\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 0 5px -1px rgba(0, 136, 204, 0.5);\n}\n.Select-placeholder {\n bottom: 0;\n color: #aaa;\n left: 0;\n line-height: 34px;\n padding-left: 10px;\n padding-right: 10px;\n position: absolute;\n right: 0;\n top: 0;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.has-value > .Select-control > .Select-placeholder {\n color: #333;\n}\n.Select-value {\n color: #aaa;\n left: 0;\n padding: 8px 52px 8px 10px;\n position: absolute;\n right: -15px;\n top: 0;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.has-value > .Select-control > .Select-value {\n color: #333;\n}\n.Select-input {\n height: 34px;\n padding-left: 10px;\n padding-right: 10px;\n vertical-align: middle;\n}\n.Select-input > input {\n background: none transparent;\n border: 0 none;\n box-shadow: none;\n cursor: default;\n display: inline-block;\n font-family: inherit;\n font-size: inherit;\n height: 34px;\n margin: 0;\n outline: none;\n padding: 0;\n -webkit-appearance: none;\n}\n.is-focused .Select-input > input {\n cursor: text;\n}\n.Select-control:not(.is-searchable) > .Select-input {\n outline: none;\n}\n.Select-loading-zone {\n cursor: pointer;\n display: table-cell;\n position: relative;\n text-align: center;\n vertical-align: middle;\n width: 16px;\n}\n.Select-loading {\n -webkit-animation: Select-animation-spin 400ms infinite linear;\n -o-animation: Select-animation-spin 400ms infinite linear;\n animation: Select-animation-spin 400ms infinite linear;\n width: 16px;\n height: 16px;\n box-sizing: border-box;\n border-radius: 50%;\n border: 2px solid #ccc;\n border-right-color: #333;\n display: inline-block;\n position: relative;\n vertical-align: middle;\n}\n.Select-clear-zone {\n -webkit-animation: Select-animation-fadeIn 200ms;\n -o-animation: Select-animation-fadeIn 200ms;\n animation: Select-animation-fadeIn 200ms;\n color: #999;\n cursor: pointer;\n display: table-cell;\n position: relative;\n text-align: center;\n vertical-align: middle;\n width: 17px;\n}\n.Select-clear-zone:hover {\n color: #d0021b;\n}\n.Select-clear {\n display: inline-block;\n font-size: 18px;\n line-height: 1;\n}\n.Select--multi .Select-clear-zone {\n width: 17px;\n}\n.Select-arrow-zone {\n cursor: pointer;\n display: table-cell;\n position: relative;\n text-align: center;\n vertical-align: middle;\n width: 25px;\n padding-right: 5px;\n}\n.Select-arrow {\n border-color: #999 transparent transparent;\n border-style: solid;\n border-width: 5px 5px 2.5px;\n display: inline-block;\n height: 0;\n width: 0;\n}\n.is-open .Select-arrow,\n.Select-arrow-zone:hover > .Select-arrow {\n border-top-color: #666;\n}\n@-webkit-keyframes Select-animation-fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n@keyframes Select-animation-fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n.Select-menu-outer {\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n background-color: #fff;\n border: 1px solid #ccc;\n border-top-color: #e6e6e6;\n box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06);\n box-sizing: border-box;\n margin-top: -1px;\n max-height: 200px;\n position: absolute;\n top: 100%;\n width: 100%;\n z-index: 1000;\n -webkit-overflow-scrolling: touch;\n}\n.Select-menu {\n max-height: 198px;\n overflow-y: auto;\n}\n.Select-option {\n box-sizing: border-box;\n color: #666666;\n cursor: pointer;\n display: block;\n padding: 8px 10px;\n}\n.Select-option:last-child {\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.Select-option.is-focused {\n background-color: #f2f9fc;\n color: #333;\n}\n.Select-option.is-disabled {\n color: #cccccc;\n cursor: not-allowed;\n}\n.Select-noresults,\n.Select-search-prompt,\n.Select-searching {\n box-sizing: border-box;\n color: #999999;\n cursor: default;\n display: block;\n padding: 8px 10px;\n}\n.Select--multi .Select-input {\n vertical-align: middle;\n margin-left: 10px;\n padding: 0;\n}\n.Select--multi.has-value .Select-input {\n margin-left: 5px;\n}\n.Select-item {\n background-color: #f2f9fc;\n border-radius: 2px;\n border: 1px solid #c9e6f2;\n color: #08c;\n display: inline-block;\n font-size: 0.9em;\n margin-left: 5px;\n margin-top: 5px;\n vertical-align: top;\n}\n.Select-item-icon,\n.Select-item-label {\n display: inline-block;\n vertical-align: middle;\n}\n.Select-item-label {\n border-bottom-right-radius: 2px;\n border-top-right-radius: 2px;\n cursor: default;\n padding: 2px 5px;\n}\n.Select-item-label .Select-item-label__a {\n color: #08c;\n cursor: pointer;\n}\n.Select-item-icon {\n cursor: pointer;\n border-bottom-left-radius: 2px;\n border-top-left-radius: 2px;\n border-right: 1px solid #c9e6f2;\n padding: 1px 5px 3px;\n}\n.Select-item-icon:hover,\n.Select-item-icon:focus {\n background-color: #ddeff7;\n color: #0077b3;\n}\n.Select-item-icon:active {\n background-color: #c9e6f2;\n}\n.Select--multi.is-disabled .Select-item {\n background-color: #f2f2f2;\n border: 1px solid #d9d9d9;\n color: #888;\n}\n.Select--multi.is-disabled .Select-item-icon {\n cursor: not-allowed;\n border-right: 1px solid #d9d9d9;\n}\n.Select--multi.is-disabled .Select-item-icon:hover,\n.Select--multi.is-disabled .Select-item-icon:focus,\n.Select--multi.is-disabled .Select-item-icon:active {\n background-color: #f2f2f2;\n}\n@keyframes Select-animation-spin {\n to {\n transform: rotate(1turn);\n }\n}\n@-webkit-keyframes Select-animation-spin {\n to {\n -webkit-transform: rotate(1turn);\n }\n}\n",""])},function(e,t,n){e.exports=n.p+"d153359b5d87601d2b9c708b7ae2db02.woff"},function(e,t,n){e.exports=n.p+"a934ab008c7f6a2274ec441f6be0696a.woff"},function(e,t,n){e.exports=n.p+"abddffb32a4a35627c3857a06c751424.png"},function(e,t,n){var r,a,o={},l=(r=function(){return window&&document&&document.all&&!window.atob},function(){return void 0===a&&(a=r.apply(this,arguments)),a}),i=function(e){var t={};return function(n){if(void 0===t[n]){var r=e.call(this,n);if(r instanceof window.HTMLIFrameElement)try{r=r.contentDocument.head}catch(e){r=null}t[n]=r}return t[n]}}((function(e){return document.querySelector(e)})),u=null,s=0,c=[],f=n(17);function p(e,t){for(var n=0;n=0&&c.splice(t,1)}function v(e){var t=document.createElement("style");return e.attrs.type="text/css",g(t,e.attrs),h(e,t),t}function g(e,t){Object.keys(t).forEach((function(n){e.setAttribute(n,t[n])}))}function y(e,t){var n,r,a,o;if(t.transform&&e.css){if(!(o=t.transform(e.css)))return function(){};e.css=o}if(t.singleton){var l=s++;n=u||(u=v(t)),r=w.bind(null,n,l,!1),a=w.bind(null,n,l,!0)}else e.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(n=function(e){var t=document.createElement("link");return e.attrs.type="text/css",e.attrs.rel="stylesheet",g(t,e.attrs),h(e,t),t}(t),r=S.bind(null,n,t),a=function(){m(n),n.href&&URL.revokeObjectURL(n.href)}):(n=v(t),r=k.bind(null,n),a=function(){m(n)});return r(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;r(e=t)}else a()}}e.exports=function(e,t){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");(t=t||{}).attrs="object"==typeof t.attrs?t.attrs:{},t.singleton||(t.singleton=l()),t.insertInto||(t.insertInto="head"),t.insertAt||(t.insertAt="bottom");var n=d(e,t);return p(n,t),function(e){for(var r=[],a=0;a