OddSockets JavaScript SDK
Official JavaScript/TypeScript SDK for OddSockets real-time messaging platform
Overview & Features
The OddSockets JavaScript SDK provides a powerful, easy-to-use interface for real-time messaging in both Node.js and browser environments.
Universal Support
Works seamlessly in Node.js and all modern browsers with the same API.
TypeScript Ready
Full TypeScript support with comprehensive type definitions included.
PubNub Compatible
Drop-in replacement for PubNub with migration utilities included.
High Performance
Optimized for low latency with efficient WebSocket connections and smart routing.
Cost Effective
No per-message pricing, industry-standard 32KB message limits, transparent pricing.
Automatic Failover
Built-in redundancy and intelligent error handling for 99.9% uptime.
Installation
npm install @oddsocketsai/javascript-sdk
                    yarn add @oddsocketsai/javascript-sdk
                    <script src="https://prodmedia.tyga.host/public/npm/@oddsocketsai/javascript-sdk@latest/dist/oddsockets.min.js"></script>
                    Quick Start
Basic Usage
import OddSockets from '@oddsocketsai/javascript-sdk';
const client = new OddSockets({
  apiKey: 'ak_live_1234567890abcdef'
});
const channel = client.channel('my-channel');
// Subscribe to messages
channel.subscribe((message) => {
  console.log('Received:', message);
});
// Publish a message
channel.publish('Hello, World!');
                PubNub Migration
import { PubNubCompat } from '@oddsocketsai/javascript-sdk';
// Drop-in replacement for PubNub
const pubnub = new PubNubCompat({
  publishKey: 'ak_live_1234567890abcdef',
  subscribeKey: 'ak_live_1234567890abcdef',
  userId: 'user123'
});
pubnub.addListener({
  message: function(messageEvent) {
    console.log('Message:', messageEvent.message);
  }
});
pubnub.subscribe({
  channels: ['my-channel']
});
                TypeScript Usage
import OddSockets, { Channel, Message, PresenceInfo } from '@oddsocketsai/javascript-sdk';
const client: OddSockets = new OddSockets({
  apiKey: 'ak_live_1234567890abcdef'
});
const channel: Channel = client.channel('typed-channel');
                Configuration
Client Options
const client = new OddSockets({
  apiKey: 'your-api-key',           // Required: Your OddSockets API key
  userId: 'user-id',                // Optional: User identifier
  autoConnect: true,                // Optional: Auto-connect on creation
  reconnectAttempts: 5,             // Optional: Max reconnection attempts
  heartbeatInterval: 30000          // Optional: Heartbeat interval (ms)
});
                Channel Options
channel.subscribe(callback, {
  enablePresence: true,             // Enable presence tracking
  retainHistory: true,              // Retain message history
  filter: 'user.premium == true'    // Message filter expression
});
channel.publish(message, {
  ttl: 3600,                        // Time to live (seconds)
  metadata: { priority: 'high' },   // Additional metadata
  storeInHistory: true              // Store in message history
});
                Examples
Explore comprehensive examples demonstrating the OddSockets JavaScript SDK in action:
Performance & Compatibility
OddSockets JavaScript SDK delivers superior performance with broad compatibility:
Browser Support
- Chrome 88+ (2021)
 - Firefox 85+ (2021)
 - Safari 14+ (2020)
 - Edge 88+ (2021)
 
Node.js Support
- Node.js 16+ (LTS)
 - ES2020+ features
 - CommonJS & ESM
 - TypeScript 4.5+
 
Framework Integrations
The OddSockets JavaScript SDK works seamlessly with all modern JavaScript frameworks. Here are examples showing how to integrate with popular frameworks:
React
import React, { useState, useEffect } from 'react';
import OddSockets from '@oddsocketsai/javascript-sdk';
function ChatComponent() {
  const [client, setClient] = useState(null);
  const [messages, setMessages] = useState([]);
  const [inputValue, setInputValue] = useState('');
  useEffect(() => {
    // Initialize OddSockets client
    const oddSocketsClient = new OddSockets({
      apiKey: 'ak_live_1234567890abcdef'
    });
    // Get channel and subscribe
    const channel = oddSocketsClient.channel('chat-room');
    
    channel.subscribe((message) => {
      setMessages(prev => [...prev, message]);
    });
    setClient(oddSocketsClient);
    // Cleanup on unmount
    return () => {
      oddSocketsClient.disconnect();
    };
  }, []);
  const sendMessage = () => {
    if (client && inputValue.trim()) {
      const channel = client.channel('chat-room');
      channel.publish(inputValue);
      setInputValue('');
    }
  };
  return (
    <div>
      <div>
        {messages.map((msg, index) => (
          <div key={index}>{msg.message}</div>
        ))}
      </div>
      <input 
        value={inputValue}
        onChange={(e) => setInputValue(e.target.value)}
        onKeyPress={(e) => e.key === 'Enter' && sendMessage()}
      />
      <button onClick={sendMessage}>Send</button>
    </div>
  );
}
                Vue 3
