Repository files navigation

Network Web Sockets

Local Network broadcast channels with secure service discovery and encrypted proxy communication

Network Web Sockets allow web pages, native applications and devices to create encrypted Web Socket networks by discovering, binding and connecting peers that share the same channel name in the local network.

Channel names can either be:

  • Common, memorable strings such as e.g. "webchat" to allow any service to connect to a public channel, or:
  • Pseudo-secure strings such as randomly-generated hashes e.g. "cJWHi8q7SvNWAiSerpfxW3inYjXiKNqR" that are known and shared out-of-band between two or more actors to connect to a private channel.

Network Web Sockets prevents channel name discovery and channel message injection by snooping on the traffic in the local network. This is achieved using the mechanisms described in our DNS-based Secure Service Discovery (DNS-SSD) draft and encrypting all communications between participating nodes within different channels.

Any channel within the Network Web Sockets ecosystem is considered as secure as its out-of-band key sharing mechanisms (whether that is on a public forum online or via other more secure sharing mechanisms). If a channel key is available to a user, then that user will be able to join that channel (although nothing stops channels performing additional authentication over the channel whenever a new peer connects). Similarly, if a user is unaware of a channel name, they will have no way of discovering that channel name via any traffic flowing in the local network.

Web pages, native applications and devices can create ad-hoc inter-applicaton communication bridges between and among themselves for a variety of purposes:

  • For discovering matching peer services on the local device and/or the local network.
  • To create full-duplex, encrypted communications channels between network devices, native applications and web applications.
  • To create full-duplex, encrypted communication channels between web pages on different domains.
  • To import and export data between network devices, native applications and web applications.
  • To create initial local session signalling channels for establishing P2P sessions (for e.g. WebRTC signalling channel bootstrapping).
  • To establish low latency local network multiplayer signalling channels for games.
  • To enable collaborative editing, sharing and other forms of communication between different web pages and applications on a local device or a local network.

A web page or application can create a new Network Web Socket by choosing a channel name (any alphanumeric name) via any of the available Network Web Socket interfaces. When other peers join the same channel name then they will join all other peers in the same Network Web Socket broadcast network.

You can read more about the secure discovery process and proxy-to-proxy encryption used by Network Web Sockets on this wiki page.

Getting started

This repository contains an implementation of a Network Web Socket Proxy, written in Go, required to use Network Web Sockets.

You can either download a pre-built Network Web Sockets binary or build a Network Web Socket Proxy from source to get up and running.

Once you have a Network Web Socket Proxy up and running on your local machine then you are ready to create and share your own Network Web Sockets. A number of Network Web Socket client examples are also provided to help get you started.

Network Web Socket Interfaces

Local HTTP Test Console

Once a Network Web Socket Proxy is up and running, you can access a test console in your web browser and play around with Network Web Sockets at http://localhost:9009.

JavaScript Interfaces

The Network Web Sockets JavaScript polyfill library exposes a new JavaScript interface on the root global object for your convenience as follows:

  • NetworkWebSocket for creating/binding named websockets to share on the local network.

You must include the polyfill file in your own projects to create these JavaScript interfaces. Assuming we have added the Network Web Sockets JavaScript polyfill to our page then we can create a new NetworkWebSocket connection object via the JavaScript polyfill as follows:

// Create a new Network Web Socket peer in the networkvarws=newNetworkWebSocket("myChannelName");

We then wait for our peer to be successfully added to the network:

ws.onopen=function(){console.log('Our channel peer is now connected to the `myChannelName` web socket network');};

We can listen for incoming broadcast messages from channel peers in the network as follows:

ws.onmessage=function(event){console.log("Broadcast message received: "+event.data);};

We can send broadcast messages to all the other currently known channel peers in the network as follows:

ws.send('This is a broadcast message to *all* other channel peers');

When we create a Network Web Socket connection object then the Network Web Socket Proxy will start to discover and connect to all other myChannelName channel peers that are being advertised in the local network.

Each time a new channel peer is discovered in the network a Web Socket proxy connection to that peer is established and a new connect event is queued and fired against our root Network Web Socket object:

ws.onconnect=function(event){console.log('Another peer has been discovered and connected to our `myChannelName` web socket network!');};

In this connect event, we are provided with a direct, peer-to-peer Web Socket connection object that can be used to communicate directly with this newly discovered and connected peer.

We can send a direct message to a channel peer and listen for direct messages from this channel peer as follows:

// Wait for a new channel peer to connect to our `myChannelName` web socket networkws.onconnect=function(event){// Retrieve the new direct P2P Web Socket connection object with the newly connected channel peervarpeerWS=evt.detail.target;// Wait for this new direct p2p channel connection to be openedpeerWS.onopen=function(){// Listen for direct messages from this peerpeerWS.onmessage=function(event){console.log("Direct message received from ["+peerWS.id+"]: "+event.data);}// Send a direct message to this peerpeerWS.send('This is a direct message to the new channel peer *only*'):
};};

With both broadcast and direct messaging capabilities it is possible to build advanced services on top of Network Web Sockets. We are excited to see what you come up with!

Web Socket Interfaces

Devices and services running on the local machine can register Network Web Sockets without needing to use the JavaScript API. Thus, we can connect up other applications and devices sitting in the local network such as TVs, Set-Top Boxes, Fridges, Home Automation Systems (assuming they run their own Network Web Socket Proxy client also).

To create a new Network Web Socket connection to a channel from anywhere on the local machine (i.e. to become a 'channel peer') you can establish a Web Socket connection to a running Network Web Socket Proxy at the following URL:

ws://localhost:<port>/<channelName>

where:

  • port is the port on which your Network Web Socket Proxy is running (by default, 9009),
  • channelName is the name of the channel you want to create, and;

Messages sent and received on this Web Socket connection have a well-defined data format.

This Web Socket connection will notify you when channel peers connect and disconnect from <channelName> and when broadcast or direct messages are sent to you from other connected channel peers. This Web Socket connection can also be used to send broadcast or direct messages toward all other connected channel peers.

When a new channel peer connects to <channelName> on the network a new message is sent to your connection as follows:

