Last active
March 25, 2024 01:23
-
-
Save yojohanshinwataikei/0697a3e787a686b843e0c2bcb9da1ad3 to your computer and use it in GitHub Desktop.
Arcaea score prober backend
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import fs = require("fs-extra") | |
| import path = require("path") | |
| import net = require("net") | |
| import https = require("https") | |
| import child = require("child_process") | |
| import util = require("util") | |
| import WebSocket = require("ws") | |
| import brotli = require("brotli") | |
| import mysql2 = require("mysql2/promise") | |
| import sqlite3 = require("better-sqlite3") | |
| import luxon = require("luxon") | |
| import fetch = require("node-fetch") | |
| import { URLSearchParams } from "url" | |
| import config = require("./config.json") | |
| // helper | |
| type LanguageName = "en" | "ja" | "ko" | "zh-Hans" | "zh-Hant" | |
| type LocalizedString = Record<LanguageName, string> | |
| interface SongData { | |
| id: string, | |
| title_localized: LocalizedString, | |
| artist: string | |
| date: number | |
| } | |
| interface SongList { | |
| songs: SongData[] | |
| } | |
| type TokenInfo = [token: string, deviceId: string] | |
| const getJSONFile = (filename: string) => fs.readJSONSync(path.join(__dirname, filename)) | |
| const songlist = () => getJSONFile("songlist") as SongList | |
| const tokens = () => getJSONFile("tokens.json") as TokenInfo[] | |
| const brotli_compress = (data: any) => brotli.compress(Buffer.from(JSON.stringify(data)), { quality: 5 }) | |
| const parseNumber = (num: string, defaultNum: number) => { | |
| const value = +num | |
| if (Number.isNaN(value)) { | |
| return defaultNum | |
| } else { | |
| return value | |
| } | |
| } | |
| const sleep = async (millis: number) => await util.promisify(setTimeout)(millis) | |
| const log = (filename: string, message: string) => fs.appendFileSync( | |
| path.join(__dirname, filename), | |
| luxon.DateTime.now().toFormat("[MM/dd HH:mm:ss] ") + message | |
| ) | |
| const sendData = async (websocket: WebSocket, data: any) => { | |
| await util.promisify(websocket.send).call(websocket, data) | |
| } | |
| const constantFromScoreAndRating = (score: number, rating: number) => { | |
| let result = 0 | |
| if (score > 100e5) { | |
| result = rating - 2 | |
| } else if (score > 98e5) { | |
| result = rating - 1 - (score - 98e5) / 2e5 | |
| } else if (rating > 0) { | |
| result = rating - (score - 95e5) / 3e5 | |
| } | |
| return Math.round(result * 100) / 100 | |
| } | |
| const ratingFromConstantAndScore = (constant: number, score: number) => { | |
| if (score > 100e5) { | |
| return constant + 2 | |
| } else if (score > 98e5) { | |
| return constant + 1 + (score - 98e5) / 2e5 | |
| } else { | |
| return Math.max(constant + (score - 95e5) / 3e5, 0) | |
| } | |
| } | |
| // database setup | |
| const mysqlPool = mysql2.createPool(config.mysql) | |
| const sqlite3DB = new sqlite3(path.join(__dirname, config.sqlite3)) | |
| sqlite3DB.pragma("synchronous = 3") | |
| // token management | |
| const inUseToken = new Set<string>() | |
| interface TokenRequestQueueItem { | |
| res: (_: void) => void; | |
| notifyQueueLength?: (length: number) => void; | |
| } | |
| const tokenRequestQueue: TokenRequestQueueItem[] = [] | |
| const getToken = async (notifyQueueLength?: (length: number) => void) => { | |
| while (true) { | |
| const usableToken = tokens().filter(([token,]) => !inUseToken.has(token)) | |
| if (usableToken.length === 0) { | |
| await new Promise((res, _) => { | |
| notifyQueueLength?.(tokenRequestQueue.length + 1) | |
| tokenRequestQueue.push({ res, notifyQueueLength }) | |
| log("arc.log", `tokenRequestQueue.push -->${tokenRequestQueue.length}\n`) | |
| }) | |
| continue | |
| } | |
| const tokenInfo = usableToken[Math.floor(Math.random() * usableToken.length)] | |
| inUseToken.add(tokenInfo[0]) | |
| return tokenInfo | |
| } | |
| } | |
| const returnToken = (tokenInfo: TokenInfo) => { | |
| inUseToken.delete(tokenInfo[0]) | |
| let item = tokenRequestQueue.shift() | |
| log("arc.log", `tokenRequestQueue.shift -->${tokenRequestQueue.length}\n`) | |
| item?.res?.() | |
| tokenRequestQueue.forEach((item, i) => { | |
| item.notifyQueueLength?.(i + 1) | |
| }) | |
| } | |
| const withToken = async (inner: (tokenInfo: TokenInfo) => Promise<void>, notifyQueueLength?: (length: number) => void) => { | |
| const tokenInfo = await getToken(notifyQueueLength) | |
| try { | |
| await inner(tokenInfo) | |
| } finally { | |
| await sleep(1000) | |
| returnToken(tokenInfo) | |
| } | |
| } | |
| // arcapi interaction | |
| const challengeGen = path.join(__dirname, config.challenge) | |
| const gen_challenge = async (path: string, body: string) => { | |
| const gen_cp = child.spawn(challengeGen, [path], { | |
| stdio: ["pipe", "pipe", "inherit"], | |
| env: { ...process.env, ARC_API_CHALLENGE_SALT: config.salt }, | |
| }) | |
| const stdin = gen_cp.stdin | |
| util.promisify(stdin.end).call(stdin, body) | |
| let result = "" | |
| gen_cp.stdout.on("data", (data) => result += data) | |
| await new Promise((res, rej) => { | |
| gen_cp.on("exit", res) | |
| }) | |
| return result | |
| } | |
| const endpoint = config.endpoint | |
| const apiVersion = config.apiVersion | |
| const appVersion = config.appVersion | |
| const pfx = config.pfx | |
| const passphrase = config.passphrase | |
| const agent = new https.Agent({ | |
| pfx: fs.readFileSync(pfx), | |
| passphrase: fs.readFileSync(passphrase, "utf-8"), | |
| }) | |
| class ApiError extends Error { | |
| public error_code: number | |
| public status_code: number | |
| constructor(status_code: number, error_code: number, message: string = null) { | |
| super(`Arcaea api Error, status_code:${status_code}, error_code:${error_code}` + (message ? `, message:${message}` : "")) | |
| this.error_code = error_code | |
| this.status_code = status_code | |
| } | |
| } | |
| type ArcapiResult = { success: true, value: any } | { success: false, error_code: number } | |
| const intervalBetweenRequests = () => Math.max(180, Math.floor(1000 / tokens().length)) | |
| let arcapiRequestCount = 0 | |
| const arcapiRequestLimit = config.arcapiRequestLimit | |
| const arcapiRequestQueue: ((_: void) => void)[] = [] | |
| const beginArcapiRequests = async () => { | |
| while (arcapiRequestCount >= arcapiRequestLimit) { | |
| await new Promise((res, _) => { | |
| arcapiRequestQueue.push(res) | |
| }) | |
| } | |
| arcapiRequestCount++ | |
| } | |
| const endArcapiRequest = () => { | |
| arcapiRequestCount-- | |
| let request = arcapiRequestQueue.shift() | |
| request?.() | |
| } | |
| const arcFetchBase = async (method: string, path: string, tokenInfo: TokenInfo, param?: fetch.BodyInit) => { | |
| const pathBase = `/${apiVersion}/${path}` | |
| const fullPath = pathBase + ((method === "GET" && param) ? ("?" + param.toString()) : "") | |
| const url = endpoint + fullPath | |
| const body = method === "GET" ? null : param.toString() | |
| const challenge = await gen_challenge(fullPath, body ?? "") | |
| const headers = { | |
| "Accept-Encoding": "identity", | |
| "Content-Type": "application/x-www-form-urlencoded; charset=utf-8", | |
| "Platform": "android", | |
| "AppVersion": appVersion, | |
| "User-Agent": "Dalvik/2.1.0 (Linux; U; Android 9; G8142 Build/47.2.A.10.107)", | |
| "Connection": "Keep-Alive", | |
| "DeviceId": tokenInfo[1], | |
| "Authorization": `Bearer ${tokenInfo[0]}`, | |
| "X-Random-Challenge": challenge, | |
| } | |
| try { | |
| const response = await fetch.default(url, { | |
| method, | |
| headers, | |
| body, | |
| agent | |
| }) | |
| const rawResult = await response.text() | |
| const result = (() => { | |
| try { | |
| return JSON.parse(rawResult) as ArcapiResult | |
| } catch (err) { | |
| throw new ApiError(response.status, NaN, `JSON parsing error, raw result:${rawResult}`) | |
| } | |
| })() | |
| if (result && result.success) { | |
| return result.value | |
| } else if (result.success === false) { | |
| throw new ApiError(response.status, result.error_code) | |
| } else { | |
| throw new ApiError(response.status, NaN) | |
| } | |
| } catch (err) { | |
| if (config.logAPIError) { | |
| log("arc.log", `arcapi error:${err}\nmethod:${method}\nurl:${url}\ntoken:${tokenInfo[0]}\nrequest body:${body}\n`) | |
| } | |
| throw err; | |
| } | |
| } | |
| const arcFetchBaseWithRateLimiter = async (method: string, path: string, tokenInfo: TokenInfo, param?: fetch.BodyInit) => { | |
| await beginArcapiRequests() | |
| try { | |
| await sleep(intervalBetweenRequests()) | |
| return await arcFetchBase(method, path, tokenInfo, param) | |
| } finally { | |
| endArcapiRequest() | |
| } | |
| } | |
| const arcFetch = async (method: string, path: string, tokenInfo: TokenInfo, param?: fetch.BodyInit) => { | |
| const retryLimit = config.retryLimit | |
| let retryCount = 0 | |
| while (true) { | |
| try { | |
| return await arcFetchBaseWithRateLimiter(method, path, tokenInfo, param) | |
| } catch (err) { | |
| if (err instanceof ApiError) { | |
| if (retryCount < retryLimit && err.status_code === 404 && err.error_code === 1) { | |
| retryCount++ | |
| continue | |
| } | |
| if (retryCount < retryLimit && Number.isNaN(err.error_code)) { | |
| retryCount++ | |
| continue | |
| } | |
| } | |
| if (err instanceof fetch.FetchError) { | |
| if (retryCount < retryLimit && (err.code === "ETIMEDOUT" || err.code === "ENOTFOUND")) { | |
| retryCount++ | |
| continue | |
| } | |
| } | |
| throw err | |
| } | |
| } | |
| } | |
| const userMe = async (tokenInfo: TokenInfo) => { | |
| return await arcFetch("GET", "user/me", tokenInfo) | |
| } | |
| const deleteFriend = async (tokenInfo: TokenInfo, userid: number) => { | |
| return await arcFetch("POST", "friend/me/delete", tokenInfo, new URLSearchParams({ friend_id: userid.toString() })) | |
| } | |
| const addFriend = async (tokenInfo: TokenInfo, usercode: string) => { | |
| return await arcFetch("POST", "friend/me/add", tokenInfo, new URLSearchParams({ friend_code: usercode })) | |
| } | |
| const clearFriend = async (tokenInfo: TokenInfo) => { | |
| const self = await userMe(tokenInfo) | |
| for (const friend of self.friends) { | |
| await deleteFriend(tokenInfo, friend.user_id) | |
| } | |
| } | |
| const friendRank = async ( | |
| tokenInfo: TokenInfo, | |
| songid: string, difficulty: number, start: number = 0, limit: number = 11 | |
| ) => { | |
| return await arcFetch("GET", "score/song/friend", tokenInfo, new URLSearchParams({ | |
| song_id: songid, | |
| difficulty: difficulty.toString(), | |
| start: start.toString(), | |
| limit: limit.toString() | |
| })) | |
| } | |
| // features | |
| class ProberError extends Error { | |
| public client_message: string | |
| public reason?: any | |
| constructor(client_message: string, reason?: any) { | |
| super(`Prober Error, error_code:${client_message}` + (reason ? (` reason:${reason}`) : "")) | |
| this.client_message = client_message | |
| this.reason = reason | |
| } | |
| } | |
| const sendSongMeta = async (connection: WebSocket) => { | |
| const songTitleData: Record<string, LocalizedString> = {} | |
| for (const song of songlist().songs) { | |
| songTitleData[song.id] = song.title_localized | |
| } | |
| await sendData(connection, brotli_compress({ cmd: "songtitle", data: songTitleData })) | |
| const songArtistData: Record<string, string> = {} | |
| for (const song of songlist().songs) { | |
| songArtistData[song.id] = song.artist | |
| } | |
| await sendData(connection, brotli_compress({ cmd: "songartist", data: songArtistData })) | |
| } | |
| const getSongDate = () => { | |
| const songDateData: Record<string, number> = {} | |
| for (const song of songlist().songs) { | |
| songDateData[song.id] = song.date | |
| } | |
| return songDateData | |
| } | |
| const testQuery = async (connection: WebSocket) => { | |
| await sendData(connection, brotli_compress(getJSONFile("test_user.json"))) | |
| let id = 1 | |
| while (fs.existsSync(path.join(__dirname, `test_${id}.json`))) { | |
| await sleep(100) | |
| await sendData(connection, brotli_compress(getJSONFile(`test_${id}.json`))) | |
| id++ | |
| } | |
| await sendData(connection, "bye") | |
| connection.close() | |
| } | |
| const metaQuery = async (connection: WebSocket, chara: number) => { | |
| await sendData(connection, brotli_compress({ | |
| cmd: "userinfo", data: { | |
| join_date: 1489517588494, | |
| name: ["Hikari", "Tairitsu"][chara], | |
| rating: 616, | |
| recent_score: [], | |
| user_code: ["000000001", "000000002"][chara], | |
| user_id: [1000001, 1000002][chara] | |
| } | |
| })) | |
| await sendData(connection, "bye") | |
| connection.close() | |
| } | |
| const proberAddFriend = async (tokenInfo: TokenInfo, usercode: string) => { | |
| try { | |
| await clearFriend(tokenInfo) | |
| return await addFriend(tokenInfo, usercode) | |
| } catch (err) { | |
| if (err instanceof ApiError) { | |
| if (err.error_code === 5 || err.error_code === 1203) { | |
| throw new ProberError("Please update arcaea", err) | |
| } else if (err.error_code === 603) { | |
| throw new ProberError("account is locked", err) | |
| } else if (err.error_code === 401) { | |
| throw new ProberError("invalid user code", err) | |
| } else if (err.status_code === 401 || err.status_code === 403) { | |
| throw new ProberError("account cannot login", err) | |
| } | |
| } else if (err instanceof fetch.FetchError) { | |
| if (err.code === "ETIMEDOUT") { | |
| throw new ProberError("Lowiro server timeout", err) | |
| } | |
| } | |
| throw new ProberError("add", err) | |
| } | |
| } | |
| const proberFriendRank = async (tokenInfo: TokenInfo, songid: string, difficulty: number) => { | |
| try { | |
| return await friendRank(tokenInfo, songid, difficulty) | |
| } catch (err) { | |
| if (err instanceof fetch.FetchError) { | |
| if (err.code === "ETIMEDOUT") { | |
| throw new ProberError("Lowiro server timeout", err) | |
| } | |
| } | |
| throw new ProberError("fetch", err) | |
| } | |
| } | |
| const query = async (connection: WebSocket, userCode: string, param: string[]) => { | |
| let constFrom = parseNumber(param[0], 0) | |
| let constTo = parseNumber(param[1], 12) | |
| await sendSongMeta(connection) | |
| const songDateData = getSongDate() | |
| if (userCode === "000007357") { | |
| return await testQuery(connection) | |
| } else if (userCode === "000000001") { | |
| return await metaQuery(connection, 0) | |
| } else if (userCode === "000000002") { | |
| return await metaQuery(connection, 1) | |
| } | |
| const selectUser = sqlite3DB.prepare("SELECT id FROM known_code WHERE code=?") | |
| let cachedUserId = selectUser.get(userCode)?.id ?? 0 | |
| log("arc.log", `${((connection as any)._socket as net.Socket)?.remoteAddress}\t${userCode}\t${cachedUserId}\n`) | |
| await sendData(connection, "queued") | |
| const notifyQueueLength = async (length: number) => { | |
| try { | |
| await sendData(connection, `queueLength,${length}`) | |
| } catch { | |
| // do nothing | |
| } | |
| } | |
| await withToken(async (tokenInfo) => { | |
| await sendData(connection, "queried") | |
| const addResult = await proberAddFriend(tokenInfo, userCode) | |
| // delete all and add one, so we should only have one friend | |
| if (addResult.friends.length !== 1) { | |
| throw new ProberError("add", new Error("Friend count after add is not 1")) | |
| } | |
| const userInfo = addResult.friends[0] | |
| const insertCode = sqlite3DB.prepare("INSERT OR REPLACE INTO known_code (code,id) VALUES (?,?)") | |
| insertCode.run(userCode, userInfo.user_id) | |
| sqlite3DB.transaction(() => { | |
| if (userInfo.rating > 0) { | |
| const data = [userInfo.join_date, userInfo.name, userInfo.rating, userCode, Date.now(), userInfo.user_id] | |
| sqlite3DB.prepare("INSERT OR IGNORE INTO user_info (join_date,name,rating,code,data_time,id) VALUES (?,?,?,?,?,?)").run(...data) | |
| sqlite3DB.prepare("UPDATE user_info SET join_date=?,name=?,rating=?,code=?,data_time=? WHERE id=?").run(...data) | |
| sqlite3DB.prepare('INSERT OR IGNORE INTO rating_record (id,date,rating) VALUES (?,?,?)').run(userInfo.user_id, luxon.DateTime.now().toFormat("yyMMdd"), userInfo.rating); | |
| } else { | |
| //new user or hidden rating | |
| const data = [userInfo.join_date, userInfo.name, userCode, userInfo.user_id] | |
| sqlite3DB.prepare('INSERT OR IGNORE INTO user_info (join_date,name,code,id) VALUES (?,?,?,?)').run(...data); | |
| sqlite3DB.prepare('UPDATE user_info SET join_date=?,name=?,code=? WHERE id=?').run(...data); | |
| } | |
| }).exclusive() | |
| for (const score of userInfo.recent_score) { | |
| if ("rating" in score) { | |
| score.constant = constantFromScoreAndRating(score.score, score.rating) | |
| score.song_date = songDateData[score.song_id] | |
| score.constant_old = score.time_played < config.lastConstantUpdateTime | |
| const connection = await mysqlPool.getConnection() | |
| await connection.beginTransaction() | |
| try { | |
| const [chartRows,] = await connection.query("SELECT id,difficulty,time_played FROM chart_constants WHERE id=? AND difficulty=?", [score.song_id, score.difficulty]) | |
| const recordedTime = chartRows[0]?.time_played ?? -Infinity | |
| const needUpdate = recordedTime < config.lastConstantUpdateTime && score.time_played >= config.lastConstantUpdateTime | |
| if (score.rating > 0) { | |
| if (needUpdate) { | |
| await connection.execute("REPLACE INTO chart_constants (id,difficulty,constant,source_score,source_rating,time_played) VALUES (?,?,?,?,?,?)", | |
| [score.song_id, score.difficulty, score.constant, score.score, score.rating, score.time_played]) | |
| } else { | |
| await connection.execute("INSERT IGNORE INTO chart_constants (id,difficulty,constant,source_score,source_rating,time_played) VALUES (?,?,?,?,?,?)", | |
| [score.song_id, score.difficulty, score.constant, score.score, score.rating, score.time_played]) | |
| } | |
| } | |
| await connection.commit(); | |
| } catch (err) { | |
| await connection.rollback(); | |
| throw err; | |
| } finally { | |
| connection.release(); | |
| } | |
| } | |
| } | |
| userInfo.user_code = userCode | |
| const selectRatingRecord = sqlite3DB.prepare("SELECT date,rating FROM rating_record WHERE id=?") | |
| const ratingRecord = selectRatingRecord.all(userInfo.user_id) | |
| userInfo.rating_records = ratingRecord.map((row) => [row.date.toString(), row.rating]) | |
| log("arc.log", `${((connection as any)._socket as net.Socket)?.remoteAddress} --> ${((userInfo.rating as number) / 100).toFixed(2)} ${userInfo.name}\n`) | |
| await sendData(connection, brotli_compress({ cmd: "userinfo", data: userInfo })) | |
| const userPtt = userInfo.rating / 100 | |
| if (param.length == 0) { | |
| if (userInfo.rating <= 0) { | |
| throw new ProberError("potential_hidden") | |
| } else { | |
| constFrom = userPtt - 3 | |
| } | |
| } | |
| const [chartRows,] = await mysqlPool.query("SELECT id,difficulty,constant,time_played FROM chart_constants") | |
| const charts = (chartRows as any[]).filter(chart => chart.constant <= constTo && chart.constant >= constFrom); | |
| charts.sort((a, b) => b.constant - a.constant) | |
| for (const chart of charts) { | |
| const rank = await proberFriendRank(tokenInfo, chart.id, chart.difficulty) | |
| const scores = rank.filter(record => record.user_id === userInfo.user_id) | |
| if (scores.length === 1) { | |
| const score = scores[0] | |
| score.constant = chart.constant | |
| score.constant_old = chart.time_played < config.lastConstantUpdateTime | |
| score.rating = ratingFromConstantAndScore(chart.constant, score.score) | |
| score.song_date = songDateData[chart.id] | |
| await sendData(connection, brotli_compress({ cmd: "scores", data: [score] })) | |
| } | |
| } | |
| await sendData(connection, "bye") | |
| connection.close() | |
| }, notifyQueueLength) | |
| } | |
| const fetchConstants = async (connection: WebSocket) => { | |
| await sendSongMeta(connection) | |
| const [rows,] = await mysqlPool.query("SELECT id,difficulty,constant,time_played FROM chart_constants") | |
| const songConstantsData: Record<string, { constant: any; old: boolean; }[]> = {} | |
| for (const { id, difficulty, constant, time_played } of rows as mysql2.RowDataPacket[]) { | |
| if (!(id in songConstantsData)) { | |
| songConstantsData[id] = [] | |
| } | |
| songConstantsData[id][difficulty] = { constant, old: time_played < config.lastConstantUpdateTime } | |
| } | |
| await sendData(connection, brotli_compress({ cmd: "constants", data: songConstantsData })) | |
| await sendData(connection, "bye") | |
| connection.close() | |
| } | |
| const lookupUser = async (connection: WebSocket, user: string) => { | |
| if (!/^[a-zA-Z0-9]+$/.test(user)) { | |
| await sendData(connection, "invalid id") | |
| connection.close() | |
| return | |
| } | |
| const selectUser = sqlite3DB.prepare("SELECT * FROM user_info WHERE lower(name)=?") | |
| const userInfos = selectUser.all(user.toLowerCase()) | |
| await sendData(connection, brotli_compress({ | |
| cmd: "lookup_result", data: userInfos.map(row => ({ | |
| ...row, | |
| data_time: luxon.DateTime.fromMillis(row.data_time).toFormat("yyyy/MM/dd"), | |
| })) | |
| })) | |
| await sendData(connection, "bye") | |
| connection.close() | |
| } | |
| const handleCommand = async (connection: WebSocket, command: string[]) => { | |
| try { | |
| if (command.length === 0) { | |
| await sendData(connection, "invalid cmd") | |
| connection.close() | |
| return | |
| } else if (command[0] === "constants") { | |
| return await fetchConstants(connection); | |
| } else if (command[0] === "lookup" && command.length >= 2) { | |
| return await lookupUser(connection, command[1]); | |
| } else if (/^\d{9}$/.test(command[0])) { | |
| return await query(connection, command[0], command.slice(1)) | |
| } | |
| await sendData(connection, "invalid id") | |
| connection.close() | |
| } catch (err) { | |
| connection.send(`error,${err?.client_message ?? "Unknown error"}`) | |
| log("arc.log", `[error]command:${command}\nerr:${err}\n`) | |
| connection.close() | |
| } | |
| } | |
| // server setup | |
| const connectionHasPong = new WeakMap<WebSocket, boolean>() | |
| const httpsServer = https.createServer({ | |
| cert: fs.readFileSync(config.httpsCert), | |
| key: fs.readFileSync(config.httpsKey), | |
| }) | |
| const server = new WebSocket.Server({ | |
| server: httpsServer, | |
| }) | |
| server.on("connection", (connection) => { | |
| connectionHasPong.set(connection, true) | |
| connection.on("pong", () => { | |
| connectionHasPong.set(connection, true) | |
| }) | |
| connection.binaryType = "arraybuffer" | |
| const commandTimeout = setTimeout(() => { | |
| connection.send("timeout") | |
| connection.close() | |
| }, 5000) | |
| connection.on("message", async (message, isBinary) => { | |
| clearTimeout(commandTimeout) | |
| if (isBinary) { | |
| connection.send("invalid cmd") | |
| connection.close() | |
| return | |
| } | |
| const command = message.toString().split(" ") | |
| await handleCommand(connection, command) | |
| }) | |
| connection.on("error", (_, err) => { | |
| log("arc.log", `${((connection as any)._socket as net.Socket)?.remoteAddress}\twebsocket error:${err}`) | |
| console.error(`${((connection as any)._socket as net.Socket)?.remoteAddress}\twebsocket error:${err}`) | |
| connection.terminate() | |
| }) | |
| }) | |
| const connectionPingTestInterval = setInterval(() => { | |
| for (const connection of server.clients) { | |
| if (connectionHasPong.get(connection)) { | |
| connectionHasPong.set(connection, false) | |
| connection.ping() | |
| } else { | |
| connection.terminate() | |
| } | |
| } | |
| }, 5000) | |
| server.on("close", () => { | |
| clearInterval(connectionPingTestInterval) | |
| }) | |
| httpsServer.listen(config.port) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "name": "arc_probe", | |
| "version": "0.0.0", | |
| "lockfileVersion": 2, | |
| "requires": true, | |
| "packages": { | |
| "": { | |
| "version": "0.0.0", | |
| "license": "ISC", | |
| "dependencies": { | |
| "better-sqlite3": "^7.4.1", | |
| "brotli": "^1.3.2", | |
| "fs-extra": "^10.0.0", | |
| "luxon": "^1.27.0", | |
| "mysql2": "^2.2.5", | |
| "node-fetch": "^2.6.1", | |
| "ws": "^8.2.0" | |
| }, | |
| "devDependencies": { | |
| "@types/better-sqlite3": "^5.4.1", | |
| "@types/brotli": "^1.3.0", | |
| "@types/fs-extra": "^9.0.11", | |
| "@types/luxon": "^1.27.0", | |
| "@types/node": "^15.12.3", | |
| "@types/node-fetch": "^2.5.10", | |
| "@types/ws": "^7.4.7", | |
| "typescript": "^4.3.4" | |
| } | |
| }, | |
| "node_modules/@types/better-sqlite3": { | |
| "version": "5.4.1", | |
| "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-5.4.1.tgz", | |
| "integrity": "sha512-8hje3Rhsg/9veTkALfCwiWn7VMrP1QDwHhBSgerttYPABEvrHsMQnU9dlqoM6QX3x4uw3Y06dDVz8uDQo1J4Ng==", | |
| "dev": true, | |
| "dependencies": { | |
| "@types/integer": "*" | |
| } | |
| }, | |
| "node_modules/@types/brotli": { | |
| "version": "1.3.0", | |
| "resolved": "https://registry.npmjs.org/@types/brotli/-/brotli-1.3.0.tgz", | |
| "integrity": "sha512-89tTxLlpcaOw+K2KVTGUfEXhTj1EwBDy2W2bNCt5pGG9x02SgLb9ayLTGVgpWMJAqr+EwCV0hVy2S94u6vQ16w==", | |
| "dev": true, | |
| "dependencies": { | |
| "@types/node": "*" | |
| } | |
| }, | |
| "node_modules/@types/fs-extra": { | |
| "version": "9.0.11", | |
| "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.11.tgz", | |
| "integrity": "sha512-mZsifGG4QeQ7hlkhO56u7zt/ycBgGxSVsFI/6lGTU34VtwkiqrrSDgw0+ygs8kFGWcXnFQWMrzF2h7TtDFNixA==", | |
| "dev": true, | |
| "dependencies": { | |
| "@types/node": "*" | |
| } | |
| }, | |
| "node_modules/@types/integer": { | |
| "version": "4.0.0", | |
| "resolved": "https://registry.npmjs.org/@types/integer/-/integer-4.0.0.tgz", | |
| "integrity": "sha512-2U1i6bIRiqizl6O+ETkp2HhUZIxg7g+burUabh9tzGd0qcszfNaFRaY9bGNlQKgEU7DCsH5qMajRDW5QamWQbw==", | |
| "dev": true | |
| }, | |
| "node_modules/@types/luxon": { | |
| "version": "1.27.0", | |
| "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-1.27.0.tgz", | |
| "integrity": "sha512-rr2lNXsErnA/ARtgFn46NtQjUa66cuwZYeo/2K7oqqxhJErhXgHBPyNKCo+pfOC3L7HFwtao8ebViiU9h4iAxA==", | |
| "dev": true | |
| }, | |
| "node_modules/@types/node": { | |
| "version": "15.12.3", | |
| "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.3.tgz", | |
| "integrity": "sha512-SNt65CPCXvGNDZ3bvk1TQ0Qxoe3y1RKH88+wZ2Uf05dduBCqqFQ76ADP9pbT+Cpvj60SkRppMCh2Zo8tDixqjQ==", | |
| "dev": true | |
| }, | |
| "node_modules/@types/node-fetch": { | |
| "version": "2.5.10", | |
| "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.10.tgz", | |
| "integrity": "sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ==", | |
| "dev": true, | |
| "dependencies": { | |
| "@types/node": "*", | |
| "form-data": "^3.0.0" | |
| } | |
| }, | |
| "node_modules/@types/ws": { | |
| "version": "7.4.7", | |
| "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", | |
| "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", | |
| "dev": true, | |
| "dependencies": { | |
| "@types/node": "*" | |
| } | |
| }, | |
| "node_modules/ansi-regex": { | |
| "version": "2.1.1", | |
| "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", | |
| "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", | |
| "engines": { | |
| "node": ">=0.10.0" | |
| } | |
| }, | |
| "node_modules/aproba": { | |
| "version": "1.2.0", | |
| "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", | |
| "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" | |
| }, | |
| "node_modules/are-we-there-yet": { | |
| "version": "1.1.5", | |
| "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", | |
| "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", | |
| "dependencies": { | |
| "delegates": "^1.0.0", | |
| "readable-stream": "^2.0.6" | |
| } | |
| }, | |
| "node_modules/asynckit": { | |
| "version": "0.4.0", | |
| "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", | |
| "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", | |
| "dev": true | |
| }, | |
| "node_modules/base64-js": { | |
| "version": "1.5.1", | |
| "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", | |
| "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", | |
| "funding": [ | |
| { | |
| "type": "github", | |
| "url": "https://github.com/sponsors/feross" | |
| }, | |
| { | |
| "type": "patreon", | |
| "url": "https://www.patreon.com/feross" | |
| }, | |
| { | |
| "type": "consulting", | |
| "url": "https://feross.org/support" | |
| } | |
| ] | |
| }, | |
| "node_modules/better-sqlite3": { | |
| "version": "7.4.1", | |
| "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.4.1.tgz", | |
| "integrity": "sha512-sk1kW3PsWE7W7G9qbi5TQxCROlQVR8YWlp4srbyrwN5DrLeamKfrm3JExwOiNSAYyJv8cw5/2HOfvF/ipZj4qg==", | |
| "hasInstallScript": true, | |
| "dependencies": { | |
| "bindings": "^1.5.0", | |
| "prebuild-install": "^6.0.1", | |
| "tar": "^6.1.0" | |
| } | |
| }, | |
| "node_modules/bindings": { | |
| "version": "1.5.0", | |
| "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", | |
| "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", | |
| "dependencies": { | |
| "file-uri-to-path": "1.0.0" | |
| } | |
| }, | |
| "node_modules/bl": { | |
| "version": "4.1.0", | |
| "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", | |
| "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", | |
| "dependencies": { | |
| "buffer": "^5.5.0", | |
| "inherits": "^2.0.4", | |
| "readable-stream": "^3.4.0" | |
| } | |
| }, | |
| "node_modules/bl/node_modules/readable-stream": { | |
| "version": "3.6.0", | |
| "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", | |
| "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", | |
| "dependencies": { | |
| "inherits": "^2.0.3", | |
| "string_decoder": "^1.1.1", | |
| "util-deprecate": "^1.0.1" | |
| }, | |
| "engines": { | |
| "node": ">= 6" | |
| } | |
| }, | |
| "node_modules/brotli": { | |
| "version": "1.3.2", | |
| "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.2.tgz", | |
| "integrity": "sha1-UlqcrU/LqWR119OI9q7LE+7VL0Y=", | |
| "dependencies": { | |
| "base64-js": "^1.1.2" | |
| } | |
| }, | |
| "node_modules/buffer": { | |
| "version": "5.7.1", | |
| "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", | |
| "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", | |
| "funding": [ | |
| { | |
| "type": "github", | |
| "url": "https://github.com/sponsors/feross" | |
| }, | |
| { | |
| "type": "patreon", | |
| "url": "https://www.patreon.com/feross" | |
| }, | |
| { | |
| "type": "consulting", | |
| "url": "https://feross.org/support" | |
| } | |
| ], | |
| "dependencies": { | |
| "base64-js": "^1.3.1", | |
| "ieee754": "^1.1.13" | |
| } | |
| }, | |
| "node_modules/chownr": { | |
| "version": "2.0.0", | |
| "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", | |
| "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", | |
| "engines": { | |
| "node": ">=10" | |
| } | |
| }, | |
| "node_modules/code-point-at": { | |
| "version": "1.1.0", | |
| "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", | |
| "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", | |
| "engines": { | |
| "node": ">=0.10.0" | |
| } | |
| }, | |
| "node_modules/combined-stream": { | |
| "version": "1.0.8", | |
| "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", | |
| "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", | |
| "dev": true, | |
| "dependencies": { | |
| "delayed-stream": "~1.0.0" | |
| }, | |
| "engines": { | |
| "node": ">= 0.8" | |
| } | |
| }, | |
| "node_modules/console-control-strings": { | |
| "version": "1.1.0", | |
| "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", | |
| "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" | |
| }, | |
| "node_modules/core-util-is": { | |
| "version": "1.0.2", | |
| "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", | |
| "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" | |
| }, | |
| "node_modules/decompress-response": { | |
| "version": "4.2.1", | |
| "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", | |
| "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", | |
| "dependencies": { | |
| "mimic-response": "^2.0.0" | |
| }, | |
| "engines": { | |
| "node": ">=8" | |
| } | |
| }, | |
| "node_modules/deep-extend": { | |
| "version": "0.6.0", | |
| "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", | |
| "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", | |
| "engines": { | |
| "node": ">=4.0.0" | |
| } | |
| }, | |
| "node_modules/delayed-stream": { | |
| "version": "1.0.0", | |
| "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", | |
| "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", | |
| "dev": true, | |
| "engines": { | |
| "node": ">=0.4.0" | |
| } | |
| }, | |
| "node_modules/delegates": { | |
| "version": "1.0.0", | |
| "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", | |
| "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" | |
| }, | |
| "node_modules/denque": { | |
| "version": "1.5.0", | |
| "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", | |
| "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==", | |
| "engines": { | |
| "node": ">=0.10" | |
| } | |
| }, | |
| "node_modules/detect-libc": { | |
| "version": "1.0.3", | |
| "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", | |
| "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", | |
| "bin": { | |
| "detect-libc": "bin/detect-libc.js" | |
| }, | |
| "engines": { | |
| "node": ">=0.10" | |
| } | |
| }, | |
| "node_modules/end-of-stream": { | |
| "version": "1.4.4", | |
| "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", | |
| "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", | |
| "dependencies": { | |
| "once": "^1.4.0" | |
| } | |
| }, | |
| "node_modules/expand-template": { | |
| "version": "2.0.3", | |
| "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", | |
| "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", | |
| "engines": { | |
| "node": ">=6" | |
| } | |
| }, | |
| "node_modules/file-uri-to-path": { | |
| "version": "1.0.0", | |
| "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", | |
| "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" | |
| }, | |
| "node_modules/form-data": { | |
| "version": "3.0.1", | |
| "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", | |
| "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", | |
| "dev": true, | |
| "dependencies": { | |
| "asynckit": "^0.4.0", | |
| "combined-stream": "^1.0.8", | |
| "mime-types": "^2.1.12" | |
| }, | |
| "engines": { | |
| "node": ">= 6" | |
| } | |
| }, | |
| "node_modules/fs-constants": { | |
| "version": "1.0.0", | |
| "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", | |
| "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" | |
| }, | |
| "node_modules/fs-extra": { | |
| "version": "10.0.0", | |
| "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", | |
| "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", | |
| "dependencies": { | |
| "graceful-fs": "^4.2.0", | |
| "jsonfile": "^6.0.1", | |
| "universalify": "^2.0.0" | |
| }, | |
| "engines": { | |
| "node": ">=12" | |
| } | |
| }, | |
| "node_modules/fs-minipass": { | |
| "version": "2.1.0", | |
| "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", | |
| "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", | |
| "dependencies": { | |
| "minipass": "^3.0.0" | |
| }, | |
| "engines": { | |
| "node": ">= 8" | |
| } | |
| }, | |
| "node_modules/gauge": { | |
| "version": "2.7.4", | |
| "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", | |
| "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", | |
| "dependencies": { | |
| "aproba": "^1.0.3", | |
| "console-control-strings": "^1.0.0", | |
| "has-unicode": "^2.0.0", | |
| "object-assign": "^4.1.0", | |
| "signal-exit": "^3.0.0", | |
| "string-width": "^1.0.1", | |
| "strip-ansi": "^3.0.1", | |
| "wide-align": "^1.1.0" | |
| } | |
| }, | |
| "node_modules/generate-function": { | |
| "version": "2.3.1", | |
| "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", | |
| "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", | |
| "dependencies": { | |
| "is-property": "^1.0.2" | |
| } | |
| }, | |
| "node_modules/github-from-package": { | |
| "version": "0.0.0", | |
| "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", | |
| "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" | |
| }, | |
| "node_modules/graceful-fs": { | |
| "version": "4.2.6", | |
| "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", | |
| "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" | |
| }, | |
| "node_modules/has-unicode": { | |
| "version": "2.0.1", | |
| "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", | |
| "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" | |
| }, | |
| "node_modules/iconv-lite": { | |
| "version": "0.6.3", | |
| "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", | |
| "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", | |
| "dependencies": { | |
| "safer-buffer": ">= 2.1.2 < 3.0.0" | |
| }, | |
| "engines": { | |
| "node": ">=0.10.0" | |
| } | |
| }, | |
| "node_modules/ieee754": { | |
| "version": "1.2.1", | |
| "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", | |
| "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", | |
| "funding": [ | |
| { | |
| "type": "github", | |
| "url": "https://github.com/sponsors/feross" | |
| }, | |
| { | |
| "type": "patreon", | |
| "url": "https://www.patreon.com/feross" | |
| }, | |
| { | |
| "type": "consulting", | |
| "url": "https://feross.org/support" | |
| } | |
| ] | |
| }, | |
| "node_modules/inherits": { | |
| "version": "2.0.4", | |
| "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", | |
| "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" | |
| }, | |
| "node_modules/ini": { | |
| "version": "1.3.8", | |
| "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", | |
| "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" | |
| }, | |
| "node_modules/is-fullwidth-code-point": { | |
| "version": "1.0.0", | |
| "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", | |
| "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", | |
| "dependencies": { | |
| "number-is-nan": "^1.0.0" | |
| }, | |
| "engines": { | |
| "node": ">=0.10.0" | |
| } | |
| }, | |
| "node_modules/is-property": { | |
| "version": "1.0.2", | |
| "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", | |
| "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" | |
| }, | |
| "node_modules/isarray": { | |
| "version": "1.0.0", | |
| "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", | |
| "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" | |
| }, | |
| "node_modules/jsonfile": { | |
| "version": "6.1.0", | |
| "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", | |
| "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", | |
| "dependencies": { | |
| "universalify": "^2.0.0" | |
| }, | |
| "optionalDependencies": { | |
| "graceful-fs": "^4.1.6" | |
| } | |
| }, | |
| "node_modules/long": { | |
| "version": "4.0.0", | |
| "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", | |
| "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" | |
| }, | |
| "node_modules/lru-cache": { | |
| "version": "6.0.0", | |
| "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", | |
| "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", | |
| "dependencies": { | |
| "yallist": "^4.0.0" | |
| }, | |
| "engines": { | |
| "node": ">=10" | |
| } | |
| }, | |
| "node_modules/luxon": { | |
| "version": "1.27.0", | |
| "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.27.0.tgz", | |
| "integrity": "sha512-VKsFsPggTA0DvnxtJdiExAucKdAnwbCCNlMM5ENvHlxubqWd0xhZcdb4XgZ7QFNhaRhilXCFxHuoObP5BNA4PA==", | |
| "engines": { | |
| "node": "*" | |
| } | |
| }, | |
| "node_modules/mime-db": { | |
| "version": "1.48.0", | |
| "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", | |
| "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", | |
| "dev": true, | |
| "engines": { | |
| "node": ">= 0.6" | |
| } | |
| }, | |
| "node_modules/mime-types": { | |
| "version": "2.1.31", | |
| "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", | |
| "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", | |
| "dev": true, | |
| "dependencies": { | |
| "mime-db": "1.48.0" | |
| }, | |
| "engines": { | |
| "node": ">= 0.6" | |
| } | |
| }, | |
| "node_modules/mimic-response": { | |
| "version": "2.1.0", | |
| "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", | |
| "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", | |
| "engines": { | |
| "node": ">=8" | |
| }, | |
| "funding": { | |
| "url": "https://github.com/sponsors/sindresorhus" | |
| } | |
| }, | |
| "node_modules/minimist": { | |
| "version": "1.2.5", | |
| "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", | |
| "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" | |
| }, | |
| "node_modules/minipass": { | |
| "version": "3.1.3", | |
| "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", | |
| "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", | |
| "dependencies": { | |
| "yallist": "^4.0.0" | |
| }, | |
| "engines": { | |
| "node": ">=8" | |
| } | |
| }, | |
| "node_modules/minizlib": { | |
| "version": "2.1.2", | |
| "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", | |
| "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", | |
| "dependencies": { | |
| "minipass": "^3.0.0", | |
| "yallist": "^4.0.0" | |
| }, | |
| "engines": { | |
| "node": ">= 8" | |
| } | |
| }, | |
| "node_modules/mkdirp": { | |
| "version": "1.0.4", | |
| "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", | |
| "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", | |
| "bin": { | |
| "mkdirp": "bin/cmd.js" | |
| }, | |
| "engines": { | |
| "node": ">=10" | |
| } | |
| }, | |
| "node_modules/mkdirp-classic": { | |
| "version": "0.5.3", | |
| "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", | |
| "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" | |
| }, | |
| "node_modules/mysql2": { | |
| "version": "2.2.5", | |
| "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.2.5.tgz", | |
| "integrity": "sha512-XRqPNxcZTpmFdXbJqb+/CtYVLCx14x1RTeNMD4954L331APu75IC74GDqnZMEt1kwaXy6TySo55rF2F3YJS78g==", | |
| "dependencies": { | |
| "denque": "^1.4.1", | |
| "generate-function": "^2.3.1", | |
| "iconv-lite": "^0.6.2", | |
| "long": "^4.0.0", | |
| "lru-cache": "^6.0.0", | |
| "named-placeholders": "^1.1.2", | |
| "seq-queue": "^0.0.5", | |
| "sqlstring": "^2.3.2" | |
| }, | |
| "engines": { | |
| "node": ">= 8.0" | |
| } | |
| }, | |
| "node_modules/named-placeholders": { | |
| "version": "1.1.2", | |
| "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", | |
| "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", | |
| "dependencies": { | |
| "lru-cache": "^4.1.3" | |
| }, | |
| "engines": { | |
| "node": ">=6.0.0" | |
| } | |
| }, | |
| "node_modules/named-placeholders/node_modules/lru-cache": { | |
| "version": "4.1.5", | |
| "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", | |
| "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", | |
| "dependencies": { | |
| "pseudomap": "^1.0.2", | |
| "yallist": "^2.1.2" | |
| } | |
| }, | |
| "node_modules/named-placeholders/node_modules/yallist": { | |
| "version": "2.1.2", | |
| "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", | |
| "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" | |
| }, | |
| "node_modules/napi-build-utils": { | |
| "version": "1.0.2", | |
| "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", | |
| "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" | |
| }, | |
| "node_modules/node-abi": { | |
| "version": "2.30.0", | |
| "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.0.tgz", | |
| "integrity": "sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg==", | |
| "dependencies": { | |
| "semver": "^5.4.1" | |
| } | |
| }, | |
| "node_modules/node-fetch": { | |
| "version": "2.6.1", | |
| "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", | |
| "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", | |
| "engines": { | |
| "node": "4.x || >=6.0.0" | |
| } | |
| }, | |
| "node_modules/npmlog": { | |
| "version": "4.1.2", | |
| "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", | |
| "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", | |
| "dependencies": { | |
| "are-we-there-yet": "~1.1.2", | |
| "console-control-strings": "~1.1.0", | |
| "gauge": "~2.7.3", | |
| "set-blocking": "~2.0.0" | |
| } | |
| }, | |
| "node_modules/number-is-nan": { | |
| "version": "1.0.1", | |
| "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", | |
| "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", | |
| "engines": { | |
| "node": ">=0.10.0" | |
| } | |
| }, | |
| "node_modules/object-assign": { | |
| "version": "4.1.1", | |
| "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", | |
| "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", | |
| "engines": { | |
| "node": ">=0.10.0" | |
| } | |
| }, | |
| "node_modules/once": { | |
| "version": "1.4.0", | |
| "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", | |
| "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", | |
| "dependencies": { | |
| "wrappy": "1" | |
| } | |
| }, | |
| "node_modules/prebuild-install": { | |
| "version": "6.1.3", | |
| "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.3.tgz", | |
| "integrity": "sha512-iqqSR84tNYQUQHRXalSKdIaM8Ov1QxOVuBNWI7+BzZWv6Ih9k75wOnH1rGQ9WWTaaLkTpxWKIciOF0KyfM74+Q==", | |
| "dependencies": { | |
| "detect-libc": "^1.0.3", | |
| "expand-template": "^2.0.3", | |
| "github-from-package": "0.0.0", | |
| "minimist": "^1.2.3", | |
| "mkdirp-classic": "^0.5.3", | |
| "napi-build-utils": "^1.0.1", | |
| "node-abi": "^2.21.0", | |
| "npmlog": "^4.0.1", | |
| "pump": "^3.0.0", | |
| "rc": "^1.2.7", | |
| "simple-get": "^3.0.3", | |
| "tar-fs": "^2.0.0", | |
| "tunnel-agent": "^0.6.0" | |
| }, | |
| "bin": { | |
| "prebuild-install": "bin.js" | |
| }, | |
| "engines": { | |
| "node": ">=6" | |
| } | |
| }, | |
| "node_modules/process-nextick-args": { | |
| "version": "2.0.1", | |
| "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", | |
| "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" | |
| }, | |
| "node_modules/pseudomap": { | |
| "version": "1.0.2", | |
| "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", | |
| "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" | |
| }, | |
| "node_modules/pump": { | |
| "version": "3.0.0", | |
| "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", | |
| "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", | |
| "dependencies": { | |
| "end-of-stream": "^1.1.0", | |
| "once": "^1.3.1" | |
| } | |
| }, | |
| "node_modules/rc": { | |
| "version": "1.2.8", | |
| "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", | |
| "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", | |
| "dependencies": { | |
| "deep-extend": "^0.6.0", | |
| "ini": "~1.3.0", | |
| "minimist": "^1.2.0", | |
| "strip-json-comments": "~2.0.1" | |
| }, | |
| "bin": { | |
| "rc": "cli.js" | |
| } | |
| }, | |
| "node_modules/readable-stream": { | |
| "version": "2.3.7", | |
| "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", | |
| "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", | |
| "dependencies": { | |
| "core-util-is": "~1.0.0", | |
| "inherits": "~2.0.3", | |
| "isarray": "~1.0.0", | |
| "process-nextick-args": "~2.0.0", | |
| "safe-buffer": "~5.1.1", | |
| "string_decoder": "~1.1.1", | |
| "util-deprecate": "~1.0.1" | |
| } | |
| }, | |
| "node_modules/safe-buffer": { | |
| "version": "5.1.2", | |
| "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", | |
| "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" | |
| }, | |
| "node_modules/safer-buffer": { | |
| "version": "2.1.2", | |
| "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", | |
| "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" | |
| }, | |
| "node_modules/semver": { | |
| "version": "5.7.1", | |
| "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", | |
| "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", | |
| "bin": { | |
| "semver": "bin/semver" | |
| } | |
| }, | |
| "node_modules/seq-queue": { | |
| "version": "0.0.5", | |
| "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", | |
| "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" | |
| }, | |
| "node_modules/set-blocking": { | |
| "version": "2.0.0", | |
| "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", | |
| "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" | |
| }, | |
| "node_modules/signal-exit": { | |
| "version": "3.0.3", | |
| "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", | |
| "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" | |
| }, | |
| "node_modules/simple-concat": { | |
| "version": "1.0.1", | |
| "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", | |
| "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", | |
| "funding": [ | |
| { | |
| "type": "github", | |
| "url": "https://github.com/sponsors/feross" | |
| }, | |
| { | |
| "type": "patreon", | |
| "url": "https://www.patreon.com/feross" | |
| }, | |
| { | |
| "type": "consulting", | |
| "url": "https://feross.org/support" | |
| } | |
| ] | |
| }, | |
| "node_modules/simple-get": { | |
| "version": "3.1.0", | |
| "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", | |
| "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", | |
| "dependencies": { | |
| "decompress-response": "^4.2.0", | |
| "once": "^1.3.1", | |
| "simple-concat": "^1.0.0" | |
| } | |
| }, | |
| "node_modules/sqlstring": { | |
| "version": "2.3.2", | |
| "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", | |
| "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==", | |
| "engines": { | |
| "node": ">= 0.6" | |
| } | |
| }, | |
| "node_modules/string_decoder": { | |
| "version": "1.1.1", | |
| "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", | |
| "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", | |
| "dependencies": { | |
| "safe-buffer": "~5.1.0" | |
| } | |
| }, | |
| "node_modules/string-width": { | |
| "version": "1.0.2", | |
| "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", | |
| "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", | |
| "dependencies": { | |
| "code-point-at": "^1.0.0", | |
| "is-fullwidth-code-point": "^1.0.0", | |
| "strip-ansi": "^3.0.0" | |
| }, | |
| "engines": { | |
| "node": ">=0.10.0" | |
| } | |
| }, | |
| "node_modules/strip-ansi": { | |
| "version": "3.0.1", | |
| "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", | |
| "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", | |
| "dependencies": { | |
| "ansi-regex": "^2.0.0" | |
| }, | |
| "engines": { | |
| "node": ">=0.10.0" | |
| } | |
| }, | |
| "node_modules/strip-json-comments": { | |
| "version": "2.0.1", | |
| "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", | |
| "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", | |
| "engines": { | |
| "node": ">=0.10.0" | |
| } | |
| }, | |
| "node_modules/tar": { | |
| "version": "6.1.10", | |
| "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.10.tgz", | |
| "integrity": "sha512-kvvfiVvjGMxeUNB6MyYv5z7vhfFRwbwCXJAeL0/lnbrttBVqcMOnpHUf0X42LrPMR8mMpgapkJMchFH4FSHzNA==", | |
| "dependencies": { | |
| "chownr": "^2.0.0", | |
| "fs-minipass": "^2.0.0", | |
| "minipass": "^3.0.0", | |
| "minizlib": "^2.1.1", | |
| "mkdirp": "^1.0.3", | |
| "yallist": "^4.0.0" | |
| }, | |
| "engines": { | |
| "node": ">= 10" | |
| } | |
| }, | |
| "node_modules/tar-fs": { | |
| "version": "2.1.1", | |
| "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", | |
| "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", | |
| "dependencies": { | |
| "chownr": "^1.1.1", | |
| "mkdirp-classic": "^0.5.2", | |
| "pump": "^3.0.0", | |
| "tar-stream": "^2.1.4" | |
| } | |
| }, | |
| "node_modules/tar-fs/node_modules/chownr": { | |
| "version": "1.1.4", | |
| "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", | |
| "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" | |
| }, | |
| "node_modules/tar-stream": { | |
| "version": "2.2.0", | |
| "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", | |
| "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", | |
| "dependencies": { | |
| "bl": "^4.0.3", | |
| "end-of-stream": "^1.4.1", | |
| "fs-constants": "^1.0.0", | |
| "inherits": "^2.0.3", | |
| "readable-stream": "^3.1.1" | |
| }, | |
| "engines": { | |
| "node": ">=6" | |
| } | |
| }, | |
| "node_modules/tar-stream/node_modules/readable-stream": { | |
| "version": "3.6.0", | |
| "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", | |
| "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", | |
| "dependencies": { | |
| "inherits": "^2.0.3", | |
| "string_decoder": "^1.1.1", | |
| "util-deprecate": "^1.0.1" | |
| }, | |
| "engines": { | |
| "node": ">= 6" | |
| } | |
| }, | |
| "node_modules/tunnel-agent": { | |
| "version": "0.6.0", | |
| "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", | |
| "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", | |
| "dependencies": { | |
| "safe-buffer": "^5.0.1" | |
| }, | |
| "engines": { | |
| "node": "*" | |
| } | |
| }, | |
| "node_modules/typescript": { | |
| "version": "4.3.4", | |
| "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", | |
| "integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==", | |
| "dev": true, | |
| "bin": { | |
| "tsc": "bin/tsc", | |
| "tsserver": "bin/tsserver" | |
| }, | |
| "engines": { | |
| "node": ">=4.2.0" | |
| } | |
| }, | |
| "node_modules/universalify": { | |
| "version": "2.0.0", | |
| "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", | |
| "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", | |
| "engines": { | |
| "node": ">= 10.0.0" | |
| } | |
| }, | |
| "node_modules/util-deprecate": { | |
| "version": "1.0.2", | |
| "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", | |
| "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" | |
| }, | |
| "node_modules/wide-align": { | |
| "version": "1.1.3", | |
| "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", | |
| "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", | |
| "dependencies": { | |
| "string-width": "^1.0.2 || 2" | |
| } | |
| }, | |
| "node_modules/wrappy": { | |
| "version": "1.0.2", | |
| "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", | |
| "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" | |
| }, | |
| "node_modules/ws": { | |
| "version": "8.2.0", | |
| "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.0.tgz", | |
| "integrity": "sha512-uYhVJ/m9oXwEI04iIVmgLmugh2qrZihkywG9y5FfZV2ATeLIzHf93qs+tUNqlttbQK957/VX3mtwAS+UfIwA4g==", | |
| "engines": { | |
| "node": ">=10.0.0" | |
| }, | |
| "peerDependencies": { | |
| "bufferutil": "^4.0.1", | |
| "utf-8-validate": "^5.0.2" | |
| }, | |
| "peerDependenciesMeta": { | |
| "bufferutil": { | |
| "optional": true | |
| }, | |
| "utf-8-validate": { | |
| "optional": true | |
| } | |
| } | |
| }, | |
| "node_modules/yallist": { | |
| "version": "4.0.0", | |
| "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", | |
| "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" | |
| } | |
| }, | |
| "dependencies": { | |
| "@types/better-sqlite3": { | |
| "version": "5.4.1", | |
| "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-5.4.1.tgz", | |
| "integrity": "sha512-8hje3Rhsg/9veTkALfCwiWn7VMrP1QDwHhBSgerttYPABEvrHsMQnU9dlqoM6QX3x4uw3Y06dDVz8uDQo1J4Ng==", | |
| "dev": true, | |
| "requires": { | |
| "@types/integer": "*" | |
| } | |
| }, | |
| "@types/brotli": { | |
| "version": "1.3.0", | |
| "resolved": "https://registry.npmjs.org/@types/brotli/-/brotli-1.3.0.tgz", | |
| "integrity": "sha512-89tTxLlpcaOw+K2KVTGUfEXhTj1EwBDy2W2bNCt5pGG9x02SgLb9ayLTGVgpWMJAqr+EwCV0hVy2S94u6vQ16w==", | |
| "dev": true, | |
| "requires": { | |
| "@types/node": "*" | |
| } | |
| }, | |
| "@types/fs-extra": { | |
| "version": "9.0.11", | |
| "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.11.tgz", | |
| "integrity": "sha512-mZsifGG4QeQ7hlkhO56u7zt/ycBgGxSVsFI/6lGTU34VtwkiqrrSDgw0+ygs8kFGWcXnFQWMrzF2h7TtDFNixA==", | |
| "dev": true, | |
| "requires": { | |
| "@types/node": "*" | |
| } | |
| }, | |
| "@types/integer": { | |
| "version": "4.0.0", | |
| "resolved": "https://registry.npmjs.org/@types/integer/-/integer-4.0.0.tgz", | |
| "integrity": "sha512-2U1i6bIRiqizl6O+ETkp2HhUZIxg7g+burUabh9tzGd0qcszfNaFRaY9bGNlQKgEU7DCsH5qMajRDW5QamWQbw==", | |
| "dev": true | |
| }, | |
| "@types/luxon": { | |
| "version": "1.27.0", | |
| "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-1.27.0.tgz", | |
| "integrity": "sha512-rr2lNXsErnA/ARtgFn46NtQjUa66cuwZYeo/2K7oqqxhJErhXgHBPyNKCo+pfOC3L7HFwtao8ebViiU9h4iAxA==", | |
| "dev": true | |
| }, | |
| "@types/node": { | |
| "version": "15.12.3", | |
| "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.3.tgz", | |
| "integrity": "sha512-SNt65CPCXvGNDZ3bvk1TQ0Qxoe3y1RKH88+wZ2Uf05dduBCqqFQ76ADP9pbT+Cpvj60SkRppMCh2Zo8tDixqjQ==", | |
| "dev": true | |
| }, | |
| "@types/node-fetch": { | |
| "version": "2.5.10", | |
| "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.10.tgz", | |
| "integrity": "sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ==", | |
| "dev": true, | |
| "requires": { | |
| "@types/node": "*", | |
| "form-data": "^3.0.0" | |
| } | |
| }, | |
| "@types/ws": { | |
| "version": "7.4.7", | |
| "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", | |
| "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", | |
| "dev": true, | |
| "requires": { | |
| "@types/node": "*" | |
| } | |
| }, | |
| "ansi-regex": { | |
| "version": "2.1.1", | |
| "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", | |
| "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" | |
| }, | |
| "aproba": { | |
| "version": "1.2.0", | |
| "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", | |
| "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" | |
| }, | |
| "are-we-there-yet": { | |
| "version": "1.1.5", | |
| "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", | |
| "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", | |
| "requires": { | |
| "delegates": "^1.0.0", | |
| "readable-stream": "^2.0.6" | |
| } | |
| }, | |
| "asynckit": { | |
| "version": "0.4.0", | |
| "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", | |
| "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", | |
| "dev": true | |
| }, | |
| "base64-js": { | |
| "version": "1.5.1", | |
| "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", | |
| "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" | |
| }, | |
| "better-sqlite3": { | |
| "version": "7.4.1", | |
| "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.4.1.tgz", | |
| "integrity": "sha512-sk1kW3PsWE7W7G9qbi5TQxCROlQVR8YWlp4srbyrwN5DrLeamKfrm3JExwOiNSAYyJv8cw5/2HOfvF/ipZj4qg==", | |
| "requires": { | |
| "bindings": "^1.5.0", | |
| "prebuild-install": "^6.0.1", | |
| "tar": "^6.1.0" | |
| } | |
| }, | |
| "bindings": { | |
| "version": "1.5.0", | |
| "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", | |
| "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", | |
| "requires": { | |
| "file-uri-to-path": "1.0.0" | |
| } | |
| }, | |
| "bl": { | |
| "version": "4.1.0", | |
| "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", | |
| "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", | |
| "requires": { | |
| "buffer": "^5.5.0", | |
| "inherits": "^2.0.4", | |
| "readable-stream": "^3.4.0" | |
| }, | |
| "dependencies": { | |
| "readable-stream": { | |
| "version": "3.6.0", | |
| "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", | |
| "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", | |
| "requires": { | |
| "inherits": "^2.0.3", | |
| "string_decoder": "^1.1.1", | |
| "util-deprecate": "^1.0.1" | |
| } | |
| } | |
| } | |
| }, | |
| "brotli": { | |
| "version": "1.3.2", | |
| "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.2.tgz", | |
| "integrity": "sha1-UlqcrU/LqWR119OI9q7LE+7VL0Y=", | |
| "requires": { | |
| "base64-js": "^1.1.2" | |
| } | |
| }, | |
| "buffer": { | |
| "version": "5.7.1", | |
| "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", | |
| "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", | |
| "requires": { | |
| "base64-js": "^1.3.1", | |
| "ieee754": "^1.1.13" | |
| } | |
| }, | |
| "chownr": { | |
| "version": "2.0.0", | |
| "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", | |
| "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" | |
| }, | |
| "code-point-at": { | |
| "version": "1.1.0", | |
| "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", | |
| "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" | |
| }, | |
| "combined-stream": { | |
| "version": "1.0.8", | |
| "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", | |
| "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", | |
| "dev": true, | |
| "requires": { | |
| "delayed-stream": "~1.0.0" | |
| } | |
| }, | |
| "console-control-strings": { | |
| "version": "1.1.0", | |
| "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", | |
| "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" | |
| }, | |
| "core-util-is": { | |
| "version": "1.0.2", | |
| "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", | |
| "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" | |
| }, | |
| "decompress-response": { | |
| "version": "4.2.1", | |
| "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", | |
| "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", | |
| "requires": { | |
| "mimic-response": "^2.0.0" | |
| } | |
| }, | |
| "deep-extend": { | |
| "version": "0.6.0", | |
| "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", | |
| "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" | |
| }, | |
| "delayed-stream": { | |
| "version": "1.0.0", | |
| "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", | |
| "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", | |
| "dev": true | |
| }, | |
| "delegates": { | |
| "version": "1.0.0", | |
| "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", | |
| "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" | |
| }, | |
| "denque": { | |
| "version": "1.5.0", | |
| "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", | |
| "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" | |
| }, | |
| "detect-libc": { | |
| "version": "1.0.3", | |
| "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", | |
| "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" | |
| }, | |
| "end-of-stream": { | |
| "version": "1.4.4", | |
| "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", | |
| "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", | |
| "requires": { | |
| "once": "^1.4.0" | |
| } | |
| }, | |
| "expand-template": { | |
| "version": "2.0.3", | |
| "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", | |
| "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" | |
| }, | |
| "file-uri-to-path": { | |
| "version": "1.0.0", | |
| "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", | |
| "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" | |
| }, | |
| "form-data": { | |
| "version": "3.0.1", | |
| "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", | |
| "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", | |
| "dev": true, | |
| "requires": { | |
| "asynckit": "^0.4.0", | |
| "combined-stream": "^1.0.8", | |
| "mime-types": "^2.1.12" | |
| } | |
| }, | |
| "fs-constants": { | |
| "version": "1.0.0", | |
| "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", | |
| "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" | |
| }, | |
| "fs-extra": { | |
| "version": "10.0.0", | |
| "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", | |
| "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", | |
| "requires": { | |
| "graceful-fs": "^4.2.0", | |
| "jsonfile": "^6.0.1", | |
| "universalify": "^2.0.0" | |
| } | |
| }, | |
| "fs-minipass": { | |
| "version": "2.1.0", | |
| "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", | |
| "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", | |
| "requires": { | |
| "minipass": "^3.0.0" | |
| } | |
| }, | |
| "gauge": { | |
| "version": "2.7.4", | |
| "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", | |
| "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", | |
| "requires": { | |
| "aproba": "^1.0.3", | |
| "console-control-strings": "^1.0.0", | |
| "has-unicode": "^2.0.0", | |
| "object-assign": "^4.1.0", | |
| "signal-exit": "^3.0.0", | |
| "string-width": "^1.0.1", | |
| "strip-ansi": "^3.0.1", | |
| "wide-align": "^1.1.0" | |
| } | |
| }, | |
| "generate-function": { | |
| "version": "2.3.1", | |
| "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", | |
| "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", | |
| "requires": { | |
| "is-property": "^1.0.2" | |
| } | |
| }, | |
| "github-from-package": { | |
| "version": "0.0.0", | |
| "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", | |
| "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" | |
| }, | |
| "graceful-fs": { | |
| "version": "4.2.6", | |
| "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", | |
| "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" | |
| }, | |
| "has-unicode": { | |
| "version": "2.0.1", | |
| "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", | |
| "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" | |
| }, | |
| "iconv-lite": { | |
| "version": "0.6.3", | |
| "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", | |
| "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", | |
| "requires": { | |
| "safer-buffer": ">= 2.1.2 < 3.0.0" | |
| } | |
| }, | |
| "ieee754": { | |
| "version": "1.2.1", | |
| "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", | |
| "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" | |
| }, | |
| "inherits": { | |
| "version": "2.0.4", | |
| "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", | |
| "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" | |
| }, | |
| "ini": { | |
| "version": "1.3.8", | |
| "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", | |
| "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" | |
| }, | |
| "is-fullwidth-code-point": { | |
| "version": "1.0.0", | |
| "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", | |
| "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", | |
| "requires": { | |
| "number-is-nan": "^1.0.0" | |
| } | |
| }, | |
| "is-property": { | |
| "version": "1.0.2", | |
| "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", | |
| "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" | |
| }, | |
| "isarray": { | |
| "version": "1.0.0", | |
| "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", | |
| "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" | |
| }, | |
| "jsonfile": { | |
| "version": "6.1.0", | |
| "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", | |
| "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", | |
| "requires": { | |
| "graceful-fs": "^4.1.6", | |
| "universalify": "^2.0.0" | |
| } | |
| }, | |
| "long": { | |
| "version": "4.0.0", | |
| "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", | |
| "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" | |
| }, | |
| "lru-cache": { | |
| "version": "6.0.0", | |
| "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", | |
| "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", | |
| "requires": { | |
| "yallist": "^4.0.0" | |
| } | |
| }, | |
| "luxon": { | |
| "version": "1.27.0", | |
| "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.27.0.tgz", | |
| "integrity": "sha512-VKsFsPggTA0DvnxtJdiExAucKdAnwbCCNlMM5ENvHlxubqWd0xhZcdb4XgZ7QFNhaRhilXCFxHuoObP5BNA4PA==" | |
| }, | |
| "mime-db": { | |
| "version": "1.48.0", | |
| "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", | |
| "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", | |
| "dev": true | |
| }, | |
| "mime-types": { | |
| "version": "2.1.31", | |
| "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", | |
| "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", | |
| "dev": true, | |
| "requires": { | |
| "mime-db": "1.48.0" | |
| } | |
| }, | |
| "mimic-response": { | |
| "version": "2.1.0", | |
| "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", | |
| "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" | |
| }, | |
| "minimist": { | |
| "version": "1.2.5", | |
| "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", | |
| "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" | |
| }, | |
| "minipass": { | |
| "version": "3.1.3", | |
| "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", | |
| "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", | |
| "requires": { | |
| "yallist": "^4.0.0" | |
| } | |
| }, | |
| "minizlib": { | |
| "version": "2.1.2", | |
| "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", | |
| "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", | |
| "requires": { | |
| "minipass": "^3.0.0", | |
| "yallist": "^4.0.0" | |
| } | |
| }, | |
| "mkdirp": { | |
| "version": "1.0.4", | |
| "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", | |
| "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" | |
| }, | |
| "mkdirp-classic": { | |
| "version": "0.5.3", | |
| "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", | |
| "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" | |
| }, | |
| "mysql2": { | |
| "version": "2.2.5", | |
| "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.2.5.tgz", | |
| "integrity": "sha512-XRqPNxcZTpmFdXbJqb+/CtYVLCx14x1RTeNMD4954L331APu75IC74GDqnZMEt1kwaXy6TySo55rF2F3YJS78g==", | |
| "requires": { | |
| "denque": "^1.4.1", | |
| "generate-function": "^2.3.1", | |
| "iconv-lite": "^0.6.2", | |
| "long": "^4.0.0", | |
| "lru-cache": "^6.0.0", | |
| "named-placeholders": "^1.1.2", | |
| "seq-queue": "^0.0.5", | |
| "sqlstring": "^2.3.2" | |
| } | |
| }, | |
| "named-placeholders": { | |
| "version": "1.1.2", | |
| "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", | |
| "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", | |
| "requires": { | |
| "lru-cache": "^4.1.3" | |
| }, | |
| "dependencies": { | |
| "lru-cache": { | |
| "version": "4.1.5", | |
| "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", | |
| "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", | |
| "requires": { | |
| "pseudomap": "^1.0.2", | |
| "yallist": "^2.1.2" | |
| } | |
| }, | |
| "yallist": { | |
| "version": "2.1.2", | |
| "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", | |
| "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" | |
| } | |
| } | |
| }, | |
| "napi-build-utils": { | |
| "version": "1.0.2", | |
| "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", | |
| "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" | |
| }, | |
| "node-abi": { | |
| "version": "2.30.0", | |
| "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.0.tgz", | |
| "integrity": "sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg==", | |
| "requires": { | |
| "semver": "^5.4.1" | |
| } | |
| }, | |
| "node-fetch": { | |
| "version": "2.6.1", | |
| "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", | |
| "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" | |
| }, | |
| "npmlog": { | |
| "version": "4.1.2", | |
| "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", | |
| "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", | |
| "requires": { | |
| "are-we-there-yet": "~1.1.2", | |
| "console-control-strings": "~1.1.0", | |
| "gauge": "~2.7.3", | |
| "set-blocking": "~2.0.0" | |
| } | |
| }, | |
| "number-is-nan": { | |
| "version": "1.0.1", | |
| "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", | |
| "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" | |
| }, | |
| "object-assign": { | |
| "version": "4.1.1", | |
| "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", | |
| "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" | |
| }, | |
| "once": { | |
| "version": "1.4.0", | |
| "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", | |
| "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", | |
| "requires": { | |
| "wrappy": "1" | |
| } | |
| }, | |
| "prebuild-install": { | |
| "version": "6.1.3", | |
| "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.3.tgz", | |
| "integrity": "sha512-iqqSR84tNYQUQHRXalSKdIaM8Ov1QxOVuBNWI7+BzZWv6Ih9k75wOnH1rGQ9WWTaaLkTpxWKIciOF0KyfM74+Q==", | |
| "requires": { | |
| "detect-libc": "^1.0.3", | |
| "expand-template": "^2.0.3", | |
| "github-from-package": "0.0.0", | |
| "minimist": "^1.2.3", | |
| "mkdirp-classic": "^0.5.3", | |
| "napi-build-utils": "^1.0.1", | |
| "node-abi": "^2.21.0", | |
| "npmlog": "^4.0.1", | |
| "pump": "^3.0.0", | |
| "rc": "^1.2.7", | |
| "simple-get": "^3.0.3", | |
| "tar-fs": "^2.0.0", | |
| "tunnel-agent": "^0.6.0" | |
| } | |
| }, | |
| "process-nextick-args": { | |
| "version": "2.0.1", | |
| "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", | |
| "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" | |
| }, | |
| "pseudomap": { | |
| "version": "1.0.2", | |
| "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", | |
| "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" | |
| }, | |
| "pump": { | |
| "version": "3.0.0", | |
| "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", | |
| "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", | |
| "requires": { | |
| "end-of-stream": "^1.1.0", | |
| "once": "^1.3.1" | |
| } | |
| }, | |
| "rc": { | |
| "version": "1.2.8", | |
| "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", | |
| "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", | |
| "requires": { | |
| "deep-extend": "^0.6.0", | |
| "ini": "~1.3.0", | |
| "minimist": "^1.2.0", | |
| "strip-json-comments": "~2.0.1" | |
| } | |
| }, | |
| "readable-stream": { | |
| "version": "2.3.7", | |
| "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", | |
| "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", | |
| "requires": { | |
| "core-util-is": "~1.0.0", | |
| "inherits": "~2.0.3", | |
| "isarray": "~1.0.0", | |
| "process-nextick-args": "~2.0.0", | |
| "safe-buffer": "~5.1.1", | |
| "string_decoder": "~1.1.1", | |
| "util-deprecate": "~1.0.1" | |
| } | |
| }, | |
| "safe-buffer": { | |
| "version": "5.1.2", | |
| "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", | |
| "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" | |
| }, | |
| "safer-buffer": { | |
| "version": "2.1.2", | |
| "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", | |
| "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" | |
| }, | |
| "semver": { | |
| "version": "5.7.1", | |
| "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", | |
| "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" | |
| }, | |
| "seq-queue": { | |
| "version": "0.0.5", | |
| "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", | |
| "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" | |
| }, | |
| "set-blocking": { | |
| "version": "2.0.0", | |
| "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", | |
| "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" | |
| }, | |
| "signal-exit": { | |
| "version": "3.0.3", | |
| "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", | |
| "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" | |
| }, | |
| "simple-concat": { | |
| "version": "1.0.1", | |
| "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", | |
| "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" | |
| }, | |
| "simple-get": { | |
| "version": "3.1.0", | |
| "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", | |
| "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", | |
| "requires": { | |
| "decompress-response": "^4.2.0", | |
| "once": "^1.3.1", | |
| "simple-concat": "^1.0.0" | |
| } | |
| }, | |
| "sqlstring": { | |
| "version": "2.3.2", | |
| "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", | |
| "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==" | |
| }, | |
| "string_decoder": { | |
| "version": "1.1.1", | |
| "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", | |
| "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", | |
| "requires": { | |
| "safe-buffer": "~5.1.0" | |
| } | |
| }, | |
| "string-width": { | |
| "version": "1.0.2", | |
| "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", | |
| "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", | |
| "requires": { | |
| "code-point-at": "^1.0.0", | |
| "is-fullwidth-code-point": "^1.0.0", | |
| "strip-ansi": "^3.0.0" | |
| } | |
| }, | |
| "strip-ansi": { | |
| "version": "3.0.1", | |
| "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", | |
| "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", | |
| "requires": { | |
| "ansi-regex": "^2.0.0" | |
| } | |
| }, | |
| "strip-json-comments": { | |
| "version": "2.0.1", | |
| "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", | |
| "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" | |
| }, | |
| "tar": { | |
| "version": "6.1.10", | |
| "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.10.tgz", | |
| "integrity": "sha512-kvvfiVvjGMxeUNB6MyYv5z7vhfFRwbwCXJAeL0/lnbrttBVqcMOnpHUf0X42LrPMR8mMpgapkJMchFH4FSHzNA==", | |
| "requires": { | |
| "chownr": "^2.0.0", | |
| "fs-minipass": "^2.0.0", | |
| "minipass": "^3.0.0", | |
| "minizlib": "^2.1.1", | |
| "mkdirp": "^1.0.3", | |
| "yallist": "^4.0.0" | |
| } | |
| }, | |
| "tar-fs": { | |
| "version": "2.1.1", | |
| "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", | |
| "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", | |
| "requires": { | |
| "chownr": "^1.1.1", | |
| "mkdirp-classic": "^0.5.2", | |
| "pump": "^3.0.0", | |
| "tar-stream": "^2.1.4" | |
| }, | |
| "dependencies": { | |
| "chownr": { | |
| "version": "1.1.4", | |
| "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", | |
| "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" | |
| } | |
| } | |
| }, | |
| "tar-stream": { | |
| "version": "2.2.0", | |
| "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", | |
| "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", | |
| "requires": { | |
| "bl": "^4.0.3", | |
| "end-of-stream": "^1.4.1", | |
| "fs-constants": "^1.0.0", | |
| "inherits": "^2.0.3", | |
| "readable-stream": "^3.1.1" | |
| }, | |
| "dependencies": { | |
| "readable-stream": { | |
| "version": "3.6.0", | |
| "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", | |
| "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", | |
| "requires": { | |
| "inherits": "^2.0.3", | |
| "string_decoder": "^1.1.1", | |
| "util-deprecate": "^1.0.1" | |
| } | |
| } | |
| } | |
| }, | |
| "tunnel-agent": { | |
| "version": "0.6.0", | |
| "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", | |
| "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", | |
| "requires": { | |
| "safe-buffer": "^5.0.1" | |
| } | |
| }, | |
| "typescript": { | |
| "version": "4.3.4", | |
| "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", | |
| "integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==", | |
| "dev": true | |
| }, | |
| "universalify": { | |
| "version": "2.0.0", | |
| "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", | |
| "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" | |
| }, | |
| "util-deprecate": { | |
| "version": "1.0.2", | |
| "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", | |
| "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" | |
| }, | |
| "wide-align": { | |
| "version": "1.1.3", | |
| "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", | |
| "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", | |
| "requires": { | |
| "string-width": "^1.0.2 || 2" | |
| } | |
| }, | |
| "wrappy": { | |
| "version": "1.0.2", | |
| "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", | |
| "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" | |
| }, | |
| "ws": { | |
| "version": "8.2.0", | |
| "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.0.tgz", | |
| "integrity": "sha512-uYhVJ/m9oXwEI04iIVmgLmugh2qrZihkywG9y5FfZV2ATeLIzHf93qs+tUNqlttbQK957/VX3mtwAS+UfIwA4g==", | |
| "requires": {} | |
| }, | |
| "yallist": { | |
| "version": "4.0.0", | |
| "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", | |
| "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" | |
| } | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "name": "arc_probe", | |
| "version": "0.0.0", | |
| "description": "", | |
| "main": "main.js", | |
| "scripts": { | |
| "compile": "tsc -b", | |
| "watch": "tsc -b -w" | |
| }, | |
| "author": "", | |
| "license": "ISC", | |
| "dependencies": { | |
| "better-sqlite3": "^7.4.1", | |
| "brotli": "^1.3.2", | |
| "fs-extra": "^10.0.0", | |
| "luxon": "^1.27.0", | |
| "mysql2": "^2.2.5", | |
| "node-fetch": "^2.6.1", | |
| "ws": "^8.2.0" | |
| }, | |
| "devDependencies": { | |
| "@types/better-sqlite3": "^5.4.1", | |
| "@types/brotli": "^1.3.0", | |
| "@types/fs-extra": "^9.0.11", | |
| "@types/luxon": "^1.27.0", | |
| "@types/node": "^15.12.3", | |
| "@types/node-fetch": "^2.5.10", | |
| "@types/ws": "^7.4.7", | |
| "typescript": "^4.3.4" | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "compilerOptions": { | |
| "lib": [ | |
| "es2020" | |
| ], | |
| "module": "commonjs", | |
| "target": "es2020", | |
| "resolveJsonModule": true | |
| } | |
| } |
Author
Author
Can you provide the format of config.json?
Typescript will give you type hint
@AluoExpiry
Hi. I was planning on using the login functionality to get raw partner stats, but this doesn't provide any way to log in and get a session token. Could you please tell me what packet I would send to the Arcaea server to do so? If you'd rather answer privately instead of here directly then that's fine, just tell me where I can reach out to you.
Author
@Jono997 To avoid abuse I intentionally hide some important parts (like token generation and challenge calculation) from the source code. Sorry I can't tell you details on these parts, but it's always encouraged to do some reverse engineering on the original game binary.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This is the rewritten backend code of https://redive.estertion.win/arcaea/probe/ from 2021/06/20