update website

This commit is contained in:
vladopajic 2025-02-25 21:35:31 +00:00
parent 707537e714
commit 45a97168e3
15 changed files with 300 additions and 260 deletions

View File

@ -26,15 +26,18 @@ proc main() {.async.} =
let customProtoCodec = "/test" let customProtoCodec = "/test"
var proto = new LPProtocol var proto = new LPProtocol
proto.codec = customProtoCodec proto.codec = customProtoCodec
proto.handler = proc(conn: Connection, proto: string) {.async.} = proto.handler = proc(conn: Connection, proto: string) {.async: (raises: []).} =
var msg = string.fromBytes(await conn.readLp(1024)) try:
echo "1 - Dst Received: ", msg var msg = string.fromBytes(await conn.readLp(1024))
assert "test1" == msg echo "1 - Dst Received: ", msg
await conn.writeLp("test2") assert "test1" == msg
msg = string.fromBytes(await conn.readLp(1024)) await conn.writeLp("test2")
echo "2 - Dst Received: ", msg msg = string.fromBytes(await conn.readLp(1024))
assert "test3" == msg echo "2 - Dst Received: ", msg
await conn.writeLp("test4") assert "test3" == msg
await conn.writeLp("test4")
except:
echo "exception in handler", getCurrentException().msg
let let
relay = Relay.new() relay = Relay.new()

View File

