@huskly/ibkr-client 1.1.1 → 1.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.
package/README.md CHANGED
@@ -146,6 +146,29 @@ recovery.
146
146
  does not identify one listing.
147
147
  - `getOptionContract(conid)` maps a broker conid back to durable OSI identity.
148
148
 
149
+ The option discovery methods submit at most eight `secdef/info` definitions at one time. The next
150
+ chunk starts only after the current chunk succeeds. Multi-month expiry discovery completes one month
151
+ before it starts the next month. A terminal failure cancels queued definitions that belong to that
152
+ operation. It does not cancel definitions that belong to another operation. HTTP requests that
153
+ started before cancellation can settle normally.
154
+
155
+ Pass an `OptionDiscoveryOptions` value as the last argument to stop one operation with a standard
156
+ `AbortSignal`:
157
+
158
+ ```ts
159
+ const controller = new AbortController();
160
+ const expiries = client.getOptionExpiries("SPX", "C", from, to, {
161
+ signal: controller.signal,
162
+ });
163
+ controller.abort();
164
+ await expiries;
165
+ ```
166
+
167
+ `getOptionChain` and `getOptionChainSnapshot` accept the same final options argument. Their signal
168
+ applies to definition discovery and market-data snapshots. An aborted operation rejects with the
169
+ signal reason when it is an `Error`. A non-error custom reason is retained as the `cause` of an
170
+ `Error`. An `AbortController` without a custom reason uses the standard `AbortError`.
171
+
149
172
  ### Broker-neutral derivative discovery
150
173
 
151
174
  `IbkrClient` implements the capability-specific `DerivativeDiscoveryClient` without adding
@@ -315,18 +338,23 @@ structured response in `BrokerErrorDetail.details`; transport exceptions are ret
315
338
 
316
339
  Every authenticated request runs through one priority scheduler per `IbkrClient`. The default
317
340
  limits allow at most ten requests globally. Stateful security-definition discovery stays at one
318
- request at a time. Read-only `iserver/secdef/info` expansion uses a separate conservative limit of
319
- four concurrent requests. Configure it with `maxSecdefInfoConcurrent`; it cannot exceed the global
320
- limit. Order preview, status, warning, cancellation, and immediate-trade requests take priority over
321
- queued discovery. Multi-month derivative discovery also primes each month serially. A session-level
341
+ request at a time. Read-only `iserver/secdef/info` expansion defaults to one concurrent request and
342
+ at least 250 ms between request starts. Configure these limits with `maxSecdefInfoConcurrent` and
343
+ `secdefInfoMinStartIntervalMs`; concurrency cannot exceed the global limit. Order preview, status,
344
+ warning, cancellation, and immediate-trade requests take priority over queued discovery, including
345
+ while definition work waits for its next allowed start. Multi-month derivative discovery also primes
346
+ each month serially. A session-level
322
347
  transaction guard keeps each stateful security-definition search with its dependent strike request.
323
348
  For option-chain discovery, independent definition reads run outside this guard after search and
324
349
  strikes finish. An exact expiry/strike/right request expands only the requested contracts.
325
350
 
326
- A 429 pauses the shared queue behind one `Retry-After`-aware exponential backoff with jitter.
327
- Individual queued reads do not start independent retry loops. Exhausted throttling throws
328
- `IbkrRequestSchedulerError` with code `IBKR_THROTTLED`. A broker temporary-block response opens a
329
- bounded circuit, rejects queued work, and throws code `IBKR_TEMPORARILY_BLOCKED` without a retry.
351
+ A `secdef/info` 429 extends one endpoint-wide wait and raises the effective minimum start interval.
352
+ It honors `Retry-After` and does not block execution requests. A 429 from another endpoint pauses the
353
+ shared queue behind one `Retry-After`-aware exponential backoff with jitter. Individual queued reads
354
+ do not start independent retry loops, and the retry count does not increase. Exhausted throttling
355
+ throws `IbkrRequestSchedulerError` with code `IBKR_THROTTLED`. A broker temporary-block response
356
+ opens a bounded circuit, rejects queued work, and throws code `IBKR_TEMPORARILY_BLOCKED` without a
357
+ retry.
330
358
 