<template>
  <div>
    <div>
      <div v-for="(message, index) in messages" :key="index">
        {{ message.message }}
      </div>
    </div>
    <input 
      v-model="inputValue"
      @keyup.enter="sendMessage"
      placeholder="Type a message..."
    />
    <button @click="sendMessage">Send Message</button>
  </div>
</template>
<script>
import { ref, onMounted, onUnmounted } from 'vue';
import OddSockets from '@oddsocketsai/javascript-sdk';
export default {
  name: 'ChatComponent',
  setup() {
    const client = ref(null);
    const messages = ref([]);
    const inputValue = ref('');
    onMounted(() => {
      // Initialize OddSockets client
      client.value = new OddSockets({
        apiKey: 'ak_live_1234567890abcdef'
      });
      // Get channel and subscribe
      const channel = client.value.channel('chat-room');
      
      channel.subscribe((message) => {
        messages.value.push(message);
      });
    });
    onUnmounted(() => {
      if (client.value) {
        client.value.disconnect();
      }
    });
    const sendMessage = () => {
      if (client.value && inputValue.value.trim()) {
        const channel = client.value.channel('chat-room');
        channel.publish(inputValue.value);
        inputValue.value = '';
      }
    };
    return {
      messages,
      inputValue,
      sendMessage
    };
  }
};
</script>
                Angular
import { Component, OnInit, OnDestroy } from '@angular/core';
import OddSockets from '@oddsocketsai/javascript-sdk';
@Component({
  selector: 'app-chat',
  template: `
    <div>
      <div>
        <div *ngFor="let message of messages">
          {{ message.message }}
        </div>
      </div>
      <input 
        [(ngModel)]="inputValue"
        (keyup.enter)="sendMessage()"
        placeholder="Type a message..."
      >
      <button (click)="sendMessage()">Send Message</button>
    </div>
  `
})
export class ChatComponent implements OnInit, OnDestroy {
  private client: any;
  messages: any[] = [];
  inputValue: string = '';
  ngOnInit() {
    // Initialize OddSockets client
    this.client = new OddSockets({
      apiKey: 'ak_live_1234567890abcdef'
    });
    // Get channel and subscribe
    const channel = this.client.channel('chat-room');
    
    channel.subscribe((message: any) => {
      this.messages.push(message);
    });
  }
  ngOnDestroy() {
    if (this.client) {
      this.client.disconnect();
    }
  }
  sendMessage() {
    if (this.client && this.inputValue.trim()) {
      const channel = this.client.channel('chat-room');
      channel.publish(this.inputValue);
      this.inputValue = '';
    }
  }
}
                Svelte
<script>
  import { onMount, onDestroy } from 'svelte';
  import OddSockets from '@oddsocketsai/javascript-sdk';
  let client;
  let messages = [];
  let inputValue = '';
  onMount(() => {
    // Initialize OddSockets client
    client = new OddSockets({
      apiKey: 'ak_live_1234567890abcdef'
    });
    // Get channel and subscribe
    const channel = client.channel('chat-room');
    
    channel.subscribe((message) => {
      messages = [...messages, message];
    });
  });
  onDestroy(() => {
    if (client) {
      client.disconnect();
    }
  });
  function sendMessage() {
    if (client && inputValue.trim()) {
      const channel = client.channel('chat-room');
      channel.publish(inputValue);
      inputValue = '';
    }
  }
  function handleKeyPress(event) {
    if (event.key === 'Enter') {
      sendMessage();
    }
  }
