# all files / lib/ Kayn.js

87.88% Statements 87/99
33.33% Branches 6/18
50% Functions 1/2
88.54% Lines 85/96

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    2131×

    1×
    1×

    1×

    1×

    1×

    1×
    1×
    1×
    1×
    1×
    1×
    1×
    1×
    1×
    1×
    1×
    1×

    1×
    1×
    1×
    1×
    1×
    1×
    1×
    1×
    1×
    1×
    1×
    1×
    1×
    1×

    1×

    1×

    1×

    1×

    1×

    1×

    1×

    1×
    1×

    1×
    1×

    1×

    1×

    1×
    1×
    1×

    1×

    1×
    1×
    1×

    1×
    1×

    1×
    1×

    1×
    1×

    1×
    1×
    1×
    1×

    1×
    1×
    1×
    1×
    1×
    1×
    1×
    1×
    1×

    1×
    1×
    1×
    1×

    1×

    1×
    1×

    1×
    1×
    1×
    1×
    1×

    1×

    1×

     require('dotenv').config()

    import RiotRateLimiter from 'riot-ratelimiter-temp'
    const RRLStrategies = require('riot-ratelimiter-temp/dist/RateLimiter').STRATEGY

    import merge from 'lodash.merge'

    import Logger from './Logger'

    import ParameterHelper from './Utils/ParameterHelper'

    import ChampionRotationEndpoint from './Endpoints/ChampionRotationEndpoint'
    import DDragonChampionEndpoint from './Endpoints/DDragonEndpoints/DDragonChampionEndpoint'
    import DDragonItemEndpoint from './Endpoints/DDragonEndpoints/DDragonItemEndpoint'
    import DDragonLanguageEndpoint from './Endpoints/DDragonEndpoints/DDragonLanguageEndpoint'
    import DDragonLanguageStringEndpoint from './Endpoints/DDragonEndpoints/DDragonLanguageStringEndpoint'
    import DDragonMapEndpoint from './Endpoints/DDragonEndpoints/DDragonMapEndpoint'
    import DDragonProfileIconEndpoint from './Endpoints/DDragonEndpoints/DDragonProfileIconEndpoint'
    import DDragonRealmEndpoint from './Endpoints/DDragonEndpoints/DDragonRealmEndpoint'
    import DDragonRunesReforgedEndpoint from './Endpoints/DDragonEndpoints/DDragonRunesReforgedEndpoint'
    import DDragonSummonerSpellEndpoint from './Endpoints/DDragonEndpoints/DDragonSummonerSpellEndpoint'
    import DDragonVersionEndpoint from './Endpoints/DDragonEndpoints/DDragonVersionEndpoint'
    import StatusEndpoint from './Endpoints/StatusEndpoint'

    import ChallengerEndpointV4 from './Endpoints/LeagueEndpoint/ChallengerEndpointV4'
    import ChampionMasteryEndpointV4 from './Endpoints/ChampionMasteryEndpointV4'
    import CurrentGameEndpointV4 from './Endpoints/SpectatorEndpoint/CurrentGameEndpointV4'
    import FeaturedGamesEndpointV4 from './Endpoints/SpectatorEndpoint/FeaturedGamesEndpointV4'
    import GrandmasterEndpointV4 from './Endpoints/LeagueEndpoint/GrandmasterEndpointV4'
    import LeagueEndpointV4 from './Endpoints/LeagueEndpoint/LeagueEndpointV4'
    import LeagueEntriesEndpointV4 from './Endpoints/LeagueEndpoint/LeagueEntriesEndpointV4'
    import MasterEndpointV4 from './Endpoints/LeagueEndpoint/MasterEndpointV4'
    import MatchEndpointV4 from './Endpoints/MatchEndpoint/MatchEndpointV4'
    import MatchlistEndpointV4 from './Endpoints/MatchEndpoint/MatchlistEndpointV4'
    import SummonerEndpointV4 from './Endpoints/SummonerEndpointV4'
    import ThirdPartyCodeEndpointV4 from './Endpoints/ThirdPartyCodeEndpointV4'
    import TournamentEndpointV4 from './Endpoints/TournamentEndpointV4'
    import TournamentStubEndpointV4 from './Endpoints/TournamentStubEndpointV4'

    import DEFAULT_TTLS, { makeTTLsFromGroupedTTLs } from './Enums/default-ttls'

    import { DEFAULT_KAYN_CONFIG, KAYN_CONFIG_STRUCT } from './KaynConfig'

    class Kayn {
        constructor(
            key = process.env.RIOT_LOL_API_KEY,
            config = DEFAULT_KAYN_CONFIG,
        ) {
            if (I!ParameterHelper.isKeyValid(key)) {
                throw new Error(
                    'Failed to initialize Kayn! API key is not a non-empty string.',
                )
            }

            // Make sure that the rest of the sane, nested defaults are set.
            // The source object here is the user config,
            // while the destination is the default config.
            // Extra merge is used to prevent mutation of original default config.
            // Merge is needed for deep-merging.
            this.config = KAYN_CONFIG_STRUCT(
                merge(merge({}, DEFAULT_KAYN_CONFIG), { key, ...config }),
            )

            const strategy = this.config.requestOptions.burst
                ? RRLStrategies.BURST
                : RRLStrategies.SPREAD

            this.limiter = new RiotRateLimiter({
                strategy,
            })

            if (Ethis.config.debugOptions.isEnabled) {
                // Not pure but whatever.
                const configCopy = { ...this.config }
                if (I!configCopy.debugOptions.showKey) {
                    delete configCopy.key
                }
                Logger(this.config)
                this.config.debugOptions.loggers.initLogger(
                    'with config:\n%O',
                    configCopy,
                )
            }

            // Handle caching time-to-lives.
            if (Ithis.config.cacheOptions.cache) {
                /*
                    Start by checking if default is used. If so, set it.
                    Next, merge grouped ttls and then singular ttls.
                    Finally, merge final, old `ttls` prop for backwards-compatibility.
                    We use this as the source of truth for cache ttls.
                */
                let finalTTLs = {}
                if (this.config.cacheOptions.timeToLives.useDefault) {
                    finalTTLs = merge(finalTTLs, DEFAULT_TTLS)
                }
                finalTTLs = merge(
                    finalTTLs,
                    makeTTLsFromGroupedTTLs(
                        this.config.cacheOptions.timeToLives.byGroup,
                    ),
                    this.config.cacheOptions.timeToLives.byMethod,
                    this.config.cacheOptions.ttls,
                )
                this.config.cacheOptions.ttls = finalTTLs
            }

            // Set up interfaces.
            // Did not mean to have this as ChampionRotation, but I'll keep it just in case people are using it.
            // Use Champion.Rotation.list instead.
            this.ChampionRotation = new ChampionRotationEndpoint(
                this.config,
                this.limiter,
            )
            this.Champion = {}
            this.Champion.Rotation = this.ChampionRotation
            this.DDragon = {
                Champion: new DDragonChampionEndpoint(this.config),
                Item: new DDragonItemEndpoint(this.config),
                Language: new DDragonLanguageEndpoint(this.config),
                LanguageString: new DDragonLanguageStringEndpoint(this.config),
                Map: new DDragonMapEndpoint(this.config),
                ProfileIcon: new DDragonProfileIconEndpoint(this.config),
                Realm: new DDragonRealmEndpoint(this.config),
                RunesReforged: new DDragonRunesReforgedEndpoint(this.config),
                SummonerSpell: new DDragonSummonerSpellEndpoint(this.config),
                Version: new DDragonVersionEndpoint(this.config),
            }
            this.Status = new StatusEndpoint(this.config, this.limiter)

            this.ChallengerV4 = new ChallengerEndpointV4(this.config, this.limiter)
            this.Challenger = this.ChallengerV4
            this.ChampionMasteryV4 = new ChampionMasteryEndpointV4(
                this.config,
                this.limiter,
            )
            this.ChampionMastery = this.ChampionMasteryV4
            this.CurrentGameV4 = new CurrentGameEndpointV4(
                this.config,
                this.limiter,
            )
            this.CurrentGame = this.CurrentGameV4
            this.FeaturedGamesV4 = new FeaturedGamesEndpointV4(
                this.config,
                this.limiter,
            )
            this.FeaturedGames = this.FeaturedGamesV4
            this.GrandmasterV4 = new GrandmasterEndpointV4(
                this.config,
                this.limiter,
            )
            this.Grandmaster = this.GrandmasterV4
            this.LeagueV4 = new LeagueEndpointV4(this.config, this.limiter)
            this.League = this.LeagueV4
            this.League.Entries = new LeagueEntriesEndpointV4(
                this.config,
                this.limiter,
            )
            this.MasterV4 = new MasterEndpointV4(this.config, this.limiter)
            this.Master = this.MasterV4
            this.MatchV4 = new MatchEndpointV4(this.config, this.limiter)
            this.Match = this.MatchV4
            this.MatchlistV4 = new MatchlistEndpointV4(this.config, this.limiter)
            this.Matchlist = this.MatchlistV4
            this.SummonerV4 = new SummonerEndpointV4(this.config, this.limiter)
            this.Summoner = this.SummonerV4
            this.ThirdPartyCodeV4 = new ThirdPartyCodeEndpointV4(
                this.config,
                this.limiter,
            )
            this.ThirdPartyCode = this.ThirdPartyCodeV4
            this.TournamentV4 = new TournamentEndpointV4(this.config, this.limiter)
            this.Tournament = this.TournamentV4
            this.TournamentStubV4 = new TournamentStubEndpointV4(
                this.config,
                this.limiter,
            )
            this.TournamentStub = this.TournamentStubV4

            if (Ethis.config.debugOptions.isEnabled) {
                this.config.debugOptions.loggers.initLogger(
                    'Initialized interfaces. Ready!',
                )
            }
        }

        flushCache(cb) {
            return new Promise((resolve, reject) => {
                if (!cb) {
                    cb = (err, data) => (err ? reject(err) : resolve(data))
                }
                this.config.cacheOptions.cache.flushCache(cb)
            })
        }
    }

    import REGIONS from 'Enums/regions'
    import METHOD_NAMES from 'Enums/method-names'
    import BasicJSCache from 'Caches/BasicJSCache'
    import LRUCache from 'Caches/LRUCache'
    import RedisCache from 'Caches/RedisCache'

    const init = key => config => new Kayn(key, config)

    module.exports = {
        Kayn: init,
        REGIONS,
        METHOD_NAMES,
        BasicJSCache,
        LRUCache,
        RedisCache,
    }