summaryrefslogtreecommitdiff
path: root/client-web/source/sw/client.ts
blob: c92f4436dc7a2e512faf1e9bbded808382118a78 (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
57
58
/*
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", JSON.stringify(message.version_info))
        }
        if (message.updated) {
            log("*", "updated")
        }
    })
}