@web3auth/no-modal
Version:
Multi chain wallet aggregator for web3Auth
191 lines (187 loc) • 6.87 kB
JavaScript
'use strict';
var _objectSpread = require('@babel/runtime/helpers/objectSpread2');
var _defineProperty = require('@babel/runtime/helpers/defineProperty');
var baseControllers = require('@toruslabs/base-controllers');
var auth = require('@web3auth/auth');
require('@segment/analytics-next');
require('../../base/loglevel.js');
require('@toruslabs/session-manager');
var index = require('../../base/errors/index.js');
require('@toruslabs/constants');
require('@toruslabs/http-helpers');
require('../../base/constants.js');
require('../../base/wallet/index.js');
require('../../base/connector/connectorStatus.js');
require('../../base/connector/constants.js');
require('jwt-decode');
require('../../base/plugin/errors.js');
require('../../base/plugin/IPlugin.js');
var utils = require('./utils.js');
class BaseProvider extends baseControllers.BaseController {
constructor({
config,
state
}) {
super({
config,
state
});
// should be Assigned in setupProvider
_defineProperty(this, "_providerEngineProxy", null);
// set to true when the keyExportEnabled flag is set by code.
// This is to prevent the flag from being overridden by the dashboard config.
_defineProperty(this, "keyExportFlagSetByCode", false);
_defineProperty(this, "providerEventBridges", new Map());
_defineProperty(this, "providerListenerBridgeRegistered", false);
const {
chain
} = config;
if (!chain) throw index.WalletInitializationError.invalidProviderConfigError("Please provide chain");
if (!chain.chainId) throw index.WalletInitializationError.invalidProviderConfigError("Please provide chainId inside chain");
if (!chain.rpcTarget) throw index.WalletInitializationError.invalidProviderConfigError("Please provide rpcTarget inside chain");
if (typeof config.keyExportEnabled === "boolean") this.keyExportFlagSetByCode = true;
this.defaultState = {
chainId: "loading"
};
this.defaultConfig = {
chain: config.chain,
chains: config.chains,
keyExportEnabled: typeof config.keyExportEnabled === "boolean" ? config.keyExportEnabled : true
};
super.initialize();
}
get currentChain() {
return this.config.chains.find(chain => chain.chainId === this.state.chainId);
}
get provider() {
return this._providerEngineProxy;
}
get chainId() {
return this.state.chainId;
}
set provider(_) {
throw new Error("Method not implemented.");
}
async request(args) {
var _this$provider;
if (!args || typeof args !== "object" || Array.isArray(args)) {
throw auth.rpcErrors.invalidRequest({
message: index.WalletProviderError.invalidRequestArgs().message,
data: _objectSpread(_objectSpread({}, args || {}), {}, {
cause: index.WalletProviderError.invalidRequestArgs().message
})
});
}
const {
method,
params
} = args;
if (typeof method !== "string" || method.length === 0) {
throw auth.rpcErrors.invalidRequest({
message: index.WalletProviderError.invalidRequestMethod().message,
data: _objectSpread(_objectSpread({}, args || {}), {}, {
cause: index.WalletProviderError.invalidRequestMethod().message
})
});
}
if (params !== undefined && !Array.isArray(params) && (typeof params !== "object" || params === null)) {
throw auth.rpcErrors.invalidRequest({
message: index.WalletProviderError.invalidRequestParams().message,
data: _objectSpread(_objectSpread({}, args || {}), {}, {
cause: index.WalletProviderError.invalidRequestParams().message
})
});
}
return (_this$provider = this.provider) === null || _this$provider === void 0 ? void 0 : _this$provider.request(args);
}
sendAsync(req, callback) {
if (callback) return this.send(req, callback);
return this.request(req);
}
send(req, callback) {
this.request(req).then(res => callback(null, {
result: res
})).catch(err => callback(err, null));
}
updateProviderEngineProxy(provider) {
if (this._providerEngineProxy === provider) return;
if (this._providerEngineProxy) {
// remove all event bridges from the previous provider
this.detachProviderEventBridges(this._providerEngineProxy);
}
// attach all event bridges to the new provider
this._providerEngineProxy = provider;
this.ensureProviderListenerBridge();
this.eventNames().forEach(event => {
this.ensureProviderEventBridge(event);
});
this.attachProviderEventBridges(provider);
}
setKeyExportFlag(flag) {
if (!this.keyExportFlagSetByCode) {
this.configure({
keyExportEnabled: flag
});
}
}
getProviderEngineProxy() {
return this._providerEngineProxy;
}
getChain(chainId) {
return this.config.chains.find(chain => chain.chainId === chainId);
}
ensureProviderListenerBridge() {
if (this.providerListenerBridgeRegistered) return;
this.providerListenerBridgeRegistered = true;
this.on("newListener", event => {
this.ensureProviderEventBridge(event);
});
}
ensureProviderEventBridge(event) {
if (event === "newListener" || event === "removeListener" || this.providerEventBridges.has(event)) return;
const bridge = {
handler: (...args) => {
if (event === utils.EIP1193_EVENTS.CHAIN_CHANGED) {
const chainId = args[0];
this.update({
chainId
});
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
this.emit(event, ...args);
}
};
this.providerEventBridges.set(event, bridge);
if (!this._providerEngineProxy) return;
bridge.detach = this.attachProviderEventBridge(this._providerEngineProxy, event, bridge.handler);
}
attachProviderEventBridges(provider) {
this.providerEventBridges.forEach((bridge, event) => {
if (bridge.detach) return;
bridge.detach = this.attachProviderEventBridge(provider, event, bridge.handler);
});
}
attachProviderEventBridge(provider, event, handler) {
const removableProvider = provider;
const maybeDetach = removableProvider.on(event, handler);
return typeof maybeDetach === "function" ? () => {
maybeDetach();
} : undefined;
}
detachProviderEventBridges(provider) {
this.providerEventBridges.forEach((bridge, event) => {
if (bridge.detach) {
bridge.detach();
} else {
const removableProvider = provider;
if (typeof removableProvider.removeListener === "function") {
removableProvider.removeListener(event, bridge.handler);
} else if (typeof removableProvider.off === "function") {
removableProvider.off(event, bridge.handler);
}
}
bridge.detach = undefined;
});
}
}
exports.BaseProvider = BaseProvider;