exodus-framework 2.0.893 → 2.0.895

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.
Files changed (37) hide show
  1. package/lib/app/classes/service.d.ts +13 -2
  2. package/lib/app/classes/service.d.ts.map +1 -1
  3. package/lib/app/classes/service.js +150 -5
  4. package/lib/app/exodus.d.ts +1 -0
  5. package/lib/app/exodus.d.ts.map +1 -1
  6. package/lib/app/exodus.js +26 -4
  7. package/lib/services/express.d.ts +1 -2
  8. package/lib/services/express.d.ts.map +1 -1
  9. package/lib/services/express.js +3 -4
  10. package/lib/services/file.d.ts +1 -1
  11. package/lib/services/file.d.ts.map +1 -1
  12. package/lib/services/file.js +2 -1
  13. package/lib/services/log.d.ts +0 -1
  14. package/lib/services/log.d.ts.map +1 -1
  15. package/lib/services/log.js +0 -1
  16. package/lib/services/rabitmq.d.ts +9 -5
  17. package/lib/services/rabitmq.d.ts.map +1 -1
  18. package/lib/services/rabitmq.js +60 -47
  19. package/lib/services/redis.d.ts +5 -2
  20. package/lib/services/redis.d.ts.map +1 -1
  21. package/lib/services/redis.js +41 -23
  22. package/lib/services/security.d.ts +1 -1
  23. package/lib/services/security.d.ts.map +1 -1
  24. package/lib/services/security.js +3 -1
  25. package/lib/services/sequelize.d.ts +6 -1
  26. package/lib/services/sequelize.d.ts.map +1 -1
  27. package/lib/services/sequelize.js +38 -21
  28. package/lib/services/socket.d.ts +1 -0
  29. package/lib/services/socket.d.ts.map +1 -1
  30. package/lib/services/socket.js +16 -7
  31. package/lib/services/task/queue/QueueService.d.ts +1 -4
  32. package/lib/services/task/queue/QueueService.d.ts.map +1 -1
  33. package/lib/services/task/queue/QueueService.js +5 -27
  34. package/lib/services/task/scheduler/SchedulerService.d.ts +1 -4
  35. package/lib/services/task/scheduler/SchedulerService.d.ts.map +1 -1
  36. package/lib/services/task/scheduler/SchedulerService.js +4 -31
  37. package/package.json +1 -1
@@ -7,17 +7,28 @@ 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 startAttemptDelay: number;
11
+ protected maxStartAttempts: number;
12
+ protected currentStartAttempts: number;
10
13
  constructor();
11
14
  static singleton<S extends Service>(this: TStaticService<S>): S;
12
15
  static getService<S extends Service>(this: TStaticService<S>): S;
13
- serviceInit(): Promise<void>;
14
- protected onServiceInit(): Promise<void>;
16
+ onServiceInit(): Promise<void>;
15
17
  protected onServiceMasterInit(): Promise<void>;
16
18
  protected onServiceClusterInit(): Promise<void>;
19
+ onStart(): Promise<boolean>;
20
+ onStartMaster(): Promise<boolean>;
21
+ onStartCluster(): Promise<boolean>;
22
+ onStartAttempt(): Promise<void>;
23
+ onStartFail(): Promise<void>;
24
+ onStartSuccessfully(): Promise<void>;
25
+ onExodusStarted(): Promise<void>;
17
26
  protected sendToServiceCluster(clusterId: number, event: string, data: D): void;
18
27
  protected sendToServiceMaster(event: string, data: D): void;
19
28
  protected onServiceMasterReceived(_worker: Worker, _eventKey: string, _data: any): void;
20
29
  protected onServiceClusterReceived(_eventKey: string, _data: any): void;
30
+ isStartFailed(): boolean;
31
+ getAttemptDelay(): number;
21
32
  }
22
33
  export default Service;
23
34
  //# 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;;IAMzC,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,GAEjC,CAAC;IAE3B,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;IAI/C,WAAW;cAsBR,aAAa;cAGb,mBAAmB;cAGnB,oBAAoB;IAIpC,SAAS,CAAC,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAGxE,SAAS,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAIpD,SAAS,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAGhF,SAAS,CAAC,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;CAGjE;AACD,eAAe,OAAO,CAAC"}
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,iBAAiB,SAAQ;IACnC,SAAS,CAAC,gBAAgB,SAAK;IAC/B,SAAS,CAAC,oBAAoB,SAAK;;IAgBnC,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;IAQd,WAAW;IAQX,mBAAmB;IASnB,eAAe;IAW5B,SAAS,CAAC,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAYxE,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,51 @@ 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
+ startAttemptDelay = 1000; // Tempo de espera para cada tentativa de inicialização
25
+ maxStartAttempts = 3; // Numero de tentativas máximas para iniciar o serviço
26
+ currentStartAttempts = 1; // Numero de tentativas atual para iniciar o serviço
27
+
24
28
  constructor() {
25
29
  super();
26
30
  this.eCom = new _communication.default(this.constructor.name);
27
31
  }
