package api import ( "encoding/json" "fmt" datatransfer "github.com/filecoin-project/go-data-transfer" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/build" "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/peer" pubsub "github.com/libp2p/go-libp2p-pubsub" ma "github.com/multiformats/go-multiaddr" ) // TODO: check if this exists anywhere else type MultiaddrSlice []ma.Multiaddr func (m *MultiaddrSlice) UnmarshalJSON(raw []byte) (err error) { var temp []string if err := json.Unmarshal(raw, &temp); err != nil { return err } res := make([]ma.Multiaddr, len(temp)) for i, str := range temp { res[i], err = ma.NewMultiaddr(str) if err != nil { return err } } *m = res return nil } var _ json.Unmarshaler = new(MultiaddrSlice) type ObjStat struct { Size uint64 Links uint64 } type PubsubScore struct { ID peer.ID Score *pubsub.PeerScoreSnapshot } type MessageSendSpec struct { MaxFee abi.TokenAmount } var DefaultMessageSendSpec = MessageSendSpec{ // MaxFee of 0.1FIL MaxFee: abi.NewTokenAmount(int64(build.FilecoinPrecision) / 10), } func (ms *MessageSendSpec) Get() MessageSendSpec { if ms == nil { return DefaultMessageSendSpec } return *ms } type DataTransferChannel struct { TransferID datatransfer.TransferID Status datatransfer.Status BaseCID cid.Cid IsInitiator bool IsSender bool Voucher string Message string OtherPeer peer.ID Transferred uint64 } // NewDataTransferChannel constructs an API DataTransferChannel type from full channel state snapshot and a host id func NewDataTransferChannel(hostID peer.ID, channelState datatransfer.ChannelState) DataTransferChannel { channel := DataTransferChannel{ TransferID: channelState.TransferID(), Status: channelState.Status(), BaseCID: channelState.BaseCID(), IsSender: channelState.Sender() == hostID, Message: channelState.Message(), } stringer, ok := channelState.Voucher().(fmt.Stringer) if ok { channel.Voucher = stringer.String() } else { voucherJSON, err := json.Marshal(channelState.Voucher()) if err != nil { channel.Voucher = fmt.Errorf("Voucher Serialization: %w", err).Error() } else { channel.Voucher = string(voucherJSON) } } if channel.IsSender { channel.IsInitiator = !channelState.IsPull() channel.Transferred = channelState.Sent() channel.OtherPeer = channelState.Recipient() } else { channel.IsInitiator = channelState.IsPull() channel.Transferred = channelState.Received() channel.OtherPeer = channelState.Sender() } return channel }