Приложение N 7

к требованиям к вычислительной

мощности, используемой провайдером

хостинга, для проведения уполномоченными

государственными органами, осуществляющими

оперативно-разыскную деятельность

или обеспечение безопасности

Российской Федерации, в случаях,

установленных федеральными законами,

мероприятий в целях реализации

возложенных на них задач, утвержденным

приказом Министерства цифрового

развития, связи и массовых

коммуникаций Российской Федерации

от 1 ноября 2023 г. N 935

ТРЕБОВАНИЯ,

ПРЕДЪЯВЛЯЕМЫЕ К ФОРМАТУ ПЕРЕДАЧИ ДАННЫХ

НА ЯЗЫКЕ GRAPHQL ПО ПРОТОКОЛУ WEBSOCKET

1. ТС ОРМ и ПУ для передачи данных на языке GraphQL по протоколу WebSocket должны использовать подпротокол graphql-transport-ws.

2. ТС ОРМ и ПУ взаимодействую по протоколу WebSocket посредством сообщений. Для кодирования сообщений применяется формат JSON.

3. Все сообщения должны содержать поле "type", определяющее тип сообщения. Сообщение в зависимости от типа также может содержать дополнительные поля, в которых:

1) "id" - идентификатор запроса, использующийся для последующего определения ответов ТС ОРМ и привязки их к запросам ПУ;

2) "payload" - дополнительные данные для некоторых типов сообщений.

4. В любой момент времени ТС ОРМ должны позволять выполнять несколько запросов ПУ с уникальными идентификаторами. При этом передача сообщений, относящихся к различным запросам, может чередоваться.

5. ТС ОРМ должны закрывать соединение по протоколу WebSocket при возникновении критической ошибки (сбое в работе) и тем самым уведомлять ПУ о данной ситуации.

6. ПУ должен закрывать соединение по протоколу WebSocket с кодом 1000 и причиной закрытия "Normal Closure".

7. ПУ перед отправкой запросов на языке GraphQL должен открыть сессию (согласно подпункту 1 пункта 8 настоящего приложения) поверх протокола WebSocket.

8. ТС ОРМ и ПУ взаимодействуют по протоколу WebSocket с использованием следующих типов сообщений:

1) сообщение "ConnectionInit". Данное сообщение направляется ПУ в адрес ТС ОРМ для открытия сессии. ПУ может передавать дополнительную информацию о сессии в поле "payload". ТС ОРМ должны получить данное сообщение в течение заданного периода времени (определяется во время внедрения ТС ОРМ и согласовывается с уполномоченным государственным органом). В случае не поступления от ПУ в ТС ОРМ данного сообщения в течение заданного периода времени, ТС ОРМ должны закрыть соединение по протоколу WebSocket с кодом 4408 и причиной закрытия "Connection initialization timeout". В случае получения ТС ОРМ более одного сообщения "ConnectionInit", ТС ОРМ должны закрыть соединение по протоколу WebSocket с кодом 4429 и причиной закрытия "Too many initialization requests".

Формат сообщения "ConnectionInit" (поле "payload" опциональное):

{

"type": "connection_init",

"payload": "string"

}

2) сообщение "ConnectionAck". Данное сообщение подтверждает успешное создание сессии и направляется ТС ОРМ в адрес ПУ в ответ на сообщение "ConnectionInit". ТС ОРМ могут передавать дополнительную информацию о сессии в поле "payload". ПУ после получения данного сообщения может отправлять запросы на языке GraphQL с помощью сообщений "Subscribe" согласно подпункту 3 пункта 8 настоящего приложения.

Формат сообщения "ConnectionAck" (поле "payload" опциональное):

{

"type": "connection_ack",

"payload": "string"

}

3) сообщение "Subscribe". Данное сообщение направляется ПУ в адрес ТС ОРМ и должно содержать запрос на языке GraphQL в поле "query" поля "payload". Поле "id" должно содержать уникальный идентификатор запроса, формируемый ПУ. Если запрос с таким идентификатором уже выполняется, то ТС ОРМ должны закрыть соединение по протоколу WebSocket с кодом 4409 и причиной закрытия "Subscriber for <unique-operation-id> already exists". Разрешается повторное использование идентификатора после завершения выполнения запроса на стороне ТС ОРМ. В случае поступления от ПУ данного сообщения до получения сообщения "ConnectionAck", ТС ОРМ должны закрыть соединение по протоколу WebSocket с кодом 4401 и причиной закрытия "Unauthorized".

Формат сообщения "Subscribe" (поля "operationName", "variables", "extensions" опциональные):

{

"id": "<unique-operation-id>",

"type": "subscribe",

"payload": {

"operationName": "string",

"query": "string",

"variables": "string",

"extensions": "string"

}

}

4) сообщение "Next". Данное сообщение направляется ТС ОРМ в адрес ПУ и содержит полные или частичные результаты выполнения запроса, ранее направленного ПУ в сообщении "Subscribe". Поле "id" должно содержать уникальный идентификатор запроса, ранее сформированный ПУ. Поле "payload" должно содержать результаты выполнения запроса в формате аналогичном для интерфейса "/query" согласно спецификации языка GraphQL.

Формат сообщения "Next:

{

"id": "<unique-operation-id>",

"type": "next",

"payload": "ExecutionResult"

}

5) сообщение "Error". Данное сообщение направляется ТС ОРМ в адрес ПУ и содержит информацию об ошибке в ходе выполнения запроса, ранее направленного ПУ в сообщении "Subscribe". Поле "id" должно содержать уникальный идентификатор запроса, ранее сформированный ПУ. Поле "payload" должно содержать информацию об ошибке в формате согласно спецификации языка GraphQL. В случае возникновения ошибки на начальном этапе выполнения запроса (в том числе, ошибки валидации запроса) либо в ходе выполнения запроса ТС ОРМ прекращают выполнение запроса и не направляют в сторону ПУ никаких сообщений.

Формат сообщения "Error":

{

"id": "<unique-operation-id>",

"type": "error",

"payload": "GraphQLError"

}

6) сообщение "Complete". Данное сообщение может направляться в обоих направлениях. Поле "id" должно содержать уникальный идентификатор запроса, ранее сформированный ПУ. Отправка данного сообщения ТС ОРМ в адрес ПУ означает завершение выполнения запроса с соответствующим идентификатором. В случае отправки ТС ОРМ сообщения "Error" до сообщения "Complete", данное сообщение не отправляется. Отправка данного сообщения ПУ в адрес ТС ОРМ означает, что ПУ прерывает выполнение запроса с соответствующим идентификатором и с данного момента не принимает результаты его выполнения.

Формат сообщения "Complete:

{

"id": "<unique-operation-id>",

"type": "complete"

}

9. Получение ПУ или ТС ОРМ иных сообщений, отличных от указанных в пункте 8 настоящего приложения, должно приводить к закрытию соединения по протоколу WebSocket с кодом 4400 и причиной закрытия, содержащей описание ошибки в типе или формате сообщения.