{"version":3,"file":"FrameClient.mjs","sources":["../../../../../../../core/src/rpc/FrameClient.ts"],"sourcesContent":["import { MULTIPLE_STYTCH_CLIENTS_DETECTED_WARNING } from '../constants';\nimport { ErrorMarshaller } from '../ErrorMarshaller';\nimport { logger } from '../utils';\n\ntype RequestPayload = {\n  method: string;\n  args: unknown[];\n};\n\ntype ResponsePayload<T> = {\n  success: boolean;\n  payload: T;\n  error: Record<string, unknown>;\n};\n\nexport class IframeHostClient {\n  frame!: Promise<HTMLIFrameElement>;\n\n  constructor(private iframeURL: string) {\n    this.createIframe();\n  }\n\n  private createIframe() {\n    let existingIframe = document.querySelector(`[src~=\"${this.iframeURL}\"]`) as HTMLIFrameElement;\n\n    /* If an iframe does not exist yet, create one */\n    if (!existingIframe) {\n      existingIframe = document.createElement('iframe');\n      existingIframe.src = this.iframeURL;\n      existingIframe.style.position = 'absolute';\n      existingIframe.style.width = '0';\n      existingIframe.style.height = '0';\n      existingIframe.style.border = '0';\n      existingIframe.role = 'none';\n      document.body.appendChild(existingIframe);\n    } else {\n      logger.warn(MULTIPLE_STYTCH_CLIENTS_DETECTED_WARNING);\n    }\n\n    /**\n     * [NASTY BUG]\n     * If we postMessage to an iframe that is _not yet loaded_, chrome will give a cryptic error message\n     * Failed to execute 'postMessage' on 'DOMWindow':\n     *   The target origin provided ('https://js.stytch.com') does not match the recipient window's origin ('http://localhost:3000').\n     * There is no builtin way to determine if an iframe is already loaded,\n     * so we set a dataset attr in our onload handler and use that to determine loading state\n     */\n    if (existingIframe.dataset.loaded === 'true') {\n      this.frame = Promise.resolve(existingIframe);\n      return;\n    }\n\n    this.frame = new Promise((resolve) => {\n      existingIframe.addEventListener(\n        'load',\n        () => {\n          existingIframe.dataset.loaded = 'true';\n          resolve(existingIframe);\n        },\n        { once: true },\n      );\n    });\n  }\n\n  async call<T>(method: string, args: unknown[]): Promise<T> {\n    const frame = await this.frame;\n    const channel = new MessageChannel();\n\n    return new Promise((resolve, reject) => {\n      channel.port1.onmessage = (event) => {\n        const resp = event.data as ResponsePayload<T>;\n        channel.port1.close();\n        if (resp.success) {\n          resolve(resp.payload);\n        } else {\n          reject(ErrorMarshaller.unmarshall(resp.error));\n        }\n      };\n\n      const message: RequestPayload = {\n        method,\n        args,\n      };\n\n      frame.contentWindow?.postMessage(message, this.iframeURL, [channel.port2]);\n    });\n  }\n}\n"],"names":["IframeHostClient","frame","iframeURL","createIframe","existingIframe","document","querySelector","createElement","src","style","position","width","height","border","role","body","appendChild","logger","warn","MULTIPLE_STYTCH_CLIENTS_DETECTED_WARNING","dataset","loaded","Promise","resolve","addEventListener","once","call","method","args","channel","MessageChannel","reject","port1","onmessage","event","resp","data","close","success","payload","ErrorMarshaller","unmarshall","error","message","contentWindow","postMessage","port2"],"mappings":";;;;AAeO,MAAMA,gBAAAA,CAAAA;;IACXC,KAAAA;IAEA,WAAA,CAAoBC,SAAiB,CAAE;aAAnBA,SAAAA,GAAAA,SAAAA;AAClB,QAAA,IAAI,CAACC,YAAY,EAAA;AACnB,IAAA;IAEQA,YAAAA,GAAe;AACrB,QAAA,IAAIC,cAAAA,GAAiBC,QAAAA,CAASC,aAAa,CAAC,CAAC,OAAO,EAAE,IAAI,CAACJ,SAAS,CAAC,EAAE,CAAC,CAAA;0DAGxE,IAAI,CAACE,cAAAA,EAAgB;YACnBA,cAAAA,GAAiBC,QAAAA,CAASE,aAAa,CAAC,QAAA,CAAA;AACxCH,YAAAA,cAAAA,CAAeI,GAAG,GAAG,IAAI,CAACN,SAAS;YACnCE,cAAAA,CAAeK,KAAK,CAACC,QAAQ,GAAG,UAAA;YAChCN,cAAAA,CAAeK,KAAK,CAACE,KAAK,GAAG,GAAA;YAC7BP,cAAAA,CAAeK,KAAK,CAACG,MAAM,GAAG,GAAA;YAC9BR,cAAAA,CAAeK,KAAK,CAACI,MAAM,GAAG,GAAA;AAC9BT,YAAAA,cAAAA,CAAeU,IAAI,GAAG,MAAA;YACtBT,QAAAA,CAASU,IAAI,CAACC,WAAW,CAACZ,cAAAA,CAAAA;QAC5B,CAAA,MAAO;AACLa,YAAAA,MAAAA,CAAOC,IAAI,CAACC,wCAAAA,CAAAA;AACd,QAAA;AAEA;;;;;;;AAOC,QACD,IAAIf,cAAAA,CAAegB,OAAO,CAACC,MAAM,KAAK,MAAA,EAAQ;AAC5C,YAAA,IAAI,CAACpB,KAAK,GAAGqB,OAAAA,CAAQC,OAAO,CAACnB,cAAAA,CAAAA;AAC7B,YAAA;AACF,QAAA;AAEA,QAAA,IAAI,CAACH,KAAK,GAAG,IAAIqB,QAAQ,CAACC,OAAAA,GAAAA;YACxBnB,cAAAA,CAAeoB,gBAAgB,CAC7B,MAAA,EACA,IAAA;gBACEpB,cAAAA,CAAegB,OAAO,CAACC,MAAM,GAAG,MAAA;gBAChCE,OAAAA,CAAQnB,cAAAA,CAAAA;YACV,CAAA,EACA;gBAAEqB,IAAAA,EAAM;AAAK,aAAA,CAAA;AAEjB,QAAA,CAAA,CAAA;AACF,IAAA;AAEA,IAAA,MAAMC,IAAAA,CAAQC,MAAc,EAAEC,IAAe,EAAc;AACzD,QAAA,MAAM3B,KAAAA,GAAQ,MAAM,IAAI,CAACA,KAAK;AAC9B,QAAA,MAAM4B,UAAU,IAAIC,cAAAA,EAAAA;QAEpB,OAAO,IAAIR,OAAAA,CAAQ,CAACC,OAAAA,EAASQ,MAAAA,GAAAA;AAC3BF,YAAAA,OAAAA,CAAQG,KAAK,CAACC,SAAS,GAAG,CAACC,KAAAA,GAAAA;gBACzB,MAAMC,IAAAA,GAAOD,MAAME,IAAI;gBACvBP,OAAAA,CAAQG,KAAK,CAACK,KAAK,EAAA;gBACnB,IAAIF,IAAAA,CAAKG,OAAO,EAAE;AAChBf,oBAAAA,OAAAA,CAAQY,KAAKI,OAAO,CAAA;gBACtB,CAAA,MAAO;AACLR,oBAAAA,MAAAA,CAAOS,eAAAA,CAAgBC,UAAU,CAACN,IAAAA,CAAKO,KAAK,CAAA,CAAA;AAC9C,gBAAA;AACF,YAAA,CAAA;AAEA,YAAA,MAAMC,OAAAA,GAA0B;AAC9BhB,gBAAAA,MAAAA;AACAC,gBAAAA;AACF,aAAA;AAEA3B,YAAAA,KAAAA,CAAM2C,aAAa,EAAEC,WAAAA,CAAYF,SAAS,IAAI,CAACzC,SAAS,EAAE;AAAC2B,gBAAAA,OAAAA,CAAQiB;AAAM,aAAA,CAAA;AAC3E,QAAA,CAAA,CAAA;AACF,IAAA;AACF;;;;"}