diff options
author | metamuffin <metamuffin@disroot.org> | 2024-04-02 12:16:51 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-04-02 12:16:51 +0200 |
commit | 3b87805d50bef3e73e857dd8025a4383e5f6651d (patch) | |
tree | 067a1edb6582813931e249b0c29c19d1fd962d3e /client-web/source/user/remote.ts | |
parent | 2accfbcda2aac18195ca9ec2017c91ea243bbf94 (diff) | |
download | keks-meet-3b87805d50bef3e73e857dd8025a4383e5f6651d.tar keks-meet-3b87805d50bef3e73e857dd8025a4383e5f6651d.tar.bz2 keks-meet-3b87805d50bef3e73e857dd8025a4383e5f6651d.tar.zst |
get rid of trackhandle and use mediastream everwhere
Diffstat (limited to 'client-web/source/user/remote.ts')
-rw-r--r-- | client-web/source/user/remote.ts | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/client-web/source/user/remote.ts b/client-web/source/user/remote.ts index 313ddc2..ad891bd 100644 --- a/client-web/source/user/remote.ts +++ b/client-web/source/user/remote.ts @@ -1,7 +1,7 @@ /* 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.org> + Copyright (C) 2024 metamuffin <metamuffin.org> */ /// <reference lib="dom" /> @@ -12,12 +12,11 @@ import { log } from "../logger.ts" import { PREFS } from "../preferences/mod.ts"; import { new_remote_resource, RemoteResource } from "../resource/mod.ts"; import { Room } from "../room.ts" -import { TrackHandle } from "../track_handle.ts"; import { User } from "./mod.ts"; export class RemoteUser extends User { pc: RTCPeerConnection - senders: Map<string, RTCRtpSender> = new Map() + senders: Map<string, RTCRtpSender[]> = new Map() data_channels: Map<string, RTCDataChannel> = new Map() resources: Map<string, RemoteResource> = new Map() @@ -36,16 +35,16 @@ export class RemoteUser extends User { this.update_status() } this.pc.ontrack = ev => { - const t = ev.track const id = ev.streams[0]?.id if (!id) { ev.transceiver.stop(); return log({ scope: "media", warn: true }, "got a track without stream") } const r = this.resources.get(id) if (!r) { ev.transceiver.stop(); return log({ scope: "media", warn: true }, "got an unassociated track") } - r.on_enable(new TrackHandle(t), () => { + r.stream = ev.streams[0] + r.on_enable(ev.streams[0], () => { this.request_resource_stop(r) ev.transceiver.stop() }) - log("media", `remote track: ${this.display_name}`, t) + log("media", `remote stream: ${id}`, ev.streams[0]) this.update_status() } this.pc.ondatachannel = ({ channel }) => { @@ -104,6 +103,7 @@ export class RemoteUser extends User { this.resources.set(message.provide.id, d) } if (message.provide_stop) { + this.resources.get(message.provide_stop.id)?.stream?.dispatchEvent(new Event("ended")) this.resources.get(message.provide_stop.id)?.el.remove() this.resources.delete(message.provide_stop.id) } @@ -111,9 +111,9 @@ export class RemoteUser extends User { const r = this.room.local_user.resources.get(message.request.id) if (!r) return log({ scope: "*", warn: true }, "somebody requested an unknown resource") const channel = r.on_request(this, () => this.pc.createDataChannel(r.info.id)) - if (channel instanceof TrackHandle) { - const sender = this.pc.addTrack(channel.track, channel.stream) - this.senders.set(channel.id, sender) + if (channel instanceof MediaStream) { + const senders = channel.getTracks().map(t => this.pc.addTrack(t, channel)) + this.senders.set(channel.id, senders) channel.addEventListener("end", () => { this.senders.delete(r.info.id) }) } else if (channel instanceof RTCDataChannel) { this.data_channels.set(r.info.id, channel) @@ -121,8 +121,8 @@ export class RemoteUser extends User { } else throw new Error("unreachable"); } if (message.request_stop) { - const sender = this.senders.get(message.request_stop.id) - if (sender) this.pc.removeTrack(sender) + const sender = this.senders.get(message.request_stop.id) ?? [] + sender.forEach(s => this.pc.removeTrack(s)) const dc = this.data_channels.get(message.request_stop.id) if (dc) dc.close() } |