Каталог

Каталог — это ресурс, который записывает все операции пакета в источнике пакета, например создание и удаление. Ресурс каталога имеет Catalog тип в индексе службы. Этот ресурс можно использовать для запроса всех опубликованных пакетов.

Примечание.

Так как каталог не используется официальным клиентом NuGet, не все источники пакетов реализуют каталог.

Примечание.

В настоящее время каталог nuget.org недоступен в Китае. Дополнительные сведения см. в разделе NuGet/NuGetGallery#4949.

Управление версиями

Используется следующее @type значение:

Значение @type Примечания.
Catalog/3.0.0 Начальный выпуск

Базовый URL-адрес

URL-адрес точки входа для следующих API — это значение свойства, связанного @id с указанными выше упоминание значениями ресурсов@type. В этом разделе используется URL-адрес {@id}заполнителя.

Методы HTTP

Все 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 значение будет одним из следующих двух значений:

  1. nuget:PackageDetails: это соответствует типу PackageDetails в листовом документе каталога.
  2. 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 . Однако каждый элемент каталога имеет ровно одно из двух следующих значений строкового типа:

  1. PackageDetails: представляет моментальный снимок метаданных пакета
  2. PackageDelete: представляет пакет, который был удален

Элементы каталога сведений о пакете

Элементы каталога с типом PackageDetails содержат моментальный снимок метаданных пакета для определенного пакета (идентификатор и сочетание версий). Элемент каталога сведений о пакете создается при обнаружении любого из следующих сценариев:

  1. Пакет отправляется.
  2. Пакет перезаписается.
  3. Пакет не указан.
  4. Пакет не рекомендуется.
  5. Пакет не рекомендуется.
  6. Пакет переполняется.
  7. Обновляется состояние уязвимости пакета.

Повторный поток пакета — это административный жест, который, по сути, создает поддельный 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 всегда использовал значение packageHashAlgorithmSHA512.

Свойство 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 или некоторые аналогичные понятия минимальной представляющей метки времени.

Итеризация элементов каталога

Чтобы запросить следующий набор элементов каталога для обработки, клиент должен:

  1. Извлеките записанное значение курсора из локального хранилища.
  2. Скачивание и десериализация индекса каталога.
  3. Найдите все страницы каталога с меткой времени фиксации, превышающей курсор.
  4. Объявите пустой список элементов каталога для обработки.
  5. Для каждой страницы каталога, сопоставленной на шаге 3:
    1. Скачивание и десериализация страницы каталога.
    2. Найдите все элементы каталога с меткой времени фиксации, превышающей курсор.
    3. Добавьте все соответствующие элементы каталога в список, объявленный на шаге 4.
  6. Сортировка списка элементов каталога по метке времени фиксации.
  7. Обработайте каждый элемент каталога в последовательности:
    1. Скачайте и десериализуйте элемент каталога.
    2. Реагировать соответствующим образом на тип элемента каталога.
    3. Обработайте документ элемента каталога в определенном клиенте способе.
  8. Запишите метку времени фиксации последнего элемента каталога в качестве нового значения курсора.

С помощью этого базового алгоритма реализация клиента может создать полное представление всех пакетов, доступных в источнике пакета. Клиент должен периодически выполнять этот алгоритм, чтобы всегда учитывать последние изменения в источнике пакета.

Примечание.

Это алгоритм, который nuget.org используется для хранения метаданных пакета, содержимого пакета, поиска и автозаполнения ресурсов.

Зависимые курсоры

Предположим, что есть два клиента каталога, которые имеют присущую зависимость, в которой выходные данные одного клиента зависят от выходных данных другого клиента.

Пример

Например, на nuget.org недавно опубликованный пакет не должен отображаться в ресурсе поиска, прежде чем он появится в ресурсе метаданных пакета. Это связано с тем, что операция восстановления, выполняемая официальным клиентом NuGet, использует ресурс метаданных пакета. Если клиент обнаруживает пакет с помощью службы поиска, он сможет успешно восстановить этот пакет с помощью ресурса метаданных пакета. Другими словами, ресурс поиска зависит от ресурса метаданных пакета. Каждый ресурс имеет фоновое задание клиента каталога, обновляющее этот ресурс. У каждого клиента есть собственный курсор.

Так как оба ресурса создаются из каталога, курсор клиента каталога, обновляющего ресурс поиска, не должен переходить за пределы курсора клиента каталога метаданных пакета.

Алгоритм

Чтобы реализовать это ограничение, просто измените приведенный выше алгоритм:

  1. Извлеките записанное значение курсора из локального хранилища.
  2. Скачивание и десериализация индекса каталога.
  3. Найдите все страницы каталога с меткой времени фиксации, превышающей курсор меньше или равно курсору зависимости.
  4. Объявите пустой список элементов каталога для обработки.
  5. Для каждой страницы каталога, сопоставленной на шаге 3:
    1. Скачивание и десериализация страницы каталога.
    2. Найдите все элементы каталога с меткой времени фиксации больше, чем курсор меньше или равен курсору зависимости.
    3. Добавьте все соответствующие элементы каталога в список, объявленный на шаге 4.
  6. Сортировка списка элементов каталога по метке времени фиксации.
  7. Обработайте каждый элемент каталога в последовательности:
    1. Скачайте и десериализуйте элемент каталога.
    2. Реагировать соответствующим образом на тип элемента каталога.
    3. Обработайте документ элемента каталога в определенном клиенте способе.
  8. Запишите метку времени фиксации последнего элемента каталога в качестве нового значения курсора.

С помощью этого измененного алгоритма можно создать систему зависимых клиентов каталога, которые создают собственные индексы, артефакты и т. д.