File size: 3,080 Bytes
ff9325e
d6fedfa
ff9325e
 
 
 
 
3207814
ff9325e
 
3207814
ff9325e
3207814
 
ff9325e
 
 
 
d6fedfa
ff9325e
d6fedfa
 
 
ff9325e
d6fedfa
 
 
 
 
3207814
d6fedfa
 
 
 
 
 
 
 
 
3207814
 
 
 
be97094
d6fedfa
 
 
3207814
 
d6fedfa
 
 
3207814
 
d6fedfa
 
 
 
 
 
3207814
 
 
d6fedfa
 
 
ff9325e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3207814
 
ff9325e
 
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
78
79
80
81
82
83
84
85
86
87
88
import { writable } from 'svelte/store';
import { PUBLIC_WSS_URL } from '$env/static/public';


export enum LCMLiveStatus {
    CONNECTED = "connected",
    DISCONNECTED = "disconnected",
    WAIT = "wait",
}

const initStatus: LCMLiveStatus = LCMLiveStatus.DISCONNECTED;

export const lcmLiveStatus = writable<LCMLiveStatus>(initStatus);
export const streamId = writable<string | null>(null);

let websocket: WebSocket | null = null;
export const lcmLiveActions = {
    async start() {
        return new Promise((resolve, reject) => {

            try {
                const websocketURL = PUBLIC_WSS_URL ? PUBLIC_WSS_URL : `${window.location.protocol === "https:" ? "wss" : "ws"
                    }:${window.location.host}/ws`;

                websocket = new WebSocket(websocketURL);
                websocket.onopen = () => {
                    console.log("Connected to websocket");
                };
                websocket.onclose = () => {
                    lcmLiveStatus.set(LCMLiveStatus.DISCONNECTED);
                    console.log("Disconnected from websocket");
                };
                websocket.onerror = (err) => {
                    console.error(err);
                };
                websocket.onmessage = (event) => {
                    const data = JSON.parse(event.data);
                    console.log("WS: ", data);
                    switch (data.status) {
                        case "connected":
                            const userId = data.userId;
                            lcmLiveStatus.set(LCMLiveStatus.CONNECTED);
                            streamId.set(userId);
                            resolve(userId);
                            break;
                        case "timeout":
                            console.log("timeout");
                            lcmLiveStatus.set(LCMLiveStatus.DISCONNECTED);
                            streamId.set(null);
                            reject("timeout");
                        case "error":
                            console.log(data.message);
                            lcmLiveStatus.set(LCMLiveStatus.DISCONNECTED);
                            streamId.set(null);
                            reject(data.message);
                    }
                };

            } catch (err) {
                console.error(err);
                lcmLiveStatus.set(LCMLiveStatus.DISCONNECTED);
                streamId.set(null);

                reject(err);
            }
        });
    },
    send(data: Blob | { [key: string]: any }) {
        if (websocket && websocket.readyState === WebSocket.OPEN) {
            if (data instanceof Blob) {
                websocket.send(data);
            } else {
                websocket.send(JSON.stringify(data));
            }
        } else {
            console.log("WebSocket not connected");
        }
    },
    async stop() {

        if (websocket) {
            websocket.close();
        }
        websocket = null;
        lcmLiveStatus.set(LCMLiveStatus.DISCONNECTED);
        streamId.set(null);
    },
};