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

jsongle-server

v2.0.1

Published

JSONgle Server for WebRTC signaling protocol

Downloads

1

Readme

JSONgle-Server

JSONgle-Server is a WebRTC signaling server allowing users to have WebRTC calls. The signaling protocol used is based on JSONgle which uses JSON to describe the messages exchanged.

JSONgle-Server allows to

  • Connect clients to a dedicated room
  • Handle room 'joined' and 'left' events
  • Handle WebRTC signaling protocol between members of a room
  • Handle custom JSON messages between members of a room
  • Handle chat messages between members of a room
  • Handle audio & video conference (planned)

Install

JSONgle-Server is a Node.JS server that can be installed by cloning the repository.

$ git clone https://github.com/oanguenot/JSONgle-Server

Then you need to install the dependencies

$ yarn install

or

$ npm install

Configuration

JSONgle-Server reads its configuration from an .env file or directly from any environments variables set. See file .env.defaults for the default values used.

The following variables can be set

| Settings | Description | |:---------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------| | wsPort | WebSocket Server Port used.Default value is 8080 | | restPort | HTTP REST API Server Port used.Default value is 8081 | | corsPolicyOrigin | Restricted CORS policy access.Default value is '' | | maxConcurrentUsers | Max number of simultaneous connections to the WebSocket server.Default value is 10 | | id | Server identifier.Default value is jsongle-server | | logDefaultLevel | Level of logs.Default value is warn. | | logPath | Path to file for storing logs.Default value is /tmp/jsongle-server.log.Level is always equals to debug when logging to the file. | | logFilesNumber | Number of old log files kept.Default value is 3 | | logFilePeriod | Period of logging before changing to a new file.Default value is 1d (1 day) | | key | Path to the certificate KEY file used.Default value is ./key.pem | | cert | Path to the certificate CERT file used.Default value is ./cert.pem | | appToken | Application token used.Default value is '' | | multiRoomPrefix | Prefix used to identify MUC room. Only used when disconnecting from the server (eg: "#muc#") | | maxMembersPerMultiRoom | Maximum number of users per MUC | | maxMultiRoomPerUser | Maximum number of MUC joined at the same time for a user |

Note: appToken value is sent by the client and verified by JSONgle-Server when initiating the connection.

Start JSONgle-Server

For testing purpose or in your development/integration environment, you can launch the following command:

$ yarn dev

or 

$ npm run dev

The server will be automatically restarted thanks to nodemon.

Main principles

JSONgle-Server has two 'end-points':

  • A REST API used to monitor the server

  • A WebSocket server that listens to incoming WebSocket connections and handle the signaling part

Monitoring JSONgle-Server

Basically, JSONgle-Server offers the following APIs:

  • GET /about: This API returns a JSON description of the server containing the version used and a description

  • GET /ping: This API returns the code HTTP 200OK if the server is up

  • PUT /logs/levels: This API expects a JSON object containing a level property for updating the log level. Expected values are as usual: debug, info, etc...

  • GET /metrics: This API returns a Prometheus metrics when requested.

  • GET /stats: This API returns the statistics (Prometheus) in JSON

  • GET /tests: This API does a self-check and returns the code 200OK in case of success

These APIs allow to monitor the JSONgle-Server in real-time.

Serving the signaling part

For exchanging the signaling part, client should be connected to the WebSocket and exchange formatted messages that follow the JSONgle protocol.

Here are the messages handled by the server in some specific situations.

Websocket connection

JSONgle-Server uses Socket.IO for handling the connection coming from the client.

To be accepted, connections should contain an appToken that is checked by JSONgle-Server.

// Somewhere in your client application
import {io} from "socket.io-client";

const SERVER_URL = "...";

socketIO = io(SERVER_URL, {
  auth: {
    appToken: "d371db...733b384"
  }
});

session-hello message

When a connection is set to the WebSocket server, JSONgle-Server sends back to the client the following query

