From 5aceec38b024fc59fbd64c1443ea650f07520a64 Mon Sep 17 00:00:00 2001 From: alina sireneva Date: Sat, 18 Jan 2025 05:50:20 +0300 Subject: [PATCH] fix: sw init fix --- packages/worker/src/sw/client.ts | 8 +++++--- packages/worker/src/sw/main.ts | 8 ++++++++ packages/worker/src/sw/register.ts | 12 ++++++++++++ packages/worker/src/worker/telegram.ts | 2 ++ 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/packages/worker/src/sw/client.ts b/packages/worker/src/sw/client.ts index 96e29b9..d5d7879 100644 --- a/packages/worker/src/sw/client.ts +++ b/packages/worker/src/sw/client.ts @@ -1,7 +1,9 @@ import type { SwMessage } from './main.ts' import { asNonNull, Deferred } from '@fuman/utils' +import { waitForServiceWorkerInit } from './register.ts' -export function getServiceWorker() { +export async function getServiceWorker() { + await waitForServiceWorkerInit() return asNonNull(navigator.serviceWorker.controller) } @@ -9,8 +11,8 @@ let registered = false let nextId = 0 const pending = new Map>() -export function swInvokeMethod(request: SwMessage) { - const sw = getServiceWorker() +export async function swInvokeMethod(request: SwMessage) { + const sw = await getServiceWorker() if (!registered) { navigator.serviceWorker.addEventListener('message', (e) => { const { id, result, error } = (e as MessageEvent).data diff --git a/packages/worker/src/sw/main.ts b/packages/worker/src/sw/main.ts index 79adbad..318b716 100644 --- a/packages/worker/src/sw/main.ts +++ b/packages/worker/src/sw/main.ts @@ -88,3 +88,11 @@ self.onmessage = async (event) => { event.source!.postMessage({ id: msg.id, error: unknownToError(e).message }) } } + +self.addEventListener('install', (event) => { + event.waitUntil(self.skipWaiting()) +}) + +self.addEventListener('activate', (event) => { + event.waitUntil(self.clients.claim()) +}) diff --git a/packages/worker/src/sw/register.ts b/packages/worker/src/sw/register.ts index c89546c..d1aac57 100644 --- a/packages/worker/src/sw/register.ts +++ b/packages/worker/src/sw/register.ts @@ -1,5 +1,12 @@ +import { Deferred } from '@fuman/utils' import workerUrl from '../../sw.ts?worker&url' +const swInitDeferred = new Deferred() + +export async function waitForServiceWorkerInit() { + await swInitDeferred.promise +} + export function registerServiceWorker() { if (!('serviceWorker' in navigator)) { document.body.innerHTML = ` @@ -35,5 +42,10 @@ export function registerServiceWorker() { url.searchParams.delete(FIX_KEY) history.pushState(undefined, '', url) } + + swInitDeferred.resolve() + }).catch((err) => { + console.error('Failed to register service worker', err) + swInitDeferred.reject(err) }) } diff --git a/packages/worker/src/worker/telegram.ts b/packages/worker/src/worker/telegram.ts index 35d3019..f61e6c2 100644 --- a/packages/worker/src/worker/telegram.ts +++ b/packages/worker/src/worker/telegram.ts @@ -10,6 +10,7 @@ import { nanoid } from 'nanoid' import { renderSVG } from 'uqr' import { $accounts, $activeAccountId } from '../store/accounts.ts' import { swInvokeMethod } from '../sw/client.ts' +import { waitForServiceWorkerInit } from '../sw/register.ts' import { createInternalClient, deleteAccount, importAccount } from '../utils/telegram.ts' import { emitEvent } from './utils.ts' @@ -216,6 +217,7 @@ export class ReplWorkerTelegram { } async fetchAvatar(accountId: string) { + await waitForServiceWorkerInit() const res = await fetch(`/sw/avatar/${accountId}/avatar.jpg`) if (!res.ok) { return null