4.6 KiB
HTTP POST Implementation for IRC → Kosmi Messages
Date: October 31, 2025, 12:00 PM
Status: ✅ Implemented
Summary
Successfully implemented HTTP POST for sending messages from IRC to Kosmi, replacing the problematic WebSocket mutation approach. Also cleaned up debug logging from troubleshooting sessions.
Problem
The WebSocket-based approach for sending mutations was failing because:
- The WebSocket connection was closing immediately after sending mutations
- Protocol initialization and authentication complexities made WebSocket mutations unreliable
- Even with correct GraphQL mutation format (
type: "start"), the connection would close
Solution
Switched to using HTTP POST for sending messages (GraphQL mutations) to Kosmi:
- Uses the browser's cookies for authentication (extracted via Playwright)
- Sends GraphQL mutations to
https://engine.kosmi.io/ - Works reliably without WebSocket complexities
- WebSocket still used for receiving messages (subscriptions)
Changes Made
1. Modified bridge/kosmi/native_client.go
Replaced WebSocket-based SendMessage with HTTP POST:
func (c *NativeClient) SendMessage(text string) error {
// Get cookies from browser for authentication
cookies, err := c.page.Context().Cookies()
// Build GraphQL mutation
mutation := map[string]interface{}{
"query": "mutation SendMessage($body: String!, $roomID: ID!) { sendMessage(body: $body, roomID: $roomID) { id } }",
"variables": map[string]interface{}{
"body": text,
"roomID": c.roomID,
},
}
// Create HTTP POST request to https://engine.kosmi.io/
req, err := http.NewRequest("POST", "https://engine.kosmi.io/", bytes.NewBuffer(payload))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("User-Agent", "Mozilla/5.0...")
// Add cookies for authentication
for _, cookie := range cookies {
req.AddCookie(&http.Cookie{Name: cookie.Name, Value: cookie.Value})
}
// Send request
client := &http.Client{Timeout: 10 * time.Second}
resp, err := client.Do(req)
// Check response
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("HTTP %d: %s", resp.StatusCode, string(body))
}
return nil
}
Added required imports:
bytesionet/http
2. Cleaned Up Debug Logging
Removed from bridge/kosmi/native_client.go:
- Browser console message listener
- JavaScript console.log statements in WebSocket interceptor
- Verbose emoji-based logging in SendMessage
Removed from bridge/kosmi/kosmi.go:
- Emoji-based debug logging (🔔, 📨, 🔍, ✅, ⏭️)
- Reduced verbosity of log messages
- Changed Info logs to Debug for routine operations
Removed from bridge/irc/handlers.go:
- Emoji-based debug logging (🔔, 📨, ⏭️, 🔌)
- Verbose PRIVMSG logging
Removed from matterbridge.toml:
Debug=truefrom Kosmi sectionDebugLevel=1from IRC section
Architecture
IRC → Matterbridge → Kosmi Bridge → HTTP POST → https://engine.kosmi.io/
(GraphQL mutation)
Kosmi → WebSocket → Browser (Playwright) → Kosmi Bridge → Matterbridge → IRC
(subscription)
Key Points:
- Receiving: WebSocket subscription (via Playwright-intercepted connection)
- Sending: HTTP POST with GraphQL mutation (using browser cookies)
- Authentication: Browser cookies obtained from Playwright page context
Benefits
- Reliability: HTTP POST is proven to work (from FINDINGS.md)
- Simplicity: No WebSocket mutation complexity
- Authentication: Leverages existing browser session cookies
- Clean Separation: WebSocket for receiving, HTTP for sending
Testing
Ready for user to test:
- ✅ IRC → Kosmi (HTTP POST implementation)
- ✅ Kosmi → IRC (WebSocket subscription, already working)
Files Modified
-
/Users/erikfredericks/dev-ai/HSO/irc-kosmi-relay/bridge/kosmi/native_client.go- Replaced SendMessage with HTTP POST implementation
- Added HTTP-related imports
- Removed debug logging
-
/Users/erikfredericks/dev-ai/HSO/irc-kosmi-relay/bridge/kosmi/kosmi.go- Cleaned up debug logging
-
/Users/erikfredericks/dev-ai/HSO/irc-kosmi-relay/bridge/irc/handlers.go- Cleaned up debug logging
-
/Users/erikfredericks/dev-ai/HSO/irc-kosmi-relay/matterbridge.toml- Removed Debug and DebugLevel settings
Next Steps
- User to test IRC → Kosmi message relay
- User to test Kosmi → IRC message relay
- Verify bidirectional relay is working correctly