npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

cjdnsann

v0.3.1

Published

Library for parsing cjdns route announcement messages.

Downloads

15

Readme

Cjdnsann

Library for parsing cjdns route announcement messages.

Cjdnsann.parse(buffer)

Takes a buffer and parses (and validates) the announcement contained within. Throws an error if the message fails to parse or if it has an invalid signature.

> Cjdnsann.parse(new Buffer(
    '9dcdafaf6a129d4194eb52586ec81ecbf7f52abf183268a314e19e066baa' +
    '7bfbe01121ba42ff8fa41356420894d576ce0a0105577cca0e50d945283c' +
    '18d89c07f2e1d148ed18b09d16b5766e4250df7b4e83a5ccedd4cfde15f1' +
    'f474db1a5bc2fc928136dc1fe6e04ef6a6dd7187b85f0000157354c540c1' +
    '0107006114458100240100000000fffffffffffffc928136dc1fe6e04ef6' +
    'a6dd7187b85f0000000000000015', 'hex'));

{ signature: '9dcdafaf6a129d4194eb52586ec81ecbf7f52abf183268a314e19e066baa7bfbe01121ba42ff8fa41356420894d576ce0a0105577cca0e50d945283c18d89c07',
  pubSigningKey: 'f2e1d148ed18b09d16b5766e4250df7b4e83a5ccedd4cfde15f1f474db1a5bc2',
  snodeIp: 'fc92:8136:dc1f:e6e0:4ef6:a6dd:7187:b85f',
  nodePubKey: 'z15pzyd9wgzs2g5np7d3swrqc1533yb7xx9dq0pvrqrqs42uwgq0.k',
  nodeIp: 'fc49:11cb:38c2:8d42:9865:7b8e:0d67:11b3',
  ver: 1,
  isReset: false,
  timestamp: '00000157354c540c',
  peers:
   [ { type: 'Peer',
       ipv6: 'fc92:8136:dc1f:e6e0:4ef6:a6dd:7187:b85f',
       label: '0000.0000.0000.0015',
       mtu: 0,
       drops: 65535,
       latency: 65535,
       penalty: 65535,
       encodingFormNum: 0,
       flags: 0 } ],
  encodingScheme:
   { type: 'EncodingScheme',
     hex: '6114458100',
     scheme: [ { bitCount: 3, prefix: '01', prefixLen: 1 },
               { bitCount: 5, prefix: '02', prefixLen: 2 },
               { bitCount: 8, prefix: '00', prefixLen: 2 } ] },
  binary: <Buffer ...>  }

Cjdns announcement message format:

Each cjdns announcement message contains a header and one or more entities. At the time of this writing, valid entities include peer (indicating reachability) and encoding scheme which tells the supernodes what the encoding scheme of this subnode happens to be.

The Header

The header is 120 bytes lone and contains an ED25519 signature over the entire announcement, the public signing key of the node which created the announcement (this can be converted into their public encryption key using ED25519->Curve25519 conversion), the cjdns IPv6 address of the supernode to which this subnode is announcing, a timestamp, version and a reset flag.

Here is the packet diagram:

                       1               2               3
       0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    0 |                                                               |
      +                                                               +
    4 |                                                               |
      +                                                               +
    8 |                                                               |
      +                                                               +
   12 |                                                               |
      +                                                               +
   16 |                                                               |
      +                                                               +
   20 |                                                               |
      +                                                               +
   24 |                                                               |
      +                                                               +
   28 |                                                               |
      +                           Signature                           +
   32 |                                                               |
      +                                                               +
   36 |                                                               |
      +                                                               +
   40 |                                                               |
      +                                                               +
   44 |                                                               |
      +                                                               +
   48 |                                                               |
      +                                                               +
   52 |                                                               |
      +                                                               +
   56 |                                                               |
      +                                                               +
   60 |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   64 |                                                               |
      +                                                               +
   68 |                                                               |
      +                                                               +
   72 |                                                               |
      +                                                               +
   76 |                                                               |
      +                     Public Signing Key                        +
   80 |                                                               |
      +                                                               +
   84 |                                                               |
      +                                                               +
   88 |                                                               |
      +                                                               +
   92 |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   96 |                                                               |
      +                                                               +
  100 |                                                               |
      +                        SuperNode IP                           +
  104 |                                                               |
      +                                                               +
  108 |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  112 |                                                               |
      +                         Timestamp                     +-+-+-+-+
  116 |                                                       |R| ver |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • Signature: A curve25519 signature over the entire message (including entities)
  • Public Signing Key: The key which was used to sign the message, this library converts the key upon parsing into a Curve25519 key and the related cjdns IPv6 address.
  • SuperNode IP: The cjdns IPv6 of the supernode to which this node is announcing.
  • Timestamp: The time (according to the subnode) when the message was created.
  • R: (reset) If this flag is set then the subnode would like all supernodes to discard any information which they previously kept about said subnode and begin fresh.
  • ver: (version) Version of the announcement protocol, currently 1.