</script>
<div>
  <div>
    {#each messages as message, index}
      <div key={index}>{message.message}</div>
    {/each}
  </div>
  <input 
    bind:value={inputValue}
    on:keypress={handleKeyPress}
    placeholder="Type a message..."
  />
  <button on:click={sendMessage}>Send Message</button>
</div>
                Next.js
import { useState, useEffect } from 'react';
import dynamic from 'next/dynamic';
// Dynamically import OddSockets to avoid SSR issues
const OddSockets = dynamic(() => import('@oddsocketsai/javascript-sdk'), {
  ssr: false
});
export default function ChatPage() {
  const [client, setClient] = useState(null);
  const [messages, setMessages] = useState([]);
  const [inputValue, setInputValue] = useState('');
  const [isLoaded, setIsLoaded] = useState(false);
  useEffect(() => {
    // Only run on client side
    if (typeof window !== 'undefined') {
      import('@oddsocketsai/javascript-sdk').then((OddSocketsModule) => {
        const OddSocketsClass = OddSocketsModule.default;
        
        const oddSocketsClient = new OddSocketsClass({
          apiKey: 'ak_live_1234567890abcdef'
        });
        const channel = oddSocketsClient.channel('chat-room');
        
        channel.subscribe((message) => {
          setMessages(prev => [...prev, message]);
        });
        setClient(oddSocketsClient);
        setIsLoaded(true);
      });
    }
    return () => {
      if (client) {
        client.disconnect();
      }
    };
  }, []);
  const sendMessage = () => {
    if (client && inputValue.trim()) {
      const channel = client.channel('chat-room');
      channel.publish(inputValue);
      setInputValue('');
    }
  };
  if (!isLoaded) {
    return <div>Loading chat...</div>;
  }
  return (
    <div>
      <h1>Next.js Chat</h1>
      <div>
        {messages.map((msg, index) => (
          <div key={index}>{msg.message}</div>
        ))}
      </div>
      <input 
        value={inputValue}
        onChange={(e) => setInputValue(e.target.value)}
        onKeyPress={(e) => e.key === 'Enter' && sendMessage()}
        placeholder="Type a message..."
      />
      <button onClick={sendMessage}>Send</button>
    </div>
  );
}
                Nuxt.js
<template>
  <div>
    <h1>Nuxt.js Chat</h1>
    <div v-if="!isLoaded">Loading chat...</div>
    <div v-else>
      <div>
        <div v-for="(message, index) in messages" :key="index">
          {{ message.message }}
        </div>
      </div>
      <input 
        v-model="inputValue"
        @keyup.enter="sendMessage"
        placeholder="Type a message..."
      />
      <button @click="sendMessage">Send Message</button>
    </div>
  </div>
</template>
<script>
export default {
  name: 'ChatPage',
  data() {
    return {
      client: null,
      messages: [],
      inputValue: '',
      isLoaded: false
    };
  },
  async mounted() {
    // Dynamic import to avoid SSR issues
    if (process.client) {
      const { default: OddSockets } = await import('@oddsocketsai/javascript-sdk');
      
      this.client = new OddSockets({
        apiKey: 'ak_live_1234567890abcdef'
      });
      const channel = this.client.channel('chat-room');
      
      channel.subscribe((message) => {
        this.messages.push(message);
      });
      this.isLoaded = true;
    }
  },
  beforeDestroy() {
    if (this.client) {
      this.client.disconnect();
    }
  },
  methods: {
    sendMessage() {
      if (this.client && this.inputValue.trim()) {
        const channel = this.client.channel('chat-room');
        channel.publish(this.inputValue);
        this.inputValue = '';
      }
    }
  }
};
</script>
                Solid.js
import { createSignal, createEffect, onCleanup } from 'solid-js';
import { For } from 'solid-js';
import OddSockets from '@oddsocketsai/javascript-sdk';
function ChatComponent() {
  const [client, setClient] = createSignal(null);
  const [messages, setMessages] = createSignal([]);
  const [inputValue, setInputValue] = createSignal('');
  createEffect(() => {
    // Initialize OddSockets client
    const oddSocketsClient = new OddSockets({
      apiKey: 'ak_live_1234567890abcdef'
    });
    // Get channel and subscribe
    const channel = oddSocketsClient.channel('chat-room');
    
    channel.subscribe((message) => {
      setMessages(prev => [...prev, message]);
    });
    setClient(oddSocketsClient);
    // Cleanup on component unmount
    onCleanup(() => {
      if (oddSocketsClient) {
        oddSocketsClient.disconnect();
      }
    });
  });
  const sendMessage = () => {
    const currentClient = client();
    const currentInput = inputValue();
    
    if (currentClient && currentInput.trim()) {
      const channel = currentClient.channel('chat-room');
      channel.publish(currentInput);
      setInputValue('');
    }
  };
  const handleKeyPress = (e) => {
    if (e.key === 'Enter') {
      sendMessage();
    }
  };
  return (
    <div>
      <div>
        <For each={messages()}>
          {(message, index) => (
            <div>{message.message}</div>
          )}
        </For>
      </div>
      <input 
        value={inputValue()}
        onInput={(e) => setInputValue(e.target.value)}
        onKeyPress={handleKeyPress}
        placeholder="Type a message..."
      />
      <button onClick={sendMessage}>Send Message</button>
    </div>
  );
}
export default ChatComponent;