@ -553,64 +553,67 @@ directly, but can reach it through another node (the Relay).</p>
<a id="__codelineno-0-18" name="__codelineno-0-18" href="#__codelineno-0-18"></a><span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="n">customProtoCodec</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;/test&quot;</span> <a id="__codelineno-0-18" name="__codelineno-0-18" href="#__codelineno-0-18"></a><span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="n">customProtoCodec</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;/test&quot;</span>
<a id="__codelineno-0-19" name="__codelineno-0-19" href="#__codelineno-0-19"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="n">proto</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">new</span><span class="w"> </span><span class="n">LPProtocol</span> <a id="__codelineno-0-19" name="__codelineno-0-19" href="#__codelineno-0-19"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="n">proto</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">new</span><span class="w"> </span><span class="n">LPProtocol</span>
<a id="__codelineno-0-20" name="__codelineno-0-20" href="#__codelineno-0-20"></a><span class="w"> </span><span class="n">proto</span><span class="p">.</span><span class="n">codec</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">customProtoCodec</span> <a id="__codelineno-0-20" name="__codelineno-0-20" href="#__codelineno-0-20"></a><span class="w"> </span><span class="n">proto</span><span class="p">.</span><span class="n">codec</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">customProtoCodec</span>
<a id="__codelineno-0-21" name="__codelineno-0-21" href="#__codelineno-0-21"></a><span class="w"> </span><span class="n">proto</span><span class="p">.</span><span class="n">handler</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">proc</span><span class="p">(</span><span class="n">conn</span><span class="p">:</span><span class="w"> </span><span class="n">Connection</span><span class="p">,</span><span class="w"> </span><span class="n">proto</span><span class="p">:</span><span class="w"> </span><span class="nb">string</span><span class="p">)</span><span class="w"> </span><span class="sx">{.async.}</span><span class="w"> </span><span class="o">=</span> <a id="__codelineno-0-21" name="__codelineno-0-21" href="#__codelineno-0-21"></a><span class="w"> </span><span class="n">proto</span><span class="p">.</span><span class="n">handler</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">proc</span><span class="p">(</span><span class="n">conn</span><span class="p">:</span><span class="w"> </span><span class="n">Connection</span><span class="p">,</span><span class="w"> </span><span class="n">proto</span><span class="p">:</span><span class="w"> </span><span class="nb">string</span><span class="p">)</span><span class="w"> </span><span class="sx">{.async</span>:<span class="w"> </span><span class="sx">(raises</span>:<span class="w"> </span><span class="sx">[]).} =</span>
<a id="__codelineno-0-22" name="__codelineno-0-22" href="#__codelineno-0-22"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="n">msg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">string</span><span class="p">.</span><span class="n">fromBytes</span><span class="p">(</span><span class="n">await</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">readLp</span><span class="p">(</span><span class="mi">1024</span><span class="p">))</span> <a id="__codelineno-0-22" name="__codelineno-0-22" href="#__codelineno-0-22"></a><span class="sx"> try</span>:
<a id="__codelineno-0-23" name="__codelineno-0-23" href="#__codelineno-0-23"></a><span class="w"> </span><span class="n">echo</span><span class="w"> </span><span class="s">&quot;1 - Dst Received: &quot;</span><span class="p">,</span><span class="w"> </span><span class="n">msg</span> <a id="__codelineno-0-23" name="__codelineno-0-23" href="#__codelineno-0-23"></a><span class="w"> </span><span class="sx">var</span><span class="w"> </span><span class="sx">msg</span><span class="w"> </span><span class="sx">= string.fromBytes(await</span><span class="w"> </span><span class="sx">conn.readLp(1024))</span>
<a id="__codelineno-0-24" name="__codelineno-0-24" href="#__codelineno-0-24"></a><span class="w"> </span><span class="n">assert</span><span class="w"> </span><span class="s">&quot;test1&quot;</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">msg</span> <a id="__codelineno-0-24" name="__codelineno-0-24" href="#__codelineno-0-24"></a><span class="sx"> echo</span><span class="w"> </span><span class="sx">&quot;1</span><span class="w"> </span><span class="sx">- Dst</span><span class="w"> </span><span class="sx">Received</span>:<span class="w"> </span><span class="sx">&quot;, msg</span>
<a id="__codelineno-0-25" name="__codelineno-0-25" href="#__codelineno-0-25"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">writeLp</span><span class="p">(</span><span class="s">&quot;test2&quot;</span><span class="p">)</span> <a id="__codelineno-0-25" name="__codelineno-0-25" href="#__codelineno-0-25"></a><span class="w"> </span><span class="sx">assert</span><span class="w"> </span><span class="sx">&quot;test1&quot; == msg</span>
<a id="__codelineno-0-26" name="__codelineno-0-26" href="#__codelineno-0-26"></a><span class="w"> </span><span class="n">msg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">string</span><span class="p">.</span><span class="n">fromBytes</span><span class="p">(</span><span class="n">await</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">readLp</span><span class="p">(</span><span class="mi">1024</span><span class="p">))</span> <a id="__codelineno-0-26" name="__codelineno-0-26" href="#__codelineno-0-26"></a><span class="w"> </span><span class="sx">await</span><span class="w"> </span><span class="sx">conn.writeLp(&quot;test2&quot;)</span>
<a id="__codelineno-0-27" name="__codelineno-0-27" href="#__codelineno-0-27"></a><span class="w"> </span><span class="n">echo</span><span class="w"> </span><span class="s">&quot;2 - Dst Received: &quot;</span><span class="p">,</span><span class="w"> </span><span class="n">msg</span> <a id="__codelineno-0-27" name="__codelineno-0-27" href="#__codelineno-0-27"></a><span class="sx"> msg</span><span class="w"> </span><span class="sx">= string.fromBytes(await</span><span class="w"> </span><span class="sx">conn.readLp(1024))</span>
<a id="__codelineno-0-28" name="__codelineno-0-28" href="#__codelineno-0-28"></a><span class="w"> </span><span class="n">assert</span><span class="w"> </span><span class="s">&quot;test3&quot;</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">msg</span> <a id="__codelineno-0-28" name="__codelineno-0-28" href="#__codelineno-0-28"></a><span class="sx"> echo</span><span class="w"> </span><span class="sx">&quot;2</span><span class="w"> </span><span class="sx">- Dst</span><span class="w"> </span><span class="sx">Received</span>:<span class="w"> </span><span class="sx">&quot;, msg</span>
<a id="__codelineno-0-29" name="__codelineno-0-29" href="#__codelineno-0-29"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">writeLp</span><span class="p">(</span><span class="s">&quot;test4&quot;</span><span class="p">)</span> <a id="__codelineno-0-29" name="__codelineno-0-29" href="#__codelineno-0-29"></a><span class="w"> </span><span class="sx">assert</span><span class="w"> </span><span class="sx">&quot;test3&quot; == msg</span>
<a id="__codelineno-0-30" name="__codelineno-0-30" href="#__codelineno-0-30"></a> <a id="__codelineno-0-30" name="__codelineno-0-30" href="#__codelineno-0-30"></a><span class="w"> </span><span class="sx">await</span><span class="w"> </span><span class="sx">conn.writeLp(&quot;test4&quot;)</span>
<a id="__codelineno-0-31" name="__codelineno-0-31" href="#__codelineno-0-31"></a><span class="w"> </span><span class="k">let</span> <a id="__codelineno-0-31" name="__codelineno-0-31" href="#__codelineno-0-31"></a><span class="sx"> except</span>:
<a id="__codelineno-0-32" name="__codelineno-0-32" href="#__codelineno-0-32"></a><span class="w"> </span><span class="n">relay</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Relay</span><span class="p">.</span><span class="n">new</span><span class="p">()</span> <a id="__codelineno-0-32" name="__codelineno-0-32" href="#__codelineno-0-32"></a><span class="w"> </span><span class="sx">echo</span><span class="w"> </span><span class="sx">&quot;exception</span><span class="w"> </span><span class="sx">in</span><span class="w"> </span><span class="sx">handler&quot;, getCurrentException().msg</span>
<a id="__codelineno-0-33" name="__codelineno-0-33" href="#__codelineno-0-33"></a><span class="w"> </span><span class="n">clSrc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">RelayClient</span><span class="p">.</span><span class="n">new</span><span class="p">()</span> <a id="__codelineno-0-33" name="__codelineno-0-33" href="#__codelineno-0-33"></a>
<a id="__codelineno-0-34" name="__codelineno-0-34" href="#__codelineno-0-34"></a><span class="w"> </span><span class="n">clDst</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">RelayClient</span><span class="p">.</span><span class="n">new</span><span class="p">()</span> <a id="__codelineno-0-34" name="__codelineno-0-34" href="#__codelineno-0-34"></a><span class="w"> </span><span class="sx">let</span>
<a id="__codelineno-0-35" name="__codelineno-0-35" href="#__codelineno-0-35"></a> <a id="__codelineno-0-35" name="__codelineno-0-35" href="#__codelineno-0-35"></a><span class="w"> </span><span class="sx">relay</span><span class="w"> </span><span class="sx">= Relay.new()</span>
<a id="__codelineno-0-36" name="__codelineno-0-36" href="#__codelineno-0-36"></a><span class="w"> </span><span class="c"># Create three hosts, enable relay client on two of them.</span> <a id="__codelineno-0-36" name="__codelineno-0-36" href="#__codelineno-0-36"></a><span class="sx"> clSrc</span><span class="w"> </span><span class="sx">= RelayClient.new()</span>
<a id="__codelineno-0-37" name="__codelineno-0-37" href="#__codelineno-0-37"></a><span class="w"> </span><span class="c"># The third one can relay connections for other peers.</span> <a id="__codelineno-0-37" name="__codelineno-0-37" href="#__codelineno-0-37"></a><span class="sx"> clDst</span><span class="w"> </span><span class="sx">= RelayClient.new()</span>
<a id="__codelineno-0-38" name="__codelineno-0-38" href="#__codelineno-0-38"></a><span class="w"> </span><span class="c"># RelayClient can use a relay, Relay is a relay.</span> <a id="__codelineno-0-38" name="__codelineno-0-38" href="#__codelineno-0-38"></a>
<a id="__codelineno-0-39" name="__codelineno-0-39" href="#__codelineno-0-39"></a><span class="w"> </span><span class="n">swRel</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">createCircuitRelaySwitch</span><span class="p">(</span><span class="n">relay</span><span class="p">)</span> <a id="__codelineno-0-39" name="__codelineno-0-39" href="#__codelineno-0-39"></a><span class="sx"> # Create</span><span class="w"> </span><span class="sx">three</span><span class="w"> </span><span class="sx">hosts</span>,<span class="w"> </span><span class="sx">enable</span><span class="w"> </span><span class="sx">relay</span><span class="w"> </span><span class="sx">client</span><span class="w"> </span><span class="sx">on</span><span class="w"> </span><span class="sx">two</span><span class="w"> </span><span class="sx">of</span><span class="w"> </span><span class="sx">them.</span>
<a id="__codelineno-0-40" name="__codelineno-0-40" href="#__codelineno-0-40"></a><span class="w"> </span><span class="n">swSrc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">createCircuitRelaySwitch</span><span class="p">(</span><span class="n">clSrc</span><span class="p">)</span> <a id="__codelineno-0-40" name="__codelineno-0-40" href="#__codelineno-0-40"></a><span class="sx"> # The</span><span class="w"> </span><span class="sx">third</span><span class="w"> </span><span class="sx">one</span><span class="w"> </span><span class="sx">can</span><span class="w"> </span><span class="sx">relay</span><span class="w"> </span><span class="sx">connections</span><span class="w"> </span><span class="sx">for</span><span class="w"> </span><span class="sx">other</span><span class="w"> </span><span class="sx">peers.</span>
<a id="__codelineno-0-41" name="__codelineno-0-41" href="#__codelineno-0-41"></a><span class="w"> </span><span class="n">swDst</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">createCircuitRelaySwitch</span><span class="p">(</span><span class="n">clDst</span><span class="p">)</span> <a id="__codelineno-0-41" name="__codelineno-0-41" href="#__codelineno-0-41"></a><span class="sx"> # RelayClient</span><span class="w"> </span><span class="sx">can</span><span class="w"> </span><span class="sx">use</span><span class="w"> </span><span class="sx">a</span><span class="w"> </span><span class="sx">relay</span>,<span class="w"> </span><span class="sx">Relay</span><span class="w"> </span><span class="sx">is</span><span class="w"> </span><span class="sx">a</span><span class="w"> </span><span class="sx">relay.</span>
<a id="__codelineno-0-42" name="__codelineno-0-42" href="#__codelineno-0-42"></a> <a id="__codelineno-0-42" name="__codelineno-0-42" href="#__codelineno-0-42"></a><span class="sx"> swRel</span><span class="w"> </span><span class="sx">= createCircuitRelaySwitch(relay)</span>
<a id="__codelineno-0-43" name="__codelineno-0-43" href="#__codelineno-0-43"></a><span class="w"> </span><span class="n">swDst</span><span class="p">.</span><span class="n">mount</span><span class="p">(</span><span class="n">proto</span><span class="p">)</span> <a id="__codelineno-0-43" name="__codelineno-0-43" href="#__codelineno-0-43"></a><span class="sx"> swSrc</span><span class="w"> </span><span class="sx">= createCircuitRelaySwitch(clSrc)</span>
<a id="__codelineno-0-44" name="__codelineno-0-44" href="#__codelineno-0-44"></a> <a id="__codelineno-0-44" name="__codelineno-0-44" href="#__codelineno-0-44"></a><span class="sx"> swDst</span><span class="w"> </span><span class="sx">= createCircuitRelaySwitch(clDst)</span>
<a id="__codelineno-0-45" name="__codelineno-0-45" href="#__codelineno-0-45"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">swRel</span><span class="p">.</span><span class="n">start</span><span class="p">()</span> <a id="__codelineno-0-45" name="__codelineno-0-45" href="#__codelineno-0-45"></a>
<a id="__codelineno-0-46" name="__codelineno-0-46" href="#__codelineno-0-46"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">swSrc</span><span class="p">.</span><span class="n">start</span><span class="p">()</span> <a id="__codelineno-0-46" name="__codelineno-0-46" href="#__codelineno-0-46"></a><span class="sx"> swDst.mount(proto)</span>
<a id="__codelineno-0-47" name="__codelineno-0-47" href="#__codelineno-0-47"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">swDst</span><span class="p">.</span><span class="n">start</span><span class="p">()</span> <a id="__codelineno-0-47" name="__codelineno-0-47" href="#__codelineno-0-47"></a>
<a id="__codelineno-0-48" name="__codelineno-0-48" href="#__codelineno-0-48"></a> <a id="__codelineno-0-48" name="__codelineno-0-48" href="#__codelineno-0-48"></a><span class="sx"> await</span><span class="w"> </span><span class="sx">swRel.start()</span>
<a id="__codelineno-0-49" name="__codelineno-0-49" href="#__codelineno-0-49"></a><span class="w"> </span><span class="k">let</span> <a id="__codelineno-0-49" name="__codelineno-0-49" href="#__codelineno-0-49"></a><span class="sx"> await</span><span class="w"> </span><span class="sx">swSrc.start()</span>
<a id="__codelineno-0-50" name="__codelineno-0-50" href="#__codelineno-0-50"></a><span class="w"> </span><span class="c"># Create a relay address to swDst using swRel as the relay</span> <a id="__codelineno-0-50" name="__codelineno-0-50" href="#__codelineno-0-50"></a><span class="sx"> await</span><span class="w"> </span><span class="sx">swDst.start()</span>
<a id="__codelineno-0-51" name="__codelineno-0-51" href="#__codelineno-0-51"></a><span class="w"> </span><span class="n">addrs</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MultiAddress</span> <a id="__codelineno-0-51" name="__codelineno-0-51" href="#__codelineno-0-51"></a>
<a id="__codelineno-0-52" name="__codelineno-0-52" href="#__codelineno-0-52"></a><span class="w"> </span><span class="p">.</span><span class="n">init</span><span class="p">(</span> <a id="__codelineno-0-52" name="__codelineno-0-52" href="#__codelineno-0-52"></a><span class="sx"> let</span>
<a id="__codelineno-0-53" name="__codelineno-0-53" href="#__codelineno-0-53"></a><span class="w"> </span><span class="o">$</span><span class="n">swRel</span><span class="p">.</span><span class="n">peerInfo</span><span class="p">.</span><span class="n">addrs</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="s">&quot;/p2p/&quot;</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="o">$</span><span class="n">swRel</span><span class="p">.</span><span class="n">peerInfo</span><span class="p">.</span><span class="n">peerId</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="s">&quot;/p2p-circuit&quot;</span> <a id="__codelineno-0-53" name="__codelineno-0-53" href="#__codelineno-0-53"></a><span class="w"> </span><span class="sx"># Create</span><span class="w"> </span><span class="sx">a</span><span class="w"> </span><span class="sx">relay</span><span class="w"> </span><span class="sx">address</span><span class="w"> </span><span class="sx">to</span><span class="w"> </span><span class="sx">swDst</span><span class="w"> </span><span class="sx">using</span><span class="w"> </span><span class="sx">swRel</span><span class="w"> </span><span class="sx">as</span><span class="w"> </span><span class="sx">the</span><span class="w"> </span><span class="sx">relay</span>
<a id="__codelineno-0-54" name="__codelineno-0-54" href="#__codelineno-0-54"></a><span class="w"> </span><span class="p">)</span> <a id="__codelineno-0-54" name="__codelineno-0-54" href="#__codelineno-0-54"></a><span class="w"> </span><span class="sx">addrs</span><span class="w"> </span><span class="sx">= MultiAddress</span>
<a id="__codelineno-0-55" name="__codelineno-0-55" href="#__codelineno-0-55"></a><span class="w"> </span><span class="p">.</span><span class="n">get</span><span class="p">()</span> <a id="__codelineno-0-55" name="__codelineno-0-55" href="#__codelineno-0-55"></a><span class="w"> </span><span class="sx">.init(</span>
<a id="__codelineno-0-56" name="__codelineno-0-56" href="#__codelineno-0-56"></a> <a id="__codelineno-0-56" name="__codelineno-0-56" href="#__codelineno-0-56"></a><span class="sx"> $swRel.peerInfo.addrs[0] &amp; &quot;/p2p/&quot; &amp; $swRel.peerInfo.peerId</span><span class="w"> </span><span class="sx">&amp; &quot;/p2p-circuit&quot;</span>
<a id="__codelineno-0-57" name="__codelineno-0-57" href="#__codelineno-0-57"></a><span class="w"> </span><span class="c"># Connect Dst to the relay</span> <a id="__codelineno-0-57" name="__codelineno-0-57" href="#__codelineno-0-57"></a><span class="sx"> )</span>
<a id="__codelineno-0-58" name="__codelineno-0-58" href="#__codelineno-0-58"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">swDst</span><span class="p">.</span><span class="n">connect</span><span class="p">(</span><span class="n">swRel</span><span class="p">.</span><span class="n">peerInfo</span><span class="p">.</span><span class="n">peerId</span><span class="p">,</span><span class="w"> </span><span class="n">swRel</span><span class="p">.</span><span class="n">peerInfo</span><span class="p">.</span><span class="n">addrs</span><span class="p">)</span> <a id="__codelineno-0-58" name="__codelineno-0-58" href="#__codelineno-0-58"></a><span class="sx"> .get()</span>
<a id="__codelineno-0-59" name="__codelineno-0-59" href="#__codelineno-0-59"></a> <a id="__codelineno-0-59" name="__codelineno-0-59" href="#__codelineno-0-59"></a>
<a id="__codelineno-0-60" name="__codelineno-0-60" href="#__codelineno-0-60"></a><span class="w"> </span><span class="c"># Dst reserve a slot on the relay.</span> <a id="__codelineno-0-60" name="__codelineno-0-60" href="#__codelineno-0-60"></a><span class="sx"> # Connect</span><span class="w"> </span><span class="sx">Dst</span><span class="w"> </span><span class="sx">to</span><span class="w"> </span><span class="sx">the</span><span class="w"> </span><span class="sx">relay</span>
<a id="__codelineno-0-61" name="__codelineno-0-61" href="#__codelineno-0-61"></a><span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="n">rsvp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">clDst</span><span class="p">.</span><span class="n">reserve</span><span class="p">(</span><span class="n">swRel</span><span class="p">.</span><span class="n">peerInfo</span><span class="p">.</span><span class="n">peerId</span><span class="p">,</span><span class="w"> </span><span class="n">swRel</span><span class="p">.</span><span class="n">peerInfo</span><span class="p">.</span><span class="n">addrs</span><span class="p">)</span> <a id="__codelineno-0-61" name="__codelineno-0-61" href="#__codelineno-0-61"></a><span class="w"> </span><span class="sx">await</span><span class="w"> </span><span class="sx">swDst.connect(swRel.peerInfo.peerId</span>,<span class="w"> </span><span class="sx">swRel.peerInfo.addrs)</span>
<a id="__codelineno-0-62" name="__codelineno-0-62" href="#__codelineno-0-62"></a> <a id="__codelineno-0-62" name="__codelineno-0-62" href="#__codelineno-0-62"></a>
<a id="__codelineno-0-63" name="__codelineno-0-63" href="#__codelineno-0-63"></a><span class="w"> </span><span class="c"># Src dial Dst using the relay</span> <a id="__codelineno-0-63" name="__codelineno-0-63" href="#__codelineno-0-63"></a><span class="sx"> # Dst</span><span class="w"> </span><span class="sx">reserve</span><span class="w"> </span><span class="sx">a</span><span class="w"> </span><span class="sx">slot</span><span class="w"> </span><span class="sx">on</span><span class="w"> </span><span class="sx">the</span><span class="w"> </span><span class="sx">relay.</span>
<a id="__codelineno-0-64" name="__codelineno-0-64" href="#__codelineno-0-64"></a><span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="n">conn</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">swSrc</span><span class="p">.</span><span class="n">dial</span><span class="p">(</span><span class="n">swDst</span><span class="p">.</span><span class="n">peerInfo</span><span class="p">.</span><span class="n">peerId</span><span class="p">,</span><span class="w"> </span><span class="o">@[</span><span class="n">addrs</span><span class="o">]</span><span class="p">,</span><span class="w"> </span><span class="n">customProtoCodec</span><span class="p">)</span> <a id="__codelineno-0-64" name="__codelineno-0-64" href="#__codelineno-0-64"></a><span class="sx"> let</span><span class="w"> </span><span class="sx">rsvp</span><span class="w"> </span><span class="sx">= await</span><span class="w"> </span><span class="sx">clDst.reserve(swRel.peerInfo.peerId</span>,<span class="w"> </span><span class="sx">swRel.peerInfo.addrs)</span>
<a id="__codelineno-0-65" name="__codelineno-0-65" href="#__codelineno-0-65"></a> <a id="__codelineno-0-65" name="__codelineno-0-65" href="#__codelineno-0-65"></a>
<a id="__codelineno-0-66" name="__codelineno-0-66" href="#__codelineno-0-66"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">writeLp</span><span class="p">(</span><span class="s">&quot;test1&quot;</span><span class="p">)</span> <a id="__codelineno-0-66" name="__codelineno-0-66" href="#__codelineno-0-66"></a><span class="sx"> # Src</span><span class="w"> </span><span class="sx">dial</span><span class="w"> </span><span class="sx">Dst</span><span class="w"> </span><span class="sx">using</span><span class="w"> </span><span class="sx">the</span><span class="w"> </span><span class="sx">relay</span>
<a id="__codelineno-0-67" name="__codelineno-0-67" href="#__codelineno-0-67"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="n">msg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">string</span><span class="p">.</span><span class="n">fromBytes</span><span class="p">(</span><span class="n">await</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">readLp</span><span class="p">(</span><span class="mi">1024</span><span class="p">))</span> <a id="__codelineno-0-67" name="__codelineno-0-67" href="#__codelineno-0-67"></a><span class="w"> </span><span class="sx">let</span><span class="w"> </span><span class="sx">conn</span><span class="w"> </span><span class="sx">= await</span><span class="w"> </span><span class="sx">swSrc.dial(swDst.peerInfo.peerId</span>,<span class="w"> </span><span class="sx">@[addrs], customProtoCodec)</span>
<a id="__codelineno-0-68" name="__codelineno-0-68" href="#__codelineno-0-68"></a><span class="w"> </span><span class="n">echo</span><span class="w"> </span><span class="s">&quot;1 - Src Received: &quot;</span><span class="p">,</span><span class="w"> </span><span class="n">msg</span> <a id="__codelineno-0-68" name="__codelineno-0-68" href="#__codelineno-0-68"></a>
<a id="__codelineno-0-69" name="__codelineno-0-69" href="#__codelineno-0-69"></a><span class="w"> </span><span class="n">assert</span><span class="w"> </span><span class="s">&quot;test2&quot;</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">msg</span> <a id="__codelineno-0-69" name="__codelineno-0-69" href="#__codelineno-0-69"></a><span class="sx"> await</span><span class="w"> </span><span class="sx">conn.writeLp(&quot;test1&quot;)</span>
<a id="__codelineno-0-70" name="__codelineno-0-70" href="#__codelineno-0-70"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">writeLp</span><span class="p">(</span><span class="s">&quot;test3&quot;</span><span class="p">)</span> <a id="__codelineno-0-70" name="__codelineno-0-70" href="#__codelineno-0-70"></a><span class="sx"> var</span><span class="w"> </span><span class="sx">msg</span><span class="w"> </span><span class="sx">= string.fromBytes(await</span><span class="w"> </span><span class="sx">conn.readLp(1024))</span>
<a id="__codelineno-0-71" name="__codelineno-0-71" href="#__codelineno-0-71"></a><span class="w"> </span><span class="n">msg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">string</span><span class="p">.</span><span class="n">fromBytes</span><span class="p">(</span><span class="n">await</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">readLp</span><span class="p">(</span><span class="mi">1024</span><span class="p">))</span> <a id="__codelineno-0-71" name="__codelineno-0-71" href="#__codelineno-0-71"></a><span class="sx"> echo</span><span class="w"> </span><span class="sx">&quot;1</span><span class="w"> </span><span class="sx">- Src</span><span class="w"> </span><span class="sx">Received</span>:<span class="w"> </span><span class="sx">&quot;, msg</span>
<a id="__codelineno-0-72" name="__codelineno-0-72" href="#__codelineno-0-72"></a><span class="w"> </span><span class="n">echo</span><span class="w"> </span><span class="s">&quot;2 - Src Received: &quot;</span><span class="p">,</span><span class="w"> </span><span class="n">msg</span> <a id="__codelineno-0-72" name="__codelineno-0-72" href="#__codelineno-0-72"></a><span class="w"> </span><span class="sx">assert</span><span class="w"> </span><span class="sx">&quot;test2&quot; == msg</span>
<a id="__codelineno-0-73" name="__codelineno-0-73" href="#__codelineno-0-73"></a><span class="w"> </span><span class="n">assert</span><span class="w"> </span><span class="s">&quot;test4&quot;</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">msg</span> <a id="__codelineno-0-73" name="__codelineno-0-73" href="#__codelineno-0-73"></a><span class="w"> </span><span class="sx">await</span><span class="w"> </span><span class="sx">conn.writeLp(&quot;test3&quot;)</span>
<a id="__codelineno-0-74" name="__codelineno-0-74" href="#__codelineno-0-74"></a> <a id="__codelineno-0-74" name="__codelineno-0-74" href="#__codelineno-0-74"></a><span class="sx"> msg</span><span class="w"> </span><span class="sx">= string.fromBytes(await</span><span class="w"> </span><span class="sx">conn.readLp(1024))</span>
<a id="__codelineno-0-75" name="__codelineno-0-75" href="#__codelineno-0-75"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">relay</span><span class="p">.</span><span class="n">stop</span><span class="p">()</span> <a id="__codelineno-0-75" name="__codelineno-0-75" href="#__codelineno-0-75"></a><span class="sx"> echo</span><span class="w"> </span><span class="sx">&quot;2</span><span class="w"> </span><span class="sx">- Src</span><span class="w"> </span><span class="sx">Received</span>:<span class="w"> </span><span class="sx">&quot;, msg</span>
<a id="__codelineno-0-76" name="__codelineno-0-76" href="#__codelineno-0-76"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">allFutures</span><span class="p">(</span><span class="n">swSrc</span><span class="p">.</span><span class="n">stop</span><span class="p">(),</span><span class="w"> </span><span class="n">swDst</span><span class="p">.</span><span class="n">stop</span><span class="p">(),</span><span class="w"> </span><span class="n">swRel</span><span class="p">.</span><span class="n">stop</span><span class="p">())</span> <a id="__codelineno-0-76" name="__codelineno-0-76" href="#__codelineno-0-76"></a><span class="w"> </span><span class="sx">assert</span><span class="w"> </span><span class="sx">&quot;test4&quot; == msg</span>
<a id="__codelineno-0-77" name="__codelineno-0-77" href="#__codelineno-0-77"></a> <a id="__codelineno-0-77" name="__codelineno-0-77" href="#__codelineno-0-77"></a>
<a id="__codelineno-0-78" name="__codelineno-0-78" href="#__codelineno-0-78"></a><span class="n">waitFor</span><span class="p">(</span><span class="n">main</span><span class="p">())</span> <a id="__codelineno-0-78" name="__codelineno-0-78" href="#__codelineno-0-78"></a><span class="w"> </span><span class="sx">await</span><span class="w"> </span><span class="sx">relay.stop()</span>
<a id="__codelineno-0-79" name="__codelineno-0-79" href="#__codelineno-0-79"></a><span class="sx"> await</span><span class="w"> </span><span class="sx">allFutures(swSrc.stop(), swDst.stop(), swRel.stop())</span>
<a id="__codelineno-0-80" name="__codelineno-0-80" href="#__codelineno-0-80"></a>
<a id="__codelineno-0-81" name="__codelineno-0-81" href="#__codelineno-0-81"></a><span class="sx">waitFor(main())</span>
</code></pre></div> </code></pre></div>

