npm package: @lti-tool/hono
Description: LTI 1.3 middleware for hono
Author: jamesjoplin
Latest version: 1.0.5

# @lti-tool/hono

<p align="center">Hono middleware for LTI 1.3. Serverless-optimized with automatic route handling.</p>

<p align="center">
  <a href="https://www.npmjs.com/package/@lti-tool/hono"><img alt="npm" src="https://img.shields.io/npm/v/%40lti-tool%2Fhono" /></a>
</p>

## Quick Start

Create a new Hono app

```bash
npm create hono@latest
```

Install the packages

```bash
npm install @lti-tool/core @lti-tool/hono @lti-tool/memory
```

Create a minimal Hono powered LTI tool

```typescript
import { Hono } from 'hono';
import { LTITool } from '@lti-tool/core';
import {
  jwksRouteHandler,
  launchRouteHandler,
  loginRouteHandler,
  secureLTISession,
} from '@lti-tool/hono';
import { MemoryStorage } from '@lti-tool/memory';

// Generate keypair (use proper key management in production)
const keyPair = await crypto.subtle.generateKey(
  {
    name: 'RSASSA-PKCS1-v1_5',
    modulusLength: 2048,
    publicExponent: new Uint8Array([1, 0, 1]),
    hash: 'SHA-256',
  },
  true,
  ['sign', 'verify'],
);

const ltiConfig = {
  stateSecret: new TextEncoder().encode('your-secret'),
  keyPair,
  storage: new MemoryStorage(),
};

const ltiTool = new LTITool(ltiConfig);

const app = new Hono();

// Add LTI routes
app.get('/lti/jwks', jwksRouteHandler(ltiConfig));
app.post('/lti/launch', launchRouteHandler(ltiConfig));
app.post('/lti/login', loginRouteHandler(ltiConfig));

// Protect routes with LTI session
app.use('/protected/*', secureLTISession(ltiConfig));

app.get('/protected/content', (c) => {
  const session = c.get('ltiSession');
  return c.json({ message: `Hello ${session.user.name}!` });
});
```

## Features

- **Automatic Routes** - `/login`, `/launch`, `/jwks` endpoints
- **Session Protection** - Middleware for protected routes
- **Type Safety** - Full TypeScript support with Hono context
- **Error Handling** - Structured error responses
- **Serverless Ready** - Optimized for AWS Lambda, Cloudflare Workers

## API Reference

- [API Reference](https://docs.lti-tool.dev/modules/_lti-tool_hono.html) - Complete API documentation

### Route Handlers

Individual route handlers for LTI endpoints. Each handler takes your LTI configuration.

#### loginRouteHandler(config)

Handles LTI login initiation (OIDC third-party initiated login).

```typescript
import { loginRouteHandler } from '@lti-tool/hono';

app.post('/lti/login', loginRouteHandler(ltiConfig));
```

#### launchRouteHandler(config)

Handles LTI launch verification and session creation.

```typescript
import { launchRouteHandler } from '@lti-tool/hono';

app.post('/lti/launch', launchRouteHandler(ltiConfig));
```

#### jwksRouteHandler(config)

Serves the JSON Web Key Set (JWKS) for platform verification.

```typescript
import { jwksRouteHandler } from '@lti-tool/hono';

app.get('/lti/jwks', jwksRouteHandler(ltiConfig));
```

### secureLTISession(config)

Middleware to protect routes with LTI session validation.

```typescript
import { secureLTISession } from '@lti-tool/hono';

app.use('/protected/*', secureLTISession(ltiTool.config));

app.get('/protected/grades', (c) => {
  const session = c.get('ltiSession'); // Typed LTISession
  // Handle authenticated request
});
```

## Context Extensions

The middleware extends Hono context with:

```typescript
interface HonoLTIContext {
  ltiSession: LTISession; // Available in protected routes
}
```

## Performance

Optimized for serverless:

- 3-5ms login handling
- 12-15ms launch verification
- Minimal cold start impact