You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

61 lines
2.0 KiB

// /home/def/monitor/backend/providers/klingex.js
//
// Minimal KlingEx provider used ONLY for ETHO and EGAZ (spot price).
// We intentionally do NOT try to use KlingEx for all assets.
// This provider returns a consistent shape expected by server.js:
//
// { price: <number>, points: [], source: 'klingex:sdk' }
//
// Pair input accepted as "ETHO-USDT" or "ETHO_USDT" (case-insensitive).
const { KlingEx } = require("klingex");
let client = null;
async function getClient() {
if (client) return client;
client = new KlingEx(); // public endpoints work without auth for markets/tickers
return client;
}
function normalizePair(pair) {
const p = String(pair || "").trim().toUpperCase().replace("_", "-");
const m = p.match(/^([A-Z0-9]+)-([A-Z0-9]+)$/);
if (!m) return null;
return { base: m[1], quote: m[2], dash: `${m[1]}-${m[2]}`, underscore: `${m[1]}_${m[2]}` };
}
async function fetchPair(pair) {
const norm = normalizePair(pair);
if (!norm) throw new Error(`Bad klingex_pair: ${pair}`);
const kx = await getClient();
// KlingEx SDK: client.markets.tickers() -> array of tickers like:
// { ticker_id: 'ETHO_USDT', last_price: '0.005', ... } (or sometimes integer-ish strings)
const tickers = await kx.markets.tickers();
if (!Array.isArray(tickers)) {
throw new Error(`KlingEx tickers() returned non-array`);
}
const t = tickers.find(x => String(x?.ticker_id || "").toUpperCase() === norm.underscore);
if (!t) {
throw new Error(`KlingEx: pair not found in tickers(): ${norm.underscore}`);
}
// Prefer last_price. Some exchanges also provide "last" etc, but your data uses last_price.
const raw = t.last_price ?? t.last ?? t.price ?? null;
const price = raw != null ? Number(raw) : NaN;
if (!isFinite(price)) {
throw new Error(`KlingEx: non-numeric last_price for ${norm.underscore}: ${String(raw)}`);
}
return {
price, // <-- server.js expects r.price
points: [], // no OHLCV implemented yet
source: "klingex:sdk"
};
}
module.exports = { fetchPair };