export function isMissingReceiverError(error: unknown): boolean {
  const message = error instanceof Error ? error.message : String(error);
  return /receiving end does not exist|could not establish connection/i.test(message);
}

export async function withContentReceiverReady<T>(
  operation: (remainingMs: number) => Promise<T>,
  timeoutMs: number,
  wait: (ms: number) => Promise<void> = (ms) => new Promise((resolve) => setTimeout(resolve, ms)),
): Promise<T> {
  const deadline = Date.now() + Math.max(1, timeoutMs);
  let delayMs = 50;
  for (;;) {
    const remainingMs = Math.max(1, deadline - Date.now());
    try {
      return await operation(remainingMs);
    } catch (error) {
      if (!isMissingReceiverError(error) || Date.now() >= deadline) throw error;
      await wait(Math.min(delayMs, Math.max(1, deadline - Date.now())));
      delayMs = Math.min(delayMs * 2, 500);
    }
  }
}