{action: "connect",// a new channel peer has connected to <channelName>source: "<you>",// your channel peer's idtarget: "<newPeerId>"// the unique id of the new channel peer connection}

Similarly when a channel peer disconnects from <channelName> on the network a new message is sent to your connection as follows:

{action: "disconnect",// an existing channel peer has disconnected from <channelName>source: "<you>",// your channel peer's idtarget: "<existingPeerId>"// the unique id of the existing channel peer connection}

To send a broadcast message to all other connected channel peers you can send it over your connection as follows:

{action: "broadcast",// this is a sent broadcast messagedata: "<data>"// the data you want to send to all other channel peers}

When receiving a broadcast message from another connected channel peer it is sent to you over your connection as follows:

{action: "broadcast",// this is a received broadcast messagesource: "<peerId>",// the sending channel peer's iddata: "<data>"// the data you want to send to all other channel peers}

To send a direct message to another channel peer, bypassing the broadcast channel, you can send it over your connection as follows:

{action: "message",// this is a sent direct messagetarget: "<recipient>",// the id of an existing channel peer you want to send a direct message todata: "<data>"// the data you want to send to <recipient>}

When receiving a direct message from another channel peer, that has bypassed the broadcast channel, it is sent to you over your connection as follows:

{action: "message",// this is a received direct messagesource: "<sender>",// the id of the channel peer that sent you this direct messagetarget: "<you>",// your channel peer's iddata: "<data>"// the data sent to you by <sender>}

Examples

Some example services built with Network Web Sockets:

Feedback

If you find any bugs or issues please report them on the Network Web Sockets Issue Tracker.

If you would like to contribute to this project please consider forking this repo, making your changes and then creating a new Pull Request back to the main code repository.

License

The MIT License (MIT) Copyright (c) 2014 Rich Tibbett.

See the LICENSE file for more information.

About

Adhoc P2P web socket channels with secure, zero-config network service discovery+transport

Resources

Stars

53 stars

Watchers

14 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Network Web Sockets

Local Network broadcast channels with secure service discovery and encrypted proxy communication

Network Web Sockets allow web pages, native applications and devices to create encrypted Web Socket networks by discovering, binding and connecting peers that share the same channel name in the local network.

Channel names can either be:

  • Common, memorable strings such as e.g. "webchat" to allow any service to connect to a public channel, or:
  • Pseudo-secure strings such as randomly-generated hashes e.g. "cJWHi8q7SvNWAiSerpfxW3inYjXiKNqR" that are known and shared out-of-band between two or more actors to connect to a private channel.

Network Web Sockets prevents channel name discovery and channel message injection by snooping on the traffic in the local network. This is achieved using the mechanisms described in our DNS-based Secure Service Discovery (DNS-SSD) draft and encrypting all communications between participating nodes within different channels.

Any channel within the Network Web Sockets ecosystem is considered as secure as its out-of-band key sharing mechanisms (whether that is on a public forum online or via other more secure sharing mechanisms). If a channel key is available to a user, then that user will be able to join that channel (although nothing stops channels performing additional authentication over the channel whenever a new peer connects). Similarly, if a user is unaware of a channel name, they will have no way of discovering that channel name via any traffic flowing in the local network.

Web pages, native applications and devices can create ad-hoc inter-applicaton communication bridges between and among themselves for a variety of purposes:

  • For discovering matching peer services on the local device and/or the local network.
  • To create full-duplex, encrypted communications channels between network devices, native applications and web applications.
  • To create full-duplex, encrypted communication channels between web pages on different domains.
  • To import and export data between network devices, native applications and web applications.
  • To create initial local session signalling channels for establishing P2P sessions (for e.g. WebRTC signalling channel bootstrapping).
  • To establish low latency local network multiplayer signalling channels for games.
  • To enable collaborative editing, sharing and other forms of communication between different web pages and applications on a local device or a local network.

A web page or application can create a new Network Web Socket by choosing a channel name (any alphanumeric name) via any of the available Network Web Socket interfaces. When other peers join the same channel name then they will join all other peers in the same Network Web Socket broadcast network.

You can read more about the secure discovery process and proxy-to-proxy encryption used by Network Web Sockets on this wiki page.

Getting started

This repository contains an implementation of a Network Web Socket Proxy, written in Go, required to use Network Web Sockets.

You can either download a pre-built Network Web Sockets binary or build a Network Web Socket Proxy from source to get up and running.

Once you have a Network Web Socket Proxy up and running on your local machine then you are ready to create and share your own Network Web Sockets. A number of Network Web Socket client examples are also provided to help get you started.

Network Web Socket Interfaces

Local HTTP Test Console

Once a Network Web Socket Proxy is up and running, you can access a test console in your web browser and play around with Network Web Sockets at http://localhost:9009.

JavaScript Interfaces

The Network Web Sockets JavaScript polyfill library exposes a new JavaScript interface on the root global object for your convenience as follows:

  • NetworkWebSocket for creating/binding named websockets to share on the local network.

You must include the polyfill file in your own projects to create these JavaScript interfaces. Assuming we have added the Network Web Sockets JavaScript polyfill to our page then we can create a new NetworkWebSocket connection object via the JavaScript polyfill as follows:

// Create a new Network Web Socket peer in the networkvarws=newNetworkWebSocket("myChannelName");

We then wait for our peer to be successfully added to the network:

ws.onopen=function(){console.log('Our channel peer is now connected to the `myChannelName` web socket network');};

We can listen for incoming broadcast messages from channel peers in the network as follows:

ws.onmessage=function(event){console.log("Broadcast message received: "+event.data);};

We can send broadcast messages to all the other currently known channel peers in the network as follows:

ws.send('This is a broadcast message to *all* other channel peers');

When we create a Network Web Socket connection object then the Network Web Socket Proxy will start to discover and connect to all other myChannelName channel peers that are being advertised in the local network.

Each time a new channel peer is discovered in the network a Web Socket proxy connection to that peer is established and a new connect event is queued and fired against our root Network Web Socket object:

ws.onconnect=function(event){console.log('Another peer has been discovered and connected to our `myChannelName` web socket network!');};

In this connect event, we are provided with a direct, peer-to-peer Web Socket connection object that can be used to communicate directly with this newly discovered and connected peer.

We can send a direct message to a channel peer and listen for direct messages from this channel peer as follows:

// Wait for a new channel peer to connect to our `myChannelName` web socket networkws.onconnect=function(event){// Retrieve the new direct P2P Web Socket connection object with the newly connected channel peervarpeerWS=evt.detail.target;// Wait for this new direct p2p channel connection to be openedpeerWS.onopen=function(){// Listen for direct messages from this peerpeerWS.onmessage=function(event){console.log("Direct message received from ["+peerWS.id+"]: "+event.data);}// Send a direct message to this peerpeerWS.send('This is a direct message to the new channel peer *only*'):
};};

With both broadcast and direct messaging capabilities it is possible to build advanced services on top of Network Web Sockets. We are excited to see what you come up with!

Web Socket Interfaces

Devices and services running on the local machine can register Network Web Sockets without needing to use the JavaScript API. Thus, we can connect up other applications and devices sitting in the local network such as TVs, Set-Top Boxes, Fridges, Home Automation Systems (assuming they run their own Network Web Socket Proxy client also).

To create a new Network Web Socket connection to a channel from anywhere on the local machine (i.e. to become a 'channel peer') you can establish a Web Socket connection to a running Network Web Socket Proxy at the following URL:

ws://localhost:<port>/<channelName>

where:

  • port is the port on which your Network Web Socket Proxy is running (by default, 9009),
  • channelName is the name of the channel you want to create, and;

Messages sent and received on this Web Socket connection have a well-defined data format.

This Web Socket connection will notify you when channel peers connect and disconnect from <channelName> and when broadcast or direct messages are sent to you from other connected channel peers. This Web Socket connection can also be used to send broadcast or direct messages toward all other connected channel peers.

When a new channel peer connects to <channelName> on the network a new message is sent to your connection as follows:

{action: "connect",// a new channel peer has connected to <channelName>source: "<you>",// your channel peer's idtarget: "<newPeerId>"// the unique id of the new channel peer connection}

Similarly when a channel peer disconnects from <channelName> on the network a new message is sent to your connection as follows:

{action: "disconnect",// an existing channel peer has disconnected from <channelName>source: "<you>",// your channel peer's idtarget: "<existingPeerId>"// the unique id of the existing channel peer connection}

To send a broadcast message to all other connected channel peers you can send it over your connection as follows:

{action: "broadcast",// this is a sent broadcast messagedata: "<data>"// the data you want to send to all other channel peers}

When receiving a broadcast message from another connected channel peer it is sent to you over your connection as follows:

{action: "broadcast",// this is a received broadcast messagesource: "<peerId>",// the sending channel peer's iddata: "<data>"// the data you want to send to all other channel peers}

To send a direct message to another channel peer, bypassing the broadcast channel, you can send it over your connection as follows:

{action: "message",// this is a sent direct messagetarget: "<recipient>",// the id of an existing channel peer you want to send a direct message todata: "<data>"// the data you want to send to <recipient>}

When receiving a direct message from another channel peer, that has bypassed the broadcast channel, it is sent to you over your connection as follows:

{action: "message",// this is a received direct messagesource: "<sender>",// the id of the channel peer that sent you this direct messagetarget: "<you>",// your channel peer's iddata: "<data>"// the data sent to you by <sender>}

Examples

Some example services built with Network Web Sockets:

Feedback

If you find any bugs or issues please report them on the Network Web Sockets Issue Tracker.

If you would like to contribute to this project please consider forking this repo, making your changes and then creating a new Pull Request back to the main code repository.

License

The MIT License (MIT) Copyright (c) 2014 Rich Tibbett.

See the LICENSE file for more information.

About

Adhoc P2P web socket channels with secure, zero-config network service discovery+transport

Resources

Stars

53 stars

Watchers

14 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Network Web Sockets

Local Network broadcast channels with secure service discovery and encrypted proxy communication

Network Web Sockets allow web pages, native applications and devices to create encrypted Web Socket networks by discovering, binding and connecting peers that share the same channel name in the local network.

Channel names can either be:

  • Common, memorable strings such as e.g. "webchat" to allow any service to connect to a public channel, or:
  • Pseudo-secure strings such as randomly-generated hashes e.g. "cJWHi8q7SvNWAiSerpfxW3inYjXiKNqR" that are known and shared out-of-band between two or more actors to connect to a private channel.

Network Web Sockets prevents channel name discovery and channel message injection by snooping on the traffic in the local network. This is achieved using the mechanisms described in our DNS-based Secure Service Discovery (DNS-SSD) draft and encrypting all communications between participating nodes within different channels.

Any channel within the Network Web Sockets ecosystem is considered as secure as its out-of-band key sharing mechanisms (whether that is on a public forum online or via other more secure sharing mechanisms). If a channel key is available to a user, then that user will be able to join that channel (although nothing stops channels performing additional authentication over the channel whenever a new peer connects). Similarly, if a user is unaware of a channel name, they will have no way of discovering that channel name via any traffic flowing in the local network.

Web pages, native applications and devices can create ad-hoc inter-applicaton communication bridges between and among themselves for a variety of purposes:

  • For discovering matching peer services on the local device and/or the local network.
  • To create full-duplex, encrypted communications channels between network devices, native applications and web applications.
  • To create full-duplex, encrypted communication channels between web pages on different domains.
  • To import and export data between network devices, native applications and web applications.
  • To create initial local session signalling channels for establishing P2P sessions (for e.g. WebRTC signalling channel bootstrapping).
  • To establish low latency local network multiplayer signalling channels for games.
  • To enable collaborative editing, sharing and other forms of communication between different web pages and applications on a local device or a local network.

A web page or application can create a new Network Web Socket by choosing a channel name (any alphanumeric name) via any of the available Network Web Socket interfaces. When other peers join the same channel name then they will join all other peers in the same Network Web Socket broadcast network.

You can read more about the secure discovery process and proxy-to-proxy encryption used by Network Web Sockets on this wiki page.

Getting started

This repository contains an implementation of a Network Web Socket Proxy, written in Go, required to use Network Web Sockets.

You can either download a pre-built Network Web Sockets binary or build a Network Web Socket Proxy from source to get up and running.

Once you have a Network Web Socket Proxy up and running on your local machine then you are ready to create and share your own Network Web Sockets. A number of Network Web Socket client examples are also provided to help get you started.

Network Web Socket Interfaces

Local HTTP Test Console

Once a Network Web Socket Proxy is up and running, you can access a test console in your web browser and play around with Network Web Sockets at http://localhost:9009.

JavaScript Interfaces

The Network Web Sockets JavaScript polyfill library exposes a new JavaScript interface on the root global object for your convenience as follows:

  • NetworkWebSocket for creating/binding named websockets to share on the local network.

You must include the polyfill file in your own projects to create these JavaScript interfaces. Assuming we have added the Network Web Sockets JavaScript polyfill to our page then we can create a new NetworkWebSocket connection object via the JavaScript polyfill as follows:

// Create a new Network Web Socket peer in the networkvarws=newNetworkWebSocket("myChannelName");

We then wait for our peer to be successfully added to the network:

ws.onopen=function(){console.log('Our channel peer is now connected to the `myChannelName` web socket network');};

We can listen for incoming broadcast messages from channel peers in the network as follows:

ws.onmessage=function(event){console.log("Broadcast message received: "+event.data);};

We can send broadcast messages to all the other currently known channel peers in the network as follows:

ws.send('This is a broadcast message to *all* other channel peers');

When we create a Network Web Socket connection object then the Network Web Socket Proxy will start to discover and connect to all other myChannelName channel peers that are being advertised in the local network.

Each time a new channel peer is discovered in the network a Web Socket proxy connection to that peer is established and a new connect event is queued and fired against our root Network Web Socket object:

ws.onconnect=function(event){console.log('Another peer has been discovered and connected to our `myChannelName` web socket network!');};

In this connect event, we are provided with a direct, peer-to-peer Web Socket connection object that can be used to communicate directly with this newly discovered and connected peer.

We can send a direct message to a channel peer and listen for direct messages from this channel peer as follows:

// Wait for a new channel peer to connect to our `myChannelName` web socket networkws.onconnect=function(event){// Retrieve the new direct P2P Web Socket connection object with the newly connected channel peervarpeerWS=evt.detail.target;// Wait for this new direct p2p channel connection to be openedpeerWS.onopen=function(){// Listen for direct messages from this peerpeerWS.onmessage=function(event){console.log("Direct message received from ["+peerWS.id+"]: "+event.data);}// Send a direct message to this peerpeerWS.send('This is a direct message to the new channel peer *only*'):
};};

With both broadcast and direct messaging capabilities it is possible to build advanced services on top of Network Web Sockets. We are excited to see what you come up with!

Web Socket Interfaces

Devices and services running on the local machine can register Network Web Sockets without needing to use the JavaScript API. Thus, we can connect up other applications and devices sitting in the local network such as TVs, Set-Top Boxes, Fridges, Home Automation Systems (assuming they run their own Network Web Socket Proxy client also).

To create a new Network Web Socket connection to a channel from anywhere on the local machine (i.e. to become a 'channel peer') you can establish a Web Socket connection to a running Network Web Socket Proxy at the following URL:

ws://localhost:<port>/<channelName>

where:

  • port is the port on which your Network Web Socket Proxy is running (by default, 9009),
  • channelName is the name of the channel you want to create, and;

Messages sent and received on this Web Socket connection have a well-defined data format.

This Web Socket connection will notify you when channel peers connect and disconnect from <channelName> and when broadcast or direct messages are sent to you from other connected channel peers. This Web Socket connection can also be used to send broadcast or direct messages toward all other connected channel peers.

When a new channel peer connects to <channelName> on the network a new message is sent to your connection as follows:

{action: "connect",// a new channel peer has connected to <channelName>source: "<you>",// your channel peer's idtarget: "<newPeerId>"// the unique id of the new channel peer connection}

Similarly when a channel peer disconnects from <channelName> on the network a new message is sent to your connection as follows:

{action: "disconnect",// an existing channel peer has disconnected from <channelName>source: "<you>",// your channel peer's idtarget: "<existingPeerId>"// the unique id of the existing channel peer connection}

To send a broadcast message to all other connected channel peers you can send it over your connection as follows:

{action: "broadcast",// this is a sent broadcast messagedata: "<data>"// the data you want to send to all other channel peers}

When receiving a broadcast message from another connected channel peer it is sent to you over your connection as follows:

{action: "broadcast",// this is a received broadcast messagesource: "<peerId>",// the sending channel peer's iddata: "<data>"// the data you want to send to all other channel peers}

To send a direct message to another channel peer, bypassing the broadcast channel, you can send it over your connection as follows:

{action: "message",// this is a sent direct messagetarget: "<recipient>",// the id of an existing channel peer you want to send a direct message todata: "<data>"// the data you want to send to <recipient>}

When receiving a direct message from another channel peer, that has bypassed the broadcast channel, it is sent to you over your connection as follows:

{action: "message",// this is a received direct messagesource: "<sender>",// the id of the channel peer that sent you this direct messagetarget: "<you>",// your channel peer's iddata: "<data>"// the data sent to you by <sender>}

Examples

Some example services built with Network Web Sockets:

Feedback

If you find any bugs or issues please report them on the Network Web Sockets Issue Tracker.

If you would like to contribute to this project please consider forking this repo, making your changes and then creating a new Pull Request back to the main code repository.

License

The MIT License (MIT) Copyright (c) 2014 Rich Tibbett.

See the LICENSE file for more information.

About

Adhoc P2P web socket channels with secure, zero-config network service discovery+transport

Resources

Stars

53 stars

Watchers

14 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Network Web Sockets

Local Network broadcast channels with secure service discovery and encrypted proxy communication

Network Web Sockets allow web pages, native applications and devices to create encrypted Web Socket networks by discovering, binding and connecting peers that share the same channel name in the local network.

Channel names can either be:

  • Common, memorable strings such as e.g. "webchat" to allow any service to connect to a public channel, or:
  • Pseudo-secure strings such as randomly-generated hashes e.g. "cJWHi8q7SvNWAiSerpfxW3inYjXiKNqR" that are known and shared out-of-band between two or more actors to connect to a private channel.

Network Web Sockets prevents channel name discovery and channel message injection by snooping on the traffic in the local network. This is achieved using the mechanisms described in our DNS-based Secure Service Discovery (DNS-SSD) draft and encrypting all communications between participating nodes within different channels.

Any channel within the Network Web Sockets ecosystem is considered as secure as its out-of-band key sharing mechanisms (whether that is on a public forum online or via other more secure sharing mechanisms). If a channel key is available to a user, then that user will be able to join that channel (although nothing stops channels performing additional authentication over the channel whenever a new peer connects). Similarly, if a user is unaware of a channel name, they will have no way of discovering that channel name via any traffic flowing in the local network.

Web pages, native applications and devices can create ad-hoc inter-applicaton communication bridges between and among themselves for a variety of purposes:

  • For discovering matching peer services on the local device and/or the local network.
  • To create full-duplex, encrypted communications channels between network devices, native applications and web applications.
  • To create full-duplex, encrypted communication channels between web pages on different domains.
  • To import and export data between network devices, native applications and web applications.
  • To create initial local session signalling channels for establishing P2P sessions (for e.g. WebRTC signalling channel bootstrapping).
  • To establish low latency local network multiplayer signalling channels for games.
  • To enable collaborative editing, sharing and other forms of communication between different web pages and applications on a local device or a local network.

A web page or application can create a new Network Web Socket by choosing a channel name (any alphanumeric name) via any of the available Network Web Socket interfaces. When other peers join the same channel name then they will join all other peers in the same Network Web Socket broadcast network.

You can read more about the secure discovery process and proxy-to-proxy encryption used by Network Web Sockets on this wiki page.

Getting started

This repository contains an implementation of a Network Web Socket Proxy, written in Go, required to use Network Web Sockets.

You can either download a pre-built Network Web Sockets binary or build a Network Web Socket Proxy from source to get up and running.

Once you have a Network Web Socket Proxy up and running on your local machine then you are ready to create and share your own Network Web Sockets. A number of Network Web Socket client examples are also provided to help get you started.

Network Web Socket Interfaces

Local HTTP Test Console

Once a Network Web Socket Proxy is up and running, you can access a test console in your web browser and play around with Network Web Sockets at http://localhost:9009.

JavaScript Interfaces

The Network Web Sockets JavaScript polyfill library exposes a new JavaScript interface on the root global object for your convenience as follows:

  • NetworkWebSocket for creating/binding named websockets to share on the local network.

You must include the polyfill file in your own projects to create these JavaScript interfaces. Assuming we have added the Network Web Sockets JavaScript polyfill to our page then we can create a new NetworkWebSocket connection object via the JavaScript polyfill as follows:

// Create a new Network Web Socket peer in the networkvarws=newNetworkWebSocket("myChannelName");

We then wait for our peer to be successfully added to the network:

ws.onopen=function(){console.log('Our channel peer is now connected to the `myChannelName` web socket network');};

We can listen for incoming broadcast messages from channel peers in the network as follows:

ws.onmessage=function(event){console.log("Broadcast message received: "+event.data);};

We can send broadcast messages to all the other currently known channel peers in the network as follows:

ws.send('This is a broadcast message to *all* other channel peers');

When we create a Network Web Socket connection object then the Network Web Socket Proxy will start to discover and connect to all other myChannelName channel peers that are being advertised in the local network.

Each time a new channel peer is discovered in the network a Web Socket proxy connection to that peer is established and a new connect event is queued and fired against our root Network Web Socket object:

ws.onconnect=function(event){console.log('Another peer has been discovered and connected to our `myChannelName` web socket network!');};

In this connect event, we are provided with a direct, peer-to-peer Web Socket connection object that can be used to communicate directly with this newly discovered and connected peer.

We can send a direct message to a channel peer and listen for direct messages from this channel peer as follows:

// Wait for a new channel peer to connect to our `myChannelName` web socket networkws.onconnect=function(event){// Retrieve the new direct P2P Web Socket connection object with the newly connected channel peervarpeerWS=evt.detail.target;// Wait for this new direct p2p channel connection to be openedpeerWS.onopen=function(){// Listen for direct messages from this peerpeerWS.onmessage=function(event){console.log("Direct message received from ["+peerWS.id+"]: "+event.data);}// Send a direct message to this peerpeerWS.send('This is a direct message to the new channel peer *only*'):
};};

With both broadcast and direct messaging capabilities it is possible to build advanced services on top of Network Web Sockets. We are excited to see what you come up with!

Web Socket Interfaces

Devices and services running on the local machine can register Network Web Sockets without needing to use the JavaScript API. Thus, we can connect up other applications and devices sitting in the local network such as TVs, Set-Top Boxes, Fridges, Home Automation Systems (assuming they run their own Network Web Socket Proxy client also).

To create a new Network Web Socket connection to a channel from anywhere on the local machine (i.e. to become a 'channel peer') you can establish a Web Socket connection to a running Network Web Socket Proxy at the following URL:

ws://localhost:<port>/<channelName>

where:

  • port is the port on which your Network Web Socket Proxy is running (by default, 9009),
  • channelName is the name of the channel you want to create, and;

Messages sent and received on this Web Socket connection have a well-defined data format.

This Web Socket connection will notify you when channel peers connect and disconnect from <channelName> and when broadcast or direct messages are sent to you from other connected channel peers. This Web Socket connection can also be used to send broadcast or direct messages toward all other connected channel peers.

When a new channel peer connects to <channelName> on the network a new message is sent to your connection as follows:

{action: "connect",// a new channel peer has connected to <channelName>source: "<you>",// your channel peer's idtarget: "<newPeerId>"// the unique id of the new channel peer connection}

Similarly when a channel peer disconnects from <channelName> on the network a new message is sent to your connection as follows:

{action: "disconnect",// an existing channel peer has disconnected from <channelName>source: "<you>",// your channel peer's idtarget: "<existingPeerId>"// the unique id of the existing channel peer connection}

To send a broadcast message to all other connected channel peers you can send it over your connection as follows:

{action: "broadcast",// this is a sent broadcast messagedata: "<data>"// the data you want to send to all other channel peers}

When receiving a broadcast message from another connected channel peer it is sent to you over your connection as follows:

{action: "broadcast",// this is a received broadcast messagesource: "<peerId>",// the sending channel peer's iddata: "<data>"// the data you want to send to all other channel peers}

To send a direct message to another channel peer, bypassing the broadcast channel, you can send it over your connection as follows:

{action: "message",// this is a sent direct messagetarget: "<recipient>",// the id of an existing channel peer you want to send a direct message todata: "<data>"// the data you want to send to <recipient>}

When receiving a direct message from another channel peer, that has bypassed the broadcast channel, it is sent to you over your connection as follows:

{action: "message",// this is a received direct messagesource: "<sender>",// the id of the channel peer that sent you this direct messagetarget: "<you>",// your channel peer's iddata: "<data>"// the data sent to you by <sender>}

Examples

Some example services built with Network Web Sockets:

Feedback

If you find any bugs or issues please report them on the Network Web Sockets Issue Tracker.

If you would like to contribute to this project please consider forking this repo, making your changes and then creating a new Pull Request back to the main code repository.

License

The MIT License (MIT) Copyright (c) 2014 Rich Tibbett.

See the LICENSE file for more information.

About

Adhoc P2P web socket channels with secure, zero-config network service discovery+transport

Resources

Stars

53 stars

Watchers

14 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Network Web Sockets

Local Network broadcast channels with secure service discovery and encrypted proxy communication

Network Web Sockets allow web pages, native applications and devices to create encrypted Web Socket networks by discovering, binding and connecting peers that share the same channel name in the local network.

Channel names can either be:

  • Common, memorable strings such as e.g. "webchat" to allow any service to connect to a public channel, or:
  • Pseudo-secure strings such as randomly-generated hashes e.g. "cJWHi8q7SvNWAiSerpfxW3inYjXiKNqR" that are known and shared out-of-band between two or more actors to connect to a private channel.

Network Web Sockets prevents channel name discovery and channel message injection by snooping on the traffic in the local network. This is achieved using the mechanisms described in our DNS-based Secure Service Discovery (DNS-SSD) draft and encrypting all communications between participating nodes within different channels.

Any channel within the Network Web Sockets ecosystem is considered as secure as its out-of-band key sharing mechanisms (whether that is on a public forum online or via other more secure sharing mechanisms). If a channel key is available to a user, then that user will be able to join that channel (although nothing stops channels performing additional authentication over the channel whenever a new peer connects). Similarly, if a user is unaware of a channel name, they will have no way of discovering that channel name via any traffic flowing in the local network.

Web pages, native applications and devices can create ad-hoc inter-applicaton communication bridges between and among themselves for a variety of purposes:

  • For discovering matching peer services on the local device and/or the local network.
  • To create full-duplex, encrypted communications channels between network devices, native applications and web applications.
  • To create full-duplex, encrypted communication channels between web pages on different domains.
  • To import and export data between network devices, native applications and web applications.
  • To create initial local session signalling channels for establishing P2P sessions (for e.g. WebRTC signalling channel bootstrapping).
  • To establish low latency local network multiplayer signalling channels for games.
  • To enable collaborative editing, sharing and other forms of communication between different web pages and applications on a local device or a local network.

A web page or application can create a new Network Web Socket by choosing a channel name (any alphanumeric name) via any of the available Network Web Socket interfaces. When other peers join the same channel name then they will join all other peers in the same Network Web Socket broadcast network.

You can read more about the secure discovery process and proxy-to-proxy encryption used by Network Web Sockets on this wiki page.

Getting started

This repository contains an implementation of a Network Web Socket Proxy, written in Go, required to use Network Web Sockets.

You can either download a pre-built Network Web Sockets binary or build a Network Web Socket Proxy from source to get up and running.

Once you have a Network Web Socket Proxy up and running on your local machine then you are ready to create and share your own Network Web Sockets. A number of Network Web Socket client examples are also provided to help get you started.

Network Web Socket Interfaces

Local HTTP Test Console

Once a Network Web Socket Proxy is up and running, you can access a test console in your web browser and play around with Network Web Sockets at http://localhost:9009.

JavaScript Interfaces

The Network Web Sockets JavaScript polyfill library exposes a new JavaScript interface on the root global object for your convenience as follows:

  • NetworkWebSocket for creating/binding named websockets to share on the local network.

You must include the polyfill file in your own projects to create these JavaScript interfaces. Assuming we have added the Network Web Sockets JavaScript polyfill to our page then we can create a new NetworkWebSocket connection object via the JavaScript polyfill as follows:

// Create a new Network Web Socket peer in the networkvarws=newNetworkWebSocket("myChannelName");

We then wait for our peer to be successfully added to the network:

ws.onopen=function(){console.log('Our channel peer is now connected to the `myChannelName` web socket network');};

We can listen for incoming broadcast messages from channel peers in the network as follows:

ws.onmessage=function(event){console.log("Broadcast message received: "+event.data);};

We can send broadcast messages to all the other currently known channel peers in the network as follows:

ws.send('This is a broadcast message to *all* other channel peers');

When we create a Network Web Socket connection object then the Network Web Socket Proxy will start to discover and connect to all other myChannelName channel peers that are being advertised in the local network.

Each time a new channel peer is discovered in the network a Web Socket proxy connection to that peer is established and a new connect event is queued and fired against our root Network Web Socket object:

ws.onconnect=function(event){console.log('Another peer has been discovered and connected to our `myChannelName` web socket network!');};

In this connect event, we are provided with a direct, peer-to-peer Web Socket connection object that can be used to communicate directly with this newly discovered and connected peer.

We can send a direct message to a channel peer and listen for direct messages from this channel peer as follows:

// Wait for a new channel peer to connect to our `myChannelName` web socket networkws.onconnect=function(event){// Retrieve the new direct P2P Web Socket connection object with the newly connected channel peervarpeerWS=evt.detail.target;// Wait for this new direct p2p channel connection to be openedpeerWS.onopen=function(){// Listen for direct messages from this peerpeerWS.onmessage=function(event){console.log("Direct message received from ["+peerWS.id+"]: "+event.data);}// Send a direct message to this peerpeerWS.send('This is a direct message to the new channel peer *only*'):
};};

With both broadcast and direct messaging capabilities it is possible to build advanced services on top of Network Web Sockets. We are excited to see what you come up with!

Web Socket Interfaces

Devices and services running on the local machine can register Network Web Sockets without needing to use the JavaScript API. Thus, we can connect up other applications and devices sitting in the local network such as TVs, Set-Top Boxes, Fridges, Home Automation Systems (assuming they run their own Network Web Socket Proxy client also).

To create a new Network Web Socket connection to a channel from anywhere on the local machine (i.e. to become a 'channel peer') you can establish a Web Socket connection to a running Network Web Socket Proxy at the following URL:

ws://localhost:<port>/<channelName>

where:

  • port is the port on which your Network Web Socket Proxy is running (by default, 9009),
  • channelName is the name of the channel you want to create, and;

Messages sent and received on this Web Socket connection have a well-defined data format.

This Web Socket connection will notify you when channel peers connect and disconnect from <channelName> and when broadcast or direct messages are sent to you from other connected channel peers. This Web Socket connection can also be used to send broadcast or direct messages toward all other connected channel peers.

When a new channel peer connects to <channelName> on the network a new message is sent to your connection as follows:

{action: "connect",// a new channel peer has connected to <channelName>source: "<you>",// your channel peer's idtarget: "<newPeerId>"// the unique id of the new channel peer connection}

Similarly when a channel peer disconnects from <channelName> on the network a new message is sent to your connection as follows:

{action: "disconnect",// an existing channel peer has disconnected from <channelName>source: "<you>",// your channel peer's idtarget: "<existingPeerId>"// the unique id of the existing channel peer connection}

To send a broadcast message to all other connected channel peers you can send it over your connection as follows:

{action: "broadcast",// this is a sent broadcast messagedata: "<data>"// the data you want to send to all other channel peers}

When receiving a broadcast message from another connected channel peer it is sent to you over your connection as follows:

{action: "broadcast",// this is a received broadcast messagesource: "<peerId>",// the sending channel peer's iddata: "<data>"// the data you want to send to all other channel peers}

To send a direct message to another channel peer, bypassing the broadcast channel, you can send it over your connection as follows:

{action: "message",// this is a sent direct messagetarget: "<recipient>",// the id of an existing channel peer you want to send a direct message todata: "<data>"// the data you want to send to <recipient>}

When receiving a direct message from another channel peer, that has bypassed the broadcast channel, it is sent to you over your connection as follows:

{action: "message",// this is a received direct messagesource: "<sender>",// the id of the channel peer that sent you this direct messagetarget: "<you>",// your channel peer's iddata: "<data>"// the data sent to you by <sender>}

Examples

Some example services built with Network Web Sockets:

Feedback

If you find any bugs or issues please report them on the Network Web Sockets Issue Tracker.

If you would like to contribute to this project please consider forking this repo, making your changes and then creating a new Pull Request back to the main code repository.

License

The MIT License (MIT) Copyright (c) 2014 Rich Tibbett.

See the LICENSE file for more information.

About

Adhoc P2P web socket channels with secure, zero-config network service discovery+transport

Resources

Stars

53 stars

Watchers

14 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Network Web Sockets

Local Network broadcast channels with secure service discovery and encrypted proxy communication

Network Web Sockets allow web pages, native applications and devices to create encrypted Web Socket networks by discovering, binding and connecting peers that share the same channel name in the local network.

Channel names can either be:

  • Common, memorable strings such as e.g. "webchat" to allow any service to connect to a public channel, or:
  • Pseudo-secure strings such as randomly-generated hashes e.g. "cJWHi8q7SvNWAiSerpfxW3inYjXiKNqR" that are known and shared out-of-band between two or more actors to connect to a private channel.

Network Web Sockets prevents channel name discovery and channel message injection by snooping on the traffic in the local network. This is achieved using the mechanisms described in our DNS-based Secure Service Discovery (DNS-SSD) draft and encrypting all communications between participating nodes within different channels.

Any channel within the Network Web Sockets ecosystem is considered as secure as its out-of-band key sharing mechanisms (whether that is on a public forum online or via other more secure sharing mechanisms). If a channel key is available to a user, then that user will be able to join that channel (although nothing stops channels performing additional authentication over the channel whenever a new peer connects). Similarly, if a user is unaware of a channel name, they will have no way of discovering that channel name via any traffic flowing in the local network.

Web pages, native applications and devices can create ad-hoc inter-applicaton communication bridges between and among themselves for a variety of purposes:

  • For discovering matching peer services on the local device and/or the local network.
  • To create full-duplex, encrypted communications channels between network devices, native applications and web applications.
  • To create full-duplex, encrypted communication channels between web pages on different domains.
  • To import and export data between network devices, native applications and web applications.
  • To create initial local session signalling channels for establishing P2P sessions (for e.g. WebRTC signalling channel bootstrapping).
  • To establish low latency local network multiplayer signalling channels for games.
  • To enable collaborative editing, sharing and other forms of communication between different web pages and applications on a local device or a local network.

A web page or application can create a new Network Web Socket by choosing a channel name (any alphanumeric name) via any of the available Network Web Socket interfaces. When other peers join the same channel name then they will join all other peers in the same Network Web Socket broadcast network.

You can read more about the secure discovery process and proxy-to-proxy encryption used by Network Web Sockets on this wiki page.

Getting started

This repository contains an implementation of a Network Web Socket Proxy, written in Go, required to use Network Web Sockets.

You can either download a pre-built Network Web Sockets binary or build a Network Web Socket Proxy from source to get up and running.

Once you have a Network Web Socket Proxy up and running on your local machine then you are ready to create and share your own Network Web Sockets. A number of Network Web Socket client examples are also provided to help get you started.

Network Web Socket Interfaces

Local HTTP Test Console

Once a Network Web Socket Proxy is up and running, you can access a test console in your web browser and play around with Network Web Sockets at http://localhost:9009.

JavaScript Interfaces

The Network Web Sockets JavaScript polyfill library exposes a new JavaScript interface on the root global object for your convenience as follows:

  • NetworkWebSocket for creating/binding named websockets to share on the local network.

You must include the polyfill file in your own projects to create these JavaScript interfaces. Assuming we have added the Network Web Sockets JavaScript polyfill to our page then we can create a new NetworkWebSocket connection object via the JavaScript polyfill as follows:

// Create a new Network Web Socket peer in the networkvarws=newNetworkWebSocket("myChannelName");

We then wait for our peer to be successfully added to the network:

ws.onopen=function(){console.log('Our channel peer is now connected to the `myChannelName` web socket network');};

We can listen for incoming broadcast messages from channel peers in the network as follows:

ws.onmessage=function(event){console.log("Broadcast message received: "+event.data);};

We can send broadcast messages to all the other currently known channel peers in the network as follows:

ws.send('This is a broadcast message to *all* other channel peers');

When we create a Network Web Socket connection object then the Network Web Socket Proxy will start to discover and connect to all other myChannelName channel peers that are being advertised in the local network.

Each time a new channel peer is discovered in the network a Web Socket proxy connection to that peer is established and a new connect event is queued and fired against our root Network Web Socket object:

ws.onconnect=function(event){console.log('Another peer has been discovered and connected to our `myChannelName` web socket network!');};

In this connect event, we are provided with a direct, peer-to-peer Web Socket connection object that can be used to communicate directly with this newly discovered and connected peer.

We can send a direct message to a channel peer and listen for direct messages from this channel peer as follows:

// Wait for a new channel peer to connect to our `myChannelName` web socket networkws.onconnect=function(event){// Retrieve the new direct P2P Web Socket connection object with the newly connected channel peervarpeerWS=evt.detail.target;// Wait for this new direct p2p channel connection to be openedpeerWS.onopen=function(){// Listen for direct messages from this peerpeerWS.onmessage=function(event){console.log("Direct message received from ["+peerWS.id+"]: "+event.data);}// Send a direct message to this peerpeerWS.send('This is a direct message to the new channel peer *only*'):
};};

With both broadcast and direct messaging capabilities it is possible to build advanced services on top of Network Web Sockets. We are excited to see what you come up with!

Web Socket Interfaces

Devices and services running on the local machine can register Network Web Sockets without needing to use the JavaScript API. Thus, we can connect up other applications and devices sitting in the local network such as TVs, Set-Top Boxes, Fridges, Home Automation Systems (assuming they run their own Network Web Socket Proxy client also).

To create a new Network Web Socket connection to a channel from anywhere on the local machine (i.e. to become a 'channel peer') you can establish a Web Socket connection to a running Network Web Socket Proxy at the following URL:

ws://localhost:<port>/<channelName>

where:

  • port is the port on which your Network Web Socket Proxy is running (by default, 9009),
  • channelName is the name of the channel you want to create, and;

Messages sent and received on this Web Socket connection have a well-defined data format.

This Web Socket connection will notify you when channel peers connect and disconnect from <channelName> and when broadcast or direct messages are sent to you from other connected channel peers. This Web Socket connection can also be used to send broadcast or direct messages toward all other connected channel peers.

When a new channel peer connects to <channelName> on the network a new message is sent to your connection as follows:

{action: "connect",// a new channel peer has connected to <channelName>source: "<you>",// your channel peer's idtarget: "<newPeerId>"// the unique id of the new channel peer connection}

Similarly when a channel peer disconnects from <channelName> on the network a new message is sent to your connection as follows:

{action: "disconnect",// an existing channel peer has disconnected from <channelName>source: "<you>",// your channel peer's idtarget: "<existingPeerId>"// the unique id of the existing channel peer connection}

To send a broadcast message to all other connected channel peers you can send it over your connection as follows:

{action: "broadcast",// this is a sent broadcast messagedata: "<data>"// the data you want to send to all other channel peers}

When receiving a broadcast message from another connected channel peer it is sent to you over your connection as follows:

{action: "broadcast",// this is a received broadcast messagesource: "<peerId>",// the sending channel peer's iddata: "<data>"// the data you want to send to all other channel peers}

To send a direct message to another channel peer, bypassing the broadcast channel, you can send it over your connection as follows:

{action: "message",// this is a sent direct messagetarget: "<recipient>",// the id of an existing channel peer you want to send a direct message todata: "<data>"// the data you want to send to <recipient>}

When receiving a direct message from another channel peer, that has bypassed the broadcast channel, it is sent to you over your connection as follows:

{action: "message",// this is a received direct messagesource: "<sender>",// the id of the channel peer that sent you this direct messagetarget: "<you>",// your channel peer's iddata: "<data>"// the data sent to you by <sender>}

Examples

Some example services built with Network Web Sockets:

Feedback

If you find any bugs or issues please report them on the Network Web Sockets Issue Tracker.

If you would like to contribute to this project please consider forking this repo, making your changes and then creating a new Pull Request back to the main code repository.

License

The MIT License (MIT) Copyright (c) 2014 Rich Tibbett.

See the LICENSE file for more information.

About

Adhoc P2P web socket channels with secure, zero-config network service discovery+transport

Resources

Stars

53 stars

Watchers

14 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Network Web Sockets

Local Network broadcast channels with secure service discovery and encrypted proxy communication

Network Web Sockets allow web pages, native applications and devices to create encrypted Web Socket networks by discovering, binding and connecting peers that share the same channel name in the local network.

Channel names can either be:

  • Common, memorable strings such as e.g. "webchat" to allow any service to connect to a public channel, or:
  • Pseudo-secure strings such as randomly-generated hashes e.g. "cJWHi8q7SvNWAiSerpfxW3inYjXiKNqR" that are known and shared out-of-band between two or more actors to connect to a private channel.

Network Web Sockets prevents channel name discovery and channel message injection by snooping on the traffic in the local network. This is achieved using the mechanisms described in our DNS-based Secure Service Discovery (DNS-SSD) draft and encrypting all communications between participating nodes within different channels.

Any channel within the Network Web Sockets ecosystem is considered as secure as its out-of-band key sharing mechanisms (whether that is on a public forum online or via other more secure sharing mechanisms). If a channel key is available to a user, then that user will be able to join that channel (although nothing stops channels performing additional authentication over the channel whenever a new peer connects). Similarly, if a user is unaware of a channel name, they will have no way of discovering that channel name via any traffic flowing in the local network.

Web pages, native applications and devices can create ad-hoc inter-applicaton communication bridges between and among themselves for a variety of purposes:

  • For discovering matching peer services on the local device and/or the local network.
  • To create full-duplex, encrypted communications channels between network devices, native applications and web applications.
  • To create full-duplex, encrypted communication channels between web pages on different domains.
  • To import and export data between network devices, native applications and web applications.
  • To create initial local session signalling channels for establishing P2P sessions (for e.g. WebRTC signalling channel bootstrapping).
  • To establish low latency local network multiplayer signalling channels for games.
  • To enable collaborative editing, sharing and other forms of communication between different web pages and applications on a local device or a local network.

A web page or application can create a new Network Web Socket by choosing a channel name (any alphanumeric name) via any of the available Network Web Socket interfaces. When other peers join the same channel name then they will join all other peers in the same Network Web Socket broadcast network.

You can read more about the secure discovery process and proxy-to-proxy encryption used by Network Web Sockets on this wiki page.

Getting started

This repository contains an implementation of a Network Web Socket Proxy, written in Go, required to use Network Web Sockets.

You can either download a pre-built Network Web Sockets binary or build a Network Web Socket Proxy from source to get up and running.

Once you have a Network Web Socket Proxy up and running on your local machine then you are ready to create and share your own Network Web Sockets. A number of Network Web Socket client examples are also provided to help get you started.

Network Web Socket Interfaces

Local HTTP Test Console

Once a Network Web Socket Proxy is up and running, you can access a test console in your web browser and play around with Network Web Sockets at http://localhost:9009.

JavaScript Interfaces

The Network Web Sockets JavaScript polyfill library exposes a new JavaScript interface on the root global object for your convenience as follows:

  • NetworkWebSocket for creating/binding named websockets to share on the local network.

You must include the polyfill file in your own projects to create these JavaScript interfaces. Assuming we have added the Network Web Sockets JavaScript polyfill to our page then we can create a new NetworkWebSocket connection object via the JavaScript polyfill as follows:

// Create a new Network Web Socket peer in the networkvarws=newNetworkWebSocket("myChannelName");

We then wait for our peer to be successfully added to the network:

ws.onopen=function(){console.log('Our channel peer is now connected to the `myChannelName` web socket network');};

We can listen for incoming broadcast messages from channel peers in the network as follows:

ws.onmessage=function(event){console.log("Broadcast message received: "+event.data);};

We can send broadcast messages to all the other currently known channel peers in the network as follows:

ws.send('This is a broadcast message to *all* other channel peers');

When we create a Network Web Socket connection object then the Network Web Socket Proxy will start to discover and connect to all other myChannelName channel peers that are being advertised in the local network.

Each time a new channel peer is discovered in the network a Web Socket proxy connection to that peer is established and a new connect event is queued and fired against our root Network Web Socket object:

ws.onconnect=function(event){console.log('Another peer has been discovered and connected to our `myChannelName` web socket network!');};

In this connect event, we are provided with a direct, peer-to-peer Web Socket connection object that can be used to communicate directly with this newly discovered and connected peer.

We can send a direct message to a channel peer and listen for direct messages from this channel peer as follows:

// Wait for a new channel peer to connect to our `myChannelName` web socket networkws.onconnect=function(event){// Retrieve the new direct P2P Web Socket connection object with the newly connected channel peervarpeerWS=evt.detail.target;// Wait for this new direct p2p channel connection to be openedpeerWS.onopen=function(){// Listen for direct messages from this peerpeerWS.onmessage=function(event){console.log("Direct message received from ["+peerWS.id+"]: "+event.data);}// Send a direct message to this peerpeerWS.send('This is a direct message to the new channel peer *only*'):
};};

With both broadcast and direct messaging capabilities it is possible to build advanced services on top of Network Web Sockets. We are excited to see what you come up with!

Web Socket Interfaces

Devices and services running on the local machine can register Network Web Sockets without needing to use the JavaScript API. Thus, we can connect up other applications and devices sitting in the local network such as TVs, Set-Top Boxes, Fridges, Home Automation Systems (assuming they run their own Network Web Socket Proxy client also).

To create a new Network Web Socket connection to a channel from anywhere on the local machine (i.e. to become a 'channel peer') you can establish a Web Socket connection to a running Network Web Socket Proxy at the following URL:

ws://localhost:<port>/<channelName>

where:

  • port is the port on which your Network Web Socket Proxy is running (by default, 9009),
  • channelName is the name of the channel you want to create, and;

Messages sent and received on this Web Socket connection have a well-defined data format.

This Web Socket connection will notify you when channel peers connect and disconnect from <channelName> and when broadcast or direct messages are sent to you from other connected channel peers. This Web Socket connection can also be used to send broadcast or direct messages toward all other connected channel peers.

When a new channel peer connects to <channelName> on the network a new message is sent to your connection as follows:

{action: "connect",// a new channel peer has connected to <channelName>source: "<you>",// your channel peer's idtarget: "<newPeerId>"// the unique id of the new channel peer connection}

Similarly when a channel peer disconnects from <channelName> on the network a new message is sent to your connection as follows:

{action: "disconnect",// an existing channel peer has disconnected from <channelName>source: "<you>",// your channel peer's idtarget: "<existingPeerId>"// the unique id of the existing channel peer connection}

To send a broadcast message to all other connected channel peers you can send it over your connection as follows:

{action: "broadcast",// this is a sent broadcast messagedata: "<data>"// the data you want to send to all other channel peers}

When receiving a broadcast message from another connected channel peer it is sent to you over your connection as follows:

{action: "broadcast",// this is a received broadcast messagesource: "<peerId>",// the sending channel peer's iddata: "<data>"// the data you want to send to all other channel peers}

To send a direct message to another channel peer, bypassing the broadcast channel, you can send it over your connection as follows:

{action: "message",// this is a sent direct messagetarget: "<recipient>",// the id of an existing channel peer you want to send a direct message todata: "<data>"// the data you want to send to <recipient>}

When receiving a direct message from another channel peer, that has bypassed the broadcast channel, it is sent to you over your connection as follows:

{action: "message",// this is a received direct messagesource: "<sender>",// the id of the channel peer that sent you this direct messagetarget: "<you>",// your channel peer's iddata: "<data>"// the data sent to you by <sender>}

Examples

Some example services built with Network Web Sockets:

Feedback

If you find any bugs or issues please report them on the Network Web Sockets Issue Tracker.

If you would like to contribute to this project please consider forking this repo, making your changes and then creating a new Pull Request back to the main code repository.

License

The MIT License (MIT) Copyright (c) 2014 Rich Tibbett.

See the LICENSE file for more information.

About

Adhoc P2P web socket channels with secure, zero-config network service discovery+transport

Resources

Stars

53 stars

Watchers

14 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Network Web Sockets

Local Network broadcast channels with secure service discovery and encrypted proxy communication

Network Web Sockets allow web pages, native applications and devices to create encrypted Web Socket networks by discovering, binding and connecting peers that share the same channel name in the local network.

Channel names can either be:

  • Common, memorable strings such as e.g. "webchat" to allow any service to connect to a public channel, or:
  • Pseudo-secure strings such as randomly-generated hashes e.g. "cJWHi8q7SvNWAiSerpfxW3inYjXiKNqR" that are known and shared out-of-band between two or more actors to connect to a private channel.

Network Web Sockets prevents channel name discovery and channel message injection by snooping on the traffic in the local network. This is achieved using the mechanisms described in our DNS-based Secure Service Discovery (DNS-SSD) draft and encrypting all communications between participating nodes within different channels.

Any channel within the Network Web Sockets ecosystem is considered as secure as its out-of-band key sharing mechanisms (whether that is on a public forum online or via other more secure sharing mechanisms). If a channel key is available to a user, then that user will be able to join that channel (although nothing stops channels performing additional authentication over the channel whenever a new peer connects). Similarly, if a user is unaware of a channel name, they will have no way of discovering that channel name via any traffic flowing in the local network.

Web pages, native applications and devices can create ad-hoc inter-applicaton communication bridges between and among themselves for a variety of purposes:

  • For discovering matching peer services on the local device and/or the local network.
  • To create full-duplex, encrypted communications channels between network devices, native applications and web applications.
  • To create full-duplex, encrypted communication channels between web pages on different domains.
  • To import and export data between network devices, native applications and web applications.
  • To create initial local session signalling channels for establishing P2P sessions (for e.g. WebRTC signalling channel bootstrapping).
  • To establish low latency local network multiplayer signalling channels for games.
  • To enable collaborative editing, sharing and other forms of communication between different web pages and applications on a local device or a local network.

A web page or application can create a new Network Web Socket by choosing a channel name (any alphanumeric name) via any of the available Network Web Socket interfaces. When other peers join the same channel name then they will join all other peers in the same Network Web Socket broadcast network.

You can read more about the secure discovery process and proxy-to-proxy encryption used by Network Web Sockets on this wiki page.

Getting started

This repository contains an implementation of a Network Web Socket Proxy, written in Go, required to use Network Web Sockets.

You can either download a pre-built Network Web Sockets binary or build a Network Web Socket Proxy from source to get up and running.

Once you have a Network Web Socket Proxy up and running on your local machine then you are ready to create and share your own Network Web Sockets. A number of Network Web Socket client examples are also provided to help get you started.

Network Web Socket Interfaces

Local HTTP Test Console

Once a Network Web Socket Proxy is up and running, you can access a test console in your web browser and play around with Network Web Sockets at http://localhost:9009.

JavaScript Interfaces

The Network Web Sockets JavaScript polyfill library exposes a new JavaScript interface on the root global object for your convenience as follows:

  • NetworkWebSocket for creating/binding named websockets to share on the local network.

You must include the polyfill file in your own projects to create these JavaScript interfaces. Assuming we have added the Network Web Sockets JavaScript polyfill to our page then we can create a new NetworkWebSocket connection object via the JavaScript polyfill as follows:

// Create a new Network Web Socket peer in the networkvarws=newNetworkWebSocket("myChannelName");

We then wait for our peer to be successfully added to the network:

ws.onopen=function(){console.log('Our channel peer is now connected to the `myChannelName` web socket network');};

We can listen for incoming broadcast messages from channel peers in the network as follows:

ws.onmessage=function(event){console.log("Broadcast message received: "+event.data);};

We can send broadcast messages to all the other currently known channel peers in the network as follows:

ws.send('This is a broadcast message to *all* other channel peers');

When we create a Network Web Socket connection object then the Network Web Socket Proxy will start to discover and connect to all other myChannelName channel peers that are being advertised in the local network.

Each time a new channel peer is discovered in the network a Web Socket proxy connection to that peer is established and a new connect event is queued and fired against our root Network Web Socket object:

ws.onconnect=function(event){console.log('Another peer has been discovered and connected to our `myChannelName` web socket network!');};

In this connect event, we are provided with a direct, peer-to-peer Web Socket connection object that can be used to communicate directly with this newly discovered and connected peer.

We can send a direct message to a channel peer and listen for direct messages from this channel peer as follows:

// Wait for a new channel peer to connect to our `myChannelName` web socket networkws.onconnect=function(event){// Retrieve the new direct P2P Web Socket connection object with the newly connected channel peervarpeerWS=evt.detail.target;// Wait for this new direct p2p channel connection to be openedpeerWS.onopen=function(){// Listen for direct messages from this peerpeerWS.onmessage=function(event){console.log("Direct message received from ["+peerWS.id+"]: "+event.data);}// Send a direct message to this peerpeerWS.send('This is a direct message to the new channel peer *only*'):
};};

With both broadcast and direct messaging capabilities it is possible to build advanced services on top of Network Web Sockets. We are excited to see what you come up with!

Web Socket Interfaces

Devices and services running on the local machine can register Network Web Sockets without needing to use the JavaScript API. Thus, we can connect up other applications and devices sitting in the local network such as TVs, Set-Top Boxes, Fridges, Home Automation Systems (assuming they run their own Network Web Socket Proxy client also).

To create a new Network Web Socket connection to a channel from anywhere on the local machine (i.e. to become a 'channel peer') you can establish a Web Socket connection to a running Network Web Socket Proxy at the following URL:

ws://localhost:<port>/<channelName>

where:

  • port is the port on which your Network Web Socket Proxy is running (by default, 9009),
  • channelName is the name of the channel you want to create, and;

Messages sent and received on this Web Socket connection have a well-defined data format.

This Web Socket connection will notify you when channel peers connect and disconnect from <channelName> and when broadcast or direct messages are sent to you from other connected channel peers. This Web Socket connection can also be used to send broadcast or direct messages toward all other connected channel peers.

When a new channel peer connects to <channelName> on the network a new message is sent to your connection as follows:

{action: "connect",// a new channel peer has connected to <channelName>source: "<you>",// your channel peer's idtarget: "<newPeerId>"// the unique id of the new channel peer connection}

Similarly when a channel peer disconnects from <channelName> on the network a new message is sent to your connection as follows:

{action: "disconnect",// an existing channel peer has disconnected from <channelName>source: "<you>",// your channel peer's idtarget: "<existingPeerId>"// the unique id of the existing channel peer connection}

To send a broadcast message to all other connected channel peers you can send it over your connection as follows:

{action: "broadcast",// this is a sent broadcast messagedata: "<data>"// the data you want to send to all other channel peers}

When receiving a broadcast message from another connected channel peer it is sent to you over your connection as follows:

{action: "broadcast",// this is a received broadcast messagesource: "<peerId>",// the sending channel peer's iddata: "<data>"// the data you want to send to all other channel peers}

To send a direct message to another channel peer, bypassing the broadcast channel, you can send it over your connection as follows:

{action: "message",// this is a sent direct messagetarget: "<recipient>",// the id of an existing channel peer you want to send a direct message todata: "<data>"// the data you want to send to <recipient>}

When receiving a direct message from another channel peer, that has bypassed the broadcast channel, it is sent to you over your connection as follows:

{action: "message",// this is a received direct messagesource: "<sender>",// the id of the channel peer that sent you this direct messagetarget: "<you>",// your channel peer's iddata: "<data>"// the data sent to you by <sender>}

Examples

Some example services built with Network Web Sockets:

Feedback

If you find any bugs or issues please report them on the Network Web Sockets Issue Tracker.

If you would like to contribute to this project please consider forking this repo, making your changes and then creating a new Pull Request back to the main code repository.

License

The MIT License (MIT) Copyright (c) 2014 Rich Tibbett.

See the LICENSE file for more information.

About

Adhoc P2P web socket channels with secure, zero-config network service discovery+transport

Resources

Stars

53 stars

Watchers

14 watching

Forks

Releases

Packages

Used by

Contributors

Languages