DocumentationFundamentals

JavaScript app

Receive webhooks directly inside your application without public IP

Webhook Relay's Socket Server allows users to receive webhooks inside their application without having public IP, domain or even running a web server themselves. Here's a short example application written in JavaScript that subscribes to a stream of webhooks:

The code

// client.js
const WebSocket = require('ws');

const ws = new WebSocket('wss://my.webhookrelay.com/v1/socket');

var apiKey = process.env.RELAY_KEY;
var apiSecret = process.env.RELAY_SECRET;![](2023-08-27-22-40-21.png)

ws.on('open', function open() {
  // on connection, send our authentication request
  ws.send(JSON.stringify({action: 'auth', key: apiKey, secret: apiSecret}));  
});

ws.on('close', function close() {
  console.log('disconnected');
});

ws.on('message', function incoming(data) {
  console.log(data)
  var msg = JSON.parse(data);
  if (msg.type === 'status' && msg.status === 'authenticated') {
    // if we got authentication confirmation, send subscribe event to the server
    ws.send(JSON.stringify({action: 'subscribe', buckets: ['123']}));
  }
});

Install websocket library

We will use the ws library for websocket connectivity. It's extremely popular (https://www.npmjs.com/package/ws) and should have a decent support:

npm i ws

Set token key and secret

Generate your access key and secret in the tokens page

export RELAY_KEY=your-token-key
export RELAY_SECRET=your-token-secret

Start the application

To start it, use node directly:

node client.js

Now, if you send a webhook to your public input endpoint, you should see something similar:

$ node client.js
{"type":"status","status":"authenticated","message":"connected successfully, subscribe to buckets"}
{"type":"status","status":"subscribed","message":"subscribed to buckets: 123"}
{"type":"webhook","meta":{"bucked_id":"89e44c32-27ff-4832-8655-8a42d3851b6f","bucket_name":"123","input_id":"ee4ac550-12a4-41a7-837d-dd3356ed1771","input_name":"Default public endpoint"},"headers":{"Content-Length":["15"],"User-Agent":["insomnia/6.0.2"],"Cookie":["__cfduid=dc244a014f0b1e2965544ddb483c3fe1b1525866866"],"Content-Type":["application/json"],"Accept":["*/*"]},"query":"","body":"{\"hi\": \"there\"}","method":"PUT"}
Did this page help you?