mirror of
https://source.quilibrium.com/quilibrium/ceremonyclient.git
synced 2024-11-16 05:05:17 +00:00
83 lines
2.1 KiB
Go
83 lines
2.1 KiB
Go
|
package libp2pwebtransport
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
|
||
|
"github.com/libp2p/go-libp2p/core/network"
|
||
|
tpt "github.com/libp2p/go-libp2p/core/transport"
|
||
|
|
||
|
ma "github.com/multiformats/go-multiaddr"
|
||
|
"github.com/quic-go/webtransport-go"
|
||
|
)
|
||
|
|
||
|
type connSecurityMultiaddrs struct {
|
||
|
network.ConnSecurity
|
||
|
network.ConnMultiaddrs
|
||
|
}
|
||
|
|
||
|
type connMultiaddrs struct {
|
||
|
local, remote ma.Multiaddr
|
||
|
}
|
||
|
|
||
|
var _ network.ConnMultiaddrs = &connMultiaddrs{}
|
||
|
|
||
|
func (c *connMultiaddrs) LocalMultiaddr() ma.Multiaddr { return c.local }
|
||
|
func (c *connMultiaddrs) RemoteMultiaddr() ma.Multiaddr { return c.remote }
|
||
|
|
||
|
type conn struct {
|
||
|
*connSecurityMultiaddrs
|
||
|
|
||
|
transport *transport
|
||
|
session *webtransport.Session
|
||
|
|
||
|
scope network.ConnManagementScope
|
||
|
}
|
||
|
|
||
|
var _ tpt.CapableConn = &conn{}
|
||
|
|
||
|
func newConn(tr *transport, sess *webtransport.Session, sconn *connSecurityMultiaddrs, scope network.ConnManagementScope) *conn {
|
||
|
return &conn{
|
||
|
connSecurityMultiaddrs: sconn,
|
||
|
transport: tr,
|
||
|
session: sess,
|
||
|
scope: scope,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (c *conn) OpenStream(ctx context.Context) (network.MuxedStream, error) {
|
||
|
str, err := c.session.OpenStreamSync(ctx)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
return &stream{str}, nil
|
||
|
}
|
||
|
|
||
|
func (c *conn) AcceptStream() (network.MuxedStream, error) {
|
||
|
str, err := c.session.AcceptStream(context.Background())
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
return &stream{str}, nil
|
||
|
}
|
||
|
|
||
|
func (c *conn) allowWindowIncrease(size uint64) bool {
|
||
|
return c.scope.ReserveMemory(int(size), network.ReservationPriorityMedium) == nil
|
||
|
}
|
||
|
|
||
|
// Close closes the connection.
|
||
|
// It must be called even if the peer closed the connection in order for
|
||
|
// garbage collection to properly work in this package.
|
||
|
func (c *conn) Close() error {
|
||
|
c.scope.Done()
|
||
|
c.transport.removeConn(c.session)
|
||
|
return c.session.CloseWithError(0, "")
|
||
|
}
|
||
|
|
||
|
func (c *conn) IsClosed() bool { return c.session.Context().Err() != nil }
|
||
|
func (c *conn) Scope() network.ConnScope { return c.scope }
|
||
|
func (c *conn) Transport() tpt.Transport { return c.transport }
|
||
|
|
||
|
func (c *conn) ConnState() network.ConnectionState {
|
||
|
return network.ConnectionState{Transport: "webtransport"}
|
||
|
}
|