2020-01-13 19:17:30 +00:00
|
|
|
package types
|
|
|
|
|
|
|
|
import (
|
2023-01-26 16:29:00 +00:00
|
|
|
"context"
|
2020-01-13 19:17:30 +00:00
|
|
|
"crypto/ecdsa"
|
2024-08-16 18:24:21 +00:00
|
|
|
"encoding/json"
|
2022-01-12 16:02:01 +00:00
|
|
|
"sync"
|
2020-01-13 19:17:30 +00:00
|
|
|
"time"
|
2021-11-26 12:30:35 +00:00
|
|
|
|
2023-02-22 21:58:17 +00:00
|
|
|
"github.com/libp2p/go-libp2p/core/peer"
|
|
|
|
"github.com/libp2p/go-libp2p/core/protocol"
|
2024-08-16 18:24:21 +00:00
|
|
|
"github.com/multiformats/go-multiaddr"
|
2022-01-12 16:02:01 +00:00
|
|
|
"github.com/pborman/uuid"
|
|
|
|
|
2021-11-26 12:30:35 +00:00
|
|
|
"github.com/ethereum/go-ethereum/common"
|
2024-08-16 18:24:21 +00:00
|
|
|
"github.com/ethereum/go-ethereum/p2p/enode"
|
2022-12-09 16:16:21 +00:00
|
|
|
"github.com/status-im/status-go/connection"
|
2020-01-13 19:17:30 +00:00
|
|
|
)
|
|
|
|
|
2022-01-12 16:02:01 +00:00
|
|
|
type ConnStatus struct {
|
2024-08-16 18:24:21 +00:00
|
|
|
IsOnline bool `json:"isOnline"`
|
|
|
|
Peers PeerStats `json:"peers"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type PeerStats map[peer.ID]WakuV2Peer
|
|
|
|
|
|
|
|
func (m PeerStats) MarshalJSON() ([]byte, error) {
|
|
|
|
tmpMap := make(map[string]WakuV2Peer)
|
|
|
|
for k, v := range m {
|
|
|
|
tmpMap[k.String()] = v
|
|
|
|
}
|
|
|
|
return json.Marshal(tmpMap)
|
2022-11-24 15:00:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type WakuV2Peer struct {
|
2024-08-16 18:24:21 +00:00
|
|
|
Protocols []protocol.ID `json:"protocols"`
|
|
|
|
Addresses []multiaddr.Multiaddr `json:"addresses"`
|
2022-01-12 16:02:01 +00:00
|
|
|
}
|
|
|
|
|
2024-07-01 15:37:54 +00:00
|
|
|
type PeerList struct {
|
2024-08-16 18:24:21 +00:00
|
|
|
FullMeshPeers peer.IDSlice `json:"fullMesh"`
|
|
|
|
AllPeers peer.IDSlice `json:"all"`
|
2024-07-01 15:37:54 +00:00
|
|
|
}
|
|
|
|
|
2022-01-12 16:02:01 +00:00
|
|
|
type ConnStatusSubscription struct {
|
|
|
|
sync.RWMutex
|
|
|
|
|
|
|
|
ID string
|
|
|
|
C chan ConnStatus
|
|
|
|
active bool
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewConnStatusSubscription() *ConnStatusSubscription {
|
|
|
|
return &ConnStatusSubscription{
|
|
|
|
ID: uuid.NewRandom().String(),
|
|
|
|
C: make(chan ConnStatus, 100),
|
|
|
|
active: true,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (u *ConnStatusSubscription) Active() bool {
|
|
|
|
u.RLock()
|
|
|
|
defer u.RUnlock()
|
|
|
|
return u.active
|
|
|
|
}
|
|
|
|
|
|
|
|
func (u *ConnStatusSubscription) Unsubscribe() {
|
|
|
|
u.Lock()
|
|
|
|
defer u.Unlock()
|
|
|
|
close(u.C)
|
|
|
|
u.active = false
|
|
|
|
}
|
|
|
|
|
2024-02-19 23:44:38 +00:00
|
|
|
func (u *ConnStatusSubscription) Send(s ConnStatus) bool {
|
|
|
|
u.RLock()
|
|
|
|
defer u.RUnlock()
|
|
|
|
if !u.active {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
u.C <- s
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2022-02-10 15:15:27 +00:00
|
|
|
type WakuKeyManager interface {
|
|
|
|
// GetPrivateKey retrieves the private key of the specified identity.
|
|
|
|
GetPrivateKey(id string) (*ecdsa.PrivateKey, error)
|
|
|
|
// AddKeyPair imports a asymmetric private key and returns a deterministic identifier.
|
|
|
|
AddKeyPair(key *ecdsa.PrivateKey) (string, error)
|
|
|
|
// DeleteKeyPair deletes the key with the specified ID if it exists.
|
|
|
|
DeleteKeyPair(keyID string) bool
|
|
|
|
// DeleteKeyPairs deletes all the keys
|
|
|
|
DeleteKeyPairs() error
|
|
|
|
AddSymKeyDirect(key []byte) (string, error)
|
|
|
|
AddSymKeyFromPassword(password string) (string, error)
|
|
|
|
DeleteSymKey(id string) bool
|
|
|
|
GetSymKey(id string) ([]byte, error)
|
|
|
|
}
|
|
|
|
|
2020-01-13 19:17:30 +00:00
|
|
|
// Whisper represents a dark communication interface through the Ethereum
|
|
|
|
// network, using its very own P2P communication layer.
|
|
|
|
type Waku interface {
|
|
|
|
PublicWakuAPI() PublicWakuAPI
|
|
|
|
|
2021-07-21 19:02:50 +00:00
|
|
|
// Waku protocol version
|
|
|
|
Version() uint
|
|
|
|
|
2021-08-30 14:57:28 +00:00
|
|
|
// PeerCount
|
|
|
|
PeerCount() int
|
|
|
|
|
2024-08-16 18:24:21 +00:00
|
|
|
ListenAddresses() ([]multiaddr.Multiaddr, error)
|
2022-11-24 21:27:46 +00:00
|
|
|
|
2024-07-01 15:37:54 +00:00
|
|
|
RelayPeersByTopic(topic string) (*PeerList, error)
|
|
|
|
|
2024-08-16 18:24:21 +00:00
|
|
|
ENR() (*enode.Node, error)
|
2024-06-18 19:48:49 +00:00
|
|
|
|
2024-08-16 18:24:21 +00:00
|
|
|
Peers() PeerStats
|
2021-08-30 14:57:28 +00:00
|
|
|
|
2021-11-22 13:40:14 +00:00
|
|
|
StartDiscV5() error
|
|
|
|
|
|
|
|
StopDiscV5() error
|
|
|
|
|
2023-05-22 21:38:02 +00:00
|
|
|
SubscribeToPubsubTopic(topic string, optPublicKey *ecdsa.PublicKey) error
|
|
|
|
|
2024-01-30 17:56:59 +00:00
|
|
|
UnsubscribeFromPubsubTopic(topic string) error
|
|
|
|
|
2023-05-22 21:38:02 +00:00
|
|
|
StorePubsubTopicKey(topic string, privKey *ecdsa.PrivateKey) error
|
|
|
|
|
2023-10-12 19:21:49 +00:00
|
|
|
RetrievePubsubTopicKey(topic string) (*ecdsa.PrivateKey, error)
|
|
|
|
|
2024-01-30 17:56:59 +00:00
|
|
|
RemovePubsubTopicKey(topic string) error
|
|
|
|
|
2024-08-16 18:24:21 +00:00
|
|
|
AddStorePeer(address multiaddr.Multiaddr) (peer.ID, error)
|
2021-08-30 14:57:28 +00:00
|
|
|
|
2024-08-16 18:24:21 +00:00
|
|
|
AddRelayPeer(address multiaddr.Multiaddr) (peer.ID, error)
|
2021-09-10 17:06:06 +00:00
|
|
|
|
2024-08-16 18:24:21 +00:00
|
|
|
DialPeer(address multiaddr.Multiaddr) error
|
2021-09-10 17:06:06 +00:00
|
|
|
|
2024-08-16 18:24:21 +00:00
|
|
|
DialPeerByID(peerID peer.ID) error
|
2021-08-30 14:57:28 +00:00
|
|
|
|
2024-08-16 18:24:21 +00:00
|
|
|
DropPeer(peerID peer.ID) error
|
2021-08-30 14:57:28 +00:00
|
|
|
|
2022-01-12 16:02:01 +00:00
|
|
|
SubscribeToConnStatusChanges() (*ConnStatusSubscription, error)
|
|
|
|
|
2024-06-26 18:25:44 +00:00
|
|
|
SetCriteriaForMissingMessageVerification(peerID peer.ID, pubsubTopic string, contentTopics []string) error
|
|
|
|
|
2020-01-13 19:17:30 +00:00
|
|
|
// MinPow returns the PoW value required by this node.
|
|
|
|
MinPow() float64
|
|
|
|
// BloomFilter returns the aggregated bloom filter for all the topics of interest.
|
|
|
|
// The nodes are required to send only messages that match the advertised bloom filter.
|
|
|
|
// If a message does not match the bloom, it will tantamount to spam, and the peer will
|
|
|
|
// be disconnected.
|
|
|
|
BloomFilter() []byte
|
2023-03-24 12:05:42 +00:00
|
|
|
|
2020-01-13 19:17:30 +00:00
|
|
|
// GetCurrentTime returns current time.
|
|
|
|
GetCurrentTime() time.Time
|
|
|
|
|
|
|
|
// GetPrivateKey retrieves the private key of the specified identity.
|
|
|
|
GetPrivateKey(id string) (*ecdsa.PrivateKey, error)
|
|
|
|
|
|
|
|
SubscribeEnvelopeEvents(events chan<- EnvelopeEvent) Subscription
|
|
|
|
|
|
|
|
// AddKeyPair imports a asymmetric private key and returns a deterministic identifier.
|
|
|
|
AddKeyPair(key *ecdsa.PrivateKey) (string, error)
|
|
|
|
// DeleteKeyPair deletes the key with the specified ID if it exists.
|
|
|
|
DeleteKeyPair(keyID string) bool
|
|
|
|
AddSymKeyDirect(key []byte) (string, error)
|
|
|
|
AddSymKeyFromPassword(password string) (string, error)
|
|
|
|
DeleteSymKey(id string) bool
|
|
|
|
GetSymKey(id string) ([]byte, error)
|
2020-11-03 12:42:42 +00:00
|
|
|
MaxMessageSize() uint32
|
2020-01-13 19:17:30 +00:00
|
|
|
|
2021-08-03 19:27:15 +00:00
|
|
|
GetStats() StatsSummary
|
|
|
|
|
2020-01-13 19:17:30 +00:00
|
|
|
Subscribe(opts *SubscriptionOptions) (string, error)
|
|
|
|
GetFilter(id string) Filter
|
2023-07-14 13:42:02 +00:00
|
|
|
Unsubscribe(ctx context.Context, id string) error
|
2021-01-14 22:15:13 +00:00
|
|
|
UnsubscribeMany(ids []string) error
|
2020-01-13 19:17:30 +00:00
|
|
|
|
|
|
|
// RequestHistoricMessages sends a message with p2pRequestCode to a specific peer,
|
|
|
|
// which is known to implement MailServer interface, and is supposed to process this
|
|
|
|
// request and respond with a number of peer-to-peer messages (possibly expired),
|
|
|
|
// which are not supposed to be forwarded any further.
|
|
|
|
// The whisper protocol is agnostic of the format and contents of envelope.
|
|
|
|
// A timeout of 0 never expires.
|
|
|
|
RequestHistoricMessagesWithTimeout(peerID []byte, envelope Envelope, timeout time.Duration) error
|
|
|
|
// SendMessagesRequest sends a MessagesRequest. This is an equivalent to RequestHistoricMessages
|
|
|
|
// in terms of the functionality.
|
|
|
|
SendMessagesRequest(peerID []byte, request MessagesRequest) error
|
2021-06-16 20:19:45 +00:00
|
|
|
|
|
|
|
// RequestStoreMessages uses the WAKU2-STORE protocol to request historic messages
|
2024-07-30 18:28:27 +00:00
|
|
|
RequestStoreMessages(ctx context.Context, peerID []byte, request MessagesRequest, processEnvelopes bool) (StoreRequestCursor, int, error)
|
2021-11-26 12:30:35 +00:00
|
|
|
|
|
|
|
// ProcessingP2PMessages indicates whether there are in-flight p2p messages
|
|
|
|
ProcessingP2PMessages() bool
|
|
|
|
|
|
|
|
// MarkP2PMessageAsProcessed tells the waku layer that a P2P message has been processed
|
|
|
|
MarkP2PMessageAsProcessed(common.Hash)
|
2022-12-09 16:16:21 +00:00
|
|
|
|
|
|
|
// ConnectionChanged is called whenever the client knows its connection status has changed
|
|
|
|
ConnectionChanged(connection.State)
|
2024-01-30 13:43:34 +00:00
|
|
|
|
|
|
|
// ClearEnvelopesCache clears waku envelopes cache
|
|
|
|
ClearEnvelopesCache()
|
2024-06-11 07:45:01 +00:00
|
|
|
|
|
|
|
// ConfirmMessageDelivered updates a message has been delivered in waku
|
|
|
|
ConfirmMessageDelivered(hash []common.Hash)
|
|
|
|
|
|
|
|
// SetStorePeerID updates the peer id of store node
|
|
|
|
SetStorePeerID(peerID peer.ID)
|
2024-08-01 03:27:43 +00:00
|
|
|
|
|
|
|
// PeerID returns node's PeerID
|
|
|
|
PeerID() peer.ID
|
2020-01-13 19:17:30 +00:00
|
|
|
}
|