container.ts
Version:
Modular application framework
127 lines • 4.86 kB
JavaScript
;
var __extends = (this && this.__extends) || (function () {
var extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
var Debug = require("debug");
var error_1 = require("../lib/error");
var Container_1 = require("./Container");
var Log_1 = require("./Log");
var Metric_1 = require("./Metric");
/** Module error class. */
var ModuleError = /** @class */ (function (_super) {
__extends(ModuleError, _super);
function ModuleError(name, cause) {
return _super.call(this, { name: name }, cause) || this;
}
return ModuleError;
}(error_1.ErrorChain));
exports.ModuleError = ModuleError;
/** Container module log class. */
var ModuleLog = /** @class */ (function (_super) {
__extends(ModuleLog, _super);
function ModuleLog(container, name) {
var _this = _super.call(this) || this;
_this.container = container;
_this.name = name;
return _this;
}
/**
* Sends log message to container bus for consumption by modules.
* Adds module name to metadata object by default.
*/
ModuleLog.prototype.log = function (level, message, metadata) {
var args = [];
for (var _i = 3; _i < arguments.length; _i++) {
args[_i - 3] = arguments[_i];
}
metadata.moduleName = this.name;
this.container.sendLog(level, message, metadata, args);
};
return ModuleLog;
}(Log_1.Log));
exports.ModuleLog = ModuleLog;
/** Container module metric class. */
var ModuleMetric = /** @class */ (function (_super) {
__extends(ModuleMetric, _super);
function ModuleMetric(container, name) {
var _this = _super.call(this) || this;
_this.container = container;
_this.name = name;
return _this;
}
/**
* Sends metric message to container bus for consumption by modules.
* Adds module name to tags object by default.
*/
ModuleMetric.prototype.metric = function (type, name, value, tags) {
tags.moduleName = this.name;
this.container.sendMetric(type, name, value, tags);
};
return ModuleMetric;
}(Metric_1.Metric));
exports.ModuleMetric = ModuleMetric;
/** Base class for container class modules with dependency injection. */
var Module = /** @class */ (function () {
function Module(options) {
var _this = this;
// Resolve container instance and construct log, metric and debug instances.
this.moduleName = options.moduleName;
this.container = options.opts[Container_1.Container.REFERENCE];
this.log = new ModuleLog(this.container, this.namespace);
this.metric = new ModuleMetric(this.container, this.namespace);
this.debug = Debug(this.namespace);
// Inject dependency values into instance.
// Error is thrown by awilix if resolution failed.
try {
var dependencies_1 = this.moduleDependencies();
Object.keys(dependencies_1).map(function (key) {
var target = dependencies_1[key];
_this[key] = options.opts[target.moduleName];
});
}
catch (error) {
throw new ModuleError(Module.ERROR.DEPENDENCY, error);
}
}
Object.defineProperty(Module.prototype, "environment", {
/** Module container environment reference. */
get: function () { return this.container.environment; },
enumerable: true,
configurable: true
});
Object.defineProperty(Module.prototype, "namespace", {
/** Module container and module names. */
get: function () { return this.container.name + "." + this.moduleName; },
enumerable: true,
configurable: true
});
/** Module dependencies hook. */
Module.prototype.moduleDependencies = function () {
var previous = [];
for (var _i = 0; _i < arguments.length; _i++) {
previous[_i] = arguments[_i];
}
return Object.assign.apply(Object, [{}].concat(previous));
};
/** Module operational state. */
Module.prototype.moduleUp = function () { };
/** Module non-operational state. */
Module.prototype.moduleDown = function () { };
/** Default module name. */
Module.moduleName = "Module";
/** Error names. */
Module.ERROR = {
DEPENDENCY: "ModuleDependencyError",
};
return Module;
}());
exports.Module = Module;
//# sourceMappingURL=Module.js.map