Back to Documentation

Svelte SDK Examples

Real-world examples showing how to use the OddSockets Svelte SDK with reactive stores and components

View Chat Example
Basic Chat
Available
Complete chat application using reactive stores for automatic UI updates. Shows messages, presence, and real-time communication.
<script>
  import { createChannelStore } from 'oddsockets-svelte-sdk/stores';
  import { onMount } from 'svelte';
  
  const { messages, presence, publish, subscribe } = createChannelStore('chat', {
    apiKey: 'ak_your_api_key_here',
    userId: 'user123'
  });
  
  let messageText = '';
  
  onMount(() => {
    subscribe();
  });
  
  async function sendMessage() {
    if (messageText.trim()) {
      await publish({
        type: 'chat',
        text: messageText,
        username: 'John Doe'
      });
      messageText = '';
    }
  }
</script>

<div class="chat-container">
  {#each $messages as message}
    <div class="message">
      <strong>{message.data.username}:</strong>
      {message.data.text}
    </div>
  {/each}
  
  <div class="presence">
    Online: {$presence.length} users
  </div>
  
  <input 
    bind:value={messageText} 
    placeholder="Type a message..."
    on:keydown={(e) => e.key === 'Enter' && sendMessage()}
  />
  <button on:click={sendMessage}>Send</button>
</div>
Connection Status
Available
Monitor connection state with reactive stores. Shows connection status, reconnection attempts, and uptime tracking.
<script>
  import { createConnectionStore } from 'oddsockets-svelte-sdk/stores';
  import { onMount } from 'svelte';
  
  const { 
    connectionState, 
    isConnected, 
    reconnectAttempts,
    connectionDurationFormatted,
    connect,
    disconnect
  } = createConnectionStore({
    apiKey: 'ak_your_api_key_here'
  });
  
  onMount(() => {
    connect();
  });
</script>

<div class="status-panel">
  <div class="status-indicator" class:connected={$isConnected}>
    {$connectionState}
  </div>
  
  {#if $reconnectAttempts > 0}
    <div class="reconnect-info">
      Reconnection attempts: {$reconnectAttempts}
    </div>
  {/if}
  
  {#if $isConnected}
    <div class="uptime">
      Connected for: {$connectionDurationFormatted}
    </div>
  {/if}
  
  <button on:click={$isConnected ? disconnect : connect}>
    {$isConnected ? 'Disconnect' : 'Connect'}
  </button>
</div>
Multi-Channel
Coming Soon
Manage multiple channels simultaneously with reactive stores. Perfect for complex applications with multiple data streams.
<script>
  import { createMultiChannelStore } from 'oddsockets-svelte-sdk/stores';
  import { onMount } from 'svelte';
  
  const { 
    channelStores,
    subscribeAll,
    publishToChannel,
    totalPresence
  } = createMultiChannelStore(['chat', 'notifications', 'updates'], {
    apiKey: 'ak_your_api_key_here'
  });
  
  onMount(() => {
    subscribeAll();
  });
  
  function sendToChat(message) {
    publishToChannel('chat', message);
  }
</script>

<div class="multi-channel-app">
  <div class="channel-tabs">
    {#each Object.keys(channelStores) as channelName}
      <button class="tab">
        {channelName}
        <span class="count">
          {$channelStores[channelName].messageCount}
        </span>
      </button>
    {/each}
  </div>
  
  <div class="total-presence">
    Total online: {$totalPresence}
  </div>
</div>
SvelteKit SSR
Coming Soon
Server-side rendering with SvelteKit. Shows proper client-side initialization and hydration patterns.
<!-- src/routes/chat/+page.svelte -->
<script>
  import { createChannelStore } from 'oddsockets-svelte-sdk/stores';
  import { onMount } from 'svelte';
  import { browser } from '$app/environment';
  
  let channelStore;
  let messages = [];
  let presence = [];
  
  onMount(() => {
    if (browser) {
      channelStore = createChannelStore('chat', {
        apiKey: 'ak_your_api_key_here'
      });
      
      // Subscribe to reactive stores
      channelStore.messages.subscribe(value => {
        messages = value;
      });
      
      channelStore.presence.subscribe(value => {
        presence = value;
      });
      
      channelStore.subscribe();
    }
  });
</script>

<svelte:head>
  <title>Chat - SvelteKit App</title>
</svelte:head>

<div class="sveltekit-chat">
  {#if browser}
    <div class="messages">
      {#each messages as message}
        <div class="message">{message.data.text}</div>
      {/each}
    </div>
    
    <div class="presence">
      Online: {presence.length}
    </div>
  {:else}
    <div class="loading">Loading chat...</div>
  {/if}
</div>
Presence Tracking
Coming Soon
Track user presence with reactive updates. Shows who's online, typing indicators, and user activity status.
<script>
  import { createPresenceStore } from 'oddsockets-svelte-sdk/stores';
  import { onMount } from 'svelte';
  
  const { 
    presence, 
    presenceCount, 
    subscribe,
    updatePresence
  } = createPresenceStore('lobby', {
    apiKey: 'ak_your_api_key_here',
    userId: 'user123'
  });
  
  onMount(() => {
    subscribe();
    
    // Update presence with user info
    updatePresence({
      status: 'online',
      avatar: '/avatar.jpg',
      lastSeen: new Date().toISOString()
    });
  });
</script>

<div class="presence-panel">
  <h3>Online Users ({$presenceCount})</h3>
  
  <div class="user-list">
    {#each $presence as user}
      <div class="user-item">
        <img src={user.avatar} alt={user.userId} />
        <span class="username">{user.userId}</span>
        <span class="status" class:online={user.status === 'online'}>
          {user.status}
        </span>
      </div>
    {/each}
  </div>
</div>
Analytics Dashboard
Coming Soon
Real-time analytics dashboard with reactive charts and metrics. Perfect for monitoring application performance.
<script>
  import { createAnalyticsStore } from 'oddsockets-svelte-sdk/stores';
  import { onMount } from 'svelte';
  
  const { 
    messageStats,
    connectionStats,
    errorStats
  } = createAnalyticsStore({
    apiKey: 'ak_your_api_key_here'
  });
  
  onMount(() => {
    // Analytics store automatically tracks metrics
  });
</script>

<div class="analytics-dashboard">
  <div class="metric-card">
    <h3>Messages</h3>
    <div class="metric-value">
      {$messageStats.totalMessages}
    </div>
    <div class="metric-rate">
      {$messageStats.messagesPerSecond}/sec
    </div>
  </div>
  
  <div class="metric-card">
    <h3>Connections</h3>
    <div class="metric-value">
      {$connectionStats.totalConnections}
    </div>
    <div class="metric-uptime">
      Uptime: {Math.floor($connectionStats.uptime)}s
    </div>
  </div>
  
  <div class="metric-card">
    <h3>Errors</h3>
    <div class="metric-value">
      {$errorStats.totalErrors}
    </div>
    <div class="metric-rate">
      Rate: {$errorStats.errorRate.toFixed(2)}/sec
    </div>
  </div>
</div>