UNPKG

efriend

Version:
190 lines (189 loc) 10.6 kB
"use strict"; /** * 한국투자증권 EFriendExpert API * * @file packages/EFriendExpert/efriends/efriend.ts * @version 0.0.1 * @license GNU General Public License v3.0 * @copyright 2017~2023, EFriendExport Community Team * @author gye hyun james kim <pnuskgh@gmail.com> */ 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.EFriendLimit = void 0; const moment_1 = __importDefault(require("moment")); //--- format : YYYYMMDDHHmmss.SSS ZZ - 20191220172919.083 +0900 const index_js_1 = require("../common/error/index.js"); const efriend_limit_constant_js_1 = require("./efriend.limit.constant.js"); const efriend_type_js_1 = require("./efriend.type.js"); class EFriendLimit { constructor() { this.limit = this.initialize([]); } getLimit() { return this.limit; } initialize(secrets) { const today = (0, moment_1.default)().format('YYYY-MM-DD'); const limit = { user: {}, account: {} }; for (const secret of secrets) { if (today <= secret.periodTo) { const limit_user = { accounts_actual: efriend_limit_constant_js_1.EFriend_LIMIT.user.accounts_actual, accounts_simulated: efriend_limit_constant_js_1.EFriend_LIMIT.user.accounts_simulated, ws_api: { session: efriend_limit_constant_js_1.EFriend_LIMIT.ws_api.session, } }; if (typeof (limit.user[secret.userid]) == 'undefined') { limit.user[secret.userid] = limit_user; } else { if (secret.isActual) { limit.user[secret.userid].accounts_actual = limit.user[secret.userid].accounts_actual - 1; if (limit.user[secret.userid].accounts_actual < 0) { throw new index_js_1.BaseError({ code: index_js_1.ERROR_CODE.NOTALLOWED, data: `${secret.userid} accounts_actual limit is over.` }); } } else { limit.user[secret.userid].accounts_simulated = limit.user[secret.userid].accounts_simulated - 1; if (limit.user[secret.userid].accounts_simulated < 0) { throw new index_js_1.BaseError({ code: index_js_1.ERROR_CODE.NOTALLOWED, data: `${secret.userid} accounts_simulated limit is over.` }); } } } const limit_account = { rest_api: { datetime: (0, moment_1.default)().format('YYYY-MM-DD HH:mm:ss'), api_per_second_actual: efriend_limit_constant_js_1.EFriend_LIMIT.rest_api.api_per_second_actual, api_per_second_simulated: efriend_limit_constant_js_1.EFriend_LIMIT.rest_api.api_per_second_simulated, api_tokenP_datetime: (0, moment_1.default)().subtract(10, 'minutes'), requests: [] }, ws_api: { notifications: [], registrations: [] } }; limit.account[secret.account] = limit_account; } } this.limit = limit; return limit; } increaseRestApi(secret, trid) { return __awaiter(this, void 0, void 0, function* () { try { let result = true; const limit = this.limit.account[secret.account]; const count = (secret.isActual) ? efriend_limit_constant_js_1.EFriend_LIMIT.rest_api.api_per_second_actual : efriend_limit_constant_js_1.EFriend_LIMIT.rest_api.api_per_second_simulated; limit.rest_api.requests.push((0, moment_1.default)().format('YYYY-MM-DD HH:mm:ss.SSS')); limit.rest_api.requests = limit.rest_api.requests.filter(req => (0, moment_1.default)().subtract(1, 'seconds').format('YYYY-MM-DD HH:mm:ss.SSS') < req); console.log(`REST API --- ${secret.userid}, ${secret.account} :: trid - ${trid}, isActual - ${secret.isActual}, count - ${count}, limit - ${limit.rest_api.requests.length}`); while (count < limit.rest_api.requests.length) { yield this.sleep(100); console.log(`REST sleep --- ${secret.userid}, ${secret.account} :: trid - ${trid}, isActual - ${secret.isActual}, count - ${count}, limit - ${limit.rest_api.requests.length}`); limit.rest_api.requests = limit.rest_api.requests.filter(req => (0, moment_1.default)().subtract(1, 'seconds').format('YYYY-MM-DD HH:mm:ss.SSS') < req); } return result; // // console.log(`--- increaseRestApi : trid - ${trid}, isActual - ${secret.isActual}`, limit.rest_api); // const now = moment().format('YYYY-MM-DD HH:mm:ss'); // if (limit.rest_api.datetime != now) { // limit.rest_api.datetime = now; // limit.rest_api.api_per_second_actual = EFriend_LIMIT.rest_api.api_per_second_actual; // limit.rest_api.api_per_second_simulated = EFriend_LIMIT.rest_api.api_per_second_simulated; // } // if (secret.isActual) { // limit.rest_api.api_per_second_actual = limit.rest_api.api_per_second_actual - 1; // if (limit.rest_api.api_per_second_actual < 0) { // // throw new BaseError({ code: ERROR_CODE.NOTALLOWED, data: `${secret.account} account limit is over.` }); // result = false; // } // } else { // limit.rest_api.api_per_second_simulated = limit.rest_api.api_per_second_simulated - 1; // if (limit.rest_api.api_per_second_simulated < 0) { // // throw new BaseError({ code: ERROR_CODE.NOTALLOWED, data: `${secret.account} account limit is over.` }); // result = false // } // } // const countLimit = (secret.isActual) ? limit.rest_api.api_per_second_actual:limit.rest_api.api_per_second_simulated; // console.log(`request ${secret.userid}, ${secret.account} :: trid - ${trid}, isActual - ${secret.isActual}`, countLimit, limit.rest_api.datetime); // this.limit.account[secret.account] = limit; // return result; } catch (ex) { throw ex; } }); } /** * 주어진 시간만큼 대기 한다. * * @param {number} miliseconds * @return {void} */ sleep(miliseconds) { return __awaiter(this, void 0, void 0, function* () { const promise = new Promise(function (resolve) { setTimeout(function () { resolve(0); }, miliseconds); }); yield promise; }); } updateSession(userid, count = 1) { let result = true; this.limit.user[userid].ws_api.session = this.limit.user[userid].ws_api.session - count; if (this.limit.user[userid].ws_api.session < 0) { result = false; } console.log(`limit user: ${userid}`, result, this.limit.user[userid]); return result; } updateWsApi(account, trid, tr_type, tr_key) { const item = { tr_id: trid, tr_key: tr_key }; if (['H0STCNI0', 'H0STCNI9', 'H0IFCNI0', 'H0GSCNI0', 'HDFFF2C0'].includes(trid)) { this.limit.account[account].ws_api.notifications = this.limit.account[account].ws_api.notifications.filter(api => (api.tr_id != item.tr_id) || (api.tr_key != item.tr_key)); if (tr_type == efriend_type_js_1.TR_TYPE.registration) { this.limit.account[account].ws_api.notifications.push(item); } return ((this.limit.account[account].ws_api.notifications.length < efriend_limit_constant_js_1.EFriend_LIMIT.ws_api.notifications)); } else { this.limit.account[account].ws_api.registrations = this.limit.account[account].ws_api.registrations.filter(api => (api.tr_id != item.tr_id) || (api.tr_key != item.tr_key)); if (tr_type == efriend_type_js_1.TR_TYPE.registration) { this.limit.account[account].ws_api.registrations.push(item); } return ((this.limit.account[account].ws_api.registrations.length) < efriend_limit_constant_js_1.EFriend_LIMIT.ws_api.registrations); } } setTokenP(secret) { this.limit.account[secret.account].rest_api.api_tokenP_datetime = (0, moment_1.default)(); } waitingTokenP(secret, isWaiting = false) { return __awaiter(this, void 0, void 0, function* () { const seconds = (0, moment_1.default)().diff(this.limit.account[secret.account].rest_api.api_tokenP_datetime, 'seconds'); if (isWaiting) { yield this.sleep(((efriend_limit_constant_js_1.EFriend_LIMIT.rest_api.api_tokenP_seconds + 5) - seconds) * 1000); } else { if (seconds < (efriend_limit_constant_js_1.EFriend_LIMIT.rest_api.api_tokenP_seconds + 5)) { throw new index_js_1.BaseError({ code: index_js_1.ERROR_CODE.WAITINGERROR, data: `tokenP: waiting - ${seconds}/${efriend_limit_constant_js_1.EFriend_LIMIT.rest_api.api_tokenP_seconds} seconds.` }); } } }); } } exports.EFriendLimit = EFriendLimit; exports.default = EFriendLimit;