mango-v4-ui/apis/birdeye/streaming.ts

107 lines
2.4 KiB
TypeScript
Raw Normal View History

/* eslint-disable @typescript-eslint/no-explicit-any */
import { parseResolution, getNextBarTime, socketUrl } from './helpers'
2022-12-15 15:33:31 -08:00
let subscriptionItem: any = {}
// Create WebSocket connection.
const socket = new WebSocket(socketUrl, 'echo-protocol')
2022-12-15 15:33:31 -08:00
// Connection opened
socket.addEventListener('open', (_event) => {
console.log('[socket] Connected birdeye')
2022-12-15 15:33:31 -08:00
})
// Listen for messages
socket.addEventListener('message', (msg) => {
const data = JSON.parse(msg.data)
2023-01-20 05:45:43 -08:00
if (data.type !== 'PRICE_DATA') return console.warn(data)
2022-12-15 15:33:31 -08:00
const currTime = data.data.unixTime * 1000
const lastBar = subscriptionItem.lastBar
const resolution = subscriptionItem.resolution
const nextBarTime = getNextBarTime(lastBar, resolution)
let bar
if (currTime >= nextBarTime) {
bar = {
time: nextBarTime,
open: data.data.o,
high: data.data.h,
low: data.data.l,
close: data.data.c,
volume: data.data.v,
}
} else {
bar = {
...lastBar,
high: Math.max(lastBar.high, data.data.h),
low: Math.min(lastBar.low, data.data.l),
close: data.data.c,
volume: data.data.v,
}
}
subscriptionItem.lastBar = bar
subscriptionItem.callback(bar)
})
export function subscribeOnStream(
symbolInfo: any,
resolution: any,
onRealtimeCallback: any,
subscriberUID: any,
onResetCacheNeededCallback: any,
lastBar: any
) {
subscriptionItem = {
resolution,
lastBar,
callback: onRealtimeCallback,
}
const msg = {
type: 'SUBSCRIBE_PRICE',
data: {
chartType: parseResolution(resolution),
address: symbolInfo.address,
2022-12-15 22:13:00 -08:00
currency: symbolInfo.type || 'usd',
2022-12-15 15:33:31 -08:00
},
}
if (!isOpen(socket)) {
console.warn('Socket Closed')
socket.addEventListener('open', (_event) => {
socket.send(JSON.stringify(msg))
})
return
}
console.warn('[subscribeBars birdeye]')
2022-12-15 15:33:31 -08:00
socket.send(JSON.stringify(msg))
}
export function unsubscribeFromStream() {
const msg = {
type: 'UNSUBSCRIBE_PRICE',
}
if (!isOpen(socket)) {
console.warn('Socket Closed')
return
}
console.warn('[unsubscribeBars birdeye]')
2022-12-15 15:33:31 -08:00
socket.send(JSON.stringify(msg))
}
export function closeSocket() {
if (!isOpen(socket)) {
console.warn('Socket Closed birdeye')
return
}
console.warn('[closeSocket birdeye]')
socket.close()
}
export function isOpen(ws?: WebSocket) {
const sock = ws || socket
return sock.readyState === sock.OPEN
}