bridge.ts

1.6 KB · raw

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}