1.0.1 • Published 3 years ago

aws-websocket-handler v1.0.1

Weekly downloads
5
License
MIT
Repository
github
Last release
3 years ago

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:

ParamDescriptionRequired
actionsArray of ActionsHandlersoptional
middlewaresArray of Middlewaresoptional
fallbackFallback promise to be invoked if no action expression is foundoptional
enableLoggingBoolean param to enable simple loggingoptional
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' }
},