Files
diplom-frontend/app/stores/webrtc-store.ts
2025-05-20 04:16:03 +03:00

54 lines
1.5 KiB
TypeScript

import { create } from 'zustand';
import { WebRTCClient } from '~/lib/websocket/voice/client';
import { ConnectionState } from '~/lib/websocket/voice/types';
import { useVoiceStateStore } from './voice-state-store';
const VOICE_GATEWAY_URL = 'ws://localhost:12345/voice/ws';
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, get) => {
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);
}
};
});