This module is created to handle AWS Lambda websocket actions as a one default handler. There are multiple benefits of doing so:
- all actions are handled by one lambda function;
- no cold start for actions, which are rarely used;
- the codebase is sharable accross all actions;
When you want to use WebSocket API in API Gateway, which are integrated with Lambda functions it is required to specify two mandatory routes $connect and $disconnect. The approach is presented in detail here. Instead of specifing all actions as separate functions we use here a power of $default route, which is invoked every time no matching expresion is found. This package use action
parameter from payload.
- Install the package:
npm i aws-websocket-handler
- Use in your lambda handler:
// Typescript
import { APIGatewayProxyEvent, Context } from 'aws-lambda';
import { Configuration, websocketHandler } from 'aws-websocket-handler';
import { validateToken } from './middlewares/validateToken';
import { simpleAction } from './actions/simple';
const config: Configuration = {
actions: [
{
name: 'simple',
handler: simpleAction,
},
],
middlewares: [validateToken],
};
exports.handler = async (
event: APIGatewayProxyEvent,
context: Context
): Promise<AWSLambda.APIGatewayProxyResult | AWSLambda.APIGatewayProxyStructuredResultV2> => {
return websocketHandler(event, context, config);
};
// Javascript
const { websocketHandler } = require("aws-websocket-handler");
const { validateToken } = require("./middlewares/validateToken");
const { simpleAction } = require("./actions/simple");
const config = {
actions: [
{
name: 'simple',
handler: simpleAction,
}
],
middlewares: [validateToken],
};
exports.handler = async (event, context) => {
return websocketHandler(event, context, config);
};
Param | Description | Required |
---|---|---|
actions | Array of ActionsHandlers | optional |
middlewares | Array of Middlewares | optional |
fallback | Fallback promise to be invoked if no action expression is found | optional |
enableLogging | Boolean param to enable simple logging | optional |
Name corresponds to Event.body.action
, if the expression matches, the handler function is invoked.
const simpleAction = async (event, context, runData) => {
console.log(runData);
return {};
};
const validateToken = async (event, _context, runData) => {
const { token } = JSON.parse(event.body);
if (!token)
throw new Error('No token');
let tokenData;
try {
tokenData = JWT.verify(token, config_1.KEY);
}
catch (e) {
throw new Error(e.message);
}
return { ...runData, tokenData };
};
const fallback = async () => {
return { statusCode: 200, body: 'fallback' }
},