🚀 Top-level await in AWS Lamba with TypeScript

On version 14.8.0 release, almost two years ago, Node.js closed the issue#34558, called module: unflag Top-Level Await. From version 14.8 we can use await outside an async function inside an ES module.

After almost two years, we still find Node.js code not taking advantage of it. Furthermore, the complexity of configuring it increases when we consider the usage of bundlers and compilers, like esbuild or TypeScript.

Execution performance

In ephemeral environments like AWS Lambda, any millisecond we can shave is a flawless victory. Earlier this year, the AWS Lambda runtime added full support for Node.js 14+ features.

As Dan Fox (Principal Specialist Solutions Architect Serverless) explained in his article, we can see around ~45% performance improvements:

Transpiling TypeScript to ES Modules

With a combination of AWS Lambda Serverless development tools, we can easily take advantage of these improvements.

My example uses:

The secret sauce is to configure esbuild to output Node.js ES modules files with .mjs extension with the following esbuild options:

format: "esm"
outputFileExtension: ".mjs"
platform: "node"
target: "esnext"

With that in place, you can have a fully typed AWS Lambda code in TypeScript and take advantage of executing await outside the handler function, improving the response time for the service consumers.

You can check the entire demo on my GitHub:



Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store