@tastytrade/api 3.1.0 → 5.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.
Files changed (112) hide show
  1. package/.vscode/launch.json +29 -0
  2. package/CHANGELOG.md +41 -0
  3. package/CODEOWNERS +1 -0
  4. package/README.md +64 -31
  5. package/dist/account-streamer.d.ts +10 -8
  6. package/dist/account-streamer.d.ts.map +1 -0
  7. package/dist/account-streamer.js +147 -229
  8. package/dist/account-streamer.js.map +1 -0
  9. package/dist/logger.d.ts +20 -0
  10. package/dist/logger.d.ts.map +1 -0
  11. package/dist/logger.js +36 -0
  12. package/dist/logger.js.map +1 -0
  13. package/dist/market-data-streamer.d.ts +7 -5
  14. package/dist/market-data-streamer.d.ts.map +1 -0
  15. package/dist/market-data-streamer.js +139 -172
  16. package/dist/market-data-streamer.js.map +1 -0
  17. package/dist/models/tastytrade-session.d.ts +1 -0
  18. package/dist/models/tastytrade-session.d.ts.map +1 -0
  19. package/dist/models/tastytrade-session.js +10 -20
  20. package/dist/models/tastytrade-session.js.map +1 -0
  21. package/dist/services/account-status-service.d.ts +2 -1
  22. package/dist/services/account-status-service.d.ts.map +1 -0
  23. package/dist/services/account-status-service.js +11 -60
  24. package/dist/services/account-status-service.js.map +1 -0
  25. package/dist/services/accounts-and-customers-service.d.ts +2 -1
  26. package/dist/services/accounts-and-customers-service.d.ts.map +1 -0
  27. package/dist/services/accounts-and-customers-service.js +29 -112
  28. package/dist/services/accounts-and-customers-service.js.map +1 -0
  29. package/dist/services/balances-and-positions-service.d.ts +2 -1
  30. package/dist/services/balances-and-positions-service.d.ts.map +1 -0
  31. package/dist/services/balances-and-positions-service.js +22 -88
  32. package/dist/services/balances-and-positions-service.js.map +1 -0
  33. package/dist/services/instruments-service.d.ts +2 -1
  34. package/dist/services/instruments-service.d.ts.map +1 -0
  35. package/dist/services/instruments-service.js +130 -365
  36. package/dist/services/instruments-service.js.map +1 -0
  37. package/dist/services/margin-requirements-service.d.ts +2 -1
  38. package/dist/services/margin-requirements-service.d.ts.map +1 -0
  39. package/dist/services/margin-requirements-service.js +16 -73
  40. package/dist/services/margin-requirements-service.js.map +1 -0
  41. package/dist/services/market-metrics-service.d.ts +2 -1
  42. package/dist/services/market-metrics-service.d.ts.map +1 -0
  43. package/dist/services/market-metrics-service.js +21 -88
  44. package/dist/services/market-metrics-service.js.map +1 -0
  45. package/dist/services/net-liquidating-value-history-service.d.ts +2 -1
  46. package/dist/services/net-liquidating-value-history-service.d.ts.map +1 -0
  47. package/dist/services/net-liquidating-value-history-service.js +16 -74
  48. package/dist/services/net-liquidating-value-history-service.js.map +1 -0
  49. package/dist/services/orders-service.d.ts +2 -1
  50. package/dist/services/orders-service.d.ts.map +1 -0
  51. package/dist/services/orders-service.js +76 -231
  52. package/dist/services/orders-service.js.map +1 -0
  53. package/dist/services/risk-parameters-service.d.ts +2 -1
  54. package/dist/services/risk-parameters-service.d.ts.map +1 -0
  55. package/dist/services/risk-parameters-service.js +16 -73
  56. package/dist/services/risk-parameters-service.js.map +1 -0
  57. package/dist/services/session-service.d.ts +2 -1
  58. package/dist/services/session-service.d.ts.map +1 -0
  59. package/dist/services/session-service.js +30 -110
  60. package/dist/services/session-service.js.map +1 -0
  61. package/dist/services/symbol-search-service.d.ts +2 -1
  62. package/dist/services/symbol-search-service.d.ts.map +1 -0
  63. package/dist/services/symbol-search-service.js +11 -60
  64. package/dist/services/symbol-search-service.js.map +1 -0
  65. package/dist/services/tastytrade-http-client.d.ts +5 -3
  66. package/dist/services/tastytrade-http-client.d.ts.map +1 -0
  67. package/dist/services/tastytrade-http-client.js +53 -134
  68. package/dist/services/tastytrade-http-client.js.map +1 -0
  69. package/dist/services/transactions-service.d.ts +2 -1
  70. package/dist/services/transactions-service.d.ts.map +1 -0
  71. package/dist/services/transactions-service.js +22 -87
  72. package/dist/services/transactions-service.js.map +1 -0
  73. package/dist/services/watchlists-service.d.ts +2 -1
  74. package/dist/services/watchlists-service.d.ts.map +1 -0
  75. package/dist/services/watchlists-service.js +51 -165
  76. package/dist/services/watchlists-service.js.map +1 -0
  77. package/dist/tastytrade-api.d.ts +32 -22
  78. package/dist/tastytrade-api.d.ts.map +1 -0
  79. package/dist/tastytrade-api.js +44 -79
  80. package/dist/tastytrade-api.js.map +1 -0
  81. package/dist/utils/constants.d.ts +1 -0
  82. package/dist/utils/constants.d.ts.map +1 -0
  83. package/dist/utils/constants.js +2 -4
  84. package/dist/utils/constants.js.map +1 -0
  85. package/dist/utils/json-util.d.ts +4 -3
  86. package/dist/utils/json-util.d.ts.map +1 -0
  87. package/dist/utils/json-util.js +14 -25
  88. package/dist/utils/json-util.js.map +1 -0
  89. package/dist/utils/response-util.d.ts +1 -0
  90. package/dist/utils/response-util.d.ts.map +1 -0
  91. package/dist/utils/response-util.js +7 -12
  92. package/dist/utils/response-util.js.map +1 -0
  93. package/lib/account-streamer.ts +19 -12
  94. package/lib/logger.ts +48 -0
  95. package/lib/market-data-streamer.ts +5 -1
  96. package/lib/services/account-status-service.ts +2 -2
  97. package/lib/services/accounts-and-customers-service.ts +2 -2
  98. package/lib/services/balances-and-positions-service.ts +2 -2
  99. package/lib/services/instruments-service.ts +2 -2
  100. package/lib/services/margin-requirements-service.ts +2 -2
  101. package/lib/services/market-metrics-service.ts +2 -2
  102. package/lib/services/net-liquidating-value-history-service.ts +2 -2
  103. package/lib/services/orders-service.ts +2 -2
  104. package/lib/services/risk-parameters-service.ts +2 -2
  105. package/lib/services/session-service.ts +2 -2
  106. package/lib/services/symbol-search-service.ts +2 -2
  107. package/lib/services/tastytrade-http-client.ts +21 -16
  108. package/lib/services/transactions-service.ts +2 -2
  109. package/lib/services/watchlists-service.ts +2 -2
  110. package/lib/tastytrade-api.ts +35 -22
  111. package/package.json +14 -9
  112. package/tsconfig.json +12 -11
