1import type { Message, MessageResponse } from "./types";23const MESSAGE_TIMEOUT_MS = 5000;45function humanizeError(error: string | undefined): string | undefined {6 if (!error) return error;7 if (error === "STORAGE_QUOTA_EXCEEDED") {8 return "Peach has run out of browser storage. Delete some entries or clear browser storage to continue.";9 }10 return error;11}1213export async function sendMessage(message: Message): Promise<MessageResponse> {14 return new Promise((resolve) => {15 let settled = false;16 const timeoutId = window.setTimeout(() => {17 if (settled) return;18 settled = true;19 resolve({ ok: false, error: "SERVICE_WORKER_UNAVAILABLE" });20 }, MESSAGE_TIMEOUT_MS);2122 try {23 chrome.runtime.sendMessage(message, (response: MessageResponse | undefined) => {24 if (settled) return;25 settled = true;26 window.clearTimeout(timeoutId);2728 if (chrome.runtime.lastError) {29 resolve({30 ok: false,31 error: chrome.runtime.lastError.message ?? "SERVICE_WORKER_UNAVAILABLE",32 });33 return;34 }3536 if (response === undefined) {37 resolve({ ok: false, error: "SERVICE_WORKER_UNAVAILABLE" });38 return;39 }4041 if (response.ok === false) {42 response.error = humanizeError(response.error);43 }44 resolve(response);45 });46 } catch (error) {47 if (settled) return;48 settled = true;49 window.clearTimeout(timeoutId);50 resolve({51 ok: false,52 error: error instanceof Error ? error.message : "SERVICE_WORKER_UNAVAILABLE",53 });54 }55 });56}