{"version":3,"sources":["../src/index.ts","../src/provider.tsx","../src/transport.ts","../src/storage.ts"],"sourcesContent":["/**\n * @zyphr-dev/auth-react\n *\n * React bindings for Zyphr auth. Wrap your app in <ZyphrAuthProvider> and read\n * the session with useSession() / act with useAuth(). Built on\n * @zyphr-dev/auth-core (session state + proactive refresh) and the client-safe\n * ZyphrClient (publishable key).\n */\n\nexport { ZyphrAuthProvider, useSession, useAuth } from './provider.js';\nexport type { ZyphrAuthProviderProps, UseAuthResult } from './provider.js';\n\nexport { createZyphrTransport } from './transport.js';\nexport { createWebStorage } from './storage.js';\n\n// Re-export the core session types consumers commonly need.\nexport type { SessionState, SessionStatus, LoginParams, TokenStorage } from '@zyphr-dev/auth-core';\n","import {\n  createContext,\n  useContext,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n  useSyncExternalStore,\n  type ReactElement,\n  type ReactNode,\n} from 'react';\nimport type { ZyphrClient } from '@zyphr-dev/node-sdk';\nimport {\n  SessionManager,\n  type LoginParams,\n  type SessionState,\n  type TokenStorage,\n} from '@zyphr-dev/auth-core';\nimport { createZyphrTransport } from './transport.js';\nimport { createWebStorage } from './storage.js';\n\nexport interface ZyphrAuthProviderProps {\n  /** A client-safe ZyphrClient (constructed with your publishable application key). */\n  client: ZyphrClient;\n  /** Override token storage. Defaults to localStorage (with an in-memory fallback). */\n  storage?: TokenStorage;\n  /**\n   * Namespace the storage key so multiple providers can share one storage\n   * adapter without colliding (e.g. one session per account). The effective key\n   * becomes `${keyPrefix}zyphr.session`. Default `''`.\n   */\n  keyPrefix?: string;\n  /** Refresh this many ms before the access token expires. Default 60_000 (from auth-core). */\n  refreshSkewMs?: number;\n  children: ReactNode;\n}\n\ninterface ZyphrAuthContextValue {\n  manager: SessionManager;\n}\n\nconst ZyphrAuthContext = createContext<ZyphrAuthContextValue | null>(null);\n\n/**\n * Provides a reactive Zyphr auth session to the React tree. Constructs a single\n * {@link SessionManager} (from `@zyphr-dev/auth-core`) driven by the given\n * ZyphrClient, initializes it (adopting any persisted session), and cleans up on\n * unmount. Read state with {@link useSession}; act with {@link useAuth}.\n */\nexport function ZyphrAuthProvider({\n  client,\n  storage,\n  keyPrefix,\n  refreshSkewMs,\n  children,\n}: ZyphrAuthProviderProps): ReactElement {\n  // One manager for the lifetime of the provider. Recreated only if the client\n  // identity changes (rare — normally a stable singleton).\n  const [manager] = useState(\n    () =>\n      new SessionManager({\n        transport: createZyphrTransport(client),\n        storage: storage ?? createWebStorage(),\n        keyPrefix,\n        refreshSkewMs,\n      }),\n  );\n\n  const initialized = useRef(false);\n  useEffect(() => {\n    if (!initialized.current) {\n      initialized.current = true;\n      void manager.initialize();\n    }\n    return () => {\n      manager.destroy();\n    };\n  }, [manager]);\n\n  const value = useMemo(() => ({ manager }), [manager]);\n  return <ZyphrAuthContext.Provider value={value}>{children}</ZyphrAuthContext.Provider>;\n}\n\nfunction useManager(): SessionManager {\n  const ctx = useContext(ZyphrAuthContext);\n  if (!ctx) {\n    throw new Error('useSession/useAuth must be used within a <ZyphrAuthProvider>.');\n  }\n  return ctx.manager;\n}\n\n/**\n * Reactive session state — re-renders on every session change (login, logout,\n * refresh). Returns `{ status, accessToken, isAuthenticated }`.\n */\nexport function useSession(): SessionState {\n  const manager = useManager();\n  return useSyncExternalStore(\n    (onChange) => manager.subscribe(() => onChange()),\n    () => manager.getState(),\n    () => manager.getState(),\n  );\n}\n\nexport interface UseAuthResult {\n  login: (params: LoginParams) => Promise<void>;\n  logout: () => Promise<void>;\n  refresh: () => Promise<void>;\n}\n\n/** Auth actions bound to the provider's session manager. */\nexport function useAuth(): UseAuthResult {\n  const manager = useManager();\n  return useMemo(\n    () => ({\n      login: (params) => manager.login(params),\n      logout: () => manager.logout(),\n      refresh: () => manager.refresh(),\n    }),\n    [manager],\n  );\n}\n","import type { ZyphrClient } from '@zyphr-dev/node-sdk';\nimport { type AuthTransport, type LoginParams, type SessionTokens, toSessionTokens } from '@zyphr-dev/auth-core';\n\n/**\n * An {@link AuthTransport} implemented over the client-safe `ZyphrClient`\n * (publishable application key — no secret). This is what lets the React binding\n * drive the auth-core session engine against Zyphr's `/auth/*` endpoints.\n *\n * `now` is injectable for tests; production uses `Date.now`.\n */\nexport function createZyphrTransport(client: ZyphrClient, now: () => number = Date.now): AuthTransport {\n  const extract = (tokens?: { accessToken?: string; refreshToken?: string; expiresIn?: number }): SessionTokens =>\n    toSessionTokens(\n      {\n        accessToken: tokens?.accessToken,\n        refreshToken: tokens?.refreshToken,\n        expiresIn: tokens?.expiresIn,\n      },\n      now(),\n    );\n\n  return {\n    async login({ email, password }: LoginParams): Promise<SessionTokens> {\n      const res = await client.auth.login.loginEndUser({ email, password });\n      return extract(res.data?.tokens);\n    },\n    async refresh(refreshToken: string): Promise<SessionTokens> {\n      const res = await client.auth.sessions.refreshEndUserToken({ refreshToken });\n      return extract(res.data?.tokens);\n    },\n    async logout(refreshToken: string): Promise<void> {\n      await client.auth.sessions.revokeEndUserSession({ refreshToken });\n    },\n  };\n}\n","import { MemoryTokenStorage, type TokenStorage } from '@zyphr-dev/auth-core';\n\n/**\n * Web token storage backed by `localStorage`, with a graceful in-memory fallback\n * when `localStorage` is unavailable (SSR, privacy modes, disabled storage).\n *\n * Note on security: `localStorage` is readable by any JS on the page, so it is\n * vulnerable to XSS token theft. For the strongest posture, proxy auth through\n * your own backend and keep the refresh token in an httpOnly cookie; use this\n * adapter for SPAs where that's not feasible, and pass a custom TokenStorage via\n * `ZyphrAuthProvider` if you have a better store.\n */\nexport function createWebStorage(): TokenStorage {\n  const canUseLocalStorage = (() => {\n    try {\n      if (typeof globalThis === 'undefined') return false;\n      const ls = (globalThis as { localStorage?: Storage }).localStorage;\n      if (!ls) return false;\n      const probe = '__zyphr_probe__';\n      ls.setItem(probe, '1');\n      ls.removeItem(probe);\n      return true;\n    } catch {\n      return false;\n    }\n  })();\n\n  if (!canUseLocalStorage) {\n    return new MemoryTokenStorage();\n  }\n\n  const ls = (globalThis as unknown as { localStorage: Storage }).localStorage;\n  return {\n    getItem: (key) => ls.getItem(key),\n    setItem: (key, value) => ls.setItem(key, value),\n    removeItem: (key) => ls.removeItem(key),\n  };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAUO;AAEP,IAAAA,oBAKO;;;AChBP,uBAA0F;AASnF,SAAS,qBAAqB,QAAqB,MAAoB,KAAK,KAAoB;AACrG,QAAM,UAAU,CAAC,eACf;AAAA,IACE;AAAA,MACE,aAAa,QAAQ;AAAA,MACrB,cAAc,QAAQ;AAAA,MACtB,WAAW,QAAQ;AAAA,IACrB;AAAA,IACA,IAAI;AAAA,EACN;AAEF,SAAO;AAAA,IACL,MAAM,MAAM,EAAE,OAAO,SAAS,GAAwC;AACpE,YAAM,MAAM,MAAM,OAAO,KAAK,MAAM,aAAa,EAAE,OAAO,SAAS,CAAC;AACpE,aAAO,QAAQ,IAAI,MAAM,MAAM;AAAA,IACjC;AAAA,IACA,MAAM,QAAQ,cAA8C;AAC1D,YAAM,MAAM,MAAM,OAAO,KAAK,SAAS,oBAAoB,EAAE,aAAa,CAAC;AAC3E,aAAO,QAAQ,IAAI,MAAM,MAAM;AAAA,IACjC;AAAA,IACA,MAAM,OAAO,cAAqC;AAChD,YAAM,OAAO,KAAK,SAAS,qBAAqB,EAAE,aAAa,CAAC;AAAA,IAClE;AAAA,EACF;AACF;;;AClCA,IAAAC,oBAAsD;AAY/C,SAAS,mBAAiC;AAC/C,QAAM,sBAAsB,MAAM;AAChC,QAAI;AACF,UAAI,OAAO,eAAe,YAAa,QAAO;AAC9C,YAAMC,MAAM,WAA0C;AACtD,UAAI,CAACA,IAAI,QAAO;AAChB,YAAM,QAAQ;AACd,MAAAA,IAAG,QAAQ,OAAO,GAAG;AACrB,MAAAA,IAAG,WAAW,KAAK;AACnB,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,GAAG;AAEH,MAAI,CAAC,oBAAoB;AACvB,WAAO,IAAI,qCAAmB;AAAA,EAChC;AAEA,QAAM,KAAM,WAAoD;AAChE,SAAO;AAAA,IACL,SAAS,CAAC,QAAQ,GAAG,QAAQ,GAAG;AAAA,IAChC,SAAS,CAAC,KAAK,UAAU,GAAG,QAAQ,KAAK,KAAK;AAAA,IAC9C,YAAY,CAAC,QAAQ,GAAG,WAAW,GAAG;AAAA,EACxC;AACF;;;AF2CS;AAvCT,IAAM,uBAAmB,4BAA4C,IAAI;AAQlE,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AAGvC,QAAM,CAAC,OAAO,QAAI;AAAA,IAChB,MACE,IAAI,iCAAe;AAAA,MACjB,WAAW,qBAAqB,MAAM;AAAA,MACtC,SAAS,WAAW,iBAAiB;AAAA,MACrC;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACL;AAEA,QAAM,kBAAc,qBAAO,KAAK;AAChC,8BAAU,MAAM;AACd,QAAI,CAAC,YAAY,SAAS;AACxB,kBAAY,UAAU;AACtB,WAAK,QAAQ,WAAW;AAAA,IAC1B;AACA,WAAO,MAAM;AACX,cAAQ,QAAQ;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,YAAQ,sBAAQ,OAAO,EAAE,QAAQ,IAAI,CAAC,OAAO,CAAC;AACpD,SAAO,4CAAC,iBAAiB,UAAjB,EAA0B,OAAe,UAAS;AAC5D;AAEA,SAAS,aAA6B;AACpC,QAAM,UAAM,yBAAW,gBAAgB;AACvC,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,+DAA+D;AAAA,EACjF;AACA,SAAO,IAAI;AACb;AAMO,SAAS,aAA2B;AACzC,QAAM,UAAU,WAAW;AAC3B,aAAO;AAAA,IACL,CAAC,aAAa,QAAQ,UAAU,MAAM,SAAS,CAAC;AAAA,IAChD,MAAM,QAAQ,SAAS;AAAA,IACvB,MAAM,QAAQ,SAAS;AAAA,EACzB;AACF;AASO,SAAS,UAAyB;AACvC,QAAM,UAAU,WAAW;AAC3B,aAAO;AAAA,IACL,OAAO;AAAA,MACL,OAAO,CAAC,WAAW,QAAQ,MAAM,MAAM;AAAA,MACvC,QAAQ,MAAM,QAAQ,OAAO;AAAA,MAC7B,SAAS,MAAM,QAAQ,QAAQ;AAAA,IACjC;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AACF;","names":["import_auth_core","import_auth_core","ls"]}