npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@alt-javascript/boot-lambda

v3.0.7

Published

AWS Lambda adapter for @alt-javascript boot — CDI-managed serverless with controller auto-registration

Downloads

735

Readme

@alt-javascript/boot-lambda

Language npm version License: MIT CI

AWS Lambda adapter for the @alt-javascript framework. Handles API Gateway HTTP API v2 events with CDI-managed controllers and a CDI middleware pipeline for cross-cutting concerns.

CDI boots once on cold start and is reused on warm invocations — the same pattern as Spring's ApplicationContext in a serverless launcher.

Part of the @alt-javascript monorepo.

Install

npm install @alt-javascript/boot-lambda

Usage

// handler.js (your Lambda entry point)
import { Boot } from '@alt-javascript/boot';
import { Context, Singleton } from '@alt-javascript/cdi';
import { lambdaStarter } from '@alt-javascript/boot-lambda';
import { TodoService } from './services.js';
import { TodoController } from './controllers.js';

const context = new Context([
  ...lambdaStarter(),
  new Singleton(TodoService),
  new Singleton(TodoController),
]);

// Boot once — CDI is wired on cold start; run: false skips any HTTP server lifecycle
const appCtxPromise = Boot.boot({ contexts: [context], run: false });

export async function handler(event, lambdaContext) {
  const appCtx = await appCtxPromise;
  return appCtx.get('lambdaAdapter').handle(event, lambdaContext);
}

Controller Convention

Controllers use the same __routes metadata as all other adapters. Path parameters use API Gateway {param} syntax (Express-style :param is auto-converted):

class TodoController {
  static __routes = [
    { method: 'GET',    path: '/todos',      handler: 'list'   },
    { method: 'POST',   path: '/todos',      handler: 'create' },
    { method: 'GET',    path: '/todos/{id}', handler: 'get'    },
    { method: 'DELETE', path: '/todos/{id}', handler: 'remove' },
  ];

  constructor() { this.todoService = null; } // autowired

  async list(request)   { return this.todoService.findAll(); }
  async create(request) { return this.todoService.create(request.body); }
  async get(request)    { return this.todoService.findById(request.params.id); }
  async remove(request) { return this.todoService.delete(request.params.id); }
}

Handlers return a plain object (200 JSON), { statusCode, body } (explicit status), or null / undefined (204 No Content).

Middleware Pipeline

lambdaStarter() registers three built-in middleware components:

| Component | Order | Behaviour | |---|---|---| | RequestLoggerMiddleware | 10 | Logs [METHOD] /path → status (Xms) | | ErrorHandlerMiddleware | 20 | Converts thrown errors to JSON error responses | | NotFoundMiddleware | 30 | Returns 404 for unmatched routes |

Add custom middleware by declaring static __middleware = { order: N }:

class AuthMiddleware {
  static __middleware = { order: 5 };

  async handle(request, next) {
    const token = request.headers.authorization?.replace('Bearer ', '');
    if (!token) return { statusCode: 401, body: { error: 'Unauthorized' } };
    return next({ ...request, user: { token } });
  }
}

const context = new Context([
  ...lambdaStarter(),
  new Singleton(AuthMiddleware), // auto-detected — no extra wiring
  new Singleton(TodoController),
]);

Configuration

Config comes from process.env via EnvPropertySource. Use AWS SSM Parameter Store or Secrets Manager to inject environment variables at deploy time.

| Key | Default | Description | |---|---|---| | middleware.requestLogger.enabled | true | Enable request logging | | middleware.errorHandler.enabled | true | Enable error handler | | middleware.notFound.enabled | true | Enable 404 handler |

Testing

Test the handler directly with API Gateway v2 event shapes — no AWS account needed:

import { handler } from '../handler.js';

const event = {
  routeKey: 'GET /todos',
  pathParameters: {},
  queryStringParameters: {},
  headers: { authorization: 'Bearer mytoken' },
  body: null,
  isBase64Encoded: false,
};

const res = await handler(event, {});
assert.equal(res.statusCode, 200);

Spring Attribution

The cold-start / warm-reuse pattern maps to a Spring ApplicationContext held in a static field inside a serverless launcher — a common pattern for running Spring Boot in AWS Lambda.

License

MIT