{"version":3,"sources":["meteor://💻app/packages/retry/retry.js"],"names":["module","export","Retry","constructor","baseTimeout","exponent","maxTimeout","minTimeout","minCount","fuzz","retryTimer","clear","clearTimeout","_timeout","count","timeout","Math","min","pow","Random","fraction","retryLater","fn","Meteor","setTimeout"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAAA,MAAM,CAACC,MAAP,CAAc;AAACC,OAAK,EAAC,MAAIA;AAAX,CAAd;;AAUO,MAAMA,KAAN,CAAY;AACjBC,aAAW,GASH;AAAA,QATI;AACVC,iBAAW,GAAG,IADJ;AAEVC,cAAQ,GAAG,GAFD;AAGV;AACA;AACAC,gBAAU,GAAG,IAAI,EAAJ,GAAS,IALZ;AAMVC,gBAAU,GAAG,EANH;AAOVC,cAAQ,GAAG,CAPD;AAQVC,UAAI,GAAG;AARG,KASJ,uEAAJ,EAAI;AACN,SAAKL,WAAL,GAAmBA,WAAnB;AACA,SAAKC,QAAL,GAAgBA,QAAhB;AACA,SAAKC,UAAL,GAAkBA,UAAlB;AACA,SAAKC,UAAL,GAAkBA,UAAlB;AACA,SAAKC,QAAL,GAAgBA,QAAhB;AACA,SAAKC,IAAL,GAAYA,IAAZ;AACA,SAAKC,UAAL,GAAkB,IAAlB;AACD,GAlBgB,CAoBjB;;;AACAC,OAAK,GAAG;AACN,QAAI,KAAKD,UAAT,EAAqB;AACnBE,kBAAY,CAAC,KAAKF,UAAN,CAAZ;AACD;;AACD,SAAKA,UAAL,GAAkB,IAAlB;AACD,GA1BgB,CA4BjB;AACA;;;AACAG,UAAQ,CAACC,KAAD,EAAQ;AACd,QAAIA,KAAK,GAAG,KAAKN,QAAjB,EAA2B;AACzB,aAAO,KAAKD,UAAZ;AACD,KAHa,CAKd;AACA;;;AACA,QAAIQ,OAAO,GAAGC,IAAI,CAACC,GAAL,CACZ,KAAKX,UADO,EAEZ,KAAKF,WAAL,GAAmBY,IAAI,CAACE,GAAL,CAAS,KAAKb,QAAd,EAAwBS,KAAxB,CAFP,KAIZK,MAAM,CAACC,QAAP,KAAoB,KAAKX,IAAzB,IAAiC,IAAI,KAAKA,IAAL,GAAY,CAAjD,CAJY,CAAd;AAOA,WAAOM,OAAP;AACD,GA7CgB,CA+CjB;;;AACAM,YAAU,CAACP,KAAD,EAAQQ,EAAR,EAAY;AACpB,QAAIP,OAAO,GAAG,KAAKF,QAAL,CAAcC,KAAd,CAAd;;AACA,QAAI,KAAKJ,UAAT,EACEE,YAAY,CAAC,KAAKF,UAAN,CAAZ;AACF,SAAKA,UAAL,GAAkBa,MAAM,CAACC,UAAP,CAAkBF,EAAlB,EAAsBP,OAAtB,CAAlB;AACA,WAAOA,OAAP;AACD;;AAtDgB,C","file":"/packages/retry.js","sourcesContent":["// Retry logic with an exponential backoff.\n//\n// options:\n// baseTimeout: time for initial reconnect attempt (ms).\n// exponent: exponential factor to increase timeout each attempt.\n// maxTimeout: maximum time between retries (ms).\n// minCount: how many times to reconnect \"instantly\".\n// minTimeout: time to wait for the first `minCount` retries (ms).\n// fuzz: factor to randomize retry times by (to avoid retry storms).\n\nexport class Retry {\n constructor({\n baseTimeout = 1000,\n exponent = 2.2,\n // The default is high-ish to ensure a server can recover from a\n // failure caused by load.\n maxTimeout = 5 * 60 * 1000,\n minTimeout = 10,\n minCount = 2,\n fuzz = 0.5,\n } = {}) {\n this.baseTimeout = baseTimeout;\n this.exponent = exponent;\n this.maxTimeout = maxTimeout;\n this.minTimeout = minTimeout;\n this.minCount = minCount;\n this.fuzz = fuzz;\n this.retryTimer = null;\n }\n\n // Reset a pending retry, if any.\n clear() {\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n }\n this.retryTimer = null;\n }\n\n // Calculate how long to wait in milliseconds to retry, based on the\n // `count` of which retry this is.\n _timeout(count) {\n if (count < this.minCount) {\n return this.minTimeout;\n }\n\n // fuzz the timeout randomly, to avoid reconnect storms when a\n // server goes down.\n var timeout = Math.min(\n this.maxTimeout,\n this.baseTimeout * Math.pow(this.exponent, count)\n ) * (\n Random.fraction() * this.fuzz + (1 - this.fuzz / 2)\n );\n\n return timeout;\n }\n\n // Call `fn` after a delay, based on the `count` of which retry this is.\n retryLater(count, fn) {\n var timeout = this._timeout(count);\n if (this.retryTimer)\n clearTimeout(this.retryTimer);\n this.retryTimer = Meteor.setTimeout(fn, timeout);\n return timeout;\n }\n}\n"]}