sqmicro-connection
Version:
Connection abstraction for SQ Micro.
88 lines (65 loc) • 2.13 kB
JavaScript
const EventEmitter = require('events');
const util = require('util');
const { Writable } = require('stream');
const wait = util.promisify(setTimeout);
const { promisifyEventEmitter } = require('sqmicro-commons');
const Private = Symbol('Private');
const CONNECTION_STABLE_TIME = 35000; // ms
const NETWORK_LATENCY = 500; // ms
class Sink extends Writable {
_write(chunk, encoding, cb) {
console.log(`Wrote[${encoding}] ${chunk}`);
cb();
}
}
module.exports = class FakeDriver extends EventEmitter {
get driverName() { return 'FakeDriver'; }
get isConnected() { return this[Private].isConnected; }
constructor(config) {
super();
const pvt = this[Private] = {
config,
isConnected: false,
};
this._simulateNetworkProblems();
}
async connect() {
const pvt = this[Private];
pvt.isConnected = false;
await wait(NETWORK_LATENCY);
if (pvt.tries > 0) {
pvt.tries--;
throw Error(`EConnectionError ;-(`);
}
pvt.isConnected = true;
this.emit('connected');
return this;
}
async getCopyStream(dest, options) {
return new Sink();
}
async disconnect() {
const pvt = this[Private];
await wait(NETWORK_LATENCY);
pvt.isConnected = false;
return this;
}
async query() {
await wait(NETWORK_LATENCY);
return { a: 'result' };
}
_simulateNetworkProblems() {
const pvt = this[Private];
if (pvt.config.stableNetwork) {
pvt.tries = 0;
return;
}
pvt.tries = Math.floor(1 + 3 * Math.random());
console.log(`\n============[ Disconnected back end simulation for the following ${pvt.tries} attempts]===============\n`);
wait(CONNECTION_STABLE_TIME).then(() => {
this._simulateNetworkProblems();
this.emit('error', Error(`Connection was closed ;-(`));
this.emit('disconnected');
});
}
};