@binance/common 1.2.0 → 1.2.2

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/dist/index.d.mts CHANGED
@@ -583,7 +583,34 @@ declare function setFlattenedQueryParams(urlSearchParams: URLSearchParams, param
583
583
  * @param objects - One or more objects to flatten into the URL's search parameters.
584
584
  */
585
585
  declare const setSearchParams: (url: URL, ...objects: Record<string, unknown>[]) => void;
586
+ /**
587
+ * Converts a URL object to a full path string, including pathname, search parameters, and hash.
588
+ *
589
+ * @param url The URL object to convert to a path string.
590
+ * @returns A complete path string representation of the URL.
591
+ */
586
592
  declare const toPathString: (url: URL) => string;
593
+ /**
594
+ * A type utility that transforms numbers in a type to their string representation when in scientific notation,
595
+ * while preserving the structure of arrays and objects.
596
+ *
597
+ * @template T The input type to be transformed
598
+ * @returns A type where numbers potentially become strings, maintaining the original type's structure
599
+ */
600
+ type ScientificToString<T> = T extends number ? string | number : T extends Array<infer U> ? Array<ScientificToString<U>> : T extends object ? {
601
+ [K in keyof T]: ScientificToString<T[K]>;
602
+ } : T;
603
+ /**
604
+ * Normalizes scientific notation numbers in an object or array to a fixed number of decimal places.
605
+ *
606
+ * This function recursively processes objects, arrays, and numbers, converting scientific notation
607
+ * to a fixed decimal representation. Non-numeric values are left unchanged.
608
+ *
609
+ * @template T The type of the input object or value
610
+ * @param obj The object, array, or value to normalize
611
+ * @returns A new object or value with scientific notation numbers normalized
612
+ */
613
+ declare function normalizeScientificNumbers<T>(obj: T): ScientificToString<T>;
587
614
  /**
588
615
  * Determines whether a request should be retried based on the provided error.
589
616
  *
@@ -667,7 +694,7 @@ declare function buildUserAgent(packageName: string, packageVersion: string): st
667
694
  declare function buildWebsocketAPIMessage(configuration: ConfigurationWebsocketAPI, method: string, payload: WebsocketSendMsgOptions, options: WebsocketSendMsgConfig, skipAuth?: boolean): {
668
695
  id: string;
669
696
  method: string;
670
- params: SendMessageOptions;
697
+ params: Record<string, unknown>;
671
698
  };
672
699
  /**
673
700
  * Sanitizes a header value by checking for and preventing carriage return and line feed characters.
@@ -1052,4 +1079,4 @@ interface WebsocketStream<T> {
1052
1079
  */
1053
1080
  declare function createStreamHandler<T>(websocketBase: WebsocketAPIBase | WebsocketStreamsBase, streamOrId: string, id?: string): WebsocketStream<T>;
1054
1081
 
1055
- export { ALGO_REST_API_PROD_URL, AUTO_INVEST_REST_API_PROD_URL, type AxiosRequestArgs, BadRequestError, C2C_REST_API_PROD_URL, CONVERT_REST_API_PROD_URL, COPY_TRADING_REST_API_PROD_URL, CRYPTO_LOAN_REST_API_PROD_URL, ConfigurationRestAPI, ConfigurationWebsocketAPI, ConfigurationWebsocketStreams, ConnectorClientError, DERIVATIVES_TRADING_COIN_FUTURES_REST_API_PROD_URL, DERIVATIVES_TRADING_COIN_FUTURES_REST_API_TESTNET_URL, DERIVATIVES_TRADING_COIN_FUTURES_WS_API_PROD_URL, DERIVATIVES_TRADING_COIN_FUTURES_WS_API_TESTNET_URL, DERIVATIVES_TRADING_COIN_FUTURES_WS_STREAMS_PROD_URL, DERIVATIVES_TRADING_COIN_FUTURES_WS_STREAMS_TESTNET_URL, DERIVATIVES_TRADING_OPTIONS_REST_API_PROD_URL, DERIVATIVES_TRADING_OPTIONS_WS_STREAMS_PROD_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_PRO_REST_API_PROD_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_PRO_WS_STREAMS_PROD_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_REST_API_PROD_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_REST_API_TESTNET_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_WS_STREAMS_PROD_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_WS_STREAMS_TESTNET_URL, DERIVATIVES_TRADING_USDS_FUTURES_REST_API_PROD_URL, DERIVATIVES_TRADING_USDS_FUTURES_REST_API_TESTNET_URL, DERIVATIVES_TRADING_USDS_FUTURES_WS_API_PROD_URL, DERIVATIVES_TRADING_USDS_FUTURES_WS_API_TESTNET_URL, DERIVATIVES_TRADING_USDS_FUTURES_WS_STREAMS_PROD_URL, DERIVATIVES_TRADING_USDS_FUTURES_WS_STREAMS_TESTNET_URL, DUAL_INVESTMENT_REST_API_PROD_URL, FIAT_REST_API_PROD_URL, ForbiddenError, GIFT_CARD_REST_API_PROD_URL, LogLevel, Logger, MARGIN_TRADING_REST_API_PROD_URL, MARGIN_TRADING_RISK_WS_STREAMS_PROD_URL, MARGIN_TRADING_WS_STREAMS_PROD_URL, MINING_REST_API_PROD_URL, NFT_REST_API_PROD_URL, NetworkError, NotFoundError, type ObjectType, PAY_REST_API_PROD_URL, REBATE_REST_API_PROD_URL, RateLimitBanError, type RequestArgs, RequiredError, type RestApiRateLimit, type RestApiResponse, SIMPLE_EARN_REST_API_PROD_URL, SPOT_REST_API_MARKET_URL, SPOT_REST_API_PROD_URL, SPOT_REST_API_TESTNET_URL, SPOT_WS_API_PROD_URL, SPOT_WS_API_TESTNET_URL, SPOT_WS_STREAMS_MARKET_URL, SPOT_WS_STREAMS_PROD_URL, SPOT_WS_STREAMS_TESTNET_URL, STAKING_REST_API_PROD_URL, SUB_ACCOUNT_REST_API_PROD_URL, type SendMessageOptions, ServerError, TimeUnit, TooManyRequestsError, UnauthorizedError, VIP_LOAN_REST_API_PROD_URL, WALLET_REST_API_PROD_URL, WebsocketAPIBase, type WebsocketApiRateLimit, type WebsocketApiResponse, WebsocketCommon, type WebsocketConnection, WebsocketEventEmitter, type WebsocketSendMsgConfig, type WebsocketSendMsgOptions, type WebsocketStream, WebsocketStreamsBase, assertParamExists, buildQueryString, buildUserAgent, buildWebsocketAPIMessage, clearSignerCache, createStreamHandler, delay, getSignature, getTimestamp, httpRequestFunction, parseCustomHeaders, parseRateLimitHeaders, randomString, removeEmptyValue, replaceWebsocketStreamsPlaceholders, sanitizeHeaderValue, sendRequest, setFlattenedQueryParams, setSearchParams, shouldRetryRequest, sortObject, toPathString, validateTimeUnit };
1082
+ export { ALGO_REST_API_PROD_URL, AUTO_INVEST_REST_API_PROD_URL, type AxiosRequestArgs, BadRequestError, C2C_REST_API_PROD_URL, CONVERT_REST_API_PROD_URL, COPY_TRADING_REST_API_PROD_URL, CRYPTO_LOAN_REST_API_PROD_URL, ConfigurationRestAPI, ConfigurationWebsocketAPI, ConfigurationWebsocketStreams, ConnectorClientError, DERIVATIVES_TRADING_COIN_FUTURES_REST_API_PROD_URL, DERIVATIVES_TRADING_COIN_FUTURES_REST_API_TESTNET_URL, DERIVATIVES_TRADING_COIN_FUTURES_WS_API_PROD_URL, DERIVATIVES_TRADING_COIN_FUTURES_WS_API_TESTNET_URL, DERIVATIVES_TRADING_COIN_FUTURES_WS_STREAMS_PROD_URL, DERIVATIVES_TRADING_COIN_FUTURES_WS_STREAMS_TESTNET_URL, DERIVATIVES_TRADING_OPTIONS_REST_API_PROD_URL, DERIVATIVES_TRADING_OPTIONS_WS_STREAMS_PROD_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_PRO_REST_API_PROD_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_PRO_WS_STREAMS_PROD_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_REST_API_PROD_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_REST_API_TESTNET_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_WS_STREAMS_PROD_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_WS_STREAMS_TESTNET_URL, DERIVATIVES_TRADING_USDS_FUTURES_REST_API_PROD_URL, DERIVATIVES_TRADING_USDS_FUTURES_REST_API_TESTNET_URL, DERIVATIVES_TRADING_USDS_FUTURES_WS_API_PROD_URL, DERIVATIVES_TRADING_USDS_FUTURES_WS_API_TESTNET_URL, DERIVATIVES_TRADING_USDS_FUTURES_WS_STREAMS_PROD_URL, DERIVATIVES_TRADING_USDS_FUTURES_WS_STREAMS_TESTNET_URL, DUAL_INVESTMENT_REST_API_PROD_URL, FIAT_REST_API_PROD_URL, ForbiddenError, GIFT_CARD_REST_API_PROD_URL, LogLevel, Logger, MARGIN_TRADING_REST_API_PROD_URL, MARGIN_TRADING_RISK_WS_STREAMS_PROD_URL, MARGIN_TRADING_WS_STREAMS_PROD_URL, MINING_REST_API_PROD_URL, NFT_REST_API_PROD_URL, NetworkError, NotFoundError, type ObjectType, PAY_REST_API_PROD_URL, REBATE_REST_API_PROD_URL, RateLimitBanError, type RequestArgs, RequiredError, type RestApiRateLimit, type RestApiResponse, SIMPLE_EARN_REST_API_PROD_URL, SPOT_REST_API_MARKET_URL, SPOT_REST_API_PROD_URL, SPOT_REST_API_TESTNET_URL, SPOT_WS_API_PROD_URL, SPOT_WS_API_TESTNET_URL, SPOT_WS_STREAMS_MARKET_URL, SPOT_WS_STREAMS_PROD_URL, SPOT_WS_STREAMS_TESTNET_URL, STAKING_REST_API_PROD_URL, SUB_ACCOUNT_REST_API_PROD_URL, type SendMessageOptions, ServerError, TimeUnit, TooManyRequestsError, UnauthorizedError, VIP_LOAN_REST_API_PROD_URL, WALLET_REST_API_PROD_URL, WebsocketAPIBase, type WebsocketApiRateLimit, type WebsocketApiResponse, WebsocketCommon, type WebsocketConnection, WebsocketEventEmitter, type WebsocketSendMsgConfig, type WebsocketSendMsgOptions, type WebsocketStream, WebsocketStreamsBase, assertParamExists, buildQueryString, buildUserAgent, buildWebsocketAPIMessage, clearSignerCache, createStreamHandler, delay, getSignature, getTimestamp, httpRequestFunction, normalizeScientificNumbers, parseCustomHeaders, parseRateLimitHeaders, randomString, removeEmptyValue, replaceWebsocketStreamsPlaceholders, sanitizeHeaderValue, sendRequest, setFlattenedQueryParams, setSearchParams, shouldRetryRequest, sortObject, toPathString, validateTimeUnit };
package/dist/index.d.ts CHANGED
@@ -583,7 +583,34 @@ declare function setFlattenedQueryParams(urlSearchParams: URLSearchParams, param
583
583
  * @param objects - One or more objects to flatten into the URL's search parameters.
584
584
  */
585
585
  declare const setSearchParams: (url: URL, ...objects: Record<string, unknown>[]) => void;
586
+ /**
587
+ * Converts a URL object to a full path string, including pathname, search parameters, and hash.
588
+ *
589
+ * @param url The URL object to convert to a path string.
590
+ * @returns A complete path string representation of the URL.
591
+ */
586
592
  declare const toPathString: (url: URL) => string;
593
+ /**
594
+ * A type utility that transforms numbers in a type to their string representation when in scientific notation,
595
+ * while preserving the structure of arrays and objects.
596
+ *
597
+ * @template T The input type to be transformed
598
+ * @returns A type where numbers potentially become strings, maintaining the original type's structure
599
+ */
600
+ type ScientificToString<T> = T extends number ? string | number : T extends Array<infer U> ? Array<ScientificToString<U>> : T extends object ? {
601
+ [K in keyof T]: ScientificToString<T[K]>;
602
+ } : T;
603
+ /**
604
+ * Normalizes scientific notation numbers in an object or array to a fixed number of decimal places.
605
+ *
606
+ * This function recursively processes objects, arrays, and numbers, converting scientific notation
607
+ * to a fixed decimal representation. Non-numeric values are left unchanged.
608
+ *
609
+ * @template T The type of the input object or value
610
+ * @param obj The object, array, or value to normalize
611
+ * @returns A new object or value with scientific notation numbers normalized
612
+ */
613
+ declare function normalizeScientificNumbers<T>(obj: T): ScientificToString<T>;
587
614
  /**
588
615
  * Determines whether a request should be retried based on the provided error.
589
616
  *
@@ -667,7 +694,7 @@ declare function buildUserAgent(packageName: string, packageVersion: string): st
667
694
  declare function buildWebsocketAPIMessage(configuration: ConfigurationWebsocketAPI, method: string, payload: WebsocketSendMsgOptions, options: WebsocketSendMsgConfig, skipAuth?: boolean): {
668
695
  id: string;
669
696
  method: string;
670
- params: SendMessageOptions;
697
+ params: Record<string, unknown>;
671
698
  };
672
699
  /**
673
700
  * Sanitizes a header value by checking for and preventing carriage return and line feed characters.
@@ -1052,4 +1079,4 @@ interface WebsocketStream<T> {
1052
1079
  */
1053
1080
  declare function createStreamHandler<T>(websocketBase: WebsocketAPIBase | WebsocketStreamsBase, streamOrId: string, id?: string): WebsocketStream<T>;
1054
1081
 
1055
- export { ALGO_REST_API_PROD_URL, AUTO_INVEST_REST_API_PROD_URL, type AxiosRequestArgs, BadRequestError, C2C_REST_API_PROD_URL, CONVERT_REST_API_PROD_URL, COPY_TRADING_REST_API_PROD_URL, CRYPTO_LOAN_REST_API_PROD_URL, ConfigurationRestAPI, ConfigurationWebsocketAPI, ConfigurationWebsocketStreams, ConnectorClientError, DERIVATIVES_TRADING_COIN_FUTURES_REST_API_PROD_URL, DERIVATIVES_TRADING_COIN_FUTURES_REST_API_TESTNET_URL, DERIVATIVES_TRADING_COIN_FUTURES_WS_API_PROD_URL, DERIVATIVES_TRADING_COIN_FUTURES_WS_API_TESTNET_URL, DERIVATIVES_TRADING_COIN_FUTURES_WS_STREAMS_PROD_URL, DERIVATIVES_TRADING_COIN_FUTURES_WS_STREAMS_TESTNET_URL, DERIVATIVES_TRADING_OPTIONS_REST_API_PROD_URL, DERIVATIVES_TRADING_OPTIONS_WS_STREAMS_PROD_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_PRO_REST_API_PROD_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_PRO_WS_STREAMS_PROD_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_REST_API_PROD_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_REST_API_TESTNET_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_WS_STREAMS_PROD_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_WS_STREAMS_TESTNET_URL, DERIVATIVES_TRADING_USDS_FUTURES_REST_API_PROD_URL, DERIVATIVES_TRADING_USDS_FUTURES_REST_API_TESTNET_URL, DERIVATIVES_TRADING_USDS_FUTURES_WS_API_PROD_URL, DERIVATIVES_TRADING_USDS_FUTURES_WS_API_TESTNET_URL, DERIVATIVES_TRADING_USDS_FUTURES_WS_STREAMS_PROD_URL, DERIVATIVES_TRADING_USDS_FUTURES_WS_STREAMS_TESTNET_URL, DUAL_INVESTMENT_REST_API_PROD_URL, FIAT_REST_API_PROD_URL, ForbiddenError, GIFT_CARD_REST_API_PROD_URL, LogLevel, Logger, MARGIN_TRADING_REST_API_PROD_URL, MARGIN_TRADING_RISK_WS_STREAMS_PROD_URL, MARGIN_TRADING_WS_STREAMS_PROD_URL, MINING_REST_API_PROD_URL, NFT_REST_API_PROD_URL, NetworkError, NotFoundError, type ObjectType, PAY_REST_API_PROD_URL, REBATE_REST_API_PROD_URL, RateLimitBanError, type RequestArgs, RequiredError, type RestApiRateLimit, type RestApiResponse, SIMPLE_EARN_REST_API_PROD_URL, SPOT_REST_API_MARKET_URL, SPOT_REST_API_PROD_URL, SPOT_REST_API_TESTNET_URL, SPOT_WS_API_PROD_URL, SPOT_WS_API_TESTNET_URL, SPOT_WS_STREAMS_MARKET_URL, SPOT_WS_STREAMS_PROD_URL, SPOT_WS_STREAMS_TESTNET_URL, STAKING_REST_API_PROD_URL, SUB_ACCOUNT_REST_API_PROD_URL, type SendMessageOptions, ServerError, TimeUnit, TooManyRequestsError, UnauthorizedError, VIP_LOAN_REST_API_PROD_URL, WALLET_REST_API_PROD_URL, WebsocketAPIBase, type WebsocketApiRateLimit, type WebsocketApiResponse, WebsocketCommon, type WebsocketConnection, WebsocketEventEmitter, type WebsocketSendMsgConfig, type WebsocketSendMsgOptions, type WebsocketStream, WebsocketStreamsBase, assertParamExists, buildQueryString, buildUserAgent, buildWebsocketAPIMessage, clearSignerCache, createStreamHandler, delay, getSignature, getTimestamp, httpRequestFunction, parseCustomHeaders, parseRateLimitHeaders, randomString, removeEmptyValue, replaceWebsocketStreamsPlaceholders, sanitizeHeaderValue, sendRequest, setFlattenedQueryParams, setSearchParams, shouldRetryRequest, sortObject, toPathString, validateTimeUnit };
1082
+ export { ALGO_REST_API_PROD_URL, AUTO_INVEST_REST_API_PROD_URL, type AxiosRequestArgs, BadRequestError, C2C_REST_API_PROD_URL, CONVERT_REST_API_PROD_URL, COPY_TRADING_REST_API_PROD_URL, CRYPTO_LOAN_REST_API_PROD_URL, ConfigurationRestAPI, ConfigurationWebsocketAPI, ConfigurationWebsocketStreams, ConnectorClientError, DERIVATIVES_TRADING_COIN_FUTURES_REST_API_PROD_URL, DERIVATIVES_TRADING_COIN_FUTURES_REST_API_TESTNET_URL, DERIVATIVES_TRADING_COIN_FUTURES_WS_API_PROD_URL, DERIVATIVES_TRADING_COIN_FUTURES_WS_API_TESTNET_URL, DERIVATIVES_TRADING_COIN_FUTURES_WS_STREAMS_PROD_URL, DERIVATIVES_TRADING_COIN_FUTURES_WS_STREAMS_TESTNET_URL, DERIVATIVES_TRADING_OPTIONS_REST_API_PROD_URL, DERIVATIVES_TRADING_OPTIONS_WS_STREAMS_PROD_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_PRO_REST_API_PROD_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_PRO_WS_STREAMS_PROD_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_REST_API_PROD_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_REST_API_TESTNET_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_WS_STREAMS_PROD_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_WS_STREAMS_TESTNET_URL, DERIVATIVES_TRADING_USDS_FUTURES_REST_API_PROD_URL, DERIVATIVES_TRADING_USDS_FUTURES_REST_API_TESTNET_URL, DERIVATIVES_TRADING_USDS_FUTURES_WS_API_PROD_URL, DERIVATIVES_TRADING_USDS_FUTURES_WS_API_TESTNET_URL, DERIVATIVES_TRADING_USDS_FUTURES_WS_STREAMS_PROD_URL, DERIVATIVES_TRADING_USDS_FUTURES_WS_STREAMS_TESTNET_URL, DUAL_INVESTMENT_REST_API_PROD_URL, FIAT_REST_API_PROD_URL, ForbiddenError, GIFT_CARD_REST_API_PROD_URL, LogLevel, Logger, MARGIN_TRADING_REST_API_PROD_URL, MARGIN_TRADING_RISK_WS_STREAMS_PROD_URL, MARGIN_TRADING_WS_STREAMS_PROD_URL, MINING_REST_API_PROD_URL, NFT_REST_API_PROD_URL, NetworkError, NotFoundError, type ObjectType, PAY_REST_API_PROD_URL, REBATE_REST_API_PROD_URL, RateLimitBanError, type RequestArgs, RequiredError, type RestApiRateLimit, type RestApiResponse, SIMPLE_EARN_REST_API_PROD_URL, SPOT_REST_API_MARKET_URL, SPOT_REST_API_PROD_URL, SPOT_REST_API_TESTNET_URL, SPOT_WS_API_PROD_URL, SPOT_WS_API_TESTNET_URL, SPOT_WS_STREAMS_MARKET_URL, SPOT_WS_STREAMS_PROD_URL, SPOT_WS_STREAMS_TESTNET_URL, STAKING_REST_API_PROD_URL, SUB_ACCOUNT_REST_API_PROD_URL, type SendMessageOptions, ServerError, TimeUnit, TooManyRequestsError, UnauthorizedError, VIP_LOAN_REST_API_PROD_URL, WALLET_REST_API_PROD_URL, WebsocketAPIBase, type WebsocketApiRateLimit, type WebsocketApiResponse, WebsocketCommon, type WebsocketConnection, WebsocketEventEmitter, type WebsocketSendMsgConfig, type WebsocketSendMsgOptions, type WebsocketStream, WebsocketStreamsBase, assertParamExists, buildQueryString, buildUserAgent, buildWebsocketAPIMessage, clearSignerCache, createStreamHandler, delay, getSignature, getTimestamp, httpRequestFunction, normalizeScientificNumbers, parseCustomHeaders, parseRateLimitHeaders, randomString, removeEmptyValue, replaceWebsocketStreamsPlaceholders, sanitizeHeaderValue, sendRequest, setFlattenedQueryParams, setSearchParams, shouldRetryRequest, sortObject, toPathString, validateTimeUnit };
package/dist/index.js CHANGED
@@ -109,6 +109,7 @@ __export(index_exports, {
109
109
  getSignature: () => getSignature,
110
110
  getTimestamp: () => getTimestamp,
111
111
  httpRequestFunction: () => httpRequestFunction,
112
+ normalizeScientificNumbers: () => normalizeScientificNumbers,
112
113
  parseCustomHeaders: () => parseCustomHeaders,
113
114
  parseRateLimitHeaders: () => parseRateLimitHeaders,
114
115
  randomString: () => randomString,
@@ -249,6 +250,39 @@ var setSearchParams = function(url, ...objects) {
249
250
  var toPathString = function(url) {
250
251
  return url.pathname + url.search + url.hash;
251
252
  };
253
+ function normalizeScientificNumbers(obj) {
254
+ if (Array.isArray(obj)) {
255
+ return obj.map((item) => normalizeScientificNumbers(item));
256
+ } else if (typeof obj === "object" && obj !== null) {
257
+ const result = {};
258
+ for (const key of Object.keys(obj)) {
259
+ result[key] = normalizeScientificNumbers(obj[key]);
260
+ }
261
+ return result;
262
+ } else if (typeof obj === "number") {
263
+ if (!Number.isFinite(obj)) return obj;
264
+ const abs = Math.abs(obj);
265
+ if (abs === 0 || abs >= 1e-6 && abs < 1e21) return String(obj);
266
+ const isNegative = obj < 0;
267
+ const [rawMantissa, rawExponent] = abs.toExponential().split("e");
268
+ const exponent = +rawExponent;
269
+ const digits = rawMantissa.replace(".", "");
270
+ if (exponent < 0) {
271
+ const zeros = "0".repeat(Math.abs(exponent) - 1);
272
+ return (isNegative ? "-" : "") + "0." + zeros + digits;
273
+ } else {
274
+ const pad = exponent - (digits.length - 1);
275
+ if (pad >= 0) {
276
+ return (isNegative ? "-" : "") + digits + "0".repeat(pad);
277
+ } else {
278
+ const point = digits.length + pad;
279
+ return (isNegative ? "-" : "") + digits.slice(0, point) + "." + digits.slice(point);
280
+ }
281
+ }
282
+ } else {
283
+ return obj;
284
+ }
285
+ }
252
286
  var shouldRetryRequest = function(error, method, retriesLeft) {
253
287
  const isRetriableMethod = ["GET", "DELETE"].includes(method ?? "");
254
288
  const isRetriableStatus = [500, 502, 503, 504].includes(
@@ -410,7 +444,7 @@ var sendRequest = function(configuration, endpoint, method, params = {}, timeUni
410
444
  method,
411
445
  ...configuration?.baseOptions
412
446
  };
413
- const localVarQueryParameter = { ...params };
447
+ const localVarQueryParameter = { ...normalizeScientificNumbers(params) };
414
448
  if (options.isSigned) {
415
449
  const timestamp = getTimestamp();
416
450
  localVarQueryParameter["timestamp"] = timestamp;
@@ -481,7 +515,7 @@ function buildUserAgent(packageName, packageVersion) {
481
515
  function buildWebsocketAPIMessage(configuration, method, payload, options, skipAuth = false) {
482
516
  const id = payload.id && /^[0-9a-f]{32}$/.test(payload.id) ? payload.id : randomString();
483
517
  delete payload.id;
484
- let params = removeEmptyValue(payload);
518
+ let params = normalizeScientificNumbers(removeEmptyValue(payload));
485
519
  if ((options.withApiKey || options.isSigned) && !skipAuth) params.apiKey = configuration.apiKey;
486
520
  if (options.isSigned) {
487
521
  params.timestamp = getTimestamp();
@@ -504,7 +538,7 @@ function parseCustomHeaders(headers) {
504
538
  for (const [rawName, rawValue] of Object.entries(headers || {})) {
505
539
  const name = rawName.trim();
506
540
  if (forbidden.has(name.toLowerCase())) {
507
- console.warn(`Dropping forbidden header: ${name}`);
541
+ Logger.getInstance().warn(`Dropping forbidden header: ${name}`);
508
542
  continue;
509
543
  }
510
544
  try {
@@ -724,33 +758,27 @@ var Logger = class _Logger {
724
758
  "warn" /* WARN */,
725
759
  "error" /* ERROR */
726
760
  ];
761
+ const envLevel = process.env.LOG_LEVEL?.toLowerCase();
762
+ this.minLogLevel = envLevel && this.isValidLogLevel(envLevel) ? envLevel : "info" /* INFO */;
727
763
  }
728
764
  static getInstance() {
729
- if (!_Logger.instance) {
730
- _Logger.instance = new _Logger();
731
- }
765
+ if (!_Logger.instance) _Logger.instance = new _Logger();
732
766
  return _Logger.instance;
733
767
  }
734
768
  setMinLogLevel(level) {
735
- if (!this.isValidLogLevel(level)) {
736
- throw new Error(`Invalid log level: ${level}`);
737
- }
769
+ if (!this.isValidLogLevel(level)) throw new Error(`Invalid log level: ${level}`);
738
770
  this.minLogLevel = level;
739
771
  }
740
772
  isValidLogLevel(level) {
741
773
  return this.levelsOrder.includes(level);
742
774
  }
743
775
  log(level, ...message) {
744
- if (level === "" /* NONE */ || !this.allowLevelLog(level)) {
745
- return;
746
- }
776
+ if (level === "" /* NONE */ || !this.allowLevelLog(level)) return;
747
777
  const timestamp = (/* @__PURE__ */ new Date()).toISOString();
748
778
  console[level](`[${timestamp}] [${level.toLowerCase()}]`, ...message);
749
779
  }
750
780
  allowLevelLog(level) {
751
- if (!this.isValidLogLevel(level)) {
752
- throw new Error(`Invalid log level: ${level}`);
753
- }
781
+ if (!this.isValidLogLevel(level)) throw new Error(`Invalid log level: ${level}`);
754
782
  const currentLevelIndex = this.levelsOrder.indexOf(level);
755
783
  const minLevelIndex = this.levelsOrder.indexOf(this.minLogLevel);
756
784
  return currentLevelIndex >= minLevelIndex;
@@ -943,12 +971,16 @@ var WebsocketCommon = class _WebsocketCommon extends WebsocketEventEmitter {
943
971
  */
944
972
  async closeConnectionGracefully(WebsocketConnectionToClose, connection) {
945
973
  if (!WebsocketConnectionToClose || !connection) return;
946
- this.logger.debug("Waiting for pending requests to complete before disconnecting.");
974
+ this.logger.debug(
975
+ `Waiting for pending requests to complete before disconnecting websocket on connection ${connection.id}.`
976
+ );
947
977
  const closePromise = new Promise((resolve) => {
948
978
  this.scheduleTimer(
949
979
  WebsocketConnectionToClose,
950
980
  () => {
951
- this.logger.warn("Force-closing connection after 30 seconds.");
981
+ this.logger.warn(
982
+ `Force-closing websocket connection after 30 seconds on connection ${connection.id}.`
983
+ );
952
984
  resolve();
953
985
  },
954
986
  3e4
@@ -957,7 +989,9 @@ var WebsocketCommon = class _WebsocketCommon extends WebsocketEventEmitter {
957
989
  WebsocketConnectionToClose,
958
990
  () => {
959
991
  if (connection.pendingRequests.size === 0) {
960
- this.logger.debug("All pending requests completed, closing connection.");
992
+ this.logger.debug(
993
+ `All pending requests completed, closing websocket connection on connection ${connection.id}.`
994
+ );
961
995
  resolve();
962
996
  }
963
997
  },
@@ -966,7 +1000,7 @@ var WebsocketCommon = class _WebsocketCommon extends WebsocketEventEmitter {
966
1000
  );
967
1001
  });
968
1002
  await closePromise;
969
- this.logger.info("Closing Websocket connection.");
1003
+ this.logger.info(`Closing Websocket connection on connection ${connection.id}.`);
970
1004
  WebsocketConnectionToClose.close();
971
1005
  this.cleanup(WebsocketConnectionToClose);
972
1006
  }
@@ -986,7 +1020,7 @@ var WebsocketCommon = class _WebsocketCommon extends WebsocketEventEmitter {
986
1020
  req.payload,
987
1021
  req.options
988
1022
  );
989
- this.logger.debug(`Session re-logon with connection id: ${connection.id}`, data);
1023
+ this.logger.debug(`Session re-logon on connection ${connection.id}`, data);
990
1024
  try {
991
1025
  await this.send(
992
1026
  JSON.stringify(data),
@@ -995,12 +1029,12 @@ var WebsocketCommon = class _WebsocketCommon extends WebsocketEventEmitter {
995
1029
  this.configuration.timeout,
996
1030
  connection
997
1031
  );
1032
+ this.logger.debug(
1033
+ `Session re-logon on connection ${connection.id} was successful.`
1034
+ );
998
1035
  connection.isSessionLoggedOn = true;
999
1036
  } catch (err) {
1000
- this.logger.error(
1001
- `Session re-logon with connection id ${connection.id} failed:`,
1002
- err
1003
- );
1037
+ this.logger.error(`Session re-logon on connection ${connection.id} failed:`, err);
1004
1038
  }
1005
1039
  }
1006
1040
  }
@@ -1364,8 +1398,9 @@ var WebsocketAPIBase = class extends WebsocketCommon {
1364
1398
  if (!this.isConnected()) {
1365
1399
  throw new Error("Not connected");
1366
1400
  }
1367
- const connections = options.isSessionLogon || options.isSessionLogout ? this.getAvailableConnections() : [this.getConnection()];
1368
- const skipAuth = options.isSessionLogon || options.isSessionLogout ? false : this.configuration.autoSessionReLogon && connections[0].isSessionLoggedOn;
1401
+ const isSessionReq = options.isSessionLogon || options.isSessionLogout;
1402
+ const connections = isSessionReq ? this.getAvailableConnections() : [this.getConnection()];
1403
+ const skipAuth = isSessionReq ? false : this.configuration.autoSessionReLogon && connections[0].isSessionLoggedOn;
1369
1404
  const data = buildWebsocketAPIMessage(
1370
1405
  this.configuration,
1371
1406
  method,
@@ -1385,7 +1420,7 @@ var WebsocketAPIBase = class extends WebsocketCommon {
1385
1420
  )
1386
1421
  )
1387
1422
  );
1388
- if ((options.isSessionLogon || options.isSessionLogout) && this.configuration.autoSessionReLogon) {
1423
+ if (isSessionReq && this.configuration.autoSessionReLogon) {
1389
1424
  connections.forEach((connection) => {
1390
1425
  if (options.isSessionLogon) {
1391
1426
  connection.isSessionLoggedOn = true;
@@ -1396,7 +1431,7 @@ var WebsocketAPIBase = class extends WebsocketCommon {
1396
1431
  }
1397
1432
  });
1398
1433
  }
1399
- return connections.length === 1 ? responses[0] : responses;
1434
+ return connections.length === 1 && !isSessionReq ? responses[0] : responses;
1400
1435
  }
1401
1436
  };
1402
1437
  var WebsocketStreamsBase = class extends WebsocketCommon {
@@ -1468,7 +1503,7 @@ var WebsocketStreamsBase = class extends WebsocketCommon {
1468
1503
  params: streams,
1469
1504
  id: id && /^[0-9a-f]{32}$/.test(id) ? id : randomString()
1470
1505
  };
1471
- this.logger.info("SUBSCRIBE", payload);
1506
+ this.logger.debug("SUBSCRIBE", payload);
1472
1507
  this.send(JSON.stringify(payload), void 0, false, 0, connection);
1473
1508
  }
1474
1509
  /**
@@ -1559,7 +1594,7 @@ var WebsocketStreamsBase = class extends WebsocketCommon {
1559
1594
  connectionStreamMap.forEach((streams2, connection) => {
1560
1595
  if (!this.isConnected(connection)) {
1561
1596
  this.logger.info(
1562
- `Connection is not ready. Queuing subscription for streams: ${streams2}`
1597
+ `Connection ${connection.id} is not ready. Queuing subscription for streams: ${streams2}`
1563
1598
  );
1564
1599
  connection.pendingSubscriptions?.push(...streams2);
1565
1600
  return;
@@ -1588,7 +1623,7 @@ var WebsocketStreamsBase = class extends WebsocketCommon {
1588
1623
  params: [stream2],
1589
1624
  id: id && /^[0-9a-f]{32}$/.test(id) ? id : randomString()
1590
1625
  };
1591
- this.logger.info("UNSUBSCRIBE", payload);
1626
+ this.logger.debug("UNSUBSCRIBE", payload);
1592
1627
  this.send(JSON.stringify(payload), void 0, false, 0, connection);
1593
1628
  this.streamConnectionMap.delete(stream2);
1594
1629
  this.streamCallbackMap.delete(stream2);
@@ -1709,6 +1744,7 @@ function createStreamHandler(websocketBase, streamOrId, id) {
1709
1744
  getSignature,
1710
1745
  getTimestamp,
1711
1746
  httpRequestFunction,
1747
+ normalizeScientificNumbers,
1712
1748
  parseCustomHeaders,
1713
1749
  parseRateLimitHeaders,
1714
1750
  randomString,