2.1.0 • Published 1 year ago

aws-lambda-consumer v2.1.0

Weekly downloads
151
License
ISC
Repository
github
Last release
1 year ago

aws-lambda-consumer

Utility types that convert the handler functions found in @types/aws-lambda into the asynchronous and synchronous signatures that are intended to be implemented.

The Problem

The AWS services that use the handler functions we write expect us to either use a provided callback method and return nothing, or ignore the callback and return a Promise. Therefore, @types/aws-lambda defines the Handler type as

export type Handler<TEvent = any, TResult = any> = (
    event: TEvent,
    context: Context,
    callback: Callback<TResult>,
) => void | Promise<TResult>;

This is technically correct, but as users of the library, it doesn't represent the functions we are supposed to write:

  • If we use the callback approach, we should never return a Promise, and
  • If we write an async handler, then
    • The callback parameter shouldn't even exist and * The return type should only be a Promise, and not void | Promise

As an example, let's write a lambda handler function. We will declare its type, so future maintainers will know what we intended, and so that the IDE can help us out:

// main.ts
export const myHandler: Handler<MyEvent, MyResult> = async ...

Writing tests is now difficult. We get the following types of errors:

// main.test.ts
it.('should work', async (done) => {

	let actual: MyResult = await myHandler(myEvent, myContext);
	// 1. Expected 3 arguments, but got 2.
	// 2. Type 'MyResult | void' is not assignable to type 'MyResult'.
});

The Solution

This module exports 2 utility types, - SyncHandler and AsyncHandler - that transform the handlers from @types/aws-lambda into the types that are intended to be implemented.

Example

import { AsyncHandler, SyncHandler } from "aws-lambda-consumer"
import { APIGatewayProxyHandler } from "aws-lambda"

// (event: APIGatewayProxyEvent, context: Context, callback: Callback<APIGatewayProxyResult>) => void
type SyncAPIGatewayProxyHandler  = SyncHandler<APIGatewayProxyHandler>

// (event: APIGatewayProxyEvent, context: Context) => Promise<APIGatewayProxyResult>
type AsyncAPIGatewayProxyHandler = AsyncHandler<APIGatewayProxyHandler>