Spaces:
Runtime error
Runtime error
File size: 3,721 Bytes
ff9325e 3207814 1d3190d 488b360 ff9325e 3207814 ff9325e 3207814 ff9325e 1d3190d d6fedfa ff9325e d6fedfa 488b360 cefdf75 488b360 ff9325e d6fedfa 3207814 d6fedfa 3207814 488b360 d6fedfa 1d3190d d6fedfa 488b360 3207814 488b360 d6fedfa 3207814 78b5416 488b360 d6fedfa 3207814 d6fedfa ff9325e 488b360 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 99 |
import { writable } from 'svelte/store';
export enum LCMLiveStatus {
CONNECTED = "connected",
DISCONNECTED = "disconnected",
WAIT = "wait",
SEND_FRAME = "send_frame",
TIMEOUT = "timeout",
}
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 userId = crypto.randomUUID();
const websocketURL = `${window.location.protocol === "https:" ? "wss" : "ws"
}:${window.location.host}/api/ws/${userId}`;
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":
lcmLiveStatus.set(LCMLiveStatus.CONNECTED);
streamId.set(userId);
resolve({ status: "connected", 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.TIMEOUT);
streamId.set(null);
reject(new Error("timeout"));
break;
case "error":
console.log(data.message);
lcmLiveStatus.set(LCMLiveStatus.DISCONNECTED);
streamId.set(null);
reject(new Error(data.message));
break;
}
};
} 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() {
lcmLiveStatus.set(LCMLiveStatus.DISCONNECTED);
if (websocket) {
websocket.close();
}
websocket = null;
streamId.set(null);
},
}; |