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
|
|
|
|
|
2015-11-28 14:22:29 +03:00
|
|
|
import (
|
2020-02-19 02:05:38 +03:00
|
|
|
"errors"
|
2015-11-28 14:22:29 +03:00
|
|
|
"io"
|
2020-11-18 16:50:41 +03:00
|
|
|
|
|
|
|
"github.com/unistack-org/micro/v3/metadata"
|
2015-11-28 14:22:29 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
Error MessageType = iota
|
|
|
|
Request
|
|
|
|
Response
|
2019-07-07 14:44:09 +03:00
|
|
|
Event
|
2015-11-28 14:22:29 +03:00
|
|
|
)
|
|
|
|
|
2020-02-19 02:05:38 +03:00
|
|
|
var (
|
2020-11-03 02:02:32 +03:00
|
|
|
// ErrInvalidMessage returned when invalid messge passed to codec
|
2020-02-19 02:05:38 +03:00
|
|
|
ErrInvalidMessage = errors.New("invalid message")
|
|
|
|
)
|
|
|
|
|
2020-11-03 02:02:32 +03:00
|
|
|
// MessageType
|
2015-11-28 14:22:29 +03:00
|
|
|
type MessageType int
|
|
|
|
|
2020-11-03 02:02:32 +03:00
|
|
|
// NewCodec takes in a connection/buffer and returns a new Codec
|
2015-11-28 14:22:29 +03:00
|
|
|
type NewCodec func(io.ReadWriteCloser) Codec
|
|
|
|
|
2015-12-02 04:38:56 +03:00
|
|
|
// Codec encodes/decodes various types of messages used within go-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.
|
2015-11-27 03:17:36 +03:00
|
|
|
type Codec interface {
|
2019-01-09 22:28:13 +03:00
|
|
|
Reader
|
|
|
|
Writer
|
|
|
|
Close() error
|
|
|
|
String() string
|
|
|
|
}
|
|
|
|
|
2020-11-03 02:02:32 +03:00
|
|
|
// Reader interface
|
2019-01-09 22:28:13 +03:00
|
|
|
type Reader interface {
|
2015-11-28 14:22:29 +03:00
|
|
|
ReadHeader(*Message, MessageType) error
|
|
|
|
ReadBody(interface{}) error
|
2019-01-09 22:28:13 +03:00
|
|
|
}
|
|
|
|
|
2020-11-03 02:02:32 +03:00
|
|
|
// Writer interface
|
2019-01-09 22:28:13 +03:00
|
|
|
type Writer interface {
|
2015-11-28 23:09:07 +03:00
|
|
|
Write(*Message, interface{}) error
|
2015-11-28 14:22:29 +03:00
|
|
|
}
|
|
|
|
|
2019-01-10 23:35:20 +03:00
|
|
|
// Marshaler is a simple encoding interface used for the broker/transport
|
2019-01-10 12:42:02 +03:00
|
|
|
// where headers are not supported by the underlying implementation.
|
|
|
|
type Marshaler interface {
|
|
|
|
Marshal(interface{}) ([]byte, error)
|
|
|
|
Unmarshal([]byte, interface{}) error
|
|
|
|
String() string
|
|
|
|
}
|
|
|
|
|
2015-11-28 14:22:29 +03:00
|
|
|
// 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
|
2020-11-18 16:50:41 +03:00
|
|
|
Header metadata.Metadata
|
2019-01-09 22:28:13 +03:00
|
|
|
Body []byte
|
2015-11-28 14:22:29 +03:00
|
|
|
}
|