.
This commit is contained in:
54
app/stores/webrtc-store.ts
Normal file
54
app/stores/webrtc-store.ts
Normal file
@@ -0,0 +1,54 @@
|
||||
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);
|
||||
}
|
||||
};
|
||||
});
|
||||
Reference in New Issue
Block a user