@jayesol/jayeson.lib.delivery 2.0.6 → 2.0.7-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -0
- package/lib/CoreMessages.js +1 -1
- package/lib/DeliveryStack.js +1 -1
- package/lib/Subscriber.js +1 -1
- package/lib/index.d.ts +217 -217
- package/lib/util.js +1 -1
- package/package.json +19 -18
package/README.md
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
v 1.6.0
|
|
2
|
+
- Use netty 4.1 for library to be usable with Java 11.
|
|
3
|
+
- Added stop consumption feature for delivery client to be disconnected from server.
|
|
4
|
+
|
|
1
5
|
v 1.4.1
|
|
2
6
|
- Use StreamFinder 1.6.0: Supports advertisements with paths.
|
|
3
7
|
- New message group for Name Feed: group 30.
|
|
@@ -94,3 +98,20 @@ Example:
|
|
|
94
98
|
}
|
|
95
99
|
}
|
|
96
100
|
};```
|
|
101
|
+
``````
|
|
102
|
+
|
|
103
|
+
### CI/CD guideline
|
|
104
|
+
|
|
105
|
+
#### Publish
|
|
106
|
+
|
|
107
|
+
Guideline: [CI/CD guideline](https://docs.jayeson.com.sg/ops/operations/gitlab-cicd/usage#how-to-use)
|
|
108
|
+
|
|
109
|
+
- Publish for non prod repo:
|
|
110
|
+
```
|
|
111
|
+
publish: snapshot
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
- Publish for production repo:
|
|
115
|
+
```
|
|
116
|
+
publish: prod
|
|
117
|
+
```
|
package/lib/CoreMessages.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var util=require("./util"),_c=util._c,_=require("underscore"),DeliveryStack=require("./DeliveryStack"),IMessageGroup=DeliveryStack.IMessageGroup,IMessageClass=DeliveryStack.IMessageClass;function EmptyMessageClass(e,s){IMessageClass.call(this,e,s,String),this.inH={unpack:function(e){void 0!==e.message&&null!==e.message||(e.message="")}},this.outH={pack:function(e){e.message=[]}}}function StringMessageClass(e,s){EmptyMessageClass.call(this,e,s),this.inH={unpack:function(e){for(var s="",t=0;t<e.message.length;t++)s+=String.fromCharCode(e.message[t]);e.message=s}},this.outH={pack:function(e){for(var s=[],t=0;t<e.message.length;t++)s.push(e.message.charCodeAt(t));e.message=s}}}function JSonMessageClass(e,s,
|
|
1
|
+
var util=require("./util"),_c=util._c,_=require("underscore"),DeliveryStack=require("./DeliveryStack"),IMessageGroup=DeliveryStack.IMessageGroup,IMessageClass=DeliveryStack.IMessageClass;function EmptyMessageClass(e,s){IMessageClass.call(this,e,s,String),this.inH={unpack:function(e){void 0!==e.message&&null!==e.message||(e.message="")}},this.outH={pack:function(e){e.message=[]}}}function StringMessageClass(e,s){EmptyMessageClass.call(this,e,s),this.inH={unpack:function(e){for(var s="",t=0;t<e.message.length;t++)s+=String.fromCharCode(e.message[t]);e.message=s}},this.outH={pack:function(e){for(var s=[],t=0;t<e.message.length;t++)s.push(e.message.charCodeAt(t));e.message=s}}}function JSonMessageClass(e,s,t){IMessageClass.call(this,e,s,String),this.inH={unpack:function(e){for(var s="",a=0;a<e.message.length;a++)s+=String.fromCharCode(e.message[a]);var i=JSON.parse(s),n=new t;_.extend(n,i),e.message=n}},this.outH={pack:function(e){for(var s=JSON.stringify(e.message),t=[],a=0;a<s.length;a++)t.push(s.charCodeAt(a));e.message=t}}}function GenericMessageGroup(){IMessageGroup.call(this,6),this._classes=[new StringMessageClass(this,0)]}function KeepAliveMessageGroup(){IMessageGroup.call(this,4),this._classes=[new EmptyMessageClass(this,0)]}function GeneralResponse(e,s){this.status=e,this.message=s}function TicketRenew(e,s){this.clientId=e,this.newTicket=s}function AuthGroup(){IMessageGroup.call(this,5),this.GENERAL_RESPONSE=new JSonMessageClass(this,0,GeneralResponse),this.HTTP_AUTH=new EmptyMessageClass(this,1),this.TCP_AUTH=new EmptyMessageClass(this,2),this.TICKET_RENEW=new JSonMessageClass(this,3,TicketRenew),this.STRING=new StringMessageClass(this,4),this._classes=[this.GENERAL_RESPONSE,this.HTTP_AUTH,this.TCP_AUTH,this.TICKET_RENEW,this.STRING]}function StreamRegistryRequest(e,s,t){this.messageGroup=e,this.streams=s,this.requestType=t}function StreamRegistryResponse(e,s,t){this.messageGroup=e,this.streams=s,this.responseType=t}function StreamRegistryMessageGroup(){IMessageGroup.call(this,2),this.REQUEST=new JSonMessageClass(this,0,StreamRegistryRequest),this.RESPONSE=new JSonMessageClass(this,1,StreamRegistryResponse),this._classes=[this.REQUEST,this.RESPONSE]}_c(EmptyMessageClass,{inHandlers:function(){return[this.inH]},outHandlers:function(){return[this.outH]}},IMessageClass),_c(StringMessageClass,{outHandlers:function(){return[this.outH]}},EmptyMessageClass),_c(JSonMessageClass,{inHandlers:function(){return[this.inH]},outHandlers:function(){return[this.outH]}},IMessageClass),_c(GenericMessageGroup,{},IMessageGroup),GenericMessageGroup=new GenericMessageGroup,_c(KeepAliveMessageGroup,{},IMessageGroup),KeepAliveMessageGroup=new KeepAliveMessageGroup,_c(GeneralResponse,{getStatus:function(){return this.status},getMessage:function(){return this.message}}),_c(GeneralResponse,{getClientId:function(){return this.clientId},getNewTicket:function(){return this.newTicket}}),_c(AuthGroup,{},IMessageGroup),AuthGroup=new AuthGroup,_.extend(StreamRegistryRequest,{REGISTRATION:0,CONSUMPTION:1,DEREGISTRATION:2}),_.extend(StreamRegistryResponse,{REGISTRATION:0,CONSUMPTION:1,STOP_CONSUMPTION:6,DEREGISTRATION:2,GENERAL:3,SUCCESS:4,FAILED:5,DEREGISTRATION_TIMEOUT:7}),_c(StreamRegistryMessageGroup,{},IMessageGroup),StreamRegistryMessageGroup=new StreamRegistryMessageGroup,module.exports=exports={StreamRegistryMessageGroup:StreamRegistryMessageGroup,EmptyMessageClass:EmptyMessageClass,StringMessageClass:StringMessageClass,JSonMessageClass:JSonMessageClass,StreamRegistryRequest:StreamRegistryRequest,StreamRegistryResponse:StreamRegistryResponse,AuthGroup:AuthGroup,GenericMessageGroup:GenericMessageGroup,KeepAliveMessageGroup:KeepAliveMessageGroup,TicketRenew:TicketRenew};
|
package/lib/DeliveryStack.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var _=require("underscore"),util=require("./util"),_c=util._c,_abstract=util._abstract,EventEmitter=require("eventemitter3"),random=require("secure-random"),node_jquery=require("jquery"),node_ws=require("websocket"),W3CWebSocket=node_ws.w3cwebsocket;function isEmpty(e){return _.isEmpty(e)}function generateUUID(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=random(1)[0]%16|0;return("x"==e?t:3&t|8).toString(16)})}var Util={_nodeId:function(e){return e.serviceId},_streamId:function(e){return e.group+"_"+e.stream},_streamIdFromNames:function(e,t){return e+"_"+t},_newPromise:function(){var s={},e=new Promise(function(e,t){s.resolve=e,s.reject=t});return e.m=s,e.resolve=function(){this.m.resolve.apply(this,arguments)},e.reject=function(){this.m.reject.apply(this,arguments)},e},_treeMap:function(){return{_map:{},_keys:[],isEmpty:function(){return isEmpty(this._keys)},size:function(){return this._keys.length},higherEntry:function(e){for(var t=-1,s=0;s<this._keys.length;s++)if(this._keys[s]==e){t=s;break}if(-1==t)return null;var i=t+1;return i==this._keys.length?null:{key:this._keys[i],value:this._map[i]}},lowerEntry:function(e){for(var t=-1,s=0;s<this._keys.length;s++)if(this._keys[s]==e){t=s;break}if(-1==t)return null;var i=t-1;return-1==i?null:{key:this._keys[i],value:this._map[i]}},firstEntry:function(){return this.getEntryByIndex(0)},lastEntry:function(){return this.getEntryByIndex(this._keys.length-1)},get:function(e){return this._map[e]},getEntryByIndex:function(e){var t=this._keys[e];return null==t?null:{key:t,value:this._map[t]}},put:function(e,t){for(var s=-1,i=0;i<this._keys.length;i++)if(this._keys[i]>e){s=i;break}-1!=s?this._keys.splice(s,0,e):this._keys.push(e),this._map[e]=t},remove:function(e){for(var t=-1,s=null,i=0;i<this._keys.length;i++)if(this._keys[i]==e){t=i;break}if(-1!=t){this._keys.splice(t,1);s=this._map[e];delete this._map[e]}return s},keys:function(){return this._keys},values:function(){for(var e=[],t=0;t<this._keys.length;t++)e.push(this._map[this._keys[t]]);return e},entrySet:function(){for(var e=[],t=0;t<this._keys.length;t++)e.push({key:this._keys[t],value:this._map[this._keys[t]]});return e}}}};function IEndPointEventSource(){this.eventDispatcher=new EventEmitter,this.listeners=[],this.listenerMethods=[]}function IEndPoint(){EndPoint.super(this)}function IMessageClass(e,t,s){this._group=e,this._id=t,this._iClass=s}function IMessageGroup(e){this._id=e,this._classes=[]}function IMessageGroupProcessor(e){this.msgGroup=e}function IPreparsingHook(e){IMessageGroupProcessor.call(this,e)}function EPEvent(e){this.endPoint=e}function IClient(e){this.config=e}function MetaInformationCode(e){this._code=e}function StreamNameCode(){StreamNameCode.super(this,0)}function MessageIdCode(){MessageIdCode.super(this,1)}function MessageWrapper(e,t,s){this.message=e,this.messageClass=t,this.metaInfo=s}function EPConnectedEvent(e){EPConnectedEvent.super(this,e)}function EPDisconnectedEvent(e){EPDisconnectedEvent.super(this,e)}function EPConnectionError(){}function GroupRegistry(){this.processors={},this.processingGroups={},this.preparsingHooks={},this.preHookGroups={}}function EndPoint(e){GroupRegistry.call(this),this.metaCodeMap={},this.streamNameCode=new StreamNameCode,this.metaCodeMap[this.streamNameCode.code()]=this.streamNameCode,this.messageIdCode=new MessageIdCode,this.metaCodeMap[this.messageIdCode.code()]=this.messageIdCode,this.ws=e,this.ws.onmessage=_.bind(this.onMessage,this),this.waiters={},this.currentTimeout=0,this.timeOutRequestsSchedule=new Util._treeMap,this.requestTimeoutChecker=null,this.isTimeoutTaskRunning=!1}function DefaultClient(e,t){return DefaultClient.super(this,e),IEndPointEventSource.call(this),GroupRegistry.call(this),this._ep=void 0,this.config={url:"",keepAliveInterval:3e4,msgClass:null,msgGroup:null},_.extend(this.config,e),this.keepAlive=!1,this._keepAliveMsgGrp=t,this.registerPreparsingHook(t,this),this}_c(IEndPointEventSource,{attachListener:function(e){this.listeners.push(e),this.listenerMethods.push(_.bind(e.onEvent,e)),this.eventDispatcher.on("EPEvent",this.listenerMethods[this.listenerMethods.length-1])},detachListener:function(e){for(var t=0;t<this.listeners.length;t++)this.listeners[t]===e&&this.eventDispatcher.off("EPEvent",this.listenerMethods[t])},clearListeners:function(){delete this.listeners,delete this.listenersMethods,this.eventDispatcher.removeAllListeners("EPEvent")},dispatch:function(e){e instanceof EPEvent&&this.eventDispatcher.emit("EPEvent",e)}}),_c(IEndPoint,{registerGroup:_abstract,deregisterGroup:_abstract,registerPreparsingHook:_abstract,deregisterPreparsingHook:_abstract},IEndPointEventSource),_c(IMessageClass,{id:function(){return this._id},group:function(){return this._group},inHandlers:function(){return[]},outHandlers:function(){return[]},instanceClass:function(){return this._iClass}}),_c(IMessageGroup,{id:function(){return this._id},classById:function(e){return this._classes[e]},allClasses:function(){return this._classes}}),_c(IMessageGroupProcessor,{group:function(){return this.msgGroup},onRegistered:void 0,onDeregistered:void 0,process:function(e){_abstract()}}),_c(IPreparsingHook,{processUnparsedMessage:function(e){_abstract()},process:function(e){_abstract()}},IMessageGroupProcessor),_c(IClient,{connect:_abstract}),_c(MetaInformationCode,{code:function(){return this._code}}),_c(StreamNameCode,{},MetaInformationCode),_c(MessageIdCode,{},MetaInformationCode),_c(MessageWrapper,{hasMetaInfo:function(){return null!=this.metaInfo},containsMetaInfo:function(e){return 0!=this.hasMetaInfo()&&null!=this.metaInfo[e]},getMetaInfo:function(e){return 0==this.hasMetaInfo()?null:this.metaInfo[e]},addMetaInfo:function(e,t){this.hasMetaInfo()||(this.metaInfo={}),this.metaInfo[e]=t}}),_c(EPConnectedEvent,{},EPEvent),_c(EPDisconnectedEvent,{},EPEvent),_c(EPConnectionError,{},EPEvent),_c(GroupRegistry,{registerGroup:function(e,t){void 0!==this.processors[e.id()]&&void 0!==this.processors[e.id()].onDeregistered&&this.processors[e.id()].onDeregistered(this),this.processors[e.id()]=t,this.processingGroups[e.id()]=e,void 0!==t.onRegistered&&t.onRegistered(this)},deregisterGroup:function(e){if(void 0!==this.processors[e.id()]){var t=this.processors[e.id()];delete this.processors[e.id()],delete this.processingGroups[e.id()],void 0!==t.onDeregistered&&t.onDeregistered(this)}},registerPreparsingHook:function(e,t){void 0!==this.preparsingHooks[e.id()]&&void 0!==this.preparsingHooks[e.id()].onDeregistered&&this.preparsingHooks[e.id()].onDeregistered(this),this.preparsingHooks[e.id()]=t,this.preHookGroups[e.id()]=e,void 0!==t.onRegistered&&t.onRegistered(this)},deregisterPreparsingHook:function(e){if(void 0!==this.preparsingHooks[e.id()]){var t=this.preparsingHooks[e.id()];delete this.preparsingHooks[e.id()],delete this.preHookGroups[e.id()],void 0!==t.onDeregistered&&t.onDeregistered(this)}},hasPreHook:function(e){return void 0!==this.preparsingHooks[e]},hasProcessor:function(e){return void 0!==this.processors[e]},copyGroupRegistry:function(e){this.processors=e.processors,this.processingGroups=e.processingGroups,this.preparsingHooks=e.preparsingHooks,this.preHookGroups=e.preHookGroups}}),_c(EndPoint,{_extract:function(e){var t,s={},i=0==(128&e[0])?0:127&(e[0]<<8|e[1]);0<i&&(t=e.subarray(2,i+2));for(var n=0;n<i;){var r=t[n];n++;var o=r>>2,a=3&r,u=t.subarray(n,a+n);n+=a;for(var h=0,c=0;c<a;c++){var l=8*(a-1-c);h|=(255&u[c])<<l}var d=t.subarray(n,h+n);n+=h,s[o]=String.fromCharCode.apply(String,d)}for(var p in e=0<i?e.subarray(i+2):e.subarray(1),s){if(s.hasOwnProperty(p))if(null==this.metaCodeMap[p])throw"Code "+p+" is not defined."}if(e.byteLength<2)throw"Corrupted Message Format!";return{meta:s,gid:e[0],cid:e[1],pl:e.subarray(2)}},onMessage:function(e){var t=this._extract(new Uint8Array(e.data));if(this.hasPreHook(t.gid)){var s=this.preparsingHooks[t.gid],i=this.preHookGroups[t.gid].classById(t.cid),n=new MessageWrapper(t.pl,i,t.meta);if(!s.processUnparsedMessage(n,e.origin)&&!n.containsMetaInfo(this.messageIdCode.code()))return}if(!this.hasProcessor(t.gid))return console.log("Received a message with id "+t.gid+" not registered!"),null;var r=this.processors[t.gid];i=this.processingGroups[t.gid].classById(t.cid),n=new MessageWrapper(t.pl,i,t.meta);if(null==i)return console.log("Message class id "+t.cid+" is not supported."),null;_.each(i.inHandlers(),function(e){e.unpack(n)});var o=n.getMetaInfo(this.messageIdCode.code());if(null!=o){var a=this.clearRequest(o);if(void 0!==a){a.waiter.resolve(n);var u=a.stopTime;if(0<u){var h=this.timeOutRequestsSchedule.get(u);if(null!=h){for(var c=-1,l=0;l<h.length;l++)if(h[l]==o){c=l;break}-1!=c&&h.splice(c,1),isEmpty(h)&&this.timeOutRequestsSchedule.remove(u)}}return}}r.process(n)},request:function(e,t){var s=this.storeRequest(e,t);try{this.send(e)}catch(e){console.error("Cannot send message ",e);var i=s.stopTime,n=s.messageId;if(this.clearRequest(n),0<i){var r=this.timeOutRequestsSchedule.get(i);if(null!=r){for(var o=-1,a=0;a<r.length;a++)if(r[a]==n){o=a;break}-1!=o&&r.splice(o,1),isEmpty(r)&&this.timeOutRequestsSchedule.remove(i)}}return null}return s},reply:function(e,t){var s=this.createReply(e,t);this.send(s)},createReply:function(e,t){var s=this.messageIdCode.code();if(!e.hasMetaInfo(s))throw"Trying to reply to a non-request message!";return t.addMetaInfo(s,e.getMetaInfo(s)),t},storeRequest:function(e,t){var s=generateUUID();console.log(s),e.addMetaInfo(this.messageIdCode.code(),s);var i=Util._newPromise(),n=0;if(0<t){n=(new Date).getTime()+t;var r=this.timeOutRequestsSchedule.get(n);null==r&&(r=[],this.timeOutRequestsSchedule.put(n,r)),r.push(s),this.waitRequestTimeOut()}var o={waiter:i,stopTime:n,messageId:s};return this.waiters[s]=o},waitRequestTimeOut:function(){var e=(new Date).getTime();if(null!=this.requestTimeoutChecker){if(!this.timeOutRequestsSchedule.isEmpty()){var t=this.timeOutRequestsSchedule.firstEntry().key;if(t<this.currentTimeout&&(this.cancelRequestTimeout(),null==this.requestTimeoutChecker)){i=t-e;this.requestTimeoutChecker=setTimeout(_.bind(this.rejectRequestsAndRepeatWaitingNextTimeout,this,t),i),console.log("re-run new task with stop time "+t),this.currentTimeout=t}}}else if(!this.timeOutRequestsSchedule.isEmpty()){var s=this.timeOutRequestsSchedule.firstEntry().key,i=s-e;this.requestTimeoutChecker=setTimeout(_.bind(this.rejectRequestsAndRepeatWaitingNextTimeout,this,s),i),console.log("Run new task with stoptime "+s),this.currentTimeout=s}},cancelRequestTimeout:function(){this.isTimeoutTaskRunning||(clearTimeout(this.requestTimeoutChecker),this.requestTimeoutChecker=null)},rejectRequestsAndRepeatWaitingNextTimeout:function(e){this.isTimeoutTaskRunning=!0,this._rejectTimeoutRequest(e);for(var t=e,s=null;null!=(s=this.timeOutRequestsSchedule.lowerEntry(t));)this._rejectTimeoutRequest(t),t=s.key;this.requestTimeoutChecker=null,this.currentTimeout=0,this.isTimeoutTaskRunning=!1,setTimeout(_.bind(this.waitRequestTimeOut,this),0)},_rejectTimeoutRequest:function(e){var t=this.timeOutRequestsSchedule.remove(e);if(null!=t)for(var s=0;s<t.length;s++){var i=t[s],n=this.clearRequest(i);null!=n&&n.waiter.reject("Request timeout")}},clearRequest:function(e){var t=this.waiters[e];return delete this.waiters[e],t},send:function(t){if(null==this.ws)throw"Invalid socket Exception. Cannot send message.";if(_.each(t.messageClass.outHandlers(),function(e){e.pack(t)}),!(t.message instanceof Array))throw"Output pipeline doesn't encod message to byte array successfully!";for(var e=this._encodeMetaInfo(t.metaInfo),s=e.length,i=new Uint8Array(t.message.length+s+2),n=0;n<e.length;n++)i[n]=e[n];i[s]=t.messageClass.group().id(),i[s+1]=t.messageClass.id();for(n=0;n<t.message.length;n++)i[s+2+n]=t.message[n];if(null!=i&&3<=i.length)return this.ws.send(i),i;throw"Endpoint sends invalid frame!!"},_encodeMetaInfo:function(e){if(isEmpty(e))return[0];var t=[];for(var s in e)if(e.hasOwnProperty(s)){for(var i=[],n=0;n<e[s].length;n++)i.push(e[s].charCodeAt(n));var r=i.length,o=new Uint8Array([(4278190080&r)>>24,(16711680&r)>>16,(65280&r)>>8,255&r]),a=[],u=!1;for(n=0;n<o.length;n++)0!=o[n]&&(u=!0),u&&a.push(o[n]);var h=a.length;if(3<h|h<0)return[0];var c=s<<2|3&h;t.push(c);for(n=0;n<a.length;n++)t.push(a[n]);for(var l=0;l<i.length;l++)t.push(i[l])}var d=t.length,p=32768|d,g=new Uint8Array([(65280&p)>>8,255&p]),f=new Uint8Array(g.length+d);f[0]=g[0],f[1]=g[1];for(l=0;l<d;l++)f[2+l]=t[l];return f}},IEndPoint,GroupRegistry),_c(DefaultClient,{connect:function(){this.websocket=null;var e="",t=this._generateConnectionParams();if("WebSocket"in window||!W3CWebSocket||(WebSocket=W3CWebSocket),"undefined"==typeof jQuery&&(jQuery=node_jquery),!WebSocket||!jQuery)throw alert("PLEASE UPGRADE YOUR BROWSER TO SUPPORT WEBSOCKET!"),"Please upgrade your browser to support WEBSOCKET!";null!=t&&(e="?"+jQuery.param(t));var s=this.config.url+e,i=new WebSocket(s);i.binaryType="arraybuffer",i.onopen=_.bind(this.onConnected,this),i.onclose=_.bind(this.onDisconnected,this),i.onerror=_.bind(this.onConnectionError,this),console.log("Created websocket: "+s),this.websocket=i},disconnect:function(){null!=this.websocket&&(this.websocket.close(),this.keepAlive&&this.disableKeepAlive(),delete this._ep)},_generateConnectionParams:function(){var e={};if(void 0!==this.config.params&&(e=_.clone(this.config.params)),void 0!==this.config.msgGroup&&""!==this.config.msgGroup&&null!==this.config.msgGroup&&(this.config.msgGroup instanceof IMessageGroup?e.MessageGroup=this.config.msgGroup.id():e.MessageGroup=this.config.msgGroup),void 0!==this.config.msgClass&&""!==this.config.msgClass&&null!==this.config.msgClass)if(this.config.msgClass instanceof IMessageClass){if(void 0!==e.MessageGroup&&this.config.msgClass.group().id()!=e.MessageGroup)throw"Cannot generate connection params! Group ID "+e.MessageClass+" doesn't match with what defined in accompanied message class!";e.MessageClass=this.config.msgClass.id(),e.MessageGroup=this.config.msgClass.group().id()}else e.MessageClass=this.config.msgClass;return _.isEmpty(e)?null:e},enableKeepAlive:function(){0==this.keepAlive&&(this.keepAliveTimeout=setInterval(_.bind(this.sendKeepAlive,this),this.config.keepAliveInterval)),this.keepAlive=!0},disableKeepAlive:function(){1==this.keepAlive&&clearInterval(this.keepAliveTimeout),this.keepAlive=!1},sendKeepAlive:function(){if(null!=this._ep){var e=new MessageWrapper("",this._keepAliveMsgGrp.classById(0));this._ep.send(e)}},send:function(e){this._ep.send(e)},onConnected:function(e){this._ep=new EndPoint(this.websocket),this._ep.copyGroupRegistry(this),this.dispatch(new EPConnectedEvent(this._ep))},onDisconnected:function(e){void 0!==this._ep&&(this.dispatch(new EPDisconnectedEvent(this._ep)),this._ep=void 0)},onConnectionError:function(e){this.dispatch(new EPConnectionError)},processUnparsedMessage:function(e,t){if(4==e.messageClass.group().id())return console.debug("Receive keep alive message from",t),!1}},IClient,IEndPointEventSource,GroupRegistry),module.exports=exports={DefaultClient:DefaultClient,IMessageClass:IMessageClass,IMessageGroup:IMessageGroup,IMessageGroupProcessor:IMessageGroupProcessor,MetaInformationCode:MetaInformationCode,StreamNameCode:StreamNameCode,MessageIdCode:MessageIdCode,IEndPoint:IEndPoint,IEndPointEventSource:IEndPointEventSource,IPreparsingHook:IPreparsingHook,IClient:IClient,EndPoint:EndPoint,EPEvent:EPEvent,EPConnectedEvent:EPConnectedEvent,EPConnectionError:EPConnectionError,EPDisconnectedEvent:EPDisconnectedEvent,MessageWrapper:MessageWrapper,Util:Util,generateUUID:generateUUID};
|
|
1
|
+
var _=require("underscore"),util=require("./util"),_c=util._c,_abstract=util._abstract,EventEmitter=require("eventemitter3"),random=require("secure-random"),node_jquery=require("jquery"),node_ws=require("websocket"),W3CWebSocket=node_ws.w3cwebsocket;function isEmpty(e){return _.isEmpty(e)}function generateUUID(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var t=random(1)[0]%16|0;return("x"==e?t:3&t|8).toString(16)})}var Util={_nodeId:function(e){return e.serviceId},_streamId:function(e){return e.group+"_"+e.stream},_streamIdFromNames:function(e,t){return e+"_"+t},_newPromise:function(){var e={},t=new Promise(function(t,s){e.resolve=t,e.reject=s});return t.m=e,t.resolve=function(){this.m.resolve.apply(this,arguments)},t.reject=function(){this.m.reject.apply(this,arguments)},t},_treeMap:function(){return{_map:{},_keys:[],isEmpty:function(){return isEmpty(this._keys)},size:function(){return this._keys.length},higherEntry:function(e){for(var t=-1,s=0;s<this._keys.length;s++)if(this._keys[s]==e){t=s;break}if(-1!=t){var i=t+1;return i==this._keys.length?null:{key:this._keys[i],value:this._map[i]}}return null},lowerEntry:function(e){for(var t=-1,s=0;s<this._keys.length;s++)if(this._keys[s]==e){t=s;break}if(-1!=t){var i=t-1;return-1==i?null:{key:this._keys[i],value:this._map[i]}}return null},firstEntry:function(){return this.getEntryByIndex(0)},lastEntry:function(){return this.getEntryByIndex(this._keys.length-1)},get:function(e){return this._map[e]},getEntryByIndex:function(e){var t=this._keys[e];return null==t?null:{key:t,value:this._map[t]}},put:function(e,t){for(var s=-1,i=0;i<this._keys.length;i++)if(this._keys[i]>e){s=i;break}-1!=s?this._keys.splice(s,0,e):this._keys.push(e),this._map[e]=t},remove:function(e){for(var t=-1,s=null,i=0;i<this._keys.length;i++)if(this._keys[i]==e){t=i;break}if(-1!=t){this._keys.splice(t,1);s=this._map[e];delete this._map[e]}return s},keys:function(){return this._keys},values:function(){for(var e=[],t=0;t<this._keys.length;t++)e.push(this._map[this._keys[t]]);return e},entrySet:function(){for(var e=[],t=0;t<this._keys.length;t++)e.push({key:this._keys[t],value:this._map[this._keys[t]]});return e}}}};function IEndPointEventSource(){this.eventDispatcher=new EventEmitter,this.listeners=[],this.listenerMethods=[]}function IEndPoint(){EndPoint.super(this)}function IMessageClass(e,t,s){this._group=e,this._id=t,this._iClass=s}function IMessageGroup(e){this._id=e,this._classes=[]}function IMessageGroupProcessor(e){this.msgGroup=e}function IPreparsingHook(e){IMessageGroupProcessor.call(this,e)}function EPEvent(e){this.endPoint=e}function IClient(e){this.config=e}function MetaInformationCode(e){this._code=e}function StreamNameCode(){StreamNameCode.super(this,0)}function MessageIdCode(){MessageIdCode.super(this,1)}function MessageWrapper(e,t,s){this.message=e,this.messageClass=t,this.metaInfo=s}function EPConnectedEvent(e){EPConnectedEvent.super(this,e)}function EPDisconnectedEvent(e){EPDisconnectedEvent.super(this,e)}function EPConnectionError(){}function GroupRegistry(){this.processors={},this.processingGroups={},this.preparsingHooks={},this.preHookGroups={}}function EndPoint(e){GroupRegistry.call(this),this.metaCodeMap={},this.streamNameCode=new StreamNameCode,this.metaCodeMap[this.streamNameCode.code()]=this.streamNameCode,this.messageIdCode=new MessageIdCode,this.metaCodeMap[this.messageIdCode.code()]=this.messageIdCode,this.ws=e,this.ws.onmessage=_.bind(this.onMessage,this),this.waiters={},this.currentTimeout=0,this.timeOutRequestsSchedule=new Util._treeMap,this.requestTimeoutChecker=null,this.isTimeoutTaskRunning=!1}function DefaultClient(e,t){return DefaultClient.super(this,e),IEndPointEventSource.call(this),GroupRegistry.call(this),this._ep=void 0,this.config={url:"",keepAliveInterval:3e4,msgClass:null,msgGroup:null},_.extend(this.config,e),this.keepAlive=!1,this._keepAliveMsgGrp=t,this.registerPreparsingHook(t,this),this}_c(IEndPointEventSource,{attachListener:function(e){this.listeners.push(e),this.listenerMethods.push(_.bind(e.onEvent,e)),this.eventDispatcher.on("EPEvent",this.listenerMethods[this.listenerMethods.length-1])},detachListener:function(e){for(var t=0;t<this.listeners.length;t++)this.listeners[t]===e&&this.eventDispatcher.off("EPEvent",this.listenerMethods[t])},clearListeners:function(){delete this.listeners,delete this.listenersMethods,this.eventDispatcher.removeAllListeners("EPEvent")},dispatch:function(e){e instanceof EPEvent&&this.eventDispatcher.emit("EPEvent",e)}}),_c(IEndPoint,{registerGroup:_abstract,deregisterGroup:_abstract,registerPreparsingHook:_abstract,deregisterPreparsingHook:_abstract},IEndPointEventSource),_c(IMessageClass,{id:function(){return this._id},group:function(){return this._group},inHandlers:function(){return[]},outHandlers:function(){return[]},instanceClass:function(){return this._iClass}}),_c(IMessageGroup,{id:function(){return this._id},classById:function(e){return this._classes[e]},allClasses:function(){return this._classes}}),_c(IMessageGroupProcessor,{group:function(){return this.msgGroup},onRegistered:void 0,onDeregistered:void 0,process:function(e){_abstract()}}),_c(IPreparsingHook,{processUnparsedMessage:function(e){_abstract()},process:function(e){_abstract()}},IMessageGroupProcessor),_c(IClient,{connect:_abstract}),_c(MetaInformationCode,{code:function(){return this._code}}),_c(StreamNameCode,{},MetaInformationCode),_c(MessageIdCode,{},MetaInformationCode),_c(MessageWrapper,{hasMetaInfo:function(){return null!=this.metaInfo},containsMetaInfo:function(e){return 0!=this.hasMetaInfo()&&null!=this.metaInfo[e]},getMetaInfo:function(e){return 0==this.hasMetaInfo()?null:this.metaInfo[e]},addMetaInfo:function(e,t){this.hasMetaInfo()||(this.metaInfo={}),this.metaInfo[e]=t}}),_c(EPConnectedEvent,{},EPEvent),_c(EPDisconnectedEvent,{},EPEvent),_c(EPConnectionError,{},EPEvent),_c(GroupRegistry,{registerGroup:function(e,t){void 0!==this.processors[e.id()]&&void 0!==this.processors[e.id()].onDeregistered&&this.processors[e.id()].onDeregistered(this),this.processors[e.id()]=t,this.processingGroups[e.id()]=e,void 0!==t.onRegistered&&t.onRegistered(this)},deregisterGroup:function(e){if(void 0!==this.processors[e.id()]){var t=this.processors[e.id()];delete this.processors[e.id()],delete this.processingGroups[e.id()],void 0!==t.onDeregistered&&t.onDeregistered(this)}},registerPreparsingHook:function(e,t){void 0!==this.preparsingHooks[e.id()]&&void 0!==this.preparsingHooks[e.id()].onDeregistered&&this.preparsingHooks[e.id()].onDeregistered(this),this.preparsingHooks[e.id()]=t,this.preHookGroups[e.id()]=e,void 0!==t.onRegistered&&t.onRegistered(this)},deregisterPreparsingHook:function(e){if(void 0!==this.preparsingHooks[e.id()]){var t=this.preparsingHooks[e.id()];delete this.preparsingHooks[e.id()],delete this.preHookGroups[e.id()],void 0!==t.onDeregistered&&t.onDeregistered(this)}},hasPreHook:function(e){return void 0!==this.preparsingHooks[e]},hasProcessor:function(e){return void 0!==this.processors[e]},copyGroupRegistry:function(e){this.processors=e.processors,this.processingGroups=e.processingGroups,this.preparsingHooks=e.preparsingHooks,this.preHookGroups=e.preHookGroups}}),_c(EndPoint,{_extract:function(e){var t,s={},i=128&e[0]?127&(e[0]<<8|e[1]):0;i>0&&(t=e.subarray(2,i+2));for(var n=0;n<i;){var r=t[n];n++;var o=r>>2,a=3&r,u=t.subarray(n,a+n);n+=a;for(var h=0,c=0;c<a;c++){var l=8*(a-1-c);h|=(255&u[c])<<l}var d=t.subarray(n,h+n);n+=h,s[o]=String.fromCharCode.apply(String,d)}for(var p in e=i>0?e.subarray(i+2):e.subarray(1),s){if(s.hasOwnProperty(p))if(null==this.metaCodeMap[p])throw"Code "+p+" is not defined."}if(e.byteLength<2)throw"Corrupted Message Format!";return{meta:s,gid:e[0],cid:e[1],pl:e.subarray(2)}},onMessage:function(e){var t=this._extract(new Uint8Array(e.data));if(this.hasPreHook(t.gid)){var s=this.preparsingHooks[t.gid],i=this.preHookGroups[t.gid].classById(t.cid),n=new MessageWrapper(t.pl,i,t.meta);if(!s.processUnparsedMessage(n,e.origin)&&!n.containsMetaInfo(this.messageIdCode.code()))return}if(!this.hasProcessor(t.gid))return console.log("Received a message with id "+t.gid+" not registered!"),null;var r=this.processors[t.gid];i=this.processingGroups[t.gid].classById(t.cid),n=new MessageWrapper(t.pl,i,t.meta);if(null==i)return console.log("Message class id "+t.cid+" is not supported."),null;_.each(i.inHandlers(),function(e){e.unpack(n)});var o=n.getMetaInfo(this.messageIdCode.code());if(null!=o){var a=this.clearRequest(o);if(void 0!==a){a.waiter.resolve(n);var u=a.stopTime;if(u>0){var h=this.timeOutRequestsSchedule.get(u);if(null!=h){for(var c=-1,l=0;l<h.length;l++)if(h[l]==o){c=l;break}-1!=c&&h.splice(c,1),isEmpty(h)&&this.timeOutRequestsSchedule.remove(u)}}return}}r.process(n)},request:function(e,t){var s=this.storeRequest(e,t);try{this.send(e)}catch(e){console.error("Cannot send message ",e);var i=s.stopTime,n=s.messageId;if(this.clearRequest(n),i>0){var r=this.timeOutRequestsSchedule.get(i);if(null!=r){for(var o=-1,a=0;a<r.length;a++)if(r[a]==n){o=a;break}-1!=o&&r.splice(o,1),isEmpty(r)&&this.timeOutRequestsSchedule.remove(i)}}return null}return s},reply:function(e,t){var s=this.createReply(e,t);this.send(s)},createReply:function(e,t){var s=this.messageIdCode.code();if(!e.hasMetaInfo(s))throw"Trying to reply to a non-request message!";return t.addMetaInfo(s,e.getMetaInfo(s)),t},storeRequest:function(e,t){var s=generateUUID();console.log(s),e.addMetaInfo(this.messageIdCode.code(),s);var i=Util._newPromise(),n=0;if(t>0){n=(new Date).getTime()+t;var r=this.timeOutRequestsSchedule.get(n);null==r&&(r=[],this.timeOutRequestsSchedule.put(n,r)),r.push(s),this.waitRequestTimeOut()}var o={waiter:i,stopTime:n,messageId:s};return this.waiters[s]=o,o},waitRequestTimeOut:function(){var e=(new Date).getTime();if(null!=this.requestTimeoutChecker){if(!this.timeOutRequestsSchedule.isEmpty()){var t=this.timeOutRequestsSchedule.firstEntry().key;if(t<this.currentTimeout&&(this.cancelRequestTimeout(),null==this.requestTimeoutChecker)){i=t-e;this.requestTimeoutChecker=setTimeout(_.bind(this.rejectRequestsAndRepeatWaitingNextTimeout,this,t),i),console.log("re-run new task with stop time "+t),this.currentTimeout=t}}}else if(!this.timeOutRequestsSchedule.isEmpty()){var s=this.timeOutRequestsSchedule.firstEntry().key,i=s-e;this.requestTimeoutChecker=setTimeout(_.bind(this.rejectRequestsAndRepeatWaitingNextTimeout,this,s),i),console.log("Run new task with stoptime "+s),this.currentTimeout=s}},cancelRequestTimeout:function(){this.isTimeoutTaskRunning||(clearTimeout(this.requestTimeoutChecker),this.requestTimeoutChecker=null)},rejectRequestsAndRepeatWaitingNextTimeout:function(e){this.isTimeoutTaskRunning=!0,this._rejectTimeoutRequest(e);for(var t=e,s=null;null!=(s=this.timeOutRequestsSchedule.lowerEntry(t));)this._rejectTimeoutRequest(t),t=s.key;this.requestTimeoutChecker=null,this.currentTimeout=0,this.isTimeoutTaskRunning=!1,setTimeout(_.bind(this.waitRequestTimeOut,this),0)},_rejectTimeoutRequest:function(e){var t=this.timeOutRequestsSchedule.remove(e);if(null!=t)for(var s=0;s<t.length;s++){var i=t[s],n=this.clearRequest(i);null!=n&&n.waiter.reject("Request timeout")}},clearRequest:function(e){var t=this.waiters[e];return delete this.waiters[e],t},send:function(e){if(null!=this.ws){if(_.each(e.messageClass.outHandlers(),function(t){t.pack(e)}),!(e.message instanceof Array))throw"Output pipeline doesn't encod message to byte array successfully!";for(var t=this._encodeMetaInfo(e.metaInfo),s=t.length,i=new Uint8Array(e.message.length+s+2),n=0;n<t.length;n++)i[n]=t[n];i[s]=e.messageClass.group().id(),i[s+1]=e.messageClass.id();for(n=0;n<e.message.length;n++)i[s+2+n]=e.message[n];if(null!=i&&i.length>=3)return this.ws.send(i),i;throw"Endpoint sends invalid frame!!"}throw"Invalid socket Exception. Cannot send message."},_encodeMetaInfo:function(e){if(isEmpty(e))return[0];var t=[];for(var s in e)if(e.hasOwnProperty(s)){for(var i=[],n=0;n<e[s].length;n++)i.push(e[s].charCodeAt(n));var r=i.length,o=new Uint8Array([(4278190080&r)>>24,(16711680&r)>>16,(65280&r)>>8,255&r]),a=[],u=!1;for(n=0;n<o.length;n++)0!=o[n]&&(u=!0),u&&a.push(o[n]);var h=a.length;if(h>3|h<0)return[0];var c=s<<2|3&h;t.push(c);for(n=0;n<a.length;n++)t.push(a[n]);for(var l=0;l<i.length;l++)t.push(i[l])}var d=t.length,p=32768|d,g=new Uint8Array([(65280&p)>>8,255&p]),f=new Uint8Array(g.length+d);f[0]=g[0],f[1]=g[1];for(l=0;l<d;l++)f[2+l]=t[l];return f}},IEndPoint,GroupRegistry),_c(DefaultClient,{connect:function(){this.websocket=null;var e="",t=this._generateConnectionParams();if(!("WebSocket"in window)&&W3CWebSocket&&(WebSocket=W3CWebSocket),"undefined"==typeof jQuery&&(jQuery=node_jquery),!WebSocket||!jQuery)throw alert("PLEASE UPGRADE YOUR BROWSER TO SUPPORT WEBSOCKET!"),"Please upgrade your browser to support WEBSOCKET!";null!=t&&(e="?"+jQuery.param(t));var s=this.config.url+e,i=new WebSocket(s);i.binaryType="arraybuffer",i.onopen=_.bind(this.onConnected,this),i.onclose=_.bind(this.onDisconnected,this),i.onerror=_.bind(this.onConnectionError,this),console.log("Created websocket: "+s),this.websocket=i},disconnect:function(){null!=this.websocket&&(this.websocket.close(),this.keepAlive&&this.disableKeepAlive(),delete this._ep)},_generateConnectionParams:function(){var e={};if(void 0!==this.config.params&&(e=_.clone(this.config.params)),void 0!==this.config.msgGroup&&""!==this.config.msgGroup&&null!==this.config.msgGroup&&(this.config.msgGroup instanceof IMessageGroup?e.MessageGroup=this.config.msgGroup.id():e.MessageGroup=this.config.msgGroup),void 0!==this.config.msgClass&&""!==this.config.msgClass&&null!==this.config.msgClass)if(this.config.msgClass instanceof IMessageClass){if(void 0!==e.MessageGroup&&this.config.msgClass.group().id()!=e.MessageGroup)throw"Cannot generate connection params! Group ID "+e.MessageClass+" doesn't match with what defined in accompanied message class!";e.MessageClass=this.config.msgClass.id(),e.MessageGroup=this.config.msgClass.group().id()}else e.MessageClass=this.config.msgClass;return _.isEmpty(e)?null:e},enableKeepAlive:function(){0==this.keepAlive&&(this.keepAliveTimeout=setInterval(_.bind(this.sendKeepAlive,this),this.config.keepAliveInterval)),this.keepAlive=!0},disableKeepAlive:function(){1==this.keepAlive&&clearInterval(this.keepAliveTimeout),this.keepAlive=!1},sendKeepAlive:function(){if(null!=this._ep){var e=new MessageWrapper("",this._keepAliveMsgGrp.classById(0));this._ep.send(e)}},send:function(e){this._ep.send(e)},onConnected:function(e){this._ep=new EndPoint(this.websocket),this._ep.copyGroupRegistry(this),this.dispatch(new EPConnectedEvent(this._ep))},onDisconnected:function(e){void 0!==this._ep&&(this.dispatch(new EPDisconnectedEvent(this._ep)),this._ep=void 0)},onConnectionError:function(e){this.dispatch(new EPConnectionError)},processUnparsedMessage:function(e,t){if(4==e.messageClass.group().id())return console.debug("Receive keep alive message from",t),!1}},IClient,IEndPointEventSource,GroupRegistry),module.exports=exports={DefaultClient:DefaultClient,IMessageClass:IMessageClass,IMessageGroup:IMessageGroup,IMessageGroupProcessor:IMessageGroupProcessor,MetaInformationCode:MetaInformationCode,StreamNameCode:StreamNameCode,MessageIdCode:MessageIdCode,IEndPoint:IEndPoint,IEndPointEventSource:IEndPointEventSource,IPreparsingHook:IPreparsingHook,IClient:IClient,EndPoint:EndPoint,EPEvent:EPEvent,EPConnectedEvent:EPConnectedEvent,EPConnectionError:EPConnectionError,EPDisconnectedEvent:EPDisconnectedEvent,MessageWrapper:MessageWrapper,Util:Util,generateUUID:generateUUID};
|
package/lib/Subscriber.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var coreMsges=require("./CoreMessages"),deliveryStack=require("./DeliveryStack"),_=require("underscore"),EventEmitter=require("eventemitter3"),streamFinder=require("@jayesol/jayeson.lib.streamfinder"),Discoverer=streamFinder.Discoverer,util=require("./util"),_c=util._c,DefaultClient=deliveryStack.DefaultClient,EPEvent=deliveryStack.EPEvent,EPConnectedEvent=deliveryStack.EPConnectedEvent,EPConnectionError=deliveryStack.EPConnectionError,EPDisconnectedEvent=deliveryStack.EPDisconnectedEvent,IEndPointEventSource=deliveryStack.IEndPointEventSource,generateUUID=deliveryStack.generateUUID,Util=deliveryStack.Util,MessageWrapper=deliveryStack.MessageWrapper,StreamRegistryMessageGroup=coreMsges.StreamRegistryMessageGroup,EmptyMessageClass=coreMsges.EmptyMessageClass,StringMessageClass=coreMsges.StringMessageClass,JSonMessageClass=coreMsges.JSonMessageClass,StreamRegistryRequest=coreMsges.StreamRegistryRequest,StreamRegistryResponse=coreMsges.StreamRegistryResponse,AuthGroup=coreMsges.AuthGroup,GenericMessageGroup=coreMsges.GenericMessageGroup,KeepAliveMessageGroup=coreMsges.KeepAliveMessageGroup,TicketRenew=coreMsges.TicketRenew;function SubscriberConfig(){this.autoDiscover=!0,this.streamFinder="",this.username="",this.password="",this.discoveryPattern={},this.processors={},this.schemes=["ws"],this.ticketRenewalInterval=84e4,this.reconnectionInterval=3e3,this.exclusionThreshold=3,this.feedScope="",this.discoverByScope=!0}var DATA_NODE_COUNTER=0;function DataNode(e,t,s,o,i,n){this.client=null,this.streams={},this.id=e,this.counter=DATA_NODE_COUNTER++,console.log("[DataNode] Node ",e," counter ",this.counter," is created!"),this.state=DataNode.State.CREATED,this.connection=o.connection,this.toBeConsumed=[],this.consumeStream(o),this.clientId=t,this.ticket=s,this.consumeTaskTimeoutID=0,this.eventBus=i,this.sConf=n,this.removalPromises={},this.consumptionPromises={}}function Subscriber(e){IEndPointEventSource.call(this),this.conf=new SubscriberConfig,_.extend(this.conf,e),this.consuming={},this.nodes={},this.currentAvailableSources=null,this.hasUsedCurrentSources=!1,this.clientId=this.uuid(),this.ticket=null,this.eventBus=new EventEmitter,this.eventBus.on(DataNode.Event.RECONNECTION_ERROR,_.bind(this.onNodeReconnectionError,this)),this.eventBus.on(DataNode.Event.STATE,_.bind(this.onNodeStateChanged,this)),this.eventBus.on(DataNode.Event.CONSUMPTION_START,_.bind(this.onStreamConsumption,this)),this.eventBus.on(DataNode.Event.CONSUMPTION_ERROR,_.bind(this.onStreamError,this)),this.eventBus.on(DataNode.Event.CONSUMPTION_STOP,_.bind(this.onStreamStop,this))}function StreamConsumptionWrapper(e,t){this.state=e,this.node=t}function ConsumptionStart(e,t){EPEvent.call(this,e._ep),this.client=e,this.streams=t}function ConsumptionStop(e,t){EPEvent.call(this,e._ep),this.client=e,this.streams=t}function ConsumptionError(e,t){EPEvent.call(this,e._ep),this.client=e,this.streams=t}DataNode.State={CREATED:1,CONNECTING:2,CONNECTED:3,RECONNECTING:4,DISCONNECTED:5,DESTROYED:6},DataNode.Event={STATE:"DN_STATE",RECONNECTION_ERROR:"DN_RE_ERROR",CONSUMPTION_ERROR:"DN_CONSUMPTION_ERROR",CONSUMPTION_START:"DN_CONSUMPTION_START",CONSUMPTION_STOP:"DN_CONSUMPTION_STOP"},_c(DataNode,{removeStream:function(n,r,a){var c=Util._streamIdFromNames(n,r),e=_.bind(function(e){var t,s=_.bind(function(e){if(e&&this.streams[n]){var t;for(t=0;t<this.streams[n].length&&r!=this.streams[n][t].stream;t++);t<this.streams[n].length&&this.streams[n].splice(t,1),0==this.streams[n].length&&delete this.streams[n],_.isEmpty(this.streams)&&this.destroy()}return e},this);if(this.state==DataNode.State.CONNECTED&&a){t=Util._newPromise(),this.removalPromises[c]=t;var o=new StreamRegistryRequest(n,[r],StreamRegistryRequest.DEREGISTRATION);this.client.send(new MessageWrapper(o,StreamRegistryMessageGroup.REQUEST));var i=this;return window.setTimeout(function(){if(void 0!==i.removalPromises[c]){console.warn("Timeout waiting for deregistration response, proceeding to treat stream "+n+":"+r+" as deregistered for "+i.connection.hostname+":"+i.connection.port);var e={};e[r]=StreamRegistryResponse.DEREGISTRATION_TIMEOUT;var t=new StreamRegistryResponse(n,e,StreamRegistryResponse.DEREGISTRATION);i._processDeregistrationResult(t)}},7e3),t.then(s)}return t=Promise.resolve(s(!0))},this);return this.consumptionPromises&&void 0!==this.consumptionPromises[c]?this.consumptionPromises[c].then(e):e(!0)},hasStream:function(e,t){return!!this.streams[e]&&void 0!==(t=_.each(this.streams[e],function(e){return e.stream==t}))},consumeStream:function(e){console.log("Node "+this.id+" is going to consume "+e.group+"_"+e.stream),this.toBeConsumed.push(e),this.streams[e.group]||(this.streams[e.group]=[]),this.streams[e.group].push(e),0==this.consumeTaskTimeoutID&&this.state==DataNode.State.CONNECTED&&(this.consumeTaskTimeoutID=window.setTimeout(_.bind(this.consumeTask,this),100))},_consumeStreamsOnReconnected:function(){for(var e in _.isEmpty(this.streams)&&this.destroy(),this.streams)if(this.streams.hasOwnProperty(e))for(var t=0;t<this.streams[e].length;t++)this.toBeConsumed.push(this.streams[e][t])},connect:function(){console.log("[DataNode] Id ",this.id," counter ",this.counter," is going to connect. Current state ",this.state),this.client=new DefaultClient({url:this._getUrl(this.connection),msgClass:AuthGroup.classById(1),params:{clientId:this.clientId,ticket:this.ticket,feedScope:this.sConf.feedScope}},KeepAliveMessageGroup),this.client.attachListener(this),this.client.enableKeepAlive(),this.client.registerGroup(AuthGroup,this),this.client.registerGroup(StreamRegistryMessageGroup,this),this.client.connect()},reconnect:function(){console.log("[DataNode] Id ",this.id," counter ",this.counter," is going to re-connect. Current state ",this.state),this.client.config.params={clientId:this.clientId,ticket:this.ticket,feedScope:this.sConf.feedScope},this.client.connect()},_getUrl:function(e){return e.protocol+"://"+e.hostname+(void 0!==e.port?":"+e.port:"")+(void 0!==e.path?e.path:"")},consumeTask:function(){var n=this;if(this.state==DataNode.State.CONNECTED){var e=_.groupBy(this.toBeConsumed,function(e){return e.group});this.toBeConsumed=[],this.consumeTaskTimeoutID=0,_.each(e,function(e,t){var s=_.filter(e,function(e){var t=Util._streamId(e);return void 0===n.removalPromises[t]&&void 0===n.consumptionPromises[t]}),o=(_.reduce(s,function(e,t){var s=Util._streamId(t);return e[s]=Util._newPromise(),e[s].then(function(e){console.log("Consumption result of ",s," : successful = ",e)}),e},n.consumptionPromises),_.map(s,function(e){return e.stream})),i=new StreamRegistryRequest(t,o,StreamRegistryRequest.REGISTRATION);n.client.send(new MessageWrapper(i,StreamRegistryMessageGroup.REQUEST))})}},onEvent:function(e){if(console.log("[DataNode] Event from the stack client",e),e instanceof EPConnectedEvent)this.state===DataNode.State.DISCONNECTED&&this._consumeStreamsOnReconnected(),this.setState(DataNode.State.CONNECTED),console.log("[DataNode] Connect / Re-connect to ",this.connection.hostname,":",this.connection.port,"successfully. Consumption will be started!"),this.consumeTaskTimeoutID=window.setTimeout(_.bind(this.consumeTask,this),100);else if(e instanceof EPDisconnectedEvent||e instanceof EPConnectionError){if(this.state==DataNode.State.DESTROYED)return;this.setState(DataNode.State.DISCONNECTED),console.log("Connect / Re-connect to ",this.connection.hostname,":",this.connection.port," with error. Retry again later."),_.each(this.consumptionPromises,function(e,t){e.resolve(!1)}),_.each(this.removalPromises,function(e,t){e.resolve(!0)}),delete this.consumptionPromises,delete this.removalPromises,this.consumptionPromises={},this.removalPromises={},this.state!=DataNode.State.DESTROYED?window.setTimeout(_.bind(this.reconnect,this),this.sConf.reconnectionInterval):console.log("Data node ",this.id," has been destroyed. Stop reconnecting."),0!==this.consumeTaskTimeoutID&&window.clearTimeout(this.consumeTaskTimeoutID),e instanceof EPConnectionError?this.eventBus.emit(DataNode.Event.RECONNECTION_ERROR,this,++this.numFailedReconnection):this.numFailedReconnection=0}},process:function(e){if(e.message instanceof StreamRegistryResponse){var t=e.message;t.responseType==StreamRegistryResponse.REGISTRATION?this._processRegistrationResult(t):t.responseType==StreamRegistryResponse.CONSUMPTION?this._processConsumptionResult(t):t.responseType==StreamRegistryResponse.DEREGISTRATION?this._processDeregistrationResult(t):t.responseType==StreamRegistryResponse.STOP_CONSUMPTION&&this._processStopConsumptionResult(t)}},_resolveConsumptionPromise:function(e,t,s){var o=Util._streamIdFromNames(e,t);void 0!==this.consumptionPromises[o]&&this.consumptionPromises[o].resolve(s),delete this.consumptionPromises[o]},_resolveRemovalPromise:function(e,t,s){var o=Util._streamIdFromNames(e,t);void 0!==this.removalPromises[o]&&(this.removalPromises[o].resolve(s),delete this.removalPromises[o]),delete this.consumptionPromises[o]},_processDeregistrationResult:function(e){var s=this,o=e.messageGroup,i={};_.each(e.streams,function(e,t){e==StreamRegistryResponse.FAILED?s._resolveRemovalPromise(o,t,!1):(s._resolveRemovalPromise(o,t,!0),void 0===i[o]&&(i[o]=[]),i[o].push(t))}),0==_.isEmpty(i)&&(console.log("[DataNode] Emitting consumption error after Deregistration"),this.eventBus.emit(DataNode.Event.CONSUMPTION_ERROR,this,i))},_processStopConsumptionResult:function(e){var s=this,o=e.messageGroup,i={};_.each(e.streams,function(e,t){console.log("Stopping stream "+t),s.removeStream(o,t,!1),void 0===i[o]&&(i[o]=[]),i[o].push(t)}),_.isEmpty(i)||this.eventBus.emit(DataNode.Event.CONSUMPTION_STOP,this,i)},_processConsumptionResult:function(e){var s=this,o=e.messageGroup,i={},n={};_.each(e.streams,function(e,t){e==StreamRegistryResponse.FAILED?(s._resolveConsumptionPromise(o,t,!1),s.removeStream(o,t,!0),void 0===n[o]&&(n[o]=[]),n[o].push(t)):(s._resolveConsumptionPromise(o,t,!0),void 0===i[o]&&(i[o]=[]),i[o].push(t))}),0==_.isEmpty(i)&&this.eventBus.emit(DataNode.Event.CONSUMPTION_START,this,i),0==_.isEmpty(n)&&this.eventBus.emit(DataNode.Event.CONSUMPTION_ERROR,this,n)},_processRegistrationResult:function(e){var t=this,s=e.messageGroup,o=_.pairs(e.streams).filter(function(e){return e[1]==StreamRegistryResponse.FAILED}).map(_.first);o.forEach(function(e){t._resolveConsumptionPromise(s,e,!1),t.removeStream(s,e,!1)});var i=_.pairs(e.streams).filter(function(e){return e[1]==StreamRegistryResponse.SUCCESS}).map(_.first).filter(function(e){return void 0!==t.sConf.processors[s]||(t._resolveConsumptionPromise(s,e,!1),!1)});if(!_.isEmpty(i)){var n=t.sConf.processors[s];t.client.registerGroup(n.group(),n);var r=new StreamRegistryRequest(s,i,StreamRegistryRequest.CONSUMPTION);t.client.send(new MessageWrapper(r,StreamRegistryMessageGroup.REQUEST))}if(!_.isEmpty(o)){var a={};a[s]=o,console.log("Emitting consumption error due to registration result failed.",a),this.eventBus.emit(DataNode.Event.CONSUMPTION_ERROR,this,a)}},setState:function(e){if(e!=this.state){var t=this.state;this.state=e,this.eventBus.emit(DataNode.Event.STATE,this,t)}},renewTicket:function(e){this.ticket=e;var t=new MessageWrapper(new TicketRenew(this.clientId,this.ticket),AuthGroup.TICKET_RENEW);this.state==DataNode.State.CONNECTED&&this.client.send(t)},destroy:function(){this.setState(DataNode.State.DESTROYED),console.log("[DataNode] Disconnect the destroyed data node."),this.client.disconnect()}}),_c(ConsumptionStart,{},EPEvent),_c(ConsumptionStop,{},EPEvent),_c(ConsumptionError,{},EPEvent),Subscriber.Event={ConsumptionStart:ConsumptionStart,ConsumptionStop:ConsumptionStop,ConsumptionError:ConsumptionError},_c(Subscriber,{consumptionState:{PENDING:1,ERROR:3},uuid:function(){return generateUUID()},config:function(){return this.conf},start:function(){var s=new Discoverer(this.config().streamFinder);this.conf.discoverByScope&&(s=new Discoverer(this.config().streamFinder,void 0,this.conf.feedScope)),_.each(this.config().discoveryPattern,function(e,t){_.each(e,function(e){s.discover(t,e)})}),_.each(this.config().schemes,function(e){s.using(e)}),s.on("update",_.bind(this._updateSources,this)),s.on("error",_.bind(this._discovererError,this)),setInterval(_.bind(this._reconnectStreams,this),5e3),this._makeTicket(!0),this.discoverer=s},_makeTicket:function(s){SessionFactory.makeTicket(this.config().streamFinder,this.clientId,_.bind(function(e,t){0!=e.length?(this.ticket=e,console.log("New ticket obtained "+this.ticket),s?this.discoverer.start():_.each(this.nodes,_.bind(function(e,t){window.setTimeout(_.bind(e.renewTicket,e,this.ticket),0)},this)),window.setTimeout(_.bind(this._makeTicket,this),this.config().ticketRenewalInterval)):0!=t.length&&window.setTimeout(_.bind(this._makeTicket,this),1e3)},this))},_updateSources:function(e){console.log("Updating Sources!"),console.log(e),this.oldSources=this.currentAvailableSources,this.currentAvailableSources=e.streamConnections,this.hasUsedCurrentSources=!1;var s={},o={};if(this.oldSources&&0<this.oldSources.length){var i=[],n=[];_.each(e.streamConnections,function(e){i.push(Util._streamId(e)),n.push(Util._nodeId(e))});var r={};_.each(this.oldSources,_.bind(function(t){_.contains(i,Util._streamId(t))&&_.contains(n,Util._nodeId(t))||(console.log("[Subscriber] ",t," is no longer in the discovery results. Going to be removed."),_.each(this.nodes,_.bind(function(e){e.hasStream(t.group,t.stream)&&(console.log("[Subscriber] Remove old stream ",t," from Data Node ",e.id," dataNode counter ",e.counter),e.removeStream(t.group,t.stream,!0),void 0===r[t.group]&&(r[t.group]=[]),r[t.group].push(t.stream)),_.isEmpty(r)||(console.log("[DataNode] Emitting consumption error after removing streams"),this.eventBus.emit(DataNode.Event.CONSUMPTION_ERROR,e,r))},this)))},this))}_.each(e.streamConnections,_.bind(function(e){if(!this._exist(e)||this._error(e)||this._hasUpdatedConnection(e)){var t=Util._nodeId(e);this._hasNode(t)?(null==o[t]&&(o[t]=[]),o[t].push(e)):(null==s[t]&&(s[t]=[]),s[t].push(e))}},this)),this._connectUpdate(s),this._connectUpdate(o)},_reconnectStreams:function(e){var s={},o={};_.each(this.discoverer.getSources().streamConnections,_.bind(function(e){if(!this._exist(e)||this._error(e)&&this._hasUpdatedConnection(e)){console.log("Reconnecting to stopped stream ",e);var t=Util._nodeId(e);this._hasNode(t)?(null==o[t]&&(o[t]=[]),o[t].push(e)):(null==s[t]&&(s[t]=[]),s[t].push(e))}},this)),this._connectUpdate(s),this._connectUpdate(o)},onNodeReconnectionError:function(e,t){t==this.config().exclusionThreshold&&(this.discoverer.excluding(e.id),this._updateSourcesOnNodeReconnectionError(),console.log("Excluding node ",e.id," from discovery"))},_updateSourcesOnNodeReconnectionError:function(){0==this.hasUsedCurrentSource&&0==_.isEmpty(this.currentAvailableSources)&&(this._updateSources(this.currentAvailableSources),this.hasUsedCurrentSources=!0)},onNodeStateChanged:function(e,t){if(e.state==DataNode.State.DESTROYED||e.state==DataNode.State.DISCONNECTED){for(var s in this.consuming)this.consuming.hasOwnProperty(s)&&this.consuming[s].node.id==e.id&&(this.consuming[s].state=this.consumptionState.ERROR);var o={};for(var s in e.streams)if(e.streams.hasOwnProperty(s))for(streamInfo in o[s]=[],e.streams[s])o[s].push(streamInfo.stream);_.isEmpty(o)||(console.log("[Subscriber] emitting consumption error due to data node failed.",e.state),this.dispatch(new Subscriber.Event.ConsumptionError(e.client,o)))}t===DataNode.State.DISCONNECTED&&e.state===DataNode.State.CONNECTED?(this.discoverer.removeExclusion(e.id),console.log("Node ",e.id," resume successfully. Remove it from exclusion.")):e.state===DataNode.State.DESTROYED&&(this.discoverer.removeExclusion(e.id),delete this.nodes[e.id],console.log("Node ",e.id," is destroyed and removed from subscriber!"))},onStreamConsumption:function(e,t){this.dispatch(new Subscriber.Event.ConsumptionStart(e.client,t))},onStreamError:function(e,t){this.dispatch(new Subscriber.Event.ConsumptionError(e.client,t))},onStreamStop:function(e,t){this.dispatch(new Subscriber.Event.ConsumptionStop(e.client,t))},_discovererError:function(e){},_connectUpdate:function(e){_.each(e,_.bind(function(e,i){_.each(e,_.bind(function(t){var e=Util._streamId(t);this.consuming[e]||(this.consuming[e]=new StreamConsumptionWrapper);var s=this.consuming[e],o=Promise.resolve(0);void 0!==s&&null!=s.node&&s.state==this.consumptionState.ERROR&&(o=s.node.removeStream(t.group,t.stream,!1)),o.done=function(e,t){this.then(e,t).catch(function(e){console.log("Promise Rejected: "+e+"\n"+e.stack)})},s.state=this.consumptionState.PENDING,this.nodes[i]?o.done(_.bind(function(e){this.nodes[i].consumeStream(t),s.node=this.nodes[i]},this)):(this.nodes[i]=new DataNode(i,this.clientId,this.ticket,t,this.eventBus,this.config()),o.done(_.bind(function(e){s.node=this.nodes[i],this.nodes[i].connect()},this)))},this))},this))},_exist:function(e){var t=Util._streamId(e);return!!this.consuming[t]},_error:function(e){var t=Util._streamId(e);return!(!this.consuming[t]||this.consuming[t].state!=this.consumptionState.ERROR)},_hasUpdatedConnection:function(e){var t=Util._streamId(e);return this.consuming[t]&&this.consuming[t].node&&this.consuming[t].node.state!=DataNode.State.DESTROYED?Util._nodeId(e)!=this.consuming[t].node.id&&(console.log("Has updated source because the new node id is different from previous!"),!0):(console.log("Has updated source"),this.consuming[t]?this.consuming[t].node?this.consuming[t].node==DataNode.State.DESTROYED&&console.log("Because the source's node does not exist"):console.log("Because the source is not consumed from a node"):console.log("Because the source is not consuming"),!0)},_hasNode:function(e){return void 0!==this.nodes[e]}},IEndPointEventSource),module.exports=exports={Subscriber:Subscriber,SubscriberConfig:SubscriberConfig};
|
|
1
|
+
var coreMsges=require("./CoreMessages"),deliveryStack=require("./DeliveryStack"),_=require("underscore"),EventEmitter=require("eventemitter3"),streamFinder=require("@jayesol/jayeson.lib.streamfinder"),Discoverer=streamFinder.Discoverer,util=require("./util"),_c=util._c,DefaultClient=deliveryStack.DefaultClient,EPEvent=deliveryStack.EPEvent,EPConnectedEvent=deliveryStack.EPConnectedEvent,EPConnectionError=deliveryStack.EPConnectionError,EPDisconnectedEvent=deliveryStack.EPDisconnectedEvent,IEndPointEventSource=deliveryStack.IEndPointEventSource,generateUUID=deliveryStack.generateUUID,Util=deliveryStack.Util,MessageWrapper=deliveryStack.MessageWrapper,StreamRegistryMessageGroup=coreMsges.StreamRegistryMessageGroup,EmptyMessageClass=coreMsges.EmptyMessageClass,StringMessageClass=coreMsges.StringMessageClass,JSonMessageClass=coreMsges.JSonMessageClass,StreamRegistryRequest=coreMsges.StreamRegistryRequest,StreamRegistryResponse=coreMsges.StreamRegistryResponse,AuthGroup=coreMsges.AuthGroup,GenericMessageGroup=coreMsges.GenericMessageGroup,KeepAliveMessageGroup=coreMsges.KeepAliveMessageGroup,TicketRenew=coreMsges.TicketRenew;function SubscriberConfig(){this.autoDiscover=!0,this.streamFinder="",this.username="",this.password="",this.discoveryPattern={},this.processors={},this.schemes=["ws"],this.ticketRenewalInterval=84e4,this.reconnectionInterval=3e3,this.exclusionThreshold=3,this.feedScope="",this.discoverByScope=!0}var DATA_NODE_COUNTER=0;function DataNode(e,t,s,o,i,n){this.client=null,this.streams={},this.id=e,this.counter=DATA_NODE_COUNTER++,console.log("[DataNode] Node ",e," counter ",this.counter," is created!"),this.state=DataNode.State.CREATED,this.connection=o.connection,this.toBeConsumed=[],this.consumeStream(o),this.clientId=t,this.ticket=s,this.consumeTaskTimeoutID=0,this.eventBus=i,this.sConf=n,this.removalPromises={},this.consumptionPromises={}}function Subscriber(e){IEndPointEventSource.call(this),this.conf=new SubscriberConfig,_.extend(this.conf,e),this.consuming={},this.nodes={},this.currentAvailableSources=null,this.hasUsedCurrentSources=!1,this.clientId=this.uuid(),this.ticket=null,this.eventBus=new EventEmitter,this.eventBus.on(DataNode.Event.RECONNECTION_ERROR,_.bind(this.onNodeReconnectionError,this)),this.eventBus.on(DataNode.Event.STATE,_.bind(this.onNodeStateChanged,this)),this.eventBus.on(DataNode.Event.CONSUMPTION_START,_.bind(this.onStreamConsumption,this)),this.eventBus.on(DataNode.Event.CONSUMPTION_ERROR,_.bind(this.onStreamError,this)),this.eventBus.on(DataNode.Event.CONSUMPTION_STOP,_.bind(this.onStreamStop,this))}function StreamConsumptionWrapper(e,t){this.state=e,this.node=t}function ConsumptionStart(e,t){EPEvent.call(this,e._ep),this.client=e,this.streams=t}function ConsumptionStop(e,t){EPEvent.call(this,e._ep),this.client=e,this.streams=t}function ConsumptionError(e,t){EPEvent.call(this,e._ep),this.client=e,this.streams=t}DataNode.State={CREATED:1,CONNECTING:2,CONNECTED:3,RECONNECTING:4,DISCONNECTED:5,DESTROYED:6},DataNode.Event={STATE:"DN_STATE",RECONNECTION_ERROR:"DN_RE_ERROR",CONSUMPTION_ERROR:"DN_CONSUMPTION_ERROR",CONSUMPTION_START:"DN_CONSUMPTION_START",CONSUMPTION_STOP:"DN_CONSUMPTION_STOP"},_c(DataNode,{removeStream:function(e,t,s){var o=Util._streamIdFromNames(e,t),i=_.bind(function(i){var n,r=_.bind(function(s){if(s&&this.streams[e]){var o;for(o=0;o<this.streams[e].length&&t!=this.streams[e][o].stream;o++);o<this.streams[e].length&&this.streams[e].splice(o,1),0==this.streams[e].length&&delete this.streams[e],_.isEmpty(this.streams)&&this.destroy()}return s},this);if(this.state==DataNode.State.CONNECTED&&s){n=Util._newPromise(),this.removalPromises[o]=n;var a=new StreamRegistryRequest(e,[t],StreamRegistryRequest.DEREGISTRATION);this.client.send(new MessageWrapper(a,StreamRegistryMessageGroup.REQUEST));var c=this;return window.setTimeout(function(){if(void 0!==c.removalPromises[o]){console.warn("Timeout waiting for deregistration response, proceeding to treat stream "+e+":"+t+" as deregistered for "+c.connection.hostname+":"+c.connection.port);var s={};s[t]=StreamRegistryResponse.DEREGISTRATION_TIMEOUT;var i=new StreamRegistryResponse(e,s,StreamRegistryResponse.DEREGISTRATION);c._processDeregistrationResult(i)}},7e3),n.then(r)}return n=Promise.resolve(r(!0))},this);return this.consumptionPromises&&void 0!==this.consumptionPromises[o]?this.consumptionPromises[o].then(i):i(!0)},hasStream:function(e,t){return!!this.streams[e]&&void 0!==(t=_.each(this.streams[e],function(e){return e.stream==t}))},consumeStream:function(e){console.log("Node "+this.id+" is going to consume "+e.group+"_"+e.stream),this.toBeConsumed.push(e),this.streams[e.group]||(this.streams[e.group]=[]),this.streams[e.group].push(e),0==this.consumeTaskTimeoutID&&this.state==DataNode.State.CONNECTED&&(this.consumeTaskTimeoutID=window.setTimeout(_.bind(this.consumeTask,this),100))},_consumeStreamsOnReconnected:function(){for(var e in _.isEmpty(this.streams)&&this.destroy(),this.streams)if(this.streams.hasOwnProperty(e))for(var t=0;t<this.streams[e].length;t++)this.toBeConsumed.push(this.streams[e][t])},connect:function(){console.log("[DataNode] Id ",this.id," counter ",this.counter," is going to connect. Current state ",this.state),this.client=new DefaultClient({url:this._getUrl(this.connection),msgClass:AuthGroup.classById(1),params:{clientId:this.clientId,ticket:this.ticket,feedScope:this.sConf.feedScope}},KeepAliveMessageGroup),this.client.attachListener(this),this.client.enableKeepAlive(),this.client.registerGroup(AuthGroup,this),this.client.registerGroup(StreamRegistryMessageGroup,this),this.client.connect()},reconnect:function(){console.log("[DataNode] Id ",this.id," counter ",this.counter," is going to re-connect. Current state ",this.state),this.client.config.params={clientId:this.clientId,ticket:this.ticket,feedScope:this.sConf.feedScope},this.client.connect()},_getUrl:function(e){return e.protocol+"://"+e.hostname+(void 0!==e.port?":"+e.port:"")+(void 0!==e.path?e.path:"")},consumeTask:function(){var e=this;if(this.state==DataNode.State.CONNECTED){var t=_.groupBy(this.toBeConsumed,function(e){return e.group});this.toBeConsumed=[],this.consumeTaskTimeoutID=0,_.each(t,function(t,s){var o=_.filter(t,function(t){var s=Util._streamId(t);return void 0===e.removalPromises[s]&&void 0===e.consumptionPromises[s]}),i=(_.reduce(o,function(e,t){var s=Util._streamId(t);return e[s]=Util._newPromise(),e[s].then(function(e){console.log("Consumption result of ",s," : successful = ",e)}),e},e.consumptionPromises),_.map(o,function(e){return e.stream})),n=new StreamRegistryRequest(s,i,StreamRegistryRequest.REGISTRATION);e.client.send(new MessageWrapper(n,StreamRegistryMessageGroup.REQUEST))})}},onEvent:function(e){if(console.log("[DataNode] Event from the stack client",e),e instanceof EPConnectedEvent)this.state===DataNode.State.DISCONNECTED&&this._consumeStreamsOnReconnected(),this.setState(DataNode.State.CONNECTED),console.log("[DataNode] Connect / Re-connect to ",this.connection.hostname,":",this.connection.port,"successfully. Consumption will be started!"),this.consumeTaskTimeoutID=window.setTimeout(_.bind(this.consumeTask,this),100);else if(e instanceof EPDisconnectedEvent||e instanceof EPConnectionError){if(this.state==DataNode.State.DESTROYED)return;this.setState(DataNode.State.DISCONNECTED),console.log("Connect / Re-connect to ",this.connection.hostname,":",this.connection.port," with error. Retry again later."),_.each(this.consumptionPromises,function(e,t){e.resolve(!1)}),_.each(this.removalPromises,function(e,t){e.resolve(!0)}),delete this.consumptionPromises,delete this.removalPromises,this.consumptionPromises={},this.removalPromises={},this.state!=DataNode.State.DESTROYED?window.setTimeout(_.bind(this.reconnect,this),this.sConf.reconnectionInterval):console.log("Data node ",this.id," has been destroyed. Stop reconnecting."),0!==this.consumeTaskTimeoutID&&window.clearTimeout(this.consumeTaskTimeoutID),e instanceof EPConnectionError?this.eventBus.emit(DataNode.Event.RECONNECTION_ERROR,this,++this.numFailedReconnection):this.numFailedReconnection=0}},process:function(e){if(e.message instanceof StreamRegistryResponse){var t=e.message;t.responseType==StreamRegistryResponse.REGISTRATION?this._processRegistrationResult(t):t.responseType==StreamRegistryResponse.CONSUMPTION?this._processConsumptionResult(t):t.responseType==StreamRegistryResponse.DEREGISTRATION?this._processDeregistrationResult(t):t.responseType==StreamRegistryResponse.STOP_CONSUMPTION&&this._processStopConsumptionResult(t)}},_resolveConsumptionPromise:function(e,t,s){var o=Util._streamIdFromNames(e,t);void 0!==this.consumptionPromises[o]&&this.consumptionPromises[o].resolve(s),delete this.consumptionPromises[o]},_resolveRemovalPromise:function(e,t,s){var o=Util._streamIdFromNames(e,t);void 0!==this.removalPromises[o]&&(this.removalPromises[o].resolve(s),delete this.removalPromises[o]),delete this.consumptionPromises[o]},_processDeregistrationResult:function(e){var t=this,s=e.messageGroup,o={};_.each(e.streams,function(e,i){e==StreamRegistryResponse.FAILED?t._resolveRemovalPromise(s,i,!1):(t._resolveRemovalPromise(s,i,!0),void 0===o[s]&&(o[s]=[]),o[s].push(i))}),0==_.isEmpty(o)&&(console.log("[DataNode] Emitting consumption error after Deregistration"),this.eventBus.emit(DataNode.Event.CONSUMPTION_ERROR,this,o))},_processStopConsumptionResult:function(e){var t=this,s=e.messageGroup,o={};_.each(e.streams,function(e,i){console.log("Stopping stream "+i),t.removeStream(s,i,!1),void 0===o[s]&&(o[s]=[]),o[s].push(i)}),_.isEmpty(o)||this.eventBus.emit(DataNode.Event.CONSUMPTION_STOP,this,o)},_processConsumptionResult:function(e){var t=this,s=e.messageGroup,o={},i={};_.each(e.streams,function(e,n){e==StreamRegistryResponse.FAILED?(t._resolveConsumptionPromise(s,n,!1),t.removeStream(s,n,!0),void 0===i[s]&&(i[s]=[]),i[s].push(n)):(t._resolveConsumptionPromise(s,n,!0),void 0===o[s]&&(o[s]=[]),o[s].push(n))}),0==_.isEmpty(o)&&this.eventBus.emit(DataNode.Event.CONSUMPTION_START,this,o),0==_.isEmpty(i)&&this.eventBus.emit(DataNode.Event.CONSUMPTION_ERROR,this,i)},_processRegistrationResult:function(e){var t=this,s=e.messageGroup,o=_.pairs(e.streams).filter(function(e){return e[1]==StreamRegistryResponse.FAILED}).map(_.first);o.forEach(function(e){t._resolveConsumptionPromise(s,e,!1),t.removeStream(s,e,!1)});var i=_.pairs(e.streams).filter(function(e){return e[1]==StreamRegistryResponse.SUCCESS}).map(_.first).filter(function(e){return void 0!==t.sConf.processors[s]||(t._resolveConsumptionPromise(s,e,!1),!1)});if(!_.isEmpty(i)){var n=t.sConf.processors[s];t.client.registerGroup(n.group(),n);var r=new StreamRegistryRequest(s,i,StreamRegistryRequest.CONSUMPTION);t.client.send(new MessageWrapper(r,StreamRegistryMessageGroup.REQUEST))}if(!_.isEmpty(o)){var a={};a[s]=o,console.log("Emitting consumption error due to registration result failed.",a),this.eventBus.emit(DataNode.Event.CONSUMPTION_ERROR,this,a)}},setState:function(e){if(e!=this.state){var t=this.state;this.state=e,this.eventBus.emit(DataNode.Event.STATE,this,t)}},renewTicket:function(e){this.ticket=e;var t=new MessageWrapper(new TicketRenew(this.clientId,this.ticket),AuthGroup.TICKET_RENEW);this.state==DataNode.State.CONNECTED&&this.client.send(t)},destroy:function(){this.setState(DataNode.State.DESTROYED),console.log("[DataNode] Disconnect the destroyed data node."),this.client.disconnect()}}),_c(ConsumptionStart,{},EPEvent),_c(ConsumptionStop,{},EPEvent),_c(ConsumptionError,{},EPEvent),Subscriber.Event={ConsumptionStart:ConsumptionStart,ConsumptionStop:ConsumptionStop,ConsumptionError:ConsumptionError},_c(Subscriber,{consumptionState:{PENDING:1,ERROR:3},uuid:function(){return generateUUID()},config:function(){return this.conf},start:function(){var e=new Discoverer(this.config().streamFinder);this.conf.discoverByScope&&(e=new Discoverer(this.config().streamFinder,void 0,this.conf.feedScope)),_.each(this.config().discoveryPattern,function(t,s){_.each(t,function(t){e.discover(s,t)})}),_.each(this.config().schemes,function(t){e.using(t)}),e.on("update",_.bind(this._updateSources,this)),e.on("error",_.bind(this._discovererError,this)),setInterval(_.bind(this._reconnectStreams,this),5e3),this._makeTicket(!0),this.discoverer=e},_makeTicket:function(e){SessionFactory.makeTicket(this.config().streamFinder,this.clientId,_.bind(function(t,s){0!=t.length?(this.ticket=t,console.log("New ticket obtained "+this.ticket),e?this.discoverer.start():_.each(this.nodes,_.bind(function(e,t){window.setTimeout(_.bind(e.renewTicket,e,this.ticket),0)},this)),window.setTimeout(_.bind(this._makeTicket,this),this.config().ticketRenewalInterval)):0!=s.length&&window.setTimeout(_.bind(this._makeTicket,this),1e3)},this))},_updateSources:function(e){console.log("Updating Sources!"),console.log(e),this.oldSources=this.currentAvailableSources,this.currentAvailableSources=e.streamConnections,this.hasUsedCurrentSources=!1;var t={},s={};if(this.oldSources&&this.oldSources.length>0){var o=[],i=[];_.each(e.streamConnections,function(e){o.push(Util._streamId(e)),i.push(Util._nodeId(e))});var n={};_.each(this.oldSources,_.bind(function(e){_.contains(o,Util._streamId(e))&&_.contains(i,Util._nodeId(e))||(console.log("[Subscriber] ",e," is no longer in the discovery results. Going to be removed."),_.each(this.nodes,_.bind(function(t){t.hasStream(e.group,e.stream)&&(console.log("[Subscriber] Remove old stream ",e," from Data Node ",t.id," dataNode counter ",t.counter),t.removeStream(e.group,e.stream,!0),void 0===n[e.group]&&(n[e.group]=[]),n[e.group].push(e.stream)),_.isEmpty(n)||(console.log("[DataNode] Emitting consumption error after removing streams"),this.eventBus.emit(DataNode.Event.CONSUMPTION_ERROR,t,n))},this)))},this))}_.each(e.streamConnections,_.bind(function(e){if(!this._exist(e)||this._error(e)||this._hasUpdatedConnection(e)){var o=Util._nodeId(e);this._hasNode(o)?(null==s[o]&&(s[o]=[]),s[o].push(e)):(null==t[o]&&(t[o]=[]),t[o].push(e))}},this)),this._connectUpdate(t),this._connectUpdate(s)},_reconnectStreams:function(e){var t={},s={};_.each(this.discoverer.getSources().streamConnections,_.bind(function(e){if(!this._exist(e)||this._error(e)&&this._hasUpdatedConnection(e)){console.log("Reconnecting to stopped stream ",e);var o=Util._nodeId(e);this._hasNode(o)?(null==s[o]&&(s[o]=[]),s[o].push(e)):(null==t[o]&&(t[o]=[]),t[o].push(e))}},this)),this._connectUpdate(t),this._connectUpdate(s)},onNodeReconnectionError:function(e,t){t==this.config().exclusionThreshold&&(this.discoverer.excluding(e.id),this._updateSourcesOnNodeReconnectionError(),console.log("Excluding node ",e.id," from discovery"))},_updateSourcesOnNodeReconnectionError:function(){0==this.hasUsedCurrentSource&&0==_.isEmpty(this.currentAvailableSources)&&(this._updateSources(this.currentAvailableSources),this.hasUsedCurrentSources=!0)},onNodeStateChanged:function(e,t){if(e.state==DataNode.State.DESTROYED||e.state==DataNode.State.DISCONNECTED){for(var s in this.consuming)this.consuming.hasOwnProperty(s)&&this.consuming[s].node.id==e.id&&(this.consuming[s].state=this.consumptionState.ERROR);var o={};for(var s in e.streams)if(e.streams.hasOwnProperty(s))for(streamInfo in o[s]=[],e.streams[s])o[s].push(streamInfo.stream);_.isEmpty(o)||(console.log("[Subscriber] emitting consumption error due to data node failed.",e.state),this.dispatch(new Subscriber.Event.ConsumptionError(e.client,o)))}t===DataNode.State.DISCONNECTED&&e.state===DataNode.State.CONNECTED?(this.discoverer.removeExclusion(e.id),console.log("Node ",e.id," resume successfully. Remove it from exclusion.")):e.state===DataNode.State.DESTROYED&&(this.discoverer.removeExclusion(e.id),delete this.nodes[e.id],console.log("Node ",e.id," is destroyed and removed from subscriber!"))},onStreamConsumption:function(e,t){this.dispatch(new Subscriber.Event.ConsumptionStart(e.client,t))},onStreamError:function(e,t){this.dispatch(new Subscriber.Event.ConsumptionError(e.client,t))},onStreamStop:function(e,t){this.dispatch(new Subscriber.Event.ConsumptionStop(e.client,t))},_discovererError:function(e){},_connectUpdate:function(e){_.each(e,_.bind(function(e,t){_.each(e,_.bind(function(e){var s=Util._streamId(e);this.consuming[s]||(this.consuming[s]=new StreamConsumptionWrapper);var o=this.consuming[s],i=Promise.resolve(0);void 0!==o&&null!=o.node&&o.state==this.consumptionState.ERROR&&(i=o.node.removeStream(e.group,e.stream,!1)),i.done=function(e,t){this.then(e,t).catch(function(e){console.log("Promise Rejected: "+e+"\n"+e.stack)})},o.state=this.consumptionState.PENDING,this.nodes[t]?i.done(_.bind(function(s){this.nodes[t].consumeStream(e),o.node=this.nodes[t]},this)):(this.nodes[t]=new DataNode(t,this.clientId,this.ticket,e,this.eventBus,this.config()),i.done(_.bind(function(e){o.node=this.nodes[t],this.nodes[t].connect()},this)))},this))},this))},_exist:function(e){var t=Util._streamId(e);return!!this.consuming[t]},_error:function(e){var t=Util._streamId(e);return!(!this.consuming[t]||this.consuming[t].state!=this.consumptionState.ERROR)},_hasUpdatedConnection:function(e){var t=Util._streamId(e);return this.consuming[t]&&this.consuming[t].node&&this.consuming[t].node.state!=DataNode.State.DESTROYED?Util._nodeId(e)!=this.consuming[t].node.id&&(console.log("Has updated source because the new node id is different from previous!"),!0):(console.log("Has updated source"),this.consuming[t]?this.consuming[t].node?this.consuming[t].node==DataNode.State.DESTROYED&&console.log("Because the source's node does not exist"):console.log("Because the source is not consumed from a node"):console.log("Because the source is not consuming"),!0)},_hasNode:function(e){return void 0!==this.nodes[e]}},IEndPointEventSource),module.exports=exports={Subscriber:Subscriber,SubscriberConfig:SubscriberConfig};
|
package/lib/index.d.ts
CHANGED
|
@@ -1,217 +1,217 @@
|
|
|
1
|
-
export function generateUUID(): string;
|
|
2
|
-
export class IEndPointEventSource {
|
|
3
|
-
attachListener(listener :IEndPointEventListener) :void;
|
|
4
|
-
detachListener(listener :IEndPointEventListener) :void;
|
|
5
|
-
clearListeners() :void;
|
|
6
|
-
dispatch(event :EPEvent) :void;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export class IEndPoint extends IEndPointEventSource {
|
|
10
|
-
send(wrapper: MessageWrapper): void;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/************* STANDARD EVENTS **************************/
|
|
14
|
-
export class EPEvent {
|
|
15
|
-
constructor(endpoint: IEndPoint);
|
|
16
|
-
endPoint :IEndPoint;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export class EPConnectedEvent extends EPEvent {
|
|
20
|
-
constructor(endPoint: IEndPoint);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export class EPDisconnectedEvent extends EPEvent {
|
|
24
|
-
constructor(endPoint: IEndPoint);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export class EPConnectionError extends EPEvent {
|
|
28
|
-
constructor(endPoint: IEndPoint);
|
|
29
|
-
}
|
|
30
|
-
/************ END STANDARD EVENTS *************************/
|
|
31
|
-
|
|
32
|
-
export class IClient {
|
|
33
|
-
constructor(config: any);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export class DefaultClient extends IClient {
|
|
37
|
-
constructor(configuration: any, keepAliveMsgGrp: KeepAliveMessageGroup);
|
|
38
|
-
connect(): void;
|
|
39
|
-
disconnect(): void;
|
|
40
|
-
enableKeepAlive(): void;
|
|
41
|
-
disableKeepAlive(): void;
|
|
42
|
-
sendKeepAlive(): void;
|
|
43
|
-
send(wrapper: MessageWrapper): void;
|
|
44
|
-
onConnnected(event :EPEvent): void;
|
|
45
|
-
onDisconnected(event :EPEvent): void;
|
|
46
|
-
onConnectionError(event :EPEvent): void;
|
|
47
|
-
processUnparsedMessage(mw :MessageWrapper): boolean;
|
|
48
|
-
config: any;
|
|
49
|
-
keepAlive: boolean;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export class MetaInformationCode {
|
|
53
|
-
constructor(code: number);
|
|
54
|
-
code(): number;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export class StreamNameCode extends MetaInformationCode {
|
|
58
|
-
constructor();
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export class MessageIdCode extends MetaInformationCode {
|
|
62
|
-
constructor();
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export class MessageWrapper {
|
|
66
|
-
constructor(message: any, messageClass: IMessageClass, metaInfo?: MetaInfo);
|
|
67
|
-
message: any;
|
|
68
|
-
messageClass: IMessageClass;
|
|
69
|
-
metaInfo: MetaInfo;
|
|
70
|
-
hasMetaInfo(): boolean;
|
|
71
|
-
containsMetaInfo(): boolean;
|
|
72
|
-
getMetaInfo(k: number): any;
|
|
73
|
-
addMetaInfo(k: number, content: any): void;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export class IMessageGroup {
|
|
77
|
-
constructor(id: number);
|
|
78
|
-
id(): number;
|
|
79
|
-
classById(id: number): IMessageClass;
|
|
80
|
-
allClasses(): IMessageClass[];
|
|
81
|
-
protected _classes: IMessageClass[];
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
export class KeepAliveMessageGroup extends IMessageGroup {
|
|
85
|
-
constructor();
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export class GenericMessageGroup extends IMessageGroup {
|
|
89
|
-
constructor();
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
export class IMessageClass {
|
|
93
|
-
constructor(msgGroup: IMessageGroup, id: number, instanceClass: any);
|
|
94
|
-
id(): number;
|
|
95
|
-
group(): IMessageGroup;
|
|
96
|
-
inHandlers(): MsgHandler[];
|
|
97
|
-
outHandlers(): MsgHandler[];
|
|
98
|
-
instanceClass(): any;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
export type MsgHandler = {
|
|
102
|
-
unpack: (msg: MessageWrapper) => void
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
export type MetaInfo = { [k: number]: any };
|
|
106
|
-
|
|
107
|
-
/****************** MESSAGE CLASS DEFINITIONS *******************/
|
|
108
|
-
|
|
109
|
-
export class EmptyMessageClass extends IMessageClass {
|
|
110
|
-
constructor(grp: IMessageGroup, id: number);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
export class StringMessageClass extends EmptyMessageClass{
|
|
114
|
-
constructor(grp: IMessageGroup, id: number);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
export class JSonMessageClass extends IMessageClass {
|
|
118
|
-
constructor(msgGroup: IMessageGroup, id: number, instanceClass: any);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
export abstract class IMessageGroupProcessor {
|
|
122
|
-
constructor(msgGroup: IMessageGroup);
|
|
123
|
-
group(): IMessageGroup;
|
|
124
|
-
abstract process(wrapper: MessageWrapper): void;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
export abstract class IPreparsingHook extends IMessageGroupProcessor {
|
|
128
|
-
constructor(msgGroup: IMessageGroup);
|
|
129
|
-
abstract processUnparsedMessage(wrapper: MessageWrapper): void;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/****************** END OF MESSAGE CLASS DEFINITIONS *******************/
|
|
133
|
-
|
|
134
|
-
/**************** AUTH MESSAGE GROUP DEFINITION **********************/
|
|
135
|
-
|
|
136
|
-
export class AuthGroup extends IMessageGroup {
|
|
137
|
-
constructor();
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
export class TicketRenew {
|
|
141
|
-
constructor (clientId: string, newTicket: any);
|
|
142
|
-
getClientId(): string;
|
|
143
|
-
getNewTicket(): any;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**************** END OF AUTH MESSAGE GROUP DEFINITION **********************/
|
|
147
|
-
|
|
148
|
-
/**************** STREAM REGISTRATION GROUP **********************/
|
|
149
|
-
|
|
150
|
-
export class StreamRegistryMessageGroup extends IMessageGroup {
|
|
151
|
-
constructor();
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
export class StreamRegistryRequest {
|
|
155
|
-
constructor(messageGroup: IMessageGroup, streams: any[], requestType: number);
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
export class StreamRegistryResponse {
|
|
159
|
-
constructor(messageGroup: IMessageGroup, streams: any[], responseType: number);
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/**************** END OF STREAM REGISTRATION GROUP **********************/
|
|
163
|
-
|
|
164
|
-
export class SubscriberConfig {
|
|
165
|
-
autoDiscover: boolean;
|
|
166
|
-
streamFinder: string;
|
|
167
|
-
username: string;
|
|
168
|
-
password: string;
|
|
169
|
-
//A map of {group and List of streams}
|
|
170
|
-
//E:g {"69" : [".*"]}
|
|
171
|
-
discoveryPattern: any;
|
|
172
|
-
// A map of { Group and Processor}
|
|
173
|
-
//E:g {"69" : IMessageGrouProcessor}
|
|
174
|
-
processors: any;
|
|
175
|
-
schemes: string[];
|
|
176
|
-
ticketRenewalInterval: number;
|
|
177
|
-
reconnectionInterval: number;
|
|
178
|
-
exclusionThreshold: number;
|
|
179
|
-
feedScope: string;
|
|
180
|
-
discoverByScope: boolean;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
interface IEndPointEventListener {
|
|
184
|
-
onEvent(eve: EPEvent): void;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
export class Subscriber {
|
|
189
|
-
constructor(config: SubscriberConfig);
|
|
190
|
-
attachListener(listener: IEndPointEventListener): void;
|
|
191
|
-
start(): void;
|
|
192
|
-
uuid(): string;
|
|
193
|
-
config(): SubscriberConfig;
|
|
194
|
-
consumptionState: object;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
export namespace Subscriber {
|
|
198
|
-
export namespace Event {
|
|
199
|
-
export class ConsumptionStart extends EPEvent {
|
|
200
|
-
constructor(client: DefaultClient, streams :any);
|
|
201
|
-
client :DefaultClient;
|
|
202
|
-
streams :any;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
export class ConsumptionStop extends EPEvent {
|
|
206
|
-
constructor(client: DefaultClient, streams :any);
|
|
207
|
-
client :DefaultClient;
|
|
208
|
-
streams :any;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
export class ConsumptionError extends EPEvent {
|
|
212
|
-
constructor(client: DefaultClient, streams :any);
|
|
213
|
-
client :DefaultClient;
|
|
214
|
-
streams :any;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
}
|
|
1
|
+
export function generateUUID(): string;
|
|
2
|
+
export class IEndPointEventSource {
|
|
3
|
+
attachListener(listener :IEndPointEventListener) :void;
|
|
4
|
+
detachListener(listener :IEndPointEventListener) :void;
|
|
5
|
+
clearListeners() :void;
|
|
6
|
+
dispatch(event :EPEvent) :void;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export class IEndPoint extends IEndPointEventSource {
|
|
10
|
+
send(wrapper: MessageWrapper): void;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/************* STANDARD EVENTS **************************/
|
|
14
|
+
export class EPEvent {
|
|
15
|
+
constructor(endpoint: IEndPoint);
|
|
16
|
+
endPoint :IEndPoint;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export class EPConnectedEvent extends EPEvent {
|
|
20
|
+
constructor(endPoint: IEndPoint);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export class EPDisconnectedEvent extends EPEvent {
|
|
24
|
+
constructor(endPoint: IEndPoint);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export class EPConnectionError extends EPEvent {
|
|
28
|
+
constructor(endPoint: IEndPoint);
|
|
29
|
+
}
|
|
30
|
+
/************ END STANDARD EVENTS *************************/
|
|
31
|
+
|
|
32
|
+
export class IClient {
|
|
33
|
+
constructor(config: any);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export class DefaultClient extends IClient {
|
|
37
|
+
constructor(configuration: any, keepAliveMsgGrp: KeepAliveMessageGroup);
|
|
38
|
+
connect(): void;
|
|
39
|
+
disconnect(): void;
|
|
40
|
+
enableKeepAlive(): void;
|
|
41
|
+
disableKeepAlive(): void;
|
|
42
|
+
sendKeepAlive(): void;
|
|
43
|
+
send(wrapper: MessageWrapper): void;
|
|
44
|
+
onConnnected(event :EPEvent): void;
|
|
45
|
+
onDisconnected(event :EPEvent): void;
|
|
46
|
+
onConnectionError(event :EPEvent): void;
|
|
47
|
+
processUnparsedMessage(mw :MessageWrapper): boolean;
|
|
48
|
+
config: any;
|
|
49
|
+
keepAlive: boolean;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export class MetaInformationCode {
|
|
53
|
+
constructor(code: number);
|
|
54
|
+
code(): number;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export class StreamNameCode extends MetaInformationCode {
|
|
58
|
+
constructor();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export class MessageIdCode extends MetaInformationCode {
|
|
62
|
+
constructor();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export class MessageWrapper {
|
|
66
|
+
constructor(message: any, messageClass: IMessageClass, metaInfo?: MetaInfo);
|
|
67
|
+
message: any;
|
|
68
|
+
messageClass: IMessageClass;
|
|
69
|
+
metaInfo: MetaInfo;
|
|
70
|
+
hasMetaInfo(): boolean;
|
|
71
|
+
containsMetaInfo(): boolean;
|
|
72
|
+
getMetaInfo(k: number): any;
|
|
73
|
+
addMetaInfo(k: number, content: any): void;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export class IMessageGroup {
|
|
77
|
+
constructor(id: number);
|
|
78
|
+
id(): number;
|
|
79
|
+
classById(id: number): IMessageClass;
|
|
80
|
+
allClasses(): IMessageClass[];
|
|
81
|
+
protected _classes: IMessageClass[];
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export class KeepAliveMessageGroup extends IMessageGroup {
|
|
85
|
+
constructor();
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export class GenericMessageGroup extends IMessageGroup {
|
|
89
|
+
constructor();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export class IMessageClass {
|
|
93
|
+
constructor(msgGroup: IMessageGroup, id: number, instanceClass: any);
|
|
94
|
+
id(): number;
|
|
95
|
+
group(): IMessageGroup;
|
|
96
|
+
inHandlers(): MsgHandler[];
|
|
97
|
+
outHandlers(): MsgHandler[];
|
|
98
|
+
instanceClass(): any;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export type MsgHandler = {
|
|
102
|
+
unpack: (msg: MessageWrapper) => void
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
export type MetaInfo = { [k: number]: any };
|
|
106
|
+
|
|
107
|
+
/****************** MESSAGE CLASS DEFINITIONS *******************/
|
|
108
|
+
|
|
109
|
+
export class EmptyMessageClass extends IMessageClass {
|
|
110
|
+
constructor(grp: IMessageGroup, id: number);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export class StringMessageClass extends EmptyMessageClass{
|
|
114
|
+
constructor(grp: IMessageGroup, id: number);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export class JSonMessageClass extends IMessageClass {
|
|
118
|
+
constructor(msgGroup: IMessageGroup, id: number, instanceClass: any);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export abstract class IMessageGroupProcessor {
|
|
122
|
+
constructor(msgGroup: IMessageGroup);
|
|
123
|
+
group(): IMessageGroup;
|
|
124
|
+
abstract process(wrapper: MessageWrapper): void;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export abstract class IPreparsingHook extends IMessageGroupProcessor {
|
|
128
|
+
constructor(msgGroup: IMessageGroup);
|
|
129
|
+
abstract processUnparsedMessage(wrapper: MessageWrapper): void;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/****************** END OF MESSAGE CLASS DEFINITIONS *******************/
|
|
133
|
+
|
|
134
|
+
/**************** AUTH MESSAGE GROUP DEFINITION **********************/
|
|
135
|
+
|
|
136
|
+
export class AuthGroup extends IMessageGroup {
|
|
137
|
+
constructor();
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export class TicketRenew {
|
|
141
|
+
constructor (clientId: string, newTicket: any);
|
|
142
|
+
getClientId(): string;
|
|
143
|
+
getNewTicket(): any;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**************** END OF AUTH MESSAGE GROUP DEFINITION **********************/
|
|
147
|
+
|
|
148
|
+
/**************** STREAM REGISTRATION GROUP **********************/
|
|
149
|
+
|
|
150
|
+
export class StreamRegistryMessageGroup extends IMessageGroup {
|
|
151
|
+
constructor();
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export class StreamRegistryRequest {
|
|
155
|
+
constructor(messageGroup: IMessageGroup, streams: any[], requestType: number);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export class StreamRegistryResponse {
|
|
159
|
+
constructor(messageGroup: IMessageGroup, streams: any[], responseType: number);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**************** END OF STREAM REGISTRATION GROUP **********************/
|
|
163
|
+
|
|
164
|
+
export class SubscriberConfig {
|
|
165
|
+
autoDiscover: boolean;
|
|
166
|
+
streamFinder: string;
|
|
167
|
+
username: string;
|
|
168
|
+
password: string;
|
|
169
|
+
//A map of {group and List of streams}
|
|
170
|
+
//E:g {"69" : [".*"]}
|
|
171
|
+
discoveryPattern: any;
|
|
172
|
+
// A map of { Group and Processor}
|
|
173
|
+
//E:g {"69" : IMessageGrouProcessor}
|
|
174
|
+
processors: any;
|
|
175
|
+
schemes: string[];
|
|
176
|
+
ticketRenewalInterval: number;
|
|
177
|
+
reconnectionInterval: number;
|
|
178
|
+
exclusionThreshold: number;
|
|
179
|
+
feedScope: string;
|
|
180
|
+
discoverByScope: boolean;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
interface IEndPointEventListener {
|
|
184
|
+
onEvent(eve: EPEvent): void;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
export class Subscriber {
|
|
189
|
+
constructor(config: SubscriberConfig);
|
|
190
|
+
attachListener(listener: IEndPointEventListener): void;
|
|
191
|
+
start(): void;
|
|
192
|
+
uuid(): string;
|
|
193
|
+
config(): SubscriberConfig;
|
|
194
|
+
consumptionState: object;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export namespace Subscriber {
|
|
198
|
+
export namespace Event {
|
|
199
|
+
export class ConsumptionStart extends EPEvent {
|
|
200
|
+
constructor(client: DefaultClient, streams :any);
|
|
201
|
+
client :DefaultClient;
|
|
202
|
+
streams :any;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export class ConsumptionStop extends EPEvent {
|
|
206
|
+
constructor(client: DefaultClient, streams :any);
|
|
207
|
+
client :DefaultClient;
|
|
208
|
+
streams :any;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
export class ConsumptionError extends EPEvent {
|
|
212
|
+
constructor(client: DefaultClient, streams :any);
|
|
213
|
+
client :DefaultClient;
|
|
214
|
+
streams :any;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
package/lib/util.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var _=require("underscore");function _abstract(){throw"Abstract method is not yet implemented"}function _c(t,e){if(void 0===e)throw"Cannot initialize a class with undefined definition";if(void 0===t)throw"Cannot initialize class Undefined";var o,r,n={};for(r=2;r<arguments.length&&
|
|
1
|
+
var _=require("underscore");function _abstract(){throw"Abstract method is not yet implemented"}function _c(t,e){if(void 0===e)throw"Cannot initialize a class with undefined definition";if(void 0===t)throw"Cannot initialize class Undefined";var o,r,n={};for(r=2;r<arguments.length&&null==arguments[r];r++);for(var i=r+1;i<arguments.length;i++)null!=arguments[i]&&_.extend(n,arguments[i].prototype);r<arguments.length&&(o=arguments[r]),void 0!==o&&(t.prototype=Object.create(o.prototype)),_.extend(t.prototype,n),_.extend(t.prototype,e),t.prototype.constructor=t,null!=o&&(t.super=function(t){var e=Array.prototype.slice.call(arguments);e.shift(),o.apply(t,e)})}module.exports=exports={_abstract:_abstract,_c:_c};
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jayesol/jayeson.lib.delivery",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.7-beta",
|
|
4
4
|
"description": "Javascript implementation of Delivery",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"types": "lib/index.d.ts",
|
|
7
7
|
"scripts": {
|
|
8
8
|
"test": "gulp test",
|
|
9
|
-
"
|
|
10
|
-
"
|
|
9
|
+
"build": "gulp compile",
|
|
10
|
+
"prepack": "npx gulp compile"
|
|
11
11
|
},
|
|
12
12
|
"repository": {
|
|
13
13
|
"type": "git"
|
|
@@ -19,23 +19,24 @@
|
|
|
19
19
|
"license": "ISC",
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"@jayesol/jayeson.lib.streamfinder": "2.0.0",
|
|
22
|
-
"eventemitter3": "^
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"websocket": "^1.0.24"
|
|
22
|
+
"eventemitter3": "^5.0.1",
|
|
23
|
+
"jquery": "^3.7.1",
|
|
24
|
+
"secure-random": "^1.1.2",
|
|
25
|
+
"typescript": "^5.3.3",
|
|
26
|
+
"underscore": "^1.13.6",
|
|
27
|
+
"websocket": "^1.0.34"
|
|
29
28
|
},
|
|
30
29
|
"devDependencies": {
|
|
31
|
-
"del": "^
|
|
32
|
-
"glob": "^
|
|
33
|
-
"gulp": "^
|
|
30
|
+
"del": "^7.1.0",
|
|
31
|
+
"glob": "^10.3.10",
|
|
32
|
+
"gulp": "^4.0.2",
|
|
34
33
|
"gulp-install": "^1.1.0",
|
|
35
|
-
"gulp-jasmine": "^
|
|
36
|
-
"gulp-
|
|
37
|
-
"gulp-
|
|
38
|
-
"
|
|
39
|
-
"
|
|
34
|
+
"gulp-jasmine": "^4.0.0",
|
|
35
|
+
"gulp-terser": "^2.1.0",
|
|
36
|
+
"gulp-typescript": "^6.0.0-alpha.1",
|
|
37
|
+
"gulp-uglify": "^3.0.2",
|
|
38
|
+
"jasmine": "^5.1.0",
|
|
39
|
+
"semver": "^7.5.4",
|
|
40
|
+
"terser": "^5.44.1"
|
|
40
41
|
}
|
|
41
42
|
}
|