72 lines
1.3 KiB
Go
72 lines
1.3 KiB
Go
// Package controlmessage contains MoQ control messages.
|
|
package controlmessage
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
|
|
"github.com/bluenviron/mediamtx/internal/protocols/moq/varint"
|
|
)
|
|
|
|
// Message is a control message.
|
|
type Message interface {
|
|
// Marshal encodes the message to bytes.
|
|
Marshal() []byte
|
|
|
|
isMessage()
|
|
unmarshal(buf []byte) error
|
|
}
|
|
|
|
// Read reads a Message from a Reader.
|
|
func Read(r io.Reader) (Message, error) {
|
|
var t varint.Varint
|
|
if err := t.Read(r); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var lenBuf [2]byte
|
|
_, err := io.ReadFull(r, lenBuf[:])
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
length := uint16(lenBuf[0])<<8 | uint16(lenBuf[1])
|
|
|
|
payload := make([]byte, length)
|
|
_, err = io.ReadFull(r, payload)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var m Message
|
|
|
|
switch t {
|
|
case typeSetup:
|
|
m = &Setup{}
|
|
case typeClientSetup:
|
|
m = &ClientSetup{}
|
|
case typeServerSetup:
|
|
m = &ServerSetup{}
|
|
case typeSubscribe:
|
|
m = &Subscribe{}
|
|
case typeSubscribeOk:
|
|
m = &SubscribeOk{}
|
|
case typeRequestError:
|
|
m = &RequestError{}
|
|
case typePublish:
|
|
m = &Publish{}
|
|
case typePublishOk:
|
|
m = &PublishOk{}
|
|
case typeRequestOk:
|
|
m = &RequestOk{}
|
|
default:
|
|
return nil, fmt.Errorf("unknown message type: 0x%x", t)
|
|
}
|
|
|
|
err = m.unmarshal(payload)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return m, nil
|
|
}
|