@danielgroen/dxtrade-api 1.0.21 → 1.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/constants/brokers.ts","../src/constants/endpoints.ts","../src/constants/enums.ts","../src/constants/errors.ts","../src/domains/account/account.ts","../src/utils/cookies.ts","../src/utils/headers.ts","../src/utils/retry.ts","../src/utils/websocket.ts","../src/domains/assessments/assessments.ts","../src/domains/instrument/instrument.ts","../src/domains/ohlc/ohlc.ts","../src/domains/order/order.ts","../src/domains/symbol/symbol.ts","../src/domains/position/position.ts","../src/domains/session/session.ts","../src/client.ts"],"sourcesContent":["export * from \"./constants\";\nexport type { DxtradeConfig, DxtradeCallbacks } from \"./client.types\";\nexport type { WsPayload } from \"./utils/websocket.types\";\nexport { DxtradeClient } from \"./client\";\n","export const BROKER = {\n LARKFUNDING: \"https://trade.gooeytrade.com\",\n EIGHTCAP: \"https://trader.dx-eightcap.com\",\n FTMO: \"https://dxtrade.ftmo.com\",\n} as const;\n","function websocketQuery(atmosphereId?: string | null): string {\n const trackingId = atmosphereId ?? \"0\";\n return (\n `?X-Atmosphere-tracking-id=${trackingId}&X-Atmosphere-Framework=2.3.2-javascript` +\n `&X-Atmosphere-Transport=websocket&X-Atmosphere-TrackMessageSize=true` +\n `&Content-Type=text/x-gwt-rpc;%20charset=UTF-8&X-atmo-protocol=true` +\n `&sessionState=dx-new&guest-mode=false`\n );\n}\n\nexport const endpoints = {\n login: (base: string) => `${base}/api/auth/login`,\n\n switchAccount: (base: string, id: string) => `${base}/api/accounts/switch?accountId=${id}`,\n\n suggest: (base: string, text: string) => `${base}/api/suggest?text=${text}`,\n\n instrumentInfo: (base: string, symbol: string, tzOffset: number) =>\n `${base}/api/instruments/info?symbol=${symbol}&timezoneOffset=${tzOffset}&withExDividends=true`,\n\n submitOrder: (base: string) => `${base}/api/orders/single`,\n\n closePosition: (base: string) => `${base}/api/positions/close`,\n\n assessments: (base: string) => `${base}/api/assessments`,\n\n websocket: (base: string, atmosphereId?: string | null) =>\n `wss://${base.split(\"//\")[1]}/client/connector` + websocketQuery(atmosphereId),\n\n tradeJournal: (base: string, params: { from: number; to: number }) =>\n `${base}/api/tradejournal?from=${params.from}&to=${params.to}`,\n\n subscribeInstruments: (base: string) => `${base}/api/instruments/subscribeInstrumentSymbols`,\n\n charts: (base: string) => `${base}/api/charts`,\n};\n","export enum ORDER_TYPE {\n MARKET = \"MARKET\",\n LIMIT = \"LIMIT\",\n STOP = \"STOP\",\n}\n\nexport enum SIDE {\n BUY = \"BUY\",\n SELL = \"SELL\",\n}\n\nexport enum ACTION {\n OPENING = \"OPENING\",\n CLOSING = \"CLOSING\",\n}\n\nexport enum TIF {\n GTC = \"GTC\",\n DAY = \"DAY\",\n GTD = \"GTD\",\n}\n\nexport enum ERROR {\n NO_SESSION = \"NO_SESSION\",\n\n // Session\n LOGIN_FAILED = \"LOGIN_FAILED\",\n LOGIN_ERROR = \"LOGIN_ERROR\",\n CSRF_NOT_FOUND = \"CSRF_NOT_FOUND\",\n CSRF_ERROR = \"CSRF_ERROR\",\n ACCOUNT_SWITCH_ERROR = \"ACCOUNT_SWITCH_ERROR\",\n\n // Market data\n NO_SUGGESTIONS = \"NO_SUGGESTIONS\",\n SUGGEST_ERROR = \"SUGGEST_ERROR\",\n NO_SYMBOL_INFO = \"NO_SYMBOL_INFO\",\n SYMBOL_INFO_ERROR = \"SYMBOL_INFO_ERROR\",\n INSTRUMENTS_TIMEOUT = \"INSTRUMENTS_TIMEOUT\",\n INSTRUMENTS_ERROR = \"INSTRUMENTS_ERROR\",\n LIMITS_TIMEOUT = \"LIMITS_TIMEOUT\",\n LIMITS_ERROR = \"LIMITS_ERROR\",\n OHLC_TIMEOUT = \"OHLC_TIMEOUT\",\n OHLC_ERROR = \"OHLC_ERROR\",\n\n // Trading\n ORDER_ERROR = \"ORDER_ERROR\",\n POSITION_CLOSE_ERROR = \"POSITION_CLOSE_ERROR\",\n\n // Account\n ACCOUNT_METRICS_TIMEOUT = \"ACCOUNT_METRICS_TIMEOUT\",\n ACCOUNT_METRICS_ERROR = \"ACCOUNT_METRICS_ERROR\",\n ACCOUNT_POSITIONS_TIMEOUT = \"ACCOUNT_POSITIONS_TIMEOUT\",\n ACCOUNT_POSITIONS_ERROR = \"ACCOUNT_POSITIONS_ERROR\",\n TRADE_JOURNAL_ERROR = \"TRADE_JOURNAL_ERROR\",\n\n // Analytics\n ASSESSMENTS_ERROR = \"ASSESSMENTS_ERROR\",\n}\n\nexport enum WS_MESSAGE {\n ACCOUNT_METRICS = \"ACCOUNT_METRICS\",\n ACCOUNTS = \"ACCOUNTS\",\n AVAILABLE_WATCHLISTS = \"AVAILABLE_WATCHLISTS\",\n CHART_FEED_SUBTOPIC = \"chartFeedSubtopic\",\n INSTRUMENTS = \"INSTRUMENTS\",\n INSTRUMENT_METRICS = \"INSTRUMENT_METRICS\",\n LIMITS = \"LIMITS\",\n MESSAGE = \"MESSAGE\",\n ORDERS = \"ORDERS\",\n POSITIONS = \"POSITIONS\",\n POSITION_CASH_TRANSFERS = \"POSITION_CASH_TRANSFERS\",\n PRIVATE_LAYOUT_NAMES = \"PRIVATE_LAYOUT_NAMES\",\n SHARED_PROPERTIES_MESSAGE = \"SHARED_PROPERTIES_MESSAGE\",\n TRADE_STATUSES = \"TRADE_STATUSES\",\n USER_LOGIN_INFO = \"USER_LOGIN_INFO\",\n}\n\nexport namespace WS_MESSAGE {\n export enum SUBTOPIC {\n BIG_CHART_COMPONENT = \"BigChartComponentPresenter-4\",\n }\n}\n","export class DxtradeError extends Error {\n public code: string;\n\n constructor(code: string, message: string) {\n super(message);\n this.name = \"DxtradeError\";\n this.code = code;\n }\n}\n","import WebSocket from \"ws\";\nimport { WS_MESSAGE, ERROR, endpoints, DxtradeError } from \"@/constants\";\nimport { Cookies, parseWsData, shouldLog, debugLog, retryRequest, baseHeaders } from \"@/utils\";\nimport type { ClientContext } from \"@/client.types\";\nimport type { Account } from \".\";\n\nexport async function getAccountMetrics(ctx: ClientContext, timeout = 30_000): Promise<Account.Metrics> {\n ctx.ensureSession();\n\n const wsUrl = endpoints.websocket(ctx.broker, ctx.atmosphereId);\n const cookieStr = Cookies.serialize(ctx.cookies);\n\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(wsUrl, { headers: { Cookie: cookieStr } });\n\n const timer = setTimeout(() => {\n ws.close();\n reject(new DxtradeError(ERROR.ACCOUNT_METRICS_TIMEOUT, \"Account metrics timed out\"));\n }, timeout);\n\n ws.on(\"message\", (data) => {\n const msg = parseWsData(data);\n if (shouldLog(msg, ctx.debug)) debugLog(msg);\n\n if (typeof msg === \"string\") return;\n if (msg.type === WS_MESSAGE.ACCOUNT_METRICS) {\n clearTimeout(timer);\n ws.close();\n const body = msg.body as { allMetrics: Account.Metrics };\n resolve(body.allMetrics);\n }\n });\n\n ws.on(\"error\", (error) => {\n clearTimeout(timer);\n ws.close();\n reject(new DxtradeError(ERROR.ACCOUNT_METRICS_ERROR, `Account metrics error: ${error.message}`));\n });\n });\n}\n\nexport async function getTradeJournal(ctx: ClientContext, params: { from: number; to: number }): Promise<any> {\n ctx.ensureSession();\n\n try {\n const cookieStr = Cookies.serialize(ctx.cookies);\n\n const response = await retryRequest(\n {\n method: \"GET\",\n url: endpoints.tradeJournal(ctx.broker, params),\n headers: { ...baseHeaders(), Cookie: cookieStr },\n },\n ctx.retries,\n );\n\n if (response.status === 200) {\n const setCookies = response.headers[\"set-cookie\"] ?? [];\n const incoming = Cookies.parse(setCookies);\n ctx.cookies = Cookies.merge(ctx.cookies, incoming);\n return response.data;\n } else {\n ctx.throwError(ERROR.TRADE_JOURNAL_ERROR, `Login failed: ${response.status}`);\n }\n } catch (error: unknown) {\n if (error instanceof DxtradeError) throw error;\n const message = error instanceof Error ? error.message : \"Unknown error\";\n ctx.throwError(ERROR.TRADE_JOURNAL_ERROR, `Trade journal error: ${message}`);\n }\n}\n","export class Cookies {\n static parse(setCookieHeaders: string[]): Record<string, string> {\n const cookies: Record<string, string> = {};\n\n for (const cookie of setCookieHeaders) {\n const [nameValue] = cookie.split(\";\");\n const eqIndex = nameValue.indexOf(\"=\");\n if (eqIndex === -1) continue;\n const name = nameValue.slice(0, eqIndex).trim();\n const value = nameValue.slice(eqIndex + 1).trim();\n cookies[name] = value;\n }\n\n return cookies;\n }\n\n static serialize(cookies: Record<string, string>): string {\n return Object.entries(cookies)\n .map(([key, value]) => `${key}=${value}`)\n .join(\"; \");\n }\n\n static merge(existing: Record<string, string>, incoming: Record<string, string>): Record<string, string> {\n return { ...existing, ...incoming };\n }\n}\n","export function baseHeaders(): Record<string, string> {\n return {\n \"Content-Type\": \"application/json; charset=UTF-8\",\n \"Accept-Language\": \"en-US,en;q=0.9\",\n };\n}\n\nexport function authHeaders(csrf: string, cookieStr: string): Record<string, string> {\n return {\n ...baseHeaders(),\n \"X-CSRF-Token\": csrf,\n \"X-Requested-With\": \"XMLHttpRequest\",\n Accept: \"*/*\",\n Cookie: cookieStr,\n };\n}\n\nexport function cookieOnlyHeaders(cookieStr: string): Record<string, string> {\n return { Cookie: cookieStr };\n}\n","import axios, { type AxiosRequestConfig, type AxiosResponse } from \"axios\";\n\nexport async function retryRequest(config: AxiosRequestConfig, retries = 3): Promise<AxiosResponse> {\n for (let attempt = 1; attempt <= retries; attempt++) {\n try {\n return await axios(config);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.warn(`[dxtrade-api] Attempt ${attempt} failed: ${message}`);\n if (attempt === retries) throw error;\n await new Promise((res) => setTimeout(res, 1000 * attempt));\n }\n }\n throw new Error(\"[dxtrade-api] Failed after retries\");\n}\n","import { appendFileSync, writeFileSync } from \"fs\";\nimport type WebSocket from \"ws\";\nimport type { WsPayload } from \"./websocket.types\";\n\nexport type { WsPayload } from \"./websocket.types\";\n\nconst DEBUG_LOG = \"debug.log\";\n\nexport function shouldLog(msg: WsPayload | string, debug: boolean | string): boolean {\n if (!debug) return false;\n if (debug === true || debug === \"true\") return true;\n if (typeof msg === \"string\") return false;\n const filters = (debug as string).split(\",\").map((s) => s.trim().toUpperCase());\n return filters.includes(msg.type);\n}\n\nexport function debugLog(msg: WsPayload | string): void {\n appendFileSync(DEBUG_LOG, JSON.stringify(msg) + \"\\n\");\n}\n\nexport function clearDebugLog(): void {\n writeFileSync(DEBUG_LOG, \"\");\n}\n\nexport function parseAtmosphereId(data: WebSocket.Data): string | null {\n const raw = data.toString();\n const parts = raw.split(\"|\");\n if (parts.length >= 2 && /^[0-9a-f-]{36}$/.test(parts[1])) {\n return parts[1];\n }\n return null;\n}\n\nexport function parseWsData(data: WebSocket.Data): WsPayload | string {\n const raw = data.toString();\n const pipeIndex = raw.indexOf(\"|\");\n if (pipeIndex === -1) return raw;\n\n try {\n return JSON.parse(raw.slice(pipeIndex + 1)) as WsPayload;\n } catch {\n return raw;\n }\n}\n","import { endpoints, DxtradeError, ERROR } from \"@/constants\";\nimport { Cookies, authHeaders, retryRequest } from \"@/utils\";\nimport type { ClientContext } from \"@/client.types\";\nimport type { Assessments } from \".\";\n\nexport async function getAssessments(ctx: ClientContext, params: Assessments.Params): Promise<Assessments.Response> {\n ctx.ensureSession();\n\n try {\n const response = await retryRequest(\n {\n method: \"POST\",\n url: endpoints.assessments(ctx.broker),\n data: {\n from: params.from,\n instrument: params.instrument,\n subtype: params.subtype ?? null,\n to: params.to,\n },\n headers: authHeaders(ctx.csrf!, Cookies.serialize(ctx.cookies)),\n },\n ctx.retries,\n );\n\n return response.data as Assessments.Response;\n } catch (error: unknown) {\n if (error instanceof DxtradeError) throw error;\n const message = error instanceof Error ? error.message : \"Unknown error\";\n ctx.throwError(ERROR.ASSESSMENTS_ERROR, `Error fetching assessments: ${message}`);\n }\n}\n","import WebSocket from \"ws\";\nimport { endpoints, DxtradeError, WS_MESSAGE, ERROR } from \"@/constants\";\nimport { Cookies, parseWsData, shouldLog, debugLog } from \"@/utils\";\nimport type { ClientContext } from \"@/client.types\";\nimport type { Instrument } from \".\";\n\nexport async function getInstruments(\n ctx: ClientContext,\n params: Partial<Instrument.Info> = {},\n timeout = 30_000,\n): Promise<Instrument.Info[]> {\n ctx.ensureSession();\n\n const wsUrl = endpoints.websocket(ctx.broker, ctx.atmosphereId);\n const cookieStr = Cookies.serialize(ctx.cookies);\n\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(wsUrl, { headers: { Cookie: cookieStr } });\n\n const timer = setTimeout(() => {\n ws.close();\n reject(new DxtradeError(ERROR.INSTRUMENTS_TIMEOUT, \"Instruments request timed out\"));\n }, timeout);\n\n let instruments: Instrument.Info[] = [];\n let settleTimer: ReturnType<typeof setTimeout> | null = null;\n\n ws.on(\"message\", (data) => {\n const msg = parseWsData(data);\n if (shouldLog(msg, ctx.debug)) debugLog(msg);\n\n if (typeof msg === \"string\") return;\n if (msg.type === WS_MESSAGE.INSTRUMENTS) {\n instruments.push(...(msg.body as Instrument.Info[]));\n\n // Reset settle timer on each batch — resolve once no more arrive\n if (settleTimer) clearTimeout(settleTimer);\n settleTimer = setTimeout(() => {\n clearTimeout(timer);\n ws.close();\n resolve(\n instruments.filter((instrument) => {\n for (const key in params) {\n if (params[key as keyof Instrument.Info] !== instrument[key as keyof Instrument.Info]) {\n return false;\n }\n }\n return true;\n }),\n );\n }, 0);\n }\n });\n\n ws.on(\"error\", (error) => {\n clearTimeout(timer);\n ws.close();\n reject(new DxtradeError(ERROR.INSTRUMENTS_ERROR, `Instruments error: ${error.message}`));\n });\n });\n}\n","import WebSocket from \"ws\";\nimport { endpoints, DxtradeError, WS_MESSAGE, ERROR } from \"@/constants\";\nimport { Cookies, authHeaders, retryRequest, parseWsData, shouldLog, debugLog } from \"@/utils\";\nimport type { ClientContext } from \"@/client.types\";\nimport type { OHLC } from \".\";\n\nexport async function getOHLC(ctx: ClientContext, params: OHLC.Params, timeout = 30_000): Promise<OHLC.Bar[]> {\n ctx.ensureSession();\n\n const { symbol, resolution = 60, range = 432_000, maxBars = 3500, priceField = \"bid\" } = params;\n const wsUrl = endpoints.websocket(ctx.broker, ctx.atmosphereId);\n const cookieStr = Cookies.serialize(ctx.cookies);\n const headers = authHeaders(ctx.csrf!, cookieStr);\n\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(wsUrl, { headers: { Cookie: cookieStr } });\n const bars: OHLC.Bar[] = [];\n let putsSent = false;\n let initSettleTimer: ReturnType<typeof setTimeout> | null = null;\n let barSettleTimer: ReturnType<typeof setTimeout> | null = null;\n\n const timer = setTimeout(() => {\n ws.close();\n reject(new DxtradeError(ERROR.OHLC_TIMEOUT, \"OHLC data timed out\"));\n }, timeout);\n\n function cleanup() {\n clearTimeout(timer);\n if (initSettleTimer) clearTimeout(initSettleTimer);\n if (barSettleTimer) clearTimeout(barSettleTimer);\n ws.close();\n }\n\n async function sendPuts() {\n putsSent = true;\n try {\n await retryRequest(\n {\n method: \"PUT\",\n url: endpoints.subscribeInstruments(ctx.broker),\n data: { instruments: [symbol] },\n headers,\n },\n ctx.retries,\n );\n await retryRequest(\n {\n method: \"PUT\",\n url: endpoints.charts(ctx.broker),\n data: {\n chartIds: [],\n requests: [\n {\n aggregationPeriodSeconds: resolution,\n extendedSession: true,\n forexPriceField: priceField,\n id: 0,\n maxBarsCount: maxBars,\n range,\n studySubscription: [],\n subtopic: WS_MESSAGE.SUBTOPIC.BIG_CHART_COMPONENT,\n symbol,\n },\n ],\n },\n headers,\n },\n ctx.retries,\n );\n } catch (error: unknown) {\n cleanup();\n const message = error instanceof Error ? error.message : \"Unknown error\";\n reject(new DxtradeError(ERROR.OHLC_ERROR, `Error fetching OHLC data: ${message}`));\n }\n }\n\n ws.on(\"message\", (data) => {\n const msg = parseWsData(data);\n if (shouldLog(msg, ctx.debug)) debugLog(msg);\n if (typeof msg === \"string\") return;\n\n // Wait for init burst to settle before sending PUTs\n if (!putsSent) {\n if (initSettleTimer) clearTimeout(initSettleTimer);\n initSettleTimer = setTimeout(() => sendPuts(), 1000);\n return;\n }\n\n // Collect chart bars\n const body = msg.body as Record<string, unknown>;\n if (body?.subtopic !== WS_MESSAGE.SUBTOPIC.BIG_CHART_COMPONENT) return;\n\n if (Array.isArray(body.data)) {\n bars.push(...(body.data as OHLC.Bar[]));\n }\n\n if (barSettleTimer) clearTimeout(barSettleTimer);\n if (body.snapshotEnd) {\n cleanup();\n resolve(bars);\n } else {\n barSettleTimer = setTimeout(() => {\n cleanup();\n resolve(bars);\n }, 2000);\n }\n });\n\n ws.on(\"error\", (error) => {\n cleanup();\n reject(new DxtradeError(ERROR.OHLC_ERROR, `OHLC WebSocket error: ${error.message}`));\n });\n });\n}\n","import crypto from \"crypto\";\nimport WebSocket from \"ws\";\nimport { endpoints, ORDER_TYPE, SIDE, ACTION, DxtradeError, ERROR } from \"@/constants\";\nimport { WS_MESSAGE } from \"@/constants/enums\";\nimport { Cookies, authHeaders, retryRequest, parseWsData, shouldLog, debugLog } from \"@/utils\";\nimport type { ClientContext } from \"@/client.types\";\nimport { getSymbolInfo } from \"../symbol/symbol\";\nimport type { Order, Message } from \".\";\n\nfunction createOrderListener(\n wsUrl: string,\n cookieStr: string,\n timeout = 30_000,\n debug: boolean | string = false,\n): { promise: Promise<Order.Update>; ready: Promise<void> } {\n const ws = new WebSocket(wsUrl, { headers: { Cookie: cookieStr } });\n let settled = false;\n\n const ready = new Promise<void>((resolve) => {\n ws.on(\"open\", resolve);\n });\n\n const promise = new Promise<Order.Update>((resolve, reject) => {\n const timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n ws.close();\n reject(new Error(\"[dxtrade-api] Order update timed out\"));\n }, timeout);\n\n function done(err: Error | null, result?: Order.Update) {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n ws.close();\n if (err) reject(err);\n else resolve(result!);\n }\n\n ws.on(\"message\", (data) => {\n const msg = parseWsData(data);\n if (shouldLog(msg, debug)) debugLog(msg);\n if (typeof msg === \"string\") return;\n\n // Trade log messages (fills and rejections come through here)\n if (msg.type === WS_MESSAGE.MESSAGE) {\n const messages = msg.body as Message.Entry[];\n const orderMsg = messages?.findLast?.(\n (m) => m.messageCategory === \"TRADE_LOG\" && m.messageType === \"ORDER\" && !m.historyMessage,\n );\n if (!orderMsg) return;\n\n const params = orderMsg.parametersTO as Message.OrderParams;\n if (params.orderStatus === \"REJECTED\") {\n const reason = params.rejectReason?.key ?? \"Unknown reason\";\n done(new Error(`[dxtrade-api] Order rejected: ${reason}`));\n } else if (params.orderStatus === \"FILLED\") {\n done(null, {\n orderId: params.orderKey,\n status: params.orderStatus,\n symbol: params.symbol,\n filledQuantity: params.filledQuantity,\n filledPrice: params.filledPrice,\n });\n }\n return;\n }\n\n // Order updates (also carry fills)\n if (msg.type === WS_MESSAGE.ORDERS) {\n const body = (msg.body as Order.Update[])?.[0];\n if (!body?.orderId) return;\n\n if (body.status === \"REJECTED\") {\n done(new Error(`[dxtrade-api] Order rejected: ${body.statusDescription ?? \"Unknown reason\"}`));\n } else if (body.status === \"FILLED\") {\n done(null, body);\n }\n }\n });\n\n ws.on(\"error\", (error) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n ws.close();\n reject(new Error(`[dxtrade-api] WebSocket order listener error: ${error.message}`));\n });\n });\n\n return { promise, ready };\n}\n\nexport async function submitOrder(ctx: ClientContext, params: Order.SubmitParams): Promise<Order.Update> {\n ctx.ensureSession();\n\n const {\n symbol,\n side,\n quantity,\n orderType,\n orderCode,\n price,\n instrumentId,\n stopLoss,\n takeProfit,\n positionEffect = ACTION.OPENING,\n positionCode,\n tif = \"GTC\",\n expireDate,\n metadata,\n } = params;\n const info = await getSymbolInfo(ctx, symbol);\n const units = Math.round(quantity * info.lotSize);\n const qty = side === SIDE.BUY ? units : -units;\n const priceParam = orderType === ORDER_TYPE.STOP ? \"stopPrice\" : \"limitPrice\";\n\n const orderData: Record<string, unknown> = {\n directExchange: false,\n legs: [\n {\n ...(instrumentId != null && { instrumentId }),\n ...(positionCode != null && { positionCode }),\n positionEffect,\n ratioQuantity: 1,\n symbol,\n },\n ],\n orderSide: side,\n orderType,\n quantity: qty,\n requestId: orderCode ?? `gwt-uid-931-${crypto.randomUUID()}`,\n timeInForce: tif,\n ...(expireDate != null && { expireDate }),\n ...(metadata != null && { metadata }),\n };\n\n if (price != null && orderType !== ORDER_TYPE.MARKET) {\n orderData[priceParam] = price;\n }\n\n if (stopLoss) {\n orderData.stopLoss = {\n ...(stopLoss.offset != null && { fixedOffset: stopLoss.offset }),\n ...(stopLoss.price != null && { fixedPrice: stopLoss.price }),\n priceFixed: stopLoss.price != null,\n orderChainId: 0,\n orderId: 0,\n orderType: ORDER_TYPE.STOP,\n quantityForProtection: qty,\n removed: false,\n };\n }\n\n if (takeProfit) {\n orderData.takeProfit = {\n ...(takeProfit.offset != null && { fixedOffset: takeProfit.offset }),\n ...(takeProfit.price != null && { fixedPrice: takeProfit.price }),\n priceFixed: takeProfit.price != null,\n orderChainId: 0,\n orderId: 0,\n orderType: ORDER_TYPE.LIMIT,\n quantityForProtection: qty,\n removed: false,\n };\n }\n\n try {\n // Open WS listener BEFORE submitting so we don't miss the response\n const wsUrl = endpoints.websocket(ctx.broker, ctx.atmosphereId);\n const cookieStr = Cookies.serialize(ctx.cookies);\n const listener = createOrderListener(wsUrl, cookieStr, 30_000, ctx.debug);\n await listener.ready;\n\n const response = await retryRequest(\n {\n method: \"POST\",\n url: endpoints.submitOrder(ctx.broker),\n data: orderData,\n headers: authHeaders(ctx.csrf!, Cookies.serialize(ctx.cookies)),\n },\n ctx.retries,\n );\n\n ctx.callbacks.onOrderPlaced?.(response.data as Order.Response);\n\n const orderUpdate = await listener.promise;\n\n ctx.callbacks.onOrderUpdate?.(orderUpdate);\n return orderUpdate;\n } catch (error: unknown) {\n if (error instanceof DxtradeError) throw error;\n const message =\n error instanceof Error ? ((error as any).response?.data?.message ?? error.message) : \"Unknown error\";\n ctx.throwError(ERROR.ORDER_ERROR, `Error submitting order: ${message}`);\n }\n}\n","import WebSocket from \"ws\";\nimport { endpoints, DxtradeError, WS_MESSAGE, ERROR } from \"@/constants\";\nimport { Cookies, baseHeaders, retryRequest, parseWsData, shouldLog, debugLog } from \"@/utils\";\nimport type { ClientContext } from \"@/client.types\";\nimport type { Symbol } from \".\";\n\nexport async function getSymbolSuggestions(ctx: ClientContext, text: string): Promise<Symbol.Suggestion[]> {\n ctx.ensureSession();\n\n try {\n const cookieStr = Cookies.serialize(ctx.cookies);\n const response = await retryRequest(\n {\n method: \"GET\",\n url: endpoints.suggest(ctx.broker, text),\n headers: { ...baseHeaders(), Cookie: cookieStr },\n },\n ctx.retries,\n );\n\n const suggests = response.data?.suggests;\n if (!suggests?.length) {\n ctx.throwError(ERROR.NO_SUGGESTIONS, \"No symbol suggestions found\");\n }\n return suggests as Symbol.Suggestion[];\n } catch (error: unknown) {\n if (error instanceof DxtradeError) throw error;\n const message = error instanceof Error ? error.message : \"Unknown error\";\n ctx.throwError(ERROR.SUGGEST_ERROR, `Error getting symbol suggestions: ${message}`);\n }\n}\n\nexport async function getSymbolInfo(ctx: ClientContext, symbol: string): Promise<Symbol.Info> {\n ctx.ensureSession();\n\n try {\n const offsetMinutes = Math.abs(new Date().getTimezoneOffset());\n const cookieStr = Cookies.serialize(ctx.cookies);\n const response = await retryRequest(\n {\n method: \"GET\",\n url: endpoints.instrumentInfo(ctx.broker, symbol, offsetMinutes),\n headers: { ...baseHeaders(), Cookie: cookieStr },\n },\n ctx.retries,\n );\n\n if (!response.data) {\n ctx.throwError(ERROR.NO_SYMBOL_INFO, \"No symbol info returned\");\n }\n return response.data as Symbol.Info;\n } catch (error: unknown) {\n if (error instanceof DxtradeError) throw error;\n const message = error instanceof Error ? error.message : \"Unknown error\";\n ctx.throwError(ERROR.SYMBOL_INFO_ERROR, `Error getting symbol info: ${message}`);\n }\n}\n\nexport async function getSymbolLimits(ctx: ClientContext, timeout = 30_000): Promise<Symbol.Limits[]> {\n ctx.ensureSession();\n\n const wsUrl = endpoints.websocket(ctx.broker, ctx.atmosphereId);\n const cookieStr = Cookies.serialize(ctx.cookies);\n\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(wsUrl, { headers: { Cookie: cookieStr } });\n\n const timer = setTimeout(() => {\n ws.close();\n reject(new DxtradeError(ERROR.LIMITS_TIMEOUT, \"Symbol limits request timed out\"));\n }, timeout);\n\n let limits: Symbol.Limits[] = [];\n let settleTimer: ReturnType<typeof setTimeout> | null = null;\n\n ws.on(\"message\", (data) => {\n const msg = parseWsData(data);\n if (shouldLog(msg, ctx.debug)) debugLog(msg);\n\n if (typeof msg === \"string\") return;\n if (msg.type === WS_MESSAGE.LIMITS) {\n const batch = msg.body as Symbol.Limits[];\n if (batch.length === 0) return;\n\n limits.push(...batch);\n\n if (settleTimer) clearTimeout(settleTimer);\n settleTimer = setTimeout(() => {\n clearTimeout(timer);\n ws.close();\n resolve(limits);\n }, 0);\n }\n });\n\n ws.on(\"error\", (error) => {\n clearTimeout(timer);\n ws.close();\n reject(new DxtradeError(ERROR.LIMITS_ERROR, `Symbol limits error: ${error.message}`));\n });\n });\n}\n","import WebSocket from \"ws\";\nimport { WS_MESSAGE, ERROR, endpoints, DxtradeError } from \"@/constants\";\nimport { Cookies, parseWsData, shouldLog, debugLog, retryRequest, authHeaders } from \"@/utils\";\nimport type { ClientContext } from \"@/client.types\";\nimport type { Position } from \".\";\n\nexport async function getPositions(ctx: ClientContext): Promise<Position.Get[]> {\n ctx.ensureSession();\n\n const wsUrl = endpoints.websocket(ctx.broker, ctx.atmosphereId);\n const cookieStr = Cookies.serialize(ctx.cookies);\n\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(wsUrl, { headers: { Cookie: cookieStr } });\n\n const timer = setTimeout(() => {\n ws.close();\n reject(new DxtradeError(ERROR.ACCOUNT_POSITIONS_TIMEOUT, \"Account positions timed out\"));\n }, 30_000);\n\n ws.on(\"message\", (data) => {\n const msg = parseWsData(data);\n if (shouldLog(msg, ctx.debug)) debugLog(msg);\n\n if (typeof msg === \"string\") return;\n if (msg.type === WS_MESSAGE.POSITIONS) {\n clearTimeout(timer);\n ws.close();\n resolve(msg.body as Position.Get[]);\n }\n });\n\n ws.on(\"error\", (error) => {\n clearTimeout(timer);\n ws.close();\n reject(new DxtradeError(ERROR.ACCOUNT_POSITIONS_ERROR, `Account positions error: ${error.message}`));\n });\n });\n}\n\nexport async function closePosition(ctx: ClientContext, data: Position.Close): Promise<void> {\n try {\n await retryRequest(\n {\n method: \"POST\",\n url: endpoints.closePosition(ctx.broker),\n data,\n headers: authHeaders(ctx.csrf!, Cookies.serialize(ctx.cookies)),\n },\n ctx.retries,\n );\n // TODO:: Check response just like in order submit\n } catch (error: unknown) {\n if (error instanceof DxtradeError) throw error;\n const message =\n error instanceof Error ? ((error as any).response?.data?.message ?? error.message) : \"Unknown error\";\n ctx.throwError(ERROR.POSITION_CLOSE_ERROR, `Position close error: ${message}`);\n }\n}\n","import WebSocket from \"ws\";\nimport { endpoints, DxtradeError, ERROR } from \"@/constants\";\nimport {\n Cookies,\n authHeaders,\n cookieOnlyHeaders,\n retryRequest,\n clearDebugLog,\n parseAtmosphereId,\n parseWsData,\n shouldLog,\n debugLog,\n} from \"@/utils\";\nimport type { ClientContext } from \"@/client.types\";\n\nfunction waitForHandshake(\n wsUrl: string,\n cookieStr: string,\n timeout = 30_000,\n debug: boolean | string = false,\n): Promise<string | null> {\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(wsUrl, { headers: { Cookie: cookieStr } });\n let atmosphereId: string | null = null;\n\n const timer = setTimeout(() => {\n ws.close();\n reject(new Error(\"[dxtrade-api] Handshake timed out\"));\n }, timeout);\n\n ws.on(\"message\", (data) => {\n if (!atmosphereId) {\n atmosphereId = parseAtmosphereId(data);\n }\n\n const msg = parseWsData(data);\n if (shouldLog(msg, debug)) debugLog(msg);\n\n if (typeof msg === \"string\") return;\n if (msg.accountId) {\n clearTimeout(timer);\n ws.close();\n resolve(atmosphereId);\n }\n });\n\n ws.on(\"error\", (error) => {\n clearTimeout(timer);\n ws.close();\n reject(new Error(`[dxtrade-api] WebSocket handshake error: ${error.message}`));\n });\n });\n}\n\nexport async function login(ctx: ClientContext): Promise<void> {\n try {\n const response = await retryRequest(\n {\n method: \"POST\",\n url: endpoints.login(ctx.broker),\n data: {\n username: ctx.config.username,\n password: ctx.config.password,\n domain: ctx.config.broker,\n },\n headers: { \"Content-Type\": \"application/json\" },\n },\n ctx.retries,\n );\n\n if (response.status === 200) {\n const setCookies = response.headers[\"set-cookie\"] ?? [];\n const incoming = Cookies.parse(setCookies);\n ctx.cookies = Cookies.merge(ctx.cookies, incoming);\n ctx.callbacks.onLogin?.();\n } else {\n ctx.throwError(ERROR.LOGIN_FAILED, `Login failed: ${response.status}`);\n }\n } catch (error: unknown) {\n if (error instanceof DxtradeError) throw error;\n const message = error instanceof Error ? error.message : \"Unknown error\";\n ctx.throwError(ERROR.LOGIN_ERROR, `Login error: ${message}`);\n }\n}\n\nexport async function fetchCsrf(ctx: ClientContext): Promise<void> {\n try {\n const cookieStr = Cookies.serialize(ctx.cookies);\n const response = await retryRequest(\n {\n method: \"GET\",\n url: ctx.broker,\n headers: { ...cookieOnlyHeaders(cookieStr), Referer: ctx.broker },\n },\n ctx.retries,\n );\n\n const csrfMatch = response.data?.match(/name=\"csrf\" content=\"([^\"]+)\"/);\n if (csrfMatch) {\n ctx.csrf = csrfMatch[1];\n } else {\n ctx.throwError(ERROR.CSRF_NOT_FOUND, \"CSRF token not found\");\n }\n } catch (error: unknown) {\n if (error instanceof DxtradeError) throw error;\n const message = error instanceof Error ? error.message : \"Unknown error\";\n ctx.throwError(ERROR.CSRF_ERROR, `CSRF fetch error: ${message}`);\n }\n}\n\nexport async function switchAccount(ctx: ClientContext, accountId: string): Promise<void> {\n ctx.ensureSession();\n\n try {\n await retryRequest(\n {\n method: \"POST\",\n url: endpoints.switchAccount(ctx.broker, accountId),\n headers: authHeaders(ctx.csrf!, Cookies.serialize(ctx.cookies)),\n },\n ctx.retries,\n );\n ctx.callbacks.onAccountSwitch?.(accountId);\n } catch (error: unknown) {\n if (error instanceof DxtradeError) throw error;\n const message = error instanceof Error ? error.message : \"Unknown error\";\n ctx.throwError(ERROR.ACCOUNT_SWITCH_ERROR, `Error switching account: ${message}`);\n }\n}\n\nexport async function connect(ctx: ClientContext): Promise<void> {\n await login(ctx);\n await fetchCsrf(ctx);\n if (ctx.debug) clearDebugLog();\n\n const cookieStr = Cookies.serialize(ctx.cookies);\n ctx.atmosphereId = await waitForHandshake(endpoints.websocket(ctx.broker), cookieStr, 30_000, ctx.debug);\n\n if (ctx.config.accountId) {\n await switchAccount(ctx, ctx.config.accountId);\n ctx.atmosphereId = await waitForHandshake(\n endpoints.websocket(ctx.broker, ctx.atmosphereId),\n Cookies.serialize(ctx.cookies),\n 30_000,\n ctx.debug,\n );\n }\n}\n","import { DxtradeError, ERROR } from \"@/constants\";\nimport type { ClientContext, DxtradeConfig } from \"./client.types\";\nimport type { Account, Assessments, Instrument, OHLC, Order, Position, Symbol } from \"./domains\";\nimport {\n login,\n fetchCsrf,\n switchAccount,\n connect,\n getAccountMetrics,\n getPositions,\n closePosition,\n getAssessments,\n getInstruments,\n getSymbolLimits,\n getSymbolSuggestions,\n getOHLC,\n getSymbolInfo,\n submitOrder,\n getTradeJournal,\n} from \"@/domains\";\n\n/**\n * Client for interacting with the DXtrade trading API.\n *\n * @example\n * ```ts\n * import { DxtradeClient, ORDER_TYPE, SIDE, BROKER } from \"dxtrade-api\";\n *\n * const client = new DxtradeClient({\n * username: \"your_username\",\n * password: \"your_password\",\n * broker: BROKER.FTMO,\n * });\n *\n * await client.connect();\n * ```\n */\nexport class DxtradeClient {\n private _ctx: ClientContext;\n\n constructor(config: DxtradeConfig) {\n const callbacks = config.callbacks ?? {};\n\n this._ctx = {\n config,\n callbacks,\n cookies: {},\n csrf: null,\n atmosphereId: null,\n broker: config.broker,\n retries: config.retries ?? 3,\n debug: config.debug ?? false,\n ensureSession() {\n if (!this.csrf) {\n throw new DxtradeError(\n ERROR.NO_SESSION,\n \"No active session. Call login() and fetchCsrf() or connect() first.\",\n );\n }\n },\n throwError(code: string, message: string): never {\n const error = new DxtradeError(code, message);\n callbacks.onError?.(error);\n throw error;\n },\n };\n }\n\n /** Authenticate with the broker using username and password. */\n public async login(): Promise<void> {\n return login(this._ctx);\n }\n\n /** Fetch the CSRF token required for authenticated requests. */\n public async fetchCsrf(): Promise<void> {\n return fetchCsrf(this._ctx);\n }\n\n /** Switch to a specific trading account by ID. */\n public async switchAccount(accountId: string): Promise<void> {\n return switchAccount(this._ctx, accountId);\n }\n\n /** Connect to the broker: login, fetch CSRF, WebSocket handshake, and optional account switch. */\n public async connect(): Promise<void> {\n return connect(this._ctx);\n }\n\n /** Search for symbols matching the given text (e.g. \"EURUSD\", \"BTC\"). */\n public async getSymbolSuggestions(text: string): Promise<Symbol.Suggestion[]> {\n return getSymbolSuggestions(this._ctx, text);\n }\n\n /** Get detailed instrument info for a symbol, including volume limits and lot size. */\n public async getSymbolInfo(symbol: string): Promise<Symbol.Info> {\n return getSymbolInfo(this._ctx, symbol);\n }\n\n /** Get order size limits and stop/limit distances for all symbols. */\n public async getSymbolLimits(): Promise<Symbol.Limits[]> {\n return getSymbolLimits(this._ctx);\n }\n\n /**\n * Submit a trading order and wait for WebSocket confirmation.\n * Supports market, limit, and stop orders with optional stop loss and take profit.\n */\n public async submitOrder(params: Order.SubmitParams): Promise<Order.Update> {\n return submitOrder(this._ctx, params);\n }\n\n /** Get account metrics including equity, balance, margin, and open P&L. */\n public async getAccountMetrics(): Promise<Account.Metrics> {\n return getAccountMetrics(this._ctx);\n }\n\n /** Get all open positions via WebSocket. */\n public async getPositions(): Promise<Position.Get[]> {\n return getPositions(this._ctx);\n }\n\n /** Close a position. */\n public async closePosition(position: Position.Close): Promise<void> {\n return closePosition(this._ctx, position);\n }\n\n /**\n * Fetch trade journal entries for a date range.\n * @param params.from - Start timestamp (Unix ms)\n * @param params.to - End timestamp (Unix ms)\n */\n public async getTradeJournal(params: { from: number; to: number }): Promise<any> {\n return getTradeJournal(this._ctx, params);\n }\n\n /** Get all available instruments, optionally filtered by partial match (e.g. `{ type: \"FOREX\" }`). */\n public async getInstruments(params: Partial<Instrument.Info> = {}): Promise<Instrument.Info[]> {\n return getInstruments(this._ctx, params);\n }\n\n /** Fetch PnL assessments for an instrument within a date range. */\n public async getAssessments(params: Assessments.Params): Promise<Assessments.Response> {\n return getAssessments(this._ctx, params);\n }\n\n /**\n * Fetch OHLC price bars for a symbol.\n * @param params.symbol - Instrument symbol (e.g. \"EURUSD\")\n * @param params.resolution - Bar period in seconds (default: 60 = 1 min)\n * @param params.range - Lookback window in seconds (default: 432000 = 5 days)\n * @param params.maxBars - Maximum bars to return (default: 3500)\n * @param params.priceField - \"bid\" or \"ask\" (default: \"bid\")\n */\n public async getOHLC(params: OHLC.Params): Promise<OHLC.Bar[]> {\n return getOHLC(this._ctx, params);\n }\n}\n"],"mappings":"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","names":["ORDER_TYPE","SIDE","ACTION","TIF","ERROR","WS_MESSAGE","SUBTOPIC","axios","WebSocket","import_ws","WebSocket","import_ws","WebSocket","import_ws","import_ws","WebSocket","WebSocket","crypto","import_ws","WebSocket","import_ws","WebSocket"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/constants/brokers.ts","../src/constants/endpoints.ts","../src/constants/enums.ts","../src/constants/errors.ts","../src/domains/account/account.ts","../src/utils/cookies.ts","../src/utils/headers.ts","../src/utils/retry.ts","../src/utils/websocket.ts","../src/domains/assessments/assessments.ts","../src/domains/instrument/instrument.ts","../src/domains/ohlc/ohlc.ts","../src/domains/order/order.ts","../src/domains/symbol/symbol.ts","../src/domains/position/position.ts","../src/domains/session/session.ts","../src/client.ts"],"sourcesContent":["export * from \"./constants\";\nexport type { DxtradeConfig, DxtradeCallbacks } from \"./client.types\";\nexport type { WsPayload } from \"./utils/websocket.types\";\nexport { DxtradeClient } from \"./client\";\n","export const BROKER = {\n LARKFUNDING: \"https://trade.gooeytrade.com\",\n EIGHTCAP: \"https://trader.dx-eightcap.com\",\n FTMO: \"https://dxtrade.ftmo.com\",\n} as const;\n","function websocketQuery(atmosphereId?: string | null): string {\n const trackingId = atmosphereId ?? \"0\";\n return (\n `?X-Atmosphere-tracking-id=${trackingId}&X-Atmosphere-Framework=2.3.2-javascript` +\n `&X-Atmosphere-Transport=websocket&X-Atmosphere-TrackMessageSize=true` +\n `&Content-Type=text/x-gwt-rpc;%20charset=UTF-8&X-atmo-protocol=true` +\n `&sessionState=dx-new&guest-mode=false`\n );\n}\n\nexport const endpoints = {\n login: (base: string) => `${base}/api/auth/login`,\n\n switchAccount: (base: string, id: string) => `${base}/api/accounts/switch?accountId=${id}`,\n\n suggest: (base: string, text: string) => `${base}/api/suggest?text=${text}`,\n\n instrumentInfo: (base: string, symbol: string, tzOffset: number) =>\n `${base}/api/instruments/info?symbol=${symbol}&timezoneOffset=${tzOffset}&withExDividends=true`,\n\n submitOrder: (base: string) => `${base}/api/orders/single`,\n\n closePosition: (base: string) => `${base}/api/positions/close`,\n\n cancelOrder: (base: string, accountId: string, orderChainId: number) =>\n `${base}/api/orders/cancel?accountId=${accountId}&orderChainId=${orderChainId}`,\n\n assessments: (base: string) => `${base}/api/assessments`,\n\n websocket: (base: string, atmosphereId?: string | null) =>\n `wss://${base.split(\"//\")[1]}/client/connector` + websocketQuery(atmosphereId),\n\n tradeJournal: (base: string, params: { from: number; to: number }) =>\n `${base}/api/tradejournal?from=${params.from}&to=${params.to}`,\n\n tradeHistory: (base: string, params: { from: number; to: number }) =>\n `${base}/api/history?from=${params.from}&to=${params.to}&orderId=`,\n\n subscribeInstruments: (base: string) => `${base}/api/instruments/subscribeInstrumentSymbols`,\n\n charts: (base: string) => `${base}/api/charts`,\n};\n","export enum ORDER_TYPE {\n MARKET = \"MARKET\",\n LIMIT = \"LIMIT\",\n STOP = \"STOP\",\n}\n\nexport enum SIDE {\n BUY = \"BUY\",\n SELL = \"SELL\",\n}\n\nexport enum ACTION {\n OPENING = \"OPENING\",\n CLOSING = \"CLOSING\",\n}\n\nexport enum TIF {\n GTC = \"GTC\",\n DAY = \"DAY\",\n GTD = \"GTD\",\n}\n\nexport enum ERROR {\n NO_SESSION = \"NO_SESSION\",\n\n // Session\n LOGIN_FAILED = \"LOGIN_FAILED\",\n LOGIN_ERROR = \"LOGIN_ERROR\",\n CSRF_NOT_FOUND = \"CSRF_NOT_FOUND\",\n CSRF_ERROR = \"CSRF_ERROR\",\n ACCOUNT_SWITCH_ERROR = \"ACCOUNT_SWITCH_ERROR\",\n\n // Market data\n NO_SUGGESTIONS = \"NO_SUGGESTIONS\",\n SUGGEST_ERROR = \"SUGGEST_ERROR\",\n NO_SYMBOL_INFO = \"NO_SYMBOL_INFO\",\n SYMBOL_INFO_ERROR = \"SYMBOL_INFO_ERROR\",\n INSTRUMENTS_TIMEOUT = \"INSTRUMENTS_TIMEOUT\",\n INSTRUMENTS_ERROR = \"INSTRUMENTS_ERROR\",\n LIMITS_TIMEOUT = \"LIMITS_TIMEOUT\",\n LIMITS_ERROR = \"LIMITS_ERROR\",\n OHLC_TIMEOUT = \"OHLC_TIMEOUT\",\n OHLC_ERROR = \"OHLC_ERROR\",\n\n // Trading\n ORDER_ERROR = \"ORDER_ERROR\",\n ORDERS_TIMEOUT = \"ORDERS_TIMEOUT\",\n ORDERS_ERROR = \"ORDERS_ERROR\",\n CANCEL_ORDER_ERROR = \"CANCEL_ORDER_ERROR\",\n POSITION_CLOSE_ERROR = \"POSITION_CLOSE_ERROR\",\n POSITION_METRICS_TIMEOUT = \"POSITION_METRICS_TIMEOUT\",\n POSITION_METRICS_ERROR = \"POSITION_METRICS_ERROR\",\n\n // Account\n ACCOUNT_METRICS_TIMEOUT = \"ACCOUNT_METRICS_TIMEOUT\",\n ACCOUNT_METRICS_ERROR = \"ACCOUNT_METRICS_ERROR\",\n ACCOUNT_POSITIONS_TIMEOUT = \"ACCOUNT_POSITIONS_TIMEOUT\",\n ACCOUNT_POSITIONS_ERROR = \"ACCOUNT_POSITIONS_ERROR\",\n TRADE_JOURNAL_ERROR = \"TRADE_JOURNAL_ERROR\",\n TRADE_HISTORY_ERROR = \"TRADE_HISTORY_ERROR\",\n\n // Analytics\n ASSESSMENTS_ERROR = \"ASSESSMENTS_ERROR\",\n}\n\nexport enum WS_MESSAGE {\n ACCOUNT_METRICS = \"ACCOUNT_METRICS\",\n ACCOUNTS = \"ACCOUNTS\",\n AVAILABLE_WATCHLISTS = \"AVAILABLE_WATCHLISTS\",\n CHART_FEED_SUBTOPIC = \"chartFeedSubtopic\",\n INSTRUMENTS = \"INSTRUMENTS\",\n // INSTRUMENT_METRICS = \"INSTRUMENT_METRICS\",\n LIMITS = \"LIMITS\",\n MESSAGE = \"MESSAGE\",\n ORDERS = \"ORDERS\",\n POSITIONS = \"POSITIONS\",\n POSITION_METRICS = \"POSITION_METRICS\",\n POSITION_CASH_TRANSFERS = \"POSITION_CASH_TRANSFERS\",\n PRIVATE_LAYOUT_NAMES = \"PRIVATE_LAYOUT_NAMES\",\n SHARED_PROPERTIES_MESSAGE = \"SHARED_PROPERTIES_MESSAGE\",\n TRADE_STATUSES = \"TRADE_STATUSES\",\n USER_LOGIN_INFO = \"USER_LOGIN_INFO\",\n}\n\nexport namespace WS_MESSAGE {\n export enum SUBTOPIC {\n BIG_CHART_COMPONENT = \"BigChartComponentPresenter-4\",\n }\n}\n","export class DxtradeError extends Error {\n public code: string;\n\n constructor(code: string, message: string) {\n super(message);\n this.name = \"DxtradeError\";\n this.code = code;\n }\n}\n","import WebSocket from \"ws\";\nimport { WS_MESSAGE, ERROR, endpoints, DxtradeError } from \"@/constants\";\nimport { Cookies, parseWsData, shouldLog, debugLog, retryRequest, baseHeaders } from \"@/utils\";\nimport type { ClientContext } from \"@/client.types\";\nimport type { Account } from \".\";\n\nexport async function getAccountMetrics(ctx: ClientContext, timeout = 30_000): Promise<Account.Metrics> {\n ctx.ensureSession();\n\n const wsUrl = endpoints.websocket(ctx.broker, ctx.atmosphereId);\n const cookieStr = Cookies.serialize(ctx.cookies);\n\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(wsUrl, { headers: { Cookie: cookieStr } });\n\n const timer = setTimeout(() => {\n ws.close();\n reject(new DxtradeError(ERROR.ACCOUNT_METRICS_TIMEOUT, \"Account metrics timed out\"));\n }, timeout);\n\n ws.on(\"message\", (data) => {\n const msg = parseWsData(data);\n if (shouldLog(msg, ctx.debug)) debugLog(msg);\n\n if (typeof msg === \"string\") return;\n if (msg.type === WS_MESSAGE.ACCOUNT_METRICS) {\n clearTimeout(timer);\n ws.close();\n const body = msg.body as { allMetrics: Account.Metrics };\n resolve(body.allMetrics);\n }\n });\n\n ws.on(\"error\", (error) => {\n clearTimeout(timer);\n ws.close();\n reject(new DxtradeError(ERROR.ACCOUNT_METRICS_ERROR, `Account metrics error: ${error.message}`));\n });\n });\n}\n\nexport async function getTradeHistory(\n ctx: ClientContext,\n params: { from: number; to: number },\n): Promise<Account.TradeHistory[]> {\n ctx.ensureSession();\n\n try {\n const cookieStr = Cookies.serialize(ctx.cookies);\n\n const response = await retryRequest(\n {\n method: \"GET\",\n url: endpoints.tradeHistory(ctx.broker, params),\n headers: { ...baseHeaders(), Cookie: cookieStr },\n },\n ctx.retries,\n );\n\n if (response.status === 200) {\n const setCookies = response.headers[\"set-cookie\"] ?? [];\n const incoming = Cookies.parse(setCookies);\n ctx.cookies = Cookies.merge(ctx.cookies, incoming);\n return response.data as Account.TradeHistory[];\n } else {\n ctx.throwError(ERROR.TRADE_HISTORY_ERROR, `Trade history failed: ${response.status}`);\n }\n } catch (error: unknown) {\n if (error instanceof DxtradeError) throw error;\n const message = error instanceof Error ? error.message : \"Unknown error\";\n ctx.throwError(ERROR.TRADE_HISTORY_ERROR, `Trade history error: ${message}`);\n }\n}\n\nexport async function getTradeJournal(ctx: ClientContext, params: { from: number; to: number }): Promise<any> {\n ctx.ensureSession();\n\n try {\n const cookieStr = Cookies.serialize(ctx.cookies);\n\n const response = await retryRequest(\n {\n method: \"GET\",\n url: endpoints.tradeJournal(ctx.broker, params),\n headers: { ...baseHeaders(), Cookie: cookieStr },\n },\n ctx.retries,\n );\n\n if (response.status === 200) {\n const setCookies = response.headers[\"set-cookie\"] ?? [];\n const incoming = Cookies.parse(setCookies);\n ctx.cookies = Cookies.merge(ctx.cookies, incoming);\n return response.data;\n } else {\n ctx.throwError(ERROR.TRADE_JOURNAL_ERROR, `Login failed: ${response.status}`);\n }\n } catch (error: unknown) {\n if (error instanceof DxtradeError) throw error;\n const message = error instanceof Error ? error.message : \"Unknown error\";\n ctx.throwError(ERROR.TRADE_JOURNAL_ERROR, `Trade journal error: ${message}`);\n }\n}\n","export class Cookies {\n static parse(setCookieHeaders: string[]): Record<string, string> {\n const cookies: Record<string, string> = {};\n\n for (const cookie of setCookieHeaders) {\n const [nameValue] = cookie.split(\";\");\n const eqIndex = nameValue.indexOf(\"=\");\n if (eqIndex === -1) continue;\n const name = nameValue.slice(0, eqIndex).trim();\n const value = nameValue.slice(eqIndex + 1).trim();\n cookies[name] = value;\n }\n\n return cookies;\n }\n\n static serialize(cookies: Record<string, string>): string {\n return Object.entries(cookies)\n .map(([key, value]) => `${key}=${value}`)\n .join(\"; \");\n }\n\n static merge(existing: Record<string, string>, incoming: Record<string, string>): Record<string, string> {\n return { ...existing, ...incoming };\n }\n}\n","export function baseHeaders(): Record<string, string> {\n return {\n \"Content-Type\": \"application/json; charset=UTF-8\",\n \"Accept-Language\": \"en-US,en;q=0.9\",\n };\n}\n\nexport function authHeaders(csrf: string, cookieStr: string): Record<string, string> {\n return {\n ...baseHeaders(),\n \"X-CSRF-Token\": csrf,\n \"X-Requested-With\": \"XMLHttpRequest\",\n Accept: \"*/*\",\n Cookie: cookieStr,\n };\n}\n\nexport function cookieOnlyHeaders(cookieStr: string): Record<string, string> {\n return { Cookie: cookieStr };\n}\n","import axios, { type AxiosRequestConfig, type AxiosResponse, isAxiosError } from \"axios\";\n\nexport async function retryRequest(config: AxiosRequestConfig, retries = 3): Promise<AxiosResponse> {\n for (let attempt = 1; attempt <= retries; attempt++) {\n try {\n return await axios(config);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.warn(`[dxtrade-api] Attempt ${attempt} failed: ${message}`, config.url);\n if (isAxiosError(error) && error.response?.status === 429) throw error;\n if (attempt === retries) throw error;\n await new Promise((res) => setTimeout(res, 1000 * attempt));\n }\n }\n throw new Error(\"[dxtrade-api] Failed after retries\");\n}\n","import { appendFileSync, writeFileSync } from \"fs\";\nimport type WebSocket from \"ws\";\nimport type { WsPayload } from \"./websocket.types\";\n\nexport type { WsPayload } from \"./websocket.types\";\n\nconst DEBUG_LOG = \"debug.log\";\n\nexport function shouldLog(msg: WsPayload | string, debug: boolean | string): boolean {\n if (!debug) return false;\n if (debug === true || debug === \"true\") return true;\n if (typeof msg === \"string\") return false;\n const filters = (debug as string).split(\",\").map((s) => s.trim().toUpperCase());\n return filters.includes(msg.type);\n}\n\nexport function debugLog(msg: WsPayload | string): void {\n appendFileSync(DEBUG_LOG, JSON.stringify(msg) + \"\\n\");\n}\n\nexport function clearDebugLog(): void {\n writeFileSync(DEBUG_LOG, \"\");\n}\n\nexport function parseAtmosphereId(data: WebSocket.Data): string | null {\n const raw = data.toString();\n const parts = raw.split(\"|\");\n if (parts.length >= 2 && /^[0-9a-f-]{36}$/.test(parts[1])) {\n return parts[1];\n }\n return null;\n}\n\nexport function parseWsData(data: WebSocket.Data): WsPayload | string {\n const raw = data.toString();\n const pipeIndex = raw.indexOf(\"|\");\n if (pipeIndex === -1) return raw;\n\n try {\n return JSON.parse(raw.slice(pipeIndex + 1)) as WsPayload;\n } catch {\n return raw;\n }\n}\n","import { endpoints, DxtradeError, ERROR } from \"@/constants\";\nimport { Cookies, authHeaders, retryRequest } from \"@/utils\";\nimport type { ClientContext } from \"@/client.types\";\nimport type { Assessments } from \".\";\n\nexport async function getAssessments(ctx: ClientContext, params: Assessments.Params): Promise<Assessments.Response> {\n ctx.ensureSession();\n\n try {\n const response = await retryRequest(\n {\n method: \"POST\",\n url: endpoints.assessments(ctx.broker),\n data: {\n from: params.from,\n instrument: params.instrument,\n subtype: params.subtype ?? null,\n to: params.to,\n },\n headers: authHeaders(ctx.csrf!, Cookies.serialize(ctx.cookies)),\n },\n ctx.retries,\n );\n\n return response.data as Assessments.Response;\n } catch (error: unknown) {\n if (error instanceof DxtradeError) throw error;\n const message = error instanceof Error ? error.message : \"Unknown error\";\n ctx.throwError(ERROR.ASSESSMENTS_ERROR, `Error fetching assessments: ${message}`);\n }\n}\n","import WebSocket from \"ws\";\nimport { endpoints, DxtradeError, WS_MESSAGE, ERROR } from \"@/constants\";\nimport { Cookies, parseWsData, shouldLog, debugLog } from \"@/utils\";\nimport type { ClientContext } from \"@/client.types\";\nimport type { Instrument } from \".\";\n\nexport async function getInstruments(\n ctx: ClientContext,\n params: Partial<Instrument.Info> = {},\n timeout = 30_000,\n): Promise<Instrument.Info[]> {\n ctx.ensureSession();\n\n const wsUrl = endpoints.websocket(ctx.broker, ctx.atmosphereId);\n const cookieStr = Cookies.serialize(ctx.cookies);\n\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(wsUrl, { headers: { Cookie: cookieStr } });\n\n const timer = setTimeout(() => {\n ws.close();\n reject(new DxtradeError(ERROR.INSTRUMENTS_TIMEOUT, \"Instruments request timed out\"));\n }, timeout);\n\n let instruments: Instrument.Info[] = [];\n let settleTimer: ReturnType<typeof setTimeout> | null = null;\n\n ws.on(\"message\", (data) => {\n const msg = parseWsData(data);\n if (shouldLog(msg, ctx.debug)) debugLog(msg);\n\n if (typeof msg === \"string\") return;\n if (msg.type === WS_MESSAGE.INSTRUMENTS) {\n instruments.push(...(msg.body as Instrument.Info[]));\n\n // Reset settle timer on each batch — resolve once no more arrive\n if (settleTimer) clearTimeout(settleTimer);\n settleTimer = setTimeout(() => {\n clearTimeout(timer);\n ws.close();\n resolve(\n instruments.filter((instrument) => {\n for (const key in params) {\n if (params[key as keyof Instrument.Info] !== instrument[key as keyof Instrument.Info]) {\n return false;\n }\n }\n return true;\n }),\n );\n }, 0);\n }\n });\n\n ws.on(\"error\", (error) => {\n clearTimeout(timer);\n ws.close();\n reject(new DxtradeError(ERROR.INSTRUMENTS_ERROR, `Instruments error: ${error.message}`));\n });\n });\n}\n","import WebSocket from \"ws\";\nimport { endpoints, DxtradeError, WS_MESSAGE, ERROR } from \"@/constants\";\nimport { Cookies, authHeaders, retryRequest, parseWsData, shouldLog, debugLog } from \"@/utils\";\nimport type { ClientContext } from \"@/client.types\";\nimport type { OHLC } from \".\";\n\nexport async function getOHLC(ctx: ClientContext, params: OHLC.Params, timeout = 30_000): Promise<OHLC.Bar[]> {\n ctx.ensureSession();\n\n const { symbol, resolution = 60, range = 432_000, maxBars = 3500, priceField = \"bid\" } = params;\n const wsUrl = endpoints.websocket(ctx.broker, ctx.atmosphereId);\n const cookieStr = Cookies.serialize(ctx.cookies);\n const headers = authHeaders(ctx.csrf!, cookieStr);\n\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(wsUrl, { headers: { Cookie: cookieStr } });\n const bars: OHLC.Bar[] = [];\n let putsSent = false;\n let initSettleTimer: ReturnType<typeof setTimeout> | null = null;\n let barSettleTimer: ReturnType<typeof setTimeout> | null = null;\n\n const timer = setTimeout(() => {\n ws.close();\n reject(new DxtradeError(ERROR.OHLC_TIMEOUT, \"OHLC data timed out\"));\n }, timeout);\n\n function cleanup() {\n clearTimeout(timer);\n if (initSettleTimer) clearTimeout(initSettleTimer);\n if (barSettleTimer) clearTimeout(barSettleTimer);\n ws.close();\n }\n\n async function sendPuts() {\n putsSent = true;\n try {\n await retryRequest(\n {\n method: \"PUT\",\n url: endpoints.subscribeInstruments(ctx.broker),\n data: { instruments: [symbol] },\n headers,\n },\n ctx.retries,\n );\n await retryRequest(\n {\n method: \"PUT\",\n url: endpoints.charts(ctx.broker),\n data: {\n chartIds: [],\n requests: [\n {\n aggregationPeriodSeconds: resolution,\n extendedSession: true,\n forexPriceField: priceField,\n id: 0,\n maxBarsCount: maxBars,\n range,\n studySubscription: [],\n subtopic: WS_MESSAGE.SUBTOPIC.BIG_CHART_COMPONENT,\n symbol,\n },\n ],\n },\n headers,\n },\n ctx.retries,\n );\n } catch (error: unknown) {\n cleanup();\n const message = error instanceof Error ? error.message : \"Unknown error\";\n reject(new DxtradeError(ERROR.OHLC_ERROR, `Error fetching OHLC data: ${message}`));\n }\n }\n\n ws.on(\"message\", (data) => {\n const msg = parseWsData(data);\n if (shouldLog(msg, ctx.debug)) debugLog(msg);\n if (typeof msg === \"string\") return;\n\n // Wait for init burst to settle before sending PUTs\n if (!putsSent) {\n if (initSettleTimer) clearTimeout(initSettleTimer);\n initSettleTimer = setTimeout(() => sendPuts(), 1000);\n return;\n }\n\n // Collect chart bars\n const body = msg.body as Record<string, unknown>;\n if (body?.subtopic !== WS_MESSAGE.SUBTOPIC.BIG_CHART_COMPONENT) return;\n\n if (Array.isArray(body.data)) {\n bars.push(...(body.data as OHLC.Bar[]));\n }\n\n if (barSettleTimer) clearTimeout(barSettleTimer);\n if (body.snapshotEnd) {\n cleanup();\n resolve(bars);\n } else {\n barSettleTimer = setTimeout(() => {\n cleanup();\n resolve(bars);\n }, 2000);\n }\n });\n\n ws.on(\"error\", (error) => {\n cleanup();\n reject(new DxtradeError(ERROR.OHLC_ERROR, `OHLC WebSocket error: ${error.message}`));\n });\n });\n}\n","import crypto from \"crypto\";\nimport WebSocket from \"ws\";\nimport { endpoints, ORDER_TYPE, SIDE, ACTION, DxtradeError, ERROR } from \"@/constants\";\nimport { WS_MESSAGE } from \"@/constants/enums\";\nimport { Cookies, authHeaders, retryRequest, parseWsData, shouldLog, debugLog } from \"@/utils\";\nimport type { ClientContext } from \"@/client.types\";\nimport { getSymbolInfo } from \"../symbol/symbol\";\nimport type { Order, Message } from \".\";\n\nfunction createOrderListener(\n wsUrl: string,\n cookieStr: string,\n timeout = 30_000,\n debug: boolean | string = false,\n): { promise: Promise<Order.Update>; ready: Promise<void> } {\n const ws = new WebSocket(wsUrl, { headers: { Cookie: cookieStr } });\n let settled = false;\n\n const ready = new Promise<void>((resolve) => {\n ws.on(\"open\", resolve);\n });\n\n const promise = new Promise<Order.Update>((resolve, reject) => {\n const timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n ws.close();\n reject(new Error(\"[dxtrade-api] Order update timed out\"));\n }, timeout);\n\n function done(err: Error | null, result?: Order.Update) {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n ws.close();\n if (err) reject(err);\n else resolve(result!);\n }\n\n ws.on(\"message\", (data) => {\n const msg = parseWsData(data);\n if (shouldLog(msg, debug)) debugLog(msg);\n if (typeof msg === \"string\") return;\n\n // Trade log messages (fills and rejections come through here)\n if (msg.type === WS_MESSAGE.MESSAGE) {\n const messages = msg.body as Message.Entry[];\n const orderMsg = messages?.findLast?.(\n (m) => m.messageCategory === \"TRADE_LOG\" && m.messageType === \"ORDER\" && !m.historyMessage,\n );\n if (!orderMsg) return;\n\n const params = orderMsg.parametersTO as Message.OrderParams;\n if (params.orderStatus === \"REJECTED\") {\n const reason = params.rejectReason?.key ?? \"Unknown reason\";\n done(new Error(`[dxtrade-api] Order rejected: ${reason}`));\n } else if (params.orderStatus === \"FILLED\") {\n done(null, {\n orderId: params.orderKey,\n status: params.orderStatus,\n symbol: params.symbol,\n filledQuantity: params.filledQuantity,\n filledPrice: params.filledPrice,\n });\n }\n return;\n }\n\n // Order updates (also carry fills)\n if (msg.type === WS_MESSAGE.ORDERS) {\n const body = (msg.body as Order.Update[])?.[0];\n if (!body?.orderId) return;\n\n if (body.status === \"REJECTED\") {\n done(new Error(`[dxtrade-api] Order rejected: ${body.statusDescription ?? \"Unknown reason\"}`));\n } else if (body.status === \"FILLED\") {\n done(null, body);\n }\n }\n });\n\n ws.on(\"error\", (error) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n ws.close();\n reject(new Error(`[dxtrade-api] WebSocket order listener error: ${error.message}`));\n });\n });\n\n return { promise, ready };\n}\n\nexport async function getOrders(ctx: ClientContext, timeout = 30_000): Promise<Order.Get[]> {\n ctx.ensureSession();\n\n const wsUrl = endpoints.websocket(ctx.broker, ctx.atmosphereId);\n const cookieStr = Cookies.serialize(ctx.cookies);\n\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(wsUrl, { headers: { Cookie: cookieStr } });\n\n const timer = setTimeout(() => {\n ws.close();\n reject(new DxtradeError(ERROR.ORDERS_TIMEOUT, \"Orders request timed out\"));\n }, timeout);\n\n ws.on(\"message\", (data) => {\n const msg = parseWsData(data);\n if (shouldLog(msg, ctx.debug)) debugLog(msg);\n\n if (typeof msg === \"string\") return;\n if (msg.type === WS_MESSAGE.ORDERS) {\n clearTimeout(timer);\n ws.close();\n resolve(msg.body as Order.Get[]);\n }\n });\n\n ws.on(\"error\", (error) => {\n clearTimeout(timer);\n ws.close();\n reject(new DxtradeError(ERROR.ORDERS_ERROR, `Orders error: ${error.message}`));\n });\n });\n}\n\nexport async function cancelOrder(ctx: ClientContext, orderChainId: number): Promise<void> {\n ctx.ensureSession();\n\n const accountId = ctx.accountId ?? ctx.config.accountId;\n if (!accountId) {\n ctx.throwError(ERROR.CANCEL_ORDER_ERROR, \"accountId is required to cancel an order\");\n }\n\n try {\n await retryRequest(\n {\n method: \"DELETE\",\n url: endpoints.cancelOrder(ctx.broker, accountId, orderChainId),\n headers: authHeaders(ctx.csrf!, Cookies.serialize(ctx.cookies)),\n },\n ctx.retries,\n );\n } catch (error: unknown) {\n if (error instanceof DxtradeError) throw error;\n const message =\n error instanceof Error ? ((error as any).response?.data?.message ?? error.message) : \"Unknown error\";\n ctx.throwError(ERROR.CANCEL_ORDER_ERROR, `Cancel order error: ${message}`);\n }\n}\n\nexport async function cancelAllOrders(ctx: ClientContext): Promise<void> {\n const orders = await getOrders(ctx);\n const pending = orders.filter((o) => !o.finalStatus);\n\n for (const order of pending) {\n await cancelOrder(ctx, order.orderId);\n }\n}\n\nexport async function submitOrder(ctx: ClientContext, params: Order.SubmitParams): Promise<Order.Update> {\n ctx.ensureSession();\n\n const {\n symbol,\n side,\n quantity,\n orderType,\n orderCode,\n price,\n instrumentId,\n stopLoss,\n takeProfit,\n positionEffect = ACTION.OPENING,\n positionCode,\n tif = \"GTC\",\n expireDate,\n metadata,\n } = params;\n const info = await getSymbolInfo(ctx, symbol);\n const units = Math.round(quantity * info.lotSize);\n const qty = side === SIDE.BUY ? units : -units;\n const priceParam = orderType === ORDER_TYPE.STOP ? \"stopPrice\" : \"limitPrice\";\n\n const orderData: Record<string, unknown> = {\n directExchange: false,\n legs: [\n {\n ...(instrumentId != null && { instrumentId }),\n ...(positionCode != null && { positionCode }),\n positionEffect,\n ratioQuantity: 1,\n symbol,\n },\n ],\n orderSide: side,\n orderType,\n quantity: qty,\n requestId: orderCode ?? `gwt-uid-931-${crypto.randomUUID()}`,\n timeInForce: tif,\n ...(expireDate != null && { expireDate }),\n ...(metadata != null && { metadata }),\n };\n\n if (price != null && orderType !== ORDER_TYPE.MARKET) {\n orderData[priceParam] = price;\n }\n\n if (stopLoss) {\n orderData.stopLoss = {\n ...(stopLoss.offset != null && { fixedOffset: stopLoss.offset }),\n ...(stopLoss.price != null && { fixedPrice: stopLoss.price }),\n priceFixed: stopLoss.price != null,\n orderChainId: 0,\n orderId: 0,\n orderType: ORDER_TYPE.STOP,\n quantityForProtection: qty,\n removed: false,\n };\n }\n\n if (takeProfit) {\n orderData.takeProfit = {\n ...(takeProfit.offset != null && { fixedOffset: takeProfit.offset }),\n ...(takeProfit.price != null && { fixedPrice: takeProfit.price }),\n priceFixed: takeProfit.price != null,\n orderChainId: 0,\n orderId: 0,\n orderType: ORDER_TYPE.LIMIT,\n quantityForProtection: qty,\n removed: false,\n };\n }\n\n try {\n // Open WS listener BEFORE submitting so we don't miss the response\n const wsUrl = endpoints.websocket(ctx.broker, ctx.atmosphereId);\n const cookieStr = Cookies.serialize(ctx.cookies);\n const listener = createOrderListener(wsUrl, cookieStr, 30_000, ctx.debug);\n await listener.ready;\n\n const response = await retryRequest(\n {\n method: \"POST\",\n url: endpoints.submitOrder(ctx.broker),\n data: orderData,\n headers: authHeaders(ctx.csrf!, Cookies.serialize(ctx.cookies)),\n },\n ctx.retries,\n );\n\n ctx.callbacks.onOrderPlaced?.(response.data as Order.Response);\n\n const orderUpdate = await listener.promise;\n\n ctx.callbacks.onOrderUpdate?.(orderUpdate);\n return orderUpdate;\n } catch (error: unknown) {\n if (error instanceof DxtradeError) throw error;\n const message =\n error instanceof Error ? ((error as any).response?.data?.message ?? error.message) : \"Unknown error\";\n ctx.throwError(ERROR.ORDER_ERROR, `Error submitting order: ${message}`);\n }\n}\n","import WebSocket from \"ws\";\nimport { endpoints, DxtradeError, WS_MESSAGE, ERROR } from \"@/constants\";\nimport { Cookies, baseHeaders, retryRequest, parseWsData, shouldLog, debugLog } from \"@/utils\";\nimport type { ClientContext } from \"@/client.types\";\nimport type { Symbol } from \".\";\n\nexport async function getSymbolSuggestions(ctx: ClientContext, text: string): Promise<Symbol.Suggestion[]> {\n ctx.ensureSession();\n\n try {\n const cookieStr = Cookies.serialize(ctx.cookies);\n const response = await retryRequest(\n {\n method: \"GET\",\n url: endpoints.suggest(ctx.broker, text),\n headers: { ...baseHeaders(), Cookie: cookieStr },\n },\n ctx.retries,\n );\n\n const suggests = response.data?.suggests;\n if (!suggests?.length) {\n ctx.throwError(ERROR.NO_SUGGESTIONS, \"No symbol suggestions found\");\n }\n return suggests as Symbol.Suggestion[];\n } catch (error: unknown) {\n if (error instanceof DxtradeError) throw error;\n const message = error instanceof Error ? error.message : \"Unknown error\";\n ctx.throwError(ERROR.SUGGEST_ERROR, `Error getting symbol suggestions: ${message}`);\n }\n}\n\nexport async function getSymbolInfo(ctx: ClientContext, symbol: string): Promise<Symbol.Info> {\n ctx.ensureSession();\n\n try {\n const offsetMinutes = Math.abs(new Date().getTimezoneOffset());\n const cookieStr = Cookies.serialize(ctx.cookies);\n const response = await retryRequest(\n {\n method: \"GET\",\n url: endpoints.instrumentInfo(ctx.broker, symbol, offsetMinutes),\n headers: { ...baseHeaders(), Cookie: cookieStr },\n },\n ctx.retries,\n );\n\n if (!response.data) {\n ctx.throwError(ERROR.NO_SYMBOL_INFO, \"No symbol info returned\");\n }\n return response.data as Symbol.Info;\n } catch (error: unknown) {\n if (error instanceof DxtradeError) throw error;\n const message = error instanceof Error ? error.message : \"Unknown error\";\n ctx.throwError(ERROR.SYMBOL_INFO_ERROR, `Error getting symbol info: ${message}`);\n }\n}\n\nexport async function getSymbolLimits(ctx: ClientContext, timeout = 30_000): Promise<Symbol.Limits[]> {\n ctx.ensureSession();\n\n const wsUrl = endpoints.websocket(ctx.broker, ctx.atmosphereId);\n const cookieStr = Cookies.serialize(ctx.cookies);\n\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(wsUrl, { headers: { Cookie: cookieStr } });\n\n const timer = setTimeout(() => {\n ws.close();\n reject(new DxtradeError(ERROR.LIMITS_TIMEOUT, \"Symbol limits request timed out\"));\n }, timeout);\n\n let limits: Symbol.Limits[] = [];\n let settleTimer: ReturnType<typeof setTimeout> | null = null;\n\n ws.on(\"message\", (data) => {\n const msg = parseWsData(data);\n if (shouldLog(msg, ctx.debug)) debugLog(msg);\n\n if (typeof msg === \"string\") return;\n if (msg.type === WS_MESSAGE.LIMITS) {\n const batch = msg.body as Symbol.Limits[];\n if (batch.length === 0) return;\n\n limits.push(...batch);\n\n if (settleTimer) clearTimeout(settleTimer);\n settleTimer = setTimeout(() => {\n clearTimeout(timer);\n ws.close();\n resolve(limits);\n }, 0);\n }\n });\n\n ws.on(\"error\", (error) => {\n clearTimeout(timer);\n ws.close();\n reject(new DxtradeError(ERROR.LIMITS_ERROR, `Symbol limits error: ${error.message}`));\n });\n });\n}\n","import WebSocket from \"ws\";\nimport { WS_MESSAGE, ERROR, endpoints, DxtradeError } from \"@/constants\";\nimport { Cookies, parseWsData, shouldLog, debugLog, retryRequest, authHeaders } from \"@/utils\";\nimport type { ClientContext } from \"@/client.types\";\nimport type { Position } from \".\";\n\nexport async function getPositions(ctx: ClientContext): Promise<Position.Get[]> {\n ctx.ensureSession();\n\n const wsUrl = endpoints.websocket(ctx.broker, ctx.atmosphereId);\n const cookieStr = Cookies.serialize(ctx.cookies);\n\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(wsUrl, { headers: { Cookie: cookieStr } });\n\n const timer = setTimeout(() => {\n ws.close();\n reject(new DxtradeError(ERROR.ACCOUNT_POSITIONS_TIMEOUT, \"Account positions timed out\"));\n }, 30_000);\n\n ws.on(\"message\", (data) => {\n const msg = parseWsData(data);\n if (shouldLog(msg, ctx.debug)) debugLog(msg);\n\n if (typeof msg === \"string\") return;\n if (msg.type === WS_MESSAGE.POSITIONS) {\n clearTimeout(timer);\n ws.close();\n resolve(msg.body as Position.Get[]);\n }\n });\n\n ws.on(\"error\", (error) => {\n clearTimeout(timer);\n ws.close();\n reject(new DxtradeError(ERROR.ACCOUNT_POSITIONS_ERROR, `Account positions error: ${error.message}`));\n });\n });\n}\n\nexport async function getPositionMetrics(ctx: ClientContext, timeout = 30_000): Promise<Position.Metrics[]> {\n ctx.ensureSession();\n\n const wsUrl = endpoints.websocket(ctx.broker, ctx.atmosphereId);\n const cookieStr = Cookies.serialize(ctx.cookies);\n\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(wsUrl, { headers: { Cookie: cookieStr } });\n\n const timer = setTimeout(() => {\n ws.close();\n reject(new DxtradeError(ERROR.POSITION_METRICS_TIMEOUT, \"Position metrics timed out\"));\n }, timeout);\n\n ws.on(\"message\", (data) => {\n const msg = parseWsData(data);\n if (shouldLog(msg, ctx.debug)) debugLog(msg);\n\n if (typeof msg === \"string\") return;\n if (msg.type === WS_MESSAGE.POSITION_METRICS) {\n clearTimeout(timer);\n ws.close();\n resolve(msg.body as Position.Metrics[]);\n }\n });\n\n ws.on(\"error\", (error) => {\n clearTimeout(timer);\n ws.close();\n reject(new DxtradeError(ERROR.POSITION_METRICS_ERROR, `Position metrics error: ${error.message}`));\n });\n });\n}\n\nexport async function closeAllPositions(ctx: ClientContext): Promise<void> {\n const positions = await getPositions(ctx);\n\n for (const pos of positions) {\n const closeData: Position.Close = {\n legs: [\n {\n instrumentId: pos.positionKey.instrumentId,\n positionCode: pos.positionKey.positionCode,\n positionEffect: \"CLOSING\",\n ratioQuantity: 1,\n symbol: pos.positionKey.positionCode,\n },\n ],\n limitPrice: 0,\n orderType: \"MARKET\",\n quantity: -pos.quantity,\n timeInForce: \"GTC\",\n };\n await closePosition(ctx, closeData);\n }\n}\n\nexport async function closePosition(ctx: ClientContext, data: Position.Close): Promise<void> {\n try {\n await retryRequest(\n {\n method: \"POST\",\n url: endpoints.closePosition(ctx.broker),\n data,\n headers: authHeaders(ctx.csrf!, Cookies.serialize(ctx.cookies)),\n },\n ctx.retries,\n );\n // TODO:: Check response just like in order submit\n } catch (error: unknown) {\n if (error instanceof DxtradeError) throw error;\n const message =\n error instanceof Error ? ((error as any).response?.data?.message ?? error.message) : \"Unknown error\";\n ctx.throwError(ERROR.POSITION_CLOSE_ERROR, `Position close error: ${message}`);\n }\n}\n","import WebSocket from \"ws\";\nimport { endpoints, DxtradeError, ERROR } from \"@/constants\";\nimport {\n Cookies,\n authHeaders,\n cookieOnlyHeaders,\n retryRequest,\n clearDebugLog,\n parseAtmosphereId,\n parseWsData,\n shouldLog,\n debugLog,\n} from \"@/utils\";\nimport type { ClientContext } from \"@/client.types\";\n\ninterface HandshakeResult {\n atmosphereId: string | null;\n accountId: string | null;\n}\n\nfunction waitForHandshake(\n wsUrl: string,\n cookieStr: string,\n timeout = 30_000,\n debug: boolean | string = false,\n): Promise<HandshakeResult> {\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(wsUrl, { headers: { Cookie: cookieStr } });\n let atmosphereId: string | null = null;\n\n const timer = setTimeout(() => {\n ws.close();\n reject(new Error(\"[dxtrade-api] Handshake timed out\"));\n }, timeout);\n\n ws.on(\"message\", (data) => {\n if (!atmosphereId) {\n atmosphereId = parseAtmosphereId(data);\n }\n\n const msg = parseWsData(data);\n if (shouldLog(msg, debug)) debugLog(msg);\n\n if (typeof msg === \"string\") return;\n if (msg.accountId) {\n clearTimeout(timer);\n ws.close();\n resolve({ atmosphereId, accountId: msg.accountId });\n }\n });\n\n ws.on(\"error\", (error) => {\n clearTimeout(timer);\n ws.close();\n reject(new Error(`[dxtrade-api] WebSocket handshake error: ${error.message}`));\n });\n });\n}\n\nexport async function login(ctx: ClientContext): Promise<void> {\n try {\n const response = await retryRequest(\n {\n method: \"POST\",\n url: endpoints.login(ctx.broker),\n data: {\n username: ctx.config.username,\n password: ctx.config.password,\n\n // TODO:: take a look at this below, domain nor vendor seems required. it works if i comment out both.\n // however i still use it since i see brokers use it as well in the login endpoint.\n\n // domain: ctx.config.broker,\n vendor: ctx.config.broker,\n\n // END TODO::\n },\n headers: { \"Content-Type\": \"application/json\" },\n },\n ctx.retries,\n );\n\n if (response.status === 200) {\n const setCookies = response.headers[\"set-cookie\"] ?? [];\n const incoming = Cookies.parse(setCookies);\n ctx.cookies = Cookies.merge(ctx.cookies, incoming);\n ctx.callbacks.onLogin?.();\n } else {\n ctx.throwError(ERROR.LOGIN_FAILED, `Login failed: ${response.status}`);\n }\n } catch (error: unknown) {\n if (error instanceof DxtradeError) throw error;\n const message = error instanceof Error ? error.message : \"Unknown error\";\n ctx.throwError(ERROR.LOGIN_ERROR, `Login error: ${message}`);\n }\n}\n\nexport async function fetchCsrf(ctx: ClientContext): Promise<void> {\n try {\n const cookieStr = Cookies.serialize(ctx.cookies);\n const response = await retryRequest(\n {\n method: \"GET\",\n url: ctx.broker,\n headers: { ...cookieOnlyHeaders(cookieStr), Referer: ctx.broker },\n },\n ctx.retries,\n );\n\n const csrfMatch = response.data?.match(/name=\"csrf\" content=\"([^\"]+)\"/);\n if (csrfMatch) {\n ctx.csrf = csrfMatch[1];\n } else {\n ctx.throwError(ERROR.CSRF_NOT_FOUND, \"CSRF token not found\");\n }\n } catch (error: unknown) {\n if (error instanceof DxtradeError) throw error;\n const message = error instanceof Error ? error.message : \"Unknown error\";\n ctx.throwError(ERROR.CSRF_ERROR, `CSRF fetch error: ${message}`);\n }\n}\n\nexport async function switchAccount(ctx: ClientContext, accountId: string): Promise<void> {\n ctx.ensureSession();\n\n try {\n await retryRequest(\n {\n method: \"POST\",\n url: endpoints.switchAccount(ctx.broker, accountId),\n headers: authHeaders(ctx.csrf!, Cookies.serialize(ctx.cookies)),\n },\n ctx.retries,\n );\n ctx.callbacks.onAccountSwitch?.(accountId);\n } catch (error: unknown) {\n if (error instanceof DxtradeError) throw error;\n const message = error instanceof Error ? error.message : \"Unknown error\";\n ctx.throwError(ERROR.ACCOUNT_SWITCH_ERROR, `Error switching account: ${message}`);\n }\n}\n\nexport async function connect(ctx: ClientContext): Promise<void> {\n await login(ctx);\n await fetchCsrf(ctx);\n if (ctx.debug) clearDebugLog();\n\n const cookieStr = Cookies.serialize(ctx.cookies);\n const handshake = await waitForHandshake(endpoints.websocket(ctx.broker), cookieStr, 30_000, ctx.debug);\n ctx.atmosphereId = handshake.atmosphereId;\n ctx.accountId = handshake.accountId;\n\n if (ctx.config.accountId) {\n await switchAccount(ctx, ctx.config.accountId);\n const reconnect = await waitForHandshake(\n endpoints.websocket(ctx.broker, ctx.atmosphereId),\n Cookies.serialize(ctx.cookies),\n 30_000,\n ctx.debug,\n );\n ctx.atmosphereId = reconnect.atmosphereId;\n ctx.accountId = reconnect.accountId;\n }\n}\n","import { DxtradeError, ERROR } from \"@/constants\";\nimport type { ClientContext, DxtradeConfig } from \"./client.types\";\nimport type { Account, Assessments, Instrument, OHLC, Order, Position, Symbol } from \"./domains\";\nimport {\n login,\n fetchCsrf,\n switchAccount,\n connect,\n getAccountMetrics,\n getTradeHistory,\n getPositions,\n getPositionMetrics,\n closePosition,\n closeAllPositions,\n getAssessments,\n getInstruments,\n getSymbolLimits,\n getSymbolSuggestions,\n getOHLC,\n getSymbolInfo,\n getOrders,\n cancelOrder,\n cancelAllOrders,\n submitOrder,\n getTradeJournal,\n} from \"@/domains\";\n\n/**\n * Client for interacting with the DXtrade trading API.\n *\n * @example\n * ```ts\n * import { DxtradeClient, ORDER_TYPE, SIDE, BROKER } from \"dxtrade-api\";\n *\n * const client = new DxtradeClient({\n * username: \"your_username\",\n * password: \"your_password\",\n * broker: BROKER.FTMO,\n * });\n *\n * await client.connect();\n * ```\n */\nexport class DxtradeClient {\n private _ctx: ClientContext;\n\n constructor(config: DxtradeConfig) {\n const callbacks = config.callbacks ?? {};\n\n this._ctx = {\n config,\n callbacks,\n cookies: {},\n csrf: null,\n accountId: config.accountId ?? null,\n atmosphereId: null,\n broker: config.broker,\n retries: config.retries ?? 3,\n debug: config.debug ?? false,\n ensureSession() {\n if (!this.csrf) {\n throw new DxtradeError(\n ERROR.NO_SESSION,\n \"No active session. Call login() and fetchCsrf() or connect() first.\",\n );\n }\n },\n throwError(code: string, message: string): never {\n const error = new DxtradeError(code, message);\n callbacks.onError?.(error);\n throw error;\n },\n };\n }\n\n /** Authenticate with the broker using username and password. */\n public async login(): Promise<void> {\n return login(this._ctx);\n }\n\n /** Fetch the CSRF token required for authenticated requests. */\n public async fetchCsrf(): Promise<void> {\n return fetchCsrf(this._ctx);\n }\n\n /** Switch to a specific trading account by ID. */\n public async switchAccount(accountId: string): Promise<void> {\n return switchAccount(this._ctx, accountId);\n }\n\n /** Connect to the broker: login, fetch CSRF, WebSocket handshake, and optional account switch. */\n public async connect(): Promise<void> {\n return connect(this._ctx);\n }\n\n /** Search for symbols matching the given text (e.g. \"EURUSD\", \"BTC\"). */\n public async getSymbolSuggestions(text: string): Promise<Symbol.Suggestion[]> {\n return getSymbolSuggestions(this._ctx, text);\n }\n\n /** Get detailed instrument info for a symbol, including volume limits and lot size. */\n public async getSymbolInfo(symbol: string): Promise<Symbol.Info> {\n return getSymbolInfo(this._ctx, symbol);\n }\n\n /** Get order size limits and stop/limit distances for all symbols. */\n public async getSymbolLimits(): Promise<Symbol.Limits[]> {\n return getSymbolLimits(this._ctx);\n }\n\n /**\n * Submit a trading order and wait for WebSocket confirmation.\n * Supports market, limit, and stop orders with optional stop loss and take profit.\n */\n public async submitOrder(params: Order.SubmitParams): Promise<Order.Update> {\n return submitOrder(this._ctx, params);\n }\n\n /** Get all pending/open orders via WebSocket. */\n public async getOrders(): Promise<Order.Get[]> {\n return getOrders(this._ctx);\n }\n\n /** Cancel a single pending order by its order chain ID. */\n public async cancelOrder(orderChainId: number): Promise<void> {\n return cancelOrder(this._ctx, orderChainId);\n }\n\n /** Cancel all pending orders. */\n public async cancelAllOrders(): Promise<void> {\n return cancelAllOrders(this._ctx);\n }\n\n /** Get account metrics including equity, balance, margin, and open P&L. */\n public async getAccountMetrics(): Promise<Account.Metrics> {\n return getAccountMetrics(this._ctx);\n }\n\n /** Get all open positions via WebSocket. */\n public async getPositions(): Promise<Position.Get[]> {\n return getPositions(this._ctx);\n }\n\n /**\n * Close a position. Supports partial closes by specifying a quantity smaller than the full position size.\n */\n public async closePosition(position: Position.Close): Promise<void> {\n return closePosition(this._ctx, position);\n }\n\n /** Close all open positions with market orders. */\n public async closeAllPositions(): Promise<void> {\n return closeAllPositions(this._ctx);\n }\n\n /** Get position-level P&L metrics via WebSocket. */\n public async getPositionMetrics(): Promise<Position.Metrics[]> {\n return getPositionMetrics(this._ctx);\n }\n\n /**\n * Fetch trade journal entries for a date range.\n * @param params.from - Start timestamp (Unix ms)\n * @param params.to - End timestamp (Unix ms)\n */\n public async getTradeJournal(params: { from: number; to: number }): Promise<any> {\n return getTradeJournal(this._ctx, params);\n }\n\n /**\n * Fetch trade history for a date range.\n * @param params.from - Start timestamp (Unix ms)\n * @param params.to - End timestamp (Unix ms)\n */\n public async getTradeHistory(params: { from: number; to: number }): Promise<Account.TradeHistory[]> {\n return getTradeHistory(this._ctx, params);\n }\n\n /** Get all available instruments, optionally filtered by partial match (e.g. `{ type: \"FOREX\" }`). */\n public async getInstruments(params: Partial<Instrument.Info> = {}): Promise<Instrument.Info[]> {\n return getInstruments(this._ctx, params);\n }\n\n /** Fetch PnL assessments for an instrument within a date range. */\n public async getAssessments(params: Assessments.Params): Promise<Assessments.Response> {\n return getAssessments(this._ctx, params);\n }\n\n /**\n * Fetch OHLC price bars for a symbol.\n * @param params.symbol - Instrument symbol (e.g. \"EURUSD\")\n * @param params.resolution - Bar period in seconds (default: 60 = 1 min)\n * @param params.range - Lookback window in seconds (default: 432000 = 5 days)\n * @param params.maxBars - Maximum bars to return (default: 3500)\n * @param params.priceField - \"bid\" or \"ask\" (default: \"bid\")\n */\n public async getOHLC(params: OHLC.Params): Promise<OHLC.Bar[]> {\n return getOHLC(this._ctx, params);\n }\n}\n"],"mappings":"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","names":["ORDER_TYPE","SIDE","ACTION","TIF","ERROR","WS_MESSAGE","SUBTOPIC","axios","WebSocket","import_ws","WebSocket","import_ws","WebSocket","import_ws","import_ws","WebSocket","WebSocket","crypto","import_ws","WebSocket","import_ws","WebSocket"]}
package/dist/index.mjs CHANGED
@@ -17,9 +17,11 @@ var endpoints = {
17
17
  instrumentInfo: (base, symbol, tzOffset) => `${base}/api/instruments/info?symbol=${symbol}&timezoneOffset=${tzOffset}&withExDividends=true`,
18
18
  submitOrder: (base) => `${base}/api/orders/single`,
19
19
  closePosition: (base) => `${base}/api/positions/close`,
20
+ cancelOrder: (base, accountId, orderChainId) => `${base}/api/orders/cancel?accountId=${accountId}&orderChainId=${orderChainId}`,
20
21
  assessments: (base) => `${base}/api/assessments`,
21
22
  websocket: (base, atmosphereId) => `wss://${base.split("//")[1]}/client/connector` + websocketQuery(atmosphereId),
22
23
  tradeJournal: (base, params) => `${base}/api/tradejournal?from=${params.from}&to=${params.to}`,
24
+ tradeHistory: (base, params) => `${base}/api/history?from=${params.from}&to=${params.to}&orderId=`,
23
25
  subscribeInstruments: (base) => `${base}/api/instruments/subscribeInstrumentSymbols`,
24
26
  charts: (base) => `${base}/api/charts`
25
27
  };