32
+
33
+ /**
34
+ * Mesmo que getService
35
+ *
36
+ * @deprecated Use getService
37
+ * @static
38
+ * @template S
39
+ * @param {TStaticService<S>} this
40
+ * @memberof Service
41
+ */
28
42
  static singleton() {
29
43
  if (!this.instance) this.instance = new this();
30
44
  return this.instance;
31
45
  }
46
+ /**
47
+ * Obtem a instância atual deste serviço
48
+ *
49
+ * @static
50
+ * @template S
51
+ * @param {TStaticService<S>} this
52
+ * @memberof Service
53
+ */
32
54
  static getService() {
33
55
  return this.singleton();
34
56
  }
35
- async serviceInit() {
57
+
58
+ /**
59
+ * Chamado antes de onStart, serve como preparação para a inicialização do serviços
60
+ * pré fetchs e etc...
61
+ * Diferente de onStart, este é chamado apenas uma vez
62
+ *
63
+ * @public
64
+ * @memberof Service
65
+ */
66
+ async onServiceInit() {
36
67
  this.eCom.on(_service.eEventCommunication.RECEIVED_CLUSTER_MESSAGE, this.onServiceMasterReceived.bind(this));
37
68
  this.eCom.on(_service.eEventCommunication.RECEIVED_MASTER_MESSAGE, this.onServiceClusterReceived.bind(this));
38
- await this.onServiceInit();
39
69
  if (this.isMaster()) {
40
70
  await this.onServiceMasterInit();
41
71
  }
@@ -43,26 +73,141 @@ class Service extends _managed.default {
43
73
  await this.onServiceClusterInit();
44
74
  }
45
75
  }
46
- async onServiceInit() {
47
- return;
48
- }
76
+ /**
77
+ * Mesmo que onServiceInit, mas do lado do master
78
+ *
79
+ * @protected
80
+ * @memberof Service
81
+ */
49
82
  async onServiceMasterInit() {
50
83
  return;
51
84
  }
85
+ /**
86
+ * Mesmo que onServiceInit, mas do lado do cluster
87
+ *
88
+ * @protected
89
+ * @memberof Service
90
+ */
52
91
  async onServiceClusterInit() {
53
92
  return;
54
93
  }
94
+
95
+ // !future
96
+ /**
97
+ * Inicia o procedimento de inicialização do seriviço
98
+ * usado para conexões, fetchs e etc...
99
+ *
100
+ * @return {*} {Promise<boolean>}
101
+ * @memberof Service
102
+ */
103
+ async onStart() {
104
+ if (this.isMaster()) {
105
+ return this.onStartMaster();
106
+ }
107
+ if (this.isCluster()) {
108
+ return this.onStartCluster();
109
+ }
110
+ return true;
111
+ }
112
+ async onStartMaster() {
113
+ return true;
114
+ }
115
+ async onStartCluster() {
116
+ return true;
117
+ }
118
+ /**
119
+ * Quando uma nova tentativa de inicialização é executada
120
+ *
121
+ * @memberof Service
122
+ */
123
+ async onStartAttempt() {
124
+ this.currentStartAttempts += 1;
125
+ }
126
+ /**
127
+ * Executado quando a inicialização deste serviço falhar
128
+ *
129
+ * @memberof Service
130
+ */
131
+ async onStartFail() {
132
+ this.log(`Erro on init this service.`, 'danger');
133
+ }
134
+ /**
135
+ * Quando o serviço inicializar com sucesso
136
+ *
137
+ * @memberof Service
138
+ */
139
+ async onStartSuccessfully() {
140
+ this.currentStartAttempts = 1;
141
+ }
142
+ /**
143
+ * Quando todos os serviços foram carregados
144
+ * Pode ser usado para eliminar dados utilizados na inicialização
145
+ *
146
+ * @memberof Service
147
+ */
148
+ async onExodusStarted() {}
149
+
150
+ /**
151
+ * Enviar dados para a instância deste serviço no cluster
152
+ *
153
+ * @protected
154
+ * @param {number} clusterId
155
+ * @param {string} event
156
+ * @param {D} data
157
+ * @memberof Service
158
+ */
55
159
  sendToServiceCluster(clusterId, event, data) {
56
160
  this.eCom.sendMessageToCluster(clusterId, event, data);
57
161
  }
162
+
163
+ /**
164
+ * Enviar dados para a instancia deste serviço no master
165
+ *
166
+ * @protected
167
+ * @param {string} event
168
+ * @param {D} data
169
+ * @memberof Service
170
+ */
58
171
  sendToServiceMaster(event, data) {
59
172
  this.eCom.sendMessageToMaster(event, data);
60
173
  }
174
+
175
+ /**
176
+ * Quando dados enviados do serviço no master para a instância no cluster
177
+ *
178
+ * @protected
179
+ * @param {Worker} _worker
180
+ * @param {string} _eventKey
181
+ * @param {*} _data
182
+ * @memberof Service
183
+ */
61
184
  onServiceMasterReceived(_worker, _eventKey, _data) {
62
185
  return;
63
186
  }
187
+ /**
188
+ * Quando dados enviados do serviço no cluster para a instância no master
189
+ *
190
+ * @protected
191
+ * @param {string} _eventKey
192
+ * @param {*} _data
193
+ * @memberof Service
194
+ */
64
195
  onServiceClusterReceived(_eventKey, _data) {
65
196
  return;
66
197
  }
198
+
199
+ /**
200
+ * Reporta a condição de inicialização falhou
201
+ * se verdadeiro, o Exodus irá cancelar a inicialização deste serviço e chamar onStartFail
202
+ *
203
+ * @return {*} {boolean}
204
+ * @memberof Service
205
+ */
206
+ isStartFailed() {
207
+ return this.currentStartAttempts > this.maxStartAttempts;
208
+ }
209
+ getAttemptDelay() {
210
+ return this.startAttemptDelay;
211
+ }
67
212
  }
