package api import ( "encoding/json" "fmt" "time" datatransfer "github.com/filecoin-project/go-data-transfer" "github.com/filecoin-project/go-state-types/abi" "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 } 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 Stages *datatransfer.ChannelStages } // 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 } type NetBlockList struct { Peers []peer.ID IPAddrs []string IPSubnets []string } type ExtendedPeerInfo struct { ID peer.ID Agent string Addrs []string Protocols []string ConnMgrMeta *ConnMgrInfo } type ConnMgrInfo struct { FirstSeen time.Time Value int Tags map[string]int Conns map[string]time.Time }