{"version":3,"sources":["../src/passkey-plus.ts"],"sourcesContent":["import {\n  IPasskeyAuthenticateOptions,\n  IPasskeyCreationOptions,\n  PasskeyPlusOptions,\n} from \"./types\";\nimport {\n  startRegistration,\n  startAuthentication,\n} from \"@simplewebauthn/browser\";\n\nexport class PasskeyPlus {\n  private baseUrl: string;\n\n  constructor(options: PasskeyPlusOptions) {\n    const { tenantDomain, appId } = options;\n    this.baseUrl = `https://${tenantDomain}/api/v1/passkey-plus-public/${appId}`;\n  }\n\n  async register(\n    transactionID: string,\n    opts?: IPasskeyCreationOptions\n  ): Promise<string> {\n    const publicKey = await this.getRegistrationOptions(transactionID);\n\n    if (opts?.authenticatorAttachment) {\n      publicKey.authenticatorSelection = {\n        ...publicKey.authenticatorSelection,\n        authenticatorAttachment: opts.authenticatorAttachment,\n      };\n    }\n\n    const attestationResponse = await startRegistration({\n      optionsJSON: publicKey,\n    });\n\n    const res = await fetch(\n      `${this.baseUrl}/transaction/${transactionID}/register`,\n      {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify(attestationResponse),\n      }\n    );\n\n    const responseJson = await res.json();\n    const { nonce } = responseJson.data;\n    return nonce;\n  }\n\n  async authenticate(\n    transactionId: string,\n    opts?: IPasskeyAuthenticateOptions\n  ): Promise<string> {\n    const publicKey = await this.getAuthenticationOptions(transactionId);\n\n    const assertionResponse = await startAuthentication({\n      optionsJSON: publicKey,\n    });\n\n    const res = await fetch(\n      `${this.baseUrl}/transaction/${transactionId}/authenticate`,\n      {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify(assertionResponse),\n      }\n    );\n\n    if (!res.ok) {\n      const error = await res.json();\n      throw new Error(\n        `Authentication request failed: ${error.message || res.statusText}`\n      );\n    }\n\n    const responseJson = await res.json();\n    const { nonce } = responseJson.data;\n    return nonce;\n  }\n\n  async canAuthenticateWithPasskey(): Promise<boolean> {\n    return !!window.PublicKeyCredential;\n  }\n\n  async canRegisterPasskey(): Promise<boolean> {\n    return (\n      !!window.PublicKeyCredential &&\n      typeof navigator.credentials.create === \"function\"\n    );\n  }\n\n  async canUseConditionalMediation(): Promise<boolean> {\n    return typeof window?.PublicKeyCredential\n      ?.isConditionalMediationAvailable === \"function\"\n      ? await window.PublicKeyCredential.isConditionalMediationAvailable()\n      : false;\n  }\n\n  private async getRegistrationOptions(transactionID: string) {\n    const res = await fetch(\n      `${this.baseUrl}/transaction/${transactionID}/registration-options`\n    );\n\n    if (!res.ok) {\n      const error = await res.json();\n      throw new Error(\n        `Registration options request failed: ${error.message || res.statusText}`\n      );\n    }\n\n    const responseJson = await res.json();\n    return responseJson.data;\n  }\n\n  private async getAuthenticationOptions(transactionID: string) {\n    const res = await fetch(\n      `${this.baseUrl}/transaction/${transactionID}/authentication-options`\n    );\n\n    if (!res.ok) {\n      const error = await res.json();\n      throw new Error(\n        `Authentication options request failed: ${error.message || res.statusText}`\n      );\n    }\n\n    const responseJson = await res.json();\n    return responseJson.data;\n  }\n}\n"],"mappings":"AAKA,OACE,qBAAAA,EACA,uBAAAC,MACK,0BAEA,IAAMC,EAAN,KAAkB,CAGvB,YAAYC,EAA6B,CACvC,GAAM,CAAE,aAAAC,EAAc,MAAAC,CAAM,EAAIF,EAChC,KAAK,QAAU,WAAWC,CAAY,+BAA+BC,CAAK,EAC5E,CAEA,MAAM,SACJC,EACAC,EACiB,CACjB,IAAMC,EAAY,MAAM,KAAK,uBAAuBF,CAAa,EAE7DC,GAAM,0BACRC,EAAU,uBAAyB,CACjC,GAAGA,EAAU,uBACb,wBAAyBD,EAAK,uBAChC,GAGF,IAAME,EAAsB,MAAMT,EAAkB,CAClD,YAAaQ,CACf,CAAC,EAWKE,EAAe,MATT,MAAM,MAChB,GAAG,KAAK,OAAO,gBAAgBJ,CAAa,YAC5C,CACE,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,UAAUG,CAAmB,CAC1C,CACF,GAE+B,KAAK,EAC9B,CAAE,MAAAE,CAAM,EAAID,EAAa,KAC/B,OAAOC,CACT,CAEA,MAAM,aACJC,EACAL,EACiB,CACjB,IAAMC,EAAY,MAAM,KAAK,yBAAyBI,CAAa,EAE7DC,EAAoB,MAAMZ,EAAoB,CAClD,YAAaO,CACf,CAAC,EAEKM,EAAM,MAAM,MAChB,GAAG,KAAK,OAAO,gBAAgBF,CAAa,gBAC5C,CACE,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,UAAUC,CAAiB,CACxC,CACF,EAEA,GAAI,CAACC,EAAI,GAAI,CACX,IAAMC,EAAQ,MAAMD,EAAI,KAAK,EAC7B,MAAM,IAAI,MACR,kCAAkCC,EAAM,SAAWD,EAAI,UAAU,EACnE,CACF,CAEA,IAAMJ,EAAe,MAAMI,EAAI,KAAK,EAC9B,CAAE,MAAAH,CAAM,EAAID,EAAa,KAC/B,OAAOC,CACT,CAEA,MAAM,4BAA+C,CACnD,MAAO,CAAC,CAAC,OAAO,mBAClB,CAEA,MAAM,oBAAuC,CAC3C,MACE,CAAC,CAAC,OAAO,qBACT,OAAO,UAAU,YAAY,QAAW,UAE5C,CAEA,MAAM,4BAA+C,CACnD,OAAO,OAAO,QAAQ,qBAClB,iCAAoC,WACpC,MAAM,OAAO,oBAAoB,gCAAgC,EACjE,EACN,CAEA,MAAc,uBAAuBL,EAAuB,CAC1D,IAAMQ,EAAM,MAAM,MAChB,GAAG,KAAK,OAAO,gBAAgBR,CAAa,uBAC9C,EAEA,GAAI,CAACQ,EAAI,GAAI,CACX,IAAMC,EAAQ,MAAMD,EAAI,KAAK,EAC7B,MAAM,IAAI,MACR,wCAAwCC,EAAM,SAAWD,EAAI,UAAU,EACzE,CACF,CAGA,OADqB,MAAMA,EAAI,KAAK,GAChB,IACtB,CAEA,MAAc,yBAAyBR,EAAuB,CAC5D,IAAMQ,EAAM,MAAM,MAChB,GAAG,KAAK,OAAO,gBAAgBR,CAAa,yBAC9C,EAEA,GAAI,CAACQ,EAAI,GAAI,CACX,IAAMC,EAAQ,MAAMD,EAAI,KAAK,EAC7B,MAAM,IAAI,MACR,0CAA0CC,EAAM,SAAWD,EAAI,UAAU,EAC3E,CACF,CAGA,OADqB,MAAMA,EAAI,KAAK,GAChB,IACtB,CACF","names":["startRegistration","startAuthentication","PasskeyPlus","options","tenantDomain","appId","transactionID","opts","publicKey","attestationResponse","responseJson","nonce","transactionId","assertionResponse","res","error"]}