OpenAsar/core/src/app/discord_native/renderer/nativeModules.js

50 lines
1.5 KiB
JavaScript

"use strict";
const electron = require('electron');
const {
NATIVE_MODULES_GET_PATHS,
NATIVE_MODULES_INSTALL,
NATIVE_MODULES_GET_HAS_NEW_UPDATER
} = require('../common/constants').IPCEvents;
const modulePromises = {};
function getSanitizedModulePaths() {
let sanitizedModulePaths = [];
const {
mainAppDirname,
browserModulePaths
} = electron.ipcRenderer.sendSync(NATIVE_MODULES_GET_PATHS);
browserModulePaths.forEach(modulePath => {
if (!modulePath.includes('electron.asar')) {
sanitizedModulePaths.push(modulePath);
}
});
const rendererModulePaths = require('module')._nodeModulePaths(mainAppDirname);
sanitizedModulePaths = sanitizedModulePaths.concat(rendererModulePaths.slice(0, 2));
return sanitizedModulePaths;
}
function getHasNewUpdater() {
return electron.ipcRenderer.sendSync(NATIVE_MODULES_GET_HAS_NEW_UPDATER);
}
async function ensureModule(name) {
if (modulePromises[name] == null) {
modulePromises[name] = electron.ipcRenderer.invoke(NATIVE_MODULES_INSTALL, name);
}
const moduleInstall = modulePromises[name];
await moduleInstall.catch(e => {
modulePromises[name] = null;
return Promise.reject(e);
});
module.paths = getSanitizedModulePaths();
}
function requireModule(name) {
if (!/^discord_[a-z0-9_-]+$/.test(name) && name !== 'erlpack') {
throw new Error('"' + String(name) + '" is not a whitelisted native module');
}
return require(name);
}
module.paths = getSanitizedModulePaths();
module.exports = {
ensureModule,
requireModule,
canBootstrapNewUpdater: !getHasNewUpdater()
};