@tastytrade/api 5.0.0 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/README.md +87 -43
- package/dist/account-streamer.d.ts +6 -3
- package/dist/account-streamer.d.ts.map +1 -1
- package/dist/account-streamer.js +21 -15
- package/dist/account-streamer.js.map +1 -1
- package/dist/logger.d.ts +5 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +4 -0
- package/dist/logger.js.map +1 -1
- package/dist/market-data-streamer.d.ts.map +1 -1
- package/dist/market-data-streamer.js +1 -0
- package/dist/market-data-streamer.js.map +1 -1
- package/dist/models/access-token.d.ts +12 -0
- package/dist/models/access-token.d.ts.map +1 -0
- package/dist/models/access-token.js +35 -0
- package/dist/models/access-token.js.map +1 -0
- package/dist/models/tastytrade-session.d.ts.map +1 -1
- package/dist/models/tastytrade-session.js.map +1 -1
- package/dist/quote-streamer.d.ts +58 -0
- package/dist/quote-streamer.d.ts.map +1 -0
- package/dist/quote-streamer.js +132 -0
- package/dist/quote-streamer.js.map +1 -0
- package/dist/services/account-status-service.js +0 -1
- package/dist/services/account-status-service.js.map +1 -1
- package/dist/services/accounts-and-customers-service.js +0 -1
- package/dist/services/accounts-and-customers-service.js.map +1 -1
- package/dist/services/balances-and-positions-service.js +0 -1
- package/dist/services/balances-and-positions-service.js.map +1 -1
- package/dist/services/instruments-service.js +1 -2
- package/dist/services/instruments-service.js.map +1 -1
- package/dist/services/margin-requirements-service.js +0 -1
- package/dist/services/margin-requirements-service.js.map +1 -1
- package/dist/services/market-metrics-service.js +0 -1
- package/dist/services/market-metrics-service.js.map +1 -1
- package/dist/services/net-liquidating-value-history-service.js +0 -1
- package/dist/services/net-liquidating-value-history-service.js.map +1 -1
- package/dist/services/orders-service.js +0 -1
- package/dist/services/orders-service.js.map +1 -1
- package/dist/services/risk-parameters-service.js +0 -1
- package/dist/services/risk-parameters-service.js.map +1 -1
- package/dist/services/session-service.d.ts +6 -1
- package/dist/services/session-service.d.ts.map +1 -1
- package/dist/services/session-service.js +10 -2
- package/dist/services/session-service.js.map +1 -1
- package/dist/services/symbol-search-service.js +0 -1
- package/dist/services/symbol-search-service.js.map +1 -1
- package/dist/services/tastytrade-http-client.d.ts +16 -2
- package/dist/services/tastytrade-http-client.d.ts.map +1 -1
- package/dist/services/tastytrade-http-client.js +71 -14
- package/dist/services/tastytrade-http-client.js.map +1 -1
- package/dist/services/transactions-service.js +0 -1
- package/dist/services/transactions-service.js.map +1 -1
- package/dist/services/watchlists-service.js +0 -1
- package/dist/services/watchlists-service.js.map +1 -1
- package/dist/tastytrade-api.d.ts +12 -2
- package/dist/tastytrade-api.d.ts.map +1 -1
- package/dist/tastytrade-api.js +22 -6
- package/dist/tastytrade-api.js.map +1 -1
- package/dist/utils/json-util.d.ts.map +1 -1
- package/dist/utils/json-util.js +0 -2
- package/dist/utils/json-util.js.map +1 -1
- package/dist/utils/response-util.d.ts.map +1 -1
- package/dist/utils/response-util.js +0 -1
- package/dist/utils/response-util.js.map +1 -1
- package/eslint.config.cjs +46 -0
- package/lib/account-streamer.ts +31 -23
- package/lib/logger.ts +6 -1
- package/lib/models/access-token.ts +40 -0
- package/lib/models/tastytrade-session.ts +1 -1
- package/lib/quote-streamer.ts +151 -0
- package/lib/services/instruments-service.ts +1 -1
- package/lib/services/session-service.ts +13 -1
- package/lib/services/tastytrade-http-client.ts +93 -15
- package/lib/tastytrade-api.ts +31 -4
- package/lib/utils/json-util.ts +0 -2
- package/lib/utils/response-util.ts +3 -4
- package/package.json +26 -18
- package/tsconfig.json +2 -2
- package/.eslintrc.cjs +0 -18
- package/lib/market-data-streamer.ts +0 -376
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tastytrade-http-client.js","sourceRoot":"","sources":["../../lib/services/tastytrade-http-client.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,iCAAiC,CAAA;AAC/D,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,CAAC,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"tastytrade-http-client.js","sourceRoot":"","sources":["../../lib/services/tastytrade-http-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactions-service.js","sourceRoot":"","sources":["../../lib/services/transactions-service.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"transactions-service.js","sourceRoot":"","sources":["../../lib/services/transactions-service.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,MAAM,2BAA2B,CAAC;AAG5D,MAAM,CAAC,OAAO,OAAO,mBAAmB;IACpC,YAAoB,UAAgC;QAAhC,eAAU,GAAV,UAAU,CAAsB;IACpD,CAAC;IAED,sCAAsC;IACtC,KAAK,CAAC,cAAc,CAAC,aAAqB,EAAE,EAAU;QAClD,iDAAiD;QACjD,MAAM,UAAU,GAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,aAAa,aAAa,iBAAiB,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QAC5G,OAAO,mBAAmB,CAAC,UAAU,CAAC,CAAA;IAC1C,CAAC;IACD,KAAK,CAAC,YAAY,CAAC,aAAqB;QACpC,sDAAsD;QACtD,MAAM,SAAS,GAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,aAAa,aAAa,0BAA0B,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QAChH,OAAO,mBAAmB,CAAC,SAAS,CAAC,CAAA;IACzC,CAAC;IAED,8CAA8C;IAC9C,KAAK,CAAC,sBAAsB,CAAC,aAAqB,EAAE,WAAW,GAAG,EAAE;QAChE,8GAA8G;QAC9G,gFAAgF;QAChF,MAAM,mBAAmB,GAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,aAAa,aAAa,eAAe,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC,CAAA;QACxH,OAAO,mBAAmB,CAAC,mBAAmB,CAAC,CAAA;IACnD,CAAC;CACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watchlists-service.js","sourceRoot":"","sources":["../../lib/services/watchlists-service.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"watchlists-service.js","sourceRoot":"","sources":["../../lib/services/watchlists-service.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,MAAM,2BAA2B,CAAC;AAG5D,MAAM,CAAC,OAAO,OAAO,iBAAiB;IAClC,YAAoB,UAAgC;QAAhC,eAAU,GAAV,UAAU,CAAsB;IACpD,CAAC;IAED,mEAAmE;IACnE,KAAK,CAAC,kBAAkB;QACpB,mDAAmD;QACnD,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QAClF,OAAO,mBAAmB,CAAC,eAAe,CAAC,CAAA;IAC/C,CAAC;IACD,KAAK,CAAC,iBAAiB,CAAC,kBAA0B;QAC9C,gDAAgD;QAChD,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,qBAAqB,kBAAkB,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QACvG,OAAO,mBAAmB,CAAC,cAAc,CAAC,CAAA;IAC9C,CAAC;IAED,yEAAyE;IACzE,KAAK,CAAC,mBAAmB,CAAC,UAAU,GAAI,KAAK;QACzC,6CAA6C;QAC7C,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,EAAE,EAAC,aAAa,EAAE,UAAU,EAAE,CAAC,CAAA;QAC9G,OAAO,mBAAmB,CAAC,gBAAgB,CAAC,CAAA;IAChD,CAAC;IACD,KAAK,CAAC,kBAAkB,CAAC,aAAqB;QAC1C,0CAA0C;QAC1C,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,sBAAsB,aAAa,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QACpG,OAAO,mBAAmB,CAAC,eAAe,CAAC,CAAA;IAC/C,CAAC;IAED,qEAAqE;IACrE,KAAK,CAAC,sBAAsB,CAAC,SAAiB;QAC1C,6BAA6B;QAC7B,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,aAAa,EAAE,SAAS,EAAE,EAAE,CAAC,CAAA;QACrF,OAAO,mBAAmB,CAAC,gBAAgB,CAAC,CAAA;IAChD,CAAC;IACD,KAAK,CAAC,gBAAgB;QAClB,wDAAwD;QACxD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QAC1E,OAAO,mBAAmB,CAAC,aAAa,CAAC,CAAA;IAC7C,CAAC;IACD,KAAK,CAAC,gBAAgB,CAAC,aAAqB,EAAE,oBAA4B;QACtE,gDAAgD;QAChD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,eAAe,aAAa,EAAE,EAAE,oBAAoB,EAAG,EAAE,CAAC,CAAA;QAC1G,OAAO,mBAAmB,CAAC,SAAS,CAAC,CAAA;IACzC,CAAC;IACD,KAAK,CAAC,eAAe,CAAC,aAAqB;QACvC,0CAA0C;QAC1C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,eAAe,aAAa,EAAE,EAAE,EAAE,CAAC,CAAA;QACtF,OAAO,mBAAmB,CAAC,SAAS,CAAC,CAAA;IACzC,CAAC;IACD,KAAK,CAAC,kBAAkB,CAAC,aAAqB;QAC1C,uCAAuC;QACvC,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,eAAe,aAAa,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QAC7F,OAAO,mBAAmB,CAAC,eAAe,CAAC,CAAA;IAC/C,CAAC;CACJ"}
|
package/dist/tastytrade-api.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import TastytradeHttpClient from "./services/tastytrade-http-client.js";
|
|
2
2
|
import { AccountStreamer, STREAMER_STATE, type Disposer, type StreamerStateObserver } from './account-streamer.js';
|
|
3
|
-
import MarketDataStreamer, { type CandleSubscriptionOptions, CandleType, MarketDataSubscriptionType, type MarketDataListener } from "./market-data-streamer.js";
|
|
4
3
|
import SessionService from "./services/session-service.js";
|
|
5
4
|
import AccountStatusService from "./services/account-status-service.js";
|
|
6
5
|
import AccountsAndCustomersService from "./services/accounts-and-customers-service.js";
|
|
@@ -17,16 +16,25 @@ import WatchlistsService from "./services/watchlists-service.js";
|
|
|
17
16
|
import TastytradeSession from "./models/tastytrade-session.js";
|
|
18
17
|
import type Logger from "./logger.js";
|
|
19
18
|
import { TastytradeLogger, LogLevel } from "./logger.js";
|
|
19
|
+
import QuoteStreamer, { MarketDataSubscriptionType, CandleType } from "./quote-streamer.js";
|
|
20
|
+
import type AccessToken from "./models/access-token.js";
|
|
20
21
|
export type ClientConfig = {
|
|
21
22
|
baseUrl: string;
|
|
22
23
|
accountStreamerUrl: string;
|
|
24
|
+
clientSecret?: string;
|
|
25
|
+
refreshToken?: string;
|
|
26
|
+
oauthScopes?: string[];
|
|
23
27
|
logger?: Logger;
|
|
24
28
|
logLevel?: LogLevel;
|
|
29
|
+
targetApiVersion?: string;
|
|
25
30
|
};
|
|
26
31
|
export default class TastytradeClient {
|
|
32
|
+
static readonly ProdConfig: ClientConfig;
|
|
33
|
+
static readonly SandboxConfig: ClientConfig;
|
|
27
34
|
readonly logger: TastytradeLogger;
|
|
28
35
|
readonly httpClient: TastytradeHttpClient;
|
|
29
36
|
readonly accountStreamer: AccountStreamer;
|
|
37
|
+
readonly quoteStreamer: QuoteStreamer;
|
|
30
38
|
readonly sessionService: SessionService;
|
|
31
39
|
readonly accountStatusService: AccountStatusService;
|
|
32
40
|
readonly accountsAndCustomersService: AccountsAndCustomersService;
|
|
@@ -41,9 +49,11 @@ export default class TastytradeClient {
|
|
|
41
49
|
readonly transactionsService: TransactionsService;
|
|
42
50
|
readonly watchlistsService: WatchlistsService;
|
|
43
51
|
constructor(config: ClientConfig);
|
|
52
|
+
updateConfig(config: Partial<ClientConfig>): void;
|
|
44
53
|
get session(): TastytradeSession;
|
|
54
|
+
get accessToken(): AccessToken;
|
|
45
55
|
}
|
|
46
|
-
export {
|
|
56
|
+
export { MarketDataSubscriptionType, CandleType };
|
|
47
57
|
export { AccountStreamer, STREAMER_STATE, type Disposer, type StreamerStateObserver };
|
|
48
58
|
export { TastytradeLogger, LogLevel };
|
|
49
59
|
export type { Logger };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tastytrade-api.d.ts","sourceRoot":"","sources":["../lib/tastytrade-api.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,MAAM,sCAAsC,CAAA;AACvE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,QAAQ,EAAE,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"tastytrade-api.d.ts","sourceRoot":"","sources":["../lib/tastytrade-api.ts"],"names":[],"mappings":"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"}
|
package/dist/tastytrade-api.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import TastytradeHttpClient from "./services/tastytrade-http-client.js";
|
|
2
2
|
import { AccountStreamer, STREAMER_STATE } from './account-streamer.js';
|
|
3
|
-
import MarketDataStreamer, { CandleType, MarketDataSubscriptionType } from "./market-data-streamer.js";
|
|
4
3
|
//Services:
|
|
5
4
|
import SessionService from "./services/session-service.js";
|
|
6
5
|
import AccountStatusService from "./services/account-status-service.js";
|
|
@@ -15,13 +14,12 @@ import RiskParametersService from "./services/risk-parameters-service.js";
|
|
|
15
14
|
import SymbolSearchService from "./services/symbol-search-service.js";
|
|
16
15
|
import TransactionsService from "./services/transactions-service.js";
|
|
17
16
|
import WatchlistsService from "./services/watchlists-service.js";
|
|
18
|
-
import TastytradeSession from "./models/tastytrade-session.js";
|
|
19
17
|
import { TastytradeLogger, LogLevel } from "./logger.js";
|
|
20
|
-
|
|
18
|
+
import QuoteStreamer, { MarketDataSubscriptionType, CandleType } from "./quote-streamer.js";
|
|
19
|
+
class TastytradeClient {
|
|
21
20
|
constructor(config) {
|
|
22
21
|
this.logger = new TastytradeLogger(config.logger, config.logLevel);
|
|
23
|
-
this.httpClient = new TastytradeHttpClient(config
|
|
24
|
-
this.accountStreamer = new AccountStreamer(config.accountStreamerUrl, this.session, this.logger);
|
|
22
|
+
this.httpClient = new TastytradeHttpClient(config, this.logger);
|
|
25
23
|
this.sessionService = new SessionService(this.httpClient);
|
|
26
24
|
this.accountStatusService = new AccountStatusService(this.httpClient);
|
|
27
25
|
this.accountsAndCustomersService = new AccountsAndCustomersService(this.httpClient);
|
|
@@ -35,12 +33,30 @@ export default class TastytradeClient {
|
|
|
35
33
|
this.symbolSearchService = new SymbolSearchService(this.httpClient);
|
|
36
34
|
this.transactionsService = new TransactionsService(this.httpClient);
|
|
37
35
|
this.watchlistsService = new WatchlistsService(this.httpClient);
|
|
36
|
+
this.accountStreamer = new AccountStreamer(config.accountStreamerUrl, this.session, this.accessToken, this.logger);
|
|
37
|
+
this.quoteStreamer = new QuoteStreamer(this.accountsAndCustomersService, this.logger);
|
|
38
|
+
}
|
|
39
|
+
updateConfig(config) {
|
|
40
|
+
this.httpClient.updateConfig(config);
|
|
41
|
+
this.logger.updateConfig(config);
|
|
38
42
|
}
|
|
39
43
|
get session() {
|
|
40
44
|
return this.httpClient.session;
|
|
41
45
|
}
|
|
46
|
+
get accessToken() {
|
|
47
|
+
return this.httpClient.accessToken;
|
|
48
|
+
}
|
|
42
49
|
}
|
|
43
|
-
|
|
50
|
+
TastytradeClient.ProdConfig = {
|
|
51
|
+
baseUrl: 'https://api.tastyworks.com',
|
|
52
|
+
accountStreamerUrl: 'wss://streamer.tastyworks.com',
|
|
53
|
+
};
|
|
54
|
+
TastytradeClient.SandboxConfig = {
|
|
55
|
+
baseUrl: 'https://api.cert.tastyworks.com',
|
|
56
|
+
accountStreamerUrl: 'wss://streamer.cert.tastyworks.com',
|
|
57
|
+
};
|
|
58
|
+
export default TastytradeClient;
|
|
59
|
+
export { MarketDataSubscriptionType, CandleType };
|
|
44
60
|
export { AccountStreamer, STREAMER_STATE };
|
|
45
61
|
export { TastytradeLogger, LogLevel };
|
|
46
62
|
//# sourceMappingURL=tastytrade-api.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tastytrade-api.js","sourceRoot":"","sources":["../lib/tastytrade-api.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,MAAM,sCAAsC,CAAA;AACvE,OAAO,EAAE,eAAe,EAAE,cAAc,EAA6C,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"tastytrade-api.js","sourceRoot":"","sources":["../lib/tastytrade-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-util.d.ts","sourceRoot":"","sources":["../../lib/utils/json-util.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAA;AAEtB,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;AACzE,MAAM,MAAM,SAAS,GAAG,cAAc,GAAG,SAAS,GAAG,OAAO,CAAA;AAC5D,MAAM,WAAW,OAAO;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;CACrC;AACD,MAAM,MAAM,SAAS,GAAG,SAAS,EAAE,CAAA;AAEnC,qBAAa,WAAW;aACa,IAAI,EAAE,OAAO;gBAAb,IAAI,GAAE,OAAY;IAE9C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc,UAAQ,GAAG,IAAI;CAQxE;
|
|
1
|
+
{"version":3,"file":"json-util.d.ts","sourceRoot":"","sources":["../../lib/utils/json-util.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAA;AAEtB,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;AACzE,MAAM,MAAM,SAAS,GAAG,cAAc,GAAG,SAAS,GAAG,OAAO,CAAA;AAC5D,MAAM,WAAW,OAAO;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;CACrC;AACD,MAAM,MAAM,SAAS,GAAG,SAAS,EAAE,CAAA;AAEnC,qBAAa,WAAW;aACa,IAAI,EAAE,OAAO;gBAAb,IAAI,GAAE,OAAY;IAE9C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc,UAAQ,GAAG,IAAI;CAQxE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,GAAG,qBAY/C;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKhD"}
|
package/dist/utils/json-util.js
CHANGED
|
@@ -11,10 +11,8 @@ export class JsonBuilder {
|
|
|
11
11
|
return this;
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
15
14
|
export function recursiveDasherizeKeys(body) {
|
|
16
15
|
let dasherized = _.mapKeys(body, (_value, key) => dasherize(key));
|
|
17
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18
16
|
dasherized = _.mapValues(dasherized, (value) => {
|
|
19
17
|
if (_.isPlainObject(value)) {
|
|
20
18
|
return recursiveDasherizeKeys(value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-util.js","sourceRoot":"","sources":["../../lib/utils/json-util.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAA;AAStB,MAAM,OAAO,WAAW;IACtB,YAAmC,OAAgB,EAAE;QAAlB,SAAI,GAAJ,IAAI,CAAc;IAAG,CAAC;IAElD,GAAG,CAAC,GAAW,EAAE,KAAgB,EAAE,cAAc,GAAG,KAAK;QAC9D,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACxD,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QACtB,OAAO,IAAI,CAAA;IACb,CAAC;CACF;AAED,
|
|
1
|
+
{"version":3,"file":"json-util.js","sourceRoot":"","sources":["../../lib/utils/json-util.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAA;AAStB,MAAM,OAAO,WAAW;IACtB,YAAmC,OAAgB,EAAE;QAAlB,SAAI,GAAJ,IAAI,CAAc;IAAG,CAAC;IAElD,GAAG,CAAC,GAAW,EAAE,KAAgB,EAAE,cAAc,GAAG,KAAK;QAC9D,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACxD,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QACtB,OAAO,IAAI,CAAA;IACb,CAAC;CACF;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAS;IAC9C,IAAI,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAA;IAEjE,UAAU,GAAG,CAAC,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,KAAU,EAAE,EAAE;QAClD,IAAI,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAA;QACtC,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;IAEF,OAAO,UAAU,CAAA;AACnB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,kBAAkB;IAClB,OAAO,MAAM;SACV,OAAO,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,EAAU,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;SACpF,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;AACxB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-util.d.ts","sourceRoot":"","sources":["../../lib/utils/response-util.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"response-util.d.ts","sourceRoot":"","sources":["../../lib/utils/response-util.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,YAAY,EAAE,GAAG,OAQ5D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-util.js","sourceRoot":"","sources":["../../lib/utils/response-util.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAA;AAEtB,
|
|
1
|
+
{"version":3,"file":"response-util.js","sourceRoot":"","sources":["../../lib/utils/response-util.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAA;AAEtB,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,YAAiB;IAC3D,IAAI,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,iBAAiB,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAA;IAC/C,CAAC;SAAM,IAAI,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC;QAC5C,OAAO,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;IACzC,CAAC;SAAM,CAAC;QACN,OAAO,YAAY,CAAA;IACrB,CAAC;AACH,CAAC;AAED,wBAAwB;AACxB,yDAAyD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
const { defineConfig } = require('eslint/config')
|
|
2
|
+
|
|
3
|
+
const tsParser = require('@typescript-eslint/parser')
|
|
4
|
+
const typescriptEslint = require('@typescript-eslint/eslint-plugin')
|
|
5
|
+
const js = require('@eslint/js')
|
|
6
|
+
|
|
7
|
+
const { FlatCompat } = require('@eslint/eslintrc')
|
|
8
|
+
|
|
9
|
+
const compat = new FlatCompat({
|
|
10
|
+
baseDirectory: __dirname,
|
|
11
|
+
recommendedConfig: js.configs.recommended,
|
|
12
|
+
allConfig: js.configs.all
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
module.exports = defineConfig([
|
|
16
|
+
{
|
|
17
|
+
extends: compat.extends(
|
|
18
|
+
'eslint:recommended',
|
|
19
|
+
'plugin:@typescript-eslint/recommended'
|
|
20
|
+
),
|
|
21
|
+
|
|
22
|
+
languageOptions: {
|
|
23
|
+
parser: tsParser
|
|
24
|
+
},
|
|
25
|
+
|
|
26
|
+
plugins: {
|
|
27
|
+
'@typescript-eslint': typescriptEslint
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
rules: {
|
|
31
|
+
'@typescript-eslint/no-inferrable-types': 'warn',
|
|
32
|
+
|
|
33
|
+
'@typescript-eslint/no-unused-vars': [
|
|
34
|
+
'error',
|
|
35
|
+
{
|
|
36
|
+
argsIgnorePattern: '^_',
|
|
37
|
+
varsIgnorePattern: '^_',
|
|
38
|
+
caughtErrorsIgnorePattern: '^_'
|
|
39
|
+
}
|
|
40
|
+
],
|
|
41
|
+
|
|
42
|
+
'@typescript-eslint/no-non-null-assertion': 'off',
|
|
43
|
+
'@typescript-eslint/no-explicit-any': 'off'
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
])
|
package/lib/account-streamer.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { JsonBuilder } from './utils/json-util.js'
|
|
|
5
5
|
import TastytradeSession from './models/tastytrade-session.js'
|
|
6
6
|
import { MinTlsVersion } from './utils/constants.js'
|
|
7
7
|
import type Logger from './logger.js'
|
|
8
|
+
import type AccessToken from './models/access-token.js'
|
|
8
9
|
|
|
9
10
|
export enum STREAMER_STATE {
|
|
10
11
|
Open = 0,
|
|
@@ -21,7 +22,7 @@ enum MessageAction {
|
|
|
21
22
|
USER_MESSAGE_SUBSCRIBE = 'user-message-subscribe'
|
|
22
23
|
}
|
|
23
24
|
|
|
24
|
-
const
|
|
25
|
+
const DEFAULT_HEARTBEAT_INTERVAL = 2000 // 20 seconds
|
|
25
26
|
|
|
26
27
|
const SOURCE = 'tastytrade-api-js-sdk'
|
|
27
28
|
|
|
@@ -47,7 +48,7 @@ export class AccountStreamer {
|
|
|
47
48
|
private websocket: WebSocket | null = null
|
|
48
49
|
private startResolve: ((result: boolean) => void) | null = null
|
|
49
50
|
private startReject: ((reason?: any) => void) | null = null
|
|
50
|
-
private requestCounter
|
|
51
|
+
private requestCounter = 0
|
|
51
52
|
private queued: string[] = []
|
|
52
53
|
|
|
53
54
|
private heartbeatTimerId: number | NodeJS.Timeout | null = null
|
|
@@ -68,16 +69,18 @@ export class AccountStreamer {
|
|
|
68
69
|
> = new Map()
|
|
69
70
|
|
|
70
71
|
/**
|
|
71
|
-
*
|
|
72
|
+
*
|
|
72
73
|
* @param url Url of the account streamer service
|
|
73
74
|
*/
|
|
74
75
|
constructor(
|
|
75
76
|
private readonly url: string,
|
|
76
77
|
private readonly session: TastytradeSession,
|
|
77
|
-
|
|
78
|
+
private readonly accessToken: AccessToken,
|
|
79
|
+
logger: Logger,
|
|
80
|
+
private readonly heartbeatInterval: number = DEFAULT_HEARTBEAT_INTERVAL
|
|
78
81
|
) {
|
|
79
82
|
this.logger = logger
|
|
80
|
-
|
|
83
|
+
}
|
|
81
84
|
|
|
82
85
|
get streamerState(): STREAMER_STATE {
|
|
83
86
|
return this._streamerState
|
|
@@ -86,19 +89,25 @@ export class AccountStreamer {
|
|
|
86
89
|
set streamerState(streamerState: STREAMER_STATE) {
|
|
87
90
|
this._streamerState = streamerState
|
|
88
91
|
|
|
89
|
-
this.streamerStateObservers.forEach(observer => {
|
|
92
|
+
this.streamerStateObservers.forEach((observer) => {
|
|
90
93
|
observer(streamerState)
|
|
91
94
|
})
|
|
92
95
|
}
|
|
93
96
|
|
|
94
|
-
private get
|
|
95
|
-
|
|
97
|
+
private get authHeader() {
|
|
98
|
+
if (this.session.isValid) {
|
|
99
|
+
return this.session.authToken
|
|
100
|
+
}
|
|
101
|
+
if (this.accessToken.isValid) {
|
|
102
|
+
return this.accessToken.authorizationHeader
|
|
103
|
+
}
|
|
104
|
+
return null
|
|
96
105
|
}
|
|
97
106
|
|
|
98
107
|
/**
|
|
99
108
|
* Adds a custom callback that fires when the streamer state changes
|
|
100
|
-
* @param observer
|
|
101
|
-
* @returns
|
|
109
|
+
* @param observer
|
|
110
|
+
* @returns
|
|
102
111
|
*/
|
|
103
112
|
addStreamerStateObserver(observer: StreamerStateObserver): Disposer {
|
|
104
113
|
this.streamerStateObservers.push(observer)
|
|
@@ -122,7 +131,7 @@ export class AccountStreamer {
|
|
|
122
131
|
|
|
123
132
|
/**
|
|
124
133
|
* Entrypoint for beginning a websocket session
|
|
125
|
-
* You must have a valid tastytrade
|
|
134
|
+
* You must have a valid tastytrade session or access token before calling this method
|
|
126
135
|
* @returns Promise that resolves when the "opened" message is received (see handleOpen)
|
|
127
136
|
*/
|
|
128
137
|
async start(): Promise<boolean> {
|
|
@@ -187,11 +196,11 @@ export class AccountStreamer {
|
|
|
187
196
|
return
|
|
188
197
|
}
|
|
189
198
|
|
|
190
|
-
this.logger.info('Scheduling heartbeat with interval: ',
|
|
199
|
+
this.logger.info('Scheduling heartbeat with interval: ', this.heartbeatInterval)
|
|
191
200
|
const scheduler = typeof window === 'undefined' ? setTimeout : window.setTimeout
|
|
192
201
|
this.heartbeatTimerId = scheduler(
|
|
193
202
|
this.sendHeartbeat,
|
|
194
|
-
|
|
203
|
+
this.heartbeatInterval
|
|
195
204
|
)
|
|
196
205
|
}
|
|
197
206
|
|
|
@@ -221,7 +230,7 @@ export class AccountStreamer {
|
|
|
221
230
|
* Send a message via websocket
|
|
222
231
|
* @param json JsonBuilder
|
|
223
232
|
* @param includeSessionToken Attaches session token to message if true
|
|
224
|
-
* @returns
|
|
233
|
+
* @returns
|
|
225
234
|
*/
|
|
226
235
|
send(json: JsonBuilder, includeSessionToken = true): number {
|
|
227
236
|
this.requestCounter += 1
|
|
@@ -229,12 +238,11 @@ export class AccountStreamer {
|
|
|
229
238
|
json.add('source', SOURCE)
|
|
230
239
|
|
|
231
240
|
if (includeSessionToken) {
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
throw new Error('sessionToken not set')
|
|
241
|
+
if (!this.authHeader) {
|
|
242
|
+
throw new Error('session or access token not set')
|
|
235
243
|
}
|
|
236
244
|
|
|
237
|
-
json.add('auth-token',
|
|
245
|
+
json.add('auth-token', this.authHeader)
|
|
238
246
|
}
|
|
239
247
|
|
|
240
248
|
const message = JSON.stringify(json.json)
|
|
@@ -252,9 +260,9 @@ export class AccountStreamer {
|
|
|
252
260
|
|
|
253
261
|
/**
|
|
254
262
|
* Used by other methods to send a specific `action` message
|
|
255
|
-
* @param action
|
|
256
|
-
* @param value
|
|
257
|
-
* @returns
|
|
263
|
+
* @param action
|
|
264
|
+
* @param value
|
|
265
|
+
* @returns
|
|
258
266
|
*/
|
|
259
267
|
public subscribeTo(action: string, value?: JsonValue): number {
|
|
260
268
|
const json = new JsonBuilder()
|
|
@@ -304,7 +312,7 @@ export class AccountStreamer {
|
|
|
304
312
|
}
|
|
305
313
|
|
|
306
314
|
const websocket = this.websocket
|
|
307
|
-
queued.forEach(msg => {
|
|
315
|
+
queued.forEach((msg) => {
|
|
308
316
|
websocket.send(msg)
|
|
309
317
|
})
|
|
310
318
|
|
|
@@ -380,7 +388,7 @@ export class AccountStreamer {
|
|
|
380
388
|
this.logger.info('Message received: ', json)
|
|
381
389
|
|
|
382
390
|
const action = json.action as string
|
|
383
|
-
this.streamerMessageObservers.forEach(observer => observer(json))
|
|
391
|
+
this.streamerMessageObservers.forEach((observer) => observer(json))
|
|
384
392
|
if (action) {
|
|
385
393
|
if (action === MessageAction.HEARTBEAT) {
|
|
386
394
|
// schedule next heartbeat
|
package/lib/logger.ts
CHANGED
|
@@ -14,13 +14,18 @@ export enum LogLevel {
|
|
|
14
14
|
|
|
15
15
|
export class TastytradeLogger implements Logger {
|
|
16
16
|
public logLevel: LogLevel
|
|
17
|
-
|
|
17
|
+
public logger: Logger | null = null
|
|
18
18
|
|
|
19
19
|
constructor(logger?: Logger, logLevel?: LogLevel) {
|
|
20
20
|
this.logger = logger ?? null
|
|
21
21
|
this.logLevel = logLevel ?? LogLevel.ERROR
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
+
public updateConfig(config: Partial<{logger: Logger, logLevel: LogLevel}>) {
|
|
25
|
+
const loggerConfig = _.pick(config, ['logger', 'logLevel'])
|
|
26
|
+
Object.assign(this, loggerConfig)
|
|
27
|
+
}
|
|
28
|
+
|
|
24
29
|
error(...data: any[]): void {
|
|
25
30
|
if (this.shouldLog(LogLevel.ERROR)) {
|
|
26
31
|
this.logger!.error(...data)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import _ from 'lodash'
|
|
2
|
+
|
|
3
|
+
export default class AccessToken {
|
|
4
|
+
public token = ''
|
|
5
|
+
public expiresIn = 0
|
|
6
|
+
|
|
7
|
+
get isExpired(): boolean {
|
|
8
|
+
return this.isEmpty || Date.now() >= this.expiration.getTime();
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
get isValid(): boolean {
|
|
12
|
+
return !_.isNil(this.token) && !this.isExpired;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
get isEmpty(): boolean {
|
|
16
|
+
return _.isNil(this.token) || this.token.length === 0;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
get expiration() {
|
|
20
|
+
// Set expiration a bit earlier to account for clock skew
|
|
21
|
+
return new Date(Date.now() + ((this.expiresIn - 30) * 1000));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public updateFromTokenResponse(tokenResponse: any): void {
|
|
25
|
+
this.token = _.get(tokenResponse, "data.access_token");
|
|
26
|
+
this.expiresIn = _.get(tokenResponse, "data.expires_in");
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
get authorizationHeader(): string | null {
|
|
30
|
+
if (this.isValid) {
|
|
31
|
+
return `Bearer ${this.token}`;
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
clear() {
|
|
37
|
+
this.token = ''
|
|
38
|
+
this.expiresIn = 0
|
|
39
|
+
}
|
|
40
|
+
}
|