68
213
  var _default = exports.default = Service;
@@ -8,6 +8,7 @@ declare class Exodus extends Managed {
8
8
  private createClusters;
9
9
  register(service: typeof Service): void;
10
10
  private initServices;
11
+ private startService;
11
12
  }
12
13
  export default Exodus;
13
14
  //# sourceMappingURL=exodus.d.ts.map
@@ -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;IAclB,OAAO,CAAC,cAAc;IAef,QAAQ,CAAC,OAAO,EAAE,OAAO,OAAO;YAGzB,YAAY;CAgB3B;AACD,eAAe,MAAM,CAAC"}
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;IAgBlB,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,14 @@ 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
- this.createClusters();
31
+ if (await this.initServices()) {
32
+ this.createClusters();
33
+ }
32
34
  }
33
35
  if (this.isCluster()) {
34
36
  this.log(`Iniciando em Cluster ${this.getWorkId()}`);
37
+ await this.initServices();
35
38
  }
36
- this.initServices();
37
39
  }
38
40
 
39
41
  //# Cluster Management
@@ -57,14 +59,34 @@ class Exodus extends _managed.default {
57
59
  async initServices() {
58
60
  for (const service of this.services) {
59
61
  try {
60
- await service.serviceInit();
62
+ await this.startService(service);
61
63
  } catch (error) {
62
64
  new _.ErrorHandler(`Erro on starting service: ${service.constructor.name} | reason: ${error.message || 'unknow'}`, error);
63
65
  this.log('Não foi possível iniciar os serviços', 'warning');
64
- return;
66
+ return false;
65
67
  }
66
68
  }
67
69
  this.log('Serviços iniciados');
70
+ return true;
71
+ }
72
+ async startService(service) {
73
+ let starting = true;
74
+ await service.onServiceInit();
75
+ while (starting) {
76
+ if (service.isStartFailed()) {
77
+ await service.onStartFail();
78
+ starting = false;
79
+ break;
80
+ }
81
+ if (await service.onStart()) {
82
+ starting = false;
83
+ await service.onStartSuccessfully();
84
+ break;
85
+ } else {
86
+ await service.onStartAttempt();
87
+ }
88
+ await new Promise(resolve => setTimeout(() => resolve(true), service.getAttemptDelay()));
89
+ }
68
90
  }
69
91
  }
70
92
  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
