@northernblock/triangulation-algorithm

Accept or reject a nodes location based on ping times

Usage no npm install needed!

<script type="module">
  import northernblockTriangulationAlgorithm from 'https://cdn.skypack.dev/@northernblock/triangulation-algorithm';
</script>

README

Triangulation Algorithm for SkyTech Project

Installation

npm i @northernblock/triangulation-algorithm

Usage

To import the library, you can write

const triangulate = require('@northernblock/triangulation-algorithm')

Then, triangulate is a function that takes 2 parameters:

  1. newNodePings: new nodes ping data to all other nodes on the network
  2. existingNodePings: existing nodes on the networks pings to each other

triangulate function throws errors

const newNodePings = { A: 180, B: 200, C: 400, D: 300 }
const existingNodePings = {
    A: { B: 500, C: 500, D: 500 },
    B: { A: 500, C: 500, D: 500 },
    C: { A: 500, B: 500, D: 500 },
    D: { A: 500, B: 500, C: 500 },
}
try {
    const res = triangulate(newNodePings, existingNodePings)
    // expected output: [{ A: 180, D: 300, B: 200 }]
} catch (e) {
    console.log(e.message)
}

Scripts

npm test to run all test units

Errors

  • If newNodePings is null or undefined: Received: ${newNodePings}. newNodePings cannot be null or undefined
  • If newNodePings is not an object: Received: ${newNodePings}. newNodePings needs to be an object
  • If ping data inside newNodePings is not defined: newNodePings has an undefined value: ${nodePingTime}
  • If ping data inside newNodePings is not an Integer: Received ${nodePingTime} of type ${typeof nodePingTime}. Node pings need to be Integers. Make sure they are numbers, not strings. ( you can use parseInt(string) )
  • If existingNodePings is null or undefined: Received: ${existingNodePings}. existingNodePings cannot be null or undefined.)
  • If existingNodePings is not an Object: Received: ${existingNodePings}. existingNodePings needs to be an object
  • If node data inside existingNodePings is null or undefined: Received: ${existingNodePingData}. existingNodePingData cannot be null or undefined
  • If node data inside existingNodePings is not an Object: Received ${existingNodePingData} for one of the ping times. Each nodes pingtimes to other nodes needs to be an object in this format: { [nodeId]: pingTime }
  • If ping times of node data inside existingNodePings is null or undefined: One node ping in existingNodePings has an undefined value: ${nodePingTime}
  • If ping times of node data inside existingNodePings is not an Integer: node pings need to be Integers. Make sure they are numbers, not strings. ( you can use parseInt(string) )
  • If newNodePings has less than 4 distances: Please provide 4 or more distances.
  • If newNodePings doesn't include all the nodes provided in existingNodePings: Please provide ping time to all nodes!
  • If a collision is detected: New node collides with node(s) ${arrayOfNodes}
  • If the algorithm has detected that a node is lying about it's distance from another node: New node falls outside of the globe because of distances ${arrayOfNodesWithDistances}
  • If ping data received is not valid: Ping data received is not valid
  • Internal errors: Something went horribly wrong inside /lib/ping-validator.js, Internal error... something bad has happened!