File size: 3,662 Bytes
ff9325e d6fedfa ff9325e 3207814 1d3190d ff9325e 3207814 ff9325e 3207814 ff9325e 1d3190d d6fedfa ff9325e d6fedfa ff9325e d6fedfa 3207814 d6fedfa 3207814 be97094 d6fedfa 1d3190d 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 89 90 91 92 93 94 95 96 97 98 |
import { writable } from 'svelte/store';
import { PUBLIC_WSS_URL } from '$env/static/public';
export enum LCMLiveStatus {
CONNECTED = "connected",
DISCONNECTED = "disconnected",
WAIT = "wait",
SEND_FRAME = "send_frame",
}
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(getSreamdata: () => any[]) {
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);
switch (data.status) {
case "connected":
const userId = data.userId;
lcmLiveStatus.set(LCMLiveStatus.CONNECTED);
streamId.set(userId);
resolve(userId);
break;
case "send_frame":
lcmLiveStatus.set(LCMLiveStatus.SEND_FRAME);
const streamData = getSreamdata();
websocket?.send(JSON.stringify({ status: "next_frame" }));
for (const d of streamData) {
this.send(d);
}
break;
case "wait":
lcmLiveStatus.set(LCMLiveStatus.WAIT);
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);
},
}; |