ctrader-ts 0.1.11 → 1.0.0
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 +259 -91
- package/dist/bin/auth.js +8 -8
- package/dist/bin/auth.js.map +1 -1
- package/dist/cli/index.js +169 -26
- package/dist/cli/index.js.map +1 -1
- package/dist/src/{client.d.ts → core/client.d.ts} +57 -15
- package/dist/src/core/client.d.ts.map +1 -0
- package/dist/src/{client.js → core/client.js} +306 -49
- package/dist/src/core/client.js.map +1 -0
- package/dist/src/core/config.d.ts.map +1 -0
- package/dist/src/{config.js → core/config.js} +13 -13
- package/dist/src/core/config.js.map +1 -0
- package/dist/src/{connect.d.ts → core/connect.d.ts} +3 -3
- package/dist/src/core/connect.d.ts.map +1 -0
- package/dist/src/{connect.js → core/connect.js} +4 -6
- package/dist/src/core/connect.js.map +1 -0
- package/dist/src/{connection.d.ts → core/connection.d.ts} +48 -4
- package/dist/src/core/connection.d.ts.map +1 -0
- package/dist/src/{connection.js → core/connection.js} +70 -14
- package/dist/src/core/connection.js.map +1 -0
- package/dist/src/{errors.d.ts → core/errors.d.ts} +5 -0
- package/dist/src/core/errors.d.ts.map +1 -0
- package/dist/src/core/errors.js +85 -0
- package/dist/src/core/errors.js.map +1 -0
- package/dist/src/{helpers.d.ts → core/helpers.d.ts} +3 -3
- package/dist/src/core/helpers.d.ts.map +1 -0
- package/dist/src/{helpers.js → core/helpers.js} +9 -7
- package/dist/src/core/helpers.js.map +1 -0
- package/dist/src/{symbol-cache.d.ts → core/symbol-cache.d.ts} +2 -2
- package/dist/src/core/symbol-cache.d.ts.map +1 -0
- package/dist/src/core/symbol-cache.js.map +1 -0
- package/dist/src/index.d.ts +26 -11
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +24 -9
- package/dist/src/index.js.map +1 -1
- package/dist/src/modules/account.d.ts +68 -2
- package/dist/src/modules/account.d.ts.map +1 -1
- package/dist/src/modules/account.js +91 -34
- package/dist/src/modules/account.js.map +1 -1
- package/dist/src/modules/auth.d.ts +29 -2
- package/dist/src/modules/auth.d.ts.map +1 -1
- package/dist/src/modules/auth.js +42 -10
- package/dist/src/modules/auth.js.map +1 -1
- package/dist/src/modules/market.d.ts +51 -3
- package/dist/src/modules/market.d.ts.map +1 -1
- package/dist/src/modules/market.js +57 -16
- package/dist/src/modules/market.js.map +1 -1
- package/dist/src/modules/trading.d.ts +69 -3
- package/dist/src/modules/trading.d.ts.map +1 -1
- package/dist/src/modules/trading.js +74 -35
- package/dist/src/modules/trading.js.map +1 -1
- package/dist/src/protocol/codec.d.ts.map +1 -0
- package/dist/src/{codec.js → protocol/codec.js} +2 -2
- package/dist/src/protocol/codec.js.map +1 -0
- package/dist/src/{enums.d.ts → protocol/enums.d.ts} +177 -0
- package/dist/src/protocol/enums.d.ts.map +1 -0
- package/dist/src/{enums.js → protocol/enums.js} +177 -0
- package/dist/src/protocol/enums.js.map +1 -0
- package/dist/src/protocol/proto/messages.d.ts +7496 -0
- package/dist/src/protocol/proto/messages.js +21525 -0
- package/dist/src/protocol/proto/proto/messages.d.ts +7496 -0
- package/dist/src/protocol/proto/proto/messages.js +21525 -0
- package/dist/src/{types.d.ts → protocol/types.d.ts} +151 -3
- package/dist/src/protocol/types.d.ts.map +1 -0
- package/dist/src/{types.js.map → protocol/types.js.map} +1 -1
- package/llms.txt +280 -0
- package/package.json +89 -61
- package/dist/src/client.d.ts.map +0 -1
- package/dist/src/client.js.map +0 -1
- package/dist/src/codec.d.ts.map +0 -1
- package/dist/src/codec.js.map +0 -1
- package/dist/src/config.d.ts.map +0 -1
- package/dist/src/config.js.map +0 -1
- package/dist/src/connect.d.ts.map +0 -1
- package/dist/src/connect.js.map +0 -1
- package/dist/src/connection.d.ts.map +0 -1
- package/dist/src/connection.js.map +0 -1
- package/dist/src/enums.d.ts.map +0 -1
- package/dist/src/enums.js.map +0 -1
- package/dist/src/errors.d.ts.map +0 -1
- package/dist/src/errors.js +0 -47
- package/dist/src/errors.js.map +0 -1
- package/dist/src/helpers.d.ts.map +0 -1
- package/dist/src/helpers.js.map +0 -1
- package/dist/src/proto/messages.d.ts +0 -7076
- package/dist/src/proto/messages.js +0 -23289
- package/dist/src/proto/proto/messages.d.ts +0 -7076
- package/dist/src/proto/proto/messages.js +0 -23289
- package/dist/src/symbol-cache.d.ts.map +0 -1
- package/dist/src/symbol-cache.js.map +0 -1
- package/dist/src/types.d.ts.map +0 -1
- /package/dist/src/{config.d.ts → core/config.d.ts} +0 -0
- /package/dist/src/{symbol-cache.js → core/symbol-cache.js} +0 -0
- /package/dist/src/{codec.d.ts → protocol/codec.d.ts} +0 -0
- /package/dist/src/{types.js → protocol/types.js} +0 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { CTraderAuth } from "
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { PayloadType, TradeSide } from "./enums.js";
|
|
1
|
+
import { CTraderAccount } from "../modules/account.js";
|
|
2
|
+
import { CTraderAuth } from "../modules/auth.js";
|
|
3
|
+
import { CTraderMarket, } from "../modules/market.js";
|
|
4
|
+
import { CTraderTrading, } from "../modules/trading.js";
|
|
5
|
+
import { PayloadType, TradeSide } from "../protocol/enums.js";
|
|
6
|
+
import { CTraderConnection } from "./connection.js";
|
|
8
7
|
import { resolveSlTp } from "./helpers.js";
|
|
8
|
+
import { SymbolCache } from "./symbol-cache.js";
|
|
9
9
|
export class CTrader {
|
|
10
10
|
/** Low-level WebSocket connection — use for raw events and advanced control */
|
|
11
11
|
connection;
|
|
@@ -69,14 +69,29 @@ export class CTrader {
|
|
|
69
69
|
const ids = await Promise.all(symbolsOrIds.map((s) => this.symbols.resolveId(s)));
|
|
70
70
|
return this.raw.market.getSymbolsById(ids);
|
|
71
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Full details for a single symbol: spread, commission, swap, lot size, schedule.
|
|
74
|
+
* Convenience wrapper around getSymbolDetails() for when you only need one.
|
|
75
|
+
* @param symbol - Symbol name ("EURUSD") or numeric ID
|
|
76
|
+
*/
|
|
77
|
+
async getSymbolInfo(symbol) {
|
|
78
|
+
const [info] = await this.getSymbolDetails([symbol]);
|
|
79
|
+
if (info === undefined)
|
|
80
|
+
throw new Error(`Symbol ${String(symbol)} not found`);
|
|
81
|
+
return info;
|
|
82
|
+
}
|
|
72
83
|
/** Force-refresh the symbol name→ID cache. Call if the broker adds new symbols. */
|
|
73
84
|
async refreshSymbols() {
|
|
74
85
|
await this.symbols.refresh();
|
|
75
86
|
}
|
|
76
87
|
// ─── Account ─────────────────────────────────────────────────────────────
|
|
77
|
-
/** Trader profile
|
|
88
|
+
/** Trader profile with computed `leverage` field (e.g. 100, 200, 500) */
|
|
78
89
|
async getTrader() {
|
|
79
|
-
|
|
90
|
+
const trader = await this.raw.account.getTrader();
|
|
91
|
+
return {
|
|
92
|
+
...trader,
|
|
93
|
+
leverage: trader.leverageInCents !== undefined ? trader.leverageInCents / 100 : undefined,
|
|
94
|
+
};
|
|
80
95
|
}
|
|
81
96
|
/**
|
|
82
97
|
* All open positions and pending orders.
|
|
@@ -96,20 +111,24 @@ export class CTrader {
|
|
|
96
111
|
this.raw.account.getPositionUnrealizedPnl(),
|
|
97
112
|
]);
|
|
98
113
|
const moneyDigits = trader.moneyDigits ?? 2;
|
|
99
|
-
const divisor =
|
|
114
|
+
const divisor = 10 ** moneyDigits;
|
|
100
115
|
const unrealizedPnl = pnlData.pnls.reduce((sum, p) => sum + p.netUnrealizedPnL, 0) / divisor;
|
|
101
116
|
const balance = trader.balance / divisor;
|
|
102
117
|
const equity = balance + unrealizedPnl;
|
|
103
|
-
const usedMargin = reconciled.positions.reduce((sum, p) => sum + (p.usedMargin ?? 0), 0) /
|
|
104
|
-
divisor;
|
|
118
|
+
const usedMargin = reconciled.positions.reduce((sum, p) => sum + (p.usedMargin ?? 0), 0) / divisor;
|
|
105
119
|
const freeMargin = equity - usedMargin;
|
|
120
|
+
const enrichedPositions = reconciled.positions.map((p) => ({
|
|
121
|
+
...p,
|
|
122
|
+
volumeInLots: unitsToLots(p.tradeData.volume),
|
|
123
|
+
entryPrice: p.price,
|
|
124
|
+
}));
|
|
106
125
|
const result = {
|
|
107
126
|
balance,
|
|
108
127
|
equity,
|
|
109
128
|
usedMargin,
|
|
110
129
|
freeMargin,
|
|
111
130
|
unrealizedPnl,
|
|
112
|
-
positions:
|
|
131
|
+
positions: enrichedPositions,
|
|
113
132
|
orders: reconciled.orders,
|
|
114
133
|
moneyDigits,
|
|
115
134
|
};
|
|
@@ -119,19 +138,17 @@ export class CTrader {
|
|
|
119
138
|
return result;
|
|
120
139
|
}
|
|
121
140
|
/**
|
|
122
|
-
* Deal (execution) history.
|
|
123
|
-
* @param
|
|
124
|
-
* @param to - End Unix timestamp in ms
|
|
125
|
-
* @param maxRows - Limit results (API max ~5000)
|
|
141
|
+
* Deal (execution) history. Defaults to last 24 hours if no time range specified.
|
|
142
|
+
* @param opts - Optional time range and row limit
|
|
126
143
|
*/
|
|
127
|
-
async getDeals(
|
|
128
|
-
const
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
if (maxRows !== undefined)
|
|
134
|
-
params.maxRows = maxRows;
|
|
144
|
+
async getDeals(opts = {}) {
|
|
145
|
+
const now = Date.now();
|
|
146
|
+
const params = {
|
|
147
|
+
fromTimestamp: opts.from ?? now - 24 * 60 * 60 * 1000,
|
|
148
|
+
toTimestamp: opts.to ?? now,
|
|
149
|
+
};
|
|
150
|
+
if (opts.maxRows !== undefined)
|
|
151
|
+
params.maxRows = opts.maxRows;
|
|
135
152
|
return this.raw.account.getDeals(params);
|
|
136
153
|
}
|
|
137
154
|
/** Deal history for a specific position */
|
|
@@ -148,14 +165,16 @@ export class CTrader {
|
|
|
148
165
|
async getDealOffsets(dealId) {
|
|
149
166
|
return this.raw.account.getDealOffsets(dealId);
|
|
150
167
|
}
|
|
151
|
-
/**
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
168
|
+
/**
|
|
169
|
+
* Order history. Defaults to last 24 hours if no time range specified.
|
|
170
|
+
* @param opts - Optional time range
|
|
171
|
+
*/
|
|
172
|
+
async getOrders(opts = {}) {
|
|
173
|
+
const now = Date.now();
|
|
174
|
+
return this.raw.account.getOrders({
|
|
175
|
+
fromTimestamp: opts.from ?? now - 24 * 60 * 60 * 1000,
|
|
176
|
+
toTimestamp: opts.to ?? now,
|
|
177
|
+
});
|
|
159
178
|
}
|
|
160
179
|
/** Deposit/withdrawal history. Max range: 7 days */
|
|
161
180
|
async getCashFlow(from, to) {
|
|
@@ -288,23 +307,109 @@ export class CTrader {
|
|
|
288
307
|
volumeInUnits: volume,
|
|
289
308
|
}, opts.sl, opts.tp);
|
|
290
309
|
// Convert relative SL/TP to absolute prices: entry ± distance
|
|
310
|
+
// If pos.price is unavailable (just-opened position), fetch current spot as fallback
|
|
311
|
+
let entryPrice = pos.price;
|
|
312
|
+
const needPrice = (sltp.relativeStopLoss !== undefined || sltp.relativeTakeProfit !== undefined) &&
|
|
313
|
+
entryPrice === undefined;
|
|
314
|
+
if (needPrice) {
|
|
315
|
+
// Fetch a live spot price as fallback when position price isn't available yet
|
|
316
|
+
const spot = await new Promise((resolve, reject) => {
|
|
317
|
+
const timer = setTimeout(() => {
|
|
318
|
+
off();
|
|
319
|
+
void this.raw.market.unsubscribeSpots([symbolId]).catch(() => { });
|
|
320
|
+
reject(new Error(`Timed out fetching spot price for symbol ${symbolId}`));
|
|
321
|
+
}, 10_000);
|
|
322
|
+
const off = this.raw.market.onSpot((evt) => {
|
|
323
|
+
if (evt.symbolId === symbolId) {
|
|
324
|
+
clearTimeout(timer);
|
|
325
|
+
off();
|
|
326
|
+
void this.raw.market.unsubscribeSpots([symbolId]).catch(() => { });
|
|
327
|
+
resolve(evt);
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
this.raw.market.subscribeSpots([symbolId]).catch((err) => {
|
|
331
|
+
clearTimeout(timer);
|
|
332
|
+
off();
|
|
333
|
+
reject(err);
|
|
334
|
+
});
|
|
335
|
+
});
|
|
336
|
+
// Convert raw protocol price to decimal (same as watchSpots)
|
|
337
|
+
const bidDecimal = spot.bid !== undefined ? spot.bid / 100_000 : undefined;
|
|
338
|
+
const askDecimal = spot.ask !== undefined ? spot.ask / 100_000 : undefined;
|
|
339
|
+
entryPrice =
|
|
340
|
+
pos.tradeData.tradeSide === TradeSide.BUY
|
|
341
|
+
? (bidDecimal ?? askDecimal)
|
|
342
|
+
: (askDecimal ?? bidDecimal);
|
|
343
|
+
}
|
|
344
|
+
// Build amend params, always preserving existing SL/TP when not being changed.
|
|
345
|
+
// The cTrader API clears SL/TP if they are omitted from the amend request.
|
|
291
346
|
const amendParams = {};
|
|
292
|
-
|
|
347
|
+
// --- Stop Loss ---
|
|
348
|
+
if (sltp.relativeStopLoss !== undefined) {
|
|
349
|
+
if (entryPrice === undefined) {
|
|
350
|
+
throw new Error(`Cannot set stop loss: position ${positionId} has no entry price and spot price could not be resolved.`);
|
|
351
|
+
}
|
|
293
352
|
const distance = sltp.relativeStopLoss / 100_000;
|
|
294
353
|
amendParams.stopLoss =
|
|
295
|
-
pos.tradeData.tradeSide === TradeSide.BUY
|
|
296
|
-
? pos.price - distance
|
|
297
|
-
: pos.price + distance;
|
|
354
|
+
pos.tradeData.tradeSide === TradeSide.BUY ? entryPrice - distance : entryPrice + distance;
|
|
298
355
|
}
|
|
299
|
-
if (
|
|
356
|
+
else if (pos.stopLoss !== undefined) {
|
|
357
|
+
// Preserve existing SL when not being modified — omitting it
|
|
358
|
+
// from the amend request would cause cTrader to clear it.
|
|
359
|
+
amendParams.stopLoss = pos.stopLoss;
|
|
360
|
+
}
|
|
361
|
+
// --- Take Profit ---
|
|
362
|
+
if (sltp.relativeTakeProfit !== undefined) {
|
|
363
|
+
if (entryPrice === undefined) {
|
|
364
|
+
throw new Error(`Cannot set take profit: position ${positionId} has no entry price and spot price could not be resolved.`);
|
|
365
|
+
}
|
|
300
366
|
const distance = sltp.relativeTakeProfit / 100_000;
|
|
301
367
|
amendParams.takeProfit =
|
|
302
|
-
pos.tradeData.tradeSide === TradeSide.BUY
|
|
303
|
-
|
|
304
|
-
|
|
368
|
+
pos.tradeData.tradeSide === TradeSide.BUY ? entryPrice + distance : entryPrice - distance;
|
|
369
|
+
}
|
|
370
|
+
else if (pos.takeProfit !== undefined) {
|
|
371
|
+
// Preserve existing TP when not being modified — omitting it
|
|
372
|
+
// from the amend request would cause cTrader to clear it.
|
|
373
|
+
amendParams.takeProfit = pos.takeProfit;
|
|
305
374
|
}
|
|
306
375
|
await this.raw.trading.amendPositionSltp(positionId, amendParams);
|
|
307
376
|
}
|
|
377
|
+
/**
|
|
378
|
+
* Resize a position — change its volume to a new target in lots.
|
|
379
|
+
* If newLots > current: adds volume via a market order on the same position.
|
|
380
|
+
* If newLots < current: partially closes the difference.
|
|
381
|
+
* If equal: no-op.
|
|
382
|
+
* @param positionId - The cTrader position ID
|
|
383
|
+
* @param newLots - Desired total position size in lots (e.g. 0.05, 0.1, 1.0)
|
|
384
|
+
* @returns The execution event from the increase/decrease, or undefined if no-op
|
|
385
|
+
*/
|
|
386
|
+
async resize(positionId, newLots) {
|
|
387
|
+
if (newLots < 0)
|
|
388
|
+
throw new Error("newLots must be >= 0. Use close() to fully close a position.");
|
|
389
|
+
if (newLots === 0)
|
|
390
|
+
throw new Error("newLots must be > 0. Use close() to fully close a position.");
|
|
391
|
+
const { positions } = await this.raw.account.reconcile();
|
|
392
|
+
const pos = positions.find((p) => p.positionId === positionId);
|
|
393
|
+
if (pos === undefined)
|
|
394
|
+
throw new Error(`Position ${positionId} not found`);
|
|
395
|
+
const currentUnits = pos.tradeData.volume;
|
|
396
|
+
const newUnits = lotsToUnits(newLots);
|
|
397
|
+
if (newUnits === currentUnits)
|
|
398
|
+
return undefined;
|
|
399
|
+
if (newUnits > currentUnits) {
|
|
400
|
+
// Increase: send a market order with positionId to add volume
|
|
401
|
+
const deltaUnits = newUnits - currentUnits;
|
|
402
|
+
return this.raw.trading.marketOrder({
|
|
403
|
+
symbolId: pos.tradeData.symbolId,
|
|
404
|
+
tradeSide: pos.tradeData.tradeSide,
|
|
405
|
+
volume: deltaUnits,
|
|
406
|
+
positionId,
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
// Decrease: partial close for the difference
|
|
410
|
+
const deltaUnits = currentUnits - newUnits;
|
|
411
|
+
return this.raw.trading.closePosition(positionId, deltaUnits);
|
|
412
|
+
}
|
|
308
413
|
/**
|
|
309
414
|
* Close a position by ID. Full close by default, or partial if lots is specified.
|
|
310
415
|
* @param positionId - The cTrader position ID
|
|
@@ -357,9 +462,7 @@ export class CTrader {
|
|
|
357
462
|
const ids = await Promise.all(symbolsOrIds.map((s) => this.symbols.resolveId(s)));
|
|
358
463
|
const idToName = new Map(ids.map((id, i) => [
|
|
359
464
|
id,
|
|
360
|
-
typeof symbolsOrIds[i] === "string"
|
|
361
|
-
? symbolsOrIds[i]
|
|
362
|
-
: String(symbolsOrIds[i]),
|
|
465
|
+
typeof symbolsOrIds[i] === "string" ? symbolsOrIds[i] : String(symbolsOrIds[i]),
|
|
363
466
|
]));
|
|
364
467
|
await this.raw.market.subscribeSpots(ids);
|
|
365
468
|
const unsub = this.raw.market.onSpot((event) => {
|
|
@@ -456,6 +559,14 @@ export class CTrader {
|
|
|
456
559
|
});
|
|
457
560
|
}
|
|
458
561
|
// ─── Convenience ────────────────────────────────────────────────────────
|
|
562
|
+
/**
|
|
563
|
+
* Stream live depth-of-market (order book) data. Returns an async unsubscribe function.
|
|
564
|
+
* @param symbolsOrIds - Symbol names or IDs to watch
|
|
565
|
+
* @param handler - Called on every depth update for subscribed symbols
|
|
566
|
+
* @example
|
|
567
|
+
* const stop = await client.watchDepth(["EURUSD"], (e) => console.log(e));
|
|
568
|
+
* // later: await stop();
|
|
569
|
+
*/
|
|
459
570
|
async watchDepth(symbolsOrIds, handler) {
|
|
460
571
|
const ids = await Promise.all(symbolsOrIds.map((s) => this.symbols.resolveId(s)));
|
|
461
572
|
await this.raw.market.subscribeDepth(ids);
|
|
@@ -468,6 +579,152 @@ export class CTrader {
|
|
|
468
579
|
await this.raw.market.unsubscribeDepth(ids);
|
|
469
580
|
};
|
|
470
581
|
}
|
|
582
|
+
/**
|
|
583
|
+
* Stream live account state — balance, equity, margin, positions, and orders update in real-time.
|
|
584
|
+
* Listens to execution events, balance changes, margin updates, and spot prices to
|
|
585
|
+
* recompute a full AccountState snapshot on every change. No polling — pure push.
|
|
586
|
+
*
|
|
587
|
+
* Returns an async unsubscribe function that cleans up all listeners and spot subscriptions.
|
|
588
|
+
*
|
|
589
|
+
* @param handler - Called with the latest LiveAccountState on every state change
|
|
590
|
+
* @param options - Optional: throttleMs to limit spot-triggered updates (default 500ms)
|
|
591
|
+
*
|
|
592
|
+
* @example
|
|
593
|
+
* const stop = await ct.watchState((state) => {
|
|
594
|
+
* console.log(`Equity: $${state.equity}, Positions: ${state.positions.length}`);
|
|
595
|
+
* });
|
|
596
|
+
* // later: await stop();
|
|
597
|
+
*/
|
|
598
|
+
async watchState(handler, options = {}) {
|
|
599
|
+
const throttleMs = options.throttleMs ?? 500;
|
|
600
|
+
// --- Mutable state ---
|
|
601
|
+
let currentState = await this.getState();
|
|
602
|
+
const spotPrices = new Map();
|
|
603
|
+
let subscribedSymbolIds = [];
|
|
604
|
+
let destroyed = false;
|
|
605
|
+
// Emit initial state
|
|
606
|
+
handler({ ...currentState, reason: "init", timestamp: Date.now() });
|
|
607
|
+
// --- Helper: recompute equity from spot prices ---
|
|
608
|
+
const recomputeFromSpots = () => {
|
|
609
|
+
const positions = currentState.positions;
|
|
610
|
+
let unrealizedPnl = 0;
|
|
611
|
+
for (const pos of positions) {
|
|
612
|
+
const spot = spotPrices.get(pos.tradeData.symbolId);
|
|
613
|
+
if (spot === undefined || pos.entryPrice === undefined)
|
|
614
|
+
continue;
|
|
615
|
+
const isBuy = pos.tradeData.tradeSide === TradeSide.BUY;
|
|
616
|
+
const currentPrice = isBuy ? (spot.bid ?? spot.ask) : (spot.ask ?? spot.bid);
|
|
617
|
+
if (currentPrice === undefined)
|
|
618
|
+
continue;
|
|
619
|
+
const priceDiff = isBuy ? currentPrice - pos.entryPrice : pos.entryPrice - currentPrice;
|
|
620
|
+
// Volume is in protocol units (100000 = 1 lot), price diff is in decimal
|
|
621
|
+
unrealizedPnl += priceDiff * pos.tradeData.volume;
|
|
622
|
+
}
|
|
623
|
+
const balance = currentState.balance;
|
|
624
|
+
const equity = balance + unrealizedPnl;
|
|
625
|
+
const usedMargin = currentState.usedMargin;
|
|
626
|
+
const freeMargin = equity - usedMargin;
|
|
627
|
+
const result = {
|
|
628
|
+
...currentState,
|
|
629
|
+
unrealizedPnl,
|
|
630
|
+
equity,
|
|
631
|
+
freeMargin,
|
|
632
|
+
};
|
|
633
|
+
if (usedMargin > 0) {
|
|
634
|
+
result.marginLevel = (equity / usedMargin) * 100;
|
|
635
|
+
}
|
|
636
|
+
return result;
|
|
637
|
+
};
|
|
638
|
+
// --- Helper: refresh full state from server ---
|
|
639
|
+
const refreshState = async (reason) => {
|
|
640
|
+
if (destroyed)
|
|
641
|
+
return;
|
|
642
|
+
currentState = await this.getState();
|
|
643
|
+
await syncSpotSubscriptions();
|
|
644
|
+
handler({ ...currentState, reason, timestamp: Date.now() });
|
|
645
|
+
};
|
|
646
|
+
// --- Helper: subscribe to spots for all position symbols ---
|
|
647
|
+
const syncSpotSubscriptions = async () => {
|
|
648
|
+
const neededIds = [...new Set(currentState.positions.map((p) => p.tradeData.symbolId))];
|
|
649
|
+
const toSubscribe = neededIds.filter((id) => !subscribedSymbolIds.includes(id));
|
|
650
|
+
const toUnsubscribe = subscribedSymbolIds.filter((id) => !neededIds.includes(id));
|
|
651
|
+
if (toUnsubscribe.length > 0) {
|
|
652
|
+
await this.raw.market.unsubscribeSpots(toUnsubscribe).catch(() => { });
|
|
653
|
+
for (const id of toUnsubscribe)
|
|
654
|
+
spotPrices.delete(id);
|
|
655
|
+
}
|
|
656
|
+
if (toSubscribe.length > 0) {
|
|
657
|
+
await this.raw.market.subscribeSpots(toSubscribe);
|
|
658
|
+
}
|
|
659
|
+
subscribedSymbolIds = neededIds;
|
|
660
|
+
};
|
|
661
|
+
// Subscribe to spots for current positions
|
|
662
|
+
await syncSpotSubscriptions();
|
|
663
|
+
// --- Spot price handler (throttled) ---
|
|
664
|
+
let spotThrottleTimer;
|
|
665
|
+
const offSpot = this.raw.market.onSpot((event) => {
|
|
666
|
+
if (destroyed)
|
|
667
|
+
return;
|
|
668
|
+
if (!subscribedSymbolIds.includes(event.symbolId))
|
|
669
|
+
return;
|
|
670
|
+
const current = spotPrices.get(event.symbolId) ?? {};
|
|
671
|
+
if (event.bid !== undefined)
|
|
672
|
+
current.bid = event.bid / 100_000;
|
|
673
|
+
if (event.ask !== undefined)
|
|
674
|
+
current.ask = event.ask / 100_000;
|
|
675
|
+
spotPrices.set(event.symbolId, current);
|
|
676
|
+
if (throttleMs === 0) {
|
|
677
|
+
const updated = recomputeFromSpots();
|
|
678
|
+
handler({ ...updated, reason: "spot", timestamp: Date.now() });
|
|
679
|
+
return;
|
|
680
|
+
}
|
|
681
|
+
if (spotThrottleTimer === undefined) {
|
|
682
|
+
spotThrottleTimer = setTimeout(() => {
|
|
683
|
+
spotThrottleTimer = undefined;
|
|
684
|
+
if (destroyed)
|
|
685
|
+
return;
|
|
686
|
+
const updated = recomputeFromSpots();
|
|
687
|
+
handler({ ...updated, reason: "spot", timestamp: Date.now() });
|
|
688
|
+
}, throttleMs);
|
|
689
|
+
}
|
|
690
|
+
});
|
|
691
|
+
// --- Execution events (position open/close/modify) ---
|
|
692
|
+
const offExecution = this.onExecution(() => {
|
|
693
|
+
void refreshState("execution");
|
|
694
|
+
});
|
|
695
|
+
// --- Balance/account changes ---
|
|
696
|
+
const offTrader = this.onTraderUpdated(() => {
|
|
697
|
+
void refreshState("trader_updated");
|
|
698
|
+
});
|
|
699
|
+
// --- Margin changes ---
|
|
700
|
+
const offMargin = this.onMarginChanged((event) => {
|
|
701
|
+
if (destroyed)
|
|
702
|
+
return;
|
|
703
|
+
// Update margin in-place for the affected position
|
|
704
|
+
const pos = currentState.positions.find((p) => p.positionId === event.positionId);
|
|
705
|
+
if (pos !== undefined) {
|
|
706
|
+
pos.usedMargin = event.usedMargin;
|
|
707
|
+
const usedMargin = currentState.positions.reduce((sum, p) => sum + (p.usedMargin ?? 0), 0) /
|
|
708
|
+
10 ** currentState.moneyDigits;
|
|
709
|
+
currentState = { ...currentState, usedMargin };
|
|
710
|
+
}
|
|
711
|
+
const updated = recomputeFromSpots();
|
|
712
|
+
handler({ ...updated, reason: "margin_changed", timestamp: Date.now() });
|
|
713
|
+
});
|
|
714
|
+
// --- Cleanup function ---
|
|
715
|
+
return async () => {
|
|
716
|
+
destroyed = true;
|
|
717
|
+
if (spotThrottleTimer !== undefined)
|
|
718
|
+
clearTimeout(spotThrottleTimer);
|
|
719
|
+
offSpot();
|
|
720
|
+
offExecution();
|
|
721
|
+
offTrader();
|
|
722
|
+
offMargin();
|
|
723
|
+
if (subscribedSymbolIds.length > 0) {
|
|
724
|
+
await this.raw.market.unsubscribeSpots(subscribedSymbolIds).catch(() => { });
|
|
725
|
+
}
|
|
726
|
+
};
|
|
727
|
+
}
|
|
471
728
|
// ─── Private helpers ────────────────────────────────────────────────────
|
|
472
729
|
async executeMarketOrder(symbol, tradeSide, opts) {
|
|
473
730
|
const id = await this.symbols.resolveId(symbol);
|
|
@@ -550,15 +807,15 @@ export { pipsToRelative } from "./helpers.js";
|
|
|
550
807
|
function buildMarketOrderFields(opts) {
|
|
551
808
|
const f = {};
|
|
552
809
|
if (opts.trailingStopLoss !== undefined)
|
|
553
|
-
f
|
|
810
|
+
f.trailingStopLoss = opts.trailingStopLoss;
|
|
554
811
|
if (opts.guaranteedStopLoss !== undefined)
|
|
555
|
-
f
|
|
812
|
+
f.guaranteedStopLoss = opts.guaranteedStopLoss;
|
|
556
813
|
if (opts.label !== undefined)
|
|
557
|
-
f
|
|
814
|
+
f.label = opts.label;
|
|
558
815
|
if (opts.comment !== undefined)
|
|
559
|
-
f
|
|
816
|
+
f.comment = opts.comment;
|
|
560
817
|
if (opts.clientOrderId !== undefined)
|
|
561
|
-
f
|
|
818
|
+
f.clientOrderId = opts.clientOrderId;
|
|
562
819
|
return f;
|
|
563
820
|
}
|
|
564
821
|
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/core/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EACN,aAAa,GAGb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAGN,cAAc,GAId,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAqC9D,OAAO,EAAE,iBAAiB,EAAgC,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAyFhD,MAAM,OAAO,OAAO;IACnB,+EAA+E;IACtE,UAAU,CAAoB;IAEvC,gEAAgE;IACvD,GAAG,CAKV;IAEe,OAAO,CAAc;IAEtC,YAAY,MAA2B;QACtC,MAAM,UAAU,GAA4B,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QAClE,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;YAAE,UAAU,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QAC7D,IAAI,MAAM,CAAC,oBAAoB,KAAK,SAAS;YAC5C,UAAU,CAAC,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,CAAC;QAC/D,IAAI,MAAM,CAAC,gBAAgB,KAAK,SAAS;YACxC,UAAU,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACvD,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS;YAAE,UAAU,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QAElF,IAAI,CAAC,UAAU,GAAG,IAAI,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAEpD,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAEpE,IAAI,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAC9C,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,4EAA4E;IAE5E,mEAAmE;IACnE,IAAI,KAAK;QACR,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;IAC9B,CAAC;IAED,gDAAgD;IAChD,IAAI,WAAW;QACd,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,SAAiB;QAC3B,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IAED,qDAAqD;IACrD,UAAU;QACT,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;IAC9B,CAAC;IAED,4EAA4E;IAE5E;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,eAAe,GAAG,KAAK;QACvC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;QACtE,OAAO,OAAO,CAAC;IAChB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,gBAAgB,CAAC,YAAsB;QAC5C,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,aAAa,CAAC,MAAc;QACjC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACrD,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,UAAU,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC9E,OAAO,IAAI,CAAC;IACb,CAAC;IAED,mFAAmF;IACnF,KAAK,CAAC,cAAc;QACnB,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;IAED,4EAA4E;IAE5E,yEAAyE;IACzE,KAAK,CAAC,SAAS;QACd,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAClD,OAAO;YACN,GAAG,MAAM;YACT,QAAQ,EAAE,MAAM,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS;SACzF,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY,CACjB,sBAAsB,GAAG,KAAK;QAE9B,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IAC3D,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ;QACb,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACvD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE;YAC5B,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE;YAC5B,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,wBAAwB,EAAE;SAC3C,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,EAAE,IAAI,WAAW,CAAC;QAElC,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC;QAE7F,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;QACzC,MAAM,MAAM,GAAG,OAAO,GAAG,aAAa,CAAC;QAEvC,MAAM,UAAU,GACf,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC;QAEjF,MAAM,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;QAEvC,MAAM,iBAAiB,GAAuB,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9E,GAAG,CAAC;YACJ,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;YAC7C,UAAU,EAAE,CAAC,CAAC,KAAK;SACnB,CAAC,CAAC,CAAC;QAEJ,MAAM,MAAM,GAAiB;YAC5B,OAAO;YACP,MAAM;YACN,UAAU;YACV,UAAU;YACV,aAAa;YACb,SAAS,EAAE,iBAAiB;YAC5B,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,WAAW;SACX,CAAC;QAEF,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,CAAC,WAAW,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC;QAClD,CAAC;QAED,OAAO,MAAM,CAAC;IACf,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ,CAAC,OAAwB,EAAE;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAIR;YACH,aAAa,EAAE,IAAI,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;YACrD,WAAW,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;SAC3B,CAAC;QACF,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;YAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC9D,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,2CAA2C;IAC3C,KAAK,CAAC,kBAAkB,CAAC,UAAkB,EAAE,IAAa,EAAE,EAAW;QACtE,MAAM,MAAM,GAAqD,EAAE,CAAC;QACpE,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;QACpD,IAAI,EAAE,KAAK,SAAS;YAAE,MAAM,CAAC,WAAW,GAAG,EAAE,CAAC;QAC9C,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAChF,OAAO,KAAK,CAAC;IACd,CAAC;IAED,iFAAiF;IACjF,KAAK,CAAC,cAAc,CACnB,MAAc;QAEd,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS,CAAC,OAAyB,EAAE;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC;YACjC,aAAa,EAAE,IAAI,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;YACrD,WAAW,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;SAC3B,CAAC,CAAC;IACJ,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,WAAW,CAAC,IAAY,EAAE,EAAU;QACzC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,iBAAiB,CACtB,MAAc,EACd,aAAqB;QAErB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,EAAE,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;IAC/E,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,gBAAgB;QAIrB,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,wBAAwB,EAAE,CAAC;IACpD,CAAC;IAED,2FAA2F;IAC3F,KAAK,CAAC,kBAAkB,CAAC,UAAkB;QAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC;IAED,6CAA6C;IAC7C,KAAK,CAAC,cAAc;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;IAC1C,CAAC;IAED,2CAA2C;IAC3C,KAAK,CAAC,gBAAgB,CAAC,UAAsB;QAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACtD,CAAC;IAED,4EAA4E;IAE5E;;;;;;OAMG;IACH,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,IAAwB;QACjD,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC7D,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,IAAwB;QAClD,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9D,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,IAAuB;QACrD,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,SAAS,CAAC,MAAc,EAAE,IAAuB;QACtD,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7D,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,IAAsB;QACnD,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,IAAsB;QACpD,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,SAAS,CACd,MAAc,EACd,SAAoB,EACpB,IAAsB;QAEtB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,MAAM,WAAW,CAC7B;YACC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO;YACzB,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,EAAE;YACZ,aAAa,EAAE,MAAM;SACrB,EACD,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,EAAE,CACP,CAAC;QACF,MAAM,CAAC,GAAyB;YAC/B,QAAQ,EAAE,EAAE;YACZ,SAAS;YACT,MAAM;YACN,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,GAAG,sBAAsB,CAAC,IAAI,CAAC;YAC/B,GAAG,IAAI;SACP,CAAC;QACF,IAAI,IAAI,CAAC,mBAAmB,KAAK,SAAS;YAAE,CAAC,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC;QAC7F,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,UAAkB,EAAE,IAAmB;QACnD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACzD,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;QAC/D,IAAI,GAAG,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,UAAU,YAAY,CAAC,CAAC;QAE3E,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC;QACpC,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC;QAExC,MAAM,IAAI,GAAG,MAAM,WAAW,CAC7B;YACC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO;YACzB,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ;YACR,aAAa,EAAE,MAAM;SACrB,EACD,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,EAAE,CACP,CAAC;QAEF,8DAA8D;QAC9D,qFAAqF;QACrF,IAAI,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC;QAC3B,MAAM,SAAS,GACd,CAAC,IAAI,CAAC,gBAAgB,KAAK,SAAS,IAAI,IAAI,CAAC,kBAAkB,KAAK,SAAS,CAAC;YAC9E,UAAU,KAAK,SAAS,CAAC;QAC1B,IAAI,SAAS,EAAE,CAAC;YACf,8EAA8E;YAC9E,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC7D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC7B,GAAG,EAAE,CAAC;oBACN,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;oBAClE,MAAM,CAAC,IAAI,KAAK,CAAC,4CAA4C,QAAQ,EAAE,CAAC,CAAC,CAAC;gBAC3E,CAAC,EAAE,MAAM,CAAC,CAAC;gBACX,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAc,EAAE,EAAE;oBACrD,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;wBAC/B,YAAY,CAAC,KAAK,CAAC,CAAC;wBACpB,GAAG,EAAE,CAAC;wBACN,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;wBAClE,OAAO,CAAC,GAAG,CAAC,CAAC;oBACd,CAAC;gBACF,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;oBACjE,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,GAAG,EAAE,CAAC;oBACN,MAAM,CAAC,GAAG,CAAC,CAAC;gBACb,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,6DAA6D;YAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YAC3E,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YAC3E,UAAU;gBACT,GAAG,CAAC,SAAS,CAAC,SAAS,KAAK,SAAS,CAAC,GAAG;oBACxC,CAAC,CAAC,CAAC,UAAU,IAAI,UAAU,CAAC;oBAC5B,CAAC,CAAC,CAAC,UAAU,IAAI,UAAU,CAAC,CAAC;QAChC,CAAC;QAED,+EAA+E;QAC/E,2EAA2E;QAC3E,MAAM,WAAW,GAAoB,EAAE,CAAC;QAExC,oBAAoB;QACpB,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACzC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CACd,kCAAkC,UAAU,2DAA2D,CACvG,CAAC;YACH,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC;YACjD,WAAW,CAAC,QAAQ;gBACnB,GAAG,CAAC,SAAS,CAAC,SAAS,KAAK,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,GAAG,QAAQ,CAAC;QAC5F,CAAC;aAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACvC,6DAA6D;YAC7D,0DAA0D;YAC1D,WAAW,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QACrC,CAAC;QAED,sBAAsB;QACtB,IAAI,IAAI,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;YAC3C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CACd,oCAAoC,UAAU,2DAA2D,CACzG,CAAC;YACH,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC;YACnD,WAAW,CAAC,UAAU;gBACrB,GAAG,CAAC,SAAS,CAAC,SAAS,KAAK,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,GAAG,QAAQ,CAAC;QAC5F,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACzC,6DAA6D;YAC7D,0DAA0D;YAC1D,WAAW,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;QACzC,CAAC;QAED,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACnE,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,MAAM,CAAC,UAAkB,EAAE,OAAa;QAC7C,IAAI,OAAO,GAAG,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;QACjF,IAAI,OAAO,KAAK,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAEhF,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACzD,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;QAC/D,IAAI,GAAG,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,UAAU,YAAY,CAAC,CAAC;QAE3E,MAAM,YAAY,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC;QAC1C,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAEtC,IAAI,QAAQ,KAAK,YAAY;YAAE,OAAO,SAAS,CAAC;QAEhD,IAAI,QAAQ,GAAG,YAAY,EAAE,CAAC;YAC7B,8DAA8D;YAC9D,MAAM,UAAU,GAAG,QAAQ,GAAG,YAAY,CAAC;YAC3C,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC;gBACnC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,QAAQ;gBAChC,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,SAAS;gBAClC,MAAM,EAAE,UAAU;gBAClB,UAAU;aACV,CAAC,CAAC;QACJ,CAAC;QAED,6CAA6C;QAC7C,MAAM,UAAU,GAAG,YAAY,GAAG,QAAQ,CAAC;QAC3C,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC/D,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,UAAkB,EAAE,IAAwB;QACvD,IAAI,IAAI,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACzD,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;QAC/D,IAAI,GAAG,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,UAAU,YAAY,CAAC,CAAC;QAE3E,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACzE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,MAAc;QAC/B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACzD,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;QAC5E,OAAO,OAAO,CAAC,GAAG,CACjB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CACrF,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,KAAK,CAAC,QAAQ;QACb,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACzD,OAAO,OAAO,CAAC,GAAG,CACjB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CACtF,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,OAAe,EAAE,MAAwB;QAC1D,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,kEAAkE;IAClE,KAAK,CAAC,WAAW,CAAC,OAAe;QAChC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,4EAA4E;IAE5E;;;;;OAKG;IACH,KAAK,CAAC,UAAU,CACf,YAAsB,EACtB,OAAmC;QAEnC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClF,MAAM,QAAQ,GAAG,IAAI,GAAG,CACvB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAClB,EAAE;YACF,OAAO,YAAY,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,YAAY,CAAC,CAAC,CAAY,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;SAC3F,CAAC,CACF,CAAC;QAEF,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAE1C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAgB,EAAE,EAAE;YACzD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAAE,OAAO;YAC1C,MAAM,KAAK,GAAc;gBACxB,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAC9D,QAAQ,EAAE,KAAK,CAAC,QAAQ;aACxB,CAAC;YACF,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC7B,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;gBACtB,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC;YACvC,CAAC;YACD,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC7B,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;gBACtB,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC;YACvC,CAAC;YACD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;gBAAE,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;YACrE,OAAO,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,OAAO,KAAK,IAAI,EAAE;YACjB,KAAK,EAAE,CAAC;YACR,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC7C,CAAC,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,YAAY,CACjB,MAAc,EACd,MAA4C;QAE5C,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IAClE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,WAAW,CAChB,MAAc,EACd,MAA2C;QAE3C,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,4EAA4E;IAE5E,iFAAiF;IACjF,WAAW,CAAC,OAAwC;QACnD,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,oFAAoF;IACpF,YAAY,CAAC,OAAyC;QACrD,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,mEAAmE;IACnE,mBAAmB,CAAC,OAAgD;QACnE,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,uEAAuE;IACvE,eAAe,CAAC,OAA4C;QAC3D,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,2EAA2E;IAC3E,eAAe,CAAC,OAA4C;QAC3D,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,sFAAsF;IACtF,mBAAmB,CAAC,OAAyC;QAC5D,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,wEAAwE;IACxE,eAAe,CAAC,OAA4C;QAC3D,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,4EAA4E;IAC5E,OAAO,CAAC,OAAoC;QAC3C,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,wGAAwG;IACxG,kBAAkB,CAAC,OAA+C;QACjE,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,WAAW,CAAC,uBAAuB,EAAE,CAAC,OAAO,EAAE,EAAE;YAC1E,OAAO,CAAC,OAA2C,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,kGAAkG;IAClG,kBAAkB,CAAC,OAA+C;QACjE,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,WAAW,CAAC,gCAAgC,EAAE,CAAC,OAAO,EAAE,EAAE;YACnF,OAAO,CAAC,OAA2C,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,0FAA0F;IAC1F,mBAAmB,CAAC,OAAgD;QACnE,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,WAAW,CAAC,wBAAwB,EAAE,CAAC,OAAO,EAAE,EAAE;YAC3E,OAAO,CAAC,OAA4C,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,2EAA2E;IAE3E;;;;;;;OAOG;IACH,KAAK,CAAC,UAAU,CACf,YAAsB,EACtB,OAAoC;QAEpC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClF,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAiB,EAAE,EAAE;YAC3D,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,IAAI,EAAE;YACjB,KAAK,EAAE,CAAC;YACR,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC7C,CAAC,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,UAAU,CACf,OAA0C,EAC1C,UAA6B,EAAE;QAE/B,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC;QAE7C,wBAAwB;QACxB,IAAI,YAAY,GAAiB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvD,MAAM,UAAU,GAAG,IAAI,GAAG,EAA0C,CAAC;QACrE,IAAI,mBAAmB,GAAa,EAAE,CAAC;QACvC,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,qBAAqB;QACrB,OAAO,CAAC,EAAE,GAAG,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAEpE,oDAAoD;QACpD,MAAM,kBAAkB,GAAG,GAAiB,EAAE;YAC7C,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC;YACzC,IAAI,aAAa,GAAG,CAAC,CAAC;YAEtB,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;gBAC7B,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBACpD,IAAI,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS;oBAAE,SAAS;gBAEjE,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,SAAS,KAAK,SAAS,CAAC,GAAG,CAAC;gBACxD,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC7E,IAAI,YAAY,KAAK,SAAS;oBAAE,SAAS;gBAEzC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,YAAY,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,GAAG,YAAY,CAAC;gBACxF,yEAAyE;gBACzE,aAAa,IAAI,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC;YACnD,CAAC;YAED,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC;YACrC,MAAM,MAAM,GAAG,OAAO,GAAG,aAAa,CAAC;YACvC,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;YAC3C,MAAM,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;YAEvC,MAAM,MAAM,GAAiB;gBAC5B,GAAG,YAAY;gBACf,aAAa;gBACb,MAAM;gBACN,UAAU;aACV,CAAC;YACF,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,CAAC,WAAW,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC;YAClD,CAAC;YACD,OAAO,MAAM,CAAC;QACf,CAAC,CAAC;QAEF,iDAAiD;QACjD,MAAM,YAAY,GAAG,KAAK,EAAE,MAAkC,EAAiB,EAAE;YAChF,IAAI,SAAS;gBAAE,OAAO;YACtB,YAAY,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrC,MAAM,qBAAqB,EAAE,CAAC;YAC9B,OAAO,CAAC,EAAE,GAAG,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC7D,CAAC,CAAC;QAEF,8DAA8D;QAC9D,MAAM,qBAAqB,GAAG,KAAK,IAAmB,EAAE;YACvD,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACxF,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;YAChF,MAAM,aAAa,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;YAElF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACtE,KAAK,MAAM,EAAE,IAAI,aAAa;oBAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACvD,CAAC;YACD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YACnD,CAAC;YACD,mBAAmB,GAAG,SAAS,CAAC;QACjC,CAAC,CAAC;QAEF,2CAA2C;QAC3C,MAAM,qBAAqB,EAAE,CAAC;QAE9B,yCAAyC;QACzC,IAAI,iBAA4D,CAAC;QACjE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAgB,EAAE,EAAE;YAC3D,IAAI,SAAS;gBAAE,OAAO;YACtB,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAAE,OAAO;YAE1D,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACrD,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS;gBAAE,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,GAAG,OAAO,CAAC;YAC/D,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS;gBAAE,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,GAAG,OAAO,CAAC;YAC/D,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAExC,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;gBACtB,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;gBACrC,OAAO,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC/D,OAAO;YACR,CAAC;YACD,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;gBACrC,iBAAiB,GAAG,UAAU,CAAC,GAAG,EAAE;oBACnC,iBAAiB,GAAG,SAAS,CAAC;oBAC9B,IAAI,SAAS;wBAAE,OAAO;oBACtB,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;oBACrC,OAAO,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAChE,CAAC,EAAE,UAAU,CAAC,CAAC;YAChB,CAAC;QACF,CAAC,CAAC,CAAC;QAEH,wDAAwD;QACxD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE;YAC1C,KAAK,YAAY,CAAC,WAAW,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,kCAAkC;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE;YAC3C,KAAK,YAAY,CAAC,gBAAgB,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,yBAAyB;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,KAAyB,EAAE,EAAE;YACpE,IAAI,SAAS;gBAAE,OAAO;YACtB,mDAAmD;YACnD,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC;YAClF,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACvB,GAAG,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;gBAClC,MAAM,UAAU,GACf,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;oBACvE,EAAE,IAAI,YAAY,CAAC,WAAW,CAAC;gBAChC,YAAY,GAAG,EAAE,GAAG,YAAY,EAAE,UAAU,EAAE,CAAC;YAChD,CAAC;YACD,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;YACrC,OAAO,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QAEH,2BAA2B;QAC3B,OAAO,KAAK,IAAI,EAAE;YACjB,SAAS,GAAG,IAAI,CAAC;YACjB,IAAI,iBAAiB,KAAK,SAAS;gBAAE,YAAY,CAAC,iBAAiB,CAAC,CAAC;YACrE,OAAO,EAAE,CAAC;YACV,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;YACZ,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpC,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC7E,CAAC;QACF,CAAC,CAAC;IACH,CAAC;IAED,2EAA2E;IAEnE,KAAK,CAAC,kBAAkB,CAC/B,MAAc,EACd,SAAoB,EACpB,IAAwB;QAExB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,MAAM,WAAW,CAC7B;YACC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO;YACzB,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,EAAE;YACZ,aAAa,EAAE,MAAM;SACrB,EACD,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,EAAE,CACP,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC;YAChD,QAAQ,EAAE,EAAE;YACZ,SAAS;YACT,MAAM;YACN,GAAG,sBAAsB,CAAC,IAAI,CAAC;YAC/B,GAAG,IAAI;SACP,CAAC,CAAC;QAEH,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CACd,gDAAgD;gBAC/C,kBAAkB,KAAK,CAAC,aAAa,gBAAgB,KAAK,CAAC,SAAS,IAAI,MAAM,EAAE,CACjF,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,QAAQ,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAC9B,MAAc,EACd,SAAoB,EACpB,IAAuB;QAEvB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,MAAM,WAAW,CAC7B;YACC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO;YACzB,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,EAAE;YACZ,aAAa,EAAE,MAAM;SACrB,EACD,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,EAAE,CACP,CAAC;QACF,MAAM,CAAC,GAAqB;YAC3B,QAAQ,EAAE,EAAE;YACZ,SAAS;YACT,MAAM;YACN,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,GAAG,sBAAsB,CAAC,IAAI,CAAC;YAC/B,GAAG,IAAI;SACP,CAAC;QACF,IAAI,IAAI,CAAC,mBAAmB,KAAK,SAAS;YAAE,CAAC,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC;QAC7F,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAC7B,MAAc,EACd,SAAoB,EACpB,IAAsB;QAEtB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,MAAM,WAAW,CAC7B;YACC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO;YACzB,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,EAAE;YACZ,aAAa,EAAE,MAAM;SACrB,EACD,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,EAAE,CACP,CAAC;QACF,MAAM,CAAC,GAAoB;YAC1B,QAAQ,EAAE,EAAE;YACZ,SAAS;YACT,MAAM;YACN,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,GAAG,sBAAsB,CAAC,IAAI,CAAC;YAC/B,GAAG,IAAI;SACP,CAAC;QACF,IAAI,IAAI,CAAC,mBAAmB,KAAK,SAAS;YAAE,CAAC,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC;QAC7F,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;CACD;AAED,iFAAiF;AAEjF,4EAA4E;AAC5E,MAAM,UAAU,WAAW,CAAC,IAAU;IACrC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC;AAClC,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,WAAW,CAAC,KAAa;IACxC,OAAO,KAAK,GAAG,MAAM,CAAC;AACvB,CAAC;AAED,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,SAAS,sBAAsB,CAAC,IAAwB;IACvD,MAAM,CAAC,GAA4B,EAAE,CAAC;IACtC,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS;QAAE,CAAC,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;IACpF,IAAI,IAAI,CAAC,kBAAkB,KAAK,SAAS;QAAE,CAAC,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;IAC1F,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACnD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;QAAE,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IACzD,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS;QAAE,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;IAC3E,OAAO,CAAC,CAAC;AACV,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/config.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1C,MAAM,WAAW,aAAa;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;CACzB;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAKnD,eAAO,MAAM,SAAS,wBAAwB,CAAC;AAC/C,eAAO,MAAM,SAAS,wBAAwB,CAAC;AAC/C,eAAO,MAAM,QAAQ,OAAO,CAAC;AAE7B,wCAAwC;AACxC,eAAO,MAAM,aAAa,wBAAY,CAAC;AACvC,wCAAwC;AACxC,eAAO,MAAM,aAAa,wBAAY,CAAC;AAEvC,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAEnE;AAED,iDAAiD;AACjD,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAEvE;AAED,wBAAgB,gBAAgB,IAAI,aAAa,CAQhD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAGtD;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAgBD,wBAAgB,aAAa,CAAC,SAAS,CAAC,EAAE,aAAa,GAAG,aAAa,CAuBtE"}
|
|
@@ -24,6 +24,7 @@ export function loadStoredConfig() {
|
|
|
24
24
|
return JSON.parse(readFileSync(CONFIG_PATH, "utf-8"));
|
|
25
25
|
}
|
|
26
26
|
catch {
|
|
27
|
+
// Corrupted or unreadable config file — treat as empty
|
|
27
28
|
return {};
|
|
28
29
|
}
|
|
29
30
|
}
|
|
@@ -38,19 +39,18 @@ export function getConfigPath() {
|
|
|
38
39
|
function fromEnv() {
|
|
39
40
|
const env = process.env;
|
|
40
41
|
const result = {};
|
|
41
|
-
if (env
|
|
42
|
-
result.clientId = env
|
|
43
|
-
if (env
|
|
44
|
-
result.clientSecret = env
|
|
45
|
-
if (env
|
|
46
|
-
result.accessToken = env
|
|
47
|
-
if (env
|
|
48
|
-
result.refreshToken = env
|
|
49
|
-
if (env
|
|
50
|
-
result.accountId = Number(env
|
|
51
|
-
if (env
|
|
52
|
-
env
|
|
53
|
-
result.environment = env["CTRADER_ENVIRONMENT"];
|
|
42
|
+
if (env.CTRADER_CLIENT_ID)
|
|
43
|
+
result.clientId = env.CTRADER_CLIENT_ID;
|
|
44
|
+
if (env.CTRADER_CLIENT_SECRET)
|
|
45
|
+
result.clientSecret = env.CTRADER_CLIENT_SECRET;
|
|
46
|
+
if (env.CTRADER_ACCESS_TOKEN)
|
|
47
|
+
result.accessToken = env.CTRADER_ACCESS_TOKEN;
|
|
48
|
+
if (env.CTRADER_REFRESH_TOKEN)
|
|
49
|
+
result.refreshToken = env.CTRADER_REFRESH_TOKEN;
|
|
50
|
+
if (env.CTRADER_ACCOUNT_ID)
|
|
51
|
+
result.accountId = Number(env.CTRADER_ACCOUNT_ID);
|
|
52
|
+
if (env.CTRADER_ENVIRONMENT === "live" || env.CTRADER_ENVIRONMENT === "demo") {
|
|
53
|
+
result.environment = env.CTRADER_ENVIRONMENT;
|
|
54
54
|
}
|
|
55
55
|
return result;
|
|
56
56
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { API_PORT, type PartialConfig, DEMO_HOST, LIVE_HOST } from "./config.js";
|
|
2
1
|
import { CTrader } from "./client.js";
|
|
2
|
+
import { API_PORT, DEMO_HOST, LIVE_HOST, type PartialConfig } from "./config.js";
|
|
3
3
|
export { DEMO_HOST, LIVE_HOST, API_PORT };
|
|
4
4
|
/** @deprecated Use DEMO_HOST */
|
|
5
5
|
export declare const DEMO_ENDPOINT = "demo.ctraderapi.com";
|
|
@@ -35,8 +35,8 @@ export interface ConnectOptions extends PartialConfig {
|
|
|
35
35
|
*
|
|
36
36
|
* @example
|
|
37
37
|
* const ct = await connect();
|
|
38
|
-
* const pos = await ct.buy("EURUSD", {
|
|
39
|
-
* await ct.close(pos.
|
|
38
|
+
* const pos = await ct.buy("EURUSD", { lots: 0.01 });
|
|
39
|
+
* await ct.close(pos.positionId);
|
|
40
40
|
*
|
|
41
41
|
* @example
|
|
42
42
|
* const ct = await connect({ environment: "live" });
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../../src/core/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EACN,QAAQ,EACR,SAAS,EAET,SAAS,EACT,KAAK,aAAa,EAElB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AAC1C,gCAAgC;AAChC,eAAO,MAAM,aAAa,wBAAY,CAAC;AACvC,gCAAgC;AAChC,eAAO,MAAM,aAAa,wBAAY,CAAC;AAEvC,MAAM,WAAW,cAAe,SAAQ,aAAa;IACpD;;;;;;;;;;;;;;;;;OAiBG;IACH,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACtD;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,OAAO,CAAC,SAAS,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAqD1E"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { resolveConfig, hostForEnvironment, API_PORT, DEMO_HOST, LIVE_HOST, } from "./config.js";
|
|
2
1
|
import { CTrader } from "./client.js";
|
|
2
|
+
import { API_PORT, DEMO_HOST, hostForEnvironment, LIVE_HOST, resolveConfig, } from "./config.js";
|
|
3
3
|
import { CTraderError } from "./errors.js";
|
|
4
4
|
export { DEMO_HOST, LIVE_HOST, API_PORT };
|
|
5
5
|
/** @deprecated Use DEMO_HOST */
|
|
@@ -15,8 +15,8 @@ export const LIVE_ENDPOINT = LIVE_HOST;
|
|
|
15
15
|
*
|
|
16
16
|
* @example
|
|
17
17
|
* const ct = await connect();
|
|
18
|
-
* const pos = await ct.buy("EURUSD", {
|
|
19
|
-
* await ct.close(pos.
|
|
18
|
+
* const pos = await ct.buy("EURUSD", { lots: 0.01 });
|
|
19
|
+
* await ct.close(pos.positionId);
|
|
20
20
|
*
|
|
21
21
|
* @example
|
|
22
22
|
* const ct = await connect({ environment: "live" });
|
|
@@ -61,9 +61,7 @@ export async function connect(overrides) {
|
|
|
61
61
|
}
|
|
62
62
|
catch (err) {
|
|
63
63
|
// If auth fails and we have a refresh token, attempt one automatic refresh
|
|
64
|
-
if (err instanceof CTraderError &&
|
|
65
|
-
err.isAuthError &&
|
|
66
|
-
config.refreshToken) {
|
|
64
|
+
if (err instanceof CTraderError && err.isAuthError && config.refreshToken) {
|
|
67
65
|
const refreshed = await client.raw.auth.refreshToken(config.refreshToken);
|
|
68
66
|
currentAccessToken = refreshed.accessToken;
|
|
69
67
|
if (refreshed.refreshToken) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../src/core/connect.ts"],"names":[],"mappings":"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"}
|