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

webrtc-bootstrap

v4.4.1

Published

Bootstrap client and server to bootstrap WebRTC connections made with simple-peer

Downloads

10

Readme

This library simplifies the bootstrapping of WebRTC overlays made with Simple Peers by passing all connection requests to the same root peer, which may answer the request itself or pass the request to another peer.

The handshake between the requester and the answerer are performed over WebSockets connected to the bootstrap server. After the handshake has been performed, the websocket connections are closed to conserve resources.

Client

Usage

// On the root process

var bootstrap = require('webrtc-bootstrap')('bootstrap-server hostname or ip-address:port')
var newcomers = {}

// Register to obtain requests
bootstrap.root('secret', function (req) {
  console.log('root received: ' + JSON.stringify(req))

  // Remember previously created peers.  
  // This way we can route multiple WebRTC handshake signals generated 
  // by the ICE Trickle protocol to the same peer
  if (!newcomers[req.origin]) {
    console.log('Creating connection to signaling peer')
    newcomers[req.origin] = bootstrap.connect(req)
    newcomers[req.origin].on('data', function (data) {
      console.log(data)
      newcomers[req.origin].send('pong')
    })
  } else {
    console.log('Passing the signal data')
    newcomers[req.origin].signal(req.signal)
  }
})

// From a different process

var bootstrap = ...
var p = bootstrap.connect()
p.on('connect', function () { p.send('ping') })
p.on('data', function (data) {
  console.log(data)
})

API

var bootstrap = new BootstrapClient(host, opts)

Creates a new bootstrap client that will connect to 'host'. Opts may be one of the followings:

{
    secure: false // if true uses 'wss://' otherwise 'ws://'
}

bootstrap.root(secret, onRequest(req), cb)

secret is an alphanumeric string that has been set up during the server configuration (see webrtc-bootstrap-server). It becomes a route for the root WebSocket connection. It ensures only the the authorized root will receive requests.

onRequest(req) is a callback that will be called with a request object, itself with the following properties:

  • req.origin: the identifier of the originator of the request (automatically created by the bootstrap server)
  • req.signal: the SimplePeer signal to establish the WebRTC connection. Because of the ICE trickle protocol for signaling, the same peer may trigger multiple calls to onRequest (unless peerOpts.tricke: false). All following requests should be routed to the same peer with peer.signal(req.signal).

cb(err) is called after either the connection to the server succeeded or failed.

peer = bootstrap.connect([req, opts])

req is an optional request object (see bootstrap.root). If it is undefined or falsy, initiator: true will be set on peerOpts to initiate the signaling protocol. All the requests will go to the root. Otherwise, if a valid req is used, then a WebSocket connection will be established with the originator (req.origin) through the bootstrap server to answer the signaling offer and finish the handshake.

opts are further options:

opts.peerOpts are options to be passed to the SimplePeer constructor. Defaults to {}.

opts.cb(err, peer) is an optional callback to handle bootstrapping errors.

Returns peer, a SimplePeer instance.

After a connect call if the connection succeeds, peer will emit the usual 'connect' event.

Server

The server can be run locally for tests or deployed on any public server (server with a public IP address) that supports WebSockets.

Deploy

Usage

Command-line:

    # Using the configuration file
    node bin/server path_to_config.json

    # Or using environment variables
    SECRET=12345 node bin/server

Library:

    var Server = require('webrtc-bootstrap').Server
    var s = new Server('secret') 

Secret configuration

Please clone this repository, copy config.example.json to config.json, and change the secret in the config.json file to ensure only your root node can connect as root to the bootstrap server.

API

Server(secret, opts)

secret is an alphanumeric string that is used by the client to connect as root.

opts is an optional object with the default values:

{
    public: null,
    timeout: 30 * 1000 // ms,
    httpServer: null,
    port: 5000,
    seed: null
}

opts.public is the path to the public directory for serving static content.

opts.timeout is the maximum allowed time for a candidate to successfully join the network.

opts.httpServer is an existing http server.

opts.port is the port used by the http server if none has been provided.

opts.seed is a number to use as a seed for the pseudo-random generation of channel ids. If null, the crypto.randomBytes method is used instead.

Server.upgrade(path, handler)

path is a url String starting with a '/'

handler is a Function, function handler (ws, req) { ... }, where ws is the websocket connection that resulted from the upgrade and req is the original http request.

Projects

This library is used by the the following library to organize peers in a tree.

Submit a pull-request to add your own!

MIT. Copyright (c) Erick Lavoie.