mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-27 15:16:43 +00:00
pss is now separate package pss event feed removed, multipile handlers allowed instead NOTE! pss tests are removed and will be rewritten remove pssclient outbox, psscache bug fix WIP tests reinstation
76 lines
1.9 KiB
Go
76 lines
1.9 KiB
Go
package pss
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/ethereum/go-ethereum/log"
|
|
"github.com/ethereum/go-ethereum/p2p"
|
|
"github.com/ethereum/go-ethereum/rpc"
|
|
)
|
|
|
|
// PssAPI is the RPC API module for Pss
|
|
type PssAPI struct {
|
|
*Pss
|
|
}
|
|
|
|
// NewPssAPI constructs a PssAPI instance
|
|
func NewPssAPI(ps *Pss) *PssAPI {
|
|
return &PssAPI{Pss: ps}
|
|
}
|
|
|
|
// PssAPIMsg is the type for messages, it extends the rlp encoded protocol Msg
|
|
// with the Sender's overlay address
|
|
type PssAPIMsg struct {
|
|
Msg []byte
|
|
Addr []byte
|
|
}
|
|
|
|
// NewMsg API endpoint creates an RPC subscription
|
|
func (pssapi *PssAPI) NewMsg(ctx context.Context, topic PssTopic) (*rpc.Subscription, error) {
|
|
notifier, supported := rpc.NotifierFromContext(ctx)
|
|
if !supported {
|
|
return nil, fmt.Errorf("Subscribe not supported")
|
|
}
|
|
|
|
psssub := notifier.CreateSubscription()
|
|
handler := func(msg []byte, p *p2p.Peer, from []byte) error {
|
|
apimsg := &PssAPIMsg{
|
|
Msg: msg,
|
|
Addr: from,
|
|
}
|
|
if err := notifier.Notify(psssub.ID, apimsg); err != nil {
|
|
log.Warn(fmt.Sprintf("notification on pss sub topic %v rpc (sub %v) msg %v failed!", topic, psssub.ID, msg))
|
|
}
|
|
return nil
|
|
}
|
|
deregf := pssapi.Pss.Register(topic, handler)
|
|
|
|
go func() {
|
|
defer deregf()
|
|
//defer psssub.Unsubscribe()
|
|
select {
|
|
case err := <-psssub.Err():
|
|
log.Warn(fmt.Sprintf("caught subscription error in pss sub topic: %v", topic, err))
|
|
case <-notifier.Closed():
|
|
log.Warn(fmt.Sprintf("rpc sub notifier closed"))
|
|
}
|
|
}()
|
|
|
|
return psssub, nil
|
|
}
|
|
|
|
// SendRaw sends the message (serialised into byte slice) to a peer with topic
|
|
func (pssapi *PssAPI) SendRaw(topic PssTopic, msg PssAPIMsg) error {
|
|
err := pssapi.Pss.Send(msg.Addr, topic, msg.Msg)
|
|
if err != nil {
|
|
return fmt.Errorf("send error: %v", err)
|
|
}
|
|
return fmt.Errorf("ok sent")
|
|
}
|
|
|
|
// BaseAddr gets our own overlayaddress
|
|
func (pssapi *PssAPI) BaseAddr() ([]byte, error) {
|
|
log.Warn("inside baseaddr")
|
|
return pssapi.Pss.Overlay.BaseAddr(), nil
|
|
}
|