Перейти к содержимому

REST API на TypeScript по принципу contract-first, безопасные по умолчанию и созданные для команд, работающих с ИИ

DaloyJS поставляется с безопасными настройками по умолчанию, отказывается запускаться в продакшене при известных ему ошибках конфигурации и работает без единой зависимости во время выполнения, с усиленным процессом публикации, подписанным с подтверждением происхождения. Ни один фреймворк не делает приложение полностью безопасным и не останавливает все атаки на цепочку поставок, поэтому документация прямо говорит, что включено по умолчанию, что включаете вы и какие риски остаются.

На русском: быстрый старт, установка, руководство, маршрутизация, валидация, ошибки, OpenAPI, типизированный клиент и безопасность; остальная документация и блог пока на английском.

$ pnpm create daloy@latest my-api
  • Более 3000 пройденных тестов фреймворка
  • Пороги покрытия: ≥90% строк и функций, ≥92% ветвей
  • 0 зависимостей во время выполнения
  • Node 24 LTS, Node 26+, Bun, Deno, Cloudflare
  • Лицензия MIT
ᜇᜎᜓᜌ᜔ Daloy на тагальском означает «поток» (произносится «да-лой»).О проектеО названииРуководство: API книжного магазина

Безопасность и цепочка поставок

Безопасность по умолчанию: защитный слой для кода, написанного ИИ

Когда код пишут модели ИИ, узким местом становится уже не скорость набора текста, а безопасность во время выполнения и целостность цепочки поставок. DaloyJS применяет защитные механизмы на уровне выполнения: лимиты размера тела запроса, таймауты, защиту от загрязнения прототипов, скрытие деталей ошибок 5xx и отказ запускаться при ошибках конфигурации, и всё это без транзитивных зависимостей, которые можно было бы атаковать.

Безопасные настройки выполнения по умолчанию

В отличие от фреймворков, которые оставляют базовую защиту плагинам или ручной маршрутизации ошибок, ядро DaloyJS стартует с уже включённой защитой: лимиты размера тела, таймауты запросов, JSON с защитой от загрязнения прототипов, корректные ответы 405 Method Not Allowed и скрытие деталей ошибок 5xx, которое при сбое остаётся безопасным (включено везде, кроме явно объявленной среды разработки или тестирования). В продакшене он отказывается запускаться при известных ему ошибках конфигурации, например со слабыми секретами сессий или с cookie сессии без защиты от CSRF.
Лимиты тела (по умолчанию 1 МиБ)Таймауты запросовЗащита от загрязнения прототиповRFC 9457 problem+jsonСтрогая валидация схемПроверки конфигурации при запуске

Ноль зависимостей во время выполнения

Установка @daloyjs/core добавляет ровно ноль транзитивных пакетов. Никаких скриптов postinstall для аудита и никаких внезапных CVE в зависимостях, которые вы никогда не выбирали. Фреймворк не приносит собственного дерева зависимостей; за остальные зависимости вашего приложения по-прежнему отвечаете вы.
0транзитивных пакетов в @daloyjs/core

Шаблоны, защищённые на уровне цепочки поставок

Выберите pnpm в create-daloy, и pnpm-workspace.yaml будет сразу усилен: ignoreScripts блокирует вредоносную нагрузку в скриптах установки (но не код, выполняемый при импорте), minimumReleaseAge в 24 часа пропускает свежеопубликованные вредоносные версии, которые успевают обнаружить, а verifyStoreIntegrity сохраняет честность установок. Необязательный набор безопасности добавляет усиленные GitHub Actions, Dependabot, CODEOWNERS, SECURITY.md, проверку происхождения lockfile, шаблоны контейнеров без root с tini и daloy doctor, валидатор продакшен-конфигурации.
ignoreScriptsminimumReleaseAge 24 чverifyStoreIntegrityActions, закреплённые по SHAАудит daloy doctor

Шаблоны, созданные для ИИ

