Об этом проекте

Keel (Kernel Event Engine, Lightweight) — это переносимый асинхронный сетевой субстрат, написанный на C. Его ключевая идея — нейтральный к модели транспортный слой: семантические абстракции потоков, слушателей и датаграмм, управляемые либо моделью готовности, либо моделью завершения, поверх сокетного интерфейса, не предполагающего конкретной операционной системы. Архитектура организована по трём ортогональным осям: - Ось событий: бэкенды готовности (epoll, kqueue, WSAPoll, poll) регистрируют интерес и повторяют операции при EAGAIN; бэкенды завершения (io_uring, IOCP) отправляют собственные операции и собирают завершения. Оба типа находятся за одним небольшим интерфейсом цикла событий, сохраняя свою нативную семантику, а не эмулируя друг друга. - Ось сокетов: подключаемая таблица провайдеров (KlSocketProvider) со встроенными POSIX и Winsock, а также интегрированными реализациями для lwIP (уровень BSD-сокетов и сырой стек обратных вызовов NO_SYS) и автономный провайдер UEFI EFI_TCP4/UDP4. Флаги возможностей ограничивают такие функции, как нативный fd, writev и sendfile. - Ось протоколов: HTTP/1.1, HTTP/2, WebSocket, SSE и асинхронный DNS-резолвер являются потребителями субстрата, а не его целью. Код протоколов должен проходить только через абстракции соединения/потока и событий, никогда не обращаясь напрямую к сетевым заголовкам платформы или движку событий; проект описывает структурные ограничения сборки по умолчанию, которые завершаются ошибкой при нарушении этого разделения. Возможности протоколов и серверов включают подключаемый HTTP-парсер (встроенный llhttp), подключаемый TLS через таблицу виртуальных функций, подключаемые читатели тела, промежуточное ПО для маршрутов с коротким замыканием, встроенное CORS-промежуточное ПО, multipart form-data по RFC 2046, три режима ответа (буферизованный writev, sendfile, потоковая передача чанками), захват параметров маршрута без выделения памяти, таймауты соединений с автоматическими ответами 408, журналирование доступа, асинхронные обработчики сервера, приостанавливающие и возобновляющие соединения, синхронные и асинхронные HTTP-клиенты, пул потоков с пробуждением через pipe, универсальные наблюдатели fd, фрейминг SSE, сжатие ответов (gzip через miniz) и декомпрессия на клиенте, пул постоянных соединений, следование перенаправлениям, HTTP-прокси и туннелирование CONNECT, буфер записи с обратным давлением, планировщик таймеров и коды ошибок в стиле sqlite3. Дополнительные сетевые возможности включают серверы UNIX-доменных сокетов с учётными данными пира, метками безопасности пира, проверку сертификатов клиента mTLS, поддержку протокола PROXY, ограниченную доверенными CIDR, активацию сокетов через унаследованные fd (LISTEN_FDS systemd), именованные каналы Windows поверх IOCP, стабильный API UDP-датаграмм с фиксированными слотами и пакетной обработкой, многоадресную/широковещательную передачу, маркировку ECN/TOS и поддержку разгрузки, подключаемый асинхронный DNS-резолвер со встроенной реализацией для двух семейств адресов и конкурентное подключение клиентов Happy Eyeballs. Параметры сборки охватывают бэкенды epoll, kqueue, io_uring, poll и IOCP, Cosmopolitan C, нативный MSVC и хуки для встраивания с флагами оптимизации. В README указано 111 тыс. запросов/с на одном потоке и тестирование под ASan/UBSan для обеих моделей выполнения, с одной вендорской зависимостью (llhttp).