shhext

package
v0.26.0-alpha.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 20, 2019 License: MPL-2.0 Imports: 34 Imported by: 0

README

Whisper API Extension

API

shhext_getNewFilterMessages

Accepts the same input as shh_getFilterMessages.

Returns

Returns a list of whisper messages matching the specified filter. Filters out the messages already confirmed received by shhext_confirmMessagesProcessed

Deduplication is made using the whisper envelope content and topic only, so the same content received in different whisper envelopes will be deduplicated.

shhext_confirmMessagesProcessed

Confirms whisper messages received and processed on the client side. These messages won't appear anymore when shhext_getNewFilterMessages is called.

Parameters

Gets a list of whisper envelopes.

shhext_post

Accepts same input as shh_post.

Returns

DATA, 32 Bytes - the envelope hash

shhext_requestMessages

Sends a request for historic messages to a mail server.

Parameters
  1. Object - The message request object:
  • mailServerPeer:URL - Mail servers' enode addess
  • from:QUANTITY - (optional) Lower bound of time range as unix timestamp, default is 24 hours back from now
  • to:QUANTITY- (optional) Upper bound of time range as unix timestamp, default is now
  • topic:DATA, 4 Bytes - Regular whisper topic
  • symKeyID:DATA- ID of a symmetric key to authenticate to mail server, derived from mail server password
Returns

Boolean - returns true if the request was send, otherwise false.

Signals

Sends sent signal once per envelope.

{
  "type": "envelope.sent",
  "event": {
    "hash": "0xea0b93079ed32588628f1cabbbb5ed9e4d50b7571064c2962c3853972db67790"
  }
}

Sends expired signal if envelope dropped from whisper local queue before it was sent to any peer on the network.

{
  "type": "envelope.expired",
  "event": {
    "hash": "0x754f4c12dccb14886f791abfeb77ffb86330d03d5a4ba6f37a8c21281988b69e"
  }
}

Documentation

Index

Constants

View Source
const (
	// WhisperTimeAllowance is needed to ensure that we won't miss envelopes that were
	// delivered to mail server after we made a request.
	WhisperTimeAllowance = 20 * time.Second
)

Variables

View Source
var (
	// ErrInvalidMailServerPeer is returned when it fails to parse enode from params.
	ErrInvalidMailServerPeer = errors.New("invalid mailServerPeer value")
	// ErrInvalidSymKeyID is returned when it fails to get a symmetric key.
	ErrInvalidSymKeyID = errors.New("invalid symKeyID value")
	// ErrInvalidPublicKey is returned when public key can't be extracted
	// from MailServer's nodeID.
	ErrInvalidPublicKey = errors.New("can't extract public key")
	// ErrPFSNotEnabled is returned when an endpoint PFS only is called but
	// PFS is disabled
	ErrPFSNotEnabled = errors.New("pfs not enabled")
)

Functions

func GroupHistoriesByRequestTimespan

func GroupHistoriesByRequestTimespan(store db.HistoryStore, histories []db.TopicHistory) []db.HistoryRequest

GroupHistoriesByRequestTimespan creates requests from provided histories. Multiple histories will be included into the same request only if they share timespan.

func RenewRequests

func RenewRequests(requests []db.HistoryRequest, now time.Time) []db.HistoryRequest

RenewRequests re-sets current, first and end timestamps. Changes should not be persisted on disk in this method.

Types

type BloomFilterOption

type BloomFilterOption struct {
	Range  Range
	Filter []byte
}

BloomFilterOption is a request based on bloom filter.

func (BloomFilterOption) ToMessagesRequestPayload

func (filter BloomFilterOption) ToMessagesRequestPayload() ([]byte, error)

ToMessagesRequestPayload creates mailserver.MessagesRequestPayload and encodes it to bytes using rlp.

type Context

type Context struct {
	context.Context
}

Context provides access to request-scoped values.

func NewContext

func NewContext(ctx context.Context, source TimeSource, registry *RequestsRegistry, storage db.Storage) Context

NewContext creates Context with all required fields.

func NewContextFromService

func NewContextFromService(ctx context.Context, service *Service, storage db.Storage) Context

NewContextFromService creates new context instance using Service fileds directly and Storage.

func (Context) HistoryStore

func (c Context) HistoryStore() db.HistoryStore

