UNPKG

8.27 kBJavaScriptView Raw
1/**
2 * Created by sahil on 18/02/18.
3 */
4const WebSocket = require('ws');
5var MessageHandler = require('./controlmessage-handler');
6var agentSetting = require("./agent-setting");
7var serverConfig = require("./NDCServerConfig");
8var util = require('./util');
9var NDConnectionManager = require('./NDConnectionManager');
10
11var socket_timeout;
12var client ;
13var controlMessageHandler;
14var retryOnClose=0 // Counter that will store retry count for particular Server
15var ndcHost=0;
16var ndcPort=0;
17var protocol;
18
19function ws_client(){}
20
21var closeConnListener = function(err) {
22 try {
23 agentSetting.isTestRunning = false;
24 agentSetting.isToInstrument = false;
25 clearInterval(agentSetting.reconnectTimer) //Clearing reconnect timer interval
26 agentSetting.reconnectTimer = undefined;
27 util.logger.info(agentSetting.currentTestRun+" | Control connection, Received socket close event from Host : "
28 ,ndcHost," ,Port : ",ndcPort," ,error : ", err);
29 if(client) {
30 client.removeAllListeners();
31 }
32 connectToServer()
33 }
34 catch(err){util.logger.warn(agentSetting.currentTestRun+" | Error in retrying for control connection with Host : "
35 ,ndcHost," ,Port : ",ndcPort," ,error : ", err);}
36}
37
38function idleTimeOutCheck(){
39 try{
40 var self = this;
41 self.setTimeout(60000);
42 var idleTimeout = new Date().getTime();
43 if(agentSetting.reconnectTimer == undefined){
44 if(idleTimeout - agentSetting.lastHeartBeatReceived > agentSetting.ndcHeartBeatThreshold){
45 util.logger.warn(agentSetting.currentTestRun + ' | Idle Socket Condition ,Hence Breaking the Connection in WS Connection')
46 agentSetting.lastHeartBeatReceived = new Date().getTime();
47 ws_client.destroy();
48 NDConnectionManager.checkProtocolAndMakeConnection();
49 }
50 }
51 }catch(e){
52 util.logger.error(agentSetting.currentTestRun + ' | Error in IdleTimeOutCheck :',e)
53 }
54}
55
56var connectConnListener = function() {
57 try {
58 var self = this;
59 retryOnClose = 0 //After connecting , reseting value of reconnect for particular server to =0
60 clearTimeout(socket_timeout);
61 if(!controlMessageHandler) {
62 controlMessageHandler = new MessageHandler(ws_client);
63 }
64 util.logger.info(agentSetting.currentTestRun+" | Connection established with NDCollector : Socket [addr="+ndcHost+" ,Port : "+ndcPort + " ,protocol : "+protocol+" ,localport :" +ws_client.getLocalPort() );
65 controlMessageHandler.setClientSocket(ws_client)
66 controlMessageHandler.handleMessages();
67 controlMessageHandler.sendIntialMessages(); //Sending intial message i.e control connection
68 serverConfig.updateLastConnInfo();
69 if(self._socket){
70 self._socket.setTimeout(60000)
71 self._socket.on('timeout',idleTimeOutCheck)
72 }else{
73 util.logger.warn(agentSetting.currentTestRun + ' | web_socket._socket got Null ');
74 }
75 }
76 catch(err){util.logger.warn(agentSetting.currentTestRun+" | connectConnListener error" , err);}
77}
78
79
80ws_client.connectToServer = function(){
81 controlMessageHandler = undefined
82 retryOnClose=0 , client= undefined;
83
84 ws_client._connect();
85};
86
87function connectToServer()
88{
89 if(client.readyState === WebSocket.OPEN)
90 return;
91
92 if(socket_timeout)
93 return;
94
95 agentSetting.readSettingFile()
96 if(!serverConfig.currentActiveServer) // First time current server refrence is null , so pointing it to 0th index of server list
97 serverConfig.currentActiveServer = serverConfig.serverList[0] ? serverConfig.serverList[0] : serverConfig.defaultServer;
98
99 //Invoking retry timer, to connect again with NDC
100 socket_timeout = setTimeout(function () {
101 try {
102 socket_timeout = 0;
103 if (serverConfig.serverList.length > 1) {
104 if (retryOnClose >= serverConfig.retryCount) { //Switich current server, if retrying is greater then retry count
105 retryOnClose = 0;
106 serverConfig.switchNDCMode()
107 }
108 }
109 util.logger.info(agentSetting.currentTestRun+" | Timer for retrying control connectoion expired. trying to connect with Host : "+ndcHost+" ,Port : "+ndcPort,
110 "Type : ",serverConfig.currentActiveServer.type);
111 ws_client._connect();
112 }
113 catch(err){util.logger.warn(agentSetting.currentTestRun+" | Error in retrying" + err);}
114 },serverConfig.sleepInterval);
115}
116
117
118ws_client._connect = function()
119{
120 try{
121 ++retryOnClose
122 if(!serverConfig.currentActiveServer) // First time current server refrence is null , so pointing it to 0th index of server list
123 serverConfig.currentActiveServer = serverConfig.serverList[0] ? serverConfig.serverList[0] : serverConfig.defaultServer;
124
125 var currProto = serverConfig.getCurrentActiveProtocol()
126 ndcHost = serverConfig.currentActiveServer.ndcHost;
127 ndcPort = currProto.port;
128 protocol = currProto.protocol;
129 if((serverConfig.currentActiveServer.ndcHost == undefined) || (currProto.port == undefined))
130 connectToServer();
131 else {
132 var url = currProto.protocol+'://'+serverConfig.currentActiveServer.ndcHost+':'+currProto.port+'/' ;
133 var options={}
134 if(currProto.protocol.toLowerCase() == 'wss')
135 options.rejectUnauthorized = false
136
137 util.logger.info('0|Trying to Connect to ',url)
138 client = new WebSocket(url,options);
139
140 client.on('open',connectConnListener)
141 client.on('close',closeConnListener )
142 client.on('error', function(err) {});
143 client.on('end', function(err) {});
144 }
145 }
146 catch(err){
147 util.logger.warn(agentSetting.currentTestRun+" | Error in making connection" + err);
148 }
149
150};
151
152ws_client.destroy = function(){
153 try{
154 if(client) {
155 /*
156 * 1. We are removing close listener befor closing connection because is close listener we are retrying for connection .
157 * 2. After closing connection , removing all liteners ,because in close's handshaking, server will send error, so agent should handle
158 * exceptions*/
159 agentSetting.isTestRunning = false;
160 agentSetting.isToInstrument = false;
161
162 clearInterval(agentSetting.reconnectTimer) //Clearing reconnect timer interval
163 agentSetting.reconnectTimer = undefined;
164 if(client._socket)
165 client._socket.removeListener('timeout',idleTimeOutCheck);
166 client.removeListener('close',closeConnListener);
167 client.removeListener('open',connectConnListener);
168 client.close();
169 //client.removeAllListeners();
170 client= undefined
171 }
172 }catch(e){
173 util.logger.error(agentSetting.currentTestRun + ' | Error in ws_client destroy()')
174 }
175}
176
177ws_client.getLocalPort = function(){
178 try {
179 if (!client)return;
180 return client._socket.address() ? client._socket.address().port : undefined
181 }catch(err){util.logger.warn(err);}
182}
183
184ws_client.getLocalHost = function(){
185 try {
186 if (!client)return
187 return client._socket.address() ? client._socket.address().address : undefined
188 }catch(err){util.logger.warn(err);}
189}
190
191ws_client.getControlSocket = function(){
192 return client;
193}
194
195ws_client.handleDataEvent = function(cb){
196 client.on('message',cb)
197}
198
199ws_client.write = function(data){
200 try {
201 if (!client) {
202 util.logger.error('Cant able to write, Not connected with NDC')
203 }
204
205 if (client.readyState === WebSocket.OPEN) {
206 client.send(data)
207 }
208 } catch(err){
209 util.logger.warn(agentSetting.currentTestRun+" | Error in writing over control channel" + err);
210 }
211}
212
213module.exports = ws_client;