43 lines
1.5 KiB
TypeScript
43 lines
1.5 KiB
TypeScript
import { io, type Socket } from "socket.io-client";
|
|
import type {
|
|
ChatEvent,
|
|
ChatHistoryPayload,
|
|
LiveRuntimeInfo,
|
|
PersistedSessionInfo,
|
|
RuntimeCreatedPayload,
|
|
} from "./types";
|
|
|
|
export type SocketCallbacks = {
|
|
onConnect?: () => void;
|
|
onDisconnect?: () => void;
|
|
onError?: (message: string) => void;
|
|
onSessionsList?: (payload: {
|
|
persisted: PersistedSessionInfo[];
|
|
live: LiveRuntimeInfo[];
|
|
}) => void;
|
|
onRuntimeCreated?: (payload: RuntimeCreatedPayload) => void;
|
|
onRuntimeOpened?: (payload: RuntimeCreatedPayload) => void;
|
|
onChatEvent?: (payload: ChatEvent) => void;
|
|
onChatHistory?: (payload: ChatHistoryPayload) => void;
|
|
};
|
|
|
|
export function createSocket(baseUrl: string, callbacks: SocketCallbacks): Socket {
|
|
const socket = io(baseUrl, {
|
|
transports: ["websocket"],
|
|
autoConnect: true,
|
|
});
|
|
|
|
socket.on("connect", () => callbacks.onConnect?.());
|
|
socket.on("disconnect", () => callbacks.onDisconnect?.());
|
|
socket.on("error", (payload: { message?: string }) => {
|
|
callbacks.onError?.(payload.message ?? "Socket error");
|
|
});
|
|
socket.on("sessions:list:result", (payload) => callbacks.onSessionsList?.(payload));
|
|
socket.on("runtime:created", (payload) => callbacks.onRuntimeCreated?.(payload));
|
|
socket.on("runtime:opened", (payload) => callbacks.onRuntimeOpened?.(payload));
|
|
socket.on("chat:event", (payload) => callbacks.onChatEvent?.(payload));
|
|
socket.on("chat:history", (payload) => callbacks.onChatHistory?.(payload));
|
|
|
|
return socket;
|
|
}
|