Skip to content

Instantly share code, notes, and snippets.

@vanduc1102
Last active June 16, 2024 09:34
Show Gist options
  • Save vanduc1102/1387d3358613f0e359430393540fbcb8 to your computer and use it in GitHub Desktop.
Save vanduc1102/1387d3358613f0e359430393540fbcb8 to your computer and use it in GitHub Desktop.
How to implement http push

HTTP push, often referred to as server push, is a technique where the server sends data to the client without the client having to request it. This is typically used in real-time applications like live notifications, chat applications, and live updates. There are several ways to implement HTTP push, such as using WebSockets, Server-Sent Events (SSE), and HTTP/2 Push.

Here's an overview of these methods:

1. WebSockets

WebSockets provide a full-duplex communication channel over a single, long-lived connection. This is suitable for applications that require continuous data exchange.

Example using Node.js with the ws library:

Server (Node.js):

const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', (ws) => {
  console.log('Client connected');
  
  ws.on('message', (message) => {
    console.log(`Received: ${message}`);
  });

  // Send data to the client
  ws.send('Hello from server');
  
  setInterval(() => {
    ws.send('Periodic update from server');
  }, 5000);
});

Client (JavaScript):

const ws = new WebSocket('ws://localhost:8080');

ws.onopen = () => {
  console.log('Connected to server');
};

ws.onmessage = (event) => {
  console.log(`Received: ${event.data}`);
};

ws.onclose = () => {
  console.log('Disconnected from server');
};

2. Server-Sent Events (SSE)

SSE is a server push technology enabling the server to send real-time updates to the client over a single HTTP connection.

Example using Node.js:

Server (Node.js):

const http = require('http');

http.createServer((req, res) => {
  res.writeHead(200, {
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive'
  });
  
  setInterval(() => {
    res.write(`data: ${new Date().toISOString()}\n\n`);
  }, 1000);
}).listen(8080, () => {
  console.log('Server listening on port 8080');
});

Client (JavaScript):

const eventSource = new EventSource('http://localhost:8080');

eventSource.onmessage = (event) => {
  console.log(`Received: ${event.data}`);
};

3. HTTP/2 Push

HTTP/2 server push allows the server to send resources to the client before the client requests them, reducing latency by preemptively delivering resources.

Example using Node.js with the http2 module:

Server (Node.js):

const http2 = require('http2');
const fs = require('fs');

const server = http2.createSecureServer({
  key: fs.readFileSync('server-key.pem'),
  cert: fs.readFileSync('server-cert.pem')
});

server.on('stream', (stream, headers) => {
  if (headers[':path'] === '/') {
    stream.pushStream({ ':path': '/style.css' }, (err, pushStream) => {
      if (err) throw err;
      pushStream.respondWithFile('style.css', { 'content-type': 'text/css' });
    });
    
    stream.respondWithFile('index.html', { 'content-type': 'text/html' });
  }
});

server.listen(8443, () => {
  console.log('Server listening on port 8443');
});

Client (HTML):

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>HTTP/2 Push</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <h1>Hello, HTTP/2 Push!</h1>
</body>
</html>

Conclusion

Choosing the right method depends on your specific use case:

  • WebSockets: Ideal for applications requiring continuous, two-way communication.
  • Server-Sent Events (SSE): Best for one-way, real-time updates from server to client.
  • HTTP/2 Push: Suitable for reducing latency by preemptively delivering resources the client will likely request.

Implementing any of these technologies will enable you to push data to clients efficiently.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment