UNPKG

8.32 kBJavaScriptView Raw
1/*
2
3 ----------------------------------------------------------------------------
4 | qewd: Quick and Easy Web Development |
5 | |
6 | Copyright (c) 2017-19 M/Gateway Developments Ltd, |
7 | Redhill, Surrey UK. |
8 | All rights reserved. |
9 | |
10 | http://www.mgateway.com |
11 | Email: rtweed@mgateway.com |
12 | |
13 | |
14 | Licensed under the Apache License, Version 2.0 (the "License"); |
15 | you may not use this file except in compliance with the License. |
16 | You may obtain a copy of the License at |
17 | |
18 | http://www.apache.org/licenses/LICENSE-2.0 |
19 | |
20 | Unless required by applicable law or agreed to in writing, software |
21 | distributed under the License is distributed on an "AS IS" BASIS, |
22 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
23 | See the License for the specific language governing permissions and |
24 | limitations under the License. |
25 ----------------------------------------------------------------------------
26
27 29 May 2019
28
29*/
30
31var events = require('events');
32var io = require('socket.io-client');
33var jwtHandler = require('./jwtHandler');
34
35var ms_response_handlers = {};
36
37function start(params) {
38
39 var self = this;
40
41 this.application = params.application || 'undefined';
42 this.url = params.url || false;
43 this.log = params.log || false;
44 this.jwt = params.jwt || false;
45 this.connected = false;
46 if (!this.url) return;
47 this.hasEventHandler = {};
48
49 var socket = io(this.url, {transports: ['websocket']});
50
51 this.on('error', function(message) {
52 });
53
54 function handleResponse(messageObj) {
55 // messages received back from socket server
56
57 /*
58
59 don't disconnect a QEWD socket connection!
60
61 if (messageObj.message && messageObj.message.error && messageObj.message.disconnect) {
62 if (typeof socket !== 'undefined') {
63 socket.disconnect();
64 console.log('Socket disconnected');
65 }
66 return;
67 }
68 */
69
70 if (messageObj.type === 'ewd-register') {
71 self.token = messageObj.message.token;
72 console.log(self.application + ' registered');
73 self.emit('ewd-registered');
74 return;
75 }
76
77 if (messageObj.type === 'ewd-reregister') {
78 console.log('Re-registered');
79 self.emit('ewd-reregistered');
80 return;
81 }
82
83 if (self.log) console.log('socketClient received: ' + JSON.stringify(messageObj));
84
85 if (messageObj.type === 'error' && typeof messageObj.message === 'string') {
86
87 // This will be a response from a MicroService that has had an unexpected exception
88 // As such, it won't have been able to return the MicroService request Id
89 // so the master process won't be able to link it to the Express / Koa response object
90 // The error response therefore can't be returned to the client that made the request
91
92 messageObj = {
93 message: {
94 error: messageObj.message
95 }
96 };
97 }
98
99 if (messageObj.message && messageObj.message.error) {
100
101 var id;
102
103 // for MicroService responses, get response handler from the hash and execute it
104 if (messageObj.message.ms_requestId && ms_response_handlers[messageObj.message.ms_requestId]) {
105 id = +messageObj.message.ms_requestId;
106 delete messageObj.message.ms_requestId;
107 ms_response_handlers[id](messageObj);
108 delete ms_response_handlers[id];
109 }
110 else {
111 console.log('Emitting error as restRequest: ' + JSON.stringify(messageObj));
112 self.emit("restRequest", messageObj);
113 }
114 return;
115 }
116
117 // for MicroService responses, get response handler from the hash and execute it
118 if (messageObj.message && messageObj.message.ms_requestId && ms_response_handlers[messageObj.message.ms_requestId]) {
119 id = +messageObj.message.ms_requestId;
120 delete messageObj.message.ms_requestId;
121 ms_response_handlers[id](messageObj);
122 delete ms_response_handlers[id];
123 }
124 else if (!messageObj.message && messageObj.type === 'restRequest') {
125 // Looks like the MicroService's WorkerResponseHandler didn't return a valid message
126 messageObj.message = {
127 error: 'Bad response from a MicroService Worker Response Handler - no message property found'
128 };
129 self.emit('restRequest', messageObj);
130 }
131 else {
132 var eventName = messageObj.type;
133 console.log('Emitting event ' + eventName);
134 self.emit(eventName, messageObj);
135 }
136 }
137
138 socket.on('connect', function() {
139
140 self.disconnectSocket = function() {
141 socket.disconnect();
142 console.log('qewd-socketClient disconnected socket');
143 };
144 var message;
145 if (self.token) {
146 // re-connection occured - re-register to attach to original Session
147 // need to update JWT expiry to ensure it re-connects OK
148
149 console.log('*** socketClient re-register - secret = ' + self.jwt.secret);
150
151 self.token = jwtHandler.updateJWTExpiry.call(self, self.token)
152
153 message = {
154 type: 'ewd-reregister',
155 token: self.token
156 };
157 if (self.jwt) message.jwt = true;
158 }
159 else {
160 message = {
161 type: 'ewd-register',
162 application: self.application
163 };
164 if (self.jwt) message.jwt = true;
165 }
166 self.connected = true;
167 socket.emit('ewdjs', message);
168 });
169
170 socket.on('ewdjs', handleResponse);
171
172 this.addHandler = function(type, callback) {
173 self.on(type, callback);
174 self.hasEventHandler[type] = callback;
175 };
176
177 this.sub = this.addHandler;
178
179 this.removeHandler = function(type) {
180 var callback = self.hasEventHandler[type];
181 self.removeListener(type, callback);
182 self.hasEventHandler[type] = false;
183 };
184
185 this.send = function(messageObj, callback) {
186
187 if (!this.connected) {
188 callback({
189 message: {
190 error: 'MicroService connection is down',
191 status: {
192 code: 503
193 }
194 }
195 });
196 return;
197 }
198
199 var type = messageObj.type;
200 if (callback) {
201 if (messageObj.ms_requestId) {
202 // add the response handler to the microService handler hash
203
204 ms_response_handlers[messageObj.ms_requestId] = callback;
205
206 //self.once(messageObj.uuid, callback);
207 console.log('callback response handler saved for message ' + messageObj.ms_requestId);
208 }
209 else {
210
211 if (self.hasEventHandler[type] && callback !== self.hasEventHandler[type]) {
212 console.log('callback has changed for type ' + type);
213 self.removeHandler(type);
214 }
215 if (!self.hasEventHandler[type]) {
216 self.addHandler(type, callback);
217 console.log('callback set for type ' + type);
218 }
219 }
220 }
221 socket.emit('ewdjs', messageObj);
222 if (self.log) console.log('socketClient sent: ' + JSON.stringify(messageObj));
223 };
224
225 socket.on('disconnect', function() {
226 console.log('*** server has disconnected socket, probably because it shut down');
227 self.connected = false;
228 self.emit('socketDisconnected');
229 });
230
231}
232
233var socketClient = function() {
234
235 this.application = 'undefined';
236 this.log = false;
237 this.token = false;
238 events.EventEmitter.call(this);
239};
240
241var proto = socketClient.prototype;
242proto.__proto__ = events.EventEmitter.prototype;
243proto.start = start;
244
245module.exports = socketClient;