diff --git a/server-new/.env.example b/server-new/.env.example index 4f8f6bb..4c04fbf 100644 --- a/server-new/.env.example +++ b/server-new/.env.example @@ -10,3 +10,5 @@ REDIS_CONNECTION=local REDIS_HOST=127.0.0.1 REDIS_PORT=6379 REDIS_PASSWORD= + +API_KEY=RGAPI-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx diff --git a/server-new/app/Services/Jax/JaxConfig.ts b/server-new/app/Services/Jax/JaxConfig.ts new file mode 100644 index 0000000..928758b --- /dev/null +++ b/server-new/app/Services/Jax/JaxConfig.ts @@ -0,0 +1,21 @@ +import Env from '@ioc:Adonis/Core/Env' + +export interface JaxConfig { + key: string, + region: string, + requestOptions: JaxConfigRequestOptions +} + +export interface JaxConfigRequestOptions { + retriesBeforeAbort: number, + delayBeforeRetry: number, +} + +export const JAX_CONFIG: JaxConfig = { + key: Env.getOrFail('API_KEY') as string, + region: 'euw1', + requestOptions: { + retriesBeforeAbort: 3, + delayBeforeRetry: 1000, + }, +} diff --git a/server-new/app/Services/Jax/index.ts b/server-new/app/Services/Jax/index.ts new file mode 100644 index 0000000..3f02a21 --- /dev/null +++ b/server-new/app/Services/Jax/index.ts @@ -0,0 +1,4 @@ +import Jax from './src/Jax' +import { JAX_CONFIG } from './JaxConfig' + +export = new Jax(JAX_CONFIG) diff --git a/server-new/app/Services/Jax/src/CDragonRequest.ts b/server-new/app/Services/Jax/src/CDragonRequest.ts new file mode 100644 index 0000000..c60328a --- /dev/null +++ b/server-new/app/Services/Jax/src/CDragonRequest.ts @@ -0,0 +1,52 @@ +import { promisify } from 'util' +import got from 'got' +import Logger from '@ioc:Adonis/Core/Logger' +import Redis from '@ioc:Adonis/Addons/Redis' +import { JaxConfig } from '../JaxConfig' + +export default class CDragonRequest { + private config: JaxConfig + private endpoint: string + private cacheTime: number + private retries: number + private sleep: { (ms: number): Promise; (ms: number, value: T): Promise } + + constructor (config: JaxConfig, endpoint: string, cacheTime: number) { + this.config = config + this.endpoint = endpoint + this.cacheTime = cacheTime + this.retries = config.requestOptions.retriesBeforeAbort + + this.sleep = promisify(setTimeout) + } + + // https://raw.communitydragon.org/latest/plugins/rcp-be-lol-game-data/global/default/v1/items.json + // https://raw.communitydragon.org/latest/plugins/rcp-be-lol-game-data/global/default/v1/perks.json + // https://raw.communitydragon.org/latest/plugins/rcp-be-lol-game-data/global/default/v1/perkstyles.json + // https://raw.communitydragon.org/latest/plugins/rcp-be-lol-game-data/global/default/v1/champion-summary.json + + public async execute () { + const url = `https://raw.communitydragon.org/latest/plugins/rcp-be-lol-game-data/global/default/v1/${this.endpoint}` + + const requestCached = await Redis.get(url) + if (requestCached) { + return JSON.parse(requestCached) + } + + try { + const response = await got(url) + + await Redis.set(url, response.body, 'EX', this.cacheTime) + return JSON.parse(response.body) + } catch (error) { + this.retries-- + + Logger.error('CDragon Error : ', error) + + if (this.retries > 0) { + await this.sleep(this.config.requestOptions.delayBeforeRetry) + return this.execute() + } + } + } +} diff --git a/server-new/app/Services/Jax/src/Endpoints/CDragonEndpoint.ts b/server-new/app/Services/Jax/src/Endpoints/CDragonEndpoint.ts new file mode 100644 index 0000000..87b5c00 --- /dev/null +++ b/server-new/app/Services/Jax/src/Endpoints/CDragonEndpoint.ts @@ -0,0 +1,30 @@ +import { JaxConfig } from '../../JaxConfig' +import CDragonRequest from '../CDragonRequest' + +export default class CDragonEndpoint { + private config: JaxConfig + + constructor (config: JaxConfig) { + this.config = config + } + + public champions () { + return new CDragonRequest(this.config, 'champion-summary.json', 36000).execute() + } + + public items () { + return new CDragonRequest(this.config, 'items.json', 36000).execute() + } + + public perks () { + return new CDragonRequest(this.config, 'perks.json', 36000).execute() + } + + public perkstyles () { + return new CDragonRequest(this.config, 'perkstyles.json', 36000).execute() + } + + public summonerSpells () { + return new CDragonRequest(this.config, 'summoner-spells.json', 36000).execute() + } +} diff --git a/server-new/app/Services/Jax/src/Endpoints/LeagueEndpoint.ts b/server-new/app/Services/Jax/src/Endpoints/LeagueEndpoint.ts new file mode 100644 index 0000000..be4ec7c --- /dev/null +++ b/server-new/app/Services/Jax/src/Endpoints/LeagueEndpoint.ts @@ -0,0 +1,23 @@ +import { RiotRateLimiter } from '@fightmegg/riot-rate-limiter' +import { JaxConfig } from '../../JaxConfig' +import JaxRequest from '../JaxRequest' + +export default class LeagueEndpoint { + private config: JaxConfig + private limiter: RiotRateLimiter + + constructor (config: JaxConfig, limiter: RiotRateLimiter) { + this.config = config + this.limiter = limiter + } + + public summonerID (summonerID:number, region: string) { + return new JaxRequest( + region, + this.config, + `league/v4/entries/by-summoner/${summonerID}`, + this.limiter, + 300 + ).execute() + } +} diff --git a/server-new/app/Services/Jax/src/Endpoints/MatchEndpoint.ts b/server-new/app/Services/Jax/src/Endpoints/MatchEndpoint.ts new file mode 100644 index 0000000..26cc39a --- /dev/null +++ b/server-new/app/Services/Jax/src/Endpoints/MatchEndpoint.ts @@ -0,0 +1,25 @@ +import { RiotRateLimiter } from '@fightmegg/riot-rate-limiter' +import { JaxConfig } from '../../JaxConfig' +import JaxRequest from '../JaxRequest' + +export default class MatchEndpoint { + private config: JaxConfig + private limiter: RiotRateLimiter + + constructor (config: JaxConfig, limiter: RiotRateLimiter) { + this.config = config + this.limiter = limiter + + this.get = this.get.bind(this) + } + + public get (matchID: number, region: string) { + return new JaxRequest( + region, + this.config, + `match/v4/matches/${matchID}`, + this.limiter, + 1500 + ).execute() + } +} diff --git a/server-new/app/Services/Jax/src/Endpoints/MatchListEndpoint.ts b/server-new/app/Services/Jax/src/Endpoints/MatchListEndpoint.ts new file mode 100644 index 0000000..95f2f84 --- /dev/null +++ b/server-new/app/Services/Jax/src/Endpoints/MatchListEndpoint.ts @@ -0,0 +1,23 @@ +import { RiotRateLimiter } from '@fightmegg/riot-rate-limiter' +import { JaxConfig } from '../../JaxConfig' +import JaxRequest from '../JaxRequest' + +export default class MatchlistEndpoint { + private config: JaxConfig + private limiter: RiotRateLimiter + + constructor (config: JaxConfig, limiter: RiotRateLimiter) { + this.config = config + this.limiter = limiter + } + + public accountID (accountID: number, region: string, beginIndex = 0) { + return new JaxRequest( + region, + this.config, + `match/v4/matchlists/by-account/${accountID}?beginIndex=${beginIndex}`, + this.limiter, + 0 + ).execute() + } +} diff --git a/server-new/app/Services/Jax/src/Endpoints/SpectatorEndpoint.ts b/server-new/app/Services/Jax/src/Endpoints/SpectatorEndpoint.ts new file mode 100644 index 0000000..e2a9b01 --- /dev/null +++ b/server-new/app/Services/Jax/src/Endpoints/SpectatorEndpoint.ts @@ -0,0 +1,23 @@ +import { RiotRateLimiter } from '@fightmegg/riot-rate-limiter' +import { JaxConfig } from '../../JaxConfig' +import JaxRequest from '../JaxRequest' + +export default class SpectatorEndpoint { + private config: JaxConfig + private limiter: RiotRateLimiter + + constructor (config: JaxConfig, limiter: RiotRateLimiter) { + this.config = config + this.limiter = limiter + } + + public summonerID (summonerID: number, region: string) { + return new JaxRequest( + region, + this.config, + `spectator/v4/active-games/by-summoner/${summonerID}`, + this.limiter, + 0 + ).execute() + } +} diff --git a/server-new/app/Services/Jax/src/Endpoints/SummonerEndpoint.ts b/server-new/app/Services/Jax/src/Endpoints/SummonerEndpoint.ts new file mode 100644 index 0000000..d7950db --- /dev/null +++ b/server-new/app/Services/Jax/src/Endpoints/SummonerEndpoint.ts @@ -0,0 +1,23 @@ +import { RiotRateLimiter } from '@fightmegg/riot-rate-limiter' +import { JaxConfig } from '../../JaxConfig' +import JaxRequest from '../JaxRequest' + +export default class SummonerEndpoint { + private config: JaxConfig + private limiter: RiotRateLimiter + + constructor (config: JaxConfig, limiter: RiotRateLimiter) { + this.config = config + this.limiter = limiter + } + + public summonerName (summonerName: string, region: string) { + return new JaxRequest( + region, + this.config, + `summoner/v4/summoners/by-name/${encodeURI(summonerName)}`, + this.limiter, + 36000 + ).execute() + } +} diff --git a/server-new/app/Services/Jax/src/Jax.ts b/server-new/app/Services/Jax/src/Jax.ts new file mode 100644 index 0000000..7ec3f9a --- /dev/null +++ b/server-new/app/Services/Jax/src/Jax.ts @@ -0,0 +1,35 @@ +import LeagueEndpoint from './Endpoints/LeagueEndpoint' +import MatchEndpoint from './Endpoints/MatchEndpoint' +import MatchlistEndpoint from './Endpoints/MatchlistEndpoint' +import SummonerEndpoint from './Endpoints/SummonerEndpoint' +import SpectatorEndpoint from './Endpoints/SpectatorEndpoint' +import CDragonEndpoint from './Endpoints/CDragonEndpoint' +import { JaxConfig } from '../JaxConfig' +import { RiotRateLimiter } from '@fightmegg/riot-rate-limiter' + +export default class Jax { + public key: string + public limiter: RiotRateLimiter + public config: JaxConfig + public League: LeagueEndpoint + public Match: MatchEndpoint + public Matchlist: MatchlistEndpoint + public Spectator: SpectatorEndpoint + public Summoner: SummonerEndpoint + public CDragon: CDragonEndpoint + + constructor (config:JaxConfig) { + this.key = config.key + this.limiter = new RiotRateLimiter({ + debug: true, + }) + this.config = config + + this.League = new LeagueEndpoint(this.config, this.limiter) + this.Match = new MatchEndpoint(this.config, this.limiter) + this.Matchlist = new MatchlistEndpoint(this.config, this.limiter) + this.Spectator = new SpectatorEndpoint(this.config, this.limiter) + this.Summoner = new SummonerEndpoint(this.config, this.limiter) + this.CDragon = new CDragonEndpoint(this.config) + } +} diff --git a/server-new/app/Services/Jax/src/JaxRequest.ts b/server-new/app/Services/Jax/src/JaxRequest.ts new file mode 100644 index 0000000..1f53f71 --- /dev/null +++ b/server-new/app/Services/Jax/src/JaxRequest.ts @@ -0,0 +1,76 @@ +import { promisify } from 'util' +import { JaxConfig } from '../JaxConfig' +import Logger from '@ioc:Adonis/Core/Logger' +import Redis from '@ioc:Adonis/Addons/Redis' +import { RiotRateLimiter } from '@fightmegg/riot-rate-limiter' + +export default class JaxRequest { + private region: string + private config: JaxConfig + private endpoint: string + private limiter: RiotRateLimiter + private cacheTime: number + private retries: number + private sleep: { (ms: number): Promise; (ms: number, value: T): Promise } + + constructor (region: string, config: JaxConfig, endpoint: string, limiter: RiotRateLimiter, cacheTime: number) { + this.region = region + this.config = config + this.endpoint = endpoint + this.limiter = limiter + this.cacheTime = cacheTime + this.retries = config.requestOptions.retriesBeforeAbort + + this.sleep = promisify(setTimeout) + } + + public async execute () { + const url = `https://${this.region}.api.riotgames.com/lol/${this.endpoint}` + + // Redis cache + if (this.cacheTime > 0) { + const requestCached = await Redis.get(url) + if (requestCached) { + return JSON.parse(requestCached) + } + } + + try { + const resp = await this.limiter.execute({ + url, + options: { + headers: { + 'X-Riot-Token': this.config.key, + }, + }, + }) + + if (this.cacheTime > 0) { + await Redis.setex(url, this.cacheTime, JSON.stringify(resp)) + } + return resp + } catch ({ statusCode, ...rest }) { + this.retries-- + + if (statusCode !== 500 && statusCode !== 503 && statusCode !== 504) { + // Don't log 404 when summoner isn't playing or the summoner doesn't exist + if (!this.endpoint.includes('spectator/v4/active-games/by-summoner') && + !this.endpoint.includes('summoner/v4/summoners/by-name') + ) { + Logger.error(`JaxRequest Error ${statusCode} : `, rest) + } + + return + } + + console.log('====================================') + console.log(statusCode) + console.log('====================================') + + if (this.retries > 0) { + await this.sleep(this.config.requestOptions.delayBeforeRetry) + return this.execute() + } + } + } +} diff --git a/server-new/package-lock.json b/server-new/package-lock.json index e4153ad..cab44e7 100644 --- a/server-new/package-lock.json +++ b/server-new/package-lock.json @@ -360,6 +360,18 @@ "strip-json-comments": "^3.1.1" } }, + "@fightmegg/riot-rate-limiter": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@fightmegg/riot-rate-limiter/-/riot-rate-limiter-0.0.11.tgz", + "integrity": "sha512-VWS3R+BgDUEbBTOXgj7YxaX+AoL7u0n3vqaxhoengEWaoBE4xV6kijNCJmOEzmbjew4v+4f8quKqB7KvhRsGMw==", + "requires": { + "bottleneck": "^2.19.5", + "debug": "^4.2.0", + "ioredis": "^4.17.3", + "node-fetch": "^2.6.1", + "path-to-regexp": "^6.2.0" + } + }, "@hapi/bourne": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.0.0.tgz", @@ -462,6 +474,19 @@ "resolve-from": "^5.0.0" } }, + "@sindresorhus/is": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-3.1.2.tgz", + "integrity": "sha512-JiX9vxoKMmu8Y3Zr2RVathBL1Cdu4Nt4MuNWemt1Nc06A0RAin9c5FArkhGsyMBWfCu4zj+9b+GxtjAnE4qqLQ==" + }, + "@szmarczak/http-timer": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz", + "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==", + "requires": { + "defer-to-connect": "^2.0.0" + } + }, "@tokenizer/token": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.1.1.tgz", @@ -475,6 +500,17 @@ "@types/node": "*" } }, + "@types/cacheable-request": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", + "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==", + "requires": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" + } + }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -510,6 +546,11 @@ "@types/node": "*" } }, + "@types/http-cache-semantics": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", + "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==" + }, "@types/ioredis": { "version": "4.17.4", "resolved": "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.17.4.tgz", @@ -524,6 +565,14 @@ "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", "dev": true }, + "@types/keyv": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz", + "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", + "requires": { + "@types/node": "*" + } + }, "@types/luxon": { "version": "1.25.0", "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-1.25.0.tgz", @@ -567,6 +616,14 @@ "@types/node": "*" } }, + "@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "requires": { + "@types/node": "*" + } + }, "@types/sonic-boom": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/@types/sonic-boom/-/sonic-boom-0.7.0.tgz", @@ -1076,6 +1133,11 @@ } } }, + "bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1158,6 +1220,25 @@ "unset-value": "^1.0.0" } }, + "cacheable-lookup": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.3.tgz", + "integrity": "sha512-W+JBqF9SWe18A72XFzN/V/CULFzPm7sBXzzR6ekkE+3tLG72wFZrBiBZhrZuDoYexop4PHJVdFAKb/Nj9+tm9w==" + }, + "cacheable-request": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz", + "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^2.0.0" + } + }, "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", @@ -1268,6 +1349,14 @@ } } }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + } + }, "cluster-key-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz", @@ -1460,12 +1549,32 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "requires": { + "mimic-response": "^3.1.0" + }, + "dependencies": { + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" + } + } + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "defer-to-connect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.0.tgz", + "integrity": "sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==" + }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", @@ -2138,7 +2247,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, "requires": { "pump": "^3.0.0" } @@ -2224,6 +2332,24 @@ } } }, + "got": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/got/-/got-11.7.0.tgz", + "integrity": "sha512-7en2XwH2MEqOsrK0xaKhbWibBoZqy+f1RSUoIeF1BLcnf+pyQdDsljWMfmOh+QKJwuvDIiKx38GtPh5wFdGGjg==", + "requires": { + "@sindresorhus/is": "^3.1.1", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.1", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", @@ -2340,6 +2466,11 @@ "resolved": "https://registry.npmjs.org/haye/-/haye-2.0.2.tgz", "integrity": "sha512-C+jeFipAuwLLmQziwQrXuHzUIihDzqoLpCpwDWYFQVCIyqi5ZvC+4YtzawPTmd1tIKo0ULf+4P0Mw8irUdXIpg==" }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, "http-errors": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", @@ -2352,6 +2483,15 @@ "toidentifier": "1.0.0" } }, + "http2-wrapper": { + "version": "1.0.0-beta.5.2", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.0-beta.5.2.tgz", + "integrity": "sha512-xYz9goEyBnC8XwXDTuC/MZ6t+MrKVQZOk4s7+PaDkwIsQd8IwqvM+0M6bA/2lvG8GHXcPdf+MejTUeO2LCPCeQ==", + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + } + }, "human-signals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", @@ -2650,6 +2790,11 @@ "esprima": "^4.0.0" } }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -2677,6 +2822,14 @@ "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", "dev": true }, + "keyv": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz", + "integrity": "sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==", + "requires": { + "json-buffer": "3.0.1" + } + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -2745,6 +2898,11 @@ "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", "dev": true }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + }, "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", @@ -2994,6 +3152,11 @@ "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", "dev": true }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -3209,12 +3372,22 @@ "lodash.toarray": "^4.4.0" } }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" + }, "npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -3352,6 +3525,11 @@ } } }, + "p-cancelable": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", + "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==" + }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -3476,6 +3654,11 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, + "path-to-regexp": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz", + "integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==" + }, "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", @@ -3603,7 +3786,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -3771,6 +3953,11 @@ } } }, + "resolve-alpn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.0.0.tgz", + "integrity": "sha512-rTuiIEqFmGxne4IovivKSDzld2lWW9QCjqv80SYjPgf+gS35eaCAjaP54CCwGAwBtnCsvNLYtqxe1Nw+i6JEmA==" + }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -3782,6 +3969,14 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, + "responselike": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", + "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "requires": { + "lowercase-keys": "^2.0.0" + } + }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", diff --git a/server-new/package.json b/server-new/package.json index 862ec20..85fd56c 100644 --- a/server-new/package.json +++ b/server-new/package.json @@ -23,7 +23,9 @@ "@adonisjs/core": "^5.0.0-preview-rc-1.12", "@adonisjs/fold": "^6.4.1", "@adonisjs/redis": "^4.1.2", + "@fightmegg/riot-rate-limiter": "0.0.11", "@zakodium/adonis-mongodb": "^0.3.0", + "got": "^11.7.0", "proxy-addr": "^2.0.6", "reflect-metadata": "^0.1.13", "source-map-support": "^0.5.19" diff --git a/server-new/start/routes.ts b/server-new/start/routes.ts index 35f23d8..df493eb 100644 --- a/server-new/start/routes.ts +++ b/server-new/start/routes.ts @@ -20,6 +20,7 @@ import Route from '@ioc:Adonis/Core/Route' import mongodb from '@ioc:Mongodb/Database' +import Jax from 'App/Services/Jax' Route.get('/', async () => { return { hello: 'world' } @@ -29,3 +30,8 @@ Route.get('mongo', async () => { const match = await (await mongodb.connection().collection('matches')).findOne({}) return { test: match } }) + +Route.get('jax', async () => { + const summoner = await Jax.Summoner.summonerName('LeagueStats GG', 'euw1') + return { player: summoner } +})