HistoryStore returns db.HistoryStore instance associated with this request.

func (Context) RequestRegistry

func (c Context) RequestRegistry() *RequestsRegistry

RequestRegistry returns RequestRegistry that tracks each request life-span.

func (Context) Time

func (c Context) Time() time.Time

Time returns current time using time function associated with this request.

type ContextKey

type ContextKey struct {
	Name string
}

ContextKey is a type used for keys in shhext Context.

func NewContextKey

func NewContextKey(name string) ContextKey

NewContextKey returns new ContextKey instance.

type EnvelopeEventsHandler

type EnvelopeEventsHandler interface {
	EnvelopeSent(common.Hash)
	EnvelopeExpired(common.Hash, error)
	MailServerRequestCompleted(common.Hash, common.Hash, []byte, error)
	MailServerRequestExpired(common.Hash)
}

EnvelopeEventsHandler used for two different event types.

type EnvelopeSignalHandler

type EnvelopeSignalHandler struct{}

EnvelopeSignalHandler sends signals when envelope is sent or expired.

func (EnvelopeSignalHandler) BundleAdded added in v0.16.4

func (h EnvelopeSignalHandler) BundleAdded(identity string, installationID string)

func (EnvelopeSignalHandler) DecryptMessageFailed added in v0.15.1

func (h EnvelopeSignalHandler) DecryptMessageFailed(pubKey string)

func (EnvelopeSignalHandler) EnvelopeExpired

func (h EnvelopeSignalHandler) EnvelopeExpired(hash common.Hash, err error)

EnvelopeExpired triggered when envelope is expired but wasn't delivered to any peer.

func (EnvelopeSignalHandler) EnvelopeSent

func (h EnvelopeSignalHandler) EnvelopeSent(hash common.Hash)

EnvelopeSent triggered when envelope delivered atleast to 1 peer.

func (EnvelopeSignalHandler) MailServerRequestCompleted

func (h EnvelopeSignalHandler) MailServerRequestCompleted(requestID common.Hash, lastEnvelopeHash common.Hash, cursor []byte, err error)

MailServerRequestCompleted triggered when the mailserver sends a message to notify that the request has been completed

func (EnvelopeSignalHandler) MailServerRequestExpired

func (h EnvelopeSignalHandler) MailServerRequestExpired(hash common.Hash)

MailServerRequestExpired triggered when the mailserver request expires

func (EnvelopeSignalHandler) WhisperFilterAdded

func (h EnvelopeSignalHandler) WhisperFilterAdded(filterIDs []string)

type EnvelopeState

type EnvelopeState int

EnvelopeState in local tracker

const (
	// NotRegistered returned if asked hash wasn't registered in the tracker.
	NotRegistered EnvelopeState = -1
	// EnvelopePosted is set when envelope was added to a local whisper queue.
	EnvelopePosted EnvelopeState = iota
	// EnvelopeSent is set when envelope is sent to atleast one peer.
	EnvelopeSent
	// MailServerRequestSent is set when p2p request is sent to the mailserver
	MailServerRequestSent
)

type EnvelopesMonitor

type EnvelopesMonitor struct {
	// contains filtered or unexported fields
}

EnvelopesMonitor is responsible for monitoring whisper envelopes state.

func NewEnvelopesMonitor

func NewEnvelopesMonitor(w *whisper.Whisper, handler EnvelopeEventsHandler, mailServerConfirmation bool, mailPeers *mailservers.PeerStore, maxAttempts int) *EnvelopesMonitor

NewEnvelopesMonitor returns a pointer to an instance of the EnvelopesMonitor.

func (*EnvelopesMonitor) Add

func (m *EnvelopesMonitor) Add(envelopeHash common.Hash, message whisper.NewMessage)

Add hash to a tracker.

func (*EnvelopesMonitor) GetMessageState

func (m *EnvelopesMonitor) GetMessageState(mID common.Hash) EnvelopeState

func (*EnvelopesMonitor) GetState

func (m *EnvelopesMonitor) GetState(hash common.Hash) EnvelopeState

func (*EnvelopesMonitor) Start

func (m *EnvelopesMonitor) Start()

Start processing events.

func (*EnvelopesMonitor) Stop

func (m *EnvelopesMonitor) Stop()

Stop process events.

type HistoryUpdateReactor

type HistoryUpdateReactor struct {
	// contains filtered or unexported fields
}

