К основному содержанию
скилл CX Codex

inngest-middleware — скилл для Claude Code: что делает

Скилл учит ИИ настраивать middleware для Inngest v4: внедрять зависимости в обработчики и шифровать полезную нагрузку функций.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add inngest/inngest-skills --skill inngest-middleware -a claude-code
Открыть на GitHub

Что делает inngest-middleware

Скилл содержит шаблоны и правила работы с жизненным циклом middleware в Inngest v4. Он объясняет порядок перехвата вызовов на уровне клиента и отдельных функций. Клиентские middleware всегда запускаются первыми, а затем выполняются обработчики конкретной функции. Внутри описана работа с хуками onFunctionRun и onSendEvent для логирования или модификации данных.

Инструкции разбирают встроенный механизм dependencyInjectionMiddleware для передачи клиентов баз данных и внешних API напрямую в аргументы функций. Также рассмотрены официальные пакеты @inngest/middleware-encryption с поддержкой ротации ключей и @inngest/middleware-sentry для перехвата исключений и трассировки.

Для задач реального времени этот скилл использовать нельзя: в Inngest v4 метод step.realtime.publish встроен в ядро. Попытка поставить старый пакет @inngest/realtime приведёт к ошибке TypeError: Cls is not a constructor во время выполнения.

Какие задачи решает

  • пробросить клиенты баз данных в функции через dependencyInjectionMiddleware
  • настроить шифрование шагов и вывода функций через @inngest/middleware-encryption
  • подключить перехват исключений и трассировку шагов в Sentry
  • написать собственный middleware с хуками onFunctionRun и onSendEvent

Примеры запросов агенту

  • Добавь клиенты Prisma и OpenAI в контекст функций Inngest через dependency injection
  • Напиши custom middleware для Inngest v4, который логирует входящие события перед отправкой
  • Подключи @inngest/middleware-encryption к клиенту Inngest и настрой резервные ключи дешифрования

Как установить inngest-middleware

1Через Skills CLI (Vercel)

npx skills add inngest/inngest-skills --skill inngest-middleware -a claude-code

2Вручную: положить файлы

~/.claude/skills/inngest-middleware/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/inngest-middleware/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о inngest-middleware

Как установить inngest-middleware в Claude Code?

Выполните в терминале команду npx skills add inngest/inngest-skills --skill inngest-middleware -a claude-code.

Что делает скилл inngest-middleware?

Он обучает кодинг-агента правильной работе с middleware в Inngest v4, включая внедрение зависимостей, шифрование данных и интеграцию с Sentry.

Подходит ли этот скилл для настройки Inngest Realtime?

Нет, для этого предназначен скилл inngest-realtime. В Inngest v4 метод step.realtime.publish встроен по умолчанию, а использование старого middleware @inngest/realtime вызывает ошибку TypeError: Cls is not a constructor.

Исходный текст

SKILL.md · Apache-2.0
---
name: inngest-middleware
description: Use when adding cross-cutting concerns to durable functions — structured logging or tracing across all functions, error tracking with Sentry, payload encryption for sensitive data, dependency injection of clients (DB, Stripe, etc.) into function handlers, custom telemetry, or behavior that should apply uniformly across many functions. Covers Inngest middleware lifecycle, creating custom middleware, dependencyInjectionMiddleware, @inngest/middleware-encryption, @inngest/middleware-sentry, and custom middleware patterns.
---

# Inngest Middleware

Master Inngest middleware to handle cross-cutting concerns like logging, error tracking, dependency injection, and data transformation. Middleware runs at key points in the function lifecycle, enabling powerful patterns for observability and shared functionality.

