5 групп структур · поля сверены с src/sdk/xsbase.h

Справочник структур

XServer лишь прозрачно передаёт представления и информационные структуры, не оборачивая объектную модель. Кроме ReloadResult, все структуры ниже — заимствованные представления: ими владеет хост, они действительны внутри колбэка, поля менять нельзя.

Дисциплина ABI

Структура — это ABI

Раскладка заморожена: новые поля можно только дописывать в хвост, никогда не переупорядочивать и не переименовывать (прямо сказано в комментариях xsbase.h). Скрипты обращаются к полям по имени; двоичная совместимость между версиями сохраняется.

Представления не изменяются

XS_HostInfo / XS_ServerInfo / XS_HttpReq / XS_StreamConn — представления, принадлежащие хосту: читать поля безопасно, записывать — неопределённое поведение.

Время жизни

Представления host защищены арендой своего server; представления HttpReq / StreamConn действительны внутри колбэка. Чтобы сохранить — Retain (топология) или копия (запросы).

XS_HostInfo (сведения о хосте, 15 полей)

ПолеТипПояснение
Enabledboolвключён ли
Nameconst char*имя хоста (уникально в пределах server)
Hostconst char*привязки доменов (через точку с запятой); ключ маршрутизации http/ws
Pathconst char*корень ресурсов / скриптов (абсолютный путь)
DevLangconst char*c / static / своё приложение
DevFileconst char*путь входного скрипта
TlsCA / TlsCert / TlsKeyconst char*пути сертификатов уровня host → источник данных селектора SNI
StateXS_RunStateсостояние выполнения (см. справочник перечислений)
Runtimevoid*скриптовый рантайм этого поколения (непрозрачный; не разыменовывать)
ServerXS_ServerInfo*обратный указатель: от одного host — ко всей топологии
Customxvalue*всё, что этот host хранит сверх предустановленных полей
DevInc / DevLibconst char*каталоги include / библиотек скриптов (поля, дописанные в хвост)
RuntimeLockvoid*блокировка смены поколения на стороне хоста (непрозрачная; поле из хвоста)

XS_ServerInfo (сведения о сервисе, 20 полей)

ПолеТипПояснение
Enabledboolвключён ли
Classconst char*"http" | "ws" | "tcp" | "udp" | "custom" | "app"
Nameconst char*глобально уникальное имя (ключ xsServerFind)
IP / Portconst char* / uint16конечная точка прослушивания без шифрования
TLS / PortTLS / IPTLSbool / uint16 / const char*TLS-конечная точка; IPTLS по умолчанию совпадает с IP
Backloguint32напрямую в конфигурацию прослушивания xrt
RecvLimitsize_tпотолок чтения потока (напрямую в xrt)
DefaultHostXS_HostInfo*существует всегда; непопавший vhost откатывается сюда
HostCount / Hostsuint32 / XS_HostInfo**список vhost (без DefaultHost)
StateXS_RunStateсостояние выполнения
Runtimevoid*рантайм уровня сервиса (непрозрачный)
Enginestruct xnetengine*движок уровня процесса (отправная точка для приложений класса custom)
Customxvalue*непредустановленные поля уровня сервиса
Generationvoid*владелец жизненного цикла поколения сервиса (дописано в хвост)
ConfigOwnervoid*владелец снимка динамической конфигурации (дописано в хвост)
PortBounduint16фактически занятый порт (дописано в хвост): фиксированный порт = Port; класс app с port:0 = значение, назначенное ОС (Port также перезаписывается, идентичность конечной точки совпадает со скриптовым представлением); 0 = ещё не привязан

XS_HttpReq (представление HTTP-запроса, 6 полей)

typedef struct { xnetstream* tcp; /* ровно одно из tcp/tls не NULL */ xtlsstream* tls; /* весь набор потоковых/отправочных API xrt доступен напрямую */ const xhttp1head* head; /* содержит MethodCode; представление полей действует в колбэке */ xhttp1body* body; /* автомат фреймизации: фиксированная длина / chunked / закрытие */ const XS_HostInfo* host; XS_ServerInfo* server; } XS_HttpReq;

Исходный метод и представление полей head действительны только внутри колбэка (кольцевой буфер переиспользуется); body вычитывается инкрементально через xrtHttp1BodyRead. Поля родных структур xrt (xhttp1head / xhttp1body) — в xrt · справочник http1.

XS_StreamConn (представление TCP-соединения, 2 поля)

typedef struct XS_StreamConn { xnetstream* tcp; /* транспортный слой TCP без шифрования */ xtlsstream* tls; /* транспортный слой TLS (tcps) */ } XS_StreamConn;

Ровно одна сторона не NULL: используйте отправочный API, соответствующий ненулевой стороне; под tcps запрещено писать в tcp в обход tls. Время жизни соединения принадлежит драйверу хоста (захват Accept → реестр → разрушение Close) — приложение не отвечает за Destroy.

XS_ReloadResult (результат перезагрузки, 5 полей)

ПолеТипПояснение
IdXS_ReloadId (uint64)ID намерения (возвращаемое значение Submit)
StateXS_ReloadStateодно из семи состояний (см. справочник перечислений)
Revisionuint64отпечаток содержимого неизменяемого входного снимка; при отсутствии конфигурационного входа включает отпечаток скриптов
Target[160]char[]описание цели (имя server / host)
Message[256]char[]сообщение результата (причина неудачи)

Это единственная структура результата, чьё хранилище принадлежит приложению (выходной параметр на стеке); запросы — xsReloadQuery.