ziron-worker
Version:
1 lines • 4.16 kB
JavaScript
"use strict";var __awaiter=this&&this.__awaiter||function(e,t,r,i){return new(r||(r=Promise))((function(o,s){function n(e){try{h(i.next(e))}catch(e){s(e)}}function l(e){try{h(i.throw(e))}catch(e){s(e)}}function h(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(n,l)}h((i=i.apply(e,t||[])).next())}))};Object.defineProperty(exports,"__esModule",{value:!0});const Utils_1=require("../Utils"),BrokerClientPool_1=require("./BrokerClientPool"),ClusterVersion_1=require("../ClusterVersion"),ziron_errors_1=require("ziron-errors"),emitix_1=require("emitix"),ziron_rendezvous_1=require("ziron-rendezvous");class BrokerClusterClient{constructor(e,t,r){this._brokerClientMap={},this._mapper=new ziron_rendezvous_1.default,this._localEmitter=new emitix_1.default,this.once=this._localEmitter.once.bind(this._localEmitter),this.on=this._localEmitter.on.bind(this._localEmitter),this.off=this._localEmitter.off.bind(this._localEmitter),this._emit=this._localEmitter.emit.bind(this._localEmitter),this._processClientPoolPublishEvent=(e,t,r)=>{this._internalBroker.processExternalPublish(e,t,r)},this._handleClientPoolError=e=>{this._emit("error",e)},this._stateClient=e,this._internalBroker=t,this._joinTokenSecret=r.joinTokenSecret,this._maxClientPoolSize=r.maxClientPoolSize,e.on("brokersChange",e=>this._setBrokerUris(e)),this._setBrokerUris(e.brokers)}get brokerClients(){return Object.values(this._brokerClientMap)}_setBrokerUris(e){this._brokerUris=e.filter(Utils_1.distinctArrayFilter),this._mapper.setSites(this._brokerUris),this.updateToBrokerUris()}static _getClientPoolSize(e,t){return Math.min(parseInt(Math.max(-.8*t+1+e,1)),e)}getCurrentSubscriptions(e=!1){const t=[],r=Object.values(this._brokerClientMap);for(let i=0;i<r.length;i++)t.push(...r[i].getSubscriptions(e));return t.filter(Utils_1.distinctArrayFilter)}updateToBrokerUris(){let e,t,r,i,o,s,n={};i=this._brokerUris.length;const l=BrokerClusterClient._getClientPoolSize(this._maxClientPoolSize,i),h=this._getMappedSubscriptions();for(e=0;e<i;e++)t=this._brokerUris[e],r=this._brokerClientMap[t],o=h[t]||{},r?(n[t]=r,s=r.getSubscriptions(!0),s.forEach(e=>{o[e]||r.unsubscribe(e)}),Object.keys(o).forEach(e=>{-1===s.indexOf(e)&&r.subscribe(e)})):(r=new BrokerClientPool_1.default({clusterVersion:ClusterVersion_1.CLUSTER_VERSION,joinTokenSecret:this._joinTokenSecret,uri:t,poolSize:l}),r.onPublish=this._processClientPoolPublishEvent,r.onError=this._handleClientPoolError,n[t]=r,Object.keys(o).forEach(e=>{r.subscribe(e)}));const a=Object.keys(this._brokerClientMap);for(i=a.length,e=0;e<i;e++)t=a[e],n[t]||this._brokerClientMap[t].destroy();this._brokerClientMap=n,this._emit("brokerClientPoolsUpdate")}_getMappedSubscriptions(){const e=this._internalBroker.getSubscriptions();let t,r,i,o={};for(t=0;t<e.length;t++)r=e[t],i=this._selectBrokerFromChannel(r),i&&(o[i]||(o[i]={}),o[i][r]=!0);return o}_selectBrokerFromChannel(e){return this._mapper.findSite(e)}_selectClientPoolFromChannel(e){const t=this._selectBrokerFromChannel(e);return null!=t?this._brokerClientMap[t]:null}_tryWaitForClientPoolsUpdate(){return __awaiter(this,void 0,void 0,(function*(){try{yield this.once("brokerClientPoolsUpdate",5e3)}catch(e){}}))}publish(e,t,r){let i=this._selectClientPoolFromChannel(e);i?i.publish(e,t,r):this._tryWaitForClientPoolsUpdate().then(()=>{if(i=this._selectClientPoolFromChannel(e),i)return i.publish(e,t,r);this._emit("error",new ziron_errors_1.NoMatchingBrokerClientError(e))})}subscribe(e){let t=this._selectClientPoolFromChannel(e);t?t.subscribe(e):this._tryWaitForClientPoolsUpdate().then(()=>{if(t=this._selectClientPoolFromChannel(e),t)return t.subscribe(e);this._emit("error",new ziron_errors_1.NoMatchingBrokerClientError(e))})}unsubscribe(e){let t=this._selectClientPoolFromChannel(e);t?t.unsubscribe(e):this._tryWaitForClientPoolsUpdate().then(()=>{if(t=this._selectClientPoolFromChannel(e),t)return t.unsubscribe(e);this._emit("error",new ziron_errors_1.NoMatchingBrokerClientError(e))})}terminate(){Object.values(this._brokerClientMap).forEach(e=>e.destroy()),this._brokerClientMap={},this._brokerUris=[]}}exports.default=BrokerClusterClient;