aboutsummaryrefslogtreecommitdiff
path: root/client-web/source/sw/client.ts
blob: c4537f7619eb3dd08a430dc648909a9bf28d8905 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/*
This file is part of keks-meet (https://codeberg.org/metamuffin/keks-meet)
which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
Copyright (C) 2023 metamuffin <metamuffin@disroot.org>
*/
/// <reference lib="dom" />
// deno-lint-ignore-file no-unused-vars prefer-const

import { log } from "../logger.ts"
import { SWMessage } from "./protocol.ts"

export let SW_ENABLED = false

export async function init_serviceworker() {
    // TODO this breaks shift-reload for some reason
    // let reg = await globalThis.navigator.serviceWorker.getRegistration()
    // if (reg) {
    //     log("sw", "service worker already installed")
    //     SW_ENABLED = true
    // } else {
    //     log("sw", "registering service worker")
    //     await globalThis.navigator.serviceWorker.register("/sw.js", { scope: "/", type: "module" })
    //     log("sw", "worker installed")
    //     reg = await globalThis.navigator.serviceWorker.getRegistration();
    //     if (!reg) throw new Error("we just registered the sw!?");
    //     SW_ENABLED = !!reg
    // }
    // start_handler()
    // log("sw", "checking for updates")
    // send_sw_message({ check_version: true })
}

export async function send_sw_message(message: SWMessage, transfer?: Transferable[]) {
    const reg = await globalThis.navigator.serviceWorker.getRegistration();
    if (!reg) throw new Error("no sw");
    if (!reg.active) throw new Error("no sw");
    if (transfer) reg.active.postMessage(message, transfer)
    else reg.active.postMessage(message, transfer)
}

export async function update_serviceworker() {
    const regs = await globalThis.navigator.serviceWorker.getRegistrations()
    for (const r of regs) await r.unregister()
    log("sw", "cleared all workers")
    setTimeout(() => window.location.reload(), 500)
}

function start_handler() {
    globalThis.navigator.serviceWorker.addEventListener("message", event => {
        const message: SWMessage = event.data;
        if (message.version_info)
            log("sw", `installed: ${message.version_info.installed_version}`)
        if (message.updated)
            log("*", "updated")
    })
}