@nktkas/hyperliquid
Version:
Hyperliquid API SDK for all major JS runtimes, written in TypeScript.
74 lines (73 loc) • 2.67 kB
JavaScript
/**
* Identity-formation utilities for WebSocket request matching.
* @module
*/ /** Matches a `0x`-prefixed hex string. */ const HEX_REGEX = /^0x[0-9a-f]+$/i;
/**
* Builds a stable string identifier from an arbitrary value: payloads with
* the same logical content produce the same id.
*
* Sorts object keys recursively and lowercases hex addresses.
*
* @example
* ```ts ignore
* requestToId({ user: "0xAbC123", type: "userFills" });
* // => '{"type":"userFills","user":"0xabc123"}'
* ```
*/ export function requestToId(value) {
return JSON.stringify(normalize(value));
}
/**
* Counts the leaf values in `value`; a higher count means a more specific payload.
*
* @example
* ```ts ignore
* specificity({ type: "candle", coin: "ETH", interval: "1m" });
* // => 3
* ```
*/ export function specificity(value) {
if (typeof value !== "object" || value === null) return 1;
return Object.values(value).reduce((sum, item)=>sum + specificity(item), 0);
}
/**
* Returns true if every field of `subset` is present in `superset` with an equal value.
*
* @example
* ```ts ignore
* isSubset({ coin: "BTC" }, { coin: "BTC", nSigFigs: null }); // => true
* isSubset({ coin: "BTC", nSigFigs: 5 }, { coin: "BTC" }); // => false
* ```
*/ export function isSubset(subset, superset) {
// Strings: compare hex addresses case-insensitively, others strictly
if (typeof subset === "string" && typeof superset === "string") {
return HEX_REGEX.test(subset) && HEX_REGEX.test(superset) ? subset.toLowerCase() === superset.toLowerCase() : subset === superset;
}
// Primitives or type mismatch
if (typeof subset !== "object" || typeof superset !== "object" || subset === null || superset === null) {
return subset === superset;
}
// Arrays: must match element by element
if (Array.isArray(subset)) {
return Array.isArray(superset) && subset.length === superset.length && subset.every((item, i)=>isSubset(item, superset[i]));
}
// Objects: all keys in subset must exist in superset with matching values
const sub = subset;
const sup = superset;
return Object.keys(sub).every((key)=>key in sup && isSubset(sub[key], sup[key]));
}
/** Recursively sorts object keys and lowercases hex strings. */ function normalize(value) {
if (typeof value === "string" && HEX_REGEX.test(value)) {
return value.toLowerCase();
}
if (Array.isArray(value)) {
return value.map(normalize);
}
if (typeof value === "object" && value !== null) {
const result = {};
for (const key of Object.keys(value).sort()){
result[key] = normalize(value[key]);
}
return result;
}
return value;
}
//# sourceMappingURL=_id.js.map