84 lines
1.9 KiB
Go
84 lines
1.9 KiB
Go
// Package codec is an interface for encoding messages
|
|
package codec
|
|
|
|
import (
|
|
"errors"
|
|
"io"
|
|
|
|
"github.com/unistack-org/micro/v3/metadata"
|
|
)
|
|
|
|
const (
|
|
// Message types
|
|
Error MessageType = iota
|
|
Request
|
|
Response
|
|
Event
|
|
)
|
|
|
|
var (
|
|
// ErrInvalidMessage returned when invalid messge passed to codec
|
|
ErrInvalidMessage = errors.New("invalid message")
|
|
// ErrUnknownContentType returned when content-type is unknown
|
|
ErrUnknownContentType = errors.New("unknown content-type")
|
|
)
|
|
|
|
var (
|
|
// DefaultMaxMsgSize specifies how much data codec can handle
|
|
DefaultMaxMsgSize = 1024 * 1024 * 4 // 4Mb
|
|
DefaultCodec Codec = NewCodec()
|
|
)
|
|
|
|
// MessageType
|
|
type MessageType int
|
|
|
|
// Codec encodes/decodes various types of messages used within micro.
|
|
// ReadHeader and ReadBody are called in pairs to read requests/responses
|
|
// from the connection. Close is called when finished with the
|
|
// connection. ReadBody may be called with a nil argument to force the
|
|
// body to be read and discarded.
|
|
type Codec interface {
|
|
ReadHeader(io.ReadWriter, *Message, MessageType) error
|
|
ReadBody(io.ReadWriter, interface{}) error
|
|
Write(io.ReadWriter, *Message, interface{}) error
|
|
Marshal(interface{}) ([]byte, error)
|
|
Unmarshal([]byte, interface{}) error
|
|
String() string
|
|
}
|
|
|
|
// Message represents detailed information about
|
|
// the communication, likely followed by the body.
|
|
// In the case of an error, body may be nil.
|
|
type Message struct {
|
|
Id string
|
|
Type MessageType
|
|
Target string
|
|
Method string
|
|
Endpoint string
|
|
Error string
|
|
|
|
// The values read from the socket
|
|
Header metadata.Metadata
|
|
Body []byte
|
|
}
|
|
|
|
// Option func
|
|
type Option func(*Options)
|
|
|
|
// Options contains codec options
|
|
type Options struct {
|
|
MaxMsgSize int64
|
|
}
|
|
|
|
// MaxMsgSize sets the max message size
|
|
func MaxMsgSize(n int64) Option {
|
|
return func(o *Options) {
|
|
o.MaxMsgSize = n
|
|
}
|
|
}
|
|
|
|
// NewMessage creates new codec message
|
|
func NewMessage(t MessageType) *Message {
|
|
return &Message{Type: t, Header: metadata.New(0)}
|
|
}
|