Каталог
Каталог — это ресурс, который записывает все операции пакета в источнике пакета, например создание и удаление. Ресурс каталога имеет Catalog
тип в индексе службы. Этот ресурс можно использовать для запроса всех опубликованных пакетов.
Примечание
Так как каталог не используется официальным клиентом NuGet, не все источники пакетов реализуют каталог.
Примечание
В настоящее время каталог nuget.org недоступен в Китае. Дополнительные сведения см. в разделе NuGet/NuGetGallery#4949.
Используется следующее @type
значение:
Значение @type | Примечания. |
---|---|
Catalog/3.0.0 | Начальный выпуск |
URL-адрес точки входа для следующих API — это значение свойства, связанного @id
с указанными выше упоминание значениями ресурсов@type
. В этом разделе используется URL-адрес {@id}
заполнителя.
Все URL-адреса, найденные в ресурсе каталога, поддерживают только методы GET
HTTP и HEAD
.
Индекс каталога — это документ в известном расположении с списком элементов каталога, упорядоченных в хронологическом порядке. Это точка входа ресурса каталога.
Индекс состоит из страниц каталога. Каждая страница каталога содержит элементы каталога. Каждый элемент каталога представляет событие, относящееся к одному пакету в определенный момент времени. Элемент каталога может представлять пакет, созданный, незаписанный, перезаписанный или удаленный из источника пакета. Обрабатывая элементы каталога в хронологическом порядке, клиент может создавать актуальное представление каждого пакета, существующего в источнике пакета версии 3.
Короче говоря, большие двоичные объекты каталога имеют следующую иерархическую структуру:
- Индекс: точка входа для каталога.
- Страница: группировка элементов каталога.
- Лист: документ, представляющий элемент каталога, который является моментальным снимком состояния одного пакета.
Каждый объект каталога имеет свойство, которое называется представлением commitTimeStamp
при добавлении элемента в каталог. Элементы каталога добавляются на страницу каталога в пакетах, называемых фиксациями. Все элементы каталога в одной фиксации имеют одинаковую метку времени фиксации (commitTimeStamp
) и ИД фиксации (commitId
). Элементы каталога, помещенные в ту же фиксацию, представляют события, которые происходят примерно в тот же момент времени в источнике пакета. Порядок в фиксации каталога отсутствует.
Так как каждый идентификатор пакета и версия уникальны, в фиксации никогда не будет больше одного элемента каталога. Это гарантирует, что элементы каталога для одного пакета всегда могут быть однозначно упорядочены в отношении метки времени фиксации.
Для каждого каталога commitTimeStamp
никогда не будет зафиксировано несколько фиксаций. Другими словами, избыточность commitId
с commitTimeStamp
помощью .
В отличие от ресурса метаданных пакета, который индексируется по идентификатору пакета, каталог индексируется (и запрашивается) только по времени.
Элементы каталога всегда добавляются в каталог в монотонном порядке, в хронологическом порядке. Это означает, что если фиксация каталога добавляется во время X, то фиксация каталога никогда не будет добавлена с течением времени меньше или равно X.
Следующий запрос извлекает индекс каталога.
GET {@id}
Индекс каталога — это документ JSON, содержащий объект со следующими свойствами:
Имя. | Type | Обязательное поле | Примечания. |
---|---|---|---|
commitId | строка | yes | Уникальный идентификатор, связанный с последней фиксацией |
commitTimeStamp | строка | yes | Метка времени последней фиксации |
count | integer | yes | Количество страниц в индексе |
items | массив объектов | yes | Массив объектов, каждый объект, представляющий страницу |
Каждый элемент в массиве items
представляет собой объект с некоторыми минимальными сведениями о каждой странице. Эти объекты страницы не содержат листья каталога (элементы). Порядок элементов в этом массиве не определен. Страницы можно упорядочить клиентом в памяти с помощью их commitTimeStamp
свойства.
По мере появления count
новых страниц будут добавлены и новые объекты будут отображаться в массиве items
.
Как элементы добавляются в каталог, индекс commitId
изменится и commitTimeStamp
увеличится. Эти два свойства по сути являются сводкой по всем страницам commitId
и commitTimeStamp
значениям в массиве items
.
Объекты страницы каталога, найденные в свойстве индекса items
каталога, имеют следующие свойства:
Имя. | Type | Обязательное поле | Примечания. |
---|---|---|---|
@id | строка | yes | URL-адрес для получения страницы каталога |
commitId | строка | yes | Уникальный идентификатор, связанный с последней фиксацией на этой странице |
commitTimeStamp | строка | yes | Метка времени последней фиксации на этой странице |
count | integer | yes | Количество элементов на странице каталога |
В отличие от ресурса метаданных пакета, который в некоторых случаях встраивается в индекс, листья каталога никогда не встраиваются в индекс и всегда должны быть возвращены с помощью URL-адреса страницы @id
.
GET https://api.nuget.org/v3/catalog0/index.json
{
"commitId": "3d698852-eefb-48ed-8f55-9ee357540d20",
"commitTimeStamp": "2017-10-31T23:33:17.0954363Z",
"count": 3,
"items": [
{
"@id": "https://api.nuget.org/v3/catalog0/page0.json",
"commitId": "3a4df280-3d86-458e-a713-4c91ca261fef",
"commitTimeStamp": "2015-02-01T06:30:11.7477681Z",
"count": 540
},
{
"@id": "https://api.nuget.org/v3/catalog0/page1.json",
"commitId": "8bcd3cbf-74f0-47a2-a7ae-b7ecc50005d3",
"commitTimeStamp": "2015-02-01T06:39:53.9553899Z",
"count": 540
},
{
"@id": "https://api.nuget.org/v3/catalog0/page2.json",
"commitId": "3d698852-eefb-48ed-8f55-9ee357540d20",
"commitTimeStamp": "2017-10-31T23:33:17.0954363Z",
"count": 47
}
]
}
Страница каталога — это коллекция элементов каталога. Это документ, извлекаемый с помощью одного из @id
значений, найденных в индексе каталога. URL-адрес страницы каталога не предназначен для прогнозируемого и должен быть обнаружен только с помощью индекса каталога.
Новые элементы каталога добавляются на страницу в индексе каталога только с самой высокой меткой времени фиксации или новой страницей. После добавления в каталог страницы с более высокой меткой времени фиксации старые страницы никогда не добавляются или не изменяются.
Документ страницы каталога — это объект JSON со следующими свойствами:
Имя. | Type | Обязательное поле | Примечания. |
---|---|---|---|
commitId | строка | yes | Уникальный идентификатор, связанный с последней фиксацией на этой странице |
commitTimeStamp | строка | yes | Метка времени последней фиксации на этой странице |
count | integer | yes | Количество элементов на странице |
items | массив объектов | yes | Элементы каталога на этой странице |
parent | строка | yes | URL-адрес индекса каталога |
Каждый элемент в массиве items
представляет собой объект с некоторыми минимальными сведениями о элементе каталога. Эти объекты элементов не содержат все данные элемента каталога. Порядок элементов в массиве страницы items
не определен. Элементы можно упорядочить клиентом в памяти с помощью их commitTimeStamp
свойства.
Количество элементов каталога на странице определяется реализацией сервера. Для nuget.org на каждой странице имеется не более 550 элементов, хотя фактическое число может быть меньше для некоторых страниц в зависимости от размера следующего пакета фиксации в определенный момент времени.
По мере появления count
новых элементов в массиве отображаются items
новые объекты элементов каталога.
При добавлении элементов на страницу commitId
изменения и commitTimeStamp
увеличение. Эти два свойства по сути являются сводкой по всем commitId
и commitTimeStamp
значениям в массиве items
.
Объекты элемента каталога, найденные в свойстве страницы items
каталога, имеют следующие свойства:
Имя. | Type | Обязательное поле | Примечания. |
---|---|---|---|
@id | строка | yes | URL-адрес для получения элемента каталога |
@type | строка | yes | Тип элемента каталога |
commitId | строка | yes | ИД фиксации, связанный с этим элементом каталога |
commitTimeStamp | строка | yes | Метка времени фиксации этого элемента каталога |
nuget:id | строка | yes | Идентификатор пакета, с которым связан этот лист |
nuget:version | строка | yes | Версия пакета, с которым связан этот лист |
Это @type
значение будет одним из следующих двух значений:
nuget:PackageDetails
: это соответствует типуPackageDetails
в листовом документе каталога.nuget:PackageDelete
: это соответствует типуPackageDelete
в листовом документе каталога.
Дополнительные сведения о том, что означает каждый тип, см. в соответствующем типе элементов ниже.
GET https://api.nuget.org/v3/catalog0/page2926.json
{
"commitId": "616117f5-d9dd-4664-82b9-74d87169bbe9",
"commitTimeStamp": "2017-10-31T23:30:32.4197849Z",
"count": 5,
"parent": "https://api.nuget.org/v3/catalog0/index.json",
"items": [
{
"@id": "https://api.nuget.org/v3/catalog0/data/2017.10.31.23.30.32/util.biz.payments.0.0.4-preview.json",
"@type": "nuget:PackageDetails",
"commitId": "616117f5-d9dd-4664-82b9-74d87169bbe9",
"commitTimeStamp": "2017-10-31T23:30:32.4197849Z",
"nuget:id": "Util.Biz.Payments",
"nuget:version": "0.0.4-preview"
},
{
"@id": "https://api.nuget.org/v3/catalog0/data/2017.10.31.23.28.02/util.biz.0.0.4-preview.json",
"@type": "nuget:PackageDetails",
"commitId": "820340b2-97e3-4f93-b82e-bc85550a6560",
"commitTimeStamp": "2017-10-31T23:28:02.788239Z",
"nuget:id": "Util.Biz",
"nuget:version": "0.0.4-preview"
},
{
"@id": "https://api.nuget.org/v3/catalog0/data/2017.10.31.22.31.22/sourcecode.clay.data.1.0.0-preview1-00258.json",
"@type": "nuget:PackageDetails",
"commitId": "cae34527-ffc7-4e96-884f-7cf95a32dbdd",
"commitTimeStamp": "2017-10-31T22:31:22.5169519Z",
"nuget:id": "SourceCode.Clay.Data",
"nuget:version": "1.0.0-preview1-00258"
},
{
"@id": "https://api.nuget.org/v3/catalog0/data/2017.10.31.22.31.22/sourcecode.clay.1.0.0-preview1-00258.json",
"@type": "nuget:PackageDetails",
"commitId": "cae34527-ffc7-4e96-884f-7cf95a32dbdd",
"commitTimeStamp": "2017-10-31T22:31:22.5169519Z",
"nuget:id": "SourceCode.Clay",
"nuget:version": "1.0.0-preview1-00258"
},
{
"@id": "https://api.nuget.org/v3/catalog0/data/2017.10.31.22.31.22/sourcecode.clay.json.1.0.0-preview1-00258.json",
"@type": "nuget:PackageDetails",
"commitId": "cae34527-ffc7-4e96-884f-7cf95a32dbdd",
"commitTimeStamp": "2017-10-31T22:31:22.5169519Z",
"nuget:id": "SourceCode.Clay.Json",
"nuget:version": "1.0.0-preview1-00258"
}
]
}
Лист каталога содержит метаданные о конкретном идентификаторе пакета и версии в определенный момент времени. Это документ, извлекаемый с помощью @id
значения, найденного на странице каталога. URL-адрес конечной точки каталога не предназначен для предсказуемого и должен быть обнаружен только на странице каталога.
Конечный документ каталога — это объект JSON со следующими свойствами:
Имя. | Type | Обязательное поле | Примечания. |
---|---|---|---|
@type | строка или массив строк | yes | Типы элемента каталога |
catalog:commitId | строка | yes | ИД фиксации, связанный с этим элементом каталога |
catalog:commitTimeStamp | строка | yes | Метка времени фиксации этого элемента каталога |
id | string | yes | Идентификатор пакета элемента каталога |
published | строка | yes | Дата публикации элемента каталога пакетов |
версия | строка | yes | Версия пакета элемента каталога |
Это @type
свойство представляет собой строку или массив строк. Для удобства, если @type
значение является строкой, он должен рассматриваться как любой массив размера один. Не все возможные значения задокументированы @type
. Однако каждый элемент каталога имеет ровно одно из двух следующих значений строкового типа:
PackageDetails
: представляет моментальный снимок метаданных пакетаPackageDelete
: представляет пакет, который был удален
Элементы каталога с типом PackageDetails
содержат моментальный снимок метаданных пакета для определенного пакета (идентификатор и сочетание версий). Элемент каталога сведений о пакете создается при обнаружении любого из следующих сценариев:
- Пакет отправляется.
- Пакет перезаписается.
- Пакет не указан.
- Пакет не рекомендуется.
- Пакет не рекомендуется.
- Пакет переполняется.
- Обновляется состояние уязвимости пакета.
Повторный поток пакета — это административный жест, который, по сути, создает поддельный push-файл существующего пакета без изменений в самом пакете. При nuget.org повторное изменение используется после исправления ошибки в одном из фоновых заданий, которые используют каталог.
Клиенты, использующие элементы каталога, не должны пытаться определить, какой из этих сценариев создал элемент каталога. Вместо этого клиент должен просто обновить любое сохраненное представление или индекс с метаданными, содержащимися в элементе каталога. Кроме того, повторяющиеся или избыточные элементы каталога должны обрабатываться корректно (идемпотентно).
Элементы каталога сведений о пакете имеют следующие свойства в дополнение к элементам , включенным во все листья каталога.
Имя. | Type | Обязательное поле | Примечания. |
---|---|---|---|
authors | строка | no | |
создаются | строка | no | Метка времени создания пакета. Резервное свойство: published . |
зависимостиGroups | массив объектов | no | Зависимости пакета, сгруппированные по целевой платформе (тот же формат, что и ресурс метаданных пакета) |
Исключения | объект | no | Нерекомендуемая связь с пакетом (тот же формат, что и ресурс метаданных пакета) |
описание | строка | no | |
iconUrl | строка | no | |
isPrerelease | boolean | no | Указывает, является ли версия пакета предварительной. Можно обнаружить из version . |
язык | string | no | |
licenseUrl | строка | no | |
регионе. | boolean | no | Указывает, указан ли пакет |
minClientVersion | строка | no | |
packageHash | строка | yes | Хэш пакета, кодировка с использованием стандартной базы 64 |
packageHashAlgorithm | строка | yes | |
packageSize | integer | yes | Размер пакета .nupkg в байтах |
packageTypes | массив объектов | no | Типы пакетов, указанные автором. |
projectUrl | строка | no | |
releaseNotes | строка | no | |
requireLicenseAgreement | boolean | no | Предположим, false если исключено |
Итоги | строка | no | |
tags | массив строк | no | |
title | string | no | |
verbatimVersion | строка | no | Строка версии, которая изначально найдена в nuspec |
vulnerabilities | массив объектов | no | Уязвимости пакета безопасности |
Свойство пакета version
— это полная строка версии после нормализации. Это означает, что данные сборки SemVer 2.0.0 можно включить здесь.
Метка created
времени заключается в том, когда пакет был впервые получен источником пакета, который, как правило, за короткое время до метки времени фиксации элемента каталога.
Строка packageHashAlgorithm
, определяемая реализацией сервера, представляющей алгоритм хэширования, используемый для создания packageHash
. nuget.org всегда использовал значение packageHashAlgorithm
SHA512
.
Свойство packageTypes
будет присутствовать только в том случае, если тип пакета был указан автором. Если он присутствует, он всегда будет иметь по крайней мере одну запись (1). Каждый элемент в массиве packageTypes
представляет собой объект JSON со следующими свойствами:
Имя. | Type | Обязательное поле | Примечания. |
---|---|---|---|
name | строка | yes | Имя типа пакета. |
версия | строка | no | Версия типа пакета. Присутствует только в том случае, если автор явно указал версию в nuspec. |
Метка published
времени — это время последнего перечисления пакета.
Примечание
В nuget.org published
значение задается в 1900 году, когда пакет не указан.
Массив объектов vulnerability
. Каждая уязвимость имеет следующие свойства:
Имя. | Type | Обязательное поле | Примечания. |
---|---|---|---|
advisoryUrl | строка | yes | Расположение рекомендаций по безопасности пакета |
severity | строка | yes | Серьезность рекомендаций: "0" = низкий, "1" = умеренный, "2" = высокий, "3" = критическое |
severity
Если свойство содержит значения, отличные от перечисленных здесь, серьезность рекомендаций должна рассматриваться как Низкая.
GET https://api.nuget.org/v3/catalog0/data/2015.02.01.11.18.40/windowsazure.storage.1.0.0.json
{
"@type": [
"PackageDetails",
"catalog:Permalink"
],
"authors": "NuGet.org Team",
"catalog:commitId": "49fe04d8-5694-45a5-9822-3be61bda871b",
"catalog:commitTimeStamp": "2015-02-01T11:18:40.8589193Z",
"created": "2011-12-02T20:21:23.74Z",
"description": "This package is an example for the V3 protocol.",
"deprecation": {
"reasons": [
"Legacy",
"HasCriticalBugs",
"Other"
],
"message": "This package is an example--it should not be used!",
"alternatePackage": {
"id": "Newtonsoft.JSON",
"range": "12.0.2"
}
},
"iconUrl": "https://www.nuget.org/Content/gallery/img/default-package-icon.svg",
"id": "NuGet.Protocol.V3.Example",
"isPrerelease": false,
"language": "en-US",
"licenseUrl": "http://www.opensource.org/licenses/ms-pl",
"packageHash": "2edCwKLcbcgFJpsAwa883BLtOy8bZpWwbQpiIb71E74k5t2f2WzXEGWbPwntRleUEgSrcxJrh9Orm/TAmgO4NQ==",
"packageHashAlgorithm": "SHA512",
"packageSize": 118348,
"packageTypes": [
{
"@id": "https://api.nuget.org/v3/catalog0/data/2015.02.01.11.18.40/windowsazure.storage.1.0.0.json#packagetypes/DotnetTool",
"@type": "PackageType",
"name": "DotnetTool"
}
],
"projectUrl": "https://github.com/NuGet/NuGetGallery",
"published": "1900-01-01T00:00:00Z",
"requireLicenseAcceptance": false,
"title": "NuGet V3 Protocol Example",
"version": "1.0.0",
"dependencyGroups": [
{
"@id": "https://api.nuget.org/v3/catalog0/data/2015.02.01.11.18.40/windowsazure.storage.1.0.0.json#dependencygroup",
"@type": "PackageDependencyGroup",
"dependencies": [
{
"@id": "https://api.nuget.org/v3/catalog0/data/2015.02.01.11.18.40/windowsazure.storage.1.0.0.json#dependencygroup/aspnet.suppressformsredirect",
"@type": "PackageDependency",
"id": "aspnet.suppressformsredirect",
"range": "[0.0.1.4, )"
},
{
"@id": "https://api.nuget.org/v3/catalog0/data/2015.02.01.11.18.40/windowsazure.storage.1.0.0.json#dependencygroup/webactivator",
"@type": "PackageDependency",
"id": "WebActivator",
"range": "[1.4.4, )"
},
{
"@id": "https://api.nuget.org/v3/catalog0/data/2015.02.01.11.18.40/windowsazure.storage.1.0.0.json#dependencygroup/webapi.all",
"@type": "PackageDependency",
"id": "WebApi.All",
"range": "[0.5.0, )"
}
],
"targetFramework": ".NETFramework4.6"
}
],
"tags": [
"NuGet",
"V3",
"Protocol",
"Example"
],
"vulnerabilities": [
{
"@id": "https://api.nuget.org/v3/catalog0/data/2015.02.01.11.18.40/windowsazure.storage.1.0.0.json#vulnerability/GitHub/999",
"@type": "Vulnerability",
"advisoryUrl": "https://github.com/advisories/ABCD-1234-5678-9012",
"severity": "2"
}
]
}
Элементы каталога с типом PackageDelete
содержат минимальный набор сведений, указывающий клиентам каталога, что пакет был удален из источника пакета и больше недоступен для любой операции пакета (например, для восстановления).
Примечание
Для удаления пакета и последующей повторной публикации можно использовать тот же идентификатор и версию пакета. На nuget.org это очень редкий случай, так как он нарушает предположение официального клиента о том, что идентификатор пакета и версия подразумевают определенное содержимое пакета. Дополнительные сведения об удалении пакетов на nuget.org см . в нашей политике.
Элементы каталога удаления пакетов не имеют дополнительных свойств в дополнение к тем, которые включены во все листья каталога.
Это version
свойство является исходной строкой версии, найденной в пакете NUSPEC.
Свойство published
— это время удаления пакета, которое обычно за короткое время до метки времени фиксации элемента каталога.
GET https://api.nuget.org/v3/catalog0/data/2017.11.02.00.40.00/netstandard1.4_lib.1.0.0-test.json
{
"@type": [
"PackageDelete",
"catalog:Permalink"
],
"catalog:commitId": "19fec5b4-9335-4e4b-bd50-8d5d3f734597",
"catalog:commitTimeStamp": "2017-11-02T00:40:00.1969812Z",
"id": "netstandard1.4_lib",
"originalId": "netstandard1.4_lib",
"published": "2017-11-02T00:37:43.7181952Z",
"version": "1.0.0-test"
}
В этом разделе описывается концепция клиента, которая, хотя и не обязательно требуется протоколом, должна быть частью любой практической реализации клиента каталога.
Так как каталог представляет собой структуру данных только для добавления, индексированную по времени, клиент должен локально хранить курсор , представляющий до какой точки времени клиент обработал элементы каталога. Обратите внимание, что это значение курсора никогда не должно создаваться с помощью часов компьютера клиента. Вместо этого значение должно поступать из значения объекта commitTimestamp
каталога.
Каждый раз, когда клиент хочет обработать новые события в источнике пакета, он должен запрашивать только каталог для всех элементов каталога с меткой времени фиксации больше, чем его сохраненный курсор. После успешной обработки всех новых элементов каталога он записывает последнюю метку времени фиксации элементов каталога, только что обработанную в качестве нового значения курсора.
С помощью этого подхода клиент может никогда не пропускать какие-либо события пакета, произошедшие в источнике пакета. Кроме того, клиент никогда не должен повторно обрабатывать старые события до записи метки времени фиксации курсора.
Эта мощная концепция курсоров используется для многих nuget.org фоновых заданий и используется для поддержания актуальности API версии 3.
Когда клиент каталога начинается в первый раз (и поэтому не имеет значения курсора), он должен использовать значение курсора по умолчанию. System.DateTimeOffset.MinValue
NET или некоторые аналогичные понятия минимальной представляющей метки времени.
Чтобы запросить следующий набор элементов каталога для обработки, клиент должен:
- Извлеките записанное значение курсора из локального хранилища.
- Скачивание и десериализация индекса каталога.
- Найдите все страницы каталога с меткой времени фиксации, превышающей курсор.
- Объявите пустой список элементов каталога для обработки.
- Для каждой страницы каталога, сопоставленной на шаге 3:
- Скачивание и десериализация страницы каталога.
- Найдите все элементы каталога с меткой времени фиксации, превышающей курсор.
- Добавьте все соответствующие элементы каталога в список, объявленный на шаге 4.
- Сортировка списка элементов каталога по метке времени фиксации.
- Обработайте каждый элемент каталога в последовательности:
- Скачайте и десериализуйте элемент каталога.
- Реагировать соответствующим образом на тип элемента каталога.
- Обработайте документ элемента каталога в определенном клиенте способе.
- Запишите метку времени фиксации последнего элемента каталога в качестве нового значения курсора.
С помощью этого базового алгоритма реализация клиента может создать полное представление всех пакетов, доступных в источнике пакета. Клиент должен периодически выполнять этот алгоритм, чтобы всегда учитывать последние изменения в источнике пакета.
Примечание
Это алгоритм, который nuget.org используется для хранения метаданных пакета, содержимого пакета, поиска и автозаполнения ресурсов.
Предположим, что есть два клиента каталога, которые имеют присущую зависимость, в которой выходные данные одного клиента зависят от выходных данных другого клиента.
Например, на nuget.org недавно опубликованный пакет не должен отображаться в ресурсе поиска, прежде чем он появится в ресурсе метаданных пакета. Это связано с тем, что операция восстановления, выполняемая официальным клиентом NuGet, использует ресурс метаданных пакета. Если клиент обнаруживает пакет с помощью службы поиска, он сможет успешно восстановить этот пакет с помощью ресурса метаданных пакета. Другими словами, ресурс поиска зависит от ресурса метаданных пакета. Каждый ресурс имеет фоновое задание клиента каталога, обновляющее этот ресурс. У каждого клиента есть собственный курсор.
Так как оба ресурса создаются из каталога, курсор клиента каталога, обновляющего ресурс поиска, не должен переходить за пределы курсора клиента каталога метаданных пакета.
Чтобы реализовать это ограничение, просто измените приведенный выше алгоритм:
- Извлеките записанное значение курсора из локального хранилища.
- Скачивание и десериализация индекса каталога.
- Найдите все страницы каталога с меткой времени фиксации, превышающей курсор меньше или равно курсору зависимости.
- Объявите пустой список элементов каталога для обработки.
- Для каждой страницы каталога, сопоставленной на шаге 3:
- Скачивание и десериализация страницы каталога.
- Найдите все элементы каталога с меткой времени фиксации больше, чем курсор меньше или равен курсору зависимости.
- Добавьте все соответствующие элементы каталога в список, объявленный на шаге 4.
- Сортировка списка элементов каталога по метке времени фиксации.
- Обработайте каждый элемент каталога в последовательности:
- Скачайте и десериализуйте элемент каталога.
- Реагировать соответствующим образом на тип элемента каталога.
- Обработайте документ элемента каталога в определенном клиенте способе.
- Запишите метку времени фиксации последнего элемента каталога в качестве нового значения курсора.
С помощью этого измененного алгоритма можно создать систему зависимых клиентов каталога, которые создают собственные индексы, артефакты и т. д.