Контрактные символы
Хост ищет колбэки по имени символа в результате компиляции TCC (xsbase.h); каждый из них необязателен. Имена символов и есть протокол — без функций регистрации и базовых классов.
| Символ | Протокол | Сигнатура |
|---|---|---|
ServiceInit | все | void (XS_HostInfo*) |
ServiceUnit | все | void (XS_HostInfo*) |
ServiceSwap | все | bool (XS_HostInfo*, xvalue**) |
RequestProc | http | XS_RequestResult (XS_HttpReq*) |
WsOpen | ws | void (XS_HostInfo*, xwsstream*) |
WsText | ws | void (XS_HostInfo*, xwsstream*, xstrview) |
WsBinary | ws | void (XS_HostInfo*, xwsstream*, xbytesview) |
WsPing | ws | void (XS_HostInfo*, xwsstream*, xbytesview) |
WsPong | ws | void (XS_HostInfo*, xwsstream*, xbytesview) |
WsClose | ws | void (XS_HostInfo*, xwsstream*, uint16, xstrview) |
EventOpen | tcp | void (XS_HostInfo*, XS_StreamConn*) |
EventData | tcp | void (XS_HostInfo*, XS_StreamConn*, xnetbuf*) |
EventClose | tcp | void (XS_HostInfo*, XS_StreamConn*, xnetresult, const xerror*) |
EventDgram | udp | void (XS_HostInfo*, xnetudp*, const xnetudpmessage*) |
RequestProc возвращает трёхзначный результат: XS_OK (ответ отправлен, keep-alive продолжается) / XS_FALLBACK (передать статическому слою или 404) / XS_TAKEOVER (приложение перехватывает соединение). Семантика — в руководстве · контракт скриптов. Полный справочник (сигнатуры / момент / потоки / примеры) →
API слоя XServer (23)
Прямая связь внутри процесса: реализованы однопроцессным хостом и разрешаются по адресу через tcc_add_symbol, без экспортных украшений. Всё остальное — символы xrt или расширений. Полный справочник (сигнатуры / владение / примеры) →
Запросы топологии
xsServerFind(name)
Поиск server по уникальному имени. Возвращает retained lease, обязательна пара xsServerRelease
xsServerRetain / Release
Продление жизни заимствованного указателя (Retain перед сохранением внутри соединения / колбэка перебора)
xsHostFind(server, name)
Поиск host по имени внутри server; защищён совместно с lease этого server
xsEnumServers / xsEnumHosts
Колбэки перебора; аргументы заимствованы только на время колбэка — для сохранения нужен Retain
xsConfigRoot()
Возвращает верхнеуровневый Custom из xs.json (retained xvalue*; нужен xrtValueRelease)
Горячая перезагрузка
xsReloadHostSubmit(pHost)
Подать намерение перезагрузки host. 0 = не принято; ненулевой ID позволяет опросить итог
xsReloadServerSubmit(name)
Подать перезагрузку уровня server по имени
xsReloadAllSubmit()
Пакетная транзакция: все кандидаты прекампилируются, при провале обратный откат
xsReloadQuery(id, &result)
Опрос XS_ReloadResult{Id, State, Revision, Target, Message}
xsReloadHost / Server / All
bool-обёртки совместимости: сообщают лишь, вернул ли Submit ненулевое значение
Таймеры · развёртывание · передача
xsTimerAfter(owner, ms, proc, ud)
Таймер жизненного цикла, привязан к поколению владельца — таймеры старого поколения умирают при замене
xsTimerCancel(id)
Отменить таймер
xsAppPath()
Каталог приложения (исполняемого файла), UTF-8
xsExtensionEnabled()
Рантайм-проверка: вкомпилировано ли расширение (v1.0.0)
xsExtensionCount() / xsExtensionName()
Перечисление расширений этого варианта (порядок реестра, v1.0.0)
xsCreateTCC / xsDestroyTCC
Вложенный компилятор с предустановленными include / lib путями и импортом символов — фундамент системы плагинов уровня приложения
xsSwapTake(pHost)
Действительно только в ServiceInit нового поколения: забирает данные, экспортированные ServiceSwap старого; владение переходит приложению
Рантайм xrt (3 030 символов с индексом по доменам)
Скрипты видят xrt в полном объёме: публичные API 91 модуля вызываются по адресу через таблицу символов в точности как сам хост. Краткая карта доменов (полные прототипы — во встроенном в VFS /xs/xrt_decl.h; карточки ведут в справочник API xrt, или смотрите наш индекс по доменам):
Сетевое ядро371+
xrtNet / Tcp / Udp / NetServer / NetStream — соединения, слушатели (SHARED / REUSE_PORT), дейтаграммы, разрешение адресов
TLS 1.2 / 1.3252+
xrtTls / Tls12 / Tls13 — рукопожатия, record, возобновление PSK / Ticket, взаимная аутентификация
Сертификаты / ASN.1123+
xrtX509 / Der / Pem — построение и проверка цепочек, name constraints, CRL, системные хранилища доверия
HTTP / 1.1149
xrtHttp / Http1 — парсер (35 кодов ошибок), ResponseWrite, Chunk, BodyRead
WebSocket104
xrtWs — кадры, потоки, Upgrade, permessage-deflate, чтение/запись со счётчиком ссылок
Конкурентность≈220
xrtCo / Channel / Task / Future / Executor / Thread — корутины, каналы в стиле Go, пул потоков с вытеснением
Динамические значения / JSON181
xrtValue 116 + Json / Xson 65 — объекты / массивы / деревья, сериализация, запросы
Строки / Unicode133
xrtStr / Utf8 / Utf16 / Utf32 — представления, преобразование, регистр, валидация
Регулярки / шаблоны91
xrtRegex / RegexSet / Pattern — NFA-регулярки, пакетно прекампилированные pattern маршрутов
Контейнеры≈160
Array / List / Map / Set / AVL / Stack / Buffer / SlotMap
Файлы / пути118
xrtFile 45 / Path 38 / Dir 35 — синхронный и асинхронный IO, деревья каталогов, нормализация путей
Память≈90
xrtMem / Temp / Pool — аллокация, временные аллокаторы, пулы, отчёты отладки памяти
Логирование76
xrtLog — уровни, форматирование, несколько приёмников
Шаблоны32
xrtTemplate — компиляция / рендеринг, {$var} и {#foreach}
Процессы / система≈40
xrtProcess / Signal / Environment — дочерние процессы, сигналы, переменные окружения
Криптография / сжатие118+
Семейство SHA, HMAC / HKDF / PBKDF2, AES, RSA / ECDSA / Ed25519; сжатие miniz
Счётчики доменов агрегируют семейства префиксов (xrtTcp входит в сетевое ядро); не перечисленные малые домены (Time / Atomic / Math / Random / Html / Codec …) дополняют итог до 3 030.
Расширение · sqlite (272 символа)
Вкомпилируется вариантом сборки build.bat sqlite. Полный движок SQLite линкуется в хост статически; в скриптах достаточно #include <sqlite3.h> (даёт VFS), режим FULLMUTEX для нескольких worker'ов. Полный справочник (соединения / пять шагов оператора / транзакции) →
/* Реальное использование из demo-single/modules/database.h */
iResult = sqlite3_open_v2(sDBFile, &G_DB,
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
(void)sqlite3_exec(G_DB, "CREATE TABLE IF NOT EXISTS ...", NULL, NULL, NULL);
sqlite3_prepare_v2(G_DB, sSQL, -1, & pStatement, NULL); /* prepared statement */
sqlite3_bind_text(pStatement, 1, sName, -1, SQLITE_TRANSIENT);
sqlite3_step(pStatement);
sqlite3_finalize(pStatement);
Экспортируется полный нативный API SQLite (open/exec/prepare/step/bind/finalize/backup/…, 272 символа) — пять семейств и пять шагов оператора разобраны в справочнике sqlite; полная практика — в главе 32.
Расширение · xtp2 (13 функций)
Вкомпилируется вариантом сборки build.bat xtp. Библиотека кадров бинарного протокола прикладного уровня поверх упорядоченных потоков байтов: заголовок 32 байта, типы REQUEST / RESPONSE / PUSH / EVENT, потоковый инкрементальный разбор, полноценная система limits. Проверена libFuzzer на сквозную согласованность и потоковый автомат состояний.
xtp2_config_init / create / destroy
Конфигурация (лимиты, аллокатор) → создание и уничтожение декодера
xtp2_feed / finish
Потоковая инкрементальная подача (потреблённые байты и сообщение через out-параметры); finish проверяет полуразобранные кадры на EOF
xtp2_decode
Декодирование одного кадра без аллокаций (полный буфер)
xtp2_measure / encode
Сначала замер, потом запись; при ошибке выходной буфер не трогается
xtp2_params / param_next / find
Итерация параметров и точный бинарный поиск
xtp2_error_string / reset
Текст ошибки; ошибки разбора залипают до reset
xtp2_processor* pRx;
if ( xtp2_create(NULL, &pRx) != XTP2_OK ) { ... }
/* В каждом цикле чтения открытого текста TCP / TLS: */
while ( iSize ) {
size_t iUsed;
xtp2_message tMsg;
xtp2_result r = xtp2_feed(pRx, pBytes, iSize, &iUsed, &tMsg);
pBytes += iUsed; iSize -= iUsed;
if ( r < 0 ) break; /* залипающая ошибка */
if ( r == XTP2_MESSAGE ) { ... } /* использовать/скопировать tMsg и продолжать feed */
if ( r == XTP2_MORE ) break; /* мало данных, ждём следующий раунд */
}
/* На EOF — xtp2_finish(pRx) проверяет полуразобранные кадры, затем xtp2_destroy */
Расширение · xllm (68 функции)
Вкомпилируется вариантом сборки build.bat xllm. Ядро вызова LLM-сервисов (vendored из extlibs xrt, базовый слой v3.0.0): один вызов, один API, три диалекта провайдеров (Chat Completions / OpenAI Responses / Anthropic Messages). Все зависимости времени выполнения — сеть, TLS, JSON, отмена — даёт встроенный в хост полный xrt; скрипту достаточно #include <xllm.h>.
xllmClientConfigInit / Create / Destroy
конфигурация клиента и жизненный цикл; движок хоста берётся взаймы или принадлежит библиотеке
xllmRequestInit / AddTextMessage / AddTool
конструирование запроса: текстовые сообщения, мультимодальные part, инструменты и их результаты
xllmCallFuture / Wait / Cancel
асинхронные вызовы: заимствованный future, блокирующее ожидание, отмена через xrt
xllmClientComplete
одношаговый синхронный вход: внутри повторы, уважение rate-limit и SSE-колбэки
xllmModelProfileBuiltin / Supports
встроенные профили моделей (семейство GLM) и проверка возможностей
xllmEstimateTextTokens
офлайн-оценка токенов для планирования бюджета диалога
xllm_client_config tConf;
xllm_client* pClient;
xllm_request tReq;
xllm_response* pResp = NULL;
xllm_error tErr;
xllmClientConfigInit(&tConf);
tConf.sBaseUrl = "https://open.bigmodel.cn/api/paas/v4";
tConf.sApiKey = sKey; /* заимствованный указатель, без копии */
tConf.sModel = "glm-5.2";
tConf.eProvider = XLLM_PROVIDER_GLM;
pClient = xllmClientCreate(&tConf, &tErr); /* по умолчанию владеет своим движком */
xllmRequestInit(&tReq);
xllmRequestAddTextMessage(&tReq, XLLM_ROLE_USER, "Расскажи про XServer одним предложением");
if ( xllmClientComplete(pClient, &tReq, NULL, &pResp, &tErr) == XLLM_RESULT_OK ) {
/* читаем текстовые блоки / причину завершения / расход, затем xllmResponseDestroy(pResp) */
}
xllmRequestUnit(&tReq);
xllmClientDestroy(pClient);
Расширение · почтовое семейство (283 функции)
Вкомпилируется вариантом build.bat xsmtp (или xpop3 / ximap — xmail подтянется автоматически). xmail — база MIME: кодеки (QP/Base64), кодировки, разбор адресов и дат, параметры и multipart, дерево сообщения, конструкторы и проводной формат; три протокольных клиента делят его транспорт и SASL. TLS даёт xrt хоста. #include <xsmtp.h> разрешает всё семейство.
xrtMailTreeParse / Compose
разбор дерева MIME и одношаговая сборка
xrtSmtpClientMail / Data / Bdat
сеансы SMTP: MAIL/RCPT/DATA и блоки BDAT, STARTTLS/SSL
xrtPop3ClientStat / RetrTree
POP3: STAT/LIST/UIDL, Retr сразу в дерево сообщения
xrtImapClientBeginFetch / Idle
IMAP: выбор/поиск/выборка/APPEND/пуш IDLE/COMPRESS
общий SASL
PLAIN / XOAUTH2 / OAUTHBEARER во всех трёх протоколах
семейство xrtMailBuilder
потоковая сборка multipart, ноль промежуточных копий
Расширение · md4c (2 функции)
Вкомпилируется вариантом build.bat md4c. Разбор CommonMark и рендеринг HTML: md_parse — поток событий с колбэками (вход/выход блоков и span'ов, куски текста); md_html рендерит одним шагом поверх; таблицы, зачёркивание и списки задач включаются флагами. Заголовки самодостаточны, зависимостей на линковку нет. Осторожно: указатели колбэков не проверяются — ведите md_parse с полностью заполненной структурой или берите md_html с собственными колбэками.
void sink(const MD_CHAR* p, MD_SIZE n, void* u) { buf_append(u, p, n); }
md_html(sMarkdown, iLen, sink, &tBuf, MD_DIALECT_GFM, 0);
Расширение · xacme (20 функций)
Вкомпилируется вариантом build.bat xacme. Клиент сертификатов ACME (RFC 8555): регистрация счёта, заказ, вызов dns-01 и получение сертификата одной остановкой (xacmeClientIssue); xacmeClientIssueStored добавляет дисковое хранилище с правилом «продлевать только при малом остатке срока». DNS-провайдер Aliyun встроен; сторонние подключаются чистыми структурами. Свой синхронный HTTPS-транспорт и зонд распространения TXT — зависит только от xrt хоста.
xacmeClientInit / Issue / IssueStored
главный маршрут выпуска; Stored добавляет хранилище и продление
xrtAcmeDnsAli / ProviderValidate
конструирование и проверка DNS-провайдера (встроен Aliyun)
xrtAcmeStoreSaveCert / NeedRenew
сохранение сертификатов/счетов и проверка продления
xrtAcmeAccountConfigInit
конфигурация счёта и пресеты ЦС (LE/ZeroSSL/Google/Buypass)
Расширение · qrcodegen (10 функций)
Вкомпилируется вариантом build.bat qrcodegen. Генератор QR-кодов (Nayuki, MIT) плюс слой вывода PNG: 9 функций вверх по течению (три входа кодирования Text/Binary/Segments, определение числового/буквенно-цифрового режима, расчёт буфера, чтение матрицы getSize/getModule) плюс qrcodegen_png для одношагового 1-битного grayscale PNG (IDAT сжимается потоком zlib xrt, CRC32 локально). Типовые сценарии: 2FA provisioning (otpauth:// URI в QR), динамические платёжные коды, маршрут GET /qr?text=..., QR в письмах (с xsmtp).
qrcodegen_encodeText / Binary / Segments
три входа кодирования; буферы модулей и временные предоставляет вызывающий
qrcodegen_png
вывод PNG одним шагом (scale/border/тихая зона); освобождение xrtFree
qrcodegen_getSize / getModule
чтение матрицы модулей (для своих рендереров)
qrcodegen_isNumeric / isAlphanumeric
определение режима (подсказка оптимального сжатия)
Расширение · xjwt (24 функции)
Включается сборкой build.bat xjwt. Подпись и проверка JWT (RFC 7519) / JWS (RFC 7515): HS256/384/512, семейство RS256/384/512 (ключи PKCS#8/PKCS#1), ES256 (DER-кодировка, двусторонняя совместимость с OpenSSL); выбор ключей JWKS (RFC 7517) по kid; тройка кэша публичных ключей для высокочастотной проверки. Claims передаются как xvalue* (нулевая мостовая прослойка на уровне скриптов), код ошибки читается одной строкой через xjwtLastError(), aud принимает строки и массивы. Четыре раунда аудита, включая interop с OpenSSL, fuzz и замер нулевых утечек в устойчивом состоянии.
xjwtSign / семь одношаговых
инъекция iss/aud/sub/jti/kid через config; семь одношаговых подписей
xjwtVerify / xjwtVerifyKey
проверка за один шаг (exp/nbf/iss/aud + подпись); вариант с кэшем ключа
xjwtJwksParse / xjwtVerifyJwks
наборы ключей внешних IdP с выбором по kid (сигнал повтора при ротации)
xjwtClaimString / xjwtLastError
безопасное извлечение строковых claims; код ошибки одной строкой
Расширение · xoauth2 (25 функций)
Включается сборкой build.bat xoauth2. Клиент OAuth 2.0 (RFC 6749): поток кода авторизации + PKCE (RFC 7636) + обновление токенов + пять пресетов провайдеров (GitHub/Google/WeChat/Microsoft/Custom); помощники OIDC (однократное сжигание nonce, HttpGet для JWKS, GetUserInfo). Транспорт инъектируется через xoauth2httpproc (моки прогоняют весь поток офлайн); в комплекте — реализация на xrt net/tls/http1 (стековая и кучная версии). Четырёхуровневые коды ошибок напрямую отображаются на семантику HTTP. Связь с xjwt — на данных, нулевая зависимость линковки: OIDC-логин собирается из восьми строк клея, без requires.
xoauth2BeginLogin / CompleteLogin
URL авторизации (state+PKCE+nonce) → обмен кода (сжигание state за константное время)
xoauth2Refresh / TokenExpiring
обновление и проверка истечения (неизвестный срок ≠ истекает)
xoauth2HttpGet / NonceConsume / GetUserInfo
слой сопряжения OIDC: загрузка JWKS, потребление nonce, userinfo
Пятёрка xoauth2HttpXrt
транспорт на xrt TLS (стек + куча); или инъекция своего HTTP-колбэка
Расширение · xwork (42 функции)
Включается сборкой build.bat xwork (автоматически тянет xllm + xllm-session). Вершина AI-стека (v2.3.1): оркестрация агентов, регистрация и выполнение инструментов, политика рабочей области, типы субагентов, уведомления и компакция. release/agent-demo/ — сквозное практическое подтверждение.
Расширение · webview (2 функции) + узел app
Включается сборкой build.bat webview. Окно рабочего стола (WebView2): на стороне скрипта только 2 функции-проба; управлением владеет узел class: "app". С односоставной публикацией = десктоп-exe в один клик.
xsWebviewAvailable / Version
проба среды и версия
узел class: "app"
локальный HTTP + окно; headless-запас
дескриптор window · 9 полей
title / размеры / url / devtools / close / install_fallback — построчные ограничения и умолчания
XS_ServerInfo.PortBound
считывание фактического порта при port: 0 (uint16, дописано в хвост)
Встроенные ресурсы VFS
Всё необходимое для компиляции скриптов уже внутри бинарника (сжатие LZMA, 350 ресурсов в варианте all) — целевой машине не нужны никакие заголовки и библиотеки:
| Путь | Содержимое |
|---|---|
/xs/xsbase.h | Контрактный заголовок (та же версия, что у бинарника) |
/xs/xrt_decl.h | Полные публичные объявления xrt (3 030 прототипа API) |
/xs/libtcc.h | API вложенной компиляции |
/tcc/include_win/** | Заголовки Windows SDK (включая winapi, curl) |
/tcc/include_linux/** | Стандартные заголовки для Linux |
/tcc/lib/*.def | kernel32 / msvcrt / user32 / gdi32 / shell32 / ole32 / oleaut32 / ws2_32 / imm32 |
/tcc/lib/libtcc1.a | Вспомогательная библиотека рантайма TCC |
Состав ресурсов VFS и различия вариантов — в справочнике VFS. На Windows msvcrt и kernel32 монтируются автоматически в режиме компиляции в память; 7 системных библиотек выше хост экспортирует явно — процессы, COM, сокеты и Shell Win32 API напрямую доступны в скриптах. sqlite3.h / xtp2.h входят только в соответствующие варианты.