bridge.ts

2.0 KB · raw

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}