@usherlabs/cex-broker 0.2.48 → 0.2.49

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.
@@ -1,3 +1,6 @@
1
+ import { LogLayer } from "loglayer";
2
+ export declare function attachOtelLogTransport(): void;
3
+ export declare function detachOtelLogTransport(): void;
1
4
  declare const log: {
2
5
  trace: (...args: unknown[]) => void;
3
6
  debug: (...args: unknown[]) => void;
@@ -5,5 +8,6 @@ declare const log: {
5
8
  warn: (...args: unknown[]) => void;
6
9
  error: (...args: unknown[]) => void;
7
10
  fatal: (...args: unknown[]) => void;
11
+ withMetadata: LogLayer["withMetadata"];
8
12
  };
9
13
  export { log };
@@ -16,7 +16,7 @@ export type CryptoHftDataCapabilityProfile = Readonly<{
16
16
  snapshotGrouping: "event_time_last_update_id_object" | "event_time_final_update_id_object";
17
17
  sequenceSemantics: "binance_u_U_pu" | "okx_seq_id_prev_seq_id";
18
18
  constructionModes: readonly ["sampled_top_n_snapshot"];
19
- sourcePolicies: readonly ["authoritative_window"];
19
+ sourcePolicies: readonly ("authoritative_window" | "fill_gaps")[];
20
20
  }>;
21
21
  export declare const CRYPTOHFTDATA_BINANCE_SPOT_BTCUSDT_PROFILE: CryptoHftDataCapabilityProfile;
22
22
  export declare const CRYPTOHFTDATA_OKX_SPOT_ARBUSDT_PROFILE: CryptoHftDataCapabilityProfile;
@@ -53,6 +53,7 @@ export type ReconstructedCryptoHftBook = {
53
53
  };
54
54
  export declare function cryptoHftDataCapabilityFor(request: MarketDataVendorBackfillRequest, profiles?: readonly CryptoHftDataCapabilityProfile[]): ProviderCapability | undefined;
55
55
  export declare function enumerateCryptoHftDataObjects(request: MarketDataVendorBackfillRequest, providerExchangeId: string, resolvedSymbol: string): string[];
56
+ export declare function providerAcquisitionRequest(request: MarketDataVendorBackfillRequest): MarketDataVendorBackfillRequest;
56
57
  export declare function reconstructCryptoHftDataOrderBooks(request: MarketDataVendorBackfillRequest, inputRows: readonly CryptoHftDataOrderBookRow[], profile?: CryptoHftDataCapabilityProfile): ReconstructedCryptoHftBook[];
57
58
  export declare function decodeCryptoHftParquetZstd(bytes: Uint8Array): Promise<Record<string, unknown>[]>;
58
59
  type CryptoHftDataAdapterOptions = {
@@ -1,8 +1,9 @@
1
- export declare const CAPABILITY_POLICY_ID: "market-data-vendor-backfill-capabilities/v1";
1
+ export declare const LEGACY_CAPABILITY_POLICY_ID: "market-data-vendor-backfill-capabilities/v1";
2
+ export declare const CAPABILITY_POLICY_ID: "market-data-vendor-backfill-capabilities/v2";
2
3
  export declare const RESOURCE_POLICY_ID: "market-data-vendor-backfill-resources/v1";
3
4
  export declare const ADAPTER_POLICY_ID: "cryptohftdata-orderbook-adapter/v1";
4
5
  export declare const ACQUISITION_POLICY_ID: "cryptohftdata-hourly-acquisition/v1";
5
- export declare const CAPABILITY_POLICY: Readonly<{
6
+ export declare const LEGACY_CAPABILITY_POLICY: Readonly<{
6
7
  policy_sha256: string;
7
8
  policy_id: "market-data-vendor-backfill-capabilities/v1";
8
9
  provider: "cryptohftdata";
@@ -28,6 +29,32 @@ export declare const CAPABILITY_POLICY: Readonly<{
28
29
  readonly max_depth: 400;
29
30
  }];
30
31
  }>;
32
+ export declare const CAPABILITY_POLICY: Readonly<{
33
+ policy_sha256: string;
34
+ policy_id: "market-data-vendor-backfill-capabilities/v2";
35
+ profiles: {
36
+ source_policies: readonly ["authoritative_window", "fill_gaps"];
37
+ exchange: "okx";
38
+ market_type: "spot";
39
+ feed: "ORDERBOOK";
40
+ canonical_trading_pair: "ARB-USDT";
41
+ provider_exchange_id: "okx_spot";
42
+ resolved_symbol: "ARB-USDT";
43
+ construction_modes: readonly ["sampled_top_n_snapshot"];
44
+ max_depth: 400;
45
+ }[];
46
+ provider: "cryptohftdata";
47
+ adapter_policy: {
48
+ readonly policy_id: "cryptohftdata-orderbook-adapter/v1";
49
+ readonly adapter_version: "cryptohftdata-orderbook/v2";
50
+ };
51
+ acquisition_policy: {
52
+ readonly policy_id: "cryptohftdata-hourly-acquisition/v1";
53
+ readonly object_granularity: "utc_hour";
54
+ readonly authentication: "bearer";
55
+ readonly initialization_lookback_ms: 0;
56
+ };
57
+ }>;
31
58
  export declare const RESOURCE_POLICY: Readonly<{
32
59
  policy_sha256: string;
33
60
  policy_id: "market-data-vendor-backfill-resources/v1";
@@ -11,6 +11,7 @@ export type SemanticPromotionEvidence = {
11
11
  suffixDigestAfter: string;
12
12
  seamVerified: boolean;
13
13
  exporterCompatible: boolean;
14
+ coverageSourceTimesMs?: readonly number[];
14
15
  };
15
16
  export type SemanticPromotionResult = {
16
17
  passed: boolean;
@@ -37,6 +37,7 @@ declare abstract class BaseOtelSignal<TProvider> {
37
37
  private readonly signal;
38
38
  private provider;
39
39
  private isEnabled;
40
+ private closePromise;
40
41
  private readonly serviceName;
41
42
  protected constructor(config: OtelConfig | undefined, signal: "metrics" | "logs");
42
43
  protected abstract createProvider(endpoint: string, serviceName: string, appendSignalPath: boolean): TProvider;
package/dist/index.js CHANGED
@@ -289048,16 +289048,20 @@ var tslogLogger = new Logger({
289048
289048
  minLevel: process.env.LOG_LEVEL === "debug" ? 0 : 3
289049
289049
  });
289050
289050
  var baseLogger = new LogLayer({
289051
- transport: [
289052
- new TsLogTransport({ id: "tslog", logger: tslogLogger }),
289053
- new OpenTelemetryTransport({
289054
- id: "otel",
289055
- enabled: true
289056
- })
289057
- ],
289051
+ transport: [new TsLogTransport({ id: "tslog", logger: tslogLogger })],
289058
289052
  plugins: [openTelemetryPlugin()],
289059
289053
  errorSerializer: serializeError
289060
289054
  });
289055
+ var OTEL_TRANSPORT_ID = "otel";
289056
+ function attachOtelLogTransport() {
289057
+ baseLogger.addTransport(new OpenTelemetryTransport({
289058
+ id: OTEL_TRANSPORT_ID,
289059
+ enabled: true
289060
+ }));
289061
+ }
289062
+ function detachOtelLogTransport() {
289063
+ baseLogger.removeTransport(OTEL_TRANSPORT_ID);
289064
+ }
289061
289065
  if (process.env.LOG_LEVEL !== "debug") {
289062
289066
  baseLogger.setLevel("info");
289063
289067
  }
@@ -293484,11 +293488,14 @@ var import_sdk_metrics = __toESM(require_src9(), 1);
293484
293488
  var DEFAULT_SERVICE = "cex-broker";
293485
293489
  var DEFAULT_OTLP_PORT = 4318;
293486
293490
  var EXPORT_INTERVAL_MS = 5000;
293491
+ var EXPORT_TIMEOUT_MS = 2000;
293492
+ var SHUTDOWN_TIMEOUT_MS = 3000;
293487
293493
 
293488
293494
  class BaseOtelSignal {
293489
293495
  signal;
293490
293496
  provider = null;
293491
293497
  isEnabled = false;
293498
+ closePromise = null;
293492
293499
  serviceName;
293493
293500
  constructor(config, signal) {
293494
293501
  this.signal = signal;
@@ -293520,19 +293527,35 @@ class BaseOtelSignal {
293520
293527
  isOtelEnabled() {
293521
293528
  return this.isEnabled && this.provider !== null;
293522
293529
  }
293523
- async close() {
293524
- if (!this.provider) {
293525
- return;
293526
- }
293527
- try {
293528
- await this.shutdownProvider(this.provider);
293529
- log.info(`OTel ${this.signal} provider shut down`);
293530
- } catch (error) {
293531
- log.error(`Error shutting down OTel ${this.signal} provider:`, error);
293532
- }
293530
+ close() {
293531
+ if (this.closePromise)
293532
+ return this.closePromise;
293533
+ const provider = this.provider;
293533
293534
  this.provider = null;
293534
293535
  this.isEnabled = false;
293535
293536
  this.onProviderClosed();
293537
+ if (!provider) {
293538
+ this.closePromise = Promise.resolve();
293539
+ return this.closePromise;
293540
+ }
293541
+ const shutdown = Promise.resolve().then(() => this.shutdownProvider(provider)).then(() => {
293542
+ log.info(`OTel ${this.signal} provider shut down`);
293543
+ }, (error) => {
293544
+ log.error(`Error shutting down OTel ${this.signal} provider:`, error);
293545
+ });
293546
+ let deadlineTimer;
293547
+ const deadline = new Promise((resolve) => {
293548
+ deadlineTimer = setTimeout(() => {
293549
+ deadlineTimer = undefined;
293550
+ log.warn(`OTel ${this.signal} provider shutdown exceeded ${SHUTDOWN_TIMEOUT_MS}ms; continuing shutdown`);
293551
+ resolve();
293552
+ }, SHUTDOWN_TIMEOUT_MS);
293553
+ });
293554
+ this.closePromise = Promise.race([shutdown, deadline]).finally(() => {
293555
+ if (deadlineTimer !== undefined)
293556
+ clearTimeout(deadlineTimer);
293557
+ });
293558
+ return this.closePromise;
293536
293559
  }
293537
293560
  }
293538
293561
  function toAttributes(labels, service) {
@@ -293555,11 +293578,13 @@ class OtelMetrics extends BaseOtelSignal {
293555
293578
  }
293556
293579
  createProvider(endpoint, serviceName, appendSignalPath) {
293557
293580
  const exporter = new import_exporter_metrics_otlp_http.OTLPMetricExporter({
293558
- url: appendOtlpPath(endpoint, "metrics", appendSignalPath)
293581
+ url: appendOtlpPath(endpoint, "metrics", appendSignalPath),
293582
+ timeoutMillis: EXPORT_TIMEOUT_MS
293559
293583
  });
293560
293584
  const reader = new import_sdk_metrics.PeriodicExportingMetricReader({
293561
293585
  exporter,
293562
- exportIntervalMillis: EXPORT_INTERVAL_MS
293586
+ exportIntervalMillis: EXPORT_INTERVAL_MS,
293587
+ exportTimeoutMillis: EXPORT_TIMEOUT_MS
293563
293588
  });
293564
293589
  const resource = import_resources.resourceFromAttributes({
293565
293590
  "service.name": serviceName
@@ -293680,15 +293705,23 @@ class OtelMetrics extends BaseOtelSignal {
293680
293705
  }
293681
293706
 
293682
293707
  class OtelLogs extends BaseOtelSignal {
293683
- logger = null;
293708
+ logger;
293684
293709
  constructor(config) {
293685
293710
  super(config, "logs");
293711
+ const provider = this.getProvider();
293712
+ this.logger = provider?.getLogger("cex-broker-logs", "1.0.0") ?? null;
293713
+ if (provider) {
293714
+ attachOtelLogTransport();
293715
+ }
293686
293716
  }
293687
293717
  createProvider(endpoint, serviceName, appendSignalPath) {
293688
293718
  const exporter = new import_exporter_logs_otlp_http.OTLPLogExporter({
293689
- url: appendOtlpPath(endpoint, "logs", appendSignalPath)
293719
+ url: appendOtlpPath(endpoint, "logs", appendSignalPath),
293720
+ timeoutMillis: EXPORT_TIMEOUT_MS
293721
+ });
293722
+ const processor = new import_sdk_logs.BatchLogRecordProcessor(exporter, {
293723
+ exportTimeoutMillis: EXPORT_TIMEOUT_MS
293690
293724
  });
293691
- const processor = new import_sdk_logs.BatchLogRecordProcessor(exporter);
293692
293725
  const resource = import_resources.resourceFromAttributes({
293693
293726
  "service.name": serviceName
293694
293727
  });
@@ -293699,12 +293732,12 @@ class OtelLogs extends BaseOtelSignal {
293699
293732
  }
293700
293733
  onProviderCreated(provider) {
293701
293734
  import_api_logs3.logs.setGlobalLoggerProvider(provider);
293702
- this.logger = provider.getLogger("cex-broker-logs", "1.0.0");
293703
293735
  }
293704
293736
  shutdownProvider(provider) {
293705
- return provider.forceFlush().then(() => provider.shutdown());
293737
+ return provider.shutdown();
293706
293738
  }
293707
293739
  onProviderClosed() {
293740
+ detachOtelLogTransport();
293708
293741
  this.logger = null;
293709
293742
  }
293710
293743
  emit(record) {
@@ -313101,12 +313134,7 @@ class CEXBroker {
313101
313134
  if (this.brokerArchiver) {
313102
313135
  await this.brokerArchiver.close();
313103
313136
  }
313104
- if (this.otelMetrics) {
313105
- await this.otelMetrics.close();
313106
- }
313107
- if (this.otelLogs) {
313108
- await this.otelLogs.close();
313109
- }
313137
+ await Promise.all([this.otelMetrics?.close(), this.otelLogs?.close()]);
313110
313138
  }
313111
313139
  async run() {
313112
313140
  const marketArchiveState = resolveMarketCaptureArchiveState({
@@ -313224,4 +313252,4 @@ export {
313224
313252
  CEXBroker as default
313225
313253
  };
313226
313254
 
313227
- //# debugId=6D2AB1C4F731307F64756E2164756E21
313255
+ //# debugId=D97F25782E1185C764756E2164756E21