1import { base } from '$app/paths';
2import { error } from '@sveltejs/kit';
3import { browser } from '$app/environment';
4import { config } from '$lib/stores/settings.svelte';
5
6/**
7 * Validates API key by making a request to the server props endpoint
8 * Throws SvelteKit errors for authentication failures or server issues
9 */
10export async function validateApiKey(fetch: typeof globalThis.fetch): Promise<void> {
11 if (!browser) {
12 return;
13 }
14
15 try {
16 const apiKey = config().apiKey;
17
18 const headers: Record<string, string> = {
19 'Content-Type': 'application/json'
20 };
21
22 if (apiKey) {
23 headers.Authorization = `Bearer ${apiKey}`;
24 }
25
26 const response = await fetch(`${base}/props`, { headers });
27
28 if (!response.ok) {
29 if (response.status === 401 || response.status === 403) {
30 throw error(401, 'Access denied');
31 }
32
33 console.warn(`Server responded with status ${response.status} during API key validation`);
34 return;
35 }
36 } catch (err) {
37 // If it's already a SvelteKit error, re-throw it
38 if (err && typeof err === 'object' && 'status' in err) {
39 throw err;
40 }
41
42 // Network or other errors
43 console.warn('Cannot connect to server for API key validation:', err);
44 }
45}