331
359
  A price-history read retries a 5xx response with bounded exponential backoff and jitter. No other
332
360
  request retries a 5xx response. An explicit `Retry-After` value replaces the local backoff delay
@@ -340,9 +368,11 @@ safe `Retry-After` value when it is available. Callers do not have to parse the
340
368
 
341
369
  `IbkrClient` accepts optional scheduler limits and an `onRequestTelemetry` callback. Scheduler
342
370
  options also accept `now`, `sleep`, and `random` functions for controlled runtimes and tests.
343
- Telemetry for each retry contains only a sanitized endpoint category, event, attempt, and delay.
344
- `onOptionDiscoveryTelemetry` reports search, strikes, definitions, and snapshot phases. It includes
345
- the symbol, month, optional right, duration, definition request count, and snapshot batch count. It
371
+ Request telemetry contains only a sanitized endpoint category, event, attempt, applied delay, and
372
+ the effective `secdef/info` minimum start interval when it applies. It contains no parameters,
373
+ payloads, or account data. `onOptionDiscoveryTelemetry` reports search, strikes, definitions, and
374
+ snapshot phases. It includes the symbol, month, optional right, duration, definition request count,
375
+ and snapshot batch count. It
346
376
  does not contain account IDs, order IDs, credentials, request payloads, or full URLs. A telemetry
347
377
  observer failure does not change request scheduling or request settlement.
348
378
 
@@ -7,6 +7,11 @@ interface IbkrRequestInput {
7
7
  params?: Record<string, string | number | boolean | null | undefined>;
8
8
  data?: object;
9
9
  }
