@superhero/websocket

Websocket implementation

Usage no npm install needed!

<script type="module">
  import superheroWebsocket from 'https://cdn.skypack.dev/@superhero/websocket';
</script>

README

Websocket

Licence: MIT


npm version

A server/client bundle setup to solve some personal issues I have with other solutions out there.

Install

npm install @superhero/websocket

...or just set the dependency in your package.json file:

{
  "dependencies":
  {
    "@superhero/websocket": "*"
  }
}

Browser › Example

server.js

const Websocket = require('@superhero/websocket')
const options   = { debug:true }
const websocket = new Websocket(options)

// listen on port 80
websocket.server.listen({ port:80 })

websocket.events.on('HelloWorld', (ctx, dto) =>
{
  // dto == { 'I':'am','now':'connected' }
  ctx.emit('sup m8', { 'this':'is','the':'response' })
})

websocket.events.on('¯|_(ツ)_/¯', (ctx, dto) =>
{
  // dto == { 'also':'works' }

  // headers is an object of the request headers sent when connection was
  // established
  console.log(ctx.headers)

  // client ip
  console.log(ctx.socket.remoteAddress)

  // ip family (IPv4 or IPv6)
  console.log(ctx.socket.remoteFamily)

  // numeric representation of the remote port..
  console.log(ctx.socket.remotePort)
})

index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Websocket by a Superhero</title>
  </head>

  <body>
    <script data-main="/main" src="//requirejs.org/docs/release/2.2.0/minified/require.js"></script>
  </body>
</html>

main.js

define(
[
  // this "cient" -module is included in this repo. see `client.browser.js` file
  'client'
],
function(client)
{
  var socket = client(
  {
    host  : 'localhost',
    debug : true
  })
  .on('sup m8', function(dto)
  {
    // dto == { 'this':'is','the':'response' }
    socket.emit('¯|_(ツ)_/¯', { 'also':'works' })
  })
  .connected(function(socket2)
  {
    // `socket` === `socket2`
    // socket2 is however returned through a promise that the socket is
    // connected. attaching listeners does not need this promise, emitting
    // messages however needs a connection to send to.

    // example
    socket2.emit('HelloWorld', { 'I':'am','now':'connected' })
  })
})

Server › Example

The module has both a server and a client. So you can use the module for a server to server connection, for what ever reason you now want to do that...

const WebsocketServer = require('@superhero/websocket')
const WebsocketClient = require('@superhero/websocket/client')

const server = new WebsocketServer()
const client = new WebsocketClient()

const evt1 = 'foo'
const evt2 = 'bar'
const dto1 = 'baz'
const dto2 = 'qux'

const port = 9001

server.server.listen({ port })
server.server.on('listening', async () =>
{
  await client.connect(port)
  client.emit(evt1, dto1)
})

server.events.on(evt1, (ctx, dto) =>
{
  // dto === 'baz'
  ctx.emit(evt2, dto2)
})

client.events.on(evt2, (dto) =>
{
  // dto === 'qux'
})