topstepx-api 1.0.0 → 1.0.2
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/CHANGELOG.md +28 -0
- package/README.md +1 -1
- package/dist/{index.mjs → index.cjs} +41 -17
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.mts +14 -8
- package/dist/index.d.ts +14 -8
- package/dist/index.js +15 -39
- package/dist/index.js.map +1 -1
- package/package.json +4 -3
- package/dist/index.mjs.map +0 -1
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [1.0.2] - 2026-01-19
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
- Fixed account, contract, history, order, position, and trade REST API responses to include `errorMessage`, `errorCode`, and `success` fields in the root of the response payload.
|
|
12
|
+
|
|
13
|
+
## [1.0.1] - 2026-01-19
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
|
|
17
|
+
- Fixed CommonJS (.cjs) exports not being included in the published package. The tsup build configuration now correctly outputs `index.cjs` for CommonJS and `index.js` for ESM, matching the package.json exports.
|
|
18
|
+
|
|
19
|
+
## [1.0.0] - 2025-01-17
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
|
|
23
|
+
- Initial release
|
|
24
|
+
- Full REST API coverage for TopstepX trading API
|
|
25
|
+
- Real-time WebSocket data feeds via Microsoft SignalR
|
|
26
|
+
- Automatic token management with refresh
|
|
27
|
+
- Complete TypeScript type definitions
|
|
28
|
+
- Dual ESM/CommonJS support
|
package/README.md
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var signalr = require('@microsoft/signalr');
|
|
2
4
|
|
|
3
5
|
// src/errors/base-error.ts
|
|
4
6
|
var TopstepXError = class extends Error {
|
|
@@ -235,7 +237,7 @@ var AccountApi = class {
|
|
|
235
237
|
}
|
|
236
238
|
async search(request) {
|
|
237
239
|
const response = await this.http.post("/api/Account/search", request);
|
|
238
|
-
return response
|
|
240
|
+
return response;
|
|
239
241
|
}
|
|
240
242
|
};
|
|
241
243
|
|
|
@@ -252,7 +254,7 @@ var OrderApi = class {
|
|
|
252
254
|
*/
|
|
253
255
|
async search(request) {
|
|
254
256
|
const response = await this.http.post("/api/Order/search", request);
|
|
255
|
-
return response
|
|
257
|
+
return response;
|
|
256
258
|
}
|
|
257
259
|
/**
|
|
258
260
|
* Get all currently open (working) orders for an account.
|
|
@@ -261,7 +263,7 @@ var OrderApi = class {
|
|
|
261
263
|
*/
|
|
262
264
|
async searchOpen(request) {
|
|
263
265
|
const response = await this.http.post("/api/Order/searchOpen", request);
|
|
264
|
-
return response
|
|
266
|
+
return response;
|
|
265
267
|
}
|
|
266
268
|
/**
|
|
267
269
|
* Place a new order.
|
|
@@ -327,7 +329,7 @@ var PositionApi = class {
|
|
|
327
329
|
}
|
|
328
330
|
async searchOpen(request) {
|
|
329
331
|
const response = await this.http.post("/api/Position/searchOpen", request);
|
|
330
|
-
return response
|
|
332
|
+
return response;
|
|
331
333
|
}
|
|
332
334
|
async close(request) {
|
|
333
335
|
return this.http.post(
|
|
@@ -347,7 +349,7 @@ var TradeApi = class {
|
|
|
347
349
|
}
|
|
348
350
|
async search(request) {
|
|
349
351
|
const response = await this.http.post("/api/Trade/search", request);
|
|
350
|
-
return response
|
|
352
|
+
return response;
|
|
351
353
|
}
|
|
352
354
|
};
|
|
353
355
|
|
|
@@ -358,11 +360,11 @@ var ContractApi = class {
|
|
|
358
360
|
}
|
|
359
361
|
async search(request) {
|
|
360
362
|
const response = await this.http.post("/api/Contract/search", request);
|
|
361
|
-
return response
|
|
363
|
+
return response;
|
|
362
364
|
}
|
|
363
365
|
async searchById(request) {
|
|
364
366
|
const response = await this.http.post("/api/Contract/searchById", request);
|
|
365
|
-
return response
|
|
367
|
+
return response;
|
|
366
368
|
}
|
|
367
369
|
};
|
|
368
370
|
|
|
@@ -373,7 +375,7 @@ var HistoryApi = class {
|
|
|
373
375
|
}
|
|
374
376
|
async retrieveBars(request) {
|
|
375
377
|
const response = await this.http.post("/api/History/retrieveBars", request);
|
|
376
|
-
return response
|
|
378
|
+
return response;
|
|
377
379
|
}
|
|
378
380
|
};
|
|
379
381
|
var ConnectionManager = class {
|
|
@@ -392,14 +394,14 @@ var ConnectionManager = class {
|
|
|
392
394
|
}
|
|
393
395
|
async connect() {
|
|
394
396
|
const token = await this.config.auth.getSessionToken();
|
|
395
|
-
this.marketConn = new HubConnectionBuilder().withUrl(`${this.config.marketHubUrl}?access_token=${token}`, {
|
|
397
|
+
this.marketConn = new signalr.HubConnectionBuilder().withUrl(`${this.config.marketHubUrl}?access_token=${token}`, {
|
|
396
398
|
skipNegotiation: true,
|
|
397
|
-
transport: HttpTransportType.WebSockets,
|
|
399
|
+
transport: signalr.HttpTransportType.WebSockets,
|
|
398
400
|
accessTokenFactory: () => this.config.auth.getSessionToken()
|
|
399
401
|
}).withAutomaticReconnect(this.config.reconnectDelays).build();
|
|
400
|
-
this.userConn = new HubConnectionBuilder().withUrl(`${this.config.userHubUrl}?access_token=${token}`, {
|
|
402
|
+
this.userConn = new signalr.HubConnectionBuilder().withUrl(`${this.config.userHubUrl}?access_token=${token}`, {
|
|
401
403
|
skipNegotiation: true,
|
|
402
|
-
transport: HttpTransportType.WebSockets,
|
|
404
|
+
transport: signalr.HttpTransportType.WebSockets,
|
|
403
405
|
accessTokenFactory: () => this.config.auth.getSessionToken()
|
|
404
406
|
}).withAutomaticReconnect(this.config.reconnectDelays).build();
|
|
405
407
|
this.marketConnectionCallbacks.forEach((cb) => cb(this.marketConn));
|
|
@@ -419,7 +421,7 @@ var ConnectionManager = class {
|
|
|
419
421
|
this.userConn = null;
|
|
420
422
|
}
|
|
421
423
|
get isConnected() {
|
|
422
|
-
return this.marketConn?.state === HubConnectionState.Connected && this.userConn?.state === HubConnectionState.Connected;
|
|
424
|
+
return this.marketConn?.state === signalr.HubConnectionState.Connected && this.userConn?.state === signalr.HubConnectionState.Connected;
|
|
423
425
|
}
|
|
424
426
|
get marketConnection() {
|
|
425
427
|
if (!this.marketConn) {
|
|
@@ -771,6 +773,28 @@ var TradeType = /* @__PURE__ */ ((TradeType2) => {
|
|
|
771
773
|
return TradeType2;
|
|
772
774
|
})(TradeType || {});
|
|
773
775
|
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
776
|
+
exports.AccountApi = AccountApi;
|
|
777
|
+
exports.ApiError = ApiError;
|
|
778
|
+
exports.AuthService = AuthService;
|
|
779
|
+
exports.AuthenticationError = AuthenticationError;
|
|
780
|
+
exports.BarUnit = BarUnit;
|
|
781
|
+
exports.ConnectionError = ConnectionError;
|
|
782
|
+
exports.ConnectionManager = ConnectionManager;
|
|
783
|
+
exports.ContractApi = ContractApi;
|
|
784
|
+
exports.HistoryApi = HistoryApi;
|
|
785
|
+
exports.HttpClient = HttpClient;
|
|
786
|
+
exports.MarketHub = MarketHub;
|
|
787
|
+
exports.OrderApi = OrderApi;
|
|
788
|
+
exports.OrderSide = OrderSide;
|
|
789
|
+
exports.OrderStatus = OrderStatus;
|
|
790
|
+
exports.OrderType = OrderType;
|
|
791
|
+
exports.PositionApi = PositionApi;
|
|
792
|
+
exports.PositionType = PositionType;
|
|
793
|
+
exports.TopstepXClient = TopstepXClient;
|
|
794
|
+
exports.TopstepXError = TopstepXError;
|
|
795
|
+
exports.TradeApi = TradeApi;
|
|
796
|
+
exports.TradeType = TradeType;
|
|
797
|
+
exports.TypedEventEmitter = TypedEventEmitter;
|
|
798
|
+
exports.UserHub = UserHub;
|
|
799
|
+
//# sourceMappingURL=index.cjs.map
|
|
800
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors/base-error.ts","../src/errors/auth-error.ts","../src/errors/api-error.ts","../src/errors/connection-error.ts","../src/auth/auth.service.ts","../src/rest/http-client.ts","../src/rest/account/account.api.ts","../src/rest/order/order.api.ts","../src/rest/position/position.api.ts","../src/rest/trade/trade.api.ts","../src/rest/contract/contract.api.ts","../src/rest/history/history.api.ts","../src/realtime/connection-manager.ts","../src/utils/event-emitter.ts","../src/realtime/market/market-hub.ts","../src/realtime/user/user-hub.ts","../src/client.ts","../src/types/enums.ts"],"names":["HubConnectionBuilder","HttpTransportType","HubConnectionState","OrderType","OrderSide","OrderStatus","BarUnit","PositionType","TradeType"],"mappings":";;;;;AAAO,IAAe,aAAA,GAAf,cAAqC,KAAA,CAAM;AAAA,EAGhD,WAAA,CACE,SACgB,IAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAFG,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,KAAK,WAAA,CAAY,IAAA;AAC7B,IAAA,IAAA,CAAK,SAAA,uBAAgB,IAAA,EAAK;AAC1B,IAAA,KAAA,CAAM,iBAAA,GAAoB,IAAA,EAAM,IAAA,CAAK,WAAW,CAAA;AAAA,EAClD;AAAA,EAVgB,SAAA;AAAA,EAYhB,MAAA,GAAkC;AAChC,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,WAAA;AAAY,KACxC;AAAA,EACF;AACF;;;ACnBO,IAAM,mBAAA,GAAN,cAAkC,aAAA,CAAc;AAAA,EACrD,WAAA,CAAY,SAAiB,IAAA,EAAe;AAC1C,IAAA,KAAA,CAAM,SAAS,IAAI,CAAA;AAAA,EACrB;AACF;;;ACJO,IAAM,QAAA,GAAN,cAAuB,aAAA,CAAc;AAAA,EAC1C,WAAA,CACE,OAAA,EACA,IAAA,EACgB,QAAA,EAChB;AACA,IAAA,KAAA,CAAM,SAAS,IAAI,CAAA;AAFH,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EAGlB;AAAA,EAEA,MAAA,GAAkC;AAChC,IAAA,OAAO;AAAA,MACL,GAAG,MAAM,MAAA,EAAO;AAAA,MAChB,UAAU,IAAA,CAAK;AAAA,KACjB;AAAA,EACF;AACF;;;ACfO,IAAM,eAAA,GAAN,cAA8B,aAAA,CAAc;AAAA,EACjD,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AAAA,EACf;AACF;;;ACHO,IAAM,cAAN,MAAkB;AAAA,EACf,YAAA,GAA8B,IAAA;AAAA,EAC9B,eAAA,GAA+B,IAAA;AAAA,EAC/B,YAAA;AAAA,EACS,MAAA;AAAA,EAEjB,YAAY,MAAA,EAAoB;AAC9B,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,OAAA,EAAS,OAAO,OAAA,IAAW,0BAAA;AAAA,MAC3B,WAAA,EAAa,OAAO,WAAA,IAAe,IAAA;AAAA,MACnC,kBAAA,EAAoB,OAAO,kBAAA,IAAsB;AAAA,KACnD;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,OAAA,GAAwB;AAAA,MAC5B,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,MACtB,MAAA,EAAQ,KAAK,MAAA,CAAO;AAAA,KACtB;AAEA,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,kBAAA,CAAA,EAAsB;AAAA,MACvE,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,KAC7B,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,mBAAA;AAAA,QACR,CAAA,yBAAA,EAA4B,SAAS,MAAM,CAAA,CAAA;AAAA,QAC3C,QAAA,CAAS;AAAA,OACX;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAElC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,cAAc,CAAA,EAAG;AACzC,MAAA,MAAM,IAAI,mBAAA;AAAA,QACR,KAAK,YAAA,IAAgB,cAAA;AAAA,QACrB,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,KAAA;AACzB,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAExB,IAAA,IAAI,IAAA,CAAK,OAAO,WAAA,EAAa;AAC3B,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,GAA6B;AACjC,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,EAAc,OAAO,KAAA;AAE/B,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,kBAAA,CAAA,EAAsB;AAAA,QACvE,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,MAAA,EAAQ,YAAA;AAAA,UACR,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,YAAY,CAAA;AAAA;AAC5C,OACD,CAAA;AAED,MAAA,IAAI,SAAS,EAAA,EAAI;AACf,QAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,eAAA,GAAmC;AACvC,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,gBAAe,EAAG;AAC/C,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,EAAS;AACpC,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,KAAK,KAAA,EAAM;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,oBAAoB,mCAAmC,CAAA;AAAA,IACnE;AAEA,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,IAAI,OAAA,GAAkB;AACpB,IAAA,OAAO,KAAK,MAAA,CAAO,OAAA;AAAA,EACrB;AAAA,EAEQ,kBAAA,GAA2B;AACjC,IAAA,MAAM,UAAA,uBAAiB,IAAA,EAAK;AAC5B,IAAA,UAAA,CAAW,QAAA;AAAA,MACT,UAAA,CAAW,QAAA,EAAS,GAAI,IAAA,CAAK,MAAA,CAAO;AAAA,KACtC;AACA,IAAA,IAAA,CAAK,eAAA,GAAkB,UAAA;AAAA,EACzB;AAAA,EAEQ,cAAA,GAA0B;AAChC,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,EAAiB,OAAO,IAAA;AAElC,IAAA,MAAM,MAAA,GAAS,IAAI,EAAA,GAAK,GAAA;AACxB,IAAA,OAAO,KAAK,GAAA,EAAI,IAAK,IAAA,CAAK,eAAA,CAAgB,SAAQ,GAAI,MAAA;AAAA,EACxD;AAAA,EAEQ,oBAAA,GAA6B;AACnC,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,YAAA,CAAa,KAAK,YAAY,CAAA;AAAA,IAChC;AAEA,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AAG3B,IAAA,MAAM,WAAA,GACJ,KAAK,eAAA,CAAgB,OAAA,KAAY,IAAA,CAAK,GAAA,EAAI,GAAI,EAAA,GAAK,EAAA,GAAK,GAAA;AAE1D,IAAA,IAAI,cAAc,CAAA,EAAG;AACnB,MAAA,IAAA,CAAK,YAAA,GAAe,WAAW,YAAY;AACzC,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,EAAS;AACpC,UAAA,IAAI,CAAC,OAAA,EAAS;AACZ,YAAA,MAAM,KAAK,KAAA,EAAM;AAAA,UACnB;AACA,UAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,QAC5B,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAAA,QAC9C;AAAA,MACF,GAAG,WAAW,CAAA;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,YAAA,CAAa,KAAK,YAAY,CAAA;AAAA,IAChC;AACA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,EACzB;AACF;;;ACtIO,IAAM,aAAN,MAAiB;AAAA,EACL,MAAA;AAAA,EAEjB,YAAY,MAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,OAAA,EAAS,OAAO,OAAA,IAAW;AAAA,KAC7B;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,CACJ,QAAA,EACA,IAAA,EACoB;AACpB,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,EAAS;AACzC,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,SAAA,GAAY,WAAW,MAAM,UAAA,CAAW,OAAM,EAAG,IAAA,CAAK,OAAO,OAAO,CAAA;AAE1E,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,MAAA,CAAO,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI;AAAA,QAChE,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,MAAA,EAAQ,kBAAA;AAAA,UACR,aAAA,EAAe,UAAU,KAAK,CAAA;AAAA,SAChC;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,QACzB,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,QAAA;AAAA,UACR,CAAA,YAAA,EAAe,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA,CAAA;AAAA,UACrD,QAAA,CAAS,MAAA;AAAA,UACT;AAAA,SACF;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK;AAEpC,MAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,cAAc,CAAA,EAAG;AAC7C,QAAA,MAAM,IAAI,QAAA;AAAA,UACR,OAAO,YAAA,IAAgB,oBAAA;AAAA,UACvB,MAAA,CAAO,SAAA;AAAA,UACP;AAAA,SACF;AAAA,MACF;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,KAAA,YAAiB,UAAU,MAAM,KAAA;AAErC,MAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACzD,QAAA,MAAM,IAAI,QAAA,CAAS,iBAAA,EAAmB,EAAA,EAAI,QAAQ,CAAA;AAAA,MACpD;AAEA,MAAA,MAAM,IAAI,QAAA;AAAA,QACR,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAAA,QACzC,EAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AACF;;;AC/EO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAEhD,MAAM,OACJ,OAAA,EACiC;AACjC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAG/B,uBAAuB,OAAO,CAAA;AAChC,IAAA,OAAO,QAAA;AAAA,EACT;AACF;;;ACmBO,IAAM,WAAN,MAAe;AAAA;AAAA,EAEpB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhD,MAAM,OAAO,OAAA,EAA6D;AACxE,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAG/B,qBAAqB,OAAO,CAAA;AAC9B,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WACJ,OAAA,EACmC;AACnC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAG/B,yBAAyB,OAAO,CAAA;AAClC,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6BA,MAAM,MAAM,OAAA,EAAyD;AACnE,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,kBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAO,OAAA,EAA2D;AACtE,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,mBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAO,OAAA,EAA2D;AACtE,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,mBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;;;ACjHO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAEhD,MAAM,WACJ,OAAA,EACsC;AACtC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAG/B,4BAA4B,OAAO,CAAA;AACrC,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAM,MAAM,OAAA,EAA+D;AACzE,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,6BAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,aACJ,OAAA,EACuC;AACvC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAGf,oCAAA,EAAsC,OAAO,CAAA;AAAA,EACjD;AACF;;;ACnCO,IAAM,WAAN,MAAe;AAAA,EACpB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAEhD,MAAM,OAAO,OAAA,EAA6D;AACxE,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAG/B,qBAAqB,OAAO,CAAA;AAC9B,IAAA,OAAO,QAAA;AAAA,EACT;AACF;;;ACLO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAEhD,MAAM,OACJ,OAAA,EACkC;AAClC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAG/B,wBAAwB,OAAO,CAAA;AACjC,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAM,WACJ,OAAA,EAC4C;AAC5C,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAG/B,4BAA4B,OAAO,CAAA;AACrC,IAAA,OAAO,QAAA;AAAA,EACT;AACF;;;AC3BO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAEhD,MAAM,aACJ,OAAA,EAC+B;AAC/B,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAG/B,6BAA6B,OAAO,CAAA;AACtC,IAAA,OAAO,QAAA;AAAA,EACT;AACF;ACCO,IAAM,oBAAN,MAAwB;AAAA,EACrB,UAAA,GAAmC,IAAA;AAAA,EACnC,QAAA,GAAiC,IAAA;AAAA,EACxB,MAAA;AAAA,EACT,4BAAkE,EAAC;AAAA,EACnE,0BAAgE,EAAC;AAAA,EAEzE,YAAY,MAAA,EAAiC;AAC3C,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,eAAA,EAAiB,OAAO,eAAA,IAAmB,CAAC,GAAG,GAAA,EAAM,GAAA,EAAM,KAAO,GAAK;AAAA,KACzE;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,MAAA,CAAO,KAAK,eAAA,EAAgB;AAGrD,IAAA,IAAA,CAAK,UAAA,GAAa,IAAIA,4BAAA,EAAqB,CACxC,OAAA,CAAQ,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,YAAY,CAAA,cAAA,EAAiB,KAAK,CAAA,CAAA,EAAI;AAAA,MAC5D,eAAA,EAAiB,IAAA;AAAA,MACjB,WAAWC,yBAAA,CAAkB,UAAA;AAAA,MAC7B,kBAAA,EAAoB,MAAM,IAAA,CAAK,MAAA,CAAO,KAAK,eAAA;AAAgB,KAC5D,CAAA,CACA,sBAAA,CAAuB,KAAK,MAAA,CAAO,eAAe,EAClD,KAAA,EAAM;AAGT,IAAA,IAAA,CAAK,QAAA,GAAW,IAAID,4BAAA,EAAqB,CACtC,OAAA,CAAQ,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA,cAAA,EAAiB,KAAK,CAAA,CAAA,EAAI;AAAA,MAC1D,eAAA,EAAiB,IAAA;AAAA,MACjB,WAAWC,yBAAA,CAAkB,UAAA;AAAA,MAC7B,kBAAA,EAAoB,MAAM,IAAA,CAAK,MAAA,CAAO,KAAK,eAAA;AAAgB,KAC5D,CAAA,CACA,sBAAA,CAAuB,KAAK,MAAA,CAAO,eAAe,EAClD,KAAA,EAAM;AAGT,IAAA,IAAA,CAAK,0BAA0B,OAAA,CAAQ,CAAC,OAAO,EAAA,CAAG,IAAA,CAAK,UAAW,CAAC,CAAA;AACnE,IAAA,IAAA,CAAK,wBAAwB,OAAA,CAAQ,CAAC,OAAO,EAAA,CAAG,IAAA,CAAK,QAAS,CAAC,CAAA;AAG/D,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,WAAW,KAAA,EAAM;AAC5B,MAAA,MAAM,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,IAC5B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,CAAA,2CAAA,EACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAC3C,CAAA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,CAAK,UAAA,EAAY,IAAA,EAAK,EAAG,IAAA,CAAK,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA;AAClE,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EAClB;AAAA,EAEA,IAAI,WAAA,GAAuB;AACzB,IAAA,OACE,IAAA,CAAK,YAAY,KAAA,KAAUC,0BAAA,CAAmB,aAC9C,IAAA,CAAK,QAAA,EAAU,UAAUA,0BAAA,CAAmB,SAAA;AAAA,EAEhD;AAAA,EAEA,IAAI,gBAAA,GAAkC;AACpC,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,MAAM,IAAI,gBAAgB,mCAAmC,CAAA;AAAA,IAC/D;AACA,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,IAAI,cAAA,GAAgC;AAClC,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,MAAM,IAAI,gBAAgB,iCAAiC,CAAA;AAAA,IAC7D;AACA,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEA,mBAAmB,QAAA,EAA+C;AAChE,IAAA,IAAA,CAAK,yBAAA,CAA0B,KAAK,QAAQ,CAAA;AAC5C,IAAA,IAAI,IAAA,CAAK,UAAA,EAAY,QAAA,CAAS,IAAA,CAAK,UAAU,CAAA;AAAA,EAC/C;AAAA,EAEA,iBAAiB,QAAA,EAA+C;AAC9D,IAAA,IAAA,CAAK,uBAAA,CAAwB,KAAK,QAAQ,CAAA;AAC1C,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC3C;AACF;;;ACxGO,IAAM,oBAAN,MAAuD;AAAA,EACpD,SAAA,uBAAgB,GAAA,EAA6C;AAAA,EAErE,EAAA,CAAsB,OAAU,QAAA,EAAqC;AACnE,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,EAAG;AAC9B,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,kBAAO,IAAI,KAAK,CAAA;AAAA,IACrC;AACA,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,CAAG,IAAI,QAAqC,CAAA;AACpE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,GAAA,CAAuB,OAAU,QAAA,EAAqC;AACpE,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,QAAqC,CAAA;AACvE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAA,CAAwB,OAAU,QAAA,EAAqC;AACrE,IAAA,MAAM,YAAA,IAAgB,CAAC,IAAA,KAAe;AACpC,MAAA,IAAA,CAAK,GAAA,CAAI,OAAO,YAAmC,CAAA;AACnD,MAAC,SAAkC,IAAI,CAAA;AAAA,IACzC,CAAA,CAAA;AACA,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO,YAAY,CAAA;AAAA,EACpC;AAAA,EAEU,IAAA,CACR,UACG,IAAA,EACM;AACT,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAC1C,IAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,IAAA,KAAS,GAAG,OAAO,KAAA;AAE/C,IAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,QAAA,KAAa;AAC9B,MAAA,IAAI;AACF,QAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,UAAC,QAAA,CAAkC,IAAA,CAAK,CAAC,CAAS,CAAA;AAAA,QACpD,CAAA,MAAO;AACL,UAAC,QAAA,EAAwB;AAAA,QAC3B;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,MAAM,CAAA,4BAAA,EAA+B,MAAA,CAAO,KAAK,CAAC,KAAK,KAAK,CAAA;AAAA,MACtE;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,mBAAsC,KAAA,EAAiB;AACrD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,KAAK,CAAA;AAAA,IAC7B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,IACvB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;ACrDO,IAAM,SAAA,GAAN,cAAwB,iBAAA,CAAmC;AAAA,EAKhE,YAA6B,iBAAA,EAAsC;AACjE,IAAA,KAAA,EAAM;AADqB,IAAA,IAAA,CAAA,iBAAA,GAAA,iBAAA;AAE3B,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,EAC1B;AAAA,EAPQ,gBAAA,uBAAuB,GAAA,EAAY;AAAA,EACnC,gBAAA,uBAAuB,GAAA,EAAY;AAAA,EACnC,eAAA,uBAAsB,GAAA,EAAY;AAAA,EAOlC,kBAAA,GAA2B;AACjC,IAAA,IAAA,CAAK,iBAAA,CAAkB,kBAAA,CAAmB,CAAC,UAAA,KAAe;AACxD,MAAA,UAAA,CAAW,EAAA,CAAG,cAAA,EAAgB,CAAC,UAAA,EAAoB,IAAA,KAAkB;AACnE,QAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,EAAE,UAAA,EAAY,MAAM,CAAA;AAAA,MACzC,CAAC,CAAA;AAED,MAAA,UAAA,CAAW,EAAA;AAAA,QACT,cAAA;AAAA,QACA,CAAC,YAAoB,IAAA,KAAwB;AAC3C,UAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,EAAE,UAAA,EAAY,MAAM,CAAA;AAAA,QACzC;AAAA,OACF;AAEA,MAAA,UAAA,CAAW,EAAA;AAAA,QACT,cAAA;AAAA,QACA,CAAC,YAAoB,IAAA,KAAwB;AAC3C,UAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,EAAE,UAAA,EAAY,MAAM,CAAA;AAAA,QACzC;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,UAAU,UAAA,EAAmC;AACjD,IAAA,MAAM,QAAQ,GAAA,CAAI;AAAA,MAChB,IAAA,CAAK,gBAAgB,UAAU,CAAA;AAAA,MAC/B,IAAA,CAAK,gBAAgB,UAAU,CAAA;AAAA,MAC/B,IAAA,CAAK,eAAe,UAAU;AAAA,KAC/B,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,UAAA,EAAmC;AACnD,IAAA,MAAM,QAAQ,GAAA,CAAI;AAAA,MAChB,IAAA,CAAK,kBAAkB,UAAU,CAAA;AAAA,MACjC,IAAA,CAAK,kBAAkB,UAAU,CAAA;AAAA,MACjC,IAAA,CAAK,iBAAiB,UAAU;AAAA,KACjC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,gBAAgB,UAAA,EAAmC;AACvD,IAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,UAAU,CAAA,EAAG;AAC3C,IAAA,MAAM,UAAA,GAAa,KAAK,iBAAA,CAAkB,gBAAA;AAC1C,IAAA,MAAM,UAAA,CAAW,MAAA,CAAO,yBAAA,EAA2B,UAAU,CAAA;AAC7D,IAAA,IAAA,CAAK,gBAAA,CAAiB,IAAI,UAAU,CAAA;AAAA,EACtC;AAAA,EAEA,MAAM,kBAAkB,UAAA,EAAmC;AACzD,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,UAAU,CAAA,EAAG;AAC5C,IAAA,MAAM,UAAA,GAAa,KAAK,iBAAA,CAAkB,gBAAA;AAC1C,IAAA,MAAM,UAAA,CAAW,MAAA,CAAO,2BAAA,EAA6B,UAAU,CAAA;AAC/D,IAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,UAAU,CAAA;AAAA,EACzC;AAAA,EAEA,MAAM,gBAAgB,UAAA,EAAmC;AACvD,IAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,UAAU,CAAA,EAAG;AAC3C,IAAA,MAAM,UAAA,GAAa,KAAK,iBAAA,CAAkB,gBAAA;AAC1C,IAAA,MAAM,UAAA,CAAW,MAAA,CAAO,yBAAA,EAA2B,UAAU,CAAA;AAC7D,IAAA,IAAA,CAAK,gBAAA,CAAiB,IAAI,UAAU,CAAA;AAAA,EACtC;AAAA,EAEA,MAAM,kBAAkB,UAAA,EAAmC;AACzD,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,UAAU,CAAA,EAAG;AAC5C,IAAA,MAAM,UAAA,GAAa,KAAK,iBAAA,CAAkB,gBAAA;AAC1C,IAAA,MAAM,UAAA,CAAW,MAAA,CAAO,2BAAA,EAA6B,UAAU,CAAA;AAC/D,IAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,UAAU,CAAA;AAAA,EACzC;AAAA,EAEA,MAAM,eAAe,UAAA,EAAmC;AACtD,IAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,UAAU,CAAA,EAAG;AAC1C,IAAA,MAAM,UAAA,GAAa,KAAK,iBAAA,CAAkB,gBAAA;AAC1C,IAAA,MAAM,UAAA,CAAW,MAAA,CAAO,8BAAA,EAAgC,UAAU,CAAA;AAClE,IAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,UAAU,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,iBAAiB,UAAA,EAAmC;AACxD,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,UAAU,CAAA,EAAG;AAC3C,IAAA,MAAM,UAAA,GAAa,KAAK,iBAAA,CAAkB,gBAAA;AAC1C,IAAA,MAAM,UAAA,CAAW,MAAA,CAAO,gCAAA,EAAkC,UAAU,CAAA;AACpE,IAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,UAAU,CAAA;AAAA,EACxC;AACF;;;ACnFO,IAAM,OAAA,GAAN,cAAsB,iBAAA,CAAiC;AAAA,EAK5D,YAA6B,iBAAA,EAAsC;AACjE,IAAA,KAAA,EAAM;AADqB,IAAA,IAAA,CAAA,iBAAA,GAAA,iBAAA;AAE3B,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,EAC1B;AAAA,EAPQ,gBAAA,uBAAuB,GAAA,EAAY;AAAA,EACnC,mBAAA,uBAA0B,GAAA,EAAY;AAAA,EACtC,gBAAA,uBAAuB,GAAA,EAAY;AAAA,EAOnC,kBAAA,GAA2B;AACjC,IAAA,IAAA,CAAK,iBAAA,CAAkB,gBAAA,CAAiB,CAAC,UAAA,KAAe;AACtD,MAAA,UAAA,CAAW,EAAA,CAAG,oBAAA,EAAsB,CAAC,IAAA,KAAwB;AAC3D,QAAA,IAAA,CAAK,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,MAC3B,CAAC,CAAA;AAED,MAAA,UAAA,CAAW,EAAA,CAAG,kBAAA,EAAoB,CAAC,IAAA,KAAsB;AACvD,QAAA,IAAA,CAAK,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,MACzB,CAAC,CAAA;AAED,MAAA,UAAA,CAAW,EAAA,CAAG,qBAAA,EAAuB,CAAC,IAAA,KAAyB;AAC7D,QAAA,IAAA,CAAK,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,MAC5B,CAAC,CAAA;AAED,MAAA,UAAA,CAAW,EAAA,CAAG,kBAAA,EAAoB,CAAC,IAAA,KAAsB;AACvD,QAAA,IAAA,CAAK,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,MACzB,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,UAAU,SAAA,EAAkC;AAChD,IAAA,MAAM,QAAQ,GAAA,CAAI;AAAA,MAChB,IAAA,CAAK,gBAAgB,SAAS,CAAA;AAAA,MAC9B,IAAA,CAAK,mBAAmB,SAAS,CAAA;AAAA,MACjC,IAAA,CAAK,gBAAgB,SAAS;AAAA,KAC/B,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,SAAA,EAAkC;AAClD,IAAA,MAAM,QAAQ,GAAA,CAAI;AAAA,MAChB,IAAA,CAAK,kBAAkB,SAAS,CAAA;AAAA,MAChC,IAAA,CAAK,qBAAqB,SAAS,CAAA;AAAA,MACnC,IAAA,CAAK,kBAAkB,SAAS;AAAA,KACjC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,gBAAgB,SAAA,EAAkC;AACtD,IAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,SAAS,CAAA,EAAG;AAC1C,IAAA,MAAM,UAAA,GAAa,KAAK,iBAAA,CAAkB,cAAA;AAC1C,IAAA,MAAM,UAAA,CAAW,MAAA,CAAO,iBAAA,EAAmB,SAAS,CAAA;AACpD,IAAA,IAAA,CAAK,gBAAA,CAAiB,IAAI,SAAS,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,kBAAkB,SAAA,EAAkC;AACxD,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,SAAS,CAAA,EAAG;AAC3C,IAAA,MAAM,UAAA,GAAa,KAAK,iBAAA,CAAkB,cAAA;AAC1C,IAAA,MAAM,UAAA,CAAW,MAAA,CAAO,mBAAA,EAAqB,SAAS,CAAA;AACtD,IAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,SAAS,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,mBAAmB,SAAA,EAAkC;AACzD,IAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,SAAS,CAAA,EAAG;AAC7C,IAAA,MAAM,UAAA,GAAa,KAAK,iBAAA,CAAkB,cAAA;AAC1C,IAAA,MAAM,UAAA,CAAW,MAAA,CAAO,oBAAA,EAAsB,SAAS,CAAA;AACvD,IAAA,IAAA,CAAK,mBAAA,CAAoB,IAAI,SAAS,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,qBAAqB,SAAA,EAAkC;AAC3D,IAAA,IAAI,CAAC,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,SAAS,CAAA,EAAG;AAC9C,IAAA,MAAM,UAAA,GAAa,KAAK,iBAAA,CAAkB,cAAA;AAC1C,IAAA,MAAM,UAAA,CAAW,MAAA,CAAO,sBAAA,EAAwB,SAAS,CAAA;AACzD,IAAA,IAAA,CAAK,mBAAA,CAAoB,OAAO,SAAS,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,gBAAgB,SAAA,EAAkC;AACtD,IAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,SAAS,CAAA,EAAG;AAC1C,IAAA,MAAM,UAAA,GAAa,KAAK,iBAAA,CAAkB,cAAA;AAC1C,IAAA,MAAM,UAAA,CAAW,MAAA,CAAO,iBAAA,EAAmB,SAAS,CAAA;AACpD,IAAA,IAAA,CAAK,gBAAA,CAAiB,IAAI,SAAS,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,kBAAkB,SAAA,EAAkC;AACxD,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,SAAS,CAAA,EAAG;AAC3C,IAAA,MAAM,UAAA,GAAa,KAAK,iBAAA,CAAkB,cAAA;AAC1C,IAAA,MAAM,UAAA,CAAW,MAAA,CAAO,mBAAA,EAAqB,SAAS,CAAA;AACtD,IAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,SAAS,CAAA;AAAA,EACxC;AACF;;;AClDO,IAAM,cAAA,GAAN,cAA6B,iBAAA,CAAwC;AAAA,EACzD,IAAA;AAAA,EACA,iBAAA;AAAA,EACA,UAAA;AAAA;AAAA,EAGD,QAAA;AAAA;AAAA,EAEA,MAAA;AAAA;AAAA,EAEA,SAAA;AAAA;AAAA,EAEA,MAAA;AAAA;AAAA,EAEA,SAAA;AAAA;AAAA,EAEA,OAAA;AAAA;AAAA,EAGA,SAAA;AAAA;AAAA,EAEA,OAAA;AAAA,EAEhB,YAAY,MAAA,EAA8B;AACxC,IAAA,KAAA,EAAM;AAEN,IAAA,MAAM,OAAA,GAAU,OAAO,OAAA,IAAW,0BAAA;AAElC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,WAAA,CAAY;AAAA,MAC1B,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,OAAA;AAAA,MACA,WAAA,EAAa,OAAO,WAAA,IAAe,IAAA;AAAA,MACnC,kBAAA,EAAoB,OAAO,kBAAA,IAAsB;AAAA,KAClD,CAAA;AAED,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,UAAA,CAAW;AAAA,MAC/B,OAAA;AAAA,MACA,QAAA,EAAU,MAAM,IAAA,CAAK,IAAA,CAAK,eAAA;AAAgB,KAC3C,CAAA;AAGD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA;AAC9C,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,QAAA,CAAS,IAAA,CAAK,UAAU,CAAA;AAC1C,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,WAAA,CAAY,IAAA,CAAK,UAAU,CAAA;AAChD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,QAAA,CAAS,IAAA,CAAK,UAAU,CAAA;AAC1C,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,WAAA,CAAY,IAAA,CAAK,UAAU,CAAA;AAChD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA;AAG7C,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAI,iBAAA,CAAkB;AAAA,MAC7C,YAAA,EAAc,OAAO,YAAA,IAAgB,sCAAA;AAAA,MACrC,UAAA,EAAY,OAAO,UAAA,IAAc,oCAAA;AAAA,MACjC,MAAM,IAAA,CAAK;AAAA,KACZ,CAAA;AAED,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,SAAA,CAAU,IAAA,CAAK,iBAAiB,CAAA;AACrD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,OAAA,CAAQ,IAAA,CAAK,iBAAiB,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAA,GAAyB;AAC7B,IAAA,MAAM,IAAA,CAAK,KAAK,KAAA,EAAM;AACtB,IAAA,MAAM,IAAA,CAAK,kBAAkB,OAAA,EAAQ;AACrC,IAAA,IAAA,CAAK,KAAK,WAAW,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAChC,IAAA,MAAM,IAAA,CAAK,kBAAkB,UAAA,EAAW;AACxC,IAAA,IAAA,CAAK,KAAK,OAAA,EAAQ;AAClB,IAAA,IAAA,CAAK,KAAK,cAAc,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,WAAA,GAAuB;AACzB,IAAA,OAAO,KAAK,iBAAA,CAAkB,WAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAA4B;AAChC,IAAA,OAAO,IAAA,CAAK,KAAK,eAAA,EAAgB;AAAA,EACnC;AACF;;;ACvIO,IAAK,SAAA,qBAAAC,UAAAA,KAAL;AAEL,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,WAAQ,CAAA,CAAA,GAAR,OAAA;AAEA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,YAAS,CAAA,CAAA,GAAT,QAAA;AAEA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AAEA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,eAAY,CAAA,CAAA,GAAZ,WAAA;AARU,EAAA,OAAAA,UAAAA;AAAA,CAAA,EAAA,SAAA,IAAA,EAAA;AAeL,IAAK,SAAA,qBAAAC,UAAAA,KAAL;AAEL,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,SAAM,CAAA,CAAA,GAAN,KAAA;AAEA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AAJU,EAAA,OAAAA,UAAAA;AAAA,CAAA,EAAA,SAAA,IAAA,EAAA;AAWL,IAAK,WAAA,qBAAAC,YAAAA,KAAL;AAEL,EAAAA,YAAAA,CAAAA,YAAAA,CAAA,aAAU,CAAA,CAAA,GAAV,SAAA;AAEA,EAAAA,YAAAA,CAAAA,YAAAA,CAAA,aAAU,CAAA,CAAA,GAAV,SAAA;AAEA,EAAAA,YAAAA,CAAAA,YAAAA,CAAA,YAAS,CAAA,CAAA,GAAT,QAAA;AAEA,EAAAA,YAAAA,CAAAA,YAAAA,CAAA,eAAY,CAAA,CAAA,GAAZ,WAAA;AAEA,EAAAA,YAAAA,CAAAA,YAAAA,CAAA,cAAW,CAAA,CAAA,GAAX,UAAA;AAEA,EAAAA,YAAAA,CAAAA,YAAAA,CAAA,qBAAkB,CAAA,CAAA,GAAlB,iBAAA;AAZU,EAAA,OAAAA,YAAAA;AAAA,CAAA,EAAA,WAAA,IAAA,EAAA;AAmBL,IAAK,OAAA,qBAAAC,QAAAA,KAAL;AAEL,EAAAA,QAAAA,CAAAA,QAAAA,CAAA,YAAS,CAAA,CAAA,GAAT,QAAA;AAEA,EAAAA,QAAAA,CAAAA,QAAAA,CAAA,YAAS,CAAA,CAAA,GAAT,QAAA;AAEA,EAAAA,QAAAA,CAAAA,QAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AAEA,EAAAA,QAAAA,CAAAA,QAAAA,CAAA,SAAM,CAAA,CAAA,GAAN,KAAA;AAEA,EAAAA,QAAAA,CAAAA,QAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AAEA,EAAAA,QAAAA,CAAAA,QAAAA,CAAA,WAAQ,CAAA,CAAA,GAAR,OAAA;AAZU,EAAA,OAAAA,QAAAA;AAAA,CAAA,EAAA,OAAA,IAAA,EAAA;AAmBL,IAAK,YAAA,qBAAAC,aAAAA,KAAL;AAEL,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AAEA,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,WAAQ,CAAA,CAAA,GAAR,OAAA;AAJU,EAAA,OAAAA,aAAAA;AAAA,CAAA,EAAA,YAAA,IAAA,EAAA;AAWL,IAAK,SAAA,qBAAAC,UAAAA,KAAL;AAEL,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,SAAM,CAAA,CAAA,GAAN,KAAA;AAEA,EAAAA,UAAAA,CAAAA,UAAAA,CAAA,SAAM,CAAA,CAAA,GAAN,KAAA;AAJU,EAAA,OAAAA,UAAAA;AAAA,CAAA,EAAA,SAAA,IAAA,EAAA","file":"index.cjs","sourcesContent":["export abstract class TopstepXError extends Error {\n public readonly timestamp: Date;\n\n constructor(\n message: string,\n public readonly code?: number\n ) {\n super(message);\n this.name = this.constructor.name;\n this.timestamp = new Date();\n Error.captureStackTrace?.(this, this.constructor);\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n timestamp: this.timestamp.toISOString(),\n };\n }\n}\n","import { TopstepXError } from './base-error';\n\nexport class AuthenticationError extends TopstepXError {\n constructor(message: string, code?: number) {\n super(message, code);\n }\n}\n","import { TopstepXError } from './base-error';\n\nexport class ApiError extends TopstepXError {\n constructor(\n message: string,\n code: number,\n public readonly endpoint: string\n ) {\n super(message, code);\n }\n\n toJSON(): Record<string, unknown> {\n return {\n ...super.toJSON(),\n endpoint: this.endpoint,\n };\n }\n}\n","import { TopstepXError } from './base-error';\n\nexport class ConnectionError extends TopstepXError {\n constructor(message: string) {\n super(message);\n }\n}\n","import { AuthenticationError } from '../errors';\nimport type { AuthConfig, LoginRequest, LoginResponse } from './types';\n\nexport class AuthService {\n private sessionToken: string | null = null;\n private tokenExpiration: Date | null = null;\n private refreshTimer?: ReturnType<typeof setTimeout>;\n private readonly config: Required<AuthConfig>;\n\n constructor(config: AuthConfig) {\n this.config = {\n username: config.username,\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? 'https://api.topstepx.com',\n autoRefresh: config.autoRefresh ?? true,\n tokenValidityHours: config.tokenValidityHours ?? 24,\n };\n }\n\n async login(): Promise<void> {\n const request: LoginRequest = {\n userName: this.config.username,\n apiKey: this.config.apiKey,\n };\n\n const response = await fetch(`${this.config.baseUrl}/api/Auth/loginKey`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'text/plain',\n },\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n throw new AuthenticationError(\n `HTTP error during login: ${response.status}`,\n response.status\n );\n }\n\n const data = (await response.json()) as LoginResponse;\n\n if (!data.success || data.errorCode !== 0) {\n throw new AuthenticationError(\n data.errorMessage ?? 'Login failed',\n data.errorCode\n );\n }\n\n this.sessionToken = data.token;\n this.setTokenExpiration();\n\n if (this.config.autoRefresh) {\n this.scheduleTokenRefresh();\n }\n }\n\n async validate(): Promise<boolean> {\n if (!this.sessionToken) return false;\n\n try {\n const response = await fetch(`${this.config.baseUrl}/api/Auth/validate`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'text/plain',\n Authorization: `Bearer ${this.sessionToken}`,\n },\n });\n\n if (response.ok) {\n this.setTokenExpiration();\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }\n\n async getSessionToken(): Promise<string> {\n if (!this.sessionToken || this.isTokenExpired()) {\n const isValid = await this.validate();\n if (!isValid) {\n await this.login();\n }\n }\n\n if (!this.sessionToken) {\n throw new AuthenticationError('No active session token available');\n }\n\n return this.sessionToken;\n }\n\n get baseUrl(): string {\n return this.config.baseUrl;\n }\n\n private setTokenExpiration(): void {\n const expiration = new Date();\n expiration.setHours(\n expiration.getHours() + this.config.tokenValidityHours\n );\n this.tokenExpiration = expiration;\n }\n\n private isTokenExpired(): boolean {\n if (!this.tokenExpiration) return true;\n // Check with 5 minute buffer\n const buffer = 5 * 60 * 1000;\n return Date.now() >= this.tokenExpiration.getTime() - buffer;\n }\n\n private scheduleTokenRefresh(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n }\n\n if (!this.tokenExpiration) return;\n\n // Refresh 10 minutes before expiration\n const refreshTime =\n this.tokenExpiration.getTime() - Date.now() - 10 * 60 * 1000;\n\n if (refreshTime > 0) {\n this.refreshTimer = setTimeout(async () => {\n try {\n const isValid = await this.validate();\n if (!isValid) {\n await this.login();\n }\n this.scheduleTokenRefresh();\n } catch (error) {\n console.error('Token refresh failed:', error);\n }\n }, refreshTime);\n }\n }\n\n destroy(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n }\n this.sessionToken = null;\n this.tokenExpiration = null;\n }\n}\n","import { ApiError } from '../errors';\n\nexport interface HttpClientConfig {\n baseUrl: string;\n getToken: () => Promise<string>;\n timeout?: number;\n}\n\ninterface ApiResponseBase {\n success: boolean;\n errorCode: number;\n errorMessage: string | null;\n}\n\nexport class HttpClient {\n private readonly config: Required<HttpClientConfig>;\n\n constructor(config: HttpClientConfig) {\n this.config = {\n baseUrl: config.baseUrl,\n getToken: config.getToken,\n timeout: config.timeout ?? 30000,\n };\n }\n\n async post<TRequest, TResponse extends ApiResponseBase>(\n endpoint: string,\n data: TRequest\n ): Promise<TResponse> {\n const token = await this.config.getToken();\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const response = await fetch(`${this.config.baseUrl}${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(data),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new ApiError(\n `HTTP error: ${response.status} ${response.statusText}`,\n response.status,\n endpoint\n );\n }\n\n const result = (await response.json()) as TResponse;\n\n if (!result.success || result.errorCode !== 0) {\n throw new ApiError(\n result.errorMessage ?? 'API request failed',\n result.errorCode,\n endpoint\n );\n }\n\n return result;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof ApiError) throw error;\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new ApiError('Request timeout', -1, endpoint);\n }\n\n throw new ApiError(\n error instanceof Error ? error.message : 'Unknown error',\n -1,\n endpoint\n );\n }\n }\n}\n","import type { HttpClient } from \"../http-client\";\nimport type { SearchAccountsRequest, SearchAccountsResponse } from \"./types\";\n\nexport class AccountApi {\n constructor(private readonly http: HttpClient) {}\n\n async search(\n request: SearchAccountsRequest,\n ): Promise<SearchAccountsResponse> {\n const response = await this.http.post<\n SearchAccountsRequest,\n SearchAccountsResponse\n >(\"/api/Account/search\", request);\n return response;\n }\n}\n","import type { HttpClient } from \"../http-client\";\nimport type {\n PlaceOrderRequest,\n PlaceOrderResponse,\n SearchOrdersRequest,\n SearchOrdersResponse,\n SearchOpenOrdersRequest,\n CancelOrderRequest,\n CancelOrderResponse,\n ModifyOrderRequest,\n ModifyOrderResponse,\n SearchOpenOrdersResponse,\n} from \"./types\";\n\n/**\n * API for managing orders - place, cancel, modify, and search.\n *\n * @example\n * ```typescript\n * // Place a market order\n * const result = await client.orders.place({\n * accountId: 123,\n * contractId: 'CON.F.US.ENQ.M25',\n * type: OrderType.Market,\n * side: OrderSide.Buy,\n * size: 1,\n * });\n *\n * // Cancel an order\n * await client.orders.cancel({ accountId: 123, orderId: result.orderId });\n * ```\n *\n * @category REST API\n */\nexport class OrderApi {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Search historical orders within a date range.\n * @param request - Search parameters including accountId and optional date range\n * @returns Array of orders matching the search criteria\n */\n async search(request: SearchOrdersRequest): Promise<SearchOrdersResponse> {\n const response = await this.http.post<\n SearchOrdersRequest,\n SearchOrdersResponse\n >(\"/api/Order/search\", request);\n return response;\n }\n\n /**\n * Get all currently open (working) orders for an account.\n * @param request - Request containing the accountId\n * @returns Array of open orders\n */\n async searchOpen(\n request: SearchOpenOrdersRequest,\n ): Promise<SearchOpenOrdersResponse> {\n const response = await this.http.post<\n SearchOpenOrdersRequest,\n SearchOpenOrdersResponse\n >(\"/api/Order/searchOpen\", request);\n return response;\n }\n\n /**\n * Place a new order.\n * @param request - Order details including type, side, size, and prices\n * @returns Response containing the new orderId\n *\n * @example\n * ```typescript\n * // Market order\n * await client.orders.place({\n * accountId: 123,\n * contractId: 'CON.F.US.ENQ.M25',\n * type: OrderType.Market,\n * side: OrderSide.Buy,\n * size: 1,\n * });\n *\n * // Limit order\n * await client.orders.place({\n * accountId: 123,\n * contractId: 'CON.F.US.ENQ.M25',\n * type: OrderType.Limit,\n * side: OrderSide.Buy,\n * size: 1,\n * limitPrice: 5000.00,\n * });\n * ```\n */\n async place(request: PlaceOrderRequest): Promise<PlaceOrderResponse> {\n return this.http.post<PlaceOrderRequest, PlaceOrderResponse>(\n \"/api/Order/place\",\n request,\n );\n }\n\n /**\n * Cancel an existing order.\n * @param request - Request containing accountId and orderId to cancel\n * @returns Response indicating success or failure\n */\n async cancel(request: CancelOrderRequest): Promise<CancelOrderResponse> {\n return this.http.post<CancelOrderRequest, CancelOrderResponse>(\n \"/api/Order/cancel\",\n request,\n );\n }\n\n /**\n * Modify an existing order's size or price.\n * @param request - Request containing orderId and fields to modify\n * @returns Response indicating success or failure\n */\n async modify(request: ModifyOrderRequest): Promise<ModifyOrderResponse> {\n return this.http.post<ModifyOrderRequest, ModifyOrderResponse>(\n \"/api/Order/modify\",\n request,\n );\n }\n}\n","import type { HttpClient } from \"../http-client\";\nimport type {\n SearchOpenPositionsRequest,\n SearchOpenPositionsResponse,\n ClosePositionRequest,\n ClosePositionResponse,\n PartialClosePositionRequest,\n PartialClosePositionResponse,\n} from \"./types\";\n\nexport class PositionApi {\n constructor(private readonly http: HttpClient) {}\n\n async searchOpen(\n request: SearchOpenPositionsRequest,\n ): Promise<SearchOpenPositionsResponse> {\n const response = await this.http.post<\n SearchOpenPositionsRequest,\n SearchOpenPositionsResponse\n >(\"/api/Position/searchOpen\", request);\n return response;\n }\n\n async close(request: ClosePositionRequest): Promise<ClosePositionResponse> {\n return this.http.post<ClosePositionRequest, ClosePositionResponse>(\n \"/api/Position/closeContract\",\n request,\n );\n }\n\n async partialClose(\n request: PartialClosePositionRequest,\n ): Promise<PartialClosePositionResponse> {\n return this.http.post<\n PartialClosePositionRequest,\n PartialClosePositionResponse\n >(\"/api/Position/partialCloseContract\", request);\n }\n}\n","import type { HttpClient } from \"../http-client\";\nimport type { SearchTradesRequest, SearchTradesResponse } from \"./types\";\n\nexport class TradeApi {\n constructor(private readonly http: HttpClient) {}\n\n async search(request: SearchTradesRequest): Promise<SearchTradesResponse> {\n const response = await this.http.post<\n SearchTradesRequest,\n SearchTradesResponse\n >(\"/api/Trade/search\", request);\n return response;\n }\n}\n","import type { HttpClient } from \"../http-client\";\nimport type {\n SearchContractsRequest,\n SearchContractsResponse,\n SearchContractByIdRequest,\n SearchContractByIdResponse,\n} from \"./types\";\n\nexport class ContractApi {\n constructor(private readonly http: HttpClient) {}\n\n async search(\n request: SearchContractsRequest,\n ): Promise<SearchContractsResponse> {\n const response = await this.http.post<\n SearchContractsRequest,\n SearchContractsResponse\n >(\"/api/Contract/search\", request);\n return response;\n }\n\n async searchById(\n request: SearchContractByIdRequest,\n ): Promise<SearchContractByIdResponse | null> {\n const response = await this.http.post<\n SearchContractByIdRequest,\n SearchContractByIdResponse\n >(\"/api/Contract/searchById\", request);\n return response;\n }\n}\n","import type { HttpClient } from \"../http-client\";\nimport type { RetrieveBarsRequest, RetrieveBarsResponse } from \"./types\";\n\nexport class HistoryApi {\n constructor(private readonly http: HttpClient) {}\n\n async retrieveBars(\n request: RetrieveBarsRequest,\n ): Promise<RetrieveBarsResponse> {\n const response = await this.http.post<\n RetrieveBarsRequest,\n RetrieveBarsResponse\n >(\"/api/History/retrieveBars\", request);\n return response;\n }\n}\n","import {\n HubConnection,\n HubConnectionBuilder,\n HttpTransportType,\n HubConnectionState,\n} from '@microsoft/signalr';\nimport type { AuthService } from '../auth';\nimport { ConnectionError } from '../errors';\n\nexport interface ConnectionManagerConfig {\n marketHubUrl: string;\n userHubUrl: string;\n auth: AuthService;\n reconnectDelays?: number[];\n}\n\nexport class ConnectionManager {\n private marketConn: HubConnection | null = null;\n private userConn: HubConnection | null = null;\n private readonly config: Required<ConnectionManagerConfig>;\n private marketConnectionCallbacks: Array<(conn: HubConnection) => void> = [];\n private userConnectionCallbacks: Array<(conn: HubConnection) => void> = [];\n\n constructor(config: ConnectionManagerConfig) {\n this.config = {\n marketHubUrl: config.marketHubUrl,\n userHubUrl: config.userHubUrl,\n auth: config.auth,\n reconnectDelays: config.reconnectDelays ?? [0, 2000, 5000, 10000, 30000],\n };\n }\n\n async connect(): Promise<void> {\n const token = await this.config.auth.getSessionToken();\n\n // Build market connection\n this.marketConn = new HubConnectionBuilder()\n .withUrl(`${this.config.marketHubUrl}?access_token=${token}`, {\n skipNegotiation: true,\n transport: HttpTransportType.WebSockets,\n accessTokenFactory: () => this.config.auth.getSessionToken(),\n })\n .withAutomaticReconnect(this.config.reconnectDelays)\n .build();\n\n // Build user connection\n this.userConn = new HubConnectionBuilder()\n .withUrl(`${this.config.userHubUrl}?access_token=${token}`, {\n skipNegotiation: true,\n transport: HttpTransportType.WebSockets,\n accessTokenFactory: () => this.config.auth.getSessionToken(),\n })\n .withAutomaticReconnect(this.config.reconnectDelays)\n .build();\n\n // Notify callbacks before starting\n this.marketConnectionCallbacks.forEach((cb) => cb(this.marketConn!));\n this.userConnectionCallbacks.forEach((cb) => cb(this.userConn!));\n\n // Start connections\n try {\n await this.marketConn.start();\n await this.userConn.start();\n } catch (error) {\n throw new ConnectionError(\n `Failed to establish WebSocket connections: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n );\n }\n }\n\n async disconnect(): Promise<void> {\n await Promise.all([this.marketConn?.stop(), this.userConn?.stop()]);\n this.marketConn = null;\n this.userConn = null;\n }\n\n get isConnected(): boolean {\n return (\n this.marketConn?.state === HubConnectionState.Connected &&\n this.userConn?.state === HubConnectionState.Connected\n );\n }\n\n get marketConnection(): HubConnection {\n if (!this.marketConn) {\n throw new ConnectionError('Market connection not initialized');\n }\n return this.marketConn;\n }\n\n get userConnection(): HubConnection {\n if (!this.userConn) {\n throw new ConnectionError('User connection not initialized');\n }\n return this.userConn;\n }\n\n onMarketConnection(callback: (conn: HubConnection) => void): void {\n this.marketConnectionCallbacks.push(callback);\n if (this.marketConn) callback(this.marketConn);\n }\n\n onUserConnection(callback: (conn: HubConnection) => void): void {\n this.userConnectionCallbacks.push(callback);\n if (this.userConn) callback(this.userConn);\n }\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype EventMap = { [key: string]: any };\ntype EventCallback<T> = T extends void ? () => void : (data: T) => void;\n\nexport class TypedEventEmitter<T extends EventMap = EventMap> {\n private listeners = new Map<keyof T, Set<EventCallback<T[keyof T]>>>();\n\n on<K extends keyof T>(event: K, callback: EventCallback<T[K]>): this {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(callback as EventCallback<T[keyof T]>);\n return this;\n }\n\n off<K extends keyof T>(event: K, callback: EventCallback<T[K]>): this {\n this.listeners.get(event)?.delete(callback as EventCallback<T[keyof T]>);\n return this;\n }\n\n once<K extends keyof T>(event: K, callback: EventCallback<T[K]>): this {\n const onceCallback = ((data: T[K]) => {\n this.off(event, onceCallback as EventCallback<T[K]>);\n (callback as (data: T[K]) => void)(data);\n }) as EventCallback<T[K]>;\n return this.on(event, onceCallback);\n }\n\n protected emit<K extends keyof T>(\n event: K,\n ...args: T[K] extends void ? [] : [T[K]]\n ): boolean {\n const callbacks = this.listeners.get(event);\n if (!callbacks || callbacks.size === 0) return false;\n\n callbacks.forEach((callback) => {\n try {\n if (args.length > 0) {\n (callback as (data: T[K]) => void)(args[0] as T[K]);\n } else {\n (callback as () => void)();\n }\n } catch (error) {\n console.error(`Error in event listener for ${String(event)}:`, error);\n }\n });\n return true;\n }\n\n removeAllListeners<K extends keyof T>(event?: K): this {\n if (event) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n return this;\n }\n}\n","import type { ConnectionManager } from '../connection-manager';\nimport { TypedEventEmitter } from '../../utils/event-emitter';\nimport type { Quote, MarketTrade, MarketDepth, MarketHubEvents } from './types';\n\nexport class MarketHub extends TypedEventEmitter<MarketHubEvents> {\n private subscribedQuotes = new Set<string>();\n private subscribedTrades = new Set<string>();\n private subscribedDepth = new Set<string>();\n\n constructor(private readonly connectionManager: ConnectionManager) {\n super();\n this.setupEventHandlers();\n }\n\n private setupEventHandlers(): void {\n this.connectionManager.onMarketConnection((connection) => {\n connection.on('GatewayQuote', (contractId: string, data: Quote[]) => {\n this.emit('quote', { contractId, data });\n });\n\n connection.on(\n 'GatewayTrade',\n (contractId: string, data: MarketTrade[]) => {\n this.emit('trade', { contractId, data });\n }\n );\n\n connection.on(\n 'GatewayDepth',\n (contractId: string, data: MarketDepth[]) => {\n this.emit('depth', { contractId, data });\n }\n );\n });\n }\n\n async subscribe(contractId: string): Promise<void> {\n await Promise.all([\n this.subscribeQuotes(contractId),\n this.subscribeTrades(contractId),\n this.subscribeDepth(contractId),\n ]);\n }\n\n async unsubscribe(contractId: string): Promise<void> {\n await Promise.all([\n this.unsubscribeQuotes(contractId),\n this.unsubscribeTrades(contractId),\n this.unsubscribeDepth(contractId),\n ]);\n }\n\n async subscribeQuotes(contractId: string): Promise<void> {\n if (this.subscribedQuotes.has(contractId)) return;\n const connection = this.connectionManager.marketConnection;\n await connection.invoke('SubscribeContractQuotes', contractId);\n this.subscribedQuotes.add(contractId);\n }\n\n async unsubscribeQuotes(contractId: string): Promise<void> {\n if (!this.subscribedQuotes.has(contractId)) return;\n const connection = this.connectionManager.marketConnection;\n await connection.invoke('UnsubscribeContractQuotes', contractId);\n this.subscribedQuotes.delete(contractId);\n }\n\n async subscribeTrades(contractId: string): Promise<void> {\n if (this.subscribedTrades.has(contractId)) return;\n const connection = this.connectionManager.marketConnection;\n await connection.invoke('SubscribeContractTrades', contractId);\n this.subscribedTrades.add(contractId);\n }\n\n async unsubscribeTrades(contractId: string): Promise<void> {\n if (!this.subscribedTrades.has(contractId)) return;\n const connection = this.connectionManager.marketConnection;\n await connection.invoke('UnsubscribeContractTrades', contractId);\n this.subscribedTrades.delete(contractId);\n }\n\n async subscribeDepth(contractId: string): Promise<void> {\n if (this.subscribedDepth.has(contractId)) return;\n const connection = this.connectionManager.marketConnection;\n await connection.invoke('SubscribeContractMarketDepth', contractId);\n this.subscribedDepth.add(contractId);\n }\n\n async unsubscribeDepth(contractId: string): Promise<void> {\n if (!this.subscribedDepth.has(contractId)) return;\n const connection = this.connectionManager.marketConnection;\n await connection.invoke('UnsubscribeContractMarketDepth', contractId);\n this.subscribedDepth.delete(contractId);\n }\n}\n","import type { ConnectionManager } from '../connection-manager';\nimport { TypedEventEmitter } from '../../utils/event-emitter';\nimport type {\n OrderUpdate,\n PositionUpdate,\n TradeUpdate,\n AccountUpdate,\n UserHubEvents,\n} from './types';\n\nexport class UserHub extends TypedEventEmitter<UserHubEvents> {\n private subscribedOrders = new Set<number>();\n private subscribedPositions = new Set<number>();\n private subscribedTrades = new Set<number>();\n\n constructor(private readonly connectionManager: ConnectionManager) {\n super();\n this.setupEventHandlers();\n }\n\n private setupEventHandlers(): void {\n this.connectionManager.onUserConnection((connection) => {\n connection.on('GatewayUserAccount', (data: AccountUpdate) => {\n this.emit('account', data);\n });\n\n connection.on('GatewayUserOrder', (data: OrderUpdate) => {\n this.emit('order', data);\n });\n\n connection.on('GatewayUserPosition', (data: PositionUpdate) => {\n this.emit('position', data);\n });\n\n connection.on('GatewayUserTrade', (data: TradeUpdate) => {\n this.emit('trade', data);\n });\n });\n }\n\n async subscribe(accountId: number): Promise<void> {\n await Promise.all([\n this.subscribeOrders(accountId),\n this.subscribePositions(accountId),\n this.subscribeTrades(accountId),\n ]);\n }\n\n async unsubscribe(accountId: number): Promise<void> {\n await Promise.all([\n this.unsubscribeOrders(accountId),\n this.unsubscribePositions(accountId),\n this.unsubscribeTrades(accountId),\n ]);\n }\n\n async subscribeOrders(accountId: number): Promise<void> {\n if (this.subscribedOrders.has(accountId)) return;\n const connection = this.connectionManager.userConnection;\n await connection.invoke('SubscribeOrders', accountId);\n this.subscribedOrders.add(accountId);\n }\n\n async unsubscribeOrders(accountId: number): Promise<void> {\n if (!this.subscribedOrders.has(accountId)) return;\n const connection = this.connectionManager.userConnection;\n await connection.invoke('UnsubscribeOrders', accountId);\n this.subscribedOrders.delete(accountId);\n }\n\n async subscribePositions(accountId: number): Promise<void> {\n if (this.subscribedPositions.has(accountId)) return;\n const connection = this.connectionManager.userConnection;\n await connection.invoke('SubscribePositions', accountId);\n this.subscribedPositions.add(accountId);\n }\n\n async unsubscribePositions(accountId: number): Promise<void> {\n if (!this.subscribedPositions.has(accountId)) return;\n const connection = this.connectionManager.userConnection;\n await connection.invoke('UnsubscribePositions', accountId);\n this.subscribedPositions.delete(accountId);\n }\n\n async subscribeTrades(accountId: number): Promise<void> {\n if (this.subscribedTrades.has(accountId)) return;\n const connection = this.connectionManager.userConnection;\n await connection.invoke('SubscribeTrades', accountId);\n this.subscribedTrades.add(accountId);\n }\n\n async unsubscribeTrades(accountId: number): Promise<void> {\n if (!this.subscribedTrades.has(accountId)) return;\n const connection = this.connectionManager.userConnection;\n await connection.invoke('UnsubscribeTrades', accountId);\n this.subscribedTrades.delete(accountId);\n }\n}\n","import { AuthService } from './auth';\nimport { HttpClient, AccountApi, OrderApi, PositionApi, TradeApi, ContractApi, HistoryApi } from './rest';\nimport { ConnectionManager, MarketHub, UserHub } from './realtime';\nimport { TypedEventEmitter } from './utils/event-emitter';\nimport type { TopstepXClientConfig, TopstepXClientEvents } from './types';\n\n/**\n * Main client for interacting with the TopstepX trading API.\n *\n * Provides access to REST APIs for account management, order placement,\n * position management, trade history, contract search, and historical data.\n * Also provides real-time WebSocket connections for market data and account updates.\n *\n * @example\n * ```typescript\n * import { TopstepXClient, OrderType, OrderSide } from 'topstepx-api';\n *\n * const client = new TopstepXClient({\n * username: process.env.TOPSTEP_USERNAME,\n * apiKey: process.env.TOPSTEP_API_KEY,\n * });\n *\n * await client.connect();\n *\n * // Get accounts\n * const accounts = await client.accounts.search({ onlyActiveAccounts: true });\n *\n * // Place an order\n * await client.orders.place({\n * accountId: accounts[0].id,\n * contractId: 'CON.F.US.ENQ.M25',\n * type: OrderType.Market,\n * side: OrderSide.Buy,\n * size: 1,\n * });\n *\n * // Subscribe to real-time quotes\n * client.marketHub.on('quote', ({ contractId, data }) => {\n * console.log('Quote:', data);\n * });\n * await client.marketHub.subscribe('CON.F.US.ENQ.M25');\n *\n * await client.disconnect();\n * ```\n *\n * @category Client\n */\nexport class TopstepXClient extends TypedEventEmitter<TopstepXClientEvents> {\n private readonly auth: AuthService;\n private readonly connectionManager: ConnectionManager;\n private readonly httpClient: HttpClient;\n\n /** Account management API */\n public readonly accounts: AccountApi;\n /** Order management API (place, cancel, modify, search) */\n public readonly orders: OrderApi;\n /** Position management API (search, close) */\n public readonly positions: PositionApi;\n /** Trade history API */\n public readonly trades: TradeApi;\n /** Contract/symbol search API */\n public readonly contracts: ContractApi;\n /** Historical bars/candles API */\n public readonly history: HistoryApi;\n\n /** Real-time market data hub (quotes, trades, depth) */\n public readonly marketHub: MarketHub;\n /** Real-time account data hub (orders, positions, trades) */\n public readonly userHub: UserHub;\n\n constructor(config: TopstepXClientConfig) {\n super();\n\n const baseUrl = config.baseUrl ?? 'https://api.topstepx.com';\n\n this.auth = new AuthService({\n username: config.username,\n apiKey: config.apiKey,\n baseUrl,\n autoRefresh: config.autoRefresh ?? true,\n tokenValidityHours: config.tokenValidityHours ?? 24,\n });\n\n this.httpClient = new HttpClient({\n baseUrl,\n getToken: () => this.auth.getSessionToken(),\n });\n\n // Initialize REST APIs\n this.accounts = new AccountApi(this.httpClient);\n this.orders = new OrderApi(this.httpClient);\n this.positions = new PositionApi(this.httpClient);\n this.trades = new TradeApi(this.httpClient);\n this.contracts = new ContractApi(this.httpClient);\n this.history = new HistoryApi(this.httpClient);\n\n // Initialize Realtime\n this.connectionManager = new ConnectionManager({\n marketHubUrl: config.marketHubUrl ?? 'https://rtc.topstepx.com/hubs/market',\n userHubUrl: config.userHubUrl ?? 'https://rtc.topstepx.com/hubs/user',\n auth: this.auth,\n });\n\n this.marketHub = new MarketHub(this.connectionManager);\n this.userHub = new UserHub(this.connectionManager);\n }\n\n /**\n * Connect to the TopstepX API.\n * Authenticates and establishes WebSocket connections.\n */\n async connect(): Promise<void> {\n await this.auth.login();\n await this.connectionManager.connect();\n this.emit('connected');\n }\n\n /**\n * Disconnect from all services.\n */\n async disconnect(): Promise<void> {\n await this.connectionManager.disconnect();\n this.auth.destroy();\n this.emit('disconnected');\n }\n\n /**\n * Check if client is connected.\n */\n get isConnected(): boolean {\n return this.connectionManager.isConnected;\n }\n\n /**\n * Get the current auth token (for advanced use cases).\n */\n async getToken(): Promise<string> {\n return this.auth.getSessionToken();\n }\n}\n","/**\n * Type of order to place.\n * @category Enums\n */\nexport enum OrderType {\n /** Limit order - executes at specified price or better */\n Limit = 1,\n /** Market order - executes immediately at current market price */\n Market = 2,\n /** Stop order - becomes market order when stop price is reached */\n Stop = 3,\n /** Stop-limit order - becomes limit order when stop price is reached */\n StopLimit = 4,\n}\n\n/**\n * Side of the order (buy or sell).\n * @category Enums\n */\nexport enum OrderSide {\n /** Buy order - go long or close short position */\n Buy = 0,\n /** Sell order - go short or close long position */\n Sell = 1,\n}\n\n/**\n * Current status of an order.\n * @category Enums\n */\nexport enum OrderStatus {\n /** Order is pending submission */\n Pending = 0,\n /** Order is working (open) in the market */\n Working = 1,\n /** Order has been completely filled */\n Filled = 2,\n /** Order was cancelled */\n Cancelled = 3,\n /** Order was rejected */\n Rejected = 4,\n /** Order is partially filled */\n PartiallyFilled = 5,\n}\n\n/**\n * Time unit for historical bar data.\n * @category Enums\n */\nexport enum BarUnit {\n /** Second bars */\n Second = 1,\n /** Minute bars */\n Minute = 2,\n /** Hourly bars */\n Hour = 3,\n /** Daily bars */\n Day = 4,\n /** Weekly bars */\n Week = 5,\n /** Monthly bars */\n Month = 6,\n}\n\n/**\n * Type of position (long or short).\n * @category Enums\n */\nexport enum PositionType {\n /** Long position - bought contracts */\n Long = 0,\n /** Short position - sold contracts */\n Short = 1,\n}\n\n/**\n * Type of trade execution.\n * @category Enums\n */\nexport enum TradeType {\n /** Trade executed at bid price */\n Bid = 0,\n /** Trade executed at ask price */\n Ask = 1,\n}\n"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -35,7 +35,7 @@ interface SearchAccountsResponse {
|
|
|
35
35
|
declare class AccountApi {
|
|
36
36
|
private readonly http;
|
|
37
37
|
constructor(http: HttpClient);
|
|
38
|
-
search(request: SearchAccountsRequest): Promise<
|
|
38
|
+
search(request: SearchAccountsRequest): Promise<SearchAccountsResponse>;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
/**
|
|
@@ -164,6 +164,12 @@ interface SearchOrdersResponse {
|
|
|
164
164
|
interface SearchOpenOrdersRequest {
|
|
165
165
|
accountId: number;
|
|
166
166
|
}
|
|
167
|
+
interface SearchOpenOrdersResponse {
|
|
168
|
+
orders: Order[];
|
|
169
|
+
success: boolean;
|
|
170
|
+
errorCode: number;
|
|
171
|
+
errorMessage: string | null;
|
|
172
|
+
}
|
|
167
173
|
interface CancelOrderRequest {
|
|
168
174
|
accountId: number;
|
|
169
175
|
orderId: number;
|
|
@@ -216,13 +222,13 @@ declare class OrderApi {
|
|
|
216
222
|
* @param request - Search parameters including accountId and optional date range
|
|
217
223
|
* @returns Array of orders matching the search criteria
|
|
218
224
|
*/
|
|
219
|
-
search(request: SearchOrdersRequest): Promise<
|
|
225
|
+
search(request: SearchOrdersRequest): Promise<SearchOrdersResponse>;
|
|
220
226
|
/**
|
|
221
227
|
* Get all currently open (working) orders for an account.
|
|
222
228
|
* @param request - Request containing the accountId
|
|
223
229
|
* @returns Array of open orders
|
|
224
230
|
*/
|
|
225
|
-
searchOpen(request: SearchOpenOrdersRequest): Promise<
|
|
231
|
+
searchOpen(request: SearchOpenOrdersRequest): Promise<SearchOpenOrdersResponse>;
|
|
226
232
|
/**
|
|
227
233
|
* Place a new order.
|
|
228
234
|
* @param request - Order details including type, side, size, and prices
|
|
@@ -306,7 +312,7 @@ interface PartialClosePositionResponse {
|
|
|
306
312
|
declare class PositionApi {
|
|
307
313
|
private readonly http;
|
|
308
314
|
constructor(http: HttpClient);
|
|
309
|
-
searchOpen(request: SearchOpenPositionsRequest): Promise<
|
|
315
|
+
searchOpen(request: SearchOpenPositionsRequest): Promise<SearchOpenPositionsResponse>;
|
|
310
316
|
close(request: ClosePositionRequest): Promise<ClosePositionResponse>;
|
|
311
317
|
partialClose(request: PartialClosePositionRequest): Promise<PartialClosePositionResponse>;
|
|
312
318
|
}
|
|
@@ -339,7 +345,7 @@ interface SearchTradesResponse {
|
|
|
339
345
|
declare class TradeApi {
|
|
340
346
|
private readonly http;
|
|
341
347
|
constructor(http: HttpClient);
|
|
342
|
-
search(request: SearchTradesRequest): Promise<
|
|
348
|
+
search(request: SearchTradesRequest): Promise<SearchTradesResponse>;
|
|
343
349
|
}
|
|
344
350
|
|
|
345
351
|
interface Contract {
|
|
@@ -374,8 +380,8 @@ interface SearchContractByIdResponse {
|
|
|
374
380
|
declare class ContractApi {
|
|
375
381
|
private readonly http;
|
|
376
382
|
constructor(http: HttpClient);
|
|
377
|
-
search(request: SearchContractsRequest): Promise<
|
|
378
|
-
searchById(request: SearchContractByIdRequest): Promise<
|
|
383
|
+
search(request: SearchContractsRequest): Promise<SearchContractsResponse>;
|
|
384
|
+
searchById(request: SearchContractByIdRequest): Promise<SearchContractByIdResponse | null>;
|
|
379
385
|
}
|
|
380
386
|
|
|
381
387
|
interface Bar {
|
|
@@ -406,7 +412,7 @@ interface RetrieveBarsResponse {
|
|
|
406
412
|
declare class HistoryApi {
|
|
407
413
|
private readonly http;
|
|
408
414
|
constructor(http: HttpClient);
|
|
409
|
-
retrieveBars(request: RetrieveBarsRequest): Promise<
|
|
415
|
+
retrieveBars(request: RetrieveBarsRequest): Promise<RetrieveBarsResponse>;
|
|
410
416
|
}
|
|
411
417
|
|
|
412
418
|
interface AuthConfig {
|
package/dist/index.d.ts
CHANGED
|
@@ -35,7 +35,7 @@ interface SearchAccountsResponse {
|
|
|
35
35
|
declare class AccountApi {
|
|
36
36
|
private readonly http;
|
|
37
37
|
constructor(http: HttpClient);
|
|
38
|
-
search(request: SearchAccountsRequest): Promise<
|
|
38
|
+
search(request: SearchAccountsRequest): Promise<SearchAccountsResponse>;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
/**
|
|
@@ -164,6 +164,12 @@ interface SearchOrdersResponse {
|
|
|
164
164
|
interface SearchOpenOrdersRequest {
|
|
165
165
|
accountId: number;
|
|
166
166
|
}
|
|
167
|
+
interface SearchOpenOrdersResponse {
|
|
168
|
+
orders: Order[];
|
|
169
|
+
success: boolean;
|
|
170
|
+
errorCode: number;
|
|
171
|
+
errorMessage: string | null;
|
|
172
|
+
}
|
|
167
173
|
interface CancelOrderRequest {
|
|
168
174
|
accountId: number;
|
|
169
175
|
orderId: number;
|
|
@@ -216,13 +222,13 @@ declare class OrderApi {
|
|
|
216
222
|
* @param request - Search parameters including accountId and optional date range
|
|
217
223
|
* @returns Array of orders matching the search criteria
|
|
218
224
|
*/
|
|
219
|
-
search(request: SearchOrdersRequest): Promise<
|
|
225
|
+
search(request: SearchOrdersRequest): Promise<SearchOrdersResponse>;
|
|
220
226
|
/**
|
|
221
227
|
* Get all currently open (working) orders for an account.
|
|
222
228
|
* @param request - Request containing the accountId
|
|
223
229
|
* @returns Array of open orders
|
|
224
230
|
*/
|
|
225
|
-
searchOpen(request: SearchOpenOrdersRequest): Promise<
|
|
231
|
+
searchOpen(request: SearchOpenOrdersRequest): Promise<SearchOpenOrdersResponse>;
|
|
226
232
|
/**
|
|
227
233
|
* Place a new order.
|
|
228
234
|
* @param request - Order details including type, side, size, and prices
|
|
@@ -306,7 +312,7 @@ interface PartialClosePositionResponse {
|
|
|
306
312
|
declare class PositionApi {
|
|
307
313
|
private readonly http;
|
|
308
314
|
constructor(http: HttpClient);
|
|
309
|
-
searchOpen(request: SearchOpenPositionsRequest): Promise<
|
|
315
|
+
searchOpen(request: SearchOpenPositionsRequest): Promise<SearchOpenPositionsResponse>;
|
|
310
316
|
close(request: ClosePositionRequest): Promise<ClosePositionResponse>;
|
|
311
317
|
partialClose(request: PartialClosePositionRequest): Promise<PartialClosePositionResponse>;
|
|
312
318
|
}
|
|
@@ -339,7 +345,7 @@ interface SearchTradesResponse {
|
|
|
339
345
|
declare class TradeApi {
|
|
340
346
|
private readonly http;
|
|
341
347
|
constructor(http: HttpClient);
|
|
342
|
-
search(request: SearchTradesRequest): Promise<
|
|
348
|
+
search(request: SearchTradesRequest): Promise<SearchTradesResponse>;
|
|
343
349
|
}
|
|
344
350
|
|
|
345
351
|
interface Contract {
|
|
@@ -374,8 +380,8 @@ interface SearchContractByIdResponse {
|
|
|
374
380
|
declare class ContractApi {
|
|
375
381
|
private readonly http;
|
|
376
382
|
constructor(http: HttpClient);
|
|
377
|
-
search(request: SearchContractsRequest): Promise<
|
|
378
|
-
searchById(request: SearchContractByIdRequest): Promise<
|
|
383
|
+
search(request: SearchContractsRequest): Promise<SearchContractsResponse>;
|
|
384
|
+
searchById(request: SearchContractByIdRequest): Promise<SearchContractByIdResponse | null>;
|
|
379
385
|
}
|
|
380
386
|
|
|
381
387
|
interface Bar {
|
|
@@ -406,7 +412,7 @@ interface RetrieveBarsResponse {
|
|
|
406
412
|
declare class HistoryApi {
|
|
407
413
|
private readonly http;
|
|
408
414
|
constructor(http: HttpClient);
|
|
409
|
-
retrieveBars(request: RetrieveBarsRequest): Promise<
|
|
415
|
+
retrieveBars(request: RetrieveBarsRequest): Promise<RetrieveBarsResponse>;
|
|
410
416
|
}
|
|
411
417
|
|
|
412
418
|
interface AuthConfig {
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var signalr = require('@microsoft/signalr');
|
|
1
|
+
import { HubConnectionBuilder, HttpTransportType, HubConnectionState } from '@microsoft/signalr';
|
|
4
2
|
|
|
5
3
|
// src/errors/base-error.ts
|
|
6
4
|
var TopstepXError = class extends Error {
|
|
@@ -237,7 +235,7 @@ var AccountApi = class {
|
|
|
237
235
|
}
|
|
238
236
|
async search(request) {
|
|
239
237
|
const response = await this.http.post("/api/Account/search", request);
|
|
240
|
-
return response
|
|
238
|
+
return response;
|
|
241
239
|
}
|
|
242
240
|
};
|
|
243
241
|
|
|
@@ -254,7 +252,7 @@ var OrderApi = class {
|
|
|
254
252
|
*/
|
|
255
253
|
async search(request) {
|
|
256
254
|
const response = await this.http.post("/api/Order/search", request);
|
|
257
|
-
return response
|
|
255
|
+
return response;
|
|
258
256
|
}
|
|
259
257
|
/**
|
|
260
258
|
* Get all currently open (working) orders for an account.
|
|
@@ -263,7 +261,7 @@ var OrderApi = class {
|
|
|
263
261
|
*/
|
|
264
262
|
async searchOpen(request) {
|
|
265
263
|
const response = await this.http.post("/api/Order/searchOpen", request);
|
|
266
|
-
return response
|
|
264
|
+
return response;
|
|
267
265
|
}
|
|
268
266
|
/**
|
|
269
267
|
* Place a new order.
|
|
@@ -329,7 +327,7 @@ var PositionApi = class {
|
|
|
329
327
|
}
|
|
330
328
|
async searchOpen(request) {
|
|
331
329
|
const response = await this.http.post("/api/Position/searchOpen", request);
|
|
332
|
-
return response
|
|
330
|
+
return response;
|
|
333
331
|
}
|
|
334
332
|
async close(request) {
|
|
335
333
|
return this.http.post(
|
|
@@ -349,7 +347,7 @@ var TradeApi = class {
|
|
|
349
347
|
}
|
|
350
348
|
async search(request) {
|
|
351
349
|
const response = await this.http.post("/api/Trade/search", request);
|
|
352
|
-
return response
|
|
350
|
+
return response;
|
|
353
351
|
}
|
|
354
352
|
};
|
|
355
353
|
|
|
@@ -360,11 +358,11 @@ var ContractApi = class {
|
|
|
360
358
|
}
|
|
361
359
|
async search(request) {
|
|
362
360
|
const response = await this.http.post("/api/Contract/search", request);
|
|
363
|
-
return response
|
|
361
|
+
return response;
|
|
364
362
|
}
|
|
365
363
|
async searchById(request) {
|
|
366
364
|
const response = await this.http.post("/api/Contract/searchById", request);
|
|
367
|
-
return response
|
|
365
|
+
return response;
|
|
368
366
|
}
|
|
369
367
|
};
|
|
370
368
|
|
|
@@ -375,7 +373,7 @@ var HistoryApi = class {
|
|
|
375
373
|
}
|
|
376
374
|
async retrieveBars(request) {
|
|
377
375
|
const response = await this.http.post("/api/History/retrieveBars", request);
|
|
378
|
-
return response
|
|
376
|
+
return response;
|
|
379
377
|
}
|
|
380
378
|
};
|
|
381
379
|
var ConnectionManager = class {
|
|
@@ -394,14 +392,14 @@ var ConnectionManager = class {
|
|
|
394
392
|
}
|
|
395
393
|
async connect() {
|
|
396
394
|
const token = await this.config.auth.getSessionToken();
|
|
397
|
-
this.marketConn = new
|
|
395
|
+
this.marketConn = new HubConnectionBuilder().withUrl(`${this.config.marketHubUrl}?access_token=${token}`, {
|
|
398
396
|
skipNegotiation: true,
|
|
399
|
-
transport:
|
|
397
|
+
transport: HttpTransportType.WebSockets,
|
|
400
398
|
accessTokenFactory: () => this.config.auth.getSessionToken()
|
|
401
399
|
}).withAutomaticReconnect(this.config.reconnectDelays).build();
|
|
402
|
-
this.userConn = new
|
|
400
|
+
this.userConn = new HubConnectionBuilder().withUrl(`${this.config.userHubUrl}?access_token=${token}`, {
|
|
403
401
|
skipNegotiation: true,
|
|
404
|
-
transport:
|
|
402
|
+
transport: HttpTransportType.WebSockets,
|
|
405
403
|
accessTokenFactory: () => this.config.auth.getSessionToken()
|
|
406
404
|
}).withAutomaticReconnect(this.config.reconnectDelays).build();
|
|
407
405
|
this.marketConnectionCallbacks.forEach((cb) => cb(this.marketConn));
|
|
@@ -421,7 +419,7 @@ var ConnectionManager = class {
|
|
|
421
419
|
this.userConn = null;
|
|
422
420
|
}
|
|
423
421
|
get isConnected() {
|
|
424
|
-
return this.marketConn?.state ===
|
|
422
|
+
return this.marketConn?.state === HubConnectionState.Connected && this.userConn?.state === HubConnectionState.Connected;
|
|
425
423
|
}
|
|
426
424
|
get marketConnection() {
|
|
427
425
|
if (!this.marketConn) {
|
|
@@ -773,28 +771,6 @@ var TradeType = /* @__PURE__ */ ((TradeType2) => {
|
|
|
773
771
|
return TradeType2;
|
|
774
772
|
})(TradeType || {});
|
|
775
773
|
|
|
776
|
-
|
|
777
|
-
exports.ApiError = ApiError;
|
|
778
|
-
exports.AuthService = AuthService;
|
|
779
|
-
exports.AuthenticationError = AuthenticationError;
|
|
780
|
-
exports.BarUnit = BarUnit;
|
|
781
|
-
exports.ConnectionError = ConnectionError;
|
|
782
|
-
exports.ConnectionManager = ConnectionManager;
|
|
783
|
-
exports.ContractApi = ContractApi;
|
|
784
|
-
exports.HistoryApi = HistoryApi;
|
|
785
|
-
exports.HttpClient = HttpClient;
|
|
786
|
-
exports.MarketHub = MarketHub;
|
|
787
|
-
exports.OrderApi = OrderApi;
|
|
788
|
-
exports.OrderSide = OrderSide;
|
|
789
|
-
exports.OrderStatus = OrderStatus;
|
|
790
|
-
exports.OrderType = OrderType;
|
|
791
|
-
exports.PositionApi = PositionApi;
|
|
792
|
-
exports.PositionType = PositionType;
|
|
793
|
-
exports.TopstepXClient = TopstepXClient;
|
|
794
|
-
exports.TopstepXError = TopstepXError;
|
|
795
|
-
exports.TradeApi = TradeApi;
|
|
796
|
-
exports.TradeType = TradeType;
|
|
797
|
-
exports.TypedEventEmitter = TypedEventEmitter;
|
|
798
|
-
exports.UserHub = UserHub;
|
|
774
|
+
export { AccountApi, ApiError, AuthService, AuthenticationError, BarUnit, ConnectionError, ConnectionManager, ContractApi, HistoryApi, HttpClient, MarketHub, OrderApi, OrderSide, OrderStatus, OrderType, PositionApi, PositionType, TopstepXClient, TopstepXError, TradeApi, TradeType, TypedEventEmitter, UserHub };
|
|
799
775
|
//# sourceMappingURL=index.js.map
|
|
800
776
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors/base-error.ts","../src/errors/auth-error.ts","../src/errors/api-error.ts","../src/errors/connection-error.ts","../src/auth/auth.service.ts","../src/rest/http-client.ts","../src/rest/account/account.api.ts","../src/rest/order/order.api.ts","../src/rest/position/position.api.ts","../src/rest/trade/trade.api.ts","../src/rest/contract/contract.api.ts","../src/rest/history/history.api.ts","../src/realtime/connection-manager.ts","../src/utils/event-emitter.ts","../src/realtime/market/market-hub.ts","../src/realtime/user/user-hub.ts","../src/client.ts","../src/types/enums.ts"],"names":["HubConnectionBuilder","HttpTransportType","HubConnectionState","OrderType","OrderSide","OrderStatus","BarUnit","PositionType","TradeType"],"mappings":"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","file":"index.js","sourcesContent":["export abstract class TopstepXError extends Error {\n public readonly timestamp: Date;\n\n constructor(\n message: string,\n public readonly code?: number\n ) {\n super(message);\n this.name = this.constructor.name;\n this.timestamp = new Date();\n Error.captureStackTrace?.(this, this.constructor);\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n timestamp: this.timestamp.toISOString(),\n };\n }\n}\n","import { TopstepXError } from './base-error';\n\nexport class AuthenticationError extends TopstepXError {\n constructor(message: string, code?: number) {\n super(message, code);\n }\n}\n","import { TopstepXError } from './base-error';\n\nexport class ApiError extends TopstepXError {\n constructor(\n message: string,\n code: number,\n public readonly endpoint: string\n ) {\n super(message, code);\n }\n\n toJSON(): Record<string, unknown> {\n return {\n ...super.toJSON(),\n endpoint: this.endpoint,\n };\n }\n}\n","import { TopstepXError } from './base-error';\n\nexport class ConnectionError extends TopstepXError {\n constructor(message: string) {\n super(message);\n }\n}\n","import { AuthenticationError } from '../errors';\nimport type { AuthConfig, LoginRequest, LoginResponse } from './types';\n\nexport class AuthService {\n private sessionToken: string | null = null;\n private tokenExpiration: Date | null = null;\n private refreshTimer?: ReturnType<typeof setTimeout>;\n private readonly config: Required<AuthConfig>;\n\n constructor(config: AuthConfig) {\n this.config = {\n username: config.username,\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? 'https://api.topstepx.com',\n autoRefresh: config.autoRefresh ?? true,\n tokenValidityHours: config.tokenValidityHours ?? 24,\n };\n }\n\n async login(): Promise<void> {\n const request: LoginRequest = {\n userName: this.config.username,\n apiKey: this.config.apiKey,\n };\n\n const response = await fetch(`${this.config.baseUrl}/api/Auth/loginKey`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'text/plain',\n },\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n throw new AuthenticationError(\n `HTTP error during login: ${response.status}`,\n response.status\n );\n }\n\n const data = (await response.json()) as LoginResponse;\n\n if (!data.success || data.errorCode !== 0) {\n throw new AuthenticationError(\n data.errorMessage ?? 'Login failed',\n data.errorCode\n );\n }\n\n this.sessionToken = data.token;\n this.setTokenExpiration();\n\n if (this.config.autoRefresh) {\n this.scheduleTokenRefresh();\n }\n }\n\n async validate(): Promise<boolean> {\n if (!this.sessionToken) return false;\n\n try {\n const response = await fetch(`${this.config.baseUrl}/api/Auth/validate`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'text/plain',\n Authorization: `Bearer ${this.sessionToken}`,\n },\n });\n\n if (response.ok) {\n this.setTokenExpiration();\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }\n\n async getSessionToken(): Promise<string> {\n if (!this.sessionToken || this.isTokenExpired()) {\n const isValid = await this.validate();\n if (!isValid) {\n await this.login();\n }\n }\n\n if (!this.sessionToken) {\n throw new AuthenticationError('No active session token available');\n }\n\n return this.sessionToken;\n }\n\n get baseUrl(): string {\n return this.config.baseUrl;\n }\n\n private setTokenExpiration(): void {\n const expiration = new Date();\n expiration.setHours(\n expiration.getHours() + this.config.tokenValidityHours\n );\n this.tokenExpiration = expiration;\n }\n\n private isTokenExpired(): boolean {\n if (!this.tokenExpiration) return true;\n // Check with 5 minute buffer\n const buffer = 5 * 60 * 1000;\n return Date.now() >= this.tokenExpiration.getTime() - buffer;\n }\n\n private scheduleTokenRefresh(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n }\n\n if (!this.tokenExpiration) return;\n\n // Refresh 10 minutes before expiration\n const refreshTime =\n this.tokenExpiration.getTime() - Date.now() - 10 * 60 * 1000;\n\n if (refreshTime > 0) {\n this.refreshTimer = setTimeout(async () => {\n try {\n const isValid = await this.validate();\n if (!isValid) {\n await this.login();\n }\n this.scheduleTokenRefresh();\n } catch (error) {\n console.error('Token refresh failed:', error);\n }\n }, refreshTime);\n }\n }\n\n destroy(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n }\n this.sessionToken = null;\n this.tokenExpiration = null;\n }\n}\n","import { ApiError } from '../errors';\n\nexport interface HttpClientConfig {\n baseUrl: string;\n getToken: () => Promise<string>;\n timeout?: number;\n}\n\ninterface ApiResponseBase {\n success: boolean;\n errorCode: number;\n errorMessage: string | null;\n}\n\nexport class HttpClient {\n private readonly config: Required<HttpClientConfig>;\n\n constructor(config: HttpClientConfig) {\n this.config = {\n baseUrl: config.baseUrl,\n getToken: config.getToken,\n timeout: config.timeout ?? 30000,\n };\n }\n\n async post<TRequest, TResponse extends ApiResponseBase>(\n endpoint: string,\n data: TRequest\n ): Promise<TResponse> {\n const token = await this.config.getToken();\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const response = await fetch(`${this.config.baseUrl}${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(data),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new ApiError(\n `HTTP error: ${response.status} ${response.statusText}`,\n response.status,\n endpoint\n );\n }\n\n const result = (await response.json()) as TResponse;\n\n if (!result.success || result.errorCode !== 0) {\n throw new ApiError(\n result.errorMessage ?? 'API request failed',\n result.errorCode,\n endpoint\n );\n }\n\n return result;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof ApiError) throw error;\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new ApiError('Request timeout', -1, endpoint);\n }\n\n throw new ApiError(\n error instanceof Error ? error.message : 'Unknown error',\n -1,\n endpoint\n );\n }\n }\n}\n","import type { HttpClient } from '../http-client';\nimport type {\n Account,\n SearchAccountsRequest,\n SearchAccountsResponse,\n} from './types';\n\nexport class AccountApi {\n constructor(private readonly http: HttpClient) {}\n\n async search(request: SearchAccountsRequest): Promise<Account[]> {\n const response = await this.http.post<\n SearchAccountsRequest,\n SearchAccountsResponse\n >('/api/Account/search', request);\n return response.accounts;\n }\n}\n","import type { HttpClient } from '../http-client';\nimport type {\n Order,\n PlaceOrderRequest,\n PlaceOrderResponse,\n SearchOrdersRequest,\n SearchOrdersResponse,\n SearchOpenOrdersRequest,\n CancelOrderRequest,\n CancelOrderResponse,\n ModifyOrderRequest,\n ModifyOrderResponse,\n} from './types';\n\n/**\n * API for managing orders - place, cancel, modify, and search.\n *\n * @example\n * ```typescript\n * // Place a market order\n * const result = await client.orders.place({\n * accountId: 123,\n * contractId: 'CON.F.US.ENQ.M25',\n * type: OrderType.Market,\n * side: OrderSide.Buy,\n * size: 1,\n * });\n *\n * // Cancel an order\n * await client.orders.cancel({ accountId: 123, orderId: result.orderId });\n * ```\n *\n * @category REST API\n */\nexport class OrderApi {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Search historical orders within a date range.\n * @param request - Search parameters including accountId and optional date range\n * @returns Array of orders matching the search criteria\n */\n async search(request: SearchOrdersRequest): Promise<Order[]> {\n const response = await this.http.post<\n SearchOrdersRequest,\n SearchOrdersResponse\n >('/api/Order/search', request);\n return response.orders;\n }\n\n /**\n * Get all currently open (working) orders for an account.\n * @param request - Request containing the accountId\n * @returns Array of open orders\n */\n async searchOpen(request: SearchOpenOrdersRequest): Promise<Order[]> {\n const response = await this.http.post<\n SearchOpenOrdersRequest,\n SearchOrdersResponse\n >('/api/Order/searchOpen', request);\n return response.orders;\n }\n\n /**\n * Place a new order.\n * @param request - Order details including type, side, size, and prices\n * @returns Response containing the new orderId\n *\n * @example\n * ```typescript\n * // Market order\n * await client.orders.place({\n * accountId: 123,\n * contractId: 'CON.F.US.ENQ.M25',\n * type: OrderType.Market,\n * side: OrderSide.Buy,\n * size: 1,\n * });\n *\n * // Limit order\n * await client.orders.place({\n * accountId: 123,\n * contractId: 'CON.F.US.ENQ.M25',\n * type: OrderType.Limit,\n * side: OrderSide.Buy,\n * size: 1,\n * limitPrice: 5000.00,\n * });\n * ```\n */\n async place(request: PlaceOrderRequest): Promise<PlaceOrderResponse> {\n return this.http.post<PlaceOrderRequest, PlaceOrderResponse>(\n '/api/Order/place',\n request\n );\n }\n\n /**\n * Cancel an existing order.\n * @param request - Request containing accountId and orderId to cancel\n * @returns Response indicating success or failure\n */\n async cancel(request: CancelOrderRequest): Promise<CancelOrderResponse> {\n return this.http.post<CancelOrderRequest, CancelOrderResponse>(\n '/api/Order/cancel',\n request\n );\n }\n\n /**\n * Modify an existing order's size or price.\n * @param request - Request containing orderId and fields to modify\n * @returns Response indicating success or failure\n */\n async modify(request: ModifyOrderRequest): Promise<ModifyOrderResponse> {\n return this.http.post<ModifyOrderRequest, ModifyOrderResponse>(\n '/api/Order/modify',\n request\n );\n }\n}\n","import type { HttpClient } from '../http-client';\nimport type {\n Position,\n SearchOpenPositionsRequest,\n SearchOpenPositionsResponse,\n ClosePositionRequest,\n ClosePositionResponse,\n PartialClosePositionRequest,\n PartialClosePositionResponse,\n} from './types';\n\nexport class PositionApi {\n constructor(private readonly http: HttpClient) {}\n\n async searchOpen(request: SearchOpenPositionsRequest): Promise<Position[]> {\n const response = await this.http.post<\n SearchOpenPositionsRequest,\n SearchOpenPositionsResponse\n >('/api/Position/searchOpen', request);\n return response.positions;\n }\n\n async close(request: ClosePositionRequest): Promise<ClosePositionResponse> {\n return this.http.post<ClosePositionRequest, ClosePositionResponse>(\n '/api/Position/closeContract',\n request\n );\n }\n\n async partialClose(\n request: PartialClosePositionRequest\n ): Promise<PartialClosePositionResponse> {\n return this.http.post<\n PartialClosePositionRequest,\n PartialClosePositionResponse\n >('/api/Position/partialCloseContract', request);\n }\n}\n","import type { HttpClient } from '../http-client';\nimport type { Trade, SearchTradesRequest, SearchTradesResponse } from './types';\n\nexport class TradeApi {\n constructor(private readonly http: HttpClient) {}\n\n async search(request: SearchTradesRequest): Promise<Trade[]> {\n const response = await this.http.post<\n SearchTradesRequest,\n SearchTradesResponse\n >('/api/Trade/search', request);\n return response.trades;\n }\n}\n","import type { HttpClient } from '../http-client';\nimport type {\n Contract,\n SearchContractsRequest,\n SearchContractsResponse,\n SearchContractByIdRequest,\n SearchContractByIdResponse,\n} from './types';\n\nexport class ContractApi {\n constructor(private readonly http: HttpClient) {}\n\n async search(request: SearchContractsRequest): Promise<Contract[]> {\n const response = await this.http.post<\n SearchContractsRequest,\n SearchContractsResponse\n >('/api/Contract/search', request);\n return response.contracts;\n }\n\n async searchById(\n request: SearchContractByIdRequest\n ): Promise<Contract | null> {\n const response = await this.http.post<\n SearchContractByIdRequest,\n SearchContractByIdResponse\n >('/api/Contract/searchById', request);\n return response.contract;\n }\n}\n","import type { HttpClient } from '../http-client';\nimport type { Bar, RetrieveBarsRequest, RetrieveBarsResponse } from './types';\n\nexport class HistoryApi {\n constructor(private readonly http: HttpClient) {}\n\n async retrieveBars(request: RetrieveBarsRequest): Promise<Bar[]> {\n const response = await this.http.post<\n RetrieveBarsRequest,\n RetrieveBarsResponse\n >('/api/History/retrieveBars', request);\n return response.bars;\n }\n}\n","import {\n HubConnection,\n HubConnectionBuilder,\n HttpTransportType,\n HubConnectionState,\n} from '@microsoft/signalr';\nimport type { AuthService } from '../auth';\nimport { ConnectionError } from '../errors';\n\nexport interface ConnectionManagerConfig {\n marketHubUrl: string;\n userHubUrl: string;\n auth: AuthService;\n reconnectDelays?: number[];\n}\n\nexport class ConnectionManager {\n private marketConn: HubConnection | null = null;\n private userConn: HubConnection | null = null;\n private readonly config: Required<ConnectionManagerConfig>;\n private marketConnectionCallbacks: Array<(conn: HubConnection) => void> = [];\n private userConnectionCallbacks: Array<(conn: HubConnection) => void> = [];\n\n constructor(config: ConnectionManagerConfig) {\n this.config = {\n marketHubUrl: config.marketHubUrl,\n userHubUrl: config.userHubUrl,\n auth: config.auth,\n reconnectDelays: config.reconnectDelays ?? [0, 2000, 5000, 10000, 30000],\n };\n }\n\n async connect(): Promise<void> {\n const token = await this.config.auth.getSessionToken();\n\n // Build market connection\n this.marketConn = new HubConnectionBuilder()\n .withUrl(`${this.config.marketHubUrl}?access_token=${token}`, {\n skipNegotiation: true,\n transport: HttpTransportType.WebSockets,\n accessTokenFactory: () => this.config.auth.getSessionToken(),\n })\n .withAutomaticReconnect(this.config.reconnectDelays)\n .build();\n\n // Build user connection\n this.userConn = new HubConnectionBuilder()\n .withUrl(`${this.config.userHubUrl}?access_token=${token}`, {\n skipNegotiation: true,\n transport: HttpTransportType.WebSockets,\n accessTokenFactory: () => this.config.auth.getSessionToken(),\n })\n .withAutomaticReconnect(this.config.reconnectDelays)\n .build();\n\n // Notify callbacks before starting\n this.marketConnectionCallbacks.forEach((cb) => cb(this.marketConn!));\n this.userConnectionCallbacks.forEach((cb) => cb(this.userConn!));\n\n // Start connections\n try {\n await this.marketConn.start();\n await this.userConn.start();\n } catch (error) {\n throw new ConnectionError(\n `Failed to establish WebSocket connections: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n );\n }\n }\n\n async disconnect(): Promise<void> {\n await Promise.all([this.marketConn?.stop(), this.userConn?.stop()]);\n this.marketConn = null;\n this.userConn = null;\n }\n\n get isConnected(): boolean {\n return (\n this.marketConn?.state === HubConnectionState.Connected &&\n this.userConn?.state === HubConnectionState.Connected\n );\n }\n\n get marketConnection(): HubConnection {\n if (!this.marketConn) {\n throw new ConnectionError('Market connection not initialized');\n }\n return this.marketConn;\n }\n\n get userConnection(): HubConnection {\n if (!this.userConn) {\n throw new ConnectionError('User connection not initialized');\n }\n return this.userConn;\n }\n\n onMarketConnection(callback: (conn: HubConnection) => void): void {\n this.marketConnectionCallbacks.push(callback);\n if (this.marketConn) callback(this.marketConn);\n }\n\n onUserConnection(callback: (conn: HubConnection) => void): void {\n this.userConnectionCallbacks.push(callback);\n if (this.userConn) callback(this.userConn);\n }\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype EventMap = { [key: string]: any };\ntype EventCallback<T> = T extends void ? () => void : (data: T) => void;\n\nexport class TypedEventEmitter<T extends EventMap = EventMap> {\n private listeners = new Map<keyof T, Set<EventCallback<T[keyof T]>>>();\n\n on<K extends keyof T>(event: K, callback: EventCallback<T[K]>): this {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(callback as EventCallback<T[keyof T]>);\n return this;\n }\n\n off<K extends keyof T>(event: K, callback: EventCallback<T[K]>): this {\n this.listeners.get(event)?.delete(callback as EventCallback<T[keyof T]>);\n return this;\n }\n\n once<K extends keyof T>(event: K, callback: EventCallback<T[K]>): this {\n const onceCallback = ((data: T[K]) => {\n this.off(event, onceCallback as EventCallback<T[K]>);\n (callback as (data: T[K]) => void)(data);\n }) as EventCallback<T[K]>;\n return this.on(event, onceCallback);\n }\n\n protected emit<K extends keyof T>(\n event: K,\n ...args: T[K] extends void ? [] : [T[K]]\n ): boolean {\n const callbacks = this.listeners.get(event);\n if (!callbacks || callbacks.size === 0) return false;\n\n callbacks.forEach((callback) => {\n try {\n if (args.length > 0) {\n (callback as (data: T[K]) => void)(args[0] as T[K]);\n } else {\n (callback as () => void)();\n }\n } catch (error) {\n console.error(`Error in event listener for ${String(event)}:`, error);\n }\n });\n return true;\n }\n\n removeAllListeners<K extends keyof T>(event?: K): this {\n if (event) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n return this;\n }\n}\n","import type { ConnectionManager } from '../connection-manager';\nimport { TypedEventEmitter } from '../../utils/event-emitter';\nimport type { Quote, MarketTrade, MarketDepth, MarketHubEvents } from './types';\n\nexport class MarketHub extends TypedEventEmitter<MarketHubEvents> {\n private subscribedQuotes = new Set<string>();\n private subscribedTrades = new Set<string>();\n private subscribedDepth = new Set<string>();\n\n constructor(private readonly connectionManager: ConnectionManager) {\n super();\n this.setupEventHandlers();\n }\n\n private setupEventHandlers(): void {\n this.connectionManager.onMarketConnection((connection) => {\n connection.on('GatewayQuote', (contractId: string, data: Quote[]) => {\n this.emit('quote', { contractId, data });\n });\n\n connection.on(\n 'GatewayTrade',\n (contractId: string, data: MarketTrade[]) => {\n this.emit('trade', { contractId, data });\n }\n );\n\n connection.on(\n 'GatewayDepth',\n (contractId: string, data: MarketDepth[]) => {\n this.emit('depth', { contractId, data });\n }\n );\n });\n }\n\n async subscribe(contractId: string): Promise<void> {\n await Promise.all([\n this.subscribeQuotes(contractId),\n this.subscribeTrades(contractId),\n this.subscribeDepth(contractId),\n ]);\n }\n\n async unsubscribe(contractId: string): Promise<void> {\n await Promise.all([\n this.unsubscribeQuotes(contractId),\n this.unsubscribeTrades(contractId),\n this.unsubscribeDepth(contractId),\n ]);\n }\n\n async subscribeQuotes(contractId: string): Promise<void> {\n if (this.subscribedQuotes.has(contractId)) return;\n const connection = this.connectionManager.marketConnection;\n await connection.invoke('SubscribeContractQuotes', contractId);\n this.subscribedQuotes.add(contractId);\n }\n\n async unsubscribeQuotes(contractId: string): Promise<void> {\n if (!this.subscribedQuotes.has(contractId)) return;\n const connection = this.connectionManager.marketConnection;\n await connection.invoke('UnsubscribeContractQuotes', contractId);\n this.subscribedQuotes.delete(contractId);\n }\n\n async subscribeTrades(contractId: string): Promise<void> {\n if (this.subscribedTrades.has(contractId)) return;\n const connection = this.connectionManager.marketConnection;\n await connection.invoke('SubscribeContractTrades', contractId);\n this.subscribedTrades.add(contractId);\n }\n\n async unsubscribeTrades(contractId: string): Promise<void> {\n if (!this.subscribedTrades.has(contractId)) return;\n const connection = this.connectionManager.marketConnection;\n await connection.invoke('UnsubscribeContractTrades', contractId);\n this.subscribedTrades.delete(contractId);\n }\n\n async subscribeDepth(contractId: string): Promise<void> {\n if (this.subscribedDepth.has(contractId)) return;\n const connection = this.connectionManager.marketConnection;\n await connection.invoke('SubscribeContractMarketDepth', contractId);\n this.subscribedDepth.add(contractId);\n }\n\n async unsubscribeDepth(contractId: string): Promise<void> {\n if (!this.subscribedDepth.has(contractId)) return;\n const connection = this.connectionManager.marketConnection;\n await connection.invoke('UnsubscribeContractMarketDepth', contractId);\n this.subscribedDepth.delete(contractId);\n }\n}\n","import type { ConnectionManager } from '../connection-manager';\nimport { TypedEventEmitter } from '../../utils/event-emitter';\nimport type {\n OrderUpdate,\n PositionUpdate,\n TradeUpdate,\n AccountUpdate,\n UserHubEvents,\n} from './types';\n\nexport class UserHub extends TypedEventEmitter<UserHubEvents> {\n private subscribedOrders = new Set<number>();\n private subscribedPositions = new Set<number>();\n private subscribedTrades = new Set<number>();\n\n constructor(private readonly connectionManager: ConnectionManager) {\n super();\n this.setupEventHandlers();\n }\n\n private setupEventHandlers(): void {\n this.connectionManager.onUserConnection((connection) => {\n connection.on('GatewayUserAccount', (data: AccountUpdate) => {\n this.emit('account', data);\n });\n\n connection.on('GatewayUserOrder', (data: OrderUpdate) => {\n this.emit('order', data);\n });\n\n connection.on('GatewayUserPosition', (data: PositionUpdate) => {\n this.emit('position', data);\n });\n\n connection.on('GatewayUserTrade', (data: TradeUpdate) => {\n this.emit('trade', data);\n });\n });\n }\n\n async subscribe(accountId: number): Promise<void> {\n await Promise.all([\n this.subscribeOrders(accountId),\n this.subscribePositions(accountId),\n this.subscribeTrades(accountId),\n ]);\n }\n\n async unsubscribe(accountId: number): Promise<void> {\n await Promise.all([\n this.unsubscribeOrders(accountId),\n this.unsubscribePositions(accountId),\n this.unsubscribeTrades(accountId),\n ]);\n }\n\n async subscribeOrders(accountId: number): Promise<void> {\n if (this.subscribedOrders.has(accountId)) return;\n const connection = this.connectionManager.userConnection;\n await connection.invoke('SubscribeOrders', accountId);\n this.subscribedOrders.add(accountId);\n }\n\n async unsubscribeOrders(accountId: number): Promise<void> {\n if (!this.subscribedOrders.has(accountId)) return;\n const connection = this.connectionManager.userConnection;\n await connection.invoke('UnsubscribeOrders', accountId);\n this.subscribedOrders.delete(accountId);\n }\n\n async subscribePositions(accountId: number): Promise<void> {\n if (this.subscribedPositions.has(accountId)) return;\n const connection = this.connectionManager.userConnection;\n await connection.invoke('SubscribePositions', accountId);\n this.subscribedPositions.add(accountId);\n }\n\n async unsubscribePositions(accountId: number): Promise<void> {\n if (!this.subscribedPositions.has(accountId)) return;\n const connection = this.connectionManager.userConnection;\n await connection.invoke('UnsubscribePositions', accountId);\n this.subscribedPositions.delete(accountId);\n }\n\n async subscribeTrades(accountId: number): Promise<void> {\n if (this.subscribedTrades.has(accountId)) return;\n const connection = this.connectionManager.userConnection;\n await connection.invoke('SubscribeTrades', accountId);\n this.subscribedTrades.add(accountId);\n }\n\n async unsubscribeTrades(accountId: number): Promise<void> {\n if (!this.subscribedTrades.has(accountId)) return;\n const connection = this.connectionManager.userConnection;\n await connection.invoke('UnsubscribeTrades', accountId);\n this.subscribedTrades.delete(accountId);\n }\n}\n","import { AuthService } from './auth';\nimport { HttpClient, AccountApi, OrderApi, PositionApi, TradeApi, ContractApi, HistoryApi } from './rest';\nimport { ConnectionManager, MarketHub, UserHub } from './realtime';\nimport { TypedEventEmitter } from './utils/event-emitter';\nimport type { TopstepXClientConfig, TopstepXClientEvents } from './types';\n\n/**\n * Main client for interacting with the TopstepX trading API.\n *\n * Provides access to REST APIs for account management, order placement,\n * position management, trade history, contract search, and historical data.\n * Also provides real-time WebSocket connections for market data and account updates.\n *\n * @example\n * ```typescript\n * import { TopstepXClient, OrderType, OrderSide } from 'topstepx-api';\n *\n * const client = new TopstepXClient({\n * username: process.env.TOPSTEP_USERNAME,\n * apiKey: process.env.TOPSTEP_API_KEY,\n * });\n *\n * await client.connect();\n *\n * // Get accounts\n * const accounts = await client.accounts.search({ onlyActiveAccounts: true });\n *\n * // Place an order\n * await client.orders.place({\n * accountId: accounts[0].id,\n * contractId: 'CON.F.US.ENQ.M25',\n * type: OrderType.Market,\n * side: OrderSide.Buy,\n * size: 1,\n * });\n *\n * // Subscribe to real-time quotes\n * client.marketHub.on('quote', ({ contractId, data }) => {\n * console.log('Quote:', data);\n * });\n * await client.marketHub.subscribe('CON.F.US.ENQ.M25');\n *\n * await client.disconnect();\n * ```\n *\n * @category Client\n */\nexport class TopstepXClient extends TypedEventEmitter<TopstepXClientEvents> {\n private readonly auth: AuthService;\n private readonly connectionManager: ConnectionManager;\n private readonly httpClient: HttpClient;\n\n /** Account management API */\n public readonly accounts: AccountApi;\n /** Order management API (place, cancel, modify, search) */\n public readonly orders: OrderApi;\n /** Position management API (search, close) */\n public readonly positions: PositionApi;\n /** Trade history API */\n public readonly trades: TradeApi;\n /** Contract/symbol search API */\n public readonly contracts: ContractApi;\n /** Historical bars/candles API */\n public readonly history: HistoryApi;\n\n /** Real-time market data hub (quotes, trades, depth) */\n public readonly marketHub: MarketHub;\n /** Real-time account data hub (orders, positions, trades) */\n public readonly userHub: UserHub;\n\n constructor(config: TopstepXClientConfig) {\n super();\n\n const baseUrl = config.baseUrl ?? 'https://api.topstepx.com';\n\n this.auth = new AuthService({\n username: config.username,\n apiKey: config.apiKey,\n baseUrl,\n autoRefresh: config.autoRefresh ?? true,\n tokenValidityHours: config.tokenValidityHours ?? 24,\n });\n\n this.httpClient = new HttpClient({\n baseUrl,\n getToken: () => this.auth.getSessionToken(),\n });\n\n // Initialize REST APIs\n this.accounts = new AccountApi(this.httpClient);\n this.orders = new OrderApi(this.httpClient);\n this.positions = new PositionApi(this.httpClient);\n this.trades = new TradeApi(this.httpClient);\n this.contracts = new ContractApi(this.httpClient);\n this.history = new HistoryApi(this.httpClient);\n\n // Initialize Realtime\n this.connectionManager = new ConnectionManager({\n marketHubUrl: config.marketHubUrl ?? 'https://rtc.topstepx.com/hubs/market',\n userHubUrl: config.userHubUrl ?? 'https://rtc.topstepx.com/hubs/user',\n auth: this.auth,\n });\n\n this.marketHub = new MarketHub(this.connectionManager);\n this.userHub = new UserHub(this.connectionManager);\n }\n\n /**\n * Connect to the TopstepX API.\n * Authenticates and establishes WebSocket connections.\n */\n async connect(): Promise<void> {\n await this.auth.login();\n await this.connectionManager.connect();\n this.emit('connected');\n }\n\n /**\n * Disconnect from all services.\n */\n async disconnect(): Promise<void> {\n await this.connectionManager.disconnect();\n this.auth.destroy();\n this.emit('disconnected');\n }\n\n /**\n * Check if client is connected.\n */\n get isConnected(): boolean {\n return this.connectionManager.isConnected;\n }\n\n /**\n * Get the current auth token (for advanced use cases).\n */\n async getToken(): Promise<string> {\n return this.auth.getSessionToken();\n }\n}\n","/**\n * Type of order to place.\n * @category Enums\n */\nexport enum OrderType {\n /** Limit order - executes at specified price or better */\n Limit = 1,\n /** Market order - executes immediately at current market price */\n Market = 2,\n /** Stop order - becomes market order when stop price is reached */\n Stop = 3,\n /** Stop-limit order - becomes limit order when stop price is reached */\n StopLimit = 4,\n}\n\n/**\n * Side of the order (buy or sell).\n * @category Enums\n */\nexport enum OrderSide {\n /** Buy order - go long or close short position */\n Buy = 0,\n /** Sell order - go short or close long position */\n Sell = 1,\n}\n\n/**\n * Current status of an order.\n * @category Enums\n */\nexport enum OrderStatus {\n /** Order is pending submission */\n Pending = 0,\n /** Order is working (open) in the market */\n Working = 1,\n /** Order has been completely filled */\n Filled = 2,\n /** Order was cancelled */\n Cancelled = 3,\n /** Order was rejected */\n Rejected = 4,\n /** Order is partially filled */\n PartiallyFilled = 5,\n}\n\n/**\n * Time unit for historical bar data.\n * @category Enums\n */\nexport enum BarUnit {\n /** Second bars */\n Second = 1,\n /** Minute bars */\n Minute = 2,\n /** Hourly bars */\n Hour = 3,\n /** Daily bars */\n Day = 4,\n /** Weekly bars */\n Week = 5,\n /** Monthly bars */\n Month = 6,\n}\n\n/**\n * Type of position (long or short).\n * @category Enums\n */\nexport enum PositionType {\n /** Long position - bought contracts */\n Long = 0,\n /** Short position - sold contracts */\n Short = 1,\n}\n\n/**\n * Type of trade execution.\n * @category Enums\n */\nexport enum TradeType {\n /** Trade executed at bid price */\n Bid = 0,\n /** Trade executed at ask price */\n Ask = 1,\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors/base-error.ts","../src/errors/auth-error.ts","../src/errors/api-error.ts","../src/errors/connection-error.ts","../src/auth/auth.service.ts","../src/rest/http-client.ts","../src/rest/account/account.api.ts","../src/rest/order/order.api.ts","../src/rest/position/position.api.ts","../src/rest/trade/trade.api.ts","../src/rest/contract/contract.api.ts","../src/rest/history/history.api.ts","../src/realtime/connection-manager.ts","../src/utils/event-emitter.ts","../src/realtime/market/market-hub.ts","../src/realtime/user/user-hub.ts","../src/client.ts","../src/types/enums.ts"],"names":["OrderType","OrderSide","OrderStatus","BarUnit","PositionType","TradeType"],"mappings":"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","file":"index.js","sourcesContent":["export abstract class TopstepXError extends Error {\n public readonly timestamp: Date;\n\n constructor(\n message: string,\n public readonly code?: number\n ) {\n super(message);\n this.name = this.constructor.name;\n this.timestamp = new Date();\n Error.captureStackTrace?.(this, this.constructor);\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n timestamp: this.timestamp.toISOString(),\n };\n }\n}\n","import { TopstepXError } from './base-error';\n\nexport class AuthenticationError extends TopstepXError {\n constructor(message: string, code?: number) {\n super(message, code);\n }\n}\n","import { TopstepXError } from './base-error';\n\nexport class ApiError extends TopstepXError {\n constructor(\n message: string,\n code: number,\n public readonly endpoint: string\n ) {\n super(message, code);\n }\n\n toJSON(): Record<string, unknown> {\n return {\n ...super.toJSON(),\n endpoint: this.endpoint,\n };\n }\n}\n","import { TopstepXError } from './base-error';\n\nexport class ConnectionError extends TopstepXError {\n constructor(message: string) {\n super(message);\n }\n}\n","import { AuthenticationError } from '../errors';\nimport type { AuthConfig, LoginRequest, LoginResponse } from './types';\n\nexport class AuthService {\n private sessionToken: string | null = null;\n private tokenExpiration: Date | null = null;\n private refreshTimer?: ReturnType<typeof setTimeout>;\n private readonly config: Required<AuthConfig>;\n\n constructor(config: AuthConfig) {\n this.config = {\n username: config.username,\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? 'https://api.topstepx.com',\n autoRefresh: config.autoRefresh ?? true,\n tokenValidityHours: config.tokenValidityHours ?? 24,\n };\n }\n\n async login(): Promise<void> {\n const request: LoginRequest = {\n userName: this.config.username,\n apiKey: this.config.apiKey,\n };\n\n const response = await fetch(`${this.config.baseUrl}/api/Auth/loginKey`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'text/plain',\n },\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n throw new AuthenticationError(\n `HTTP error during login: ${response.status}`,\n response.status\n );\n }\n\n const data = (await response.json()) as LoginResponse;\n\n if (!data.success || data.errorCode !== 0) {\n throw new AuthenticationError(\n data.errorMessage ?? 'Login failed',\n data.errorCode\n );\n }\n\n this.sessionToken = data.token;\n this.setTokenExpiration();\n\n if (this.config.autoRefresh) {\n this.scheduleTokenRefresh();\n }\n }\n\n async validate(): Promise<boolean> {\n if (!this.sessionToken) return false;\n\n try {\n const response = await fetch(`${this.config.baseUrl}/api/Auth/validate`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'text/plain',\n Authorization: `Bearer ${this.sessionToken}`,\n },\n });\n\n if (response.ok) {\n this.setTokenExpiration();\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }\n\n async getSessionToken(): Promise<string> {\n if (!this.sessionToken || this.isTokenExpired()) {\n const isValid = await this.validate();\n if (!isValid) {\n await this.login();\n }\n }\n\n if (!this.sessionToken) {\n throw new AuthenticationError('No active session token available');\n }\n\n return this.sessionToken;\n }\n\n get baseUrl(): string {\n return this.config.baseUrl;\n }\n\n private setTokenExpiration(): void {\n const expiration = new Date();\n expiration.setHours(\n expiration.getHours() + this.config.tokenValidityHours\n );\n this.tokenExpiration = expiration;\n }\n\n private isTokenExpired(): boolean {\n if (!this.tokenExpiration) return true;\n // Check with 5 minute buffer\n const buffer = 5 * 60 * 1000;\n return Date.now() >= this.tokenExpiration.getTime() - buffer;\n }\n\n private scheduleTokenRefresh(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n }\n\n if (!this.tokenExpiration) return;\n\n // Refresh 10 minutes before expiration\n const refreshTime =\n this.tokenExpiration.getTime() - Date.now() - 10 * 60 * 1000;\n\n if (refreshTime > 0) {\n this.refreshTimer = setTimeout(async () => {\n try {\n const isValid = await this.validate();\n if (!isValid) {\n await this.login();\n }\n this.scheduleTokenRefresh();\n } catch (error) {\n console.error('Token refresh failed:', error);\n }\n }, refreshTime);\n }\n }\n\n destroy(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n }\n this.sessionToken = null;\n this.tokenExpiration = null;\n }\n}\n","import { ApiError } from '../errors';\n\nexport interface HttpClientConfig {\n baseUrl: string;\n getToken: () => Promise<string>;\n timeout?: number;\n}\n\ninterface ApiResponseBase {\n success: boolean;\n errorCode: number;\n errorMessage: string | null;\n}\n\nexport class HttpClient {\n private readonly config: Required<HttpClientConfig>;\n\n constructor(config: HttpClientConfig) {\n this.config = {\n baseUrl: config.baseUrl,\n getToken: config.getToken,\n timeout: config.timeout ?? 30000,\n };\n }\n\n async post<TRequest, TResponse extends ApiResponseBase>(\n endpoint: string,\n data: TRequest\n ): Promise<TResponse> {\n const token = await this.config.getToken();\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const response = await fetch(`${this.config.baseUrl}${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(data),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new ApiError(\n `HTTP error: ${response.status} ${response.statusText}`,\n response.status,\n endpoint\n );\n }\n\n const result = (await response.json()) as TResponse;\n\n if (!result.success || result.errorCode !== 0) {\n throw new ApiError(\n result.errorMessage ?? 'API request failed',\n result.errorCode,\n endpoint\n );\n }\n\n return result;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof ApiError) throw error;\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new ApiError('Request timeout', -1, endpoint);\n }\n\n throw new ApiError(\n error instanceof Error ? error.message : 'Unknown error',\n -1,\n endpoint\n );\n }\n }\n}\n","import type { HttpClient } from \"../http-client\";\nimport type { SearchAccountsRequest, SearchAccountsResponse } from \"./types\";\n\nexport class AccountApi {\n constructor(private readonly http: HttpClient) {}\n\n async search(\n request: SearchAccountsRequest,\n ): Promise<SearchAccountsResponse> {\n const response = await this.http.post<\n SearchAccountsRequest,\n SearchAccountsResponse\n >(\"/api/Account/search\", request);\n return response;\n }\n}\n","import type { HttpClient } from \"../http-client\";\nimport type {\n PlaceOrderRequest,\n PlaceOrderResponse,\n SearchOrdersRequest,\n SearchOrdersResponse,\n SearchOpenOrdersRequest,\n CancelOrderRequest,\n CancelOrderResponse,\n ModifyOrderRequest,\n ModifyOrderResponse,\n SearchOpenOrdersResponse,\n} from \"./types\";\n\n/**\n * API for managing orders - place, cancel, modify, and search.\n *\n * @example\n * ```typescript\n * // Place a market order\n * const result = await client.orders.place({\n * accountId: 123,\n * contractId: 'CON.F.US.ENQ.M25',\n * type: OrderType.Market,\n * side: OrderSide.Buy,\n * size: 1,\n * });\n *\n * // Cancel an order\n * await client.orders.cancel({ accountId: 123, orderId: result.orderId });\n * ```\n *\n * @category REST API\n */\nexport class OrderApi {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Search historical orders within a date range.\n * @param request - Search parameters including accountId and optional date range\n * @returns Array of orders matching the search criteria\n */\n async search(request: SearchOrdersRequest): Promise<SearchOrdersResponse> {\n const response = await this.http.post<\n SearchOrdersRequest,\n SearchOrdersResponse\n >(\"/api/Order/search\", request);\n return response;\n }\n\n /**\n * Get all currently open (working) orders for an account.\n * @param request - Request containing the accountId\n * @returns Array of open orders\n */\n async searchOpen(\n request: SearchOpenOrdersRequest,\n ): Promise<SearchOpenOrdersResponse> {\n const response = await this.http.post<\n SearchOpenOrdersRequest,\n SearchOpenOrdersResponse\n >(\"/api/Order/searchOpen\", request);\n return response;\n }\n\n /**\n * Place a new order.\n * @param request - Order details including type, side, size, and prices\n * @returns Response containing the new orderId\n *\n * @example\n * ```typescript\n * // Market order\n * await client.orders.place({\n * accountId: 123,\n * contractId: 'CON.F.US.ENQ.M25',\n * type: OrderType.Market,\n * side: OrderSide.Buy,\n * size: 1,\n * });\n *\n * // Limit order\n * await client.orders.place({\n * accountId: 123,\n * contractId: 'CON.F.US.ENQ.M25',\n * type: OrderType.Limit,\n * side: OrderSide.Buy,\n * size: 1,\n * limitPrice: 5000.00,\n * });\n * ```\n */\n async place(request: PlaceOrderRequest): Promise<PlaceOrderResponse> {\n return this.http.post<PlaceOrderRequest, PlaceOrderResponse>(\n \"/api/Order/place\",\n request,\n );\n }\n\n /**\n * Cancel an existing order.\n * @param request - Request containing accountId and orderId to cancel\n * @returns Response indicating success or failure\n */\n async cancel(request: CancelOrderRequest): Promise<CancelOrderResponse> {\n return this.http.post<CancelOrderRequest, CancelOrderResponse>(\n \"/api/Order/cancel\",\n request,\n );\n }\n\n /**\n * Modify an existing order's size or price.\n * @param request - Request containing orderId and fields to modify\n * @returns Response indicating success or failure\n */\n async modify(request: ModifyOrderRequest): Promise<ModifyOrderResponse> {\n return this.http.post<ModifyOrderRequest, ModifyOrderResponse>(\n \"/api/Order/modify\",\n request,\n );\n }\n}\n","import type { HttpClient } from \"../http-client\";\nimport type {\n SearchOpenPositionsRequest,\n SearchOpenPositionsResponse,\n ClosePositionRequest,\n ClosePositionResponse,\n PartialClosePositionRequest,\n PartialClosePositionResponse,\n} from \"./types\";\n\nexport class PositionApi {\n constructor(private readonly http: HttpClient) {}\n\n async searchOpen(\n request: SearchOpenPositionsRequest,\n ): Promise<SearchOpenPositionsResponse> {\n const response = await this.http.post<\n SearchOpenPositionsRequest,\n SearchOpenPositionsResponse\n >(\"/api/Position/searchOpen\", request);\n return response;\n }\n\n async close(request: ClosePositionRequest): Promise<ClosePositionResponse> {\n return this.http.post<ClosePositionRequest, ClosePositionResponse>(\n \"/api/Position/closeContract\",\n request,\n );\n }\n\n async partialClose(\n request: PartialClosePositionRequest,\n ): Promise<PartialClosePositionResponse> {\n return this.http.post<\n PartialClosePositionRequest,\n PartialClosePositionResponse\n >(\"/api/Position/partialCloseContract\", request);\n }\n}\n","import type { HttpClient } from \"../http-client\";\nimport type { SearchTradesRequest, SearchTradesResponse } from \"./types\";\n\nexport class TradeApi {\n constructor(private readonly http: HttpClient) {}\n\n async search(request: SearchTradesRequest): Promise<SearchTradesResponse> {\n const response = await this.http.post<\n SearchTradesRequest,\n SearchTradesResponse\n >(\"/api/Trade/search\", request);\n return response;\n }\n}\n","import type { HttpClient } from \"../http-client\";\nimport type {\n SearchContractsRequest,\n SearchContractsResponse,\n SearchContractByIdRequest,\n SearchContractByIdResponse,\n} from \"./types\";\n\nexport class ContractApi {\n constructor(private readonly http: HttpClient) {}\n\n async search(\n request: SearchContractsRequest,\n ): Promise<SearchContractsResponse> {\n const response = await this.http.post<\n SearchContractsRequest,\n SearchContractsResponse\n >(\"/api/Contract/search\", request);\n return response;\n }\n\n async searchById(\n request: SearchContractByIdRequest,\n ): Promise<SearchContractByIdResponse | null> {\n const response = await this.http.post<\n SearchContractByIdRequest,\n SearchContractByIdResponse\n >(\"/api/Contract/searchById\", request);\n return response;\n }\n}\n","import type { HttpClient } from \"../http-client\";\nimport type { RetrieveBarsRequest, RetrieveBarsResponse } from \"./types\";\n\nexport class HistoryApi {\n constructor(private readonly http: HttpClient) {}\n\n async retrieveBars(\n request: RetrieveBarsRequest,\n ): Promise<RetrieveBarsResponse> {\n const response = await this.http.post<\n RetrieveBarsRequest,\n RetrieveBarsResponse\n >(\"/api/History/retrieveBars\", request);\n return response;\n }\n}\n","import {\n HubConnection,\n HubConnectionBuilder,\n HttpTransportType,\n HubConnectionState,\n} from '@microsoft/signalr';\nimport type { AuthService } from '../auth';\nimport { ConnectionError } from '../errors';\n\nexport interface ConnectionManagerConfig {\n marketHubUrl: string;\n userHubUrl: string;\n auth: AuthService;\n reconnectDelays?: number[];\n}\n\nexport class ConnectionManager {\n private marketConn: HubConnection | null = null;\n private userConn: HubConnection | null = null;\n private readonly config: Required<ConnectionManagerConfig>;\n private marketConnectionCallbacks: Array<(conn: HubConnection) => void> = [];\n private userConnectionCallbacks: Array<(conn: HubConnection) => void> = [];\n\n constructor(config: ConnectionManagerConfig) {\n this.config = {\n marketHubUrl: config.marketHubUrl,\n userHubUrl: config.userHubUrl,\n auth: config.auth,\n reconnectDelays: config.reconnectDelays ?? [0, 2000, 5000, 10000, 30000],\n };\n }\n\n async connect(): Promise<void> {\n const token = await this.config.auth.getSessionToken();\n\n // Build market connection\n this.marketConn = new HubConnectionBuilder()\n .withUrl(`${this.config.marketHubUrl}?access_token=${token}`, {\n skipNegotiation: true,\n transport: HttpTransportType.WebSockets,\n accessTokenFactory: () => this.config.auth.getSessionToken(),\n })\n .withAutomaticReconnect(this.config.reconnectDelays)\n .build();\n\n // Build user connection\n this.userConn = new HubConnectionBuilder()\n .withUrl(`${this.config.userHubUrl}?access_token=${token}`, {\n skipNegotiation: true,\n transport: HttpTransportType.WebSockets,\n accessTokenFactory: () => this.config.auth.getSessionToken(),\n })\n .withAutomaticReconnect(this.config.reconnectDelays)\n .build();\n\n // Notify callbacks before starting\n this.marketConnectionCallbacks.forEach((cb) => cb(this.marketConn!));\n this.userConnectionCallbacks.forEach((cb) => cb(this.userConn!));\n\n // Start connections\n try {\n await this.marketConn.start();\n await this.userConn.start();\n } catch (error) {\n throw new ConnectionError(\n `Failed to establish WebSocket connections: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n );\n }\n }\n\n async disconnect(): Promise<void> {\n await Promise.all([this.marketConn?.stop(), this.userConn?.stop()]);\n this.marketConn = null;\n this.userConn = null;\n }\n\n get isConnected(): boolean {\n return (\n this.marketConn?.state === HubConnectionState.Connected &&\n this.userConn?.state === HubConnectionState.Connected\n );\n }\n\n get marketConnection(): HubConnection {\n if (!this.marketConn) {\n throw new ConnectionError('Market connection not initialized');\n }\n return this.marketConn;\n }\n\n get userConnection(): HubConnection {\n if (!this.userConn) {\n throw new ConnectionError('User connection not initialized');\n }\n return this.userConn;\n }\n\n onMarketConnection(callback: (conn: HubConnection) => void): void {\n this.marketConnectionCallbacks.push(callback);\n if (this.marketConn) callback(this.marketConn);\n }\n\n onUserConnection(callback: (conn: HubConnection) => void): void {\n this.userConnectionCallbacks.push(callback);\n if (this.userConn) callback(this.userConn);\n }\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype EventMap = { [key: string]: any };\ntype EventCallback<T> = T extends void ? () => void : (data: T) => void;\n\nexport class TypedEventEmitter<T extends EventMap = EventMap> {\n private listeners = new Map<keyof T, Set<EventCallback<T[keyof T]>>>();\n\n on<K extends keyof T>(event: K, callback: EventCallback<T[K]>): this {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(callback as EventCallback<T[keyof T]>);\n return this;\n }\n\n off<K extends keyof T>(event: K, callback: EventCallback<T[K]>): this {\n this.listeners.get(event)?.delete(callback as EventCallback<T[keyof T]>);\n return this;\n }\n\n once<K extends keyof T>(event: K, callback: EventCallback<T[K]>): this {\n const onceCallback = ((data: T[K]) => {\n this.off(event, onceCallback as EventCallback<T[K]>);\n (callback as (data: T[K]) => void)(data);\n }) as EventCallback<T[K]>;\n return this.on(event, onceCallback);\n }\n\n protected emit<K extends keyof T>(\n event: K,\n ...args: T[K] extends void ? [] : [T[K]]\n ): boolean {\n const callbacks = this.listeners.get(event);\n if (!callbacks || callbacks.size === 0) return false;\n\n callbacks.forEach((callback) => {\n try {\n if (args.length > 0) {\n (callback as (data: T[K]) => void)(args[0] as T[K]);\n } else {\n (callback as () => void)();\n }\n } catch (error) {\n console.error(`Error in event listener for ${String(event)}:`, error);\n }\n });\n return true;\n }\n\n removeAllListeners<K extends keyof T>(event?: K): this {\n if (event) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n return this;\n }\n}\n","import type { ConnectionManager } from '../connection-manager';\nimport { TypedEventEmitter } from '../../utils/event-emitter';\nimport type { Quote, MarketTrade, MarketDepth, MarketHubEvents } from './types';\n\nexport class MarketHub extends TypedEventEmitter<MarketHubEvents> {\n private subscribedQuotes = new Set<string>();\n private subscribedTrades = new Set<string>();\n private subscribedDepth = new Set<string>();\n\n constructor(private readonly connectionManager: ConnectionManager) {\n super();\n this.setupEventHandlers();\n }\n\n private setupEventHandlers(): void {\n this.connectionManager.onMarketConnection((connection) => {\n connection.on('GatewayQuote', (contractId: string, data: Quote[]) => {\n this.emit('quote', { contractId, data });\n });\n\n connection.on(\n 'GatewayTrade',\n (contractId: string, data: MarketTrade[]) => {\n this.emit('trade', { contractId, data });\n }\n );\n\n connection.on(\n 'GatewayDepth',\n (contractId: string, data: MarketDepth[]) => {\n this.emit('depth', { contractId, data });\n }\n );\n });\n }\n\n async subscribe(contractId: string): Promise<void> {\n await Promise.all([\n this.subscribeQuotes(contractId),\n this.subscribeTrades(contractId),\n this.subscribeDepth(contractId),\n ]);\n }\n\n async unsubscribe(contractId: string): Promise<void> {\n await Promise.all([\n this.unsubscribeQuotes(contractId),\n this.unsubscribeTrades(contractId),\n this.unsubscribeDepth(contractId),\n ]);\n }\n\n async subscribeQuotes(contractId: string): Promise<void> {\n if (this.subscribedQuotes.has(contractId)) return;\n const connection = this.connectionManager.marketConnection;\n await connection.invoke('SubscribeContractQuotes', contractId);\n this.subscribedQuotes.add(contractId);\n }\n\n async unsubscribeQuotes(contractId: string): Promise<void> {\n if (!this.subscribedQuotes.has(contractId)) return;\n const connection = this.connectionManager.marketConnection;\n await connection.invoke('UnsubscribeContractQuotes', contractId);\n this.subscribedQuotes.delete(contractId);\n }\n\n async subscribeTrades(contractId: string): Promise<void> {\n if (this.subscribedTrades.has(contractId)) return;\n const connection = this.connectionManager.marketConnection;\n await connection.invoke('SubscribeContractTrades', contractId);\n this.subscribedTrades.add(contractId);\n }\n\n async unsubscribeTrades(contractId: string): Promise<void> {\n if (!this.subscribedTrades.has(contractId)) return;\n const connection = this.connectionManager.marketConnection;\n await connection.invoke('UnsubscribeContractTrades', contractId);\n this.subscribedTrades.delete(contractId);\n }\n\n async subscribeDepth(contractId: string): Promise<void> {\n if (this.subscribedDepth.has(contractId)) return;\n const connection = this.connectionManager.marketConnection;\n await connection.invoke('SubscribeContractMarketDepth', contractId);\n this.subscribedDepth.add(contractId);\n }\n\n async unsubscribeDepth(contractId: string): Promise<void> {\n if (!this.subscribedDepth.has(contractId)) return;\n const connection = this.connectionManager.marketConnection;\n await connection.invoke('UnsubscribeContractMarketDepth', contractId);\n this.subscribedDepth.delete(contractId);\n }\n}\n","import type { ConnectionManager } from '../connection-manager';\nimport { TypedEventEmitter } from '../../utils/event-emitter';\nimport type {\n OrderUpdate,\n PositionUpdate,\n TradeUpdate,\n AccountUpdate,\n UserHubEvents,\n} from './types';\n\nexport class UserHub extends TypedEventEmitter<UserHubEvents> {\n private subscribedOrders = new Set<number>();\n private subscribedPositions = new Set<number>();\n private subscribedTrades = new Set<number>();\n\n constructor(private readonly connectionManager: ConnectionManager) {\n super();\n this.setupEventHandlers();\n }\n\n private setupEventHandlers(): void {\n this.connectionManager.onUserConnection((connection) => {\n connection.on('GatewayUserAccount', (data: AccountUpdate) => {\n this.emit('account', data);\n });\n\n connection.on('GatewayUserOrder', (data: OrderUpdate) => {\n this.emit('order', data);\n });\n\n connection.on('GatewayUserPosition', (data: PositionUpdate) => {\n this.emit('position', data);\n });\n\n connection.on('GatewayUserTrade', (data: TradeUpdate) => {\n this.emit('trade', data);\n });\n });\n }\n\n async subscribe(accountId: number): Promise<void> {\n await Promise.all([\n this.subscribeOrders(accountId),\n this.subscribePositions(accountId),\n this.subscribeTrades(accountId),\n ]);\n }\n\n async unsubscribe(accountId: number): Promise<void> {\n await Promise.all([\n this.unsubscribeOrders(accountId),\n this.unsubscribePositions(accountId),\n this.unsubscribeTrades(accountId),\n ]);\n }\n\n async subscribeOrders(accountId: number): Promise<void> {\n if (this.subscribedOrders.has(accountId)) return;\n const connection = this.connectionManager.userConnection;\n await connection.invoke('SubscribeOrders', accountId);\n this.subscribedOrders.add(accountId);\n }\n\n async unsubscribeOrders(accountId: number): Promise<void> {\n if (!this.subscribedOrders.has(accountId)) return;\n const connection = this.connectionManager.userConnection;\n await connection.invoke('UnsubscribeOrders', accountId);\n this.subscribedOrders.delete(accountId);\n }\n\n async subscribePositions(accountId: number): Promise<void> {\n if (this.subscribedPositions.has(accountId)) return;\n const connection = this.connectionManager.userConnection;\n await connection.invoke('SubscribePositions', accountId);\n this.subscribedPositions.add(accountId);\n }\n\n async unsubscribePositions(accountId: number): Promise<void> {\n if (!this.subscribedPositions.has(accountId)) return;\n const connection = this.connectionManager.userConnection;\n await connection.invoke('UnsubscribePositions', accountId);\n this.subscribedPositions.delete(accountId);\n }\n\n async subscribeTrades(accountId: number): Promise<void> {\n if (this.subscribedTrades.has(accountId)) return;\n const connection = this.connectionManager.userConnection;\n await connection.invoke('SubscribeTrades', accountId);\n this.subscribedTrades.add(accountId);\n }\n\n async unsubscribeTrades(accountId: number): Promise<void> {\n if (!this.subscribedTrades.has(accountId)) return;\n const connection = this.connectionManager.userConnection;\n await connection.invoke('UnsubscribeTrades', accountId);\n this.subscribedTrades.delete(accountId);\n }\n}\n","import { AuthService } from './auth';\nimport { HttpClient, AccountApi, OrderApi, PositionApi, TradeApi, ContractApi, HistoryApi } from './rest';\nimport { ConnectionManager, MarketHub, UserHub } from './realtime';\nimport { TypedEventEmitter } from './utils/event-emitter';\nimport type { TopstepXClientConfig, TopstepXClientEvents } from './types';\n\n/**\n * Main client for interacting with the TopstepX trading API.\n *\n * Provides access to REST APIs for account management, order placement,\n * position management, trade history, contract search, and historical data.\n * Also provides real-time WebSocket connections for market data and account updates.\n *\n * @example\n * ```typescript\n * import { TopstepXClient, OrderType, OrderSide } from 'topstepx-api';\n *\n * const client = new TopstepXClient({\n * username: process.env.TOPSTEP_USERNAME,\n * apiKey: process.env.TOPSTEP_API_KEY,\n * });\n *\n * await client.connect();\n *\n * // Get accounts\n * const accounts = await client.accounts.search({ onlyActiveAccounts: true });\n *\n * // Place an order\n * await client.orders.place({\n * accountId: accounts[0].id,\n * contractId: 'CON.F.US.ENQ.M25',\n * type: OrderType.Market,\n * side: OrderSide.Buy,\n * size: 1,\n * });\n *\n * // Subscribe to real-time quotes\n * client.marketHub.on('quote', ({ contractId, data }) => {\n * console.log('Quote:', data);\n * });\n * await client.marketHub.subscribe('CON.F.US.ENQ.M25');\n *\n * await client.disconnect();\n * ```\n *\n * @category Client\n */\nexport class TopstepXClient extends TypedEventEmitter<TopstepXClientEvents> {\n private readonly auth: AuthService;\n private readonly connectionManager: ConnectionManager;\n private readonly httpClient: HttpClient;\n\n /** Account management API */\n public readonly accounts: AccountApi;\n /** Order management API (place, cancel, modify, search) */\n public readonly orders: OrderApi;\n /** Position management API (search, close) */\n public readonly positions: PositionApi;\n /** Trade history API */\n public readonly trades: TradeApi;\n /** Contract/symbol search API */\n public readonly contracts: ContractApi;\n /** Historical bars/candles API */\n public readonly history: HistoryApi;\n\n /** Real-time market data hub (quotes, trades, depth) */\n public readonly marketHub: MarketHub;\n /** Real-time account data hub (orders, positions, trades) */\n public readonly userHub: UserHub;\n\n constructor(config: TopstepXClientConfig) {\n super();\n\n const baseUrl = config.baseUrl ?? 'https://api.topstepx.com';\n\n this.auth = new AuthService({\n username: config.username,\n apiKey: config.apiKey,\n baseUrl,\n autoRefresh: config.autoRefresh ?? true,\n tokenValidityHours: config.tokenValidityHours ?? 24,\n });\n\n this.httpClient = new HttpClient({\n baseUrl,\n getToken: () => this.auth.getSessionToken(),\n });\n\n // Initialize REST APIs\n this.accounts = new AccountApi(this.httpClient);\n this.orders = new OrderApi(this.httpClient);\n this.positions = new PositionApi(this.httpClient);\n this.trades = new TradeApi(this.httpClient);\n this.contracts = new ContractApi(this.httpClient);\n this.history = new HistoryApi(this.httpClient);\n\n // Initialize Realtime\n this.connectionManager = new ConnectionManager({\n marketHubUrl: config.marketHubUrl ?? 'https://rtc.topstepx.com/hubs/market',\n userHubUrl: config.userHubUrl ?? 'https://rtc.topstepx.com/hubs/user',\n auth: this.auth,\n });\n\n this.marketHub = new MarketHub(this.connectionManager);\n this.userHub = new UserHub(this.connectionManager);\n }\n\n /**\n * Connect to the TopstepX API.\n * Authenticates and establishes WebSocket connections.\n */\n async connect(): Promise<void> {\n await this.auth.login();\n await this.connectionManager.connect();\n this.emit('connected');\n }\n\n /**\n * Disconnect from all services.\n */\n async disconnect(): Promise<void> {\n await this.connectionManager.disconnect();\n this.auth.destroy();\n this.emit('disconnected');\n }\n\n /**\n * Check if client is connected.\n */\n get isConnected(): boolean {\n return this.connectionManager.isConnected;\n }\n\n /**\n * Get the current auth token (for advanced use cases).\n */\n async getToken(): Promise<string> {\n return this.auth.getSessionToken();\n }\n}\n","/**\n * Type of order to place.\n * @category Enums\n */\nexport enum OrderType {\n /** Limit order - executes at specified price or better */\n Limit = 1,\n /** Market order - executes immediately at current market price */\n Market = 2,\n /** Stop order - becomes market order when stop price is reached */\n Stop = 3,\n /** Stop-limit order - becomes limit order when stop price is reached */\n StopLimit = 4,\n}\n\n/**\n * Side of the order (buy or sell).\n * @category Enums\n */\nexport enum OrderSide {\n /** Buy order - go long or close short position */\n Buy = 0,\n /** Sell order - go short or close long position */\n Sell = 1,\n}\n\n/**\n * Current status of an order.\n * @category Enums\n */\nexport enum OrderStatus {\n /** Order is pending submission */\n Pending = 0,\n /** Order is working (open) in the market */\n Working = 1,\n /** Order has been completely filled */\n Filled = 2,\n /** Order was cancelled */\n Cancelled = 3,\n /** Order was rejected */\n Rejected = 4,\n /** Order is partially filled */\n PartiallyFilled = 5,\n}\n\n/**\n * Time unit for historical bar data.\n * @category Enums\n */\nexport enum BarUnit {\n /** Second bars */\n Second = 1,\n /** Minute bars */\n Minute = 2,\n /** Hourly bars */\n Hour = 3,\n /** Daily bars */\n Day = 4,\n /** Weekly bars */\n Week = 5,\n /** Monthly bars */\n Month = 6,\n}\n\n/**\n * Type of position (long or short).\n * @category Enums\n */\nexport enum PositionType {\n /** Long position - bought contracts */\n Long = 0,\n /** Short position - sold contracts */\n Short = 1,\n}\n\n/**\n * Type of trade execution.\n * @category Enums\n */\nexport enum TradeType {\n /** Trade executed at bid price */\n Bid = 0,\n /** Trade executed at ask price */\n Ask = 1,\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "topstepx-api",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Framework-agnostic TypeScript client for the TopstepX trading API with REST and WebSocket support",
|
|
5
5
|
"author": "Hunter Evanoff",
|
|
6
6
|
"license": "MIT",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"default": "./dist/index.js"
|
|
25
25
|
},
|
|
26
26
|
"require": {
|
|
27
|
-
"types": "./dist/index.d.
|
|
27
|
+
"types": "./dist/index.d.ts",
|
|
28
28
|
"default": "./dist/index.cjs"
|
|
29
29
|
}
|
|
30
30
|
}
|
|
@@ -32,7 +32,8 @@
|
|
|
32
32
|
"files": [
|
|
33
33
|
"dist",
|
|
34
34
|
"README.md",
|
|
35
|
-
"LICENSE"
|
|
35
|
+
"LICENSE",
|
|
36
|
+
"CHANGELOG.md"
|
|
36
37
|
],
|
|
37
38
|
"sideEffects": false,
|
|
38
39
|
"engines": {
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors/base-error.ts","../src/errors/auth-error.ts","../src/errors/api-error.ts","../src/errors/connection-error.ts","../src/auth/auth.service.ts","../src/rest/http-client.ts","../src/rest/account/account.api.ts","../src/rest/order/order.api.ts","../src/rest/position/position.api.ts","../src/rest/trade/trade.api.ts","../src/rest/contract/contract.api.ts","../src/rest/history/history.api.ts","../src/realtime/connection-manager.ts","../src/utils/event-emitter.ts","../src/realtime/market/market-hub.ts","../src/realtime/user/user-hub.ts","../src/client.ts","../src/types/enums.ts"],"names":["OrderType","OrderSide","OrderStatus","BarUnit","PositionType","TradeType"],"mappings":"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","file":"index.mjs","sourcesContent":["export abstract class TopstepXError extends Error {\n public readonly timestamp: Date;\n\n constructor(\n message: string,\n public readonly code?: number\n ) {\n super(message);\n this.name = this.constructor.name;\n this.timestamp = new Date();\n Error.captureStackTrace?.(this, this.constructor);\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n timestamp: this.timestamp.toISOString(),\n };\n }\n}\n","import { TopstepXError } from './base-error';\n\nexport class AuthenticationError extends TopstepXError {\n constructor(message: string, code?: number) {\n super(message, code);\n }\n}\n","import { TopstepXError } from './base-error';\n\nexport class ApiError extends TopstepXError {\n constructor(\n message: string,\n code: number,\n public readonly endpoint: string\n ) {\n super(message, code);\n }\n\n toJSON(): Record<string, unknown> {\n return {\n ...super.toJSON(),\n endpoint: this.endpoint,\n };\n }\n}\n","import { TopstepXError } from './base-error';\n\nexport class ConnectionError extends TopstepXError {\n constructor(message: string) {\n super(message);\n }\n}\n","import { AuthenticationError } from '../errors';\nimport type { AuthConfig, LoginRequest, LoginResponse } from './types';\n\nexport class AuthService {\n private sessionToken: string | null = null;\n private tokenExpiration: Date | null = null;\n private refreshTimer?: ReturnType<typeof setTimeout>;\n private readonly config: Required<AuthConfig>;\n\n constructor(config: AuthConfig) {\n this.config = {\n username: config.username,\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? 'https://api.topstepx.com',\n autoRefresh: config.autoRefresh ?? true,\n tokenValidityHours: config.tokenValidityHours ?? 24,\n };\n }\n\n async login(): Promise<void> {\n const request: LoginRequest = {\n userName: this.config.username,\n apiKey: this.config.apiKey,\n };\n\n const response = await fetch(`${this.config.baseUrl}/api/Auth/loginKey`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'text/plain',\n },\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n throw new AuthenticationError(\n `HTTP error during login: ${response.status}`,\n response.status\n );\n }\n\n const data = (await response.json()) as LoginResponse;\n\n if (!data.success || data.errorCode !== 0) {\n throw new AuthenticationError(\n data.errorMessage ?? 'Login failed',\n data.errorCode\n );\n }\n\n this.sessionToken = data.token;\n this.setTokenExpiration();\n\n if (this.config.autoRefresh) {\n this.scheduleTokenRefresh();\n }\n }\n\n async validate(): Promise<boolean> {\n if (!this.sessionToken) return false;\n\n try {\n const response = await fetch(`${this.config.baseUrl}/api/Auth/validate`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'text/plain',\n Authorization: `Bearer ${this.sessionToken}`,\n },\n });\n\n if (response.ok) {\n this.setTokenExpiration();\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }\n\n async getSessionToken(): Promise<string> {\n if (!this.sessionToken || this.isTokenExpired()) {\n const isValid = await this.validate();\n if (!isValid) {\n await this.login();\n }\n }\n\n if (!this.sessionToken) {\n throw new AuthenticationError('No active session token available');\n }\n\n return this.sessionToken;\n }\n\n get baseUrl(): string {\n return this.config.baseUrl;\n }\n\n private setTokenExpiration(): void {\n const expiration = new Date();\n expiration.setHours(\n expiration.getHours() + this.config.tokenValidityHours\n );\n this.tokenExpiration = expiration;\n }\n\n private isTokenExpired(): boolean {\n if (!this.tokenExpiration) return true;\n // Check with 5 minute buffer\n const buffer = 5 * 60 * 1000;\n return Date.now() >= this.tokenExpiration.getTime() - buffer;\n }\n\n private scheduleTokenRefresh(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n }\n\n if (!this.tokenExpiration) return;\n\n // Refresh 10 minutes before expiration\n const refreshTime =\n this.tokenExpiration.getTime() - Date.now() - 10 * 60 * 1000;\n\n if (refreshTime > 0) {\n this.refreshTimer = setTimeout(async () => {\n try {\n const isValid = await this.validate();\n if (!isValid) {\n await this.login();\n }\n this.scheduleTokenRefresh();\n } catch (error) {\n console.error('Token refresh failed:', error);\n }\n }, refreshTime);\n }\n }\n\n destroy(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n }\n this.sessionToken = null;\n this.tokenExpiration = null;\n }\n}\n","import { ApiError } from '../errors';\n\nexport interface HttpClientConfig {\n baseUrl: string;\n getToken: () => Promise<string>;\n timeout?: number;\n}\n\ninterface ApiResponseBase {\n success: boolean;\n errorCode: number;\n errorMessage: string | null;\n}\n\nexport class HttpClient {\n private readonly config: Required<HttpClientConfig>;\n\n constructor(config: HttpClientConfig) {\n this.config = {\n baseUrl: config.baseUrl,\n getToken: config.getToken,\n timeout: config.timeout ?? 30000,\n };\n }\n\n async post<TRequest, TResponse extends ApiResponseBase>(\n endpoint: string,\n data: TRequest\n ): Promise<TResponse> {\n const token = await this.config.getToken();\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const response = await fetch(`${this.config.baseUrl}${endpoint}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(data),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new ApiError(\n `HTTP error: ${response.status} ${response.statusText}`,\n response.status,\n endpoint\n );\n }\n\n const result = (await response.json()) as TResponse;\n\n if (!result.success || result.errorCode !== 0) {\n throw new ApiError(\n result.errorMessage ?? 'API request failed',\n result.errorCode,\n endpoint\n );\n }\n\n return result;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof ApiError) throw error;\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new ApiError('Request timeout', -1, endpoint);\n }\n\n throw new ApiError(\n error instanceof Error ? error.message : 'Unknown error',\n -1,\n endpoint\n );\n }\n }\n}\n","import type { HttpClient } from '../http-client';\nimport type {\n Account,\n SearchAccountsRequest,\n SearchAccountsResponse,\n} from './types';\n\nexport class AccountApi {\n constructor(private readonly http: HttpClient) {}\n\n async search(request: SearchAccountsRequest): Promise<Account[]> {\n const response = await this.http.post<\n SearchAccountsRequest,\n SearchAccountsResponse\n >('/api/Account/search', request);\n return response.accounts;\n }\n}\n","import type { HttpClient } from '../http-client';\nimport type {\n Order,\n PlaceOrderRequest,\n PlaceOrderResponse,\n SearchOrdersRequest,\n SearchOrdersResponse,\n SearchOpenOrdersRequest,\n CancelOrderRequest,\n CancelOrderResponse,\n ModifyOrderRequest,\n ModifyOrderResponse,\n} from './types';\n\n/**\n * API for managing orders - place, cancel, modify, and search.\n *\n * @example\n * ```typescript\n * // Place a market order\n * const result = await client.orders.place({\n * accountId: 123,\n * contractId: 'CON.F.US.ENQ.M25',\n * type: OrderType.Market,\n * side: OrderSide.Buy,\n * size: 1,\n * });\n *\n * // Cancel an order\n * await client.orders.cancel({ accountId: 123, orderId: result.orderId });\n * ```\n *\n * @category REST API\n */\nexport class OrderApi {\n /** @internal */\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Search historical orders within a date range.\n * @param request - Search parameters including accountId and optional date range\n * @returns Array of orders matching the search criteria\n */\n async search(request: SearchOrdersRequest): Promise<Order[]> {\n const response = await this.http.post<\n SearchOrdersRequest,\n SearchOrdersResponse\n >('/api/Order/search', request);\n return response.orders;\n }\n\n /**\n * Get all currently open (working) orders for an account.\n * @param request - Request containing the accountId\n * @returns Array of open orders\n */\n async searchOpen(request: SearchOpenOrdersRequest): Promise<Order[]> {\n const response = await this.http.post<\n SearchOpenOrdersRequest,\n SearchOrdersResponse\n >('/api/Order/searchOpen', request);\n return response.orders;\n }\n\n /**\n * Place a new order.\n * @param request - Order details including type, side, size, and prices\n * @returns Response containing the new orderId\n *\n * @example\n * ```typescript\n * // Market order\n * await client.orders.place({\n * accountId: 123,\n * contractId: 'CON.F.US.ENQ.M25',\n * type: OrderType.Market,\n * side: OrderSide.Buy,\n * size: 1,\n * });\n *\n * // Limit order\n * await client.orders.place({\n * accountId: 123,\n * contractId: 'CON.F.US.ENQ.M25',\n * type: OrderType.Limit,\n * side: OrderSide.Buy,\n * size: 1,\n * limitPrice: 5000.00,\n * });\n * ```\n */\n async place(request: PlaceOrderRequest): Promise<PlaceOrderResponse> {\n return this.http.post<PlaceOrderRequest, PlaceOrderResponse>(\n '/api/Order/place',\n request\n );\n }\n\n /**\n * Cancel an existing order.\n * @param request - Request containing accountId and orderId to cancel\n * @returns Response indicating success or failure\n */\n async cancel(request: CancelOrderRequest): Promise<CancelOrderResponse> {\n return this.http.post<CancelOrderRequest, CancelOrderResponse>(\n '/api/Order/cancel',\n request\n );\n }\n\n /**\n * Modify an existing order's size or price.\n * @param request - Request containing orderId and fields to modify\n * @returns Response indicating success or failure\n */\n async modify(request: ModifyOrderRequest): Promise<ModifyOrderResponse> {\n return this.http.post<ModifyOrderRequest, ModifyOrderResponse>(\n '/api/Order/modify',\n request\n );\n }\n}\n","import type { HttpClient } from '../http-client';\nimport type {\n Position,\n SearchOpenPositionsRequest,\n SearchOpenPositionsResponse,\n ClosePositionRequest,\n ClosePositionResponse,\n PartialClosePositionRequest,\n PartialClosePositionResponse,\n} from './types';\n\nexport class PositionApi {\n constructor(private readonly http: HttpClient) {}\n\n async searchOpen(request: SearchOpenPositionsRequest): Promise<Position[]> {\n const response = await this.http.post<\n SearchOpenPositionsRequest,\n SearchOpenPositionsResponse\n >('/api/Position/searchOpen', request);\n return response.positions;\n }\n\n async close(request: ClosePositionRequest): Promise<ClosePositionResponse> {\n return this.http.post<ClosePositionRequest, ClosePositionResponse>(\n '/api/Position/closeContract',\n request\n );\n }\n\n async partialClose(\n request: PartialClosePositionRequest\n ): Promise<PartialClosePositionResponse> {\n return this.http.post<\n PartialClosePositionRequest,\n PartialClosePositionResponse\n >('/api/Position/partialCloseContract', request);\n }\n}\n","import type { HttpClient } from '../http-client';\nimport type { Trade, SearchTradesRequest, SearchTradesResponse } from './types';\n\nexport class TradeApi {\n constructor(private readonly http: HttpClient) {}\n\n async search(request: SearchTradesRequest): Promise<Trade[]> {\n const response = await this.http.post<\n SearchTradesRequest,\n SearchTradesResponse\n >('/api/Trade/search', request);\n return response.trades;\n }\n}\n","import type { HttpClient } from '../http-client';\nimport type {\n Contract,\n SearchContractsRequest,\n SearchContractsResponse,\n SearchContractByIdRequest,\n SearchContractByIdResponse,\n} from './types';\n\nexport class ContractApi {\n constructor(private readonly http: HttpClient) {}\n\n async search(request: SearchContractsRequest): Promise<Contract[]> {\n const response = await this.http.post<\n SearchContractsRequest,\n SearchContractsResponse\n >('/api/Contract/search', request);\n return response.contracts;\n }\n\n async searchById(\n request: SearchContractByIdRequest\n ): Promise<Contract | null> {\n const response = await this.http.post<\n SearchContractByIdRequest,\n SearchContractByIdResponse\n >('/api/Contract/searchById', request);\n return response.contract;\n }\n}\n","import type { HttpClient } from '../http-client';\nimport type { Bar, RetrieveBarsRequest, RetrieveBarsResponse } from './types';\n\nexport class HistoryApi {\n constructor(private readonly http: HttpClient) {}\n\n async retrieveBars(request: RetrieveBarsRequest): Promise<Bar[]> {\n const response = await this.http.post<\n RetrieveBarsRequest,\n RetrieveBarsResponse\n >('/api/History/retrieveBars', request);\n return response.bars;\n }\n}\n","import {\n HubConnection,\n HubConnectionBuilder,\n HttpTransportType,\n HubConnectionState,\n} from '@microsoft/signalr';\nimport type { AuthService } from '../auth';\nimport { ConnectionError } from '../errors';\n\nexport interface ConnectionManagerConfig {\n marketHubUrl: string;\n userHubUrl: string;\n auth: AuthService;\n reconnectDelays?: number[];\n}\n\nexport class ConnectionManager {\n private marketConn: HubConnection | null = null;\n private userConn: HubConnection | null = null;\n private readonly config: Required<ConnectionManagerConfig>;\n private marketConnectionCallbacks: Array<(conn: HubConnection) => void> = [];\n private userConnectionCallbacks: Array<(conn: HubConnection) => void> = [];\n\n constructor(config: ConnectionManagerConfig) {\n this.config = {\n marketHubUrl: config.marketHubUrl,\n userHubUrl: config.userHubUrl,\n auth: config.auth,\n reconnectDelays: config.reconnectDelays ?? [0, 2000, 5000, 10000, 30000],\n };\n }\n\n async connect(): Promise<void> {\n const token = await this.config.auth.getSessionToken();\n\n // Build market connection\n this.marketConn = new HubConnectionBuilder()\n .withUrl(`${this.config.marketHubUrl}?access_token=${token}`, {\n skipNegotiation: true,\n transport: HttpTransportType.WebSockets,\n accessTokenFactory: () => this.config.auth.getSessionToken(),\n })\n .withAutomaticReconnect(this.config.reconnectDelays)\n .build();\n\n // Build user connection\n this.userConn = new HubConnectionBuilder()\n .withUrl(`${this.config.userHubUrl}?access_token=${token}`, {\n skipNegotiation: true,\n transport: HttpTransportType.WebSockets,\n accessTokenFactory: () => this.config.auth.getSessionToken(),\n })\n .withAutomaticReconnect(this.config.reconnectDelays)\n .build();\n\n // Notify callbacks before starting\n this.marketConnectionCallbacks.forEach((cb) => cb(this.marketConn!));\n this.userConnectionCallbacks.forEach((cb) => cb(this.userConn!));\n\n // Start connections\n try {\n await this.marketConn.start();\n await this.userConn.start();\n } catch (error) {\n throw new ConnectionError(\n `Failed to establish WebSocket connections: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n );\n }\n }\n\n async disconnect(): Promise<void> {\n await Promise.all([this.marketConn?.stop(), this.userConn?.stop()]);\n this.marketConn = null;\n this.userConn = null;\n }\n\n get isConnected(): boolean {\n return (\n this.marketConn?.state === HubConnectionState.Connected &&\n this.userConn?.state === HubConnectionState.Connected\n );\n }\n\n get marketConnection(): HubConnection {\n if (!this.marketConn) {\n throw new ConnectionError('Market connection not initialized');\n }\n return this.marketConn;\n }\n\n get userConnection(): HubConnection {\n if (!this.userConn) {\n throw new ConnectionError('User connection not initialized');\n }\n return this.userConn;\n }\n\n onMarketConnection(callback: (conn: HubConnection) => void): void {\n this.marketConnectionCallbacks.push(callback);\n if (this.marketConn) callback(this.marketConn);\n }\n\n onUserConnection(callback: (conn: HubConnection) => void): void {\n this.userConnectionCallbacks.push(callback);\n if (this.userConn) callback(this.userConn);\n }\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype EventMap = { [key: string]: any };\ntype EventCallback<T> = T extends void ? () => void : (data: T) => void;\n\nexport class TypedEventEmitter<T extends EventMap = EventMap> {\n private listeners = new Map<keyof T, Set<EventCallback<T[keyof T]>>>();\n\n on<K extends keyof T>(event: K, callback: EventCallback<T[K]>): this {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(callback as EventCallback<T[keyof T]>);\n return this;\n }\n\n off<K extends keyof T>(event: K, callback: EventCallback<T[K]>): this {\n this.listeners.get(event)?.delete(callback as EventCallback<T[keyof T]>);\n return this;\n }\n\n once<K extends keyof T>(event: K, callback: EventCallback<T[K]>): this {\n const onceCallback = ((data: T[K]) => {\n this.off(event, onceCallback as EventCallback<T[K]>);\n (callback as (data: T[K]) => void)(data);\n }) as EventCallback<T[K]>;\n return this.on(event, onceCallback);\n }\n\n protected emit<K extends keyof T>(\n event: K,\n ...args: T[K] extends void ? [] : [T[K]]\n ): boolean {\n const callbacks = this.listeners.get(event);\n if (!callbacks || callbacks.size === 0) return false;\n\n callbacks.forEach((callback) => {\n try {\n if (args.length > 0) {\n (callback as (data: T[K]) => void)(args[0] as T[K]);\n } else {\n (callback as () => void)();\n }\n } catch (error) {\n console.error(`Error in event listener for ${String(event)}:`, error);\n }\n });\n return true;\n }\n\n removeAllListeners<K extends keyof T>(event?: K): this {\n if (event) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n return this;\n }\n}\n","import type { ConnectionManager } from '../connection-manager';\nimport { TypedEventEmitter } from '../../utils/event-emitter';\nimport type { Quote, MarketTrade, MarketDepth, MarketHubEvents } from './types';\n\nexport class MarketHub extends TypedEventEmitter<MarketHubEvents> {\n private subscribedQuotes = new Set<string>();\n private subscribedTrades = new Set<string>();\n private subscribedDepth = new Set<string>();\n\n constructor(private readonly connectionManager: ConnectionManager) {\n super();\n this.setupEventHandlers();\n }\n\n private setupEventHandlers(): void {\n this.connectionManager.onMarketConnection((connection) => {\n connection.on('GatewayQuote', (contractId: string, data: Quote[]) => {\n this.emit('quote', { contractId, data });\n });\n\n connection.on(\n 'GatewayTrade',\n (contractId: string, data: MarketTrade[]) => {\n this.emit('trade', { contractId, data });\n }\n );\n\n connection.on(\n 'GatewayDepth',\n (contractId: string, data: MarketDepth[]) => {\n this.emit('depth', { contractId, data });\n }\n );\n });\n }\n\n async subscribe(contractId: string): Promise<void> {\n await Promise.all([\n this.subscribeQuotes(contractId),\n this.subscribeTrades(contractId),\n this.subscribeDepth(contractId),\n ]);\n }\n\n async unsubscribe(contractId: string): Promise<void> {\n await Promise.all([\n this.unsubscribeQuotes(contractId),\n this.unsubscribeTrades(contractId),\n this.unsubscribeDepth(contractId),\n ]);\n }\n\n async subscribeQuotes(contractId: string): Promise<void> {\n if (this.subscribedQuotes.has(contractId)) return;\n const connection = this.connectionManager.marketConnection;\n await connection.invoke('SubscribeContractQuotes', contractId);\n this.subscribedQuotes.add(contractId);\n }\n\n async unsubscribeQuotes(contractId: string): Promise<void> {\n if (!this.subscribedQuotes.has(contractId)) return;\n const connection = this.connectionManager.marketConnection;\n await connection.invoke('UnsubscribeContractQuotes', contractId);\n this.subscribedQuotes.delete(contractId);\n }\n\n async subscribeTrades(contractId: string): Promise<void> {\n if (this.subscribedTrades.has(contractId)) return;\n const connection = this.connectionManager.marketConnection;\n await connection.invoke('SubscribeContractTrades', contractId);\n this.subscribedTrades.add(contractId);\n }\n\n async unsubscribeTrades(contractId: string): Promise<void> {\n if (!this.subscribedTrades.has(contractId)) return;\n const connection = this.connectionManager.marketConnection;\n await connection.invoke('UnsubscribeContractTrades', contractId);\n this.subscribedTrades.delete(contractId);\n }\n\n async subscribeDepth(contractId: string): Promise<void> {\n if (this.subscribedDepth.has(contractId)) return;\n const connection = this.connectionManager.marketConnection;\n await connection.invoke('SubscribeContractMarketDepth', contractId);\n this.subscribedDepth.add(contractId);\n }\n\n async unsubscribeDepth(contractId: string): Promise<void> {\n if (!this.subscribedDepth.has(contractId)) return;\n const connection = this.connectionManager.marketConnection;\n await connection.invoke('UnsubscribeContractMarketDepth', contractId);\n this.subscribedDepth.delete(contractId);\n }\n}\n","import type { ConnectionManager } from '../connection-manager';\nimport { TypedEventEmitter } from '../../utils/event-emitter';\nimport type {\n OrderUpdate,\n PositionUpdate,\n TradeUpdate,\n AccountUpdate,\n UserHubEvents,\n} from './types';\n\nexport class UserHub extends TypedEventEmitter<UserHubEvents> {\n private subscribedOrders = new Set<number>();\n private subscribedPositions = new Set<number>();\n private subscribedTrades = new Set<number>();\n\n constructor(private readonly connectionManager: ConnectionManager) {\n super();\n this.setupEventHandlers();\n }\n\n private setupEventHandlers(): void {\n this.connectionManager.onUserConnection((connection) => {\n connection.on('GatewayUserAccount', (data: AccountUpdate) => {\n this.emit('account', data);\n });\n\n connection.on('GatewayUserOrder', (data: OrderUpdate) => {\n this.emit('order', data);\n });\n\n connection.on('GatewayUserPosition', (data: PositionUpdate) => {\n this.emit('position', data);\n });\n\n connection.on('GatewayUserTrade', (data: TradeUpdate) => {\n this.emit('trade', data);\n });\n });\n }\n\n async subscribe(accountId: number): Promise<void> {\n await Promise.all([\n this.subscribeOrders(accountId),\n this.subscribePositions(accountId),\n this.subscribeTrades(accountId),\n ]);\n }\n\n async unsubscribe(accountId: number): Promise<void> {\n await Promise.all([\n this.unsubscribeOrders(accountId),\n this.unsubscribePositions(accountId),\n this.unsubscribeTrades(accountId),\n ]);\n }\n\n async subscribeOrders(accountId: number): Promise<void> {\n if (this.subscribedOrders.has(accountId)) return;\n const connection = this.connectionManager.userConnection;\n await connection.invoke('SubscribeOrders', accountId);\n this.subscribedOrders.add(accountId);\n }\n\n async unsubscribeOrders(accountId: number): Promise<void> {\n if (!this.subscribedOrders.has(accountId)) return;\n const connection = this.connectionManager.userConnection;\n await connection.invoke('UnsubscribeOrders', accountId);\n this.subscribedOrders.delete(accountId);\n }\n\n async subscribePositions(accountId: number): Promise<void> {\n if (this.subscribedPositions.has(accountId)) return;\n const connection = this.connectionManager.userConnection;\n await connection.invoke('SubscribePositions', accountId);\n this.subscribedPositions.add(accountId);\n }\n\n async unsubscribePositions(accountId: number): Promise<void> {\n if (!this.subscribedPositions.has(accountId)) return;\n const connection = this.connectionManager.userConnection;\n await connection.invoke('UnsubscribePositions', accountId);\n this.subscribedPositions.delete(accountId);\n }\n\n async subscribeTrades(accountId: number): Promise<void> {\n if (this.subscribedTrades.has(accountId)) return;\n const connection = this.connectionManager.userConnection;\n await connection.invoke('SubscribeTrades', accountId);\n this.subscribedTrades.add(accountId);\n }\n\n async unsubscribeTrades(accountId: number): Promise<void> {\n if (!this.subscribedTrades.has(accountId)) return;\n const connection = this.connectionManager.userConnection;\n await connection.invoke('UnsubscribeTrades', accountId);\n this.subscribedTrades.delete(accountId);\n }\n}\n","import { AuthService } from './auth';\nimport { HttpClient, AccountApi, OrderApi, PositionApi, TradeApi, ContractApi, HistoryApi } from './rest';\nimport { ConnectionManager, MarketHub, UserHub } from './realtime';\nimport { TypedEventEmitter } from './utils/event-emitter';\nimport type { TopstepXClientConfig, TopstepXClientEvents } from './types';\n\n/**\n * Main client for interacting with the TopstepX trading API.\n *\n * Provides access to REST APIs for account management, order placement,\n * position management, trade history, contract search, and historical data.\n * Also provides real-time WebSocket connections for market data and account updates.\n *\n * @example\n * ```typescript\n * import { TopstepXClient, OrderType, OrderSide } from 'topstepx-api';\n *\n * const client = new TopstepXClient({\n * username: process.env.TOPSTEP_USERNAME,\n * apiKey: process.env.TOPSTEP_API_KEY,\n * });\n *\n * await client.connect();\n *\n * // Get accounts\n * const accounts = await client.accounts.search({ onlyActiveAccounts: true });\n *\n * // Place an order\n * await client.orders.place({\n * accountId: accounts[0].id,\n * contractId: 'CON.F.US.ENQ.M25',\n * type: OrderType.Market,\n * side: OrderSide.Buy,\n * size: 1,\n * });\n *\n * // Subscribe to real-time quotes\n * client.marketHub.on('quote', ({ contractId, data }) => {\n * console.log('Quote:', data);\n * });\n * await client.marketHub.subscribe('CON.F.US.ENQ.M25');\n *\n * await client.disconnect();\n * ```\n *\n * @category Client\n */\nexport class TopstepXClient extends TypedEventEmitter<TopstepXClientEvents> {\n private readonly auth: AuthService;\n private readonly connectionManager: ConnectionManager;\n private readonly httpClient: HttpClient;\n\n /** Account management API */\n public readonly accounts: AccountApi;\n /** Order management API (place, cancel, modify, search) */\n public readonly orders: OrderApi;\n /** Position management API (search, close) */\n public readonly positions: PositionApi;\n /** Trade history API */\n public readonly trades: TradeApi;\n /** Contract/symbol search API */\n public readonly contracts: ContractApi;\n /** Historical bars/candles API */\n public readonly history: HistoryApi;\n\n /** Real-time market data hub (quotes, trades, depth) */\n public readonly marketHub: MarketHub;\n /** Real-time account data hub (orders, positions, trades) */\n public readonly userHub: UserHub;\n\n constructor(config: TopstepXClientConfig) {\n super();\n\n const baseUrl = config.baseUrl ?? 'https://api.topstepx.com';\n\n this.auth = new AuthService({\n username: config.username,\n apiKey: config.apiKey,\n baseUrl,\n autoRefresh: config.autoRefresh ?? true,\n tokenValidityHours: config.tokenValidityHours ?? 24,\n });\n\n this.httpClient = new HttpClient({\n baseUrl,\n getToken: () => this.auth.getSessionToken(),\n });\n\n // Initialize REST APIs\n this.accounts = new AccountApi(this.httpClient);\n this.orders = new OrderApi(this.httpClient);\n this.positions = new PositionApi(this.httpClient);\n this.trades = new TradeApi(this.httpClient);\n this.contracts = new ContractApi(this.httpClient);\n this.history = new HistoryApi(this.httpClient);\n\n // Initialize Realtime\n this.connectionManager = new ConnectionManager({\n marketHubUrl: config.marketHubUrl ?? 'https://rtc.topstepx.com/hubs/market',\n userHubUrl: config.userHubUrl ?? 'https://rtc.topstepx.com/hubs/user',\n auth: this.auth,\n });\n\n this.marketHub = new MarketHub(this.connectionManager);\n this.userHub = new UserHub(this.connectionManager);\n }\n\n /**\n * Connect to the TopstepX API.\n * Authenticates and establishes WebSocket connections.\n */\n async connect(): Promise<void> {\n await this.auth.login();\n await this.connectionManager.connect();\n this.emit('connected');\n }\n\n /**\n * Disconnect from all services.\n */\n async disconnect(): Promise<void> {\n await this.connectionManager.disconnect();\n this.auth.destroy();\n this.emit('disconnected');\n }\n\n /**\n * Check if client is connected.\n */\n get isConnected(): boolean {\n return this.connectionManager.isConnected;\n }\n\n /**\n * Get the current auth token (for advanced use cases).\n */\n async getToken(): Promise<string> {\n return this.auth.getSessionToken();\n }\n}\n","/**\n * Type of order to place.\n * @category Enums\n */\nexport enum OrderType {\n /** Limit order - executes at specified price or better */\n Limit = 1,\n /** Market order - executes immediately at current market price */\n Market = 2,\n /** Stop order - becomes market order when stop price is reached */\n Stop = 3,\n /** Stop-limit order - becomes limit order when stop price is reached */\n StopLimit = 4,\n}\n\n/**\n * Side of the order (buy or sell).\n * @category Enums\n */\nexport enum OrderSide {\n /** Buy order - go long or close short position */\n Buy = 0,\n /** Sell order - go short or close long position */\n Sell = 1,\n}\n\n/**\n * Current status of an order.\n * @category Enums\n */\nexport enum OrderStatus {\n /** Order is pending submission */\n Pending = 0,\n /** Order is working (open) in the market */\n Working = 1,\n /** Order has been completely filled */\n Filled = 2,\n /** Order was cancelled */\n Cancelled = 3,\n /** Order was rejected */\n Rejected = 4,\n /** Order is partially filled */\n PartiallyFilled = 5,\n}\n\n/**\n * Time unit for historical bar data.\n * @category Enums\n */\nexport enum BarUnit {\n /** Second bars */\n Second = 1,\n /** Minute bars */\n Minute = 2,\n /** Hourly bars */\n Hour = 3,\n /** Daily bars */\n Day = 4,\n /** Weekly bars */\n Week = 5,\n /** Monthly bars */\n Month = 6,\n}\n\n/**\n * Type of position (long or short).\n * @category Enums\n */\nexport enum PositionType {\n /** Long position - bought contracts */\n Long = 0,\n /** Short position - sold contracts */\n Short = 1,\n}\n\n/**\n * Type of trade execution.\n * @category Enums\n */\nexport enum TradeType {\n /** Trade executed at bid price */\n Bid = 0,\n /** Trade executed at ask price */\n Ask = 1,\n}\n"]}
|