micro/codec/codec.go

84 lines
1.9 KiB
Go
Raw Normal View History

2016-12-14 18:41:48 +03:00
// Package codec is an interface for encoding messages
2015-11-27 03:17:36 +03:00
package codec
import (
"errors"
"io"
"github.com/unistack-org/micro/v3/metadata"
)
const (
// Message types
Error MessageType = iota
Request
Response
2019-07-07 14:44:09 +03:00
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.
2015-12-02 04:38:56 +03:00
// 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.
2015-11-27 03:17:36 +03:00
type Codec interface {
ReadHeader(io.Reader, *Message, MessageType) error
ReadBody(io.Reader, interface{}) error
Write(io.Writer, *Message, interface{}) error
2019-01-10 12:42:02 +03:00
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 {
2019-01-11 00:25:31 +03:00
Id string
Type MessageType
Target string
2019-01-18 13:12:57 +03:00
Method string
2019-01-11 00:25:31 +03:00
Endpoint string
Error string
2019-01-09 19:20:57 +03:00
// The values read from the socket
Header metadata.Metadata
2019-01-09 22:28:13 +03:00
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)}
}