// packages/api-client/src/auth.ts // Supabase Auth 래퍼. OAuth, session, 로그아웃. import type { Session, User, Provider } from '@supabase/supabase-js' import type { D3roSupabaseClient } from './client' export type { Session, User } export interface SignInOptions { provider: Extract redirectTo: string } export async function signInWithOAuth( client: D3roSupabaseClient, options: SignInOptions ): Promise<{ url: string | null; error: string | null }> { const { data, error } = await client.auth.signInWithOAuth({ provider: options.provider, options: { redirectTo: options.redirectTo } }) return { url: data?.url ?? null, error: error?.message ?? null } } export async function signOut(client: D3roSupabaseClient): Promise<{ error: string | null }> { const { error } = await client.auth.signOut() return { error: error?.message ?? null } } export async function getSession(client: D3roSupabaseClient): Promise { const { data } = await client.auth.getSession() return data.session ?? null } export async function getUser(client: D3roSupabaseClient): Promise { const { data } = await client.auth.getUser() return data.user ?? null } /** * 세션 변경 구독. 반환된 함수를 호출하면 구독 해제. */ export function onAuthStateChange( client: D3roSupabaseClient, callback: (session: Session | null) => void ): () => void { const { data } = client.auth.onAuthStateChange((_event, session) => { callback(session) }) return () => { data.subscription.unsubscribe() } }