Skip to content

Latest commit

 

History

History
85 lines (62 loc) · 3.17 KB

README.md

File metadata and controls

85 lines (62 loc) · 3.17 KB

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
  • Connect with a WebsocketClientInterface to an existing WebsocketServerInterface
  • Can be used in a web browser, see the web client example
  • Can be used in NodeJS, see the simple example below.
  • 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

  • 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