github.com/ava-labs/avalanchego@v1.11.11/message/fields.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package message 5 6 import ( 7 "errors" 8 "time" 9 10 "github.com/ava-labs/avalanchego/ids" 11 "github.com/ava-labs/avalanchego/proto/pb/p2p" 12 ) 13 14 var ( 15 errMissingField = errors.New("message missing field") 16 17 _ chainIDGetter = (*p2p.GetStateSummaryFrontier)(nil) 18 _ chainIDGetter = (*p2p.StateSummaryFrontier)(nil) 19 _ chainIDGetter = (*p2p.GetAcceptedStateSummary)(nil) 20 _ chainIDGetter = (*p2p.AcceptedStateSummary)(nil) 21 _ chainIDGetter = (*p2p.GetAcceptedFrontier)(nil) 22 _ chainIDGetter = (*p2p.AcceptedFrontier)(nil) 23 _ chainIDGetter = (*p2p.GetAccepted)(nil) 24 _ chainIDGetter = (*p2p.Accepted)(nil) 25 _ chainIDGetter = (*p2p.GetAncestors)(nil) 26 _ chainIDGetter = (*p2p.Ancestors)(nil) 27 _ chainIDGetter = (*p2p.Get)(nil) 28 _ chainIDGetter = (*p2p.Put)(nil) 29 _ chainIDGetter = (*p2p.PushQuery)(nil) 30 _ chainIDGetter = (*p2p.PullQuery)(nil) 31 _ chainIDGetter = (*p2p.Chits)(nil) 32 _ chainIDGetter = (*p2p.AppRequest)(nil) 33 _ chainIDGetter = (*p2p.AppResponse)(nil) 34 _ chainIDGetter = (*p2p.AppGossip)(nil) 35 36 _ requestIDGetter = (*p2p.GetStateSummaryFrontier)(nil) 37 _ requestIDGetter = (*p2p.StateSummaryFrontier)(nil) 38 _ requestIDGetter = (*p2p.GetAcceptedStateSummary)(nil) 39 _ requestIDGetter = (*p2p.AcceptedStateSummary)(nil) 40 _ requestIDGetter = (*p2p.GetAcceptedFrontier)(nil) 41 _ requestIDGetter = (*p2p.AcceptedFrontier)(nil) 42 _ requestIDGetter = (*p2p.GetAccepted)(nil) 43 _ requestIDGetter = (*p2p.Accepted)(nil) 44 _ requestIDGetter = (*p2p.GetAncestors)(nil) 45 _ requestIDGetter = (*p2p.Ancestors)(nil) 46 _ requestIDGetter = (*p2p.Get)(nil) 47 _ requestIDGetter = (*p2p.Put)(nil) 48 _ requestIDGetter = (*p2p.PushQuery)(nil) 49 _ requestIDGetter = (*p2p.PullQuery)(nil) 50 _ requestIDGetter = (*p2p.Chits)(nil) 51 _ requestIDGetter = (*p2p.AppRequest)(nil) 52 _ requestIDGetter = (*p2p.AppResponse)(nil) 53 54 _ engineTypeGetter = (*p2p.GetAncestors)(nil) 55 56 _ deadlineGetter = (*p2p.GetStateSummaryFrontier)(nil) 57 _ deadlineGetter = (*p2p.GetAcceptedStateSummary)(nil) 58 _ deadlineGetter = (*p2p.GetAcceptedFrontier)(nil) 59 _ deadlineGetter = (*p2p.GetAccepted)(nil) 60 _ deadlineGetter = (*p2p.GetAncestors)(nil) 61 _ deadlineGetter = (*p2p.Get)(nil) 62 _ deadlineGetter = (*p2p.PushQuery)(nil) 63 _ deadlineGetter = (*p2p.PullQuery)(nil) 64 _ deadlineGetter = (*p2p.AppRequest)(nil) 65 ) 66 67 type chainIDGetter interface { 68 GetChainId() []byte 69 } 70 71 func GetChainID(m any) (ids.ID, error) { 72 msg, ok := m.(chainIDGetter) 73 if !ok { 74 return ids.Empty, errMissingField 75 } 76 chainIDBytes := msg.GetChainId() 77 return ids.ToID(chainIDBytes) 78 } 79 80 type requestIDGetter interface { 81 GetRequestId() uint32 82 } 83 84 func GetRequestID(m any) (uint32, bool) { 85 if msg, ok := m.(requestIDGetter); ok { 86 requestID := msg.GetRequestId() 87 return requestID, true 88 } 89 90 // AppGossip is the only inbound message not containing a requestID. For 91 // ease of handling, imagine that it does have a requestID. 92 _, ok := m.(*p2p.AppGossip) 93 return 0, ok 94 } 95 96 type engineTypeGetter interface { 97 GetEngineType() p2p.EngineType 98 } 99 100 func GetEngineType(m any) (p2p.EngineType, bool) { 101 msg, ok := m.(engineTypeGetter) 102 if !ok { 103 return p2p.EngineType_ENGINE_TYPE_UNSPECIFIED, false 104 } 105 return msg.GetEngineType(), true 106 } 107 108 type deadlineGetter interface { 109 GetDeadline() uint64 110 } 111 112 func GetDeadline(m any) (time.Duration, bool) { 113 msg, ok := m.(deadlineGetter) 114 if !ok { 115 return 0, false 116 } 117 deadline := msg.GetDeadline() 118 return time.Duration(deadline), true 119 }