> **These skills are focused on TypeScript.** For Python or Go, refer to the [Inngest documentation](https://www.inngest.com/llms.txt) for language-specific guidance. Core concepts apply across all languages.

> **Note:** The middleware system was significantly rewritten in v4. The lifecycle hooks documented here reflect the v4 API. If migrating from v3, consult the [migration guide](https://www.inngest.com/docs-markdown/reference/typescript/v4/migrations/v3-to-v4) for details on breaking changes.

> **⚠ For Realtime use the `inngest-realtime` skill, NOT this one.** Inngest v3 used `realtimeMiddleware()` from `@inngest/realtime` to inject a `publish` arg into function handlers. **v4 ships realtime natively** — `step.realtime.publish` is built-in, no middleware required. Do NOT install `@inngest/realtime` on a v4 project (it's a v3-era package and produces `TypeError: Cls is not a constructor` at runtime). See the `inngest-realtime` skill for the v4 pattern.

## What is Middleware?

Middleware allows code to run at various points in an Inngest client's lifecycle - during function execution, event sending, and more. Think of middleware as hooks into the Inngest execution pipeline.

**When to use middleware:**

- **Observability:** Add logging, tracing, or metrics
- **Dependency injection:** Share client instances across functions
- **Data transformation:** Encrypt/decrypt, validate, or enrich data
- **Error handling:** Custom error tracking and alerting
- **Authentication:** Validate user context or permissions

## Middleware Lifecycle

Middleware can be registered at **client-level** (affects all functions) or **function-level** (affects specific functions).

### Execution Order

```typescript
const inngest = new Inngest({
  id: "my-app",
  middleware: [
    loggingMiddleware, // Runs 1st
    errorMiddleware // Runs 2nd
  ]
});

inngest.createFunction(
  {
    id: "example",
    middleware: [
      authMiddleware, // Runs 3rd
      metricsMiddleware // Runs 4th
    ],
    triggers: [{ event: "test" }]
  },
  async () => {
    /* function code */
  }
);
```

**Order matters:** Client middleware runs first, then function middleware, in the order specified.

## Creating Custom Middleware

### Basic Middleware Structure

```typescript
import { InngestMiddleware } from "inngest";

const loggingMiddleware = new InngestMiddleware({
  name: "Logging Middleware",
  init() {
    // Setup phase - runs when client initializes
    const logger = setupLogger();

    return {
      // Function execution lifecycle
      // Note: `fn` is loosely typed in middleware generics; fn.id works at runtime
      onFunctionRun({ ctx, fn }) {
        return {
          beforeExecution() {
            logger.info("Function starting", {
              functionId: fn.id,
              eventName: ctx.event.name,
              runId: ctx.runId
            });
          },

          afterExecution() {
            logger.info("Function completed", {
              functionId: fn.id,
              runId: ctx.runId
            });
          },

          transformOutput({ result }) {
            // Log function output
            logger.debug("Function output", {
              functionId: fn.id,
              output: result.data
            });

            // Return unmodified result
            return { result };
          }
        };
      },

      // Event sending lifecycle
      onSendEvent() {
        return {
          transformInput({ payloads }) {
            logger.info("Sending events", {
              count: payloads.length,
              events: payloads.map((p) => p.name)
            });

            // Spread to convert readonly array to mutable array
            return { payloads: [...payloads] };
          }
        };
      }
    };
  }
});
```

### Python Implementation

Python middleware follows a similar pattern. See [Dependency Injection Reference](./references/dependency-injection.md) for complete Python examples.

````

## Dependency Injection

Share expensive or stateful clients across all functions. **See [Dependency Injection Reference](./references/dependency-injection.md) for detailed patterns.**

### Quick Example - Built-in DI

```typescript
import { dependencyInjectionMiddleware } from "inngest";

const inngest = new Inngest({
  id: 'my-app',
  middleware: [
    dependencyInjectionMiddleware({
      openai: new OpenAI(),
      db: new PrismaClient(),
    }),
  ],
});

// Functions automatically get injected dependencies
inngest.createFunction(
  { id: "ai-summary", triggers: [{ event: "document/uploaded" }] },
  async ({ event, openai, db }) => {
    // Dependencies available in function context
    const summary = await openai.chat.completions.create({
      messages: [{ role: "user", content: event.data.content }],
      model: "gpt-4",
    });

    await db.document.update({
      where: { id: event.data.documentId },
      data: { summary: summary.choices[0].message.content }
    });
  }
);
````

## Middleware Packages

Beyond `dependencyInjectionMiddleware` (built-in, shown above), Inngest provides official middleware as **separate packages**. **See [Middleware Reference](./references/built-in-middleware.md) for complete details.**

### Encryption Middleware

```bash
npm install @inngest/middleware-encryption
```

```typescript
import { encryptionMiddleware } from "@inngest/middleware-encryption";

const inngest = new Inngest({
  id: "my-app",
  middleware: [
    encryptionMiddleware({
      key: process.env.ENCRYPTION_KEY
    })
  ]
});
```

Automatically encrypts all step data, function output, and event `data.encrypted` field. Supports key rotation via `fallbackDecryptionKeys`.

### Sentry Error Tracking

```bash
npm install @inngest/middleware-sentry
```

```typescript
import * as Sentry from "@sentry/node";
import { sentryMiddleware } from "@inngest/middleware-sentry";

Sentry.init({
  /* your Sentry config */
});

const inngest = new Inngest({
  id: "my-app",
  middleware: [sentryMiddleware()]
});
```

Captures exceptions, adds tracing to each function run, and includes function ID and event names as context. Requires `@sentry/*@>=8.0.0`.

## Common Middleware Patterns

### Metrics and Performance Tracking

```typescript
const metricsMiddleware = new InngestMiddleware({
  name: "Metrics Tracking",
  init() {
    return {
      onFunctionRun({ ctx, fn }) {
        let startTime: number;

        return {
          beforeExecution() {
            startTime = Date.now();
            metrics.increment("inngest.step.started", {
              function: fn.id,
              event: ctx.event.name
            });
          },

          afterExecution() {
            const duration = Date.now() - startTime;
            metrics.histogram("inngest.step.duration", duration, {
              function: fn.id,
              event: ctx.event.name
            });
          },

          transformOutput({ result }) {
            const status = result.error ? "error" : "success";
            metrics.increment("inngest.step.completed", {
              function: fn.id,
              status: status
            });

            return { result };
          }
        };
      }
    };
  }
});
```

### Advanced Patterns

**Authentication:** Validate tokens and inject user context
**Conditional logic:** Apply middleware based on event type or function
**Circuit breakers:** Prevent cascading failures from external services

### Configuration-Based Middleware

Create reusable middleware with configuration options for different environments and use cases. See reference documentation for complete examples.

## Best Practices

### Design Principles

1. **Keep middleware focused:** One concern per middleware
2. **Handle errors gracefully:** Don't let middleware crash functions
3. **Consider performance:** Middleware runs on every execution
4. **Use proper typing:** Let TypeScript infer middleware types
5. **Test thoroughly:** Middleware affects all functions that use it

### Common Use Cases to Implement

- **Retry logic** for transient failures
- **Circuit breakers** for external service calls
- **Request/response logging** for debugging
- **User context enrichment** from external sources
- **Feature flags** for gradual rollouts
- **Custom authentication** and authorization checks

### Error Handling in Middleware

```typescript
const robustMiddleware = new InngestMiddleware({
  name: "Robust Middleware",
  init() {
    return {
      onFunctionRun({ ctx, fn }) {
        return {
          transformOutput({ result }) {
            try {
              // Your middleware logic here
              return performTransformation(result);
            } catch (middlewareError) {
              // Log error but don't break the function
              console.error("Middleware error:", middlewareError);

              // Return original result on middleware failure
              return { result };
            }
          }
        };
      }
    };
  }
});
```

### Testing Middleware

Use Inngest's testing utilities (`createMockContext`, `createMockFunction`) to unit test middleware behavior.

**For complete implementation examples and advanced patterns, see:**

- [Dependency Injection Reference](./references/dependency-injection.md)
- [Built-in Middleware Reference](./references/built-in-middleware.md)

© inngest · Apache-2.0 · inngest/inngest-skills

Похожие скиллы

Всё по теме «Бэкенд и API» →
code-review getsentry Скилл для ревью пул-реквестов и правок кода по инженерным практикам Sentry: безопасность, производительность, тесты, дизайн. CX Codex +1 5 500установок sentry-sdk-upgrade getsentry Скилл помогает обновить Sentry JavaScript SDK между мажорными версиями, например с v7 до v8 или v9. Он находит устаревший код, обновляет импорты и проверяет сборку проекта. CX Codex +1 3 100установок hono-middleware bobmatnyc Скилл с паттернами middleware для Hono: создание, композиция, встроенные модули и порядок выполнения. Пригодится, когда в приложение нужно добавить авторизацию, CORS или логирование. CX Codex +1 431установок routing-middleware официальный Vercel Labs Скилл обучает агента настройке Vercel Routing Middleware: перехвату запросов до кэша, редиректам и выбору между Edge, Node.js или Bun. CX Codex GP ChatGPT 6установок inngest sickn33 Скилл для работы с Inngest: настраивай фоновые задачи, event-driven workflows и долгоживущие процессы без управления очередями и воркерами. Пригодится, если нужны отложенные операции, многошаговые workflow или обработка вебхуков. CX Codex +1 1 200установок langchain-middleware langchain-ai Скилл добавляет промежуточные хуки для LangChain-агентов: останавливает выполнение перед опасными вызовами инструментов, даёт человеку одобрить, отредактировать или отклонить действие, перехватывает вызовы для логирования и retry-логики. CX Codex +1 16 200установок

Из того же набора10

inngest-steps Учит агента проектировать надёжные шаги в воркфлоу Inngest на TypeScript. Пригодится при настройке задержек, ожидании вебхуков и фоновых задач. CX Codex +1 3 800установок inngest-events Помогает проектировать событийные воркфлоу Inngest: имена событий, идемпотентность по id, fan-out и системные события. CX Codex +1 3 800установок inngest-durable-functions Скилл учит агента писать отказоустойчивые функции Inngest: шаги, мемоизация, ретраи, идемпотентность и отмена. CX Codex +1 3 800установок inngest-setup Скилл ставит Inngest в TypeScript-проект: клиент, переменные окружения, serve-эндпоинты и локальный dev-сервер. Пригодится, когда нужны фоновые задачи и вебхуки, переживающие падение процесса. CX Codex +1 3 700установок inngest-flow-control Скилл по flow control в Inngest: concurrency, throttling, rate limiting, debounce, priority, singleton и батчинг событий. Пригодится, когда внешние API отвечают 429. CX Codex +1 1 600установок inngest-realtime Скилл учит агента публиковать обновления из durable-функций Inngest в живой интерфейс: статусы заказов, стриминг токенов, логи и подтверждения от пользователя. CX Codex +1 797установок inngest-api-cli Скилл учит агента работать с ресурсами Inngest через npx inngest-cli@latest api: разбирать запуски, искать события, синхронизировать приложения. CX Codex +1 776установок inngest-agents Скилл для сборки и отладки агентов на Inngest и AgentKit: вызовы моделей, инструменты, ожидание одобрения человека, прогресс в реальном времени. CX Codex +1 657установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой