{"version":3,"file":"passwordless.mjs","sources":["../../src/passwordless.ts"],"sourcesContent":["import {\n  AtLeast,\n  PromiseResult,\n  RegisterBeginResponse,\n  SigninBeginResponse,\n  SigninMethod,\n  StepupRequest,\n  TokenResponse\n} from './types';\n\nexport * from './types';\n\nexport interface Config {\n  apiUrl: string;\n  apiKey: string;\n  origin: string;\n  rpid: string;\n}\n\nexport class Client {\n  private config: Config = {\n    apiUrl: 'https://v4.passwordless.dev',\n    apiKey: '',\n    origin: window.location.origin,\n    rpid: window.location.hostname\n  };\n\n  private _clientVersion: string = 'js-1.1.0';\n\n  private abortController: AbortController = new AbortController();\n\n  constructor(config: AtLeast<Config, 'apiKey'>) {\n    Object.assign(this.config, config);\n  }\n\n  /**\n   * Register a new credential to a user\n   *\n   * @param {string} token Token generated by your backend and the Passwordless API\n   * @param {string} credentialNickname A nickname for the passkey credential being created\n   */\n  public async register(token: string, credentialNickname?: string): PromiseResult<TokenResponse> {\n    try {\n      this.assertBrowserSupported();\n\n      const registration = await this.registerBegin(token);\n      if (registration.error) {\n        console.error(registration.error);\n        return { error: registration.error };\n      }\n\n      registration.data.challenge = base64UrlToArrayBuffer(registration.data.challenge);\n      registration.data.user.id = base64UrlToArrayBuffer(registration.data.user.id);\n      registration.data.excludeCredentials?.forEach((cred) => {\n        cred.id = base64UrlToArrayBuffer(cred.id);\n      });\n\n      const credential = (await navigator.credentials.create({\n        publicKey: registration.data\n      })) as PublicKeyCredential;\n\n      if (!credential) {\n        const error = {\n          from: 'client',\n          errorCode: 'failed_create_credential',\n          title: 'Failed to create credential (navigator.credentials.create returned null)'\n        };\n        console.error(error);\n        return { error };\n      }\n\n      return await this.registerComplete(credential, registration.session, credentialNickname);\n\n      // next steps\n      // return a token from the API\n      // Add a type to the token (method/action)\n    } catch (caughtError: any) {\n      const errorMessage = getErrorMessage(caughtError);\n      const error = {\n        from: 'client',\n        errorCode: 'unknown',\n        title: errorMessage\n      };\n      console.error(caughtError);\n      console.error(error);\n\n      return { error };\n    }\n  }\n\n  /**\n   * Sign in a user using the userid\n   * @param {string} userId\n   * @returns\n   */\n  public async signinWithId(userId: string): PromiseResult<TokenResponse> {\n    return this.signin({ userId });\n  }\n\n  /**\n   * Sign in a user using an alias\n   * @param {string} alias\n   * @returns a verify_token\n   */\n  public async signinWithAlias(alias: string): PromiseResult<TokenResponse> {\n    return this.signin({ alias });\n  }\n\n  /**\n   * Sign in a user using autofill UI (a.k.a conditional) sign in\n   * @returns a verify_token\n   */\n  public async signinWithAutofill(): PromiseResult<TokenResponse> {\n    if (!(await isAutofillSupported())) {\n      throw new Error(\n        'Autofill authentication (conditional meditation) is not supported in this browser'\n      );\n    }\n    return this.signin({ autofill: true });\n  }\n\n  /**\n   * Sign in a user using discoverable credentials\n   * @returns a verify_token\n   */\n  public async signinWithDiscoverable(): PromiseResult<TokenResponse> {\n    return this.signin({ discoverable: true });\n  }\n\n  public abort() {\n    if (this.abortController) {\n      this.abortController.abort();\n    }\n  }\n\n  public isPlatformSupported(): Promise<boolean> {\n    return isPlatformSupported();\n  }\n\n  public isBrowserSupported(): boolean {\n    return isBrowserSupported();\n  }\n\n  public isAutofillSupported(): Promise<boolean> {\n    return isAutofillSupported();\n  }\n\n  private async registerBegin(token: string): PromiseResult<RegisterBeginResponse> {\n    const response = await fetch(`${this.config.apiUrl}/register/begin`, {\n      method: 'POST',\n      headers: this.createHeaders(),\n      body: JSON.stringify({\n        token,\n        RPID: this.config.rpid,\n        Origin: this.config.origin\n      })\n    });\n\n    const res = await response.json();\n    if (response.ok) {\n      return res;\n    }\n\n    return { error: { ...res, from: 'server' } };\n  }\n\n  private async registerComplete(\n    credential: PublicKeyCredential,\n    session: string,\n    credentialNickname?: string\n  ): PromiseResult<TokenResponse> {\n    const attestationResponse = credential.response as AuthenticatorAttestationResponse;\n\n    const response = await fetch(`${this.config.apiUrl}/register/complete`, {\n      method: 'POST',\n      headers: this.createHeaders(),\n      body: JSON.stringify({\n        session: session,\n        response: {\n          id: credential.id,\n          rawId: arrayBufferToBase64Url(credential.rawId),\n          type: credential.type,\n          clientExtensionResults: credential.getClientExtensionResults(),\n          response: {\n            AttestationObject: arrayBufferToBase64Url(attestationResponse.attestationObject),\n            clientDataJson: arrayBufferToBase64Url(attestationResponse.clientDataJSON)\n          }\n        },\n        nickname: credentialNickname,\n        RPID: this.config.rpid,\n        Origin: this.config.origin\n      })\n    });\n\n    const res = await response.json();\n    if (response.ok) {\n      return res;\n    }\n\n    return { error: { ...res, from: 'server' } };\n  }\n\n  /**\n   * Sign in a user\n   *\n   * @param {SigninMethod} Object containing either UserID or Alias\n   * @returns\n   */\n  private async signin(signinMethod: SigninMethod): PromiseResult<TokenResponse> {\n    try {\n      this.assertBrowserSupported();\n      this.handleAbort();\n\n      // if signinMethod is undefined, set it to an empty object\n      // this will cause a login using discoverable credentials\n      if (!signinMethod) {\n        signinMethod = { discoverable: true };\n      }\n\n      const signin = await this.signinBegin(signinMethod);\n      if (signin.error) {\n        return signin;\n      }\n\n      const credential = (await navigator.credentials.get({\n        publicKey: signin.data,\n        mediation:\n          'autofill' in signinMethod\n            ? ('conditional' as CredentialMediationRequirement)\n            : undefined, // Typescript doesn't know about 'conditational' yet\n        signal: this.abortController.signal\n      })) as PublicKeyCredential;\n\n      const response = await this.signinComplete(credential, signin.session);\n      return response;\n    } catch (caughtError: any) {\n      const errorMessage = getErrorMessage(caughtError);\n      const error = {\n        from: 'client',\n        errorCode: 'unknown',\n        title: errorMessage\n      };\n      console.error(caughtError);\n      console.error(error);\n\n      return { error };\n    }\n  }\n\n  /**\n   * Performs a step-up authentication process. This is essentially an overload for the sign-in workflow. It allows for\n   * a user authentication to be given a purpose or context for the sign-in, enabling a \"step-up\" authentication flow.\n   *\n   * @param {StepupRequest} stepup - The step-up request object. This includes the sign-in method and the purpose of the authentication\n   *\n   * @returns {token} - The result of the step-up sign-in process.\n   */\n  public async stepup(stepup: StepupRequest): PromiseResult<TokenResponse> {\n    try {\n      this.assertBrowserSupported();\n      this.handleAbort();\n\n      if (!stepup.signinMethod) {\n        throw new Error('You need to provide the signinMethod');\n      }\n\n      if (!stepup.purpose) {\n        stepup.purpose = 'step-up';\n      }\n\n      const signin = await this.signinBegin(stepup.signinMethod, stepup.purpose);\n\n      if (signin.error) {\n        return signin;\n      }\n\n      const credential = (await navigator.credentials.get({\n        publicKey: signin.data,\n        mediation:\n          'autofill' in stepup.signinMethod\n            ? ('conditional' as CredentialMediationRequirement)\n            : undefined, // Typescript doesn't know about 'conditional' yet\n        signal: this.abortController.signal\n      })) as PublicKeyCredential;\n\n      return await this.signinComplete(credential, signin.session);\n    } catch (caughtError: any) {\n      const errorMessage = getErrorMessage(caughtError);\n      const error = {\n        from: 'client',\n        errorCode: 'unknown',\n        title: errorMessage\n      };\n      console.error(caughtError);\n      console.error(error);\n\n      return { error };\n    }\n  }\n\n  private async signinBegin(\n    signinMethod: SigninMethod,\n    purpose?: string\n  ): PromiseResult<SigninBeginResponse> {\n    const response = await fetch(`${this.config.apiUrl}/signin/begin`, {\n      method: 'POST',\n      headers: this.createHeaders(),\n      body: JSON.stringify({\n        userId: 'userId' in signinMethod ? signinMethod.userId : undefined,\n        alias: 'alias' in signinMethod ? signinMethod.alias : undefined,\n        RPID: this.config.rpid,\n        Origin: this.config.origin,\n        purpose: purpose\n      })\n    });\n\n    const res = await response.json();\n    if (response.ok) {\n      return {\n        ...res,\n        data: {\n          ...res.data,\n          challenge: base64UrlToArrayBuffer(res.data.challenge),\n          allowCredentials: res.data.allowCredentials?.map(\n            (cred: PublicKeyCredentialDescriptor) => {\n              return { ...cred, id: base64UrlToArrayBuffer(cred.id) };\n            }\n          )\n        }\n      };\n    }\n\n    return { error: { ...res, from: 'server' } };\n  }\n\n  private async signinComplete(\n    credential: PublicKeyCredential,\n    session: string\n  ): PromiseResult<TokenResponse> {\n    const assertionResponse = credential.response as AuthenticatorAssertionResponse;\n\n    const response = await fetch(`${this.config.apiUrl}/signin/complete`, {\n      method: 'POST',\n      headers: this.createHeaders(),\n      body: JSON.stringify({\n        session: session,\n        response: {\n          id: credential.id,\n          rawId: arrayBufferToBase64Url(new Uint8Array(credential.rawId)),\n          type: credential.type,\n          clientExtensionResults: credential.getClientExtensionResults(),\n          response: {\n            authenticatorData: arrayBufferToBase64Url(assertionResponse.authenticatorData),\n            clientDataJson: arrayBufferToBase64Url(assertionResponse.clientDataJSON),\n            signature: arrayBufferToBase64Url(assertionResponse.signature)\n          }\n        },\n        RPID: this.config.rpid,\n        Origin: this.config.origin\n      })\n    });\n\n    const res = await response.json();\n    if (response.ok) {\n      return res;\n    }\n\n    return { error: { ...res, from: 'server' } };\n  }\n\n  private handleAbort() {\n    this.abort();\n    this.abortController = new AbortController();\n  }\n\n  private assertBrowserSupported(): void {\n    if (!isBrowserSupported()) {\n      throw new Error('WebAuthn and PublicKeyCredentials are not supported on this browser/device');\n    }\n  }\n\n  private createHeaders(): Record<string, string> {\n    return {\n      'ApiKey': this.config.apiKey,\n      'Content-Type': 'application/json',\n      'Client-Version': this._clientVersion\n    };\n  }\n\n  public get clientVersionRegex(): RegExp {\n    return /^[a-z]+-\\d+\\.\\d+\\.\\d+$/;\n  }\n\n  /**\n   * (Internal use only) Sets the `Client-Version` header for client SDK implementations based off the Javascript Client SDK. By setting the\n   * property, the parameter will be prepended.\n   * @param {string} value The new `Client-Version` header value.\n   * @throws {Error} Throws an error if the `Client-Version` has already been set.\n   * @throws {Error} Throws an error if the `Client-Version` format is invalid. Expected format is 'prefix-x.x.x' where prefix is a lowercase string.\n   * @remarks Do not set this property when integrating the client SDK.\n   */\n  public set clientVersion(value: string) {\n    if (!this.clientVersionRegex.test(this.clientVersion)) {\n      throw new Error('`Client-Version` has already been set.');\n    }\n    if (!this.clientVersionRegex.test(value)) {\n      throw new Error(\n        \"Invalid `Client-Version` format. Expected format is 'prefix-x.x.x' where prefix is a lowercase string.\"\n      );\n    }\n    this._clientVersion = `${value}+${this.clientVersion}`;\n  }\n\n  /**\n   * Gets the `Client-Version` header for client SDK implementations based off the Javascript Client SDK.\n   */\n  public get clientVersion(): string {\n    return this._clientVersion;\n  }\n}\n\nexport async function isPlatformSupported(): Promise<boolean> {\n  if (!isBrowserSupported()) return false;\n  return PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();\n}\n\nexport function isBrowserSupported(): boolean {\n  return (\n    window.PublicKeyCredential !== undefined && typeof window.PublicKeyCredential === 'function'\n  );\n}\n\nexport async function isAutofillSupported(): Promise<boolean> {\n  const PublicKeyCredential = window.PublicKeyCredential as any; // Typescript lacks support for this\n  if (!PublicKeyCredential.isConditionalMediationAvailable) return false;\n  return PublicKeyCredential.isConditionalMediationAvailable() as Promise<boolean>;\n}\n\nfunction base64ToBase64Url(base64: string): string {\n  return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=*$/g, '');\n}\n\nfunction base64UrlToBase64(base64Url: string): string {\n  return base64Url.replace(/-/g, '+').replace(/_/g, '/');\n}\n\nfunction base64UrlToArrayBuffer(base64UrlString: string | BufferSource): Uint8Array<ArrayBuffer> {\n  // improvement: Remove BufferSource-type and add proper types upstream\n  if (typeof base64UrlString !== 'string') {\n    const msg = 'Cannot convert from Base64Url to ArrayBuffer: Input was not of type string';\n    console.error(msg, base64UrlString);\n    throw new TypeError(msg);\n  }\n\n  const base64Unpadded = base64UrlToBase64(base64UrlString);\n  const paddingNeeded = (4 - (base64Unpadded.length % 4)) % 4;\n  const base64Padded = base64Unpadded.padEnd(base64Unpadded.length + paddingNeeded, '=');\n\n  const binary = window.atob(base64Padded);\n  const bytes = new Uint8Array(binary.length);\n  for (let i = 0; i < binary.length; i++) {\n    bytes[i] = binary.charCodeAt(i);\n  }\n\n  return bytes;\n}\n\nfunction arrayBufferToBase64Url(buffer: ArrayBuffer | Uint8Array): string {\n  const uint8Array = (() => {\n    if (Array.isArray(buffer)) return Uint8Array.from(buffer);\n    if (buffer instanceof ArrayBuffer) return new Uint8Array(buffer);\n    if (buffer instanceof Uint8Array) return buffer;\n\n    const msg =\n      'Cannot convert from ArrayBuffer to Base64Url. Input was not of type ArrayBuffer, Uint8Array or Array';\n    console.error(msg, buffer);\n    throw new Error(msg);\n  })();\n\n  let string = '';\n  for (let i = 0; i < uint8Array.byteLength; i++) {\n    string += String.fromCharCode(uint8Array[i]);\n  }\n\n  const base64String = window.btoa(string);\n  return base64ToBase64Url(base64String);\n}\n\ntype ErrorWithMessage = {\n  message: string;\n};\n\nfunction isErrorWithMessage(error: unknown): error is ErrorWithMessage {\n  return (\n    typeof error === 'object' &&\n    error !== null &&\n    'message' in error &&\n    typeof (error as Record<string, unknown>).message === 'string'\n  );\n}\n\nfunction toErrorWithMessage(maybeError: unknown): ErrorWithMessage {\n  if (isErrorWithMessage(maybeError)) return maybeError;\n\n  try {\n    return new Error(JSON.stringify(maybeError));\n  } catch {\n    // fallback in case there's an error stringifying the maybeError\n    // like with circular references for example.\n    return new Error(String(maybeError));\n  }\n}\n\nfunction getErrorMessage(error: unknown) {\n  return toErrorWithMessage(error).message;\n}\n"],"names":[],"mappings":"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"}