HistoryUpdateReactor responsible for tracking progress for all history requests. It listens for 2 events:

  • when envelope from mail server is received we will update appropriate topic on disk
  • when confirmation for request completion is received - we will set last envelope timestamp as the last timestamp for all TopicLists in current request.

func NewHistoryUpdateReactor

func NewHistoryUpdateReactor() *HistoryUpdateReactor

NewHistoryUpdateReactor creates HistoryUpdateReactor instance.

func (*HistoryUpdateReactor) CreateRequests

func (reactor *HistoryUpdateReactor) CreateRequests(ctx Context, topicRequests []TopicRequest) ([]db.HistoryRequest, error)

CreateRequests receives list of topic with desired timestamps and initiates both pending requests and requests that cover new topics.

func (*HistoryUpdateReactor) UpdateFinishedRequest

func (reactor *HistoryUpdateReactor) UpdateFinishedRequest(ctx Context, id common.Hash) error

UpdateFinishedRequest removes successfully finished request and updates every topic attached to the request.

func (*HistoryUpdateReactor) UpdateTopicHistory

func (reactor *HistoryUpdateReactor) UpdateTopicHistory(ctx Context, topic whisper.TopicType, timestamp time.Time) error

UpdateTopicHistory updates Current timestamp for the TopicHistory with a given timestamp.

type InitiateHistoryRequestParams

type InitiateHistoryRequestParams struct {
	Peer     string
	SymKeyID string
	Requests []TopicRequest
	Force    bool
	Timeout  time.Duration
}

InitiateHistoryRequestParams type for initiating history requests from a peer.

type MailRequestMonitor

type MailRequestMonitor struct {
	// contains filtered or unexported fields
}

MailRequestMonitor is responsible for monitoring history request to mailservers.

func (*MailRequestMonitor) GetState

func (m *MailRequestMonitor) GetState(hash common.Hash) EnvelopeState

func (*MailRequestMonitor) Start

func (m *MailRequestMonitor) Start()

Start processing events.

func (*MailRequestMonitor) Stop

func (m *MailRequestMonitor) Stop()

Stop process events.

type MessagesRequest

type MessagesRequest struct {
	// MailServerPeer is MailServer's enode address.
	MailServerPeer string `json:"mailServerPeer"`

	// From is a lower bound of time range (optional).
	// Default is 24 hours back from now.
	From uint32 `json:"from"`

	// To is a upper bound of time range (optional).
	// Default is now.
	To uint32 `json:"to"`

	// Limit determines the number of messages sent by the mail server
	// for the current paginated request
	Limit uint32 `json:"limit"`

	// Cursor is used as starting point for paginated requests
	Cursor string `json:"cursor"`

	// Topic is a regular Whisper topic.
	// DEPRECATED
	Topic whisper.TopicType `json:"topic"`

	// Topics is a list of Whisper topics.
	Topics []whisper.TopicType `json:"topics"`

	// SymKeyID is an ID of a symmetric key to authenticate to MailServer.
	// It's derived from MailServer password.
	SymKeyID string `json:"symKeyID"`

	// Timeout is the time to live of the request specified in seconds.
	// Default is 10 seconds
	Timeout time.Duration `json:"timeout"`

	// Force ensures that requests will bypass enforced delay.
	Force bool `json:"force"`
}

MessagesRequest is a RequestMessages() request payload.

type MessagesResponse

type MessagesResponse struct {
	// Cursor from the response can be used to retrieve more messages
	// for the previous request.
	Cursor string `json:"cursor"`

	// Error indicates that something wrong happened when sending messages
	// to the requester.
	Error error `json:"error"`
}

MessagesResponse is a response for shhext_requestMessages2 method.

type PublicAPI

type PublicAPI struct {
	// contains filtered or unexported fields
}

PublicAPI extends whisper public API.

func NewPublicAPI

func NewPublicAPI(s *Service) *PublicAPI

NewPublicAPI returns instance of the public API.

func (*PublicAPI) CompleteRequest

func (api *PublicAPI) CompleteRequest(parent context.Context, hex string) (err error)

CompleteRequest client must mark request completed when all envelopes were processed.

func (*PublicAPI) ConfirmMessagesProcessed

func (api *PublicAPI) ConfirmMessagesProcessed(messages []*whisper.Message) (err error)