{
  "id": "...",
  "from": "jsongle-server", 
  "to": "8e784de9-ba76-4b0f-bedf-e21cac593f75",
  "jsongle": {
    "action": "iq-get",
    "query": "session-hello",
    "transaction": "8c4feab5-71a0-41c6-8bcd-e21cac593f75",
    "description": {
      "version": "1.1.4",
      "sn": "jsongle-server",
      "info": "Easy signaling using JSONgle-Server"
    }
  }
}

to is the user identity.

The client should answer by the following message

{
  "id": "...",
  "from": "8e784de9-ba76-4b0f-bedf-e21cac593f75", 
  "to": "jsongle-server",
  "jsongle": {
    "action": "iq-result",
    "query": "session-hello",
    "transaction": "8c4feab5-71a0-41c6-8bcd-e21cac593f75",
    "description": {
      "uid": "user_7000",     
      "dn": "Jon Doe"         
    }
  }
}

uid should be the unique identifier of the user. dn is optional.

An ack message is then sent to the client to inform him that the answer has been received and handled. A status success or failed is contained in that message to have a result if needed. In case of error, an additional session-error message is sent too that describes the error.

Note: Next client requests will be treated only if client has sent this iq-result response.

Join a room for a P2P call or a P2P instant messaging conversation

To join a room for having a call or an instant messaging conversation, the client should send the following message

{
  "id": "9b2feab5-71a0-41c6-8bcd-de67b819fdca",
  "from": "8e784de9-ba76-4b0f-bedf-e21cac593f75", 
  "to": "jsongle-server",  
  "jsongle": {
    "action": "iq-set",
    "query": "session-join",
    "namespace": "room",
    "description": {
      "rid": "43784dd3-cb76-4e5f-b4df-354cac5df777" 
    }
  }
}

Where rid is an arbitrary uniq room id known by clients who want to have a call or conversation.

The server answers by an iq_result or an iq_error depending on the result of the operation.

The iq_result contains the list of users already in the room.

All existing members of that room receive a session-event message to inform them about the new member.

Leaving a room

In the same manner, a user can leave a room by sending the following message

{
  "id": "9b2feab5-71a0-41c6-8bcd-de67b819fdca",
  "from": "8e784de9-ba76-4b0f-bedf-e21cac593f75", 
  "to": "jsongle-server",
  "jsongle": {
    "action": "iq-set",
    "query": "session-leave",
    "description": {
      "rid": "43784dd3-cb76-4e5f-b4df-354cac5df777"
    },
  },
}

Join a MUC room

In the same way, joining a MUC room could be done by sending a IQ

{
  "id": "9b2feab5-71a0-41c6-8bcd-de67b819fdca",
  "from": "8e784de9-ba76-4b0f-bedf-e21cac593f75", 
  "to": "jsongle-server",  
  "jsongle": {
    "action": "iq-set",
    "query": "muc-join",
    "namespace": "muc",
    "description": {
      "rid": "43784dd3-cb76-4e5f-b4df-354cac5df777" 
    }
  }
}

Where rid is the id of the MUC room to join.

An iq_result or an iq_error message is sent depending on the result.

All remaining members of that room receive a session-event message to inform them of the leaving of a member.

Handling signalization

Any messages sent to the room is then dispatched to all members (except the emitter) on behalf of the room.

At this time of writing, only P2P room can have video calls (limited to 2 participants), muc rooms could only have messaging conversation.

See JSONgle for the client API.

Prometheus Metrics

JSONgle-Server computes the following metrics:

| Metrics | Description | |:----------------------|:---------------------------------------------------------------------------------------------------------| | users_count | (gauge) Counts the number of active clients connected | | users_total | (counter) Counts the grand total of connected clients since the last restart | | conferences_count | (gauge) Counts the number of active conferences |
| conferences_total | (counter) Counts the grand total of conferences created since the last restart |
| duration_total | (counter) Counts the connection's duration grand total for all users since the last restart (in minutes) | | recv_total | (counter) Counts the grand total of traffic received from all users since the last restart (in MB) | | sent_total | (counter) Counts the grand total of traffic sent to all users since the last restart (in MB) |

These metrics are available in the REST API GET /metrics for Prometheus and in API GET /stats in JSON.