import EventEmitter from 'events'; import * as types from '../types'; export default abstract class Subscription { /** * The date of the last query. * * @var {String} */ lastQueryTime: String; /** * Request currently in progress. * * @var {Boolean} */ requesting: Boolean = false; /** * @constructor * @param {Object} connection * @param {EventEmitter} eventEmitter */ constructor(private connection: any, private eventEmitter: EventEmitter) {} /** * Run the subscription query. * * */ run() { // Don't queue another request if one for this event is already in progress. if (this.requesting) return; this.requesting = true; this.connection.query(this.getQuery(), (err: string, res: any) => { if (err) { return this.eventEmitter.emit('error', err); } this.setLastQueryTime(); this.requesting = false; res.records.forEach((record: object) => { this.eventEmitter.emit('data.parsed', record, this.getContext()); }); if (res.records.length) { this.eventEmitter.emit('info', `Sent ${res.records.length} message${res.records.length !== 1 ? 's' : ''} to output`); } }); } /** * Get the subscription context. * * @returns {types.Context} */ getContext(): types.Context { return { name: 'salesforce', subscription: '', }; } /** * Get the last query time. * * @returns {String} */ getLastQueryTime(): String { return this.lastQueryTime; } /** * Get the subscription name. * * @returns {String} */ getName(): String { return ''; } /** * Get the subscription query. * * @returns {String} */ getQuery(): String { return ''; } /** * Set the DateTime for when we last queried the login events. */ setLastQueryTime() { this.lastQueryTime = new Date().toISOString(); } }