54 lines
1.5 KiB
TypeScript
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);
|
|
}
|
|
};
|
|
}); |