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

80 lines
1.7 KiB
TypeScript
Raw Normal View History

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')
})
// 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
},
}
socket.send(JSON.stringify(msg))
}
export function unsubscribeFromStream() {
const msg = {
type: 'UNSUBSCRIBE_PRICE',
}
socket.send(JSON.stringify(msg))
}