import type { ZyphrClient } from '@zyphr-dev/node-sdk'; import { type AuthTransport, type LoginParams, type SessionTokens, toSessionTokens } from '@zyphr-dev/auth-core'; /** * An {@link AuthTransport} implemented over the client-safe `ZyphrClient` * (publishable application key — no secret). This is what lets the React binding * drive the auth-core session engine against Zyphr's `/auth/*` endpoints. * * `now` is injectable for tests; production uses `Date.now`. */ export function createZyphrTransport(client: ZyphrClient, now: () => number = Date.now): AuthTransport { const extract = (tokens?: { accessToken?: string; refreshToken?: string; expiresIn?: number }): SessionTokens => toSessionTokens( { accessToken: tokens?.accessToken, refreshToken: tokens?.refreshToken, expiresIn: tokens?.expiresIn, }, now(), ); return { async login({ email, password }: LoginParams): Promise { const res = await client.auth.login.loginEndUser({ email, password }); return extract(res.data?.tokens); }, async refresh(refreshToken: string): Promise { const res = await client.auth.sessions.refreshEndUserToken({ refreshToken }); return extract(res.data?.tokens); }, async logout(refreshToken: string): Promise { await client.auth.sessions.revokeEndUserSession({ refreshToken }); }, }; }