@afosecure/meetingsdk 1.4.5 → 1.4.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +6 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +252 -75
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +252 -75
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/useLocalParticipant.tsx","../src/react/MeetingProvider.tsx","../src/config/ws.ts","../src/core/MeetingState.ts","../src/core/VideoCore.ts","../src/react/useMeetingStore.ts","../src/react/useMeeting.ts","../src/react/useParticipants.ts","../src/react/useRemoteMedia.ts","../src/react/useMeetingPreview.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useMeetingContext } from \"./MeetingProvider\";\nimport { Participant } from \"../types/meeting\";\n\nexport const useLocalParticipant = () => {\n const { sdk } = useMeetingContext();\n\n // Guard the initial state to ensure it matches Participant | null\n const [localParticipant, setLocalParticipant] = useState<Participant | null>(\n () => {\n const current = sdk.state.localParticipant;\n return current && current.id ? (current as Participant) : null;\n },\n );\n\n useEffect(() => {\n const unsubscribe = sdk.state.subscribe(\"localParticipant\", () => {\n const current = sdk.state.localParticipant;\n\n // Safe Type-Guard: Only update if the object has a finalized id\n if (current && current.id) {\n setLocalParticipant({ ...current } as Participant);\n } else {\n setLocalParticipant(null);\n }\n });\n\n return unsubscribe;\n }, [sdk]);\n\n const lastStreamRef = useRef<MediaStream | null>(null);\n\n const videoRef = useCallback(\n (video: HTMLVideoElement | null) => {\n if (!video) return;\n\n const stream = localParticipant?.media?.stream;\n if (!stream) return;\n\n if (lastStreamRef.current === stream) return;\n lastStreamRef.current = stream;\n\n video.srcObject = stream;\n video.autoplay = true;\n video.playsInline = true;\n\n video.play().catch((err) => {\n console.warn(`Autoplay failed for local view:`, err);\n });\n },\n [localParticipant?.media?.stream],\n );\n\n return {\n participant: localParticipant,\n videoRef,\n };\n};\n","import React, { createContext, useContext, useMemo, useRef } from \"react\";\nimport { VideoSDKCore } from \"../core/VideoCore\";\nimport {\n ChatInput,\n ChatMessage,\n MeetingConfig,\n Participant,\n PubSubTopic,\n} from \"../types/meeting\";\nimport { useMeetingStore } from \"./useMeetingStore\";\n\ntype PubSubHandle = {\n messages: ChatMessage[];\n publish: (input: ChatInput) => void;\n};\n\ntype MeetingContextValue = {\n sdk: VideoSDKCore;\n join: (config?: MeetingConfig) => Promise<void>;\n leave: () => void;\n\n toggleMic: () => void;\n toggleCam: () => void;\n\n startScreenShare: () => Promise<MediaStream>;\n stopScreenShare: () => void;\n\n sendMessage: (input: ChatInput) => void;\n\n room: { id: string | null; name: string | null };\n localParticipant: Participant | null;\n participants: Map<string, Participant>;\n messages: ChatMessage[];\n presenterId: string | null;\n usePubSub: (topic: PubSubTopic) => PubSubHandle;\n approveJoinRequest: (requestId: string) => void;\n rejectJoinRequest: (requestId: string) => void;\n onError: (cb: (err: any) => void) => () => void;\n onEntryRequested: (cb: (req: any) => void) => () => void;\n onEntryResponded: (cb: (payload: any, decision?: any) => void) => () => void;\n onMeetingLeft: (cb: () => void) => () => void;\n};\n\nconst MeetingContext = createContext<MeetingContextValue | null>(null);\n\nexport const MeetingProvider = ({\n config,\n children,\n}: {\n config: MeetingConfig;\n children: React.ReactNode;\n}) => {\n const sdkRef = useRef<VideoSDKCore | null>(null);\n const errorListeners = useRef(new Set<(err: any) => void>());\n const entryRequestListeners = useRef(new Set<(req: any) => void>());\n const entryResponseListeners = useRef(\n new Set<(payload: any, decision?: any) => void>(),\n );\n const meetingLeftListeners = useRef(new Set<() => void>());\n\n if (!sdkRef.current) {\n sdkRef.current = new VideoSDKCore({\n onError: (err) => errorListeners.current.forEach((fn) => fn(err)),\n onEntryRequested: (req) =>\n entryRequestListeners.current.forEach((fn) => fn(req)),\n onEntryResponded: (p, d) =>\n entryResponseListeners.current.forEach((fn) => fn(p, d)),\n onMeetingLeft: () => meetingLeftListeners.current.forEach((fn) => fn()),\n });\n }\n\n const sdk = sdkRef.current;\n const presenterId = useMeetingStore(\n sdk.state,\n \"presenter\",\n (s) => s.presenterId,\n );\n const participants = useMeetingStore(\n sdk.state,\n \"participants\",\n (s) => s.participants,\n );\n const localParticipant = useMeetingStore(\n sdk.state,\n \"localParticipant\",\n (s) => s.localParticipant,\n );\n const messages = useMeetingStore(sdk.state, \"chat\", (s) =>\n s.getChatMessages(),\n );\n\n const value = useMemo<MeetingContextValue>(() => {\n if (!sdkRef.current) {\n sdkRef.current = new VideoSDKCore({\n onError: (err) => {\n errorListeners.current.forEach((fn) => fn(err));\n },\n });\n }\n\n return {\n sdk,\n\n join: (joinConfig?: MeetingConfig) =>\n sdk.joinMeeting({\n ...config,\n ...joinConfig,\n }),\n leave: () => sdk.disconnect(),\n toggleMic: sdk.toggleMic.bind(sdk),\n toggleCam: sdk.toggleCam.bind(sdk),\n startScreenShare: sdk.startScreenShare.bind(sdk),\n stopScreenShare: sdk.stopScreenShare.bind(sdk),\n sendMessage: sdk.sendChatMessage.bind(sdk),\n\n room: sdk.getMeeting(),\n localParticipant,\n participants,\n messages,\n presenterId,\n usePubSub: (topic: PubSubTopic) => {\n if (topic !== \"SECURE_CHAT\") {\n throw new Error(`Unsupported PubSub argument: \"${topic}\"`);\n }\n return {\n messages: sdk.state.getChatMessages(),\n publish: sdk.sendChatMessage.bind(sdk),\n };\n },\n approveJoinRequest: sdk.approveJoinRequest.bind(sdk),\n rejectJoinRequest: sdk.rejectJoinRequest.bind(sdk),\n\n onError: (cb: (err: any) => void) => {\n errorListeners.current.add(cb);\n\n return () => {\n errorListeners.current.delete(cb);\n };\n },\n\n onEntryRequested: (cb: (err: any) => void) => {\n entryRequestListeners.current.add(cb);\n\n return () => {\n entryRequestListeners.current.delete(cb);\n };\n },\n onEntryResponded: (cb: (err: any) => void) => {\n entryResponseListeners.current.add(cb);\n\n return () => {\n entryResponseListeners.current.delete(cb);\n };\n },\n onMeetingLeft: (cb: () => void) => {\n meetingLeftListeners.current.add(cb);\n return () => {\n meetingLeftListeners.current.delete(cb);\n };\n },\n };\n }, [config, sdk, localParticipant, participants, messages, presenterId]);\n\n return (\n <MeetingContext.Provider value={value}>{children}</MeetingContext.Provider>\n );\n};\n\nexport const useMeetingContext = () => {\n const ctx = useContext(MeetingContext);\n if (!ctx)\n throw new Error(\"useMeetingContext must be used inside <MeetingProvider>\");\n return ctx;\n};\n","export const SDK_CONFIG = {\n wsUrl: \"wss://rust-video-server-sfyf.onrender.com/ws\",\n baseUrl: \"https://rust-video-server-sfyf.onrender.com\",\n};\n","import {\n ChatMessage,\n Listener,\n Participant,\n ParticipantMedia,\n StateScope,\n} from \"../types/meeting\";\n\ntype LocalParticipantPatch = {\n id?: string;\n name?: string;\n media?: Partial<ParticipantMedia>;\n};\n\nexport class MeetingState {\n participants = new Map<string, Participant>();\n localParticipant: Participant | null = null;\n localStream: MediaStream | null = null;\n chatMessages = new Map<string, ChatMessage>();\n presenterId: string | null = null;\n\n private listeners = new Map<StateScope, Set<Listener>>();\n\n // ---- reactive system ----\n\n subscribe(scope: StateScope, fn: Listener): () => void {\n if (!this.listeners.has(scope)) {\n this.listeners.set(scope, new Set());\n }\n this.listeners.get(scope)!.add(fn);\n\n return () => {\n this.listeners.get(scope)?.delete(fn);\n };\n }\n\n notify(scope: StateScope) {\n this.listeners.get(scope)?.forEach((fn) => fn());\n }\n\n setPresenterId(id: string | null) {\n if (this.presenterId === id) return;\n this.presenterId = id;\n this.notify(\"presenter\");\n this.notify(\"participants\");\n }\n\n // ---- participants ----\n\n addParticipant(p: Participant) {\n if (this.participants.has(p.id)) return false;\n // Fix: Immutable Map update\n const next = new Map(this.participants);\n next.set(p.id, p);\n this.participants = next;\n\n this.notify(\"participants\");\n return true;\n }\n\n removeParticipant(id: string) {\n // Fix: Immutable Map update\n const next = new Map(this.participants);\n next.delete(id);\n this.participants = next;\n\n this.notify(\"participants\");\n }\n\n updateParticipantMedia(\n id: string,\n patch: Partial<NonNullable<Participant[\"media\"]>>,\n ) {\n const p = this.participants.get(id);\n if (!p) return;\n\n const updated: Participant = {\n ...p,\n media: {\n stream: null,\n screenStream: undefined,\n cameraTrack: undefined,\n screenTrack: undefined,\n audioTrack: undefined,\n micEnabled: true,\n camEnabled: true,\n isScreenSharing: false,\n ...p.media,\n ...patch,\n },\n };\n\n // Keep your clean immutable map update\n const next = new Map(this.participants);\n next.set(id, updated);\n this.participants = next;\n\n this.notify(`participant:${id}`);\n this.notify(\"participants\");\n }\n\n updateLocalParticipant(patch: LocalParticipantPatch) {\n const prev = this.localParticipant;\n\n if (!prev) {\n this.localParticipant = {\n id: patch.id ?? \"\",\n name: patch.name ?? \"\",\n media: {\n stream: patch.media?.stream ?? null, // ◄ FIX: Capture the stream from the patch here\n screenStream: patch.media?.screenStream,\n cameraTrack: patch.media?.cameraTrack,\n screenTrack: patch.media?.screenTrack,\n audioTrack: patch.media?.audioTrack,\n micEnabled: patch.media?.micEnabled ?? true,\n camEnabled: patch.media?.camEnabled ?? true,\n isScreenSharing: patch.media?.isScreenSharing ?? false,\n },\n };\n\n this.notify(\"localParticipant\");\n return;\n }\n\n const prevMedia = prev.media ?? {\n stream: null,\n screenStream: undefined,\n cameraTrack: undefined,\n screenTrack: undefined,\n audioTrack: undefined,\n micEnabled: true,\n camEnabled: true,\n isScreenSharing: false,\n };\n\n const nextMedia: ParticipantMedia = {\n stream: patch.media?.stream ?? prevMedia.stream,\n screenStream: patch.media?.screenStream ?? prevMedia.screenStream,\n cameraTrack: patch.media?.cameraTrack ?? prevMedia.cameraTrack,\n screenTrack: patch.media?.screenTrack ?? prevMedia.screenTrack,\n audioTrack: patch.media?.audioTrack ?? prevMedia.audioTrack,\n micEnabled: patch.media?.micEnabled ?? prevMedia.micEnabled,\n camEnabled: patch.media?.camEnabled ?? prevMedia.camEnabled,\n isScreenSharing:\n patch.media?.isScreenSharing ?? prevMedia.isScreenSharing,\n };\n\n this.localParticipant = {\n ...prev,\n id: patch.id ?? prev.id,\n name: patch.name ?? prev.name,\n media: nextMedia,\n };\n\n this.notify(\"localParticipant\");\n }\n\n // ---- chat ----\n\n addChatMessage(msg: ChatMessage) {\n this.chatMessages.set(msg.id, msg);\n this.notify(\"chat\");\n }\n\n getChatMessages() {\n return Array.from(this.chatMessages.values()).sort(\n (a, b) => a.timestamp - b.timestamp,\n );\n }\n\n clearChat() {\n this.chatMessages.clear();\n this.notify(\"chat\");\n }\n\n // ---- helpers ----\n\n getParticipants() {\n return Array.from(this.participants.values());\n }\n\n getParticipant(id: string) {\n return this.participants.get(id) ?? null;\n }\n\n resetRemoteState() {\n this.participants.clear();\n this.chatMessages.clear();\n this.presenterId = null;\n this.notify(\"participants\");\n this.notify(\"chat\");\n this.notify(\"presenter\");\n }\n}\n","import { SDK_CONFIG } from \"../config/ws\";\nimport {\n ChatInput,\n ChatMessage,\n Events,\n MeetingConfig,\n Participant,\n SDKError,\n} from \"../types/meeting\";\nimport { MeetingState } from \"./MeetingState\";\n\nexport class VideoSDKCore {\n private ws: WebSocket | null = null;\n private pubPC: RTCPeerConnection | null = null;\n private subPC: RTCPeerConnection | null = null;\n\n private iceServers: RTCIceServer[] = [];\n private lastPong = Date.now();\n private intentionalDisconnect = false;\n private myId: string;\n private room: { id: string | null; name: string | null } = {\n id: null,\n name: null,\n };\n\n private localStream: MediaStream | null = null;\n private screenStream: MediaStream | null = null;\n private screenSender: RTCRtpSender | null = null;\n private isScreenSharing = false;\n\n private pingInterval: any = null;\n private reconnectAttempts = 0;\n private reconnectTimer?: number;\n private participantName = \"\";\n public readonly state: MeetingState;\n\n private joinResolver?: () => void;\n private joinRejecter?: (e: any) => void;\n private isWaitingForApproval = false;\n private pendingRequestId: string | null = null;\n private iceTransportPolicy: RTCIceTransportPolicy = \"all\";\n\n constructor(\n private events: Events = {},\n private url: string = SDK_CONFIG.wsUrl,\n ) {\n this.state = new MeetingState();\n this.events = events;\n this.url = url;\n this.myId = localStorage.getItem(\"vsdk_id\") || crypto.randomUUID();\n localStorage.setItem(\"vsdk_id\", this.myId);\n }\n\n // ---------------- MEDIA SETUP ----------------\n async initLocal(video: HTMLVideoElement, name: string) {\n this.participantName = name;\n try {\n this.localStream = await navigator.mediaDevices.getUserMedia({\n video: { width: { ideal: 1280 }, height: { ideal: 720 } },\n audio: {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n },\n });\n\n const hasVideo = this.localStream\n .getVideoTracks()\n .some((t) => t.readyState === \"live\");\n const hasAudio = this.localStream\n .getAudioTracks()\n .some((t) => t.readyState === \"live\");\n\n if (!hasVideo || !hasAudio) {\n throw new Error(`Missing tracks: video=${hasVideo}, audio=${hasAudio}`);\n }\n\n video.srcObject = this.localStream;\n this.state.updateLocalParticipant({\n id: this.myId,\n name: this.participantName,\n media: {\n stream: this.localStream,\n micEnabled: true,\n camEnabled: true,\n isScreenSharing: false,\n },\n });\n\n this.state.localStream = this.localStream;\n } catch (err: any) {\n this.emitError(\"GET_USER_MEDIA_FAILED\", err?.message, err, false);\n throw err;\n }\n }\n\n async joinMeeting(config: MeetingConfig) {\n const { roomId, name, audioMuted = false, videoMuted = false } = config;\n if (!roomId || !name) {\n throw new Error(\"roomId and name are required to join meeting\");\n }\n this.participantName = name;\n\n if (!this.localStream) {\n this.localStream = await navigator.mediaDevices.getUserMedia({\n video: true,\n audio: true,\n });\n }\n\n this.localStream.getAudioTracks().forEach((t) => (t.enabled = !audioMuted));\n this.localStream.getVideoTracks().forEach((t) => (t.enabled = !videoMuted));\n\n this.state.updateLocalParticipant({\n id: this.myId,\n name: this.participantName,\n media: {\n stream: this.localStream,\n micEnabled: !audioMuted,\n camEnabled: !videoMuted,\n isScreenSharing: false,\n },\n });\n\n this.state.localStream = this.localStream;\n await this.connect(roomId, name);\n }\n\n // ---------------- SFU PEER CONNECTION CREATION ----------------\n private setupPublisherPC() {\n if (!this.localStream) return;\n\n this.pubPC = new RTCPeerConnection({\n iceServers: this.iceServers,\n iceTransportPolicy: this.iceTransportPolicy,\n });\n\n // Add local tracks to Publisher PC\n this.localStream.getTracks().forEach((track) => {\n this.pubPC?.addTrack(track, this.localStream!);\n });\n\n this.pubPC.onicecandidate = (e) => {\n if (e.candidate) {\n this.send({\n type: \"PUB_ICE\",\n payload: JSON.stringify(e.candidate),\n user_id: this.myId,\n });\n }\n };\n\n this.pubPC.onconnectionstatechange = () => {\n console.log(`[SFU Publisher PC State]`, this.pubPC?.connectionState);\n if (this.pubPC?.connectionState === \"failed\") {\n this.restartPublisherIce();\n }\n };\n }\n\n private setupSubscriberPC() {\n this.subPC = new RTCPeerConnection({\n iceServers: this.iceServers,\n iceTransportPolicy: this.iceTransportPolicy,\n });\n\n this.subPC.onicecandidate = (e) => {\n if (e.candidate) {\n this.send({\n type: \"SUB_ICE\",\n payload: JSON.stringify(e.candidate),\n user_id: this.myId,\n });\n }\n };\n\n this.subPC.ontrack = (event) => {\n const incomingStream = event.streams[0] || new MediaStream([event.track]);\n const streamId = incomingStream.id.replace(/[{}]/g, \"\");\n\n // Find participant that owns this stream ID\n let matchedParticipant: Participant | undefined;\n for (const p of this.state.participants.values()) {\n if (\n p.media?.cameraStreamId === streamId ||\n p.media?.remoteScreenStreamId === streamId\n ) {\n matchedParticipant = p;\n break;\n }\n }\n\n if (!matchedParticipant) {\n console.warn(\n `[SFU ontrack] Dynamic track received for stream ${streamId}`,\n );\n return;\n }\n\n const pId = matchedParticipant.id;\n const isScreen =\n streamId === matchedParticipant.media?.remoteScreenStreamId;\n\n if (isScreen) {\n this.state.updateParticipantMedia(pId, {\n screenStream: incomingStream,\n screenTrack: event.track,\n isScreenSharing: true,\n });\n\n if (!this.state.presenterId) {\n this.state.setPresenterId(pId);\n }\n\n this.events.onScreenShareStarted?.(pId, incomingStream);\n } else {\n this.state.updateParticipantMedia(pId, {\n stream: incomingStream,\n cameraTrack: incomingStream.getVideoTracks()[0],\n audioTrack: incomingStream.getAudioTracks()[0],\n });\n this.events.onTrack?.(incomingStream, pId);\n }\n };\n\n this.subPC.onconnectionstatechange = () => {\n console.log(`[SFU Subscriber PC State]`, this.subPC?.connectionState);\n };\n }\n\n // ---------------- WEBSOCKET CONNECTION & SIGNALING ----------------\n async connect(roomId: string, name: string) {\n this.room.id = roomId;\n this.reset();\n\n return new Promise<void>((resolve, reject) => {\n this.joinResolver = resolve;\n this.joinRejecter = reject;\n this.ws = new WebSocket(this.url);\n\n this.ws.onopen = () => {\n console.log(\"WebSocket connected to SFU, sending JOIN...\");\n const micEnabled = !!this.state.localParticipant?.media?.micEnabled;\n const camEnabled = !!this.state.localParticipant?.media?.camEnabled;\n\n this.send({\n type: \"JOIN\",\n room_id: roomId,\n user_id: this.myId,\n sender_name: name,\n camera_stream_id: this.localStream?.id.replace(/[{}]/g, \"\"),\n audio_muted: !micEnabled,\n video_muted: !camEnabled,\n });\n };\n\n this.ws.onerror = (err) => {\n this.emitError(\"WS_ERROR\", \"WebSocket encountered an error\", err, true);\n };\n\n this.ws.onclose = (e) => {\n this.joinRejecter?.({\n code: \"WS_CLOSED\",\n message: \"Connection closed before join completed\",\n raw: e,\n });\n this.joinRejecter = undefined;\n\n if (\n this.intentionalDisconnect ||\n e.code === 1000 ||\n e.code === 1001 ||\n this.isWaitingForApproval\n ) {\n return;\n }\n this.scheduleReconnect();\n };\n\n this.ws.onmessage = async (e) => {\n await this.handle(JSON.parse(e.data));\n };\n });\n }\n\n private async handle(msg: any) {\n if (msg.sender === this.myId) return;\n\n switch (msg.type) {\n case \"PONG\":\n this.lastPong = Date.now();\n break;\n\n case \"JOINED\": {\n if (msg.iceServers) {\n this.iceServers = msg.iceServers;\n }\n this.room.name = msg.room_name;\n\n this.isWaitingForApproval = false;\n this.pendingRequestId = null;\n this.intentionalDisconnect = false;\n this.reconnectAttempts = 0;\n\n // Initialize Publisher and Subscriber PeerConnections with SFU\n this.setupPublisherPC();\n this.setupSubscriberPC();\n\n // Create initial Publisher Offer to send client streams to SFU\n await this.createPublisherOffer();\n\n this.startHeartbeat();\n this.joinResolver?.();\n this.joinResolver = undefined;\n this.joinRejecter = undefined;\n break;\n }\n\n case \"SFU_PUB_ANSWER\": {\n if (this.pubPC) {\n await this.pubPC.setRemoteDescription({\n type: \"answer\",\n sdp: msg.payload,\n });\n }\n break;\n }\n\n case \"SFU_SUB_OFFER\": {\n if (this.subPC) {\n await this.subPC.setRemoteDescription({\n type: \"offer\",\n sdp: msg.payload,\n });\n const answer = await this.subPC.createAnswer();\n await this.subPC.setLocalDescription(answer);\n\n this.send({\n type: \"SUB_ANSWER\",\n payload: answer.sdp,\n user_id: this.myId,\n });\n }\n break;\n }\n\n case \"PUB_ICE\": {\n if (this.pubPC && msg.payload) {\n await this.pubPC\n .addIceCandidate(JSON.parse(msg.payload))\n .catch(console.warn);\n }\n break;\n }\n\n case \"SUB_ICE\": {\n if (this.subPC && msg.payload) {\n await this.subPC\n .addIceCandidate(JSON.parse(msg.payload))\n .catch(console.warn);\n }\n break;\n }\n\n case \"EXISTING_USERS\": {\n if (msg.presenterId) {\n this.state.setPresenterId(msg.presenterId);\n }\n\n for (const p of msg.participants || []) {\n if (!p?.id || p.id === this.myId) continue;\n const structuredParticipant: Participant = {\n id: p.id,\n name: p.name,\n isHost: p.isHost,\n isPresenter: p.isPresenter,\n media: {\n stream: null,\n screenStream: undefined,\n micEnabled: p.micEnabled ?? true,\n camEnabled: p.camEnabled ?? true,\n isScreenSharing: p.isScreenSharing ?? false,\n remoteScreenStreamId: p.remoteScreenStreamId || undefined,\n cameraStreamId: p.cameraId || undefined,\n },\n };\n this.state.addParticipant(structuredParticipant);\n this.events.onUserJoined?.(structuredParticipant);\n }\n break;\n }\n\n case \"USER_JOINED\": {\n const p = msg.participant;\n if (!p?.id || p.id === this.myId) return;\n this.state.addParticipant(p);\n this.events.onUserJoined?.(p);\n break;\n }\n\n case \"USER_LEFT\": {\n const peerId = msg.participant.id;\n this.state.removeParticipant(peerId);\n this.events.onUserLeft?.(peerId);\n break;\n }\n\n case \"MEDIA_STATE_CHANGE\": {\n const peerId = msg.peerId;\n const { kind, enabled } = msg;\n\n if (kind === \"audio\") {\n this.state.updateParticipantMedia(peerId, { micEnabled: enabled });\n this.events.onMicToggled?.(peerId, enabled);\n } else if (kind === \"video\") {\n this.state.updateParticipantMedia(peerId, { camEnabled: enabled });\n this.events.onCamToggled?.(peerId, enabled);\n }\n break;\n }\n\n case \"SCREEN_SHARE_START\": {\n const peerId = msg.peerId;\n this.state.updateParticipantMedia(peerId, {\n isScreenSharing: true,\n remoteScreenStreamId: msg.stream_id,\n cameraStreamId: msg?.camera_stream_id,\n });\n\n if (!this.state.presenterId) {\n this.state.setPresenterId(peerId);\n }\n break;\n }\n\n case \"SCREEN_SHARE_STOP\": {\n const peerId = msg.peerId;\n this.state.updateParticipantMedia(peerId, { isScreenSharing: false });\n if (this.state.presenterId === peerId) {\n this.state.setPresenterId(null);\n }\n this.events.onScreenShareStopped?.(peerId);\n break;\n }\n\n case \"CHAT_MESSAGE\": {\n const newMsg = msg.data;\n if (newMsg.sender_id === this.myId) break;\n this.state.addChatMessage({\n id: newMsg.id,\n text: newMsg.message,\n sender_id: newMsg.sender_id,\n sender_name: newMsg.sender_name,\n timestamp: new Date(newMsg.timestamp).getTime(),\n target: newMsg.target,\n });\n this.events.onChatMessage?.(msg);\n break;\n }\n\n case \"JOIN_PENDING\": {\n const req = msg.request;\n this.isWaitingForApproval = true;\n this.pendingRequestId = req.request_id;\n this.events.onEntryRequested?.({\n requestId: req.request_id,\n userId: req.user_id,\n name: req.name,\n });\n break;\n }\n\n case \"JOIN_APPROVED\": {\n this.isWaitingForApproval = false;\n this.pendingRequestId = null;\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.send({\n type: \"JOIN\",\n room_id: this.room.id,\n user_id: this.myId,\n sender_name: this.participantName,\n });\n }\n break;\n }\n\n case \"JOIN_REJECTED\": {\n this.isWaitingForApproval = false;\n this.pendingRequestId = null;\n this.events.onEntryResponded?.({\n participantId: msg.user_id,\n decision: \"rejected\",\n });\n break;\n }\n\n case \"ERROR\": {\n const fatal = msg?.fatal === true;\n this.emitError(\n \"WS_ERROR\",\n msg?.message || \"Unknown error\",\n msg,\n !fatal,\n );\n if (fatal) this.disconnect();\n return;\n }\n }\n }\n\n // ---------------- PUBLISHER RENEGOTIATION ----------------\n private async createPublisherOffer() {\n if (!this.pubPC) return;\n\n try {\n const offer = await this.pubPC.createOffer();\n await this.pubPC.setLocalDescription(offer);\n\n this.send({\n type: \"PUB_OFFER\",\n payload: offer.sdp,\n user_id: this.myId,\n room_id: this.room.id,\n });\n } catch (err) {\n console.error(\"[SFU Publisher Offer Error]\", err);\n }\n }\n\n // ---------------- MEDIA TOGGLES ----------------\n toggleMic() {\n const mediaState = this.state.localParticipant?.media;\n if (!mediaState) return;\n\n const nextEnabled = !mediaState.micEnabled;\n this.localStream\n ?.getAudioTracks()\n .forEach((t) => (t.enabled = nextEnabled));\n\n this.state.updateLocalParticipant({\n id: this.myId,\n name: this.participantName,\n media: { ...mediaState, micEnabled: nextEnabled },\n });\n\n this.send({ type: \"MEDIA_STATE\", kind: \"audio\", enabled: nextEnabled });\n }\n\n toggleCam() {\n const mediaState = this.state.localParticipant?.media;\n if (!mediaState) return;\n\n const nextEnabled = !mediaState.camEnabled;\n this.localStream\n ?.getVideoTracks()\n .forEach((t) => (t.enabled = nextEnabled));\n\n this.state.updateLocalParticipant({\n id: this.myId,\n name: this.participantName,\n media: { ...mediaState, camEnabled: nextEnabled },\n });\n\n this.send({ type: \"MEDIA_STATE\", kind: \"video\", enabled: nextEnabled });\n }\n\n // ---------------- SCREEN SHARING (SFU) ----------------\n async startScreenShare() {\n try {\n if (this.state.presenterId && this.state.presenterId !== this.myId) {\n throw new Error(\"Another user is already sharing their screen.\");\n }\n\n this.screenStream = await navigator.mediaDevices.getDisplayMedia({\n video: true,\n });\n this.isScreenSharing = true;\n\n const screenTrack = this.screenStream.getVideoTracks()[0];\n\n // Add Screen track directly to SFU Publisher PC\n if (this.pubPC) {\n this.screenSender = this.pubPC.addTrack(screenTrack, this.screenStream);\n await this.createPublisherOffer();\n }\n\n this.state.updateLocalParticipant({\n media: {\n isScreenSharing: true,\n screenStream: this.screenStream,\n screenTrack,\n },\n });\n\n this.state.setPresenterId(this.myId);\n\n screenTrack.onended = () => {\n this.stopScreenShare();\n };\n\n this.send({\n type: \"SCREEN_SHARE_START\",\n sender: this.myId,\n room_id: this.room.id,\n camera_id: this.localStream?.id.replace(/[{}]/g, \"\"),\n stream_id: this.screenStream.id.replace(/[{}]/g, \"\"),\n });\n\n return this.screenStream;\n } catch (err: any) {\n this.emitError(\n \"SCREEN_SHARE_FAILED\",\n err?.message || \"Failed screen share\",\n err,\n true,\n );\n this.isScreenSharing = false;\n this.screenStream = null;\n throw err;\n }\n }\n\n stopScreenShare() {\n if (!this.screenStream) return;\n\n this.screenStream.getTracks().forEach((t) => t.stop());\n\n if (this.pubPC && this.screenSender) {\n try {\n this.pubPC.removeTrack(this.screenSender);\n this.createPublisherOffer();\n } catch (e) {\n console.warn(\"Failed removing screen sender\", e);\n }\n this.screenSender = null;\n }\n\n this.screenStream = null;\n this.isScreenSharing = false;\n\n this.state.updateLocalParticipant({\n media: {\n isScreenSharing: false,\n screenStream: null,\n screenTrack: undefined,\n },\n });\n\n if (this.state.presenterId === this.myId) {\n this.state.setPresenterId(null);\n }\n\n this.send({\n type: \"SCREEN_SHARE_STOP\",\n sender: this.myId,\n room_id: this.room.id,\n });\n }\n\n // ---------------- CHAT & RECONNECT ----------------\n sendChatMessage(payload: ChatInput) {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN || !this.room.id)\n return;\n\n const isPrivate = !!payload?.target;\n const senderName = this.state.localParticipant?.name || \"Anonymous\";\n\n const msg: ChatMessage = {\n id: crypto.randomUUID(),\n sender_id: this.myId,\n sender_name: senderName,\n text: payload.message.trim(),\n timestamp: Date.now(),\n reply_to: payload.reply_to ?? null,\n target: payload.target ?? null,\n };\n\n this.state.addChatMessage(msg);\n\n this.send({\n type: \"CHAT_MESSAGE\",\n message: payload.message.trim(),\n user_id: this.myId,\n sender_name: senderName,\n room_id: this.room.id,\n target: isPrivate ? (payload.target ?? null) : null,\n reply_to: payload.reply_to ?? null,\n client_ts: Date.now(),\n });\n }\n\n private scheduleReconnect() {\n if (!this.room.id) return;\n const delay = Math.min(1000 * Math.pow(2, this.reconnectAttempts), 30000);\n window.clearTimeout(this.reconnectTimer);\n this.reconnectTimer = window.setTimeout(async () => {\n try {\n await this.connect(this.room.id!, this.participantName);\n this.reconnectAttempts = 0;\n } catch {\n this.reconnectAttempts++;\n this.scheduleReconnect();\n }\n }, delay);\n }\n\n private startHeartbeat() {\n this.stopHeartbeat();\n this.pingInterval = setInterval(() => {\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.send({ type: \"PING\", client_ts: Date.now() });\n }\n }, 20000);\n }\n\n private stopHeartbeat() {\n if (this.pingInterval) {\n clearInterval(this.pingInterval);\n this.pingInterval = null;\n }\n }\n\n private reset() {\n this.pubPC?.close();\n this.subPC?.close();\n this.pubPC = null;\n this.subPC = null;\n this.state.resetRemoteState();\n }\n\n disconnect() {\n this.intentionalDisconnect = true;\n\n this.stopScreenShare();\n\n this.pubPC?.close();\n this.subPC?.close();\n this.pubPC = null;\n this.subPC = null;\n\n this.stopHeartbeat();\n\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.send({\n type: \"LEAVE\",\n room_id: this.room.id,\n user_id: this.myId,\n sender_name: this.state.localParticipant?.name,\n });\n\n setTimeout(() => {\n this.ws?.close(1000, \"Leaving meeting\");\n this.ws = null;\n }, 50);\n }\n\n if (this.localStream) {\n this.localStream.getTracks().forEach((track) => track.stop());\n this.localStream = null;\n }\n\n this.room.id = null;\n this.state.localParticipant = null;\n this.state.notify(\"localParticipant\");\n this.state.participants.clear();\n this.state.notify(\"participants\");\n this.events.onMeetingLeft?.();\n this.state.clearChat();\n this.state.setPresenterId(null);\n }\n\n private async restartPublisherIce() {\n if (!this.pubPC) return;\n try {\n this.pubPC.restartIce();\n await this.createPublisherOffer();\n } catch (err) {\n console.error(\"[Publisher ICE Restart Failed]\", err);\n }\n }\n\n private emitError(\n code: string,\n message: string,\n raw?: any,\n recoverable = true,\n ) {\n const err: SDKError = {\n code,\n message,\n raw,\n roomId: this.room.id,\n userId: this.myId,\n recoverable,\n };\n this.events.onError?.(err);\n this.joinRejecter?.(err);\n this.joinRejecter = undefined;\n console.error(\"[MeetingSDK Error]\", err);\n }\n\n private send(msg: any) {\n this.ws?.send(JSON.stringify(msg));\n }\n\n approveJoinRequest(requestId: string) {\n this.send({ type: \"JOIN_APPROVE\", request_id: requestId });\n }\n\n rejectJoinRequest(requestId: string) {\n this.send({ type: \"JOIN_REJECT\", request_id: requestId });\n }\n\n getMeeting(): { id: string | null; name: string | null } {\n return this.room;\n }\n}\n","import { useEffect, useState } from \"react\";\nimport { StateScope } from \"../types/meeting\";\nimport { MeetingState } from \"../core/MeetingState\";\n\nexport function useMeetingStore<T>(\n stateManager: MeetingState,\n scope: StateScope,\n selector: (state: MeetingState) => T,\n): T {\n const [state, setState] = useState(() => selector(stateManager));\n\n useEffect(() => {\n // Update local react state whenever the SDK notifies this scope\n const unsubscribe = stateManager.subscribe(scope, () => {\n setState(selector(stateManager));\n });\n\n return unsubscribe;\n }, [stateManager, scope, selector]);\n\n return state;\n}\n","import { useEffect } from \"react\";\nimport { useMeetingContext } from \"./MeetingProvider\";\n\nexport const useMeeting = (handlers?: {\n onError?: (err: any) => void;\n onEntryRequested?: (req: any) => void;\n onEntryResponded?: (payload: any, decision?: any) => void;\n onMeetingLeft?: () => void;\n}) => {\n const ctx = useMeetingContext();\n\n // Error Handler\n useEffect(() => {\n if (!handlers?.onError) return;\n return ctx.onError(handlers.onError);\n }, [handlers?.onError]);\n\n // Entry Request Handler\n useEffect(() => {\n if (!handlers?.onEntryRequested) return;\n return ctx.onEntryRequested(handlers.onEntryRequested);\n }, [handlers?.onEntryRequested]);\n\n // Entry Response Handler\n useEffect(() => {\n if (!handlers?.onEntryResponded) return;\n return ctx.onEntryResponded(handlers.onEntryResponded);\n }, [handlers?.onEntryResponded]);\n\n // Meeting Left Handler\n useEffect(() => {\n if (!handlers?.onMeetingLeft) return;\n return ctx.onMeetingLeft(handlers.onMeetingLeft);\n }, [handlers?.onMeetingLeft]);\n\n const { sdk: _, ...publicApi } = ctx;\n return publicApi;\n};\n","import { useEffect, useState } from \"react\";\nimport { useMeetingContext } from \"./MeetingProvider\";\nimport { Participant } from \"../types/meeting\";\n\nexport const useParticipants = () => {\n const { sdk } = useMeetingContext();\n\n const [participants, setParticipants] = useState<Participant[]>(() =>\n sdk.state.getParticipants(),\n );\n\n useEffect(() => {\n const update = () => {\n setParticipants(sdk.state.getParticipants());\n };\n\n update();\n\n const unsub = sdk.state.subscribe(\"participants\", update);\n\n return unsub;\n }, [sdk]);\n\n return participants;\n};\n","import { useEffect, useRef, useState } from \"react\";\nimport { useMeetingContext } from \"./MeetingProvider\";\nimport { Participant } from \"../types/meeting\";\n\nexport const useRemoteMedia = (participantId: string) => {\n const { sdk } = useMeetingContext();\n const videoRef = useRef<HTMLVideoElement | null>(null);\n const audioRef = useRef<HTMLAudioElement | null>(null);\n\n const [participant, setParticipant] = useState<Participant | null>(\n () => sdk.state.getParticipant(participantId) || null,\n );\n\n useEffect(() => {\n const unsub = sdk.state.subscribe(`participant:${participantId}`, () => {\n const p = sdk.state.getParticipant(participantId);\n setParticipant(p ? { ...p } : null);\n });\n\n return unsub;\n }, [participantId, sdk]);\n\n useEffect(() => {\n const stream = participant?.media?.stream;\n if (!stream) return;\n\n // VIDEO\n if (videoRef.current) {\n videoRef.current.srcObject = stream;\n videoRef.current.muted = true;\n videoRef.current.playsInline = true;\n videoRef.current.play().catch(() => {});\n }\n\n // AUDIO\n if (audioRef.current) {\n audioRef.current.srcObject = stream;\n audioRef.current.play().catch(() => {});\n }\n }, [participant?.media?.stream]);\n\n return {\n videoRef,\n audioRef,\n isCamActive: !!participant?.media?.camEnabled,\n isMicEnabled: !!participant?.media?.micEnabled,\n };\n};\n","import { useEffect, useState } from \"react\";\nimport { SDK_CONFIG } from \"../config/ws\";\n\ntype LiveRoomState = {\n active: boolean;\n count: number;\n canJoin: boolean;\n approved: boolean;\n isHost: boolean;\n hasMoreParticipants: boolean;\n\n participants: {\n id: string;\n name: string;\n isHost: boolean;\n isPresenter: boolean;\n micEnabled: boolean;\n camEnabled: boolean;\n }[];\n};\n\nexport function useMeetingPreview(roomId: string, userId: string) {\n const [room, setRoom] = useState<LiveRoomState | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [isConnected, setIsConnected] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n if (!roomId || !userId) {\n setIsLoading(false);\n return;\n }\n\n let ws: WebSocket | null = null;\n\n const heartbeat = setInterval(() => {\n if (ws && ws.readyState === WebSocket.OPEN) {\n ws.send(\n JSON.stringify({\n type: \"PING\",\n }),\n );\n }\n }, 20000);\n\n ws = new WebSocket(`${SDK_CONFIG.wsUrl}/watch/${roomId}?user_id=${userId}`);\n\n ws.onopen = () => {\n setIsConnected(true);\n setError(null);\n console.log(\"[Preview] watcher connected\");\n };\n\n ws.onmessage = (event) => {\n try {\n const msg = JSON.parse(event.data);\n if (msg.type !== \"ROOM_PRESENCE_UPDATE\") {\n return;\n }\n setRoom({\n active: msg.active ?? false,\n count: msg.count ?? 0,\n canJoin: msg.canJoin ?? false,\n approved: msg.approved ?? false,\n isHost: msg.isHost ?? false,\n hasMoreParticipants: msg.hasMoreParticipants ?? false,\n participants: msg.participants ?? [],\n });\n // first valid room payload received\n setIsLoading(false);\n } catch (err) {\n console.error(\"Invalid room presence payload\", err);\n setIsLoading(false);\n }\n };\n ws.onerror = () => {\n setError(\"Failed to connect to room monitor\");\n setIsLoading(false);\n };\n ws.onclose = () => {\n setIsConnected(false);\n console.log(\"[Preview] disconnected\");\n };\n return () => {\n clearInterval(heartbeat);\n if (ws) {\n ws.close(1000, \"Leaving preview\");\n }\n };\n }, [roomId, userId]);\n\n return {\n room,\n isConnected,\n isLoading,\n error,\n };\n}\n"],"mappings":"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","names":["useEffect","useRef","useState","useState","useEffect","useRef","useEffect","useEffect","useEffect","useState","useState","useEffect","useEffect","useRef","useState","useRef","useState","useEffect","useEffect","useState","useState","useEffect"]}
|
|
1
|
+
{"version":3,"sources":["../src/react/useLocalParticipant.tsx","../src/react/MeetingProvider.tsx","../src/config/ws.ts","../src/core/MeetingState.ts","../src/core/VideoCore.ts","../src/react/useMeetingStore.ts","../src/react/useMeeting.ts","../src/react/useParticipants.ts","../src/react/useRemoteMedia.ts","../src/react/useMeetingPreview.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useMeetingContext } from \"./MeetingProvider\";\nimport { Participant } from \"../types/meeting\";\n\nexport const useLocalParticipant = () => {\n const { sdk } = useMeetingContext();\n\n // Guard the initial state to ensure it matches Participant | null\n const [localParticipant, setLocalParticipant] = useState<Participant | null>(\n () => {\n const current = sdk.state.localParticipant;\n return current && current.id ? (current as Participant) : null;\n },\n );\n\n useEffect(() => {\n const unsubscribe = sdk.state.subscribe(\"localParticipant\", () => {\n const current = sdk.state.localParticipant;\n\n // Safe Type-Guard: Only update if the object has a finalized id\n if (current && current.id) {\n setLocalParticipant({ ...current } as Participant);\n } else {\n setLocalParticipant(null);\n }\n });\n\n return unsubscribe;\n }, [sdk]);\n\n const lastStreamRef = useRef<MediaStream | null>(null);\n\n const videoRef = useCallback(\n (video: HTMLVideoElement | null) => {\n if (!video) return;\n\n const stream = localParticipant?.media?.stream;\n if (!stream) return;\n\n if (lastStreamRef.current === stream) return;\n lastStreamRef.current = stream;\n\n video.srcObject = stream;\n video.autoplay = true;\n video.playsInline = true;\n\n video.play().catch((err) => {\n console.warn(`Autoplay failed for local view:`, err);\n });\n },\n [localParticipant?.media?.stream],\n );\n\n return {\n participant: localParticipant,\n videoRef,\n };\n};\n","import React, { createContext, useContext, useMemo, useRef } from \"react\";\nimport { VideoSDKCore } from \"../core/VideoCore\";\nimport {\n ChatInput,\n ChatMessage,\n MeetingConfig,\n Participant,\n PubSubTopic,\n} from \"../types/meeting\";\nimport { useMeetingStore } from \"./useMeetingStore\";\n\ntype PubSubHandle = {\n messages: ChatMessage[];\n publish: (input: ChatInput) => void;\n};\n\ntype MeetingContextValue = {\n sdk: VideoSDKCore;\n join: (config?: MeetingConfig) => Promise<void>;\n leave: () => void;\n\n toggleMic: () => void;\n toggleCam: () => void;\n\n startScreenShare: () => Promise<MediaStream>;\n stopScreenShare: () => void;\n\n sendMessage: (input: ChatInput) => void;\n\n room: { id: string | null; name: string | null };\n localParticipant: Participant | null;\n participants: Map<string, Participant>;\n messages: ChatMessage[];\n presenterId: string | null;\n usePubSub: (topic: PubSubTopic) => PubSubHandle;\n approveJoinRequest: (requestId: string) => void;\n rejectJoinRequest: (requestId: string) => void;\n onError: (cb: (err: any) => void) => () => void;\n onEntryRequested: (cb: (req: any) => void) => () => void;\n onEntryResponded: (cb: (payload: any, decision?: any) => void) => () => void;\n onMeetingLeft: (cb: () => void) => () => void;\n};\n\nconst MeetingContext = createContext<MeetingContextValue | null>(null);\n\nexport const MeetingProvider = ({\n config,\n children,\n}: {\n config: MeetingConfig;\n children: React.ReactNode;\n}) => {\n const sdkRef = useRef<VideoSDKCore | null>(null);\n const errorListeners = useRef(new Set<(err: any) => void>());\n const entryRequestListeners = useRef(new Set<(req: any) => void>());\n const entryResponseListeners = useRef(\n new Set<(payload: any, decision?: any) => void>(),\n );\n const meetingLeftListeners = useRef(new Set<() => void>());\n\n if (!sdkRef.current) {\n sdkRef.current = new VideoSDKCore({\n onError: (err) => errorListeners.current.forEach((fn) => fn(err)),\n onEntryRequested: (req) =>\n entryRequestListeners.current.forEach((fn) => fn(req)),\n onEntryResponded: (p, d) =>\n entryResponseListeners.current.forEach((fn) => fn(p, d)),\n onMeetingLeft: () => meetingLeftListeners.current.forEach((fn) => fn()),\n });\n }\n\n const sdk = sdkRef.current;\n const presenterId = useMeetingStore(\n sdk.state,\n \"presenter\",\n (s) => s.presenterId,\n );\n const participants = useMeetingStore(\n sdk.state,\n \"participants\",\n (s) => s.participants,\n );\n const localParticipant = useMeetingStore(\n sdk.state,\n \"localParticipant\",\n (s) => s.localParticipant,\n );\n const messages = useMeetingStore(sdk.state, \"chat\", (s) =>\n s.getChatMessages(),\n );\n\n const value = useMemo<MeetingContextValue>(() => {\n if (!sdkRef.current) {\n sdkRef.current = new VideoSDKCore({\n onError: (err) => {\n errorListeners.current.forEach((fn) => fn(err));\n },\n });\n }\n\n return {\n sdk,\n\n join: (joinConfig?: MeetingConfig) =>\n sdk.joinMeeting({\n ...config,\n ...joinConfig,\n }),\n leave: () => sdk.disconnect(),\n toggleMic: sdk.toggleMic.bind(sdk),\n toggleCam: sdk.toggleCam.bind(sdk),\n startScreenShare: sdk.startScreenShare.bind(sdk),\n stopScreenShare: sdk.stopScreenShare.bind(sdk),\n sendMessage: sdk.sendChatMessage.bind(sdk),\n\n room: sdk.getMeeting(),\n localParticipant,\n participants,\n messages,\n presenterId,\n usePubSub: (topic: PubSubTopic) => {\n if (topic !== \"SECURE_CHAT\") {\n throw new Error(`Unsupported PubSub argument: \"${topic}\"`);\n }\n return {\n messages: sdk.state.getChatMessages(),\n publish: sdk.sendChatMessage.bind(sdk),\n };\n },\n approveJoinRequest: sdk.approveJoinRequest.bind(sdk),\n rejectJoinRequest: sdk.rejectJoinRequest.bind(sdk),\n\n onError: (cb: (err: any) => void) => {\n errorListeners.current.add(cb);\n\n return () => {\n errorListeners.current.delete(cb);\n };\n },\n\n onEntryRequested: (cb: (err: any) => void) => {\n entryRequestListeners.current.add(cb);\n\n return () => {\n entryRequestListeners.current.delete(cb);\n };\n },\n onEntryResponded: (cb: (err: any) => void) => {\n entryResponseListeners.current.add(cb);\n\n return () => {\n entryResponseListeners.current.delete(cb);\n };\n },\n onMeetingLeft: (cb: () => void) => {\n meetingLeftListeners.current.add(cb);\n return () => {\n meetingLeftListeners.current.delete(cb);\n };\n },\n };\n }, [config, sdk, localParticipant, participants, messages, presenterId]);\n\n return (\n <MeetingContext.Provider value={value}>{children}</MeetingContext.Provider>\n );\n};\n\nexport const useMeetingContext = () => {\n const ctx = useContext(MeetingContext);\n if (!ctx)\n throw new Error(\"useMeetingContext must be used inside <MeetingProvider>\");\n return ctx;\n};\n","export const SDK_CONFIG = {\n wsUrl: \"wss://sfuserver-production.up.railway.app/ws\",\n baseUrl: \"https://sfuserver-production.up.railway.app\",\n};\n","import {\n ChatMessage,\n Listener,\n Participant,\n ParticipantMedia,\n StateScope,\n} from \"../types/meeting\";\n\ntype LocalParticipantPatch = {\n id?: string;\n name?: string;\n media?: Partial<ParticipantMedia>;\n};\n\nexport class MeetingState {\n participants = new Map<string, Participant>();\n localParticipant: Participant | null = null;\n localStream: MediaStream | null = null;\n chatMessages = new Map<string, ChatMessage>();\n presenterId: string | null = null;\n\n private listeners = new Map<StateScope, Set<Listener>>();\n\n // ---- reactive system ----\n\n subscribe(scope: StateScope, fn: Listener): () => void {\n if (!this.listeners.has(scope)) {\n this.listeners.set(scope, new Set());\n }\n this.listeners.get(scope)!.add(fn);\n\n return () => {\n this.listeners.get(scope)?.delete(fn);\n };\n }\n\n notify(scope: StateScope) {\n this.listeners.get(scope)?.forEach((fn) => fn());\n }\n\n setPresenterId(id: string | null) {\n if (this.presenterId === id) return;\n this.presenterId = id;\n this.notify(\"presenter\");\n this.notify(\"participants\");\n }\n\n // ---- participants ----\n\n addParticipant(p: Participant) {\n if (this.participants.has(p.id)) return false;\n // Fix: Immutable Map update\n const next = new Map(this.participants);\n next.set(p.id, p);\n this.participants = next;\n\n this.notify(\"participants\");\n return true;\n }\n\n removeParticipant(id: string) {\n // Fix: Immutable Map update\n const next = new Map(this.participants);\n next.delete(id);\n this.participants = next;\n\n this.notify(\"participants\");\n }\n\n updateParticipantMedia(\n id: string,\n patch: Partial<NonNullable<Participant[\"media\"]>>,\n ) {\n const p = this.participants.get(id);\n if (!p) return;\n\n const updated: Participant = {\n ...p,\n media: {\n stream: null,\n screenStream: undefined,\n cameraTrack: undefined,\n screenTrack: undefined,\n audioTrack: undefined,\n micEnabled: true,\n camEnabled: true,\n isScreenSharing: false,\n ...p.media,\n ...patch,\n },\n };\n\n // Keep your clean immutable map update\n const next = new Map(this.participants);\n next.set(id, updated);\n this.participants = next;\n\n this.notify(`participant:${id}`);\n this.notify(\"participants\");\n }\n\n updateLocalParticipant(patch: LocalParticipantPatch) {\n const prev = this.localParticipant;\n\n if (!prev) {\n this.localParticipant = {\n id: patch.id ?? \"\",\n name: patch.name ?? \"\",\n media: {\n stream: patch.media?.stream ?? null, // ◄ FIX: Capture the stream from the patch here\n screenStream: patch.media?.screenStream,\n cameraTrack: patch.media?.cameraTrack,\n screenTrack: patch.media?.screenTrack,\n audioTrack: patch.media?.audioTrack,\n micEnabled: patch.media?.micEnabled ?? true,\n camEnabled: patch.media?.camEnabled ?? true,\n isScreenSharing: patch.media?.isScreenSharing ?? false,\n },\n };\n\n this.notify(\"localParticipant\");\n return;\n }\n\n const prevMedia = prev.media ?? {\n stream: null,\n screenStream: undefined,\n cameraTrack: undefined,\n screenTrack: undefined,\n audioTrack: undefined,\n micEnabled: true,\n camEnabled: true,\n isScreenSharing: false,\n };\n\n const nextMedia: ParticipantMedia = {\n stream: patch.media?.stream ?? prevMedia.stream,\n screenStream: patch.media?.screenStream ?? prevMedia.screenStream,\n cameraTrack: patch.media?.cameraTrack ?? prevMedia.cameraTrack,\n screenTrack: patch.media?.screenTrack ?? prevMedia.screenTrack,\n audioTrack: patch.media?.audioTrack ?? prevMedia.audioTrack,\n micEnabled: patch.media?.micEnabled ?? prevMedia.micEnabled,\n camEnabled: patch.media?.camEnabled ?? prevMedia.camEnabled,\n isScreenSharing:\n patch.media?.isScreenSharing ?? prevMedia.isScreenSharing,\n };\n\n this.localParticipant = {\n ...prev,\n id: patch.id ?? prev.id,\n name: patch.name ?? prev.name,\n media: nextMedia,\n };\n\n this.notify(\"localParticipant\");\n }\n\n // ---- chat ----\n\n addChatMessage(msg: ChatMessage) {\n this.chatMessages.set(msg.id, msg);\n this.notify(\"chat\");\n }\n\n getChatMessages() {\n return Array.from(this.chatMessages.values()).sort(\n (a, b) => a.timestamp - b.timestamp,\n );\n }\n\n clearChat() {\n this.chatMessages.clear();\n this.notify(\"chat\");\n }\n\n // ---- helpers ----\n\n getParticipants() {\n return Array.from(this.participants.values());\n }\n\n getParticipant(id: string) {\n return this.participants.get(id) ?? null;\n }\n\n resetRemoteState() {\n this.participants.clear();\n this.chatMessages.clear();\n this.presenterId = null;\n this.notify(\"participants\");\n this.notify(\"chat\");\n this.notify(\"presenter\");\n }\n}\n","import { SDK_CONFIG } from \"../config/ws\";\nimport {\n ChatInput,\n ChatMessage,\n Events,\n MeetingConfig,\n Participant,\n SDKError,\n TrackDescriptor,\n} from \"../types/meeting\";\nimport { MeetingState } from \"./MeetingState\";\n\nexport class VideoSDKCore {\n private ws: WebSocket | null = null;\n private pubPC: RTCPeerConnection | null = null;\n private subPC: RTCPeerConnection | null = null;\n private pendingTracks = new Map<string, TrackDescriptor>();\n\n private subscriberNegotiating = false;\n private subscriberOfferQueue: any[] = [];\n\n private iceServers: RTCIceServer[] = [];\n private lastPong = Date.now();\n private intentionalDisconnect = false;\n private myId: string;\n private room: { id: string | null; name: string | null } = {\n id: null,\n name: null,\n };\n\n private localStream: MediaStream | null = null;\n private screenStream: MediaStream | null = null;\n private screenSender: RTCRtpSender | null = null;\n private isScreenSharing = false;\n\n private pingInterval: any = null;\n private reconnectAttempts = 0;\n private reconnectTimer?: number;\n private participantName = \"\";\n public readonly state: MeetingState;\n\n private joinResolver?: () => void;\n private joinRejecter?: (e: any) => void;\n private isWaitingForApproval = false;\n private pendingRequestId: string | null = null;\n private iceTransportPolicy: RTCIceTransportPolicy = \"all\";\n\n constructor(\n private events: Events = {},\n private url: string = SDK_CONFIG.wsUrl,\n ) {\n this.state = new MeetingState();\n this.events = events;\n this.url = url;\n this.myId = localStorage.getItem(\"vsdk_id\") || crypto.randomUUID();\n localStorage.setItem(\"vsdk_id\", this.myId);\n }\n\n private async acquireLocalMedia(options: {\n videoConstraints?: boolean | MediaTrackConstraints;\n audioConstraints?: boolean | MediaTrackConstraints;\n }): Promise<{\n stream: MediaStream;\n camEnabled: boolean;\n micEnabled: boolean;\n }> {\n const { videoConstraints = true, audioConstraints = true } = options;\n\n // 1. Primary Attempt: Both Video and Audio\n try {\n const stream = await navigator.mediaDevices.getUserMedia({\n video: videoConstraints,\n audio: audioConstraints,\n });\n\n const hasVideo = stream\n .getVideoTracks()\n .some((t) => t.readyState === \"live\");\n const hasAudio = stream\n .getAudioTracks()\n .some((t) => t.readyState === \"live\");\n\n return { stream, camEnabled: hasVideo, micEnabled: hasAudio };\n } catch (err: any) {\n console.warn(\n \"[VideoSDKCore] Primary getUserMedia failed:\",\n err?.name || err?.message,\n );\n\n // Check if camera is locked by another process (Chrome/Edge/Discord/etc.)\n const isDeviceLocked =\n err?.name === \"NotReadableError\" ||\n err?.name === \"TrackStartError\" ||\n err?.message?.toLowerCase().includes(\"allocate videosource\") ||\n err?.message?.toLowerCase().includes(\"could not start video source\");\n\n if (isDeviceLocked) {\n console.warn(\n \"[VideoSDKCore] Camera is locked by another browser/app. Falling back to Audio-Only.\",\n );\n\n // 2. Fallback: Audio Only\n try {\n const audioOnlyStream = await navigator.mediaDevices.getUserMedia({\n video: false,\n audio: audioConstraints,\n });\n\n return {\n stream: audioOnlyStream,\n camEnabled: false,\n micEnabled: audioOnlyStream\n .getAudioTracks()\n .some((t) => t.readyState === \"live\"),\n };\n } catch (audioErr: any) {\n console.warn(\n \"[VideoSDKCore] Audio acquisition also failed. Falling back to View-Only stream.\",\n );\n }\n }\n\n // 3. Last Resort Fallback: View-Only (empty stream) to allow room join\n return {\n stream: new MediaStream(),\n camEnabled: false,\n micEnabled: false,\n };\n }\n }\n\n // ---------------- MEDIA SETUP ----------------\n async initLocal(video: HTMLVideoElement, name: string) {\n this.participantName = name;\n try {\n const { stream, camEnabled, micEnabled } = await this.acquireLocalMedia({\n videoConstraints: { width: { ideal: 1280 }, height: { ideal: 720 } },\n audioConstraints: {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n },\n });\n\n this.localStream = stream;\n console.log(\n \"[LOCAL MEDIA]\",\n this.localStream.getTracks().map((t) => ({\n kind: t.kind,\n enabled: t.enabled,\n ready: t.readyState,\n })),\n );\n\n if (video && this.localStream.getVideoTracks().length > 0) {\n video.srcObject = this.localStream;\n }\n\n const cameraTrack = this.localStream.getVideoTracks()[0] || undefined;\n const audioTrack = this.localStream.getAudioTracks()[0] || undefined;\n\n this.state.updateLocalParticipant({\n id: this.myId,\n name: this.participantName,\n media: {\n stream: this.localStream,\n cameraTrack,\n audioTrack,\n micEnabled,\n camEnabled,\n isScreenSharing: false,\n },\n });\n\n this.state.localStream = this.localStream;\n } catch (err: any) {\n this.emitError(\"GET_USER_MEDIA_FAILED\", err?.message, err, false);\n throw err;\n }\n }\n\n async joinMeeting(config: MeetingConfig) {\n const { roomId, name, audioMuted = false, videoMuted = false } = config;\n if (!roomId || !name) {\n throw new Error(\"roomId and name are required to join meeting\");\n }\n this.participantName = name;\n\n let camEnabled = !videoMuted;\n let micEnabled = !audioMuted;\n\n if (!this.localStream) {\n const acquired = await this.acquireLocalMedia({\n videoConstraints: !videoMuted,\n audioConstraints: !audioMuted,\n });\n\n this.localStream = acquired.stream;\n console.log(\n \"[LOCAL MEDIA]\",\n this.localStream.getTracks().map((t) => ({\n kind: t.kind,\n enabled: t.enabled,\n ready: t.readyState,\n })),\n );\n camEnabled = acquired.camEnabled && !videoMuted;\n micEnabled = acquired.micEnabled && !audioMuted;\n }\n\n // Apply track state safely without throws\n this.localStream.getAudioTracks().forEach((t) => (t.enabled = micEnabled));\n this.localStream.getVideoTracks().forEach((t) => (t.enabled = camEnabled));\n\n const cameraTrack = this.localStream.getVideoTracks()[0] || undefined;\n const audioTrack = this.localStream.getAudioTracks()[0] || undefined;\n\n this.state.updateLocalParticipant({\n id: this.myId,\n name: this.participantName,\n media: {\n stream: this.localStream,\n cameraTrack,\n audioTrack,\n micEnabled,\n camEnabled,\n isScreenSharing: false,\n },\n });\n\n this.state.localStream = this.localStream;\n await this.connect(roomId, name);\n }\n // ---------------- SFU PEER CONNECTION CREATION ----------------\n private setupPublisherPC() {\n if (!this.localStream) return;\n\n this.pubPC = new RTCPeerConnection({\n iceServers: this.iceServers,\n iceTransportPolicy: this.iceTransportPolicy,\n });\n\n // ✅ FIX: Add ALL tracks INCLUDING muted ones\n // Map to track all track types we need to include\n const tracksByKind = new Map<string, MediaStreamTrack>();\n\n this.localStream.getTracks().forEach((track) => {\n tracksByKind.set(track.kind, track);\n });\n\n // Ensure we have both audio and video tracks even if disabled\n // Audio is usually present\n const audioTrack = this.localStream.getAudioTracks()[0];\n if (audioTrack) {\n console.log(\"[Publisher] Adding audio track:\", {\n kind: audioTrack.kind,\n id: audioTrack.id,\n enabled: audioTrack.enabled,\n state: audioTrack.readyState,\n });\n\n try {\n this.pubPC?.addTrack(audioTrack, this.localStream!);\n } catch (e) {\n console.error(\"[Publisher] Failed to add audio track:\", e);\n }\n }\n\n // Video might be muted initially - still add it!\n const videoTrack = this.localStream.getVideoTracks()[0];\n if (videoTrack) {\n console.log(\"[Publisher] Adding video track:\", {\n kind: videoTrack.kind,\n id: videoTrack.id,\n enabled: videoTrack.enabled, // Can be false, that's OK\n state: videoTrack.readyState,\n });\n\n try {\n this.pubPC?.addTrack(videoTrack, this.localStream!);\n } catch (e) {\n console.error(\"[Publisher] Failed to add video track:\", e);\n }\n }\n\n // Rest of setup...\n this.pubPC.onicecandidate = (e) => {\n if (e.candidate) {\n this.send({\n type: \"PUB_ICE\",\n payload: JSON.stringify(e.candidate),\n user_id: this.myId,\n });\n }\n };\n\n this.pubPC.onconnectionstatechange = () => {\n console.log(\"[Publisher PC State]\", {\n connection: this.pubPC?.connectionState,\n ice: this.pubPC?.iceConnectionState,\n signaling: this.pubPC?.signalingState,\n });\n\n if (this.pubPC?.connectionState === \"failed\") {\n console.warn(\"[Publisher] Connection failed, restarting ICE\");\n this.restartPublisherIce();\n }\n };\n }\n\n private setupSubscriberPC() {\n this.subPC = new RTCPeerConnection({\n iceServers: this.iceServers,\n iceTransportPolicy: this.iceTransportPolicy,\n });\n\n this.subPC.onicecandidate = (e) => {\n if (e.candidate) {\n this.send({\n type: \"SUB_ICE\",\n payload: JSON.stringify(e.candidate),\n user_id: this.myId,\n });\n }\n };\n\n this.subPC.ontrack = (event) => {\n console.log(\"[SFU ontrack Event]\", {\n kind: event.track.kind,\n id: event.track.id,\n mid: event.transceiver.mid,\n streams: event.streams.length,\n });\n\n const stream = event.streams[0] || new MediaStream([event.track]);\n const mid = event.transceiver.mid;\n\n if (!mid) {\n console.warn(\"[Subscriber] Track received without MID\", event.track);\n return;\n }\n\n console.log(\"[Subscriber] Looking for descriptor with MID:\", mid, {\n available: [...this.pendingTracks.keys()],\n });\n\n const descriptor = this.pendingTracks.get(mid);\n\n if (!descriptor) {\n console.warn(\"[Subscriber] No descriptor found for MID:\", mid);\n console.log(\"[Subscriber] Pending tracks:\", [\n ...this.pendingTracks.entries(),\n ]);\n return;\n }\n\n console.log(\"[Subscriber] Found descriptor:\", descriptor);\n this.pendingTracks.delete(mid);\n\n switch (descriptor.source) {\n case \"camera\":\n console.log(\n \"[Subscriber] Updating camera for:\",\n descriptor.publisher_id,\n );\n this.state.updateParticipantMedia(descriptor.publisher_id, {\n stream,\n cameraTrack: event.track,\n });\n break;\n case \"audio\":\n console.log(\n \"[Subscriber] Updating audio for:\",\n descriptor.publisher_id,\n );\n this.state.updateParticipantMedia(descriptor.publisher_id, {\n stream,\n audioTrack: event.track,\n });\n break;\n case \"screen\":\n console.log(\n \"[Subscriber] Updating screen for:\",\n descriptor.publisher_id,\n );\n this.state.updateParticipantMedia(descriptor.publisher_id, {\n screenStream: stream,\n screenTrack: event.track,\n isScreenSharing: true,\n });\n break;\n }\n };\n\n this.subPC.onconnectionstatechange = () => {\n console.log(\"[SFU Subscriber PC State]\", this.subPC?.connectionState);\n\n if (this.subPC?.connectionState === \"failed\") {\n console.warn(\"Subscriber connection failed\");\n }\n };\n }\n\n // ---------------- WEBSOCKET CONNECTION & SIGNALING ----------------\n async connect(roomId: string, name: string) {\n this.room.id = roomId;\n this.reset();\n\n return new Promise<void>((resolve, reject) => {\n this.joinResolver = resolve;\n this.joinRejecter = reject;\n this.ws = new WebSocket(this.url);\n\n this.ws.onopen = () => {\n console.log(\"WebSocket connected to SFU, sending JOIN...\");\n const micEnabled = !!this.state.localParticipant?.media?.micEnabled;\n const camEnabled = !!this.state.localParticipant?.media?.camEnabled;\n\n this.send({\n type: \"JOIN\",\n room_id: roomId,\n user_id: this.myId,\n sender_name: name,\n camera_stream_id: this.localStream?.id.replace(/[{}]/g, \"\"),\n audio_muted: !micEnabled,\n video_muted: !camEnabled,\n });\n };\n\n this.ws.onerror = (err) => {\n this.emitError(\"WS_ERROR\", \"WebSocket encountered an error\", err, true);\n };\n\n this.ws.onclose = (e) => {\n this.joinRejecter?.({\n code: \"WS_CLOSED\",\n message: \"Connection closed before join completed\",\n raw: e,\n });\n this.joinRejecter = undefined;\n\n if (\n this.intentionalDisconnect ||\n e.code === 1000 ||\n e.code === 1001 ||\n this.isWaitingForApproval\n ) {\n return;\n }\n this.scheduleReconnect();\n };\n\n this.ws.onmessage = async (e) => {\n await this.handle(JSON.parse(e.data));\n };\n });\n }\n\n private async handle(msg: any) {\n if (msg.sender === this.myId) return;\n\n switch (msg.type) {\n case \"PONG\":\n this.lastPong = Date.now();\n break;\n\n case \"JOINED\": {\n if (msg.iceServers) {\n this.iceServers = msg.iceServers;\n }\n this.room.name = msg.room_name;\n\n this.isWaitingForApproval = false;\n this.pendingRequestId = null;\n this.intentionalDisconnect = false;\n this.reconnectAttempts = 0;\n\n this.setupPublisherPC();\n this.setupSubscriberPC();\n\n await this.createPublisherOffer();\n\n const media = this.state.localParticipant?.media;\n\n if (media) {\n this.send({\n type: \"MEDIA_STATE\",\n kind: \"audio\",\n enabled: !!media.micEnabled,\n });\n\n this.send({\n type: \"MEDIA_STATE\",\n kind: \"video\",\n enabled: !!media.camEnabled,\n });\n }\n\n this.startHeartbeat();\n this.joinResolver?.();\n this.joinResolver = undefined;\n this.joinRejecter = undefined;\n break;\n }\n\n case \"PUB_ANSWER\": {\n if (this.pubPC) {\n await this.pubPC.setRemoteDescription({\n type: \"answer\",\n sdp: msg.payload,\n });\n }\n break;\n }\n\n case \"SUB_OFFER\": {\n if (!this.subPC) {\n console.warn(\"Subscriber PC not ready\");\n return;\n }\n\n const descriptor: TrackDescriptor = msg.track;\n const mid = descriptor.mid;\n\n console.log(\n \"[Signaling] Received SUB_OFFER with descriptor:\",\n descriptor,\n );\n\n if (mid) {\n this.pendingTracks.set(mid, descriptor);\n console.log(\"[Signaling] Stored pending track for MID:\", mid);\n }\n\n if (this.subscriberNegotiating) {\n console.warn(\"Subscriber negotiating, queueing offer\");\n this.subscriberOfferQueue.push(msg);\n return;\n }\n\n await this.handleSubscriberOffer(msg);\n break;\n }\n\n case \"PUB_ICE\": {\n if (this.pubPC && msg.payload) {\n await this.pubPC\n .addIceCandidate(JSON.parse(msg.payload))\n .catch(console.warn);\n }\n break;\n }\n\n case \"SUB_ICE\": {\n if (this.subPC && msg.payload) {\n await this.subPC\n .addIceCandidate(JSON.parse(msg.payload))\n .catch(console.warn);\n }\n break;\n }\n\n case \"EXISTING_USERS\": {\n if (msg.presenterId) {\n this.state.setPresenterId(msg.presenterId);\n }\n\n for (const p of msg.participants || []) {\n if (!p?.id || p.id === this.myId) continue;\n const structuredParticipant: Participant = {\n id: p.id,\n name: p.name,\n isHost: p.isHost,\n isPresenter: p.isPresenter,\n media: {\n stream: null,\n screenStream: undefined,\n micEnabled: p.micEnabled ?? true,\n camEnabled: p.camEnabled ?? true,\n isScreenSharing: p.isScreenSharing ?? false,\n remoteScreenStreamId: p.remoteScreenStreamId || undefined,\n cameraStreamId: p.cameraId || undefined,\n },\n };\n this.state.addParticipant(structuredParticipant);\n this.events.onUserJoined?.(structuredParticipant);\n }\n break;\n }\n\n case \"USER_JOINED\": {\n const p = msg.participant;\n if (!p?.id || p.id === this.myId) return;\n this.state.addParticipant(p);\n this.events.onUserJoined?.(p);\n break;\n }\n\n case \"USER_LEFT\": {\n const peerId = msg.participant.id;\n this.state.removeParticipant(peerId);\n this.events.onUserLeft?.(peerId);\n break;\n }\n\n case \"MEDIA_STATE_CHANGE\": {\n const peerId = msg.peerId;\n const { kind, enabled } = msg;\n\n if (kind === \"audio\") {\n this.state.updateParticipantMedia(peerId, { micEnabled: enabled });\n this.events.onMicToggled?.(peerId, enabled);\n } else if (kind === \"video\") {\n this.state.updateParticipantMedia(peerId, { camEnabled: enabled });\n this.events.onCamToggled?.(peerId, enabled);\n }\n break;\n }\n\n case \"SCREEN_SHARE_START\": {\n const peerId = msg.peerId;\n this.state.updateParticipantMedia(peerId, {\n isScreenSharing: true,\n remoteScreenStreamId: msg.stream_id,\n cameraStreamId: msg?.camera_stream_id,\n });\n\n if (!this.state.presenterId) {\n this.state.setPresenterId(peerId);\n }\n break;\n }\n\n case \"SCREEN_SHARE_STOP\": {\n const peerId = msg.peerId;\n this.state.updateParticipantMedia(peerId, { isScreenSharing: false });\n if (this.state.presenterId === peerId) {\n this.state.setPresenterId(null);\n }\n this.events.onScreenShareStopped?.(peerId);\n break;\n }\n\n case \"CHAT_MESSAGE\": {\n const newMsg = msg.data;\n if (newMsg.sender_id === this.myId) break;\n this.state.addChatMessage({\n id: newMsg.id,\n text: newMsg.message,\n sender_id: newMsg.sender_id,\n sender_name: newMsg.sender_name,\n timestamp: new Date(newMsg.timestamp).getTime(),\n target: newMsg.target,\n });\n this.events.onChatMessage?.(msg);\n break;\n }\n\n case \"JOIN_PENDING\": {\n const req = msg.request;\n this.isWaitingForApproval = true;\n this.pendingRequestId = req.request_id;\n this.events.onEntryRequested?.({\n requestId: req.request_id,\n userId: req.user_id,\n name: req.name,\n });\n break;\n }\n\n case \"JOIN_APPROVED\": {\n this.isWaitingForApproval = false;\n this.pendingRequestId = null;\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.send({\n type: \"JOIN\",\n room_id: this.room.id,\n user_id: this.myId,\n sender_name: this.participantName,\n });\n }\n break;\n }\n\n case \"JOIN_REJECTED\": {\n this.isWaitingForApproval = false;\n this.pendingRequestId = null;\n this.events.onEntryResponded?.({\n participantId: msg.user_id,\n decision: \"rejected\",\n });\n break;\n }\n\n case \"ERROR\": {\n const fatal = msg?.fatal === true;\n this.emitError(\n \"WS_ERROR\",\n msg?.message || \"Unknown error\",\n msg,\n !fatal,\n );\n if (fatal) this.disconnect();\n return;\n }\n }\n }\n\n private async handleSubscriberOffer(msg: any) {\n if (!this.subPC) return;\n\n try {\n this.subscriberNegotiating = true;\n\n await this.subPC.setRemoteDescription({\n type: \"offer\",\n sdp: msg.payload,\n });\n\n const answer = await this.subPC.createAnswer();\n\n await this.subPC.setLocalDescription(answer);\n\n this.send({\n type: \"SUB_ANSWER\",\n payload: answer.sdp,\n user_id: this.myId,\n });\n } catch (err) {\n console.error(\"[SUB OFFER ERROR]\", err);\n } finally {\n this.subscriberNegotiating = false;\n\n const next = this.subscriberOfferQueue.shift();\n\n if (next) {\n await this.handleSubscriberOffer(next);\n }\n }\n }\n // ---------------- PUBLISHER RENEGOTIATION ----------------\n private async createPublisherOffer() {\n if (!this.pubPC) return;\n\n try {\n const offer = await this.pubPC.createOffer();\n await this.pubPC.setLocalDescription(offer);\n\n this.send({\n type: \"PUB_OFFER\",\n payload: offer.sdp,\n user_id: this.myId,\n room_id: this.room.id,\n });\n } catch (err) {\n console.error(\"[SFU Publisher Offer Error]\", err);\n }\n }\n\n // ---------------- MEDIA TOGGLES ----------------\n toggleMic() {\n const mediaState = this.state.localParticipant?.media;\n if (!mediaState) return;\n\n const nextEnabled = !mediaState.micEnabled;\n this.localStream\n ?.getAudioTracks()\n .forEach((t) => (t.enabled = nextEnabled));\n\n this.state.updateLocalParticipant({\n id: this.myId,\n name: this.participantName,\n media: { ...mediaState, micEnabled: nextEnabled },\n });\n\n this.send({ type: \"MEDIA_STATE\", kind: \"audio\", enabled: nextEnabled });\n }\n\n toggleCam() {\n const mediaState = this.state.localParticipant?.media;\n if (!mediaState) return;\n\n const nextEnabled = !mediaState.camEnabled;\n this.localStream\n ?.getVideoTracks()\n .forEach((t) => (t.enabled = nextEnabled));\n\n this.state.updateLocalParticipant({\n id: this.myId,\n name: this.participantName,\n media: { ...mediaState, camEnabled: nextEnabled },\n });\n\n this.send({ type: \"MEDIA_STATE\", kind: \"video\", enabled: nextEnabled });\n }\n\n // ---------------- SCREEN SHARING (SFU) ----------------\n async startScreenShare() {\n try {\n if (this.state.presenterId && this.state.presenterId !== this.myId) {\n throw new Error(\"Another user is already sharing their screen.\");\n }\n\n this.screenStream = await navigator.mediaDevices.getDisplayMedia({\n video: true,\n });\n this.isScreenSharing = true;\n\n const screenTrack = this.screenStream.getVideoTracks()[0];\n Object.defineProperty(screenTrack, \"contentHint\", {\n value: \"detail\",\n });\n if (this.pubPC) {\n this.screenSender = this.pubPC.addTrack(screenTrack, this.screenStream);\n await this.createPublisherOffer();\n }\n\n this.state.updateLocalParticipant({\n media: {\n isScreenSharing: true,\n screenStream: this.screenStream,\n screenTrack,\n },\n });\n\n this.state.setPresenterId(this.myId);\n\n screenTrack.onended = () => {\n this.stopScreenShare();\n };\n\n this.send({\n type: \"SCREEN_SHARE_START\",\n sender: this.myId,\n room_id: this.room.id,\n stream_id: this.screenStream.id.replace(/[{}]/g, \"\"),\n });\n\n return this.screenStream;\n } catch (err: any) {\n this.emitError(\n \"SCREEN_SHARE_FAILED\",\n err?.message || \"Failed screen share\",\n err,\n true,\n );\n this.isScreenSharing = false;\n this.screenStream = null;\n throw err;\n }\n }\n\n async stopScreenShare() {\n if (!this.screenStream) return;\n\n this.screenStream.getTracks().forEach((t) => t.stop());\n\n if (this.pubPC && this.screenSender) {\n this.pubPC.removeTrack(this.screenSender);\n this.screenSender = null;\n await this.createPublisherOffer();\n }\n\n this.screenStream = null;\n this.isScreenSharing = false;\n\n this.state.updateLocalParticipant({\n media: {\n isScreenSharing: false,\n screenStream: null,\n screenTrack: undefined,\n },\n });\n\n if (this.state.presenterId === this.myId) {\n this.state.setPresenterId(null);\n }\n\n this.send({\n type: \"SCREEN_SHARE_STOP\",\n sender: this.myId,\n room_id: this.room.id,\n });\n }\n\n // ---------------- CHAT & RECONNECT ----------------\n sendChatMessage(payload: ChatInput) {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN || !this.room.id)\n return;\n\n const isPrivate = !!payload?.target;\n const senderName = this.state.localParticipant?.name || \"Anonymous\";\n\n const msg: ChatMessage = {\n id: crypto.randomUUID(),\n sender_id: this.myId,\n sender_name: senderName,\n text: payload.message.trim(),\n timestamp: Date.now(),\n reply_to: payload.reply_to ?? null,\n target: payload.target ?? null,\n };\n\n this.state.addChatMessage(msg);\n\n this.send({\n type: \"CHAT_MESSAGE\",\n message: payload.message.trim(),\n user_id: this.myId,\n sender_name: senderName,\n room_id: this.room.id,\n target: isPrivate ? (payload.target ?? null) : null,\n reply_to: payload.reply_to ?? null,\n client_ts: Date.now(),\n });\n }\n\n private scheduleReconnect() {\n if (!this.room.id) return;\n const delay = Math.min(1000 * Math.pow(2, this.reconnectAttempts), 30000);\n window.clearTimeout(this.reconnectTimer);\n this.reconnectTimer = window.setTimeout(async () => {\n try {\n await this.connect(this.room.id!, this.participantName);\n this.reconnectAttempts = 0;\n } catch {\n this.reconnectAttempts++;\n this.scheduleReconnect();\n }\n }, delay);\n }\n\n private startHeartbeat() {\n this.stopHeartbeat();\n this.pingInterval = setInterval(() => {\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.send({ type: \"PING\", client_ts: Date.now() });\n }\n }, 20000);\n }\n\n private stopHeartbeat() {\n if (this.pingInterval) {\n clearInterval(this.pingInterval);\n this.pingInterval = null;\n }\n }\n\n private reset() {\n this.pubPC?.close();\n this.subPC?.close();\n this.pubPC = null;\n this.subPC = null;\n this.state.resetRemoteState();\n }\n\n disconnect() {\n this.intentionalDisconnect = true;\n\n this.stopScreenShare();\n\n this.pubPC?.close();\n this.subPC?.close();\n this.pubPC = null;\n this.subPC = null;\n\n this.stopHeartbeat();\n\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.send({\n type: \"LEAVE\",\n room_id: this.room.id,\n user_id: this.myId,\n sender_name: this.state.localParticipant?.name,\n });\n\n setTimeout(() => {\n this.ws?.close(1000, \"Leaving meeting\");\n this.ws = null;\n }, 50);\n }\n\n if (this.localStream) {\n this.localStream.getTracks().forEach((track) => track.stop());\n this.localStream = null;\n }\n\n this.room.id = null;\n this.state.localParticipant = null;\n this.state.notify(\"localParticipant\");\n this.state.participants.clear();\n this.state.notify(\"participants\");\n this.events.onMeetingLeft?.();\n this.state.clearChat();\n this.state.setPresenterId(null);\n }\n\n private async restartPublisherIce() {\n if (!this.pubPC) return;\n try {\n this.pubPC.restartIce();\n await this.createPublisherOffer();\n } catch (err) {\n console.error(\"[Publisher ICE Restart Failed]\", err);\n }\n }\n\n private emitError(\n code: string,\n message: string,\n raw?: any,\n recoverable = true,\n ) {\n const err: SDKError = {\n code,\n message,\n raw,\n roomId: this.room.id,\n userId: this.myId,\n recoverable,\n };\n this.events.onError?.(err);\n this.joinRejecter?.(err);\n this.joinRejecter = undefined;\n console.error(\"[MeetingSDK Error]\", err);\n }\n\n private send(msg: any) {\n this.ws?.send(JSON.stringify(msg));\n }\n\n approveJoinRequest(requestId: string) {\n this.send({ type: \"JOIN_APPROVE\", request_id: requestId });\n }\n\n rejectJoinRequest(requestId: string) {\n this.send({ type: \"JOIN_REJECT\", request_id: requestId });\n }\n\n getMeeting(): { id: string | null; name: string | null } {\n return this.room;\n }\n}\n","import { useEffect, useState } from \"react\";\nimport { StateScope } from \"../types/meeting\";\nimport { MeetingState } from \"../core/MeetingState\";\n\nexport function useMeetingStore<T>(\n stateManager: MeetingState,\n scope: StateScope,\n selector: (state: MeetingState) => T,\n): T {\n const [state, setState] = useState(() => selector(stateManager));\n\n useEffect(() => {\n // Update local react state whenever the SDK notifies this scope\n const unsubscribe = stateManager.subscribe(scope, () => {\n setState(selector(stateManager));\n });\n\n return unsubscribe;\n }, [stateManager, scope, selector]);\n\n return state;\n}\n","import { useEffect } from \"react\";\nimport { useMeetingContext } from \"./MeetingProvider\";\n\nexport const useMeeting = (handlers?: {\n onError?: (err: any) => void;\n onEntryRequested?: (req: any) => void;\n onEntryResponded?: (payload: any, decision?: any) => void;\n onMeetingLeft?: () => void;\n}) => {\n const ctx = useMeetingContext();\n\n // Error Handler\n useEffect(() => {\n if (!handlers?.onError) return;\n return ctx.onError(handlers.onError);\n }, [handlers?.onError]);\n\n // Entry Request Handler\n useEffect(() => {\n if (!handlers?.onEntryRequested) return;\n return ctx.onEntryRequested(handlers.onEntryRequested);\n }, [handlers?.onEntryRequested]);\n\n // Entry Response Handler\n useEffect(() => {\n if (!handlers?.onEntryResponded) return;\n return ctx.onEntryResponded(handlers.onEntryResponded);\n }, [handlers?.onEntryResponded]);\n\n // Meeting Left Handler\n useEffect(() => {\n if (!handlers?.onMeetingLeft) return;\n return ctx.onMeetingLeft(handlers.onMeetingLeft);\n }, [handlers?.onMeetingLeft]);\n\n const { sdk: _, ...publicApi } = ctx;\n return publicApi;\n};\n","import { useEffect, useState } from \"react\";\nimport { useMeetingContext } from \"./MeetingProvider\";\nimport { Participant } from \"../types/meeting\";\n\nexport const useParticipants = () => {\n const { sdk } = useMeetingContext();\n\n const [participants, setParticipants] = useState<Participant[]>(() =>\n sdk.state.getParticipants(),\n );\n\n useEffect(() => {\n const update = () => {\n setParticipants(sdk.state.getParticipants());\n };\n\n update();\n\n const unsub = sdk.state.subscribe(\"participants\", update);\n\n return unsub;\n }, [sdk]);\n\n return participants;\n};\n","import { useEffect, useRef, useState } from \"react\";\nimport { useMeetingContext } from \"./MeetingProvider\";\nimport { Participant } from \"../types/meeting\";\n\nexport const useRemoteMedia = (participantId: string) => {\n const { sdk } = useMeetingContext();\n const videoRef = useRef<HTMLVideoElement | null>(null);\n const audioRef = useRef<HTMLAudioElement | null>(null);\n\n const [participant, setParticipant] = useState<Participant | null>(\n () => sdk.state.getParticipant(participantId) || null,\n );\n\n useEffect(() => {\n const unsub = sdk.state.subscribe(`participant:${participantId}`, () => {\n const p = sdk.state.getParticipant(participantId);\n setParticipant(p ? { ...p } : null);\n });\n\n return unsub;\n }, [participantId, sdk]);\n\n useEffect(() => {\n const stream = participant?.media?.stream;\n if (!stream) return;\n\n // VIDEO\n if (videoRef.current) {\n videoRef.current.srcObject = stream;\n videoRef.current.muted = true;\n videoRef.current.playsInline = true;\n videoRef.current.play().catch(() => {});\n }\n\n // AUDIO\n if (audioRef.current) {\n audioRef.current.srcObject = stream;\n audioRef.current.play().catch(() => {});\n }\n }, [participant?.media?.stream]);\n\n return {\n videoRef,\n audioRef,\n isCamActive: !!participant?.media?.camEnabled,\n isMicEnabled: !!participant?.media?.micEnabled,\n };\n};\n","import { useEffect, useState } from \"react\";\nimport { SDK_CONFIG } from \"../config/ws\";\n\ntype LiveRoomState = {\n active: boolean;\n count: number;\n canJoin: boolean;\n approved: boolean;\n isHost: boolean;\n hasMoreParticipants: boolean;\n\n participants: {\n id: string;\n name: string;\n isHost: boolean;\n isPresenter: boolean;\n micEnabled: boolean;\n camEnabled: boolean;\n }[];\n};\n\nexport function useMeetingPreview(roomId: string, userId: string) {\n const [room, setRoom] = useState<LiveRoomState | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [isConnected, setIsConnected] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n if (!roomId || !userId) {\n setIsLoading(false);\n return;\n }\n\n let ws: WebSocket | null = null;\n\n const heartbeat = setInterval(() => {\n if (ws && ws.readyState === WebSocket.OPEN) {\n ws.send(\n JSON.stringify({\n type: \"PING\",\n }),\n );\n }\n }, 20000);\n\n ws = new WebSocket(`${SDK_CONFIG.wsUrl}/watch/${roomId}?user_id=${userId}`);\n\n ws.onopen = () => {\n setIsConnected(true);\n setError(null);\n console.log(\"[Preview] watcher connected\");\n };\n\n ws.onmessage = (event) => {\n try {\n const msg = JSON.parse(event.data);\n if (msg.type !== \"ROOM_PRESENCE_UPDATE\") {\n return;\n }\n setRoom({\n active: msg.active ?? false,\n count: msg.count ?? 0,\n canJoin: msg.canJoin ?? false,\n approved: msg.approved ?? false,\n isHost: msg.isHost ?? false,\n hasMoreParticipants: msg.hasMoreParticipants ?? false,\n participants: msg.participants ?? [],\n });\n // first valid room payload received\n setIsLoading(false);\n } catch (err) {\n console.error(\"Invalid room presence payload\", err);\n setIsLoading(false);\n }\n };\n ws.onerror = () => {\n setError(\"Failed to connect to room monitor\");\n setIsLoading(false);\n };\n ws.onclose = () => {\n setIsConnected(false);\n console.log(\"[Preview] disconnected\");\n };\n return () => {\n clearInterval(heartbeat);\n if (ws) {\n ws.close(1000, \"Leaving preview\");\n }\n };\n }, [roomId, userId]);\n\n return {\n room,\n isConnected,\n isLoading,\n error,\n };\n}\n"],"mappings":"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","names":["useEffect","useRef","useState","useState","useEffect","useRef","useEffect","useEffect","useEffect","useState","useState","useEffect","useEffect","useRef","useState","useRef","useState","useEffect","useEffect","useState","useState","useEffect"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@afosecure/meetingsdk",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.7",
|
|
4
4
|
"description": "A modern, lightweight React SDK for building peer-to-peer video communication applications. Built on WebRTC with a clean, composable rust API.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|