feat(cli): add a list retrievals command
Currently, there is no way to inspect retrievals on a client. This adds said command, allow with corresponding APIs
This commit is contained in:
@@ -6,6 +6,7 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"sort"
|
||||
"time"
|
||||
|
||||
"github.com/filecoin-project/lotus/chain/actors/builtin/miner"
|
||||
@@ -835,6 +836,83 @@ func (a *API) clientRetrieve(ctx context.Context, order api.RetrievalOrder, ref
|
||||
return
|
||||
}
|
||||
|
||||
func (a *API) ClientListRetrievals(ctx context.Context) ([]api.RetrievalInfo, error) {
|
||||
deals, err := a.Retrieval.ListDeals()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
dataTransfersByID, err := a.transfersByID(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out := make([]api.RetrievalInfo, 0, len(deals))
|
||||
for _, v := range deals {
|
||||
// Find the data transfer associated with this deal
|
||||
var transferCh *api.DataTransferChannel
|
||||
if v.ChannelID != nil {
|
||||
if ch, ok := dataTransfersByID[*v.ChannelID]; ok {
|
||||
transferCh = &ch
|
||||
}
|
||||
}
|
||||
out = append(out, a.newRetrievalInfoWithTransfer(transferCh, v))
|
||||
}
|
||||
sort.Slice(out, func(a, b int) bool {
|
||||
return out[a].ID < out[b].ID
|
||||
})
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (a *API) ClientGetRetrievalUpdates(ctx context.Context) (<-chan api.RetrievalInfo, error) {
|
||||
updates := make(chan api.RetrievalInfo)
|
||||
|
||||
unsub := a.Retrieval.SubscribeToEvents(func(_ rm.ClientEvent, deal rm.ClientDealState) {
|
||||
updates <- a.newRetrievalInfo(ctx, deal)
|
||||
})
|
||||
|
||||
go func() {
|
||||
defer unsub()
|
||||
<-ctx.Done()
|
||||
}()
|
||||
|
||||
return updates, nil
|
||||
}
|
||||
|
||||
func (a *API) newRetrievalInfoWithTransfer(ch *api.DataTransferChannel, deal rm.ClientDealState) api.RetrievalInfo {
|
||||
return api.RetrievalInfo{
|
||||
PayloadCID: deal.PayloadCID,
|
||||
ID: deal.ID,
|
||||
PieceCID: deal.PieceCID,
|
||||
PricePerByte: deal.PricePerByte,
|
||||
UnsealPrice: deal.UnsealPrice,
|
||||
Status: deal.Status,
|
||||
Message: deal.Message,
|
||||
Provider: deal.Sender,
|
||||
BytesReceived: deal.TotalReceived,
|
||||
BytesPaidFor: deal.BytesPaidFor,
|
||||
TotalPaid: deal.FundsSpent,
|
||||
TransferChannelID: deal.ChannelID,
|
||||
DataTransfer: ch,
|
||||
}
|
||||
}
|
||||
|
||||
func (a *API) newRetrievalInfo(ctx context.Context, v rm.ClientDealState) api.RetrievalInfo {
|
||||
// Find the data transfer associated with this deal
|
||||
var transferCh *api.DataTransferChannel
|
||||
if v.ChannelID != nil {
|
||||
state, err := a.DataTransfer.ChannelState(ctx, *v.ChannelID)
|
||||
|
||||
// Note: If there was an error just ignore it, as the data transfer may
|
||||
// be not found if it's no longer active
|
||||
if err == nil {
|
||||
ch := api.NewDataTransferChannel(a.Host.ID(), state)
|
||||
ch.Stages = state.Stages()
|
||||
transferCh = &ch
|
||||
}
|
||||
}
|
||||
|
||||
return a.newRetrievalInfoWithTransfer(transferCh, v)
|
||||
}
|
||||
|
||||
type multiStoreRetrievalStore struct {
|
||||
storeID multistore.StoreID
|
||||
store *multistore.Store
|
||||
|
||||
Reference in New Issue
Block a user