Каждый проект, созданный через create-daloy, включает AGENTS.md и контекстные skills, а эту документацию можно читать через MCP. Агенты для программирования, читающие AGENTS.md, усваивают соглашения вашего фреймворка, правила маршрутизации и примитивы безопасности без ритуалов prompt engineering.
AGENTS.md в комплектеКонтекстные skillsДоступно через MCP

Потоковая передача и наблюдаемость

Утилиты для SSE и NDJSON с учётом обратного давления, а также хук трассировки OpenTelemetry, который создаёт спаны HTTP-сервера с атрибутами семантических соглашений.
SSE с обратным давлениемПотоковый NDJSONHTTP-спаны OTel

Переносимость между рантаймами

Ядро видит только Request → Response. Адаптеры живут на границе: Node, Bun, Deno, Cloudflare Workers, Vercel, Fastly Compute и AWS Lambda. То же приложение, те же тесты.
Node 24+BunDenoCloudflare WorkersVercelAWS Lambda

Contract-first по своей природе

Одно определение маршрута служит единственным источником истины для валидации, типов, OpenAPI 3.1, типизированного клиента и встроенных контрактных тестов, поэтому расхождениям почти негде спрятаться.
Валидация во время выполненияСпецификация OpenAPI 3.1Типизированный клиент Hey APIВстроенные контрактные тесты

Типизированные клиенты с Hey API

Запустите pnpm gen и получите полностью типизированный fetch SDK для любого потребителя в любом TS-проекте, сгенерированный из вашей настоящей спецификации. Или обойдитесь без кодогенерации с помощью типизированного клиента внутри процесса.
pnpm genБез настройкиТипизированный fetch SDK от начала до конца

Всё включено

Сессии, готовые к работе на edge, WebSockets, которые расходуют те же квоты ограничения частоты запросов, что и HTTP, структурированные логи и корректное завершение работы: продакшен-инфраструктура, которую обычно собирают из плагинов, и всё так же без зависимостей во время выполнения.
Сессии на edgeОграничение частоты для WebSocketСтруктурированные логиКорректное завершение

Бенчмарки и производительность

Цифры вместе со сносками

Когда агенты ИИ гоняют инструменты по кругу и шлют запросы с высокой конкурентностью, пропускная способность и задержка холодного старта становятся критичными. В DaloyJS проверки безопасности включены по умолчанию, и эти бенчмарки измеряют производительность со всеми включёнными защитами.

Как DaloyJS выглядит на фоне других

Реальные цифры из собственного набора бенчмарков репозитория. Выберите метрику, но учитывайте оговорки ниже: ни одно из этих сравнений не является полностью равным.

Установленные транзитивные зависимости

Каждый пакет, который подтягивает установка, это поверхность атаки, которой кто-то должен доверять. Только DaloyJS и Hono не добавляют ни одного.

Что это значит для вас: Меньше пакетов, которым нужно доверять, значит меньше CVE и никаких неожиданных скриптов postinstall. Ноль зависимостей означает, что фреймворк не открывает собственных дверей в цепочке поставок; остальное дерево зависимостей по-прежнему на вашей ответственности.

Итог: DaloyJS устанавливает 0 транзитивных зависимостей, деля с Hono минимальную поверхность в цепочке поставок, тогда как защищённое приложение на NestJS тянет 86.

Apple M3 Max · 16 cores · Node v26.4.0 · октябрь 2026 · @daloyjs/core 1.5.4 · код в bench/cross-framework

Почему это сравнение яблок с апельсинами

