UNPKG

upstox-js-sdk

Version:

The official Node Js client for communicating with the Upstox API

102 lines (100 loc) 3.61 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(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } 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;