Дисциплина ABI
Раскладка заморожена: новые поля можно только дописывать в хвост, никогда не переупорядочивать и не переименовывать (прямо сказано в комментариях xsbase.h). Скрипты обращаются к полям по имени; двоичная совместимость между версиями сохраняется.
XS_HostInfo / XS_ServerInfo / XS_HttpReq / XS_StreamConn — представления, принадлежащие хосту: читать поля безопасно, записывать — неопределённое поведение.
Представления host защищены арендой своего server; представления HttpReq / StreamConn действительны внутри колбэка. Чтобы сохранить — Retain (топология) или копия (запросы).
XS_HostInfo (сведения о хосте, 15 полей)
| Поле | Тип | Пояснение |
|---|---|---|
Enabled | bool | включён ли |
Name | const char* | имя хоста (уникально в пределах server) |
Host | const char* | привязки доменов (через точку с запятой); ключ маршрутизации http/ws |
Path | const char* | корень ресурсов / скриптов (абсолютный путь) |
DevLang | const char* | c / static / своё приложение |
DevFile | const char* | путь входного скрипта |
TlsCA / TlsCert / TlsKey | const char* | пути сертификатов уровня host → источник данных селектора SNI |
State | XS_RunState | состояние выполнения (см. справочник перечислений) |
Runtime | void* | скриптовый рантайм этого поколения (непрозрачный; не разыменовывать) |
Server | XS_ServerInfo* | обратный указатель: от одного host — ко всей топологии |
Custom | xvalue* | всё, что этот host хранит сверх предустановленных полей |
DevInc / DevLib | const char* | каталоги include / библиотек скриптов (поля, дописанные в хвост) |
RuntimeLock | void* | блокировка смены поколения на стороне хоста (непрозрачная; поле из хвоста) |
XS_ServerInfo (сведения о сервисе, 20 полей)
| Поле | Тип | Пояснение |
|---|---|---|
Enabled | bool | включён ли |
Class | const char* | "http" | "ws" | "tcp" | "udp" | "custom" | "app" |
Name | const char* | глобально уникальное имя (ключ xsServerFind) |
IP / Port | const char* / uint16 | конечная точка прослушивания без шифрования |
TLS / PortTLS / IPTLS | bool / uint16 / const char* | TLS-конечная точка; IPTLS по умолчанию совпадает с IP |
Backlog | uint32 | напрямую в конфигурацию прослушивания xrt |
RecvLimit | size_t | потолок чтения потока (напрямую в xrt) |
DefaultHost | XS_HostInfo* | существует всегда; непопавший vhost откатывается сюда |
HostCount / Hosts | uint32 / XS_HostInfo** | список vhost (без DefaultHost) |
State | XS_RunState | состояние выполнения |
Runtime | void* | рантайм уровня сервиса (непрозрачный) |
Engine | struct xnetengine* | движок уровня процесса (отправная точка для приложений класса custom) |
Custom | xvalue* | непредустановленные поля уровня сервиса |
Generation | void* | владелец жизненного цикла поколения сервиса (дописано в хвост) |
ConfigOwner | void* | владелец снимка динамической конфигурации (дописано в хвост) |
PortBound | uint16 | фактически занятый порт (дописано в хвост): фиксированный порт = Port; класс app с port:0 = значение, назначенное ОС (Port также перезаписывается, идентичность конечной точки совпадает со скриптовым представлением); 0 = ещё не привязан |
XS_HttpReq (представление HTTP-запроса, 6 полей)
Исходный метод и представление полей head действительны только внутри колбэка (кольцевой буфер переиспользуется); body вычитывается инкрементально через xrtHttp1BodyRead. Поля родных структур xrt (xhttp1head / xhttp1body) — в xrt · справочник http1.
XS_StreamConn (представление TCP-соединения, 2 поля)
Ровно одна сторона не NULL: используйте отправочный API, соответствующий ненулевой стороне; под tcps запрещено писать в tcp в обход tls. Время жизни соединения принадлежит драйверу хоста (захват Accept → реестр → разрушение Close) — приложение не отвечает за Destroy.
XS_ReloadResult (результат перезагрузки, 5 полей)
| Поле | Тип | Пояснение |
|---|---|---|
Id | XS_ReloadId (uint64) | ID намерения (возвращаемое значение Submit) |
State | XS_ReloadState | одно из семи состояний (см. справочник перечислений) |
Revision | uint64 | отпечаток содержимого неизменяемого входного снимка; при отсутствии конфигурационного входа включает отпечаток скриптов |
Target[160] | char[] | описание цели (имя server / host) |
Message[256] | char[] | сообщение результата (причина неудачи) |
Это единственная структура результата, чьё хранилище принадлежит приложению (выходной параметр на стеке); запросы — xsReloadQuery.