1
0
mirror of https://github.com/nttgin/BGPalerter.git synced 2024-05-19 06:50:08 +00:00

improved auto-reconnect feature

This commit is contained in:
Massimo Candela
2019-08-18 16:05:53 +02:00
parent d97d2d2c9f
commit 4d816feb08
4 changed files with 59 additions and 30 deletions

View File

@@ -30,7 +30,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
import env from "./env"; import env, {logger} from "./env";
export default class ConnectorFactory { export default class ConnectorFactory {
@@ -67,10 +67,35 @@ export default class ConnectorFactory {
resolve(Promise.all(connectors resolve(Promise.all(connectors
.map(connector => .map(connector =>
new Promise((resolve, reject) => { new Promise((resolve, reject) => {
connector.connect() connector
.connect()
.then(() => { .then(() => {
connector.connected = true; connector.connected = true;
resolve(true); resolve(true);
connector.onError(error => {
logger.log({
level: 'error',
message: error
});
});
connector.onConnect(error => {
logger.log({
level: 'info',
message: error
});
});
connector.onDisconnect(error => {
connector.connected = false;
logger.log({
level: 'info',
message: error
});
});
}) })
.catch((error) => { .catch((error) => {
env.logger.log({ env.logger.log({

View File

@@ -42,30 +42,38 @@ export default class Connector {
this.messageCallback = null; this.messageCallback = null;
this.connectCallback = null; this.connectCallback = null;
this.errorCallback = null; this.errorCallback = null;
this.closeCallback = null; this.disconnectCallback = null;
} }
connect = () => connect = () =>
new Promise((resolve, reject) => reject(new Error('The method connect MUST be implemented'))); new Promise((resolve, reject) => reject(new Error('The method connect MUST be implemented')));
error = (error) => { _error = (error) => {
this.logger.log({ this.logger.log({
level: 'error', level: 'error',
message: error message: error
}); });
if (this.errorCallback)
this.errorCallback(error);
}; };
subscribe = (input) => { subscribe = (input) => {
throw new Error('The method subscribe MUST be implemented'); throw new Error('The method subscribe MUST be implemented');
}; };
message = (message) => { _disconnect = (message) => {
if (this.messageCallback) if (this.disconnectCallback)
this.messageCallback(message); this.disconnectCallback(message);
}; };
connected = (message) => { _message = (message) => {
if (this.messageCallback)
this.messageCallback(message);
};
_connect = (message) => {
if (this.connectCallback) if (this.connectCallback)
this.connectCallback(message); this.connectCallback(message);
}; };
@@ -83,7 +91,11 @@ export default class Connector {
}; };
onError = (callback) => { onError = (callback) => {
this.closeCallback = callback; this.errorCallback = callback;
};
onDisconnect = (callback) => {
this.disconnectCallback = callback;
}; };
} }

View File

@@ -45,19 +45,18 @@ export default class ConnectorRIS extends Connector{
connect = () => connect = () =>
new Promise((resolve, reject) => { new Promise((resolve, reject) => {
try { try {
delete this.pingTimer;
this.ws = new WebSocket(this.params.url); this.ws = new WebSocket(this.params.url);
this.pingTimer = setInterval(() => { this.pingTimer = setInterval(() => {
this.ws.ping(() => {}) this.ws.ping(() => {})
}, 5000); }, 5000);
this.ws.on('message', this.message); this.ws.on('message', this._message);
this.ws.on('close', this.close); this.ws.on('close', this.close);
this.ws.on('error', this.error); this.ws.on('error', this._error);
this.ws.on('open', () => { this.ws.on('open', () => {
resolve(true); resolve(true);
this.connected(this.name + ' connector connected'); this._connect(this.name + ' connector connected');
}); });
} catch(error) { } catch(error) {
@@ -66,11 +65,17 @@ export default class ConnectorRIS extends Connector{
} }
}); });
close = (error) => { close = (error) => {
this.error(error); this._disconnect(error);
clearInterval(this.pingTimer); clearInterval(this.pingTimer);
setTimeout(() => this.subscribe(this.subscription), 5000); setTimeout(() => {
try {
this.ws.terminate();
} catch(e) {
}
this.connect()
.then(() => this.subscribe(this.subscription));
}, 5000);
}; };
_subscribeToAll = (input) => { _subscribeToAll = (input) => {
@@ -106,7 +111,7 @@ export default class ConnectorRIS extends Connector{
resolve(true); resolve(true);
} catch(error) { } catch(error) {
this.error(error); this._error(error);
resolve(false); resolve(false);
} }
}); });

View File

@@ -55,19 +55,6 @@ function master(worker) {
pubSub.publish("data", connector.name + "-" + message); pubSub.publish("data", connector.name + "-" + message);
}); });
} }
connector.onError(error => {
logger.log({
level: 'error',
message: error
});
});
connector.onConnect(error => {
logger.log({
level: 'info',
message: error
});
});
} }
}) })
.then(() => connectorFactory.subscribeConnectors(input)) .then(() => connectorFactory.subscribeConnectors(input))