import type { Message, MessageResponse } from "./types"; const MESSAGE_TIMEOUT_MS = 5000; function humanizeError(error: string | undefined): string | undefined { if (!error) return error; if (error === "STORAGE_QUOTA_EXCEEDED") { return "Peach has run out of browser storage. Delete some entries or clear browser storage to continue."; } return error; } export async function sendMessage(message: Message): Promise { return new Promise((resolve) => { let settled = false; const timeoutId = window.setTimeout(() => { if (settled) return; settled = true; resolve({ ok: false, error: "SERVICE_WORKER_UNAVAILABLE" }); }, MESSAGE_TIMEOUT_MS); try { chrome.runtime.sendMessage(message, (response: MessageResponse | undefined) => { if (settled) return; settled = true; window.clearTimeout(timeoutId); if (chrome.runtime.lastError) { resolve({ ok: false, error: chrome.runtime.lastError.message ?? "SERVICE_WORKER_UNAVAILABLE", }); return; } if (response === undefined) { resolve({ ok: false, error: "SERVICE_WORKER_UNAVAILABLE" }); return; } if (response.ok === false) { response.error = humanizeError(response.error); } resolve(response); }); } catch (error) { if (settled) return; settled = true; window.clearTimeout(timeoutId); resolve({ ok: false, error: error instanceof Error ? error.message : "SERVICE_WORKER_UNAVAILABLE", }); } }); }