File size: 4,143 Bytes
ff9325e
d6fedfa
ff9325e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d6fedfa
ff9325e
d6fedfa
 
 
ff9325e
d6fedfa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ff9325e
 
d6fedfa
 
ff9325e
d6fedfa
 
 
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import { writable } from 'svelte/store';
import { PUBLIC_WSS_URL } from '$env/static/public';

export const isStreaming = writable(false);
export const isLCMRunning = writable(false);


export enum LCMLiveStatus {
    INIT = "init",
    CONNECTED = "connected",
    DISCONNECTED = "disconnected",
}

interface lcmLive {
    streamId: string | null;
    status: LCMLiveStatus
}

const initialState: lcmLive = {
    streamId: null,
    status: LCMLiveStatus.INIT
};

export const lcmLiveState = writable(initialState);

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 = () => {
                    lcmLiveState.update((state) => ({
                        ...state,
                        status: LCMLiveStatus.DISCONNECTED
                    }));
                    console.log("Disconnected from websocket");
                    isLCMRunning.set(false);
                };
                websocket.onerror = (err) => {
                    console.error(err);
                };
                websocket.onmessage = (event) => {
                    const data = JSON.parse(event.data);
                    console.log("WS: ", data);
                    switch (data.status) {
                        case "success":
                            break;
                        case "start":
                            const streamId = data.userId;
                            lcmLiveState.update((state) => ({
                                ...state,
                                status: LCMLiveStatus.CONNECTED,
                                streamId: streamId,
                            }));
                            isLCMRunning.set(true);
                            resolve(streamId);
                            break;
                        case "timeout":
                            console.log("timeout");
                            isLCMRunning.set(false);
                            lcmLiveState.update((state) => ({
                                ...state,
                                status: LCMLiveStatus.DISCONNECTED,
                                streamId: null,
                            }));
                            reject("timeout");
                        case "error":
                            console.log(data.message);
                            isLCMRunning.set(false);
                            lcmLiveState.update((state) => ({
                                ...state,
                                status: LCMLiveStatus.DISCONNECTED,
                                streamId: null,
                            }));
                            reject(data.message);
                    }
                };

            } catch (err) {
                console.error(err);
                isLCMRunning.set(false);
                lcmLiveState.update((state) => ({
                    ...state,
                    status: LCMLiveStatus.DISCONNECTED,
                    streamId: 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;
        lcmLiveState.set({ status: LCMLiveStatus.DISCONNECTED, streamId: null });
        isLCMRunning.set(false)
    },
};