Эти фреймворки решают разные задачи, поэтому прямое сравнение больше похоже на сравнение яблок с апельсинами, чем на честную гонку. Вот простыми словами, что эти цифры доказывают, а что нет.
  • Яблоки и апельсины, а не сравнение на равных. Это разные инструменты, выполняющие разный объём работы. На каждом запросе DaloyJS валидирует тело по вашей схеме Zod или Valibot и применяет безопасные заголовки, ID запроса, лимиты размера тела и таймауты, всё по умолчанию. «Минимальные» приложения других фреймворков почти ничего из этого не делают, и даже «паритет безопасности» редко совпадает пункт в пункт. Поэтому часть каждой цифры DaloyJS приходится на защиту и валидацию, которые иначе пришлось бы делать самостоятельно.
  • Размер измеряется по-разному: DaloyJS представляет собой один пакет без зависимостей, а остальные разрешают транзитивные деревья, точный размер которых зависит от того, когда был сгенерирован lockfile.
  • Пропускная способность зависит от нагрузки: при сопоставимом стеке middleware с обеих сторон DaloyJS опережает Hono примерно на 27% на этих GET-маршрутах и примерно на 58% на маршруте POST с телом, а DaloyJS вдобавок валидирует это тело через Zod. Реальные сервисы обычно упираются в базу данных и ввод-вывод, а не в диспетчеризацию фреймворка, поэтому такие микроцифры редко предсказывают поведение в продакшене.
  • Разные целевые среды выполнения: некоторые фреймворки (например, Elysia) оптимизированы под Bun, но здесь измеряются через адаптеры Node, чтобы получить честную базу на одном рантайме.
  • Одна машина, один момент: Apple M3 Max, Node v26.4.0, октябрь 2026, @daloyjs/core 1.5.4 и другая фоновая нагрузка на машине (два фреймворка замерялись друг за другом, поэтому сравнение надёжнее абсолютных цифр). Ваше железо, рантайм и версии изменят эти цифры.

Для машин: агентов и инструментов ИИ

DaloyJS готов к MCP

Model Context Protocol (MCP) представляет собой открытый стандарт, через который агенты ИИ вроде Claude, Cursor и VS Code вызывают инструменты и читают документацию. DaloyJS поддерживает его с обеих сторон: ваше приложение может стать MCP-сервером, а эта документация (на английском) уже им является.

Превратите свой API в MCP-сервер

DaloyJS собирает MCP-серверы только из @daloyjs/core, без SDK: транспорт Streamable HTTP, валидация схем входных данных и защита при запуске в продакшене, которая отказывается стартовать, если в цепочке MCP-эндпоинта нет хука аутентификации. Она проверяет, что хук есть и что в продакшене он выполнялся на каждом запросе, но не то, что он кого-то отклоняет, поэтому тестируйте и свою аутентификацию.

Создать MCP-сервер →
ts
import { App, bearerAuth, createMcpHandler, mcpRoutes } from "@daloyjs/core";

const mcp = createMcpHandler({
  serverInfo: { name: "inventory-mcp", version: "1.0.0" },
  tools: [/* ваши инструменты с валидируемыми схемами входных данных */],
});

const app = new App();
app.use(bearerAuth({ validate: checkToken })); // без хука аутентификации продакшен откажется запускаться
for (const route of mcpRoutes("/mcp", mcp)) {
  app.route(route); // теперь ваш API ещё и MCP-сервер
}

Читайте эту документацию через MCP

Публичный эндпоинт только для чтения, в котором ваш агент для программирования может искать и читать без копирования. Ключ API не нужен.

Эндпоинт

Укажите этот URL в любом клиенте, совместимом с MCP:
https://daloyjs.dev/mcp
  • search_docsПоиск по ключевым словам во всех страницах документации, отсортированный по релевантности.
  • get_docПолный текст одной страницы по её маршруту или slug.
  • list_docsСписок всех доступных страниц документации за один вызов.

Добавьте его в конфигурацию своего MCP-клиента

json
{
  "mcpServers": {
    "daloyjs-docs": {
      "url": "https://daloyjs.dev/mcp"
    }
  }
}

Клиент поддерживает только stdio? Подключите его через npx -y mcp-remote https://daloyjs.dev/mcp.

Ограничение радиуса поражения

Контракты как защитный контур, а не украшение синтаксиса

В рабочем процессе, построенном вокруг ИИ, контракты не эстетическая роскошь для людей: это граница, которую обеспечивает машина и которая не даёт галлюцинированным структурам данных перетекать между компонентами. Один контракт маршрута строго валидирует запросы, ограничивает ответы и в реальном времени выдаёт спецификацию OpenAPI 3.1 и типизированный клиент.

