xbbg 1.1.1
Added
@xbbg/core: recipe helpers exposed on the JSEngine: Eleven recipe methods surfaced through the NAPI bindings —yas,preferreds,corporateBonds,futTicker,activeFutures,cdxTicker,activeCdx,dividend,turnover,etfHoldings,currencyConversion— wrapping the correspondingxbbg_recipesentry points. Returns ArrowTableby default withBackend.JSON/Backend.POLARSopt-in viaoptions.backend; errors route through the standardBlpErrorhierarchy. Ships with TypeScript definitions (YasOptions,PreferredsOptions,CorporateBondsOptions,FuturesResolveOptions,ActiveCdxOptions,DividendOptions,TurnoverOptions,EtfHoldingsOptions,RecipeBackendOptions), README usage examples, and smoke-test coverage injs-xbbg/test.js.- Prebuilt cross-platform offline bundles for
@xbbg/core(scripts/build-offline-bundle.js): Packages@xbbg/coreplus the prebuilt@xbbg/core-<label>native addon into a hoistedbundle/node_modulestree alongside source tarballs for air-gapped installs.js_github_release.ymlgains apack-offline-bundlesjob that attachesxbbg-offline-<label>-<version>.zipto the GitHub release (covered by the existingvalidate-release-payloadscanner for Bloomberg SDK leakage);ci-rust.ymlmirrors the job per-commit with a 7-day artifact retention for downstream consumers.
Changed
EngineConfig.request_timeout_msdefault changed from60_000to0(disabled): The previous 60s hard cap was self-inflicting timeouts on legitimately long requests — e.g. a full-daybdtickfor a liquid future routinely exceeds 60s on the Bloomberg side, so the worker was cancelling healthy requests and surfacing aBlpTimeoutErrorto the caller. The enforcement machinery is unchanged; callers who want a hard upper bound must now opt in explicitly by passingrequest_timeout_ms=<ms>(Python),requestTimeoutMs(NAPI), orPyEngineConfig.request_timeout_ms(pyo3).
Fixed
-
bdtick/bdibsilently droppedoverrides=kwargs (#295):_build_abdtick_planand_build_abdib_planinpy-xbbg/src/xbbg/blp.pywere doingelements, _ = await _aroute_kwargs(...)— the_threw away the overrides list before the request reached the Rust engine. Other endpoints (bdp/bdh/bds/beqs/bport) capture both; only the two intraday builders discarded overrides. Now forwarded. Note that Bloomberg'sIntradayTickRequest/IntradayBarRequestschemas have nooverridessub-element, so forwarded overrides now surface as a Bloombergelement-not-founderror instead of being silently no-oped; for response-size limits use the top-levelmaxDataPointskwarg instead. -
bdib+maxDataPointsfell back to the generic flattener, losing the typed schema:crates/xbbg-async/src/engine/worker.rsrouted intraday-bar / tick requests throughGenericStatewhenever any user-supplied element was set, on the assumption that extra elements imply extra response columns. That holds for tickinclude*flags (condition codes, exchange codes, etc. which add per-tick columns), but not for behavior-only elements likemaxDataPoints,maxDataPointsOrigin,gapFillInitialBar, oradjustment*— those don't change the response shape. Consequence:blp.bdib(..., maxDataPoints=1)returned[path, type, value_str, value_num]instead of the typed[ticker, time, open, high, low, close, volume, numEvents], andblp.bdtick(..., maxDataPoints=1)returned 6 rows instead of 1 (the generic extractor exploded one tick into per-field rows). Fallback removed entirely forIntradayBar(no column-adding elements exist onIntradayBarRequest); narrowed toinclude*keys onIntradayTick. -
Offline-bundle packing rejected by npm with
EBADPLATFORM:npm installin thepack-offline-bundlesjob runs on a Linux runner but pulls in@xbbg/core-<label>packages that declareos/cpufor their target platform (e.g.win32/x64).scripts/build-offline-bundle.jsnow passes--forceso the cross-platform install succeeds; the bundle is never executed on the install host, so the platform check is safe to skip. -
bdp/bdhsilently returned long-shape output forformat='semi_long'(#296, #299):crates/xbbg-async/src/engine/worker.rshad no"semi_long"arm in its format-string match — theRefDatabranch hardcodedOutputFormat::Longand only variedLongMode; theHistDatabranch only recognised"wide". Soblp.bdp(..., format='semi_long')returned[ticker, field, value]instead of the documented[ticker, <field1>, <field2>, …]pivoted shape, andblp.bdh(..., format='semi_long')returned[ticker, date, field, value]instead of[ticker, date, <field1>, …]. TheFormat::SemiLongenum inservices.rsparsed"semi_long"round-trip correctly; the break was purely in the worker routing. Fixed by mapping"semi_long" | "wide"→OutputFormat::Widein both arms. Regression coverage: newTestOutputFormatsclass inpy-xbbg/tests/live/test_api.pyasserts column shape for all fourFormatvariants (long,semi_long,long_typed,long_metadata) on bothbdpandbdh, verified live against Bloomberg.
Full Changelog: v1.1.0...v1.1.1