@huskly/ibkr-client 0.2.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 (58) hide show
  1. package/README.md +112 -0
  2. package/dist/cli/account.d.ts +7 -0
  3. package/dist/cli/account.d.ts.map +1 -0
  4. package/dist/cli/account.js +27 -0
  5. package/dist/cli/account.js.map +1 -0
  6. package/dist/cli/index.d.ts +3 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +50 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/cli/orders.d.ts +4 -0
  11. package/dist/cli/orders.d.ts.map +1 -0
  12. package/dist/cli/orders.js +5 -0
  13. package/dist/cli/orders.js.map +1 -0
  14. package/dist/cli/positions.d.ts +12 -0
  15. package/dist/cli/positions.d.ts.map +1 -0
  16. package/dist/cli/positions.js +106 -0
  17. package/dist/cli/positions.js.map +1 -0
  18. package/dist/cli/quote.d.ts +4 -0
  19. package/dist/cli/quote.d.ts.map +1 -0
  20. package/dist/cli/quote.js +5 -0
  21. package/dist/cli/quote.js.map +1 -0
  22. package/dist/cli/shared.d.ts +12 -0
  23. package/dist/cli/shared.d.ts.map +1 -0
  24. package/dist/cli/shared.js +31 -0
  25. package/dist/cli/shared.js.map +1 -0
  26. package/dist/format.d.ts +13 -0
  27. package/dist/format.d.ts.map +1 -0
  28. package/dist/format.js +32 -0
  29. package/dist/format.js.map +1 -0
  30. package/dist/helpers.d.ts +11 -0
  31. package/dist/helpers.d.ts.map +1 -0
  32. package/dist/helpers.js +34 -0
  33. package/dist/helpers.js.map +1 -0
  34. package/dist/ibkr/dhPrime.d.ts +13 -0
  35. package/dist/ibkr/dhPrime.d.ts.map +1 -0
  36. package/dist/ibkr/dhPrime.js +44 -0
  37. package/dist/ibkr/dhPrime.js.map +1 -0
  38. package/dist/ibkr/ibkrApiTypes.d.ts +70 -0
  39. package/dist/ibkr/ibkrApiTypes.d.ts.map +1 -0
  40. package/dist/ibkr/ibkrApiTypes.js +9 -0
  41. package/dist/ibkr/ibkrApiTypes.js.map +1 -0
  42. package/dist/ibkr/ibkrClient.d.ts +44 -0
  43. package/dist/ibkr/ibkrClient.d.ts.map +1 -0
  44. package/dist/ibkr/ibkrClient.js +351 -0
  45. package/dist/ibkr/ibkrClient.js.map +1 -0
  46. package/dist/ibkr/oauthConfig.d.ts +15 -0
  47. package/dist/ibkr/oauthConfig.d.ts.map +1 -0
  48. package/dist/ibkr/oauthConfig.js +44 -0
  49. package/dist/ibkr/oauthConfig.js.map +1 -0
  50. package/dist/index.d.ts +5 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +4 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/types.d.ts +81 -0
  55. package/dist/types.d.ts.map +1 -0
  56. package/dist/types.js +11 -0
  57. package/dist/types.js.map +1 -0
  58. package/package.json +54 -0
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Raw IBKR Client Portal Web API response shapes (only the fields we read).
3
+ * The `ibkr-client` `request()` method returns `any`; these types let us cast
4
+ * once at the boundary and stay typed everywhere else.
5
+ *
6
+ * See: https://www.interactivebrokers.com/campus/ibkr-api-page/webapi-ref/
7
+ */
8
+ export interface IbkrAuthStatus {
9
+ authenticated?: boolean;
10
+ competing?: boolean;
11
+ connected?: boolean;
12
+ }
13
+ export interface IbkrPortfolioAccount {
14
+ accountId: string;
15
+ type?: string;
16
+ currency?: string;
17
+ }
18
+ /** A single field in the `portfolio/{accountId}/summary` response. */
19
+ export interface IbkrSummaryField {
20
+ amount?: number;
21
+ currency?: string;
22
+ }
23
+ export type IbkrPortfolioSummary = Record<string, IbkrSummaryField | undefined>;
24
+ /** A row from `portfolio/{accountId}/positions/{page}`. */
25
+ export interface IbkrPosition {
26
+ conid?: number;
27
+ contractDesc?: string;
28
+ assetClass?: string;
29
+ position?: number;
30
+ avgPrice?: number;
31
+ mktPrice?: number;
32
+ mktValue?: number;
33
+ multiplier?: number;
34
+ unrealizedPnl?: number;
35
+ }
36
+ /** A row from `iserver/marketdata/snapshot`. Fields are numbered strings. */
37
+ export type IbkrMarketDataSnapshot = Record<string, string | number | undefined> & {
38
+ conid?: number;
39
+ };
40
+ /** A contract under a listing in the `trsrv/stocks` response. */
41
+ export interface IbkrStockContract {
42
+ conid?: number;
43
+ exchange?: string;
44
+ isUS?: boolean;
45
+ }
46
+ /** A listing (one per company) in the `trsrv/stocks` response. */
47
+ export interface IbkrStockListing {
48
+ name?: string;
49
+ assetClass?: string;
50
+ contracts?: IbkrStockContract[];
51
+ }
52
+ /** `trsrv/stocks` response: keyed by the requested symbol. */
53
+ export type IbkrStocksResponse = Record<string, IbkrStockListing[] | undefined>;
54
+ /** One OHLCV bar from `iserver/marketdata/history`. */
55
+ export interface IbkrMarketDataHistoryBar {
56
+ o?: number;
57
+ c?: number;
58
+ h?: number;
59
+ l?: number;
60
+ v?: number;
61
+ t?: number;
62
+ }
63
+ /** `iserver/marketdata/history` response. */
64
+ export interface IbkrMarketDataHistoryResponse {
65
+ symbol?: string;
66
+ text?: string;
67
+ volumeFactor?: number;
68
+ data?: IbkrMarketDataHistoryBar[];
69
+ }
70
+ //# sourceMappingURL=ibkrApiTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ibkrApiTypes.d.ts","sourceRoot":"","sources":["../../src/ibkr/ibkrApiTypes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,cAAc;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,sEAAsE;AACtE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,SAAS,CAAC,CAAC;AAEhF,2DAA2D;AAC3D,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,6EAA6E;AAC7E,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,GAAG;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,iEAAiE;AACjE,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,kEAAkE;AAClE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACjC;AAED,8DAA8D;AAC9D,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,SAAS,CAAC,CAAC;AAEhF,uDAAuD;AACvD,MAAM,WAAW,wBAAwB;IACvC,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAED,6CAA6C;AAC7C,MAAM,WAAW,6BAA6B;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,wBAAwB,EAAE,CAAC;CACnC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Raw IBKR Client Portal Web API response shapes (only the fields we read).
3
+ * The `ibkr-client` `request()` method returns `any`; these types let us cast
4
+ * once at the boundary and stay typed everywhere else.
5
+ *
6
+ * See: https://www.interactivebrokers.com/campus/ibkr-api-page/webapi-ref/
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=ibkrApiTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ibkrApiTypes.js","sourceRoot":"","sources":["../../src/ibkr/ibkrApiTypes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,44 @@
1
+ import type { IbkrOauth1Config } from "./oauthConfig.js";
2
+ import type { AccountBalances, AuthStatus, BrokerClient, BrokerPosition, BrokerQuote } from "../types.js";
3
+ /**
4
+ * Typed IBKR Web API client implementing the broker-neutral {@link BrokerClient}.
5
+ * Wraps the `ibkr-client` npm package, which performs the OAuth 1.0a
6
+ * live-session-token handshake. Ports the data access from the Python PoC
7
+ * (main.py): account summary, positions paging, and day-P/L snapshots.
8
+ */
9
+ export declare class IbkrClient implements BrokerClient {
10
+ private readonly raw;
11
+ private initPromise?;
12
+ private accountIdPromise?;
13
+ constructor(config: IbkrOauth1Config);
14
+ /** Obtain the live session token (idempotent — safe to await repeatedly). */
15
+ init(): Promise<void>;
16
+ getAuthStatus(): Promise<AuthStatus>;
17
+ getAccountId(): Promise<string>;
18
+ getAccountBalances(): Promise<AccountBalances>;
19
+ getPositions(symbol?: string): Promise<BrokerPosition[]>;
20
+ /** Page through the positions endpoint until it stops returning rows. */
21
+ private fetchAllPositions;
22
+ /** Return { conid: day P&L }. Snapshots need a warm-up call before data lands. */
23
+ private fetchDayPnl;
24
+ private normalizePosition;
25
+ getQuotes(symbols: string[]): Promise<Record<string, BrokerQuote>>;
26
+ /** Resolve equity/ETF symbols to IBKR contracts via `trsrv/stocks`. */
27
+ private searchInstruments;
28
+ private normalizeStockListing;
29
+ private normalizeStockContract;
30
+ private resolveQuoteContract;
31
+ private fetchQuoteHistory;
32
+ private normalizeQuote;
33
+ private latestHistoryBar;
34
+ private previousHistoryBar;
35
+ private historyVolume;
36
+ private snapshotString;
37
+ private snapshotNumber;
38
+ private snapshotHasPrefix;
39
+ private snapshotPercent;
40
+ private snapshotVolume;
41
+ /** Typed wrapper around the raw client's untyped `request()`. */
42
+ private req;
43
+ }
44
+ //# sourceMappingURL=ibkrClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ibkrClient.d.ts","sourceRoot":"","sources":["../../src/ibkr/ibkrClient.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,YAAY,EAEZ,cAAc,EACd,WAAW,EACZ,MAAM,aAAa,CAAC;AAsDrB;;;;;GAKG;AACH,qBAAa,UAAW,YAAW,YAAY;IAC7C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,WAAW,CAAC,CAAgB;IACpC,OAAO,CAAC,gBAAgB,CAAC,CAAkB;gBAE/B,MAAM,EAAE,gBAAgB;IAIpC,6EAA6E;IAC7E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IASf,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC;IAWpC,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAY/B,kBAAkB,IAAI,OAAO,CAAC,eAAe,CAAC;IAc9C,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAa9D,yEAAyE;YAC3D,iBAAiB;IAc/B,kFAAkF;YACpE,WAAW;IAqBzB,OAAO,CAAC,iBAAiB;IAgBnB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAyCxE,uEAAuE;YACzD,iBAAiB;IAY/B,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,sBAAsB;YAehB,oBAAoB;YAgBpB,iBAAiB;IAkB/B,OAAO,CAAC,cAAc;IAoDtB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,cAAc;IAmBtB,iEAAiE;YACnD,GAAG;CAQlB"}
@@ -0,0 +1,351 @@
1
+ import { createRequire } from "node:module";
2
+ import { ASSET_CLASS_LABELS, toNumber } from "../helpers.js";
3
+ // `ibkr-client`'s published ESM build is broken: its `import` condition points
4
+ // at files that use extensionless relative imports, which Node's strict ESM
5
+ // resolver rejects. Its CJS build is fine, so we deliberately load that via
6
+ // createRequire. This is the one intentional createRequire in the package —
7
+ // everything else imports natively as ESM. Revisit if upstream fixes their ESM.
8
+ const require = createRequire(import.meta.url);
9
+ const { IbkrClient: RawIbkrClientCtor } = require("ibkr-client");
10
+ /** Live market-data snapshot field 78 = position's P&L for the current day. */
11
+ const DAY_PNL_FIELD = "78";
12
+ const QUOTE_FIELDS = [
13
+ "31", // Last
14
+ "55", // Symbol
15
+ "58", // Text
16
+ "70", // High
17
+ "71", // Low
18
+ "82", // Change
19
+ "83", // Change %
20
+ "84", // Bid
21
+ "86", // Ask
22
+ "87", // Formatted volume
23
+ "6004", // Exchange
24
+ "6509", // Market data availability
25
+ "7762", // Unformatted volume
26
+ ].join(",");
27
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
28
+ /**
29
+ * Typed IBKR Web API client implementing the broker-neutral {@link BrokerClient}.
30
+ * Wraps the `ibkr-client` npm package, which performs the OAuth 1.0a
31
+ * live-session-token handshake. Ports the data access from the Python PoC
32
+ * (main.py): account summary, positions paging, and day-P/L snapshots.
33
+ */
34
+ export class IbkrClient {
35
+ raw;
36
+ initPromise;
37
+ accountIdPromise;
38
+ constructor(config) {
39
+ this.raw = new RawIbkrClientCtor(config);
40
+ }
41
+ /** Obtain the live session token (idempotent — safe to await repeatedly). */
42
+ init() {
43
+ this.initPromise ??= (async () => {
44
+ await this.raw.init();
45
+ // IBKR is slow right after init; give the session a moment to settle.
46
+ await sleep(1000);
47
+ })();
48
+ return this.initPromise;
49
+ }
50
+ async getAuthStatus() {
51
+ const status = await this.req({
52
+ path: "iserver/auth/status",
53
+ method: "POST",
54
+ });
55
+ return {
56
+ authenticated: status.authenticated ?? false,
57
+ competing: status.competing ?? false,
58
+ };
59
+ }
60
+ async getAccountId() {
61
+ this.accountIdPromise ??= (async () => {
62
+ const override = process.env["IBKR_ACCOUNT_ID"];
63
+ if (override)
64
+ return override;
65
+ const accounts = await this.req({ path: "portfolio/accounts" });
66
+ const first = accounts[0];
67
+ if (!first)
68
+ throw new Error("No portfolio accounts returned by IBKR");
69
+ return first.accountId;
70
+ })();
71
+ return this.accountIdPromise;
72
+ }
73
+ async getAccountBalances() {
74
+ const accountId = await this.getAccountId();
75
+ const summary = await this.req({
76
+ path: `portfolio/${accountId}/summary`,
77
+ });
78
+ const amount = (key) => toNumber(summary[key]?.amount);
79
+ return {
80
+ netLiquidation: amount("netliquidation"),
81
+ availableFunds: amount("availablefunds"),
82
+ buyingPower: amount("buyingpower"),
83
+ cashBalance: amount("totalcashvalue"),
84
+ };
85
+ }
86
+ async getPositions(symbol) {
87
+ const accountId = await this.getAccountId();
88
+ const rows = await this.fetchAllPositions(accountId);
89
+ const dayPnl = await this.fetchDayPnl(rows.map((p) => String(p.conid)).filter(Boolean));
90
+ let positions = rows.map((p) => this.normalizePosition(p, dayPnl));
91
+ if (symbol) {
92
+ const upper = symbol.toUpperCase();
93
+ positions = positions.filter((p) => p.symbol.toUpperCase().includes(upper));
94
+ }
95
+ return positions;
96
+ }
97
+ /** Page through the positions endpoint until it stops returning rows. */
98
+ async fetchAllPositions(accountId) {
99
+ const out = [];
100
+ let page = 0;
101
+ for (;;) {
102
+ const rows = await this.req({
103
+ path: `portfolio/${accountId}/positions/${String(page)}`,
104
+ });
105
+ if (!rows.length)
106
+ break;
107
+ out.push(...rows);
108
+ page += 1;
109
+ }
110
+ return out;
111
+ }
112
+ /** Return { conid: day P&L }. Snapshots need a warm-up call before data lands. */
113
+ async fetchDayPnl(conids) {
114
+ const result = new Map();
115
+ if (!conids.length)
116
+ return result;
117
+ const params = { conids: conids.join(","), fields: DAY_PNL_FIELD };
118
+ await this.req({ path: "iserver/marketdata/snapshot", params }); // warm up
119
+ await sleep(2000);
120
+ const snapshot = await this.req({
121
+ path: "iserver/marketdata/snapshot",
122
+ params,
123
+ });
124
+ for (const row of snapshot) {
125
+ const raw = row[DAY_PNL_FIELD];
126
+ if (raw !== undefined && row.conid !== undefined) {
127
+ result.set(row.conid, toNumber(raw));
128
+ }
129
+ }
130
+ return result;
131
+ }
132
+ normalizePosition(p, dayPnl) {
133
+ const qty = p.position ?? 0;
134
+ const assetClass = p.assetClass ?? "";
135
+ return {
136
+ symbol: p.contractDesc ?? String(p.conid ?? "-"),
137
+ assetType: ASSET_CLASS_LABELS[assetClass] ?? (assetClass || "-"),
138
+ longQuantity: qty > 0 ? qty : 0,
139
+ shortQuantity: qty < 0 ? Math.abs(qty) : 0,
140
+ averagePrice: toNumber(p.avgPrice),
141
+ marketPrice: toNumber(p.mktPrice),
142
+ marketValue: toNumber(p.mktValue),
143
+ currentDayProfitLoss: p.conid !== undefined ? (dayPnl.get(p.conid) ?? 0) : 0,
144
+ openProfitLoss: toNumber(p.unrealizedPnl),
145
+ };
146
+ }
147
+ async getQuotes(symbols) {
148
+ const contracts = await Promise.all(symbols.map((symbol) => this.resolveQuoteContract(symbol)));
149
+ const resolvedContracts = contracts.filter((contract) => contract !== undefined);
150
+ if (!resolvedContracts.length)
151
+ return {};
152
+ const conids = resolvedContracts.map((contract) => contract.conid).join(",");
153
+ const params = { conids, fields: QUOTE_FIELDS };
154
+ await this.req({ path: "iserver/marketdata/snapshot", params }); // warm up
155
+ await sleep(2000);
156
+ const snapshots = await this.req({
157
+ path: "iserver/marketdata/snapshot",
158
+ params,
159
+ });
160
+ const snapshotByConid = new Map(snapshots
161
+ .filter((snapshot) => snapshot.conid !== undefined)
162
+ .map((snapshot) => [snapshot.conid, snapshot]));
163
+ const histories = await Promise.all(resolvedContracts.map((contract) => this.fetchQuoteHistory(contract.conid)));
164
+ const quotes = {};
165
+ for (const [index, contract] of resolvedContracts.entries()) {
166
+ const snapshot = snapshotByConid.get(contract.conid);
167
+ if (snapshot === undefined)
168
+ continue;
169
+ const history = histories[index];
170
+ const quote = this.normalizeQuote(contract, snapshot, history);
171
+ quotes[contract.requestedSymbol] = quote;
172
+ quotes[contract.symbol] = quote;
173
+ }
174
+ return quotes;
175
+ }
176
+ /** Resolve equity/ETF symbols to IBKR contracts via `trsrv/stocks`. */
177
+ async searchInstruments(symbol) {
178
+ const query = symbol.trim().toUpperCase();
179
+ if (!query)
180
+ return [];
181
+ const response = await this.req({
182
+ path: "trsrv/stocks",
183
+ params: { symbols: query },
184
+ });
185
+ return (response[query] ?? []).flatMap((listing) => this.normalizeStockListing(query, listing));
186
+ }
187
+ normalizeStockListing(symbol, listing) {
188
+ const assetType = listing.assetClass === "STK" ? "EQUITY" : listing.assetClass;
189
+ const contracts = listing.contracts ?? [];
190
+ if (!contracts.length) {
191
+ return [
192
+ {
193
+ symbol,
194
+ ...(listing.name !== undefined ? { description: listing.name } : {}),
195
+ ...(assetType !== undefined ? { assetType } : {}),
196
+ },
197
+ ];
198
+ }
199
+ return contracts.map((contract) => this.normalizeStockContract(symbol, listing, contract));
200
+ }
201
+ normalizeStockContract(symbol, listing, contract) {
202
+ const assetType = listing.assetClass === "STK" ? "EQUITY" : listing.assetClass;
203
+ return {
204
+ symbol,
205
+ ...(listing.name !== undefined ? { description: listing.name } : {}),
206
+ ...(contract.exchange !== undefined ? { exchange: contract.exchange } : {}),
207
+ ...(assetType !== undefined ? { assetType } : {}),
208
+ ...(contract.conid !== undefined ? { brokerId: String(contract.conid) } : {}),
209
+ };
210
+ }
211
+ async resolveQuoteContract(symbol) {
212
+ const instruments = await this.searchInstruments(symbol);
213
+ const instrument = instruments.find((item) => item.brokerId !== undefined);
214
+ if (instrument?.brokerId === undefined)
215
+ return undefined;
216
+ const conid = parseInt(instrument.brokerId, 10);
217
+ if (Number.isNaN(conid))
218
+ return undefined;
219
+ return {
220
+ requestedSymbol: symbol,
221
+ symbol: instrument.symbol ?? symbol.toUpperCase(),
222
+ conid,
223
+ ...(instrument.description !== undefined ? { description: instrument.description } : {}),
224
+ ...(instrument.exchange !== undefined ? { exchange: instrument.exchange } : {}),
225
+ };
226
+ }
227
+ async fetchQuoteHistory(conid) {
228
+ try {
229
+ return await this.req({
230
+ path: "iserver/marketdata/history",
231
+ params: {
232
+ conid: String(conid),
233
+ period: "5d",
234
+ bar: "1d",
235
+ outsideRth: true,
236
+ },
237
+ });
238
+ }
239
+ catch {
240
+ return undefined;
241
+ }
242
+ }
243
+ normalizeQuote(contract, snapshot, history) {
244
+ const symbol = this.snapshotString(snapshot, "55") ?? contract.symbol;
245
+ const description = this.snapshotString(snapshot, "58") ?? history?.text ?? contract.description;
246
+ const exchange = this.snapshotString(snapshot, "6004") ?? contract.exchange;
247
+ const latestBar = this.latestHistoryBar(history);
248
+ const previousBar = this.previousHistoryBar(history);
249
+ const snapshotLastPrice = this.snapshotNumber(snapshot, "31");
250
+ const lastPrice = this.snapshotHasPrefix(snapshot, "31", "C")
251
+ ? (latestBar?.c ?? snapshotLastPrice)
252
+ : (snapshotLastPrice ?? latestBar?.c);
253
+ const bidPrice = this.snapshotNumber(snapshot, "84");
254
+ const askPrice = this.snapshotNumber(snapshot, "86");
255
+ const closePrice = previousBar?.c;
256
+ const highPrice = this.snapshotNumber(snapshot, "70") ?? latestBar?.h;
257
+ const lowPrice = this.snapshotNumber(snapshot, "71") ?? latestBar?.l;
258
+ const openPrice = latestBar?.o;
259
+ const netChange = this.snapshotNumber(snapshot, "82") ??
260
+ (lastPrice !== undefined && closePrice !== undefined ? lastPrice - closePrice : undefined);
261
+ const netPercentChange = this.snapshotPercent(snapshot, "83") ??
262
+ (netChange !== undefined && closePrice !== undefined && closePrice !== 0
263
+ ? (netChange / closePrice) * 100
264
+ : undefined);
265
+ const totalVolume = this.snapshotVolume(snapshot) ?? this.historyVolume(history, latestBar);
266
+ return {
267
+ symbol,
268
+ reference: {
269
+ ...(description !== undefined ? { description } : {}),
270
+ ...(exchange !== undefined ? { exchange, exchangeName: exchange } : {}),
271
+ },
272
+ quote: {
273
+ ...(lastPrice !== undefined ? { lastPrice } : {}),
274
+ ...(bidPrice !== undefined ? { bidPrice } : {}),
275
+ ...(askPrice !== undefined ? { askPrice } : {}),
276
+ ...(closePrice !== undefined ? { closePrice } : {}),
277
+ ...(highPrice !== undefined ? { highPrice } : {}),
278
+ ...(lowPrice !== undefined ? { lowPrice } : {}),
279
+ ...(openPrice !== undefined ? { openPrice } : {}),
280
+ ...(netChange !== undefined ? { netChange } : {}),
281
+ ...(netPercentChange !== undefined ? { netPercentChange } : {}),
282
+ ...(totalVolume !== undefined ? { totalVolume } : {}),
283
+ },
284
+ };
285
+ }
286
+ latestHistoryBar(history) {
287
+ return history?.data?.at(-1);
288
+ }
289
+ previousHistoryBar(history) {
290
+ return history?.data?.at(-2);
291
+ }
292
+ historyVolume(history, bar) {
293
+ if (bar?.v === undefined)
294
+ return undefined;
295
+ return bar.v * (history?.volumeFactor ?? 1);
296
+ }
297
+ snapshotString(snapshot, field) {
298
+ const value = snapshot[field];
299
+ if (value === undefined)
300
+ return undefined;
301
+ const stringValue = String(value).trim();
302
+ return stringValue ? stringValue : undefined;
303
+ }
304
+ snapshotNumber(snapshot, field) {
305
+ const value = this.snapshotString(snapshot, field);
306
+ if (value === undefined)
307
+ return undefined;
308
+ const cleaned = value.replace(/^[A-Z]\s*/i, "").replace(/,/g, "");
309
+ const parsed = parseFloat(cleaned);
310
+ return Number.isNaN(parsed) ? undefined : parsed;
311
+ }
312
+ snapshotHasPrefix(snapshot, field, prefix) {
313
+ return this.snapshotString(snapshot, field)?.toUpperCase().startsWith(prefix) ?? false;
314
+ }
315
+ snapshotPercent(snapshot, field) {
316
+ const value = this.snapshotString(snapshot, field);
317
+ if (value === undefined)
318
+ return undefined;
319
+ const cleaned = value.replace(/[%+,]/g, "");
320
+ const parsed = parseFloat(cleaned);
321
+ return Number.isNaN(parsed) ? undefined : parsed;
322
+ }
323
+ snapshotVolume(snapshot) {
324
+ const unformatted = this.snapshotNumber(snapshot, "7762");
325
+ if (unformatted !== undefined)
326
+ return unformatted;
327
+ const value = this.snapshotString(snapshot, "87");
328
+ if (value === undefined)
329
+ return undefined;
330
+ const match = /^(?<amount>[\d,.]+)\s*(?<suffix>[KMB])?$/i.exec(value);
331
+ const amount = match?.groups?.["amount"];
332
+ if (amount === undefined)
333
+ return undefined;
334
+ const parsed = parseFloat(amount.replace(/,/g, ""));
335
+ if (Number.isNaN(parsed))
336
+ return undefined;
337
+ const suffix = match?.groups?.["suffix"]?.toUpperCase();
338
+ if (suffix === "B")
339
+ return parsed * 1_000_000_000;
340
+ if (suffix === "M")
341
+ return parsed * 1_000_000;
342
+ if (suffix === "K")
343
+ return parsed * 1_000;
344
+ return parsed;
345
+ }
346
+ /** Typed wrapper around the raw client's untyped `request()`. */
347
+ async req(input) {
348
+ return (await this.raw.request(input));
349
+ }
350
+ }
351
+ //# sourceMappingURL=ibkrClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ibkrClient.js","sourceRoot":"","sources":["../../src/ibkr/ibkrClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Shape of the OAuth 1.0a config consumed by `ibkr-client`'s `IbkrClient`
3
+ * constructor. The package does not re-export this type, so we mirror it here.
4
+ */
5
+ export interface IbkrOauth1Config {
6
+ accessTokenSecret: string;
7
+ accessToken: string;
8
+ consumerKey: string;
9
+ encryption: string;
10
+ signature: string;
11
+ dhPrime: string;
12
+ realm: string;
13
+ }
14
+ export declare function buildOauthConfig(): IbkrOauth1Config;
15
+ //# sourceMappingURL=oauthConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauthConfig.d.ts","sourceRoot":"","sources":["../../src/ibkr/oauthConfig.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAuBD,wBAAgB,gBAAgB,IAAI,gBAAgB,CAwBnD"}
@@ -0,0 +1,44 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { config as loadEnv } from "dotenv";
4
+ import { extractDhPrime } from "./dhPrime.js";
5
+ /**
6
+ * Assemble the `ibkr-client` OAuth 1.0a config from local PEM files + env vars.
7
+ * Ports build_client() from the Python PoC (main.py).
8
+ *
9
+ * The cryptographic material (private keys + DH params) lives as PEM files in
10
+ * the keys directory; the account-specific secrets come from the environment
11
+ * (or a local .env). `ibkr-client` expects the DH prime as a hex string, so we
12
+ * extract it from dhparam.pem via {@link extractDhPrime} (a pure-TS port of
13
+ * dh_prime.py — no openssl subprocess).
14
+ *
15
+ * The standard individual self-service OAuth flow uses the `limited_poa` realm;
16
+ * institutional consumers override it via IBIND_OAUTH1A_REALM.
17
+ */
18
+ const DEFAULT_REALM = "limited_poa";
19
+ const REQUIRED_ENV = [
20
+ "IBIND_OAUTH1A_CONSUMER_KEY",
21
+ "IBIND_OAUTH1A_ACCESS_TOKEN",
22
+ "IBIND_OAUTH1A_ACCESS_TOKEN_SECRET",
23
+ ];
24
+ export function buildOauthConfig() {
25
+ loadEnv();
26
+ const missing = REQUIRED_ENV.filter((name) => !process.env[name]);
27
+ if (missing.length > 0) {
28
+ throw new Error(`Missing required environment variables:\n ${missing.join("\n ")}\n\n` +
29
+ "Copy .env.example to .env and fill them in (or export them).");
30
+ }
31
+ // Where the PEM key files live (defaults to the current working directory).
32
+ const keysDir = process.env["IBKR_KEYS_DIR"] ?? process.cwd();
33
+ const readPem = (file) => readFileSync(resolve(keysDir, file), "utf8");
34
+ return {
35
+ consumerKey: process.env["IBIND_OAUTH1A_CONSUMER_KEY"] ?? "",
36
+ accessToken: process.env["IBIND_OAUTH1A_ACCESS_TOKEN"] ?? "",
37
+ accessTokenSecret: process.env["IBIND_OAUTH1A_ACCESS_TOKEN_SECRET"] ?? "",
38
+ signature: readPem("private_signature.pem"),
39
+ encryption: readPem("private_encryption.pem"),
40
+ dhPrime: extractDhPrime(readPem("dhparam.pem")),
41
+ realm: process.env["IBIND_OAUTH1A_REALM"] ?? DEFAULT_REALM,
42
+ };
43
+ }
44
+ //# sourceMappingURL=oauthConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauthConfig.js","sourceRoot":"","sources":["../../src/ibkr/oauthConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAgB9C;;;;;;;;;;;;GAYG;AACH,MAAM,aAAa,GAAG,aAAa,CAAC;AAEpC,MAAM,YAAY,GAAG;IACnB,4BAA4B;IAC5B,4BAA4B;IAC5B,mCAAmC;CAC3B,CAAC;AAEX,MAAM,UAAU,gBAAgB;IAC9B,OAAO,EAAE,CAAC;IAEV,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAClE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,8CAA8C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;YACtE,8DAA8D,CACjE,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC9D,MAAM,OAAO,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;IAEvF,OAAO;QACL,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,IAAI,EAAE;QAC5D,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,IAAI,EAAE;QAC5D,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,IAAI,EAAE;QACzE,SAAS,EAAE,OAAO,CAAC,uBAAuB,CAAC;QAC3C,UAAU,EAAE,OAAO,CAAC,wBAAwB,CAAC;QAC7C,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC/C,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,aAAa;KAC3D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** Package entry point — the broker-neutral types and the IBKR client. */
2
+ export { IbkrClient } from "./ibkr/ibkrClient.js";
3
+ export { buildOauthConfig } from "./ibkr/oauthConfig.js";
4
+ export type { AccountBalances, AuthStatus, BrokerClient, BrokerInstrument, BrokerName, BrokerPosition, BrokerQuote, BrokerQuoteData, BrokerQuoteReference, } from "./types.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EACV,eAAe,EACf,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,WAAW,EACX,eAAe,EACf,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ /** Package entry point — the broker-neutral types and the IBKR client. */
2
+ export { IbkrClient } from "./ibkr/ibkrClient.js";
3
+ export { buildOauthConfig } from "./ibkr/oauthConfig.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}