@@ -65,12 +67,18 @@ var ERROR = /* @__PURE__ */ ((ERROR2) => {
65
67
  ERROR2["OHLC_TIMEOUT"] = "OHLC_TIMEOUT";
66
68
  ERROR2["OHLC_ERROR"] = "OHLC_ERROR";
67
69
  ERROR2["ORDER_ERROR"] = "ORDER_ERROR";
70
+ ERROR2["ORDERS_TIMEOUT"] = "ORDERS_TIMEOUT";
71
+ ERROR2["ORDERS_ERROR"] = "ORDERS_ERROR";
72
+ ERROR2["CANCEL_ORDER_ERROR"] = "CANCEL_ORDER_ERROR";
68
73
  ERROR2["POSITION_CLOSE_ERROR"] = "POSITION_CLOSE_ERROR";
74
+ ERROR2["POSITION_METRICS_TIMEOUT"] = "POSITION_METRICS_TIMEOUT";
75
+ ERROR2["POSITION_METRICS_ERROR"] = "POSITION_METRICS_ERROR";
69
76
  ERROR2["ACCOUNT_METRICS_TIMEOUT"] = "ACCOUNT_METRICS_TIMEOUT";
70
77
  ERROR2["ACCOUNT_METRICS_ERROR"] = "ACCOUNT_METRICS_ERROR";
71
78
  ERROR2["ACCOUNT_POSITIONS_TIMEOUT"] = "ACCOUNT_POSITIONS_TIMEOUT";
72
79
  ERROR2["ACCOUNT_POSITIONS_ERROR"] = "ACCOUNT_POSITIONS_ERROR";
73
80
  ERROR2["TRADE_JOURNAL_ERROR"] = "TRADE_JOURNAL_ERROR";
81
+ ERROR2["TRADE_HISTORY_ERROR"] = "TRADE_HISTORY_ERROR";
74
82
  ERROR2["ASSESSMENTS_ERROR"] = "ASSESSMENTS_ERROR";
75
83
  return ERROR2;
76
84
  })(ERROR || {});
