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

94 lines
2.3 KiB
TypeScript

/* eslint-disable @typescript-eslint/no-explicit-any */
import { FillsFeed } from '@blockworks-foundation/mango-feeds'
import { getNextBarTime } from './helpers'
import mangoStore from '@store/mangoStore'
let subscriptionItem: any = {}
const fillsFeed = new FillsFeed(`wss://api.mngo.cloud/fills/v1/`, {
reconnectionIntervalMs: 10_000,
reconnectionMaxAttempts: 60,
})
fillsFeed.onConnect(() => {
console.log('[FillsFeed] Connected')
})
fillsFeed.onDisconnect(() => {
console.log('[FillsFeed] Disconnected, retrying...')
})
fillsFeed.onFill((update) => {
const marketName = mangoStore.getState().selectedMarket.name
if (update.status == 'revoke' || update.marketName != marketName) {
return
}
const currTime = new Date(update.event.timestamp).getTime()
const lastBar = subscriptionItem.lastBar
const resolution = subscriptionItem.resolution
const nextBarTime = getNextBarTime(lastBar, resolution)
const price = update.event.price
const size = update.event.quantity
let bar
if (currTime >= nextBarTime) {
bar = {
time: nextBarTime,
open: price,
high: price,
low: price,
close: price,
volume: size,
}
} else {
bar = {
...lastBar,
high: Math.max(lastBar.high, price),
low: Math.min(lastBar.low, price),
close: price,
volume: lastBar.volume + size,
}
}
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,
}
if (!fillsFeed.connected()) {
return
}
console.log('[FillsFeed] subscribe', subscriberUID)
fillsFeed.subscribe({ marketId: symbolInfo.address })
}
export function unsubscribeFromStream(subscriberUID: string) {
setTimeout(() => {
const marketAddress = subscriberUID.split('_')[0]
if (!fillsFeed.connected()) {
return
}
console.warn('[FillsFeed] unsubscribe', subscriberUID)
fillsFeed.unsubscribe(marketAddress)
}, 5000)
}
export function closeSocket() {
fillsFeed.disconnect()
}
export function isOpen(ws?: WebSocket): ws is WebSocket {
return fillsFeed.connected()
}