protocols.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715
  1. package volcengine
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "fmt"
  6. "io"
  7. "math"
  8. "github.com/gorilla/websocket"
  9. )
  10. type (
  11. // EventType defines the event type which determines the event of the message.
  12. EventType int32
  13. // MsgType defines message type which determines how the message will be
  14. // serialized with the protocol.
  15. MsgType uint8
  16. // MsgTypeFlagBits defines the 4-bit message-type specific flags. The specific
  17. // values should be defined in each specific usage scenario.
  18. MsgTypeFlagBits uint8
  19. // VersionBits defines the 4-bit version type.
  20. VersionBits uint8
  21. // HeaderSizeBits defines the 4-bit header-size type.
  22. HeaderSizeBits uint8
  23. // SerializationBits defines the 4-bit serialization method type.
  24. SerializationBits uint8
  25. // CompressionBits defines the 4-bit compression method type.
  26. CompressionBits uint8
  27. )
  28. const (
  29. MsgTypeFlagNoSeq MsgTypeFlagBits = 0 // Non-terminal packet with no sequence
  30. MsgTypeFlagPositiveSeq MsgTypeFlagBits = 0b1 // Non-terminal packet with sequence > 0
  31. MsgTypeFlagLastNoSeq MsgTypeFlagBits = 0b10 // last packet with no sequence
  32. MsgTypeFlagNegativeSeq MsgTypeFlagBits = 0b11 // last packet with sequence < 0
  33. MsgTypeFlagWithEvent MsgTypeFlagBits = 0b100 // Payload contains event number (int32)
  34. )
  35. const (
  36. Version1 VersionBits = iota + 1
  37. Version2
  38. Version3
  39. Version4
  40. )
  41. const (
  42. HeaderSize4 HeaderSizeBits = iota + 1
  43. HeaderSize8
  44. HeaderSize12
  45. HeaderSize16
  46. )
  47. const (
  48. SerializationRaw SerializationBits = 0
  49. SerializationJSON SerializationBits = 0b1
  50. SerializationThrift SerializationBits = 0b11
  51. SerializationCustom SerializationBits = 0b1111
  52. )
  53. const (
  54. CompressionNone CompressionBits = 0
  55. CompressionGzip CompressionBits = 0b1
  56. CompressionCustom CompressionBits = 0b1111
  57. )
  58. const (
  59. MsgTypeInvalid MsgType = 0
  60. MsgTypeFullClientRequest MsgType = 0b1
  61. MsgTypeAudioOnlyClient MsgType = 0b10
  62. MsgTypeFullServerResponse MsgType = 0b1001
  63. MsgTypeAudioOnlyServer MsgType = 0b1011
  64. MsgTypeFrontEndResultServer MsgType = 0b1100
  65. MsgTypeError MsgType = 0b1111
  66. MsgTypeServerACK = MsgTypeAudioOnlyServer
  67. )
  68. func (t MsgType) String() string {
  69. switch t {
  70. case MsgTypeFullClientRequest:
  71. return "MsgType_FullClientRequest"
  72. case MsgTypeAudioOnlyClient:
  73. return "MsgType_AudioOnlyClient"
  74. case MsgTypeFullServerResponse:
  75. return "MsgType_FullServerResponse"
  76. case MsgTypeAudioOnlyServer:
  77. return "MsgType_AudioOnlyServer" // MsgTypeServerACK
  78. case MsgTypeError:
  79. return "MsgType_Error"
  80. case MsgTypeFrontEndResultServer:
  81. return "MsgType_FrontEndResultServer"
  82. default:
  83. return fmt.Sprintf("MsgType_(%d)", t)
  84. }
  85. }
  86. const (
  87. // Default event, applicable for scenarios not using events or not requiring event transmission,
  88. // or for scenarios using events, non-zero values can be used to validate event legitimacy
  89. EventType_None EventType = 0
  90. // 1 ~ 49 for upstream Connection events
  91. EventType_StartConnection EventType = 1
  92. EventType_StartTask EventType = 1 // Alias of "StartConnection"
  93. EventType_FinishConnection EventType = 2
  94. EventType_FinishTask EventType = 2 // Alias of "FinishConnection"
  95. // 50 ~ 99 for downstream Connection events
  96. // Connection established successfully
  97. EventType_ConnectionStarted EventType = 50
  98. EventType_TaskStarted EventType = 50 // Alias of "ConnectionStarted"
  99. // Connection failed (possibly due to authentication failure)
  100. EventType_ConnectionFailed EventType = 51
  101. EventType_TaskFailed EventType = 51 // Alias of "ConnectionFailed"
  102. // Connection ended
  103. EventType_ConnectionFinished EventType = 52
  104. EventType_TaskFinished EventType = 52 // Alias of "ConnectionFinished"
  105. // 100 ~ 149 for upstream Session events
  106. EventType_StartSession EventType = 100
  107. EventType_CancelSession EventType = 101
  108. EventType_FinishSession EventType = 102
  109. // 150 ~ 199 for downstream Session events
  110. EventType_SessionStarted EventType = 150
  111. EventType_SessionCanceled EventType = 151
  112. EventType_SessionFinished EventType = 152
  113. EventType_SessionFailed EventType = 153
  114. // Usage events
  115. EventType_UsageResponse EventType = 154
  116. EventType_ChargeData EventType = 154 // Alias of "UsageResponse"
  117. // 200 ~ 249 for upstream general events
  118. EventType_TaskRequest EventType = 200
  119. EventType_UpdateConfig EventType = 201
  120. // 250 ~ 299 for downstream general events
  121. EventType_AudioMuted EventType = 250
  122. // 300 ~ 349 for upstream TTS events
  123. EventType_SayHello EventType = 300
  124. // 350 ~ 399 for downstream TTS events
  125. EventType_TTSSentenceStart EventType = 350
  126. EventType_TTSSentenceEnd EventType = 351
  127. EventType_TTSResponse EventType = 352
  128. EventType_TTSEnded EventType = 359
  129. EventType_PodcastRoundStart EventType = 360
  130. EventType_PodcastRoundResponse EventType = 361
  131. EventType_PodcastRoundEnd EventType = 362
  132. // 450 ~ 499 for downstream ASR events
  133. EventType_ASRInfo EventType = 450
  134. EventType_ASRResponse EventType = 451
  135. EventType_ASREnded EventType = 459
  136. // 500 ~ 549 for upstream dialogue events
  137. // (Ground-Truth-Alignment) text for speech synthesis
  138. EventType_ChatTTSText EventType = 500
  139. // 550 ~ 599 for downstream dialogue events
  140. EventType_ChatResponse EventType = 550
  141. EventType_ChatEnded EventType = 559
  142. // 650 ~ 699 for downstream dialogue events
  143. // Events for source (original) language subtitle.
  144. EventType_SourceSubtitleStart EventType = 650
  145. EventType_SourceSubtitleResponse EventType = 651
  146. EventType_SourceSubtitleEnd EventType = 652
  147. // Events for target (translation) language subtitle.
  148. EventType_TranslationSubtitleStart EventType = 653
  149. EventType_TranslationSubtitleResponse EventType = 654
  150. EventType_TranslationSubtitleEnd EventType = 655
  151. )
  152. func (t EventType) String() string {
  153. switch t {
  154. case EventType_None:
  155. return "EventType_None"
  156. case EventType_StartConnection:
  157. return "EventType_StartConnection"
  158. case EventType_FinishConnection:
  159. return "EventType_FinishConnection"
  160. case EventType_ConnectionStarted:
  161. return "EventType_ConnectionStarted"
  162. case EventType_ConnectionFailed:
  163. return "EventType_ConnectionFailed"
  164. case EventType_ConnectionFinished:
  165. return "EventType_ConnectionFinished"
  166. case EventType_StartSession:
  167. return "EventType_StartSession"
  168. case EventType_CancelSession:
  169. return "EventType_CancelSession"
  170. case EventType_FinishSession:
  171. return "EventType_FinishSession"
  172. case EventType_SessionStarted:
  173. return "EventType_SessionStarted"
  174. case EventType_SessionCanceled:
  175. return "EventType_SessionCanceled"
  176. case EventType_SessionFinished:
  177. return "EventType_SessionFinished"
  178. case EventType_SessionFailed:
  179. return "EventType_SessionFailed"
  180. case EventType_UsageResponse:
  181. return "EventType_UsageResponse"
  182. case EventType_TaskRequest:
  183. return "EventType_TaskRequest"
  184. case EventType_UpdateConfig:
  185. return "EventType_UpdateConfig"
  186. case EventType_AudioMuted:
  187. return "EventType_AudioMuted"
  188. case EventType_SayHello:
  189. return "EventType_SayHello"
  190. case EventType_TTSSentenceStart:
  191. return "EventType_TTSSentenceStart"
  192. case EventType_TTSSentenceEnd:
  193. return "EventType_TTSSentenceEnd"
  194. case EventType_TTSResponse:
  195. return "EventType_TTSResponse"
  196. case EventType_TTSEnded:
  197. return "EventType_TTSEnded"
  198. case EventType_PodcastRoundStart:
  199. return "EventType_PodcastRoundStart"
  200. case EventType_PodcastRoundResponse:
  201. return "EventType_PodcastRoundResponse"
  202. case EventType_PodcastRoundEnd:
  203. return "EventType_PodcastRoundEnd"
  204. case EventType_ASRInfo:
  205. return "EventType_ASRInfo"
  206. case EventType_ASRResponse:
  207. return "EventType_ASRResponse"
  208. case EventType_ASREnded:
  209. return "EventType_ASREnded"
  210. case EventType_ChatTTSText:
  211. return "EventType_ChatTTSText"
  212. case EventType_ChatResponse:
  213. return "EventType_ChatResponse"
  214. case EventType_ChatEnded:
  215. return "EventType_ChatEnded"
  216. case EventType_SourceSubtitleStart:
  217. return "EventType_SourceSubtitleStart"
  218. case EventType_SourceSubtitleResponse:
  219. return "EventType_SourceSubtitleResponse"
  220. case EventType_SourceSubtitleEnd:
  221. return "EventType_SourceSubtitleEnd"
  222. case EventType_TranslationSubtitleStart:
  223. return "EventType_TranslationSubtitleStart"
  224. case EventType_TranslationSubtitleResponse:
  225. return "EventType_TranslationSubtitleResponse"
  226. case EventType_TranslationSubtitleEnd:
  227. return "EventType_TranslationSubtitleEnd"
  228. default:
  229. return fmt.Sprintf("EventType_(%d)", t)
  230. }
  231. }
  232. // 0 1 2 3
  233. // | 0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 |
  234. // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  235. // | Version | Header Size | Msg Type | Flags |
  236. // | (4 bits) | (4 bits) | (4 bits) | (4 bits) |
  237. // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  238. // | Serialization | Compression | Reserved |
  239. // | (4 bits) | (4 bits) | (8 bits) |
  240. // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  241. // | |
  242. // | Optional Header Extensions |
  243. // | (if Header Size > 1) |
  244. // | |
  245. // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  246. // | |
  247. // | Payload |
  248. // | (variable length) |
  249. // | |
  250. // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  251. type Message struct {
  252. Version VersionBits
  253. HeaderSize HeaderSizeBits
  254. MsgType MsgType
  255. MsgTypeFlag MsgTypeFlagBits
  256. Serialization SerializationBits
  257. Compression CompressionBits
  258. EventType EventType
  259. SessionID string
  260. ConnectID string
  261. Sequence int32
  262. ErrorCode uint32
  263. Payload []byte
  264. }
  265. func NewMessageFromBytes(data []byte) (*Message, error) {
  266. if len(data) < 3 {
  267. return nil, fmt.Errorf("data too short: expected at least 3 bytes, got %d", len(data))
  268. }
  269. typeAndFlag := data[1]
  270. msg, err := NewMessage(MsgType(typeAndFlag>>4), MsgTypeFlagBits(typeAndFlag&0b00001111))
  271. if err != nil {
  272. return nil, err
  273. }
  274. if err := msg.Unmarshal(data); err != nil {
  275. return nil, err
  276. }
  277. return msg, nil
  278. }
  279. func NewMessage(msgType MsgType, flag MsgTypeFlagBits) (*Message, error) {
  280. return &Message{
  281. MsgType: msgType,
  282. MsgTypeFlag: flag,
  283. Version: Version1,
  284. HeaderSize: HeaderSize4,
  285. Serialization: SerializationJSON,
  286. Compression: CompressionNone,
  287. }, nil
  288. }
  289. func (m *Message) String() string {
  290. switch m.MsgType {
  291. case MsgTypeAudioOnlyServer, MsgTypeAudioOnlyClient:
  292. if m.MsgTypeFlag == MsgTypeFlagPositiveSeq || m.MsgTypeFlag == MsgTypeFlagNegativeSeq {
  293. return fmt.Sprintf("%s, %s, Sequence: %d, PayloadSize: %d", m.MsgType, m.EventType, m.Sequence, len(m.Payload))
  294. }
  295. return fmt.Sprintf("%s, %s, PayloadSize: %d", m.MsgType, m.EventType, len(m.Payload))
  296. case MsgTypeError:
  297. return fmt.Sprintf("%s, %s, ErrorCode: %d, Payload: %s", m.MsgType, m.EventType, m.ErrorCode, string(m.Payload))
  298. default:
  299. if m.MsgTypeFlag == MsgTypeFlagPositiveSeq || m.MsgTypeFlag == MsgTypeFlagNegativeSeq {
  300. return fmt.Sprintf("%s, %s, Sequence: %d, Payload: %s",
  301. m.MsgType, m.EventType, m.Sequence, string(m.Payload))
  302. }
  303. return fmt.Sprintf("%s, %s, Payload: %s", m.MsgType, m.EventType, string(m.Payload))
  304. }
  305. }
  306. func (m *Message) Marshal() ([]byte, error) {
  307. buf := new(bytes.Buffer)
  308. header := []uint8{
  309. uint8(m.Version)<<4 | uint8(m.HeaderSize),
  310. uint8(m.MsgType)<<4 | uint8(m.MsgTypeFlag),
  311. uint8(m.Serialization)<<4 | uint8(m.Compression),
  312. }
  313. headerSize := 4 * int(m.HeaderSize)
  314. if padding := headerSize - len(header); padding > 0 {
  315. header = append(header, make([]uint8, padding)...)
  316. }
  317. if err := binary.Write(buf, binary.BigEndian, header); err != nil {
  318. return nil, err
  319. }
  320. writers, err := m.writers()
  321. if err != nil {
  322. return nil, err
  323. }
  324. for _, write := range writers {
  325. if err := write(buf); err != nil {
  326. return nil, err
  327. }
  328. }
  329. return buf.Bytes(), nil
  330. }
  331. func (m *Message) Unmarshal(data []byte) error {
  332. buf := bytes.NewBuffer(data)
  333. versionAndHeaderSize, err := buf.ReadByte()
  334. if err != nil {
  335. return err
  336. }
  337. m.Version = VersionBits(versionAndHeaderSize >> 4)
  338. m.HeaderSize = HeaderSizeBits(versionAndHeaderSize & 0b00001111)
  339. _, err = buf.ReadByte()
  340. if err != nil {
  341. return err
  342. }
  343. serializationCompression, err := buf.ReadByte()
  344. if err != nil {
  345. return err
  346. }
  347. m.Serialization = SerializationBits(serializationCompression & 0b11110000)
  348. m.Compression = CompressionBits(serializationCompression & 0b00001111)
  349. headerSize := 4 * int(m.HeaderSize)
  350. readSize := 3
  351. if paddingSize := headerSize - readSize; paddingSize > 0 {
  352. if n, err := buf.Read(make([]byte, paddingSize)); err != nil || n < paddingSize {
  353. return fmt.Errorf("insufficient header bytes: expected %d, got %d", paddingSize, n)
  354. }
  355. }
  356. readers, err := m.readers()
  357. if err != nil {
  358. return err
  359. }
  360. for _, read := range readers {
  361. if err := read(buf); err != nil {
  362. return err
  363. }
  364. }
  365. if _, err := buf.ReadByte(); err != io.EOF {
  366. return fmt.Errorf("unexpected data after message: %v", err)
  367. }
  368. return nil
  369. }
  370. func (m *Message) writers() (writers []func(*bytes.Buffer) error, _ error) {
  371. if m.MsgTypeFlag == MsgTypeFlagWithEvent {
  372. writers = append(writers, m.writeEvent, m.writeSessionID)
  373. }
  374. switch m.MsgType {
  375. case MsgTypeFullClientRequest, MsgTypeFullServerResponse, MsgTypeFrontEndResultServer, MsgTypeAudioOnlyClient, MsgTypeAudioOnlyServer:
  376. if m.MsgTypeFlag == MsgTypeFlagPositiveSeq || m.MsgTypeFlag == MsgTypeFlagNegativeSeq {
  377. writers = append(writers, m.writeSequence)
  378. }
  379. case MsgTypeError:
  380. writers = append(writers, m.writeErrorCode)
  381. default:
  382. return nil, fmt.Errorf("unsupported message type: %d", m.MsgType)
  383. }
  384. writers = append(writers, m.writePayload)
  385. return writers, nil
  386. }
  387. func (m *Message) writeEvent(buf *bytes.Buffer) error {
  388. return binary.Write(buf, binary.BigEndian, m.EventType)
  389. }
  390. func (m *Message) writeSessionID(buf *bytes.Buffer) error {
  391. switch m.EventType {
  392. case EventType_StartConnection, EventType_FinishConnection,
  393. EventType_ConnectionStarted, EventType_ConnectionFailed:
  394. return nil
  395. }
  396. size := len(m.SessionID)
  397. if size > math.MaxUint32 {
  398. return fmt.Errorf("session ID size (%d) exceeds max(uint32)", size)
  399. }
  400. if err := binary.Write(buf, binary.BigEndian, uint32(size)); err != nil {
  401. return err
  402. }
  403. buf.WriteString(m.SessionID)
  404. return nil
  405. }
  406. func (m *Message) writeSequence(buf *bytes.Buffer) error {
  407. return binary.Write(buf, binary.BigEndian, m.Sequence)
  408. }
  409. func (m *Message) writeErrorCode(buf *bytes.Buffer) error {
  410. return binary.Write(buf, binary.BigEndian, m.ErrorCode)
  411. }
  412. func (m *Message) writePayload(buf *bytes.Buffer) error {
  413. size := len(m.Payload)
  414. if size > math.MaxUint32 {
  415. return fmt.Errorf("payload size (%d) exceeds max(uint32)", size)
  416. }
  417. if err := binary.Write(buf, binary.BigEndian, uint32(size)); err != nil {
  418. return err
  419. }
  420. buf.Write(m.Payload)
  421. return nil
  422. }
  423. func (m *Message) readers() (readers []func(*bytes.Buffer) error, _ error) {
  424. switch m.MsgType {
  425. case MsgTypeFullClientRequest, MsgTypeFullServerResponse, MsgTypeFrontEndResultServer, MsgTypeAudioOnlyClient, MsgTypeAudioOnlyServer:
  426. if m.MsgTypeFlag == MsgTypeFlagPositiveSeq || m.MsgTypeFlag == MsgTypeFlagNegativeSeq {
  427. readers = append(readers, m.readSequence)
  428. }
  429. case MsgTypeError:
  430. readers = append(readers, m.readErrorCode)
  431. default:
  432. return nil, fmt.Errorf("unsupported message type: %d", m.MsgType)
  433. }
  434. if m.MsgTypeFlag == MsgTypeFlagWithEvent {
  435. readers = append(readers, m.readEvent, m.readSessionID, m.readConnectID)
  436. }
  437. readers = append(readers, m.readPayload)
  438. return readers, nil
  439. }
  440. func (m *Message) readEvent(buf *bytes.Buffer) error {
  441. return binary.Read(buf, binary.BigEndian, &m.EventType)
  442. }
  443. func (m *Message) readSessionID(buf *bytes.Buffer) error {
  444. switch m.EventType {
  445. case EventType_StartConnection, EventType_FinishConnection,
  446. EventType_ConnectionStarted, EventType_ConnectionFailed,
  447. EventType_ConnectionFinished:
  448. return nil
  449. }
  450. var size uint32
  451. if err := binary.Read(buf, binary.BigEndian, &size); err != nil {
  452. return err
  453. }
  454. if size > 0 {
  455. m.SessionID = string(buf.Next(int(size)))
  456. }
  457. return nil
  458. }
  459. func (m *Message) readConnectID(buf *bytes.Buffer) error {
  460. switch m.EventType {
  461. case EventType_ConnectionStarted, EventType_ConnectionFailed,
  462. EventType_ConnectionFinished:
  463. default:
  464. return nil
  465. }
  466. var size uint32
  467. if err := binary.Read(buf, binary.BigEndian, &size); err != nil {
  468. return err
  469. }
  470. if size > 0 {
  471. m.ConnectID = string(buf.Next(int(size)))
  472. }
  473. return nil
  474. }
  475. func (m *Message) readSequence(buf *bytes.Buffer) error {
  476. return binary.Read(buf, binary.BigEndian, &m.Sequence)
  477. }
  478. func (m *Message) readErrorCode(buf *bytes.Buffer) error {
  479. return binary.Read(buf, binary.BigEndian, &m.ErrorCode)
  480. }
  481. func (m *Message) readPayload(buf *bytes.Buffer) error {
  482. var size uint32
  483. if err := binary.Read(buf, binary.BigEndian, &size); err != nil {
  484. return err
  485. }
  486. if size > 0 {
  487. m.Payload = buf.Next(int(size))
  488. }
  489. return nil
  490. }
  491. func ReceiveMessage(conn *websocket.Conn) (*Message, error) {
  492. mt, frame, err := conn.ReadMessage()
  493. if err != nil {
  494. return nil, err
  495. }
  496. if mt != websocket.BinaryMessage && mt != websocket.TextMessage {
  497. return nil, fmt.Errorf("unexpected Websocket message type: %d", mt)
  498. }
  499. msg, err := NewMessageFromBytes(frame)
  500. if err != nil {
  501. return nil, err
  502. }
  503. // Log: receive msg
  504. return msg, nil
  505. }
  506. func WaitForEvent(conn *websocket.Conn, msgType MsgType, eventType EventType) (*Message, error) {
  507. for {
  508. msg, err := ReceiveMessage(conn)
  509. if err != nil {
  510. return nil, err
  511. }
  512. if msg.MsgType != msgType || msg.EventType != eventType {
  513. return nil, fmt.Errorf("unexpected message: %s", msg)
  514. }
  515. if msg.MsgType == msgType && msg.EventType == eventType {
  516. return msg, nil
  517. }
  518. }
  519. }
  520. func FullClientRequest(conn *websocket.Conn, payload []byte) error {
  521. msg, err := NewMessage(MsgTypeFullClientRequest, MsgTypeFlagNoSeq)
  522. if err != nil {
  523. return err
  524. }
  525. msg.Payload = payload
  526. // Log: send msg
  527. frame, err := msg.Marshal()
  528. if err != nil {
  529. return err
  530. }
  531. return conn.WriteMessage(websocket.BinaryMessage, frame)
  532. }
  533. func AudioOnlyClient(conn *websocket.Conn, payload []byte, flag MsgTypeFlagBits) error {
  534. msg, err := NewMessage(MsgTypeAudioOnlyClient, flag)
  535. if err != nil {
  536. return err
  537. }
  538. msg.Payload = payload
  539. // Log: send msg
  540. frame, err := msg.Marshal()
  541. if err != nil {
  542. return err
  543. }
  544. return conn.WriteMessage(websocket.BinaryMessage, frame)
  545. }
  546. func StartConnection(conn *websocket.Conn) error {
  547. msg, err := NewMessage(MsgTypeFullClientRequest, MsgTypeFlagWithEvent)
  548. if err != nil {
  549. return err
  550. }
  551. msg.EventType = EventType_StartConnection
  552. msg.Payload = []byte("{}")
  553. // Log: send msg
  554. frame, err := msg.Marshal()
  555. if err != nil {
  556. return err
  557. }
  558. return conn.WriteMessage(websocket.BinaryMessage, frame)
  559. }
  560. func FinishConnection(conn *websocket.Conn) error {
  561. msg, err := NewMessage(MsgTypeFullClientRequest, MsgTypeFlagWithEvent)
  562. if err != nil {
  563. return err
  564. }
  565. msg.EventType = EventType_FinishConnection
  566. msg.Payload = []byte("{}")
  567. // Log: send msg
  568. frame, err := msg.Marshal()
  569. if err != nil {
  570. return err
  571. }
  572. return conn.WriteMessage(websocket.BinaryMessage, frame)
  573. }
  574. func StartSession(conn *websocket.Conn, payload []byte, sessionID string) error {
  575. msg, err := NewMessage(MsgTypeFullClientRequest, MsgTypeFlagWithEvent)
  576. if err != nil {
  577. return err
  578. }
  579. msg.EventType = EventType_StartSession
  580. msg.SessionID = sessionID
  581. msg.Payload = payload
  582. // Log: send msg
  583. frame, err := msg.Marshal()
  584. if err != nil {
  585. return err
  586. }
  587. return conn.WriteMessage(websocket.BinaryMessage, frame)
  588. }
  589. func FinishSession(conn *websocket.Conn, sessionID string) error {
  590. msg, err := NewMessage(MsgTypeFullClientRequest, MsgTypeFlagWithEvent)
  591. if err != nil {
  592. return err
  593. }
  594. msg.EventType = EventType_FinishSession
  595. msg.SessionID = sessionID
  596. msg.Payload = []byte("{}")
  597. // Log: send msg
  598. frame, err := msg.Marshal()
  599. if err != nil {
  600. return err
  601. }
  602. return conn.WriteMessage(websocket.BinaryMessage, frame)
  603. }
  604. func CancelSession(conn *websocket.Conn, sessionID string) error {
  605. msg, err := NewMessage(MsgTypeFullClientRequest, MsgTypeFlagWithEvent)
  606. if err != nil {
  607. return err
  608. }
  609. msg.EventType = EventType_CancelSession
  610. msg.SessionID = sessionID
  611. msg.Payload = []byte("{}")
  612. // Log: send msg
  613. frame, err := msg.Marshal()
  614. if err != nil {
  615. return err
  616. }
  617. return conn.WriteMessage(websocket.BinaryMessage, frame)
  618. }
  619. func TaskRequest(conn *websocket.Conn, payload []byte, sessionID string) error {
  620. msg, err := NewMessage(MsgTypeFullClientRequest, MsgTypeFlagWithEvent)
  621. if err != nil {
  622. return err
  623. }
  624. msg.EventType = EventType_TaskRequest
  625. msg.SessionID = sessionID
  626. msg.Payload = payload
  627. // Log: send msg
  628. frame, err := msg.Marshal()
  629. if err != nil {
  630. return err
  631. }
  632. return conn.WriteMessage(websocket.BinaryMessage, frame)
  633. }