Files
pi-mobile/apps/mobile/lib/socket.ts
T
2026-07-09 12:07:57 -05:00

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;
}