@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 +36 -5
- package/dist/index.d.ts +36 -5
- package/dist/index.js +87 -45
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +86 -45
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
881
|
-
if (!
|
|
882
|
-
|
|
883
|
-
|
|
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.
|
|
1187
|
+
this.logger.debug("Received PING from server");
|
|
1146
1188
|
this.emit("ping");
|
|
1147
1189
|
ws.pong();
|
|
1148
|
-
this.logger.
|
|
1190
|
+
this.logger.debug("Responded PONG to server's PING message");
|
|
1149
1191
|
});
|
|
1150
1192
|
ws.on("pong", () => {
|
|
1151
|
-
this.logger.
|
|
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.
|
|
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 = "
|
|
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
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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,
|