UNPKG

upstox-js-sdk

Version:

The official Node Js client for communicating with the Upstox API

102 lines (100 loc) 3.47 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PortfolioDataFeeder = void 0; var _ws = _interopRequireDefault(require("ws")); var _ApiClient = require("../ApiClient"); var _Feeder = _interopRequireDefault(require("./Feeder")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } class PortfolioDataFeeder extends _Feeder.default { constructor() { super(); _defineProperty(this, "ws", null); _defineProperty(this, "userClosedWebSocket", false); _defineProperty(this, "closingCode", -1); this.apiClient = _ApiClient.ApiClient.instance; } async connect(orderUpdate = true, positionUpdate = false, holdingUpdate = false, gttUpdate = false) { // Skip if its already connected if (this.ws && (this.ws.readyState == ws.CONNECTING || ws.readyState == ws.OPEN)) return; let wsUrl = this.getWebSocketUrl(orderUpdate, positionUpdate, holdingUpdate, gttUpdate); this.ws = await this.connectWebSocket(wsUrl, this.apiClient.authentications["OAUTH2"].accessToken); this.onOpen(); this.onMessage(); this.onClose(); this.onError(); } shouldReconnect() { return this.ws === null || !this.userClosedWebSocket && this.ws.readyState !== _ws.default.OPEN; } onOpen() { this.ws.on("open", () => { this.emit("open"); }); } onMessage() { this.ws.on("message", data => { this.push(data); }); } onClose() { this.ws.on("close", code => { this.push(null); this.closingCode = code; if (code === 1000) { this.userClosedWebSocket = true; } }); } onError() { this.ws.on("error", e => { this.emit("error", e); }); } disconnect() { this.ws.close(1000); } // Function to establish WebSocket connection async connectWebSocket(wsUrl, accessToken) { return new Promise(resolve => { const ws = new _ws.default(wsUrl, { headers: { Authorization: `Bearer ${accessToken}` }, followRedirects: true }); resolve(ws); }); } getWebSocketUrl(orderUpdate, positionUpdate, holdingUpdate, gttUpdate) { let wsUrl = "wss://api.upstox.com/v2/feed/portfolio-stream-feed"; let updateTypes = []; if (orderUpdate) { updateTypes.push("order"); } if (holdingUpdate) { updateTypes.push("holding"); } if (positionUpdate) { updateTypes.push("position"); } if (gttUpdate) { updateTypes.push("gtt_order"); } if (updateTypes.length >= 1) { wsUrl += "?update_types="; } for (let i = 0; i < updateTypes.length - 1; i++) { wsUrl += updateTypes[i] + "%2C"; } if (updateTypes.length >= 1) { wsUrl += updateTypes[updateTypes.length - 1]; } return wsUrl; } } exports.PortfolioDataFeeder = PortfolioDataFeeder;