- onServiceClusterInit(): Promise<void>;
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;IAEd,oBAAoB;IAG3B,aAAa;IA0BnB,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"}
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"}
@@ -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
- async onServiceClusterInit() {
26
- await this.createExpress();
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
 
@@ -1,7 +1,7 @@
1
1
  import Service from '../app/classes/service';
2
2
  import { TFilePathSettings } from '../contracts/settings';
3
3
  declare class FileService extends Service {
4
- onServiceInit(): Promise<void>;
4
+ onStart(): Promise<boolean>;
5
5
  private checkPaths;
6
6
  private cleanTemp;
7
7
  save(filename: string, destiny: keyof TFilePathSettings): Promise<string | boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/services/file.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,wBAAwB,CAAC;AAK7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,cAAM,WAAY,SAAQ,OAAO;IACzB,aAAa;YAIL,UAAU;YAKV,SAAS;IASjB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,iBAAiB;IAavD,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,iBAAiB;IAW/D,SAAS,CAAC,MAAM,EAAE,MAAM,iBAAiB,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI;CAIxE;AACD,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/services/file.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,wBAAwB,CAAC;AAK7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,cAAM,WAAY,SAAQ,OAAO;IAClB,OAAO;YAKN,UAAU;YAKV,SAAS;IASjB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,iBAAiB;IAavD,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,iBAAiB;IAW/D,SAAS,CAAC,MAAM,EAAE,MAAM,iBAAiB,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI;CAIxE;AACD,eAAe,WAAW,CAAC"}
@@ -13,8 +13,9 @@ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return
13
13
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
14
14
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
15
  class FileService extends _service.default {
16
- async onServiceInit() {
16
+ async onStart() {
17
17
  await Promise.all([this.checkPaths(), this.cleanTemp()]);
18
+ return true;
18
19
  }
19
20
  async checkPaths() {
20
21
  for (const path of Object.values(_app.Core.settings.getAppication().filePaths)) {
@@ -1,6 +1,5 @@
1
1
  import { Service } from '../app';
2
2
  declare class LogService extends Service {
3
- onServiceInit(): Promise<void>;
4
3
  register(tenantId: string, data: {
5
4
  origin: string;
6
5
  action: string;
@@ -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,aAAa;IACb,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"}
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"}
@@ -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,19 @@ 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;
10
13
  onServiceClusterInit(): Promise<void>;
14
+ onStartCluster(): Promise<boolean>;
15
+ onStartFail(): Promise<void>;
16
+ connect(): Promise<boolean>;
11
17
  registerHandles(): Promise<void>;
12
- connect(): Promise<void>;
13
- private bindEvents;
14
- reconnect(): void;
15
- sendToQueue<K extends keyof TMessageQueueDataMap>(topic: K, data: TMessageQueueDataMap[K]): Promise<`${string}-${string}-${string}-${string}-${string}`>;
18
+ private setupErrorHandles;
19
+ sendToQueue<K extends keyof TMessageQueueDataMap>(topic: K, data: TMessageQueueDataMap[K]): Promise<false | `${string}-${string}-${string}-${string}-${string}`>;
16
20
  consumeFromQueue(msg: client.ConsumeMessage): Promise<void>;
17
21
  static registerRouter(router: TMessagingQueueEventList): void;
18
22
  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;AAStB,cAAM,eAAgB,SAAQ,OAAO;IACnC,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,oBAAoB,CAA0D;IAGhF,oBAAoB;IAQpB,eAAe;IAiBf,OAAO;IAoBb,OAAO,CAAC,UAAU;IAUlB,SAAS;IAYH,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;IA0BjD,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"}
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;IAEtB,oBAAoB;IAab,cAAc;IAId,WAAW;IAIX,OAAO;IA+BP,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"}
@@ -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,112 @@ 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
26
30
 
27
- //# Initialization
28
31
  async onServiceClusterInit() {
29
- this.eventCustomListeners = new Map();
30
- this.connectionRetries = 0;
31
32
  if (!this.mainRouter) throw new Error('Need router'); //!sem router
33
+
34
+ //Start params
35
+ this.startAttemptDelay = 5 * 1000;
36
+ this.maxStartAttempts = 3;
37
+ this.exchangeName = _app.Core.settings.getMessaging().exchanges.main;
38
+ this.queueName = _app.Core.settings.getAppication().appId;
39
+ this.eventCustomListeners = new Map();
32
40
  this.mainRouter = {
33
41
  ..._messaging.default,
34
42
  ...this.mainRouter
35
43
  }; // # Register native router
36
- await this.connect();
37
44
  }
38
- async registerHandles() {
39
- for (const topic of Object.keys(this.mainRouter)) {
40
- await this.channel.bindQueue(_app.Core.settings.getAppication().appId, _app.Core.settings.getMessaging().exchanges.main, topic);
41
- }
42
- await this.channel.consume(_app.Core.settings.getAppication().appId, this.consumeFromQueue.bind(this), {
43
- noAck: false
44
- });
45
+ async onStartCluster() {
46
+ return this.connect();
47
+ }
48
+ async onStartFail() {
49
+ this.log(`Not possible to connect RabitMQ`, 'danger');
45
50
  }
46
51
  async connect() {
52
+ if (this.isConnected) return true;
53
+ if (this.isReconnecting) return false;
54
+ this.log(`⌛️ Connecting to Rabbit-MQ Server: ${this.currentStartAttempts}/${this.maxStartAttempts}`);
55
+ this.isReconnecting = true;
47
56
  try {
48
- this.log(`⌛️ Connecting to Rabbit-MQ Server`);
49
- this.connection = await _amqplib.default.connect(`amqp://${_app.Core.settings.getMessaging().user}:${_app.Core.settings.getMessaging().pass}@${_app.Core.settings.getMessaging().host}:5672`);
50
- this.log(`✅ Rabbit MQ Connection is ready`);
57
+ const query = `amqp://${_app.Core.settings.getMessaging().user}:${_app.Core.settings.getMessaging().pass}@${_app.Core.settings.getMessaging().host}:5672`;
58
+ this.connection = await _amqplib.default.connect(query);
51
59
  this.channel = await this.connection.createChannel();
52
- await this.channel.assertExchange(_app.Core.settings.getMessaging().exchanges.main, 'topic', {
60
+ const mainExchanges = _app.Core.settings.getMessaging().exchanges.main;
61
+ await this.channel.assertExchange(mainExchanges, 'topic', {
53
62
  durable: true
54
63
  });
55
64
  await this.channel.assertQueue(_app.Core.settings.getAppication().appId, {
56
65
  durable: true
57
66
  });
58
- this.bindEvents();
59
- this.registerHandles();
60
- this.log(`🛸 Created RabbitMQ Channel successfully`);
61
- this.connectionRetries = 0;
67
+ this.isConnected = true;
68
+ this.isReconnecting = false;
69
+ this.setupErrorHandles();
70
+ await this.registerHandles();
71
+ this.log(`✅ Rabbit MQ Connection is ready`);
72
+ return true;
62
73
  } catch (error) {
63
- throw new _app.ErrorHandler(`Not connected to MQ Server`, error); // ! throw because starting process
74
+ (0, _utils.logger)().error(error, `Not connected to MQ Server`);
75
+ this.isReconnecting = false;
76
+ return false;
64
77
  }
65
78
  }
66
- bindEvents() {
79
+ async registerHandles() {
80
+ for (const topic of Object.keys(this.mainRouter)) {
81
+ await this.channel.bindQueue(this.queueName, this.exchangeName, topic);
82
+ }
83
+ await this.channel.consume(this.queueName, this.consumeFromQueue.bind(this), {
84
+ noAck: false
85
+ });
86
+ }
87
+ setupErrorHandles() {
67
88
  this.channel.on('error', err => {
68
89
  new _app.ErrorHandler('falha no canal rabitmq', err);
69
- this.reconnect();
90
+ this.isConnected = false;
70
91
  });
71
92
  this.channel.on('close', err => {
72
- new _app.ErrorHandler('falha no canal rabitmq', err);
73
- this.reconnect();
93
+ new _app.ErrorHandler('o canal rabitmq foi fechado', err);
94
+ this.isConnected = false;
74
95
  });
75
96
  }
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
97
 
87
98
  //# Common
88
99
  async sendToQueue(topic, data) {
89
100
  try {
90
- if (!this.channel) {
91
- await this.connect();
101
+ if (!this.isConnected) {
102
+ this.log('RabbitMQ is not connected. Message not sent.');
103
+ return false;
92
104
  }
93
- const transactionId = (0, _crypto.randomUUID)();
94
- this.channel.publish(_app.Core.settings.getMessaging().exchanges.main, topic, Buffer.from(JSON.stringify({
105
+ const messageId = (0, _crypto.randomUUID)();
106
+ const packeg = Buffer.from(JSON.stringify({
95
107
  data,
96
108
  serviceId: _app.Core.settings.getAppication().appId
97
- })), {
98
- messageId: transactionId,
109
+ }));
110
+ this.channel.publish(this.exchangeName, topic, packeg, {
111
+ messageId,
99
112
  persistent: true
100
113
  });
101
- return transactionId;
114
+ return messageId;
102
115
  } catch (error) {
103
116
  new _app.ErrorHandler('Houve um erro no envio de uma mensagem para o rabitmq', error);
104
117
  }
105
118
  }
106
119
  async consumeFromQueue(msg) {
120
+ if (!this.isConnected) return;
107
121
  if (!msg) {
108
- return this.log(`Invalid incoming message in`);
122
+ this.log(`Invalid incoming message in`);
123
+ return;
109
124
  }
110
125
  try {
111
126
  const topic = msg.fields.routingKey;
112
127
  const content = JSON.parse(msg.content.toString());
113
128
  const callBack = this.mainRouter[topic];
114
- if (callBack) {
115
- callBack(content.data, () => {}, content.serviceId, msg.properties.messageId);
116
- }
129
+ if (callBack) callBack(content.data, () => {}, content.serviceId, msg.properties.messageId);
117
130
  this.channel.ack(msg); //# the next function is temporary and not confirm ack
118
131
 
119
132
  if (this.eventCustomListeners.has(topic)) {
@@ -122,7 +135,7 @@ class RabbitMQService extends _service.default {
122
135
  }
123
136
  } catch (error) {
124
137
  new _app.ErrorHandler('Error on parsing message from queue', error);
125
- this.channel.nack(msg, false, false);
138
+ this.channel.nack(msg, false, true); // Reenfileira para nova tentativa
126
139
  }
127
140
  }
128
141
  static registerRouter(router) {
@@ -2,14 +2,17 @@ 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;
5
7
  onServiceInit(): Promise<void>;
8
+ onStart(): Promise<boolean>;
9
+ onStartFail(): Promise<void>;
6
10
  private connect;
7
- disconnect(): Promise<void>;
11
+ private setupErrorHandles;
8
12
  setValue(key: string, value: string): Promise<void>;
9
13
  getValue(key: string): Promise<string | null>;
10
14
  deleteValue(key: string): Promise<void>;
11
15
  createCache<T>(key: string): RedisCache<T>;
12
- private onClientError;
13
16
  }
14
17
  export default RedisService;
15
18
  //# 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;AASlD,cAAM,YAAa,SAAQ,OAAO;IAChC,OAAO,CAAC,MAAM,CAAkB;IAG1B,aAAa;IAOnB,OAAO,CAAC,OAAO;IAgBT,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,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;IAKjC,OAAO,CAAC,aAAa;CAGtB;AAED,eAAe,YAAY,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;IAEf,aAAa;IAOb,OAAO;IAMP,WAAW;YAMV,OAAO;IA2BrB,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"}
@@ -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,51 @@ 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
21
24
 
22
- //* Initialization
23
25
  async onServiceInit() {
24
- this.client = (0, _redis.createClient)({
25
- url: `redis://${_app.Core.settings.getCache().host}:${_app.Core.settings.getCache().port}`,
26
- password: _app.Core.settings.getCache().password
27
- });
28
- await this.connect();
26
+ await super.onServiceInit();
27
+ this.startAttemptDelay = 5 * 1000;
28
+ this.maxStartAttempts = 3;
29
+ }
30
+ async onStart() {
31
+ await super.onStart();
32
+ return this.connect();
29
33
  }
30
- connect() {
31
- this.client.on('error', this.onClientError.bind(this));
32
- return new Promise((resolve, reject) => {
33
- this.client.connect().then(() => {
34
- this.log('Redis client connected.', 'success');
35
- resolve(true);
36
- }).catch(reason => {
37
- new _app.ErrorHandler('Error on conecting Redis', reason);
38
- reject(reason);
34
+ async onStartFail() {
35
+ await super.onStartFail();
36
+ this.log(`Not possible to connect Redis`, 'danger');
37
+ }
38
+ async connect() {
39
+ if (this.isConnected) return true;
40
+ if (this.isReconnecting) return false;
41
+ this.log(`⌛️ Connecting to Redis Server: ${this.currentStartAttempts}/${this.maxStartAttempts}`);
42
+ this.isReconnecting = true;
43
+ try {
44
+ const queryConnect = `redis://${_app.Core.settings.getCache().host}:${_app.Core.settings.getCache().port}`;
45
+ const password = _app.Core.settings.getCache().password;
46
+ this.client = (0, _redis.createClient)({
47
+ url: queryConnect,
48
+ password
39
49
  });
40
- });
50
+ await this.client.connect();
51
+ this.isConnected = true;
52
+ this.isReconnecting = false;
53
+ this.setupErrorHandles();
54
+ this.log(`✅ Redis Connection is ready`);
55
+ return true;
56
+ } catch (error) {
57
+ (0, _utils.logger)().error(error, `Not connected to Redis Server`);
58
+ this.isReconnecting = false;
59
+ return false;
60
+ }
41
61
  }
42
- async disconnect() {
43
- await this.client.quit();
62
+ setupErrorHandles() {
63
+ this.client.on('error', err => {
64
+ new _app.ErrorHandler('falha na conexão Redis', err);
65
+ this.isConnected = false;
66
+ });
44
67
  }
45
68
 
46
69
  //* Common
@@ -57,10 +80,5 @@ class RedisService extends _service.default {
57
80
  createCache(key) {
58
81
  return new _cache.RedisCache(this.client, key);
59
82
  }
60
-
61
- //* Events
62
- onClientError(err) {
63
- new _app.ErrorHandler('Error on init redis client', err);
64
- }
65
83
  }
66
84
  var _default = exports.default = RedisService;
@@ -5,7 +5,7 @@ declare class SecurityService extends Service {
5
5
  private privateKey;
6
6
  private publicKey;
7
7
  private servicePublicKey;
8
- onServiceInit(): Promise<void>;
8
+ onStart(): Promise<boolean>;
9
9
  private checkPaths;
10
10
  private loadPrivateKey;
11
11
  private loadPublicKey;
@@ -1 +1 @@
1
- {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/services/security.ts"],"names":[],"mappings":"AAEA,OAAO,EAAO,GAAG,EAAO,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAQ,OAAO,EAAgB,MAAM,QAAQ,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,cAAM,eAAgB,SAAQ,OAAO;IACnC,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,gBAAgB,CAAU;IAE5B,aAAa;IAOnB,OAAO,CAAC,UAAU;YAMJ,cAAc;YAad,aAAa;IAMd,cAAc;;;;IASd,oBAAoB;IAUpB,YAAY,CAAC,IAAI,EAAE,MAAM;IAS/B,aAAa;IAQb,YAAY;IAQZ,mBAAmB;IASb,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,CAAC,GAAG;IAyB3C,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC;IAkBhF,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,CAAC,GAAG;IAyBzC,eAAe,CAAC,CAAC,GAAG,GAAG,EAClC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,GAAG,CAAC,GAAG,GACjB,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IAiBjD,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAoBtD,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK;CAgBhE;AAED,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/services/security.ts"],"names":[],"mappings":"AAEA,OAAO,EAAO,GAAG,EAAO,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAQ,OAAO,EAAgB,MAAM,QAAQ,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,cAAM,eAAgB,SAAQ,OAAO;IACnC,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,gBAAgB,CAAU;IAErB,OAAO;IAWpB,OAAO,CAAC,UAAU;YAMJ,cAAc;YAad,aAAa;IAMd,cAAc;;;;IASd,oBAAoB;IAUpB,YAAY,CAAC,IAAI,EAAE,MAAM;IAS/B,aAAa;IAQb,YAAY;IAQZ,mBAAmB;IASb,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,CAAC,GAAG;IAyB3C,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC;IAkBhF,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,CAAC,GAAG;IAyBzC,eAAe,CAAC,CAAC,GAAG,GAAG,EAClC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,GAAG,CAAC,GAAG,GACjB,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IAiBjD,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAoBtD,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK;CAgBhE;AAED,eAAe,eAAe,CAAC"}
@@ -16,11 +16,13 @@ class SecurityService extends _app.Service {
16
16
  privateKey;
17
17
  publicKey;
18
18
  servicePublicKey;
19
- async onServiceInit() {
19
+ async onStart() {
20
+ await super.onStart();
20
21
  this.checkPaths();
21
22
  await this.loadPrivateKey();
22
23
  await this.loadPublicKey();
23
24
  await this.loadServicePublicKey();
25
+ return true;
24
26
  }
25
27
  checkPaths() {
26
28
  !fs.existsSync(_app.Core.settings.getAuthentication().certPath) && fs.mkdirSync(_app.Core.settings.getAuthentication().certPath, {
@@ -10,8 +10,13 @@ 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 isReconnecting;
14
+ private isMasterConnected;
15
+ private isServiceConnected;
13
16
  onServiceInit(): Promise<void>;
14
- connectDatabases(): Promise<unknown>;
17
+ onStart(): Promise<boolean>;
18
+ onStartFail(): Promise<void>;
19
+ connectDatabases(): Promise<boolean>;
15
20
  getDB(tenantId: string): Promise<false | Sequelize>;
16
21
  createDB(hostUuid: string, name: string): Promise<boolean>;
17
22
  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;IACpC,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;IAG5B,aAAa;IASb,gBAAgB;IA8BhB,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"}
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,cAAc,CAAS;IAC/B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,kBAAkB,CAAS;IAGtB,aAAa;IAiBb,OAAO;IAMP,WAAW;IAMlB,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,57 @@ class SequelizeService extends _service.default {
27
27
  connections;
28
28
  initializedModels;
29
29
  relations;
30
+ isReconnecting = false; // Flag para evitar múltiplas tentativas simultâneas de reconexão
31
+ isMasterConnected = false; // Flag para controlar o estado da conexão
32
+ isServiceConnected = false; // Flag para controlar o estado da conexão
30
33
 
31
34
  //# Initialization
32
35
  async onServiceInit() {
36
+ await super.onServiceInit();
37
+ if (!this.models) throw new Error('Models are requireds! Call registerModels(modelsArray)');
33
38
  this.serviceDB = _database.serviceDB;
34
39
  this.masterDB = _database.masterDB;
35
40
  this.connections = new Map();
36
41
  this.initializedModels = new Map();
37
42
  this.relations = new Map();
38
- await this.connectDatabases();
43
+ this.models = [...this.models, ..._models.NativeModels];
44
+ this.startAttemptDelay = 5 * 1000;
45
+ this.maxStartAttempts = 3;
46
+ }
47
+ async onStart() {
48
+ await super.onStart();
49
+ return this.connectDatabases();
50
+ }
51
+ async onStartFail() {
52
+ await super.onStartFail();
53
+ this.log(`Not possible to connect database`, 'danger');
39
54
  }
40
55
  async connectDatabases() {
41
- if (!this.models) throw new Error('Models are requireds! Call registerModels(modelsArray)');
42
-
43
- // #Include native models
44
- this.models = [...this.models, ..._models.NativeModels];
45
- return new Promise((resolve, reject) => {
46
- this.masterDB.sync({
47
- force: false
48
- }).then(() => {
56
+ if (this.isMasterConnected && this.isServiceConnected) return true;
57
+ if (this.isReconnecting) return false;
58
+ this.log(`⌛️ Connecting Sequelize to database: ${this.currentStartAttempts}/${this.maxStartAttempts}`);
59
+ try {
60
+ if (!this.isMasterConnected) {
61
+ await this.masterDB.sync({
62
+ force: false
63
+ });
64
+ this.isMasterConnected = true;
49
65
  this.log('✅ Connected master database sucessfully', 'success');
50
- this.serviceDB.sync({
66
+ }
67
+ if (!this.isServiceConnected) {
68
+ await this.serviceDB.sync({
51
69
  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
70
  });
59
- }).catch(reason => {
60
- new _app.ErrorHandler('Não foi possível inicializar a conexão com MasterDB', reason);
61
- reject(reason);
62
- });
63
- });
71
+ this.isServiceConnected = true;
72
+ this.log(' Connected service database sucessfully', 'success');
73
+ }
74
+ this.log('✅ All databases connecteds sucessfully', 'success');
75
+ return true;
76
+ } catch (error) {
77
+ (0, _logger.default)().error(error, `Not connected Sequelize to database`);
78
+ this.isReconnecting = false;
79
+ return false;
80
+ }
64
81
  }
65
82
 
66
83
  // #Database
@@ -10,6 +10,7 @@ declare class SocketIOService extends Service {
10
10
  private eventhandlers;
11
11
  private clientHandlers;
12
12
  onServiceClusterInit(): Promise<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;AAStE,cAAM,eAAgB,SAAQ,OAAO;IAC5B,MAAM,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,cAAc,CAAsC;IAEtD,oBAAoB;YAYZ,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;IAGlD,MAAM,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC,OAAO,mBAAmB,CAAC,EAAE;YAIxD,gBAAgB;CAY/B;AAED,eAAe,eAAe,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;IAE/C,oBAAoB;IAMpB,cAAc;YAiBb,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"}
@@ -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
@@ -24,15 +25,23 @@ class SocketIOService extends _service.default {
24
25
  eventhandlers;
25
26
  clientHandlers = [];
26
27
  async onServiceClusterInit() {
27
- if (!this.mainRouter) throw new Error('Need router'); //!sem router
28
-
29
- this.createSocket(_express.default.singleton().getHttpServer());
28
+ await super.onServiceClusterInit();
30
29
  this.eventhandlers = new Map();
31
- // this.clientHandlers = [];
30
+ }
31
+ async onStartCluster() {
32
+ await super.onStartCluster();
33
+ if (!this.mainRouter) throw new Error('Need router'); //!sem router
32
34
 
33
- await this.registerHandlers();
34
- this.server.on('connection', this.onConnection.bind(this));
35
- this.log('Socket server created');
35
+ try {
36
+ this.createSocket(_express.default.getService().getHttpServer());
37
+ await this.registerHandlers();
38
+ this.server.on('connection', this.onConnection.bind(this));
39
+ this.log('✅ Socket server created');
40
+ return true;
41
+ } catch (error) {
42
+ (0, _utils.logger)().error(error, `Not connected to SocketIO`);
43
+ return false;
44
+ }
36
45
  }
37
46
  async onConnection(socket) {
38
47
  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
- private jobsPath;
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;AAIpC,cAAM,gBAAiB,SAAQ,eAAe,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACnE,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,QAAQ,CAAM;IAEhB,aAAa;YAmBL,aAAa;YAUb,cAAc;IAMf,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC;CAuB5C;AAED,eAAe,gBAAgB,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
- jobsPath = '';
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...', 'info');
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
- private jobsPath;
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":"AAGA,OAAO,eAAe,MAAM,oBAAoB,CAAC;AACjD,OAAO,YAAY,MAAM,iBAAiB,CAAC;AAG3C,cAAM,oBAAqB,SAAQ,eAAe,CAAC,OAAO,YAAY,CAAC;IACrE,OAAO,CAAC,QAAQ,CAAM;IAEhB,aAAa;YAaL,aAAa;YAcb,cAAc;YAOd,SAAS;CAcxB;AAED,eAAe,oBAAoB,CAAC"}
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
- jobsPath = '';
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();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "exodus-framework",
3
- "version": "2.0.893",
3
+ "version": "2.0.895",
4
4
  "description": "Exodus Framework",
5
5
  "author": "jhownpaixao",
6
6
  "license": "ISC",