JSFiddle - React, Tailwind, and code Playground

by techunter

JavaScript

var uniqueId = 0;

var lookupById = [];
var availableIds = [];

function pubInPath(path, currentSubscriptions, data, channel) {
    var size = path.length;
    var current = currentSubscriptions;
    var i;
    for (i = 0; i < size && current; i++) {
        var currentElement = path[i];
        if (currentElement !== '') {
            //if current subs has wildcard subscribers, also publish to them
            if (current.hasOwnProperty('*') && i + 1 < size) {
                pubInPath(path.slice(i + 1), current['*'], data, channel);
            }
            current = current[currentElement];
        }
    }
    if (i === size && current._) {
        current._.map(function (obj) {
            return obj.callback.call(window, data, channel);
        });
    }
}

function subInPath(path, currentSubscriptions, callback, channel) {
    var size = path.length;
    var current = currentSubscriptions;
    var i, recurs = false;
    for (i = 0; i < size && !recurs; i++) {
        var currentElement = path[i];

        if (currentElement === '*') {
            if (!current['*']) {
                current['*'] = {};
            }
            return subInPath(path.slice(i + 1), current['*'], callback, channel);
        } else {
            if (!current[currentElement]) {
                current[currentElement] = {};
            }
            current = current[currentElement];
        }
    }
    if (!recurs) {
        if (!current._) {
            current._ = [];
        }
        var newId;
        if (availableIds.length > 0) {
            newId = availableIds.pop();
            lookupById[newId] = channel;
        } else {
            newId = uniqueId++;
            lookupById.push(channel);
        }
        current._.push({id: newId, callback: callback, channel: channel});
        return newId;
    }
}

var Arbiter = new (function () {
    var self = this;
    this.apply = true;
    this.subscriptions = {
        //
        //luxor: {
        //    sidebar: {
       ...