Iam Role
Events handled by CreateSocket labmda:
- Connect
-
- Do Not Message the client from the $connect route. If you do this, it’ll give you an error. This is because the connection is not established yet at that point. Use callback instead.
- We need the “connectionId ”to send a message back to the client. “domainName” and “stage” is needed for this purpose as well since the URL has to be formatted in a specific way. Of course we can use the HTTP Url without creating the URL from the “domainName” and “stage”, but then the main purpose of using a serverless approach is omitted.
-
- Disconnect
- Default
- Sending a message back to client will happen here
"use strict"; const AWS = require("aws-sdk"); module.exports.handler = (event, context, callback) => { createSocket(event, callback); }; const createSocket = async (event, callback) => { try { if (event.requestContext) { const { connectionId, routeKey, domainName, stage } = event.requestContext; switch (routeKey) { case "$connect": break; case "$disconnect": break; default: const callbackUrlForAWS = `https://${domainName}/${stage}`; sendMessageToClient(callbackUrlForAWS, connectionId, { connectionId: connectionId, callbackUrlForAWS: callbackUrlForAWS, }); break; } } callback(null, { statusCode: 200, }); } catch (error) { console.log("ERROR==>", error); callback(null, { statusCode: 500, }); } }; const sendMessageToClient = (url, connectionId, payload) => new Promise((resolve, reject) => { const apiGatewayManagementApi = new AWS.ApiGatewayManagementApi({ apiVersion: "2018-11-29", endpoint: url, }); apiGatewayManagementApi.postToConnection( { ConnectionId: connectionId, Data: JSON.stringify(payload), }, (err, data) => { if (err) { console.log("sendMessageToClient ERROR==>", err); reject(err); } resolve(data); } ); });
Asynchronous Client Interaction in AWS Serverless (good graphes comparing all approaches)