Skip to content

matrus2/aws-websocket-handler

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

aws-websocket-handler

TypeScript

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;

How it works?

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.

How to use?

  1. Install the package:
npm i aws-websocket-handler
  1. 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);
};

Configuration:

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
ActionsHandler example

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 {};
};

Middleware example
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 };
};

Fallback
const fallback = async () => {
  return { statusCode: 200, body: 'fallback' }
},

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published