efriend
Version:
EFriend Node Library
190 lines (189 loc) • 10.6 kB
JavaScript
;
/**
* 한국투자증권 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;