View File

@ -43,12 +43,15 @@ proc new(T: typedesc[ChatProto], c: Chat): T =
let chatproto = T() let chatproto = T()
# create handler for incoming connection # create handler for incoming connection
proc handle(stream: Connection, proto: string) {.async.} = proc handle(stream: Connection, proto: string) {.async: (raises: []).} =
if c.connected and not c.conn.closed: try:
c.writeStdout "a chat session is already in progress - refusing incoming peer!" if c.connected and not c.conn.closed:
await stream.close() c.writeStdout "a chat session is already in progress - refusing incoming peer!"
else: else:
await c.handlePeer(stream) await c.handlePeer(stream)
except:
echo "exception in handler", getCurrentException().msg
finally:
await stream.close() await stream.close()
# assign the new handler # assign the new handler

View File

@ -11,12 +11,15 @@ type TestProto = ref object of LPProtocol # declare a custom protocol
proc new(T: typedesc[TestProto]): T = proc new(T: typedesc[TestProto]): T =
# every incoming connections will be in handled in this closure # every incoming connections will be in handled in this closure
proc handle(conn: Connection, proto: string) {.async.} = proc handle(conn: Connection, proto: string) {.async: (raises: []).} =
echo "Got from remote - ", string.fromBytes(await conn.readLp(1024)) try:
await conn.writeLp("Roger p2p!") echo "Got from remote - ", string.fromBytes(await conn.readLp(1024))
await conn.writeLp("Roger p2p!")
# We must close the connections ourselves when we're done with it except:
await conn.close() echo "exception in handler", getCurrentException().msg
finally:
# We must close the connections ourselves when we're done with it
await conn.close()
return T.new(codecs = @[TestCodec], handler = handle) return T.new(codecs = @[TestCodec], handler = handle)

File diff suppressed because one or more lines are too long

View File

@ -2,38 +2,38 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url> <url>
<loc>https://status-im.github.io/nim-libp2p/docs/</loc> <loc>https://status-im.github.io/nim-libp2p/docs/</loc>
<lastmod>2025-02-24</lastmod> <lastmod>2025-02-25</lastmod>
</url> </url>
<url> <url>
<loc>https://status-im.github.io/nim-libp2p/docs/circuitrelay/</loc> <loc>https://status-im.github.io/nim-libp2p/docs/circuitrelay/</loc>
<lastmod>2025-02-24</lastmod> <lastmod>2025-02-25</lastmod>
</url> </url>
<url> <url>
<loc>https://status-im.github.io/nim-libp2p/docs/tutorial_1_connect/</loc> <loc>https://status-im.github.io/nim-libp2p/docs/tutorial_1_connect/</loc>
<lastmod>2025-02-24</lastmod> <lastmod>2025-02-25</lastmod>
</url> </url>
<url> <url>
<loc>https://status-im.github.io/nim-libp2p/docs/tutorial_2_customproto/</loc> <loc>https://status-im.github.io/nim-libp2p/docs/tutorial_2_customproto/</loc>
<lastmod>2025-02-24</lastmod> <lastmod>2025-02-25</lastmod>
</url> </url>
<url> <url>
<loc>https://status-im.github.io/nim-libp2p/docs/tutorial_3_protobuf/</loc> <loc>https://status-im.github.io/nim-libp2p/docs/tutorial_3_protobuf/</loc>
<lastmod>2025-02-24</lastmod> <lastmod>2025-02-25</lastmod>
</url> </url>
<url> <url>
<loc>https://status-im.github.io/nim-libp2p/docs/tutorial_4_gossipsub/</loc> <loc>https://status-im.github.io/nim-libp2p/docs/tutorial_4_gossipsub/</loc>
<lastmod>2025-02-24</lastmod> <lastmod>2025-02-25</lastmod>
</url> </url>
<url> <url>
<loc>https://status-im.github.io/nim-libp2p/docs/tutorial_5_discovery/</loc> <loc>https://status-im.github.io/nim-libp2p/docs/tutorial_5_discovery/</loc>
<lastmod>2025-02-24</lastmod> <lastmod>2025-02-25</lastmod>
</url> </url>
<url> <url>
<loc>https://status-im.github.io/nim-libp2p/docs/tutorial_6_game/</loc> <loc>https://status-im.github.io/nim-libp2p/docs/tutorial_6_game/</loc>
<lastmod>2025-02-24</lastmod> <lastmod>2025-02-25</lastmod>
</url> </url>
<url> <url>
<loc>https://status-im.github.io/nim-libp2p/docs/go-daemon/daemonapi/</loc> <loc>https://status-im.github.io/nim-libp2p/docs/go-daemon/daemonapi/</loc>
<lastmod>2025-02-24</lastmod> <lastmod>2025-02-25</lastmod>
</url> </url>
</urlset> </urlset>

Binary file not shown.

View File

@ -25,12 +25,15 @@ type TestProto = ref object of LPProtocol
proc new(T: typedesc[TestProto]): T = proc new(T: typedesc[TestProto]): T =
# every incoming connections will in be handled in this closure # every incoming connections will in be handled in this closure
proc handle(conn: Connection, proto: string) {.async.} = proc handle(conn: Connection, proto: string) {.async: (raises: []).} =
# Read up to 1024 bytes from this connection, and transform them into # Read up to 1024 bytes from this connection, and transform them into
# a string # a string
echo "Got from remote - ", string.fromBytes(await conn.readLp(1024)) try:
# We must close the connections ourselves when we're done with it echo "Got from remote - ", string.fromBytes(await conn.readLp(1024))
await conn.close() except:
echo "exception in handler", getCurrentException().msg
finally:
await conn.close()
return T.new(codecs = @[TestCodec], handler = handle) return T.new(codecs = @[TestCodec], handler = handle)

View File

