/**
 * Minified by jsDelivr using Terser v5.39.0.
 * Original file: /npm/faye-multi-redis-node@0.0.2/index.js
 *
 * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
 */
var RedisSpawn=require("redis-spawn"),_=require("underscore"),when=require("when"),sequence=require("when/sequence"),Engine=function(e,n){this._server=e,this._options=n||{};require("redis");var t=this._options.gc||this.DEFAULT_GC,i=this._options.cluster;this._normalCluster=new RedisSpawn(i,{no_ready_check:!0}),this._subscriberCluster=new RedisSpawn(i,{no_ready_check:!0}),this._ns=this._options.namespace||"",this._messageChannel=this._ns+"/notifications/messages",this._closeChannel=this._ns+"/notifications/close",this._subscriberCluster.each(function(e){e.subscribe(this._messageChannel),e.subscribe(this._closeChannel),e.on("message",function(e,n){e===this._messageChannel&&this.emptyQueue(n),e===this._closeChannel&&this._server.trigger("close",n)}.bind(this))}.bind(this)),this._gc=setInterval(function(){this.gc()}.bind(this),1e3*t)};Engine.create=function(e,n){return new this(e,n)},Engine.prototype={DEFAULT_GC:60,LOCK_TIMEOUT:120,disconnect:function(){this._normalCluster.each((function(e){e.end()})),this._subscriberCluster.each((function(e){e.unsubscribe(),e.end()})),clearInterval(this._gc)},_key:function(e){return this._ns+e},_clientsKey:function(){return this._key("/clients")},_clientChannelsKey:function(e){return this._key("/clients/"+e+"/channels")},_clientMessagesKey:function(e){return this._key("/clients/"+e+"/messages")},_channelKey:function(e){return this._key("/channels"+e)},createClient:function(e,n){var t=this._server.generateId();this._normalCluster.get("clients").zadd(this._clientsKey(),0,t,function(i,s){if(0===s)return this.createClient(e,n);this._server.debug("Created new client ?",t),this.ping(t),this._server.trigger("handshake",t),e.call(n,t)}.bind(this))},clientExists:function(e,n,t){var i=(new Date).getTime()-1600*this._server.timeout;this._normalCluster.get("clients").zscore(this._clientsKey(),e,function(e,s){n.call(t,parseInt(s,10)>i)}.bind(this))},destroyClient:function(e,n,t){var i=this._normalCluster.get(e,!0),s=this._normalCluster.get("clients",!0),r=[];i.smembers(this._clientChannelsKey(e)).then(function(n){return r.push(s.zadd(this._clientsKey(),0,e)),n.forEach(function(n){r.push(i.srem(this._clientChannelsKey(e),n));var t=this._normalCluster.get(n,!0);r.push(t.srem(this._channelKey(n),e))}.bind(this)),r.push(i.del(this._clientMessagesKey(e))),r.push(s.zrem(this._clientsKey(),e)),r.push(i.publish(this._closeChannel,e)),when.all(r).then(function(t){n.forEach(function(n,i){1===t[2*i+1]&&(this._server.trigger("unsubscribe",e,n),this._server.debug("Unsubscribed client ? from channel ?",e,n))}.bind(this)),this._server.debug("Destroyed client ?",e),this._server.trigger("disconnect",e)}.bind(this))}.bind(this)).catch((function(){})).finally((function(){n&&n.call(t)}))},ping:function(e){if("number"==typeof this._server.timeout){var n=(new Date).getTime();this._server.debug("Ping ?, ?",e,n),this._normalCluster.get("clients").zadd(this._clientsKey(),n,e)}},subscribe:function(e,n,t,i){var s=this._normalCluster.get(e),r=this._normalCluster.get(n);s.sadd(this._clientChannelsKey(e),n,function(t,i){1===i&&this._server.trigger("subscribe",e,n)}.bind(this)),r.sadd(this._channelKey(n),e,function(){this._server.debug("Subscribed client ? to channel ?",e,n),t&&t.call(i)}.bind(this))},unsubscribe:function(e,n,t,i){var s=this._normalCluster.get(e),r=this._normalCluster.get(n);s.srem(this._clientChannelsKey(e),n,function(t,i){1===i&&this._server.trigger("unsubscribe",e,n)}.bind(this)),r.srem(this._channelKey(n),e,function(){this._server.debug("Unsubscribed client ? from channel ?",e,n),t&&t.call(i)}.bind(this))},publish:function(e,n){this._server.debug("Publishing message ?",e);var t=JSON.stringify(e),i=n.map(function(e){return this._channelKey(e)}.bind(this)),s=function(n){n.forEach(function(n){var i=this._clientMessagesKey(n),s=this._normalCluster.get(n);this._server.debug("Queueing for client ?: ?",n,e),s.rpush(i,t),s.publish(this._messageChannel,n),this.clientExists(n,(function(e){e||s.del(i)}))}.bind(this))}.bind(this),r=[],h={};_.each(n,(function(e){var n=this._normalCluster.get(e,!0),t=n._original.options,i=[t.host,t.port].join(":");h[i]||(h[i]=n)}),this),_.each(h,(function(e){r.push(e.sunion.apply(e,i))}),!0),when.all(r).then((function(e){e=_.chain(e).flatten().unique().value(),s(e)})).catch((function(){})).finally((function(){})),this._server.trigger("publish",e.clientId,e.channel,e.data)},emptyQueue:function(e){if(this._server.hasConnection(e)){var n=this._clientMessagesKey(e),t=this._normalCluster.get(e).multi();t.lrange(n,0,-1,function(n,t){if(t){var i=t.map((function(e){return JSON.parse(e)}));this._server.deliver(e,i)}}.bind(this)),t.del(n),t.exec()}},gc:function(){var e=this._server.timeout;"number"==typeof e&&this._withLock("gc",(function(n){var t=(new Date).getTime()-2e3*e,i=this;this._normalCluster.get("clients").zrangebyscore(this._clientsKey(),0,t,(function(e,t){var s=0,r=t.length;if(s===r)return n();t.forEach((function(e){this.destroyClient(e,(function(){(s+=1)===r&&n()}),this)}),i)}))}),this)},_withLock:function(e,n,t){var i=this._ns+"/locks/"+e,s=(new Date).getTime(),r=s+1e3*this.LOCK_TIMEOUT+1,h=this._normalCluster.get("locks"),c=function(){(new Date).getTime()<r&&h.del(i)};h.setnx(i,r,(function(e,u){if(1===u)return n.call(t,c);h.get(i,(function(e,u){if(u){var l=parseInt(u,10);s<l||h.getset(i,r,(function(e,i){i===u&&n.call(t,c)}))}}))}))}},module.exports=Engine;
//# sourceMappingURL=/sm/a289ecce29c34cc8d4830847a31cd4a7384265947b9affdb05fbab4dfe1f1c71.map