@@ -0,0 +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;AAGD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,GAAG,qBAa/C;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKhD"}
@@ -1,43 +1,32 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.dasherize = exports.recursiveDasherizeKeys = exports.JsonBuilder = void 0;
7
- var lodash_1 = __importDefault(require("lodash"));
8
- var JsonBuilder = /** @class */ (function () {
9
- function JsonBuilder(json) {
10
- if (json === void 0) { json = {}; }
1
+ import _ from 'lodash';
2
+ export class JsonBuilder {
3
+ constructor(json = {}) {
11
4
  this.json = json;
12
5
  }
13
- JsonBuilder.prototype.add = function (key, value, serializeEmpty) {
14
- if (serializeEmpty === void 0) { serializeEmpty = false; }
15
- if ((lodash_1.default.isNil(value) || value === '') && !serializeEmpty) {
6
+ add(key, value, serializeEmpty = false) {
7
+ if ((_.isNil(value) || value === '') && !serializeEmpty) {
16
8
  return this;
17
9
  }
18
10
  this.json[key] = value;
19
11
  return this;
20
- };
21
- return JsonBuilder;
22
- }());
23
- exports.JsonBuilder = JsonBuilder;
12
+ }
13
+ }
24
14
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
25
- function recursiveDasherizeKeys(body) {
26
- var dasherized = lodash_1.default.mapKeys(body, function (_value, key) { return dasherize(key); });
15
+ export function recursiveDasherizeKeys(body) {
16
+ let dasherized = _.mapKeys(body, (_value, key) => dasherize(key));
27
17
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
28
- dasherized = lodash_1.default.mapValues(dasherized, function (value) {
29
- if (lodash_1.default.isPlainObject(value)) {
18
+ dasherized = _.mapValues(dasherized, (value) => {
19
+ if (_.isPlainObject(value)) {
30
20
  return recursiveDasherizeKeys(value);
31
21
  }
32
22
  return value;
33
23
  });
34
24
  return dasherized;
35
25
  }
36
- exports.recursiveDasherizeKeys = recursiveDasherizeKeys;
37
- function dasherize(target) {
26
+ export function dasherize(target) {
38
27
  // prettier-ignore
39
28
  return target
40
- .replace(/([A-Z])/g, function (_match, p1, _offset, _whole) { return "-".concat(p1.toLowerCase()); })
29
+ .replace(/([A-Z])/g, (_match, p1, _offset, _whole) => `-${p1.toLowerCase()}`)
41
30
  .replace(/\s/g, '-');
42
31
  }
43
- exports.dasherize = dasherize;
32
+ //# sourceMappingURL=json-util.js.map
@@ -0,0 +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,8DAA8D;AAC9D,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,8DAA8D;IAC9D,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,2 @@
1
1
  export default function extractResponseData(httpResponse: any): any;
2
+ //# sourceMappingURL=response-util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-util.d.ts","sourceRoot":"","sources":["../../lib/utils/response-util.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,YAAY,EAAE,GAAG,OAQ5D"}
@@ -1,21 +1,16 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- var lodash_1 = __importDefault(require("lodash"));
1
+ import _ from 'lodash';
7
2
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
8
- function extractResponseData(httpResponse) {
9
- if (lodash_1.default.has(httpResponse, 'data.data.items')) {
10
- return lodash_1.default.get(httpResponse, 'data.data.items');
3
+ export default function extractResponseData(httpResponse) {
4
+ if (_.has(httpResponse, 'data.data.items')) {
5
+ return _.get(httpResponse, 'data.data.items');
11
6
  }
12
- else if (lodash_1.default.has(httpResponse, 'data.data')) {
13
- return lodash_1.default.get(httpResponse, 'data.data');
7
+ else if (_.has(httpResponse, 'data.data')) {
8
+ return _.get(httpResponse, 'data.data');
14
9
  }
15
10
  else {
16
11
  return httpResponse;
17
12
  }
18
13
  }
19
- exports.default = extractResponseData;
20
14
  // add login parser here
21
15
  // create unit tests for login parser, extractreponsedata
16
+ //# sourceMappingURL=response-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-util.js","sourceRoot":"","sources":["../../lib/utils/response-util.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAA;AAEtB,8DAA8D;AAC9D,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,EAAC,CAAC;QAC3C,OAAO,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;IACzC,CAAC;SAAI,CAAC;QACJ,OAAO,YAAY,CAAA;IACrB,CAAC;AACH,CAAC;AAED,wBAAwB;AACxB,yDAAyD"}
@@ -1,9 +1,10 @@
1
1
  import WebSocket from 'isomorphic-ws'
2
2
  import _ from 'lodash'
3
- import type { JsonMap, JsonValue } from './utils/json-util'
4
- import { JsonBuilder } from './utils/json-util'
5
- import TastytradeSession from './models/tastytrade-session'
6
- import { MinTlsVersion } from './utils/constants'
3
+ import type { JsonMap, JsonValue } from './utils/json-util.js'
4
+ import { JsonBuilder } from './utils/json-util.js'
5
+ import TastytradeSession from './models/tastytrade-session.js'
6
+ import { MinTlsVersion } from './utils/constants.js'
7
+ import type Logger from './logger.js'
7
8
 
8
9
  export enum STREAMER_STATE {
9
10
  Open = 0,
@@ -42,6 +43,7 @@ function removeElement<T>(array: T[], element: T): void {
42
43
  }
43
44
 
44
45
  export class AccountStreamer {
46
+ private readonly logger: Logger
45
47
  private websocket: WebSocket | null = null
46
48
  private startResolve: ((result: boolean) => void) | null = null
47
49
  private startReject: ((reason?: any) => void) | null = null
@@ -65,13 +67,17 @@ export class AccountStreamer {
65
67
  [(status: string) => void, (error: string) => void]
66
68
  > = new Map()
67
69
 
68
- private readonly logger = console
69
-
70
70
  /**
71
71
  *
72
72
  * @param url Url of the account streamer service
73
73
  */
74
- constructor(private readonly url: string, private readonly session: TastytradeSession) {}
74
+ constructor(
75
+ private readonly url: string,
76
+ private readonly session: TastytradeSession,
77
+ logger: Logger
78
+ ) {
79
+ this.logger = logger
80
+ }
75
81
 
76
82
  get streamerState(): STREAMER_STATE {
77
83
  return this._streamerState
@@ -237,6 +243,7 @@ export class AccountStreamer {
237
243
  // Queue up and send on open
238
244
  this.queued.push(message)
239
245
  } else {
246
+ this.logger.info('Sending message: ', message)
240
247
  websocket.send(message)
241
248
  }
242
249
 
@@ -304,12 +311,12 @@ export class AccountStreamer {
304
311
  this.queued = []
305
312
  }
306
313
 
307
- private readonly handleOpen = (event: WebSocket.Event) => {
314
+ private readonly handleOpen = (_event: WebSocket.Event) => {
308
315
  if (this.startResolve === null) {
309
316
  return
310
317
  }
311
318
 
312
- this.logger.info('AccountStreamer opened', event)
319
+ this.logger.info('AccountStreamer opened')
313
320
 
314
321
  this.startResolve(true)
315
322
  this.startResolve = this.startReject = null
@@ -320,7 +327,7 @@ export class AccountStreamer {
320
327
  }
321
328
 
322
329
  private readonly handleClose = (event: WebSocket.CloseEvent) => {
323
- this.logger.info('AccountStreamer closed', event)
330
+ this.logger.info('AccountStreamer closed')
324
331
  if (this.websocket === null) {
325
332
  return
326
333
  }
@@ -335,7 +342,7 @@ export class AccountStreamer {
335
342
  return
336
343
  }
337
344
 
338
- this.logger.warn('AccountStreamer error', event)
345
+ this.logger.error('AccountStreamer error', event)
339
346
 
340
347
  this.lastErrorEvent = event
341
348
  this.streamerState = STREAMER_STATE.Error
@@ -370,7 +377,7 @@ export class AccountStreamer {
370
377
  }
371
378
 
372
379
  private readonly handleOneMessage = (json: JsonMap) => {
373
- this.logger.info(json)
380
+ this.logger.info('Message received: ', json)
374
381
 
375
382
  const action = json.action as string
376
383
  this.streamerMessageObservers.forEach(observer => observer(json))
package/lib/logger.ts ADDED
@@ -0,0 +1,48 @@
1
+ import _ from 'lodash'
2
+
3
+ export default interface Logger {
4
+ error(...data: any[]): void;
5
+ info(...data: any[]): void;
6
+ warn(...data: any[]): void;
7
+ }
8
+
9
+ export enum LogLevel {
10
+ INFO = 1,
11
+ WARN = 2,
12
+ ERROR = 3
13
+ }
14
+
15
+ export class TastytradeLogger implements Logger {
16
+ public logLevel: LogLevel
17
+ private logger: Logger | null = null
18
+
19
+ constructor(logger?: Logger, logLevel?: LogLevel) {
20
+ this.logger = logger ?? null
21
+ this.logLevel = logLevel ?? LogLevel.ERROR
22
+ }
23
+
24
+ error(...data: any[]): void {
25
+ if (this.shouldLog(LogLevel.ERROR)) {
26
+ this.logger!.error(...data)
27
+ }
28
+ }
29
+
30
+ info(...data: any[]): void {
31
+ if (this.shouldLog(LogLevel.INFO)) {
32
+ this.logger!.info(...data)
33
+ }
34
+ }
35
+
36
+ warn(...data: any[]): void {
37
+ if (this.shouldLog(LogLevel.WARN)) {
38
+ this.logger!.warn(...data)
39
+ }
40
+ }
41
+
42
+ private shouldLog(level: LogLevel) {
43
+ if (_.isNil(this.logger)) {
44
+ return false
45
+ }
46
+ return LogLevel[level] >= LogLevel[this.logLevel]
47
+ }
48
+ }
@@ -1,7 +1,7 @@
1
1
  import WebSocket from 'isomorphic-ws'
2
2
  import _ from 'lodash'
3
3
  import { v4 as uuidv4 } from 'uuid'
4
- import { MinTlsVersion } from './utils/constants'
4
+ import { MinTlsVersion } from './utils/constants.js'
5
5
 
6
6
  export enum MarketDataSubscriptionType {
7
7
  Candle = 'Candle',
@@ -54,6 +54,10 @@ export default class MarketDataStreamer {
54
54
  private errorListeners = new Map()
55
55
  private authStateListeners = new Map()
56
56
 
57
+ constructor() {
58
+ console.warn('MarketDataStreamer is deprecated and will be removed in a future release of @tastytrade/api. Use @dxfeed/dxlink-api instead.')
59
+ }
60
+
57
61
  addDataListener(dataListener: MarketDataListener, channelId: number | null = null): Remover {
58
62
  if (_.isNil(dataListener)) {
59
63
  return _.noop
@@ -1,5 +1,5 @@
1
- import extractResponseData from "../utils/response-util";
2
- import TastytradeHttpClient from "./tastytrade-http-client";
1
+ import extractResponseData from "../utils/response-util.js";
2
+ import TastytradeHttpClient from "./tastytrade-http-client.js";
3
3
 
4
4
  // create the central class that aggregates all services
5
5
  export default class AccountStatusService {
@@ -1,5 +1,5 @@
1
- import extractResponseData from "../utils/response-util";
2
- import TastytradeHttpClient from "./tastytrade-http-client";
1
+ import extractResponseData from "../utils/response-util.js";
2
+ import TastytradeHttpClient from "./tastytrade-http-client.js";
3
3
 
4
4
  export default class AccountsAndCustomersService {
5
5
  constructor(private httpClient: TastytradeHttpClient) {
@@ -1,5 +1,5 @@
1
- import extractResponseData from "../utils/response-util";
2
- import TastytradeHttpClient from "./tastytrade-http-client";
1
+ import extractResponseData from "../utils/response-util.js";
2
+ import TastytradeHttpClient from "./tastytrade-http-client.js";
3
3
 
4
4
  export default class BalancesAndPositionsService {
5
5
  constructor(private httpClient: TastytradeHttpClient) {
@@ -1,5 +1,5 @@
1
- import extractResponseData from "../utils/response-util";
2
- import TastytradeHttpClient from "./tastytrade-http-client";
1
+ import extractResponseData from "../utils/response-util.js";
2
+ import TastytradeHttpClient from "./tastytrade-http-client.js";
3
3
  import _ from 'lodash'
4
4
 
5
5
  export default class InstrumentsService {
@@ -1,5 +1,5 @@
1
- import extractResponseData from "../utils/response-util";
2
- import TastytradeHttpClient from "./tastytrade-http-client";
1
+ import extractResponseData from "../utils/response-util.js";
2
+ import TastytradeHttpClient from "./tastytrade-http-client.js";
3
3
 
4
4
  export default class MarginRequirementsService {
5
5
  constructor(private httpClient: TastytradeHttpClient) {
@@ -1,5 +1,5 @@
1
- import extractResponseData from "../utils/response-util";
2
- import TastytradeHttpClient from "./tastytrade-http-client";
1
+ import extractResponseData from "../utils/response-util.js";
2
+ import TastytradeHttpClient from "./tastytrade-http-client.js";
3
3
 
4
4
  export default class MarketMetricsService {
5
5
  constructor(private httpClient: TastytradeHttpClient) {
@@ -1,5 +1,5 @@
1
- import extractResponseData from "../utils/response-util";
2
- import TastytradeHttpClient from "./tastytrade-http-client";
1
+ import extractResponseData from "../utils/response-util.js";
2
+ import TastytradeHttpClient from "./tastytrade-http-client.js";
3
3
 
4
4
  export default class NetLiquidatingValueHistoryService {
5
5
  constructor(private httpClient: TastytradeHttpClient) {
@@ -1,5 +1,5 @@
1
- import extractResponseData from "../utils/response-util";
2
- import TastytradeHttpClient from "./tastytrade-http-client";
1
+ import extractResponseData from "../utils/response-util.js";
2
+ import TastytradeHttpClient from "./tastytrade-http-client.js";
3
3
 
4
4
  export default class OrderService {
5
5
  constructor(private httpClient: TastytradeHttpClient) {
@@ -1,5 +1,5 @@
1
- import extractResponseData from "../utils/response-util";
2
- import TastytradeHttpClient from "./tastytrade-http-client";
1
+ import extractResponseData from "../utils/response-util.js";
2
+ import TastytradeHttpClient from "./tastytrade-http-client.js";
3
3
 
4
4
  export default class RiskParametersService {
5
5
  constructor(private httpClient: TastytradeHttpClient) {
@@ -1,5 +1,5 @@
1
- import extractResponseData from "../utils/response-util";
2
- import TastytradeHttpClient from "./tastytrade-http-client";
1
+ import extractResponseData from "../utils/response-util.js";
2
+ import TastytradeHttpClient from "./tastytrade-http-client.js";
3
3
 
4
4
  export default class SessionService {
5
5
  constructor(public httpClient: TastytradeHttpClient) {
@@ -1,5 +1,5 @@
1
- import extractResponseData from "../utils/response-util";
2
- import TastytradeHttpClient from "./tastytrade-http-client";
1
+ import extractResponseData from "../utils/response-util.js";
2
+ import TastytradeHttpClient from "./tastytrade-http-client.js";
3
3
 
4
4
  export default class SymbolSearchService {
5
5
  constructor(private httpClient: TastytradeHttpClient) {
@@ -1,10 +1,9 @@
1
- import TastytradeSession from "../models/tastytrade-session"
1
+ import TastytradeSession from "../models/tastytrade-session.js"
2
2
  import axios from "axios"
3
3
  import qs from 'qs'
4
- import { recursiveDasherizeKeys } from "../utils/json-util"
4
+ import { recursiveDasherizeKeys } from "../utils/json-util.js"
5
5
  import _ from 'lodash'
6
- import https from 'https'
7
- import { MinTlsVersion } from "../utils/constants"
6
+ import type Logger from "../logger.js"
8
7
 
9
8
  const ParamsSerializer = {
10
9
  serialize: function (queryParams: object) {
@@ -12,22 +11,28 @@ const ParamsSerializer = {
12
11
  }
13
12
  }
14
13
 
15
- export default class TastytradeHttpClient{
14
+ export default class TastytradeHttpClient {
15
+ private readonly logger?: Logger
16
16
  public readonly session: TastytradeSession
17
- private readonly httpsAgent: https.Agent
18
17
 
19
- constructor(private readonly baseUrl: string) {
18
+ constructor(private readonly baseUrl: string, logger?: Logger) {
19
+ this.logger = logger
20
20
  this.session = new TastytradeSession()
21
- this.httpsAgent = new https.Agent({ minVersion: MinTlsVersion })
22
21
  }
23
22
 
24
23
  private getDefaultHeaders(): any {
25
- return {
26
- "Content-Type": "application/json",
27
- "Accept": "application/json",
28
- "Authorization": this.session.authToken,
29
- "User-Agent": 'tastytrade-sdk-js'
30
- };
24
+ const headers: { [key: string]: any } = {
25
+ "Content-Type": "application/json",
26
+ "Accept": "application/json",
27
+ "Authorization": this.session.authToken
28
+ };
29
+
30
+ // Only set user agent if running in node
31
+ if (typeof window === 'undefined') {
32
+ headers["User-Agent"] = 'tastytrade-sdk-js'
33
+ }
34
+
35
+ return headers
31
36
  }
32
37
 
33
38
  private async executeRequest(method: string, url: string, data: object = {}, headers: object = {}, params: object = {}) {
@@ -42,10 +47,10 @@ export default class TastytradeHttpClient{
42
47
  data: dasherizedData,
43
48
  headers: mergedHeaders,
44
49
  params: dasherizedParams,
45
- paramsSerializer: ParamsSerializer,
46
- httpsAgent: this.httpsAgent
50
+ paramsSerializer: ParamsSerializer
47
51
  }, _.isEmpty)
48
52
 
53
+ this.logger?.info('Making request', config)
49
54
  return axios.request(config)
50
55
  }
51
56
 
@@ -1,5 +1,5 @@
1
- import extractResponseData from "../utils/response-util";
2
- import TastytradeHttpClient from "./tastytrade-http-client";
1
+ import extractResponseData from "../utils/response-util.js";
2
+ import TastytradeHttpClient from "./tastytrade-http-client.js";
3
3
 
4
4
  export default class TransactionsService {
5
5
  constructor(private httpClient: TastytradeHttpClient) {
@@ -1,5 +1,5 @@
1
- import extractResponseData from "../utils/response-util";
2
- import TastytradeHttpClient from "./tastytrade-http-client";
1
+ import extractResponseData from "../utils/response-util.js";
2
+ import TastytradeHttpClient from "./tastytrade-http-client.js";
3
3
 
4
4
  export default class WatchlistsService {
5
5
  constructor(private httpClient: TastytradeHttpClient) {
@@ -1,24 +1,34 @@
1
- import TastytradeHttpClient from "./services/tastytrade-http-client"
2
- import { AccountStreamer, STREAMER_STATE, Disposer, StreamerStateObserver } from './account-streamer'
3
- import MarketDataStreamer, { CandleSubscriptionOptions, CandleType, MarketDataSubscriptionType, MarketDataListener } from "./market-data-streamer"
1
+ import TastytradeHttpClient from "./services/tastytrade-http-client.js"
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
4
 
5
5
  //Services:
6
- import SessionService from "./services/session-service"
7
- import AccountStatusService from "./services/account-status-service"
8
- import AccountsAndCustomersService from "./services/accounts-and-customers-service"
9
- import BalancesAndPositionsService from "./services/balances-and-positions-service"
10
- import InstrumentsService from "./services/instruments-service"
11
- import MarginRequirementsService from "./services/margin-requirements-service"
12
- import MarketMetricsService from "./services/market-metrics-service"
13
- import NetLiquidatingValueHistoryService from "./services/net-liquidating-value-history-service"
14
- import OrderService from "./services/orders-service"
15
- import RiskParametersService from "./services/risk-parameters-service"
16
- import SymbolSearchService from "./services/symbol-search-service"
17
- import TransactionsService from "./services/transactions-service"
18
- import WatchlistsService from "./services/watchlists-service"
19
- import TastytradeSession from "./models/tastytrade-session"
6
+ import SessionService from "./services/session-service.js"
7
+ import AccountStatusService from "./services/account-status-service.js"
8
+ import AccountsAndCustomersService from "./services/accounts-and-customers-service.js"
9
+ import BalancesAndPositionsService from "./services/balances-and-positions-service.js"
10
+ import InstrumentsService from "./services/instruments-service.js"
11
+ import MarginRequirementsService from "./services/margin-requirements-service.js"
12
+ import MarketMetricsService from "./services/market-metrics-service.js"
13
+ import NetLiquidatingValueHistoryService from "./services/net-liquidating-value-history-service.js"
14
+ import OrderService from "./services/orders-service.js"
15
+ import RiskParametersService from "./services/risk-parameters-service.js"
16
+ import SymbolSearchService from "./services/symbol-search-service.js"
17
+ import TransactionsService from "./services/transactions-service.js"
18
+ import WatchlistsService from "./services/watchlists-service.js"
19
+ import TastytradeSession from "./models/tastytrade-session.js"
20
+ import type Logger from "./logger.js"
21
+ import { TastytradeLogger, LogLevel } from "./logger.js"
22
+
23
+ export type ClientConfig = {
24
+ baseUrl: string,
25
+ accountStreamerUrl: string,
26
+ logger?: Logger,
27
+ logLevel?: LogLevel
28
+ }
20
29
 
21
30
  export default class TastytradeClient {
31
+ public readonly logger: TastytradeLogger
22
32
  public readonly httpClient: TastytradeHttpClient
23
33
 
24
34
  public readonly accountStreamer: AccountStreamer
@@ -37,9 +47,10 @@ export default class TastytradeClient {
37
47
  public readonly transactionsService: TransactionsService
38
48
  public readonly watchlistsService: WatchlistsService
39
49
 
40
- constructor(readonly baseUrl: string, readonly accountStreamerUrl: string) {
41
- this.httpClient = new TastytradeHttpClient(baseUrl)
42
- this.accountStreamer = new AccountStreamer(accountStreamerUrl, this.session)
50
+ constructor(config: ClientConfig) {
51
+ this.logger = new TastytradeLogger(config.logger, config.logLevel)
52
+ this.httpClient = new TastytradeHttpClient(config.baseUrl, this.logger)
53
+ this.accountStreamer = new AccountStreamer(config.accountStreamerUrl, this.session, this.logger)
43
54
 
44
55
  this.sessionService = new SessionService(this.httpClient)
45
56
  this.accountStatusService = new AccountStatusService(this.httpClient)
@@ -61,5 +72,7 @@ export default class TastytradeClient {
61
72
  }
62
73
  }
63
74
 
64
- export { MarketDataStreamer, MarketDataSubscriptionType, MarketDataListener, CandleSubscriptionOptions, CandleType }
65
- export { AccountStreamer, STREAMER_STATE, Disposer, StreamerStateObserver }
75
+ export { MarketDataStreamer, MarketDataSubscriptionType, type MarketDataListener, type CandleSubscriptionOptions, CandleType }
76
+ export { AccountStreamer, STREAMER_STATE, type Disposer, type StreamerStateObserver }
77
+ export { TastytradeLogger, LogLevel }
78
+ export type { Logger }
package/package.json CHANGED
@@ -1,8 +1,13 @@
1
1
  {
2
2
  "name": "@tastytrade/api",
3
- "version": "3.1.0",
4
- "main": "dist/tastytrade-api.js",
5
- "typings": "dist/tastytrade-api.d.ts",
3
+ "version": "5.0.0",
4
+ "type": "module",
5
+ "module": "dist/tastytrade-api.js",
6
+ "types": "dist/tastytrade-api.d.ts",
7
+ "exports": {
8
+ "types": "./dist/tastytrade-api.d.ts",
9
+ "default": "./dist/tastytrade-api.js"
10
+ },
6
11
  "repository": "https://github.com/tastytrade/tastytrade-api-js",
7
12
  "license": "MIT",
8
13
  "description": "Typescript impelementation of tastytrade api",
@@ -13,8 +18,8 @@
13
18
  "scripts": {
14
19
  "build": "tsc -p tsconfig.json",
15
20
  "test": "jest -i --restoreMocks",
16
- "unit-test": "jest --testPathPattern=tests/unit",
17
- "integration-test": "jest --testPathPattern=tests/integration",
21
+ "unit-test": "node --experimental-vm-modules ./node_modules/.bin/jest tests/unit",
22
+ "integration-test": "node --experimental-vm-modules ./node_modules/.bin/jest tests/integration",
18
23
  "lint": "eslint lib/** tests/**",
19
24
  "prepublishOnly": "npm run unit-test && npm run build",
20
25
  "postpack": "git tag -a $npm_package_version -m $npm_package_version && git push origin $npm_package_version"
@@ -30,7 +35,6 @@
30
35
  "ws": "^8.13.0"
31
36
  },
32
37
  "devDependencies": {
33
- "@types/axios": "^0.14.0",
34
38
  "@types/jest": "^29.5.0",
35
39
  "@types/node": "20.9.0",
36
40
  "@types/uuid": "^9.0.2",
@@ -39,8 +43,9 @@
39
43
  "@typescript-eslint/parser": "^5.57.1",
40
44
  "dotenv": "^16.0.3",
41
45
  "eslint": "^8.14.0",
42
- "jest": "^29.5.0",
43
- "ts-jest": "^29.0.5",
44
- "typescript": "4.6.3"
46
+ "jest": "^29.7.0",
47
+ "nock": "^13.5.4",
48
+ "ts-jest": "^29.1.2",
49
+ "typescript": "^5.4.2"
45
50
  }
46
51
  }