@firefly-exchange/firefly-client
Version:
The Firefly Client Library allows traders to sign, create, retrieve and listen to orders on Firefly Exchange.
211 lines • 7.54 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.WebSockets = void 0;
/* eslint-disable no-unused-vars */
const library_1 = require("@firefly-exchange/library");
// @ts-ignore
const WebSocket = require("ws");
const callbackListeners = {};
class WebSockets {
constructor(url) {
this.setAuthToken = (token) => {
this.token = token;
};
this.setAPIToken = (apiToken) => __awaiter(this, void 0, void 0, function* () {
this.apiToken = apiToken;
});
// Emitted when any price bin on the oderbook is updated.
this.onOrderBookUpdate = (cb) => {
callbackListeners[library_1.SOCKET_EVENTS.OrderbookUpdateKey] = cb;
};
this.onOrderBookPartialDepthUpdate = (cb) => {
callbackListeners[library_1.SOCKET_EVENTS.OrderbookDepthUpdateKey] = cb;
};
this.onMarketDataUpdate = (cb) => {
callbackListeners[library_1.SOCKET_EVENTS.MarketDataUpdateKey] = cb;
};
this.onMarketHealthChange = (cb) => {
callbackListeners[library_1.SOCKET_EVENTS.MarketHealthKey] = cb;
};
this.onCandleStickUpdate = (symbol, interval, cb) => {
callbackListeners[this.createDynamicUrl(library_1.SOCKET_EVENTS.GET_LAST_KLINE_WITH_INTERVAL, {
symbol,
interval,
})] = cb;
};
this.onExchangeHealthChange = (cb) => {
callbackListeners[library_1.SOCKET_EVENTS.ExchangeHealthKey] = cb;
};
this.onTickerUpdate = (cb) => {
callbackListeners[library_1.SOCKET_EVENTS.TickerUpdate] = cb;
};
// TODO: figure out what it does
this.onRecentTrades = (cb) => {
callbackListeners[library_1.SOCKET_EVENTS.RecentTradesKey] = cb;
};
this.onUserOrderUpdate = (cb) => {
callbackListeners[library_1.SOCKET_EVENTS.OrderUpdateKey] = cb;
};
this.onUserOrderSentForSettlementUpdate = (cb) => {
callbackListeners[library_1.SOCKET_EVENTS.OrderSentForSettlementUpdate] = cb;
};
this.onUserOrderRequeueUpdate = (cb) => {
callbackListeners[library_1.SOCKET_EVENTS.OrderRequeueUpdate] = cb;
};
this.onUserOrderCancelOnRevertUpdate = (cb) => {
callbackListeners[library_1.SOCKET_EVENTS.OrderCancelledOnReversionUpdate] = cb;
};
this.onUserPositionUpdate = (cb) => {
callbackListeners[library_1.SOCKET_EVENTS.PositionUpdateKey] = cb;
};
this.onUserUpdates = (cb) => {
callbackListeners[library_1.SOCKET_EVENTS.UserTradeKey] = cb;
};
this.onUserAccountDataUpdate = (cb) => {
callbackListeners[library_1.SOCKET_EVENTS.AccountDataUpdateKey] = cb;
};
this.url = url;
this.token = "";
this.apiToken = "";
}
createDynamicUrl(dynamicUrl, object) {
// eslint-disable-next-line no-restricted-syntax, guard-for-in
for (const key in object) {
dynamicUrl = dynamicUrl.replace(`{${key}}`, object[key]);
}
return dynamicUrl;
}
/**
* opens socket instance connection
*/
open() {
return __awaiter(this, void 0, void 0, function* () {
const socket = new WebSocket(this.url);
this.socketInstance = socket;
const socketOpenPromise = new Promise(function (resolve, reject) {
socket.onopen = function () {
resolve(true);
};
socket.onerror = function (err) {
reject(err);
};
});
this.socketInstance.onmessage = (event) => {
event = JSON.parse(event.data);
if (callbackListeners[event.eventName]) {
callbackListeners[event.eventName](event.data);
}
};
return socketOpenPromise;
});
}
/**
* closes the socket instance connection
*/
close() {
if (this.socketInstance) {
this.socketInstance.close();
}
Object.keys(callbackListeners).forEach(function (key) {
delete callbackListeners[key];
});
}
subscribeGlobalUpdatesBySymbol(symbol) {
if (!this.socketInstance)
return false;
this.socketInstance.send(JSON.stringify([
"SUBSCRIBE",
[
{
e: library_1.SOCKET_EVENTS.GLOBAL_UPDATES_ROOM,
p: symbol,
},
],
]));
return true;
}
unsubscribeGlobalUpdatesBySymbol(symbol) {
if (!this.socketInstance)
return false;
this.socketInstance.send(JSON.stringify([
"UNSUBSCRIBE",
[
{
e: library_1.SOCKET_EVENTS.GLOBAL_UPDATES_ROOM,
p: symbol,
},
],
]));
return true;
}
subscribeOrderBookDepthStreamBySymbol(symbol, depth = "") {
if (!this.socketInstance)
return false;
this.socketInstance.send(JSON.stringify([
"SUBSCRIBE",
[
{
e: library_1.SOCKET_EVENTS.ORDERBOOK_DEPTH_STREAM_ROOM,
p: symbol,
d: depth,
},
],
]));
return true;
}
unsubscribeOrderBookDepthStreamBySymbol(symbol, depth = "") {
if (!this.socketInstance)
return false;
this.socketInstance.send(JSON.stringify([
"UNSUBSCRIBE",
[
{
e: library_1.SOCKET_EVENTS.ORDERBOOK_DEPTH_STREAM_ROOM,
p: symbol,
d: depth,
},
],
]));
return true;
}
subscribeUserUpdateByToken() {
if (!this.socketInstance)
return false;
this.socketInstance.send(JSON.stringify([
"SUBSCRIBE",
[
{
e: library_1.SOCKET_EVENTS.UserUpdatesRoom,
rt: this.apiToken ? this.apiToken : "",
t: this.token,
},
],
]));
return true;
}
unsubscribeUserUpdateByToken() {
if (!this.socketInstance)
return false;
this.socketInstance.send(JSON.stringify([
"UNSUBSCRIBE",
[
{
e: library_1.SOCKET_EVENTS.UserUpdatesRoom,
t: this.token,
},
],
]));
return true;
}
}
exports.WebSockets = WebSockets;
//# sourceMappingURL=WebSocket.js.map