stream/room/room.proto

syntax = "proto3";

package jsgenerate_kb2022.stream.room;
option go_package = "gateway/protocol/stream/room";

import "google/api/annotations.proto";
import "adadd52b-e7a2-4fe2-9f15-356ceddbd4f6/utils/utils.proto";

// 直播間 負責提供直播流
service Room {
    // 查找直播間
    rpc Find(FindRequest) returns (FindResponse){
        option (google.api.http) = {
            get: "/api/v1/stream/room/find"
        };
    }

    // 強制關閉一個直播間
    rpc Close(CloseRequest) returns (CloseResponse){
        option (google.api.http) = {
            delete: "/api/v1/stream/room"
        };
    }

    // 收看直播間內容
    // websocket /api/v1/stream/room/listen
    rpc Listen (stream ListenRequest) returns (stream ListenResponse);
}
message Data{
	// 唯一的房間號
	string id = 1;
	// 名稱
	string name = 2;
	// 描述
	string describe = 3;
	// 是否可被緩存
	bool cached = 4;
	// 創建時間 unix
	int64 createAt = 5;
	// 房間類型
	int32 path = 6;
}
message FindRequest{
    jsgenerate_kb2022.utils.FindLimit limit = 1;
    // 直播間類型
    // * 1 mp3
    int32 path = 2;
    // 直播間房間號 room in 
    repeated string room = 3;
    // 直播間房間號 room not in 
    repeated string notRoom = 5;
    // 直播間名稱 like
    string name = 4;
}
message FindResponse{
    jsgenerate_kb2022.utils.FindResult result = 1;
    repeated Data data = 2;
}
message CloseRequest{
    // 直播間類型
    // * 1 mp3
    int32 path = 2;
    // 直播間房間號
    string room = 3;
}
message CloseResponse{
}
message Assets{
    // 標註資產 id
    string id = 1; 
    // 標註資產塊
    repeated string block = 2;
}
message ListenRequest{
  // 標註 這是 什麼 數據
    // * -2 向服務器發送一個消息,服務器原樣返回消息
    // * -1 這是可選的心跳包
    // * 50 收聽直播,第一幀數據必須設置 what=50
    // * 60 添加記錄到緩存列表
    // * 61 從緩存記錄中刪除指定數據
    // * 62 清空緩存列表
    // * 63 清空所有緩存
    int32 what = 1;
    // 直播間類型
    // * 1 mp3
    int32 path = 2;
    // 直播間房間號
    string room = 3;
    // what = 50 時有效,表示客戶端不支持緩存系統
    bool nocahce = 10;
    // what = -2 時有效
    string message = 5;

    // what range in [60,62] 時有效,指定了緩存列表
    repeated Assets assets = 6; 
}
message ListenResponse{
    // 標註 這是 什麼 數據
    // * -1 這是可選的心跳包,客戶端可以自行決定如何處理,通常情況可以直接忽略或重置超時時間
    // * 1 這是直播的數據流
    // * 40 通知設備直播開始或從暫停中恢復,此後將會收到 what=1 的數據流
    // * 41 通知設備直播被暫停,此後將不會再收到新都 what=1 的數據流除非直播被重新恢復,但可能會收到未處理的緩存數據流
    // * 100 響應
    int32 what = 1;
    // what=1時有效,表示數據,
    //
    // 如果客戶端第一幀數據設置 nocahce 爲 true,則此數據爲 mp3 幀
    //
    // 如果客戶端第一幀數據設置 nocahce 爲 true 之外的值,則數據爲 2字節元length+元信息+數據幀
    // length只使用 15bit 最高 bit 給緩存系統使用
    // 元信息是以分號分隔的 Assets.id 和 Assets.block
    // 如果最高 bit 爲 1 則代表 應該從 緩存中獲取音頻數據
    bytes data = 2;
    // what=100時有效,響應碼 表示對 Request 請求的響應,0 表示請求成功
    uint32 code = 3;
    // 當響應 Request 時的額外信息
    string message = 4;
    // 應該延遲多少幀數據再播放,只在 what=40 時有效
    uint32 delay = 5;
}