{"version":3,"file":"WebViewMessageStream.mjs","sourceRoot":"","sources":["../../../src/services/webview/WebViewMessageStream.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACrB,sCAAsC;AACvC,OAAO,EAAE,MAAM,EAAE,wBAAwB;AAczC;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,qBAAqB;IACpD,KAAK,CAAC;IAEN,OAAO,CAAC;IAER,QAAQ,CAA+B;IAEhD;;;;;;;;OAQG;IACH,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAqB;QACtD,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QAEtB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,gCAAgC;QAChC,6DAA6D;QAC7D,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACvD,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAES,YAAY,CAAC,IAAa;QAClC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;YAC1B,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,IAAI;SACL,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAErC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,sBAAsB,OAAO,GAAG,CAAC,CAAC;IACnE,CAAC;IAED,wEAAwE;IACxE,WAAW;IACX,gDAAgD;IACxC,UAAU,CAAC,KAAuB;QACxC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEvC,gEAAgE;QAChE,0CAA0C;QAC1C,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YACpE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,QAAQ;QACN,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtB,gCAAgC;QAChC,6DAA6D;QAC7D,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC3D,CAAC;CACF","sourcesContent":["import type { PostMessageEvent } from '@metamask/post-message-stream';\nimport {\n  BasePostMessageStream,\n  isValidStreamMessage,\n} from '@metamask/post-message-stream';\nimport { assert } from '@metamask/utils';\n\nexport type WebViewInterface = {\n  injectJavaScript(js: string): void;\n  registerMessageListener(listener: (event: PostMessageEvent) => void): void;\n  unregisterMessageListener(listener: (event: PostMessageEvent) => void): void;\n};\n\nexport type WebViewStreamArgs = {\n  name: string;\n  target: string;\n  webView: WebViewInterface;\n};\n\n/**\n * A special postMessage stream used to interface with a WebView.\n */\nexport class WebViewMessageStream extends BasePostMessageStream {\n  readonly #name;\n\n  readonly #target;\n\n  readonly #webView: WebViewInterface | undefined;\n\n  /**\n   * Creates a stream for communicating with other streams inside a WebView.\n   *\n   * @param args - Options bag.\n   * @param args.name - The name of the stream. Used to differentiate between\n   * multiple streams sharing the same window object.\n   * @param args.target - The name of the stream to exchange messages with.\n   * @param args.webView - A reference to the WebView.\n   */\n  constructor({ name, target, webView }: WebViewStreamArgs) {\n    super();\n\n    this.#name = name;\n    this.#target = target;\n\n    this._onMessage = this._onMessage.bind(this);\n\n    this.#webView = webView;\n    // This method is already bound.\n    // eslint-disable-next-line @typescript-eslint/unbound-method\n    this.#webView.registerMessageListener(this._onMessage);\n    this._handshake();\n  }\n\n  protected _postMessage(data: unknown): void {\n    assert(this.#webView);\n    const json = JSON.stringify({\n      target: this.#target,\n      data,\n    });\n\n    const encoded = JSON.stringify(json);\n\n    this.#webView.injectJavaScript(`window.postMessage(${encoded})`);\n  }\n\n  // TODO: Either fix this lint violation or explain why it's necessary to\n  //  ignore.\n  // eslint-disable-next-line no-restricted-syntax\n  private _onMessage(event: PostMessageEvent): void {\n    if (typeof event.data !== 'string') {\n      return;\n    }\n\n    const message = JSON.parse(event.data);\n\n    // Notice that we don't check targetWindow or targetOrigin here.\n    // This doesn't seem possible to do in RN.\n    if (!isValidStreamMessage(message) || message.target !== this.#name) {\n      return;\n    }\n\n    this._onData(message.data);\n  }\n\n  _destroy() {\n    assert(this.#webView);\n    // This method is already bound.\n    // eslint-disable-next-line @typescript-eslint/unbound-method\n    this.#webView.unregisterMessageListener(this._onMessage);\n  }\n}\n"]}