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.
+ *
+ */