Entity

Every entity message begins with two bytes, indicating length and type, at the time of this writing the types of entities are:

  • EncodingScheme 0
  • Peer 1
  • Version 2

Entity messages all begin with the length of the entity such that future entities can be added and skipped over by older versions of the parser. Entities longer than 255 or shorter than 1 byte are invalid. If the entity length field is exactly 1 byte, it is a pad entity and that byte should be skipped over. Pad entities can be useful to byte-align messages with oddly sized entities.

EncodingScheme Entity

An EncodingScheme entity contains the first two bytes, length and type followed by the EncodingScheme which is serialized according to cjdns EncodingScheme serialization. Please refer to https://github.com/cjdelisle/cjdnsencoding for more information about how this is parsed. As EncodingScheme serialization does not have a fixed width in bytes, EncodingScheme entities are prefixed with a number of pad entities in order that their length will be a multiple of four bytes.

Peer Entity

Each Peer entity announcement contains roughly the information which is needed to reach the announcer from a given peer. It is important to note that this is not about ability to reach the peer but to reach the announcer if one can already reach said peer.

The packet diagram is as follows:

                       1               2               3
       0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    0 |     length    |      type     | encodingForm  |     flags     |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    4 |      MTU (8 byte units)       |             drops             |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    8 |           latency             |            penalty            |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   12 |                                                               |
      +                                                               +
   16 |                                                               |
      +                           Peer IPv6                           +
   20 |                                                               |
      +                                                               +
   24 |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   28 |                             label                             |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • length: As per the Entity definition, peer length is always 36
  • type: As per the Entity definition, peer type is 1
  • encodingForm: This is the number of the form within the encodingScheme which is the smallest form that can represent the Director for reaching the peer from the announcer. Yes, you read that right, even though this announcement is designed for reaching the announcer from the peer, in order to chain links for making a label, one must have the inverse encoding form for each hop such that the reverse label will be the same size as the forward label.
  • flags: A field for flags for future use such as whether the link is simplex or other information. Currently there are no flags.
  • MTU8: The maximum message size for messages going to the announcer from the peer. If this is set to zero it indicates the announcer is not aware of the MTU.
  • drops: The fraction of dropped messages out of 65 thousand in the previous time-window. 0xffff means the announcer does not know.
  • latency: Average number of milliseconds for a round-trip ping between the announcer and the peer along this link. 0xffff means the announcer does not know.
  • penalty: A number which indicates the cost of sending a packet along this link, higher values indicate there is a bottleneck and there is a higher likelihood of the packet being dropped, especially if the sender sends a lot of traffic. See cjdns/switch/Penalty.h
  • Peer IPv6: The cjdns IPv6 of the peer from which this node can be reached.
  • Label: The label fragment (Director) which should be used for constructing a label for reaching the announcer from the peer. This may need to be recoded depending on the encodingForm of the announcement for the link which was used to reach the peer. A label of 0 indicates that the route is being withdrawn and it is nolonger usable. This is limited to 32 bits because 32 bits is the largest Director that can be represented in an EncodingScheme.

Version Entity

This type of entity tells the protocol version of the node sending it.

                       1               2               3
       0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    0 |     length    |      type     |             version           |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • length: As per the Entity definition, always 4
  • type: As per the Entity definition, always 2
  • version: Big endian representation of the protocol version of the node