-
Notifications
You must be signed in to change notification settings - Fork 1
/
hitBTCWebsocketClient.js
executable file
·100 lines (84 loc) · 2.56 KB
/
hitBTCWebsocketClient.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
'use strict';
var _ws = require('ws');
var _crypto = require('crypto');
var debug = require('debug')('bidder:ws');
var _get = require('lodash/fp/get');
var _pipe = require('lodash/fp/pipe');
const EventEmitter = require('events').EventEmitter;
class HitBTCWebsocketClient extends EventEmitter{
constructor({ key, secret, isDemo = false }) {
super();
EventEmitter.call(this);
this.createLoginPayloadData = message => {
const nonce = Date.now().toString();
const params = {
algo: "HS256",
pKey: this.key,
nonce: nonce,
signature: _crypto.createHmac(`sha256`, this.secret).update(nonce).digest(`hex`)
};
message.params = params;
message.id = 'LOGIN';
return JSON.stringify(message);
};
this.key = key;
this.secret = secret;
this.baseUrl = `wss://${isDemo ? `demo-api` : `api`}.hitbtc.com/api/2/ws`;
this.hasCredentials = key && secret;
this.marketSocket = new _ws(this.baseUrl);
this.marketSocket.on('message', msg => this.readMarketMessage(msg));
if (this.hasCredentials) {
this.tradingSocket = new _ws(this.baseUrl);
this.tradingSocket.addEventListener(`open`, () => this.tradingSocket.send(this.createLoginPayloadData({ method: 'login'})));
this.tradingSocket.on('message', msg => this.readTradingMessage(msg));
}
}
subscribeOrderBook(symbol = 'BTCUSD') {
this.marketSocket.send(JSON.stringify({
method: 'subscribeOrderbook',
params: {
symbol: symbol
},
id: 'SUBSC' + symbol
}));
}
readMarketMessage(message) {
let msgData = JSON.parse(message);
if (msgData.id != undefined)
switch (msgData.id.substr(0,5)) {
case 'LOGIN':
this.emit('login');
break;
case 'SUBSC':
this.emit('subscribed', msgData.id);
break;
default:
break;
}
else
switch (msgData.method) {
case 'snapshotOrderbook':
this.emit('snapshotOrderbook', msgData.params);
break;
case 'updateOrderbook':
this.emit('updateOrderbook', msgData.params);
break;
default:
debug('ERROR: Unhandled Market method: ' + JSON.stringify(msgData));
break;
}
}
readTradingMessage(message) {
let msgData = JSON.parse(message);
if (msgData.id != undefined) {
switch (msgData.id.substr(0,5)) {
case 'LOGIN':
this.emit('login');
break;
default:
break;
}
}
}
}
module.exports = HitBTCWebsocketClient;