UNPKG

@thoshpathi/utils-smartapi

Version:

Extended utilities for Angel One's smartapi-javascript SDK, including custom methods and helpers for market data like candles, P&L, and more.

273 lines (267 loc) 8.85 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/smartapi/index.ts var smartapi_exports = {}; __export(smartapi_exports, { default: () => getLoggedSmartapi, getLoggedSmartapi: () => getLoggedSmartapi, getLoggedWebsocket: () => getLoggedWebsocket, getSmartapi: () => getSmartapi }); module.exports = __toCommonJS(smartapi_exports); var import_smartapi_javascript2 = require("@thoshpathi/smartapi-javascript"); var import_utils_core = require("@thoshpathi/utils-core"); // src/smartapi/smartapi_enhanced.ts var import_smartapi_javascript = require("@thoshpathi/smartapi-javascript"); // src/smartapi/ohlc_data.ts var OHLCData = class { constructor(date, open, high, low, close) { const parsedDate = new Date(date); if (isNaN(parsedDate.getTime())) { throw new Error("Invalid date"); } if ([open, high, low, close].some((value) => isNaN(value))) { throw new Error("Open, High, Low, and Close must be valid numbers"); } if (low > high) { throw new Error("Low cannot be greater than High"); } this.date = parsedDate; this.open = open; this.high = high; this.low = low; this.close = close; } }; // src/smartapi/smartapi_enhanced.ts var import_date_fns = require("date-fns"); var SmartApiError = class extends Error { constructor(message, errorCode) { super(message); this.errorCode = errorCode; } }; var SmartApiEnhanced = class extends import_smartapi_javascript.SmartAPI { constructor(params, apiRetryDelayMs, logger2) { super(params); this.apiRetryDelayMs = apiRetryDelayMs; this.logger = logger2; this.apiRetryDelayMs = apiRetryDelayMs; this.logger = logger2; } getData(response) { if (response.status && response.errorcode === "") return response.data; this.logger?.e("smart api error response", response); throw new SmartApiError(response.message, response.errorcode); } async retryCallback(callback) { let response = await callback(); if ("status" in response && response.status === 500) { this.logger?.w("smart api 500 error. retry once"); await new Promise((resolve) => setTimeout(resolve, this.apiRetryDelayMs)); response = await callback(); } return this.getData(response); } async generateSession_e(clientCode, clientMpin, totp) { const response = await this.generateSession( clientCode, clientMpin, totp ); return this.getData(response); } async logout_e(clientCode) { const response = await this.logout(clientCode); return this.getData(response); } fetchProfile() { return this.retryCallback(() => this.getProfile()); } fetchRMS() { return this.retryCallback(() => this.getRMS()); } fetchOrderBook() { return this.retryCallback(() => this.getOrderBook()); } async fetchMarketData(params) { const { mode = "LTP", exchangeTokens } = params; for (const prop in exchangeTokens) { exchangeTokens[prop] = [...new Set(exchangeTokens[prop])]; } const responseData = await this.retryCallback( () => this.marketData({ mode, exchangeTokens }) ); return responseData.fetched; } fetchTokensLtp(exchangeTokens) { return this.fetchMarketData({ mode: "LTP", exchangeTokens }); } fetchTokensOhlc(exchangeTokens) { return this.fetchMarketData({ mode: "OHLC", exchangeTokens }); } fetchTokensQuote(exchangeTokens) { return this.fetchMarketData({ mode: "FULL", exchangeTokens }); } placeOrder_e(params) { return this.retryCallback(() => this.placeOrder(params)); } fetchCandlesDatetimeString(date) { return (0, import_date_fns.format)(date, "yyyy-MM-dd HH:mm"); } async fetchCandleData(params) { const { symboltoken, fromdate, todate, exchange = "NSE", interval = "FIFTEEN_MINUTE" } = params; const responseData = await this.retryCallback( () => this.getCandleData({ symboltoken, fromdate: this.fetchCandlesDatetimeString(fromdate), todate: this.fetchCandlesDatetimeString(todate), exchange, interval }) ); return responseData.map((data) => { const date = new Date(data[0]), open = data[1], high = data[2], low = data[3], close = data[4]; return new OHLCData(date, +open, +high, +low, +close); }); } async fetchCompletedOrders(orderResponses) { const ordersBook = await this.fetchOrderBook(); if (ordersBook == null || ordersBook.length <= 0) { this.logger?.c("failed to get orders book"); return null; } const orderIds = orderResponses.map((v) => v.orderid); const filteredOrders = ordersBook.filter( (v) => orderIds.includes(v.orderid) ); if (filteredOrders == null || filteredOrders.length <= 0) { this.logger?.w("specific orders not exist in order book", orderIds); return null; } const completedOrders = filteredOrders.filter( (v) => v.status === "complete" ); if (completedOrders.length <= 0) { this.logger?.c("all orders are not completed", orderIds); return null; } return completedOrders; } async fetchOptionGreeks(params) { const response = await this.optionGreek(params); return this.getData(response); } async fetchGainersLosers(params) { const response = await this.gainersLosers(params); return this.getData(response); } async fetchPutCallRatio() { const response = await this.putCallRatio(); return this.getData(response); } async fetchOIBuildup(params) { const response = await this.oIBuildup(params); return this.getData(response); } }; // src/smartapi/index.ts var defaultConfigs = { apiRetryDelayMs: 1e3, apiTimeoutMs: 4e3 }; function isValidString(s) { return typeof s === "string" && s.trim().length > 0; } function validateBrokerData(brokerData) { if (brokerData == null) { import_utils_core.logger.c("get logged smartapi failed. broker data empty"); return; } const { clientId, apiKey } = brokerData; if (!isValidString(clientId) || !isValidString(apiKey)) { import_utils_core.logger.c("get logged smartapi failed. clientId or apiKey empty"); return; } return brokerData; } function validateBrokerTokenData(brokerTokenData) { if (validateBrokerData(brokerTokenData) == null) return; const { jwtToken, refreshToken, feedToken } = brokerTokenData; if (!isValidString(jwtToken) || !isValidString(refreshToken) || !isValidString(feedToken)) { import_utils_core.logger.c( "get logged smartapi failed. jwtToken or refreshToken or feedToken empty" ); return; } return brokerTokenData; } async function getLoggedSmartapi(params) { const { brokerData, configs: { apiRetryDelayMs, apiTimeoutMs } = defaultConfigs } = params; if (validateBrokerTokenData(brokerData) == null) return; const { apiKey, clientId, jwtToken, refreshToken } = brokerData; const configs = { api_key: apiKey, client_code: clientId, access_token: jwtToken, timeout: apiTimeoutMs, refresh_token: refreshToken }; return new SmartApiEnhanced(configs, apiRetryDelayMs, import_utils_core.logger); } function getSmartapi(params) { const { brokerData, configs: { apiRetryDelayMs, apiTimeoutMs } = defaultConfigs } = params; if (validateBrokerData(brokerData) == null) return; const { apiKey, clientId } = brokerData; const configs = { api_key: apiKey, client_code: clientId, timeout: apiTimeoutMs }; return new SmartApiEnhanced(configs, apiRetryDelayMs, import_utils_core.logger); } async function getLoggedWebsocket(brokerData) { if (validateBrokerTokenData(brokerData) == null) return; const { apiKey, clientId, jwtToken, feedToken } = brokerData; const webSocket = new import_smartapi_javascript2.WebSocketV2({ apikey: apiKey, clientcode: clientId, jwttoken: jwtToken, feedtype: feedToken }); return webSocket; } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { getLoggedSmartapi, getLoggedWebsocket, getSmartapi });