@danielgroen/dxtrade-api 1.0.25 → 1.0.26
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/README.md +2 -1
- package/dist/index.d.mts +124 -89
- package/dist/index.d.ts +124 -89
- package/dist/index.js +1063 -848
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1060 -848
- package/dist/index.mjs.map +1 -1
- package/llms.txt +2 -1
- package/package.json +2 -1
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/utils/ws-manager.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}`,\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 // Rate limiting\n RATE_LIMITED = \"RATE_LIMITED\",\n\n // WebSocket manager\n WS_MANAGER_ERROR = \"WS_MANAGER_ERROR\",\n STREAM_REQUIRES_CONNECT = \"STREAM_REQUIRES_CONNECT\",\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 OHLC_STREAM = \"OHLCStreamPresenter-0\",\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, authHeaders } 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 if (ctx.wsManager) {\n const body = await ctx.wsManager.waitFor<{ allMetrics: Account.Metrics }>(WS_MESSAGE.ACCOUNT_METRICS, timeout);\n return body.allMetrics;\n }\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 response = await retryRequest(\n {\n method: \"POST\",\n url: endpoints.tradeHistory(ctx.broker, params),\n headers: authHeaders(ctx.csrf!, Cookies.serialize(ctx.cookies)),\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\";\nimport { DxtradeError, ERROR } from \"@/constants\";\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) {\n throw new DxtradeError(ERROR.RATE_LIMITED, \"Rate limited (429). Too many requests — try again later.\");\n }\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 { EventEmitter } from \"events\";\nimport WebSocket from \"ws\";\nimport { parseWsData, shouldLog, debugLog } from \"./websocket\";\nimport type { WsPayload } from \"./websocket.types\";\n\nexport class WsManager extends EventEmitter {\n private _ws: WebSocket | null = null;\n private _cache: Map<string, unknown> = new Map();\n\n connect(wsUrl: string, cookieStr: string, debug: boolean | string = false): Promise<void> {\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(wsUrl, { headers: { Cookie: cookieStr } });\n\n ws.on(\"open\", () => {\n this._ws = ws;\n resolve();\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 const payload = msg as WsPayload;\n this._cache.set(payload.type, payload.body);\n this.emit(payload.type, payload.body);\n });\n\n ws.on(\"error\", (error) => {\n if (!this._ws) {\n return reject(error);\n }\n this.emit(\"error\", error);\n });\n\n ws.on(\"close\", () => {\n this._ws = null;\n this.emit(\"close\");\n });\n });\n }\n\n waitFor<T>(type: string, timeout = 30_000): Promise<T> {\n const cached = this._cache.get(type);\n if (cached !== undefined) {\n return Promise.resolve(cached as T);\n }\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.removeListener(type, onMessage);\n reject(new Error(`WsManager: timed out waiting for ${type}`));\n }, timeout);\n\n const onMessage = (body: T) => {\n clearTimeout(timer);\n resolve(body);\n };\n\n this.once(type, onMessage);\n });\n }\n\n getCached<T>(type: string): T | undefined {\n return this._cache.get(type) as T | undefined;\n }\n\n close(): void {\n if (this._ws) {\n this._ws.close();\n this._ws = null;\n }\n this._cache.clear();\n this.removeAllListeners();\n }\n\n get isConnected(): boolean {\n return this._ws !== null && this._ws.readyState === WebSocket.OPEN;\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 }, 200);\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 streamOHLC(\n ctx: ClientContext,\n params: OHLC.Params,\n callback: (bars: OHLC.Bar[]) => void,\n): Promise<() => void> {\n if (!ctx.wsManager) {\n ctx.throwError(\n ERROR.STREAM_REQUIRES_CONNECT,\n \"Streaming requires a persistent WebSocket. Use connect() instead of auth().\",\n );\n }\n\n const { symbol, resolution = 60, range = 432_000, maxBars = 3500, priceField = \"bid\" } = params;\n const subtopic = WS_MESSAGE.SUBTOPIC.OHLC_STREAM;\n const headers = authHeaders(ctx.csrf!, Cookies.serialize(ctx.cookies));\n const snapshotBars: OHLC.Bar[] = [];\n let snapshotDone = false;\n let resolveSnapshot: (() => void) | null = null;\n\n const onChartFeed = (body: Record<string, unknown>) => {\n if (body?.subtopic !== subtopic) return;\n const data = body.data as OHLC.Bar[] | undefined;\n if (!Array.isArray(data)) return;\n\n if (!snapshotDone) {\n snapshotBars.push(...data);\n if (body.snapshotEnd) {\n snapshotDone = true;\n callback([...snapshotBars]);\n resolveSnapshot?.();\n }\n } else {\n callback(data);\n }\n };\n\n ctx.wsManager.on(WS_MESSAGE.CHART_FEED_SUBTOPIC, onChartFeed);\n\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,\n symbol,\n },\n ],\n },\n headers,\n },\n ctx.retries,\n );\n } catch (error: unknown) {\n ctx.wsManager.removeListener(WS_MESSAGE.CHART_FEED_SUBTOPIC, onChartFeed);\n const message = error instanceof Error ? error.message : \"Unknown error\";\n ctx.throwError(ERROR.OHLC_ERROR, `OHLC stream subscription error: ${message}`);\n }\n\n await new Promise<void>((resolve, reject) => {\n if (snapshotDone) return resolve();\n\n const timer = setTimeout(() => {\n if (snapshotBars.length > 0) {\n snapshotDone = true;\n callback([...snapshotBars]);\n resolve();\n } else {\n ctx.wsManager?.removeListener(WS_MESSAGE.CHART_FEED_SUBTOPIC, onChartFeed);\n reject(new DxtradeError(ERROR.OHLC_TIMEOUT, \"OHLC stream snapshot timed out\"));\n }\n }, 30_000);\n\n resolveSnapshot = () => {\n clearTimeout(timer);\n resolve();\n };\n });\n\n return () => {\n ctx.wsManager?.removeListener(WS_MESSAGE.CHART_FEED_SUBTOPIC, onChartFeed);\n };\n}\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 if (ctx.wsManager) {\n return ctx.wsManager.waitFor<Order.Get[]>(WS_MESSAGE.ORDERS, timeout);\n }\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 }, 200);\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\nfunction mergePositionsWithMetrics(positions: Position.Get[], metrics: Position.Metrics[]): Position.Full[] {\n const metricsMap = new Map(metrics.map((m) => [m.uid, m]));\n return positions.map((pos) => {\n const m = metricsMap.get(pos.uid);\n return {\n ...pos,\n margin: m?.margin ?? 0,\n plOpen: m?.plOpen ?? 0,\n plClosed: m?.plClosed ?? 0,\n totalCommissions: m?.totalCommissions ?? 0,\n totalFinancing: m?.totalFinancing ?? 0,\n plRate: m?.plRate ?? 0,\n averagePrice: m?.averagePrice ?? 0,\n marketValue: m?.marketValue ?? 0,\n };\n });\n}\n\nexport function streamPositions(ctx: ClientContext, callback: (positions: Position.Full[]) => void): () => void {\n if (!ctx.wsManager) {\n ctx.throwError(\n ERROR.STREAM_REQUIRES_CONNECT,\n \"Streaming requires a persistent WebSocket. Use connect() instead of auth().\",\n );\n }\n\n const emit = () => {\n const positions = ctx.wsManager!.getCached<Position.Get[]>(WS_MESSAGE.POSITIONS);\n const metrics = ctx.wsManager!.getCached<Position.Metrics[]>(WS_MESSAGE.POSITION_METRICS);\n if (positions && metrics) {\n callback(mergePositionsWithMetrics(positions, metrics));\n }\n };\n\n const onPositions = () => emit();\n const onMetrics = () => emit();\n\n ctx.wsManager.on(WS_MESSAGE.POSITIONS, onPositions);\n ctx.wsManager.on(WS_MESSAGE.POSITION_METRICS, onMetrics);\n\n emit();\n\n return () => {\n ctx.wsManager?.removeListener(WS_MESSAGE.POSITIONS, onPositions);\n ctx.wsManager?.removeListener(WS_MESSAGE.POSITION_METRICS, onMetrics);\n };\n}\n\nexport async function getPositions(ctx: ClientContext): Promise<Position.Full[]> {\n ctx.ensureSession();\n\n if (ctx.wsManager) {\n const [positions, metrics] = await Promise.all([\n ctx.wsManager.waitFor<Position.Get[]>(WS_MESSAGE.POSITIONS),\n ctx.wsManager.waitFor<Position.Metrics[]>(WS_MESSAGE.POSITION_METRICS),\n ]);\n return mergePositionsWithMetrics(positions, metrics);\n }\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 let positions: Position.Get[] | null = null;\n let metrics: Position.Metrics[] | null = null;\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 positions = msg.body as Position.Get[];\n }\n if (msg.type === WS_MESSAGE.POSITION_METRICS) {\n metrics = msg.body as Position.Metrics[];\n }\n if (positions && metrics) {\n clearTimeout(timer);\n ws.close();\n resolve(mergePositionsWithMetrics(positions, metrics));\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 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 WsManager,\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 auth(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\nexport async function connect(ctx: ClientContext): Promise<void> {\n await auth(ctx);\n\n const wsManager = new WsManager();\n const wsUrl = endpoints.websocket(ctx.broker, ctx.atmosphereId);\n const cookieStr = Cookies.serialize(ctx.cookies);\n await wsManager.connect(wsUrl, cookieStr, ctx.debug);\n ctx.wsManager = wsManager;\n}\n\nexport function disconnect(ctx: ClientContext): void {\n if (ctx.wsManager) {\n ctx.wsManager.close();\n ctx.wsManager = null;\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 auth,\n connect,\n disconnect,\n getAccountMetrics,\n getTradeHistory,\n getPositions,\n closePosition,\n closeAllPositions,\n streamPositions,\n getAssessments,\n getInstruments,\n getSymbolLimits,\n getSymbolSuggestions,\n getOHLC,\n streamOHLC,\n getSymbolInfo,\n getOrders,\n cancelOrder,\n cancelAllOrders,\n submitOrder,\n getTradeJournal,\n} from \"@/domains\";\n\nclass PositionsDomain {\n constructor(private _ctx: ClientContext) {}\n\n /** Get all open positions with P&L metrics merged. */\n get(): Promise<Position.Full[]> {\n return getPositions(this._ctx);\n }\n\n /** Close a position. Supports partial closes by specifying a quantity smaller than the full position size. */\n close(params: Position.Close): Promise<void> {\n return closePosition(this._ctx, params);\n }\n\n /** Close all open positions with market orders. */\n closeAll(): Promise<void> {\n return closeAllPositions(this._ctx);\n }\n\n /** Stream real-time position updates with P&L metrics. Requires connect(). Returns unsubscribe function. */\n stream(callback: (positions: Position.Full[]) => void): () => void {\n return streamPositions(this._ctx, callback);\n }\n}\n\nclass OrdersDomain {\n constructor(private _ctx: ClientContext) {}\n\n /** Get all pending/open orders via WebSocket. */\n get(): Promise<Order.Get[]> {\n return getOrders(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 submit(params: Order.SubmitParams): Promise<Order.Update> {\n return submitOrder(this._ctx, params);\n }\n\n /** Cancel a single pending order by its order chain ID. */\n cancel(orderChainId: number): Promise<void> {\n return cancelOrder(this._ctx, orderChainId);\n }\n\n /** Cancel all pending orders. */\n cancelAll(): Promise<void> {\n return cancelAllOrders(this._ctx);\n }\n}\n\nclass AccountDomain {\n constructor(private _ctx: ClientContext) {}\n\n /** Get account metrics including equity, balance, margin, and open P&L. */\n metrics(): Promise<Account.Metrics> {\n return getAccountMetrics(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 tradeJournal(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 tradeHistory(params: { from: number; to: number }): Promise<Account.TradeHistory[]> {\n return getTradeHistory(this._ctx, params);\n }\n}\n\nclass SymbolsDomain {\n constructor(private _ctx: ClientContext) {}\n\n /** Search for symbols matching the given text (e.g. \"EURUSD\", \"BTC\"). */\n search(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 info(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 limits(): Promise<Symbol.Limits[]> {\n return getSymbolLimits(this._ctx);\n }\n}\n\nclass InstrumentsDomain {\n constructor(private _ctx: ClientContext) {}\n\n /** Get all available instruments, optionally filtered by partial match (e.g. `{ type: \"FOREX\" }`). */\n get(params: Partial<Instrument.Info> = {}): Promise<Instrument.Info[]> {\n return getInstruments(this._ctx, params);\n }\n}\n\nclass OhlcDomain {\n constructor(private _ctx: ClientContext) {}\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 get(params: OHLC.Params): Promise<OHLC.Bar[]> {\n return getOHLC(this._ctx, params);\n }\n\n /** Stream real-time OHLC bar updates. Requires connect(). Returns unsubscribe function. */\n stream(params: OHLC.Params, callback: (bars: OHLC.Bar[]) => void): Promise<() => void> {\n return streamOHLC(this._ctx, params, callback);\n }\n}\n\nclass AssessmentsDomain {\n constructor(private _ctx: ClientContext) {}\n\n /** Fetch PnL assessments for an instrument within a date range. */\n get(params: Assessments.Params): Promise<Assessments.Response> {\n return getAssessments(this._ctx, params);\n }\n}\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 /** Position operations: get, close, metrics, streaming. */\n public readonly positions: PositionsDomain;\n /** Order operations: get, submit, cancel. */\n public readonly orders: OrdersDomain;\n /** Account operations: metrics, trade journal, trade history. */\n public readonly account: AccountDomain;\n /** Symbol operations: search, info, limits. */\n public readonly symbols: SymbolsDomain;\n /** Instrument operations: get (with optional filtering). */\n public readonly instruments: InstrumentsDomain;\n /** OHLC price bar operations: get, stream. */\n public readonly ohlc: OhlcDomain;\n /** PnL assessment operations: get. */\n public readonly assessments: AssessmentsDomain;\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 wsManager: 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(ERROR.NO_SESSION, \"No active session. Call auth() or connect() first.\");\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 this.positions = new PositionsDomain(this._ctx);\n this.orders = new OrdersDomain(this._ctx);\n this.account = new AccountDomain(this._ctx);\n this.symbols = new SymbolsDomain(this._ctx);\n this.instruments = new InstrumentsDomain(this._ctx);\n this.ohlc = new OhlcDomain(this._ctx);\n this.assessments = new AssessmentsDomain(this._ctx);\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 /** Authenticate and establish a session: login, fetch CSRF, WebSocket handshake, and optional account switch. */\n public async auth(): Promise<void> {\n return auth(this._ctx);\n }\n\n /** Connect to the broker with a persistent WebSocket: auth + persistent WS for data reuse and streaming. */\n public async connect(): Promise<void> {\n return connect(this._ctx);\n }\n\n /** Close the persistent WebSocket connection. */\n public disconnect(): void {\n return disconnect(this._ctx);\n }\n}\n"],"mappings":"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","names":["ORDER_TYPE","SIDE","ACTION","TIF","ERROR","WS_MESSAGE","SUBTOPIC","import_ws","axios","WebSocket","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/utils/ws-manager.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}`,\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_NOT_FOUND = \"POSITION_NOT_FOUND\",\n POSITION_CLOSE_ERROR = \"POSITION_CLOSE_ERROR\",\n POSITION_CLOSE_TIMEOUT = \"POSITION_CLOSE_TIMEOUT\",\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 // Rate limiting\n RATE_LIMITED = \"RATE_LIMITED\",\n\n // WebSocket manager\n WS_MANAGER_ERROR = \"WS_MANAGER_ERROR\",\n STREAM_REQUIRES_CONNECT = \"STREAM_REQUIRES_CONNECT\",\n}\n\nexport enum MESSAGE_CATEGORY {\n TRADE_LOG = \"TRADE_LOG\",\n NOTIFICATION = \"NOTIFICATION\",\n}\n\nexport enum MESSAGE_TYPE {\n ORDER = \"ORDER\",\n INSTRUMENT_ACTIVATED = \"INSTRUMENT_ACTIVATED\",\n}\n\nexport enum ORDER_STATUS {\n PLACED = \"PLACED\",\n FILLED = \"FILLED\",\n REJECTED = \"REJECTED\",\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 OHLC_STREAM = \"OHLCStreamPresenter-0\",\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 {\n Cookies,\n parseWsData,\n shouldLog,\n debugLog,\n retryRequest,\n baseHeaders,\n authHeaders,\n checkWsRateLimit,\n} from \"@/utils\";\nimport type { ClientContext } from \"@/client.types\";\nimport type { Account } from \".\";\n\nexport class AccountDomain {\n constructor(private _ctx: ClientContext) {}\n\n /** Get account metrics including equity, balance, margin, and open P&L. */\n async metrics(timeout = 30_000): Promise<Account.Metrics> {\n this._ctx.ensureSession();\n\n if (this._ctx.wsManager) {\n const body = await this._ctx.wsManager.waitFor<{ allMetrics: Account.Metrics }>(\n WS_MESSAGE.ACCOUNT_METRICS,\n timeout,\n );\n return body.allMetrics;\n }\n\n const wsUrl = endpoints.websocket(this._ctx.broker, this._ctx.atmosphereId);\n const cookieStr = Cookies.serialize(this._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, this._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 checkWsRateLimit(error);\n reject(new DxtradeError(ERROR.ACCOUNT_METRICS_ERROR, `Account metrics error: ${error.message}`));\n });\n });\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 async tradeHistory(params: { from: number; to: number }): Promise<Account.TradeHistory[]> {\n this._ctx.ensureSession();\n\n try {\n const response = await retryRequest(\n {\n method: \"POST\",\n url: endpoints.tradeHistory(this._ctx.broker, params),\n headers: authHeaders(this._ctx.csrf!, Cookies.serialize(this._ctx.cookies)),\n },\n this._ctx.retries,\n );\n\n if (response.status === 200) {\n const setCookies = response.headers[\"set-cookie\"] ?? [];\n const incoming = Cookies.parse(setCookies);\n this._ctx.cookies = Cookies.merge(this._ctx.cookies, incoming);\n return response.data as Account.TradeHistory[];\n } else {\n this._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 this._ctx.throwError(ERROR.TRADE_HISTORY_ERROR, `Trade history error: ${message}`);\n }\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 async tradeJournal(params: { from: number; to: number }): Promise<any> {\n this._ctx.ensureSession();\n\n try {\n const cookieStr = Cookies.serialize(this._ctx.cookies);\n\n const response = await retryRequest(\n {\n method: \"GET\",\n url: endpoints.tradeJournal(this._ctx.broker, params),\n headers: { ...baseHeaders(), Cookie: cookieStr },\n },\n this._ctx.retries,\n );\n\n if (response.status === 200) {\n const setCookies = response.headers[\"set-cookie\"] ?? [];\n const incoming = Cookies.parse(setCookies);\n this._ctx.cookies = Cookies.merge(this._ctx.cookies, incoming);\n return response.data;\n } else {\n this._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 this._ctx.throwError(ERROR.TRADE_JOURNAL_ERROR, `Trade journal error: ${message}`);\n }\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: \"*/*\",\n \"Accept-Language\": \"en-US,en;q=0.9\",\n \"Accept-Encoding\": \"gzip, deflate, br, zstd\",\n \"User-Agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:147.0) Gecko/20100101 Firefox/147.0\",\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\";\nimport { DxtradeError, ERROR } from \"@/constants\";\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\n if (isAxiosError(error) && error.response?.status === 429) {\n if (attempt === retries) {\n throw new DxtradeError(ERROR.RATE_LIMITED, \"Rate limited (429). Too many requests — try again later.\");\n }\n await new Promise((res) => setTimeout(res, 3000 * attempt));\n continue;\n }\n\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 { DxtradeError, ERROR } from \"@/constants\";\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\n/** Check if a WebSocket error is a 429 rate limit. If so, throw a RATE_LIMITED DxtradeError. */\nexport function checkWsRateLimit(error: Error): void {\n if (error.message.includes(\"429\")) {\n throw new DxtradeError(ERROR.RATE_LIMITED, \"Rate limited (429). Too many requests — try again later.\");\n }\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 { EventEmitter } from \"events\";\nimport WebSocket from \"ws\";\nimport { parseWsData, shouldLog, debugLog, checkWsRateLimit } from \"./websocket\";\nimport type { WsPayload } from \"./websocket.types\";\n\nexport class WsManager extends EventEmitter {\n private _ws: WebSocket | null = null;\n private _cache: Map<string, unknown> = new Map();\n\n connect(wsUrl: string, cookieStr: string, debug: boolean | string = false): Promise<void> {\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(wsUrl, { headers: { Cookie: cookieStr } });\n\n ws.on(\"open\", () => {\n this._ws = ws;\n resolve();\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 const payload = msg as WsPayload;\n this._cache.set(payload.type, payload.body);\n this.emit(payload.type, payload.body);\n });\n\n ws.on(\"error\", (error) => {\n checkWsRateLimit(error);\n const err = new Error(`WebSocket manager error: ${error.message}`);\n if (!this._ws) {\n return reject(err);\n }\n this.emit(\"error\", err);\n });\n\n ws.on(\"close\", () => {\n this._ws = null;\n this.emit(\"close\");\n });\n });\n }\n\n waitFor<T>(type: string, timeout = 30_000): Promise<T> {\n const cached = this._cache.get(type);\n if (cached !== undefined) {\n return Promise.resolve(cached as T);\n }\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.removeListener(type, onMessage);\n reject(new Error(`WsManager: timed out waiting for ${type}`));\n }, timeout);\n\n const onMessage = (body: T) => {\n clearTimeout(timer);\n resolve(body);\n };\n\n this.once(type, onMessage);\n });\n }\n\n getCached<T>(type: string): T | undefined {\n return this._cache.get(type) as T | undefined;\n }\n\n close(): void {\n if (this._ws) {\n this._ws.close();\n this._ws = null;\n }\n this._cache.clear();\n this.removeAllListeners();\n }\n\n get isConnected(): boolean {\n return this._ws !== null && this._ws.readyState === WebSocket.OPEN;\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 class AssessmentsDomain {\n constructor(private _ctx: ClientContext) {}\n\n /** Fetch PnL assessments for an instrument within a date range. */\n async get(params: Assessments.Params): Promise<Assessments.Response> {\n this._ctx.ensureSession();\n\n try {\n const response = await retryRequest(\n {\n method: \"POST\",\n url: endpoints.assessments(this._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(this._ctx.csrf!, Cookies.serialize(this._ctx.cookies)),\n },\n this._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 this._ctx.throwError(ERROR.ASSESSMENTS_ERROR, `Error fetching assessments: ${message}`);\n }\n }\n}\n","import WebSocket from \"ws\";\nimport { endpoints, DxtradeError, WS_MESSAGE, ERROR } from \"@/constants\";\nimport { Cookies, parseWsData, shouldLog, debugLog, checkWsRateLimit } from \"@/utils\";\nimport type { ClientContext } from \"@/client.types\";\nimport type { Instrument } from \".\";\n\nexport class InstrumentsDomain {\n constructor(private _ctx: ClientContext) {}\n\n /** Get all available instruments, optionally filtered by partial match (e.g. `{ type: \"FOREX\" }`). */\n async get(params: Partial<Instrument.Info> = {}, timeout = 30_000): Promise<Instrument.Info[]> {\n this._ctx.ensureSession();\n\n const wsUrl = endpoints.websocket(this._ctx.broker, this._ctx.atmosphereId);\n const cookieStr = Cookies.serialize(this._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, this._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 }, 200);\n }\n });\n\n ws.on(\"error\", (error) => {\n clearTimeout(timer);\n ws.close();\n checkWsRateLimit(error);\n reject(new DxtradeError(ERROR.INSTRUMENTS_ERROR, `Instruments error: ${error.message}`));\n });\n });\n }\n}\n","import WebSocket from \"ws\";\nimport { endpoints, DxtradeError, WS_MESSAGE, ERROR } from \"@/constants\";\nimport { Cookies, authHeaders, retryRequest, parseWsData, shouldLog, debugLog, checkWsRateLimit } from \"@/utils\";\nimport type { ClientContext } from \"@/client.types\";\nimport type { OHLC } from \".\";\n\nexport class OhlcDomain {\n constructor(private _ctx: ClientContext) {}\n\n /** Stream real-time OHLC bar updates. Requires connect(). Returns unsubscribe function. */\n async stream(params: OHLC.Params, callback: (bars: OHLC.Bar[]) => void): Promise<() => void> {\n if (!this._ctx.wsManager) {\n this._ctx.throwError(\n ERROR.STREAM_REQUIRES_CONNECT,\n \"Streaming requires a persistent WebSocket. Use connect() instead of auth().\",\n );\n }\n\n const { symbol, resolution = 60, range = 432_000, maxBars = 3500, priceField = \"bid\" } = params;\n const subtopic = WS_MESSAGE.SUBTOPIC.OHLC_STREAM;\n const headers = authHeaders(this._ctx.csrf!, Cookies.serialize(this._ctx.cookies));\n const snapshotBars: OHLC.Bar[] = [];\n let snapshotDone = false;\n let resolveSnapshot: (() => void) | null = null;\n\n const onChartFeed = (body: Record<string, unknown>) => {\n if (body?.subtopic !== subtopic) return;\n const data = body.data as OHLC.Bar[] | undefined;\n if (!Array.isArray(data)) return;\n\n if (!snapshotDone) {\n snapshotBars.push(...data);\n if (body.snapshotEnd) {\n snapshotDone = true;\n callback([...snapshotBars]);\n resolveSnapshot?.();\n }\n } else {\n callback(data);\n }\n };\n\n this._ctx.wsManager.on(WS_MESSAGE.CHART_FEED_SUBTOPIC, onChartFeed);\n\n try {\n await retryRequest(\n {\n method: \"PUT\",\n url: endpoints.subscribeInstruments(this._ctx.broker),\n data: { instruments: [symbol] },\n headers,\n },\n this._ctx.retries,\n );\n await retryRequest(\n {\n method: \"PUT\",\n url: endpoints.charts(this._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,\n symbol,\n },\n ],\n },\n headers,\n },\n this._ctx.retries,\n );\n } catch (error: unknown) {\n this._ctx.wsManager.removeListener(WS_MESSAGE.CHART_FEED_SUBTOPIC, onChartFeed);\n const message = error instanceof Error ? error.message : \"Unknown error\";\n this._ctx.throwError(ERROR.OHLC_ERROR, `OHLC stream subscription error: ${message}`);\n }\n\n await new Promise<void>((resolve, reject) => {\n if (snapshotDone) return resolve();\n\n const timer = setTimeout(() => {\n if (snapshotBars.length > 0) {\n snapshotDone = true;\n callback([...snapshotBars]);\n resolve();\n } else {\n this._ctx.wsManager?.removeListener(WS_MESSAGE.CHART_FEED_SUBTOPIC, onChartFeed);\n reject(new DxtradeError(ERROR.OHLC_TIMEOUT, \"OHLC stream snapshot timed out\"));\n }\n }, 30_000);\n\n resolveSnapshot = () => {\n clearTimeout(timer);\n resolve();\n };\n });\n\n return () => {\n this._ctx.wsManager?.removeListener(WS_MESSAGE.CHART_FEED_SUBTOPIC, onChartFeed);\n };\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 async get(params: OHLC.Params, timeout = 30_000): Promise<OHLC.Bar[]> {\n this._ctx.ensureSession();\n\n const { symbol, resolution = 60, range = 432_000, maxBars = 3500, priceField = \"bid\" } = params;\n const wsUrl = endpoints.websocket(this._ctx.broker, this._ctx.atmosphereId);\n const cookieStr = Cookies.serialize(this._ctx.cookies);\n const headers = authHeaders(this._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 const sendPuts = async () => {\n putsSent = true;\n try {\n await retryRequest(\n {\n method: \"PUT\",\n url: endpoints.subscribeInstruments(this._ctx.broker),\n data: { instruments: [symbol] },\n headers,\n },\n this._ctx.retries,\n );\n await retryRequest(\n {\n method: \"PUT\",\n url: endpoints.charts(this._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 this._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, this._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 checkWsRateLimit(error);\n reject(new DxtradeError(ERROR.OHLC_ERROR, `OHLC WebSocket error: ${error.message}`));\n });\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, MESSAGE_CATEGORY, MESSAGE_TYPE, ORDER_STATUS } from \"@/constants/enums\";\nimport { Cookies, authHeaders, retryRequest, parseWsData, shouldLog, debugLog, checkWsRateLimit } from \"@/utils\";\nimport type { ClientContext } from \"@/client.types\";\nimport { SymbolsDomain } 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) =>\n m.messageCategory === MESSAGE_CATEGORY.TRADE_LOG &&\n m.messageType === MESSAGE_TYPE.ORDER &&\n !m.historyMessage,\n );\n if (!orderMsg) return;\n\n const params = orderMsg.parametersTO as Message.OrderParams;\n if (params.orderStatus === ORDER_STATUS.REJECTED) {\n const reason = params.rejectReason?.key ?? \"Unknown reason\";\n done(new Error(`[dxtrade-api] Order rejected: ${reason}`));\n } else if (params.orderStatus === ORDER_STATUS.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 positionCode: params.positionCode,\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 === ORDER_STATUS.REJECTED) {\n done(new Error(`[dxtrade-api] Order rejected: ${body.statusDescription ?? \"Unknown reason\"}`));\n } else if (body.status === ORDER_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 checkWsRateLimit(error);\n reject(new DxtradeError(ERROR.ORDER_ERROR, `WebSocket order listener error: ${error.message}`));\n });\n });\n\n return { promise, ready };\n}\n\nfunction createWsManagerOrderListener(ctx: ClientContext, timeout = 30_000): Promise<Order.Update> {\n return new Promise((resolve, reject) => {\n let settled = false;\n\n const timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n cleanup();\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 cleanup();\n if (err) reject(err);\n else resolve(result!);\n }\n\n function onMessage(body: unknown) {\n const messages = body as Message.Entry[];\n const orderMsg = messages?.findLast?.(\n (m) =>\n m.messageCategory === MESSAGE_CATEGORY.TRADE_LOG && m.messageType === MESSAGE_TYPE.ORDER && !m.historyMessage,\n );\n if (!orderMsg) return;\n\n const params = orderMsg.parametersTO as Message.OrderParams;\n if (params.orderStatus === ORDER_STATUS.REJECTED) {\n const reason = params.rejectReason?.key ?? \"Unknown reason\";\n done(new Error(`[dxtrade-api] Order rejected: ${reason}`));\n } else if (params.orderStatus === ORDER_STATUS.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 positionCode: params.positionCode,\n });\n }\n }\n\n function onOrders(body: unknown) {\n const order = (body as Order.Update[])?.[0];\n if (!order?.orderId) return;\n\n if (order.status === ORDER_STATUS.REJECTED) {\n done(new Error(`[dxtrade-api] Order rejected: ${order.statusDescription ?? \"Unknown reason\"}`));\n } else if (order.status === ORDER_STATUS.FILLED) {\n done(null, order);\n }\n }\n\n function cleanup() {\n ctx.wsManager?.removeListener(WS_MESSAGE.MESSAGE, onMessage);\n ctx.wsManager?.removeListener(WS_MESSAGE.ORDERS, onOrders);\n }\n\n ctx.wsManager!.on(WS_MESSAGE.MESSAGE, onMessage);\n ctx.wsManager!.on(WS_MESSAGE.ORDERS, onOrders);\n });\n}\n\nexport class OrdersDomain {\n constructor(private _ctx: ClientContext) {}\n\n /** Get all pending/open orders via WebSocket. */\n async get(timeout = 30_000): Promise<Order.Get[]> {\n this._ctx.ensureSession();\n\n if (this._ctx.wsManager) {\n return this._ctx.wsManager.waitFor<Order.Get[]>(WS_MESSAGE.ORDERS, timeout);\n }\n\n const wsUrl = endpoints.websocket(this._ctx.broker, this._ctx.atmosphereId);\n const cookieStr = Cookies.serialize(this._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, this._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 checkWsRateLimit(error);\n reject(new DxtradeError(ERROR.ORDERS_ERROR, `Orders error: ${error.message}`));\n });\n });\n }\n\n /** Cancel a single pending order by its order chain ID. */\n async cancel(orderChainId: number): Promise<void> {\n this._ctx.ensureSession();\n\n const accountId = this._ctx.accountId ?? this._ctx.config.accountId;\n if (!accountId) {\n this._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(this._ctx.broker, accountId, orderChainId),\n headers: authHeaders(this._ctx.csrf!, Cookies.serialize(this._ctx.cookies)),\n },\n this._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 this._ctx.throwError(ERROR.CANCEL_ORDER_ERROR, `Cancel order error: ${message}`);\n }\n }\n\n /** Cancel all pending orders. */\n async cancelAll(): Promise<void> {\n const orders = await this.get();\n const pending = orders.filter((o) => !o.finalStatus);\n\n for (const order of pending) {\n await this.cancel(order.orderId);\n }\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 async submit(params: Order.SubmitParams): Promise<Order.Update> {\n this._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 new SymbolsDomain(this._ctx).info(symbol);\n const units = 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) {\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 // Set up listener BEFORE submitting so we don't miss the response\n let listenerPromise: Promise<Order.Update>;\n\n if (this._ctx.wsManager) {\n listenerPromise = createWsManagerOrderListener(this._ctx, 30_000);\n } else {\n const wsUrl = endpoints.websocket(this._ctx.broker, this._ctx.atmosphereId);\n const cookieStr = Cookies.serialize(this._ctx.cookies);\n const listener = createOrderListener(wsUrl, cookieStr, 30_000, this._ctx.debug);\n await listener.ready;\n listenerPromise = listener.promise;\n }\n\n const response = await retryRequest(\n {\n method: \"POST\",\n url: endpoints.submitOrder(this._ctx.broker),\n data: orderData,\n headers: authHeaders(this._ctx.csrf!, Cookies.serialize(this._ctx.cookies)),\n },\n this._ctx.retries,\n );\n\n this._ctx.callbacks.onOrderPlaced?.(response.data as Order.Response);\n\n const orderUpdate = await listenerPromise;\n\n this._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 this._ctx.throwError(ERROR.ORDER_ERROR, `Error submitting order: ${message}`);\n }\n }\n}\n","import WebSocket from \"ws\";\nimport { endpoints, DxtradeError, WS_MESSAGE, ERROR } from \"@/constants\";\nimport { Cookies, baseHeaders, retryRequest, parseWsData, shouldLog, debugLog, checkWsRateLimit } from \"@/utils\";\nimport type { ClientContext } from \"@/client.types\";\nimport type { Symbol } from \".\";\n\nexport class SymbolsDomain {\n constructor(private _ctx: ClientContext) {}\n\n /** Search for symbols matching the given text (e.g. \"EURUSD\", \"BTC\"). */\n async search(text: string): Promise<Symbol.Suggestion[]> {\n this._ctx.ensureSession();\n\n try {\n const cookieStr = Cookies.serialize(this._ctx.cookies);\n const response = await retryRequest(\n {\n method: \"GET\",\n url: endpoints.suggest(this._ctx.broker, text),\n headers: { ...baseHeaders(), Cookie: cookieStr },\n },\n this._ctx.retries,\n );\n\n const suggests = response.data?.suggests;\n if (!suggests?.length) {\n this._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 this._ctx.throwError(ERROR.SUGGEST_ERROR, `Error getting symbol suggestions: ${message}`);\n }\n }\n\n /** Get detailed instrument info for a symbol, including volume limits and lot size. */\n async info(symbol: string): Promise<Symbol.Info> {\n this._ctx.ensureSession();\n\n try {\n const offsetMinutes = Math.abs(new Date().getTimezoneOffset());\n const cookieStr = Cookies.serialize(this._ctx.cookies);\n const response = await retryRequest(\n {\n method: \"GET\",\n url: endpoints.instrumentInfo(this._ctx.broker, symbol, offsetMinutes),\n headers: { ...baseHeaders(), Cookie: cookieStr },\n },\n this._ctx.retries,\n );\n\n if (!response.data) {\n this._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 this._ctx.throwError(ERROR.SYMBOL_INFO_ERROR, `Error getting symbol info: ${message}`);\n }\n }\n\n /** Get order size limits and stop/limit distances for all symbols. */\n async limits(timeout = 30_000): Promise<Symbol.Limits[]> {\n this._ctx.ensureSession();\n\n const wsUrl = endpoints.websocket(this._ctx.broker, this._ctx.atmosphereId);\n const cookieStr = Cookies.serialize(this._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, this._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 }, 200);\n }\n });\n\n ws.on(\"error\", (error) => {\n clearTimeout(timer);\n ws.close();\n checkWsRateLimit(error);\n reject(new DxtradeError(ERROR.LIMITS_ERROR, `Symbol limits error: ${error.message}`));\n });\n });\n }\n}\n","import WebSocket from \"ws\";\nimport { WS_MESSAGE, ERROR, endpoints, DxtradeError, MESSAGE_CATEGORY, MESSAGE_TYPE, ORDER_STATUS } from \"@/constants\";\nimport { Cookies, parseWsData, shouldLog, debugLog, retryRequest, authHeaders, checkWsRateLimit } from \"@/utils\";\nimport type { ClientContext } from \"@/client.types\";\nimport type { Position } from \".\";\nimport type { Message } from \"../order\";\n\nfunction mergePositionsWithMetrics(positions: Position.Get[], metrics: Position.Metrics[]): Position.Full[] {\n const metricsMap = new Map(metrics.map((m) => [m.uid, m]));\n return positions.map((pos) => {\n const m = metricsMap.get(pos.uid);\n return {\n ...pos,\n margin: m?.margin ?? 0,\n plOpen: m?.plOpen ?? 0,\n plClosed: m?.plClosed ?? 0,\n totalCommissions: m?.totalCommissions ?? 0,\n totalFinancing: m?.totalFinancing ?? 0,\n plRate: m?.plRate ?? 0,\n averagePrice: m?.averagePrice ?? 0,\n marketValue: m?.marketValue ?? 0,\n };\n });\n}\n\nexport class PositionsDomain {\n constructor(private _ctx: ClientContext) {}\n\n /** Stream real-time position updates with P&L metrics. Requires connect(). Returns unsubscribe function. */\n stream(callback: (positions: Position.Full[]) => void): () => void {\n if (!this._ctx.wsManager) {\n this._ctx.throwError(\n ERROR.STREAM_REQUIRES_CONNECT,\n \"Streaming requires a persistent WebSocket. Use connect() instead of auth().\",\n );\n }\n\n const emit = () => {\n const positions = this._ctx.wsManager!.getCached<Position.Get[]>(WS_MESSAGE.POSITIONS);\n const metrics = this._ctx.wsManager!.getCached<Position.Metrics[]>(WS_MESSAGE.POSITION_METRICS);\n if (positions && metrics) {\n callback(mergePositionsWithMetrics(positions, metrics));\n }\n };\n\n const onPositions = () => emit();\n const onMetrics = () => emit();\n\n this._ctx.wsManager.on(WS_MESSAGE.POSITIONS, onPositions);\n this._ctx.wsManager.on(WS_MESSAGE.POSITION_METRICS, onMetrics);\n\n emit();\n\n return () => {\n this._ctx.wsManager?.removeListener(WS_MESSAGE.POSITIONS, onPositions);\n this._ctx.wsManager?.removeListener(WS_MESSAGE.POSITION_METRICS, onMetrics);\n };\n }\n\n /** Get all open positions with P&L metrics merged. */\n async get(): Promise<Position.Full[]> {\n this._ctx.ensureSession();\n\n if (this._ctx.wsManager) {\n const [positions, metrics] = await Promise.all([\n this._ctx.wsManager.waitFor<Position.Get[]>(WS_MESSAGE.POSITIONS),\n this._ctx.wsManager.waitFor<Position.Metrics[]>(WS_MESSAGE.POSITION_METRICS),\n ]);\n return mergePositionsWithMetrics(positions, metrics);\n }\n\n const wsUrl = endpoints.websocket(this._ctx.broker, this._ctx.atmosphereId);\n const cookieStr = Cookies.serialize(this._ctx.cookies);\n\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(wsUrl, { headers: { Cookie: cookieStr } });\n let positions: Position.Get[] | null = null;\n let metrics: Position.Metrics[] | null = null;\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, this._ctx.debug)) debugLog(msg);\n\n if (typeof msg === \"string\") return;\n if (msg.type === WS_MESSAGE.POSITIONS) {\n positions = msg.body as Position.Get[];\n }\n if (msg.type === WS_MESSAGE.POSITION_METRICS) {\n metrics = msg.body as Position.Metrics[];\n }\n if (positions && metrics) {\n clearTimeout(timer);\n ws.close();\n resolve(mergePositionsWithMetrics(positions, metrics));\n }\n });\n\n ws.on(\"error\", (error) => {\n clearTimeout(timer);\n ws.close();\n checkWsRateLimit(error);\n reject(new DxtradeError(ERROR.ACCOUNT_POSITIONS_ERROR, `Account positions error: ${error.message}`));\n });\n });\n }\n\n /** Close all open positions with market orders. */\n async closeAll(): Promise<void> {\n const positions = await this.get();\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 this._sendCloseRequest(closeData);\n }\n }\n\n /** Close a position by its position code. Returns the position with P&L metrics. Optionally wait for close confirmation via `waitForClose: \"stream\" | \"poll\"`. */\n async close(positionCode: string, options?: Position.CloseOptions): Promise<Position.Full> {\n const positions = await this.get();\n const position = positions.find((p) => p.positionKey.positionCode === positionCode);\n\n if (!position) {\n this._ctx.throwError(ERROR.POSITION_NOT_FOUND, `Position with code \"${positionCode}\" not found`);\n }\n\n const closeData: Position.Close = {\n legs: [\n {\n instrumentId: position.positionKey.instrumentId,\n positionCode: position.positionKey.positionCode,\n positionEffect: \"CLOSING\",\n ratioQuantity: 1,\n symbol: position.positionKey.positionCode,\n },\n ],\n limitPrice: 0,\n orderType: \"MARKET\",\n quantity: -position.quantity,\n timeInForce: \"GTC\",\n };\n\n if (options?.waitForClose === \"stream\") {\n return this._waitForCloseStream(positionCode, position, closeData, options.timeout ?? 30_000);\n }\n\n await this._sendCloseRequest(closeData);\n\n if (options?.waitForClose === \"poll\") {\n return this._waitForClosePoll(positionCode, position, options.timeout ?? 30_000, options.pollInterval ?? 1_000);\n }\n\n return position;\n }\n\n private _waitForCloseStream(\n positionCode: string,\n lastSnapshot: Position.Full,\n closeData: Position.Close,\n timeout: number,\n ): Promise<Position.Full> {\n if (!this._ctx.wsManager) {\n this._ctx.throwError(\n ERROR.STREAM_REQUIRES_CONNECT,\n 'waitForClose: \"stream\" requires a persistent WebSocket. Use connect() instead of auth(), or use \"poll\" mode.',\n );\n }\n\n return new Promise(async (resolve, reject) => {\n let settled = false;\n const result = lastSnapshot;\n\n const timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(\n new DxtradeError(ERROR.POSITION_CLOSE_TIMEOUT, `Position close confirmation timed out after ${timeout}ms`),\n );\n }, timeout);\n\n function done(err: Error | null, res?: Position.Full) {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n cleanup();\n if (err) reject(err);\n else resolve(res!);\n }\n\n // Listen for close order FILLED via MESSAGE (trade log)\n function onMessage(body: unknown) {\n const messages = body as Message.Entry[];\n const orderMsg = messages?.findLast?.(\n (m) =>\n m.messageCategory === MESSAGE_CATEGORY.TRADE_LOG &&\n m.messageType === MESSAGE_TYPE.ORDER &&\n !m.historyMessage,\n );\n if (!orderMsg) return;\n\n const params = orderMsg.parametersTO as Message.OrderParams;\n if (params.positionCode !== positionCode) return;\n\n if (params.orderStatus === ORDER_STATUS.REJECTED) {\n done(\n new DxtradeError(\n ERROR.POSITION_CLOSE_ERROR,\n `Close order rejected: ${params.rejectReason?.key ?? \"Unknown reason\"}`,\n ),\n );\n } else if (params.orderStatus === ORDER_STATUS.FILLED) {\n done(null, result);\n }\n }\n\n // Listen for close order FILLED via ORDERS\n function onOrders(body: unknown) {\n const orders = body as {\n orderId: string;\n status: string;\n statusDescription?: string;\n [key: string]: unknown;\n }[];\n const order = orders?.[0];\n if (!order?.orderId) return;\n\n if (order.status === ORDER_STATUS.REJECTED) {\n done(\n new DxtradeError(\n ERROR.POSITION_CLOSE_ERROR,\n `Close order rejected: ${order.statusDescription ?? \"Unknown reason\"}`,\n ),\n );\n } else if (order.status === ORDER_STATUS.FILLED) {\n done(null, result);\n }\n }\n\n const wsManager = this._ctx.wsManager!;\n\n function cleanup() {\n wsManager.removeListener(WS_MESSAGE.MESSAGE, onMessage);\n wsManager.removeListener(WS_MESSAGE.ORDERS, onOrders);\n }\n\n // Subscribe BEFORE sending the close request to avoid race condition\n wsManager.on(WS_MESSAGE.MESSAGE, onMessage);\n wsManager.on(WS_MESSAGE.ORDERS, onOrders);\n\n try {\n await this._sendCloseRequest(closeData);\n } catch (error) {\n done(error instanceof Error ? error : new Error(String(error)));\n }\n });\n }\n\n private async _waitForClosePoll(\n positionCode: string,\n lastSnapshot: Position.Full,\n timeout: number,\n interval: number,\n ): Promise<Position.Full> {\n const deadline = Date.now() + timeout;\n let result = lastSnapshot;\n\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, interval));\n const positions = await this.get();\n const match = positions.find((p) => p.positionKey.positionCode === positionCode);\n if (match) {\n result = match;\n } else {\n return result;\n }\n }\n\n this._ctx.throwError(ERROR.POSITION_CLOSE_TIMEOUT, `Position close confirmation timed out after ${timeout}ms`);\n }\n\n private async _sendCloseRequest(data: Position.Close): Promise<void> {\n try {\n await retryRequest(\n {\n method: \"POST\",\n url: endpoints.closePosition(this._ctx.broker),\n data,\n headers: authHeaders(this._ctx.csrf!, Cookies.serialize(this._ctx.cookies)),\n },\n this._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 this._ctx.throwError(ERROR.POSITION_CLOSE_ERROR, `Position close error: ${message}`);\n }\n }\n}\n","import WebSocket from \"ws\";\nimport { endpoints, DxtradeError, ERROR } from \"@/constants\";\nimport {\n Cookies,\n WsManager,\n baseHeaders,\n authHeaders,\n cookieOnlyHeaders,\n retryRequest,\n clearDebugLog,\n parseAtmosphereId,\n parseWsData,\n shouldLog,\n debugLog,\n checkWsRateLimit,\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 checkWsRateLimit(error);\n reject(new Error(`[dxtrade-api] WebSocket handshake error: ${error.message}`));\n });\n });\n}\n\nexport class SessionDomain {\n constructor(private _ctx: ClientContext) {}\n\n /** Authenticate with the broker using username and password. */\n async login(): Promise<void> {\n try {\n const response = await retryRequest(\n {\n method: \"POST\",\n url: endpoints.login(this._ctx.broker),\n data: {\n username: this._ctx.config.username,\n password: this._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: this._ctx.config.broker,\n vendor: this._ctx.config.broker,\n\n // END TODO::\n },\n headers: {\n ...baseHeaders(),\n Origin: this._ctx.broker,\n Referer: this._ctx.broker + \"/\",\n Cookie: Cookies.serialize(this._ctx.cookies),\n },\n },\n this._ctx.retries,\n );\n\n if (response.status === 200) {\n const setCookies = response.headers[\"set-cookie\"] ?? [];\n const incoming = Cookies.parse(setCookies);\n this._ctx.cookies = Cookies.merge(this._ctx.cookies, incoming);\n this._ctx.callbacks.onLogin?.();\n } else {\n this._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 this._ctx.throwError(ERROR.LOGIN_ERROR, `Login error: ${message}`);\n }\n }\n\n /** Fetch the CSRF token required for authenticated requests. */\n async fetchCsrf(): Promise<void> {\n try {\n const cookieStr = Cookies.serialize(this._ctx.cookies);\n const response = await retryRequest(\n {\n method: \"GET\",\n url: this._ctx.broker,\n headers: { ...cookieOnlyHeaders(cookieStr), Referer: this._ctx.broker },\n },\n this._ctx.retries,\n );\n\n const setCookies = response.headers[\"set-cookie\"] ?? [];\n const incoming = Cookies.parse(setCookies);\n this._ctx.cookies = Cookies.merge(this._ctx.cookies, incoming);\n\n const csrfMatch = response.data?.match(/name=\"csrf\" content=\"([^\"]+)\"/);\n if (csrfMatch) {\n this._ctx.csrf = csrfMatch[1];\n } else {\n this._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 this._ctx.throwError(ERROR.CSRF_ERROR, `CSRF fetch error: ${message}`);\n }\n }\n\n /** Switch to a specific trading account by ID. */\n async switchAccount(accountId: string): Promise<void> {\n this._ctx.ensureSession();\n\n try {\n await retryRequest(\n {\n method: \"POST\",\n url: endpoints.switchAccount(this._ctx.broker, accountId),\n headers: authHeaders(this._ctx.csrf!, Cookies.serialize(this._ctx.cookies)),\n },\n this._ctx.retries,\n );\n this._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 this._ctx.throwError(ERROR.ACCOUNT_SWITCH_ERROR, `Error switching account: ${message}`);\n }\n }\n\n /** Hit the broker page to collect Cloudflare cookies before making API calls. */\n private async _preflight(): Promise<void> {\n try {\n const response = await retryRequest(\n {\n method: \"GET\",\n url: this._ctx.broker,\n headers: { ...baseHeaders(), Referer: this._ctx.broker },\n },\n this._ctx.retries,\n );\n const setCookies = response.headers[\"set-cookie\"] ?? [];\n const incoming = Cookies.parse(setCookies);\n this._ctx.cookies = Cookies.merge(this._ctx.cookies, incoming);\n } catch {\n // Non-fatal: continue with login even if preflight fails\n }\n }\n\n /** Authenticate and establish a session: login, fetch CSRF, WebSocket handshake, and optional account switch. */\n async auth(): Promise<void> {\n await this._preflight();\n await this.login();\n await this.fetchCsrf();\n if (this._ctx.debug) clearDebugLog();\n\n const cookieStr = Cookies.serialize(this._ctx.cookies);\n const handshake = await waitForHandshake(endpoints.websocket(this._ctx.broker), cookieStr, 30_000, this._ctx.debug);\n this._ctx.atmosphereId = handshake.atmosphereId;\n this._ctx.accountId = handshake.accountId;\n\n if (this._ctx.config.accountId) {\n await this.switchAccount(this._ctx.config.accountId);\n const reconnect = await waitForHandshake(\n endpoints.websocket(this._ctx.broker, this._ctx.atmosphereId),\n Cookies.serialize(this._ctx.cookies),\n 30_000,\n this._ctx.debug,\n );\n this._ctx.atmosphereId = reconnect.atmosphereId;\n this._ctx.accountId = reconnect.accountId;\n }\n }\n\n /** Connect to the broker with a persistent WebSocket: auth + persistent WS for data reuse and streaming. */\n async connect(): Promise<void> {\n await this.auth();\n\n const wsManager = new WsManager();\n const wsUrl = endpoints.websocket(this._ctx.broker, this._ctx.atmosphereId);\n const cookieStr = Cookies.serialize(this._ctx.cookies);\n await wsManager.connect(wsUrl, cookieStr, this._ctx.debug);\n this._ctx.wsManager = wsManager;\n }\n\n /** Close the persistent WebSocket connection. */\n disconnect(): void {\n if (this._ctx.wsManager) {\n this._ctx.wsManager.close();\n this._ctx.wsManager = null;\n }\n }\n}\n","import { DxtradeError, ERROR } from \"@/constants\";\nimport type { ClientContext, DxtradeConfig } from \"./client.types\";\nimport {\n SessionDomain,\n PositionsDomain,\n OrdersDomain,\n AccountDomain,\n SymbolsDomain,\n InstrumentsDomain,\n OhlcDomain,\n AssessmentsDomain,\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 private _session: SessionDomain;\n\n /** Position operations: get, close, metrics, streaming. */\n public readonly positions: PositionsDomain;\n /** Order operations: get, submit, cancel. */\n public readonly orders: OrdersDomain;\n /** Account operations: metrics, trade journal, trade history. */\n public readonly account: AccountDomain;\n /** Symbol operations: search, info, limits. */\n public readonly symbols: SymbolsDomain;\n /** Instrument operations: get (with optional filtering). */\n public readonly instruments: InstrumentsDomain;\n /** OHLC price bar operations: get, stream. */\n public readonly ohlc: OhlcDomain;\n /** PnL assessment operations: get. */\n public readonly assessments: AssessmentsDomain;\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 wsManager: 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(ERROR.NO_SESSION, \"No active session. Call auth() or connect() first.\");\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 this._session = new SessionDomain(this._ctx);\n this.positions = new PositionsDomain(this._ctx);\n this.orders = new OrdersDomain(this._ctx);\n this.account = new AccountDomain(this._ctx);\n this.symbols = new SymbolsDomain(this._ctx);\n this.instruments = new InstrumentsDomain(this._ctx);\n this.ohlc = new OhlcDomain(this._ctx);\n this.assessments = new AssessmentsDomain(this._ctx);\n }\n\n /** Authenticate with the broker using username and password. */\n public async login(): Promise<void> {\n return this._session.login();\n }\n\n /** Fetch the CSRF token required for authenticated requests. */\n public async fetchCsrf(): Promise<void> {\n return this._session.fetchCsrf();\n }\n\n /** Switch to a specific trading account by ID. */\n public async switchAccount(accountId: string): Promise<void> {\n return this._session.switchAccount(accountId);\n }\n\n /** Authenticate and establish a session: login, fetch CSRF, WebSocket handshake, and optional account switch. */\n public async auth(): Promise<void> {\n return this._session.auth();\n }\n\n /** Connect to the broker with a persistent WebSocket: auth + persistent WS for data reuse and streaming. */\n public async connect(): Promise<void> {\n return this._session.connect();\n }\n\n /** Close the persistent WebSocket connection. */\n public disconnect(): void {\n return this._session.disconnect();\n }\n}\n"],"mappings":"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","names":["ORDER_TYPE","SIDE","ACTION","TIF","ERROR","MESSAGE_CATEGORY","MESSAGE_TYPE","ORDER_STATUS","WS_MESSAGE","SUBTOPIC","import_ws","axios","WebSocket","WebSocket","import_ws","WebSocket","import_ws","WebSocket","import_ws","import_ws","WebSocket","WebSocket","crypto","import_ws","WebSocket","import_ws","WebSocket"]}
|