UNPKG

bitso-ts

Version:

Simple TypeScript Bitso API Wrapper for Public and Private end points. [![MIT License](https://img.shields.io/apm/l/atomic-design-ui.svg?)](https://github.com/amircp/bitso-ts/blob/master/LICENSE) ## Installation

224 lines (195 loc) 6.97 kB
import { AxiosRequestConfig, AxiosResponse } from 'axios'; import HttpClient from '../../services/HttpClient'; import SigningRequest from '../helpers/SigningRequest'; import { host } from '../types/client'; import { Ticker } from '../types/IBooks'; import IPlaceOrder, { IOrderID } from '../types/IPlaceOrder'; import { IOpenOrders, IOrderTrades } from '../types/Trades'; export class TradeAPI extends HttpClient { private _signReq: SigningRequest; private apiVersion: string = ""; constructor( { version, test }: { version: string; test?: boolean }, signRequest: SigningRequest ) { super(test ? host.TEST : host.PROD); this.apiVersion = version; this._signReq = signRequest; this._initializeResponseInterceptor(); this._initializeRequestInterceptor(); } public async getOpenOrders({ book, marker, sort, limit }: { book?: Ticker, marker?: string, sort?: 'desc' | 'asc', limit?: string }): Promise<[IOpenOrders]> { const endpoint = 'open_orders'; let queryParams = new URLSearchParams(); if(book) queryParams.set('book', book); if(marker) queryParams.set('marker', marker); if(sort) queryParams.set('sort', sort); if(limit) queryParams.set('limit', limit); this._signReq.method = 'GET'; this._signReq.payload = {}; this._signReq.endpoint = endpoint + '?' + queryParams; return await this._httpClient.get<[IOpenOrders]>('/' + this.apiVersion + '/' + endpoint + '?' + queryParams); } public async cancelOrder({ oid, oids, origin_ids }:{ oid?: string, oids?: string[], origin_ids?: string[] }): Promise<[string]> { const endpoint = 'orders'; let endpointFinal = endpoint; if(oid) { endpointFinal = endpointFinal.concat('/' + oid); } else if(oids) { let queryParams = new URLSearchParams(); queryParams.set('oids', oids.join(',')); endpointFinal = endpointFinal.concat('?' + queryParams); } else if(origin_ids) { let queryParams = new URLSearchParams(); queryParams.set('origin_ids', origin_ids.join(',')); endpointFinal = endpointFinal.concat('?' + queryParams); } else { endpointFinal = endpointFinal.concat('/all'); } this._signReq.method = 'DELETE'; this._signReq.payload = {}; this._signReq.endpoint = endpointFinal; return await this._httpClient.delete<[string]>('/' + this.apiVersion + '/' + endpointFinal); } public async placeOrder(orderPayload: IPlaceOrder): Promise<IOrderID> { const endpoint = 'orders'; this._signReq.method = 'POST'; this._signReq.payload = orderPayload; this._signReq.endpoint = endpoint; return await this._httpClient.post<IOrderID>('/' + this.apiVersion + '/' + endpoint, orderPayload); } public async placeMarketBuyOrder(currency: string, quantity: string): Promise<IOrderID> { const request: IPlaceOrder = { book: currency, side: 'buy', type: 'market', minor: quantity }; return await this.placeOrder(request); } public async placeMarketSellOrder(currency: string, quantity: string): Promise<IOrderID> { const request: IPlaceOrder = { book: currency, side: 'sell', type: 'market', major: quantity, }; return await this.placeOrder(request); } public async placeLimitSellOrder({currency, limit_price, quantity} : {currency: Ticker, limit_price: string, quantity: string}): Promise<IOrderID> { const request: IPlaceOrder = { book: currency, side: 'sell', type: 'limit', price: limit_price, major: quantity, }; return await this.placeOrder(request); } public async placeLimitBuyOrder({currency, limit_price, quantity} : {currency: Ticker, limit_price: string, quantity: string}): Promise<IOrderID> { const request: IPlaceOrder = { book: currency, side: 'buy', type: 'limit', price: limit_price, major: quantity, }; return await this.placeOrder(request); } public async getUserTrades({ oid, origin_id }:{ oid?: string, origin_id?: string }): Promise<[IOrderTrades]> { let endpoint = 'user_trades'; let queryParams = new URLSearchParams(); if(oid) queryParams.set('oid', oid); if(origin_id) queryParams.set('origin_id', origin_id); let endpointFinal = endpoint + '/'; if(queryParams) { endpointFinal = endpoint.concat('?' + queryParams); } this._signReq.method = 'GET'; this._signReq.payload = {}; this._signReq.endpoint = endpointFinal; return await this._httpClient.get<[IOrderTrades]>('/' + this.apiVersion + '/' + endpointFinal); } public async getOrderTrades({origin_id, oid} : {origin_id?: string, oid?: string}): Promise<[IOrderTrades]> { let endpoint = 'order_trades'; let queryParams = new URLSearchParams(); if(oid) queryParams.set('oid', oid); if(origin_id) queryParams.set('origin_id', origin_id); let endpointFinal = endpoint + '/'; if(queryParams) { endpointFinal = endpoint.concat('?' + queryParams); } this._signReq.method = 'GET'; this._signReq.payload = {}; this._signReq.endpoint = endpointFinal; return await this._httpClient.get<[IOrderTrades]>('/' + this.apiVersion + '/' + endpointFinal); } public async lookupOrders({ oid, oids, origin_ids }:{ oid?: string, oids?: string[], origin_ids?: string[] }): Promise<[IOpenOrders]> { const endpoint = 'orders'; let endpointFinal = endpoint; if(oid) { endpointFinal = endpointFinal.concat('/' + oid); } else if(oids) { let queryParams = new URLSearchParams(); queryParams.set('oids', oids.join(',')); endpointFinal = endpointFinal.concat('?' + queryParams); } else if(origin_ids) { let queryParams = new URLSearchParams(); queryParams.set('origin_ids', origin_ids.join(',')); endpointFinal = endpointFinal.concat('?' + queryParams); } else { endpointFinal = endpoint } this._signReq.method = 'GET'; this._signReq.payload = {}; this._signReq.endpoint = endpointFinal; return await this._httpClient.get<[IOpenOrders]>('/' + this.apiVersion + '/' + endpointFinal); } private _initializeResponseInterceptor(): void { this._httpClient.interceptors.response.use( this._handleResponse, this._handleError ); } private _initializeRequestInterceptor = () => { this._httpClient.interceptors.request.use( this._handleRequest, this._handleError ); }; private _handleRequest = (config: AxiosRequestConfig) => { config.headers['Authorization'] = this._signReq.getHeader(); config.headers['Content-Type'] = 'application/json'; return config; }; private _handleResponse = ({ data }: AxiosResponse) => data.payload; protected _handleError = (error: any) => Promise.reject(error?.error ?? error); }