HackMyResume/src/verbs/verb.js

115 lines
2.4 KiB
JavaScript

/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
/**
Definition of the Verb class.
@module verbs/verb
@license MIT. See LICENSE.md for details.
*/
let Verb;
const EVENTS = require('events');
const HMEVENT = require('../core/event-codes');
const Promise = require('pinkie-promise');
/**
An abstract invokable verb.
Provides base class functionality for verbs. Provide common services such as
error handling, event management, and promise support.
@class Verb
*/
module.exports = (Verb = class Verb {
/** Constructor. Automatically called at creation. */
constructor( moniker, workhorse ) {
this.moniker = moniker;
this.workhorse = workhorse;
this.emitter = new EVENTS.EventEmitter();
}
/** Invoke the command. */
invoke() {
// Sent the 'begin' notification for this verb
this.stat(HMEVENT.begin, {cmd: this.moniker});
// Prepare command arguments
const argsArray = Array.prototype.slice.call(arguments);
// Create a promise for this verb instance
const that = this;
return this.promise = new Promise(function(res, rej) {
that.resolve = res;
that.reject = rej;
that.workhorse.apply(that, argsArray);
});
}
/** Forward subscriptions to the event emitter. */
on() { return this.emitter.on.apply(this.emitter, arguments); }
/** Fire an arbitrary event, scoped to "hmr:". */
fire(evtName, payload) {
payload = payload || { };
payload.cmd = this.moniker;
this.emitter.emit(`hmr:${evtName}`, payload);
return true;
}
/** Handle an error condition. */
err( errorCode, payload, hot ) {
payload = payload || { };
payload.sub = (payload.fluenterror = errorCode);
payload.throw = hot;
this.setError(errorCode, payload);
if (payload.quit) {
this.reject(errorCode);
}
this.fire('error', payload);
if (hot) {
throw payload;
}
return true;
}
/** Fire the 'hmr:status' error event. */
stat( subEvent, payload ) {
payload = payload || { };
payload.sub = subEvent;
this.fire('status', payload);
return true;
}
/** Has an error occurred during this verb invocation? */
hasError() { return this.errorCode || this.errorObj; }
/** Associate error info with the invocation. */
setError( code, obj ) {
this.errorCode = code;
this.errorObj = obj;
}
});