@@ -80,11 +88,11 @@ var WS_MESSAGE = /* @__PURE__ */ ((WS_MESSAGE2) => {
80
88
  WS_MESSAGE2["AVAILABLE_WATCHLISTS"] = "AVAILABLE_WATCHLISTS";
81
89
  WS_MESSAGE2["CHART_FEED_SUBTOPIC"] = "chartFeedSubtopic";
82
90
  WS_MESSAGE2["INSTRUMENTS"] = "INSTRUMENTS";
83
- WS_MESSAGE2["INSTRUMENT_METRICS"] = "INSTRUMENT_METRICS";
84
91
  WS_MESSAGE2["LIMITS"] = "LIMITS";
85
92
  WS_MESSAGE2["MESSAGE"] = "MESSAGE";
86
93
  WS_MESSAGE2["ORDERS"] = "ORDERS";
87
94
  WS_MESSAGE2["POSITIONS"] = "POSITIONS";
95
+ WS_MESSAGE2["POSITION_METRICS"] = "POSITION_METRICS";
88
96
  WS_MESSAGE2["POSITION_CASH_TRANSFERS"] = "POSITION_CASH_TRANSFERS";
89
97
  WS_MESSAGE2["PRIVATE_LAYOUT_NAMES"] = "PRIVATE_LAYOUT_NAMES";
90
98
  WS_MESSAGE2["SHARED_PROPERTIES_MESSAGE"] = "SHARED_PROPERTIES_MESSAGE";
@@ -155,14 +163,15 @@ function cookieOnlyHeaders(cookieStr) {
155
163
  }
156
164
 
157
165
  // src/utils/retry.ts
158
- import axios from "axios";
166
+ import axios, { isAxiosError } from "axios";
159
167
  async function retryRequest(config, retries = 3) {
160
168
  for (let attempt = 1; attempt <= retries; attempt++) {
161
169
  try {
162
170
  return await axios(config);
163
171
  } catch (error) {
164
172
  const message = error instanceof Error ? error.message : "Unknown error";
165
- console.warn(`[dxtrade-api] Attempt ${attempt} failed: ${message}`);
173
+ console.warn(`[dxtrade-api] Attempt ${attempt} failed: ${message}`, config.url);
174
+ if (isAxiosError(error) && error.response?.status === 429) throw error;
166
175
  if (attempt === retries) throw error;
167
176
  await new Promise((res) => setTimeout(res, 1e3 * attempt));
168
177
  }
@@ -234,6 +243,32 @@ async function getAccountMetrics(ctx, timeout = 3e4) {
234
243
  });
235
244
  });
236
245
  }
