-
Notifications
You must be signed in to change notification settings - Fork 43
/
envelope.go
61 lines (47 loc) · 1.43 KB
/
envelope.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package format
import (
"code.cloudfoundry.org/lager"
"github.com/gogo/protobuf/proto"
)
type EnvelopeFormat byte
const (
PROTO EnvelopeFormat = 2
)
const EnvelopeOffset int = 2
func UnmarshalEnvelope(logger lager.Logger, unencodedPayload []byte, model Model) error {
return UnmarshalProto(logger, unencodedPayload[EnvelopeOffset:], model)
}
// DEPRECATED
// dummy version for backward compatability. old BBS used to serialize proto
// messages with a 2-byte header that has the envelope format (i.e. PROTO) and
// the version of the model (e.g. 0, 1 or 2). Adding the version was a
// pre-mature optimization that we decided to get rid of in #133215113. That
// said, we have the ensure the header is a 2-byte to avoid breaking older BBS
const version = 0
func MarshalEnvelope(model Model) ([]byte, error) {
var payload []byte
var err error
payload, err = MarshalProto(model)
if err != nil {
return nil, err
}
data := make([]byte, 0, len(payload)+EnvelopeOffset)
data = append(data, byte(PROTO), byte(version))
data = append(data, payload...)
return data, nil
}
func UnmarshalProto(logger lager.Logger, marshaledPayload []byte, model Model) error {
err := proto.Unmarshal(marshaledPayload, model)
if err != nil {
logger.Error("failed-to-proto-unmarshal-payload", err)
return err
}
return nil
}
func MarshalProto(v Model) ([]byte, error) {
bytes, err := proto.Marshal(v)
if err != nil {
return nil, err
}
return bytes, nil
}