Задача: SitePack Validator
Цель
Реализовать валидатор распакованного пакета SitePack и валидатор заголовка encrypted envelope.
Входные данные
- Путь к распакованному пакету (каталогу).
- Опционально: путь к
*.sitepack.enc.json. - Опционально: путь к
sitepack.volumes.json.
Проверки пакета
- Корень MUST содержать
sitepack.manifest.jsonиsitepack.catalog.json. - JSON должен быть валидным.
- Проверить
sitepack.manifest.jsonпоschemas/manifest.schema.json. - Проверить
sitepack.catalog.jsonпоschemas/catalog.schema.json. - Все
manifest.artifactsMUST присутствовать в catalog. - Для каждого артефакта в catalog:
- файл по
pathсуществует; sizeсовпадает с фактическим размером в байтах;- если
digestуказан, он совпадает с filesha256.
- файл по
- NDJSON-артефакты: каждая строка должна быть валидным JSON-объектом.
- Для известных media types проверять каждую запись по соответствующей схеме:
- entity-graph ->
schemas/entity.schema.json - asset-index ->
schemas/asset-index.schema.json - config-kv ->
schemas/config-kv.schema.json - recordset ->
schemas/recordset.schema.json
- entity-graph ->
- Проверка asset-index должна поддерживать single-blob и chunked assets:
- если
pathуказан, blob-файл должен существовать и соответствоватьsizeиsha256; - если
chunksуказан, каждый chunk-файл должен существовать и соответствовать своемуsizeиsha256, а собранный asset должен соответствовать top-levelsizeиsha256.
- если
- Проверять кодирование relations для сущностей:
relationsMUST быть объектом, который сопоставляет keys сLink[], где Link — строка или объект сrefи опциональнымmeta. - Неизвестный
mediaTypeMUST пропускаться, но MUST логироваться.
Проверки Envelope
Если передан путь к *.sitepack.enc.json:
- JSON должен быть валидным.
- Проверить по
schemas/envelope.schema.json. - Проверить, что
payload.payloadDigestсуществует и соответствуетsha256:<hex>.
Проверки Volume Set
Если передан путь к sitepack.volumes.json:
- JSON должен быть валидным.
- Проверить по
schemas/volume-set.schema.json. - Для каждого тома проверить
sha256иsizeфайла тома. - Если том зашифрован age, использовать указанный envelope header, чтобы найти и расшифровать payload, либо вернуть понятную ошибку unsupported.
- Распаковать тома по возрастанию индекса во временный каталог и проверить собранный пакет обычным способом.
Отчет
Записать reports/validate.json рядом с пакетом. Минимальная структура:
{
"ok": true,
"errors": [],
"warnings": [],
"summary": {
"artifactsTotal": 0,
"artifactsValidated": 0,
"unknownMediaTypes": 0,
"ndjsonLines": 0
}
}
ok=false, если есть errors.- Использовать machine-readable codes и human-readable messages в
errorsиwarnings.