246
+ async function getTradeHistory(ctx, params) {
247
+ ctx.ensureSession();
248
+ try {
249
+ const cookieStr = Cookies.serialize(ctx.cookies);
250
+ const response = await retryRequest(
251
+ {
252
+ method: "GET",
253
+ url: endpoints.tradeHistory(ctx.broker, params),
254
+ headers: { ...baseHeaders(), Cookie: cookieStr }
255
+ },
256
+ ctx.retries
257
+ );
258
+ if (response.status === 200) {
259
+ const setCookies = response.headers["set-cookie"] ?? [];
260
+ const incoming = Cookies.parse(setCookies);
261
+ ctx.cookies = Cookies.merge(ctx.cookies, incoming);
262
+ return response.data;
263
+ } else {
264
+ ctx.throwError("TRADE_HISTORY_ERROR" /* TRADE_HISTORY_ERROR */, `Trade history failed: ${response.status}`);
265
+ }
266
+ } catch (error) {
267
+ if (error instanceof DxtradeError) throw error;
268
+ const message = error instanceof Error ? error.message : "Unknown error";
269
+ ctx.throwError("TRADE_HISTORY_ERROR" /* TRADE_HISTORY_ERROR */, `Trade history error: ${message}`);
270
+ }
271
+ }
237
272
  async function getTradeJournal(ctx, params) {
238
273
  ctx.ensureSession();
239
274
  try {
@@ -585,6 +620,61 @@ function createOrderListener(wsUrl, cookieStr, timeout = 3e4, debug = false) {
585
620
  });
586
621
  return { promise, ready };
587
622
  }
