Skip to content

Javascript implementation of the Reticulum Network Stack

License

Notifications You must be signed in to change notification settings

liamcottle/rns.js

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

51 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

rns.js

An in-progress, implementation of the Reticulum Network Stack written in Javascript.

This implementation is extremely limited, will likely have breaking changes and is probably not what you should be using.

I am implementing this to learn the RNS stack at the protocol level, while writing it in a language I am very familiar with.

At this stage, I will only be working on the features I want to use, rather than building a complete alternative transport stack.

You should probably look at the official reference stack written in Python;

What can it do?

  • Create a new Identity
  • Load an existing Identity from Public Keys or Private Keys
  • Connect with a TCPClientInterface to an existing RNS TCPServerInterface
  • Listen for incoming announces
  • Register a Destination
  • Listen for inbound packets to a Destination
  • Send outbound packets to a Destination
  • Send and receive opportunistic LXMF messages over single packets
  • Send and receive direct LXMF messages over an inbound Link
  • Accept inbound Links to a Destination
  • Create outbound Links to a Destination
  • Close Links and listen for when they are closed by the other side
  • Send and receive data packets over an established Link

Install

npm install @liamcottle/rns.js

Simple Example

import { Reticulum, TCPClientInterface } from "@liamcottle/rns.js";

// create rns instance
const rns = new Reticulum();

// add interfaces
rns.addInterface(new TCPClientInterface("Test Net", "amsterdam.connect.reticulum.network", 4965));
rns.addInterface(new TCPClientInterface("Between the Borders", "reticulum.betweentheborders.com", 4242));
rns.addInterface(new TCPClientInterface("V0ltTech", "v0lttech.com", 4242));

// listen for announces
rns.on("announce", (event) => {
    console.log(`Announce Received: ${event.announce.destinationHash.toString("hex")} is now ${event.hops + 1} hops away on interface [${event.interface_name}]`);
});

Examples

There's a few scripts in the examples folder for reference on what currently works.

TODO

  • Make it work in web browsers by not using NodeJS specific APIs
  • Implement websocket client to connect via web browsers
  • Tidy up logic for sending packets and packet types
  • Implement Link heartbeat packets
  • Validate LXMF message signatures
  • Only send packets to relevant interface. Some packets still send to all interfaces
  • Implement Ratchets
  • Implement Resources over Links
  • Support LXMF messages over Link Resources
  • Support LXMF stamps and tickets
  • Implement rate limits
  • Support being a Transport node

References

License

MIT