kartrider.js
Version:
KartRider Nexon API Node.js library
139 lines (138 loc) • 6.17 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.MetaData = void 0;
const got_1 = __importDefault(require("got"));
const unzipper_1 = require("unzipper");
const Parser_1 = require("stream-json/Parser");
const StreamArray_1 = require("stream-json/streamers/StreamArray");
const fs_1 = require("fs");
const path = __importStar(require("path"));
const URL = "https://static.api.nexon.co.kr/kart/latest/metadata.zip";
class MetaData {
constructor() {
this.data = {};
}
static init(folderPath) {
return __awaiter(this, void 0, void 0, function* () {
const kartMetaData = new MetaData();
if (folderPath) {
kartMetaData.path = folderPath;
const jsonFiles = fs_1.readdirSync(folderPath)
.filter(file => file.endsWith('.json'))
.map(file => ({ type: file.split('.')[0], path: path.join(folderPath, file) }))
.map(fileMetaData => kartMetaData.appendJSONfile(fileMetaData));
if (jsonFiles.length <= 0) {
console.warn('[KartMetaData] json files not found. Fetching MetaData..');
yield kartMetaData.fetch();
console.log('[KartMetaData] save json from Fetch MetaData..');
yield kartMetaData.saveFile();
}
else
yield Promise.all(jsonFiles);
}
else {
console.warn('[KartMetaData] folderPath not given. Fetching MetaData..');
yield kartMetaData.fetch();
}
return kartMetaData;
});
}
static getRecentDataInfo() {
return got_1.default.head(URL).then(res => {
const sha256 = res.headers["x-amz-meta-sha256"];
const modifiedDateFromS3 = res.headers["x-amz-meta-s3b-last-modified"];
const modifiedDate = res.headers["last-modified"];
const etag = res.headers["etag"];
return { sha256, etag, modifiedDate, modifiedDateFromS3 };
});
}
getMetaData(id) {
if (!this.isExist(id))
return { id: id.hash };
const name = this.data[id.type].get(id.hash);
return { id: id.hash, name };
}
isExist(id) {
return Boolean(this.data[id.type] && this.data[id.type].has(id.hash));
}
fetch() {
return got_1.default.stream(URL).pipe(unzipper_1.Parse())
.on('entry', (entry) => __awaiter(this, void 0, void 0, function* () {
if (!entry.path.endsWith('.json')) {
entry.autodrain();
return;
}
const type = entry.path.split('.')[0];
const streamMetadata = { type, stream: entry };
yield this.appendJSONStream(streamMetadata);
})).promise();
}
appendJSONfile(file) {
return __awaiter(this, void 0, void 0, function* () {
const stream = fs_1.createReadStream(file.path);
return _makeMapFromJSONFileStream(stream)
.then(map => this._updateDataMap(file.type, map));
});
}
appendJSONStream(stream) {
return __awaiter(this, void 0, void 0, function* () {
return _makeMapFromJSONFileStream(stream.stream)
.then(map => this._updateDataMap(stream.type, map));
});
}
saveFile() {
if (!this.path)
new Error(`KartMetadata Folder is undefined`);
const names = Object.keys(this.data);
const promiseQueue = names.map(name => new Promise((resolve, reject) => {
const map = this.data[name];
const array = [];
for (let [key, value] of map)
array.push({ id: key, name: value });
fs_1.writeFile(path.join(this.path, `${name}.json`), JSON.stringify(array), (err) => err ? reject(err) : resolve());
}));
return Promise.all(promiseQueue);
}
_updateDataMap(type, map) {
const dataMap = this.data[type];
this.data[type] = dataMap ? new Map([...dataMap, ...map]) : map;
}
}
exports.MetaData = MetaData;
function _makeMapFromJSONFileStream(stream) {
const map = new Map();
return new Promise((resolve, _reject) => stream.pipe(Parser_1.parser()).pipe(StreamArray_1.streamArray())
.on('data', ({ value: jsonData }) => map.set(jsonData.id, jsonData.name))
.on('end', () => resolve(map)));
}