@binance/common 1.0.6 → 1.1.1

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
@@ -100,7 +100,7 @@ declare class ConfigurationRestAPI {
100
100
  };
101
101
  };
102
102
  /**
103
- * enables keep-alive functionality for the connection
103
+ * enables keep-alive functionality for the connection (if httpsAgent is set then we use httpsAgent.keepAlive instead)
104
104
  * @default true
105
105
  * @type {boolean}
106
106
  * @memberof ConfigurationRestAPI
@@ -485,6 +485,13 @@ interface RequestArgs {
485
485
  timeUnit?: TimeUnit;
486
486
  }
487
487
 
488
+ /**
489
+ * Resets the signer cache to a new empty WeakMap.
490
+ *
491
+ * This function clears the existing signer cache, creating a fresh WeakMap
492
+ * to store RequestSigner instances associated with configuration objects.
493
+ */
494
+ declare const clearSignerCache: () => void;
488
495
  /**
489
496
  * Generates a query string from an object of parameters.
490
497
  *
@@ -520,11 +527,11 @@ declare function delay(ms: number): Promise<void>;
520
527
  */
521
528
  declare function getTimestamp(): number;
522
529
  /**
523
- * Generates a signature for a signed request based on the provided configuration.
530
+ * Generates a signature for the given configuration and query parameters using a cached request signer.
524
531
  *
525
- * @param configuration - The configuration object containing the API secret or private key information.
526
- * @param queryParams - The object containing the query parameters to be signed.
527
- * @returns The generated signature as a string.
532
+ * @param configuration - Configuration object containing API secret, private key, and optional passphrase.
533
+ * @param queryParams - The query parameters to be signed.
534
+ * @returns A string representing the generated signature.
528
535
  */
529
536
  declare const getSignature: (configuration: {
530
537
  apiSecret?: string;
@@ -540,6 +547,20 @@ declare const getSignature: (configuration: {
540
547
  * @throws {RequiredError} If the parameter is null or undefined.
541
548
  */
542
549
  declare const assertParamExists: (functionName: string, paramName: string, paramValue: unknown) => void;
550
+ /**
551
+ * Recursively flattens an object or array into URL search parameters.
552
+ *
553
+ * This function handles nested objects and arrays by converting them into dot-notation query parameters.
554
+ * It supports different types of parameters:
555
+ * - Arrays can be stringified or recursively added
556
+ * - Objects are flattened with dot notation keys
557
+ * - Primitive values are converted to strings
558
+ *
559
+ * @param urlSearchParams The URLSearchParams object to modify
560
+ * @param parameter The parameter to flatten (can be an object, array, or primitive)
561
+ * @param key Optional key for nested parameters, used for creating dot-notation keys
562
+ */
563
+ declare function setFlattenedQueryParams(urlSearchParams: URLSearchParams, parameter: unknown, key?: string): void;
543
564
  /**
544
565
  * Sets the search parameters of the provided URL by flattening the given objects into the URL's search parameters.
545
566
  *
@@ -943,7 +964,7 @@ interface WebsocketStream<T> {
943
964
  * @param event - Event name (currently supports "message").
944
965
  * @param callback - Callback function to handle incoming data.
945
966
  */
946
- on(event: 'message', callback: (data: T) => void): void;
967
+ on(event: 'message', callback: (data: T) => void | Promise<void>): void;
947
968
  /**
948
969
  * Unsubscribe from the stream and clean up resources.
949
970
  */
@@ -960,4 +981,4 @@ interface WebsocketStream<T> {
960
981
  */
961
982
  declare function createStreamHandler<T>(websocketBase: WebsocketAPIBase | WebsocketStreamsBase, streamOrId: string, id?: string): WebsocketStream<T>;
962
983
 
963
- 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_REST_API_PROD_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_REST_API_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, 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 WebsocketSendMsgOptions, type WebsocketStream, WebsocketStreamsBase, assertParamExists, buildQueryString, createStreamHandler, delay, getSignature, getTimestamp, httpRequestFunction, parseRateLimitHeaders, randomString, removeEmptyValue, replaceWebsocketStreamsPlaceholders, sendRequest, setSearchParams, shouldRetryRequest, sortObject, toPathString, validateTimeUnit };
984
+ 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_REST_API_PROD_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_REST_API_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, 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 WebsocketSendMsgOptions, type WebsocketStream, WebsocketStreamsBase, assertParamExists, buildQueryString, clearSignerCache, createStreamHandler, delay, getSignature, getTimestamp, httpRequestFunction, parseRateLimitHeaders, randomString, removeEmptyValue, replaceWebsocketStreamsPlaceholders, sendRequest, setFlattenedQueryParams, setSearchParams, shouldRetryRequest, sortObject, toPathString, validateTimeUnit };
package/dist/index.d.ts CHANGED
@@ -100,7 +100,7 @@ declare class ConfigurationRestAPI {
100
100
  };
101
101
  };
102
102
  /**
103
- * enables keep-alive functionality for the connection
103
+ * enables keep-alive functionality for the connection (if httpsAgent is set then we use httpsAgent.keepAlive instead)
104
104
  * @default true
105
105
  * @type {boolean}
106
106
  * @memberof ConfigurationRestAPI
@@ -485,6 +485,13 @@ interface RequestArgs {
485
485
  timeUnit?: TimeUnit;
486
486
  }
487
487
 
488
+ /**
489
+ * Resets the signer cache to a new empty WeakMap.
490
+ *
491
+ * This function clears the existing signer cache, creating a fresh WeakMap
492
+ * to store RequestSigner instances associated with configuration objects.
493
+ */
494
+ declare const clearSignerCache: () => void;
488
495
  /**
489
496
  * Generates a query string from an object of parameters.
490
497
  *
@@ -520,11 +527,11 @@ declare function delay(ms: number): Promise<void>;
520
527
  */
521
528
  declare function getTimestamp(): number;
522
529
  /**
523
- * Generates a signature for a signed request based on the provided configuration.
530
+ * Generates a signature for the given configuration and query parameters using a cached request signer.
524
531
  *
525
- * @param configuration - The configuration object containing the API secret or private key information.
526
- * @param queryParams - The object containing the query parameters to be signed.
527
- * @returns The generated signature as a string.
532
+ * @param configuration - Configuration object containing API secret, private key, and optional passphrase.
533
+ * @param queryParams - The query parameters to be signed.
534
+ * @returns A string representing the generated signature.
528
535
  */
529
536
  declare const getSignature: (configuration: {
530
537
  apiSecret?: string;
@@ -540,6 +547,20 @@ declare const getSignature: (configuration: {
540
547
  * @throws {RequiredError} If the parameter is null or undefined.
541
548
  */
542
549
  declare const assertParamExists: (functionName: string, paramName: string, paramValue: unknown) => void;
550
+ /**
551
+ * Recursively flattens an object or array into URL search parameters.
552
+ *
553
+ * This function handles nested objects and arrays by converting them into dot-notation query parameters.
554
+ * It supports different types of parameters:
555
+ * - Arrays can be stringified or recursively added
556
+ * - Objects are flattened with dot notation keys
557
+ * - Primitive values are converted to strings
558
+ *
559
+ * @param urlSearchParams The URLSearchParams object to modify
560
+ * @param parameter The parameter to flatten (can be an object, array, or primitive)
561
+ * @param key Optional key for nested parameters, used for creating dot-notation keys
562
+ */
563
+ declare function setFlattenedQueryParams(urlSearchParams: URLSearchParams, parameter: unknown, key?: string): void;
543
564
  /**
544
565
  * Sets the search parameters of the provided URL by flattening the given objects into the URL's search parameters.
545
566
  *
@@ -943,7 +964,7 @@ interface WebsocketStream<T> {
943
964
  * @param event - Event name (currently supports "message").
944
965
  * @param callback - Callback function to handle incoming data.
945
966
  */
946
- on(event: 'message', callback: (data: T) => void): void;
967
+ on(event: 'message', callback: (data: T) => void | Promise<void>): void;
947
968
  /**
948
969
  * Unsubscribe from the stream and clean up resources.
949
970
  */
@@ -960,4 +981,4 @@ interface WebsocketStream<T> {
960
981
  */
961
982
  declare function createStreamHandler<T>(websocketBase: WebsocketAPIBase | WebsocketStreamsBase, streamOrId: string, id?: string): WebsocketStream<T>;
962
983
 
963
- 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_REST_API_PROD_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_REST_API_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, 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 WebsocketSendMsgOptions, type WebsocketStream, WebsocketStreamsBase, assertParamExists, buildQueryString, createStreamHandler, delay, getSignature, getTimestamp, httpRequestFunction, parseRateLimitHeaders, randomString, removeEmptyValue, replaceWebsocketStreamsPlaceholders, sendRequest, setSearchParams, shouldRetryRequest, sortObject, toPathString, validateTimeUnit };
984
+ 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_REST_API_PROD_URL, DERIVATIVES_TRADING_PORTFOLIO_MARGIN_REST_API_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, 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 WebsocketSendMsgOptions, type WebsocketStream, WebsocketStreamsBase, assertParamExists, buildQueryString, clearSignerCache, createStreamHandler, delay, getSignature, getTimestamp, httpRequestFunction, parseRateLimitHeaders, randomString, removeEmptyValue, replaceWebsocketStreamsPlaceholders, sendRequest, setFlattenedQueryParams, setSearchParams, shouldRetryRequest, sortObject, toPathString, validateTimeUnit };
package/dist/index.js CHANGED
@@ -96,6 +96,7 @@ __export(index_exports, {
96
96
  WebsocketStreamsBase: () => WebsocketStreamsBase,
97
97
  assertParamExists: () => assertParamExists,
98
98
  buildQueryString: () => buildQueryString,
99
+ clearSignerCache: () => clearSignerCache,
99
100
  createStreamHandler: () => createStreamHandler,
100
101
  delay: () => delay,
101
102
  getSignature: () => getSignature,
@@ -106,6 +107,7 @@ __export(index_exports, {
106
107
  removeEmptyValue: () => removeEmptyValue,
107
108
  replaceWebsocketStreamsPlaceholders: () => replaceWebsocketStreamsPlaceholders,
108
109
  sendRequest: () => sendRequest,
110
+ setFlattenedQueryParams: () => setFlattenedQueryParams,
109
111
  setSearchParams: () => setSearchParams,
110
112
  shouldRetryRequest: () => shouldRetryRequest,
111
113
  sortObject: () => sortObject,
@@ -365,6 +367,52 @@ var import_crypto = __toESM(require("crypto"));
365
367
  var import_fs = __toESM(require("fs"));
366
368
  var import_https = __toESM(require("https"));
367
369
  var import_axios = __toESM(require("axios"));
370
+ var signerCache = /* @__PURE__ */ new WeakMap();
371
+ var RequestSigner = class {
372
+ constructor(configuration) {
373
+ if (configuration.apiSecret && !configuration.privateKey) {
374
+ this.apiSecret = configuration.apiSecret;
375
+ return;
376
+ }
377
+ if (configuration.privateKey) {
378
+ let privateKey = configuration.privateKey;
379
+ if (typeof privateKey === "string" && import_fs.default.existsSync(privateKey)) {
380
+ privateKey = import_fs.default.readFileSync(privateKey, "utf-8");
381
+ }
382
+ const keyInput = { key: privateKey };
383
+ if (configuration.privateKeyPassphrase && typeof configuration.privateKeyPassphrase === "string") {
384
+ keyInput.passphrase = configuration.privateKeyPassphrase;
385
+ }
386
+ try {
387
+ this.keyObject = import_crypto.default.createPrivateKey(keyInput);
388
+ this.keyType = this.keyObject.asymmetricKeyType;
389
+ } catch {
390
+ throw new Error(
391
+ "Invalid private key. Please provide a valid RSA or ED25519 private key."
392
+ );
393
+ }
394
+ return;
395
+ }
396
+ throw new Error("Either 'apiSecret' or 'privateKey' must be provided for signed requests.");
397
+ }
398
+ sign(queryParams) {
399
+ const params = buildQueryString(queryParams);
400
+ if (this.apiSecret)
401
+ return import_crypto.default.createHmac("sha256", this.apiSecret).update(params).digest("hex");
402
+ if (this.keyObject && this.keyType) {
403
+ const data = Buffer.from(params);
404
+ if (this.keyType === "rsa")
405
+ return import_crypto.default.sign("RSA-SHA256", data, this.keyObject).toString("base64");
406
+ if (this.keyType === "ed25519")
407
+ return import_crypto.default.sign(null, data, this.keyObject).toString("base64");
408
+ throw new Error("Unsupported private key type. Must be RSA or ED25519.");
409
+ }
410
+ throw new Error("Signer is not properly initialized.");
411
+ }
412
+ };
413
+ var clearSignerCache = function() {
414
+ signerCache = /* @__PURE__ */ new WeakMap();
415
+ };
368
416
  function buildQueryString(params) {
369
417
  if (!params) return "";
370
418
  return Object.entries(params).map(stringifyKeyValuePair).join("&");
@@ -391,39 +439,12 @@ function getTimestamp() {
391
439
  return Date.now();
392
440
  }
393
441
  var getSignature = function(configuration, queryParams) {
394
- const params = buildQueryString(queryParams);
395
- let signature = "";
396
- if (configuration?.apiSecret && !configuration?.privateKey) {
397
- signature = import_crypto.default.createHmac("sha256", configuration.apiSecret).update(params).digest("hex");
398
- } else if (configuration?.privateKey) {
399
- let privateKey = configuration.privateKey;
400
- if (typeof privateKey === "string" && import_fs.default.existsSync(privateKey)) {
401
- privateKey = import_fs.default.readFileSync(privateKey, "utf-8");
402
- }
403
- let keyObject;
404
- try {
405
- const privateKeyObj = { key: privateKey };
406
- if (configuration.privateKeyPassphrase && typeof configuration.privateKeyPassphrase === "string") {
407
- privateKeyObj.passphrase = configuration.privateKeyPassphrase;
408
- }
409
- keyObject = import_crypto.default.createPrivateKey(privateKeyObj);
410
- } catch {
411
- throw new Error(
412
- "Invalid private key. Please provide a valid RSA or ED25519 private key."
413
- );
414
- }
415
- const keyType = keyObject.asymmetricKeyType;
416
- if (keyType === "rsa") {
417
- signature = import_crypto.default.sign("RSA-SHA256", Buffer.from(params), keyObject).toString("base64");
418
- } else if (keyType === "ed25519") {
419
- signature = import_crypto.default.sign(null, Buffer.from(params), keyObject).toString("base64");
420
- } else {
421
- throw new Error("Unsupported private key type. Must be RSA or ED25519.");
422
- }
423
- } else {
424
- throw new Error("Either 'apiSecret' or 'privateKey' must be provided for signed requests.");
442
+ let signer = signerCache.get(configuration);
443
+ if (!signer) {
444
+ signer = new RequestSigner(configuration);
445
+ signerCache.set(configuration, signer);
425
446
  }
426
- return signature;
447
+ return signer.sign(queryParams);
427
448
  };
428
449
  var assertParamExists = function(functionName, paramName, paramValue) {
429
450
  if (paramValue === null || paramValue === void 0) {
@@ -435,25 +456,26 @@ var assertParamExists = function(functionName, paramName, paramValue) {
435
456
  };
436
457
  function setFlattenedQueryParams(urlSearchParams, parameter, key = "") {
437
458
  if (parameter == null) return;
459
+ if (Array.isArray(parameter)) {
460
+ if (key)
461
+ urlSearchParams.set(key, JSON.stringify(parameter));
462
+ else
463
+ for (const item of parameter) {
464
+ setFlattenedQueryParams(urlSearchParams, item, "");
465
+ }
466
+ return;
467
+ }
438
468
  if (typeof parameter === "object") {
439
- if (Array.isArray(parameter)) {
440
- parameter.forEach((item) => setFlattenedQueryParams(urlSearchParams, item, key));
441
- } else {
442
- Object.keys(parameter).forEach(
443
- (currentKey) => setFlattenedQueryParams(
444
- urlSearchParams,
445
- parameter[currentKey],
446
- `${key}${key !== "" ? "." : ""}${currentKey}`
447
- )
448
- );
449
- }
450
- } else {
451
- if (urlSearchParams.has(key)) {
452
- urlSearchParams.append(key, String(parameter));
453
- } else {
454
- urlSearchParams.set(key, String(parameter));
469
+ for (const subKey of Object.keys(parameter)) {
470
+ const subVal = parameter[subKey];
471
+ const newKey = key ? `${key}.${subKey}` : subKey;
472
+ setFlattenedQueryParams(urlSearchParams, subVal, newKey);
455
473
  }
474
+ return;
456
475
  }
476
+ const str = String(parameter);
477
+ if (urlSearchParams.has(key)) urlSearchParams.append(key, str);
478
+ else urlSearchParams.set(key, str);
457
479
  }
458
480
  var setSearchParams = function(url, ...objects) {
459
481
  const searchParams = new URLSearchParams(url.search);
@@ -475,18 +497,13 @@ var httpRequestFunction = async function(axiosArgs, configuration) {
475
497
  ...axiosArgs.options,
476
498
  url: (import_axios.default.defaults?.baseURL ? "" : configuration?.basePath ?? "") + axiosArgs.url
477
499
  };
478
- if (configuration?.keepAlive) {
479
- axiosRequestArgs.httpsAgent = new import_https.default.Agent({
480
- ...configuration?.httpsAgent instanceof import_https.default.Agent ? configuration.httpsAgent.options : {},
481
- keepAlive: true
482
- });
483
- }
484
- if (configuration?.compression) {
500
+ if (configuration?.keepAlive && !configuration?.baseOptions?.httpsAgent)
501
+ axiosRequestArgs.httpsAgent = new import_https.default.Agent({ keepAlive: true });
502
+ if (configuration?.compression)
485
503
  axiosRequestArgs.headers = {
486
504
  ...axiosRequestArgs.headers,
487
505
  "Accept-Encoding": "gzip, deflate, br"
488
506
  };
489
- }
490
507
  const retries = configuration?.retries ?? 0;
491
508
  const backoff = configuration?.backoff ?? 0;
492
509
  let attempt = 0;
@@ -499,7 +516,13 @@ var httpRequestFunction = async function(axiosArgs, configuration) {
499
516
  });
500
517
  const rateLimits = parseRateLimitHeaders(response.headers);
501
518
  return {
502
- data: async () => JSON.parse(response.data),
519
+ data: async () => {
520
+ try {
521
+ return JSON.parse(response.data);
522
+ } catch (err) {
523
+ throw new Error(`Failed to parse JSON response: ${err}`);
524
+ }
525
+ },
503
526
  status: response.status,
504
527
  headers: response.headers,
505
528
  rateLimits
@@ -520,7 +543,11 @@ var httpRequestFunction = async function(axiosArgs, configuration) {
520
543
  let data = {};
521
544
  if (responseData && responseData !== null) {
522
545
  if (typeof responseData === "string" && responseData !== "")
523
- data = JSON.parse(responseData);
546
+ try {
547
+ data = JSON.parse(responseData);
548
+ } catch {
549
+ data = {};
550
+ }
524
551
  else if (typeof responseData === "object")
525
552
  data = responseData;
526
553
  }
@@ -1469,7 +1496,11 @@ function createStreamHandler(websocketBase, streamOrId, id) {
1469
1496
  return {
1470
1497
  on: (event, callback) => {
1471
1498
  if (event === "message") {
1472
- registeredCallback = (data) => callback(data);
1499
+ registeredCallback = (data) => {
1500
+ Promise.resolve(callback(data)).catch((err) => {
1501
+ websocketBase.logger.error(`Error in stream callback: ${err}`);
1502
+ });
1503
+ };
1473
1504
  const callbackSet = websocketBase.streamCallbackMap.get(streamOrId) ?? /* @__PURE__ */ new Set();
1474
1505
  callbackSet.add(registeredCallback);
1475
1506
  websocketBase.streamCallbackMap.set(streamOrId, callbackSet);
@@ -1551,6 +1582,7 @@ function createStreamHandler(websocketBase, streamOrId, id) {
1551
1582
  WebsocketStreamsBase,
1552
1583
  assertParamExists,
1553
1584
  buildQueryString,
1585
+ clearSignerCache,
1554
1586
  createStreamHandler,
1555
1587
  delay,
1556
1588
  getSignature,
@@ -1561,6 +1593,7 @@ function createStreamHandler(websocketBase, streamOrId, id) {
1561
1593
  removeEmptyValue,
1562
1594
  replaceWebsocketStreamsPlaceholders,
1563
1595
  sendRequest,
1596
+ setFlattenedQueryParams,
1564
1597
  setSearchParams,
1565
1598
  shouldRetryRequest,
1566
1599
  sortObject,