|
1 | 1 | const io = require('socket.io-client');
|
2 | 2 | const EventEmitter = require('events');
|
3 | 3 | const moment = require('moment');
|
| 4 | +const { each } = require('lodash'); |
4 | 5 | const { createRequest, createSignature, generateHeaders } = require('./utils');
|
5 | 6 |
|
6 | 7 | class HollaEx {
|
@@ -314,111 +315,131 @@ Websocket
|
314 | 315 | class Socket extends EventEmitter {
|
315 | 316 | constructor(events = '', url, apiKey, apiSignature, apiExpires) {
|
316 | 317 | super();
|
| 318 | + this.events = events; |
| 319 | + this.url = url; |
| 320 | + this.apiKey = apiKey; |
| 321 | + this.apiSignature = apiSignature; |
| 322 | + this.apiExpires = apiExpires; |
| 323 | + this.connect(this.events, this.url, this.apiKey, this.apiSignature, this.apiExpires); |
| 324 | + } |
| 325 | + |
| 326 | + disconnect() { |
| 327 | + each(this.ioLink, (ioLink) => { |
| 328 | + ioLink.close(); |
| 329 | + }); |
| 330 | + this.ioLink = []; |
| 331 | + } |
| 332 | + |
| 333 | + connect(events, url, apiKey, apiSignature, apiExpires) { |
317 | 334 | if (!Array.isArray(events)) {
|
318 |
| - let subs = {}; |
319 |
| - let listeners = []; |
320 |
| - let ioLink; |
| 335 | + this.subs = {}; |
| 336 | + this.ioLink = []; |
321 | 337 | events = events.split(':');
|
322 | 338 | let [event, symbol] = events;
|
323 | 339 | switch (event) {
|
324 | 340 | case 'orderbook':
|
325 | 341 | case 'trades':
|
326 | 342 | // case 'ticker':
|
327 | 343 | if (symbol) {
|
328 |
| - ioLink = io(`${url}/realtime`, { query: { symbol } }); |
| 344 | + this.ioLink.push(io(`${url}/realtime`, { query: { symbol } })); |
329 | 345 | } else {
|
330 |
| - ioLink = io(`${url}/realtime`); |
| 346 | + this.ioLink.push(io(`${url}/realtime`)); |
331 | 347 | }
|
332 |
| - listeners.push(ioLink); |
333 |
| - listeners[listeners.length - 1].on(event, (data) => { |
| 348 | + this.ioLink[this.ioLink.length - 1].on(event, (data) => { |
334 | 349 | this.emit(event, data);
|
335 | 350 | });
|
336 |
| - listeners[listeners.length - 1].once('disconnect', (data) => { |
337 |
| - this.emit('disconnect', `Socket.io disconnected from server due to: ${data}.`); |
338 |
| - subs = this._events; |
| 351 | + this.ioLink[this.ioLink.length - 1].on('error', (error) => { |
| 352 | + this.emit('error', error); |
| 353 | + }); |
| 354 | + this.ioLink[this.ioLink.length - 1].once('disconnect', (data) => { |
| 355 | + this.emit('disconnect', `Soscket.io disconnected from server due to: ${data}.`); |
| 356 | + this.subs = this._events; |
339 | 357 | this.removeAllListeners();
|
340 | 358 | });
|
341 |
| - listeners[listeners.length - 1].once('reconnect', (attempts) => { |
342 |
| - this._events = subs; |
| 359 | + this.ioLink[this.ioLink.length - 1].once('reconnect', (attempts) => { |
| 360 | + this._events = this.subs; |
343 | 361 | this.emit('reconnect', `Successfully reconnected after ${attempts} attempts.`);
|
344 | 362 | });
|
345 | 363 | break;
|
346 | 364 | case 'user':
|
347 |
| - ioLink = io(`${url}/user`, { |
| 365 | + this.ioLink.push(io(`${url}/user`, { |
348 | 366 | query: {
|
349 | 367 | 'api-key': apiKey,
|
350 | 368 | 'api-signature': apiSignature,
|
351 | 369 | 'api-expires': apiExpires
|
352 | 370 | }
|
353 |
| - }); |
| 371 | + })); |
354 | 372 |
|
355 |
| - listeners.push(ioLink); |
356 |
| - listeners[listeners.length - 1].on('user', (data) => { |
| 373 | + this.ioLink[this.ioLink.length - 1].on('user', (data) => { |
357 | 374 | this.emit('userInfo', data);
|
358 | 375 | });
|
359 |
| - listeners[listeners.length - 1].on('wallet', (data) => { |
| 376 | + this.ioLink[this.ioLink.length - 1].on('wallet', (data) => { |
360 | 377 | this.emit('userWallet', data);
|
361 | 378 | });
|
362 |
| - listeners[listeners.length - 1].on('orders', (data) => { |
| 379 | + this.ioLink[this.ioLink.length - 1].on('orders', (data) => { |
363 | 380 | this.emit('userOrder', data);
|
364 | 381 | });
|
365 |
| - listeners[listeners.length - 1].on('trades', (data) => { |
| 382 | + this.ioLink[this.ioLink.length - 1].on('trades', (data) => { |
366 | 383 | this.emit('userTrades', data);
|
367 | 384 | });
|
368 |
| - listeners[listeners.length - 1].on('update', (data) => { |
| 385 | + this.ioLink[this.ioLink.length - 1].on('update', (data) => { |
369 | 386 | this.emit('userUpdate', data);
|
370 | 387 | });
|
371 |
| - listeners[listeners.length - 1].once('disconnect', (data) => { |
| 388 | + this.ioLink[this.ioLink.length - 1].on('error', (error) => { |
| 389 | + this.emit('error', error); |
| 390 | + }); |
| 391 | + this.ioLink[this.ioLink.length - 1].once('disconnect', (data) => { |
372 | 392 | this.emit('disconnect', `Socket.io disconnected from server due to: ${data}.`);
|
373 |
| - subs = this._events; |
| 393 | + this.subs = this._events; |
374 | 394 | this.removeAllListeners();
|
375 | 395 | });
|
376 |
| - listeners[listeners.length - 1].once('reconnect', (attempts) => { |
377 |
| - this._events = subs; |
| 396 | + this.ioLink[this.ioLink.length - 1].once('reconnect', (attempts) => { |
| 397 | + this._events = this.subs; |
378 | 398 | this.emit('reconnect', `Successfully reconnected after ${attempts} attempts.`);
|
379 | 399 | });
|
380 | 400 | break;
|
381 | 401 | case 'all':
|
382 |
| - ioLink = io(`${url}/realtime`); |
| 402 | + this.ioLink.push(io(`${url}/realtime`)); |
383 | 403 |
|
384 |
| - listeners.push(ioLink); |
385 |
| - listeners[listeners.length - 1].on('orderbook', (data) => { |
| 404 | + this.ioLink[this.ioLink.length - 1].on('orderbook', (data) => { |
386 | 405 | this.emit('orderbook', data);
|
387 | 406 | });
|
388 |
| - listeners[listeners.length - 1].on('trades', (data) => { |
| 407 | + this.ioLink[this.ioLink.length - 1].on('trades', (data) => { |
389 | 408 | this.emit('trades', data);
|
390 | 409 | });
|
391 | 410 |
|
392 |
| - ioLink = io(`${url}/user`, { |
| 411 | + this.ioLink.push(io(`${url}/user`, { |
393 | 412 | query: {
|
394 | 413 | 'api-key': apiKey,
|
395 | 414 | 'api-signature': apiSignature,
|
396 | 415 | 'api-expires': apiExpires
|
397 | 416 | }
|
398 |
| - }); |
399 |
| - listeners.push(ioLink); |
400 |
| - listeners[listeners.length - 1].on('user', (data) => { |
| 417 | + })); |
| 418 | + this.ioLink[this.ioLink.length - 1].on('user', (data) => { |
401 | 419 | this.emit('userInfo', data);
|
402 | 420 | });
|
403 |
| - listeners[listeners.length - 1].on('wallet', (data) => { |
| 421 | + this.ioLink[this.ioLink.length - 1].on('wallet', (data) => { |
404 | 422 | this.emit('userWallet', data);
|
405 | 423 | });
|
406 |
| - listeners[listeners.length - 1].on('orders', (data) => { |
| 424 | + this.ioLink[this.ioLink.length - 1].on('orders', (data) => { |
407 | 425 | this.emit('userOrder', data);
|
408 | 426 | });
|
409 |
| - listeners[listeners.length - 1].on('trades', (data) => { |
| 427 | + this.ioLink[this.ioLink.length - 1].on('trades', (data) => { |
410 | 428 | this.emit('userTrade', data);
|
411 | 429 | });
|
412 |
| - listeners[listeners.length - 1].on('update', (data) => { |
| 430 | + this.ioLink[this.ioLink.length - 1].on('update', (data) => { |
413 | 431 | this.emit('userUpdate', data);
|
414 | 432 | });
|
415 |
| - listeners[listeners.length - 1].once('disconnect', (data) => { |
| 433 | + this.ioLink[this.ioLink.length - 1].on('error', (error) => { |
| 434 | + this.emit('error', error); |
| 435 | + }); |
| 436 | + this.ioLink[this.ioLink.length - 1].once('disconnect', (data) => { |
416 | 437 | this.emit('disconnect', `Socket.io disconnected from server due to: ${data}.`);
|
417 |
| - subs = this._events; |
| 438 | + this.subs = this._events; |
418 | 439 | this.removeAllListeners();
|
419 | 440 | });
|
420 |
| - listeners[listeners.length - 1].once('reconnect', (attempts) => { |
421 |
| - this._events = subs; |
| 441 | + this.ioLink[this.ioLink.length - 1].once('reconnect', (attempts) => { |
| 442 | + this._events = this.subs; |
422 | 443 | this.emit('reconnect', `Successfully reconnected after ${attempts} attempts.`);
|
423 | 444 | });
|
424 | 445 | break;
|
|
0 commit comments