Simplify getDisplayName to use userInfo.usernameAlias directly
- Removed unnecessary fallback logic and error checks - Use userInfo.usernameAlias directly from *** session data - Only show ROFL if userInfo is missing or use...
Resolve "Welcome back" user name display issue in NavTop
- Fixed getDisplayName() to only show "ROFL" on actual errors, not during loading - Added loading state handling to show "Welcome back..." while fetching user i...
Use pre-authenticated session from OTKPreAuthFilter in getMyNetworks
- Fixed 401 error by checking for pre-authenticated session from OTKPreAuthFilter first - OTKPreAuthFilter already validates and consumes OTK, so controller sho...
Prevent automatic logout on 401 errors in network page
- Changed 401 error handling to show error message instead of immediately redirecting to /logout - Added retry button to error alert for easier recovery - Users...
Remove invalid onWebSocketClose and onWebSocketError from ClientOptions
- Removed onWebSocketClose and onWebSocketError handlers as they are not valid ClientOptions properties - WebSocket close and error events are already handled i...
Move onWebSocketClose and onWebSocketError to Client constructor options
- Moved onWebSocketClose and onWebSocketError from property assignment to Client constructor options - These handlers should be defined in ClientOptions, not as...
Remove invalid 'active' property check from STOMP Client
- Removed clientRef.current.active check which doesn't exist on Client type - Using only clientRef.current.connected which is the correct property
Replace StompSubscription with Subscription from @stomp/stompjs
- Changed import from StompSubscription to Subscription (correct export name) - Updated all type references to use Subscription instead of StompSubscription
Remove invalid connectionTimeout property from STOMP ClientOptions
- Removed connectionTimeout property which is not part of ClientOptions type - Connection timeout is already handled manually via connectionTimeoutRef
Resolve TypeScript build error in LeadManager component
- Fixed Chip icon prop type error by changing ReactNode to ReactElement - Removed unused imports and props - Fixed useMemo dependency warning by wrapping IdRend...
Auto-scroll chat to bottom on load and new messages
Track previous message count and scroll smoothly when new messages arrive; scroll immediately on initial load or when un-minimizing
Frontend WebSocket persistence - match backend timing and faster reconnect
Heartbeat: 4s -> 20s to match backend, reconnect delay: 5s -> 1s, add 30s connection timeout
WebSocket persistent connection with aggressive keepalive
Idle timeout set to 0, heartbeat 20s, disconnect delay 30s, match frontend timing
Optimize softphone to fit all content without scrolling at 680px height
CHATBOX HEIGHT: 550px -> 680px (optimal balance) PHONE DISPLAY: Reduced minHeight (100/75 -> 85/65), padding (14/16 -> 12/14) CALL CONTROLS: All 9 buttons - p...
Reduce ChatBox height to more comfortable 550px
Changed from 85% viewport (750-850px) to fixed 550px for better UX WebRTC call controls remain fully intact and functional
Make softphone fully visible without scrolling - comprehensive compact layout
CHATBOX HEIGHT: - Changed from fixed 600px to 85% of viewport height - Uses Math.floor(window.innerHeight * 0.85) for responsive sizing - Provides much more ver...
Eliminate horizontal scrollbars and increase softphone visibility
LAYOUT FIXES: - Increase DOCKED_HEIGHT from 480px to 600px for better vertical space - Add explicit width constraints (minWidth, maxWidth) to SoftphonePanel roo...
Remove connected check and add debug logging for STOMP activation
STOMP client was not activating because connected check was preventing it. Added debug logs to diagnose.
Activate STOMP client only after SockJS opens
Critical bug fix: STOMP client was being activated before SockJS opened, causing immediate disconnect. Now waits for SockJS onopen event before activating STOMP...
Enable SockJS fallback transports for WebSocket connection
Allow xhr-streaming and xhr-polling as fallback if WebSocket upgrade fails.
Remove invalid 'active' property check in useChatWebSocket
The Client type from @stomp/stompjs doesn't have an 'active' property. Removed the invalid check since client.activate() is called immediately after client crea...
Wait for SockJS to open before activating STOMP client
- Fix race condition where STOMP client activated before SockJS connection was ready - Move client.activate() to SockJS onopen callback - This should fix immedi...
Hardcode SSL settings in ConfigMap for production
- Removed environment variable placeholders - Hardcoded port 8443, SSL enabled, keystore path - Fixes Spring Boot not resolving env vars correctly
Correct Spring Boot SSL environment variable names
- Changed SSL_ENABLED to SERVER_SSL_ENABLED - Changed SSL_KEY_STORE to SERVER_SSL_KEY_STORE - Changed SSL_KEY_STORE_PASSWORD to SERVER_SSL_KEY_STORE_PASSWORD - ...
Route ALL WebRTC API requests to port 8443
- Updated all WebRTC API routes to use media.{domain}:8443 - No longer using Traefik for WebRTC endpoints - Matches media API and WebSocket configuration
Route ALL MediaService requests to port 8443 (bypass Traefik)
- Updated all media API routes to use media.{domain}:8443 - No longer using Traefik for MediaService - Both API and WebSocket go direct to port 8443 - internal....
Use SSLHostConfig API for Tomcat SSL configuration
- Use SSLHostConfig and SSLHostConfigCertificate (correct Tomcat API) - Configure certificate via **************** - Fixes compilation errors with setAttribute/...
Use setAttribute for Tomcat SSL configuration
- Changed from setKeystoreFile/Pass/Type/Alias to setAttribute - Tomcat 10+ uses setAttribute for SSL properties - Fixes compilation errors
Run MediaService on BOTH ports 80 (HTTP API) and 8443 (HTTPS WebSocket)
- Reverted service.yaml and ingressroute.yaml to use port 80 - Removed forced SERVER_PORT and SSL_ENABLED env vars - Added DualPortConfig to programmatically ad...
Connect to port 8443 (external) which routes to NodePort 30843
- Router forwards external 8443 to k1m1 NodePort 30843 - Browser uses media.kamocrm.com:8443 - Internal NodePort is 30843 (Kubernetes valid range)
Use NodePort 30843 instead of hostPort for WebSocket
- hostPort may be blocked by firewall rules - NodePort 30843 is in valid range (30000-32767) - Browser connects to external port 8443 - Router forwards 8443 -> ...
Add SSL configuration to k8s ConfigMap
- ConfigMap was missing SSL config from application.yml - Added server.ssl settings with environment variable support - Matches local application.yml configurat...
Use hostPort instead of NodePort for 8443
- NodePort range is 30000-32767, cannot use 8443 - Use hostPort to bind directly to host port 8443 - Removed service-websocket.yaml
Remove WebSocket-only transport restriction for HTTP/2 compatibility
- Browser WebSocket API doesn't support HTTP/2 (RFC 8441 not implemented) - Native WebSocket requires HTTP/1.1 Upgrade which fails over HTTP/2 - Let SockJS auto...
Use explicit Host() for /ws route to enable TLSOption
- Changed /ws route from HostRegexp to Host(media.kamocrm.com) - TLSOption can only be applied to explicit hosts (not regex) - ALPN negotiation happens during T...
Force HTTP/1.1 for MediaService ONLY via TLSOption
- Created media-tls-http1 TLSOption with alpnProtocols: [http/1.1] - Referenced ONLY in media-route IngressRoute - Does not affect other Traefik routes - Fixes ...
Separate /ws route for WebSocket, keep HTTP/2 for API
- Added two routes: /ws for WebSocket (higher priority), rest for API - Only /ws uses media-websocket-transport (HTTP/2 disabled) - API routes can use HTTP/2 fo...
Use Host() instead of HostRegexp() for media-route
- Simplified to Host(media.kamocrm.com) - Avoids regex escaping issues with backticks - Tests show route is working with simple Host match
Force HTTP/1.1 via TLSOption for WebSocket compatibility
- Created TLSOption to disable HTTP/2 ALPN negotiation - Forces browsers to use HTTP/1.1 for media.kamocrm.com - WebSocket upgrades require HTTP/1.1 protocol - ...
Disable idle timeout for WebSocket connections
- Added idleTimeout=0 to websecure entrypoint - Prevents Traefik from closing WebSocket connections due to inactivity - Fixes SockJS WebSocket timeout issues
Use WebSocket-only transport (disable XHR polling)
- Changed SockJS transports from [websocket, xhr-streaming, xhr-polling] to [websocket] - Removes fallback to XHR polling - Forces pure WebSocket connection - F...
Remove explicit namespace reference from kamowsmedia-service
- Both services are in same namespace (kamo) - Explicit namespace reference not needed - Avoids potential cross-namespace issues
Remove /ws rewrite from next.config (handled by Traefik)
- Removed Next.js rewrite for /ws paths - WebSocket routing now handled at Traefik IngressRoute level - Traefik routes internal.kamocrm.com/ws -> MediaService d...
Route /ws requests directly to MediaService via Traefik
- Added dedicated route for /ws paths in IngressRoute - Routes internal.kamocrm.com/ws -> MediaService directly - Uses same ServersTransport as media-route for ...
Allow /ws WebSocket endpoints without auth redirect
- Added /ws path to middleware bypass - SockJS needs to connect to /ws/info without redirect - WebSocket connections will still have *** cookie - Fixes WebSocke...
Change WebSocket connection to same-origin
- Changed from media.kamocrm.com to same origin (internal.kamocrm.com) - Avoids cross-origin WebSocket connection issues - Added Next.js rewrite rule to proxy /...
Remove @kubernetescrd suffix from serversTransport reference
- Traefik error: cross-namespace format not allowed when crossnamespace disabled - IngressRoute and ServersTransport are in same namespace (kamo) - Use simple n...
Remove invalid coder property from getDisplayMedia
- Using simple video: true for screen sharing - Build should now succeed
Resolve build error - replace PhoneOff with CallEnd
- PhoneOff icon doesn't exist in @mui/icons-material - Using CallEnd which is the correct MUI icon - Removed unused duplicate files (ChatBoxWithWebRTC, VideoCal...
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.
