This guide walks you through the essentials of working with the Osmium Chat Protocol. You’ll learn how to read the proto definitions, establish a connection, authenticate, and send your first message.
Before any other operations, you must initialize the connection:
const clientMessage = { id: 1, // Unique request ID message: { core_initialize: { client_id: 1, // Client type identifier device_type: "web", // Platform (web, ios, android, etc.) device_version: "Chrome 120", // Device/browser version app_version: "1.0.0", // Your app version no_subscribe: false // Set true to disable updates } }};const encoded = ClientMessage.encode(clientMessage).finish();ws.send(encoded);
3
Handle the Initialized response
The server responds with available entrypoints:
function handleServerMessage(serverMessage) { if (serverMessage.message.result) { const result = serverMessage.message.result; if (result.req_id === 1) { // Matches our Initialize request if (result.result.initialized) { console.log('Connection initialized!'); console.log('Entrypoints:', result.result.initialized.entrypoints); // Now you can authenticate } } }}
The req_id in the response matches the id from your request. This is how you correlate responses to requests.
The server returns an Authorization with your token and user info:
function handleServerMessage(serverMessage) { if (serverMessage.message.result) { const result = serverMessage.message.result; if (result.req_id === 2) { // Matches our SignIn request if (result.result.error) { console.error('Auth failed:', result.result.error); } else if (result.result.authorization) { const auth = result.result.authorization; // Save the token for future sessions localStorage.setItem('auth_token', auth.token); console.log('Authenticated as:', auth.user.name); console.log('User ID:', auth.user.id); console.log('Session ID:', auth.session_id); // Now you can make authenticated requests } } }}
3
Using a saved token
For subsequent sessions, use auth_authorize with your saved token:
The server pushes real-time updates to keep your client synchronized.
1
Recognize update messages
Updates arrive as ServerMessage with the update field set:
function handleServerMessage(serverMessage) { if (serverMessage.message.update) { handleUpdate(serverMessage.message.update); } else if (serverMessage.message.result) { handleRPCResult(serverMessage.message.result); }}
2
Handle message created updates
When someone sends a message, you receive an UpdateMessageCreated:
function handleUpdate(update) { if (update.update.message_created) { const messageCreated = update.update.message_created; const msg = messageCreated.message; console.log('New message in channel:', msg.chat_ref.channel.channel_id); console.log('From user:', msg.author_id); console.log('Content:', msg.message); console.log('Unread count:', messageCreated.channel_unread_count); // Update your UI with the new message displayMessage(msg); }}
3
Handle other common updates
The protocol includes many update types:
function handleUpdate(update) { // Typing indicators if (update.update.chat_typing) { const typing = update.update.chat_typing; showTypingIndicator(typing.user_id, typing.typing); } // User status changes if (update.update.user_status) { const status = update.update.user_status; updateUserStatus(status.user_id, status.status.status); } // Message edited if (update.update.message_edited) { const edited = update.update.message_edited; updateMessage(edited.message); } // Message deleted if (update.update.message_deleted) { const deleted = update.update.message_deleted; removeMessage(deleted.message_id); }}