@ -551,14 +551,17 @@ These two parts can be identical, but in our trivial protocol, the server will w
<p>Let's start with the server part: <p>Let's start with the server part:
<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="k">proc</span><span class="w"> </span><span class="nf">new</span><span class="p">(</span><span class="n">T</span><span class="p">:</span><span class="w"> </span><span class="n">typedesc</span><span class="o">[</span><span class="n">TestProto</span><span class="o">]</span><span class="p">):</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="o">=</span> <div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="k">proc</span><span class="w"> </span><span class="nf">new</span><span class="p">(</span><span class="n">T</span><span class="p">:</span><span class="w"> </span><span class="n">typedesc</span><span class="o">[</span><span class="n">TestProto</span><span class="o">]</span><span class="p">):</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="o">=</span>
<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="w"> </span><span class="c"># every incoming connections will in be handled in this closure</span> <a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="w"> </span><span class="c"># every incoming connections will in be handled in this closure</span>
<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="w"> </span><span class="k">proc</span><span class="w"> </span><span class="nf">handle</span><span class="p">(</span><span class="n">conn</span><span class="p">:</span><span class="w"> </span><span class="n">Connection</span><span class="p">,</span><span class="w"> </span><span class="n">proto</span><span class="p">:</span><span class="w"> </span><span class="nb">string</span><span class="p">)</span><span class="w"> </span><span class="sx">{.async.}</span><span class="w"> </span><span class="o">=</span> <a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="w"> </span><span class="k">proc</span><span class="w"> </span><span class="nf">handle</span><span class="p">(</span><span class="n">conn</span><span class="p">:</span><span class="w"> </span><span class="n">Connection</span><span class="p">,</span><span class="w"> </span><span class="n">proto</span><span class="p">:</span><span class="w"> </span><span class="nb">string</span><span class="p">)</span><span class="w"> </span><span class="sx">{.async</span>:<span class="w"> </span><span class="sx">(raises</span>:<span class="w"> </span><span class="sx">[]).} =</span>
<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a><span class="w"> </span><span class="c"># Read up to 1024 bytes from this connection, and transform them into</span> <a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a><span class="sx"> # Read</span><span class="w"> </span><span class="sx">up</span><span class="w"> </span><span class="sx">to</span><span class="w"> </span><span class="sx">1024</span><span class="w"> </span><span class="sx">bytes</span><span class="w"> </span><span class="sx">from</span><span class="w"> </span><span class="sx">this</span><span class="w"> </span><span class="sx">connection</span>,<span class="w"> </span><span class="sx">and</span><span class="w"> </span><span class="sx">transform</span><span class="w"> </span><span class="sx">them</span><span class="w"> </span><span class="sx">into</span>
<a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a><span class="w"> </span><span class="c"># a string</span> <a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a><span class="w"> </span><span class="sx"># a</span><span class="w"> </span><span class="sx">string</span>
<a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a><span class="w"> </span><span class="n">echo</span><span class="w"> </span><span class="s">&quot;Got from remote - &quot;</span><span class="p">,</span><span class="w"> </span><span class="nb">string</span><span class="p">.</span><span class="n">fromBytes</span><span class="p">(</span><span class="n">await</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">readLp</span><span class="p">(</span><span class="mi">1024</span><span class="p">))</span> <a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a><span class="w"> </span><span class="sx">try</span>:
<a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="w"> </span><span class="c"># We must close the connections ourselves when we&#39;re done with it</span> <a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="w"> </span><span class="sx">echo</span><span class="w"> </span><span class="sx">&quot;Got</span><span class="w"> </span><span class="sx">from</span><span class="w"> </span><span class="sx">remote</span><span class="w"> </span><span class="sx">- &quot;, string.fromBytes(await</span><span class="w"> </span><span class="sx">conn.readLp(1024))</span>
<a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">close</span><span class="p">()</span> <a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a><span class="sx"> except</span>:
<a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a> <a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a><span class="w"> </span><span class="sx">echo</span><span class="w"> </span><span class="sx">&quot;exception</span><span class="w"> </span><span class="sx">in</span><span class="w"> </span><span class="sx">handler&quot;, getCurrentException().msg</span>
<a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">T</span><span class="p">.</span><span class="n">new</span><span class="p">(</span><span class="n">codecs</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">@[</span><span class="n">TestCodec</span><span class="o">]</span><span class="p">,</span><span class="w"> </span><span class="n">handler</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">handle</span><span class="p">)</span> <a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a><span class="w"> </span><span class="sx">finally</span>:
<a id="__codelineno-2-11" name="__codelineno-2-11" href="#__codelineno-2-11"></a><span class="w"> </span><span class="sx">await</span><span class="w"> </span><span class="sx">conn.close()</span>
<a id="__codelineno-2-12" name="__codelineno-2-12" href="#__codelineno-2-12"></a>
<a id="__codelineno-2-13" name="__codelineno-2-13" href="#__codelineno-2-13"></a><span class="sx"> return</span><span class="w"> </span><span class="sx">T.new(codecs</span><span class="w"> </span><span class="sx">= @[TestCodec], handler</span><span class="w"> </span><span class="sx">= handle)</span>
</code></pre></div> </code></pre></div>
This is a constructor for our <code>TestProto</code>, that will specify our <code>codecs</code> and a <code>handler</code>, which will be called for each incoming peer asking for this protocol. This is a constructor for our <code>TestProto</code>, that will specify our <code>codecs</code> and a <code>handler</code>, which will be called for each incoming peer asking for this protocol.
In our handle, we simply read a message from the connection and <code>echo</code> it.</p> In our handle, we simply read a message from the connection and <code>echo</code> it.</p>

View File

@ -108,12 +108,16 @@ type
proc new(_: typedesc[MetricProto], cb: MetricCallback): MetricProto = proc new(_: typedesc[MetricProto], cb: MetricCallback): MetricProto =
var res: MetricProto var res: MetricProto
proc handle(conn: Connection, proto: string) {.async.} = proc handle(conn: Connection, proto: string) {.async: (raises: []).} =
let try:
metrics = await res.metricGetter() let
asProtobuf = metrics.encode() metrics = await res.metricGetter()
await conn.writeLp(asProtobuf.buffer) asProtobuf = metrics.encode()
await conn.close() await conn.writeLp(asProtobuf.buffer)
except:
echo "exception in handler", getCurrentException().msg
finally:
await conn.close()
res = MetricProto.new(@["/metric-getter/1.0.0"], handle) res = MetricProto.new(@["/metric-getter/1.0.0"], handle)
res.metricGetter = cb res.metricGetter = cb

View File

@ -723,22 +723,26 @@ that you may or may not prefer.</p>
<a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a> <a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a>
<a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a><span class="k">proc</span><span class="w"> </span><span class="nf">new</span><span class="p">(</span><span class="err">_: typedesc[MetricProto], cb: MetricCallback): MetricProto =</span> <a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a><span class="k">proc</span><span class="w"> </span><span class="nf">new</span><span class="p">(</span><span class="err">_: typedesc[MetricProto], cb: MetricCallback): MetricProto =</span>
<a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="n">res</span><span class="p">:</span><span class="w"> </span><span class="n">MetricProto</span> <a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="n">res</span><span class="p">:</span><span class="w"> </span><span class="n">MetricProto</span>
<a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a><span class="w"> </span><span class="k">proc</span><span class="w"> </span><span class="nf">handle</span><span class="p">(</span><span class="n">conn</span><span class="p">:</span><span class="w"> </span><span class="n">Connection</span><span class="p">,</span><span class="w"> </span><span class="n">proto</span><span class="p">:</span><span class="w"> </span><span class="nb">string</span><span class="p">)</span><span class="w"> </span><span class="sx">{.async.}</span><span class="w"> </span><span class="o">=</span> <a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a><span class="w"> </span><span class="k">proc</span><span class="w"> </span><span class="nf">handle</span><span class="p">(</span><span class="n">conn</span><span class="p">:</span><span class="w"> </span><span class="n">Connection</span><span class="p">,</span><span class="w"> </span><span class="n">proto</span><span class="p">:</span><span class="w"> </span><span class="nb">string</span><span class="p">)</span><span class="w"> </span><span class="sx">{.async</span>:<span class="w"> </span><span class="sx">(raises</span>:<span class="w"> </span><span class="sx">[]).} =</span>
<a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a><span class="w"> </span><span class="k">let</span> <a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a><span class="sx"> try</span>:
<a id="__codelineno-3-10" name="__codelineno-3-10" href="#__codelineno-3-10"></a><span class="w"> </span><span class="n">metrics</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="n">metricGetter</span><span class="p">()</span> <a id="__codelineno-3-10" name="__codelineno-3-10" href="#__codelineno-3-10"></a><span class="w"> </span><span class="sx">let</span>
<a id="__codelineno-3-11" name="__codelineno-3-11" href="#__codelineno-3-11"></a><span class="w"> </span><span class="n">asProtobuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">metrics</span><span class="p">.</span><span class="n">encode</span><span class="p">()</span> <a id="__codelineno-3-11" name="__codelineno-3-11" href="#__codelineno-3-11"></a><span class="w"> </span><span class="sx">metrics</span><span class="w"> </span><span class="sx">= await</span><span class="w"> </span><span class="sx">res.metricGetter()</span>
<a id="__codelineno-3-12" name="__codelineno-3-12" href="#__codelineno-3-12"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">writeLp</span><span class="p">(</span><span class="n">asProtobuf</span><span class="p">.</span><span class="n">buffer</span><span class="p">)</span> <a id="__codelineno-3-12" name="__codelineno-3-12" href="#__codelineno-3-12"></a><span class="sx"> asProtobuf</span><span class="w"> </span><span class="sx">= metrics.encode()</span>
<a id="__codelineno-3-13" name="__codelineno-3-13" href="#__codelineno-3-13"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">close</span><span class="p">()</span> <a id="__codelineno-3-13" name="__codelineno-3-13" href="#__codelineno-3-13"></a><span class="sx"> await</span><span class="w"> </span><span class="sx">conn.writeLp(asProtobuf.buffer)</span>
<a id="__codelineno-3-14" name="__codelineno-3-14" href="#__codelineno-3-14"></a> <a id="__codelineno-3-14" name="__codelineno-3-14" href="#__codelineno-3-14"></a><span class="sx"> except</span>:
<a id="__codelineno-3-15" name="__codelineno-3-15" href="#__codelineno-3-15"></a><span class="w"> </span><span class="n">res</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MetricProto</span><span class="p">.</span><span class="n">new</span><span class="p">(</span><span class="o">@[</span><span class="s">&quot;/metric-getter/1.0.0&quot;</span><span class="o">]</span><span class="p">,</span><span class="w"> </span><span class="n">handle</span><span class="p">)</span> <a id="__codelineno-3-15" name="__codelineno-3-15" href="#__codelineno-3-15"></a><span class="w"> </span><span class="sx">echo</span><span class="w"> </span><span class="sx">&quot;exception</span><span class="w"> </span><span class="sx">in</span><span class="w"> </span><span class="sx">handler&quot;, getCurrentException().msg</span>
<a id="__codelineno-3-16" name="__codelineno-3-16" href="#__codelineno-3-16"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="n">metricGetter</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cb</span> <a id="__codelineno-3-16" name="__codelineno-3-16" href="#__codelineno-3-16"></a><span class="w"> </span><span class="sx">finally</span>:
<a id="__codelineno-3-17" name="__codelineno-3-17" href="#__codelineno-3-17"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">res</span> <a id="__codelineno-3-17" name="__codelineno-3-17" href="#__codelineno-3-17"></a><span class="w"> </span><span class="sx">await</span><span class="w"> </span><span class="sx">conn.close()</span>
<a id="__codelineno-3-18" name="__codelineno-3-18" href="#__codelineno-3-18"></a> <a id="__codelineno-3-18" name="__codelineno-3-18" href="#__codelineno-3-18"></a>
<a id="__codelineno-3-19" name="__codelineno-3-19" href="#__codelineno-3-19"></a><span class="k">proc</span><span class="w"> </span><span class="nf">fetch</span><span class="p">(</span><span class="n">p</span><span class="p">:</span><span class="w"> </span><span class="n">MetricProto</span><span class="p">,</span><span class="w"> </span><span class="n">conn</span><span class="p">:</span><span class="w"> </span><span class="n">Connection</span><span class="p">):</span><span class="w"> </span><span class="n">Future</span><span class="o">[</span><span class="n">MetricList</span><span class="o">]</span><span class="w"> </span><span class="sx">{.async.}</span><span class="w"> </span><span class="o">=</span> <a id="__codelineno-3-19" name="__codelineno-3-19" href="#__codelineno-3-19"></a><span class="sx"> res</span><span class="w"> </span><span class="sx">= MetricProto.new(@[&quot;/metric-getter/1.0.0&quot;], handle)</span>
<a id="__codelineno-3-20" name="__codelineno-3-20" href="#__codelineno-3-20"></a><span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="n">protobuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">readLp</span><span class="p">(</span><span class="mi">2048</span><span class="p">)</span> <a id="__codelineno-3-20" name="__codelineno-3-20" href="#__codelineno-3-20"></a><span class="sx"> res.metricGetter</span><span class="w"> </span><span class="sx">= cb</span>
<a id="__codelineno-3-21" name="__codelineno-3-21" href="#__codelineno-3-21"></a><span class="w"> </span><span class="c"># tryGet will raise an exception if the Result contains an error.</span> <a id="__codelineno-3-21" name="__codelineno-3-21" href="#__codelineno-3-21"></a><span class="w"> </span><span class="sx">return</span><span class="w"> </span><span class="sx">res</span>
<a id="__codelineno-3-22" name="__codelineno-3-22" href="#__codelineno-3-22"></a><span class="w"> </span><span class="c"># It&#39;s useful to bridge between exception-world and result-world</span> <a id="__codelineno-3-22" name="__codelineno-3-22" href="#__codelineno-3-22"></a>
<a id="__codelineno-3-23" name="__codelineno-3-23" href="#__codelineno-3-23"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">MetricList</span><span class="p">.</span><span class="n">decode</span><span class="p">(</span><span class="n">protobuf</span><span class="p">).</span><span class="n">tryGet</span><span class="p">()</span> <a id="__codelineno-3-23" name="__codelineno-3-23" href="#__codelineno-3-23"></a><span class="sx">proc</span><span class="w"> </span><span class="sx">fetch(p</span>:<span class="w"> </span><span class="sx">MetricProto</span>,<span class="w"> </span><span class="sx">conn</span>:<span class="w"> </span><span class="sx">Connection): Future[MetricList] {.async.}</span><span class="w"> </span><span class="o">=</span>
<a id="__codelineno-3-24" name="__codelineno-3-24" href="#__codelineno-3-24"></a><span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="n">protobuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">readLp</span><span class="p">(</span><span class="mi">2048</span><span class="p">)</span>
<a id="__codelineno-3-25" name="__codelineno-3-25" href="#__codelineno-3-25"></a><span class="w"> </span><span class="c"># tryGet will raise an exception if the Result contains an error.</span>
<a id="__codelineno-3-26" name="__codelineno-3-26" href="#__codelineno-3-26"></a><span class="w"> </span><span class="c"># It&#39;s useful to bridge between exception-world and result-world</span>
<a id="__codelineno-3-27" name="__codelineno-3-27" href="#__codelineno-3-27"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">MetricList</span><span class="p">.</span><span class="n">decode</span><span class="p">(</span><span class="n">protobuf</span><span class="p">).</span><span class="n">tryGet</span><span class="p">()</span>
</code></pre></div> </code></pre></div>
We can now create our main procedure: We can now create our main procedure:
<div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="k">proc</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="sx">{.async.}</span><span class="w"> </span><span class="o">=</span> <div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="k">proc</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="sx">{.async.}</span><span class="w"> </span><span class="o">=</span>

View File

@ -34,9 +34,13 @@ proc createSwitch(rdv: RendezVous = RendezVous.new()): Switch =
const DumbCodec = "/dumb/proto/1.0.0" const DumbCodec = "/dumb/proto/1.0.0"
type DumbProto = ref object of LPProtocol type DumbProto = ref object of LPProtocol
proc new(T: typedesc[DumbProto], nodeNumber: int): T = proc new(T: typedesc[DumbProto], nodeNumber: int): T =
proc handle(conn: Connection, proto: string) {.async.} = proc handle(conn: Connection, proto: string) {.async: (raises: []).} =
echo "Node", nodeNumber, " received: ", string.fromBytes(await conn.readLp(1024)) try:
await conn.close() echo "Node", nodeNumber, " received: ", string.fromBytes(await conn.readLp(1024))
except:
echo "exception in handler", getCurrentException().msg
finally:
await conn.close()
return T.new(codecs = @[DumbCodec], handler = handle) return T.new(codecs = @[DumbCodec], handler = handle)

View File

@ -620,11 +620,15 @@ We'll not use newStandardSwitch this time as we need the discovery protocol
<a id="__codelineno-1-13" name="__codelineno-1-13" href="#__codelineno-1-13"></a><span class="k">const</span><span class="w"> </span><span class="n">DumbCodec</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;/dumb/proto/1.0.0&quot;</span> <a id="__codelineno-1-13" name="__codelineno-1-13" href="#__codelineno-1-13"></a><span class="k">const</span><span class="w"> </span><span class="n">DumbCodec</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;/dumb/proto/1.0.0&quot;</span>
<a id="__codelineno-1-14" name="__codelineno-1-14" href="#__codelineno-1-14"></a><span class="k">type</span><span class="w"> </span><span class="n">DumbProto</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">ref</span><span class="w"> </span><span class="k">object</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="n">LPProtocol</span> <a id="__codelineno-1-14" name="__codelineno-1-14" href="#__codelineno-1-14"></a><span class="k">type</span><span class="w"> </span><span class="n">DumbProto</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">ref</span><span class="w"> </span><span class="k">object</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="n">LPProtocol</span>
<a id="__codelineno-1-15" name="__codelineno-1-15" href="#__codelineno-1-15"></a><span class="k">proc</span><span class="w"> </span><span class="nf">new</span><span class="p">(</span><span class="n">T</span><span class="p">:</span><span class="w"> </span><span class="n">typedesc</span><span class="o">[</span><span class="n">DumbProto</span><span class="o">]</span><span class="p">,</span><span class="w"> </span><span class="n">nodeNumber</span><span class="p">:</span><span class="w"> </span><span class="nb">int</span><span class="p">):</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="o">=</span> <a id="__codelineno-1-15" name="__codelineno-1-15" href="#__codelineno-1-15"></a><span class="k">proc</span><span class="w"> </span><span class="nf">new</span><span class="p">(</span><span class="n">T</span><span class="p">:</span><span class="w"> </span><span class="n">typedesc</span><span class="o">[</span><span class="n">DumbProto</span><span class="o">]</span><span class="p">,</span><span class="w"> </span><span class="n">nodeNumber</span><span class="p">:</span><span class="w"> </span><span class="nb">int</span><span class="p">):</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="o">=</span>
<a id="__codelineno-1-16" name="__codelineno-1-16" href="#__codelineno-1-16"></a><span class="w"> </span><span class="k">proc</span><span class="w"> </span><span class="nf">handle</span><span class="p">(</span><span class="n">conn</span><span class="p">:</span><span class="w"> </span><span class="n">Connection</span><span class="p">,</span><span class="w"> </span><span class="n">proto</span><span class="p">:</span><span class="w"> </span><span class="nb">string</span><span class="p">)</span><span class="w"> </span><span class="sx">{.async.}</span><span class="w"> </span><span class="o">=</span> <a id="__codelineno-1-16" name="__codelineno-1-16" href="#__codelineno-1-16"></a><span class="w"> </span><span class="k">proc</span><span class="w"> </span><span class="nf">handle</span><span class="p">(</span><span class="n">conn</span><span class="p">:</span><span class="w"> </span><span class="n">Connection</span><span class="p">,</span><span class="w"> </span><span class="n">proto</span><span class="p">:</span><span class="w"> </span><span class="nb">string</span><span class="p">)</span><span class="w"> </span><span class="sx">{.async</span>:<span class="w"> </span><span class="sx">(raises</span>:<span class="w"> </span><span class="sx">[]).} =</span>
<a id="__codelineno-1-17" name="__codelineno-1-17" href="#__codelineno-1-17"></a><span class="w"> </span><span class="n">echo</span><span class="w"> </span><span class="s">&quot;Node&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">nodeNumber</span><span class="p">,</span><span class="w"> </span><span class="s">&quot; received: &quot;</span><span class="p">,</span><span class="w"> </span><span class="nb">string</span><span class="p">.</span><span class="n">fromBytes</span><span class="p">(</span><span class="n">await</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">readLp</span><span class="p">(</span><span class="mi">1024</span><span class="p">))</span> <a id="__codelineno-1-17" name="__codelineno-1-17" href="#__codelineno-1-17"></a><span class="sx"> try</span>:
<a id="__codelineno-1-18" name="__codelineno-1-18" href="#__codelineno-1-18"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">close</span><span class="p">()</span> <a id="__codelineno-1-18" name="__codelineno-1-18" href="#__codelineno-1-18"></a><span class="w"> </span><span class="sx">echo</span><span class="w"> </span><span class="sx">&quot;Node&quot;, nodeNumber</span>,<span class="w"> </span><span class="sx">&quot; received</span>:<span class="w"> </span><span class="sx">&quot;, string.fromBytes(await</span><span class="w"> </span><span class="sx">conn.readLp(1024))</span>
<a id="__codelineno-1-19" name="__codelineno-1-19" href="#__codelineno-1-19"></a> <a id="__codelineno-1-19" name="__codelineno-1-19" href="#__codelineno-1-19"></a><span class="sx"> except</span>:
<a id="__codelineno-1-20" name="__codelineno-1-20" href="#__codelineno-1-20"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">T</span><span class="p">.</span><span class="n">new</span><span class="p">(</span><span class="n">codecs</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">@[</span><span class="n">DumbCodec</span><span class="o">]</span><span class="p">,</span><span class="w"> </span><span class="n">handler</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">handle</span><span class="p">)</span> <a id="__codelineno-1-20" name="__codelineno-1-20" href="#__codelineno-1-20"></a><span class="w"> </span><span class="sx">echo</span><span class="w"> </span><span class="sx">&quot;exception</span><span class="w"> </span><span class="sx">in</span><span class="w"> </span><span class="sx">handler&quot;, getCurrentException().msg</span>
<a id="__codelineno-1-21" name="__codelineno-1-21" href="#__codelineno-1-21"></a><span class="w"> </span><span class="sx">finally</span>:
<a id="__codelineno-1-22" name="__codelineno-1-22" href="#__codelineno-1-22"></a><span class="w"> </span><span class="sx">await</span><span class="w"> </span><span class="sx">conn.close()</span>
<a id="__codelineno-1-23" name="__codelineno-1-23" href="#__codelineno-1-23"></a>
<a id="__codelineno-1-24" name="__codelineno-1-24" href="#__codelineno-1-24"></a><span class="sx"> return</span><span class="w"> </span><span class="sx">T.new(codecs</span><span class="w"> </span><span class="sx">= @[DumbCodec], handler</span><span class="w"> </span><span class="sx">= handle)</span>
</code></pre></div></p> </code></pre></div></p>
<h2 id="bootnodes">Bootnodes</h2> <h2 id="bootnodes">Bootnodes</h2>
<p>The first time a p2p program is ran, he needs to know how to join <p>The first time a p2p program is ran, he needs to know how to join

