UNPKG

xoh-xapi

Version:
663 lines (662 loc) 27.3 kB
"use strict"; 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 }); const ws_1 = __importDefault(require("ws")); const Streamer_1 = __importDefault(require("./Streamer")); const helpers_1 = require("./helpers"); class Xapi { /** * Main Object for API communication * @constructor */ constructor(args) { /** * Used to start session with the server * @param {Function} onReady - Function to run when everything is ready * @param {Function} onError - Function to run when errors happen during initialization with Error object carrying the message */ this.onReady = (onReady, onError) => { if (this.loginStatus) { onReady(); } else { this.webSocket.onopen = () => { this.login().then((data) => { //login success let response = JSON.parse(data); if (response.status === true) { onReady(); } else { onError(new Error(response.errorCode + ": " + response.errorDescr)); } }, (error) => { //error in login process onError(error); }); }; this.webSocket.onerror = (e) => { this.loginStatus = false; onError("Websocket error"); }; this.webSocket.onclose = (e) => { this.loginStatus = false; onError(new Error("Communication to the server was closed")); }; } }; /** * Used to initiate connection to the server separately other than using onReady */ this.init = () => { return (new Promise((resolved, rejected) => { if (this.loginStatus) { resolved(true); } else { this.webSocket.onopen = () => { this.login().then((data) => { //login success let response = JSON.parse(data); if (response.status === true) { resolved(true); } else { rejected(new Error(response.errorCode + ": " + response.errorDescr)); } }, (error) => { //error in login process rejected(error); }); }; this.webSocket.onerror = (e) => { this.loginStatus = false; rejected("Websocket Error"); }; this.webSocket.onclose = (e) => { this.loginStatus = false; rejected(new Error("Communication to the server was closed")); }; } })); }; /** * Used for login to the trading server */ this.login = () => { return (new Promise((resolved, rejected) => { let request = new helpers_1.Request(this.webSocket, { command: "login", arguments: { "userId": this.accountId, "password": this.password } }); request.send().then((data) => { //fulfilled let response = JSON.parse(data); if (response.status === true) { this.streamSessionId = response.streamSessionId; this.loginStatus = true; this.streamer = new Streamer_1.default({ streamSessionId: this.streamSessionId, host: this.hostStream, candlesTrigger: this.getChartLastRequest, candlesTrigger2: this.getChartRangeRequest, }); //ping after every 30 secs to keep connection alive this.pingTimerId = setInterval(() => __awaiter(this, void 0, void 0, function* () { yield this.ping(); //can be set to stream version of ping }), 10000); resolved(data); } else { rejected(new Error("Cannot Login to the server")); } }, (error) => { //failed rejected(error); }); })); }; /** * Logs out the user/client */ this.logOut = () => { return (new Promise((resolved, rejected) => { let request = new helpers_1.Request(this.webSocket, { command: "logout" }); request.send().then((data) => { //fulfilled //clear the ping timer if set if (!(this.pingTimerId === undefined)) { clearInterval(this.pingTimerId); } resolved(true); }, (error) => { //failed rejected(error); }); })); }; /** * Returns array of all symbols available for the user */ this.getAllSymbols = () => { return (new Promise((resolved, rejected) => { let request = new helpers_1.Request(this.webSocket, { command: "getAllSymbols" }); request.send().then((data) => { let response = JSON.parse(data); if (response.status === true) { resolved(response.returnData); } else { rejected(new Error(response.errorCode + ": " + response.errorDescr)); } }, (error) => { //failed rejected(error); }); })); }; /** * Returns calendar with market events */ this.getCalendar = () => { return (new Promise((resolved, rejected) => { let request = new helpers_1.Request(this.webSocket, { command: "getCalendar" }); request.send().then((data) => { let response = JSON.parse(data); if (response.status === true) { resolved(response.returnData); } else { rejected(new Error(response.errorCode + ": " + response.errorDescr)); } }, (error) => { //failed rejected(error); }); })); }; /** * Returns chart info, from start date to the current time. */ this.getChartLastRequest = (info) => { return (new Promise((resolved, rejected) => { let request = new helpers_1.Request(this.webSocket, { command: "getChartLastRequest", arguments: { info, } }); request.send().then((data) => { let response = JSON.parse(data); if (response.status === true) { resolved(response.returnData.rateInfos); //skipped digits from response.returnData.digits } else { rejected(new Error(response.errorCode + ": " + response.errorDescr)); } }, (error) => { //failed rejected(error); }); })); }; this.getChartRangeRequest = (info) => { return (new Promise((resolved, rejected) => { let request = new helpers_1.Request(this.webSocket, { command: "getChartRangeRequest", arguments: { info, } }); request.send().then((data) => { let response = JSON.parse(data); if (response.status === true) { resolved(response.returnData.rateInfos); //skipped digits from response.returnData.digits } else { rejected(new Error(response.errorCode + ": " + response.errorDescr)); } }, (error) => { //failed rejected(error); }); })); }; this.getCommissionDef = (args) => { return (new Promise((resolved, rejected) => { let request = new helpers_1.Request(this.webSocket, { command: "getCommissionDef", arguments: args, }); request.send().then((data) => { let response = JSON.parse(data); if (response.status === true) { resolved(response.returnData); } else { rejected(new Error(response.errorCode + ": " + response.errorDescr)); } }, (error) => { //failed rejected(error); }); })); }; this.getCurrentUserData = () => { return (new Promise((resolved, rejected) => { let request = new helpers_1.Request(this.webSocket, { command: "getCurrentUserData" }); request.send().then((data) => { let response = JSON.parse(data); if (response.status === true) { resolved(response.returnData); } else { rejected(new Error(response.errorCode + ": " + response.errorDescr)); } }, (error) => { //failed rejected(error); }); })); }; this.getIbsHistory = (args) => { return (new Promise((resolved, rejected) => { let request = new helpers_1.Request(this.webSocket, { command: "getIbsHistory", arguments: args, }); request.send().then((data) => { let response = JSON.parse(data); if (response.status === true) { resolved(response.returnData); } else { rejected(new Error(response.errorCode + ": " + response.errorDescr)); } }, (error) => { //failed rejected(error); }); })); }; this.getMarginLevel = () => { return (new Promise((resolved, rejected) => { let request = new helpers_1.Request(this.webSocket, { command: "getMarginLevel" }); request.send().then((data) => { let response = JSON.parse(data); if (response.status === true) { resolved(response.returnData); } else { rejected(new Error(response.errorCode + ": " + response.errorDescr)); } }, (error) => { //failed rejected(error); }); })); }; this.getMarginTrade = (args) => { return (new Promise((resolved, rejected) => { let request = new helpers_1.Request(this.webSocket, { command: "getMarginTrade", arguments: args, }); request.send().then((data) => { let response = JSON.parse(data); if (response.status === true) { resolved(response.returnData); } else { rejected(new Error(response.errorCode + ": " + response.errorDescr)); } }, (error) => { //failed rejected(error); }); })); }; this.getNews = (args) => { return (new Promise((resolved, rejected) => { args.end = (args.end === undefined) ? 0 : args.end; let request = new helpers_1.Request(this.webSocket, { command: "getNews", arguments: args, }); request.send().then((data) => { let response = JSON.parse(data); if (response.status === true) { resolved(response.returnData); } else { rejected(new Error(response.errorCode + ": " + response.errorDescr)); } }, (error) => { //failed rejected(error); }); })); }; this.getProfitCalculation = (args) => { return (new Promise((resolved, rejected) => { let request = new helpers_1.Request(this.webSocket, { command: "getProfitCalculation", arguments: args, }); request.send().then((data) => { let response = JSON.parse(data); if (response.status === true) { resolved(response.returnData); } else { rejected(new Error(response.errorCode + ": " + response.errorDescr)); } }, (error) => { //failed rejected(error); }); })); }; this.getServerTime = () => { return (new Promise((resolved, rejected) => { let request = new helpers_1.Request(this.webSocket, { command: "getServerTime" }); request.send().then((data) => { let response = JSON.parse(data); if (response.status === true) { resolved(response.returnData); } else { rejected(new Error(response.errorCode + ": " + response.errorDescr)); } }, (error) => { //failed rejected(error); }); })); }; this.getStepRules = () => { return (new Promise((resolved, rejected) => { let request = new helpers_1.Request(this.webSocket, { command: "getStepRules" }); request.send().then((data) => { let response = JSON.parse(data); if (response.status === true) { resolved(response.returnData); } else { rejected(new Error(response.errorCode + ": " + response.errorDescr)); } }, (error) => { //failed rejected(error); }); })); }; this.getSymbol = (args) => { return (new Promise((resolved, rejected) => { let request = new helpers_1.Request(this.webSocket, { command: "getSymbol", arguments: args, }); request.send().then((data) => { let response = JSON.parse(data); if (response.status === true) { resolved(response.returnData); } else { rejected(new Error(response.errorCode + ": " + response.errorDescr)); } }, (error) => { //failed rejected(error); }); })); }; this.getTickPrices = (args) => { return (new Promise((resolved, rejected) => { let request = new helpers_1.Request(this.webSocket, { command: "getTickPrices", arguments: args, }); request.send().then((data) => { let response = JSON.parse(data); if (response.status === true) { resolved(response.returnData.quotations); } else { rejected(new Error(response.errorCode + ": " + response.errorDescr)); } }, (error) => { //failed rejected(error); }); })); }; this.getTradeRecords = (args) => { return (new Promise((resolved, rejected) => { let request = new helpers_1.Request(this.webSocket, { command: "getTradeRecords", arguments: args, }); request.send().then((data) => { let response = JSON.parse(data); if (response.status === true) { resolved(response.returnData); } else { rejected(new Error(response.errorCode + ": " + response.errorDescr)); } }, (error) => { //failed rejected(error); }); })); }; this.getTrades = (args) => { return (new Promise((resolved, rejected) => { args.openedOnly = (args.openedOnly === undefined) ? false : args.openedOnly; let request = new helpers_1.Request(this.webSocket, { command: "getTrades", arguments: args, }); request.send().then((data) => { let response = JSON.parse(data); if (response.status === true) { resolved(response.returnData); } else { rejected(new Error(response.errorCode + ": " + response.errorDescr)); } }, (error) => { //failed rejected(error); }); })); }; this.getTradesHistory = (args) => { return (new Promise((resolved, rejected) => { args.end = (args.end === undefined) ? 0 : args.end; let request = new helpers_1.Request(this.webSocket, { command: "getTradesHistory", arguments: args, }); request.send().then((data) => { let response = JSON.parse(data); if (response.status === true) { resolved(response.returnData); } else { rejected(new Error(response.errorCode + ": " + response.errorDescr)); } }, (error) => { //failed rejected(error); }); })); }; this.getTradingHours = (args) => { return (new Promise((resolved, rejected) => { let request = new helpers_1.Request(this.webSocket, { command: "getTradingHours", arguments: args, }); request.send().then((data) => { let response = JSON.parse(data); if (response.status === true) { resolved(response.returnData); } else { rejected(new Error(response.errorCode + ": " + response.errorDescr)); } }, (error) => { //failed rejected(error); }); })); }; this.getVersion = () => { return (new Promise((resolved, rejected) => { let request = new helpers_1.Request(this.webSocket, { command: "getVersion" }); request.send().then((data) => { let response = JSON.parse(data); if (response.status === true) { resolved(response.returnData); } else { rejected(new Error(response.errorCode + ": " + response.errorDescr)); } }, (error) => { //failed rejected(error); }); })); }; this.ping = () => { return (new Promise((resolved, rejected) => { let request = new helpers_1.Request(this.webSocket, { command: "ping" }); request.send().then((data) => { let response = JSON.parse(data); if (response.status === true) { resolved(true); } else { rejected(new Error(response.errorCode + ": " + response.errorDescr)); } }, (error) => { //failed rejected(error); }); })); }; this.tradeTransaction = (info) => { return (new Promise((resolved, rejected) => { let request = new helpers_1.Request(this.webSocket, { command: "tradeTransaction", arguments: { tradeTransInfo: info, } }); request.send().then((data) => { let response = JSON.parse(data); if (response.status === true) { resolved(response.returnData); //orderId } else { rejected(new Error(response.errorCode + ": " + response.errorDescr)); } }, (error) => { //failed rejected(error); }); })); }; this.tradeTransactionStatus = (args) => { return (new Promise((resolved, rejected) => { let request = new helpers_1.Request(this.webSocket, { command: "tradeTransactionStatus", arguments: args, }); request.send().then((data) => { let response = JSON.parse(data); if (response.status === true) { resolved(response.returnData); } else { rejected(new Error(response.errorCode + ": " + response.errorDescr)); } }, (error) => { //failed rejected(error); }); })); }; let { password, accountId, type = 'demo', broker = 'xtb', } = args; this.password = password; this.accountId = accountId; this.type = (type === 'demo' || type === 'real') ? type : 'demo'; this.broker = (broker === 'xoh' || broker === 'xtb') ? broker : 'xtb'; this.loginStatus = false; //set host url if (this.broker === 'xoh') { if (this.type === 'demo') { this.host = "wss://ws.xapi.pro/demo"; this.hostStream = "wss://ws.xapi.pro/demoStream"; } else { this.host = "wss://ws.xapi.pro/real"; this.hostStream = "wss://ws.xapi.pro/realStream"; } } else { if (this.type === 'demo') { this.host = "wss://ws.xtb.com/demo"; this.hostStream = "wss://ws.xtb.com/demoStream"; } else { this.host = "wss://ws.xtb.com/real"; this.hostStream = "wss://ws.xtb.com/realStream"; } } //set websocket if (typeof process === 'object' && typeof process.versions === 'object' && typeof process.versions.node !== 'undefined') { this.webSocket = new ws_1.default(this.host); } else { this.webSocket = new WebSocket(this.host); } } } exports.default = Xapi;