{"version":3,"file":"index.cjs","sources":["../../src/scheduler/occasionally.js","../../src/scheduler/retryNTimesWithDelay.js","../../src/scheduler/index.js","../../src/scheduler/timeoutAsync.js"],"sourcesContent":["/*\n    // Example:\n\n    import {\n        occasionally,\n        occasionallyAsync,\n        STRATEGY_ONCE,\n        STRATEGY_RANDOMLY_ONCE_IN_FEW_INCIDENTS\n    } from 'helpmate/dist/scheduler/occasionally.js';\n\n    (async () => {\n        for (let i = 0; i < 10; i++) {\n            occasionally(\n                (incidentNumber) => {\n                    console.log('Hello, world!', i, incidentNumber);\n                },\n                {\n                    strategy: STRATEGY_ONCE,\n                    id: 'hello-world'\n                }\n            );\n\n            await occasionallyAsync(\n                async (incidentNumber) => {\n                    const timeoutAsync = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\n                    const random = Math.floor(Math.random() * 1000);\n                    await timeoutAsync(random);\n                    console.log('Async - Hello, world!', i, incidentNumber);\n                },\n                {\n                    strategy: STRATEGY_RANDOMLY_ONCE_IN_FEW_INCIDENTS,\n                    id: 'async-hello-world',\n                    incidents: 2\n                }\n            );\n        }\n    })();\n*/\n\nconst\n    STRATEGY_ONCE = 'STRATEGY_ONCE',\n    STRATEGY_RANDOMLY_ONCE_IN_FEW_INCIDENTS = 'STRATEGY_RANDOMLY_ONCE_IN_FEW_INCIDENTS',\n    STRATEGY_ONCE_IN_FEW_INCIDENTS = 'STRATEGY_ONCE_IN_FEW_INCIDENTS';\n\nconst ID_DEFAULT = 'ID_DEFAULT';\n\nconst obOnce                       = { [ID_DEFAULT]: 0 };\nconst obRandomlyOnceInFewIncidents = { [ID_DEFAULT]: 0 };\nconst obOnceInFewIncidents         = { [ID_DEFAULT]: 0 };\n\nconst occasionally = function (callback, options = {}) {\n    const strategy = options.strategy || STRATEGY_RANDOMLY_ONCE_IN_FEW_INCIDENTS;\n\n    if (strategy === STRATEGY_ONCE) {\n        if (options.id === undefined) {\n            console.warn(`Warning: It seems that you forgot to pass the \"id\" parameter to \"occasionally()\" function for the \"strategy\": \"${strategy}\". Using fallback \"id\": \"${ID_DEFAULT}\"`);\n        }\n        const incidentId = options.id || ID_DEFAULT;\n\n        const incidentCounter = (obOnce[incidentId] || 0) + 1;\n        obOnce[incidentId] = incidentCounter;\n\n        if (incidentCounter === 1) {\n            callback(incidentCounter);\n            return true;\n        }\n    } else if (strategy === STRATEGY_RANDOMLY_ONCE_IN_FEW_INCIDENTS) {\n        const incidents = options.incidents || 1;\n        const random = Math.floor(Math.random() * incidents);\n\n        const incidentId = options.id || ID_DEFAULT;\n\n        const incidentCounter = (obRandomlyOnceInFewIncidents[incidentId] || 0) + 1;\n        obRandomlyOnceInFewIncidents[incidentId] = incidentCounter;\n\n        if (random === 0) {\n            callback(incidentCounter);\n            return true;\n        }\n    } else if (strategy === STRATEGY_ONCE_IN_FEW_INCIDENTS) {\n        const incidents = options.incidents || 1;\n        if (options.id === undefined) {\n            console.warn(`Warning: It seems that you forgot to pass the \"id\" parameter to \"occasionally()\" function for the \"strategy\": \"${strategy}\". Using fallback \"id\": \"${ID_DEFAULT}\"`);\n        }\n        const incidentId = options.id || ID_DEFAULT;\n\n        const incidentCounter = (obOnceInFewIncidents[incidentId] || 0) + 1;\n        obOnceInFewIncidents[incidentId] = incidentCounter;\n\n        if (incidentCounter % incidents === 0) {\n            callback(incidentCounter);\n            return true;\n        }\n    } else {\n        callback();\n        return true;\n    }\n\n    return false;\n};\n\n// eslint-disable-next-line require-await\nconst occasionallyAsync = async function (callback, options) {\n    return new Promise((resolve, reject) => {\n        let incidentCounter;\n        const flagCalledBack = occasionally((val) => {\n            incidentCounter = val;\n        }, options);\n\n        if (flagCalledBack) {\n            // eslint-disable-next-line n/callback-return\n            callback(incidentCounter).then(resolve).catch(reject);\n        } else {\n            resolve();\n            return;\n        }\n    });\n};\n\nconst attachStringConstantsToFunction = function (fn) {\n    const strs = [\n        STRATEGY_ONCE,\n        STRATEGY_RANDOMLY_ONCE_IN_FEW_INCIDENTS,\n        STRATEGY_ONCE_IN_FEW_INCIDENTS,\n\n        ID_DEFAULT\n    ];\n\n    for (const str of strs) {\n        fn[str] = str;\n    }\n};\n\nattachStringConstantsToFunction(occasionally);\nattachStringConstantsToFunction(occasionallyAsync);\n\nexport {\n    occasionally,\n    occasionallyAsync,\n\n    STRATEGY_ONCE,\n    STRATEGY_RANDOMLY_ONCE_IN_FEW_INCIDENTS,\n    STRATEGY_ONCE_IN_FEW_INCIDENTS,\n\n    ID_DEFAULT\n};\n","const retryNTimesWithDelay = async function ({\n    verbose = false,\n    attempts,\n    delayStrategy,\n    delay,\n    exponentialDelayMultiplier = 2,\n    maxDelay,\n    fn\n}) {\n    // With delayStrategy, the delay is exponential\n    let theError;\n    let delayToUse = 0;\n    for (let i = 0; i < attempts; i++) {\n        try {\n            if (verbose) {\n                console.log('Attempt:', i + 1, 'of', attempts, 'with delay:', delayToUse, 'ms', 'started');\n            }\n            await fn();\n            if (verbose) {\n                console.log('Attempt:', i + 1, 'of', attempts, 'with delay:', delayToUse, 'ms', 'succeeded');\n            }\n            return;\n        } catch (err) {\n            if (verbose) {\n                console.log('Attempt:', i + 1, 'of', attempts, 'with delay:', delayToUse, 'ms', 'failed');\n            }\n            theError = err;\n            if (delayToUse === 0) {\n                delayToUse = delay;\n            } else {\n                if (delayStrategy === 'exponential') {\n                    delayToUse = delayToUse * exponentialDelayMultiplier;\n                } else if (delayStrategy === 'linear') {\n                    delayToUse = delayToUse + delay;\n                } else { // delayStrategy === 'constant'\n                    delayToUse = delay;\n                }\n\n                delayToUse = Math.min(delayToUse, maxDelay);\n            }\n            await new Promise((resolve) => { setTimeout(resolve, delayToUse); });\n        }\n    }\n    throw theError;\n};\n\nexport { retryNTimesWithDelay };\n","import { occasionally } from './occasionally.js';\nimport { retryNTimesWithDelay } from './retryNTimesWithDelay.js';\nimport { timeoutAsync } from './timeoutAsync.js';\n\nconst scheduler = {\n    occasionally,\n    retryNTimesWithDelay,\n    timeoutAsync\n};\n\nexport { scheduler };\n","const timeoutAsync = function (ms) {\n    return (\n        new Promise((resolve) => {\n            setTimeout(resolve, ms);\n        })\n    );\n};\n\nexport { timeoutAsync };\n"],"names":["ID_DEFAULT","obOnce","obRandomlyOnceInFewIncidents","obOnceInFewIncidents","occasionally","callback","options","strategy","undefined","id","console","warn","incidentId","incidentCounter","incidents","random","Math","floor","attachStringConstantsToFunction","fn","strs","str","async","Promise","resolve","reject","val","then","catch","scheduler","retryNTimesWithDelay","verbose","attempts","delayStrategy","delay","exponentialDelayMultiplier","maxDelay","theError","delayToUse","i","log","err","min","setTimeout","timeoutAsync","ms"],"mappings":";AAuCA,MAKMA,WAAa,aAEbC,OAA+B,CAAED,CAACA,YAAa,GAC/CE,6BAA+B,CAAEF,CAACA,YAAa,GAC/CG,qBAA+B,CAAEH,CAACA,YAAa,GAE/CI,aAAe,SAAUC,SAAUC,QAAU,IAC/C,MAAMC,SAAWD,QAAQC,UAViB;AAY1C,GAbgB,kBAaZA,SAA4B,MACTC,IAAfF,QAAQG,IACRC,QAAQC,KAAK,kHAAkHJ;AAEnI,MAAMK,WAAaN,QAAQG,IAbhB,aAeLI,iBAAmBZ,OAAOW,aAAe,GAAK;AACpDX,OAAOW,YAAcC;AAErB,GAAwB,IAApBA,gBAAuB,CACvBR,SAASQ;AACT,OAAO,CACX,CACJ,MAAO,GAzBmC,4CAyB/BN,SAAsD,CAC7D,MAAMO,UAAYR,QAAQQ,WAAa,EACjCC,OAASC,KAAKC,MAAMD,KAAKD,SAAWD,WAEpCF,WAAaN,QAAQG,IA1BhB,aA4BLI,iBAAmBX,6BAA6BU,aAAe,GAAK;AAC1EV,6BAA6BU,YAAcC;AAE3C,GAAe,IAAXE,OAAc,CACdV,SAASQ;AACT,OAAO,CACX,CACJ,KAAO,IArC0B,mCAqCtBN,SAcJ,CACHF;AACA,OAAO,CACX,CAjBwD,CACpD,MAAMS,UAAYR,QAAQQ,WAAa;KACpBN,IAAfF,QAAQG,IACRC,QAAQC,KAAK,kHAAkHJ;AAEnI,MAAMK,WAAaN,QAAQG,IAxChB,aA0CLI,iBAAmBV,qBAAqBS,aAAe,GAAK;AAClET,qBAAqBS,YAAcC;AAEnC,GAAIA,gBAAkBC,YAAc,EAAG,CACnCT,SAASQ;AACT,OAAO,CACX,CACJ,CAGA,CAEA,OAAO,CACX,EAoBMK,gCAAkC,SAAUC,IAC9C,MAAMC,KAAO,CAhFG,gBAC0B,0CACT,iCAElB;AAoFf,IAAK,MAAMC,OAAOD,KACdD,GAAGE,KAAOA,GAElB;AAEAH,gCAAgCd;AAChCc,gCAhC0BI,eAAgBjB,SAAUC,SAChD,OAAO,IAAIiB,QAAQ,CAACC,QAASC,UACzB,IAAIZ;AACmBT,aAAcsB,MACjCb,gBAAkBa,KACnBpB,SAICD,SAASQ,iBAAiBc,KAAKH,SAASI,MAAMH,QAE9CD,WAIZ;ACrHA,MCIMK,UAAY,CACdzB,0BACA0B,qBDNyBR,gBAAgBS,QACzCA,SAAU,EAAKC,SACfA,SAAQC,cACRA,cAAaC,MACbA,MAAKC,2BACLA,2BAA6B,EAACC,SAC9BA,SAAQjB,GACRA,KAGA,IAAIkB,SACAC,WAAa;AACjB,IAAK,IAAIC,EAAI,EAAGA,EAAIP,SAAUO,IAC1B,IACQR,SACArB,QAAQ8B,IAAI,WAAYD,EAAI,EAAG,KAAMP,SAAU,cAAeM,WAAY,KAAM;MAE9EnB;AACFY,SACArB,QAAQ8B,IAAI,WAAYD,EAAI,EAAG,KAAMP,SAAU,cAAeM,WAAY,KAAM;AAEpF,MACJ,CAAE,MAAOG,KACDV,SACArB,QAAQ8B,IAAI,WAAYD,EAAI,EAAG,KAAMP,SAAU,cAAeM,WAAY,KAAM;AAEpFD,SAAWI;AACX,GAAmB,IAAfH,WACAA,WAAaJ;IACV,CACmB,gBAAlBD,cACAK,YAA0BH,2BACD,WAAlBF,cACPK,YAA0BJ,MAE1BI,WAAaJ;AAGjBI,WAAatB,KAAK0B,IAAIJ,WAAYF,SACtC,OACM,IAAIb,QAASC,UAAcmB,WAAWnB,QAASc,aACzD,CAEJ,MAAMD,QACV,ECrCIO,aCPiB,SAAUC,IAC3B,OAAA,IACQtB,QAASC,UACTmB,WAAWnB,QAASqB,KAGhC;"}