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}`)
}
}
|