46 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| var SockJS = require('sockjs-client/dist/sockjs');
 | |
| 
 | |
| var retries = 0;
 | |
| var sock = null;
 | |
| 
 | |
| var socket = function initSocket(url, handlers) {
 | |
|   sock = new SockJS(url);
 | |
| 
 | |
|   sock.onopen = function onopen() {
 | |
|     retries = 0;
 | |
|   };
 | |
| 
 | |
|   sock.onclose = function onclose() {
 | |
|     if (retries === 0) {
 | |
|       handlers.close();
 | |
|     }
 | |
| 
 | |
|     // Try to reconnect.
 | |
|     sock = null;
 | |
| 
 | |
|     // After 10 retries stop trying, to prevent logspam.
 | |
|     if (retries <= 10) {
 | |
|       // Exponentially increase timeout to reconnect.
 | |
|       // Respectfully copied from the package `got`.
 | |
|       // eslint-disable-next-line no-mixed-operators, no-restricted-properties
 | |
|       var retryInMs = 1000 * Math.pow(2, retries) + Math.random() * 100;
 | |
|       retries += 1;
 | |
| 
 | |
|       setTimeout(function () {
 | |
|         socket(url, handlers);
 | |
|       }, retryInMs);
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   sock.onmessage = function onmessage(e) {
 | |
|     // This assumes that all data sent via the websocket is JSON.
 | |
|     var msg = JSON.parse(e.data);
 | |
|     if (handlers[msg.type]) {
 | |
|       handlers[msg.type](msg.data);
 | |
|     }
 | |
|   };
 | |
| };
 | |
| 
 | |
| module.exports = socket; |