syntax = "proto3";

/*
    Файл содержит описание сервиса шины данных с необходимыми
    структурами.
*/

package parserin;

option go_package = "./netapi";

// GoBus -- сервис шины данных
service GoBus {
    // Public -- создаёт запись в открытом разделе хранилище
    rpc Public(PublicRequest) returns (DefaultResponse) {}
    // SendSync -- синхронный запрос в топик
    rpc SendSync(SyncRequest) returns (SyncResponse){}
    // Subscribe -- подписка по шаблону
    rpc Subscribe(SubscribeRequest) returns (stream SyncResponse){}
    // SubscribeBuffer -- подписка по шаблону с буфером на выход
    rpc SubscribeBuffer (BuffRequest) returns (stream BuffResponse){}
    // Get -- возвращает значения топиков по шаблону
    rpc Get(SubscribeRequest) returns (SyncResponse){}
}

// BuffRequest -- запрос на буферизованную подписку
message BuffRequest{
    string Sample            = 1; // Шаблон топиков на подписку
    int32 MsgSumSizeLimit    = 2; // Предел суммарного количества сообщений
    int32 MsgSaveSecondLimit = 3; // Предел в секундах как долго хранить буфер с момента последнего доступа
}

// BuffResponse -- ответ на буферизованную подписку
message BuffResponse{
    bool IsLost = 1; // Признак, что часть данных была потеряна
    bytes Msg   = 2; // Сообщение из буфера
}

// GetRequest -- ответ на запрос топиков по шаблону
message GetRequest{
    repeated bytes Msg = 1; // Список сообщений в ответе
}

// SubscribeRequest -- запрос на подписку топиков по шаблону
message SubscribeRequest{
    string Sample     = 1; // Шаблон топиков на подписку
    string ClientName = 2; // Уникальное имя клиента
}

// SyncRequest -- синхронный запрос в шину данных
message SyncRequest{
    int32 Source = 1; // Источник данных (0 -- клиент, другое -- реплика)
    string Topic = 2; // Где опубликовать запрос
    bytes Msg    = 3; // Байтовое представление сообщения
}

// TopicMsg -- сообщение топика (внутри шины данных)
message TopicMsg{
    int32 Source = 1; // Источник данных (0 -- клиент, другое -- реплика)
    string Topic = 2; // Где опубликовать запрос
    bytes Msg    = 3; // Байтовое представление сообщения
}

// SyncResponse -- ответ на синхронный запрос
message SyncResponse{
    bytes Msg = 1; // Содержимое ответа на синхроныый запрос
}
// PublicRequest -- запрос на публикацию сообщения
message PublicRequest {
    int32 Source = 1; // Источник данных (0 -- клиент, другое -- для реплики)
    string Topic = 2; // Куда опубликовать сообщение
    bytes Msg    = 3; // Байтовое представление сообщения
}

// DefaultResponse -- возвращаемое значение по умолчанию (ничего не содержит)
message DefaultResponse {
}