@metamask/providers
Version:
A JavaScript Ethereum provider that connects to the wallet over a stream
1 lines • 5.09 kB
Source Map (JSON)
{"version":3,"file":"createExternalExtensionProvider.mjs","sourceRoot":"","sources":["../../src/extension-provider/createExternalExtensionProvider.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,gBAAe,mCAAmC;;AACzD,OAAO,EAAE,MAAM,EAAE,uBAAuB;AACxC,OAAO,EAAE,gBAAgB,IAAI,UAAU,EAAE,8BAA8B;AACvE,OAAO,EAAE,QAAQ,EAAE,wBAAwB;AAG3C,OAAO,MAAM,+DAAyC;AACtD,OAAO,EAAE,gCAAgC,EAAE,sCAAkC;AAC7E,OAAO,EAAE,cAAc,EAAE,8BAA0B;AACnD,OAAO,EAAE,4BAA4B,EAAE,qBAAiB;AAExD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC;AAIzB;;;;;;GAMG;AACH,MAAM,UAAU,+BAA+B,CAC7C,WAA0B,QAAQ;IAElC,IAAI,QAAQ,CAAC;IAEb,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAiB,CAAC;QAEzE,MAAM,YAAY,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC;QAClD,MAAM,UAAU,GAAG,gCAAgC,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,eAAe,EAAE,CAAC;QAClC,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,KAAmB,EAAE,EAAE;YAChE,IAAI,UAAU,GAAG,uBAAuB,UAAU,IAAI,CAAC;YACvD,IAAI,KAAK,EAAE,KAAK,EAAE,CAAC;gBACjB,UAAU,IAAI,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;YACnC,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,QAAQ,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE;YAC1D,MAAM,EAAE,OAAO;YACf,aAAa,EAAE,4BAA4B,CAAC,OAAO,CAAC;SACrD,CAAC,CAAC;QAEH,wEAAwE;QACxE,iEAAiE;QACjE,eAAe;QACf,mEAAmE;QACnE,QAAQ,CAAC,UAAU,EAAE,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAC9C,MAAM,KAAK,CAAC;IACd,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,SAAS,cAAc,CAAC,QAAuB;IAC7C,IAAI,GAIH,CAAC;IAEF,QAAQ,OAAO,EAAE,IAAI,EAAE,CAAC;QACtB,KAAK,eAAe;YAClB,GAAG,GAAG,MAAM,CAAC,eAAe,CAAC;YAC7B,MAAM;QACR,KAAK,SAAS;YACZ,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC;YACxB,MAAM;QACR;YACE,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC;IAC3B,CAAC;IAED,OAAO,GAAG,CAAC,QAA4B,CAAC,IAAI,QAAQ,CAAC;AACvD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,kBAAkB,GAA2B;QACjD,aAAa,EAAE,QAAQ;QACvB,kBAAkB,EAAE,MAAM;QAC1B,mBAAmB,EAAE,OAAO;KAC7B,CAAC;IACF,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC","sourcesContent":["import ObjectMultiplex from '@metamask/object-multiplex';\nimport { detect } from 'detect-browser';\nimport { PortDuplexStream as PortStream } from 'extension-port-stream';\nimport { pipeline } from 'readable-stream';\nimport type { Runtime } from 'webextension-polyfill';\n\nimport config from './external-extension-config.json';\nimport { MetaMaskInpageProviderStreamName } from '../MetaMaskInpageProvider';\nimport { StreamProvider } from '../StreamProvider';\nimport { getDefaultExternalMiddleware } from '../utils';\n\nconst browser = detect();\n\nexport type ExtensionType = 'stable' | 'flask' | 'beta' | string;\n\n/**\n * Creates an external extension provider for the given extension type or ID.\n * This is intended for use by 3rd party extensions.\n *\n * @param typeOrId - The extension type or ID.\n * @returns The external extension provider.\n */\nexport function createExternalExtensionProvider(\n typeOrId: ExtensionType = 'stable',\n) {\n let provider;\n\n try {\n const extensionId = getExtensionId(typeOrId);\n const metamaskPort = chrome.runtime.connect(extensionId) as Runtime.Port;\n\n const pluginStream = new PortStream(metamaskPort);\n const streamName = MetaMaskInpageProviderStreamName;\n const mux = new ObjectMultiplex();\n pipeline(pluginStream, mux, pluginStream, (error: Error | null) => {\n let warningMsg = `Lost connection to \"${streamName}\".`;\n if (error?.stack) {\n warningMsg += `\\n${error.stack}`;\n }\n console.warn(warningMsg);\n });\n provider = new StreamProvider(mux.createStream(streamName), {\n logger: console,\n rpcMiddleware: getDefaultExternalMiddleware(console),\n });\n\n // This is asynchronous but merely logs an error and does not throw upon\n // failure. Previously this just happened as a side-effect in the\n // constructor.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n provider.initialize();\n } catch (error) {\n console.dir(`MetaMask connect error.`, error);\n throw error;\n }\n return provider;\n}\n\n/**\n * Gets the extension ID for the given extension type or ID.\n *\n * @param typeOrId - The extension type or ID.\n * @returns The extension ID.\n */\nfunction getExtensionId(typeOrId: ExtensionType) {\n let ids: {\n stable: string;\n beta?: string;\n flask?: string;\n };\n\n switch (browser?.name) {\n case 'edge-chromium':\n ids = config.edgeChromiumIds;\n break;\n case 'firefox':\n ids = config.firefoxIds;\n break;\n default:\n ids = config.chromeIds;\n }\n\n return ids[typeOrId as keyof typeof ids] ?? typeOrId;\n}\n\n/**\n * Gets the build type for the given domain name identifier.\n *\n * @param rdns - The reverse syntax domain name identifier for the wallet.\n * @returns The type or ID.\n */\nexport function getBuildType(rdns: string): string | undefined {\n const rndsToIdDefinition: Record<string, string> = {\n 'io.metamask': 'stable',\n 'io.metamask.beta': 'beta',\n 'io.metamask.flask': 'flask',\n };\n return rndsToIdDefinition[rdns];\n}\n"]}