ConfirmMessagesProcessed is a method to confirm that messages was consumed by the client side.

func (*PublicAPI) ConfirmMessagesProcessedByID

func (api *PublicAPI) ConfirmMessagesProcessedByID(messageIDs [][]byte) error

ConfirmMessagesProcessedByID is a method to confirm that messages was consumed by the client side.

func (*PublicAPI) GetNewFilterMessages

func (api *PublicAPI) GetNewFilterMessages(filterID string) ([]dedup.DeduplicateMessage, error)

GetNewFilterMessages is a prototype method with deduplication

func (*PublicAPI) InitiateHistoryRequests

func (api *PublicAPI) InitiateHistoryRequests(parent context.Context, request InitiateHistoryRequestParams) (rst []hexutil.Bytes, err error)

InitiateHistoryRequests is a stateful API for initiating history request for each topic. Caller of this method needs to define only two parameters per each TopicRequest: - Topic - Duration in nanoseconds. Will be used to determine starting time for history request. After that status-go will guarantee that request for this topic and date will be performed.

func (*PublicAPI) Post

func (api *PublicAPI) Post(ctx context.Context, req whisper.NewMessage) (hexutil.Bytes, error)

Post shamelessly copied from whisper codebase with slight modifications.

func (*PublicAPI) RequestMessages

func (api *PublicAPI) RequestMessages(_ context.Context, r MessagesRequest) (hexutil.Bytes, error)

RequestMessages sends a request for historic messages to a MailServer.

func (*PublicAPI) RequestMessagesSync

func (api *PublicAPI) RequestMessagesSync(conf RetryConfig, r MessagesRequest) (MessagesResponse, error)

RequestMessagesSync repeats MessagesRequest using configuration in retry conf.

func (*PublicAPI) SendDirectMessage added in v0.15.1

func (api *PublicAPI) SendDirectMessage(ctx context.Context, msg chat.SendDirectMessageRPC) (hexutil.Bytes, error)

SendDirectMessage sends a 1:1 chat message to the underlying transport

func (*PublicAPI) SendPublicMessage added in v0.15.1

func (api *PublicAPI) SendPublicMessage(ctx context.Context, msg chat.SendPublicMessageRPC) (hexutil.Bytes, error)

SendPublicMessage sends a public chat message to the underlying transport

func (*PublicAPI) SyncMessages

SyncMessages sends a request to a given MailServerPeer to sync historic messages. MailServerPeers needs to be added as a trusted peer first.

type Range

type Range struct {
	Start uint64
	End   uint64
}

Range of the request.

type RequestsRegistry

type RequestsRegistry struct {
	// contains filtered or unexported fields
}

RequestsRegistry keeps map for all requests with timestamp when they were made.

func NewRequestsRegistry

func NewRequestsRegistry(delay time.Duration) *RequestsRegistry

NewRequestsRegistry creates instance of the RequestsRegistry and returns pointer to it.

func (*RequestsRegistry) Clear

func (r *RequestsRegistry) Clear()

Clear recreates all structures used for caching requests.

func (*RequestsRegistry) Has

func (r *RequestsRegistry) Has(uid common.Hash) bool

Has returns true if given uid is stored in registry.

func (*RequestsRegistry) Register

func (r *RequestsRegistry) Register(uid common.Hash, topics []whisper.TopicType) error

Register request with given topics. If request with same topics was made in less then configured delay then error will be returned.

func (*RequestsRegistry) Unregister

func (r *RequestsRegistry) Unregister(uid common.Hash)

Unregister removes request with given UID from registry.

type RetryConfig

type RetryConfig struct {
	BaseTimeout time.Duration
	// StepTimeout defines duration increase per each retry.
	StepTimeout time.Duration
	MaxRetries  int
}

RetryConfig specifies configuration for retries with timeout and max amount of retries.

type Service

type Service struct {
	// contains filtered or unexported fields
}

Service is a service that provides some additional Whisper API.

func New

func New(w *whisper.Whisper, handler EnvelopeEventsHandler, ldb *leveldb.DB, config params.ShhextConfig) *Service

New returns a new Service. dataDir is a folder path to a network-independent location

func (*Service) APIs

func (s *Service) APIs() []rpc.API

APIs returns a list of new APIs.

func (*Service) DisableInstallation

