{"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"]}