/**
 * background.js - Service Worker
 *
 * 职责：中转 content script 的 fetch 请求。
 * Content script 运行在页面上下文中，受页面 CSP 约束，无法直接请求外部 HTTP 地址。
 * Background service worker 不受页面 CSP 限制，可以自由发起网络请求。
 */

chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
  if (message.type === 'FETCH_REQUEST') {
    _handleFetch(message.payload).then(sendResponse).catch((err) => {
      sendResponse({ ok: false, status: 0, data: null, error: err.message });
    });
    // 返回 true 表示异步响应
    return true;
  }
});

async function _handleFetch({ url, method, headers, body }) {
  let response;
  try {
    response = await fetch(url, {
      method: method || 'POST',
      headers: headers || {},
      body: body ? JSON.stringify(body) : undefined,
    });
  } catch (e) {
    return { ok: false, status: 0, data: null, error: e.message };
  }

  let data = null;
  try {
    data = await response.json();
  } catch (e) {
    // 响应体不是 JSON
    data = null;
  }

  return {
    ok: response.ok,
    status: response.status,
    retryAfter: response.headers.get('Retry-After'),
    data,
    error: null,
  };
}