View File

@ -152,21 +152,24 @@ proc draw(g: Game) =
## peer know that we are available, check that he is also available, ## peer know that we are available, check that he is also available,
## and launch the game. ## and launch the game.
proc new(T: typedesc[GameProto], g: Game): T = proc new(T: typedesc[GameProto], g: Game): T =
proc handle(conn: Connection, proto: string) {.async.} = proc handle(conn: Connection, proto: string) {.async: (raises: []).} =
defer: defer:
await conn.closeWithEof() await conn.closeWithEof()
if g.peerFound.finished or g.hasCandidate: try:
await conn.close() if g.peerFound.finished or g.hasCandidate:
return await conn.close()
g.hasCandidate = true return
await conn.writeLp("ok") g.hasCandidate = true
if "ok" != string.fromBytes(await conn.readLp(1024)): await conn.writeLp("ok")
g.hasCandidate = false if "ok" != string.fromBytes(await conn.readLp(1024)):
return g.hasCandidate = false
g.peerFound.complete(conn) return
# The handler of a protocol must wait for the stream to g.peerFound.complete(conn)
# be finished before returning # The handler of a protocol must wait for the stream to
await conn.join() # be finished before returning
await conn.join()
except:
echo "exception in handler", getCurrentException().msg
return T.new(codecs = @["/tron/1.0.0"], handler = handle) return T.new(codecs = @["/tron/1.0.0"], handler = handle)

View File

