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
213
214 | 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×
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 LeaguePositionsEndpointV4 from './Endpoints/LeagueEndpoint/LeaguePositionsEndpointV4'
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.LeaguePositionsV4 = new LeaguePositionsEndpointV4(
this.config,
this.limiter,
)
this.LeaguePositions = this.LeaguePositionsV4
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,
}
|