8. ТС ОРМ и ПУ взаимодействуют по протоколу WebSocket с использованием следующих типов сообщений:
- сообщение "ConnectionInit". Данное сообщение направляется ПУ в адрес ТС ОРМ для открытия сессии. ПУ может передавать дополнительную информацию о сессии в поле "payload". ТС ОРМ должны получить данное сообщение в течение заданного периода времени (определяется во время внедрения ТС ОРМ и согласовывается с уполномоченным государственным органом). В случае не поступления от ПУ в ТС ОРМ данного сообщения в течение заданного периода времени, ТС ОРМ должны закрыть соединение по протоколу WebSocket с кодом 4408 и причиной закрытия "Connection initialization timeout". В случае получения ТС ОРМ более одного сообщения "ConnectionInit", ТС ОРМ должны закрыть соединение по протоколу WebSocket с кодом 4429 и причиной закрытия "Too many initialization requests".
Формат сообщения "ConnectionInit" (поле "payload" опциональное):
{
"type": "connection_init",
"payload": "string"
}
- сообщение "ConnectionAck". Данное сообщение подтверждает успешное создание сессии и направляется ТС ОРМ в адрес ПУ в ответ на сообщение "ConnectionInit". ТС ОРМ могут передавать дополнительную информацию о сессии в поле "payload". ПУ после получения данного сообщения может отправлять запросы на языке GraphQL с помощью сообщений "Subscribe" согласно подпункту 3 пункта 8 настоящего приложения.
Формат сообщения "ConnectionAck" (поле "payload" опциональное):
{
"type": "connection_ack",
"payload": "string"
}
- сообщение "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"
}
}
- сообщение "Next". Данное сообщение направляется ТС ОРМ в адрес ПУ и содержит полные или частичные результаты выполнения запроса, ранее направленного ПУ в сообщении "Subscribe". Поле "id" должно содержать уникальный идентификатор запроса, ранее сформированный ПУ. Поле "payload" должно содержать результаты выполнения запроса в формате аналогичном для интерфейса "/query" согласно спецификации языка GraphQL.
Формат сообщения "Next:
{
"id": "<unique-operation-id>",
"type": "next",
"payload": "ExecutionResult"
}
- сообщение "Error". Данное сообщение направляется ТС ОРМ в адрес ПУ и содержит информацию об ошибке в ходе выполнения запроса, ранее направленного ПУ в сообщении "Subscribe". Поле "id" должно содержать уникальный идентификатор запроса, ранее сформированный ПУ. Поле "payload" должно содержать информацию об ошибке в формате согласно спецификации языка GraphQL. В случае возникновения ошибки на начальном этапе выполнения запроса (в том числе, ошибки валидации запроса) либо в ходе выполнения запроса ТС ОРМ прекращают выполнение запроса и не направляют в сторону ПУ никаких сообщений.
Формат сообщения "Error":
{
"id": "<unique-operation-id>",
"type": "error",
"payload": "GraphQLError"
}
- сообщение "Complete". Данное сообщение может направляться в обоих направлениях. Поле "id" должно содержать уникальный идентификатор запроса, ранее сформированный ПУ. Отправка данного сообщения ТС ОРМ в адрес ПУ означает завершение выполнения запроса с соответствующим идентификатором. В случае отправки ТС ОРМ сообщения "Error" до сообщения "Complete", данное сообщение не отправляется. Отправка данного сообщения ПУ в адрес ТС ОРМ означает, что ПУ прерывает выполнение запроса с соответствующим идентификатором и с данного момента не принимает результаты его выполнения.
Формат сообщения "Complete:
{
"id": "<unique-operation-id>",
"type": "complete"
}