{"version":3,"file":"passwordless.iife.js","sources":["../src/passwordless.ts"],"sourcesContent":["import { AtLeast, RegisterBeginResponse, RegisterCompleteResponse, SigninBeginResponse, SigninCompleteResponse, SigninMethod } 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://v3.passwordless.dev',\n apiKey: '',\n origin: window.location.origin,\n rpid: window.location.hostname,\n }\n private abortController: AbortController = new AbortController();\n\n constructor(config: AtLeast) {\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 */\n public async register(token: string, credentialNickname: string): Promise {\n this.assertBrowserSupported();\n\n try {\n const registration = await this.registerBegin(token);\n\n registration.data.challenge = this.coerceToArrayBuffer(registration.data.challenge);\n registration.data.user.id = this.coerceToArrayBuffer(registration.data.user.id);\n registration.data.excludeCredentials?.forEach((cred) => {\n cred.id = this.coerceToArrayBuffer(cred.id);\n });\n\n const credential = await navigator.credentials.create({\n publicKey: registration.data,\n }) as PublicKeyCredential;\n\n if (!credential) {\n throw new Error('Failed to create credential (navigator.credentials.create)');\n }\n\n await this.registerComplete(credential, registration.sessionId, credentialNickname);\n } catch (error:any) {\n console.error(error);\n throw new Error(`Passwordless register failed: ${error.message}`);\n }\n }\n\n private async registerBegin(token: string): Promise {\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 return response.json();\n }\n\n private async registerComplete(\n credential: PublicKeyCredential,\n sessionId: string,\n credentialNickname: string,\n ): Promise {\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 sessionId,\n response: {\n id: credential.id,\n rawId: this.coerceToBase64Url(new Uint8Array(credential.rawId)),\n type: credential.type,\n extensions: credential.getClientExtensionResults(),\n response: {\n AttestationObject: this.coerceToBase64Url(\n new Uint8Array(attestationResponse.attestationObject),\n ),\n clientDataJson: this.coerceToBase64Url(\n new Uint8Array(attestationResponse.clientDataJSON),\n ),\n },\n },\n nickname: credentialNickname,\n RPID: this.config.rpid,\n Origin: this.config.origin,\n }),\n });\n\n return response.json();\n }\n\n /**\n * Sign in a user using the userid\n * @param {string} userId \n * @returns \n */\n public async signinWithId(userId: string): Promise {\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): Promise {\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 async signinWithAutofill(): Promise {\n if (!await isAutofillSupported()) {\n throw new Error(\"Autofill authentication (conditional meditation) is not supported in this browser\");\n }\n return this.signin({ autofill: true });\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): Promise {\n this.assertBrowserSupported();\n this.handleAbort();\n\n try {\n const signin = await this.signinBegin(signinMethod);\n\n signin.data.challenge = this.coerceToArrayBuffer(signin.data.challenge);\n signin.data.allowCredentials?.forEach((cred) => {\n cred.id = this.coerceToArrayBuffer(cred.id);\n });\n\n const credential = await navigator.credentials.get({\n publicKey: signin.data,\n mediation: 'autofill' in signinMethod ? \"conditional\" as CredentialMediationRequirement : 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.sessionId);\n return response.data;\n } catch (error:any) {\n console.error(error);\n throw new Error(`Passwordless signin failed: ${error.message}`);\n }\n }\n\n private async signinBegin(signinMethod: SigninMethod): Promise {\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 }),\n });\n\n return response.json();\n }\n\n private async signinComplete(\n credential: PublicKeyCredential,\n sessionId: string,\n ): Promise {\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 sessionId,\n response: {\n id: credential.id,\n rawId: this.coerceToBase64Url(new Uint8Array(credential.rawId)),\n type: credential.type,\n extensions: credential.getClientExtensionResults(),\n response: {\n authenticatorData: this.coerceToBase64Url(\n new Uint8Array(assertionResponse.authenticatorData),\n ),\n clientDataJson: this.coerceToBase64Url(\n new Uint8Array(assertionResponse.clientDataJSON),\n ),\n signature: this.coerceToBase64Url(\n new Uint8Array(assertionResponse.signature),\n ),\n },\n },\n RPID: this.config.rpid,\n Origin: this.config.origin,\n }),\n });\n\n return response.json();\n } \n\n private handleAbort() {\n this.abort();\n this.abortController = new AbortController();\n }\n\n abort() {\n if (this.abortController) {\n this.abortController.abort();\n }\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 {\n return {\n ApiKey: this.config.apiKey,\n 'Content-Type': 'application/json',\n };\n } \n\n private coerceToArrayBuffer(value: unknown): ArrayBuffer {\n if (typeof value === 'string') {\n const base64 = this.base64UrlToBase64(value);\n const string = atob(base64);\n const bytes = new Uint8Array(string.length);\n for (let i = 0; i < string.length; i++) {\n bytes[i] = string.charCodeAt(i);\n }\n\n return bytes;\n }\n\n console.warn('Could not coerce to string:', value);\n throw new TypeError('Could not coerce to ArrayBuffer');\n }\n\n private coerceToBase64Url(value: unknown): string {\n const uint8Array = (() => {\n if (Array.isArray(value)) return Uint8Array.from(value);\n if (value instanceof ArrayBuffer) return new Uint8Array(value);\n if (value instanceof Uint8Array) return value;\n console.warn('Could not coerce to string:', value);\n throw new Error('Could not coerce to string');\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 = btoa(string);\n return this.base64ToBase64Url(base64String);\n }\n\n private base64ToBase64Url(base64: string): string {\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=*$/g, '');\n }\n\n private base64UrlToBase64(base64Url: string): string {\n return base64Url.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n\nexport async function isPlatformSupported(): Promise {\n if (!isBrowserSupported()) return false;\n return PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();\n}\n\nexport function isBrowserSupported(): boolean {\n return window.PublicKeyCredential !== undefined && typeof window.PublicKeyCredential === 'function';\n}\n\nexport async function isAutofillSupported(): Promise {\n const PublicKeyCredential = window.PublicKeyCredential as any; // Typescript lacks support for this\n if(!PublicKeyCredential.isConditionalMediationAvailable) return false;\n return PublicKeyCredential.isConditionalMediationAvailable() as Promise;\n}"],"names":[],"mappings":"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"}