const TEXLIVE_SERVICE_WORKER_URL = '/learnitive-texlive-sw.js';

/**
 * The Swift worker inherits service-worker control when it is created, so
 * package resolution must be ready before the compiler worker starts.
 */
export async function ensureTexliveServiceWorker(
  timeoutMs = 4_000,
): Promise<boolean> {
  if (typeof navigator === 'undefined' || !('serviceWorker' in navigator)) {
    return false;
  }

  try {
    await navigator.serviceWorker.register(TEXLIVE_SERVICE_WORKER_URL, {
      scope: '/',
      updateViaCache: 'none',
    });
    if (navigator.serviceWorker.controller) {
      return true;
    }

    const registration = await Promise.race([
      navigator.serviceWorker.ready,
      new Promise<undefined>((resolve) =>
        setTimeout(() => resolve(undefined), timeoutMs),
      ),
    ]);
    if (!registration) {
      return false;
    }
    if (navigator.serviceWorker.controller) {
      return true;
    }

    registration.active?.postMessage({ type: 'claim' });
    await Promise.race([
      new Promise<void>((resolve) =>
        navigator.serviceWorker.addEventListener(
          'controllerchange',
          () => resolve(),
          { once: true },
        ),
      ),
      new Promise<void>((resolve) => setTimeout(resolve, timeoutMs)),
    ]);
    return Boolean(navigator.serviceWorker.controller);
  } catch {
    return false;
  }
}
