1import { Capacitor } from "@capacitor/core";2import type { Message, MessageResponse } from "./types";34const MESSAGE_TIMEOUT_MS = 5000;56function humanizeError(error: string | undefined): string | undefined {7 if (!error) return error;8 if (error === "STORAGE_QUOTA_EXCEEDED") {9 return "Peach has run out of browser storage. Delete some entries or clear browser storage to continue.";10 }11 return error;12}1314async function sendExtensionMessage(message: Message): Promise<MessageResponse> {15 return new Promise((resolve) => {16 let settled = false;17 const timeoutId = window.setTimeout(() => {18 if (settled) return;19 settled = true;20 resolve({ ok: false, error: "SERVICE_WORKER_UNAVAILABLE" });21 }, MESSAGE_TIMEOUT_MS);2223 try {24 chrome.runtime.sendMessage(message, (response: MessageResponse | undefined) => {25 if (settled) return;26 settled = true;27 window.clearTimeout(timeoutId);2829 if (chrome.runtime.lastError) {30 resolve({31 ok: false,32 error: chrome.runtime.lastError.message ?? "SERVICE_WORKER_UNAVAILABLE",33 });34 return;35 }3637 if (response === undefined) {38 resolve({ ok: false, error: "SERVICE_WORKER_UNAVAILABLE" });39 return;40 }4142 if (response.ok === false) {43 response.error = humanizeError(response.error);44 }45 resolve(response);46 });47 } catch (error) {48 if (settled) return;49 settled = true;50 window.clearTimeout(timeoutId);51 resolve({52 ok: false,53 error: error instanceof Error ? error.message : "SERVICE_WORKER_UNAVAILABLE",54 });55 }56 });57}5859export async function sendMessage(message: Message): Promise<MessageResponse> {60 if (!Capacitor.isNativePlatform()) {61 return sendExtensionMessage(message);62 }6364 const { handleMessage } = await import("../background/messages");65 const response = await handleMessage(message, {});66 if (response.ok === false) {67 response.error = humanizeError(response.error);68 }69 return response;70}