Typescript framework for AWS API Gateway and Lambda
- Supports HTTP verbs method mapping. See Sample Convention
- Supports event inject fallback. See Sample
- Supports body mapping variable alias.
- Supports multiple HTTP verbs to a method. See sample.
- Supports catch all http verbs. See sample.
- Supports method call before lambda function timeout. See sample
- Supports method call before running lambda callback(). See sample
- Supports route mapping and path parameter parsing. See sample
import { LambdaHandler, Lambda, Event, Context, Callback, PostConstructor } from 'lambda-phi';
import { Get, Put, Post, Delete, Headers, PathParams, QueryParams, Method, Body } from 'lambda-phi/lib/api-gateway';
@Lambda()
class LambdaClass {
@Context() context;
@Callback() callback;
@Event() event;
@Headers() headers; // Content-Type, Authorization, etc..
@PathParams() pathParams; // /users/{id} --> this.pathParams.id
@QueryParams() queryParams; // ?param1=value1 --> this.queryParams.param1
@Method() method; // GET, POST, ...
@Body() body; // HTTP request body content
@PostConstructor()
public postConstructor() {
console.log("post constructor");
}
@Get()
public getRequest() { this.callback(null, "HTTP get request"); }
@Put()
public putRequest() { this.callback(null, "HTTP put request"); }
@Post()
public postRequest() { this.callback(null, "HTTP Post request"); }
@Delete()
public deleteRequest() { this.callback(null, "HTTP Delete request"); }
}
exports.handler = LambdaHandler;
This framework adds fallback to common event
mapping fields, specially if you're using default passthrough or proxy template
- event.body
- event['body-json']
- event.headers
- event.params.header
- event.method
- event.httpMethod
- event.context['http-method']
- event.pathParams
- event.pathParameters
- event.params.path
- event.queryParams
- event.queryStringParameters
- event.params.querystring
- event.stageVariables
- event['stage-variables]
- event.context
- event.requestContext
//...
class A {
//...
@QueryParams('qParams') qParams;
//...
}
//...
//...
class A {
//...
@PathParams(['pParams', 'pathParams', 'pathParameters'])
pathParams;
//...
}
//...
//...
class A {
//...
@Method('context.http-method') method;
//...
}
//...
//...
class PutAndPost {
//...
@Put()
@Post()
public putAndPostMethod() { this.callback(null, "HTTP put request"); }
//...
}
//...
//...
class UsingAny {
// This method will be called if the method type is PUT,POST,GET, etc..
@Any()
public otherwiseMethod() { this.callback(null, "I'm a passthrough method"); }
//...
}
//...
If you want to call a method 2 seconds before your lambda function reach its timeout limit
@PreLambdaTimeout(2000)
public beforeLambdaTimeout() {
console.log("run me before timeout ", this.context.getRemainingTimeInMillis());
}
If you want to call a method before running lambda callback() function
tasks:string[] = [];
@PreLambdaCallback()
public beforeLambdaCallback() {
this.tasks.push("Do this pre callback task");
}
@Any()
public anyHandler() {
this.tasks.push("Do this task");
this.callback(null, this.tasks);
}
Output: ["Do this task","Do this pre callback task"]
Path uses path-to-regexp package for pattern matching. The default resource path is parse from event.context['resource-path']
@Path('/my/path')
public myPath() {
this.callback(null, "serving /my/path/ request");
}
@Path('/v1')
@Lambda()
class WithBasePath {
@Path('/my/path')
public myPath() {
this.callback(null, "this matches /v1/my/path request");
}
@Path('/my/path2')
public myPath2() {
this.callback(null, "this matches /v1/my/path2 request");
}
}
@PathConfig({resourcePathVariable: 'context.resource-path'})
@Lambda()
class WithBasePath {
@Path('/sample/path')
public samplePath() {
this.callback(null, "this matches /sample/path request");
}
}
@Path('/book/:id')
public book(@PathParam('id') bookId) {
this.callback(null, "I got bookId: "+bookId);
}
@Path('/book/:id/:author')
public book(@PathParam('id') bookId, @PathParam('author') author) {
this.callback(null, "I got bookId: "+bookId+", author: "+author);
}
@Path('/allow/get/and/post')
@Post()
@Get()
public allowGetAndPost() {
this.callback(null, "You can only trigger this method with GET and POST requests")
}