exodus-framework 2.0.893 → 2.0.894
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/lib/app/classes/service.d.ts +11 -2
- package/lib/app/classes/service.d.ts.map +1 -1
- package/lib/app/classes/service.js +137 -5
- package/lib/app/exodus.d.ts +1 -0
- package/lib/app/exodus.d.ts.map +1 -1
- package/lib/app/exodus.js +24 -3
- package/lib/services/express.d.ts +1 -2
- package/lib/services/express.d.ts.map +1 -1
- package/lib/services/express.js +3 -4
- package/lib/services/log.d.ts +0 -1
- package/lib/services/log.d.ts.map +1 -1
- package/lib/services/log.js +0 -1
- package/lib/services/rabitmq.d.ts +13 -5
- package/lib/services/rabitmq.d.ts.map +1 -1
- package/lib/services/rabitmq.js +66 -46
- package/lib/services/redis.d.ts +9 -2
- package/lib/services/redis.d.ts.map +1 -1
- package/lib/services/redis.js +46 -23
- package/lib/services/sequelize.d.ts +10 -1
- package/lib/services/sequelize.d.ts.map +1 -1
- package/lib/services/sequelize.js +42 -21
- package/lib/services/socket.d.ts +2 -1
- package/lib/services/socket.d.ts.map +1 -1
- package/lib/services/socket.js +15 -8
- package/lib/services/task/queue/QueueService.d.ts +1 -4
- package/lib/services/task/queue/QueueService.d.ts.map +1 -1
- package/lib/services/task/queue/QueueService.js +5 -27
- package/lib/services/task/scheduler/SchedulerService.d.ts +1 -4
- package/lib/services/task/scheduler/SchedulerService.d.ts.map +1 -1
- package/lib/services/task/scheduler/SchedulerService.js +4 -31
- package/package.json +1 -1
@@ -7,17 +7,26 @@ type TStaticService<S> = NonConstructor<typeof Service> & {
|
|
7
7
|
declare abstract class Service<D = any> extends Managed {
|
8
8
|
static instance: Service;
|
9
9
|
private eCom;
|
10
|
+
protected attemptDelay: number;
|
10
11
|
constructor();
|
11
12
|
static singleton<S extends Service>(this: TStaticService<S>): S;
|
12
13
|
static getService<S extends Service>(this: TStaticService<S>): S;
|
13
|
-
|
14
|
-
protected onServiceInit(): Promise<void>;
|
14
|
+
onServiceInit(): Promise<void>;
|
15
15
|
protected onServiceMasterInit(): Promise<void>;
|
16
16
|
protected onServiceClusterInit(): Promise<void>;
|
17
|
+
onStart(): Promise<boolean>;
|
18
|
+
onStartMaster(): Promise<boolean>;
|
19
|
+
onStartCluster(): Promise<boolean>;
|
20
|
+
onStartAttempt(): Promise<void>;
|
21
|
+
onStartFail(): Promise<void>;
|
22
|
+
onStartSuccessfully(): Promise<void>;
|
23
|
+
onExodusStarted(): Promise<void>;
|
17
24
|
protected sendToServiceCluster(clusterId: number, event: string, data: D): void;
|
18
25
|
protected sendToServiceMaster(event: string, data: D): void;
|
19
26
|
protected onServiceMasterReceived(_worker: Worker, _eventKey: string, _data: any): void;
|
20
27
|
protected onServiceClusterReceived(_eventKey: string, _data: any): void;
|
28
|
+
isStartFailed(): boolean;
|
29
|
+
getAttemptDelay(): number;
|
21
30
|
}
|
22
31
|
export default Service;
|
23
32
|
//# sourceMappingURL=service.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/app/classes/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD,OAAO,OAAO,MAAM,WAAW,CAAC;AAEhC,KAAK,cAAc,CAAC,CAAC,IAAI,cAAc,CAAC,OAAO,OAAO,CAAC,GAAG;IACxD,QAAQ,CAAC,CAAC;CACX,CAAC;AAWF,uBAAe,OAAO,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,OAAO;IAC7C,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,IAAI,CAA6B;;
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/app/classes/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD,OAAO,OAAO,MAAM,WAAW,CAAC;AAEhC,KAAK,cAAc,CAAC,CAAC,IAAI,cAAc,CAAC,OAAO,OAAO,CAAC,GAAG;IACxD,QAAQ,CAAC,CAAC;CACX,CAAC;AAWF,uBAAe,OAAO,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,OAAO;IAC7C,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,IAAI,CAA6B;IACzC,SAAS,CAAC,YAAY,SAAQ;;IAgB9B,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,GAEjC,CAAC;IAU3B,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;IAY/C,aAAa;cAyBV,mBAAmB;cASnB,oBAAoB;IAYvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAW3B,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAGjC,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAQlC,cAAc;IAMd,WAAW;IACX,mBAAmB;IAQnB,eAAe;IAW5B,SAAS,CAAC,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAWxE,SAAS,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAapD,SAAS,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAWhF,SAAS,CAAC,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAWzD,aAAa,IAAI,OAAO;IAIxB,eAAe;CAGvB;AACD,eAAe,OAAO,CAAC"}
|
@@ -21,21 +21,49 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
21
21
|
class Service extends _managed.default {
|
22
22
|
static instance;
|
23
23
|
eCom;
|
24
|
+
attemptDelay = 1000; // Tempo de espera para cada tentativa de inicialização
|
25
|
+
|
24
26
|
constructor() {
|
25
27
|
super();
|
26
28
|
this.eCom = new _communication.default(this.constructor.name);
|
27
29
|
}
|
30
|
+
|
31
|
+
/**
|
32
|
+
* Mesmo que getService
|
33
|
+
*
|
34
|
+
* @deprecated Use getService
|
35
|
+
* @static
|
36
|
+
* @template S
|
37
|
+
* @param {TStaticService<S>} this
|
38
|
+
* @memberof Service
|
39
|
+
*/
|
28
40
|
static singleton() {
|
29
41
|
if (!this.instance) this.instance = new this();
|
30
42
|
return this.instance;
|
31
43
|
}
|
44
|
+
/**
|
45
|
+
* Obtem a instância atual deste serviço
|
46
|
+
*
|
47
|
+
* @static
|
48
|
+
* @template S
|
49
|
+
* @param {TStaticService<S>} this
|
50
|
+
* @memberof Service
|
51
|
+
*/
|
32
52
|
static getService() {
|
33
53
|
return this.singleton();
|
34
54
|
}
|
35
|
-
|
55
|
+
|
56
|
+
/**
|
57
|
+
* Chamado antes de onStart, serve como preparação para a inicialização do serviços
|
58
|
+
* pré fetchs e etc...
|
59
|
+
* Diferente de onStart, este é chamado apenas uma vez
|
60
|
+
*
|
61
|
+
* @public
|
62
|
+
* @memberof Service
|
63
|
+
*/
|
64
|
+
async onServiceInit() {
|
36
65
|
this.eCom.on(_service.eEventCommunication.RECEIVED_CLUSTER_MESSAGE, this.onServiceMasterReceived.bind(this));
|
37
66
|
this.eCom.on(_service.eEventCommunication.RECEIVED_MASTER_MESSAGE, this.onServiceClusterReceived.bind(this));
|
38
|
-
await this.onServiceInit();
|
39
67
|
if (this.isMaster()) {
|
40
68
|
await this.onServiceMasterInit();
|
41
69
|
}
|
@@ -43,26 +71,130 @@ class Service extends _managed.default {
|
|
43
71
|
await this.onServiceClusterInit();
|
44
72
|
}
|
45
73
|
}
|
46
|
-
|
47
|
-
|
48
|
-
|
74
|
+
/**
|
75
|
+
* Mesmo que onServiceInit, mas do lado do master
|
76
|
+
*
|
77
|
+
* @protected
|
78
|
+
* @memberof Service
|
79
|
+
*/
|
49
80
|
async onServiceMasterInit() {
|
50
81
|
return;
|
51
82
|
}
|
83
|
+
/**
|
84
|
+
* Mesmo que onServiceInit, mas do lado do cluster
|
85
|
+
*
|
86
|
+
* @protected
|
87
|
+
* @memberof Service
|
88
|
+
*/
|
52
89
|
async onServiceClusterInit() {
|
53
90
|
return;
|
54
91
|
}
|
92
|
+
|
93
|
+
// !future
|
94
|
+
/**
|
95
|
+
* Inicia o procedimento de inicialização do seriviço
|
96
|
+
* usado para conexões, fetchs e etc...
|
97
|
+
*
|
98
|
+
* @return {*} {Promise<boolean>}
|
99
|
+
* @memberof Service
|
100
|
+
*/
|
101
|
+
async onStart() {
|
102
|
+
if (this.isMaster()) {
|
103
|
+
return this.onStartMaster();
|
104
|
+
}
|
105
|
+
if (this.isCluster()) {
|
106
|
+
return this.onStartCluster();
|
107
|
+
}
|
108
|
+
return true;
|
109
|
+
}
|
110
|
+
async onStartMaster() {
|
111
|
+
return true;
|
112
|
+
}
|
113
|
+
async onStartCluster() {
|
114
|
+
return true;
|
115
|
+
}
|
116
|
+
/**
|
117
|
+
* Quando uma nova tentativa de inicialização é executada
|
118
|
+
*
|
119
|
+
* @memberof Service
|
120
|
+
*/
|
121
|
+
async onStartAttempt() {}
|
122
|
+
/**
|
123
|
+
* Executado quando a inicialização deste serviço falhar
|
124
|
+
*
|
125
|
+
* @memberof Service
|
126
|
+
*/
|
127
|
+
async onStartFail() {}
|
128
|
+
async onStartSuccessfully() {}
|
129
|
+
|
130
|
+
/**
|
131
|
+
* Quando todos os serviços foram carregados
|
132
|
+
* Pode ser usado para eliminar dados utilizados na inicialização
|
133
|
+
*
|
134
|
+
* @memberof Service
|
135
|
+
*/
|
136
|
+
async onExodusStarted() {}
|
137
|
+
|
138
|
+
/**
|
139
|
+
* Enviar dados para a instância deste serviço no cluster
|
140
|
+
*
|
141
|
+
* @protected
|
142
|
+
* @param {number} clusterId
|
143
|
+
* @param {string} event
|
144
|
+
* @param {D} data
|
145
|
+
* @memberof Service
|
146
|
+
*/
|
55
147
|
sendToServiceCluster(clusterId, event, data) {
|
56
148
|
this.eCom.sendMessageToCluster(clusterId, event, data);
|
57
149
|
}
|
150
|
+
/**
|
151
|
+
* Enviar dados para a instancia deste serviço no master
|
152
|
+
*
|
153
|
+
* @protected
|
154
|
+
* @param {string} event
|
155
|
+
* @param {D} data
|
156
|
+
* @memberof Service
|
157
|
+
*/
|
58
158
|
sendToServiceMaster(event, data) {
|
59
159
|
this.eCom.sendMessageToMaster(event, data);
|
60
160
|
}
|
161
|
+
|
162
|
+
/**
|
163
|
+
* Quando dados enviados do serviço no master para a instância no cluster
|
164
|
+
*
|
165
|
+
* @protected
|
166
|
+
* @param {Worker} _worker
|
167
|
+
* @param {string} _eventKey
|
168
|
+
* @param {*} _data
|
169
|
+
* @memberof Service
|
170
|
+
*/
|
61
171
|
onServiceMasterReceived(_worker, _eventKey, _data) {
|
62
172
|
return;
|
63
173
|
}
|
174
|
+
/**
|
175
|
+
* Quando dados enviados do serviço no cluster para a instância no master
|
176
|
+
*
|
177
|
+
* @protected
|
178
|
+
* @param {string} _eventKey
|
179
|
+
* @param {*} _data
|
180
|
+
* @memberof Service
|
181
|
+
*/
|
64
182
|
onServiceClusterReceived(_eventKey, _data) {
|
65
183
|
return;
|
66
184
|
}
|
185
|
+
|
186
|
+
/**
|
187
|
+
* Reporta a condição de inicialização falhou
|
188
|
+
* se verdadeiro, o Exodus irá cancelar a inicialização deste serviço e chamar onStartFail
|
189
|
+
*
|
190
|
+
* @return {*} {boolean}
|
191
|
+
* @memberof Service
|
192
|
+
*/
|
193
|
+
isStartFailed() {
|
194
|
+
return false;
|
195
|
+
}
|
196
|
+
getAttemptDelay() {
|
197
|
+
return this.attemptDelay;
|
198
|
+
}
|
67
199
|
}
|
68
200
|
var _default = exports.default = Service;
|
package/lib/app/exodus.d.ts
CHANGED
package/lib/app/exodus.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"exodus.d.ts","sourceRoot":"","sources":["../../src/app/exodus.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,OAAO,EAAE,MAAM,GAAG,CAAC;AAC1C,OAAO,OAAO,MAAM,mBAAmB,CAAC;AAExC,OAAO,YAAY,MAAM,YAAY,CAAC;AAUtC,cAAM,MAAO,SAAQ,OAAO;IAC1B,OAAO,CAAC,QAAQ,CAAY;gBAEhB,QAAQ,EAAE,YAAY;IAOrB,KAAK;
|
1
|
+
{"version":3,"file":"exodus.d.ts","sourceRoot":"","sources":["../../src/app/exodus.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,OAAO,EAAE,MAAM,GAAG,CAAC;AAC1C,OAAO,OAAO,MAAM,mBAAmB,CAAC;AAExC,OAAO,YAAY,MAAM,YAAY,CAAC;AAUtC,cAAM,MAAO,SAAQ,OAAO;IAC1B,OAAO,CAAC,QAAQ,CAAY;gBAEhB,QAAQ,EAAE,YAAY;IAOrB,KAAK;IAelB,OAAO,CAAC,cAAc;IAef,QAAQ,CAAC,OAAO,EAAE,OAAO,OAAO;YAGzB,YAAY;YAiBZ,YAAY;CAoB3B;AACD,eAAe,MAAM,CAAC"}
|
package/lib/app/exodus.js
CHANGED
@@ -28,12 +28,13 @@ class Exodus extends _managed.default {
|
|
28
28
|
_event.default.Start();
|
29
29
|
if (this.isMaster()) {
|
30
30
|
this.log(`Iniciando em Master ${process.pid}`);
|
31
|
+
await this.initServices();
|
31
32
|
this.createClusters();
|
32
33
|
}
|
33
34
|
if (this.isCluster()) {
|
34
35
|
this.log(`Iniciando em Cluster ${this.getWorkId()}`);
|
36
|
+
await this.initServices();
|
35
37
|
}
|
36
|
-
this.initServices();
|
37
38
|
}
|
38
39
|
|
39
40
|
//# Cluster Management
|
@@ -57,14 +58,34 @@ class Exodus extends _managed.default {
|
|
57
58
|
async initServices() {
|
58
59
|
for (const service of this.services) {
|
59
60
|
try {
|
60
|
-
await
|
61
|
+
await this.startService(service);
|
61
62
|
} catch (error) {
|
62
63
|
new _.ErrorHandler(`Erro on starting service: ${service.constructor.name} | reason: ${error.message || 'unknow'}`, error);
|
63
64
|
this.log('Não foi possível iniciar os serviços', 'warning');
|
64
|
-
return;
|
65
|
+
return false;
|
65
66
|
}
|
66
67
|
}
|
67
68
|
this.log('Serviços iniciados');
|
69
|
+
return true;
|
70
|
+
}
|
71
|
+
async startService(service) {
|
72
|
+
let starting = true;
|
73
|
+
await service.onServiceInit();
|
74
|
+
while (starting) {
|
75
|
+
if (service.isStartFailed()) {
|
76
|
+
await service.onStartFail();
|
77
|
+
starting = false;
|
78
|
+
break;
|
79
|
+
}
|
80
|
+
if (await service.onStart()) {
|
81
|
+
starting = false;
|
82
|
+
await service.onStartSuccessfully();
|
83
|
+
break;
|
84
|
+
} else {
|
85
|
+
await service.onStartAttempt();
|
86
|
+
}
|
87
|
+
await new Promise(resolve => setTimeout(() => resolve(true), service.getAttemptDelay()));
|
88
|
+
}
|
68
89
|
}
|
69
90
|
}
|
70
91
|
var _default = exports.default = Exodus;
|
@@ -5,8 +5,7 @@ import { THttpResponse } from '../contracts/http';
|
|
5
5
|
declare class ExpressService extends Service {
|
6
6
|
private server;
|
7
7
|
private mainRouter;
|
8
|
-
|
9
|
-
createExpress(): Promise<unknown>;
|
8
|
+
onStartCluster(): Promise<boolean>;
|
10
9
|
getHttpServer(): http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>;
|
11
10
|
sendResponse(objResponse: THttpResponse, res: Response, next?: NextFunction): void;
|
12
11
|
responseTypeMiddleware(req: Request, res: Response, next: NextFunction): void;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../../src/services/express.ts"],"names":[],"mappings":"AACA,OAAgB,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGlE,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAI7B,OAAO,OAAO,MAAM,wBAAwB,CAAC;AAC7C,OAAO,EAAqB,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGrE,cAAM,cAAe,SAAQ,OAAO;IAClC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,UAAU,CAAS;
|
1
|
+
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../../src/services/express.ts"],"names":[],"mappings":"AACA,OAAgB,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGlE,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAI7B,OAAO,OAAO,MAAM,wBAAwB,CAAC;AAC7C,OAAO,EAAqB,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGrE,cAAM,cAAe,SAAQ,OAAO;IAClC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,UAAU,CAAS;IAGd,cAAc;IA0B3B,aAAa;IAIb,YAAY,CAAC,WAAW,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,YAAY;IAiC3E,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY;IAMtE,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ;IAWzC,0BAA0B,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY;IAUtF,2BAA2B,QACpB,GAAG,OACH,OAAO,OACP,QAAQ,KAEV,YAAY,mBAoBf;IAEI,YAAY,CAAC,MAAM,EAAE,MAAM;IAyBjC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM;CAGrC;AAED,eAAe,cAAc,CAAC"}
|
package/lib/services/express.js
CHANGED
@@ -22,10 +22,9 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
22
22
|
class ExpressService extends _service.default {
|
23
23
|
server;
|
24
24
|
mainRouter;
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
async createExpress() {
|
25
|
+
|
26
|
+
//!Deve ser iniciado no cluster, pois no master causa erro de port bind
|
27
|
+
async onStartCluster() {
|
29
28
|
return new Promise(resolve => {
|
30
29
|
if (!this.mainRouter) throw new Error('Need router'); //!sem router
|
31
30
|
|
package/lib/services/log.d.ts
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/services/log.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,OAAO,EAAE,MAAM,QAAQ,CAAC;AAI/C,cAAM,UAAW,SAAQ,OAAO;IACxB,
|
1
|
+
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/services/log.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,OAAO,EAAE,MAAM,QAAQ,CAAC;AAI/C,cAAM,UAAW,SAAQ,OAAO;IACxB,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC3B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAC9B;CAeJ;AAED,eAAe,UAAU,CAAC"}
|
package/lib/services/log.js
CHANGED
@@ -10,7 +10,6 @@ var _Log = require("../models/Log");
|
|
10
10
|
var _sequelize = _interopRequireDefault(require("./sequelize"));
|
11
11
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
12
12
|
class LogService extends _app.Service {
|
13
|
-
async onServiceInit() {}
|
14
13
|
async register(tenantId, data) {
|
15
14
|
try {
|
16
15
|
const Entity = await _sequelize.default.singleton().getModel(_Log.Log, tenantId);
|
@@ -4,15 +4,23 @@ import { TMessageQueueDataMap, TMessagingQueueEventList, TMessagingQueueHandler
|
|
4
4
|
declare class RabbitMQService extends Service {
|
5
5
|
connection: Connection;
|
6
6
|
channel: Channel;
|
7
|
-
private connectionRetries;
|
8
7
|
private mainRouter;
|
9
8
|
private eventCustomListeners;
|
9
|
+
private exchangeName;
|
10
|
+
private queueName;
|
11
|
+
private isReconnecting;
|
12
|
+
private isConnected;
|
13
|
+
private connectionRetries;
|
14
|
+
private connectionMaxRetries;
|
10
15
|
onServiceClusterInit(): Promise<void>;
|
16
|
+
onStartCluster(): Promise<boolean>;
|
17
|
+
onStartAttempt(): Promise<void>;
|
18
|
+
onStartFail(): Promise<void>;
|
19
|
+
isStartFailed(): boolean;
|
20
|
+
connect(): Promise<boolean>;
|
11
21
|
registerHandles(): Promise<void>;
|
12
|
-
|
13
|
-
|
14
|
-
reconnect(): void;
|
15
|
-
sendToQueue<K extends keyof TMessageQueueDataMap>(topic: K, data: TMessageQueueDataMap[K]): Promise<`${string}-${string}-${string}-${string}-${string}`>;
|
22
|
+
private setupErrorHandles;
|
23
|
+
sendToQueue<K extends keyof TMessageQueueDataMap>(topic: K, data: TMessageQueueDataMap[K]): Promise<false | `${string}-${string}-${string}-${string}-${string}`>;
|
16
24
|
consumeFromQueue(msg: client.ConsumeMessage): Promise<void>;
|
17
25
|
static registerRouter(router: TMessagingQueueEventList): void;
|
18
26
|
onTransaction<K extends keyof TMessageQueueDataMap>(topic: K, callBack: TMessagingQueueHandler<K>): void;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"rabitmq.d.ts","sourceRoot":"","sources":["../../src/services/rabitmq.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGtD,OAAO,OAAO,MAAM,wBAAwB,CAAC;AAC7C,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACvB,MAAM,cAAc,CAAC;
|
1
|
+
{"version":3,"file":"rabitmq.d.ts","sourceRoot":"","sources":["../../src/services/rabitmq.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGtD,OAAO,OAAO,MAAM,wBAAwB,CAAC;AAC7C,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACvB,MAAM,cAAc,CAAC;AAUtB,cAAM,eAAgB,SAAQ,OAAO;IACnC,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,oBAAoB,CAA0D;IAEtF,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,oBAAoB,CAAK;IAE3B,oBAAoB;IAUb,cAAc;IAId,cAAc;IAId,WAAW;IAIjB,aAAa;IAIP,OAAO;IAgCP,eAAe;IAQ5B,OAAO,CAAC,iBAAiB;IAYnB,WAAW,CAAC,CAAC,SAAS,MAAM,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAoBzF,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc;IA2BjD,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,wBAAwB;IAI/C,aAAa,CAAC,CAAC,SAAS,MAAM,oBAAoB,EACvD,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,sBAAsB,CAAC,CAAC,CAAC;IAY9B,cAAc,CAAC,CAAC,SAAS,MAAM,oBAAoB,EAAE,KAAK,EAAE,CAAC;IAW7D,YAAY,CACjB,CAAC,SAAS,MAAM,oBAAoB,EACpC,CAAC,SAAS,MAAM,oBAAoB,EACpC,IAAI,EAAE;QACN,IAAI,EAAE;YAAE,KAAK,EAAE,CAAC,CAAC;YAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAA;SAAE,CAAC;QAClD,MAAM,EAAE;YACN,KAAK,EAAE,CAAC,CAAC;YACT,QAAQ,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAAC;YACpC,SAAS,EAAE,MAAM,IAAI,CAAC;YACtB,OAAO,CAAC,EAAE,MAAM,CAAC;SAClB,CAAC;KACH;CAkBF;AAED,eAAe,eAAe,CAAC"}
|
package/lib/services/rabitmq.js
CHANGED
@@ -9,6 +9,7 @@ var _crypto = require("crypto");
|
|
9
9
|
var _app = require("../app");
|
10
10
|
var _service = _interopRequireDefault(require("../app/classes/service"));
|
11
11
|
var _messaging = _interopRequireDefault(require("../routes/messaging"));
|
12
|
+
var _utils = require("../utils");
|
12
13
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
13
14
|
/**
|
14
15
|
* Serviço de Mensageria
|
@@ -20,100 +21,119 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
20
21
|
class RabbitMQService extends _service.default {
|
21
22
|
connection;
|
22
23
|
channel;
|
23
|
-
connectionRetries;
|
24
24
|
mainRouter;
|
25
25
|
eventCustomListeners;
|
26
|
+
exchangeName;
|
27
|
+
queueName;
|
28
|
+
isReconnecting = false; // Flag para evitar múltiplas tentativas simultâneas de reconexão
|
29
|
+
isConnected = false; // Flag para controlar o estado da conexão
|
30
|
+
connectionRetries = 1; // quantidade de tentativas de reconexão
|
31
|
+
connectionMaxRetries = 3; // quantidade de tentativas de reconexão
|
26
32
|
|
27
|
-
//# Initialization
|
28
33
|
async onServiceClusterInit() {
|
29
|
-
this.eventCustomListeners = new Map();
|
30
|
-
this.connectionRetries = 0;
|
31
34
|
if (!this.mainRouter) throw new Error('Need router'); //!sem router
|
35
|
+
|
36
|
+
this.exchangeName = _app.Core.settings.getMessaging().exchanges.main;
|
37
|
+
this.queueName = _app.Core.settings.getAppication().appId;
|
38
|
+
this.eventCustomListeners = new Map();
|
32
39
|
this.mainRouter = {
|
33
40
|
..._messaging.default,
|
34
41
|
...this.mainRouter
|
35
42
|
}; // # Register native router
|
36
|
-
|
43
|
+
this.attemptDelay = 5 * 1000;
|
37
44
|
}
|
38
|
-
async
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
+
async onStartCluster() {
|
46
|
+
return this.connect();
|
47
|
+
}
|
48
|
+
async onStartAttempt() {
|
49
|
+
this.connectionRetries += 1;
|
50
|
+
}
|
51
|
+
async onStartFail() {
|
52
|
+
this.log(`Not possible to connect RabitMQ`, 'danger');
|
53
|
+
}
|
54
|
+
isStartFailed() {
|
55
|
+
return this.connectionRetries > this.connectionMaxRetries;
|
45
56
|
}
|
46
57
|
async connect() {
|
58
|
+
if (this.isConnected) return true;
|
59
|
+
if (this.isReconnecting) return false;
|
60
|
+
this.log(`⌛️ Connecting to Rabbit-MQ Server: ${this.connectionRetries}/${this.connectionMaxRetries}`);
|
61
|
+
this.isReconnecting = true;
|
47
62
|
try {
|
48
|
-
|
49
|
-
this.connection = await _amqplib.default.connect(
|
50
|
-
this.log(`✅ Rabbit MQ Connection is ready`);
|
63
|
+
const query = `amqp://${_app.Core.settings.getMessaging().user}:${_app.Core.settings.getMessaging().pass}@${_app.Core.settings.getMessaging().host}:5672`;
|
64
|
+
this.connection = await _amqplib.default.connect(query);
|
51
65
|
this.channel = await this.connection.createChannel();
|
52
|
-
|
66
|
+
const mainExchanges = _app.Core.settings.getMessaging().exchanges.main;
|
67
|
+
await this.channel.assertExchange(mainExchanges, 'topic', {
|
53
68
|
durable: true
|
54
69
|
});
|
55
70
|
await this.channel.assertQueue(_app.Core.settings.getAppication().appId, {
|
56
71
|
durable: true
|
57
72
|
});
|
58
|
-
this.
|
59
|
-
this.
|
60
|
-
this.log(`🛸 Created RabbitMQ Channel successfully`);
|
73
|
+
this.isConnected = true;
|
74
|
+
this.isReconnecting = false;
|
61
75
|
this.connectionRetries = 0;
|
76
|
+
this.setupErrorHandles();
|
77
|
+
await this.registerHandles();
|
78
|
+
this.log(`✅ Rabbit MQ Connection is ready`);
|
79
|
+
return true;
|
62
80
|
} catch (error) {
|
63
|
-
|
81
|
+
(0, _utils.logger)().error(error, `Not connected to MQ Server`);
|
82
|
+
this.isReconnecting = false;
|
83
|
+
return false;
|
64
84
|
}
|
65
85
|
}
|
66
|
-
|
86
|
+
async registerHandles() {
|
87
|
+
for (const topic of Object.keys(this.mainRouter)) {
|
88
|
+
await this.channel.bindQueue(this.queueName, this.exchangeName, topic);
|
89
|
+
}
|
90
|
+
await this.channel.consume(this.queueName, this.consumeFromQueue.bind(this), {
|
91
|
+
noAck: false
|
92
|
+
});
|
93
|
+
}
|
94
|
+
setupErrorHandles() {
|
67
95
|
this.channel.on('error', err => {
|
68
96
|
new _app.ErrorHandler('falha no canal rabitmq', err);
|
69
|
-
this.
|
97
|
+
this.isConnected = false;
|
70
98
|
});
|
71
99
|
this.channel.on('close', err => {
|
72
|
-
new _app.ErrorHandler('
|
73
|
-
this.
|
100
|
+
new _app.ErrorHandler('o canal rabitmq foi fechado', err);
|
101
|
+
this.isConnected = false;
|
74
102
|
});
|
75
103
|
}
|
76
|
-
reconnect() {
|
77
|
-
if (this.connectionRetries >= 3) {
|
78
|
-
throw new Error(`Not possible to connect RabitMQ`);
|
79
|
-
}
|
80
|
-
setTimeout(() => {
|
81
|
-
this.connectionRetries += 1;
|
82
|
-
this.log('Tryning to connect RabbitMQ', 'warning');
|
83
|
-
this.connect();
|
84
|
-
}, 5000);
|
85
|
-
}
|
86
104
|
|
87
105
|
//# Common
|
88
106
|
async sendToQueue(topic, data) {
|
89
107
|
try {
|
90
|
-
if (!this.
|
91
|
-
|
108
|
+
if (!this.isConnected) {
|
109
|
+
this.log('RabbitMQ is not connected. Message not sent.');
|
110
|
+
return false;
|
92
111
|
}
|
93
|
-
const
|
94
|
-
|
112
|
+
const messageId = (0, _crypto.randomUUID)();
|
113
|
+
const packeg = Buffer.from(JSON.stringify({
|
95
114
|
data,
|
96
115
|
serviceId: _app.Core.settings.getAppication().appId
|
97
|
-
}))
|
98
|
-
|
116
|
+
}));
|
117
|
+
this.channel.publish(this.exchangeName, topic, packeg, {
|
118
|
+
messageId,
|
99
119
|
persistent: true
|
100
120
|
});
|
101
|
-
return
|
121
|
+
return messageId;
|
102
122
|
} catch (error) {
|
103
123
|
new _app.ErrorHandler('Houve um erro no envio de uma mensagem para o rabitmq', error);
|
104
124
|
}
|
105
125
|
}
|
106
126
|
async consumeFromQueue(msg) {
|
127
|
+
if (!this.isConnected) return;
|
107
128
|
if (!msg) {
|
108
|
-
|
129
|
+
this.log(`Invalid incoming message in`);
|
130
|
+
return;
|
109
131
|
}
|
110
132
|
try {
|
111
133
|
const topic = msg.fields.routingKey;
|
112
134
|
const content = JSON.parse(msg.content.toString());
|
113
135
|
const callBack = this.mainRouter[topic];
|
114
|
-
if (callBack) {
|
115
|
-
callBack(content.data, () => {}, content.serviceId, msg.properties.messageId);
|
116
|
-
}
|
136
|
+
if (callBack) callBack(content.data, () => {}, content.serviceId, msg.properties.messageId);
|
117
137
|
this.channel.ack(msg); //# the next function is temporary and not confirm ack
|
118
138
|
|
119
139
|
if (this.eventCustomListeners.has(topic)) {
|
@@ -122,7 +142,7 @@ class RabbitMQService extends _service.default {
|
|
122
142
|
}
|
123
143
|
} catch (error) {
|
124
144
|
new _app.ErrorHandler('Error on parsing message from queue', error);
|
125
|
-
this.channel.nack(msg, false,
|
145
|
+
this.channel.nack(msg, false, true); // Reenfileira para nova tentativa
|
126
146
|
}
|
127
147
|
}
|
128
148
|
static registerRouter(router) {
|
package/lib/services/redis.d.ts
CHANGED
@@ -2,14 +2,21 @@ import Service from '../app/classes/service';
|
|
2
2
|
import { RedisCache } from '../app/classes/cache';
|
3
3
|
declare class RedisService extends Service {
|
4
4
|
private client;
|
5
|
+
private isReconnecting;
|
6
|
+
private isConnected;
|
7
|
+
private connectionRetries;
|
8
|
+
private connectionMaxRetries;
|
5
9
|
onServiceInit(): Promise<void>;
|
10
|
+
onStart(): Promise<boolean>;
|
11
|
+
onStartAttempt(): Promise<void>;
|
12
|
+
onStartFail(): Promise<void>;
|
13
|
+
isStartFailed(): boolean;
|
6
14
|
private connect;
|
7
|
-
|
15
|
+
private setupErrorHandles;
|
8
16
|
setValue(key: string, value: string): Promise<void>;
|
9
17
|
getValue(key: string): Promise<string | null>;
|
10
18
|
deleteValue(key: string): Promise<void>;
|
11
19
|
createCache<T>(key: string): RedisCache<T>;
|
12
|
-
private onClientError;
|
13
20
|
}
|
14
21
|
export default RedisService;
|
15
22
|
//# sourceMappingURL=redis.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../src/services/redis.ts"],"names":[],"mappings":"AAEA,OAAO,OAAO,MAAM,wBAAwB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;
|
1
|
+
{"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../src/services/redis.ts"],"names":[],"mappings":"AAEA,OAAO,OAAO,MAAM,wBAAwB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAUlD,cAAM,YAAa,SAAQ,OAAO;IAChC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,oBAAoB,CAAK;IAEpB,aAAa;IAIb,OAAO;IAIP,cAAc;IAId,WAAW;IAIjB,aAAa;YAIN,OAAO;IA4BrB,OAAO,CAAC,iBAAiB;IAQnB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAGnD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI7C,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAGtC,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM;CAGlC;AAED,eAAe,YAAY,CAAC"}
|
package/lib/services/redis.js
CHANGED
@@ -8,6 +8,7 @@ var _redis = require("redis");
|
|
8
8
|
var _app = require("../app");
|
9
9
|
var _service = _interopRequireDefault(require("../app/classes/service"));
|
10
10
|
var _cache = require("../app/classes/cache");
|
11
|
+
var _utils = require("../utils");
|
11
12
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
12
13
|
/**
|
13
14
|
* Serviço de cache
|
@@ -18,29 +19,56 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
18
19
|
*/
|
19
20
|
class RedisService extends _service.default {
|
20
21
|
client;
|
22
|
+
isReconnecting = false; // Flag para evitar múltiplas tentativas simultâneas de reconexão
|
23
|
+
isConnected = false; // Flag para controlar o estado da conexão
|
24
|
+
connectionRetries = 1; // quantidade de tentativas de reconexão
|
25
|
+
connectionMaxRetries = 3; // quantidade de tentativas de reconexão
|
21
26
|
|
22
|
-
//* Initialization
|
23
27
|
async onServiceInit() {
|
24
|
-
this.
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
28
|
+
this.attemptDelay = 5 * 1000;
|
29
|
+
}
|
30
|
+
async onStart() {
|
31
|
+
return this.connect();
|
32
|
+
}
|
33
|
+
async onStartAttempt() {
|
34
|
+
this.connectionRetries += 1;
|
35
|
+
}
|
36
|
+
async onStartFail() {
|
37
|
+
this.log(`Not possible to connect Redis`, 'danger');
|
38
|
+
}
|
39
|
+
isStartFailed() {
|
40
|
+
return this.connectionRetries > this.connectionMaxRetries;
|
29
41
|
}
|
30
|
-
connect() {
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
}).
|
37
|
-
|
38
|
-
|
42
|
+
async connect() {
|
43
|
+
if (this.isConnected) return true;
|
44
|
+
if (this.isReconnecting) return false;
|
45
|
+
this.log(`⌛️ Connecting to Redis Server: ${this.connectionRetries}/${this.connectionMaxRetries}`);
|
46
|
+
this.isReconnecting = true;
|
47
|
+
try {
|
48
|
+
const queryConnect = `redis://${_app.Core.settings.getCache().host}:${_app.Core.settings.getCache().port}`;
|
49
|
+
const password = _app.Core.settings.getCache().password;
|
50
|
+
this.client = (0, _redis.createClient)({
|
51
|
+
url: queryConnect,
|
52
|
+
password
|
39
53
|
});
|
40
|
-
|
54
|
+
await this.client.connect();
|
55
|
+
this.isConnected = true;
|
56
|
+
this.isReconnecting = false;
|
57
|
+
this.connectionRetries = 0;
|
58
|
+
this.setupErrorHandles();
|
59
|
+
this.log(`✅ Redis Connection is ready`);
|
60
|
+
return true;
|
61
|
+
} catch (error) {
|
62
|
+
(0, _utils.logger)().error(error, `Not connected to Redis Server`);
|
63
|
+
this.isReconnecting = false;
|
64
|
+
return false;
|
65
|
+
}
|
41
66
|
}
|
42
|
-
|
43
|
-
|
67
|
+
setupErrorHandles() {
|
68
|
+
this.client.on('error', err => {
|
69
|
+
new _app.ErrorHandler('falha na conexão Redis', err);
|
70
|
+
this.isConnected = false;
|
71
|
+
});
|
44
72
|
}
|
45
73
|
|
46
74
|
//* Common
|
@@ -57,10 +85,5 @@ class RedisService extends _service.default {
|
|
57
85
|
createCache(key) {
|
58
86
|
return new _cache.RedisCache(this.client, key);
|
59
87
|
}
|
60
|
-
|
61
|
-
//* Events
|
62
|
-
onClientError(err) {
|
63
|
-
new _app.ErrorHandler('Error on init redis client', err);
|
64
|
-
}
|
65
88
|
}
|
66
89
|
var _default = exports.default = RedisService;
|
@@ -10,8 +10,17 @@ declare class SequelizeService extends Service {
|
|
10
10
|
connections: Map<string, Sequelize>;
|
11
11
|
initializedModels: Map<string, ModelStatic<any>>;
|
12
12
|
relations: Map<string, EnvDBHost>;
|
13
|
+
private connectionRetries;
|
14
|
+
private connectionMaxRetries;
|
15
|
+
private isReconnecting;
|
16
|
+
private isMasterConnected;
|
17
|
+
private isServiceConnected;
|
13
18
|
onServiceInit(): Promise<void>;
|
14
|
-
|
19
|
+
onStart(): Promise<boolean>;
|
20
|
+
onStartAttempt(): Promise<void>;
|
21
|
+
onStartFail(): Promise<void>;
|
22
|
+
isStartFailed(): boolean;
|
23
|
+
connectDatabases(): Promise<boolean>;
|
15
24
|
getDB(tenantId: string): Promise<false | Sequelize>;
|
16
25
|
createDB(hostUuid: string, name: string): Promise<boolean>;
|
17
26
|
hasDB(hostUuid: string, name: string): Promise<boolean>;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"sequelize.d.ts","sourceRoot":"","sources":["../../src/services/sequelize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAAsB,YAAY,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,OAAO,MAAM,wBAAwB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAgB,MAAM,WAAW,CAAC;AAKpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAUlD,cAAM,gBAAiB,SAAQ,OAAO;
|
1
|
+
{"version":3,"file":"sequelize.d.ts","sourceRoot":"","sources":["../../src/services/sequelize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAAsB,YAAY,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,OAAO,MAAM,wBAAwB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAgB,MAAM,WAAW,CAAC;AAKpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAUlD,cAAM,gBAAiB,SAAQ,OAAO;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;IAClC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACpC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACzC,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,kBAAkB,CAAS;IAG7B,aAAa;IAcN,OAAO;IAIP,cAAc;IAId,WAAW;IAIjB,aAAa;IAId,gBAAgB;IA+BhB,KAAK,CAAC,QAAQ,EAAE,MAAM;IActB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IA6BvC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAqBpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAiBvC,MAAM,CAAC,QAAQ,EAAE,MAAM;IA6BvB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS;IAkBpE,SAAS,CAAC,QAAQ,EAAE,MAAM;IAK1B,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,SAAI;IAe/B,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IA2CpD,cAAc,CAAC,IAAI,EAAE;QACzB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;KAClB;IA4BK,WAAW,CAAC,QAAQ,EAAE,MAAM;IAe5B,QAAQ,CAAC,CAAC,SAAS,YAAY,CAAC,KAAK,CAAC,EAC1C,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAC5B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAW1B,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAAG,CAAC,EAAE;CAGxD;AAED,eAAe,gBAAgB,CAAC"}
|
@@ -27,40 +27,61 @@ class SequelizeService extends _service.default {
|
|
27
27
|
connections;
|
28
28
|
initializedModels;
|
29
29
|
relations;
|
30
|
+
connectionRetries = 1; // quantidade de tentativas de reconexão
|
31
|
+
connectionMaxRetries = 3; // quantidade de tentativas de reconexão
|
32
|
+
isReconnecting = false; // Flag para evitar múltiplas tentativas simultâneas de reconexão
|
33
|
+
isMasterConnected = false; // Flag para controlar o estado da conexão
|
34
|
+
isServiceConnected = false; // Flag para controlar o estado da conexão
|
30
35
|
|
31
36
|
//# Initialization
|
32
37
|
async onServiceInit() {
|
38
|
+
if (!this.models) throw new Error('Models are requireds! Call registerModels(modelsArray)');
|
33
39
|
this.serviceDB = _database.serviceDB;
|
34
40
|
this.masterDB = _database.masterDB;
|
35
41
|
this.connections = new Map();
|
36
42
|
this.initializedModels = new Map();
|
37
43
|
this.relations = new Map();
|
38
|
-
|
44
|
+
this.models = [...this.models, ..._models.NativeModels];
|
45
|
+
this.attemptDelay = 5 * 1000;
|
46
|
+
}
|
47
|
+
async onStart() {
|
48
|
+
return this.connectDatabases();
|
49
|
+
}
|
50
|
+
async onStartAttempt() {
|
51
|
+
this.connectionRetries += 1;
|
52
|
+
}
|
53
|
+
async onStartFail() {
|
54
|
+
this.log(`Not possible to connect database`, 'danger');
|
55
|
+
}
|
56
|
+
isStartFailed() {
|
57
|
+
return this.connectionRetries > this.connectionMaxRetries;
|
39
58
|
}
|
40
59
|
async connectDatabases() {
|
41
|
-
if (
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
60
|
+
if (this.isMasterConnected && this.isServiceConnected) return true;
|
61
|
+
if (this.isReconnecting) return false;
|
62
|
+
this.log(`⌛️ Connecting Sequelize to database: ${this.connectionRetries}/${this.connectionMaxRetries}`);
|
63
|
+
try {
|
64
|
+
if (!this.isMasterConnected) {
|
65
|
+
await this.masterDB.sync({
|
66
|
+
force: false
|
67
|
+
});
|
68
|
+
this.isMasterConnected = true;
|
49
69
|
this.log('✅ Connected master database sucessfully', 'success');
|
50
|
-
|
70
|
+
}
|
71
|
+
if (!this.isServiceConnected) {
|
72
|
+
await this.serviceDB.sync({
|
51
73
|
force: false
|
52
|
-
}).then(() => {
|
53
|
-
this.log('✅ Connected service database sucessfully', 'success');
|
54
|
-
resolve(true);
|
55
|
-
}).catch(reason => {
|
56
|
-
new _app.ErrorHandler('Não foi possível inicializar a conexão com o ServiceDB', reason);
|
57
|
-
reject(reason);
|
58
74
|
});
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
75
|
+
this.isServiceConnected = true;
|
76
|
+
this.log('✅ Connected service database sucessfully', 'success');
|
77
|
+
}
|
78
|
+
this.log('✅ All databases connecteds sucessfully', 'success');
|
79
|
+
return true;
|
80
|
+
} catch (error) {
|
81
|
+
(0, _logger.default)().error(error, `Not connected Sequelize to database`);
|
82
|
+
this.isReconnecting = false;
|
83
|
+
return false;
|
84
|
+
}
|
64
85
|
}
|
65
86
|
|
66
87
|
// #Database
|
package/lib/services/socket.d.ts
CHANGED
@@ -9,7 +9,8 @@ declare class SocketIOService extends Service {
|
|
9
9
|
private mainRouter;
|
10
10
|
private eventhandlers;
|
11
11
|
private clientHandlers;
|
12
|
-
|
12
|
+
onClusterInit(): void;
|
13
|
+
onStartCluster(): Promise<boolean>;
|
13
14
|
private onConnection;
|
14
15
|
private bindEvents;
|
15
16
|
createSocket(app: HttpServer, cors?: CorsOptions | CorsOptionsDelegate): void;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/services/socket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,MAAM,CAAC;AACxD,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,MAAM,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,OAAO,MAAM,wBAAwB,CAAC;AAC7C,OAAO,kBAAkB,MAAM,oCAAoC,CAAC;AAMpE,OAAO,mBAAmB,MAAM,qCAAqC,CAAC;
|
1
|
+
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/services/socket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,MAAM,CAAC;AACxD,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,MAAM,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,OAAO,MAAM,wBAAwB,CAAC;AAC7C,OAAO,kBAAkB,MAAM,oCAAoC,CAAC;AAMpE,OAAO,mBAAmB,MAAM,qCAAqC,CAAC;AAUtE,cAAM,eAAgB,SAAQ,OAAO;IAC5B,MAAM,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,cAAc,CAAsC;IAErD,aAAa;IAIP,cAAc;YAeb,YAAY;IAsC1B,OAAO,CAAC,UAAU;IAgCX,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,GAAE,WAAW,GAAG,mBAAqC;IAM9F,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,kBAAkB,EAAE;IAIlD,MAAM,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC,OAAO,mBAAmB,CAAC,EAAE;YAIxD,gBAAgB;CAY/B;AAED,eAAe,eAAe,CAAC"}
|
package/lib/services/socket.js
CHANGED
@@ -10,6 +10,7 @@ var _controller = require("../app/controller");
|
|
10
10
|
var _core = require("../contracts/core");
|
11
11
|
var _authentication = require("../middlewares/authentication");
|
12
12
|
var _express = _interopRequireDefault(require("./express"));
|
13
|
+
var _utils = require("../utils");
|
13
14
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
14
15
|
/**
|
15
16
|
* Serviço de gerênciamento de comunicação WS/WSS Socket
|
@@ -23,16 +24,22 @@ class SocketIOService extends _service.default {
|
|
23
24
|
mainRouter;
|
24
25
|
eventhandlers;
|
25
26
|
clientHandlers = [];
|
26
|
-
|
27
|
-
if (!this.mainRouter) throw new Error('Need router'); //!sem router
|
28
|
-
|
29
|
-
this.createSocket(_express.default.singleton().getHttpServer());
|
27
|
+
onClusterInit() {
|
30
28
|
this.eventhandlers = new Map();
|
31
|
-
|
29
|
+
}
|
30
|
+
async onStartCluster() {
|
31
|
+
if (!this.mainRouter) throw new Error('Need router'); //!sem router
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
33
|
+
try {
|
34
|
+
this.createSocket(_express.default.getService().getHttpServer());
|
35
|
+
await this.registerHandlers();
|
36
|
+
this.server.on('connection', this.onConnection.bind(this));
|
37
|
+
this.log('✅ Socket server created');
|
38
|
+
return true;
|
39
|
+
} catch (error) {
|
40
|
+
(0, _utils.logger)().error(error, `Not connected to SocketIO`);
|
41
|
+
return false;
|
42
|
+
}
|
36
43
|
}
|
37
44
|
async onConnection(socket) {
|
38
45
|
this.log(`${socket.id} conectado`);
|
@@ -2,10 +2,7 @@ import TaskServiceBase from '../TaskServiceBase';
|
|
2
2
|
import QueueTask from './QueueTask';
|
3
3
|
declare class QueueTaskService extends TaskServiceBase<typeof QueueTask<any>> {
|
4
4
|
private connection;
|
5
|
-
|
6
|
-
onServiceInit(): Promise<void>;
|
7
|
-
private importAllJobs;
|
8
|
-
private processAllJobs;
|
5
|
+
onStart(): Promise<boolean>;
|
9
6
|
startTask(task: QueueTask<any>): Promise<void>;
|
10
7
|
}
|
11
8
|
export default QueueTaskService;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"QueueService.d.ts","sourceRoot":"","sources":["../../../../src/services/task/queue/QueueService.ts"],"names":[],"mappings":"AAIA,OAAO,eAAe,MAAM,oBAAoB,CAAC;AACjD,OAAO,SAAS,MAAM,aAAa,CAAC;
|
1
|
+
{"version":3,"file":"QueueService.d.ts","sourceRoot":"","sources":["../../../../src/services/task/queue/QueueService.ts"],"names":[],"mappings":"AAIA,OAAO,eAAe,MAAM,oBAAoB,CAAC;AACjD,OAAO,SAAS,MAAM,aAAa,CAAC;AAGpC,cAAM,gBAAiB,SAAQ,eAAe,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACnE,OAAO,CAAC,UAAU,CAAoB;IAEhC,OAAO;IAiBA,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC;CAuB5C;AAED,eAAe,gBAAgB,CAAC"}
|
@@ -5,47 +5,25 @@ Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
});
|
6
6
|
exports.default = void 0;
|
7
7
|
var _bullmq = require("bullmq");
|
8
|
-
var _fs = require("fs");
|
9
8
|
var _app = require("../../../app");
|
10
|
-
var _TaskServiceBase = _interopRequireDefault(require("../TaskServiceBase"));
|
11
9
|
var _core = require("../../../contracts/core");
|
10
|
+
var _TaskServiceBase = _interopRequireDefault(require("../TaskServiceBase"));
|
12
11
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
13
12
|
//* Queue
|
14
13
|
class QueueTaskService extends _TaskServiceBase.default {
|
15
14
|
connection;
|
16
|
-
|
17
|
-
async onServiceInit() {
|
15
|
+
async onStart() {
|
18
16
|
this.connection = {
|
19
17
|
host: _app.Core.settings.getCache().host,
|
20
18
|
port: Number(_app.Core.settings.getCache().port),
|
21
19
|
password: _app.Core.settings.getCache().password
|
22
20
|
};
|
23
|
-
this.log('Initializing jobs
|
24
|
-
await this.processAllJobs();
|
25
|
-
this.log('All jobs initializeds...', 'info');
|
26
|
-
}
|
27
|
-
|
28
|
-
/**
|
29
|
-
* Importa os arquivos de task
|
30
|
-
* !no modo cluster, é lançado erro PIPE após todos os clusters tentar acessar o mesmo arquivo
|
31
|
-
* @deprecated
|
32
|
-
* @private
|
33
|
-
* @memberof QueueTaskService
|
34
|
-
*/
|
35
|
-
async importAllJobs() {
|
36
|
-
if (!(0, _fs.existsSync)(this.jobsPath)) (0, _fs.mkdirSync)(this.jobsPath, {
|
37
|
-
recursive: true
|
38
|
-
});
|
39
|
-
for (const handlerFile of (0, _fs.readdirSync)(this.jobsPath)) {
|
40
|
-
const job = require(`${this.jobsPath}/${handlerFile}`).default;
|
41
|
-
const jobInstance = job.singleton();
|
42
|
-
this.tasks.push(jobInstance);
|
43
|
-
}
|
44
|
-
}
|
45
|
-
async processAllJobs() {
|
21
|
+
this.log('Initializing jobs', 'info');
|
46
22
|
for (const task of this.tasks) {
|
47
23
|
this.startTask(task.singleton());
|
48
24
|
}
|
25
|
+
this.log('All jobs initializeds', 'info');
|
26
|
+
return true;
|
49
27
|
}
|
50
28
|
async startTask(task) {
|
51
29
|
task.taskInit();
|
@@ -1,10 +1,7 @@
|
|
1
1
|
import TaskServiceBase from '../TaskServiceBase';
|
2
2
|
import ScheduleTask from './SchedulerTask';
|
3
3
|
declare class SchedulerTaskService extends TaskServiceBase<typeof ScheduleTask> {
|
4
|
-
|
5
|
-
onServiceInit(): Promise<void>;
|
6
|
-
private importAllJobs;
|
7
|
-
private processAllJobs;
|
4
|
+
onStart(): Promise<boolean>;
|
8
5
|
private startTask;
|
9
6
|
}
|
10
7
|
export default SchedulerTaskService;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SchedulerService.d.ts","sourceRoot":"","sources":["../../../../src/services/task/scheduler/SchedulerService.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"SchedulerService.d.ts","sourceRoot":"","sources":["../../../../src/services/task/scheduler/SchedulerService.ts"],"names":[],"mappings":"AAEA,OAAO,eAAe,MAAM,oBAAoB,CAAC;AACjD,OAAO,YAAY,MAAM,iBAAiB,CAAC;AAE3C,cAAM,oBAAqB,SAAQ,eAAe,CAAC,OAAO,YAAY,CAAC;IAC/D,OAAO;YAYC,SAAS;CAcxB;AAED,eAAe,oBAAoB,CAAC"}
|
@@ -4,46 +4,19 @@ Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
5
5
|
});
|
6
6
|
exports.default = void 0;
|
7
|
-
var _fs = require("fs");
|
8
7
|
var _nodeSchedule = require("node-schedule");
|
9
|
-
var _app = require("../../../app");
|
10
|
-
var _TaskServiceBase = _interopRequireDefault(require("../TaskServiceBase"));
|
11
8
|
var _core = require("../../../contracts/core");
|
9
|
+
var _TaskServiceBase = _interopRequireDefault(require("../TaskServiceBase"));
|
12
10
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
13
11
|
class SchedulerTaskService extends _TaskServiceBase.default {
|
14
|
-
|
15
|
-
async onServiceInit() {
|
12
|
+
async onStart() {
|
16
13
|
this.log('Initializing jobs...', 'info');
|
17
|
-
await this.processAllJobs();
|
18
|
-
this.log('All jobs initializeds...', 'info');
|
19
|
-
}
|
20
|
-
|
21
|
-
/**
|
22
|
-
* Importa os arquivos de task
|
23
|
-
* !no modo cluster, é lançado erro PIPE após todos os clusters tentar acessar o mesmo arquivo
|
24
|
-
* @deprecated
|
25
|
-
* @private
|
26
|
-
* @memberof QueueTaskService
|
27
|
-
*/
|
28
|
-
async importAllJobs() {
|
29
|
-
if (!(0, _fs.existsSync)(this.jobsPath)) (0, _fs.mkdirSync)(this.jobsPath, {
|
30
|
-
recursive: true
|
31
|
-
});
|
32
|
-
for (const handlerFile of (0, _fs.readdirSync)(this.jobsPath)) {
|
33
|
-
try {
|
34
|
-
const job = require(`${this.jobsPath}/${handlerFile}`).default;
|
35
|
-
const jobInstance = job.singleton();
|
36
|
-
this.tasks.push(jobInstance);
|
37
|
-
} catch (error) {
|
38
|
-
new _app.ErrorHandler(`Falha ao iniciar um ou mais jobs: ${handlerFile}`, error);
|
39
|
-
}
|
40
|
-
}
|
41
|
-
}
|
42
|
-
async processAllJobs() {
|
43
14
|
for (const task of this.tasks) {
|
44
15
|
const intanceTask = task.singleton();
|
45
16
|
this.startTask(intanceTask);
|
46
17
|
}
|
18
|
+
this.log('All jobs initializeds...', 'info');
|
19
|
+
return true;
|
47
20
|
}
|
48
21
|
async startTask(task) {
|
49
22
|
task.taskInit();
|