Apply mail server completion response

This commit is contained in:
Dmitry 2018-09-25 09:35:03 +03:00
parent 8ff11fbbc0
commit 07151c8376
3 changed files with 44 additions and 16 deletions

View File

@ -43,13 +43,14 @@ const (
ProtocolName = "shh" // Nickname of the protocol in geth ProtocolName = "shh" // Nickname of the protocol in geth
// whisper protocol message codes, according to EIP-627 // whisper protocol message codes, according to EIP-627
statusCode = 0 // used by whisper protocol statusCode = 0 // used by whisper protocol
messagesCode = 1 // normal whisper message messagesCode = 1 // normal whisper message
powRequirementCode = 2 // PoW requirement powRequirementCode = 2 // PoW requirement
bloomFilterExCode = 3 // bloom filter exchange bloomFilterExCode = 3 // bloom filter exchange
p2pRequestCode = 126 // peer-to-peer message, used by Dapp protocol p2pRequestCompleteCode = 125 // peer-to-peer message, used by Dapp protocol
p2pMessageCode = 127 // peer-to-peer message (to be consumed by the peer, but not forwarded any further) p2pRequestCode = 126 // peer-to-peer message, used by Dapp protocol
NumberOfMessageCodes = 128 p2pMessageCode = 127 // peer-to-peer message (to be consumed by the peer, but not forwarded any further)
NumberOfMessageCodes = 128
SizeMask = byte(3) // mask used to extract the size of payload size field from the flags SizeMask = byte(3) // mask used to extract the size of payload size field from the flags
signatureFlag = byte(4) signatureFlag = byte(4)

View File

@ -1,23 +1,27 @@
package whisperv6 package whisperv6
import ( import (
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/p2p/discover" "github.com/ethereum/go-ethereum/p2p/discover"
) )
// EventType used to define known envelope events. // EventType used to define known envelope events.
type EventType string type EventType string
const ( const (
// EventEnvelopeSent fires when envelope was sent to a peer. // EventEnvelopeSent fires when envelope was sent to a peer.
EventEnvelopeSent EventType = "envelope.sent" EventEnvelopeSent EventType = "envelope.sent"
// EventEnvelopeExpired fires when envelop expired // EventEnvelopeExpired fires when envelop expired
EventEnvelopeExpired EventType = "envelope.expired" EventEnvelopeExpired EventType = "envelope.expired"
// EventMailServerRequestCompleted fires after mailserver sends all the requested messages
EventMailServerRequestCompleted EventType = "mailserver.request.completed"
// EventMailServerRequestExpired fires after mailserver the request TTL ends
EventMailServerRequestExpired EventType = "mailserver.request.expired"
) )
// EnvelopeEvent used for envelopes events. // EnvelopeEvent used for envelopes events.
type EnvelopeEvent struct { type EnvelopeEvent struct {
Event EventType Event EventType
Hash common.Hash Hash common.Hash
Peer discover.NodeID Peer discover.NodeID
} }

View File

@ -402,6 +402,15 @@ func (whisper *Whisper) RequestHistoricMessages(peerID []byte, envelope *Envelop
return p2p.Send(p.ws, p2pRequestCode, envelope) return p2p.Send(p.ws, p2pRequestCode, envelope)
} }
func (whisper *Whisper) SendHistoricMessageResponse(peer *Peer, requestID common.Hash) error {
size, r, err := rlp.EncodeToReader(requestID)
if err != nil {
return err
}
return peer.ws.WriteMsg(p2p.Msg{Code: p2pRequestCompleteCode, Size: uint32(size), Payload: r})
}
// SendP2PMessage sends a peer-to-peer message to a specific peer. // SendP2PMessage sends a peer-to-peer message to a specific peer.
func (whisper *Whisper) SendP2PMessage(peerID []byte, envelope *Envelope) error { func (whisper *Whisper) SendP2PMessage(peerID []byte, envelope *Envelope) error {
p, err := whisper.getPeer(peerID) p, err := whisper.getPeer(peerID)
@ -843,8 +852,22 @@ func (whisper *Whisper) runMessageLoop(p *Peer, rw p2p.MsgReadWriter) error {
log.Warn("failed to decode p2p request message, peer will be disconnected", "peer", p.peer.ID(), "err", err) log.Warn("failed to decode p2p request message, peer will be disconnected", "peer", p.peer.ID(), "err", err)
return errors.New("invalid p2p request") return errors.New("invalid p2p request")
} }
whisper.mailServer.DeliverMail(p, &request) whisper.mailServer.DeliverMail(p, &request)
} }
case p2pRequestCompleteCode:
if p.trusted {
var requestID common.Hash
if err := packet.Decode(&requestID); err != nil {
log.Warn("failed to decode response message, peer will be disconnected", "peer", p.peer.ID(), "err", err)
return errors.New("invalid request response message")
}
whisper.envelopeFeed.Send(EnvelopeEvent{
Hash: requestID,
Event: EventMailServerRequestCompleted,
})
}
default: default:
// New message types might be implemented in the future versions of Whisper. // New message types might be implemented in the future versions of Whisper.
// For forward compatibility, just ignore. // For forward compatibility, just ignore.