UNPKG

9.9 kBJavaScriptView Raw
1//модуль для клиента
2'use strict';
3// это клиент
4
5// Зависимости
6let app = require('express')();
7let timestamp = require('time-stamp');
8let _ = require('lodash');
9let ip = require('ip');
10let nanoid = require('nanoid');
11let axios = require('axios');
12const bodyParser = require('body-parser');
13const jwt = require('jsonwebtoken');
14
15// Конфигурация
16const wsName = require('../../package.json').name;
17const wsVersion = require('../../package.json').version;
18const wsClientConfig = require('../../wsClientConfig.json');
19const wsCoreKey = wsClientConfig.wsCoreKey;
20const wsPort = wsClientConfig.wsPort;
21
22let apigwPath = null;
23let tokenForReq = null;
24
25const instanceID = nanoid(10);
26
27
28// Чтение body и cookie
29app.use(bodyParser.json());
30app.use(bodyParser.urlencoded({ extended: true}));
31//app.use(cookieParser());
32
33let socketServer = jwt.decode(wsCoreKey, {complete: true}).payload.wsEventBusAddress;
34let systemName = jwt.decode(wsCoreKey, {complete: true}).payload.systemName;
35const wsType = jwt.decode(wsCoreKey, {complete: true}).payload.wsType;
36// Характеристики инстанса в сессии сокет-соединения
37let socket = require('socket.io-client')(socketServer,{
38 query: {
39 token: wsCoreKey, //jwt
40 wsName: wsName,
41 instanceID: instanceID,
42 wsType: wsType,
43 }
44});
45
46let awaitedEvents = [];
47let awaitedRequests = [];
48
49let wsStartData = {
50 wsName: wsName,
51 wsVersion: wsVersion,
52 awaitedEvents: awaitedEvents,
53 awaitedRequests: awaitedRequests,
54 instanceParams:{
55 instanceID: instanceID,
56 instanceIP: ip.address(),
57 instancePort: wsPort}
58};
59
60
61// Отправляем данные о запущенном сервисе
62function sendStartData(){
63 socket.emit('wsStart', wsStartData);
64}
65
66// При успешном коннекте
67socket.on('connect', function() {
68 setTimeout( sendStartData, 2000);
69 //console.log(wsStartData);
70});
71
72// Сервисы ядра перезапущены
73socket.on('afterCoreRestart', function(data) {
74 //console.log(data);
75 setTimeout( sendStartData, 2000);
76 //console.log(wsStartData);
77});
78
79socket.on('coreIsDisabled', function(data) {
80 console.log(data);
81});
82
83// Сервисы инфраструктуры хапущены\перезапущены
84socket.on('infrastructureStart', function(data) {
85 //console.log(data);
86 if (systemName !=='infrastructure.core'){
87 setTimeout( sendStartData, 2000);
88 }
89
90 //console.log(wsStartData);
91});
92
93// Сервисы инфраструктуры хапущены\перезапущены
94socket.on('infrastructureStop', function(data) {
95 console.log(data);
96});
97
98socket.on('regiseredInSystem', function(data) {
99 console.log('Инстанс сервиса зарегистрирован в системе');
100 //console.log(data);
101 tokenForReq = data.tokenForReq;
102});
103
104socket.on('error', (error) => {
105 console.log(error)
106});
107
108socket.on('apigwPath', function(data) {
109 apigwPath = data.apigwPath
110});
111
112// let on = function (eventName, ...temps) {
113async function on (eventName, ...temps) {
114 let right = {};
115 let onEventAction = null; // функция передаваемая в обработчик выова
116 if (temps.length === 2) {
117 console.log('Есть параметры, проверяем кому доступен/или кому не доступен');
118 if (!temps[0].forFS){right.forFS = 0} else {right.forFS = temps[0].forFS}
119 if (!temps[0].forBS){right.forBS = 0} else {right.forBS = temps[0].forBS}
120 onEventAction = temps[1];
121 } else {
122 console.log('Недоступен никому');
123 right = {forFS: 0, forBS: 0};
124 onEventAction = temps[0];
125 }
126 //console.log(personalEventName);
127 function step1 (data){
128 //console.log(`Получено сообщение с идентификатором: ${data.eventId}`);
129 let dataToChangeEventState = {'eventId':data.eventId,'eventState':'received'};
130 socket.emit('changeEventState', dataToChangeEventState);
131 }
132 async function step2 (data){
133 try {
134 await onEventAction(data);
135 step3(data);
136 } catch (err) {
137 //console.log(`Ошибка обработки по сообщению с идентификатором: ${data.eventId}`);
138 let dataToChangeEventState = {'eventId':data.eventId,'eventState':'error'};
139 socket.emit('changeEventState', dataToChangeEventState);
140 }
141 }
142 function step3 (data){
143 //console.log(`Выполнена обработка по сообщению с идентификатором: ${data.eventId}`);
144 let dataToChangeEventState = {'eventId':data.eventId,'eventState':'succsess'};
145 socket.emit('changeEventState', dataToChangeEventState);
146 }
147 function run (data){
148 step1(data);
149 step2(data);
150 }
151 // Непосредственно сама подписка на событие 'instanceId\eventName' между шиной и сервисом
152 socket.on(eventName, function(data){
153 run(data)
154 });
155 // Регистрация подписки в MQ всех обработчиков, принадлежащих сервису
156 awaitedEvents.push({eventName:eventName, right: right}) // не забыть что был ещё personalEventName: personalEventName ()
157}
158
159function emit (eventName, ...temps) {
160 // !!! todo Здесь заменяем на добавление в emittedEvents
161 //console.log('Вызывается только в момент обращения к методу req');
162 //todo добавить rights
163 let right = {};
164 let data = null;
165 if (temps.length === 2) {
166 //console.log('Есть параметры, проверяем кому доступен/или кому не доступен');
167 if (!temps[0].forFS){right.forFS = 0} else {right.forFS = temps[0].forFS}
168 if (!temps[0].forBS){right.forBS = 0} else {right.forBS = temps[0].forBS}
169 data = temps[1];
170 } else {
171 right = {forFS: 0, forBS: 0};
172 data = temps[0];
173 }
174 let eventData = {'eventName':eventName, right, data};
175 //console.log(eventData);
176 socket.emit('universalEvent', eventData);
177}
178
179// Проверка что запрос пришел именно через apigw
180app.use(function(req, res, next){
181 if (req.method ==='OPTIONS'){
182 next();
183 }
184 else {
185 //console.log(`Промежуточная функция до вызова метода`);
186 // if ((req.method ==='GET' || req.method ==='POST' || req.method ==='PUT') && ( req.headers.toinstanceid === instanceID)){
187 if ((['GET', 'POST', 'PUT', 'DELETE'].includes(req.method)) && ( req.headers.toinstanceid === instanceID)){
188 next();
189 } else {
190 return res.send({result: 'error', reason: `Запрос к сервису ${wsName} минуя apigw`})
191 }
192
193 }
194});
195
196async function get (name, next) {
197 awaitedRequests.push({methodName:name, methodType: 'GET'});
198 app.get(name, next)
199}
200async function post (name, next) {
201 awaitedRequests.push({methodName:name, methodType: 'POST'});
202 app.post(name, next)
203}
204async function put (name, next) {
205 awaitedRequests.push({methodName:name, methodType: 'PUT'});
206 app.put(name, next)
207}
208async function del (name, next) {
209 awaitedRequests.push({methodName:name, methodType: 'DELETE'});
210 app.delete(name, next)
211}
212
213async function callGet (wsNameAndMethod, axiParams ) {
214 let fullPath = `${apigwPath}/${wsNameAndMethod}`;
215 const axiosRes = await axios.get(fullPath, {params:axiParams, headers: {tokenForReq:tokenForReq}});
216 return axiosRes.data
217}
218
219async function callPost (wsNameAndMethod, axiParams ) {
220 let fullPath = `${apigwPath}/${wsNameAndMethod}`;
221 const axiosRes = await axios.post(fullPath, axiParams, {headers: {tokenForReq:tokenForReq}});
222 return axiosRes.data
223}
224
225async function callPut (wsNameAndMethod, axiParams ) {
226 let fullPath = `${apigwPath}/${wsNameAndMethod}`;
227 const axiosRes = await axios.put(fullPath, axiParams, {headers: {tokenForReq:tokenForReq}});
228 return axiosRes.data
229}
230
231async function callDel (wsNameAndMethod, axiParams ) {
232 let fullPath = `${apigwPath}/${wsNameAndMethod}`;
233
234 const axiosRes = await axios.delete(fullPath, {params:axiParams, headers: {tokenForReq:tokenForReq}});
235 return axiosRes.data
236}
237
238async function callAxiGet (axiPath, axiParams ) {
239 let allParams = {fromWsName:wsName, fromInstanceID:instanceID};
240 if (axiParams !== undefined) {
241 Object.assign(axiParams, allParams);
242 }
243 const axiosRes = await axios.get(axiPath, {params:allParams});
244 return axiosRes.data
245}
246
247async function callAxiPost (axiosPath) {
248 const axiosRes = await axios.post(axiosPath);
249 return axiosRes.data
250}
251
252
253app.listen(wsPort, function(){
254 console.log(`${timestamp('[DD-MM-YYYY HH:mm:ss.ms]')}: Сервис ${wsName} запущен на ${wsPort} порту`)
255});
256
257module.exports = {
258// Работа с запросами
259 // Обработка входящих запросов
260 get: get,
261 post: post,
262 put: put,
263 del: del,
264 // Для вызова межсервисных апи
265 callGet: callGet,
266 callPost: callPost,
267 callPut: callPut,
268 callDel: callDel,
269 // Для вызова внешних апи
270 callAxiGet: callAxiGet,
271 callAxiPost: callAxiPost,
272// Работа с событиями
273 on: on,
274 emit: emit
275};
\No newline at end of file