aboutsummaryrefslogtreecommitdiff
path: root/client-web/source/user/local.ts
blob: a90a6f250ffc23d971d72c485eef353a9a71f077 (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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*
    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) 2024 metamuffin <metamuffin.org>
*/
/// <reference lib="dom" />

import { log } from "../logger.ts";
import { RemoteUser } from "./remote.ts";
import { Room } from "../room.ts";
import { ChatMessage } from "../../../common/packets.d.ts";
import { User } from "./mod.ts";
import { create_camera_res, create_mic_res, create_screencast_res } from "../resource/track.ts";
import { LocalResource } from "../resource/mod.ts";
import { PREFS } from "../preferences/mod.ts";
import { PO } from "../locale/mod.ts";

export class LocalUser extends User {
    resources: Map<string, LocalResource> = new Map()

    constructor(room: Room, id: number) {
        super(room, id)
        this.el.classList.add("local")
        this.status_el.textContent = PO.local
        this.name = PREFS.username
        log("users", `added local user: ${this.display_name}`)
        this.add_initial_tracks()
    }
    leave() { throw new Error("local users cant leave"); }

    add_initial_tracks() {
        if (PREFS.microphone_enabled) this.await_add_resource(create_mic_res())
        if (PREFS.camera_enabled) this.await_add_resource(create_camera_res())
        if (PREFS.screencast_enabled) this.await_add_resource(create_screencast_res())
    }

    provide_initial_to_remote(u: RemoteUser) {
        this.resources.forEach(r => {
            this.room.signaling.send_relay({ provide: r.info }, u.id)
        })
    }

    identify(recipient?: number) {
        if (this.name) this.room.signaling.send_relay({ identify: { username: this.name } }, recipient)
    }

    chat(message: ChatMessage) {
        this.room.signaling.send_relay({ chat: message })
    }

    async await_add_resource(tp: Promise<LocalResource>) {
        log("media", "awaiting local resource")
        let t!: LocalResource;
        try { t = await tp }
        catch (e) { log({ scope: "media", warn: true }, e.toString()) }
        if (!t) return
        log("media", "ok")
        this.add_resource(t)
    }

    add_resource(r: LocalResource) {
        const provide = r.info
        this.resources.set(provide.id, r)
        this.el.append(r.el)
        this.room.signaling.send_relay({ provide })

        r.set_destroy(() => {
            r.destroy()
            this.el.removeChild(r.el);
            this.resources.delete(provide.id)
            this.room.signaling.send_relay({ provide_stop: { id: provide.id } })
        })

        r.el.classList.add("resource")
        r.el.classList.add(`resource-${r.info.kind}`)
    }
}