func (s *Service) DisableInstallation(myIdentityKey *ecdsa.PublicKey, installationID string) error

DisableInstallation disables an installation for multi-device sync.

func (*Service) EnableInstallation

func (s *Service) EnableInstallation(myIdentityKey *ecdsa.PublicKey, installationID string) error

EnableInstallation enables an installation for multi-device sync.

func (*Service) GetBundle added in v0.15.1

func (s *Service) GetBundle(myIdentityKey *ecdsa.PrivateKey) (*chat.Bundle, error)

func (*Service) GetPublicBundle

func (s *Service) GetPublicBundle(identityKey *ecdsa.PublicKey) (*chat.Bundle, error)

func (*Service) GetSymKeyID

func (s *Service) GetSymKeyID(sharedSecret []byte) string

func (*Service) InitProtocolWithEncyptionKey

func (s *Service) InitProtocolWithEncyptionKey(address string, encKey string) error

InitProtocolWithEncyptionKey creates an instance of ProtocolService given an address and encryption key.

func (*Service) InitProtocolWithPassword

func (s *Service) InitProtocolWithPassword(address string, password string) error

InitProtocolWithPassword creates an instance of ProtocolService given an address and password used to generate an encryption key.

func (*Service) ProcessPublicBundle added in v0.15.1

func (s *Service) ProcessPublicBundle(myIdentityKey *ecdsa.PrivateKey, bundle *chat.Bundle) ([]chat.IdentityAndIDPair, error)

func (*Service) Protocols

func (s *Service) Protocols() []p2p.Protocol

Protocols returns a new protocols list. In this case, there are none.

func (*Service) Start

func (s *Service) Start(server *p2p.Server) error

Start is run when a service is started. It does nothing in this case but is required by `node.Service` interface.

func (*Service) Stop

func (s *Service) Stop() error

Stop is run when a service is stopped. It does nothing in this case but is required by `node.Service` interface.

func (*Service) UpdateMailservers

func (s *Service) UpdateMailservers(nodes []*enode.Node) error

UpdateMailservers updates information about selected mail servers.

type SyncMessagesRequest

type SyncMessagesRequest struct {
	// MailServerPeer is MailServer's enode address.
	MailServerPeer string `json:"mailServerPeer"`

	// From is a lower bound of time range (optional).
	// Default is 24 hours back from now.
	From uint32 `json:"from"`

	// To is a upper bound of time range (optional).
	// Default is now.
	To uint32 `json:"to"`

	// Limit determines the number of messages sent by the mail server
	// for the current paginated request
	Limit uint32 `json:"limit"`

	// Cursor is used as starting point for paginated requests
	Cursor string `json:"cursor"`

	// Topics is a list of Whisper topics.
	// If empty, a full bloom filter will be used.
	Topics []whisper.TopicType `json:"topics"`
}

SyncMessagesRequest is a SyncMessages() request payload.

type SyncMessagesResponse

type SyncMessagesResponse struct {
	// Cursor from the response can be used to retrieve more messages
	// for the previous request.
	Cursor string `json:"cursor"`

	// Error indicates that something wrong happened when sending messages
	// to the requester.
	Error string `json:"error"`
}

SyncMessagesResponse is a response from the mail server to which SyncMessagesRequest was sent.

type TimeSource

type TimeSource func() time.Time

TimeSource is a type used for current time.

type TopicOption

type TopicOption struct {
	Topic whisper.TopicType
	Range Range
}

TopicOption request for a single topic.

type TopicOptions

type TopicOptions []TopicOption

TopicOptions is a list of topic-based requsts.

func CreateTopicOptionsFromRequest

func CreateTopicOptionsFromRequest(req db.HistoryRequest) TopicOptions

CreateTopicOptionsFromRequest transforms histories attached to a single request to a simpler format - TopicOptions.

func (TopicOptions) ToBloomFilterOption

func (options TopicOptions) ToBloomFilterOption() BloomFilterOption

ToBloomFilterOption creates bloom filter request from a list of topics.

func (TopicOptions) Topics

func (options TopicOptions) Topics() []whisper.TopicType

Topics returns list of whisper TopicType attached to each TopicOption.

type TopicRequest

type TopicRequest struct {
	Topic    whisper.TopicType
	Duration time.Duration
}

TopicRequest defines what user has to provide.

Directories

Path Synopsis
db

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL