Доставка одним файлом
Один xs.exe плюс каталог исходников на C — это полное развёртывание. Компилятор TCC, полный набор заголовков SDK и системные библиотеки встроены в VFS со сжатием LZMA — на целевой машине ничего устанавливать не нужно.
XServer упаковывает собственные TLS, движок конкурентности и компилятор TCC в один exe — ваше приложение это просто каталог исходников на C, компилируемых в машинный код прямо в процессе, с горячей перезагрузкой без простоя после каждого изменения. Без интерпретатора, без FFI, без внешних зависимостей.
Протоколы, криптография, конкурентность, отладка — всё написано самостоятельно и встроено. Не привязано, а упаковано в тот же файл.
Один xs.exe плюс каталог исходников на C — это полное развёртывание. Компилятор TCC, полный набор заголовков SDK и системные библиотеки встроены в VFS со сжатием LZMA — на целевой машине ничего устанавливать не нужно.
devfile компилируется встроенным TCC прямо в процессе в машинный код и вызывает 3057 API хоста напрямую через таблицу символов — ни интерпретатора, ни накладных расходов FFI.
Правите C-код — изменения вступают в силу мгновенно: все кандидаты сначала компилируются, замена происходит только при успехе; при провале старое поколение продолжает обслуживать, а после обнуления ссылок его безопасно забирает GC-поток.
Без зависимости от OpenSSL: X25519 / P-256 / P-384, AES-GCM, ChaCha20-Poly1305, возобновление сессий, проверка цепочек X.509 и CRL — и на серверной, и на клиентской стороне.
http / https, ws / wss, tcp / tcps и udp имеют единый жизненный цикл; vhost, выбор сертификатов по SNI, статический слой и перехват соединений встроены.
IOCP / epoll / kqueue / io_uring / select — пять бэкендов событийного цикла, плюс пул потоков с вытеснением, корутины, каналы и future.
Канарейки / изоляция UAF / инъекция отказов / кольцевой журнал событий / отчёты об утечках в TEXT и JSON — включается прямо в продакшн-процессе, отдельная сборка не нужна.
Одиннадцать опциональных библиотек (sqlite / почтовое семейство / LLM / Markdown / сертификаты… всего 700 символов) вкомпилируются по мере надобности или все сразу одним ключом; новое расширение — это одна json-запись плюс import-таблица, без изменения кода хоста.
Расширение webview + узел class: "app" = локальный HTTP + окно WebView2; вместе с односоставной публикацией xs pack продукт — настольный exe по двойному щелчку. Без среды автоматически headless.
Встроенный демон ACME: продление DNS-01 за 30 дней до истечения + горячая замена (соединения не рвутся); цепочка отказоустойчивости directories[] — Let's Encrypt недоступен, идём в litessl, при восстановлении возвращаемся.
Модель доверия: скрипты — доверенный нативный код (без песочницы), для развёртываний под контролем оператора — все возможности открыты, границу определяете вы.
Горячая перезагрузка — это координатор целевого состояния: неизменяемый снимок → полная прекампиляция → атомарная публикация → два поколения параллельно → утилизация при нуле ссылок.
Нескомпилировавшийся кандидат отклоняется целиком — откат это семантическая гарантия, а не средство спасения.
ServiceSwap → xsSwapTake передаёт живое состояние.
Примеры ниже — реальный код из репозитория. XServer не навязывает объектную модель — вы работаете с нативными структурами xrt напрямую; компилятор и система типов и есть ваш фреймворк.
/* route.h — слотная регистрация URI × метод (фрагмент реального кода) */
static void RouteHTTP_Init(void)
{
G_StaticRouteTableHTTP = xrtMapCreate(sizeof(RouteInfoHTTP));
/* Статические маршруты: точные URI */
AddStaticRouteHTTP("/api/v1/items", XHTTP_METHOD_GET, Handle_API_List);
AddStaticRouteHTTP("/api/v1/items", XHTTP_METHOD_POST, Handle_API_Add);
/* Динамические маршруты: захват сегмента {id},
маски методов свободно комбинируются */
AddDynamicRouteHTTP("/api/v1/items/{id}",
XHTTP_METHOD_GET, Handle_API_Item);
AddDynamicRouteHTTP("/api/v1/items/{id}",
XHTTP_METHOD_PUT | XHTTP_METHOD_PATCH, Handle_API_Item_Update);
AddDynamicRouteHTTP("/api/v1/items/{id}",
XHTTP_METHOD_DELETE, Handle_API_Item_Delete);
/* После регистрации — однократная компиляция в неизменяемые
pattern; стоимость сопоставления не зависит от числа маршрутов */
(void)RouteHTTP_Compile();
}
/* route_http/basic.h — построение JSON через xvalue (фрагмент реального кода) */
static void Handle_JSON(XS_HttpReq* pReq,
const RouteParamHTTP* arrParam, uint32 iParamCount)
{
const XS_HostInfo* pHost = pReq->host;
xvalue* pObject = xrtValueObject();
(void)arrParam; (void)iParamCount;
xrtValueObjectSetNew(pObject, XRT_STR_LITERAL("server"),
xrtValueString(XRT_STR_LITERAL("xs3 demo")));
xrtValueObjectSetNew(pObject, XRT_STR_LITERAL("ok"),
xrtValueBool(true));
xrtValueObjectSetNew(pObject, XRT_STR_LITERAL("host"),
xrtValueString(xrtStrView((pHost->Name ? pHost->Name : "?"))));
(void)ReplyJSON(pReq, 200, pObject);
xrtValueRelease(pObject);
}
/* Контрактные колбэки ws / wss: XServer делает рукопожатие и кадрирование,
вы пишете только бизнес-логику */
static void WsOpen(XS_HostInfo* pHost, xwsstream* pWs)
{
xrtWsStreamText(pWs, xrtStrView("connected"));
}
static void WsText(XS_HostInfo* pHost, xwsstream* pWs, xstrview tText)
{
/* Маскирование, пересборка фрагментов, управляющие кадры и лимиты
сообщений полностью обрабатываются слоем xrt */
(void)xrtWsStreamText(pWs, tText); /* echo */
}
static void WsBinary(XS_HostInfo* pHost, xwsstream* pWs, xbytesview tData)
{
xvalue* pMsg = xrtValueObject();
xrtValueObjectSetNew(pMsg, XRT_STR_LITERAL("size"),
xrtValueInt64((int64)tData.Size));
(void)xrtWsStreamBinary(pWs, tData);
xrtValueRelease(pMsg);
}
/* Передача состояния при горячей перезагрузке: старое поколение экспортирует
снимок, новое забирает его и продолжает (контрактный API) */
static bool ServiceSwap(XS_HostInfo* pHost, xvalue** ppShared)
{
xvalue* pState = xrtValueObject();
xrtValueObjectSetNew(pState, XRT_STR_LITERAL("counter"),
xrtValueInt64(G_iCounter));
*ppShared = pState; /* неразрушающий снимок: старое
поколение может продолжать */
return true;
}
static void ServiceInit(XS_HostInfo* pHost)
{
xvalue* pState = xsSwapTake(pHost); /* действительно только внутри
Init нового поколения */
if ( pState != NULL ) {
G_iCounter = xrtValueInt64(
xrtValueObjectGet(pState, "counter"));
xrtValueRelease(pState);
}
}
/* Запуск перезагрузки: координация целевого состояния; возвращённый
стабильный ID позволяет узнать итог */
XS_ReloadId iId = xsReloadHostSubmit(pHost);
Замеры routebench: последовательные запросы по одному keep-alive-соединению, по 3 раунда × 10 000 на конфигурацию, пять стеков на одной машине.
Пакетная компиляция pattern и сопоставление, не зависящее от числа маршрутов, удерживают рост задержки на уровне +41% при 10k маршрутов; среди сравниваемых стеков FastAPI деградирует на +935%, PHP на +492%.
Никаких IPC и границ сериализации — скрипты вызывают хост по адресу через таблицу символов; вызов функции остаётся просто вызовом функции.
Артефакт атомарно заменяется только после успешной линковки — неудачная сборка всегда оставляет последний рабочий xs.exe.
xs.exe 5,2 МБ единственный бинарник xs.json сервисы · порты · TLS · vhost main.c точка входа приложения (ServiceInit) route.h реестр регистрации маршрутов modules/ переиспользуемые модули (http/db/template…) route_http/ обработчики запросов page/ контролируемые страницы (вне wwwroot) template/ шаблоны xrtTemplate db/ файлы данных SQLite wwwroot/ корень статики
Одна команда собирает нужный вариант под обе платформы (Windows / Linux):
build.bat
build.bat all
Скопируйте xs.exe и каталог исходников на целевую машину — без установки рантайма, без DLL и заголовков; компилятор уже внутри exe.
Старт — xs xs.json; дальше правите любой C-код и вызываете xsReloadHostSubmit() для горячей перезагрузки — без разрывов и простоя.
./xs xs.jsonПолное руководство →xs.json, wwwroot, исходники на C и TLS-сертификаты упаковываются в один LZMA-архив, дописываемый в конец бинарника xs, — запуск без аргументов читает конфигурацию и отдаёт файлы прямо из пакета. Одноимённые файлы на диске всегда важнее: положите файл рядом с exe для горячего исправления, удалите — вернётся версия из пакета.
# 1. упаковка (в каталоге сайта должен быть xs.json; LZMA по элементам)
xs.exe pack site/ -o app.exe
# 2. развёртывание: скопировать этот один файл — и всё
app.exe
# 3. горячее исправление: одноимённый файл рядом с exe переопределяет пакет
echo ... > app.exe/wwwroot/index.html
Объявите сервисный узел class: "app" в xs.json — локальный HTTP-сервис и окно WebView2 в одном процессе: окно загрузки при старте, автоматическое открытие интерфейса по готовности сервиса, корректная остановка при закрытии окна.
Расширение = одна json-запись + import-таблица символов + заголовочный файл. Статически вкомпилируется в хост, символы экспортируются скриптам — доступны даже плагинам со вложенной компиляцией TCC.
Полный движок SQLite вкомпилирован статически, заголовок доступен через VFS. Prepared statements, привязка параметров, транзакции — REST CRUD демо построен на нём.
sqlite3_open_v2("db/main.db", &db, flags, NULL);
Бинарный протокол прикладного уровня поверх упорядоченных потоков байтов: сообщения REQUEST / RESPONSE / PUSH / EVENT, полноценная система limits, проверен libFuzzer.
xtp2_feed(&st, buf, len); /* инкрементальный разбор, ноль аллокаций */
Ядро вызова LLM (тот же источник, что extlibs xrt): конструирование запросов и мультимодальных part, диалекты Chat Completions / Responses / Anthropic, разбор SSE, повторы и отмена; сеть и TLS даёт xrt хоста.
xllmRequestAddTextMessage(&req, XLLM_ROLE_USER, "hi");
Генератор QR-кодов (Nayuki, MIT): кодирование и чтение модулей за один шаг; слой вывода PNG (1-битный grayscale, IDAT через zlib xrt) — готов для 2FA, платёжных кодов, API-маршрутов и вставки в письма.
png = qrcodegen_png(qr, 4, 4, &size);
Подпись и проверка JWT (RFC 7519): HS256/384/512, семейство RS (PKCS#8/PKCS#1), ES256 (DER, совместимость с OpenSSL), выбор ключей JWKS, кэш публичных ключей; код ошибки одной строкой, aud-массивы поддержаны.
claims = xjwtVerify(token, pem, &check);
Клиент OAuth 2.0 (RFC 6749): пять пресетов провайдеров, PKCE, обновление токенов, однократное сжигание state/nonce; транспорт через инъекцию колбэка (в комплекте TLS-реализация на xrt). Связь с xjwt — восемь строк клея для OIDC-логина.
tok = xoauth2CompleteLogin(&oauth, code, state);
Вершина AI-стека (над xllm): регистрация и выполнение инструментов, политика рабочей области, типы субагентов, поток уведомлений и планирование компакции. Подтверждено сквозным agent-demo — шлюзы утверждения, трассы и diff-панели проверены в браузере.
xworkAgentRegisterBuiltinTools(agent);
Окно WebView2 + сервисный узел class: "app": загрузочный сплэш → авто-открытие при готовности → корректная остановка при закрытии. Вместе с односоставной публикацией = десктоп-exe в один клик; без среды автоматически headless.
if (xsWebviewAvailable()) openDesktop();
Укажите файлы исходников, заголовок VFS и import-таблицу — реестр проверит escape-пути, дубликаты макросов и конфликты имён, с двойной верификацией юнит-тестами и рантайм-зондами.
{ "name": "mylib", "macro": "XS_USE_MYLIB" }
Рантайм xrt + хост XServer + ваши исходники на C — начните прямо сейчас.