rxjs-ws-channels-filters

RxJS websockets implementation with channels and filters

Usage no npm install needed!

<script type="module">
  import rxjsWsChannelsFilters from 'https://cdn.skypack.dev/rxjs-ws-channels-filters';
</script>

README

rxjs-ws-channels-filters

npm version dependencies Status devDependencies Status downloads

RxJS implementation of websockets with channels and filters

Work in progress


   var options = {
    url: 'localhost:3000/api',
    invalidUrl: function (e) {
      // optional option if close event code is >= 1006 https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent
      // this function will be called expecting a promise
      // in the resolve of the promise the websocket connection will try again to connect with the url from the options
      // in the reject of the promise the websocket observer will complete
      return new Promise(function (resolve, reject) {
        setTimeout(function () {
          options.url = 'localhost:3000/api';
          resolve(10);
        }, 1000);
      });
    },
    transformResponse: function (message) {
      // transform the response from server
      return message;
    },
    transformRequest: function (message) {
      // transform the request sent to server
      if (message.filters && message.filters.length) {
        var i = message.filters.length - 1;
        for (; i > -1; i--) {
          message.filters[i].type = message.channel;
        }
      }
      return message;
    },
    channelsMatch: function channelsMatch(source, target) {
      // default function to find matching channels used for sending messages to the correct channel
      // and to not have duplicate channels
      // optional option, arguments ['existing channel', 'message channel']
      return source === target;
    },
    filtersMatch: function filtersMatch(source, target) {
      // default function to find matching filters used for sending messages to the correct filter
      // and to not have duplicate filters on the same channel
      // optional option, arguments ['existing filter object', 'message filter object']
      if (target) {
        for (var p in source) {
          if (source[p] !== target[p]) {
            return false;
          }
        }
        return true;
      }
    },
    // default options for actions
    channelJoinAction: 'JOIN',
    channelLeaveAction: 'LEAVE',
    filterJoinAction: 'ADD',
    filterLeaveAction: 'REMOVE',
    notifyAction: 'NOTIFY'
  };

  var socket = new rxSocket.Create(options);
  console.log(socket);
  socket.channels.subscribe('one', function (message) {
    console.log(message);
  });

  socket.channels.subscribe('one', function (message) {
    console.log('secondSubscription to one');
    console.log(message);
  });

  socket.channels.subscribe('two', function (message) {
    console.log(message);
  });

  var filterSub = socket.channels.subscribeFilter('three', {id: 3}, function (message) {
    console.log('filter', message);
  });
  
  filterSub.send('this is a message, from filter'); //send messages to server on this channel and filter

  setTimeout(function () {
    filterSub.unsubscribe();
    var filterSub2 = socket.channels.subscribeFilter('three', {id: 4}, function (message) {
      console.log('filter', message);
    });
  }, 5000);

TODO

  • make a separate repo with a server side node implementation
  • make better documentation
  • make demo