ws-http

a static http server with an event-driven socket layer

Usage no npm install needed!

<script type="module">
  import wsHttp from 'https://cdn.skypack.dev/ws-http';
</script>

README

Install

npm install ws-http

Example

./server.js

const wsHttp = require('ws-http');
const server = new wsHttp.Server('./root');
server.on('ping', (client, ...data) => {
   client.reply('pong', ...data);
});
server.ready(80);

./root/index.html

<head>
   <script src="./client.js"></script> 
   <script defer src="./index.js"></script> 
</head>
<body></body>

./root/client.js

const __ = {
   client: (init) => {
      if (init === true) console.log('[socket] attempting to connect...');
      else console.log('[socket] attempting to reconnect...');
      __.socket = new WebSocket(`ws://${location.hostname}${location.port}`);
      __.socket.addEventListener('open', () => {
         if (init === true) console.log('[socket] connection established.');
         else console.log('[socket] connection restored.');
      });
      __.socket.addEventListener('close', () => {
         console.log('[socket] connection lost.');
         setTimeout(__.client, 1e3);
      });
      __.socket.addEventListener('message', (event) => {
         try {
            const message = JSON.parse(event.data);
            __.fire(__.store, message.event, ...message.data);
         } catch (error) {}
      });
   },
   fire: (store, event, ...data) => {
      return (store[event] || (store[event] = [])).filter((x) => x).map((listener) => listener(...data));
   },
   on: (store, event, listener) => {
      return (store[event] || (store[event] = [])).push(listener);
   },
   socket: null,
   store: {}
};
__.client(true);
window.client = {
   /** @param {string} event @param {...any} data  */
   send: (event, ...data) => {
      if (__.socket) return __.socket.send(JSON.stringify({ event: event, data: data }));
   },
   /** @param {string} event @param {function} listener */
   on: (event, listener) => {
      return __.on(__.store, event, listener);
   }
};

./root/index.js

setInterval(() => client.send('ping', 'lorem ipsum', 123), 1e3);
client.on('pong', console.log);