applay-utils 1.9.0 → 1.9.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "applay-utils",
3
- "version": "1.9.0",
3
+ "version": "1.9.2",
4
4
  "description": "Utilitary tools for Applay applications",
5
5
  "scripts": {
6
6
  "build": "npm version patch",
package/utils/mdb.js CHANGED
@@ -7,49 +7,87 @@ var MDB = {
7
7
  clients: {}
8
8
  }
9
9
 
10
- var connect = (alias, url, callback) => {
10
+ var shutdownHandlersRegistered = false;
11
+
12
+ // Fecha todos os pools de conexão conhecidos (um por URL distinta), não só o
13
+ // da conexão que originou o evento. Antes disso, cada connect() registrava
14
+ // seu próprio listener de SIGTERM/SIGINT/uncaughtException no `process`
15
+ // (um a mais por URL), então uma única uncaughtException não relacionada a
16
+ // Mongo derrubava todos os pools simultaneamente e o processo inteiro, além
17
+ // de acumular listeners duplicados (MaxListenersExceededWarning) a cada
18
+ // nova URL conectada.
19
+ var closeAllPools = (finish) => {
20
+ for (var url of Object.keys(MDB.clients)) {
21
+ if (!MDB.status[url]) { continue; }
22
+ MDB.status[url] = false;
23
+ try {
24
+ MDB.clients[url].close();
25
+ } catch (e) {
26
+ console.log('Erro ao fechar conexão Mongo', url, e);
27
+ }
28
+ console.log('Mongodb', url, 'OFF');
29
+ }
30
+
31
+ if (!finish) { return; }
32
+
33
+ if (MDB.stopCustom) {
34
+ MDB.stop('all', () => {
35
+ setTimeout(() => { process.exit(); }, 100);
36
+ });
37
+ } else {
38
+ setTimeout(() => { process.exit(); }, 100);
39
+ }
40
+ }
41
+
42
+ var registerShutdownHandlersOnce = () => {
43
+ if (shutdownHandlersRegistered) { return; }
44
+ shutdownHandlersRegistered = true;
45
+ process.on('SIGTERM', () => closeAllPools(true));
46
+ process.on('SIGINT', () => closeAllPools(true));
47
+ process.on('uncaughtException', (err) => {
48
+ console.log('ERRO MDB -- uncaughtException -- TRACKING -- ', err);
49
+ closeAllPools(true);
50
+ });
51
+ }
52
+
53
+ var pendingConnections = {};
54
+
55
+ // `onError` é opcional (mantém compatibilidade com chamadores antigos que só
56
+ // passavam callback de sucesso). Antes, um erro de conexão (ex: ECONNREFUSED
57
+ // durante failover do replica set) só era logado e o callback nunca era
58
+ // chamado — quem chamava connectAsync ficava com a Promise pendurada para
59
+ // sempre. Além disso, várias chamadas concorrentes para a mesma URL durante
60
+ // uma instabilidade abriam um MongoClient.connect() cada uma (thundering
61
+ // herd); agora elas compartilham a mesma tentativa de conexão em andamento.
62
+ var connect = (alias, url, callback, onError) => {
11
63
  if (MDB.status[url]) { return callback(MDB.clients[url]); }
64
+
65
+ if (pendingConnections[url]) {
66
+ return pendingConnections[url].then(callback, (err) => { if (onError) { onError(err); } });
67
+ }
68
+
12
69
  console.log('===============>>>>>>> NOVO POOL DE CONEXÃO MDB ', url, alias);
13
-
70
+
14
71
  const separator = url.includes('?') ? '&' : '/?';
15
72
  const uriparams = `${separator}appName=${alias}&minPoolSize=2&maxPoolSize=10&maxIdleTimeMS=30000&serverSelectionTimeoutMS=5000`;
16
-
17
- MongoBase.MongoClient.connect(url + uriparams, (err, client) => {
18
- if (err) { return console.log('ERRO MDB -- TRACKING -- ', err); }
19
- MDB.status[url] = true;
20
- MDB.clients[url] = client;
21
- process.on('SIGTERM', internalStop(url, true, 'SIGTERM'));
22
- process.on('SIGINT', internalStop(url, true, 'SIGINT'));
23
- process.on('uncaughtException', internalStop(url, true, 'uncaughtException'));
24
- callback(client);
25
- });
26
- }
27
73
 
28
- var connectAsync = (alias, url) => new Promise(resolve => connect(alias, url, (client) => resolve(client)));
29
-
30
- var internalStop = (alias, finish) => {
31
- return (code) => {
32
- // console.log('Desconnecting...');
33
- if (!MDB.status[alias]) { console.log('Mongodb OFF'); return }
34
- MDB.status[alias] = false;
35
- MDB.clients[alias].close();
36
- if (finish && MDB.stopCustom) {
37
- MDB.stop(alias, () => {
38
- console.log('Mongodb', alias, 'OFF');
39
- setTimeout(() => { process.exit(); },100)
40
- });
41
- }
42
- if (finish && !MDB.stopCustom) {
43
- console.log('Mongodb', alias, 'OFF');
44
- setTimeout(() => { process.exit(); }, 100)
45
- }
46
- if (!finish) {
47
- console.log('Mongodb', alias, 'OFF');
48
- }
49
- }
74
+ registerShutdownHandlersOnce();
50
75
 
76
+ pendingConnections[url] = new Promise((resolve, reject) => {
77
+ MongoBase.MongoClient.connect(url + uriparams, (err, client) => {
78
+ delete pendingConnections[url];
79
+ if (err) { console.log('ERRO MDB -- TRACKING -- ', err); return reject(err); }
80
+ MDB.status[url] = true;
81
+ MDB.clients[url] = client;
82
+ resolve(client);
83
+ });
84
+ });
85
+
86
+ pendingConnections[url].then(callback, (err) => { if (onError) { onError(err); } });
51
87
  }
52
88
 
89
+ var connectAsync = (alias, url) => new Promise((resolve, reject) => connect(alias, url, (client) => resolve(client), (err) => reject(err)));
90
+
53
91
 
54
92
  var stopCustom = (customCallback) => {
55
93
  MDB.stopCustom = true;
package/utils/querys.js CHANGED
@@ -72,7 +72,7 @@ var querys = {
72
72
  // console.log("🚀 ~ listaOps", listaOps)
73
73
 
74
74
  db.collection(collection).bulkWrite(listaOps, (err, result) => {
75
- if (err) { console.log('Erro bulkwrite cad: ', err); }
75
+ if (err) { console.log('Erro bulkwrite cad: ', err); return resolve({ status: false, err }); }
76
76
 
77
77
  var ids = result.getInsertedIds();
78
78
  ids.forEach(e => dataBuild[e.index]._reg.objId = e._id + '');
@@ -94,7 +94,7 @@ var querys = {
94
94
  var listaOps = mdb.genOpsUpdate(data, param);
95
95
  // console.log(listaOps)
96
96
  db.collection(collection).bulkWrite(listaOps, (err, result) => {
97
- if (err) { console.log('Erro bulkwrite cad: ', err); }
97
+ if (err) { console.log('Erro bulkwrite cad: ', err); return resolve({ status: false, err }); }
98
98
  var result = result.result;
99
99
  resolve({ status: true, result });
100
100
  });
@@ -102,7 +102,7 @@ var querys = {
102
102
  'updateManyAsync':(db,collection,data) => new Promise(resolve=>{
103
103
  var listaOps = mdb.genOpsFull(data, 'save');
104
104
  db.collection(collection).bulkWrite(listaOps, (err, result) => {
105
- if (err) { console.log('Erro bulkwrite cad: ', err); }
105
+ if (err) { console.log('Erro bulkwrite cad: ', err); return resolve({status:false,err}); }
106
106
  var ids = result.getInsertedIds();
107
107
  resolve({status:true,ids:ids});
108
108
  });