@triviality/core
Version:
Purely typed service container
107 lines • 4.31 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ServiceFactory_1 = require("../ServiceFactory");
var ImmutableServiceReferenceList_1 = require("./ImmutableServiceReferenceList");
var AsyncServiceFunctionReferenceError_1 = require("./AsyncServiceFunctionReferenceError");
/**
* Purpose is to hold information about a service function connection.
*
* TODO: Convert mayhem/inheritance, state machine classes.
* The ideal world there is only 1 service factory reference for each service, now there are multiple.
*/
var BaseServiceFactoryReference = /** @class */ (function () {
function BaseServiceFactoryReference(_a) {
var factory = _a.factory, feature = _a.feature;
/**
* If the original service is invoked.
*/
this.serviceFactoryInvoked = false;
/**
* If the service factory created instance.
*/
this.serviceDefined = false;
/**
* The instance created by the service factory.
*/
this.service = undefined;
this._configuration = null;
ServiceFactory_1.assetServiceFactory(factory);
this.factory = factory;
this.feature = feature;
this.dependencies = new ImmutableServiceReferenceList_1.ImmutableServiceReferenceList();
}
Object.defineProperty(BaseServiceFactoryReference.prototype, "configuration", {
get: function () {
if (this._configuration === null) {
throw new Error('Service reference not yet configured.');
}
return this._configuration;
},
enumerable: true,
configurable: true
});
BaseServiceFactoryReference.prototype.getUuid = function () {
return this.configuration.uuid;
};
BaseServiceFactoryReference.prototype.callServiceFactory = function (thisReference) {
this.assertServiceFunctionNotYetInvoked();
this.serviceFactoryInvoked = true;
try {
this.service = this.factory.bind(thisReference)();
}
catch (e) {
if (e instanceof AsyncServiceFunctionReferenceError_1.AsyncServiceFunctionReferenceError) {
this.serviceFactoryInvoked = false;
}
throw e;
}
this.serviceDefined = true;
};
BaseServiceFactoryReference.prototype.getService = function () {
this.assertHasServiceInstance();
return this.service;
};
BaseServiceFactoryReference.prototype.setContainerConfiguration = function (configuration) {
this.assertNotYetConfigured();
this._configuration = configuration;
};
BaseServiceFactoryReference.prototype.getFactory = function () {
return this.factory;
};
BaseServiceFactoryReference.prototype.getFeature = function () {
return this.feature;
};
BaseServiceFactoryReference.prototype.getProxy = function () {
return this.configuration.proxy;
};
BaseServiceFactoryReference.prototype.hasServiceInstance = function () {
return this.serviceDefined;
};
BaseServiceFactoryReference.prototype.addDependency = function (dependency) {
this.dependencies = this.dependencies.add(dependency);
};
BaseServiceFactoryReference.prototype.getDependencies = function () {
return this.dependencies;
};
BaseServiceFactoryReference.prototype.label = function () {
return "#" + this.getUuid() + " " + (this.feature.name || '?');
};
BaseServiceFactoryReference.prototype.assertServiceFunctionNotYetInvoked = function () {
if (this.serviceFactoryInvoked) {
throw new Error('Service factory is already invoked.');
}
};
BaseServiceFactoryReference.prototype.assertNotYetConfigured = function () {
if (this._configuration !== null) {
throw new Error('Service reference already configured.');
}
};
BaseServiceFactoryReference.prototype.assertHasServiceInstance = function () {
if (!this.hasServiceInstance()) {
throw new Error('No service instance');
}
};
return BaseServiceFactoryReference;
}());
exports.BaseServiceFactoryReference = BaseServiceFactoryReference;
//# sourceMappingURL=BaseServiceFactoryReference.js.map