Files
IRC-kosmi-relay/cmd/kosmi-client/README.md

6.6 KiB

Kosmi Client - Standalone CLI Chat Client

A simple, standalone command-line client for Kosmi that demonstrates WebSocket communication, GraphQL operations, and real-time chat functionality.

Features

  • Manual JWT token authentication
  • Email/password authentication with browser automation
  • Interactive CLI for sending/receiving messages
  • Real-time message subscription
  • Graceful shutdown (Ctrl+C)

Prerequisites

  • Go 1.21 or higher
  • A Kosmi account (for authenticated access)
  • JWT token from your browser session

Installation

cd cmd/kosmi-client
go mod download
go build

Getting Your JWT Token

To use this client, you need to extract your JWT token from the Kosmi web application:

  1. Open https://app.kosmi.io in your browser
  2. Log in to your account
  3. Open Developer Tools (F12 or Right-click → Inspect)
  4. Go to the Console tab
  5. Type the following command and press Enter:
    localStorage.getItem('token')
    
  6. Copy the token (it will be a long string starting with eyJ...)

Method 2: Network Tab

  1. Open https://app.kosmi.io in your browser
  2. Open Developer Tools (F12)
  3. Go to the Network tab
  4. Filter by "WS" (WebSocket)
  5. Look for the connection to engine.kosmi.io
  6. Click on it and view the Messages tab
  7. Find the connection_init message
  8. Copy the token from the payload

Usage

Basic Usage

Option 1: Email/Password (Recommended)

./kosmi-client --email "your@email.com" --password "yourpassword" --room "@hyperspaceout"

Option 2: Manual Token

./kosmi-client --token "YOUR_JWT_TOKEN" --room "@hyperspaceout"

Command-Line Options

Flag Description Required Example
--token JWT authentication token Yes* --token "eyJ..."
--room Room ID to join Yes --room "@hyperspaceout"
--email Email for login Yes* --email "user@example.com"
--password Password for login Yes* --password "secret"

* Either --token OR both --email and --password are required

Interactive Commands

Once connected, you can use these commands:

  • Send a message: Just type your message and press Enter
  • /help - Show available commands
  • /quit or /exit - Exit the client
  • Ctrl+C - Graceful shutdown

Example Session

$ ./kosmi-client --email "email@email.com" --password "password" --room "@hyperspaceout"

Connecting to Kosmi WebSocket...
Sending connection_init...
✓ Connection acknowledged
Querying current user...
✓ Logged in as: John Doe (@johndoe) [Anonymous: false]
Joining room: @hyperspaceout...
✓ Successfully joined room
Subscribing to new messages...
✓ Subscription active
Connection setup complete!

============================================================
Connected! Type messages and press Enter to send.
Press Ctrl+C to exit.
============================================================

> Hello, world!
> [14:23:45] Jane Smith: Hey there!
> How are you?
> [14:24:01] Jane Smith: I'm good, thanks!
> /quit
Exiting...
Closing Kosmi client...
✓ Client closed
Goodbye!

Architecture

The client consists of three main components:

1. auth.go - Authentication Management

  • GetToken() - Retrieves token (manual or via chromedp)
  • loginWithChromedp() - Browser automation for email/password login

2. client.go - WebSocket Client

  • KosmiClient - Main client struct
  • Connect() - Establishes connection and performs GraphQL handshake
  • SendMessage() - Sends messages to the room
  • listenForMessages() - Receives messages in real-time
  • Close() - Graceful shutdown

3. main.go - CLI Interface

  • Command-line argument parsing
  • Interactive message input/output
  • Signal handling for graceful shutdown

GraphQL Operations

The client uses these minimal GraphQL operations:

  1. connection_init - Authenticate with JWT token
  2. ExtendedCurrentUserQuery - Get current user info
  3. JoinRoom - Join the specified room
  4. NewMessageSubscription - Subscribe to new messages
  5. SendMessage2 - Send messages to the room

Troubleshooting

"Authentication error: no authentication method provided"

You must provide either --token or both --email and --password.

"Connection error: failed to connect to WebSocket"

  • Check your internet connection
  • Verify the Kosmi service is accessible
  • Ensure you're not behind a restrictive firewall

"expected connection_ack, got: connection_error"

Your JWT token is likely invalid or expired. Get a fresh token from your browser.

Messages not appearing

  • Verify you've joined the correct room ID
  • Check that the room exists and you have access to it
  • Ensure your token has the necessary permissions

Helper Tools

cmd/get-kosmi-token - Standalone Token Extractor

A separate utility for extracting JWT tokens without running the full client:

cd cmd/get-kosmi-token
go run main.go --email "your@email.com" --password "yourpassword"

Options:

  • --email - Your Kosmi email
  • --password - Your Kosmi password
  • --headless - Run browser in headless mode (default: true)
  • --verbose - Enable verbose logging

The token will be printed to stdout, making it easy to capture:

TOKEN=$(go run main.go --email "your@email.com" --password "yourpassword" 2>/dev/null)
./kosmi-client --token "$TOKEN" --room "@hyperspaceout"

Future Enhancements

Additional Features (Ideas)

  • Room chat history retrieval (RoomChatQuery)
  • Member join/leave notifications
  • Typing indicators
  • File/image upload support
  • Multiple room support
  • Persistent token storage
  • Reconnection with exponential backoff
  • Message editing and deletion
  • Reactions and emojis

Development

Running from Source

go run . --token "YOUR_TOKEN" --room "@hyperspaceout"

Building

go build -o kosmi-client

Dependencies

  • github.com/gorilla/websocket - WebSocket client library
  • github.com/chromedp/chromedp - Browser automation (for future use)

License

This is a proof-of-concept demonstration client. Use responsibly and in accordance with Kosmi's Terms of Service.

Contributing

This is a standalone proof of concept. Feel free to fork and extend it for your own use cases!

Support

For issues related to:

  • Kosmi service: Contact Kosmi support
  • This client: Check the code comments and implementation details

Note: This client is not officially affiliated with or endorsed by Kosmi. It's an independent implementation for educational and development purposes.