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