623
+ async function getOrders(ctx, timeout = 3e4) {
624
+ ctx.ensureSession();
625
+ const wsUrl = endpoints.websocket(ctx.broker, ctx.atmosphereId);
626
+ const cookieStr = Cookies.serialize(ctx.cookies);
627
+ return new Promise((resolve, reject) => {
628
+ const ws = new WebSocket5(wsUrl, { headers: { Cookie: cookieStr } });
629
+ const timer = setTimeout(() => {
630
+ ws.close();
631
+ reject(new DxtradeError("ORDERS_TIMEOUT" /* ORDERS_TIMEOUT */, "Orders request timed out"));
632
+ }, timeout);
633
+ ws.on("message", (data) => {
634
+ const msg = parseWsData(data);
635
+ if (shouldLog(msg, ctx.debug)) debugLog(msg);
636
+ if (typeof msg === "string") return;
637
+ if (msg.type === "ORDERS" /* ORDERS */) {
638
+ clearTimeout(timer);
639
+ ws.close();
640
+ resolve(msg.body);
641
+ }
642
+ });
643
+ ws.on("error", (error) => {
644
+ clearTimeout(timer);
645
+ ws.close();
646
+ reject(new DxtradeError("ORDERS_ERROR" /* ORDERS_ERROR */, `Orders error: ${error.message}`));
647
+ });
648
+ });
649
+ }
650
+ async function cancelOrder(ctx, orderChainId) {
651
+ ctx.ensureSession();
652
+ const accountId = ctx.accountId ?? ctx.config.accountId;
653
+ if (!accountId) {
654
+ ctx.throwError("CANCEL_ORDER_ERROR" /* CANCEL_ORDER_ERROR */, "accountId is required to cancel an order");
655
+ }
656
+ try {
657
+ await retryRequest(
658
+ {
659
+ method: "DELETE",
660
+ url: endpoints.cancelOrder(ctx.broker, accountId, orderChainId),
661
+ headers: authHeaders(ctx.csrf, Cookies.serialize(ctx.cookies))
662
+ },
663
+ ctx.retries
664
+ );
665
+ } catch (error) {
666
+ if (error instanceof DxtradeError) throw error;
667
+ const message = error instanceof Error ? error.response?.data?.message ?? error.message : "Unknown error";
668
+ ctx.throwError("CANCEL_ORDER_ERROR" /* CANCEL_ORDER_ERROR */, `Cancel order error: ${message}`);
669
+ }
670
+ }
671
+ async function cancelAllOrders(ctx) {
672
+ const orders = await getOrders(ctx);
673
+ const pending = orders.filter((o) => !o.finalStatus);
674
+ for (const order of pending) {
675
+ await cancelOrder(ctx, order.orderId);
676
+ }
677
+ }
588
678
  async function submitOrder(ctx, params) {
589
679
  ctx.ensureSession();
590
680
  const {
@@ -707,6 +797,54 @@ async function getPositions(ctx) {
707
797
  });
708
798
  });
