{"version":3,"sources":["jsdelivr-header.js","/npm/siwl-test@3.1.1/dist/src/interfaces.ts","/npm/siwl-test@3.1.1/dist/src/constants.ts","/npm/siwl-test@3.1.1/dist/src/utils.ts","/npm/siwl-test@3.1.1/dist/src/relayer.ts","/npm/siwl-test@3.1.1/dist/src/authStateManager.ts","/npm/siwl-test@3.1.1/dist/src/providers/google.ts","/npm/siwl-test@3.1.1/dist/src/providers/discord.ts","/npm/siwl-test@3.1.1/dist/src/providers/wallet.ts","/npm/siwl-test@3.1.1/dist/src/litAuthClient.ts"],"names":[],"mappings":"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","file":"/npm/siwl-test@3.1.1/dist/main.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/siwl-test@3.1.1/dist/main.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import { LitNodeClient } from '@lit-protocol/lit-node-client';\nimport { GetSessionSigsProps } from '@lit-protocol/types';\n\nexport interface LitAuthOptions {\n  /**\n   * Your application's domain\n   */\n  domain: string;\n  /**\n   * The redirect URI that Lit's auth server should send the user back to\n   */\n  redirectUri: string;\n  /**\n   * Client to connect to Lit nodes\n   *\n   * Learn more about initializing LitNodeClient [here](https://serrano-sdk-docs.litprotocol.com/)\n   */\n  litNodeClient: LitNodeClient;\n  /**\n   * Configure the relay server to facilitate and subsidize minting of PKPs\n   *\n   * Learn more about the relay server [here](https://github.com/LIT-Protocol/relay-server)\n   */\n  relayConfig: RelayerConfig;\n}\n\nexport interface RelayerConfig {\n  /**\n   * URL for relay server\n   */\n  relayUrl?: string;\n  /**\n   * API key for relay server (required when using Lit's relay server)\n   */\n  relayApiKey?: string;\n}\n\nexport interface AuthInfo {\n  /**\n   * Authentication provider used\n   */\n  provider?: string;\n  /**\n   * Access token\n   */\n  accessToken?: string;\n  /**\n   * ID token\n   */\n  idToken?: string;\n  /**\n   * Wallet signature\n   */\n  authSig?: AuthSig;\n}\n\nexport interface AuthState {\n  /**\n   * Whether the user is authenticated\n   */\n  isAuthenticated: boolean;\n  /**\n   * Authenticated user's credentials\n   */\n  authInfo: AuthInfo;\n  /**\n   * Public key of the PKP currently being used for signing\n   */\n  pkpPublicKey: string | null;\n  /**\n   * Eth address of the PKP currently being used for signing\n   */\n  pkpEthAddress: string | null;\n  /**\n   * Session signatures for the current PKP\n   */\n  sessionSigs: SessionSigs;\n  /**\n   * When session signatures expire\n   */\n  sessionExpiration: string | null;\n}\n\nexport interface AuthSig {\n  /**\n   * The actual hex-encoded signature\n   */\n  sig: string;\n  /**\n   * The method used to derive the signature. Typically \"web3.eth.personal.sign\"\n   */\n  derivedVia: string;\n  /**\n   * The message that was signed\n   */\n  signedMessage: string;\n  /**\n   * The crypto wallet address that signed the message\n   */\n  address: string;\n}\n\nexport interface LoginUrlParams {\n  /**\n   * Auth method name\n   */\n  provider: string | null;\n  /**\n   * Access token\n   */\n  accessToken: string | null;\n  /**\n   * ID token\n   */\n  idToken: string | null;\n  /**\n   * OAuth state param\n   */\n  state: string | null;\n  /**\n   * Error codes from Lit's auth server\n   */\n  error: string | null;\n}\n\nexport interface HandleSignInRedirectParams {\n  /**\n   * Parameters for creating session signatures\n   */\n  sessionParams: GetSessionSigsProps;\n  /**\n   * Public key of PKP to use for creating session signatures\n   */\n  pkpPublicKey?: string;\n}\n\nexport interface SignOutOptions {\n  /**\n   * Url to redirect to after logout\n   */\n  redirectTo?: string;\n}\n\nexport interface DiscordAuthParams {\n  /**\n   * Discord access token\n   */\n  accessToken: string;\n  /**\n   * Parameters for creating session signatures\n   */\n  sessionParams: GetSessionSigsProps;\n  /**\n   * Public key of PKP to use for creating session signatures\n   */\n  pkpPublicKey?: string;\n}\n\nexport interface GoogleAuthParams {\n  /**\n   * Google ID token\n   */\n  idToken: string;\n  /**\n   * Parameters for creating session signatures\n   */\n  sessionParams: GetSessionSigsProps;\n  /**\n   * Public key of PKP to use for creating session signatures\n   */\n  pkpPublicKey?: string;\n}\n\nexport interface WalletAuthParams {\n  /**\n   * Signature from Eth wallet\n   */\n  authSig: AuthSig;\n  /**\n   * Parameters for creating session signatures\n   *\n   * Options described in more depth in these [docs](https://serrano-sdk-docs.litprotocol.com/)\n   */\n  sessionParams: GetSessionSigsProps;\n  /**\n   * Public key of PKP to use for creating session signatures\n   */\n  pkpPublicKey?: string;\n}\n\nexport interface AuthNeededCallbackParams {\n  /**\n   * Chain to use\n   */\n  chainId: number;\n  /**\n   * Resources that will be signed with session key\n   */\n  resources: string[];\n  /**\n   * Expiration date for when sigs will expire\n   */\n  expiration: string;\n  /**\n   * Session key to sign\n   */\n  uri: string;\n  /**\n   * Client to connect to Lit nodes\n   *\n   * Learn more about initializing LitNodeClient [here](https://serrano-sdk-docs.litprotocol.com/)\n   */\n  litNodeClient: LitNodeClient;\n}\n\nexport interface PKP {\n  /**\n   * PKP token ID\n   */\n  tokenId: string;\n  /**\n   * PKP public key\n   */\n  publicKey: string;\n  /**\n   * PKP Eth address\n   */\n  ethAddress: string;\n}\n\nexport enum AuthMethodType {\n  EthWallet = 1,\n  LitAction,\n  WebAuthn,\n  Discord,\n  Google,\n  GoogleJwt,\n}\n\nexport interface AuthMethod {\n  /**\n   * Auth method enum as defined in the Lit [contracts](https://github.com/LIT-Protocol/LitNodeContracts/blob/main/contracts/PKPPermissions.sol#L25)\n   */\n  authMethodType: AuthMethodType;\n  /**\n   * Auth method credential\n   */\n  accessToken: string;\n}\n\nexport interface SessionSigs {\n  /**\n   * Map of Lit node urls to session signatures\n   */\n  [key: string]: SessionSig;\n}\n\nexport interface SessionSig {\n  sig: string;\n  derivedVia: string;\n  signedMessage: string;\n  address: string;\n  algo: string;\n}\n\nexport interface RelayMintResponse {\n  /**\n   * Transaction hash of PKP being minted\n   */\n  requestId?: string;\n  /**\n   * Error from relay server\n   */\n  error?: string;\n}\n\nexport interface RelayFetchResponse {\n  /**\n   * Fetched PKPs\n   */\n  pkps?: PKP[];\n  /**\n   * Error from relay server\n   */\n  error?: string;\n}\n\nexport interface RelayPollingEvent {\n  /**\n   * Polling count\n   */\n  pollCount: number;\n  /**\n   * Transaction hash of PKP being minted\n   */\n  requestId: string;\n}\n\nexport interface RelayPollStatusResponse {\n  /**\n   * Polling status\n   */\n  status?: AuthStatus;\n  /**\n   * Token ID of PKP being minted\n   */\n  pkpTokenId?: string;\n  /**\n   * Eth address of new PKP\n   */\n  pkpEthAddress?: string;\n  /**\n   * Public key of new PKP\n   */\n  pkpPublicKey?: string;\n  /**\n   * Polling error\n   */\n  error?: string;\n}\n\nexport interface FetchPKPByAuthMethodParams {\n  /**\n   * Auth method enum as defined in the Lit [contracts](https://github.com/LIT-Protocol/LitNodeContracts/blob/main/contracts/PKPPermissions.sol#L25)\n   */\n  authMethodType: AuthMethodType;\n  /**\n   * Access token\n   */\n  accessToken?: string;\n  /**\n   * ID token\n   */\n  idToken?: string;\n  /**\n   * Wallet signature\n   */\n  authSig?: AuthSig;\n}\n\nexport enum AuthStatus {\n  InProgress = 'InProgress',\n  Succeeded = 'Succeeded',\n  Failed = 'Failed',\n}\n\nexport enum AUTH_CLIENT_EVENTS {\n  MINTING = 'relayer_minting',\n  POLLING = 'relayer_polling',\n  MINTED = 'relayer_minted',\n  HANDLING_REDIRECT = 'handling_redirect',\n  CREATING_SESSION = 'creating_session',\n  SESSION_CREATED = 'session_created',\n  SIGNED_OUT = 'signed_out',\n  ERROR = 'error',\n}\n","export const STATE_PARAM_KEY = 'lit-state-param';\nexport const LIT_AUTH_STATE_KEY = 'lit-auth-state';\n","import {\n  AuthMethod,\n  AuthMethodType,\n  PKP,\n  AuthNeededCallbackParams,\n  LoginUrlParams,\n} from './interfaces';\nimport { ethers } from 'ethers';\nimport { SiweMessage } from 'lit-siwe';\nimport { nanoid } from 'nanoid';\nimport { STATE_PARAM_KEY } from './constants';\n\n/**\n * Default callback to prompt the user to authenticate with their PKP via non-wallet auth methods such as social login\n *\n * @param {AuthMethod[]} authMethods - Auth method array that includes the auth method type and data\n * @param {string} pkpPublicKey - Public key of the PKP\n *\n * @returns callback function\n */\nexport function getDefaultAuthNeededCallback(\n  authMethods: AuthMethod[],\n  pkpPublicKey: string\n): any {\n  const defaultCallback = async ({\n    chainId,\n    resources,\n    expiration,\n    uri,\n    litNodeClient,\n  }: AuthNeededCallbackParams) => {\n    const sessionSig = await litNodeClient.signSessionKey({\n      sessionKey: uri,\n      authMethods: authMethods,\n      pkpPublicKey: pkpPublicKey,\n      expiration,\n      resources,\n      chainId,\n    });\n    return sessionSig;\n  };\n\n  return defaultCallback;\n}\n\n/**\n * Default callback to prompt the user to authenticate with their PKP using wallet signatures\n *\n * @param {string} domain - Domain that is requesting the signing\n * @param {string} ethAddress - Ethereum address of authorized wallet\n * @param {ethers.Signer} signer - Signer to sign the message\n * @param {string} pkpPublicKey - Public key of the PKP to auth with\n * @param {number} chainId - Chain ID to use\n * @param {string} [statement] - Optional statement to include in the message\n *\n * @returns callback function\n */\nexport function getDefaultWalletAuthNeededCallback(\n  domain: string,\n  ethAddress: string,\n  signer: ethers.Signer,\n  pkpPublicKey: string,\n  chainId: number,\n  statement?: string\n): any {\n  const defaultCallback = async ({\n    chainId,\n    resources,\n    expiration,\n    uri,\n    litNodeClient,\n  }: AuthNeededCallbackParams) => {\n    const statementParam = statement\n      ? statement\n      : 'Lit Protocol PKP session signature';\n    const message = new SiweMessage({\n      domain,\n      address: ethAddress,\n      statement: statementParam,\n      uri,\n      version: '1',\n      // it's a string here https://github.com/LIT-Protocol/lit-js-sdk/blob/serrano/src/utils/litNodeClient.js#L519\n      chainId: chainId,\n      expirationTime: expiration,\n      resources,\n    });\n    const toSign = message.prepareMessage();\n    const signature = await signer.signMessage(toSign);\n\n    const authSig = {\n      sig: signature,\n      derivedVia: 'web3.eth.personal.sign',\n      signedMessage: toSign,\n      address: ethAddress,\n    };\n\n    const sessionSig = await litNodeClient.signSessionKey({\n      sessionKey: uri,\n      pkpPublicKey: pkpPublicKey,\n      authSig: authSig,\n      authMethods: [\n        {\n          authMethodType: AuthMethodType.EthWallet,\n          accessToken: ethAddress,\n        },\n      ],\n      expiration,\n      resources,\n      chainId,\n    });\n\n    return sessionSig;\n  };\n\n  return defaultCallback;\n}\n\n/**\n * Check if auth provider is supported\n *\n * @param provider {string} - Auth provider name\n *\n * @returns {boolean} - True if provider is supported\n */\n// export function isSupportedProvider(provider: string): boolean {\n//   return ['google', 'discord'].includes(provider);\n// }\n\n/**\n * Check if OAuth provider is supported\n *\n * @param provider {string} - Auth provider name\n *\n * @returns {boolean} - True if provider is supported\n */\nexport function isOAuthProviderSupported(provider: string): boolean {\n  return ['google', 'discord'].includes(provider);\n}\n\n/**\n * Get route for logging in with given provider\n *\n * @param provider {string} - Auth provider name\n *\n * @returns route\n */\nexport function getLoginRoute(provider: string): string {\n  switch (provider) {\n    case 'google':\n      return '/auth/google';\n    case 'discord':\n      return '/auth/discord';\n    default:\n      throw new Error(\n        `No login route available for the given provider \"${provider}\".`\n      );\n  }\n}\n\n/**\n * Parse out login parameters from the query string\n *\n * @param {string} search - Query string\n *\n * @returns {LoginUrlParams} - Login url params\n */\nexport function parseLoginParams(search: string): LoginUrlParams {\n  const searchParams = new URLSearchParams(search);\n  const provider = searchParams.get('provider');\n  const accessToken = searchParams.get('access_token');\n  const idToken = searchParams.get('id_token');\n  const state = searchParams.get('state');\n  const error = searchParams.get('error');\n\n  return {\n    provider,\n    accessToken,\n    idToken,\n    state,\n    error,\n  };\n}\n\n/**\n * Create OAuth 2.0 state param and store it in session storage\n *\n * @returns {string} - State param\n */\nexport function setStateParam(): string {\n  const state = nanoid(15);\n  sessionStorage.setItem(STATE_PARAM_KEY, state);\n  return state;\n}\n\n/**\n * Get OAuth 2.0 state param from session storage\n *\n * @returns {string} - State param\n */\nexport function getStateParam(): string | null {\n  return sessionStorage.getItem(STATE_PARAM_KEY);\n}\n\n/**\n * Remove OAuth 2.0 state param from session storage\n *\n * @returns {void}\n */\nexport function removeStateParam(): void {\n  return sessionStorage.removeItem(STATE_PARAM_KEY);\n}\n\n/**\n * Create query params string from given object\n *\n * @param params {any} - Object of query params\n *\n * @returns {string} - Query string\n */\nexport function createQueryParams(params: any) {\n  // Strip undefined values from params\n  const filteredParams = Object.keys(params)\n    .filter(k => typeof params[k] !== 'undefined')\n    .reduce((acc, key) => ({ ...acc, [key]: params[key] }), {});\n  // Create query string\n  return new URLSearchParams(filteredParams).toString();\n}\n\n/**\n * Encode a string with base64\n *\n * @param value {string} - String to encode\n *\n * @returns {string} - Encoded string\n */\nexport function encode(value: string): string {\n  return window.btoa(value);\n}\n\n/**\n * Decode a string with base64\n *\n * @param value {string} - String to decode\n *\n * @returns {string} - Decoded string\n */\nexport function decode(value: string): string {\n  return window.atob(value);\n}\n\n/**\n * Get route for fetching PKPs\n *\n * @param {AuthMethodType} authMethodType - Auth method type\n *\n * @returns route\n */\nexport function getUserInfoRoute(authMethodType: AuthMethodType): string {\n  switch (authMethodType) {\n    case AuthMethodType.EthWallet:\n      return '/auth/wallet/userinfo';\n    case AuthMethodType.Discord:\n      return '/auth/discord/userinfo';\n    case AuthMethodType.GoogleJwt:\n      return '/auth/google/userinfo';\n    // case AuthMethodType.WebAuthn:\n    //   return '/auth/webauthn/userinfo';\n    default:\n      throw new Error(\n        `Auth method type \"${authMethodType}\" is not supported. Please refer to the type AuthMethodType to see which enum values are available.`\n      );\n  }\n}\n\n/**\n * Get route for minting PKPs\n *\n * @param {AuthMethodType} authMethodType - Auth method type\n *\n * @returns route\n */\nexport function getMintRoute(authMethodType: AuthMethodType): string {\n  switch (authMethodType) {\n    case AuthMethodType.EthWallet:\n      return '/auth/wallet';\n    case AuthMethodType.Discord:\n      return '/auth/discord';\n    case AuthMethodType.GoogleJwt:\n      return '/auth/google';\n    // case AuthMethodType.WebAuthn:\n    //   return '/auth/webauthn';\n    default:\n      throw new Error(`Auth method type \"${authMethodType}\" is not supported`);\n  }\n}\n\n/**\n * Find PKP in array of PKPs\n *\n * @param {PKP[]} pkps - array of PKPs\n * @param {string} pkpPublicKey - Public key of the PKP\n *\n * @returns PKP or undefined\n */\nexport function findPKP(pkps: PKP[], pkpPublicKey: string): PKP | undefined {\n  return pkps.find(\n    pkp => pkp.publicKey.toLowerCase() === pkpPublicKey.toLowerCase()\n  );\n}\n","import {\n  RelayerConfig,\n  AuthMethodType,\n  RelayFetchResponse,\n  RelayMintResponse,\n  RelayPollStatusResponse,\n  AUTH_CLIENT_EVENTS,\n} from './interfaces';\nimport { getUserInfoRoute, getMintRoute } from './utils';\nimport { EventEmitter } from 'events';\n\n/**\n * Class that communicates with a relay server\n */\nexport class Relayer {\n  /**\n   * URL for relay server\n   */\n  public readonly relayUrl: string;\n  /**\n   * API key for relay server (required when using Lit's relay server)\n   */\n  private readonly relayApiKey: string;\n\n  public events: EventEmitter = new EventEmitter();\n\n  /**\n   * Create a Relayer instance\n   *\n   * @param {RelayerConfig} config - Configuration object\n   * @param {string} config.relayUrl - URL for relay server\n   * @param {string} config.relayApiKey - API key for relay server\n   */\n  constructor(config: RelayerConfig) {\n    this.relayUrl = config.relayUrl\n      ? config.relayUrl\n      : 'https://relay-server-staging.herokuapp.com/';\n    this.relayApiKey = config.relayApiKey ? config.relayApiKey : '';\n  }\n\n  // -- Relayer methods --\n\n  /**\n   * Fetch PKPs associated with the given auth method\n   *\n   * @param {AuthMethodType} authMethodType - Auth method type\n   * @param {string} body - Body of the request\n   *\n   * @returns Response from the relay server\n   */\n  public async fetchPKPs(\n    authMethodType: AuthMethodType,\n    body: string\n  ): Promise<RelayFetchResponse> {\n    const route = getUserInfoRoute(authMethodType);\n    const response = await fetch(`${this.relayUrl}${route}`, {\n      method: 'POST',\n      headers: {\n        'api-key': this.relayApiKey,\n        'Content-Type': 'application/json',\n      },\n      body: body,\n    });\n\n    if (response.status < 200 || response.status >= 400) {\n      console.warn('Something wrong with the API call', await response.json());\n      // console.log(\"Uh oh, something's not quite right.\");\n      const err = new Error('Unable to fetch PKPs through relay server');\n      this.events.emit(AUTH_CLIENT_EVENTS.ERROR, err);\n      throw err;\n    } else {\n      const resBody = await response.json();\n      console.log('Response OK', { body: resBody });\n      console.log('Successfully fetched PKPs with relayer');\n      return resBody;\n    }\n  }\n\n  /**\n   * Mint a new PKP for the given auth method\n   *\n   * @param {AuthMethodType} authMethodType - Auth method type\n   * @param {string} body - Body of the request\n   *\n   * @returns Response from the relay server\n   */\n  public async mintPKP(\n    authMethodType: AuthMethodType,\n    body: string\n  ): Promise<RelayMintResponse> {\n    this.events.emit(AUTH_CLIENT_EVENTS.MINTING, { body });\n\n    const route = getMintRoute(authMethodType);\n    const response = await fetch(`${this.relayUrl}${route}`, {\n      method: 'POST',\n      headers: {\n        'api-key': this.relayApiKey,\n        'Content-Type': 'application/json',\n      },\n      body: body,\n    });\n\n    if (response.status < 200 || response.status >= 400) {\n      console.warn('Something wrong with the API call', await response.json());\n      const err = new Error('Unable to mint PKP through relay server');\n      this.events.emit(AUTH_CLIENT_EVENTS.ERROR, err);\n      throw err;\n    } else {\n      const resBody = await response.json();\n      console.log('Response OK', { body: resBody });\n      console.log('Successfully initiated minting PKP with relayer');\n      return resBody;\n    }\n  }\n\n  /**\n   * Poll the relay server for status of minting request\n   *\n   * @param {string} requestId - Request ID to poll, likely the minting transaction hash\n   *\n   * @returns Response from the relay server\n   */\n  public async pollRequestUntilTerminalState(\n    requestId: string\n  ): Promise<RelayPollStatusResponse> {\n    const maxPollCount = 20;\n    for (let i = 0; i < maxPollCount; i++) {\n      this.events.emit(AUTH_CLIENT_EVENTS.POLLING, {\n        pollCount: i,\n        requestId: requestId,\n      });\n\n      const response = await fetch(\n        `${this.relayUrl}/auth/status/${requestId}`,\n        {\n          method: 'GET',\n          headers: {\n            'api-key': this.relayApiKey,\n          },\n        }\n      );\n\n      if (response.status < 200 || response.status >= 400) {\n        console.warn(\n          'Something wrong with the API call',\n          await response.json()\n        );\n        const err = new Error(\n          `Unable to poll the status of this mint PKP transaction: ${requestId}`\n        );\n        this.events.emit(AUTH_CLIENT_EVENTS.ERROR, err);\n        throw err;\n      }\n\n      const resBody = await response.json();\n      console.log('Response OK', { body: resBody });\n\n      if (resBody.error) {\n        // exit loop since error\n        console.warn('Something wrong with the API call', {\n          error: resBody.error,\n        });\n        const err = new Error(resBody.error);\n        this.events.emit(AUTH_CLIENT_EVENTS.ERROR, err);\n        throw err;\n      } else if (resBody.status === 'Succeeded') {\n        // exit loop since success\n        console.info('Successfully authed', { ...resBody });\n        this.events.emit(AUTH_CLIENT_EVENTS.MINTED, { ...resBody });\n        return resBody;\n      }\n\n      // otherwise, sleep then continue polling\n      await new Promise(r => setTimeout(r, 15000));\n    }\n\n    // at this point, polling ended and still no success, set failure status\n    // console.error(`Hmm this is taking longer than expected...`);\n    const err = new Error('Polling for mint PKP transaction status timed out');\n    this.events.emit(AUTH_CLIENT_EVENTS.ERROR, err);\n    throw err;\n  }\n\n  // --- Event listener methods ---\n  /**\n   * Register an event listener that will be invoked every time the named event is emitted\n   *\n   * @param {string} event - Event name\n   * @param {Function} listener - Callback function\n   */\n  public on(event: string, listener: any): void {\n    this.events.on(event, listener);\n  }\n}\n","import { LIT_AUTH_STATE_KEY } from './constants';\nimport { AuthInfo, AuthState, SessionSigs } from './interfaces';\n\n/**\n * Class for storing, updating, and retrieving user info\n */\nexport class AuthStateManager {\n  /**\n   * Whether the user is authenticated\n   */\n  private _isAuthenticated = false;\n  /**\n   * Login info including auth method and credential\n   */\n  private _authInfo: AuthInfo = {};\n  /**\n   * Public key of the PKP currently being used for signing\n   */\n  private _pkpPublicKey: string | null = null;\n  /**\n   * Eth address of the PKP currently being used for signing\n   */\n  private _pkpEthAddress: string | null = null;\n  /**\n   * Session signatures for the current PKP\n   */\n  private _sessionSigs: SessionSigs = {};\n  /**\n   * When session signatures expire\n   */\n  private _sessionExpiration: string | null = null;\n\n  constructor() {\n    this._restoreFromStorage();\n  }\n\n  // --- Getters ---\n\n  public getAuthState(): AuthState {\n    return {\n      isAuthenticated: this._isAuthenticated,\n      authInfo: this._authInfo,\n      pkpPublicKey: this._pkpPublicKey,\n      pkpEthAddress: this._pkpEthAddress,\n      sessionSigs: this._sessionSigs,\n      sessionExpiration: this._sessionExpiration,\n    };\n  }\n\n  public getIsAuthenticated(): boolean {\n    return this._isAuthenticated;\n  }\n\n  public getAuthInfo(): AuthInfo {\n    return this._authInfo;\n  }\n\n  public getPKPPublicKey(): string | null {\n    return this._pkpPublicKey;\n  }\n\n  public getPKPEthAddress(): string | null {\n    return this._pkpEthAddress;\n  }\n\n  public getSessionSigs(): SessionSigs {\n    return this._sessionSigs;\n  }\n\n  public getSessionExpiration(): string | null {\n    return this._sessionExpiration;\n  }\n\n  // --- Setters ---\n\n  public setIsAuthenticated(isAuthenticated: boolean): void {\n    this._isAuthenticated = isAuthenticated;\n    this._persistToStorage();\n  }\n\n  public setAuthInfo(authInfo: AuthInfo): void {\n    this._authInfo = authInfo;\n    this._persistToStorage();\n  }\n\n  public setPKPPublicKey(pkpPublicKey: string | null): void {\n    this._pkpPublicKey = pkpPublicKey;\n    this._persistToStorage();\n  }\n\n  public setPKPEthAddress(pkpEthAddress: string | null): void {\n    this._pkpEthAddress = pkpEthAddress;\n    this._persistToStorage();\n  }\n\n  public setSessionSigs(sessionSigs: SessionSigs): void {\n    this._sessionSigs = sessionSigs;\n    this._persistToStorage();\n  }\n\n  public setSessionExpiration(sessionExpiration: string | null): void {\n    this._sessionExpiration = sessionExpiration;\n    this._persistToStorage();\n  }\n\n  /**\n   * Clears all auth state from memory and local storage\n   */\n  public clear(): void {\n    this._resetState();\n    this._removeFromStorage();\n  }\n\n  private _resetState(): void {\n    this._isAuthenticated = false;\n    this._authInfo = {};\n    this._pkpPublicKey = null;\n    this._pkpEthAddress = null;\n    this._sessionSigs = {};\n    this._sessionExpiration = null;\n  }\n\n  private _restoreFromStorage(): void {\n    const authState = localStorage.getItem(LIT_AUTH_STATE_KEY);\n    if (authState) {\n      const parsedAuthState = JSON.parse(authState);\n      if (parsedAuthState.isAuthenticated) {\n        this._isAuthenticated = parsedAuthState.isAuthenticated;\n      }\n      if (parsedAuthState.authInfo) {\n        this._authInfo = parsedAuthState.authInfo;\n      }\n      if (parsedAuthState.pkpPublicKey) {\n        this._pkpPublicKey = parsedAuthState.pkpPublicKey;\n      }\n      if (parsedAuthState.pkpEthAddress) {\n        this._pkpEthAddress = parsedAuthState.pkpEthAddress;\n      }\n      if (parsedAuthState.sessionSigs) {\n        this._sessionSigs = parsedAuthState.sessionSigs;\n      }\n      if (parsedAuthState.sessionExpiration) {\n        this._sessionExpiration = parsedAuthState.sessionExpiration;\n      }\n    }\n  }\n\n  private _persistToStorage(): void {\n    const authState = this.getAuthState();\n    localStorage.setItem(LIT_AUTH_STATE_KEY, JSON.stringify(authState));\n  }\n\n  private _removeFromStorage(): void {\n    localStorage.removeItem(LIT_AUTH_STATE_KEY);\n  }\n}\n","import { LitAuthClient } from '../litAuthClient';\nimport {\n  AuthMethodType,\n  GoogleAuthParams,\n  PKP,\n  SessionSigs,\n  AUTH_CLIENT_EVENTS,\n} from '../interfaces';\nimport { getDefaultAuthNeededCallback } from '../utils';\nimport { ethers } from 'ethers';\n\n/**\n * Controller class that handles creating, fetching, and authenticating PKPs tied to Google OAuth\n */\nexport class GoogleProvider {\n  private readonly core: LitAuthClient;\n\n  constructor(core: LitAuthClient) {\n    this.core = core;\n  }\n\n  /**\n   * Create a session for a given authorized Google account to use their PKPs\n   *\n   * @param {GoogleAuthParams} params\n   * @param {string} params.idToken - Google ID token\n   * @param {SessionParams} params.sessionParams - Parameters for creating session signatures\n   * @param {string} [params.pkpPublicKey] - Public key of PKP to use for creating session signatures\n   *\n   * @returns {Promise<SessionSigs>} - Session signatures\n   */\n  public async createSession(params: GoogleAuthParams): Promise<SessionSigs> {\n    const idToken = params.idToken;\n\n    let currentPKPPublicKey: string;\n\n    if (params.pkpPublicKey && params.pkpPublicKey.length > 0) {\n      currentPKPPublicKey = params.pkpPublicKey;\n    } else {\n      // If no PKP public key is provided, mint a new PKP\n      const newPKP = await this.mintPKP(idToken);\n      currentPKPPublicKey = newPKP.publicKey;\n    }\n\n    this.core.events.emit(AUTH_CLIENT_EVENTS.CREATING_SESSION);\n\n    // Keep track of session expiration\n    const expiration =\n      params.sessionParams.expiration ||\n      new Date(Date.now() + 1000 * 60 * 60 * 24).toISOString(); // default is 24 hours\n\n    // Check if authNeededCallback was passed in, otherwise use default callback\n    const authMethods = [\n      {\n        authMethodType: AuthMethodType.GoogleJwt,\n        accessToken: idToken,\n      },\n    ];\n    const authNeededCallback =\n      params.sessionParams.authNeededCallback ||\n      getDefaultAuthNeededCallback(authMethods, currentPKPPublicKey);\n\n    // Get session signatures\n    const sessionSigs = await this.core.litNodeClient.getSessionSigs({\n      ...params.sessionParams,\n      authNeededCallback: authNeededCallback,\n    });\n\n    this.core.events.emit(AUTH_CLIENT_EVENTS.SESSION_CREATED);\n\n    // Store user info in auth state\n    this.core.authState.setIsAuthenticated(true);\n    this.core.authState.setAuthInfo({ provider: 'google', idToken: idToken });\n    this.core.authState.setPKPPublicKey(currentPKPPublicKey);\n    this.core.authState.setPKPEthAddress(\n      ethers.utils.computeAddress(currentPKPPublicKey)\n    );\n    this.core.authState.setSessionSigs(sessionSigs);\n    this.core.authState.setSessionExpiration(expiration);\n\n    // Return session signatures\n    return sessionSigs;\n  }\n\n  /**\n   * Fetch PKPs associated with the given Google account through the relay server\n   *\n   * @param {string} idToken - Google ID token\n   *\n   * @returns PKPs associated with Google account\n   */\n  public async fetchPKPs(idToken: string): Promise<PKP[]> {\n    // Fetch PKPs associated with Google OAuth\n    const body = JSON.stringify({\n      idToken: idToken,\n    });\n    const fetchRes = await this.core.relayer.fetchPKPs(\n      AuthMethodType.GoogleJwt,\n      body\n    );\n    const { pkps } = fetchRes;\n    if (!pkps) {\n      throw new Error('Unable to fetch PKPs through relay server');\n    }\n    return pkps;\n  }\n\n  /**\n   * Mint a PKP for the given Google account through the relay server\n   *\n   * @param {string} idToken - Google ID token\n   *\n   * @returns newly minted PKP\n   */\n  public async mintPKP(idToken: string): Promise<PKP> {\n    // Mint a new PKP via relay server\n    const body = JSON.stringify({\n      idToken: idToken,\n    });\n    const mintRes = await this.core.relayer.mintPKP(\n      AuthMethodType.GoogleJwt,\n      body\n    );\n    const { requestId } = mintRes;\n    if (!requestId) {\n      throw new Error('Unable to mint PKP through relay server');\n    }\n\n    // Poll for status of minting PKP\n    const pollRes = await this.core.relayer.pollRequestUntilTerminalState(\n      requestId\n    );\n    if (\n      !pollRes.pkpTokenId ||\n      !pollRes.pkpEthAddress ||\n      !pollRes.pkpPublicKey\n    ) {\n      throw new Error('Unable to mint PKP through relay server');\n    }\n    const newPKP: PKP = {\n      tokenId: pollRes.pkpTokenId,\n      ethAddress: pollRes.pkpEthAddress,\n      publicKey: pollRes.pkpPublicKey,\n    };\n\n    return newPKP;\n  }\n}\n","import { LitAuthClient } from '../litAuthClient';\nimport {\n  AuthMethodType,\n  PKP,\n  DiscordAuthParams,\n  AUTH_CLIENT_EVENTS,\n  SessionSigs,\n} from '../interfaces';\nimport { getDefaultAuthNeededCallback } from '../utils';\nimport { ethers } from 'ethers';\n\n/**\n * Controller class that handles creating, fetching, and authenticating PKPs tied to Discord OAuth\n */\nexport class DiscordProvider {\n  private readonly core: LitAuthClient;\n\n  constructor(core: LitAuthClient) {\n    this.core = core;\n  }\n\n  /**\n   * Create a session for a given authorized Discord account to use their PKPs\n   *\n   * @param {DiscordAuthParams} params\n   * @param {string} params.accessToken - Discord access token\n   * @param {SessionParams} params.sessionParams - Parameters for creating session signatures\n   * @param {string} [params.pkpPublicKey] - Public key of PKP to use for creating session signatures\n   *\n   * @returns {Promise<SessionSigs>} - Session signatures\n   */\n  public async createSession(params: DiscordAuthParams): Promise<SessionSigs> {\n    const accessToken = params.accessToken;\n\n    let currentPKPPublicKey: string;\n\n    if (params.pkpPublicKey && params.pkpPublicKey.length > 0) {\n      currentPKPPublicKey = params.pkpPublicKey;\n    } else {\n      // If no PKP public key is provided, mint a new PKP\n      const newPKP = await this.mintPKP(accessToken);\n      currentPKPPublicKey = newPKP.publicKey;\n    }\n\n    this.core.events.emit(AUTH_CLIENT_EVENTS.CREATING_SESSION);\n\n    // Keep track of session expiration\n    const expiration =\n      params.sessionParams.expiration ||\n      new Date(Date.now() + 1000 * 60 * 60 * 24).toISOString(); // default is 24 hours\n\n    // Check if authNeededCallback was passed in, otherwise use default callback\n    const authMethods = [\n      {\n        authMethodType: AuthMethodType.Discord,\n        accessToken: accessToken,\n      },\n    ];\n    const authNeededCallback =\n      params.sessionParams.authNeededCallback ||\n      getDefaultAuthNeededCallback(authMethods, currentPKPPublicKey);\n\n    // Get session signatures\n    const sessionSigs = await this.core.litNodeClient.getSessionSigs({\n      ...params.sessionParams,\n      authNeededCallback: authNeededCallback,\n    });\n\n    this.core.events.emit(AUTH_CLIENT_EVENTS.SESSION_CREATED);\n\n    // Store user info in auth state\n    this.core.authState.setIsAuthenticated(true);\n    this.core.authState.setAuthInfo({\n      provider: 'discord',\n      accessToken: accessToken,\n    });\n    this.core.authState.setPKPPublicKey(currentPKPPublicKey);\n    this.core.authState.setPKPEthAddress(\n      ethers.utils.computeAddress(currentPKPPublicKey)\n    );\n    this.core.authState.setSessionSigs(sessionSigs);\n    this.core.authState.setSessionExpiration(expiration);\n\n    // Return session signatures\n    return sessionSigs;\n  }\n\n  /**\n   * Fetch PKPs associated with the given Discord account through the relay server\n   *\n   * @param {string} accessToken - Discord access token\n   *\n   * @returns PKPs associated with Discord account\n   */\n  public async fetchPKPs(accessToken: string): Promise<PKP[]> {\n    // Fetch PKPs associated with Discord OAuth\n    const body = JSON.stringify({\n      accessToken: accessToken,\n    });\n    const fetchRes = await this.core.relayer.fetchPKPs(\n      AuthMethodType.Discord,\n      body\n    );\n    const { pkps } = fetchRes;\n    if (!pkps) {\n      throw new Error('Unable to fetch PKPs through relay server');\n    }\n    return pkps;\n  }\n\n  /**\n   * Mint a PKP for the given Discord account through the relay server\n   *\n   * @param {string} accessToken - Discord access token\n   *\n   * @returns newly minted PKP\n   */\n  public async mintPKP(accessToken: string): Promise<PKP> {\n    // Mint a new PKP via relay server\n    const body = JSON.stringify({\n      accessToken: accessToken,\n    });\n    const mintRes = await this.core.relayer.mintPKP(\n      AuthMethodType.Discord,\n      body\n    );\n    const { requestId } = mintRes;\n    if (!requestId) {\n      throw new Error('Unable to mint PKP through relay server');\n    }\n\n    // Poll for status of minting PKP\n    const pollRes = await this.core.relayer.pollRequestUntilTerminalState(\n      requestId\n    );\n    if (\n      !pollRes.pkpTokenId ||\n      !pollRes.pkpEthAddress ||\n      !pollRes.pkpPublicKey\n    ) {\n      throw new Error('Unable to mint PKP through relay server');\n    }\n    const newPKP: PKP = {\n      tokenId: pollRes.pkpTokenId,\n      ethAddress: pollRes.pkpEthAddress,\n      publicKey: pollRes.pkpPublicKey,\n    };\n\n    return newPKP;\n  }\n}\n","import { LitAuthClient } from '../litAuthClient';\nimport {\n  AuthSig,\n  AuthMethodType,\n  PKP,\n  WalletAuthParams,\n  SessionSigs,\n  AUTH_CLIENT_EVENTS,\n} from '../interfaces';\nimport { ethers } from 'ethers';\n\n/**\n * Controller class that handles creating, fetching, and authenticating PKPs tied to Eth Wallets\n */\nexport class WalletProvider {\n  private readonly core: LitAuthClient;\n\n  constructor(core: LitAuthClient) {\n    this.core = core;\n  }\n\n  /**\n   * Create a session for a given authorized Eth Wallet to use their PKPs\n   *\n   * @param {WalletAuthParams} params\n   * @param {AuthSig} params.authSig - Signature of authorized wallet\n   * @param {SessionParams} params.SessionParams - Session config that will be used to generate session signatures\n   * @param {string} [params.pkpPublicKey] - Public key of PKP to use for creating session signatures\n   *\n   * @returns {Promise<SessionSigs>} - Session signatures\n   */\n  public async createSession(params: WalletAuthParams): Promise<SessionSigs> {\n    const authSig = params.authSig;\n\n    let currentPKPPublicKey: string;\n\n    if (params.pkpPublicKey && params.pkpPublicKey.length > 0) {\n      currentPKPPublicKey = params.pkpPublicKey;\n    } else {\n      // If no PKP public key is provided, mint a new PKP\n      const newPKP = await this.mintPKP(authSig);\n      currentPKPPublicKey = newPKP.publicKey;\n    }\n\n    this.core.events.emit(AUTH_CLIENT_EVENTS.CREATING_SESSION);\n\n    // Keep track of session expiration\n    const expiration =\n      params.sessionParams.expiration ||\n      new Date(Date.now() + 1000 * 60 * 60 * 24).toISOString(); // default is 24 hours\n\n    // Get session signatures\n    const sessionSigs = await this.core.litNodeClient.getSessionSigs({\n      ...params.sessionParams,\n    });\n\n    this.core.events.emit(AUTH_CLIENT_EVENTS.SESSION_CREATED);\n\n    // Store user info in auth state\n    this.core.authState.setIsAuthenticated(true);\n    this.core.authState.setAuthInfo({\n      provider: 'ethwallet',\n      authSig: authSig,\n    });\n    this.core.authState.setPKPPublicKey(currentPKPPublicKey);\n    this.core.authState.setPKPEthAddress(\n      ethers.utils.computeAddress(currentPKPPublicKey)\n    );\n    this.core.authState.setSessionSigs(sessionSigs);\n    this.core.authState.setSessionExpiration(expiration);\n\n    // Return session signatures\n    return sessionSigs;\n  }\n\n  /**\n   * Fetch PKPs associated with given Eth Wallet through the relay server\n   *\n   * @param {AuthSig} authSig - signature to prove ownership of Eth Wallet\n   *\n   * @returns PKPs associated with Eth Wallet\n   */\n  public async fetchPKPs(authSig: AuthSig): Promise<PKP[]> {\n    // Fetch PKPs associated with wallet address\n    const body = JSON.stringify(authSig);\n    const fetchRes = await this.core.relayer.fetchPKPs(\n      AuthMethodType.EthWallet,\n      body\n    );\n    const { pkps } = fetchRes;\n    if (!pkps) {\n      throw new Error('Unable to fetch PKPs through relay server');\n    }\n    return pkps;\n  }\n\n  /**\n   * Mint a PKP for the given Eth Wallet through the relay server\n   *\n   * @param {AuthSig} authSig - signature to prove ownership of Eth Wallet\n   *\n   * @returns newly minted PKP\n   */\n  public async mintPKP(authSig: AuthSig): Promise<PKP> {\n    // Mint a new PKP via relay server\n    const body = JSON.stringify(authSig);\n    const mintRes = await this.core.relayer.mintPKP(\n      AuthMethodType.EthWallet,\n      body\n    );\n    const { requestId } = mintRes;\n    if (!requestId) {\n      throw new Error('Unable to mint PKP through relay server');\n    }\n\n    // Poll for status of minting PKP\n    const pollRes = await this.core.relayer.pollRequestUntilTerminalState(\n      requestId\n    );\n    if (\n      !pollRes.pkpTokenId ||\n      !pollRes.pkpEthAddress ||\n      !pollRes.pkpPublicKey\n    ) {\n      throw new Error('Unable to mint PKP through relay server');\n    }\n    const newPKP: PKP = {\n      tokenId: pollRes.pkpTokenId,\n      ethAddress: pollRes.pkpEthAddress,\n      publicKey: pollRes.pkpPublicKey,\n    };\n\n    return newPKP;\n  }\n}\n","import {\n  LitAuthOptions,\n  SignOutOptions,\n  RelayPollStatusResponse,\n  RelayPollingEvent,\n  AuthState,\n  AUTH_CLIENT_EVENTS,\n  HandleSignInRedirectParams,\n  SessionSigs,\n  AuthMethodType,\n  PKP,\n  FetchPKPByAuthMethodParams,\n  WalletAuthParams,\n} from './interfaces';\nimport { Relayer } from './relayer';\nimport { AuthStateManager } from './authStateManager';\nimport { EventEmitter } from 'events';\nimport {\n  createQueryParams,\n  encode,\n  decode,\n  getStateParam,\n  setStateParam,\n  isOAuthProviderSupported,\n  getLoginRoute,\n  removeStateParam,\n  parseLoginParams,\n} from './utils';\n\nimport { GoogleProvider } from './providers/google';\nimport { DiscordProvider } from './providers/discord';\nimport { WalletProvider } from './providers/wallet';\n\nimport { LitNodeClient } from '@lit-protocol/lit-node-client';\nimport { ethConnect } from '@lit-protocol/auth-browser';\n\n/**\n * Class that handles authentication and session key creation for Lit PKPs\n */\nexport class LitAuthClient {\n  /**\n   * Your application's domain\n   */\n  public readonly domain: string;\n  /**\n   * The redirect URI that Lit's auth server should send the user back to\n   */\n  public readonly redirectUri: string;\n  /**\n   * Client to connect to Lit nodes\n   */\n  public litNodeClient: LitNodeClient;\n  /**\n   * Relayer to facilitate and subsidize minting of PKPs\n   */\n  public relayer: Relayer;\n  /**\n   * State manager to store, update, and retrieve auth state\n   */\n  public authState: AuthStateManager;\n  /**\n   * Event emitter to subscribe and publish events\n   */\n  public events: EventEmitter = new EventEmitter();\n  /**\n   * Provider that handles Google login\n   */\n  private googleProvider: GoogleProvider;\n  /**\n   * Provider that handles Discord login\n   */\n  private discordProvider: DiscordProvider;\n  /**\n   * Provider that handles Discord login\n   */\n  private walletProvider: WalletProvider;\n\n  constructor(options: LitAuthOptions) {\n    if (!options.litNodeClient) {\n      throw new Error('LitNodeClient is required');\n    }\n\n    this.domain = options.domain;\n    this.redirectUri = options.redirectUri;\n\n    this.litNodeClient = options.litNodeClient;\n    this.relayer = new Relayer(options.relayConfig);\n    this.authState = new AuthStateManager();\n\n    this.googleProvider = new GoogleProvider(this);\n    this.discordProvider = new DiscordProvider(this);\n    this.walletProvider = new WalletProvider(this);\n\n    this._connectLitNodeClient();\n    this._registerEventListeners();\n  }\n\n  /**\n   * Create session signatures for a given authorized Eth Wallet\n   *\n   * @param {WalletAuthParams} params\n   * @param {AuthSig} params.authSig - Signature of authorized wallet\n   * @param {SessionParams} params.SessionParams - Parameters for creating session signatures\n   * @param {string} [params.pkpPublicKey] - Public key of PKP to use for creating session signatures\n   *\n   * @returns {Promise<SessionSigs>} - Session signatures\n   */\n  public async signInWithEthWallet(\n    params: WalletAuthParams\n  ): Promise<SessionSigs> {\n    try {\n      const sessionSigs = await this.walletProvider.createSession(params);\n      return sessionSigs;\n    } catch (err) {\n      return this._emitAndThrowError(err);\n    }\n  }\n\n  /**\n   * Redirect user to the given social login provider's authorization page\n   *\n   * @param {string} provider - Social login provider to use\n   */\n  public signInWithSocial(provider: string): void {\n    // Check if provider is supported\n    if (!isOAuthProviderSupported(provider)) {\n      return this._emitAndThrowError(\n        new Error(\n          `Invalid OAuth provider: ${provider}. Please ensure that the given provider is either 'google' and 'discord'.`\n        )\n      );\n    }\n    try {\n      // Get login url\n      const loginUrl = this._prepareLoginUrl(provider);\n      // Redirect to login url\n      window.location.assign(loginUrl);\n    } catch (err) {\n      return this._emitAndThrowError(err);\n    }\n  }\n\n  /**\n   * Create login url using the parameters provided as arguments when initializing the client\n   *\n   * @param {string} provider - Social login provider to use\n   *\n   * @returns {string} - Login url\n   */\n  private _prepareLoginUrl(provider: string): string {\n    const baseUrl = 'https://lit-login-server.herokuapp.com';\n    const loginUrl = `${baseUrl}${getLoginRoute(provider)}`;\n    const state = encode(setStateParam());\n    const authParams = {\n      app_redirect: this.redirectUri,\n    };\n    const queryAuthParams = createQueryParams(authParams);\n    return `${loginUrl}?${queryAuthParams}&state=${state}`;\n  }\n\n  /**\n   * Create session signatures for the given parameters returned from Lit's login server\n   *\n   * @param {HandleSignInRedirectParams} params\n   * @param {SessionParams} params.sessionParams - Parameters for creating session signatures\n   * @param {string} [params.pkpPublicKey] - Public key of PKP to use for creating session signatures\n   *\n   * @returns {Promise<SessionSigs>} - Session signatures\n   */\n  public async handleSignInRedirect(\n    params: HandleSignInRedirectParams\n  ): Promise<SessionSigs> {\n    // Check if current url matches redirect uri\n    if (!window.location.href.startsWith(this.redirectUri)) {\n      return this._emitAndThrowError(\n        new Error(\n          `Current url \"${window.location.href}\" does not match provided redirect uri \"${this.redirectUri}\"`\n        )\n      );\n    }\n\n    // Check url for params\n    const { provider, accessToken, idToken, state, error } = parseLoginParams(\n      window.document.location.search\n    );\n\n    // Check if there's an error\n    if (error) {\n      return this._emitAndThrowError(new Error(error));\n    }\n\n    // Check if provider exists and is supported\n    if (!provider || !isOAuthProviderSupported(provider)) {\n      return this._emitAndThrowError(\n        new Error(\n          `Invalid OAuth provider \"${provider}\" passed in redirect callback URL`\n        )\n      );\n    }\n\n    // Check if state param matches\n    if (!state || decode(decodeURIComponent(state)) !== getStateParam()) {\n      return this._emitAndThrowError(\n        new Error(\n          `Invalid state parameter \"${state}\" passed in redirect callback URL`\n        )\n      );\n    }\n    removeStateParam();\n\n    // Clear params from url\n    window.history.replaceState({}, document.title, this.redirectUri);\n\n    // Handle provider-specific logic\n    try {\n      switch (provider) {\n        case 'discord':\n          return await this._handleDiscordAuth(accessToken, params);\n        case 'google':\n          return await this._handleGoogleAuth(idToken, params);\n        default:\n          return this._emitAndThrowError(\n            new Error(\n              `Invalid OAuth provider \"${provider}\" passed in redirect callback URL`\n            )\n          );\n      }\n    } catch (err) {\n      return this._emitAndThrowError(err);\n    }\n  }\n\n  /**\n   * Handle Discord auth\n   *\n   * @param {string | null} accessToken - Discord access token\n   * @param {HandleSignInRedirectParams} params\n   * @param {SessionParams} params.sessionParams - Parameters for creating session signatures\n   * @param {string} [params.pkpPublicKey] - Public key of PKP to use for creating session signatures\n   *\n   * @returns {Promise<SessionSigs>} - Session signatures\n   */\n  private async _handleDiscordAuth(\n    accessToken: string | null,\n    params: HandleSignInRedirectParams\n  ): Promise<SessionSigs> {\n    if (!accessToken) {\n      return this._emitAndThrowError(new Error('Missing Discord access token'));\n    }\n\n    // Create session signatures\n    const sessionSigs = await this.discordProvider.createSession({\n      accessToken: accessToken,\n      sessionParams: params.sessionParams,\n      pkpPublicKey: params.pkpPublicKey,\n    });\n\n    return sessionSigs;\n  }\n\n  /**\n   * Handle Google auth\n   *\n   * @param {string | null} idToken - Google ID token\n   * @param {HandleSignInRedirectParams} params\n   * @param {SessionParams} params.sessionParams - Parameters for creating session signatures\n   * @param {string} [params.pkpPublicKey] - Public key of PKP to use for creating session signatures\n   *\n   * @returns {Promise<SessionSigs>} - Session signatures\n   */\n  private async _handleGoogleAuth(\n    idToken: string | null,\n    params: HandleSignInRedirectParams\n  ): Promise<SessionSigs> {\n    if (!idToken) {\n      return this._emitAndThrowError(new Error('Missing Google ID token'));\n    }\n\n    // Create session signatures\n    const sessionSigs = await this.googleProvider.createSession({\n      idToken: idToken,\n      sessionParams: params.sessionParams,\n      pkpPublicKey: params.pkpPublicKey,\n    });\n\n    return sessionSigs;\n  }\n\n  /**\n   * Check if current url is redirect uri to determine if app was redirected back from external login page\n   *\n   * @returns {boolean} - True if current url is redirect uri\n   */\n  public isSignInRedirect(): boolean {\n    // Check if current url matches redirect uri\n    const isRedirectUri = window.location.href.startsWith(this.redirectUri);\n    if (!isRedirectUri) {\n      return false;\n    }\n    // Check url for redirect params\n    const { provider, accessToken, idToken, state, error } = parseLoginParams(\n      window.document.location.search\n    );\n    // Check if current url is redirect uri and has redirect params\n    if (\n      isRedirectUri &&\n      (provider || accessToken || idToken || state || error)\n    ) {\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Clear session and redirect to given url if provided\n   *\n   * @param {SignOutOptions} options - Logout options\n   * @param {string} [params.redirectTo] - Url to redirect to after logout\n   */\n  public signOut(options: SignOutOptions = {}): void {\n    // Clear existing auth state\n    this.authState.clear();\n    // Remove auth sigs from local storage\n    try {\n      ethConnect.disconnectWeb3();\n    } catch {\n      // do nothing\n    }\n    this.events.emit(AUTH_CLIENT_EVENTS.SIGNED_OUT);\n    // Redirect to given url\n    if (options.redirectTo) {\n      window.location.assign(options.redirectTo);\n    }\n  }\n\n  /**\n   * Check if user has successfully authenticated through an external provider\n   *\n   * @returns {boolean} - True if user is authenticated\n   */\n  public isAuthenticated(): boolean {\n    return this.authState.getIsAuthenticated();\n  }\n\n  /**\n   * Check if session signatures exist and if they are still valid. If they have expired, sign out and return null.\n   *\n   * @returns {SessionSigs} - Session signatures\n   */\n  public checkSession(): SessionSigs | null {\n    const sessionExpiration = this.authState.getSessionExpiration();\n    if (sessionExpiration) {\n      const now = new Date();\n      const expiration = new Date(sessionExpiration);\n      if (now < expiration) {\n        // Session signatures are still valid\n        return this.authState.getSessionSigs();\n      } else {\n        // Session signatures have expired so sign out\n        this.signOut();\n        return null;\n      }\n    } else {\n      return null;\n    }\n  }\n\n  /**\n   * Get information about the authenticated user\n   *\n   * @returns {AuthState} - Authenticated user info\n   */\n  public getAuthState(): AuthState {\n    return this.authState.getAuthState();\n  }\n\n  /**\n   * Fetch PKPs associated with given auth method type and credential\n   *\n   * @param {FetchPKPByAuthMethodParams} params - Parameters for fetching PKPs\n   * @param {AuthMethodType} params.authMethodType - Auth method enum\n   * @param {string} [params.accessToken] - Access token\n   * @param {string} [params.idToken] - ID token\n   * @param {string} [params.authSig] - Wallet signature\n   */\n  public async fetchPKPsByAuthMethod(\n    params: FetchPKPByAuthMethodParams\n  ): Promise<PKP[]> {\n    switch (params.authMethodType) {\n      case AuthMethodType.Discord:\n        if (!params.accessToken) {\n          return this._emitAndThrowError(\n            new Error('Missing Discord access token for fetching PKPs')\n          );\n        }\n        try {\n          const pkps = await this.discordProvider.fetchPKPs(params.accessToken);\n          return pkps;\n        } catch (err) {\n          return this._emitAndThrowError(err);\n        }\n      case AuthMethodType.Google:\n        if (!params.idToken) {\n          return this._emitAndThrowError(\n            new Error('Missing Google ID token for fetching PKPs')\n          );\n        }\n        try {\n          const pkps = await this.googleProvider.fetchPKPs(params.idToken);\n          return pkps;\n        } catch (err) {\n          return this._emitAndThrowError(err);\n        }\n      case AuthMethodType.EthWallet:\n        if (!params.authSig) {\n          return this._emitAndThrowError(\n            new Error('Missing wallet signature for fetching PKPs')\n          );\n        }\n        try {\n          const pkps = await this.walletProvider.fetchPKPs(params.authSig);\n          return pkps;\n        } catch (err) {\n          return this._emitAndThrowError(err);\n        }\n      default:\n        return this._emitAndThrowError(\n          new Error('Invalid auth method type: ' + params.authMethodType)\n        );\n    }\n  }\n\n  /**\n   * Emit error event and throw error\n   *\n   * @param error - Error to emit and throw\n   */\n  private _emitAndThrowError(error: unknown): never {\n    this.events.emit(AUTH_CLIENT_EVENTS.ERROR, error);\n    throw error;\n  }\n\n  /**\n   * Connect to LitNode client\n   */\n  private async _connectLitNodeClient(): Promise<void> {\n    if (!this.litNodeClient.ready) {\n      await this.litNodeClient.connect();\n    }\n  }\n\n  // --- Event listener methods ---\n  /**\n   * Register an event listener that will be invoked every time the named event is emitted\n   *\n   * @param {string} event - Event name\n   * @param {Function} listener - Callback function\n   *\n   * @returns {EventEmitter} - EventEmitter instance\n   */\n  public on(event: string, listener: any): EventEmitter {\n    return this.events.on(event, listener);\n  }\n\n  /**\n   * Register a listener that is called at most once for a particular event\n   *\n   * @param {string} event - Event name\n   * @param {Function} listener - Callback function\n   *\n   * @returns {EventEmitter} - EventEmitter instance\n   */\n  public once(event: string, listener: any): EventEmitter {\n    return this.events.once(event, listener);\n  }\n\n  /**\n   * Removes an instance of the specified listener from the listener array for the event\n   *\n   * @param {string} event - Event name\n   * @param {Function} listener - Callback function\n   *\n   * @returns {EventEmitter} - EventEmitter instance\n   */\n  public off(event: string, listener: any): EventEmitter {\n    return this.events.off(event, listener);\n  }\n\n  /**\n   * Removes all listeners, or those of the specified event\n   *\n   * @param {string }event - Event name\n   *\n   * @returns {EventEmitter} - EventEmitter instance\n   */\n  public removeAllListeners(event?: string): EventEmitter {\n    return this.events.removeAllListeners(event);\n  }\n\n  /**\n   * Subscribe to relayer events\n   */\n  private _registerEventListeners(): void {\n    // Pass auth method name\n    this.relayer.on(AUTH_CLIENT_EVENTS.MINTING, (data: { body: string }) => {\n      this.events.emit(AUTH_CLIENT_EVENTS.MINTING, data);\n    });\n\n    // Pass transaction hash\n    this.relayer.on(AUTH_CLIENT_EVENTS.POLLING, (data: RelayPollingEvent) => {\n      this.events.emit(AUTH_CLIENT_EVENTS.POLLING, data);\n    });\n\n    // Pass minted PKP data\n    this.relayer.on(\n      AUTH_CLIENT_EVENTS.MINTED,\n      (data: RelayPollStatusResponse) => {\n        this.events.emit(AUTH_CLIENT_EVENTS.MINTED, data);\n      }\n    );\n\n    // Pass error\n    this.relayer.on(AUTH_CLIENT_EVENTS.ERROR, (err: unknown) => {\n      this.events.emit(AUTH_CLIENT_EVENTS.ERROR, err);\n    });\n  }\n}\n"]}