feat(): add all symbols allLiquidaitons ws example
This commit is contained in:
92
examples/ws-public-allLiquidations.ts
Normal file
92
examples/ws-public-allLiquidations.ts
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
import { RestClientV5, WebsocketClient, isWsAllLiquidationEvent } from '../src';
|
||||||
|
|
||||||
|
// or
|
||||||
|
// import {
|
||||||
|
// RestClientV5,
|
||||||
|
// WebsocketClient,
|
||||||
|
// isWsAllLiquidationEvent,
|
||||||
|
// } from 'bybit-api';
|
||||||
|
|
||||||
|
function onAllLiquidationEvent(event) {
|
||||||
|
console.log(
|
||||||
|
new Date(),
|
||||||
|
'allLiquidationEvent',
|
||||||
|
JSON.stringify(event, null, 2),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const wsClient = new WebsocketClient({});
|
||||||
|
|
||||||
|
wsClient.on('update', (data) => {
|
||||||
|
if (isWsAllLiquidationEvent(data)) {
|
||||||
|
return onAllLiquidationEvent(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('raw unahndled message received ', JSON.stringify(data));
|
||||||
|
});
|
||||||
|
|
||||||
|
wsClient.on('open', (data) => {
|
||||||
|
console.log('connection opened open:', data.wsKey);
|
||||||
|
});
|
||||||
|
wsClient.on('response', (data) => {
|
||||||
|
console.log('log response: ', JSON.stringify(data, null, 2));
|
||||||
|
});
|
||||||
|
wsClient.on('reconnect', ({ wsKey }) => {
|
||||||
|
console.log('ws automatically reconnecting.... ', wsKey);
|
||||||
|
});
|
||||||
|
wsClient.on('reconnected', (data) => {
|
||||||
|
console.log('ws has reconnected ', data?.wsKey);
|
||||||
|
});
|
||||||
|
|
||||||
|
wsClient.on('exception', (data) => {
|
||||||
|
console.error('ws exception: ', data);
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* If you want to receive data for all available symbols, this websocket topic
|
||||||
|
* requires you to subscribe to each symbol individually.
|
||||||
|
*
|
||||||
|
* This can be easily automated by fetching a list of symbols via the REST client,
|
||||||
|
* generating a list of topics (one per symbol), before simply passing an
|
||||||
|
* array of topics to the websocket client per product group (linear & inverse perps).
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
async function start() {
|
||||||
|
const restClientV5 = new RestClientV5();
|
||||||
|
|
||||||
|
const allSymbolsV5ResultLinear = await restClientV5.getTickers({
|
||||||
|
category: 'linear',
|
||||||
|
});
|
||||||
|
const allSymbolsV5ResultInverse = await restClientV5.getTickers({
|
||||||
|
category: 'inverse',
|
||||||
|
});
|
||||||
|
|
||||||
|
const allLinearSymbols = allSymbolsV5ResultLinear.result.list.map(
|
||||||
|
(ticker) => ticker.symbol,
|
||||||
|
);
|
||||||
|
const allInverseSymbols = allSymbolsV5ResultInverse.result.list.map(
|
||||||
|
(ticker) => ticker.symbol,
|
||||||
|
);
|
||||||
|
|
||||||
|
console.log('all v5 linear symbols: ', JSON.stringify(allLinearSymbols));
|
||||||
|
console.log('all v5 inverse symbols: ', JSON.stringify(allInverseSymbols));
|
||||||
|
|
||||||
|
const TOPIC_NAME = 'allLiquidation';
|
||||||
|
|
||||||
|
// Make an array of topics ready for submission
|
||||||
|
const allLinearTopics = allLinearSymbols.map(
|
||||||
|
(symbol) => `${TOPIC_NAME}.${symbol}`,
|
||||||
|
);
|
||||||
|
const inverseTopics = allInverseSymbols.map(
|
||||||
|
(symbol) => `${TOPIC_NAME}.${symbol}`,
|
||||||
|
);
|
||||||
|
|
||||||
|
// subscribe to all linear symbols
|
||||||
|
wsClient.subscribeV5(allLinearTopics, 'linear');
|
||||||
|
|
||||||
|
// subscribe to all inverse symbols
|
||||||
|
wsClient.subscribeV5(inverseTopics, 'inverse');
|
||||||
|
}
|
||||||
|
|
||||||
|
start().catch((e) => console.error('exception in main logic: ', e));
|
||||||
@@ -14,6 +14,29 @@ import {
|
|||||||
WSPositionEventV5,
|
WSPositionEventV5,
|
||||||
} from '../types/websockets/ws-events';
|
} from '../types/websockets/ws-events';
|
||||||
|
|
||||||
|
export interface BybitEventV5<TData = unknown> {
|
||||||
|
topic: string;
|
||||||
|
type: string;
|
||||||
|
ts: number;
|
||||||
|
data: TData;
|
||||||
|
wsKey: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isWsEventV5<TEventData = unknown>(
|
||||||
|
event: unknown,
|
||||||
|
): event is BybitEventV5<TEventData> {
|
||||||
|
if (
|
||||||
|
typeof event !== 'object' ||
|
||||||
|
!event ||
|
||||||
|
typeof event['topic'] !== 'string' ||
|
||||||
|
typeof event['type'] !== 'string'
|
||||||
|
) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Type guard to detect a V5 orderbook event (delta & snapshots)
|
* Type guard to detect a V5 orderbook event (delta & snapshots)
|
||||||
*
|
*
|
||||||
@@ -141,3 +164,17 @@ export function isTopicSubscriptionConfirmation(
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function isWsAllLiquidationEvent(
|
||||||
|
event: unknown,
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
): event is BybitEventV5<any[]> {
|
||||||
|
if (!isWsEventV5(event)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event['topic'].startsWith('allLiquidation')) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user