10
+ /** Controls one option-chain or expiry-discovery operation. */
11
+ export interface OptionDiscoveryOptions {
12
+ /** Stop this operation without canceling work owned by another caller. */
13
+ signal?: AbortSignal;
14
+ }
10
15
  export interface IbkrClientOptions {
11
16
  requestScheduler?: Omit<IbkrRequestSchedulerOptions, "classifyError" | "onTelemetry">;
12
17
  onRequestTelemetry?: (event: IbkrRequestTelemetry) => void;
@@ -244,11 +249,11 @@ export declare class IbkrClient implements BrokerClient, DerivativeDiscoveryClie
244
249
  /** Quote the broker-linked underlying (for example, the Sep NQ future behind QN3). */
245
250
  getDerivativeReferenceQuote(contract: DerivativeContract): Promise<DerivativeReferenceQuote>;
246
251
  /** Discover every listed weekly/monthly expiry in the requested calendar range. */
247
- getOptionExpiries(symbol: string, right: OptionRight, fromDate: string, toDate: string): Promise<string[]>;
252
+ getOptionExpiries(symbol: string, right: OptionRight, fromDate: string, toDate: string, options?: OptionDiscoveryOptions): Promise<string[]>;
248
253
  /** Build one exact-expiry chain with canonical OSI symbols and required pricing/greeks. */
249
- getOptionChain(symbol: string, expiry: string, right?: OptionRight): Promise<OptionMarketQuote[]>;
254
+ getOptionChain(symbol: string, expiry: string, right?: OptionRight, options?: OptionDiscoveryOptions): Promise<OptionMarketQuote[]>;
250
255
  /** Return every qualified contract for one exact expiry and side without hiding sparse data. */
251
- getOptionChainSnapshot(symbol: string, expiry: string, right: OptionRight): Promise<OptionChainSnapshot>;
256
+ getOptionChainSnapshot(symbol: string, expiry: string, right: OptionRight, options?: OptionDiscoveryOptions): Promise<OptionChainSnapshot>;
252
257
  /** Fetch one exact option quote; null means the contract is not listed. */
253
258
  getOptionQuote(input: OptionQuoteRequest): Promise<OptionMarketQuote | null>;
254
259
  /** Resolve a conid back into the canonical OSI-bearing option contract. */
@@ -318,7 +323,7 @@ export declare class IbkrClient implements BrokerClient, DerivativeDiscoveryClie
318
323
  private snapshotVolume;
319
324
  /** Typed wrapper around the raw client's untyped `request()`. */
320
325
  protected sendRequest<T>(input: IbkrRequestInput): Promise<T>;
321
- protected req<T>(input: IbkrRequestInput): Promise<T>;
326
+ protected req<T>(input: IbkrRequestInput, signal?: AbortSignal, onTerminalFailure?: (error: unknown) => void): Promise<T>;
322
327
  private historyRequest;
323
328
  private singleAttemptRequest;
324
329
  private scheduledRequest;
@@ -1 +1 @@
1
- {"version":3,"file":"ibkrClient.d.ts","sourceRoot":"","sources":["../../src/ibkr/ibkrClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ibkrClient.d.ts","sourceRoot":"","sources":["../../src/ibkr/ibkrClient.ts"],"names":[],"mappings":"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"}
@@ -55,7 +55,6 @@ const QUOTE_FIELDS = [
55
55
  "6509", // Market data availability
56
56
  "7762", // Unformatted volume
57
57
  ].join(",");
58
- const OPTION_DISCOVERY_MONTH_CONCURRENCY = 1;
59
58
  const OPTION_SECDEF_INFO_BATCH_SIZE = 8;
60
59
  const OPTION_MARKETDATA_BATCH_SIZE = 100;
61
60
  const DAY_MS = 24 * 60 * 60 * 1000;
@@ -3279,14 +3278,13 @@ export class IbkrClient {
3279
3278
  };
3280
3279
  }
3281
3280
  /** Discover every listed weekly/monthly expiry in the requested calendar range. */
3282
- async getOptionExpiries(symbol, right, fromDate, toDate) {
3281
+ async getOptionExpiries(symbol, right, fromDate, toDate, options = {}) {
3283
3282
  const normalized = symbol.trim().toUpperCase();
3284
3283
  const months = monthCodes(fromDate, toDate);
3285
3284
  const contracts = [];
3286
- for (let index = 0; index < months.length; index += OPTION_DISCOVERY_MONTH_CONCURRENCY) {
3287
- const batch = months.slice(index, index + OPTION_DISCOVERY_MONTH_CONCURRENCY);
3288
- const batchContracts = await Promise.all(batch.map((month) => this.discoverOptions(normalized, month, right)));
3289
- contracts.push(...batchContracts.flatMap((result) => result.contracts));
3285
+ for (const month of months) {
3286
+ const result = await this.discoverOptions(normalized, month, right, options);
3287
+ contracts.push(...result.contracts);
3290
3288
  }
3291
3289
  return [
3292
3290
  ...new Set(contracts
@@ -3295,10 +3293,10 @@ export class IbkrClient {
3295
3293
  ].sort();
3296
3294
  }
3297
3295
  /** Build one exact-expiry chain with canonical OSI symbols and required pricing/greeks. */
3298
- async getOptionChain(symbol, expiry, right) {
3296
+ async getOptionChain(symbol, expiry, right, options = {}) {
3299
3297
  const month = monthCode(expiry);
3300
3298
  const normalized = symbol.trim().toUpperCase();
3301
- const discovery = await this.discoverOptions(normalized, month, right);
3299
+ const discovery = await this.discoverOptions(normalized, month, right, options);
3302
3300
  const contracts = discovery.contracts.filter((contract) => contract.expiry === expiry && (right === undefined || contract.right === right));
3303
3301
  if (!contracts.length) {
3304
3302
  throw new Error(`IBKR returned no option contracts for ${symbol} ${expiry}`);
@@ -3306,6 +3304,7 @@ export class IbkrClient {
3306
3304
  const quoted = await this.fetchOptionQuotes(contracts, {
3307
3305
  allowIncomplete: true,
3308
3306
  telemetry: { symbol: normalized, month, right: right ?? null },
3307
+ ...(options.signal === undefined ? {} : { signal: options.signal }),
3309
3308
  });
3310
3309
  if (!quoted.length) {
3311
3310
  throw new Error(`IBKR returned no usable option quotes for ${symbol} ${expiry}`);
@@ -3313,19 +3312,15 @@ export class IbkrClient {
3313
3312
  return quoted;
3314
3313
  }
3315
3314
  /** Return every qualified contract for one exact expiry and side without hiding sparse data. */
3316
- async getOptionChainSnapshot(symbol, expiry, right) {
3315
+ async getOptionChainSnapshot(symbol, expiry, right, options = {}) {
3317
3316
  const month = monthCode(expiry);
3318
3317
  const normalized = symbol.trim().toUpperCase();
3319
- const discovery = await this.discoverOptions(normalized, month, right);
3318
+ const discovery = await this.discoverOptions(normalized, month, right, options);
3320
3319
  const contracts = discovery.contracts.filter((contract) => contract.expiry === expiry);
3321
3320
  if (!contracts.length) {
3322
3321
  throw new Error(`IBKR returned no ${right} option contracts for ${symbol} ${expiry}`);
3323
3322
  }
3324
- return this.fetchOptionChainSnapshot(contracts, discovery.malformedDefinitionCount, {
3325
- symbol: normalized,
3326
- month,
3327
- right,
3328
- });
3323
+ return this.fetchOptionChainSnapshot(contracts, discovery.malformedDefinitionCount, { symbol: normalized, month, right }, options.signal);
3329
3324
  }
3330
3325
  /** Fetch one exact option quote; null means the contract is not listed. */
3331
3326
  async getOptionQuote(input) {
@@ -3579,30 +3574,41 @@ export class IbkrClient {
3579
3574
  }
3580
3575
  return result;
3581
3576
  }
3582
- discoverOptions(symbol, month, right) {
3577
+ discoverOptions(symbol, month, right, options = {}) {
3583
3578
  const normalized = symbol.trim().toUpperCase();
3579
+ if (options.signal !== undefined) {
3580
+ return this.loadOptionContracts(normalized, month, right, options.signal);
3581
+ }
3584
3582
  const key = `${normalized}:${month}:${right ?? "*"}`;
3585
- let pending = this.optionDiscovery.get(key);
3586
- if (!pending && right !== undefined) {
3583
+ const cached = this.optionDiscovery.get(key);
3584
+ if (cached !== undefined)
3585
+ return cached;
3586
+ let discovery;
3587
+ if (right !== undefined) {
3587
3588
  const complete = this.optionDiscovery.get(`${normalized}:${month}:*`);
3588
3589
  if (complete !== undefined) {
3589
- pending = complete.then((result) => ({
3590
+ discovery = complete.then((result) => ({
3590
3591
  contracts: result.contracts.filter((contract) => contract.right === right),
3591
3592
  malformedDefinitionCount: result.malformedDefinitionCount,
3592
3593
  }));
3593
3594
  }
3594
3595
  }
3595
- pending ??= this.loadOptionContracts(normalized, month, right);
3596
+ discovery ??= this.loadOptionContracts(normalized, month, right);
3597
+ const pending = discovery.catch((error) => {
3598
+ if (this.optionDiscovery.get(key) === pending)
3599
+ this.optionDiscovery.delete(key);
3600
+ throw error;
3601
+ });
3596
3602
  this.optionDiscovery.set(key, pending);
3597
3603
  return pending;
3598
3604
  }
3599
- async loadOptionUnderlying(symbol) {
3605
+ async loadOptionUnderlying(symbol, signal) {
3600
3606
  // This search is load-bearing: IBKR silently returns empty definitions unless the current
3601
3607
  // session has first searched the underlying.
3602
3608
  const search = this.parseSecdefSearchResponse(await this.req({
3603
3609
  path: "iserver/secdef/search",
3604
3610
  params: { symbol },
3605
- }));
3611
+ }, signal));
3606
3612
  const candidates = search.flatMap((item) => {
3607
3613
  if (!isUnknownRecord(item))
3608
3614
  return [];
@@ -3641,110 +3647,134 @@ export class IbkrClient {
3641
3647
  throw new Error(`IBKR lost the selected underlying for ${symbol}`);
3642
3648
  return underlying;
3643
3649
  }
3644
- async loadOptionContracts(symbol, month, right) {
3645
- const { underlying, requests } = await this.withSecdefPriming(async () => {
3646
- const searchStarted = this.requestNow();
3647
- const selectedUnderlying = await this.loadOptionUnderlying(symbol);
3648
- this.emitOptionDiscoveryTelemetry({
3649
- phase: "SEARCH",
3650
- symbol,
3651
- month,
3652
- right: right ?? null,
3653
- durationMs: this.elapsedSince(searchStarted),
3654
- definitionRequestCount: 0,
3655
- snapshotBatchCount: 0,
3656
- });
3657
- const strikesStarted = this.requestNow();
3658
- const strikes = await this.req({
3659
- path: "iserver/secdef/strikes",
3660
- params: { conid: String(selectedUnderlying.conid), sectype: "OPT", month },
3650
+ async loadOptionContracts(symbol, month, right, callerSignal) {
3651
+ const operation = new AbortController();
3652
+ const abortFromCaller = () => {
3653
+ operation.abort(callerSignal?.reason);
3654
+ };
3655
+ if (callerSignal?.aborted)
3656
+ abortFromCaller();
3657
+ else
3658
+ callerSignal?.addEventListener("abort", abortFromCaller, { once: true });
3659
+ try {
3660
+ const { underlying, requests } = await this.withSecdefPriming(async () => {
3661
+ const searchStarted = this.requestNow();
3662
+ const selectedUnderlying = await this.loadOptionUnderlying(symbol, operation.signal);
3663
+ this.emitOptionDiscoveryTelemetry({
3664
+ phase: "SEARCH",
3665
+ symbol,
3666
+ month,
3667
+ right: right ?? null,
3668
+ durationMs: this.elapsedSince(searchStarted),
3669
+ definitionRequestCount: 0,
3670
+ snapshotBatchCount: 0,
3671
+ });
3672
+ const strikesStarted = this.requestNow();
3673
+ const strikes = await this.req({
3674
+ path: "iserver/secdef/strikes",
3675
+ params: { conid: String(selectedUnderlying.conid), sectype: "OPT", month },
3676
+ }, operation.signal);
3677
+ this.emitOptionDiscoveryTelemetry({
3678
+ phase: "STRIKES",
3679
+ symbol,
3680
+ month,
3681
+ right: right ?? null,
3682
+ durationMs: this.elapsedSince(strikesStarted),
3683
+ definitionRequestCount: 0,
3684
+ snapshotBatchCount: 0,
3685
+ });
3686
+ const callStrikes = strikes.call ?? [];
3687
+ const putStrikes = strikes.put ?? [];
3688
+ if (callStrikes.length === 0 && putStrikes.length === 0) {
3689
+ throw new Error(`IBKR returned empty option strikes for ${symbol} ${month} after secdef/search priming`);
3690
+ }
3691
+ const definitionRequests = [
3692
+ ...(right === undefined || right === "C"
3693
+ ? callStrikes.map((strike) => ({ strike, right: "C" }))
3694
+ : []),
3695
+ ...(right === undefined || right === "P"
3696
+ ? putStrikes.map((strike) => ({ strike, right: "P" }))
3697
+ : []),
3698
+ ];
3699
+ return { underlying: selectedUnderlying, requests: definitionRequests };
3661
3700
  });
3701
+ const definitionsStarted = this.requestNow();
3702
+ const contracts = [];
3703
+ let malformedDefinitionCount = 0;
3704
+ for (const batch of chunks(requests, OPTION_SECDEF_INFO_BATCH_SIZE)) {
3705
+ let responses;
3706
+ try {
3707
+ responses = await Promise.all(batch.map(({ strike, right: requestRight }) => this.req({
3708
+ path: "iserver/secdef/info",
3709
+ params: {
3710
+ conid: String(underlying.conid),
3711
+ sectype: "OPT",
3712
+ month,
3713
+ strike,
3714
+ right: requestRight,
3715
+ },
3716
+ }, operation.signal, (error) => {
3717
+ operation.abort(error);
3718
+ })));
3719
+ }
3720
+ catch (error) {
3721
+ operation.abort(error);
3722
+ throw error;
3723
+ }
3724
+ for (const response of responses) {
3725
+ if (!Array.isArray(response)) {
3726
+ throw new Error(`IBKR returned malformed option definitions for ${symbol} ${month}`);
3727
+ }
3728
+ for (const raw of response) {
3729
+ if (!isUnknownRecord(raw)) {
3730
+ malformedDefinitionCount += 1;
3731
+ continue;
3732
+ }
3733
+ let contract;
3734
+ try {
3735
+ contract = normalizeOptionContract({
3736
+ conid: typeof raw["conid"] === "number" ? raw["conid"] : undefined,
3737
+ symbol: typeof raw["symbol"] === "string" ? raw["symbol"] : underlying.symbol,
3738
+ maturityDate: typeof raw["maturityDate"] === "string" ? raw["maturityDate"] : undefined,
3739
+ right: typeof raw["right"] === "string" ? raw["right"] : undefined,
3740
+ strike: typeof raw["strike"] === "string" || typeof raw["strike"] === "number"
3741
+ ? raw["strike"]
3742
+ : undefined,
3743
+ });
3744
+ }
3745
+ catch {
3746
+ malformedDefinitionCount += 1;
3747
+ continue;
3748
+ }
3749
+ if (contract)
3750
+ contracts.push(contract);
3751
+ else
3752
+ malformedDefinitionCount += 1;
3753
+ }
3754
+ }
3755
+ }
3662
3756
  this.emitOptionDiscoveryTelemetry({
3663
- phase: "STRIKES",
3757
+ phase: "DEFINITIONS",
3664
3758
  symbol,
3665
3759
  month,
3666
3760
  right: right ?? null,
3667
- durationMs: this.elapsedSince(strikesStarted),
3668
- definitionRequestCount: 0,
3761
+ durationMs: this.elapsedSince(definitionsStarted),
3762
+ definitionRequestCount: requests.length,
3669
3763
  snapshotBatchCount: 0,
3670
3764
  });
3671
- const callStrikes = strikes.call ?? [];
3672
- const putStrikes = strikes.put ?? [];
3673
- if (callStrikes.length === 0 && putStrikes.length === 0) {
3674
- throw new Error(`IBKR returned empty option strikes for ${symbol} ${month} after secdef/search priming`);
3675
- }
3676
- const definitionRequests = [
3677
- ...(right === undefined || right === "C"
3678
- ? callStrikes.map((strike) => ({ strike, right: "C" }))
3679
- : []),
3680
- ...(right === undefined || right === "P"
3681
- ? putStrikes.map((strike) => ({ strike, right: "P" }))
3682
- : []),
3683
- ];
3684
- return { underlying: selectedUnderlying, requests: definitionRequests };
3685
- });
3686
- const definitionsStarted = this.requestNow();
3687
- const responses = await Promise.all(requests.map(({ strike, right: requestRight }) => this.req({
3688
- path: "iserver/secdef/info",
3689
- params: {
3690
- conid: String(underlying.conid),
3691
- sectype: "OPT",
3692
- month,
3693
- strike,
3694
- right: requestRight,
3695
- },
3696
- })));
3697
- this.emitOptionDiscoveryTelemetry({
3698
- phase: "DEFINITIONS",
3699
- symbol,
3700
- month,
3701
- right: right ?? null,
3702
- durationMs: this.elapsedSince(definitionsStarted),
3703
- definitionRequestCount: requests.length,
3704
- snapshotBatchCount: 0,
3705
- });
3706
- if (requests.length === 0)
3707
- return { contracts: [], malformedDefinitionCount: 0 };
3708
- const contracts = [];
3709
- let malformedDefinitionCount = 0;
3710
- for (const response of responses) {
3711
- if (!Array.isArray(response)) {
3712
- throw new Error(`IBKR returned malformed option definitions for ${symbol} ${month}`);
3713
- }
3714
- for (const raw of response) {
3715
- if (!isUnknownRecord(raw)) {
3716
- malformedDefinitionCount += 1;
3717
- continue;
3718
- }
3719
- let contract;
3720
- try {
3721
- contract = normalizeOptionContract({
3722
- conid: typeof raw["conid"] === "number" ? raw["conid"] : undefined,
3723
- symbol: typeof raw["symbol"] === "string" ? raw["symbol"] : underlying.symbol,
3724
- maturityDate: typeof raw["maturityDate"] === "string" ? raw["maturityDate"] : undefined,
3725
- right: typeof raw["right"] === "string" ? raw["right"] : undefined,
3726
- strike: typeof raw["strike"] === "string" || typeof raw["strike"] === "number"
3727
- ? raw["strike"]
3728
- : undefined,
3729
- });
3730
- }
3731
- catch {
3732
- malformedDefinitionCount += 1;
3733
- continue;
3734
- }
3735
- if (contract)
3736
- contracts.push(contract);
3737
- else
3738
- malformedDefinitionCount += 1;
3765
+ if (requests.length === 0)
3766
+ return { contracts: [], malformedDefinitionCount: 0 };
3767
+ const unique = [...new Map(contracts.map((contract) => [contract.conid, contract])).values()];
3768
+ if (!unique.length) {
3769
+ throw new Error(`IBKR returned no usable option definitions for ${symbol} ${month} (${String(malformedDefinitionCount)} malformed)`);
3739
3770
  }
3771
+ return { contracts: unique, malformedDefinitionCount };
3740
3772
  }
3741
- const unique = [...new Map(contracts.map((contract) => [contract.conid, contract])).values()];
3742
- if (!unique.length) {
3743
- throw new Error(`IBKR returned no usable option definitions for ${symbol} ${month} (${String(malformedDefinitionCount)} malformed)`);
3773
+ finally {
3774
+ callerSignal?.removeEventListener("abort", abortFromCaller);
3744
3775
  }
3745
- return { contracts: unique, malformedDefinitionCount };
3746
3776
  }
3747
- async fetchOptionChainSnapshot(contracts, malformedDefinitionCount, telemetry) {
3777
+ async fetchOptionChainSnapshot(contracts, malformedDefinitionCount, telemetry, signal) {
3748
3778
  const fields = [
3749
3779
  "bid",
3750
3780
  "ask",
@@ -3756,7 +3786,7 @@ export class IbkrClient {
3756
3786
  "timestamp",
3757
3787
  ];
3758
3788
  const missingFieldCounts = Object.fromEntries(fields.map((field) => [field, 0]));
3759
- const quotes = await this.fetchNullableOptionQuotes(contracts, telemetry);
3789
+ const quotes = await this.fetchNullableOptionQuotes(contracts, telemetry, signal);
3760
3790
  for (const quote of quotes) {
3761
3791
  for (const field of fields) {
3762
3792
  if (quote[field] === null)
@@ -3771,7 +3801,7 @@ export class IbkrClient {
3771
3801
  };
3772
3802
  return { quotes, diagnostics };
3773
3803
  }
3774
- async fetchNullableOptionQuotes(contracts, telemetry) {
3804
+ async fetchNullableOptionQuotes(contracts, telemetry, signal) {
3775
3805
  const quotes = [];
3776
3806
  const batches = chunks(contracts, OPTION_MARKETDATA_BATCH_SIZE);
3777
3807
  const snapshotsStarted = this.requestNow();
@@ -3780,12 +3810,9 @@ export class IbkrClient {
3780
3810
  conids: batch.map((contract) => contract.conid).join(","),
3781
3811
  fields: OPTION_QUOTE_FIELDS,
3782
3812
  };
3783
- await this.req({ path: "iserver/marketdata/snapshot", params });
3813
+ await this.req({ path: "iserver/marketdata/snapshot", params }, signal);
3784
3814
  await this.wait(2000);
3785
- const response = await this.req({
3786
- path: "iserver/marketdata/snapshot",
3787
- params,
3788
- });
3815
+ const response = await this.req({ path: "iserver/marketdata/snapshot", params }, signal);
3789
3816
  if (!Array.isArray(response)) {
3790
3817
  throw new Error("IBKR returned malformed option market-data snapshots");
3791
3818
  }
@@ -3826,10 +3853,10 @@ export class IbkrClient {
3826
3853
  return quotes;
3827
3854
  }
3828
3855
  async fetchOptionQuotes(contracts, options = {}) {
3829
- const { allowIncomplete = false, telemetry } = options;
3856
+ const { allowIncomplete = false, telemetry, signal } = options;
3830
3857
  const result = [];
3831
3858
  const skipped = [];
3832
- for (const quote of await this.fetchNullableOptionQuotes(contracts, telemetry)) {
3859
+ for (const quote of await this.fetchNullableOptionQuotes(contracts, telemetry, signal)) {
3833
3860
  if (quote.bid === null || quote.ask === null || quote.delta === null) {
3834
3861
  if (allowIncomplete) {
3835
3862
  skipped.push(quote.symbol);
@@ -4516,8 +4543,8 @@ export class IbkrClient {
4516
4543
  throw this.normalizeHttpError(error);
4517
4544
  }
4518
4545
  }
4519
- req(input) {
4520
- return this.scheduledRequest(input, "SAFE_READ");
4546
+ req(input, signal, onTerminalFailure) {
4547
+ return this.scheduledRequest(input, "SAFE_READ", signal, onTerminalFailure);
4521
4548
  }
4522
4549
  historyRequest(input) {
4523
4550
  return this.scheduledRequest(input, "PRICE_HISTORY");
@@ -4525,13 +4552,15 @@ export class IbkrClient {
4525
4552
  singleAttemptRequest(input) {
4526
4553
  return this.scheduledRequest(input, "SINGLE_ATTEMPT");
4527
4554
  }
4528
- scheduledRequest(input, retryPolicy) {
4555
+ scheduledRequest(input, retryPolicy, signal, onTerminalFailure) {
4529
4556
  return this.requestScheduler.schedule({
4530
4557
  endpoint: this.requestEndpoint(input.path),
4531
4558
  priority: this.requestPriority(input.path),
4532
4559
  secdefInfo: input.path === "iserver/secdef/info",
4533
4560
  retryable: retryPolicy !== "SINGLE_ATTEMPT",
4534
4561
  retryServerErrors: retryPolicy === "PRICE_HISTORY",
4562
+ ...(signal === undefined ? {} : { signal }),
4563
+ ...(onTerminalFailure === undefined ? {} : { onTerminalFailure }),
4535
4564
  }, async () => {
4536
4565
  try {
4537
4566
  return await this.sendRequest(input);