41 lines
1.2 KiB
TypeScript
41 lines
1.2 KiB
TypeScript
export const getApiBase = () => process.env.NEXT_PUBLIC_API_BASE ?? '/api'
|
|
|
|
export const getToken = () => {
|
|
if (typeof window === 'undefined') return null
|
|
return window.localStorage.getItem('magent_token')
|
|
}
|
|
|
|
export const setToken = (token: string) => {
|
|
if (typeof window === 'undefined') return
|
|
window.localStorage.setItem('magent_token', token)
|
|
}
|
|
|
|
export const clearToken = () => {
|
|
if (typeof window === 'undefined') return
|
|
window.localStorage.removeItem('magent_token')
|
|
}
|
|
|
|
export const authFetch = (input: RequestInfo | URL, init?: RequestInit) => {
|
|
const token = getToken()
|
|
const headers = new Headers(init?.headers || {})
|
|
if (token) {
|
|
headers.set('Authorization', `Bearer ${token}`)
|
|
}
|
|
return fetch(input, { ...init, headers })
|
|
}
|
|
|
|
export const getEventStreamToken = async () => {
|
|
const baseUrl = getApiBase()
|
|
const response = await authFetch(`${baseUrl}/auth/stream-token`)
|
|
if (!response.ok) {
|
|
const text = await response.text()
|
|
throw new Error(text || `Stream token request failed: ${response.status}`)
|
|
}
|
|
const data = await response.json()
|
|
const token = typeof data?.stream_token === 'string' ? data.stream_token : ''
|
|
if (!token) {
|
|
throw new Error('Stream token not returned')
|
|
}
|
|
return token
|
|
}
|