25
25
muxers* : seq [MuxerProvider ]
26
26
streamHandler* : StreamHandler
27
27
28
- proc getMuxerByCodec (self: MuxedUpgrade , muxerName: string ): MuxerProvider =
28
+ func getMuxerByCodec (
29
+ self: MuxedUpgrade , muxerName: string ): Opt [MuxerProvider ] =
30
+ if muxerName.len == 0 or muxerName == " na" :
31
+ return Opt .none (MuxerProvider )
29
32
for m in self.muxers:
30
33
if muxerName == m.codec:
31
- return m
34
+ return Opt .some (m)
35
+ Opt .none (MuxerProvider )
32
36
33
- proc mux * (
37
+ proc mux (
34
38
self: MuxedUpgrade ,
35
- conn: Connection ): Future [Muxer ] {.async .} =
39
+ conn: Connection
40
+ ): Future [Opt [Muxer ]] {.async : (raises: [
41
+ CancelledError , LPStreamError , MultiStreamError ]).} =
36
42
# # mux connection
37
-
38
43
trace " Muxing connection" , conn
39
44
if self.muxers.len == 0 :
40
45
warn " no muxers registered, skipping upgrade flow" , conn
41
- return
42
-
43
- let muxerName =
44
- if conn.dir == Out : await self.ms.select (conn, self.muxers.mapIt (it.codec))
45
- else : await MultistreamSelect .handle (conn, self.muxers.mapIt (it.codec))
46
-
47
- if muxerName.len == 0 or muxerName == " na" :
48
- debug " no muxer available, early exit" , conn
49
- return
46
+ return Opt .none (Muxer )
47
+
48
+ let
49
+ muxerName =
50
+ case conn.dir
51
+ of Direction .Out :
52
+ await self.ms.select (conn, self.muxers.mapIt (it.codec))
53
+ of Direction .In :
54
+ await MultistreamSelect .handle (conn, self.muxers.mapIt (it.codec))
55
+ muxerProvider = self.getMuxerByCodec (muxerName).valueOr:
56
+ debug " no muxer available, early exit" , conn, muxerName
57
+ return Opt .none (Muxer )
50
58
51
59
trace " Found a muxer" , conn, muxerName
52
60
53
61
# create new muxer for connection
54
- let muxer = self. getMuxerByCodec (muxerName) .newMuxer (conn)
62
+ let muxer = muxerProvider .newMuxer (conn)
55
63
56
64
# install stream handler
57
65
muxer.streamHandler = self.streamHandler
58
66
muxer.handler = muxer.handle ()
59
- return muxer
67
+ Opt . some ( muxer)
60
68
61
69
method upgrade * (
62
70
self: MuxedUpgrade ,
63
71
conn: Connection ,
64
- peerId: Opt [PeerId ]): Future [Muxer ] {.async .} =
72
+ peerId: Opt [PeerId ]
73
+ ): Future [Muxer ] {.async : (raises: [CancelledError , LPError ]).} =
65
74
trace " Upgrading connection" , conn, direction = conn.dir
66
75
67
- let sconn = await self.secure (conn, peerId) # secure the connection
76
+ let sconn = await self.secure (conn, peerId) # secure the connection
68
77
if sconn == nil :
69
- raise newException ( UpgradeFailedError ,
78
+ raise ( ref UpgradeFailedError )(msg:
70
79
" unable to secure connection, stopping upgrade" )
71
80
72
- let muxer = await self.mux (sconn) # mux it if possible
73
- if muxer == nil :
74
- raise newException (UpgradeFailedError ,
81
+ let muxer = (await self.mux (sconn)).valueOr: # mux it if possible
82
+ raise (ref UpgradeFailedError )(msg:
75
83
" a muxer is required for outgoing connections" )
76
84
77
85
when defined (libp2p_agents_metrics):
78
86
conn.shortAgent = muxer.connection.shortAgent
79
87
80
88
if sconn.closed ():
81
89
await sconn.close ()
82
- raise newException ( UpgradeFailedError ,
90
+ raise ( ref UpgradeFailedError )(msg:
83
91
" Connection closed or missing peer info, stopping upgrade" )
84
92
85
93
trace " Upgraded connection" , conn, sconn, direction = conn.dir
86
- return muxer
94
+ muxer
87
95
88
96
proc new * (
89
97
T: type MuxedUpgrade ,
@@ -101,8 +109,6 @@ proc new*(
101
109
await upgrader.ms.handle (conn) # handle incoming connection
102
110
except CancelledError as exc:
103
111
return
104
- except CatchableError as exc:
105
- trace " exception in stream handler" , conn, msg = exc.msg
106
112
finally :
107
113
await conn.closeWithEOF ()
108
114
trace " Stream handler done" , conn
0 commit comments