{ "name": "verify-http-retry", "nodes": [ {"id": "n1", "name": "Trigger", "type": "click-trigger", "position": {"x": 0, "y": 0}, "config": {}}, {"id": "once", "name": "Without Retry", "type": "code", "position": {"x": 0, "y": 100}, "config": {"timeout": 60, "code": "const t = Date.now(); let err = ''; try { smartbotic.http.request({ method: 'GET', url: 'http://10.255.255.1/nowhere', timeout: 1000 }); } catch (e) { err = String(e.message || e); } const elapsed = Date.now() - t; return { elapsed: elapsed, err: err, tookOneAttempt: elapsed < 2500 && err.indexOf('after 1 attempt') !== -1 };"}}, {"id": "thrice", "name": "With Retry", "type": "code", "position": {"x": 0, "y": 200}, "config": {"timeout": 60, "code": "const t = Date.now(); let err = ''; try { smartbotic.http.request({ method: 'GET', url: 'http://10.255.255.1/nowhere', timeout: 1000, retries: 2, retryDelayMs: 1000, retryMaxDelayMs: 5000 }); } catch (e) { err = String(e.message || e); } const elapsed = Date.now() - t; return { elapsed: elapsed, err: err, tookThreeAttempts: err.indexOf('after 3 attempt') !== -1, waitedAndDoubled: elapsed >= 5500 && elapsed < 9000 };"}} ], "connections": [ {"sourceNodeId": "n1", "sourceOutput": "main", "targetNodeId": "once", "targetInput": "data"}, {"sourceNodeId": "once", "sourceOutput": "main", "targetNodeId": "thrice", "targetInput": "data"} ], "expect": { "once": {"status": "completed", "output": {"result": {"tookOneAttempt": true}}}, "thrice": {"status": "completed", "output": {"result": {"tookThreeAttempts": true, "waitedAndDoubled": true}}} } }