New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@genie-solutions/lambda-toolbelt

Package Overview
Dependencies
Maintainers
8
Versions
32
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@genie-solutions/lambda-toolbelt

Toolbelt for creating Lambda functions

  • 2.4.0
  • npm
  • Socket score

Version published
Weekly downloads
40
increased by700%
Maintainers
8
Weekly downloads
 
Created
Source

Genie Lambda Toolbelt

Set of reusable tools to make writing new Lambda functions a breeze.

How to publish a new version

After your branch has been merged into master:

  1. Checkout the master branch: git checkout master.
  2. Pull down the latest changes on master: git pull.
  3. Run the correct command out of the following, depending on if your change was a patch (bug fix), minor (non-breaking change), major (breaking change): 3.1 Patch: npm version patch 3.2 Minor: npm version minor 3.3 Major: npm version major

Sample Usage

import { applyMiddleware, httpHandler, withJSONBody, HTTPEvent, HTTPContext } from '@genie-solutions/lambda-toolbelt';

const myHelloWorldFunction = async (event: HTTPEvent, context: HTTPContext): Promise<object> => {
  const { genie: { body } } = context;
  return {
    message: `Hello, ${body.name}`,
  };
};

export default applyMiddleware(httpHandler, withJSONBody)(myHelloWorldFunction);

sqsHandler

import {
  sqsHandler,
  SQSCallback,
} from '../src/index';

interface MySqsRecordBody {
  a: string,
  b: number,
  c?: number[],
}

const mySuperSweetFunction: SQSCallback<MySqsRecordBody> = async (sqsRecordBody: MySqsRecordBody, sqsRecord?: AWSLambda.SQSRecord): Promise<object> => {
  console.log('a is:', sqsRecordBody.a);
  console.log('b is:', sqsRecordBody.b);
  console.log('c is:', sqsRecordBody.c);
  console.log('sqsRecord is:', sqsRecord);
  return {};
};

export default sqsHandler<MySqsRecordBody>(mySuperSweetFunction, ['a', 'b']);

withJWTPayload

Automatically verifies and parses the payload of a JWT token being provided via a HTTP header.

Example:

import { createParameterStore, applyMiddleware, httpHandler, withJWTPayload } from '@genie-solutions/lambda-toolbelt';

const mySuperSecretFunction = async (event: HTTPEvent, context: HTTPContext): Promise<object> => {
  const { userId, tenantId, roleId } = context.genie.jwt.role;
  return Promise.resolve('Oll Korrect (yep, that is what OK stands for)');
};

const parameterStore = createParameterStore();
const getPublicKey = () => parameterStore('JWT_PUBLIC_KEY');

export default applyMiddleware(
  httpHandler,
  withJWTPayload({
    getPublicKey,
    algorithm: 'RS256',
    headerName: 'X-GENIE-ROLES',
    payloadKey: 'role',
  }),
)(mySuperSecretFunction);

withParameters

Automatically add parameters into genie context and validate any required params.

Example:

import {
  applyMiddleware,
  httpHandler,
  withJSONBody,
  withParameters,
  HTTPEvent,
  HTTPContext
} from '@genie-solutions/lambda-toolbelt';

// These interfaces should be in type.ts, here is just quick example
interface MyPathParamsContext {
  pathParameters: {
    pathParam1: string;
  }
}

interface MyQueryStringParamsContext {
  queryStringParameters: {
    qsParam1: string;
    qsParam2: string;
  }
}

interface MyBodyContext {
  body: {
    bodyParam1: string;
    bodyParam2: number;
  }
}

type MyCustomContext = HTTPContext<MyBodyContext & MyPathParamsContext & MyQueryStringParamsContext>;

const mySuperSweetFunction = async (event: HTTPEvent, context: MyCustomContext): Promise<object> => {
  const genie = context.genie;
  const { pathParam1 } = genie.pathParameters;
  const { qsParam1, qsParam2 } = genie.queryStringParameters;
  const { bodyParam1, bodyParam2 } = genie.body;

  return {};
};

export default applyMiddleware(
  httpHandler,
  withJSONBody,
  withParameters({
    // These fields should be defined when actually required
    requiredPathParams: ['pathParam1'],
    requiredJsonBodyParams: ['bodyParam1', 'bodyParam2'],
    requiredQueryStringParams: ['qsParam1', 'qsParam2'],
  }),
)(mySuperSweetFunction);

withClientId

Automatically validate required clientId and assign to genie

Example:

import { applyMiddleware, httpHandler, withClientId, withJSONBody, HTTPContext, ClientIdContext } from '@genie-solutions/lambda-toolbelt';

// These interfaces should be in type.ts, here is just quick example
type MyCustomContext = HTTPContext<ClientIdContext>;

const mySuperSweetFunction = async (event: HTTPEvent, context: MyCustomContext): Promise<object> => {
  const { genie: { clientId } } = event;

  return {};
};

export default applyMiddleware(
  httpHandler,
  withJSONBody,
  withClientId,
)(mySuperSweetFunction);

HOW TO EXTEND HTTPContext

Many times you will want to custom your own HTTPContext and extends it with many other available Context such as ClientIdContext, JwtContext To do this, you can leverage HTTPContext<T1 & T2 & ... & TN> to mix n-contexts into One Final Interface

Example:

import {
  applyMiddleware,
  httpHandler,
  withClientId,
  withJSONBody,
  HTTPEvent,
  HTTPContext,
  JwtContext,
  ClientIdContext
} from '@genie-solutions/lambda-toolbelt';

interface MyBodyContext {
  body: {
    bodyParam1: string;
    bodyParam2: number;
  }
}

type MyCustomContext = HTTPContext<MyBodyContext & ClientIdContext & JwtContext>;

const mySuperSweetFunction = async (event: HTTPEvent, context: MyCustomContext): Promise<object> => {
  // Then you can use your Customized Context with the combined structure
  const genie = context.genie;
  const { bodyParam1, bodyParam2 } = genie.body;
  const { roles } = genie.jwt;
  const { clientId } = genie;

  return {};
};

export default applyMiddleware(
  httpHandler,
  withJSONBody,
  withClientId,
)(mySuperSweetFunction);

FAQs

Package last updated on 26 Aug 2019

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc