binance_bot/node_modules/binance/lib/util/requestUtils.js
2025-01-07 19:06:55 +01:00

203 lines
7.9 KiB
JavaScript

"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.asArray = exports.appendEventMarket = exports.getWsKeyWithContext = exports.getContextFromWsKey = exports.appendEventIfMissing = exports.logInvalidOrderId = exports.isWsPong = exports.isPublicEndpoint = exports.getRestBaseUrl = exports.getServerTimeEndpoint = exports.getRequestSignature = exports.serialiseParams = exports.generateNewOrderId = exports.getOrderIdPrefix = void 0;
const nanoid_1 = require("nanoid");
const node_support_1 = require("./node-support");
// function throwUnhandledSwitch(x: never, msg: string): never {
// throw new Error(msg);
// }
function getOrderIdPrefix(network) {
switch (network) {
case 'spot':
case 'spot1':
case 'spot2':
case 'spot3':
case 'spot4':
return 'U5D79M5B';
case 'usdm':
case 'usdmtest':
case 'coinm':
case 'coinmtest':
case 'papi':
return '15PC4ZJy';
case 'voptions':
case 'voptionstest':
return '';
default:
// throwUnhandledSwitch(network, `"${network}" unhandled`);
return 'U5D79M5B';
}
}
exports.getOrderIdPrefix = getOrderIdPrefix;
function generateNewOrderId(network) {
const id = (0, nanoid_1.nanoid)(25);
const prefixedId = 'x-' + getOrderIdPrefix(network) + id;
return prefixedId;
}
exports.generateNewOrderId = generateNewOrderId;
function serialiseParams(params = {}, strict_validation = false, encodeValues = false, filterUndefinedParams = false) {
const paramKeys = !filterUndefinedParams
? Object.keys(params)
: Object.keys(params).filter((key) => typeof params[key] !== 'undefined');
return paramKeys
.map((key) => {
const value = params[key];
if (strict_validation === true && typeof value === 'undefined') {
throw new Error('Failed to sign API request due to undefined parameter');
}
const encodedValue = encodeValues ? encodeURIComponent(value) : value;
return `${key}=${encodedValue}`;
})
.join('&');
}
exports.serialiseParams = serialiseParams;
function getRequestSignature(data, key, secret, recvWindow, timestamp, strictParamValidation, filterUndefinedParams) {
var _a, _b;
return __awaiter(this, void 0, void 0, function* () {
// Optional, set to 5000 by default. Increase if timestamp/recvWindow errors are seen.
const requestRecvWindow = (_b = (_a = data === null || data === void 0 ? void 0 : data.recvWindow) !== null && _a !== void 0 ? _a : recvWindow) !== null && _b !== void 0 ? _b : 5000;
if (key && secret) {
const requestParams = Object.assign(Object.assign({}, data), { timestamp, recvWindow: requestRecvWindow });
const serialisedParams = serialiseParams(requestParams, strictParamValidation, true, filterUndefinedParams);
const signature = yield (0, node_support_1.signMessage)(serialisedParams, secret);
requestParams.signature = signature;
return {
requestBody: Object.assign({}, data),
serialisedParams,
timestamp: timestamp,
signature: signature,
recvWindow: requestRecvWindow,
};
}
return { requestBody: data, serialisedParams: undefined };
});
}
exports.getRequestSignature = getRequestSignature;
const BINANCE_BASE_URLS = {
// spot/margin/savings/mining
spot: 'https://api.binance.com',
spot1: 'https://api.binance.com',
spot2: 'https://api1.binance.com',
spot3: 'https://api2.binance.com',
spot4: 'https://api3.binance.com',
// USDM Futures
usdm: 'https://fapi.binance.com',
usdmtest: 'https://testnet.binancefuture.com',
// COINM Futures
coinm: 'https://dapi.binance.com',
coinmtest: 'https://testnet.binancefuture.com',
// Vanilla Options
voptions: 'https://vapi.binance.com',
voptionstest: 'https://testnet.binanceops.com',
// Portfolio Margin
papi: 'https://papi.binance.com',
};
function getServerTimeEndpoint(urlKey) {
switch (urlKey) {
case 'spot':
case 'spot1':
case 'spot2':
case 'spot3':
case 'spot4':
default:
return 'api/v3/time';
case 'usdm':
case 'usdmtest':
return 'fapi/v1/time';
case 'coinm':
case 'coinmtest':
return 'dapi/v1/time';
case 'voptions':
case 'voptionstest':
return 'vapi/v1/time';
}
}
exports.getServerTimeEndpoint = getServerTimeEndpoint;
function getRestBaseUrl(clientType, restClientOptions) {
if (restClientOptions.baseUrl) {
return restClientOptions.baseUrl;
}
if (restClientOptions.baseUrlKey) {
return BINANCE_BASE_URLS[restClientOptions.baseUrlKey];
}
return BINANCE_BASE_URLS[clientType];
}
exports.getRestBaseUrl = getRestBaseUrl;
function isPublicEndpoint(endpoint) {
if (endpoint.startsWith('v2/public')) {
return true;
}
if (endpoint.startsWith('public/linear')) {
return true;
}
return false;
}
exports.isPublicEndpoint = isPublicEndpoint;
function isWsPong(response) {
return (response.request &&
response.request.op === 'ping' &&
response.ret_msg === 'pong' &&
response.success === true);
}
exports.isWsPong = isWsPong;
function logInvalidOrderId(orderIdProperty, expectedOrderIdPrefix, params) {
console.warn(`WARNING: '${orderIdProperty}' invalid - it should be prefixed with ${expectedOrderIdPrefix}. Use the 'client.generateNewOrderId()' REST client utility method to generate a fresh order ID on demand. Original request: ${JSON.stringify(params)}`);
}
exports.logInvalidOrderId = logInvalidOrderId;
function appendEventIfMissing(wsMsg, wsKey) {
if (wsMsg.e) {
return;
}
if (wsKey.indexOf('bookTicker') !== -1) {
wsMsg.e = 'bookTicker';
return;
}
if (wsKey.indexOf('diffBookDepth') !== -1) {
wsMsg.e = 'diffBookDepth';
return;
}
if (wsKey.indexOf('partialBookDepth') !== -1 ||
wsKey.indexOf('depth') !== -1) {
wsMsg.e = 'partialBookDepth';
return;
}
// console.warn('couldnt derive event type: ', wsKey);
}
exports.appendEventIfMissing = appendEventIfMissing;
function getContextFromWsKey(wsKey) {
const [market, streamName, symbol, listenKey, ...otherParams] = wsKey.split('_');
return {
symbol: symbol === 'undefined' ? undefined : symbol,
market: market,
isTestnet: market.includes('estnet'),
isUserData: wsKey.includes('userData'),
streamName,
listenKey: listenKey === 'undefined' ? undefined : listenKey,
otherParams,
};
}
exports.getContextFromWsKey = getContextFromWsKey;
function getWsKeyWithContext(market, streamName, symbol = undefined, listenKey = undefined, ...otherParams) {
return [market, streamName, symbol, listenKey, ...otherParams].join('_');
}
exports.getWsKeyWithContext = getWsKeyWithContext;
function appendEventMarket(wsMsg, wsKey) {
const { market } = getContextFromWsKey(wsKey);
wsMsg.wsMarket = market;
wsMsg.wsKey = wsKey;
}
exports.appendEventMarket = appendEventMarket;
function asArray(el) {
return Array.isArray(el) ? el : [el];
}
exports.asArray = asArray;
//# sourceMappingURL=requestUtils.js.map