{"version":3,"file":"occasionally.cjs","sources":["../../src/scheduler/occasionally.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"],"names":["ID_DEFAULT","obOnce","obRandomlyOnceInFewIncidents","obOnceInFewIncidents","occasionally","callback","options","strategy","undefined","id","console","warn","incidentId","incidentCounter","incidents","random","Math","floor","occasionallyAsync","async","Promise","resolve","reject","val","then","catch","attachStringConstantsToFunction","fn","strs","str"],"mappings":";AAwCG,MAIGA,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,EAGMK,kBAAoBC,eAAgBd,SAAUC,SAChD,OAAO,IAAIc,QAAQ,CAACC,QAASC,UACzB,IAAIT;AACmBT,aAAcmB,MACjCV,gBAAkBU,KACnBjB,SAICD,SAASQ,iBAAiBW,KAAKH,SAASI,MAAMH,QAE9CD,WAIZ,EAEMK,gCAAkC,SAAUC,IAC9C,MAAMC,KAAO,CAhFG,gBAC0B,0CACT,iCAElB;AAoFf,IAAK,MAAMC,OAAOD,KACdD,GAAGE,KAAOA,GAElB;AAEAH,gCAAgCtB;AAChCsB,gCAAgCR;mBA1Fb;sBAJC;uCAEiB;gDADS;;"}