UNPKG

@metamask/providers

Version:

A JavaScript Ethereum provider that connects to the wallet over a stream

89 lines 3.14 kB
function $importDefault(module) { if (module?.__esModule) { return module.default; } return module; } import $ObjectMultiplex from "@metamask/object-multiplex"; const ObjectMultiplex = $importDefault($ObjectMultiplex); import { detect } from "detect-browser"; import { PortDuplexStream as PortStream } from "extension-port-stream"; import { pipeline } from "readable-stream"; import config from "./external-extension-config.json" with { type: "json" }; import { MetaMaskInpageProviderStreamName } from "../MetaMaskInpageProvider.mjs"; import { StreamProvider } from "../StreamProvider.mjs"; import { getDefaultExternalMiddleware } from "../utils.mjs"; const browser = detect(); /** * Creates an external extension provider for the given extension type or ID. * This is intended for use by 3rd party extensions. * * @param typeOrId - The extension type or ID. * @returns The external extension provider. */ export function createExternalExtensionProvider(typeOrId = 'stable') { let provider; try { const extensionId = getExtensionId(typeOrId); const metamaskPort = chrome.runtime.connect(extensionId); const pluginStream = new PortStream(metamaskPort); const streamName = MetaMaskInpageProviderStreamName; const mux = new ObjectMultiplex(); pipeline(pluginStream, mux, pluginStream, (error) => { let warningMsg = `Lost connection to "${streamName}".`; if (error?.stack) { warningMsg += `\n${error.stack}`; } console.warn(warningMsg); }); provider = new StreamProvider(mux.createStream(streamName), { logger: console, rpcMiddleware: getDefaultExternalMiddleware(console), }); // This is asynchronous but merely logs an error and does not throw upon // failure. Previously this just happened as a side-effect in the // constructor. // eslint-disable-next-line @typescript-eslint/no-floating-promises provider.initialize(); } catch (error) { console.dir(`MetaMask connect error.`, error); throw error; } return provider; } /** * Gets the extension ID for the given extension type or ID. * * @param typeOrId - The extension type or ID. * @returns The extension ID. */ function getExtensionId(typeOrId) { let ids; switch (browser?.name) { case 'edge-chromium': ids = config.edgeChromiumIds; break; case 'firefox': ids = config.firefoxIds; break; default: ids = config.chromeIds; } return ids[typeOrId] ?? typeOrId; } /** * Gets the build type for the given domain name identifier. * * @param rdns - The reverse syntax domain name identifier for the wallet. * @returns The type or ID. */ export function getBuildType(rdns) { const rndsToIdDefinition = { 'io.metamask': 'stable', 'io.metamask.beta': 'beta', 'io.metamask.flask': 'flask', }; return rndsToIdDefinition[rdns]; } //# sourceMappingURL=createExternalExtensionProvider.mjs.map