Fetching
Buat satu wrapper per aplikasi agar header, request id, parsing response, dan error envelope konsisten.
const response = await fetch(new URL(path, API_URL), {
...init,
headers: { Accept: 'application/json', 'Content-Type': 'application/json', ...headers },
body: body === undefined ? undefined : JSON.stringify(body)
});
const data = await response.json();
if (!response.ok) throw new Error(data?.error?.message ?? 'Request failed');
return data;Gunakan cache: 'no-store' untuk data user-sensitive dan lakukan invalidation setelah mutation. Jangan menaruh auth secret di client bundle.
Auth-aware fetching
Browser web sebaiknya memakai Better Auth client dari @repo/auth/client. Server runtime dapat membaca session dari API authority:
import { headers } from 'next/headers';
import { getAoriSessionFromHeaders } from '@repo/auth/server';
const session = await getAoriSessionFromHeaders(await headers(), process.env);Jika NEXT_PUBLIC_AUTH_SAME_ORIGIN=true, request auth dari browser menuju /api/auth/* pada origin aplikasi, lalu direwrite ke apps/api. Route data biasa tetap diarahkan ke NEXT_PUBLIC_API_URL.