77 lines
1.8 KiB
Go
77 lines
1.8 KiB
Go
|
package wakuv2ext
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
|
||
|
"github.com/libp2p/go-libp2p-core/peer"
|
||
|
"github.com/status-im/go-waku/waku/v2/protocol"
|
||
|
"github.com/status-im/go-waku/waku/v2/protocol/pb"
|
||
|
"github.com/status-im/go-waku/waku/v2/protocol/store"
|
||
|
|
||
|
"github.com/ethereum/go-ethereum/log"
|
||
|
"github.com/status-im/status-go/eth-node/types"
|
||
|
"github.com/status-im/status-go/services/ext"
|
||
|
)
|
||
|
|
||
|
// PublicAPI extends waku public API.
|
||
|
type PublicAPI struct {
|
||
|
*ext.PublicAPI
|
||
|
service *Service
|
||
|
publicAPI types.PublicWakuAPI
|
||
|
log log.Logger
|
||
|
}
|
||
|
|
||
|
// NewPublicAPI returns instance of the public API.
|
||
|
func NewPublicAPI(s *Service) *PublicAPI {
|
||
|
return &PublicAPI{
|
||
|
PublicAPI: ext.NewPublicAPI(s.Service, s.w),
|
||
|
service: s,
|
||
|
publicAPI: s.w.PublicWakuAPI(),
|
||
|
log: log.New("package", "status-go/services/wakuext.PublicAPI"),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// RequestMessages sends a request for historic messages to a MailServer.
|
||
|
func (api *PublicAPI) RequestMessages(_ context.Context, r ext.StoreRequest) (types.HexBytes, error) {
|
||
|
api.log.Info("RequestMessages", "request", r)
|
||
|
|
||
|
now := api.service.w.GetCurrentTime()
|
||
|
r.SetDefaults(now)
|
||
|
|
||
|
if r.From > r.To {
|
||
|
return nil, fmt.Errorf("Query range is invalid: from > to (%d > %d)", r.From, r.To)
|
||
|
}
|
||
|
|
||
|
h := protocol.GenerateRequestId()
|
||
|
|
||
|
mailserver, err := peer.Decode(r.MailServerPeer)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
options := []store.HistoryRequestOption{
|
||
|
store.WithRequestId(h),
|
||
|
store.WithPeer(mailserver),
|
||
|
store.WithPaging(r.Asc, r.PageSize),
|
||
|
}
|
||
|
|
||
|
// TODO: timeout
|
||
|
|
||
|
if r.Cursor != nil {
|
||
|
options = append(options, store.WithCursor(&pb.Index{
|
||
|
Digest: r.Cursor.Digest,
|
||
|
ReceivedTime: r.Cursor.ReceivedTime,
|
||
|
}))
|
||
|
}
|
||
|
|
||
|
var hash types.Hash
|
||
|
copy(hash[:], h[:types.HashLength])
|
||
|
|
||
|
if err := api.service.w.RequestStoreMessages(r.Topics, r.From, r.To, options); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return hash[:], nil
|
||
|
}
|