UNPKG

sqmicro-connection

Version:

Connection abstraction for SQ Micro.

88 lines (65 loc) 2.13 kB
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'); }); } };