2.0 KiB
WebSocket Mutation Issue - HTTP POST Solution
Date: October 31, 2025, 11:53 AM
Issue: IRC→Kosmi messages not appearing despite successful WebSocket send
Problem Discovery
Messages from IRC were being sent to Kosmi's WebSocket successfully (we could see them in logs), but they were NOT appearing in the Kosmi chat interface.
Root Cause
Through comprehensive logging of browser console messages, we discovered:
-
WebSocket closes immediately after sending mutation:
[Browser Console] >>> Sending mutation... [Browser Console] >>> Sent successfully [Browser Console] error: CloseEvent ← WebSocket closes! -
The WebSocket reopens - indicating Kosmi is detecting an invalid message and resetting the connection
Why WebSocket Mutations Fail
We're piggy-backing on Kosmi's native WebSocket connection (established by the web page). When we inject our own GraphQL mutations:
- We don't have proper authentication in the WebSocket frame
- We're interfering with Kosmi's protocol state machine
- The server detects this and closes the connection
Solution: HTTP POST for Mutations
From FINDINGS.md (which was created earlier but we forgot about):
Kosmi supports HTTP POST for GraphQL mutations!
POST https://engine.kosmi.io/
Content-Type: application/json
{
"query": "mutation SendMessage($body: String!, $roomID: ID!) { sendMessage(body: $body, roomID: $roomID) { id } }",
"variables": {
"body": "message text",
"roomID": "room-id"
}
}
Architecture
- Receiving (Subscriptions): Use WebSocket ✅ (working)
- Sending (Mutations): Use HTTP POST ✅ (to be implemented)
This is the same approach we initially documented but forgot to use!
Implementation Plan
- Replace
SendMessageinnative_client.goto use HTTP POST - Extract cookies from Playwright page context for authentication
- Use Go's
http.Clientto send the POST request - Keep WebSocket for receiving messages (already working)
Next Steps
Implement HTTP POST sending in the next iteration.