поток контрактаопишите один раз -> остальное сгенерируется
01контрактGET /books/:id + z.object(...)
02валидацияво время выполнения, в обе стороны
03OpenAPI 3.1живая спецификация + /docs
04типизированный клиентpnpm gen -> fetch SDK
ts
import { z } from "zod";
import { App, secureHeaders, rateLimit, requestId } from "@daloyjs/core";
import { serve } from "@daloyjs/core/node";

const app = new App({ bodyLimitBytes: 1 << 20, requestTimeoutMs: 5_000 });

// new App() уже автоматически применяет requestId() и secureHeaders();
// явные вызовы здесь только настраивают (и заменяют) значения по умолчанию.
app.use(requestId());
app.use(secureHeaders());
app.use(rateLimit({ windowMs: 60_000, max: 120 })); // по IP клиента по умолчанию; за прокси задайте behindProxy или keyGenerator

app.get(
  "/books/:id",
  {
    request: { params: z.object({ id: z.string() }) },
    responses: {
      200: { description: "Найдено", body: z.object({ id: z.string(), title: z.string() }) },
      404: { description: "Не найдено" },
    },
  },
  async ({ params }) => ({
    status: 200,
    body: { id: params.id, title: `Книга ${params.id}` },
  }),
);

serve(app, { port: 3000 });

Справочник API в Scalar одной строкой

Scalar стал современным преемником Swagger UI: он быстрый, аккуратный, с нативной тёмной темой и встроенными тестовыми запросами. В DaloyJS это интерфейс документации по умолчанию, а не плагин: docs: true в конструкторе App автоматически монтирует эту страницу на /docs и живую спецификацию OpenAPI 3.1 на /openapi.json.

Генерируется из контрактов ваших маршрутов без дополнительного кода. Предпочитаете Swagger UI или Redoc? Оба доступны через одно поле конфигурации. Руководство по OpenAPI и интерфейсу документации →

Компромиссы экосистемы

Сильные стороны конкурентов, меньше компромиссов

DaloyJS не пытается выиграть в одной номинации. Он пытается убрать связующую работу между лучшими идеями, которые разработчикам уже нравятся.

Вам нужноСегодня: настройки pnpm по умолчанию + ядро без зависимостей

Переносимая защита цепочки поставок для ваших приложений

Что даёт DaloyJS

Усиленные настройки установки pnpm, lockfile с проверенным происхождением, SBOM + provenance в npm

Вам нужноСегодня: Hono

Подходит для serverless / edge

Что даёт DaloyJS

Ядро на веб-стандартах, адаптеры для разных рантаймов

Вам нужноСегодня: Fastify

Зрелая эксплуатация и документация для Node

Что даёт DaloyJS

Инкапсулированные плагины, структурированные логи, корректное завершение

Вам нужноСегодня: Elysia

Современный DX с упором на TS, поддержка Bun

Что даёт DaloyJS

Сквозная типизация обработчиков, контекста и клиента

Вам нужноСегодня: FastAPI

Лучшая эргономика OpenAPI

Что даёт DaloyJS

Встроенный OpenAPI 3.1 из одного определения маршрута

Вам нужноСегодня: Hey API

Лучшая генерация типизированных клиентов

Что даёт DaloyJS

pnpm gen → полностью типизированный fetch SDK

Готовы выпускать с безопасными настройками по умолчанию?

Создайте проект за секунды с усиленной установкой для вашего менеджера пакетов, сгенерированным CI, который блокирует скрипты установки, закреплёнными GitHub Actions, Dependabot, CODEOWNERS и проверкой происхождения lockfile. А затем сохраняйте контракт по мере роста приложения: то же приложение работает на Node, Bun, Deno и Cloudflare Workers.

Поддержите проект

Если DaloyJS экономит вам время, можете угостить меня кофе

DaloyJS бесплатен и распространяется под лицензией MIT. Если документация, статьи или сам фреймворк помогли вам выпустить что-то с чуть меньшей драмой, чашка кофе станет вполне разумным способом поддержать работу.