summaryrefslogtreecommitdiff
path: root/client-web/source/resource/mod.ts
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
}