Skip to content

Instantly share code, notes, and snippets.

@dhavaln
Created February 16, 2024 07:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dhavaln/9169912b6cf5d3785f55d2bf190d1441 to your computer and use it in GitHub Desktop.
Save dhavaln/9169912b6cf5d3785f55d2bf190d1441 to your computer and use it in GitHub Desktop.
AppSync NodeJS Websocket Subscription listener
'use client';
import WebSocket from 'ws';
let region = 'us-east-1';
let appsyncID = process.env.APPSYNC_ID;
let apiKey = process.env.APPSYNC_API_KEY
let url = `wss://${appsyncID}.appsync-realtime-api.${region}.amazonaws.com/graphql`
const api_header = {
host: `${appsyncID}.appsync-api.${region}.amazonaws.com`,
'x-api-key': apiKey,
};
let ws = new WebSocket(url, ['graphql-ws']);
// payload should be an empty JSON object
const payload = {};
const base64_api_header = btoa(JSON.stringify(api_header));
const base64_payload = btoa(JSON.stringify(payload));
const appsync_url = url + '?header=' + base64_api_header + '&payload=' + base64_payload;
ws = new WebSocket(appsync_url, ['graphql-ws']);
ws.onopen = (e) => {
console.log('Socket opened');
ws.send(JSON.stringify({ type: "connection_init" }));
let listen = JSON.stringify({
"id": "1", // change this to UUID
"type": "start",
"payload": {
"variables": {
},
"extensions": {
"authorization": api_header
},
"operationName": null,
"data": JSON.stringify({ "query": "subscription {\n subscribe(name: \"robots\") {\n data \n }\n}\n" }) // "robots" is the channel name
}
})
ws.send(listen)
};
ws.onmessage = (e) => {console.log('Msg received', e.data);};
ws.onclose = (e) => {console.log('Socket closed', e);};
ws.onerror = (e) => {console.log('Socket error', e);};
/**
* Follow this documentation for more detail
* https://docs.aws.amazon.com/appsync/latest/devguide/aws-appsync-real-time-create-generic-api-serverless-websocket.html
* https://docs.aws.amazon.com/appsync/latest/devguide/real-time-websocket-client.html
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment