@bcswaper/apis
Version:
bcswaper apis
1 lines • 1.53 kB
JavaScript
import{ClientSettings}from"../context";import{isObjectEmpty}from"../utils";export class OrderbookHandler{constructor(e){this.symbol=e,this.orderbook={bids:[],asks:[]}}async initialize(e){const{id:s,contents:i}=e;i.bids&&(this.orderbook.bids=i.bids),i.asks&&(this.orderbook.asks=i.asks)}mapAndSortOrders(e,s){return(s===BookSide.BIDS?e.bids:e.asks).map((e=>({price:e.price,size:e.size}))).sort(((e,i)=>s===BookSide.BIDS?i.price-e.price:e.price-i.price)).slice(0,ClientSettings.OrderbookLength)}async update(e){const{id:s,contents:i}=e;if(i)for(const e of i){let s=await isObjectEmpty(e.bids);if(s)if(s=await isObjectEmpty(e.asks),s);else{const s=e.asks[0],i=parseFloat(s[0]),o=parseFloat(s[1]),t=this.orderbook.bids.findIndex((e=>e.price===i));this.manageOrderUpdates(i,o,t,BookSide.ASKS,this.orderbook.asks)}else{const s=e.bids[0],i=parseFloat(s[0]),o=parseFloat(s[1]),t=this.orderbook.bids.findIndex((e=>e.price===i));this.manageOrderUpdates(i,o,t,BookSide.BIDS,this.orderbook.bids)}}}manageOrderUpdates(e,s,i,o,t){if(s>0){if(-1!==i)t[i].size=s;else{const i=this.findInsertionIndex(e,t,o);t.splice(i,0,{price:e,size:s})}t.length>ClientSettings.OrderbookLength&&(t.length=ClientSettings.OrderbookLength)}else-1!==i&&t.splice(i,1)}findInsertionIndex(e,s,i){let o=0,t=s.length-1;for(;o<=t;){const r=Math.floor((o+t)/2),n=s[r].price;if(n===e)return r;i===BookSide.BIDS?e>n?t=r-1:o=r+1:e<n?t=r-1:o=r+1}return o}getOrderbook(){return this.orderbook}}export var BookSide;!function(e){e.BIDS="bids",e.ASKS="asks"}(BookSide||(BookSide={}));