709
799
  }
800
+ async function getPositionMetrics(ctx, timeout = 3e4) {
801
+ ctx.ensureSession();
802
+ const wsUrl = endpoints.websocket(ctx.broker, ctx.atmosphereId);
803
+ const cookieStr = Cookies.serialize(ctx.cookies);
804
+ return new Promise((resolve, reject) => {
805
+ const ws = new WebSocket6(wsUrl, { headers: { Cookie: cookieStr } });
806
+ const timer = setTimeout(() => {
807
+ ws.close();
808
+ reject(new DxtradeError("POSITION_METRICS_TIMEOUT" /* POSITION_METRICS_TIMEOUT */, "Position metrics timed out"));
809
+ }, timeout);
810
+ ws.on("message", (data) => {
811
+ const msg = parseWsData(data);
812
+ if (shouldLog(msg, ctx.debug)) debugLog(msg);
813
+ if (typeof msg === "string") return;
814
+ if (msg.type === "POSITION_METRICS" /* POSITION_METRICS */) {
815
+ clearTimeout(timer);
816
+ ws.close();
817
+ resolve(msg.body);
818
+ }
819
+ });
820
+ ws.on("error", (error) => {
821
+ clearTimeout(timer);
822
+ ws.close();
823
+ reject(new DxtradeError("POSITION_METRICS_ERROR" /* POSITION_METRICS_ERROR */, `Position metrics error: ${error.message}`));
824
+ });
825
+ });
826
+ }
827
+ async function closeAllPositions(ctx) {
828
+ const positions = await getPositions(ctx);
829
+ for (const pos of positions) {
830
+ const closeData = {
831
+ legs: [
832
+ {
833
+ instrumentId: pos.positionKey.instrumentId,
834
+ positionCode: pos.positionKey.positionCode,
835
+ positionEffect: "CLOSING",
836
+ ratioQuantity: 1,
837
+ symbol: pos.positionKey.positionCode
838
+ }
839
+ ],
840
+ limitPrice: 0,
841
+ orderType: "MARKET",
842
+ quantity: -pos.quantity,
843
+ timeInForce: "GTC"
844
+ };
845
+ await closePosition(ctx, closeData);
846
+ }
847
+ }
710
848
  async function closePosition(ctx, data) {
711
849
  try {
712
850
  await retryRequest(
@@ -745,7 +883,7 @@ function waitForHandshake(wsUrl, cookieStr, timeout = 3e4, debug = false) {
745
883
  if (msg.accountId) {
746
884
  clearTimeout(timer);
747
885
  ws.close();
748
- resolve(atmosphereId);
886
+ resolve({ atmosphereId, accountId: msg.accountId });
749
887
  }
750
888
  });
751
889
  ws.on("error", (error) => {
@@ -764,7 +902,11 @@ async function login(ctx) {
764
902
  data: {
765
903
  username: ctx.config.username,
766
904
  password: ctx.config.password,
767
- domain: ctx.config.broker
905
+ // TODO:: take a look at this below, domain nor vendor seems required. it works if i comment out both.
906
+ // however i still use it since i see brokers use it as well in the login endpoint.
907
+ // domain: ctx.config.broker,
908
+ vendor: ctx.config.broker
909
+ // END TODO::
768
910
  },
769
911
  headers: { "Content-Type": "application/json" }
770
912
  },
@@ -830,15 +972,19 @@ async function connect(ctx) {
830
972
  await fetchCsrf(ctx);
831
973
  if (ctx.debug) clearDebugLog();
832
974
  const cookieStr = Cookies.serialize(ctx.cookies);
833
- ctx.atmosphereId = await waitForHandshake(endpoints.websocket(ctx.broker), cookieStr, 3e4, ctx.debug);
975
+ const handshake = await waitForHandshake(endpoints.websocket(ctx.broker), cookieStr, 3e4, ctx.debug);
976
+ ctx.atmosphereId = handshake.atmosphereId;
977
+ ctx.accountId = handshake.accountId;
834
978
  if (ctx.config.accountId) {
835
979
  await switchAccount(ctx, ctx.config.accountId);
836
- ctx.atmosphereId = await waitForHandshake(
980
+ const reconnect = await waitForHandshake(
837
981
  endpoints.websocket(ctx.broker, ctx.atmosphereId),
838
982
  Cookies.serialize(ctx.cookies),
839
983
  3e4,
840
984
  ctx.debug
841
985
  );
986
+ ctx.atmosphereId = reconnect.atmosphereId;
987
+ ctx.accountId = reconnect.accountId;
842
988
  }
843
989
  }
844
990
 
@@ -852,6 +998,7 @@ var DxtradeClient = class {
852
998
  callbacks,
853
999
  cookies: {},
854
1000
  csrf: null,
1001
+ accountId: config.accountId ?? null,
855
1002
  atmosphereId: null,
856
1003
  broker: config.broker,
857
1004
  retries: config.retries ?? 3,
@@ -906,6 +1053,18 @@ var DxtradeClient = class {
906
1053
  async submitOrder(params) {
907
1054
  return submitOrder(this._ctx, params);
908
1055
  }
1056
+ /** Get all pending/open orders via WebSocket. */
1057
+ async getOrders() {
1058
+ return getOrders(this._ctx);
1059
+ }
1060
+ /** Cancel a single pending order by its order chain ID. */
1061
+ async cancelOrder(orderChainId) {
1062
+ return cancelOrder(this._ctx, orderChainId);
1063
+ }
1064
+ /** Cancel all pending orders. */
1065
+ async cancelAllOrders() {
1066
+ return cancelAllOrders(this._ctx);
1067
+ }
909
1068
  /** Get account metrics including equity, balance, margin, and open P&L. */
910
1069
  async getAccountMetrics() {
911
1070
  return getAccountMetrics(this._ctx);
@@ -914,10 +1073,20 @@ var DxtradeClient = class {
914
1073
  async getPositions() {
915
1074
  return getPositions(this._ctx);
916
1075
  }
917
- /** Close a position. */
1076
+ /**
1077
+ * Close a position. Supports partial closes by specifying a quantity smaller than the full position size.
1078
+ */
918
1079
  async closePosition(position) {
919
1080
  return closePosition(this._ctx, position);
920
1081
  }
1082
+ /** Close all open positions with market orders. */
1083
+ async closeAllPositions() {
1084
+ return closeAllPositions(this._ctx);
1085
+ }
1086
+ /** Get position-level P&L metrics via WebSocket. */
1087
+ async getPositionMetrics() {
1088
+ return getPositionMetrics(this._ctx);
1089
+ }
921
1090
  /**
922
1091
  * Fetch trade journal entries for a date range.
923
1092
  * @param params.from - Start timestamp (Unix ms)
@@ -926,6 +1095,14 @@ var DxtradeClient = class {
926
1095
  async getTradeJournal(params) {
927
1096
  return getTradeJournal(this._ctx, params);
928
1097
  }
1098
+ /**
1099
+ * Fetch trade history for a date range.
1100
+ * @param params.from - Start timestamp (Unix ms)
1101
+ * @param params.to - End timestamp (Unix ms)
1102
+ */
1103
+ async getTradeHistory(params) {
1104
+ return getTradeHistory(this._ctx, params);
1105
+ }
929
1106
  /** Get all available instruments, optionally filtered by partial match (e.g. `{ type: "FOREX" }`). */
930
1107
  async getInstruments(params = {}) {
931
1108
  return getInstruments(this._ctx, params);