Files
diplom-frontend/app/stores/webrtc-store.ts
2025-06-03 11:44:51 +03:00

55 lines
1.5 KiB
TypeScript

import { create } from "zustand";
import { VOICE_GATEWAY_URL } from "~/lib/consts";
import { WebRTCClient } from "~/lib/websocket/voice/client";
import { ConnectionState } from "~/lib/websocket/voice/types";
import { useVoiceStateStore } from "./voice-state-store";
interface WebRTCState {
client: WebRTCClient | null;
status: ConnectionState;
remoteStream: MediaStream | null;
error: string | null;
connect: (token: string) => Promise<void>;
disconnect: () => void;
createOffer: (localStream: MediaStream) => Promise<void>;
}
export const useWebRTCStore = create<WebRTCState>()((set) => {
const client = new WebRTCClient(
VOICE_GATEWAY_URL,
(state) => set({ status: state }),
(error) => {
set({
status: ConnectionState.ERROR,
error: error.message,
});
useVoiceStateStore.getState().setError(error.message);
},
(stream) => set({ remoteStream: stream }),
);
return {
client,
status: ConnectionState.DISCONNECTED,
remoteStream: null,
error: null,
connect: async (token) => {
await client.connect(token);
},
disconnect: () => {
client.disconnect();
set({
status: ConnectionState.DISCONNECTED,
remoteStream: null,
});
},
createOffer: async (localStream) => {
await client.createOffer(localStream);
},
};
});