@ -751,128 +751,131 @@ broadcasting his address.</p>
peer know that we are available, check that he is also available, peer know that we are available, check that he is also available,
and launch the game. and launch the game.
<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="k">proc</span><span class="w"> </span><span class="nf">new</span><span class="p">(</span><span class="n">T</span><span class="p">:</span><span class="w"> </span><span class="n">typedesc</span><span class="o">[</span><span class="n">GameProto</span><span class="o">]</span><span class="p">,</span><span class="w"> </span><span class="n">g</span><span class="p">:</span><span class="w"> </span><span class="n">Game</span><span class="p">):</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="o">=</span> <div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="k">proc</span><span class="w"> </span><span class="nf">new</span><span class="p">(</span><span class="n">T</span><span class="p">:</span><span class="w"> </span><span class="n">typedesc</span><span class="o">[</span><span class="n">GameProto</span><span class="o">]</span><span class="p">,</span><span class="w"> </span><span class="n">g</span><span class="p">:</span><span class="w"> </span><span class="n">Game</span><span class="p">):</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="o">=</span>
<a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a><span class="w"> </span><span class="k">proc</span><span class="w"> </span><span class="nf">handle</span><span class="p">(</span><span class="n">conn</span><span class="p">:</span><span class="w"> </span><span class="n">Connection</span><span class="p">,</span><span class="w"> </span><span class="n">proto</span><span class="p">:</span><span class="w"> </span><span class="nb">string</span><span class="p">)</span><span class="w"> </span><span class="sx">{.async.}</span><span class="w"> </span><span class="o">=</span> <a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a><span class="w"> </span><span class="k">proc</span><span class="w"> </span><span class="nf">handle</span><span class="p">(</span><span class="n">conn</span><span class="p">:</span><span class="w"> </span><span class="n">Connection</span><span class="p">,</span><span class="w"> </span><span class="n">proto</span><span class="p">:</span><span class="w"> </span><span class="nb">string</span><span class="p">)</span><span class="w"> </span><span class="sx">{.async</span>:<span class="w"> </span><span class="sx">(raises</span>:<span class="w"> </span><span class="sx">[]).} =</span>
<a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a><span class="w"> </span><span class="k">defer</span><span class="p">:</span> <a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a><span class="sx"> defer</span>:
<a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">closeWithEof</span><span class="p">()</span> <a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a><span class="w"> </span><span class="sx">await</span><span class="w"> </span><span class="sx">conn.closeWithEof()</span>
<a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">peerFound</span><span class="p">.</span><span class="n">finished</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">hasCandidate</span><span class="p">:</span> <a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a><span class="sx"> try</span>:
<a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">close</span><span class="p">()</span> <a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a><span class="w"> </span><span class="sx">if</span><span class="w"> </span><span class="sx">g.peerFound.finished</span><span class="w"> </span><span class="sx">or</span><span class="w"> </span><span class="sx">g.hasCandidate</span>:
<a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a><span class="w"> </span><span class="k">return</span> <a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a><span class="w"> </span><span class="sx">await</span><span class="w"> </span><span class="sx">conn.close()</span>
<a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">hasCandidate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">true</span> <a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a><span class="sx"> return</span>
<a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">writeLp</span><span class="p">(</span><span class="s">&quot;ok&quot;</span><span class="p">)</span> <a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a><span class="w"> </span><span class="sx">g.hasCandidate</span><span class="w"> </span><span class="sx">= true</span>
<a id="__codelineno-3-10" name="__codelineno-3-10" href="#__codelineno-3-10"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="s">&quot;ok&quot;</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nb">string</span><span class="p">.</span><span class="n">fromBytes</span><span class="p">(</span><span class="n">await</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">readLp</span><span class="p">(</span><span class="mi">1024</span><span class="p">)):</span> <a id="__codelineno-3-10" name="__codelineno-3-10" href="#__codelineno-3-10"></a><span class="w"> </span><span class="sx">await</span><span class="w"> </span><span class="sx">conn.writeLp(&quot;ok&quot;)</span>
<a id="__codelineno-3-11" name="__codelineno-3-11" href="#__codelineno-3-11"></a><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">hasCandidate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">false</span> <a id="__codelineno-3-11" name="__codelineno-3-11" href="#__codelineno-3-11"></a><span class="sx"> if</span><span class="w"> </span><span class="sx">&quot;ok&quot; != string.fromBytes(await</span><span class="w"> </span><span class="sx">conn.readLp(1024)):</span>
<a id="__codelineno-3-12" name="__codelineno-3-12" href="#__codelineno-3-12"></a><span class="w"> </span><span class="k">return</span> <a id="__codelineno-3-12" name="__codelineno-3-12" href="#__codelineno-3-12"></a><span class="sx"> g.hasCandidate</span><span class="w"> </span><span class="sx">= false</span>
<a id="__codelineno-3-13" name="__codelineno-3-13" href="#__codelineno-3-13"></a><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">peerFound</span><span class="p">.</span><span class="n">complete</span><span class="p">(</span><span class="n">conn</span><span class="p">)</span> <a id="__codelineno-3-13" name="__codelineno-3-13" href="#__codelineno-3-13"></a><span class="w"> </span><span class="sx">return</span>
<a id="__codelineno-3-14" name="__codelineno-3-14" href="#__codelineno-3-14"></a><span class="w"> </span><span class="c"># The handler of a protocol must wait for the stream to</span> <a id="__codelineno-3-14" name="__codelineno-3-14" href="#__codelineno-3-14"></a><span class="w"> </span><span class="sx">g.peerFound.complete(conn)</span>
<a id="__codelineno-3-15" name="__codelineno-3-15" href="#__codelineno-3-15"></a><span class="w"> </span><span class="c"># be finished before returning</span> <a id="__codelineno-3-15" name="__codelineno-3-15" href="#__codelineno-3-15"></a><span class="sx"> # The</span><span class="w"> </span><span class="sx">handler</span><span class="w"> </span><span class="sx">of</span><span class="w"> </span><span class="sx">a</span><span class="w"> </span><span class="sx">protocol</span><span class="w"> </span><span class="sx">must</span><span class="w"> </span><span class="sx">wait</span><span class="w"> </span><span class="sx">for</span><span class="w"> </span><span class="sx">the</span><span class="w"> </span><span class="sx">stream</span><span class="w"> </span><span class="sx">to</span>
<a id="__codelineno-3-16" name="__codelineno-3-16" href="#__codelineno-3-16"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">join</span><span class="p">()</span> <a id="__codelineno-3-16" name="__codelineno-3-16" href="#__codelineno-3-16"></a><span class="w"> </span><span class="sx"># be</span><span class="w"> </span><span class="sx">finished</span><span class="w"> </span><span class="sx">before</span><span class="w"> </span><span class="sx">returning</span>
<a id="__codelineno-3-17" name="__codelineno-3-17" href="#__codelineno-3-17"></a> <a id="__codelineno-3-17" name="__codelineno-3-17" href="#__codelineno-3-17"></a><span class="w"> </span><span class="sx">await</span><span class="w"> </span><span class="sx">conn.join()</span>
<a id="__codelineno-3-18" name="__codelineno-3-18" href="#__codelineno-3-18"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">T</span><span class="p">.</span><span class="n">new</span><span class="p">(</span><span class="n">codecs</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">@[</span><span class="s">&quot;/tron/1.0.0&quot;</span><span class="o">]</span><span class="p">,</span><span class="w"> </span><span class="n">handler</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">handle</span><span class="p">)</span> <a id="__codelineno-3-18" name="__codelineno-3-18" href="#__codelineno-3-18"></a><span class="sx"> except</span>:
<a id="__codelineno-3-19" name="__codelineno-3-19" href="#__codelineno-3-19"></a> <a id="__codelineno-3-19" name="__codelineno-3-19" href="#__codelineno-3-19"></a><span class="w"> </span><span class="sx">echo</span><span class="w"> </span><span class="sx">&quot;exception</span><span class="w"> </span><span class="sx">in</span><span class="w"> </span><span class="sx">handler&quot;, getCurrentException().msg</span>
<a id="__codelineno-3-20" name="__codelineno-3-20" href="#__codelineno-3-20"></a><span class="k">proc</span><span class="w"> </span><span class="nf">networking</span><span class="p">(</span><span class="n">g</span><span class="p">:</span><span class="w"> </span><span class="n">Game</span><span class="p">)</span><span class="w"> </span><span class="sx">{.async.}</span><span class="w"> </span><span class="o">=</span> <a id="__codelineno-3-20" name="__codelineno-3-20" href="#__codelineno-3-20"></a>
<a id="__codelineno-3-21" name="__codelineno-3-21" href="#__codelineno-3-21"></a><span class="w"> </span><span class="c"># Create our switch, similar to the GossipSub example and</span> <a id="__codelineno-3-21" name="__codelineno-3-21" href="#__codelineno-3-21"></a><span class="w"> </span><span class="sx">return</span><span class="w"> </span><span class="sx">T.new(codecs</span><span class="w"> </span><span class="sx">= @[&quot;/tron/1.0.0&quot;], handler</span><span class="w"> </span><span class="sx">= handle)</span>
<a id="__codelineno-3-22" name="__codelineno-3-22" href="#__codelineno-3-22"></a><span class="w"> </span><span class="c"># the Discovery examples combined</span> <a id="__codelineno-3-22" name="__codelineno-3-22" href="#__codelineno-3-22"></a>
<a id="__codelineno-3-23" name="__codelineno-3-23" href="#__codelineno-3-23"></a><span class="w"> </span><span class="k">let</span> <a id="__codelineno-3-23" name="__codelineno-3-23" href="#__codelineno-3-23"></a><span class="sx">proc</span><span class="w"> </span><span class="sx">networking(g</span>:<span class="w"> </span><span class="sx">Game) {.async.}</span><span class="w"> </span><span class="o">=</span>
<a id="__codelineno-3-24" name="__codelineno-3-24" href="#__codelineno-3-24"></a><span class="w"> </span><span class="n">rdv</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">RendezVous</span><span class="p">.</span><span class="n">new</span><span class="p">()</span> <a id="__codelineno-3-24" name="__codelineno-3-24" href="#__codelineno-3-24"></a><span class="w"> </span><span class="c"># Create our switch, similar to the GossipSub example and</span>
<a id="__codelineno-3-25" name="__codelineno-3-25" href="#__codelineno-3-25"></a><span class="w"> </span><span class="n">switch</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SwitchBuilder</span> <a id="__codelineno-3-25" name="__codelineno-3-25" href="#__codelineno-3-25"></a><span class="w"> </span><span class="c"># the Discovery examples combined</span>
<a id="__codelineno-3-26" name="__codelineno-3-26" href="#__codelineno-3-26"></a><span class="w"> </span><span class="p">.</span><span class="n">new</span><span class="p">()</span> <a id="__codelineno-3-26" name="__codelineno-3-26" href="#__codelineno-3-26"></a><span class="w"> </span><span class="k">let</span>
<a id="__codelineno-3-27" name="__codelineno-3-27" href="#__codelineno-3-27"></a><span class="w"> </span><span class="p">.</span><span class="n">withRng</span><span class="p">(</span><span class="n">newRng</span><span class="p">())</span> <a id="__codelineno-3-27" name="__codelineno-3-27" href="#__codelineno-3-27"></a><span class="w"> </span><span class="n">rdv</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">RendezVous</span><span class="p">.</span><span class="n">new</span><span class="p">()</span>
<a id="__codelineno-3-28" name="__codelineno-3-28" href="#__codelineno-3-28"></a><span class="w"> </span><span class="p">.</span><span class="n">withAddresses</span><span class="p">(</span><span class="o">@[</span><span class="n">MultiAddress</span><span class="p">.</span><span class="n">init</span><span class="p">(</span><span class="s">&quot;/ip4/0.0.0.0/tcp/0&quot;</span><span class="p">).</span><span class="n">tryGet</span><span class="p">()</span><span class="o">]</span><span class="p">)</span> <a id="__codelineno-3-28" name="__codelineno-3-28" href="#__codelineno-3-28"></a><span class="w"> </span><span class="n">switch</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SwitchBuilder</span>
<a id="__codelineno-3-29" name="__codelineno-3-29" href="#__codelineno-3-29"></a><span class="w"> </span><span class="p">.</span><span class="n">withTcpTransport</span><span class="p">()</span> <a id="__codelineno-3-29" name="__codelineno-3-29" href="#__codelineno-3-29"></a><span class="w"> </span><span class="p">.</span><span class="n">new</span><span class="p">()</span>
<a id="__codelineno-3-30" name="__codelineno-3-30" href="#__codelineno-3-30"></a><span class="w"> </span><span class="p">.</span><span class="n">withYamux</span><span class="p">()</span> <a id="__codelineno-3-30" name="__codelineno-3-30" href="#__codelineno-3-30"></a><span class="w"> </span><span class="p">.</span><span class="n">withRng</span><span class="p">(</span><span class="n">newRng</span><span class="p">())</span>
<a id="__codelineno-3-31" name="__codelineno-3-31" href="#__codelineno-3-31"></a><span class="w"> </span><span class="p">.</span><span class="n">withNoise</span><span class="p">()</span> <a id="__codelineno-3-31" name="__codelineno-3-31" href="#__codelineno-3-31"></a><span class="w"> </span><span class="p">.</span><span class="n">withAddresses</span><span class="p">(</span><span class="o">@[</span><span class="n">MultiAddress</span><span class="p">.</span><span class="n">init</span><span class="p">(</span><span class="s">&quot;/ip4/0.0.0.0/tcp/0&quot;</span><span class="p">).</span><span class="n">tryGet</span><span class="p">()</span><span class="o">]</span><span class="p">)</span>
<a id="__codelineno-3-32" name="__codelineno-3-32" href="#__codelineno-3-32"></a><span class="w"> </span><span class="p">.</span><span class="n">withRendezVous</span><span class="p">(</span><span class="n">rdv</span><span class="p">)</span> <a id="__codelineno-3-32" name="__codelineno-3-32" href="#__codelineno-3-32"></a><span class="w"> </span><span class="p">.</span><span class="n">withTcpTransport</span><span class="p">()</span>
<a id="__codelineno-3-33" name="__codelineno-3-33" href="#__codelineno-3-33"></a><span class="w"> </span><span class="p">.</span><span class="n">build</span><span class="p">()</span> <a id="__codelineno-3-33" name="__codelineno-3-33" href="#__codelineno-3-33"></a><span class="w"> </span><span class="p">.</span><span class="n">withYamux</span><span class="p">()</span>
<a id="__codelineno-3-34" name="__codelineno-3-34" href="#__codelineno-3-34"></a><span class="w"> </span><span class="n">dm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">DiscoveryManager</span><span class="p">()</span> <a id="__codelineno-3-34" name="__codelineno-3-34" href="#__codelineno-3-34"></a><span class="w"> </span><span class="p">.</span><span class="n">withNoise</span><span class="p">()</span>
<a id="__codelineno-3-35" name="__codelineno-3-35" href="#__codelineno-3-35"></a><span class="w"> </span><span class="n">gameProto</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">GameProto</span><span class="p">.</span><span class="n">new</span><span class="p">(</span><span class="n">g</span><span class="p">)</span> <a id="__codelineno-3-35" name="__codelineno-3-35" href="#__codelineno-3-35"></a><span class="w"> </span><span class="p">.</span><span class="n">withRendezVous</span><span class="p">(</span><span class="n">rdv</span><span class="p">)</span>
<a id="__codelineno-3-36" name="__codelineno-3-36" href="#__codelineno-3-36"></a><span class="w"> </span><span class="n">gossip</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">GossipSub</span><span class="p">.</span><span class="n">init</span><span class="p">(</span><span class="n">switch</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">switch</span><span class="p">,</span><span class="w"> </span><span class="n">triggerSelf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">false</span><span class="p">)</span> <a id="__codelineno-3-36" name="__codelineno-3-36" href="#__codelineno-3-36"></a><span class="w"> </span><span class="p">.</span><span class="n">build</span><span class="p">()</span>
<a id="__codelineno-3-37" name="__codelineno-3-37" href="#__codelineno-3-37"></a><span class="w"> </span><span class="n">dm</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">RendezVousInterface</span><span class="p">.</span><span class="n">new</span><span class="p">(</span><span class="n">rdv</span><span class="p">))</span> <a id="__codelineno-3-37" name="__codelineno-3-37" href="#__codelineno-3-37"></a><span class="w"> </span><span class="n">dm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">DiscoveryManager</span><span class="p">()</span>
<a id="__codelineno-3-38" name="__codelineno-3-38" href="#__codelineno-3-38"></a> <a id="__codelineno-3-38" name="__codelineno-3-38" href="#__codelineno-3-38"></a><span class="w"> </span><span class="n">gameProto</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">GameProto</span><span class="p">.</span><span class="n">new</span><span class="p">(</span><span class="n">g</span><span class="p">)</span>
<a id="__codelineno-3-39" name="__codelineno-3-39" href="#__codelineno-3-39"></a><span class="w"> </span><span class="n">switch</span><span class="p">.</span><span class="n">mount</span><span class="p">(</span><span class="n">gossip</span><span class="p">)</span> <a id="__codelineno-3-39" name="__codelineno-3-39" href="#__codelineno-3-39"></a><span class="w"> </span><span class="n">gossip</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">GossipSub</span><span class="p">.</span><span class="n">init</span><span class="p">(</span><span class="n">switch</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">switch</span><span class="p">,</span><span class="w"> </span><span class="n">triggerSelf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">false</span><span class="p">)</span>
<a id="__codelineno-3-40" name="__codelineno-3-40" href="#__codelineno-3-40"></a><span class="w"> </span><span class="n">switch</span><span class="p">.</span><span class="n">mount</span><span class="p">(</span><span class="n">gameProto</span><span class="p">)</span> <a id="__codelineno-3-40" name="__codelineno-3-40" href="#__codelineno-3-40"></a><span class="w"> </span><span class="n">dm</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">RendezVousInterface</span><span class="p">.</span><span class="n">new</span><span class="p">(</span><span class="n">rdv</span><span class="p">))</span>
<a id="__codelineno-3-41" name="__codelineno-3-41" href="#__codelineno-3-41"></a> <a id="__codelineno-3-41" name="__codelineno-3-41" href="#__codelineno-3-41"></a>
<a id="__codelineno-3-42" name="__codelineno-3-42" href="#__codelineno-3-42"></a><span class="w"> </span><span class="n">gossip</span><span class="p">.</span><span class="n">subscribe</span><span class="p">(</span> <a id="__codelineno-3-42" name="__codelineno-3-42" href="#__codelineno-3-42"></a><span class="w"> </span><span class="n">switch</span><span class="p">.</span><span class="n">mount</span><span class="p">(</span><span class="n">gossip</span><span class="p">)</span>
<a id="__codelineno-3-43" name="__codelineno-3-43" href="#__codelineno-3-43"></a><span class="w"> </span><span class="s">&quot;/tron/matchmaking&quot;</span><span class="p">,</span> <a id="__codelineno-3-43" name="__codelineno-3-43" href="#__codelineno-3-43"></a><span class="w"> </span><span class="n">switch</span><span class="p">.</span><span class="n">mount</span><span class="p">(</span><span class="n">gameProto</span><span class="p">)</span>
<a id="__codelineno-3-44" name="__codelineno-3-44" href="#__codelineno-3-44"></a><span class="w"> </span><span class="n">proc</span><span class="p">(</span><span class="n">topic</span><span class="p">:</span><span class="w"> </span><span class="nb">string</span><span class="p">,</span><span class="w"> </span><span class="n">data</span><span class="p">:</span><span class="w"> </span><span class="nb">seq</span><span class="o">[</span><span class="n">byte</span><span class="o">]</span><span class="p">)</span><span class="w"> </span><span class="sx">{.async.}</span><span class="w"> </span><span class="o">=</span> <a id="__codelineno-3-44" name="__codelineno-3-44" href="#__codelineno-3-44"></a>
<a id="__codelineno-3-45" name="__codelineno-3-45" href="#__codelineno-3-45"></a><span class="w"> </span><span class="c"># If we are still looking for an opponent,</span> <a id="__codelineno-3-45" name="__codelineno-3-45" href="#__codelineno-3-45"></a><span class="w"> </span><span class="n">gossip</span><span class="p">.</span><span class="n">subscribe</span><span class="p">(</span>
<a id="__codelineno-3-46" name="__codelineno-3-46" href="#__codelineno-3-46"></a><span class="w"> </span><span class="c"># try to match anyone broadcasting its address</span> <a id="__codelineno-3-46" name="__codelineno-3-46" href="#__codelineno-3-46"></a><span class="w"> </span><span class="s">&quot;/tron/matchmaking&quot;</span><span class="p">,</span>
<a id="__codelineno-3-47" name="__codelineno-3-47" href="#__codelineno-3-47"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">peerFound</span><span class="p">.</span><span class="n">finished</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">hasCandidate</span><span class="p">:</span> <a id="__codelineno-3-47" name="__codelineno-3-47" href="#__codelineno-3-47"></a><span class="w"> </span><span class="n">proc</span><span class="p">(</span><span class="n">topic</span><span class="p">:</span><span class="w"> </span><span class="nb">string</span><span class="p">,</span><span class="w"> </span><span class="n">data</span><span class="p">:</span><span class="w"> </span><span class="nb">seq</span><span class="o">[</span><span class="n">byte</span><span class="o">]</span><span class="p">)</span><span class="w"> </span><span class="sx">{.async.}</span><span class="w"> </span><span class="o">=</span>
<a id="__codelineno-3-48" name="__codelineno-3-48" href="#__codelineno-3-48"></a><span class="w"> </span><span class="k">return</span> <a id="__codelineno-3-48" name="__codelineno-3-48" href="#__codelineno-3-48"></a><span class="w"> </span><span class="c"># If we are still looking for an opponent,</span>
<a id="__codelineno-3-49" name="__codelineno-3-49" href="#__codelineno-3-49"></a><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">hasCandidate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">true</span> <a id="__codelineno-3-49" name="__codelineno-3-49" href="#__codelineno-3-49"></a><span class="w"> </span><span class="c"># try to match anyone broadcasting its address</span>
<a id="__codelineno-3-50" name="__codelineno-3-50" href="#__codelineno-3-50"></a> <a id="__codelineno-3-50" name="__codelineno-3-50" href="#__codelineno-3-50"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">peerFound</span><span class="p">.</span><span class="n">finished</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">hasCandidate</span><span class="p">:</span>
<a id="__codelineno-3-51" name="__codelineno-3-51" href="#__codelineno-3-51"></a><span class="w"> </span><span class="k">try</span><span class="p">:</span> <a id="__codelineno-3-51" name="__codelineno-3-51" href="#__codelineno-3-51"></a><span class="w"> </span><span class="k">return</span>
<a id="__codelineno-3-52" name="__codelineno-3-52" href="#__codelineno-3-52"></a><span class="w"> </span><span class="k">let</span> <a id="__codelineno-3-52" name="__codelineno-3-52" href="#__codelineno-3-52"></a><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">hasCandidate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">true</span>
<a id="__codelineno-3-53" name="__codelineno-3-53" href="#__codelineno-3-53"></a><span class="w"> </span><span class="p">(</span><span class="n">peerId</span><span class="p">,</span><span class="w"> </span><span class="n">multiAddress</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">parseFullAddress</span><span class="p">(</span><span class="n">data</span><span class="p">).</span><span class="n">tryGet</span><span class="p">()</span> <a id="__codelineno-3-53" name="__codelineno-3-53" href="#__codelineno-3-53"></a>
<a id="__codelineno-3-54" name="__codelineno-3-54" href="#__codelineno-3-54"></a><span class="w"> </span><span class="n">stream</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">switch</span><span class="p">.</span><span class="n">dial</span><span class="p">(</span><span class="n">peerId</span><span class="p">,</span><span class="w"> </span><span class="o">@[</span><span class="n">multiAddress</span><span class="o">]</span><span class="p">,</span><span class="w"> </span><span class="n">gameProto</span><span class="p">.</span><span class="n">codec</span><span class="p">)</span> <a id="__codelineno-3-54" name="__codelineno-3-54" href="#__codelineno-3-54"></a><span class="w"> </span><span class="k">try</span><span class="p">:</span>
<a id="__codelineno-3-55" name="__codelineno-3-55" href="#__codelineno-3-55"></a> <a id="__codelineno-3-55" name="__codelineno-3-55" href="#__codelineno-3-55"></a><span class="w"> </span><span class="k">let</span>
<a id="__codelineno-3-56" name="__codelineno-3-56" href="#__codelineno-3-56"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">stream</span><span class="p">.</span><span class="n">writeLp</span><span class="p">(</span><span class="s">&quot;ok&quot;</span><span class="p">)</span> <a id="__codelineno-3-56" name="__codelineno-3-56" href="#__codelineno-3-56"></a><span class="w"> </span><span class="p">(</span><span class="n">peerId</span><span class="p">,</span><span class="w"> </span><span class="n">multiAddress</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">parseFullAddress</span><span class="p">(</span><span class="n">data</span><span class="p">).</span><span class="n">tryGet</span><span class="p">()</span>
<a id="__codelineno-3-57" name="__codelineno-3-57" href="#__codelineno-3-57"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">await</span><span class="w"> </span><span class="n">stream</span><span class="p">.</span><span class="n">readLp</span><span class="p">(</span><span class="mi">10</span><span class="p">))</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="s">&quot;ok&quot;</span><span class="p">.</span><span class="n">toBytes</span><span class="p">:</span> <a id="__codelineno-3-57" name="__codelineno-3-57" href="#__codelineno-3-57"></a><span class="w"> </span><span class="n">stream</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">switch</span><span class="p">.</span><span class="n">dial</span><span class="p">(</span><span class="n">peerId</span><span class="p">,</span><span class="w"> </span><span class="o">@[</span><span class="n">multiAddress</span><span class="o">]</span><span class="p">,</span><span class="w"> </span><span class="n">gameProto</span><span class="p">.</span><span class="n">codec</span><span class="p">)</span>
<a id="__codelineno-3-58" name="__codelineno-3-58" href="#__codelineno-3-58"></a><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">hasCandidate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">false</span> <a id="__codelineno-3-58" name="__codelineno-3-58" href="#__codelineno-3-58"></a>
<a id="__codelineno-3-59" name="__codelineno-3-59" href="#__codelineno-3-59"></a><span class="w"> </span><span class="k">return</span> <a id="__codelineno-3-59" name="__codelineno-3-59" href="#__codelineno-3-59"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">stream</span><span class="p">.</span><span class="n">writeLp</span><span class="p">(</span><span class="s">&quot;ok&quot;</span><span class="p">)</span>
<a id="__codelineno-3-60" name="__codelineno-3-60" href="#__codelineno-3-60"></a><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">peerFound</span><span class="p">.</span><span class="n">complete</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span> <a id="__codelineno-3-60" name="__codelineno-3-60" href="#__codelineno-3-60"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">await</span><span class="w"> </span><span class="n">stream</span><span class="p">.</span><span class="n">readLp</span><span class="p">(</span><span class="mi">10</span><span class="p">))</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="s">&quot;ok&quot;</span><span class="p">.</span><span class="n">toBytes</span><span class="p">:</span>
<a id="__codelineno-3-61" name="__codelineno-3-61" href="#__codelineno-3-61"></a><span class="w"> </span><span class="c"># We are &quot;player 2&quot;</span> <a id="__codelineno-3-61" name="__codelineno-3-61" href="#__codelineno-3-61"></a><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">hasCandidate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">false</span>
<a id="__codelineno-3-62" name="__codelineno-3-62" href="#__codelineno-3-62"></a><span class="w"> </span><span class="n">swap</span><span class="p">(</span><span class="n">g</span><span class="p">.</span><span class="n">localPlayer</span><span class="p">,</span><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">remotePlayer</span><span class="p">)</span> <a id="__codelineno-3-62" name="__codelineno-3-62" href="#__codelineno-3-62"></a><span class="w"> </span><span class="k">return</span>
<a id="__codelineno-3-63" name="__codelineno-3-63" href="#__codelineno-3-63"></a><span class="w"> </span><span class="k">except</span><span class="w"> </span><span class="n">CatchableError</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">exc</span><span class="p">:</span> <a id="__codelineno-3-63" name="__codelineno-3-63" href="#__codelineno-3-63"></a><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">peerFound</span><span class="p">.</span><span class="n">complete</span><span class="p">(</span><span class="n">stream</span><span class="p">)</span>
<a id="__codelineno-3-64" name="__codelineno-3-64" href="#__codelineno-3-64"></a><span class="w"> </span><span class="k">discard</span><span class="p">,</span> <a id="__codelineno-3-64" name="__codelineno-3-64" href="#__codelineno-3-64"></a><span class="w"> </span><span class="c"># We are &quot;player 2&quot;</span>
<a id="__codelineno-3-65" name="__codelineno-3-65" href="#__codelineno-3-65"></a><span class="w"> </span><span class="p">)</span> <a id="__codelineno-3-65" name="__codelineno-3-65" href="#__codelineno-3-65"></a><span class="w"> </span><span class="n">swap</span><span class="p">(</span><span class="n">g</span><span class="p">.</span><span class="n">localPlayer</span><span class="p">,</span><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">remotePlayer</span><span class="p">)</span>
<a id="__codelineno-3-66" name="__codelineno-3-66" href="#__codelineno-3-66"></a> <a id="__codelineno-3-66" name="__codelineno-3-66" href="#__codelineno-3-66"></a><span class="w"> </span><span class="k">except</span><span class="w"> </span><span class="n">CatchableError</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">exc</span><span class="p">:</span>
<a id="__codelineno-3-67" name="__codelineno-3-67" href="#__codelineno-3-67"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">switch</span><span class="p">.</span><span class="n">start</span><span class="p">()</span> <a id="__codelineno-3-67" name="__codelineno-3-67" href="#__codelineno-3-67"></a><span class="w"> </span><span class="k">discard</span><span class="p">,</span>
<a id="__codelineno-3-68" name="__codelineno-3-68" href="#__codelineno-3-68"></a><span class="w"> </span><span class="k">defer</span><span class="p">:</span> <a id="__codelineno-3-68" name="__codelineno-3-68" href="#__codelineno-3-68"></a><span class="w"> </span><span class="p">)</span>
<a id="__codelineno-3-69" name="__codelineno-3-69" href="#__codelineno-3-69"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">switch</span><span class="p">.</span><span class="n">stop</span><span class="p">()</span> <a id="__codelineno-3-69" name="__codelineno-3-69" href="#__codelineno-3-69"></a>
<a id="__codelineno-3-70" name="__codelineno-3-70" href="#__codelineno-3-70"></a> <a id="__codelineno-3-70" name="__codelineno-3-70" href="#__codelineno-3-70"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">switch</span><span class="p">.</span><span class="n">start</span><span class="p">()</span>
<a id="__codelineno-3-71" name="__codelineno-3-71" href="#__codelineno-3-71"></a><span class="w"> </span><span class="c"># As explained in the last tutorial, we need a bootnode to be able</span> <a id="__codelineno-3-71" name="__codelineno-3-71" href="#__codelineno-3-71"></a><span class="w"> </span><span class="k">defer</span><span class="p">:</span>
<a id="__codelineno-3-72" name="__codelineno-3-72" href="#__codelineno-3-72"></a><span class="w"> </span><span class="c"># to find peers. We could use any libp2p running rendezvous (or any</span> <a id="__codelineno-3-72" name="__codelineno-3-72" href="#__codelineno-3-72"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">switch</span><span class="p">.</span><span class="n">stop</span><span class="p">()</span>
<a id="__codelineno-3-73" name="__codelineno-3-73" href="#__codelineno-3-73"></a><span class="w"> </span><span class="c"># node running tron). We will take it&#39;s MultiAddress from the command</span> <a id="__codelineno-3-73" name="__codelineno-3-73" href="#__codelineno-3-73"></a>
<a id="__codelineno-3-74" name="__codelineno-3-74" href="#__codelineno-3-74"></a><span class="w"> </span><span class="c"># line parameters</span> <a id="__codelineno-3-74" name="__codelineno-3-74" href="#__codelineno-3-74"></a><span class="w"> </span><span class="c"># As explained in the last tutorial, we need a bootnode to be able</span>
<a id="__codelineno-3-75" name="__codelineno-3-75" href="#__codelineno-3-75"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">paramCount</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="mi">0</span><span class="p">:</span> <a id="__codelineno-3-75" name="__codelineno-3-75" href="#__codelineno-3-75"></a><span class="w"> </span><span class="c"># to find peers. We could use any libp2p running rendezvous (or any</span>
<a id="__codelineno-3-76" name="__codelineno-3-76" href="#__codelineno-3-76"></a><span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="p">(</span><span class="n">peerId</span><span class="p">,</span><span class="w"> </span><span class="n">multiAddress</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">paramStr</span><span class="p">(</span><span class="mi">1</span><span class="p">).</span><span class="n">parseFullAddress</span><span class="p">().</span><span class="n">tryGet</span><span class="p">()</span> <a id="__codelineno-3-76" name="__codelineno-3-76" href="#__codelineno-3-76"></a><span class="w"> </span><span class="c"># node running tron). We will take it&#39;s MultiAddress from the command</span>
<a id="__codelineno-3-77" name="__codelineno-3-77" href="#__codelineno-3-77"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">switch</span><span class="p">.</span><span class="n">connect</span><span class="p">(</span><span class="n">peerId</span><span class="p">,</span><span class="w"> </span><span class="o">@[</span><span class="n">multiAddress</span><span class="o">]</span><span class="p">)</span> <a id="__codelineno-3-77" name="__codelineno-3-77" href="#__codelineno-3-77"></a><span class="w"> </span><span class="c"># line parameters</span>
<a id="__codelineno-3-78" name="__codelineno-3-78" href="#__codelineno-3-78"></a><span class="w"> </span><span class="k">else</span><span class="p">:</span> <a id="__codelineno-3-78" name="__codelineno-3-78" href="#__codelineno-3-78"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">paramCount</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="mi">0</span><span class="p">:</span>
<a id="__codelineno-3-79" name="__codelineno-3-79" href="#__codelineno-3-79"></a><span class="w"> </span><span class="n">echo</span><span class="w"> </span><span class="s">&quot;No bootnode provided, listening on: &quot;</span><span class="p">,</span><span class="w"> </span><span class="n">switch</span><span class="p">.</span><span class="n">peerInfo</span><span class="p">.</span><span class="n">fullAddrs</span><span class="p">.</span><span class="n">tryGet</span><span class="p">()</span> <a id="__codelineno-3-79" name="__codelineno-3-79" href="#__codelineno-3-79"></a><span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="p">(</span><span class="n">peerId</span><span class="p">,</span><span class="w"> </span><span class="n">multiAddress</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">paramStr</span><span class="p">(</span><span class="mi">1</span><span class="p">).</span><span class="n">parseFullAddress</span><span class="p">().</span><span class="n">tryGet</span><span class="p">()</span>
<a id="__codelineno-3-80" name="__codelineno-3-80" href="#__codelineno-3-80"></a> <a id="__codelineno-3-80" name="__codelineno-3-80" href="#__codelineno-3-80"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">switch</span><span class="p">.</span><span class="n">connect</span><span class="p">(</span><span class="n">peerId</span><span class="p">,</span><span class="w"> </span><span class="o">@[</span><span class="n">multiAddress</span><span class="o">]</span><span class="p">)</span>
<a id="__codelineno-3-81" name="__codelineno-3-81" href="#__codelineno-3-81"></a><span class="w"> </span><span class="c"># Discover peers from the bootnode, and connect to them</span> <a id="__codelineno-3-81" name="__codelineno-3-81" href="#__codelineno-3-81"></a><span class="w"> </span><span class="k">else</span><span class="p">:</span>
<a id="__codelineno-3-82" name="__codelineno-3-82" href="#__codelineno-3-82"></a><span class="w"> </span><span class="n">dm</span><span class="p">.</span><span class="n">advertise</span><span class="p">(</span><span class="n">RdvNamespace</span><span class="p">(</span><span class="s">&quot;tron&quot;</span><span class="p">))</span> <a id="__codelineno-3-82" name="__codelineno-3-82" href="#__codelineno-3-82"></a><span class="w"> </span><span class="n">echo</span><span class="w"> </span><span class="s">&quot;No bootnode provided, listening on: &quot;</span><span class="p">,</span><span class="w"> </span><span class="n">switch</span><span class="p">.</span><span class="n">peerInfo</span><span class="p">.</span><span class="n">fullAddrs</span><span class="p">.</span><span class="n">tryGet</span><span class="p">()</span>
<a id="__codelineno-3-83" name="__codelineno-3-83" href="#__codelineno-3-83"></a><span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="n">discoveryQuery</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">dm</span><span class="p">.</span><span class="n">request</span><span class="p">(</span><span class="n">RdvNamespace</span><span class="p">(</span><span class="s">&quot;tron&quot;</span><span class="p">))</span> <a id="__codelineno-3-83" name="__codelineno-3-83" href="#__codelineno-3-83"></a>
<a id="__codelineno-3-84" name="__codelineno-3-84" href="#__codelineno-3-84"></a><span class="w"> </span><span class="n">discoveryQuery</span><span class="p">.</span><span class="n">forEach</span><span class="p">:</span> <a id="__codelineno-3-84" name="__codelineno-3-84" href="#__codelineno-3-84"></a><span class="w"> </span><span class="c"># Discover peers from the bootnode, and connect to them</span>
<a id="__codelineno-3-85" name="__codelineno-3-85" href="#__codelineno-3-85"></a><span class="w"> </span><span class="k">try</span><span class="p">:</span> <a id="__codelineno-3-85" name="__codelineno-3-85" href="#__codelineno-3-85"></a><span class="w"> </span><span class="n">dm</span><span class="p">.</span><span class="n">advertise</span><span class="p">(</span><span class="n">RdvNamespace</span><span class="p">(</span><span class="s">&quot;tron&quot;</span><span class="p">))</span>
<a id="__codelineno-3-86" name="__codelineno-3-86" href="#__codelineno-3-86"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">switch</span><span class="p">.</span><span class="n">connect</span><span class="p">(</span><span class="n">peer</span><span class="o">[</span><span class="n">PeerId</span><span class="o">]</span><span class="p">,</span><span class="w"> </span><span class="n">peer</span><span class="p">.</span><span class="n">getAll</span><span class="p">(</span><span class="n">MultiAddress</span><span class="p">))</span> <a id="__codelineno-3-86" name="__codelineno-3-86" href="#__codelineno-3-86"></a><span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="n">discoveryQuery</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">dm</span><span class="p">.</span><span class="n">request</span><span class="p">(</span><span class="n">RdvNamespace</span><span class="p">(</span><span class="s">&quot;tron&quot;</span><span class="p">))</span>
<a id="__codelineno-3-87" name="__codelineno-3-87" href="#__codelineno-3-87"></a><span class="w"> </span><span class="k">except</span><span class="w"> </span><span class="n">CatchableError</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">exc</span><span class="p">:</span> <a id="__codelineno-3-87" name="__codelineno-3-87" href="#__codelineno-3-87"></a><span class="w"> </span><span class="n">discoveryQuery</span><span class="p">.</span><span class="n">forEach</span><span class="p">:</span>
<a id="__codelineno-3-88" name="__codelineno-3-88" href="#__codelineno-3-88"></a><span class="w"> </span><span class="n">echo</span><span class="w"> </span><span class="s">&quot;Failed to dial a peer: &quot;</span><span class="p">,</span><span class="w"> </span><span class="n">exc</span><span class="p">.</span><span class="n">msg</span> <a id="__codelineno-3-88" name="__codelineno-3-88" href="#__codelineno-3-88"></a><span class="w"> </span><span class="k">try</span><span class="p">:</span>
<a id="__codelineno-3-89" name="__codelineno-3-89" href="#__codelineno-3-89"></a> <a id="__codelineno-3-89" name="__codelineno-3-89" href="#__codelineno-3-89"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">switch</span><span class="p">.</span><span class="n">connect</span><span class="p">(</span><span class="n">peer</span><span class="o">[</span><span class="n">PeerId</span><span class="o">]</span><span class="p">,</span><span class="w"> </span><span class="n">peer</span><span class="p">.</span><span class="n">getAll</span><span class="p">(</span><span class="n">MultiAddress</span><span class="p">))</span>
<a id="__codelineno-3-90" name="__codelineno-3-90" href="#__codelineno-3-90"></a><span class="w"> </span><span class="c"># We will try to publish our address multiple times, in case</span> <a id="__codelineno-3-90" name="__codelineno-3-90" href="#__codelineno-3-90"></a><span class="w"> </span><span class="k">except</span><span class="w"> </span><span class="n">CatchableError</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">exc</span><span class="p">:</span>
<a id="__codelineno-3-91" name="__codelineno-3-91" href="#__codelineno-3-91"></a><span class="w"> </span><span class="c"># it takes time to establish connections with other GossipSub peers</span> <a id="__codelineno-3-91" name="__codelineno-3-91" href="#__codelineno-3-91"></a><span class="w"> </span><span class="n">echo</span><span class="w"> </span><span class="s">&quot;Failed to dial a peer: &quot;</span><span class="p">,</span><span class="w"> </span><span class="n">exc</span><span class="p">.</span><span class="n">msg</span>
<a id="__codelineno-3-92" name="__codelineno-3-92" href="#__codelineno-3-92"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="n">published</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">false</span> <a id="__codelineno-3-92" name="__codelineno-3-92" href="#__codelineno-3-92"></a>
<a id="__codelineno-3-93" name="__codelineno-3-93" href="#__codelineno-3-93"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="n">published</span><span class="p">:</span> <a id="__codelineno-3-93" name="__codelineno-3-93" href="#__codelineno-3-93"></a><span class="w"> </span><span class="c"># We will try to publish our address multiple times, in case</span>
<a id="__codelineno-3-94" name="__codelineno-3-94" href="#__codelineno-3-94"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">sleepAsync</span><span class="p">(</span><span class="mf">500.</span><span class="n">milliseconds</span><span class="p">)</span> <a id="__codelineno-3-94" name="__codelineno-3-94" href="#__codelineno-3-94"></a><span class="w"> </span><span class="c"># it takes time to establish connections with other GossipSub peers</span>
<a id="__codelineno-3-95" name="__codelineno-3-95" href="#__codelineno-3-95"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">fullAddr</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="n">switch</span><span class="p">.</span><span class="n">peerInfo</span><span class="p">.</span><span class="n">fullAddrs</span><span class="p">.</span><span class="n">tryGet</span><span class="p">():</span> <a id="__codelineno-3-95" name="__codelineno-3-95" href="#__codelineno-3-95"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="n">published</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">false</span>
<a id="__codelineno-3-96" name="__codelineno-3-96" href="#__codelineno-3-96"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">await</span><span class="w"> </span><span class="n">gossip</span><span class="p">.</span><span class="n">publish</span><span class="p">(</span><span class="s">&quot;/tron/matchmaking&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">fullAddr</span><span class="p">.</span><span class="n">bytes</span><span class="p">))</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">:</span> <a id="__codelineno-3-96" name="__codelineno-3-96" href="#__codelineno-3-96"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="n">published</span><span class="p">:</span>
<a id="__codelineno-3-97" name="__codelineno-3-97" href="#__codelineno-3-97"></a><span class="w"> </span><span class="n">published</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">false</span> <a id="__codelineno-3-97" name="__codelineno-3-97" href="#__codelineno-3-97"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">sleepAsync</span><span class="p">(</span><span class="mf">500.</span><span class="n">milliseconds</span><span class="p">)</span>
<a id="__codelineno-3-98" name="__codelineno-3-98" href="#__codelineno-3-98"></a><span class="w"> </span><span class="k">break</span> <a id="__codelineno-3-98" name="__codelineno-3-98" href="#__codelineno-3-98"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">fullAddr</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="n">switch</span><span class="p">.</span><span class="n">peerInfo</span><span class="p">.</span><span class="n">fullAddrs</span><span class="p">.</span><span class="n">tryGet</span><span class="p">():</span>
<a id="__codelineno-3-99" name="__codelineno-3-99" href="#__codelineno-3-99"></a><span class="w"> </span><span class="n">published</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">true</span> <a id="__codelineno-3-99" name="__codelineno-3-99" href="#__codelineno-3-99"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">await</span><span class="w"> </span><span class="n">gossip</span><span class="p">.</span><span class="n">publish</span><span class="p">(</span><span class="s">&quot;/tron/matchmaking&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">fullAddr</span><span class="p">.</span><span class="n">bytes</span><span class="p">))</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">:</span>
<a id="__codelineno-3-100" name="__codelineno-3-100" href="#__codelineno-3-100"></a> <a id="__codelineno-3-100" name="__codelineno-3-100" href="#__codelineno-3-100"></a><span class="w"> </span><span class="n">published</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">false</span>
<a id="__codelineno-3-101" name="__codelineno-3-101" href="#__codelineno-3-101"></a><span class="w"> </span><span class="n">discoveryQuery</span><span class="p">.</span><span class="n">stop</span><span class="p">()</span> <a id="__codelineno-3-101" name="__codelineno-3-101" href="#__codelineno-3-101"></a><span class="w"> </span><span class="k">break</span>
<a id="__codelineno-3-102" name="__codelineno-3-102" href="#__codelineno-3-102"></a> <a id="__codelineno-3-102" name="__codelineno-3-102" href="#__codelineno-3-102"></a><span class="w"> </span><span class="n">published</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kp">true</span>
<a id="__codelineno-3-103" name="__codelineno-3-103" href="#__codelineno-3-103"></a><span class="w"> </span><span class="c"># We now wait for someone to connect to us (or for us to connect to someone)</span> <a id="__codelineno-3-103" name="__codelineno-3-103" href="#__codelineno-3-103"></a>
<a id="__codelineno-3-104" name="__codelineno-3-104" href="#__codelineno-3-104"></a><span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="n">peerConn</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">peerFound</span> <a id="__codelineno-3-104" name="__codelineno-3-104" href="#__codelineno-3-104"></a><span class="w"> </span><span class="n">discoveryQuery</span><span class="p">.</span><span class="n">stop</span><span class="p">()</span>
<a id="__codelineno-3-105" name="__codelineno-3-105" href="#__codelineno-3-105"></a><span class="w"> </span><span class="k">defer</span><span class="p">:</span> <a id="__codelineno-3-105" name="__codelineno-3-105" href="#__codelineno-3-105"></a>
<a id="__codelineno-3-106" name="__codelineno-3-106" href="#__codelineno-3-106"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">peerConn</span><span class="p">.</span><span class="n">closeWithEof</span><span class="p">()</span> <a id="__codelineno-3-106" name="__codelineno-3-106" href="#__codelineno-3-106"></a><span class="w"> </span><span class="c"># We now wait for someone to connect to us (or for us to connect to someone)</span>
<a id="__codelineno-3-107" name="__codelineno-3-107" href="#__codelineno-3-107"></a> <a id="__codelineno-3-107" name="__codelineno-3-107" href="#__codelineno-3-107"></a><span class="w"> </span><span class="k">let</span><span class="w"> </span><span class="n">peerConn</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">peerFound</span>
<a id="__codelineno-3-108" name="__codelineno-3-108" href="#__codelineno-3-108"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">mainLoop</span><span class="p">(</span><span class="n">peerConn</span><span class="p">)</span> <a id="__codelineno-3-108" name="__codelineno-3-108" href="#__codelineno-3-108"></a><span class="w"> </span><span class="k">defer</span><span class="p">:</span>
<a id="__codelineno-3-109" name="__codelineno-3-109" href="#__codelineno-3-109"></a> <a id="__codelineno-3-109" name="__codelineno-3-109" href="#__codelineno-3-109"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">peerConn</span><span class="p">.</span><span class="n">closeWithEof</span><span class="p">()</span>
<a id="__codelineno-3-110" name="__codelineno-3-110" href="#__codelineno-3-110"></a><span class="k">let</span> <a id="__codelineno-3-110" name="__codelineno-3-110" href="#__codelineno-3-110"></a>
<a id="__codelineno-3-111" name="__codelineno-3-111" href="#__codelineno-3-111"></a><span class="w"> </span><span class="n">game</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Game</span><span class="p">.</span><span class="n">new</span><span class="p">()</span> <a id="__codelineno-3-111" name="__codelineno-3-111" href="#__codelineno-3-111"></a><span class="w"> </span><span class="n">await</span><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">mainLoop</span><span class="p">(</span><span class="n">peerConn</span><span class="p">)</span>
<a id="__codelineno-3-112" name="__codelineno-3-112" href="#__codelineno-3-112"></a><span class="w"> </span><span class="n">netFut</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">networking</span><span class="p">(</span><span class="n">game</span><span class="p">)</span> <a id="__codelineno-3-112" name="__codelineno-3-112" href="#__codelineno-3-112"></a>
<a id="__codelineno-3-113" name="__codelineno-3-113" href="#__codelineno-3-113"></a><span class="n">nico</span><span class="p">.</span><span class="n">init</span><span class="p">(</span><span class="s">&quot;Status&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;Tron&quot;</span><span class="p">)</span> <a id="__codelineno-3-113" name="__codelineno-3-113" href="#__codelineno-3-113"></a><span class="k">let</span>
<a id="__codelineno-3-114" name="__codelineno-3-114" href="#__codelineno-3-114"></a><span class="n">nico</span><span class="p">.</span><span class="n">createWindow</span><span class="p">(</span><span class="s">&quot;Tron&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">mapSize</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="n">mapSize</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="kp">false</span><span class="p">)</span> <a id="__codelineno-3-114" name="__codelineno-3-114" href="#__codelineno-3-114"></a><span class="w"> </span><span class="n">game</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Game</span><span class="p">.</span><span class="n">new</span><span class="p">()</span>
<a id="__codelineno-3-115" name="__codelineno-3-115" href="#__codelineno-3-115"></a><span class="n">nico</span><span class="p">.</span><span class="n">run</span><span class="p">(</span> <a id="__codelineno-3-115" name="__codelineno-3-115" href="#__codelineno-3-115"></a><span class="w"> </span><span class="n">netFut</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">networking</span><span class="p">(</span><span class="n">game</span><span class="p">)</span>
<a id="__codelineno-3-116" name="__codelineno-3-116" href="#__codelineno-3-116"></a><span class="w"> </span><span class="n">proc</span><span class="p">()</span><span class="w"> </span><span class="o">=</span> <a id="__codelineno-3-116" name="__codelineno-3-116" href="#__codelineno-3-116"></a><span class="n">nico</span><span class="p">.</span><span class="n">init</span><span class="p">(</span><span class="s">&quot;Status&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;Tron&quot;</span><span class="p">)</span>
<a id="__codelineno-3-117" name="__codelineno-3-117" href="#__codelineno-3-117"></a><span class="w"> </span><span class="k">discard</span><span class="p">,</span> <a id="__codelineno-3-117" name="__codelineno-3-117" href="#__codelineno-3-117"></a><span class="n">nico</span><span class="p">.</span><span class="n">createWindow</span><span class="p">(</span><span class="s">&quot;Tron&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">mapSize</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="n">mapSize</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="kp">false</span><span class="p">)</span>
<a id="__codelineno-3-118" name="__codelineno-3-118" href="#__codelineno-3-118"></a><span class="w"> </span><span class="n">proc</span><span class="p">(</span><span class="n">dt</span><span class="p">:</span><span class="w"> </span><span class="nb">float32</span><span class="p">)</span><span class="w"> </span><span class="o">=</span> <a id="__codelineno-3-118" name="__codelineno-3-118" href="#__codelineno-3-118"></a><span class="n">nico</span><span class="p">.</span><span class="n">run</span><span class="p">(</span>
<a id="__codelineno-3-119" name="__codelineno-3-119" href="#__codelineno-3-119"></a><span class="w"> </span><span class="n">game</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="n">dt</span><span class="p">),</span> <a id="__codelineno-3-119" name="__codelineno-3-119" href="#__codelineno-3-119"></a><span class="w"> </span><span class="n">proc</span><span class="p">()</span><span class="w"> </span><span class="o">=</span>
<a id="__codelineno-3-120" name="__codelineno-3-120" href="#__codelineno-3-120"></a><span class="w"> </span><span class="n">proc</span><span class="p">()</span><span class="w"> </span><span class="o">=</span> <a id="__codelineno-3-120" name="__codelineno-3-120" href="#__codelineno-3-120"></a><span class="w"> </span><span class="k">discard</span><span class="p">,</span>
<a id="__codelineno-3-121" name="__codelineno-3-121" href="#__codelineno-3-121"></a><span class="w"> </span><span class="n">game</span><span class="p">.</span><span class="n">draw</span><span class="p">(),</span> <a id="__codelineno-3-121" name="__codelineno-3-121" href="#__codelineno-3-121"></a><span class="w"> </span><span class="n">proc</span><span class="p">(</span><span class="n">dt</span><span class="p">:</span><span class="w"> </span><span class="nb">float32</span><span class="p">)</span><span class="w"> </span><span class="o">=</span>
<a id="__codelineno-3-122" name="__codelineno-3-122" href="#__codelineno-3-122"></a><span class="p">)</span> <a id="__codelineno-3-122" name="__codelineno-3-122" href="#__codelineno-3-122"></a><span class="w"> </span><span class="n">game</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="n">dt</span><span class="p">),</span>
<a id="__codelineno-3-123" name="__codelineno-3-123" href="#__codelineno-3-123"></a><span class="n">waitFor</span><span class="p">(</span><span class="n">netFut</span><span class="p">.</span><span class="n">cancelAndWait</span><span class="p">())</span> <a id="__codelineno-3-123" name="__codelineno-3-123" href="#__codelineno-3-123"></a><span class="w"> </span><span class="n">proc</span><span class="p">()</span><span class="w"> </span><span class="o">=</span>
<a id="__codelineno-3-124" name="__codelineno-3-124" href="#__codelineno-3-124"></a><span class="w"> </span><span class="n">game</span><span class="p">.</span><span class="n">draw</span><span class="p">(),</span>
<a id="__codelineno-3-125" name="__codelineno-3-125" href="#__codelineno-3-125"></a><span class="p">)</span>
<a id="__codelineno-3-126" name="__codelineno-3-126" href="#__codelineno-3-126"></a><span class="n">waitFor</span><span class="p">(</span><span class="n">netFut</span><span class="p">.</span><span class="n">cancelAndWait</span><span class="p">())</span>
</code></pre></div> </code></pre></div>
And that's it! If you want to run this code locally, the simplest way is to use the And that's it! If you want to run this code locally, the simplest way is to use the
first node as a boot node for the second one. But you can also use any rendezvous node</p> first node as a boot node for the second one. But you can also use any rendezvous node</p>