Replace 'any' type with Record<string, unknown> to fix TypeScript build error
Validate existing session before reuse and fix session attach method issue
Fix Janus session initialization - wait for success callback before resolving
Comprehensive WebRTC video call fixes - remote stream handling, modern UI, and subscription logic
Handle call-answered messages, improve error logging, and fix session cleanup
Move answerIncomingCall declaration before startAudioCall to fix 'used before declaration' error
Move addSystemMessage declaration before useEffect that uses it - Fixes 'used before declaration' TypeScript error
Use getUsernameAlias() instead of non-existent getName() method on Member
Set isCallActive to true when room is joined to prevent video panel from disappearing - Set isCallActive=true in join room success callback - Keeps video panel visible while ICE connection establishes - Prevents panel from disappearing when isConnecting becomes false before ICE connects
Prevent premature cleanup of video call by fixing cleanup effect - Remove localStream from cleanup effect dependencies to prevent premature cleanup - Add localStreamRef to track current stream for cleanup - Keep ref in sync with state via useEffect - Fixes video call panel appearing then quickly disappearing
Use handleRemoteJsep instead of send for streaming answer JSEP - Replace handle.send with handleRemoteJsep after creating streaming answer - handleRemoteJsep is the correct method for sending JSEP after createAnswer - Fixes TypeScript error about missing message property in PluginMessage
Remove unsupported audioRecv/videoRecv from VideoRoom createAnswer - Remove audioRecv and videoRecv properties from deprecated media object - These properties are not supported by the Janus type definition - Receiving capabilities are negotiated automatically via SDP
Remove deprecated media properties from createAnswer calls - Remove media property with audioRecv/videoRecv from subscriber createAnswer - Remove media property from streaming plugin createAnswer - createAnswer automatically handles receiving based on the offer JSEP
Replace 'any' types with proper TypeScript types in useWebRTC and ChatDock - Replace all 'any' types with Record<string, unknown>, RTCSessionDescriptionInit, string | Error, etc. - Fix ChatDock message type to use proper interface instead of 'any' - Fix unused parameter warnings by prefixing with underscore
Remove useEffect dependencies causing connection to abort - empty dependency array so effect only runs once on mount
Remove invalid SockJS.OPEN constants causing TypeScript build error
Properly configure Spring Security for WebSocket - disable CSRF completely, enable session creation IF_REQUIRED for WebSocket handshake
Disable CSRF for /ws/** endpoints and simplify security config to fix SockJS /ws/info 405 error
Explicitly allow GET/POST/HEAD methods for /ws/** endpoints to fix SockJS /ws/info 405 error
Remove invalid method calls causing compilation errors (getId on MediaSession, getStatusCode on ServerHttpResponse)
Enhanced WebSocket connection logging and fixed URL construction
WebSocket connection - use public domain kamocrm.com:8443 instead of private IP
- Use public domain with port 8443 (e.g., kamocrm.com:8443) - Public address forwards to NodePort 30843 on private IP 192.168.42.191 - Extracts base domain from...
WebSocket connection - use direct node IP via NodePort 30843 (bypasses Traefik)
- Connect directly to node IP 192.168.42.191:30843 for WebSocket - NodePort 30843 exposes MediaService port 8443 directly - Bypasses Traefik to avoid WebSocket ...
Add WebSocket middleware and ServersTransport to IngressRoute
- Added media-websocket-upgrade middleware for WebSocket upgrade headers - Added media-websocket-transport to disable HTTP/2 (WebSocket requires HTTP/1.1) - Thi...
WebSocket connection - use Traefik ingress instead of direct port 8443
- Changed WebSocket URL to connect through Traefik on standard HTTPS port (443) - Removed port 8443 from domain connections (Traefik routes to service on port 8...
WebSocket live message delivery - disable ChatMessageHandler subscription, enhance logging
- Disabled ChatMessageHandler subscription to chat.session.> that was consuming messages without forwarding to WebSocket - Enhanced WebSocketConfig logging to t...
Change NATS DeliverPolicy from All to New to prevent message replay - only deliver new messages after subscription
Add support for unique consumer names in NATS subscriptions - Add overloaded subscribe() method that accepts custom consumer name - Allows multiple chat sessions to have independent NATS consumers - Fixes issue where all sessions shared same consumer causing message delivery conflicts
Prevent self-chat and improve session creation error handling - Add validation in MemberItem to prevent opening chat with own member ID - Add backend validation in MediaController to prevent self-chat sessions - Improve error handling in ChatDock to not retry 4xx client errors
Ensure page fits viewport while preserving internal content scrollbars
Resolve vertical overflow on settings member page by removing viewport height calculations
Like what you see shipping?
All of it arrives in your workspace on its own. Start on the free plan and read this page again in a month.
