/
conn.go
125 lines (99 loc) · 2.59 KB
/
conn.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package argente
import (
"context"
"errors"
"github.com/libp2p/go-libp2p-core/crypto"
"github.com/libp2p/go-libp2p-core/network"
"github.com/libp2p/go-libp2p-core/peer"
"github.com/libp2p/go-libp2p-core/transport"
ma "github.com/multiformats/go-multiaddr"
"github.com/lucas-clemente/quic-go"
)
var ErrNotPinArgentéMaddr = errors.New("non Pin argenté maddr passed in")
func (p *pinArgenté) Dial(ctx context.Context, raddr ma.Multiaddr, id peer.ID) (transport.CapableConn, error) {
if !p.CanDial(raddr) {
return nil, ErrNotPinArgentéMaddr
}
pub, err := id.ExtractPublicKey()
if err != nil {
return nil, err
}
if pub.Type() != crypto.Ed25519 {
return nil, ErrOnlySupportEd25519
}
pubBytes, err := pub.Raw()
if err != nil {
return nil, err
}
tlsConf, _ := p.tlsId.ConfigForPeer(id)
addr := address(pubBytes)
connScope, err := p.rcmgr.OpenConnection(network.DirOutbound, false)
if err != nil {
log.Debugw("resource manager blocked outgoing connection", "peer", p, "addr", raddr, "error", err)
return nil, err
}
if err := connScope.SetPeer(id); err != nil {
log.Debugw("resource manager blocked outgoing connection for peer", "peer", p, "addr", raddr, "error", err)
connScope.Done()
return nil, err
}
qconn, err := quic.DialContext(ctx, &p.network, addr, addr.String(), tlsConf, p.qConfig)
if err != nil {
connScope.Done()
return nil, err
}
return &conn{
t: p,
scope: connScope,
id: id,
pub: pub,
qconn: qconn,
}, nil
}
type conn struct {
t *pinArgenté
scope network.ConnManagementScope
id peer.ID
pub crypto.PubKey
qconn quic.Connection
}
func (c *conn) Transport() transport.Transport {
return c.t
}
func (c *conn) LocalMultiaddr() ma.Multiaddr {
return pinArgentéMaddr
}
func (c *conn) RemoteMultiaddr() ma.Multiaddr {
return pinArgentéMaddr
}
func (c *conn) LocalPeer() peer.ID {
return c.t.id
}
func (c *conn) LocalPrivateKey() crypto.PrivKey {
return c.t.priv
}
func (c *conn) RemotePeer() peer.ID {
return c.id
}
func (c *conn) RemotePublicKey() crypto.PubKey {
return c.pub
}
func (c *conn) Scope() network.ConnScope {
return c.scope
}
func (c *conn) Close() error {
err := c.qconn.CloseWithError(0, "")
c.scope.Done()
return err
}
func (c *conn) IsClosed() bool {
return c.qconn.Context().Err() != nil
}
func (c *conn) OpenStream(ctx context.Context) (network.MuxedStream, error) {
qstr, err := c.qconn.OpenStreamSync(ctx)
return &stream{Stream: qstr}, err
}
func (c *conn) AcceptStream() (network.MuxedStream, error) {
qstr, err := c.qconn.AcceptStream(context.Background())
return &stream{Stream: qstr}, err
}