1 |
|
2 |
|
3 |
|
4 | const WebSocket = require('ws');
|
5 | var MessageHandler = require('./controlmessage-handler');
|
6 | var agentSetting = require("./agent-setting");
|
7 | var serverConfig = require("./NDCServerConfig");
|
8 | var util = require('./util');
|
9 | var NDConnectionManager = require('./NDConnectionManager');
|
10 |
|
11 | var socket_timeout;
|
12 | var client ;
|
13 | var controlMessageHandler;
|
14 | var retryOnClose=0
|
15 | var ndcHost=0;
|
16 | var ndcPort=0;
|
17 | var protocol;
|
18 |
|
19 | function ws_client(){}
|
20 |
|
21 | var closeConnListener = function(err) {
|
22 | try {
|
23 | agentSetting.isTestRunning = false;
|
24 | agentSetting.isToInstrument = false;
|
25 | clearInterval(agentSetting.reconnectTimer)
|
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 |
|
38 | function 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 |
|
56 | var connectConnListener = function() {
|
57 | try {
|
58 | var self = this;
|
59 | retryOnClose = 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();
|
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 |
|
80 | ws_client.connectToServer = function(){
|
81 | controlMessageHandler = undefined
|
82 | retryOnClose=0 , client= undefined;
|
83 |
|
84 | ws_client._connect();
|
85 | };
|
86 |
|
87 | function 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)
|
97 | serverConfig.currentActiveServer = serverConfig.serverList[0] ? serverConfig.serverList[0] : serverConfig.defaultServer;
|
98 |
|
99 |
|
100 | socket_timeout = setTimeout(function () {
|
101 | try {
|
102 | socket_timeout = 0;
|
103 | if (serverConfig.serverList.length > 1) {
|
104 | if (retryOnClose >= serverConfig.retryCount) {
|
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 |
|
118 | ws_client._connect = function()
|
119 | {
|
120 | try{
|
121 | ++retryOnClose
|
122 | if(!serverConfig.currentActiveServer)
|
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 |
|
152 | ws_client.destroy = function(){
|
153 | try{
|
154 | if(client) {
|
155 | |
156 |
|
157 |
|
158 |
|
159 | agentSetting.isTestRunning = false;
|
160 | agentSetting.isToInstrument = false;
|
161 |
|
162 | clearInterval(agentSetting.reconnectTimer)
|
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 |
|
170 | client= undefined
|
171 | }
|
172 | }catch(e){
|
173 | util.logger.error(agentSetting.currentTestRun + ' | Error in ws_client destroy()')
|
174 | }
|
175 | }
|
176 |
|
177 | ws_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 |
|
184 | ws_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 |
|
191 | ws_client.getControlSocket = function(){
|
192 | return client;
|
193 | }
|
194 |
|
195 | ws_client.handleDataEvent = function(cb){
|
196 | client.on('message',cb)
|
197 | }
|
198 |
|
199 | ws_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 |
|
213 | module.exports = ws_client;
|