blob: 5c76f413977dc401efc40fb0d7f64b1727bfd13d (
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
|
/*
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 { ProvideInfo } from "../../../common/packets.d.ts"
import { Room } from "../room.ts";
import { RemoteUser } from "../user/remote.ts"
import { resource_file } from "./file.ts";
import { resource_track } from "./track.ts";
export type TransportMethod = "data-channel" | "track"
export type RemoteResourceState = "connected" | "disconnected" | "await_connect" | "await_disconnect"
export interface ResourceHandlerDecl {
kind: string
new_remote(info: ProvideInfo, user: RemoteUser, enable: () => void): RemoteResource
}
export interface RemoteResource {
el: HTMLElement
info: ProvideInfo,
on_statechange(state: RemoteResourceState): void
on_enable(t: MediaStream | RTCDataChannel, disable: () => void): void,
on_preview(p: string): void,
stream?: MediaStream
}
export interface LocalResource {
el: HTMLElement
info: ProvideInfo,
destroy(): void
on_request(user: RemoteUser, create_channel: () => RTCDataChannel): MediaStream | RTCDataChannel,
set_destroy(cb: () => void): void
set_room?: (room: Room) => void
}
const RESOURCE_HANDLERS: ResourceHandlerDecl[] = [resource_file, resource_track]
export function new_remote_resource(user: RemoteUser, info: ProvideInfo): RemoteResource | undefined {
const h = RESOURCE_HANDLERS.find(h => h.kind == info.kind)
if (!h) return undefined
const res = h.new_remote(info, user, () => {
user.request_resource(res)
})
return res
}
|