import { authResultSchema, userSchema, publicUserSchema, sessionListSchema, centrifugoTokenSchema, } from '../schemas/index'; import type { RegisterBody, LoginBody, UpdateMeBody } from '../schemas/index'; import type { AuthResult, CentrifugoToken, Session, User, PublicUser } from '../types/index'; import { compileValidator, parse, requestJson } from './http'; import type { ApiClientConfig } from './http'; const authResultV = compileValidator(authResultSchema); const userV = compileValidator(userSchema); const publicUserV = compileValidator(publicUserSchema); const sessionsV = compileValidator(sessionListSchema); const centrifugoTokenV = compileValidator(centrifugoTokenSchema); export const register = async (config: ApiClientConfig, body: RegisterBody): Promise => parse(authResultV, await requestJson(config, 'POST', '/auth/register', body)); export const login = async (config: ApiClientConfig, body: LoginBody): Promise => parse(authResultV, await requestJson(config, 'POST', '/auth/login', body)); // Uses the httpOnly refresh cookie — no body. export const refresh = async (config: ApiClientConfig): Promise => parse(authResultV, await requestJson(config, 'POST', '/auth/refresh')); export const logout = async (config: ApiClientConfig): Promise => { await requestJson(config, 'POST', '/auth/logout'); }; export const logoutAll = async (config: ApiClientConfig): Promise => { await requestJson(config, 'POST', '/auth/logout-all'); }; export const getMe = async (config: ApiClientConfig): Promise => parse(userV, await requestJson(config, 'GET', '/me')); export const updateMe = async (config: ApiClientConfig, body: UpdateMeBody): Promise => parse(userV, await requestJson(config, 'PATCH', '/me', body)); export const getPublicProfile = async ( config: ApiClientConfig, username: string, ): Promise => parse(publicUserV, await requestJson(config, 'GET', `/users/${encodeURIComponent(username)}`)); export const listSessions = async (config: ApiClientConfig): Promise => parse(sessionsV, await requestJson(config, 'GET', '/auth/sessions')); export const getCentrifugoToken = async (config: ApiClientConfig): Promise => parse(centrifugoTokenV, await requestJson(config, 'POST', '/auth/centrifugo-token'));