f4348bcb创建于 7月9日历史提交
import { log, error } from './logger';

interface TokenResponse {
  user?: string;
  token?: string;
}

let user: string | undefined;
let token: string | undefined;
let baseURL: string | undefined;

export async function getToken(): Promise<{ user: string | undefined; token: string | undefined }> {
  if (token === undefined || user === undefined) {
    const res = await fetch(`${window.subpath}/token`);
    if (res.ok) {
      const data = (await res.json()) as TokenResponse;
      user = data.user;
      token = data.token;
      log('getToken', user);
    }
  }
  return { user, token };
}

export async function authFetch(url: RequestInfo | URL, options: RequestInit = {}): Promise<Response | undefined> {
  await getToken();
  if (user && token) {
    const encoded = btoa(`${user}:${token}`);
    const headers = new Headers(options.headers);
    headers.set('Authorization', `Basic ${encoded}`);
    options.headers = headers;
  }
  let res: Response | undefined;
  try {
    res = await fetch(url, options);
    if (!res.ok) error('fetch', { status: res?.status || 503, url, user, token });
  } catch (err) {
    if (navigator.onLine) {
      error('fetch', { status: res?.status || 503, url, user, token, error: err });
    }
  }
  if (!baseURL) {
    // baseURL = `${window.location.protocol}//${window.location.host}:${window.location.port}`;
    baseURL = window.location.origin;
    log('origin', baseURL);
  }
  return res;
}
window.authFetch = authFetch;