Skip to content

Commit 0590184

Browse files
authored
chore(relay): utilize protobuf_serialization (#2616)
1 parent 7d1e75e commit 0590184

6 files changed

Lines changed: 161 additions & 366 deletions

File tree

libp2p/protocols/connectivity/relay/client.nim

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,9 @@ proc sendStopError(
4545
) {.async: (raises: [CancelledError]).} =
4646
trace "send stop status", status = $code & " (" & $ord(code) & ")"
4747
try:
48-
let msg = StopMessage(msgType: StopMessageType.Status, status: Opt.some(code))
49-
await stream.writeLp(encode(msg).buffer)
48+
let msg =
49+
StopMessage(msgType: Opt.some(StopMessageType.Status), status: Opt.some(code))
50+
await stream.writeLp(encode(msg))
5051
except CancelledError as e:
5152
raise e
5253
except LPStreamError as e:
@@ -61,18 +62,17 @@ proc handleRelayedConnect(
6162
src = msg.peer.valueOr:
6263
await sendStopError(stream, MalformedMessage)
6364
return
64-
limitDuration = msg.limit.duration
65-
limitData = msg.limit.data
66-
msg = StopMessage(msgType: StopMessageType.Status, status: Opt.some(Ok))
67-
pb = encode(msg)
65+
limitDuration = msg.limit.get(Limit()).duration
66+
limitData = msg.limit.get(Limit()).data
67+
msg = StopMessage(msgType: Opt.some(StopMessageType.Status), status: Opt.some(Ok))
6868

6969
trace "incoming relay connection", src
7070

7171
if cl.onNewConnection == nil:
7272
await sendStopError(stream, StatusV2.ConnectionFailed)
7373
await stream.close()
7474
return
75-
await stream.writeLp(pb.buffer)
75+
await stream.writeLp(encode(msg))
7676
# This sound redundant but the callback could, in theory, be set to nil during
7777
# stream.writeLp so it's safer to double check
7878
if cl.onNewConnection != nil:
@@ -87,29 +87,31 @@ proc reserve*(
8787
defer:
8888
await stream.close()
8989
let
90-
pb = encode(HopMessage(msgType: HopMessageType.Reserve))
90+
pb = encode(HopMessage(msgType: Opt.some(HopMessageType.Reserve)))
9191
msg =
9292
try:
93-
await stream.writeLp(pb.buffer)
93+
await stream.writeLp(pb)
9494
HopMessage.decode(await stream.readLp(RelayClientMsgSize)).tryGet()
9595
except CancelledError as exc:
9696
raise exc
9797
except CatchableError as exc:
9898
trace "error writing or reading reservation message", description = exc.msg
9999
raise newException(ReservationError, exc.msg)
100100

101-
if msg.msgType != HopMessageType.Status:
101+
if msg.msgType.isNone or msg.msgType.get() != HopMessageType.Status:
102102
raise newException(ReservationError, "Unexpected relay response type")
103103
if msg.status.get(UnexpectedMessage) != Ok:
104104
raise newException(ReservationError, "Reservation failed")
105105

106106
let reservation = msg.reservation.valueOr:
107107
raise newException(ReservationError, "Missing reservation information")
108-
if reservation.expire > int64.high().uint64 or
109-
now().utc > reservation.expire.int64.fromUnix.utc:
108+
let expire = reservation.expire.valueOr:
109+
raise newException(ReservationError, "Missing expire")
110+
111+
if expire > int64.high().uint64 or now().utc > expire.int64.fromUnix.utc:
110112
raise newException(ReservationError, "Bad expiration date")
111113
var rsvp: Rsvp
112-
rsvp.expire = reservation.expire
114+
rsvp.expire = expire
113115
rsvp.addrs = reservation.addrs
114116

115117
reservation.svoucher.withValue(sv):
@@ -119,27 +121,25 @@ proc reserve*(
119121
raise newException(ReservationError, "Invalid voucher PeerId")
120122
rsvp.voucher = Opt.some(svoucher.data)
121123

122-
rsvp.limitDuration = msg.limit.duration
123-
rsvp.limitData = msg.limit.data
124+
rsvp.limitDuration = msg.limit.get(Limit()).duration
125+
rsvp.limitData = msg.limit.get(Limit()).data
124126
rsvp
125127

126128
proc dialPeerV1*(
127129
cl: RelayClient, stream: Stream, dstPeerId: PeerId, dstAddrs: seq[MultiAddress]
128130
): Future[RawConn] {.async: (raises: [CancelledError, RelayV1DialError]).} =
129-
var
130-
msg = RelayMessage(
131-
msgType: Opt.some(RelayType.Hop),
132-
srcPeer: Opt.some(
133-
RelayPeer(peerId: cl.switch.peerInfo.peerId, addrs: cl.switch.peerInfo.addrs)
134-
),
135-
dstPeer: Opt.some(RelayPeer(peerId: dstPeerId, addrs: dstAddrs)),
136-
)
137-
pb = encode(msg)
131+
var msg = RelayMessage(
132+
msgType: Opt.some(RelayType.Hop),
133+
srcPeer: Opt.some(
134+
RelayPeer(peerId: cl.switch.peerInfo.peerId, addrs: cl.switch.peerInfo.addrs)
135+
),
136+
dstPeer: Opt.some(RelayPeer(peerId: dstPeerId, addrs: dstAddrs)),
137+
)
138138

139139
trace "Dial peer", msgSend = msg
140140

141141
try:
142-
await stream.writeLp(pb.buffer)
142+
await stream.writeLp(encode(msg))
143143
except CancelledError as exc:
144144
raise exc
145145
except LPStreamError as exc:
@@ -188,15 +188,15 @@ proc dialPeerV2*(
188188
dstPeerId: PeerId,
189189
dstAddrs: seq[MultiAddress],
190190
): Future[RawConn] {.async: (raises: [RelayV2DialError, CancelledError]).} =
191-
let
192-
p = Peer(peerId: dstPeerId, addrs: dstAddrs)
193-
pb = encode(HopMessage(msgType: HopMessageType.Connect, peer: Opt.some(p)))
191+
let p = Peer(peerId: Opt.some(dstPeerId), addrs: dstAddrs)
194192

195193
trace "Dial peer", p
196194

197195
let msgRcvFromRelay =
198196
try:
199-
await relayConn.writeLp(pb.buffer)
197+
await relayConn.writeLp(
198+
encode(HopMessage(msgType: Opt.some(HopMessageType.Connect), peer: Opt.some(p)))
199+
)
200200
HopMessage.decode(await relayConn.readLp(RelayClientMsgSize)).tryGet()
201201
except CancelledError as exc:
202202
raise exc
@@ -205,13 +205,14 @@ proc dialPeerV2*(
205205
raise
206206
newException(RelayV2DialError, "Exception decoding HopMessage: " & exc.msg, exc)
207207

208-
if msgRcvFromRelay.msgType != HopMessageType.Status:
208+
if msgRcvFromRelay.msgType.isNone or
209+
msgRcvFromRelay.msgType != Opt.some(HopMessageType.Status):
209210
raise newException(RelayV2DialError, "Unexpected stop response")
210211
if msgRcvFromRelay.status.get(UnexpectedMessage) != Ok:
211212
trace "Relay stop failed", description = msgRcvFromRelay.status
212213
raise newException(RelayV2DialError, "Relay stop failure")
213-
relayConn.limitDuration = msgRcvFromRelay.limit.duration
214-
relayConn.limitData = msgRcvFromRelay.limit.data
214+
relayConn.limitDuration = msgRcvFromRelay.limit.get(Limit()).duration
215+
relayConn.limitData = msgRcvFromRelay.limit.get(Limit()).data
215216
return relayConn
216217

217218
proc handleStopStreamV2(
@@ -222,7 +223,7 @@ proc handleStopStreamV2(
222223
return
223224
trace "client circuit relay v2 handle stream", msg
224225

225-
if msg.msgType == StopMessageType.Connect:
226+
if msg.msgType.isSome and msg.msgType.get() == StopMessageType.Connect:
226227
await cl.handleRelayedConnect(stream, msg)
227228
else:
228229
trace "Unexpected client / relayv2 handshake", msgType = msg.msgType

0 commit comments

Comments
 (0)