• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

lightningnetwork / lnd / 15205630088

23 May 2025 08:14AM UTC coverage: 57.45% (-11.5%) from 68.996%
15205630088

Pull #9784

github

web-flow
Merge f8b9f36a3 into c52a6ddeb
Pull Request #9784: [wip] lnwallet+walletrpc: add SubmitPackage and related RPC call

47 of 96 new or added lines in 5 files covered. (48.96%)

30087 existing lines in 459 files now uncovered.

95586 of 166380 relevant lines covered (57.45%)

0.61 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

84.0
/lnwire/custom.go
1
package lnwire
2

3
import (
4
        "bytes"
5
        "fmt"
6
        "io"
7
        "sync"
8
)
9

10
// CustomTypeStart is the start of the custom type range for peer messages as
11
// defined in BOLT 01.
12
const CustomTypeStart MessageType = 32768
13

14
var (
15
        // customTypeOverride contains a set of message types < CustomTypeStart
16
        // that lnd allows to be treated as custom messages. This allows us to
17
        // override messages reserved for the protocol level and treat them as
18
        // custom messages. This set of message types is stored as a global so
19
        // that we do not need to pass around state when accounting for this
20
        // set of messages in message creation.
21
        //
22
        // Note: This global is protected by the customTypeOverride mutex.
23
        customTypeOverride map[MessageType]struct{}
24

25
        // customTypeOverrideMtx manages concurrent access to
26
        // customTypeOverride.
27
        customTypeOverrideMtx sync.RWMutex
28
)
29

30
// SetCustomOverrides validates that the set of override types are outside of
31
// the custom message range (there's no reason to override messages that are
32
// already within the range), and updates the customTypeOverride global to hold
33
// this set of message types. Note that this function will completely overwrite
34
// the set of overrides, so should be called with the full set of types.
35
func SetCustomOverrides(overrideTypes []uint16) error {
1✔
36
        customTypeOverrideMtx.Lock()
1✔
37
        defer customTypeOverrideMtx.Unlock()
1✔
38

1✔
39
        customTypeOverride = make(map[MessageType]struct{}, len(overrideTypes))
1✔
40

1✔
41
        for _, t := range overrideTypes {
2✔
42
                msgType := MessageType(t)
1✔
43

1✔
44
                if msgType >= CustomTypeStart {
1✔
45
                        return fmt.Errorf("can't override type: %v, already "+
×
46
                                "in custom range", t)
×
47
                }
×
48

49
                customTypeOverride[msgType] = struct{}{}
1✔
50
        }
51

52
        return nil
1✔
53
}
54

55
// IsCustomOverride returns a bool indicating whether the message type is one
56
// of the protocol messages that we override for custom use.
57
func IsCustomOverride(t MessageType) bool {
1✔
58
        customTypeOverrideMtx.RLock()
1✔
59
        defer customTypeOverrideMtx.RUnlock()
1✔
60

1✔
61
        _, ok := customTypeOverride[t]
1✔
62

1✔
63
        return ok
1✔
64
}
1✔
65

66
// Custom represents an application-defined wire message.
67
type Custom struct {
68
        Type MessageType
69
        Data []byte
70
}
71

72
// A compile time check to ensure Custom implements the lnwire.Message
73
// interface.
74
var _ Message = (*Custom)(nil)
75

76
// A compile time check to ensure Custom implements the lnwire.SizeableMessage
77
// interface.
78
var _ SizeableMessage = (*Custom)(nil)
79

80
// NewCustom instantiates a new custom message.
81
func NewCustom(msgType MessageType, data []byte) (*Custom, error) {
1✔
82
        if msgType < CustomTypeStart && !IsCustomOverride(msgType) {
2✔
83
                return nil, fmt.Errorf("msg type: %d not in custom range: %v "+
1✔
84
                        "and not overridden", msgType, CustomTypeStart)
1✔
85
        }
1✔
86

87
        return &Custom{
1✔
88
                Type: msgType,
1✔
89
                Data: data,
1✔
90
        }, nil
1✔
91
}
92

93
// Encode serializes the target Custom message into the passed io.Writer
94
// implementation.
95
//
96
// This is part of the lnwire.Message interface.
97
func (c *Custom) Encode(b *bytes.Buffer, pver uint32) error {
1✔
98
        _, err := b.Write(c.Data)
1✔
99
        return err
1✔
100
}
1✔
101

102
// Decode deserializes the serialized Custom message stored in the passed
103
// io.Reader into the target Custom message.
104
//
105
// This is part of the lnwire.Message interface.
106
func (c *Custom) Decode(r io.Reader, pver uint32) error {
1✔
107
        var b bytes.Buffer
1✔
108
        if _, err := io.Copy(&b, r); err != nil {
1✔
109
                return err
×
110
        }
×
111

112
        c.Data = b.Bytes()
1✔
113

1✔
114
        return nil
1✔
115
}
116

117
// MsgType returns the uint32 code which uniquely identifies this message as a
118
// Custom message on the wire.
119
//
120
// This is part of the lnwire.Message interface.
121
func (c *Custom) MsgType() MessageType {
1✔
122
        return c.Type
1✔
123
}
1✔
124

125
// SerializedSize returns the serialized size of the message in bytes.
126
//
127
// This is part of the lnwire.SizeableMessage interface.
UNCOV
128
func (c *Custom) SerializedSize() (uint32, error) {
×
UNCOV
129
        return MessageSerializedSize(c)
×
UNCOV
130
}
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc