table of contents Table of contents

WebSockets

To create a WebSocket check in Checkly, you’ll need to write a script that establishes a WebSocket connection, sends messages, and validates responses.

Set Up the WebSocket Connection

First, we’ll establish a connection to the WebSocket server. Replace wss://your.websocketserver.com with the URL of your WebSocket server.

import { WebSocket } from 'ws'

const url = 'wss://your.websocketserver.com';
const ws = new WebSocket(url);
const WebSocket = require('ws');

const url = 'wss://your.websocketserver.com';
const ws = new WebSocket(url);

Handle WebSocket Events

Handle the key events like opening the connection, receiving messages, and encountering errors.

ws.on('open', () => {
  console.log('WebSocket connection established.');
  // Send initial message or subscription here, if necessary.
});

ws.on('message', (data) => {
  console.log('Received message:', data);
  // Add your message handling logic here.
});

ws.on('error', (error) => {
  console.error('WebSocket error:', error);
});

Sending and Receiving Messages

Implement the logic for sending messages and processing the received responses.

function sendMessage(message) {
  if (ws.readyState === WebSocket.OPEN) {
    ws.send(message);
    console.log(`Message sent: ${message}`);
  } else {
    console.error('WebSocket is not open. Unable to send message.');
  }
}

Close the Connection

Ensure to properly close the WebSocket connection after your checks.

ws.on('close', () => {
  console.log('WebSocket connection closed.');
});

Example: Monitoring a WebSocket Connection

Here’s the complete example script that demonstrates a WebSocket check. It sends a subscription message, prints out the echo’d response, handles different types of incoming messages and closes the connection after 5 seconds. We’ve also added an object assertion to check the data returned from the WebSocket is correct. If the message does not match, the script will throw an error, indicating a discrepancy in the expected data.

import { WebSocket } from 'ws';
import { expect } from 'expect';

const url = 'wss://echo.websocket.org';
const ws = new WebSocket(url);

let isFirstMessage = true; // Flag to track the first message

ws.on('open', () => {
  console.log('WebSocket connection established.');
  sendMessage(JSON.stringify({ action: 'subscribe', channel: 'updates' }));

  // Close the connection after 5 seconds
  setTimeout(() => {
    ws.close();
    console.log('WebSocket connection closed after 5 seconds.');
  }, 5000); // 5000 milliseconds = 5 seconds
});

ws.on('error', (error) => {
  console.error('WebSocket error:', error);
});

ws.on('message', (data) => {
  if (isFirstMessage) { // Handle the first non-JSON message here
    const messageString = data.toString('utf-8'); // or 'ascii' if you know it's ASCII
    console.log('First message (non-JSON):', messageString);
    isFirstMessage = false; // Update the flag after handling the first message
  } else { // Process JSON echo response
    try {
      const message = JSON.parse(data);
      if (message) {
        console.log('Notification received:', message);
        // Add an assertion to confirm the JSON returned is the same as what we sent
        expect(message).toMatchObject({ "action": "subscribe", "channel": "updates" })
      }
    } catch (error) {
      console.error('Error parsing received message:', error);
    }
  }
});

ws.on('close', () => {
  console.log('WebSocket connection closed.');
});

function sendMessage(message) {
  if (ws.readyState === WebSocket.OPEN) {
    ws.send(message);
    console.log(`Message sent: ${message}`);
  } else {
    console.error('WebSocket is not open. Unable to send message.');
  }
}

Don’t forget the essentials:

  • Error Handling: Implement robust error handling for scenarios like connection failures and timeouts.
  • Message Validation: Add logic to validate incoming messages to ensure data integrity.
  • Closing Connections: Always close the WebSocket connection gracefully to avoid resource leaks.

Last updated on May 8, 2024. You can contribute to this documentation by editing this page on Github