diff --git a/src/multi-node-layer.mjs b/src/multi-node-layer.mjs index cb0ff5c3b541f646105198ee23ac0fc3d805023e..9fa5f3a689f1b6d601675c80ae30d23da4315d29 100644 --- a/src/multi-node-layer.mjs +++ b/src/multi-node-layer.mjs @@ -1 +1,18 @@ -export {}; +export async function timeTrack(arrayFuncAndParams,timeout){ + return Promise.race([ + new Promise(resolve => setTimeout( + ()=>resolve({ms:timeout,params:arrayFuncAndParams,timeout:true}), + timeout + )), + new Promise(async resolve=>{ + const startTime = Date.now(); + const func = arrayFuncAndParams[0]; + const params = arrayFuncAndParams.slice(1); + + const res = await func(...params); + const endTime = Date.now(); + const elapsed = endTime - startTime; + resolve({ms:elapsed,params:arrayFuncAndParams,result:res}); + })] + ); +} diff --git a/src/multi-node-layer.test.mjs b/src/multi-node-layer.test.mjs index 5467eedef86da485f654efaa9de18a7c54c8966b..76ce3ac7c7328d0adeacccdf2ba8a833c265f1ac 100644 --- a/src/multi-node-layer.test.mjs +++ b/src/multi-node-layer.test.mjs @@ -1,6 +1,55 @@ import test from 'ava'; import * as app from './multi-node-layer.mjs'; -test('dummy', async t => { - t.true(true); +function sleep(ms){ + return new Promise((resolve)=>setTimeout(resolve,ms)); +} + +test('pingTracker give time elapsed', async t => { + const mockedFunc = async (first,second)=>{await sleep(second);return first}; + const firstParameter = 'finalResult'; + const secondParameter = 10; + const toCall = [mockedFunc,firstParameter,secondParameter]; + const timeout = 1000; + const result = await app.timeTrack(toCall,timeout); + t.is(result.result,firstParameter); + t.is(result.params[1],firstParameter); + t.regex(result.ms.toString(),/1[0-9]/); +}); +test('pingTracker can timeout', async t => { + const moreThanTimeout = 15 + const mockedFunc = async (first)=>{await sleep(moreThanTimeout);return first}; + const toCall = [mockedFunc,'param']; + const timeout = 10; + const result = await app.timeTrack(toCall,timeout); + t.is(result.params[1],'param'); + t.is(typeof result.result,'undefined'); + t.is(result.ms,10); + t.is(result.timeout,true); }); + +/** + * prend en paramètre un objet qui implémente le réseau adapté (gva-client par exemple) + * lors d'une requête, la fait passer par le client. + * si la requête échoue, suis-je en ligne ? si non : throw hors ligne, si oui, désactive la cible et lance un scan réseau + * si une requête est demandé avec un réglage de sécurité > 1 demande à l'implémentaiton au moins n résultats égaux avant de retourner la réponse. + * si des résultats sont différents, demande à l'implémentation de trancher (peut répondre ou throw info insuffisante). + * tant que les résultats sont insuffisant, demande à plus de noeuds (à chaque nouvelle réponse, demande s'il est possible de trancher). + * si plus de noeud connu qu'un seuil, retire les désactivé excédentaires, les plus anciens, et arrête le scan. + * + * si un requête est demandée avec un réglage orienté vitesse, demande à n(défaut 2) noeuds la réponse, et répond dès la première (sauf réglage sécurité en plus) + * ps : classe les noeuds par ping pour reuqêter en priorité les plus réactifs. + * + * + * scan réseau : + * demande à chacun des noeuds connu, dans l'ordre, leur noeuds voisin et les ajoutes (et les requêtes à leur tour juqu'à ce qu'aucun nouveau noeuds ne soient trouvé). + * si le nombre max est atteint, arrête le scan. + * + * chaque noeud requêté fourni sa liste de voisins et est associé à : + * son ping (ou timeout) + * le timestamp de dernier ping. + * + * + * à chaque requête demandé au module, quel que soit l'état d'avancement du scan, une liste trié par ping des noeud est exporté pour être utilisé pour le requêtage. + * + */