@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.
- package/.vscode/launch.json +29 -0
- package/CHANGELOG.md +41 -0
- package/CODEOWNERS +1 -0
- package/README.md +64 -31
- package/dist/account-streamer.d.ts +10 -8
- package/dist/account-streamer.d.ts.map +1 -0
- package/dist/account-streamer.js +147 -229
- package/dist/account-streamer.js.map +1 -0
- package/dist/logger.d.ts +20 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +36 -0
- package/dist/logger.js.map +1 -0
- package/dist/market-data-streamer.d.ts +7 -5
- package/dist/market-data-streamer.d.ts.map +1 -0
- package/dist/market-data-streamer.js +139 -172
- package/dist/market-data-streamer.js.map +1 -0
- package/dist/models/tastytrade-session.d.ts +1 -0
- package/dist/models/tastytrade-session.d.ts.map +1 -0
- package/dist/models/tastytrade-session.js +10 -20
- package/dist/models/tastytrade-session.js.map +1 -0
- package/dist/services/account-status-service.d.ts +2 -1
- package/dist/services/account-status-service.d.ts.map +1 -0
- package/dist/services/account-status-service.js +11 -60
- package/dist/services/account-status-service.js.map +1 -0
- package/dist/services/accounts-and-customers-service.d.ts +2 -1
- package/dist/services/accounts-and-customers-service.d.ts.map +1 -0
- package/dist/services/accounts-and-customers-service.js +29 -112
- package/dist/services/accounts-and-customers-service.js.map +1 -0
- package/dist/services/balances-and-positions-service.d.ts +2 -1
- package/dist/services/balances-and-positions-service.d.ts.map +1 -0
- package/dist/services/balances-and-positions-service.js +22 -88
- package/dist/services/balances-and-positions-service.js.map +1 -0
- package/dist/services/instruments-service.d.ts +2 -1
- package/dist/services/instruments-service.d.ts.map +1 -0
- package/dist/services/instruments-service.js +130 -365
- package/dist/services/instruments-service.js.map +1 -0
- package/dist/services/margin-requirements-service.d.ts +2 -1
- package/dist/services/margin-requirements-service.d.ts.map +1 -0
- package/dist/services/margin-requirements-service.js +16 -73
- package/dist/services/margin-requirements-service.js.map +1 -0
- package/dist/services/market-metrics-service.d.ts +2 -1
- package/dist/services/market-metrics-service.d.ts.map +1 -0
- package/dist/services/market-metrics-service.js +21 -88
- package/dist/services/market-metrics-service.js.map +1 -0
- package/dist/services/net-liquidating-value-history-service.d.ts +2 -1
- package/dist/services/net-liquidating-value-history-service.d.ts.map +1 -0
- package/dist/services/net-liquidating-value-history-service.js +16 -74
- package/dist/services/net-liquidating-value-history-service.js.map +1 -0
- package/dist/services/orders-service.d.ts +2 -1
- package/dist/services/orders-service.d.ts.map +1 -0
- package/dist/services/orders-service.js +76 -231
- package/dist/services/orders-service.js.map +1 -0
- package/dist/services/risk-parameters-service.d.ts +2 -1
- package/dist/services/risk-parameters-service.d.ts.map +1 -0
- package/dist/services/risk-parameters-service.js +16 -73
- package/dist/services/risk-parameters-service.js.map +1 -0
- package/dist/services/session-service.d.ts +2 -1
- package/dist/services/session-service.d.ts.map +1 -0
- package/dist/services/session-service.js +30 -110
- package/dist/services/session-service.js.map +1 -0
- package/dist/services/symbol-search-service.d.ts +2 -1
- package/dist/services/symbol-search-service.d.ts.map +1 -0
- package/dist/services/symbol-search-service.js +11 -60
- package/dist/services/symbol-search-service.js.map +1 -0
- package/dist/services/tastytrade-http-client.d.ts +5 -3
- package/dist/services/tastytrade-http-client.d.ts.map +1 -0
- package/dist/services/tastytrade-http-client.js +53 -134
- package/dist/services/tastytrade-http-client.js.map +1 -0
- package/dist/services/transactions-service.d.ts +2 -1
- package/dist/services/transactions-service.d.ts.map +1 -0
- package/dist/services/transactions-service.js +22 -87
- package/dist/services/transactions-service.js.map +1 -0
- package/dist/services/watchlists-service.d.ts +2 -1
- package/dist/services/watchlists-service.d.ts.map +1 -0
- package/dist/services/watchlists-service.js +51 -165
- package/dist/services/watchlists-service.js.map +1 -0
- package/dist/tastytrade-api.d.ts +32 -22
- package/dist/tastytrade-api.d.ts.map +1 -0
- package/dist/tastytrade-api.js +44 -79
- package/dist/tastytrade-api.js.map +1 -0
- package/dist/utils/constants.d.ts +1 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +2 -4
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/json-util.d.ts +4 -3
- package/dist/utils/json-util.d.ts.map +1 -0
- package/dist/utils/json-util.js +14 -25
- package/dist/utils/json-util.js.map +1 -0
- package/dist/utils/response-util.d.ts +1 -0
- package/dist/utils/response-util.d.ts.map +1 -0
- package/dist/utils/response-util.js +7 -12
- package/dist/utils/response-util.js.map +1 -0
- package/lib/account-streamer.ts +19 -12
- package/lib/logger.ts +48 -0
- package/lib/market-data-streamer.ts +5 -1
- package/lib/services/account-status-service.ts +2 -2
- package/lib/services/accounts-and-customers-service.ts +2 -2
- package/lib/services/balances-and-positions-service.ts +2 -2
- package/lib/services/instruments-service.ts +2 -2
- package/lib/services/margin-requirements-service.ts +2 -2
- package/lib/services/market-metrics-service.ts +2 -2
- package/lib/services/net-liquidating-value-history-service.ts +2 -2
- package/lib/services/orders-service.ts +2 -2
- package/lib/services/risk-parameters-service.ts +2 -2
- package/lib/services/session-service.ts +2 -2
- package/lib/services/symbol-search-service.ts +2 -2
- package/lib/services/tastytrade-http-client.ts +21 -16
- package/lib/services/transactions-service.ts +2 -2
- package/lib/services/watchlists-service.ts +2 -2
- package/lib/tastytrade-api.ts +35 -22
- package/package.json +14 -9
- 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"}
|
package/dist/utils/json-util.js
CHANGED
|
@@ -1,43 +1,32 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
|
|
14
|
-
if (
|
|
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
|
-
|
|
22
|
-
}());
|
|
23
|
-
exports.JsonBuilder = JsonBuilder;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
24
14
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
25
|
-
function recursiveDasherizeKeys(body) {
|
|
26
|
-
|
|
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 =
|
|
29
|
-
if (
|
|
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
|
-
|
|
37
|
-
function dasherize(target) {
|
|
26
|
+
export function dasherize(target) {
|
|
38
27
|
// prettier-ignore
|
|
39
28
|
return target
|
|
40
|
-
.replace(/([A-Z])/g,
|
|
29
|
+
.replace(/([A-Z])/g, (_match, p1, _offset, _whole) => `-${p1.toLowerCase()}`)
|
|
41
30
|
.replace(/\s/g, '-');
|
|
42
31
|
}
|
|
43
|
-
|
|
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"}
|
|
@@ -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
|
-
|
|
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 (
|
|
10
|
-
return
|
|
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 (
|
|
13
|
-
return
|
|
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"}
|
package/lib/account-streamer.ts
CHANGED
|
@@ -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(
|
|
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 = (
|
|
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'
|
|
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'
|
|
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.
|
|
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
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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) {
|
package/lib/tastytrade-api.ts
CHANGED
|
@@ -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(
|
|
41
|
-
this.
|
|
42
|
-
this.
|
|
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": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
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
|
|
17
|
-
"integration-test": "jest
|
|
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.
|
|
43
|
-
"
|
|
44
|
-
"
|
|
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
|
}
|