|  |  |  | @ -80,7 +80,13 @@ program.</p> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># existence, which will let the network know they are reachable</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># and autoomatically create paths to them, from anywhere else</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># in the network.</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">destination</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="p">(</span><span class="n">identity</span><span class="p">,</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">IN</span><span class="p">,</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">SINGLE</span><span class="p">,</span> <span class="n">APP_NAME</span><span class="p">,</span> <span class="s2">"minimalsample"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">destination</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">identity</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">IN</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">SINGLE</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">APP_NAME</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="s2">"minimalsample"</span> | 
		
	
		
			
				|  |  |  |  |     <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># We configure the destination to automatically prove all</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># packets adressed to it. By doing this, RNS will automatically</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -97,7 +103,11 @@ program.</p> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | <span class="k">def</span> <span class="nf">announceLoop</span><span class="p">(</span><span class="n">destination</span><span class="p">):</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># Let the user know that everything is ready</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s2">"Minimal example "</span><span class="o">+</span><span class="n">RNS</span><span class="o">.</span><span class="n">prettyhexrep</span><span class="p">(</span><span class="n">destination</span><span class="o">.</span><span class="n">hash</span><span class="p">)</span><span class="o">+</span><span class="s2">" running, hit enter to manually send an announce (Ctrl-C to quit)"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |         <span class="s2">"Minimal example "</span><span class="o">+</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">prettyhexrep</span><span class="p">(</span><span class="n">destination</span><span class="o">.</span><span class="n">hash</span><span class="p">)</span><span class="o">+</span> | 
		
	
		
			
				|  |  |  |  |         <span class="s2">" running, hit enter to manually send an announce (Ctrl-C to quit)"</span> | 
		
	
		
			
				|  |  |  |  |     <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># We enter a loop that runs until the users exits.</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># If the user hits enter, we will announce our server</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -118,8 +128,18 @@ program.</p> | 
		
	
		
			
				|  |  |  |  | <span class="c1"># the desired program mode.</span> | 
		
	
		
			
				|  |  |  |  | <span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span> | 
		
	
		
			
				|  |  |  |  |     <span class="k">try</span><span class="p">:</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s2">"Bare minimum example to start Reticulum and create a destination"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">"--config"</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">"store"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">"path to alternative Reticulum config directory"</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">str</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">description</span><span class="o">=</span><span class="s2">"Minimal example to start Reticulum and create a destination"</span> | 
		
	
		
			
				|  |  |  |  |         <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |             <span class="s2">"--config"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">action</span><span class="o">=</span><span class="s2">"store"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">help</span><span class="o">=</span><span class="s2">"path to alternative Reticulum config directory"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="nb">type</span><span class="o">=</span><span class="nb">str</span> | 
		
	
		
			
				|  |  |  |  |         <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="k">if</span> <span class="n">args</span><span class="o">.</span><span class="n">config</span><span class="p">:</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -158,7 +178,7 @@ notifications about announces from relevant destinations.</p> | 
		
	
		
			
				|  |  |  |  | <span class="n">APP_NAME</span> <span class="o">=</span> <span class="s2">"example_utilities"</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | <span class="c1"># We initialise two lists of strings to use as app_data</span> | 
		
	
		
			
				|  |  |  |  | <span class="n">fruits</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"Peach"</span><span class="p">,</span> <span class="s2">"Quince"</span><span class="p">,</span> <span class="s2">"Date palm"</span><span class="p">,</span> <span class="s2">"Tangerine"</span><span class="p">,</span> <span class="s2">"Pomelo"</span><span class="p">,</span> <span class="s2">"Carambola"</span><span class="p">,</span> <span class="s2">"Grape"</span><span class="p">,</span> <span class="s2">"Passion fruit"</span><span class="p">,</span> <span class="s2">"Prune"</span><span class="p">,</span> <span class="s2">"Cranberry"</span><span class="p">,</span> <span class="s2">"Strawberry"</span><span class="p">,</span> <span class="s2">"Papaya"</span><span class="p">,</span> <span class="s2">"Pomegranate"</span><span class="p">,</span> <span class="s2">"Avocado"</span><span class="p">,</span> <span class="s2">"Mango"</span><span class="p">]</span> | 
		
	
		
			
				|  |  |  |  | <span class="n">fruits</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"Peach"</span><span class="p">,</span> <span class="s2">"Quince"</span><span class="p">,</span> <span class="s2">"Date palm"</span><span class="p">,</span> <span class="s2">"Tangerine"</span><span class="p">,</span> <span class="s2">"Pomelo"</span><span class="p">,</span> <span class="s2">"Carambola"</span><span class="p">,</span> <span class="s2">"Grape"</span><span class="p">]</span> | 
		
	
		
			
				|  |  |  |  | <span class="n">noble_gases</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"Helium"</span><span class="p">,</span> <span class="s2">"Neon"</span><span class="p">,</span> <span class="s2">"Argon"</span><span class="p">,</span> <span class="s2">"Krypton"</span><span class="p">,</span> <span class="s2">"Xenon"</span><span class="p">,</span> <span class="s2">"Radon"</span><span class="p">,</span> <span class="s2">"Oganesson"</span><span class="p">]</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | <span class="c1"># This initialisation is executed when the program is started</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -177,8 +197,23 @@ notifications about announces from relevant destinations.</p> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># existence, which will let the network know they are reachable</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># and autoomatically create paths to them, from anywhere else</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># in the network.</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">destination_1</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="p">(</span><span class="n">identity</span><span class="p">,</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">IN</span><span class="p">,</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">SINGLE</span><span class="p">,</span> <span class="n">APP_NAME</span><span class="p">,</span> <span class="s2">"announcesample"</span><span class="p">,</span> <span class="s2">"fruits"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">destination_2</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="p">(</span><span class="n">identity</span><span class="p">,</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">IN</span><span class="p">,</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">SINGLE</span><span class="p">,</span> <span class="n">APP_NAME</span><span class="p">,</span> <span class="s2">"announcesample"</span><span class="p">,</span> <span class="s2">"noble_gases"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">destination_1</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">identity</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">IN</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">SINGLE</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">APP_NAME</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="s2">"announcesample"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="s2">"fruits"</span> | 
		
	
		
			
				|  |  |  |  |     <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     <span class="n">destination_2</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">identity</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">IN</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">SINGLE</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">APP_NAME</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="s2">"announcesample"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="s2">"noble_gases"</span> | 
		
	
		
			
				|  |  |  |  |     <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># We configure the destinations to automatically prove all</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># packets adressed to it. By doing this, RNS will automatically</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -192,7 +227,9 @@ notifications about announces from relevant destinations.</p> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># We create an announce handler and configure it to only ask for</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># announces from "example_utilities.announcesample.fruits".</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># Try changing the filter and see what happens.</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">announce_handler</span> <span class="o">=</span> <span class="n">ExampleAnnounceHandler</span><span class="p">(</span><span class="n">aspect_filter</span><span class="o">=</span><span class="s2">"example_utilities.announcesample.fruits"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">announce_handler</span> <span class="o">=</span> <span class="n">ExampleAnnounceHandler</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">aspect_filter</span><span class="o">=</span><span class="s2">"example_utilities.announcesample.fruits"</span> | 
		
	
		
			
				|  |  |  |  |     <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># We register the announce handler with Reticulum</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">RNS</span><span class="o">.</span><span class="n">Transport</span><span class="o">.</span><span class="n">register_announce_handler</span><span class="p">(</span><span class="n">announce_handler</span><span class="p">)</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -218,14 +255,22 @@ notifications about announces from relevant destinations.</p> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="c1"># Send the announce including the app data</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">destination_1</span><span class="o">.</span><span class="n">announce</span><span class="p">(</span><span class="n">app_data</span><span class="o">=</span><span class="n">fruit</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">))</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s2">"Sent announce from "</span><span class="o">+</span><span class="n">RNS</span><span class="o">.</span><span class="n">prettyhexrep</span><span class="p">(</span><span class="n">destination_1</span><span class="o">.</span><span class="n">hash</span><span class="p">)</span><span class="o">+</span><span class="s2">" ("</span><span class="o">+</span><span class="n">destination_1</span><span class="o">.</span><span class="n">name</span><span class="o">+</span><span class="s2">")"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |             <span class="s2">"Sent announce from "</span><span class="o">+</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">RNS</span><span class="o">.</span><span class="n">prettyhexrep</span><span class="p">(</span><span class="n">destination_1</span><span class="o">.</span><span class="n">hash</span><span class="p">)</span><span class="o">+</span> | 
		
	
		
			
				|  |  |  |  |             <span class="s2">" ("</span><span class="o">+</span><span class="n">destination_1</span><span class="o">.</span><span class="n">name</span><span class="o">+</span><span class="s2">")"</span> | 
		
	
		
			
				|  |  |  |  |         <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="c1"># Randomly select a noble gas</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">noble_gas</span> <span class="o">=</span> <span class="n">noble_gases</span><span class="p">[</span><span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="nb">len</span><span class="p">(</span><span class="n">noble_gases</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">)]</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="c1"># Send the announce including the app data</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">destination_2</span><span class="o">.</span><span class="n">announce</span><span class="p">(</span><span class="n">app_data</span><span class="o">=</span><span class="n">noble_gas</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">))</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s2">"Sent announce from "</span><span class="o">+</span><span class="n">RNS</span><span class="o">.</span><span class="n">prettyhexrep</span><span class="p">(</span><span class="n">destination_2</span><span class="o">.</span><span class="n">hash</span><span class="p">)</span><span class="o">+</span><span class="s2">" ("</span><span class="o">+</span><span class="n">destination_2</span><span class="o">.</span><span class="n">name</span><span class="o">+</span><span class="s2">")"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |             <span class="s2">"Sent announce from "</span><span class="o">+</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">RNS</span><span class="o">.</span><span class="n">prettyhexrep</span><span class="p">(</span><span class="n">destination_2</span><span class="o">.</span><span class="n">hash</span><span class="p">)</span><span class="o">+</span> | 
		
	
		
			
				|  |  |  |  |             <span class="s2">" ("</span><span class="o">+</span><span class="n">destination_2</span><span class="o">.</span><span class="n">name</span><span class="o">+</span><span class="s2">")"</span> | 
		
	
		
			
				|  |  |  |  |         <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | <span class="c1"># We will need to define an announce handler class that</span> | 
		
	
		
			
				|  |  |  |  | <span class="c1"># Reticulum can message when an announce arrives.</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -243,8 +288,15 @@ notifications about announces from relevant destinations.</p> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># configured aspect filter. Filters must be specific,</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># and cannot use wildcards.</span> | 
		
	
		
			
				|  |  |  |  |     <span class="k">def</span> <span class="nf">received_announce</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">destination_hash</span><span class="p">,</span> <span class="n">announced_identity</span><span class="p">,</span> <span class="n">app_data</span><span class="p">):</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s2">"Received an announce from "</span><span class="o">+</span><span class="n">RNS</span><span class="o">.</span><span class="n">prettyhexrep</span><span class="p">(</span><span class="n">destination_hash</span><span class="p">))</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s2">"The announce contained the following app data: "</span><span class="o">+</span><span class="n">app_data</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">))</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |             <span class="s2">"Received an announce from "</span><span class="o">+</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">RNS</span><span class="o">.</span><span class="n">prettyhexrep</span><span class="p">(</span><span class="n">destination_hash</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |         <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |             <span class="s2">"The announce contained the following app data: "</span><span class="o">+</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">app_data</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |         <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | <span class="c1">##########################################################</span> | 
		
	
		
			
				|  |  |  |  | <span class="c1">#### Program Startup #####################################</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -255,8 +307,18 @@ notifications about announces from relevant destinations.</p> | 
		
	
		
			
				|  |  |  |  | <span class="c1"># the desired program mode.</span> | 
		
	
		
			
				|  |  |  |  | <span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span> | 
		
	
		
			
				|  |  |  |  |     <span class="k">try</span><span class="p">:</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s2">"Reticulum example that demonstrates announces and announce handlers"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">"--config"</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">"store"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">"path to alternative Reticulum config directory"</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">str</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">description</span><span class="o">=</span><span class="s2">"Reticulum example that demonstrates announces and announce handlers"</span> | 
		
	
		
			
				|  |  |  |  |         <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |             <span class="s2">"--config"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">action</span><span class="o">=</span><span class="s2">"store"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">help</span><span class="o">=</span><span class="s2">"path to alternative Reticulum config directory"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="nb">type</span><span class="o">=</span><span class="nb">str</span> | 
		
	
		
			
				|  |  |  |  |         <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="k">if</span> <span class="n">args</span><span class="o">.</span><span class="n">config</span><span class="p">:</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -307,7 +369,14 @@ over the network.</p> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># We create a PLAIN destination. This is an uncencrypted endpoint</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># that anyone can listen to and send information to.</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">broadcast_destination</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">IN</span><span class="p">,</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">PLAIN</span><span class="p">,</span> <span class="n">APP_NAME</span><span class="p">,</span> <span class="s2">"broadcast"</span><span class="p">,</span> <span class="n">channel</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">broadcast_destination</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |         <span class="kc">None</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">IN</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">PLAIN</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">APP_NAME</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="s2">"broadcast"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">channel</span> | 
		
	
		
			
				|  |  |  |  |     <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># We specify a callback that will get called every time</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># the destination receives data.</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -325,7 +394,11 @@ over the network.</p> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | <span class="k">def</span> <span class="nf">broadcastLoop</span><span class="p">(</span><span class="n">destination</span><span class="p">):</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># Let the user know that everything is ready</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s2">"Broadcast example "</span><span class="o">+</span><span class="n">RNS</span><span class="o">.</span><span class="n">prettyhexrep</span><span class="p">(</span><span class="n">destination</span><span class="o">.</span><span class="n">hash</span><span class="p">)</span><span class="o">+</span><span class="s2">" running, enter text and hit enter to broadcast (Ctrl-C to quit)"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |         <span class="s2">"Broadcast example "</span><span class="o">+</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">prettyhexrep</span><span class="p">(</span><span class="n">destination</span><span class="o">.</span><span class="n">hash</span><span class="p">)</span><span class="o">+</span> | 
		
	
		
			
				|  |  |  |  |         <span class="s2">" running, enter text and hit enter to broadcast (Ctrl-C to quit)"</span> | 
		
	
		
			
				|  |  |  |  |     <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># We enter a loop that runs until the users exits.</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># If the user hits enter, we will send the information</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -350,9 +423,26 @@ over the network.</p> | 
		
	
		
			
				|  |  |  |  | <span class="c1"># the program.</span> | 
		
	
		
			
				|  |  |  |  | <span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span> | 
		
	
		
			
				|  |  |  |  |     <span class="k">try</span><span class="p">:</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s2">"Reticulum example that demonstrates sending and receiving unencrypted broadcasts"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">"--config"</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">"store"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">"path to alternative Reticulum config directory"</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">str</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">"--channel"</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">"store"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">"broadcast channel name"</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">str</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">description</span><span class="o">=</span><span class="s2">"Reticulum example demonstrating sending and receiving broadcasts"</span> | 
		
	
		
			
				|  |  |  |  |         <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |             <span class="s2">"--config"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">action</span><span class="o">=</span><span class="s2">"store"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">help</span><span class="o">=</span><span class="s2">"path to alternative Reticulum config directory"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="nb">type</span><span class="o">=</span><span class="nb">str</span> | 
		
	
		
			
				|  |  |  |  |         <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |             <span class="s2">"--channel"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">action</span><span class="o">=</span><span class="s2">"store"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">help</span><span class="o">=</span><span class="s2">"broadcast channel name"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="nb">type</span><span class="o">=</span><span class="nb">str</span> | 
		
	
		
			
				|  |  |  |  |         <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="k">if</span> <span class="n">args</span><span class="o">.</span><span class="n">config</span><span class="p">:</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -414,7 +504,14 @@ the Packet interface.</p> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># messages. This way the client can send a request and be</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># certain that no-one else than this destination was able</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># to read it. </span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">echo_destination</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="p">(</span><span class="n">server_identity</span><span class="p">,</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">IN</span><span class="p">,</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">SINGLE</span><span class="p">,</span> <span class="n">APP_NAME</span><span class="p">,</span> <span class="s2">"echo"</span><span class="p">,</span> <span class="s2">"request"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">echo_destination</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">server_identity</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">IN</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">SINGLE</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">APP_NAME</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="s2">"echo"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="s2">"request"</span> | 
		
	
		
			
				|  |  |  |  |     <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># We configure the destination to automatically prove all</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># packets adressed to it. By doing this, RNS will automatically</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -434,7 +531,11 @@ the Packet interface.</p> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | <span class="k">def</span> <span class="nf">announceLoop</span><span class="p">(</span><span class="n">destination</span><span class="p">):</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># Let the user know that everything is ready</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s2">"Echo server "</span><span class="o">+</span><span class="n">RNS</span><span class="o">.</span><span class="n">prettyhexrep</span><span class="p">(</span><span class="n">destination</span><span class="o">.</span><span class="n">hash</span><span class="p">)</span><span class="o">+</span><span class="s2">" running, hit enter to manually send an announce (Ctrl-C to quit)"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |         <span class="s2">"Echo server "</span><span class="o">+</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">prettyhexrep</span><span class="p">(</span><span class="n">destination</span><span class="o">.</span><span class="n">hash</span><span class="p">)</span><span class="o">+</span> | 
		
	
		
			
				|  |  |  |  |         <span class="s2">" running, hit enter to manually send an announce (Ctrl-C to quit)"</span> | 
		
	
		
			
				|  |  |  |  |     <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># We enter a loop that runs until the users exits.</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># If the user hits enter, we will announce our server</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -465,7 +566,10 @@ the Packet interface.</p> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># hash that was entered on the command line</span> | 
		
	
		
			
				|  |  |  |  |     <span class="k">try</span><span class="p">:</span> | 
		
	
		
			
				|  |  |  |  |         <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">destination_hexhash</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">20</span><span class="p">:</span> | 
		
	
		
			
				|  |  |  |  |             <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Destination length is invalid, must be 20 hexadecimal characters (10 bytes)"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |             <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |                 <span class="s2">"Destination length is invalid, must be 20 hexadecimal characters (10 bytes)"</span> | 
		
	
		
			
				|  |  |  |  |             <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="n">destination_hash</span> <span class="o">=</span> <span class="nb">bytes</span><span class="o">.</span><span class="n">fromhex</span><span class="p">(</span><span class="n">destination_hexhash</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |     <span class="k">except</span><span class="p">:</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s2">"Invalid destination entered. Check your input!</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -480,7 +584,11 @@ the Packet interface.</p> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">loglevel</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">LOG_INFO</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># Tell the user that the client is ready!</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s2">"Echo client ready, hit enter to send echo request to "</span><span class="o">+</span><span class="n">destination_hexhash</span><span class="o">+</span><span class="s2">" (Ctrl-C to quit)"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |         <span class="s2">"Echo client ready, hit enter to send echo request to "</span><span class="o">+</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">destination_hexhash</span><span class="o">+</span> | 
		
	
		
			
				|  |  |  |  |         <span class="s2">" (Ctrl-C to quit)"</span> | 
		
	
		
			
				|  |  |  |  |     <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># We enter a loop that runs until the user exits.</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># If the user hits enter, we will try to send an</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -507,7 +615,14 @@ the Packet interface.</p> | 
		
	
		
			
				|  |  |  |  |             <span class="c1"># example_utilities.echo.request</span> | 
		
	
		
			
				|  |  |  |  |             <span class="c1"># This matches the naming we specified in the</span> | 
		
	
		
			
				|  |  |  |  |             <span class="c1"># server part of the code.</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">request_destination</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="p">(</span><span class="n">server_identity</span><span class="p">,</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">OUT</span><span class="p">,</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">SINGLE</span><span class="p">,</span> <span class="n">APP_NAME</span><span class="p">,</span> <span class="s2">"echo"</span><span class="p">,</span> <span class="s2">"request"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">request_destination</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |                 <span class="n">server_identity</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |                 <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">OUT</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |                 <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">SINGLE</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |                 <span class="n">APP_NAME</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |                 <span class="s2">"echo"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |                 <span class="s2">"request"</span> | 
		
	
		
			
				|  |  |  |  |             <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             <span class="c1"># The destination is ready, so let's create a packet.</span> | 
		
	
		
			
				|  |  |  |  |             <span class="c1"># We set the destination to the request_destination</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -552,7 +667,11 @@ the Packet interface.</p> | 
		
	
		
			
				|  |  |  |  |             <span class="n">rtt</span> <span class="o">=</span> <span class="nb">round</span><span class="p">(</span><span class="n">rtt</span><span class="o">*</span><span class="mi">1000</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">rttstring</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">rtt</span><span class="p">)</span><span class="o">+</span><span class="s2">" milliseconds"</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s2">"Valid reply received from "</span><span class="o">+</span><span class="n">RNS</span><span class="o">.</span><span class="n">prettyhexrep</span><span class="p">(</span><span class="n">receipt</span><span class="o">.</span><span class="n">destination</span><span class="o">.</span><span class="n">hash</span><span class="p">)</span><span class="o">+</span><span class="s2">", round-trip time is "</span><span class="o">+</span><span class="n">rttstring</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |             <span class="s2">"Valid reply received from "</span><span class="o">+</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">RNS</span><span class="o">.</span><span class="n">prettyhexrep</span><span class="p">(</span><span class="n">receipt</span><span class="o">.</span><span class="n">destination</span><span class="o">.</span><span class="n">hash</span><span class="p">)</span><span class="o">+</span> | 
		
	
		
			
				|  |  |  |  |             <span class="s2">", round-trip time is "</span><span class="o">+</span><span class="n">rttstring</span> | 
		
	
		
			
				|  |  |  |  |         <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | <span class="c1"># This function is called if a packet times out.</span> | 
		
	
		
			
				|  |  |  |  | <span class="k">def</span> <span class="nf">packet_timed_out</span><span class="p">(</span><span class="n">receipt</span><span class="p">):</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -570,10 +689,39 @@ the Packet interface.</p> | 
		
	
		
			
				|  |  |  |  | <span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span> | 
		
	
		
			
				|  |  |  |  |     <span class="k">try</span><span class="p">:</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s2">"Simple echo server and client utility"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">"-s"</span><span class="p">,</span> <span class="s2">"--server"</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">"store_true"</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">"wait for incoming packets from clients"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">"-t"</span><span class="p">,</span> <span class="s2">"--timeout"</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">"store"</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s2">"s"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">"set a reply timeout in seconds"</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">"--config"</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">"store"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">"path to alternative Reticulum config directory"</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">str</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">"destination"</span><span class="p">,</span> <span class="n">nargs</span><span class="o">=</span><span class="s2">"?"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">"hexadecimal hash of the server destination"</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">str</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |             <span class="s2">"-s"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="s2">"--server"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">action</span><span class="o">=</span><span class="s2">"store_true"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">help</span><span class="o">=</span><span class="s2">"wait for incoming packets from clients"</span> | 
		
	
		
			
				|  |  |  |  |         <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |             <span class="s2">"-t"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="s2">"--timeout"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">action</span><span class="o">=</span><span class="s2">"store"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">metavar</span><span class="o">=</span><span class="s2">"s"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">help</span><span class="o">=</span><span class="s2">"set a reply timeout in seconds"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="nb">type</span><span class="o">=</span><span class="nb">float</span> | 
		
	
		
			
				|  |  |  |  |         <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">"--config"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">action</span><span class="o">=</span><span class="s2">"store"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">help</span><span class="o">=</span><span class="s2">"path to alternative Reticulum config directory"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="nb">type</span><span class="o">=</span><span class="nb">str</span> | 
		
	
		
			
				|  |  |  |  |         <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |             <span class="s2">"destination"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">nargs</span><span class="o">=</span><span class="s2">"?"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">help</span><span class="o">=</span><span class="s2">"hexadecimal hash of the server destination"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="nb">type</span><span class="o">=</span><span class="nb">str</span> | 
		
	
		
			
				|  |  |  |  |         <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="k">if</span> <span class="n">args</span><span class="o">.</span><span class="n">server</span><span class="p">:</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -645,7 +793,13 @@ destination, and passing traffic back and forth over the link.</p> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># We create a destination that clients can connect to. We</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># want clients to create links to this destination, so we</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># need to create a "single" destination type.</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">server_destination</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="p">(</span><span class="n">server_identity</span><span class="p">,</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">IN</span><span class="p">,</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">SINGLE</span><span class="p">,</span> <span class="n">APP_NAME</span><span class="p">,</span> <span class="s2">"linkexample"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">server_destination</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">server_identity</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">IN</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">SINGLE</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">APP_NAME</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="s2">"linkexample"</span> | 
		
	
		
			
				|  |  |  |  |     <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># We configure a function that will get called every time</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># a new client creates a link to this destination.</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -657,7 +811,12 @@ destination, and passing traffic back and forth over the link.</p> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | <span class="k">def</span> <span class="nf">server_loop</span><span class="p">(</span><span class="n">destination</span><span class="p">):</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># Let the user know that everything is ready</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s2">"Link example "</span><span class="o">+</span><span class="n">RNS</span><span class="o">.</span><span class="n">prettyhexrep</span><span class="p">(</span><span class="n">destination</span><span class="o">.</span><span class="n">hash</span><span class="p">)</span><span class="o">+</span><span class="s2">" running, waiting for a connection."</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |         <span class="s2">"Link example "</span><span class="o">+</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">prettyhexrep</span><span class="p">(</span><span class="n">destination</span><span class="o">.</span><span class="n">hash</span><span class="p">)</span><span class="o">+</span> | 
		
	
		
			
				|  |  |  |  |         <span class="s2">" running, waiting for a connection."</span> | 
		
	
		
			
				|  |  |  |  |     <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s2">"Hit enter to manually send an announce (Ctrl-C to quit)"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># We enter a loop that runs until the users exits.</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -735,7 +894,13 @@ destination, and passing traffic back and forth over the link.</p> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># When the server identity is known, we set</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># up a destination</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">server_destination</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="p">(</span><span class="n">server_identity</span><span class="p">,</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">OUT</span><span class="p">,</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">SINGLE</span><span class="p">,</span> <span class="n">APP_NAME</span><span class="p">,</span> <span class="s2">"linkexample"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">server_destination</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">server_identity</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">OUT</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">SINGLE</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">APP_NAME</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="s2">"linkexample"</span> | 
		
	
		
			
				|  |  |  |  |     <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># And create a link</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">link</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Link</span><span class="p">(</span><span class="n">server_destination</span><span class="p">)</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -825,9 +990,30 @@ destination, and passing traffic back and forth over the link.</p> | 
		
	
		
			
				|  |  |  |  | <span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span> | 
		
	
		
			
				|  |  |  |  |     <span class="k">try</span><span class="p">:</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s2">"Simple link example"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">"-s"</span><span class="p">,</span> <span class="s2">"--server"</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">"store_true"</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">"wait for incoming link requests from clients"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">"--config"</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">"store"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">"path to alternative Reticulum config directory"</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">str</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">"destination"</span><span class="p">,</span> <span class="n">nargs</span><span class="o">=</span><span class="s2">"?"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">"hexadecimal hash of the server destination"</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">str</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |             <span class="s2">"-s"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="s2">"--server"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">action</span><span class="o">=</span><span class="s2">"store_true"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">help</span><span class="o">=</span><span class="s2">"wait for incoming link requests from clients"</span> | 
		
	
		
			
				|  |  |  |  |         <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |             <span class="s2">"--config"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">action</span><span class="o">=</span><span class="s2">"store"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">help</span><span class="o">=</span><span class="s2">"path to alternative Reticulum config directory"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="nb">type</span><span class="o">=</span><span class="nb">str</span> | 
		
	
		
			
				|  |  |  |  |         <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |             <span class="s2">"destination"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">nargs</span><span class="o">=</span><span class="s2">"?"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">help</span><span class="o">=</span><span class="s2">"hexadecimal hash of the server destination"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="nb">type</span><span class="o">=</span><span class="nb">str</span> | 
		
	
		
			
				|  |  |  |  |         <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="k">if</span> <span class="n">args</span><span class="o">.</span><span class="n">config</span><span class="p">:</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -913,7 +1099,14 @@ interface to efficiently pass files of any size over a Reticulum <a class="refer | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># We create a destination that clients can connect to. We</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># want clients to create links to this destination, so we</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># need to create a "single" destination type.</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">server_destination</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="p">(</span><span class="n">server_identity</span><span class="p">,</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">IN</span><span class="p">,</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">SINGLE</span><span class="p">,</span> <span class="n">APP_NAME</span><span class="p">,</span> <span class="s2">"filetransfer"</span><span class="p">,</span> <span class="s2">"server"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">server_destination</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">server_identity</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">IN</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">SINGLE</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">APP_NAME</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="s2">"filetransfer"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="s2">"server"</span> | 
		
	
		
			
				|  |  |  |  |     <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># We configure a function that will get called every time</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># a new client creates a link to this destination.</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -994,7 +1187,13 @@ interface to efficiently pass files of any size over a Reticulum <a class="refer | 
		
	
		
			
				|  |  |  |  |             <span class="c1"># read it and pack it as a resource</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">RNS</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="s2">"Client requested </span><span class="se">\"</span><span class="s2">"</span><span class="o">+</span><span class="n">filename</span><span class="o">+</span><span class="s2">"</span><span class="se">\"</span><span class="s2">"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">file</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">serve_path</span><span class="p">,</span> <span class="n">filename</span><span class="p">),</span> <span class="s2">"rb"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">file_resource</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Resource</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="n">packet</span><span class="o">.</span><span class="n">link</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">resource_sending_concluded</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |              | 
		
	
		
			
				|  |  |  |  |             <span class="n">file_resource</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Resource</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |                 <span class="n">file</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |                 <span class="n">packet</span><span class="o">.</span><span class="n">link</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |                 <span class="n">callback</span><span class="o">=</span><span class="n">resource_sending_concluded</span> | 
		
	
		
			
				|  |  |  |  |             <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             <span class="n">file_resource</span><span class="o">.</span><span class="n">filename</span> <span class="o">=</span> <span class="n">filename</span> | 
		
	
		
			
				|  |  |  |  |         <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span> | 
		
	
		
			
				|  |  |  |  |             <span class="c1"># If somethign went wrong, we close</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -1082,7 +1281,14 @@ interface to efficiently pass files of any size over a Reticulum <a class="refer | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># When the server identity is known, we set</span> | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># up a destination</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">server_destination</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="p">(</span><span class="n">server_identity</span><span class="p">,</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">OUT</span><span class="p">,</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">SINGLE</span><span class="p">,</span> <span class="n">APP_NAME</span><span class="p">,</span> <span class="s2">"filetransfer"</span><span class="p">,</span> <span class="s2">"server"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">server_destination</span> <span class="o">=</span> <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">server_identity</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">OUT</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">SINGLE</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">APP_NAME</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="s2">"filetransfer"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |         <span class="s2">"server"</span> | 
		
	
		
			
				|  |  |  |  |     <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     <span class="c1"># We also want to automatically prove incoming packets</span> | 
		
	
		
			
				|  |  |  |  |     <span class="n">server_destination</span><span class="o">.</span><span class="n">set_proof_strategy</span><span class="p">(</span><span class="n">RNS</span><span class="o">.</span><span class="n">Destination</span><span class="o">.</span><span class="n">PROVE_ALL</span><span class="p">)</span> | 
		
	
	
		
			
				
					
					|  |  |  | @ -1383,10 +1589,34 @@ interface to efficiently pass files of any size over a Reticulum <a class="refer | 
		
	
		
			
				|  |  |  |  | <span class="c1"># starts up the desired program mode.</span> | 
		
	
		
			
				|  |  |  |  | <span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span> | 
		
	
		
			
				|  |  |  |  |     <span class="k">try</span><span class="p">:</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s2">"Simple file transfer server and client utility"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">"-s"</span><span class="p">,</span> <span class="s2">"--serve"</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">"store"</span><span class="p">,</span> <span class="n">metavar</span><span class="o">=</span><span class="s2">"dir"</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">"serve a directory of files to clients"</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">"--config"</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s2">"store"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">"path to alternative Reticulum config directory"</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">str</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s2">"destination"</span><span class="p">,</span> <span class="n">nargs</span><span class="o">=</span><span class="s2">"?"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">"hexadecimal hash of the server destination"</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">str</span><span class="p">)</span> | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">description</span><span class="o">=</span><span class="s2">"Simple file transfer server and client utility"</span> | 
		
	
		
			
				|  |  |  |  |         <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |             <span class="s2">"-s"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="s2">"--serve"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">action</span><span class="o">=</span><span class="s2">"store"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">metavar</span><span class="o">=</span><span class="s2">"dir"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">help</span><span class="o">=</span><span class="s2">"serve a directory of files to clients"</span> | 
		
	
		
			
				|  |  |  |  |         <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |             <span class="s2">"--config"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">action</span><span class="o">=</span><span class="s2">"store"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">help</span><span class="o">=</span><span class="s2">"path to alternative Reticulum config directory"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="nb">type</span><span class="o">=</span><span class="nb">str</span> | 
		
	
		
			
				|  |  |  |  |         <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span> | 
		
	
		
			
				|  |  |  |  |             <span class="s2">"destination"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">nargs</span><span class="o">=</span><span class="s2">"?"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="n">help</span><span class="o">=</span><span class="s2">"hexadecimal hash of the server destination"</span><span class="p">,</span> | 
		
	
		
			
				|  |  |  |  |             <span class="nb">type</span><span class="o">=</span><span class="nb">str</span> | 
		
	
		
			
				|  |  |  |  |         <span class="p">)</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         <span class="k">if</span> <span class="n">args</span><span class="o">.</span><span class="n">config</span><span class="p">:</span> | 
		
	
	
		
			
				
					
					|  |  |  | 
 |