bonsaif 1.10.3

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.
@@ -0,0 +1,622 @@
1
+ /**
2
+ * ::: B[]NSAIF() ::: => 2022
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const utl = require('../utl');
8
+ let debug = false;
9
+ let tag = ` ::: B[]NSAIF() ::: => redis.js `;
10
+
11
+
12
+ const scan=async(options,db, key)=>{
13
+ const exec = require("./exec");
14
+ const redisConn = await exec.redisConn(options);
15
+ const start = Date.now();
16
+ return new Promise((resolve, reject)=>{
17
+ try{
18
+ redisConn.select(db,function() { /* ... */ });
19
+ const redisScan = require('node-redis-scan');
20
+ const scanner = new redisScan(redisConn);
21
+ scanner.scan(key, (err, matchingKeys) => {
22
+ if (err) throw(err);
23
+ const end = Date.now();
24
+ const time = end - start;
25
+ resolve({"count":matchingKeys.length, "keys":matchingKeys, "time":utl.milisegundosASegundos(time)});
26
+
27
+ try{
28
+ exec.redisClose(redisConn);
29
+ }catch(e){
30
+ utl.log('err.scan '+e);
31
+ }
32
+ });
33
+ }catch(e){
34
+ utl.log('err scan: '+e);
35
+ }
36
+ })
37
+ }
38
+
39
+ const set=async(options, db, key, value, expire )=>{
40
+ const exec = require("./exec");
41
+ const redisConn = await exec.redisConn(options);
42
+ const start = Date.now();
43
+ expire = expire!=null?expire*1:0; // tls en segundo
44
+ return new Promise((resolve, reject)=>{
45
+ try{
46
+ redisConn.select(db,function() { /* ... */ });
47
+ redisConn.set(key, value, function (err, res) {
48
+ const end = Date.now();
49
+ const time = end - start;
50
+ if (expire>0){
51
+ redisConn.expire(key, expire, function(expErr,expRes){
52
+ resolve({"set":key, "expire":expire, "expRes":expRes, "err":err, "res":res, "time":utl.milisegundosASegundos(time)});
53
+ });
54
+ }else{
55
+ resolve({"set":key, "expire":expire, "err":err, "res":res, "time":utl.milisegundosASegundos(time)});
56
+ }
57
+ try{
58
+ exec.redisClose(redisConn);
59
+ }catch(e){
60
+ utl.log('err.set '+e);
61
+ }
62
+ });
63
+ }catch(e){
64
+ utl.log('err setKey'+e);
65
+ }
66
+ })
67
+ }
68
+
69
+ const get=async( options, db, key )=>{
70
+ const exec = require("./exec");
71
+ const redisConn = await exec.redisConn(options);
72
+ const start = Date.now();
73
+
74
+ return new Promise((resolve, reject)=>{
75
+ try{
76
+ redisConn.select(db,function() { /* ... */ });
77
+ redisConn.get(key, function (err, res) {
78
+ const end = Date.now();
79
+ const time = end - start;
80
+
81
+ resolve({"get":key, "err":err, "res":res, "time":utl.milisegundosASegundos(time)});
82
+ try{
83
+ exec.redisClose(redisConn);
84
+ }catch(e){
85
+ utl.log('err.get '+e);
86
+ }
87
+ });
88
+ }catch(e){
89
+ utl.log('err getKey'+e);
90
+ }
91
+ })
92
+ }
93
+
94
+
95
+ const incrby=async(options, db, key,value,expire, counter )=>{
96
+ const exec = require("./exec");
97
+ const redisConn = await exec.redisConn(options);
98
+ expire = expire!=null?expire*1:0; // tls en segundo
99
+ counter = counter!=null?counter*1:0; // incremental
100
+ value = value ? !isNaN(value) ? value*1: 1 :1; // valor
101
+ const start = Date.now();
102
+ return new Promise((resolve, reject)=>{
103
+ get(options,db,key)
104
+ .then(r=>{
105
+ if (r.res==null){ // no existe
106
+ set(options,db,key,value,expire)
107
+ .then(r=>{
108
+ console.log({r});
109
+ const end = Date.now();
110
+ const time = end - start;
111
+ resolve({"set":key, "expire":expire, "err":null, "res":value, "counter":0, "time":utl.milisegundosASegundos(time)});
112
+ });
113
+ }else{
114
+ redisConn.select(db,function() { /* ... */ });
115
+ redisConn.incrby(key, counter, function (err, res) {
116
+ const end = Date.now();
117
+ const time = end - start;
118
+ resolve({"set":key, "expire":expire, "err":err, "res":res, "counter":counter, "time":utl.milisegundosASegundos(time)});
119
+ try{
120
+ exec.redisClose(redisConn);
121
+ }catch(e){
122
+ utl.log('err.incr '+e);
123
+ }
124
+ });
125
+ }
126
+ });
127
+ })
128
+ }
129
+
130
+
131
+ const incrbyfloat=async( options,db, key, value, expire, counter )=>{
132
+ const exec = require("./exec");
133
+ const redisConn = await exec.redisConn(options);
134
+ expire = expire!=null?expire*1:0; // tls en segundo
135
+ counter = counter!=null?counter*1:0; // incremental
136
+ value = value ? !isNaN(value) ? value*1: 1 :1; // valor
137
+ const start = Date.now();
138
+ return new Promise((resolve, reject)=>{
139
+ get(options,db,key)
140
+ .then(r=>{
141
+ if (r.res==null){ // no existe
142
+ set(options,db,key,value,expire)
143
+ .then(r=>{
144
+ console.log({r});
145
+ const end = Date.now();
146
+ const time = end - start;
147
+
148
+ resolve({"set":key, "expire":expire, "err":null, "res":value, "counter":0, "time":utl.milisegundosASegundos(time)});
149
+ });
150
+ }else{
151
+ redisConn.select(db,function() { /* ... */ });
152
+ redisConn.incrbyfloat(key,counter, function (err, res) {
153
+ const end = Date.now();
154
+ const time = end - start;
155
+
156
+ resolve({"set":key, "expire":expire, "err":err, "res":res, "counter":counter, "time":utl.milisegundosASegundos(time)});
157
+
158
+ try{
159
+ exec.redisClose(redisConn);
160
+ }catch(e){
161
+ utl.log('err.incr '+e);
162
+ }
163
+ });
164
+ }
165
+ });
166
+ })
167
+ }
168
+
169
+ const sadd=async(options, db, key, value )=>{ // SADD key member [member ...]
170
+ const exec = require("./exec");
171
+ const redisConn = await exec.redisConn(options);
172
+ const start = Date.now();
173
+
174
+ if (typeof value === 'object'){
175
+ value = JSON.stringify(value);
176
+ }
177
+
178
+ return new Promise((resolve, reject)=>{
179
+ try{
180
+ redisConn.select(db,function() { /* ... */ });
181
+ redisConn.sadd(key, value, function (err, res) {
182
+
183
+ const end = Date.now();
184
+ const time = end - start;
185
+
186
+ resolve({"sadd":key, "err":err, "res":res, "time":utl.milisegundosASegundos(time)});
187
+ try{
188
+ exec.redisClose(redisConn);
189
+ }catch(e){
190
+ utl.log('err.sadd '+e);
191
+ }
192
+ });
193
+ }catch(e){
194
+ utl.log('err sadd'+e);
195
+ }
196
+ })
197
+ }
198
+
199
+ const srem=async( options,db, key, value )=>{ //key member [member ...]
200
+ const exec = require("./exec");
201
+ const redisConn = await exec.redisConn(options);
202
+ const start = Date.now();
203
+
204
+ if (typeof value === 'object'){
205
+ value = JSON.stringify(value);
206
+ }
207
+
208
+ return new Promise((resolve, reject)=>{
209
+ try{
210
+ redisConn.select(db,function() { /* ... */ }); //base 1
211
+ redisConn.srem(key, value, function (err, res) {
212
+ const end = Date.now();
213
+ const time = end - start;
214
+
215
+ resolve({"srem":key, "value":value, "err":err, "res":res, "time":utl.milisegundosASegundos(time)});
216
+ try{
217
+ exec.redisClose(redisConn);
218
+ }catch(e){
219
+ utl.log('err.srem '+e);
220
+ }
221
+ });
222
+ }catch(e){
223
+ utl.log('err del'+e);
224
+ }
225
+ })
226
+ }
227
+
228
+ const smembers=async( options, db, key, toJson )=>{ // SMEMBERS key
229
+ toJson = toJson!=null?toJson*1:0;
230
+ const exec = require("./exec");
231
+
232
+ const redisConn = await exec.redisConn(options);
233
+ const start = Date.now();
234
+ return new Promise((resolve, reject)=>{
235
+ try{
236
+ redisConn.select(db,function() { /* ... */ }); //base 1
237
+ redisConn.smembers(key, function (err, res) {
238
+
239
+ const end = Date.now();
240
+ const time = end - start;
241
+
242
+ resolve({"smembers":key, "err":err, "res":toJson==1?utl.ArraytoJson(res):res, "time":utl.milisegundosASegundos(time)});
243
+ try{
244
+ exec.redisClose(redisConn);
245
+ }catch(e){
246
+ utl.log('err.smembers '+e);
247
+ }
248
+ });
249
+ }catch(e){
250
+ utl.log('err smembers'+e);
251
+ }
252
+ })
253
+ }
254
+
255
+ const hset=async( options,db, key, values )=>{ // HSET key field value [ field value ...]
256
+ const exec = require("./exec");
257
+ const redisConn = await exec.redisConn(options);
258
+ const start = Date.now();
259
+ let Fields = new Array();
260
+ //Siempre el value debe estar en json
261
+ for (const [key, value] of Object.entries(values)) {
262
+ Fields.push(key);
263
+ Fields.push(value);
264
+ }
265
+
266
+ return new Promise((resolve, reject)=>{
267
+ try{
268
+ redisConn.select(db,function() { /* ... */ }); //base 1
269
+ // hset con multiples campos esta depreciado en versiones mayores a node 6
270
+ redisConn.hmset(key, Fields, function (err, res) {
271
+ const end = Date.now();
272
+ const time = end - start;
273
+ resolve({"hset":key, "err":err, "res":res, "value":values, "time":utl.milisegundosASegundos(time)});
274
+ try{
275
+ exec.redisClose(redisConn);
276
+ }catch(e){
277
+ utl.log('err.hset '+e);
278
+ }
279
+ });
280
+ }catch(e){
281
+ utl.log('err hset'+e);
282
+ }
283
+ })
284
+ }
285
+
286
+ const hgetall=async(options, db, key )=>{ // SMEMBERS key
287
+ const exec = require("./exec");
288
+ const redisConn = await exec.redisConn(options);
289
+ const start = Date.now();
290
+ return new Promise((resolve, reject)=>{
291
+ try{
292
+ redisConn.select(db,function() { /* ... */ }); //base 1
293
+ redisConn.hgetall(key, function (err, res) {
294
+ const end = Date.now();
295
+ const time = end - start;
296
+ resolve({"hgetall":key, "err":err, "res":res, "time":utl.milisegundosASegundos(time)});
297
+ try{
298
+ exec.redisClose(redisConn);
299
+ }catch(e){
300
+ utl.log('err.hgetall '+e);
301
+ }
302
+ });
303
+ }catch(e){
304
+ utl.log('err hgetall'+e);
305
+ }
306
+ })
307
+ }
308
+
309
+ const del=async( options,db, key )=>{ //DEL key [key ...]
310
+ const exec = require("./exec");
311
+ const redisConn = await exec.redisConn(options);
312
+ const start = Date.now();
313
+ return new Promise((resolve, reject)=>{
314
+ try{
315
+ redisConn.select(db,function() { /* ... */ }); //base 1
316
+ redisConn.del(key, function (err, res) {
317
+ const end = Date.now();
318
+ const time = end - start;
319
+
320
+ resolve({"del":key, "err":err, "res":res, "time":utl.milisegundosASegundos(time)});
321
+ try{
322
+ exec.redisClose(redisConn);
323
+ }catch(e){
324
+ utl.log('err.del '+e);
325
+ }
326
+ });
327
+ }catch(e){
328
+ utl.log('err del'+e);
329
+ }
330
+ })
331
+ }
332
+
333
+ // Busca llaves de un hash con la combinacion de busquedas similar a un where
334
+ // 2022/04/26 VRSZ Se cambia la busqueda de rows
335
+ const hfind=async(options,db, key, filter, order, limit=100)=>{
336
+ let {field:orderBy, val:orderVal} = getFirstField(order);
337
+
338
+ //2022/10/14 VRSZ Se realiza regla para combinar sentencias IN, AND, y/o OR
339
+ let query = '';
340
+ let qfilter = filter;
341
+ try{
342
+ for (let key in filter){
343
+ if (query.length>0){
344
+ query = query + ` && `;
345
+ }
346
+ query = query + " (" +filtertoFind(qfilter,'json') +")";
347
+ delete qfilter[key];
348
+ }
349
+ }catch(e){
350
+ log('err.hfind.filter:'+e);
351
+ }
352
+ //console.log('query=>>>>>>>>>>',query);
353
+ const start = Date.now();
354
+ return new Promise((resolve, reject)=>{
355
+ smembers(options,db, key)
356
+ .then(r=>{
357
+ // 2022/04/27 VRSZ Realizar busqueda con filtros o regresar toda la info
358
+ //let hfind = value=='*'?utl.ArraytoJson(r.res):utl.ArraytoJson(r.res).find(e=>e[field]==value);
359
+ let hfind = new Array();
360
+ let res = utl.ArraytoJson(r.res);
361
+
362
+ let irow=1;
363
+ res.map(r=>{
364
+ let json = r;
365
+ if (irow<=limit){
366
+ if (query!=''){
367
+ eval (` if (${query}) { hfind.push(r); irow++; } `);
368
+ }else{
369
+ hfind.push(r);
370
+ irow++;
371
+ }
372
+ }
373
+ })
374
+ hfind = orderBy==""?hfind:utl.sort(hfind, orderBy, orderVal);
375
+ const end = Date.now();
376
+ const time = end - start;
377
+ resolve({"key":key, "filter":filter, "time":utl.milisegundosASegundos(time), "hfind":hfind});
378
+ }
379
+ );
380
+ });
381
+ }
382
+
383
+ const upsert=async(options,db,key,json_obj,id,vid,expire)=>{
384
+ //2022/04/26 VRSZ Se cambia forma de guardar tablas de sql a redis
385
+ const start = Date.now();
386
+ return new Promise((resolve, reject)=>{
387
+ smembers(options,db,key)
388
+ .then(r=>{
389
+ let lt = r.res; //console.log(lt);
390
+ let keyId = '';
391
+ for (let x of lt){
392
+ const xjson = JSON.parse(x);
393
+ try{
394
+ eval (" if (xjson."+id+"=='"+vid+"'){ keyId = x } ");
395
+ if (keyId!=''){
396
+ break;
397
+ }
398
+ }catch(e){
399
+ }
400
+ }
401
+ //console.log(':::::::::: keyId ['+keyId+']');
402
+ if (keyId==''){
403
+ sadd(options,db,key,JSON.stringify(json_obj),expire)
404
+ .then(r=>{
405
+ const end = Date.now();
406
+ const time = end - start;
407
+ resolve({"upsert":key, "dml":"insert", "expire":expire, "err":null, "res":r, "time":utl.milisegundosASegundos(time)});
408
+ });
409
+ }else{
410
+ srem(options, db, key, keyId )
411
+ .then(r=>{
412
+ sadd(options,db,key,JSON.stringify(json_obj),0)
413
+ .then(r=>{
414
+ const end = Date.now();
415
+ const time = end - start;
416
+ resolve({"upsert":key, "dml":"update", "expire":expire, "err":null, "res":r, "time":utl.milisegundosASegundos(time)});
417
+ });
418
+ });
419
+ }
420
+ });
421
+ });
422
+ }
423
+
424
+ const expireat=async(options, db, key, expire )=>{
425
+ const exec = require("./exec");
426
+ const redisConn = await exec.redisConn(options);
427
+ const start = Date.now();
428
+ expire = expire!=null?expire*1:0; // tls en segundo
429
+ return new Promise((resolve, reject)=>{
430
+ try{
431
+ redisConn.select(db,function() { /* ... */ });
432
+ redisConn.expire(key, expire, function (err, res) {
433
+ const end = Date.now();
434
+ const time = end - start;
435
+ resolve({"expireat":key, "expire":expire, "err":err, "res":res, "time":utl.milisegundosASegundos(time)});
436
+ try{
437
+ exec.redisClose(redisConn);
438
+ }catch(e){
439
+ utl.log('err.expireat:'+e);
440
+ }
441
+ });
442
+ }catch(e){
443
+ utl.log('err expireat:'+e);
444
+ }
445
+ })
446
+ }
447
+
448
+ const setnx=async(options, db, key, value, expire )=>{
449
+ const exec = require("./exec");
450
+ const redisConn = await exec.redisConn(options);
451
+ const start = Date.now();
452
+ expire = expire!=null?expire*1:0; // tls en segundo
453
+ return new Promise((resolve, reject)=>{
454
+ try{
455
+ redisConn.select(db,function() { /* ... */ });
456
+ redisConn.setnx(key, value, function (err, res) {
457
+ const end = Date.now();
458
+ const time = end - start;
459
+ if (expire>0){
460
+ redisConn.expire(key, expire, function(expErr,expRes){
461
+ resolve({"set":key, "expire":expire, "expRes":expRes, "err":err, "res":res, "time":utl.milisegundosASegundos(time)});
462
+ });
463
+ }else{
464
+ resolve({"set":key, "expire":expire, "err":err, "res":res, "time":utl.milisegundosASegundos(time)});
465
+ }
466
+ try{
467
+ exec.redisClose(redisConn);
468
+ }catch(e){
469
+ utl.log('err.set '+e);
470
+ }
471
+ });
472
+ }catch(e){
473
+ utl.log('err setKey'+e);
474
+ }
475
+ })
476
+ }
477
+
478
+ const api=async(options, dbm, json)=>{
479
+ const exec = require("./exec");
480
+
481
+ const start = Date.now();
482
+ let dml = '', key='';
483
+ let expire = json.expire!=null ? json.expire:0;
484
+ let filter = json.filter!=null ? json.filter:{};
485
+ let value = json.value!=null ? json.value:{};
486
+ let order = json.order!=null ? json.order:{};
487
+ let counter = json.counter!=null?json.counter:0;
488
+ let toJson = json.toJson!=null?json.toJson:0;
489
+ let limit = json.limit!=null?json.limit:100;
490
+
491
+ let {field:id, val:vid} = getFirstField(filter);
492
+
493
+ let ltdml = ['hfind','upsert','set','get','scan','incrby','sadd','srem','smembers','hset','hgetall','del','incrbyfloat','expireat','setnx'];
494
+ for (let x of ltdml){
495
+ if (utl.ObjectEmpty(json,x)){
496
+ dml = x; break;
497
+ }
498
+ }
499
+
500
+ try{ eval(` key = json.${dml}; `); } catch(e){}
501
+
502
+ let r;
503
+ switch (dml){
504
+ case 'set': r = await set(options,dbm,key,value,expire); break;
505
+ case 'get': r = await get(options,dbm,key); break;
506
+ case 'hfind': r = await hfind(options,dbm,key,filter,order,limit); break;
507
+ case 'upsert': r = await upsert(options,dbm,key,value,id,vid,expire); break;
508
+ case 'scan': r = await scan(options,dbm, key); break;
509
+ case 'incrby': r = await incrby(options,dbm,key,value,expire,counter); break;
510
+ case 'sadd': r = await sadd(options,dbm,key,value,expire); break;
511
+ case 'srem': r = await srem(options,dbm,key,value); break;
512
+ case 'smembers': r = await smembers(options,dbm,key,toJson); break;
513
+ case 'hset': r = await hset(options,dbm,key,value,expire); break;
514
+ case 'hgetall': r = await hgetall(options,dbm,key); break;
515
+ case 'del': r = await del(options,dbm,key); break;
516
+ case 'incrbyfloat': r = await incrbyfloat(options,dbm,key,value,expire,counter); break;
517
+ case 'expireat': r = await expireat(options,dbm,key,expire); break;
518
+ case 'setnx': r = await setnx(options,dbm,key,value,expire); break;
519
+ default: r = {"dml":"404", "err":"dml not found."};
520
+ }
521
+
522
+ return new Promise((resolve, reject)=>{
523
+ resolve(r);
524
+ })
525
+ }
526
+
527
+ const getFirstField=(o)=>{
528
+ let field = '', val ='';
529
+ try{
530
+ for (let x in o){
531
+ field = x; val = o[x];
532
+ break;
533
+ }
534
+ }catch(e){
535
+
536
+ }
537
+ return {field, val}
538
+ }
539
+
540
+ const filtertoFind=(o, njson)=>{
541
+ let query = '', And = '', Or = '', In ='', type = '';
542
+ try{
543
+ /**
544
+ { "hfind":"cc2:aw_c_test",
545
+ "filter":{"$and":[{"id_usr":"2"},{"id_u":"3"}]},
546
+ "order":{"id_usr":"asc"} }
547
+ */
548
+ if (utl.ObjectEmpty(o, '$and')){
549
+ type = 'and';
550
+ And = o.$and;
551
+ for (let x of And){
552
+
553
+ let key = Object.keys(x);
554
+ if (query.length>0){
555
+ query = query + ' && ';
556
+ }
557
+ query = query + `\`\${${njson}.${key}}\` =='${x[key]}'`;
558
+ }
559
+ }
560
+ /**
561
+ { "hfind":"cc2:aw_c_test",
562
+ "filter":{"$or":[{"id_usr":"2"},{"id_u":"3"}]},
563
+ "order":{"id_usr":"asc"} }
564
+ */
565
+ if (utl.ObjectEmpty(o, '$or')){
566
+ type = 'or';
567
+ Or = o.$or;
568
+ for (let x of Or){
569
+ let key = Object.keys(x);
570
+ if (query.length>0){
571
+ query = query + ' || ';
572
+ }
573
+ query = query + `\`\${${njson}.${key}}\`=='${x[key]}'`;
574
+ }
575
+ }
576
+
577
+ /**
578
+ { "hfind":"cc2:aw_c_test",
579
+ "filter":{"id_usr":"2"},
580
+ "order":{"id_usr":"asc"} }
581
+ { "hfind":"cc2:aw_c_test",
582
+ "filter":{"id_usr":{"$in":[1,2]}} }
583
+ */
584
+ if (type==''){
585
+ for (let x in o){
586
+ let In = o[x];
587
+ if (utl.ObjectEmpty(In, '$in')){
588
+ query = ` utl.valueIn({'in':\`\${${njson}.${x}}\` , 'value':'${In.$in.join()}'}) `;
589
+ }
590
+ else{
591
+ if (o[x]=='*'){
592
+ query = ` 1==1 `;
593
+ }else{
594
+ query = ` \`\${${njson}.${x}}\`=='${o[x]}' `;
595
+ }
596
+ }
597
+ }
598
+ }
599
+ }catch(e){
600
+
601
+ }
602
+ //utl.log(query);
603
+ return query;
604
+ }
605
+
606
+ module.exports ={
607
+ scan,
608
+ set,
609
+ get,
610
+ incrby,
611
+ sadd,
612
+ srem,
613
+ smembers,
614
+ hset,
615
+ hgetall,
616
+ del,
617
+ hfind,
618
+ upsert,
619
+ api,
620
+ incrbyfloat,
621
+ expireat
622
+ }
package/lib/network.js ADDED
@@ -0,0 +1,57 @@
1
+ /**
2
+ * ::: B[]NSAIF() ::: => 2022
3
+ */
4
+
5
+ 'use strict';
6
+ const ping = require("ping");
7
+ const utl = require('./utl');
8
+
9
+ const failover = async (o) => {
10
+ let {uri='', timeout=1}=o;
11
+ timeout ? timeout*1:0;
12
+ const start = Date.now();
13
+ let results = new Array();
14
+ let uri_alive = '';
15
+ const parse_url = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;
16
+ try{
17
+ let lturi= uri.split(",");
18
+ for (let u of lturi){
19
+ if (u==''){
20
+ results.push({inputHost:"Not uri"});
21
+ break;
22
+ }
23
+
24
+ let result = parse_url.exec(u); //[url,scheme,slash,host,port,path,query,hash]
25
+ let host = result[3];
26
+ if (host=='localhost'){
27
+ uri_alive = u;
28
+ results.push({inputHost:host, alive:true});
29
+ break;
30
+ }
31
+
32
+ result = await ping.promise.probe(host, {
33
+ timeout: timeout,
34
+ extra: ["-i", timeout],
35
+ });
36
+
37
+ results.push(result);
38
+
39
+ if (result.alive){
40
+ uri_alive = u;
41
+ break;
42
+ }
43
+ }
44
+ }catch(e){
45
+ utl.log('failover : '+e);
46
+ }
47
+
48
+ return new Promise((resolve, reject)=>{
49
+ const end = Date.now();
50
+ const time = end - start;
51
+ resolve({"uri_alive":uri_alive, "time":utl.milisegundosASegundos(time), "results":results});
52
+ });
53
+ }
54
+
55
+ module.exports={
56
+ failover
57
+ }