@startuml C4_Elements
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Sequence.puml

SHOW_ELEMENT_DESCRIPTIONS(true)

System_Ext(webapp, "Веб-приложение", "Использует REST/gRPC-Web")
System(grpcbridge, "Шлюз")
System_Ext(grpcapi, "Сервер", "Предоставляет gRPC API")

Rel(webapp, grpcbridge, "Инициирует WebSocket-соединение", "HTTP")
alt Маршрут не найден
    Rel(grpcbridge, webapp, "Прерывает установку соединения")
end

Rel(grpcbridge, grpcapi, "Инициирует новый вызов", "gRPC")

alt Вызов не потоковый со стороны клиента
    Rel(grpcbridge, grpcapi, "Транскодирует сообщение-запрос с пустым телом", "gRPC/Protobuf")
else Обычный вызов
    Rel(webapp, grpcbridge, "Посылает сообщение-запрос", "WebSocket/JSON")
    Rel(grpcbridge, grpcapi, "Пересылает транскодированное сообщение-запрос", "gRPC/Protobuf")
end

Rel(grpcapi, grpcbridge, "Посылает метаданные и сообщение-ответ", "gRPC/Protobuf")
Rel(grpcbridge, webapp, "Пересылает транскодированное сообщение-ответ", "WebSocket/JSON")

alt Клиент прерывает соединение
    Rel(grpcbridge, grpcapi, "Завершает вызов", "gRPC")
else Сервер завершает вызов
    Rel(grpcapi, grpcbridge, "Посылает метаданные-трейлеры и статус", "gRPC")
    Rel(grpcbridge, webapp, "Закрывает соединение", "WebSocket")
end
