@binance/common 1.2.1 → 1.2.3

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.
@@ -694,6 +721,10 @@ declare class WebsocketEventEmitter {
694
721
  off(event: 'open' | 'message' | 'error' | 'close' | 'ping' | 'pong', listener: (...args: any[]) => void): void;
695
722
  protected emit(event: 'open' | 'message' | 'error' | 'close' | 'ping' | 'pong', ...args: any[]): void;
696
723
  }
724
+ interface TimerRecord {
725
+ timer?: NodeJS.Timeout;
726
+ type: 'timeout' | 'interval';
727
+ }
697
728
  interface WebsocketConnection {
698
729
  id: string;
699
730
  reconnectionPending: boolean;
@@ -717,7 +748,7 @@ declare class WebsocketCommon extends WebsocketEventEmitter {
717
748
  private static readonly MAX_CONNECTION_DURATION;
718
749
  private readonly connectionQueue;
719
750
  private queueProcessing;
720
- private connectionTimers;
751
+ protected connectionTimers: Map<WebSocketClient, Set<TimerRecord>>;
721
752
  private mode;
722
753
  private poolSize;
723
754
  private roundRobinIndex;
@@ -767,13 +798,13 @@ declare class WebsocketCommon extends WebsocketEventEmitter {
767
798
  * @param type Timer type ('timeout' or 'interval')
768
799
  * @returns Timer handle
769
800
  */
770
- private scheduleTimer;
801
+ protected scheduleTimer(connection: WebSocketClient, callback: () => void, delay: number, type?: 'timeout' | 'interval'): NodeJS.Timeout;
771
802
  /**
772
803
  * Clears all timers associated with a WebSocket connection.
773
804
  * @param connection - The WebSocket client instance to clear timers for.
774
805
  * @returns void
775
806
  */
776
- private clearTimers;
807
+ protected clearTimers(connection: WebSocketClient): void;
777
808
  /**
778
809
  * Processes the connection queue, reconnecting or renewing connections as needed.
779
810
  * This method is responsible for iterating through the connection queue and initiating
@@ -1052,4 +1083,4 @@ interface WebsocketStream<T> {
1052
1083
  */
1053
1084
  declare function createStreamHandler<T>(websocketBase: WebsocketAPIBase | WebsocketStreamsBase, streamOrId: string, id?: string): WebsocketStream<T>;
1054
1085
 
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 };
1086
+ 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, type TimerRecord, 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.
@@ -694,6 +721,10 @@ declare class WebsocketEventEmitter {
694
721
  off(event: 'open' | 'message' | 'error' | 'close' | 'ping' | 'pong', listener: (...args: any[]) => void): void;
695
722
  protected emit(event: 'open' | 'message' | 'error' | 'close' | 'ping' | 'pong', ...args: any[]): void;
696
723
  }
724
+ interface TimerRecord {
725
+ timer?: NodeJS.Timeout;
726
+ type: 'timeout' | 'interval';
727
+ }
697
728
  interface WebsocketConnection {
698
729
  id: string;
699
730
  reconnectionPending: boolean;
@@ -717,7 +748,7 @@ declare class WebsocketCommon extends WebsocketEventEmitter {
717
748
  private static readonly MAX_CONNECTION_DURATION;
718
749
  private readonly connectionQueue;
719
750
  private queueProcessing;
720
- private connectionTimers;
751
+ protected connectionTimers: Map<WebSocketClient, Set<TimerRecord>>;
721
752
  private mode;
722
753
  private poolSize;
723
754
  private roundRobinIndex;
@@ -767,13 +798,13 @@ declare class WebsocketCommon extends WebsocketEventEmitter {
767
798
  * @param type Timer type ('timeout' or 'interval')
768
799
  * @returns Timer handle
769
800
  */
770
- private scheduleTimer;
801
+ protected scheduleTimer(connection: WebSocketClient, callback: () => void, delay: number, type?: 'timeout' | 'interval'): NodeJS.Timeout;
771
802
  /**
772
803
  * Clears all timers associated with a WebSocket connection.
773
804
  * @param connection - The WebSocket client instance to clear timers for.
774
805
  * @returns void
775
806
  */
776
- private clearTimers;
807
+ protected clearTimers(connection: WebSocketClient): void;
777
808
  /**
778
809
  * Processes the connection queue, reconnecting or renewing connections as needed.
779
810
  * This method is responsible for iterating through the connection queue and initiating
@@ -1052,4 +1083,4 @@ interface WebsocketStream<T> {
1052
1083
  */
1053
1084
  declare function createStreamHandler<T>(websocketBase: WebsocketAPIBase | WebsocketStreamsBase, streamOrId: string, id?: string): WebsocketStream<T>;
1054
1085
 
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 };
1086
+ 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, type TimerRecord, 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;
@@ -877,10 +905,24 @@ var WebsocketCommon = class _WebsocketCommon extends WebsocketEventEmitter {
877
905
  * @returns Timer handle
878
906
  */
879
907
  scheduleTimer(connection, callback, delay2, type = "timeout") {
880
- const timer = type === "timeout" ? setTimeout(callback, delay2) : setInterval(callback, delay2);
881
- if (!this.connectionTimers.has(connection))
882
- this.connectionTimers.set(connection, /* @__PURE__ */ new Set());
883
- this.connectionTimers.get(connection)?.add({ timer, type });
908
+ let timers = this.connectionTimers.get(connection);
909
+ if (!timers) {
910
+ timers = /* @__PURE__ */ new Set();
911
+ this.connectionTimers.set(connection, timers);
912
+ }
913
+ const timerRecord = { type };
914
+ const wrappedTimeout = () => {
915
+ try {
916
+ callback();
917
+ } finally {
918
+ timers.delete(timerRecord);
919
+ }
920
+ };
921
+ let timer;
922
+ if (type === "timeout") timer = setTimeout(wrappedTimeout, delay2);
923
+ else timer = setInterval(callback, delay2);
924
+ timerRecord.timer = timer;
925
+ timers.add(timerRecord);
884
926
  return timer;
885
927
  }
886
928
  /**
@@ -1142,13 +1184,13 @@ var WebsocketCommon = class _WebsocketCommon extends WebsocketEventEmitter {
1142
1184
  this.onMessage(data.toString(), targetConnection);
1143
1185
  });
1144
1186
  ws.on("ping", () => {
1145
- this.logger.info("Received PING from server");
1187
+ this.logger.debug("Received PING from server");
1146
1188
  this.emit("ping");
1147
1189
  ws.pong();
1148
- this.logger.info("Responded PONG to server's PING message");
1190
+ this.logger.debug("Responded PONG to server's PING message");
1149
1191
  });
1150
1192
  ws.on("pong", () => {
1151
- this.logger.info("Received PONG from server");
1193
+ this.logger.debug("Received PONG from server");
1152
1194
  this.emit("pong");
1153
1195
  });
1154
1196
  ws.on("error", (err) => {
@@ -1228,7 +1270,7 @@ var WebsocketCommon = class _WebsocketCommon extends WebsocketEventEmitter {
1228
1270
  this.logger.warn("Ping only can be sent when connection is ready.");
1229
1271
  return;
1230
1272
  }
1231
- this.logger.info("Sending PING to all connected Websocket servers.");
1273
+ this.logger.debug("Sending PING to all connected Websocket servers.");
1232
1274
  connectedConnections.forEach((connection) => {
1233
1275
  if (connection.ws) {
1234
1276
  connection.ws.ping();
@@ -1250,7 +1292,7 @@ var WebsocketCommon = class _WebsocketCommon extends WebsocketEventEmitter {
1250
1292
  */
1251
1293
  send(payload, id, promiseBased = true, timeout = 5e3, connection) {
1252
1294
  if (!this.isConnected(connection)) {
1253
- const errorMsg = "Send can only be sent when connection is ready.";
1295
+ const errorMsg = "Unable to send message \u2014 connection is not available.";
1254
1296
  this.logger.warn(errorMsg);
1255
1297
  if (promiseBased) return Promise.reject(new Error(errorMsg));
1256
1298
  else throw new Error(errorMsg);
@@ -1266,17 +1308,22 @@ var WebsocketCommon = class _WebsocketCommon extends WebsocketEventEmitter {
1266
1308
  if (promiseBased) {
1267
1309
  return new Promise((resolve, reject) => {
1268
1310
  if (!id) return reject(new Error("id is required for promise-based sending."));
1269
- connectionToUse.pendingRequests.set(id, { resolve, reject });
1270
- this.scheduleTimer(
1271
- connectionToUse.ws,
1272
- () => {
1273
- if (connectionToUse.pendingRequests.has(id)) {
1274
- connectionToUse.pendingRequests.delete(id);
1275
- reject(new Error(`Request timeout for id: ${id}`));
1276
- }
1311
+ const timeoutHandle = setTimeout(() => {
1312
+ if (connectionToUse.pendingRequests.has(id)) {
1313
+ connectionToUse.pendingRequests.delete(id);
1314
+ reject(new Error(`Request timeout for id: ${id}`));
1315
+ }
1316
+ }, timeout);
1317
+ connectionToUse.pendingRequests.set(id, {
1318
+ resolve: (v) => {
1319
+ clearTimeout(timeoutHandle);
1320
+ resolve(v);
1277
1321
  },
1278
- timeout
1279
- );
1322
+ reject: (e) => {
1323
+ clearTimeout(timeoutHandle);
1324
+ reject(e);
1325
+ }
1326
+ });
1280
1327
  });
1281
1328
  }
1282
1329
  }
@@ -1356,13 +1403,13 @@ var WebsocketAPIBase = class extends WebsocketCommon {
1356
1403
  reject(new Error("Websocket connection timed out"));
1357
1404
  }, 1e4);
1358
1405
  this.connectPool(this.prepareURL(this.configuration.wsURL)).then(() => {
1359
- clearTimeout(timeout);
1360
1406
  this.isConnecting = false;
1361
1407
  resolve();
1362
1408
  }).catch((error) => {
1363
- clearTimeout(timeout);
1364
1409
  this.isConnecting = false;
1365
1410
  reject(error);
1411
+ }).finally(() => {
1412
+ clearTimeout(timeout);
1366
1413
  });
1367
1414
  });
1368
1415
  }
@@ -1475,7 +1522,7 @@ var WebsocketStreamsBase = class extends WebsocketCommon {
1475
1522
  params: streams,
1476
1523
  id: id && /^[0-9a-f]{32}$/.test(id) ? id : randomString()
1477
1524
  };
1478
- this.logger.info("SUBSCRIBE", payload);
1525
+ this.logger.debug("SUBSCRIBE", payload);
1479
1526
  this.send(JSON.stringify(payload), void 0, false, 0, connection);
1480
1527
  }
1481
1528
  /**
@@ -1533,13 +1580,7 @@ var WebsocketStreamsBase = class extends WebsocketCommon {
1533
1580
  const timeout = setTimeout(() => {
1534
1581
  reject(new Error("Websocket connection timed out"));
1535
1582
  }, 1e4);
1536
- this.connectPool(this.prepareURL(streams)).then(() => {
1537
- clearTimeout(timeout);
1538
- resolve();
1539
- }).catch((error) => {
1540
- clearTimeout(timeout);
1541
- reject(error);
1542
- });
1583
+ this.connectPool(this.prepareURL(streams)).then(() => resolve()).catch((error) => reject(error)).finally(() => clearTimeout(timeout));
1543
1584
  });
1544
1585
  }
1545
1586
  /**
@@ -1595,7 +1636,7 @@ var WebsocketStreamsBase = class extends WebsocketCommon {
1595
1636
  params: [stream2],
1596
1637
  id: id && /^[0-9a-f]{32}$/.test(id) ? id : randomString()
1597
1638
  };
1598
- this.logger.info("UNSUBSCRIBE", payload);
1639
+ this.logger.debug("UNSUBSCRIBE", payload);
1599
1640
  this.send(JSON.stringify(payload), void 0, false, 0, connection);
1600
1641
  this.streamConnectionMap.delete(stream2);
1601
1642
  this.streamCallbackMap.delete(stream2);
@@ -1716,6 +1757,7 @@ function createStreamHandler(websocketBase, streamOrId, id) {
1716
1757
  getSignature,
1717
1758
  getTimestamp,
1718
1759
  httpRequestFunction,
1760
+ normalizeScientificNumbers,
1719
1761
  parseCustomHeaders,
1720
1762
  parseRateLimitHeaders,
1721
1763
  randomString,