{"version":3,"file":"WebViewExecutorStream.cjs","sourceRoot":"","sources":["../../src/webview/WebViewExecutorStream.ts"],"names":[],"mappings":";;;AACA,uEAGuC;AAQvC,MAAa,qBAAsB,SAAQ,2CAAqB;IACrD,KAAK,CAAC;IAEN,OAAO,CAAC;IAER,aAAa,CAAC;IAEvB;;;;;;;;;;;;;OAaG;IAEH,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAA6B;QACnE,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAElC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7C,gCAAgC;QAChC,6DAA6D;QAC7D,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,UAAiB,EAAE,KAAK,CAAC,CAAC;QAElE,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED;;;OAGG;IAEO,YAAY,CAAC,IAAa;QAClC,IAAI,CAAC,aAAa,CAAC,WAAW,CAC5B,IAAI,CAAC,SAAS,CAAC;YACb,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,IAAI;SACL,CAAC,CACH,CAAC;IACJ,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,IAAA,0CAAoB,EAAC,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,gCAAgC;QAChC,6DAA6D;QAC7D,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,UAAiB,EAAE,KAAK,CAAC,CAAC;IACvE,CAAC;CACF;AA5ED,sDA4EC","sourcesContent":["import type { PostMessageEvent } from '@metamask/post-message-stream';\nimport {\n  BasePostMessageStream,\n  isValidStreamMessage,\n} from '@metamask/post-message-stream';\n\ntype WebViewExecutorStreamArgs = {\n  name: string;\n  target: string;\n  targetWindow: Window['ReactNativeWebView'];\n};\n\nexport class WebViewExecutorStream extends BasePostMessageStream {\n  readonly #name;\n\n  readonly #target;\n\n  readonly #targetWindow;\n\n  /**\n   * A special post-message-stream to be used by the WebView executor.\n   *\n   * This stream is different in a few ways:\n   * - It expects data to be base64 encoded\n   * - It stringifies the data it posts\n   * - It does less validation of origins\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. child:WebView\n   * @param args.target - The name of the stream to exchange messages with. parent:rnside\n   * @param args.targetWindow - The window object of the target stream.\n   */\n\n  constructor({ name, target, targetWindow }: WebViewExecutorStreamArgs) {\n    super();\n\n    this.#name = name;\n    this.#target = target;\n    this.#targetWindow = targetWindow;\n\n    this._onMessage = this._onMessage.bind(this);\n\n    // This method is already bound.\n    // eslint-disable-next-line @typescript-eslint/unbound-method\n    window.addEventListener('message', this._onMessage as any, false);\n\n    this._handshake();\n  }\n\n  /**\n   * Webview needs to receive strings only on postMessage. That's the main difference between this and the original window post message stream.\n   * Reference: https://github.com/react-native-webview/react-native-webview/blob/master/docs/Guide.md?plain=1#L471\n   */\n\n  protected _postMessage(data: unknown): void {\n    this.#targetWindow.postMessage(\n      JSON.stringify({\n        target: this.#target,\n        data,\n      }),\n    );\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    // This method is already bound.\n    // eslint-disable-next-line @typescript-eslint/unbound-method\n    window.removeEventListener('message', this._onMessage as any, false);\n  }\n}\n"]}