Sling Academy
Home/JavaScript/Implement Chat, Stock Tickers, and More via JavaScript Server Sent Events

Implement Chat, Stock Tickers, and More via JavaScript Server Sent Events

Last updated: December 13, 2024

In real-time web applications, keeping clients updated with the latest information is crucial. Server-Sent Events (SSE) present an efficient mechanism to push updates from the server to the client-side, reducing the need for constant polling. Unlike WebSockets that offer a bidirectional communication pathway, SSE is unidirectional – updates flow from server to client only. It's incredibly useful for applications like chat systems, live stock tickers, news feeds, and more. Here's how you can implement SSE using JavaScript.

Setting up Server-Sent Events

Before diving into the implementation, it's important to understand how SSE works under the hood. The server maintains an open connection and sends updates as text/event-stream formatted messages. Let's walk through setting up a basic server and client to handle SSE.

Creating a Basic Node.js Server

Firstly, create a simple Node.js server that sends a message to the client every few seconds.

const http = require('http');

http.createServer((req, res) => {
  if (req.url === '/events') {
    res.writeHead(200, {
      'Content-Type': 'text/event-stream',
      'Cache-Control': 'no-cache',
      'Connection': 'keep-alive'
    });
    setInterval(() => {
      res.write("data: Hello from the server\n\n");
    }, 1000);
  }
}).listen(8000, () => console.log('Server is running on port 8000'));

Connecting via Client-Side JavaScript

Once the Node.js server is set, establish a connection on the client-side with EventSource, a built-in JavaScript interface for handling SSE.

document.addEventListener('DOMContentLoaded', () => {
  const eventSource = new EventSource('http://localhost:8000/events');

  eventSource.onmessage = function(event) {
    console.log('New message from server:', event.data);
    document.body.innerHTML += '' + event.data + '';
  };

  eventSource.onerror = function() {
    console.error('EventSource failed.');
  };
});

The EventSource object takes the URL of the server endpoint that emits events. In this example, it listens for new events using the onmessage handler, and appends the data to the document body.

Implementing a Chat System

Let's expand on the basics to create a simple chat application. This will involve a Node.js server to broadcast messages and a client to receive and display them.

Server Code for Chat Broadcast

Enhance the server to accept chat messages and broadcast them to all connected clients.

const http = require('http');
const clients = [];

http.createServer((req, res) => {
  if (req.method === 'POST' && req.url === '/message') {
    let body = '';
    req.on('data', chunk => { body += chunk; });
    req.on('end', () => {
      clients.forEach(client => client.write(`data: ${body}\n\n`));
      res.end('Message sent\n');
    });
  } else if (req.url === '/events') {
    res.writeHead(200, {
      'Content-Type': 'text/event-stream',
      'Cache-Control': 'no-cache',
      'Connection': 'keep-alive'
    });
    clients.push(res);
    req.on('close', () => {
      clients.splice(clients.indexOf(res), 1);
    });
  }
}).listen(8000, () => console.log('Server running on port 8000'));

Client-Side Chat Message Handling

The client can now send and receive chat messages:

const form = document.querySelector('form');
form.addEventListener('submit', (event) => {
  event.preventDefault();
  const message = document.getElementById('message').value;

  fetch('http://localhost:8000/message', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
    },
    body: `message=${message}`
  });
});

Each user can send their chat messages using a form which posts data to the server, which then broadcasts it to all other connected clients using SSE.

Conclusion

With a few lines of JavaScript and Node.js, you can establish a robust real-time update system utilizing Server-Sent Events. This technology elegantly serves use-cases where the load is primarily server-to-client, offering simplicity and efficiency over full-duplex solutions like WebSockets. From straightforward chat systems to dynamic data dashboards like stock tickers, SSE can be a transformative component of your web application stack.

Next Article: Reduce Network Load by Pushing Data to JavaScript Clients

Previous Article: Stream Live Data Without Polling Using JavaScript SSE

Series: Web APIs – JavaScript Tutorials

JavaScript

You May Also Like

  • Handle Zoom and Scroll with the Visual Viewport API in JavaScript
  • Improve Security Posture Using JavaScript Trusted Types
  • Allow Seamless Device Switching Using JavaScript Remote Playback
  • Update Content Proactively with the JavaScript Push API
  • Simplify Tooltip and Dropdown Creation via JavaScript Popover API
  • Improve User Experience Through Performance Metrics in JavaScript
  • Coordinate Workers Using Channel Messaging in JavaScript
  • Exchange Data Between Iframes Using Channel Messaging in JavaScript
  • Manipulating Time Zones in JavaScript Without Libraries
  • Solving Simple Algebraic Equations Using JavaScript Math Functions
  • Emulating Traditional OOP Constructs with JavaScript Classes
  • Smoothing Out User Flows: Focus Management Techniques in JavaScript
  • Creating Dynamic Timers and Counters with JavaScript
  • Implement Old-School Data Fetching Using JavaScript XMLHttpRequest
  • Load Dynamic Content Without Reloading via XMLHttpRequest in JavaScript
  • Manage Error Handling and Timeouts Using XMLHttpRequest in JavaScript
  • Handle XML and JSON Responses via JavaScript XMLHttpRequest
  • Make AJAX Requests with XMLHttpRequest in JavaScript
  • Customize Subtitle Styling Using JavaScript WebVTT Integration