UNPKG

@kephas/core

Version:

Provides a common infrastructure for all the other Kephas Framework components: ambient services, dynamic reflection, composition, application management, and others.

103 lines 13.1 kB
import { ServiceError } from "./serviceError"; /** * Enumerates the lifetime values for application services. * * @export * @enum {number} */ export var AppServiceLifetime; (function (AppServiceLifetime) { /** * The application service is shared (default). */ AppServiceLifetime[AppServiceLifetime["Singleton"] = 0] = "Singleton"; /** * The application service in instantiated with every request. */ AppServiceLifetime[AppServiceLifetime["Transient"] = 1] = "Transient"; /** * The application service is shared within a scope. */ AppServiceLifetime[AppServiceLifetime["Scoped"] = 2] = "Scoped"; })(AppServiceLifetime || (AppServiceLifetime = {})); /** * Provides information about the application service. * * @export * @class AppServiceInfo */ export class AppServiceInfo { /** * Creates an instance of AppServiceInfo. * @param {Type<T>} contractType The contract type. * @param {*} contractToken The contract token. * @param {boolean} [allowMultiple=false] Indicates whether multiple instances of the provided * @param {AppServiceLifetime} [lifetime=AppServiceLifetime.Singleton] The application service lifetime. * @memberof AppServiceInfo */ constructor({ contractType, contractToken, allowMultiple = false, lifetime = AppServiceLifetime.Singleton, ...args }) { /** * Gets a value indicating whether multiple services for this contract are allowed. * * @type {boolean} * @memberof AppServiceInfo */ this.allowMultiple = false; /** * Gets the application service lifetime. * * @type {AppServiceLifetime} * @memberof AppServiceInfo */ this.lifetime = AppServiceLifetime.Singleton; this._services = []; this.contractType = contractType; this.contractToken = contractToken; this.allowMultiple = allowMultiple; this.lifetime = lifetime; Object.assign(this, args); } /** * Gets an iteration of registered services. * * @readonly * @type {IterableIterator<AppServiceMetadata>} * @memberof AppServiceInfo */ get services() { return this._services.values(); } /** * Registers a service implementation for this contract. * * @template T The service implementation type. * @param {AppServiceMetadata<T>} service * @returns {(boolean | ServiceError | AppServiceMetadata<any>)} * True, if the service was registered successfully. * False, if the service was not registered due to a higher override priority service already registered. * ServiceError, if a service is already registered with the same override priority. * AppServiceMetadata<any>, if the service to register overrid an existing one. The overridden service is returned. * @memberof AppServiceInfo */ registerService(service) { if (this.allowMultiple) { this._services.push(service); return true; } if (this._services.length > 0) { if (this._services[0].overridePriority > service.overridePriority) { const overridden = this._services[0]; this._services[0] = service; return overridden; } if (this._services[0].overridePriority === service.overridePriority) { const firstServiceType = this._services[0].serviceType; return new ServiceError(`Multiple services registered with the same override priority '${service.overridePriority}' as singleton: '${firstServiceType && firstServiceType.name}' and '${service.serviceType && service.serviceType.name}'.`); } return false; } this._services.push(service); return true; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwU2VydmljZUluZm8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rZXBoYXMvY29yZS9zcmMvbGliL3NlcnZpY2VzL2FwcFNlcnZpY2VJbmZvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5Qzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBTixJQUFZLGtCQWVYO0FBZkQsV0FBWSxrQkFBa0I7SUFDMUI7O09BRUc7SUFDSCxxRUFBUyxDQUFBO0lBRVQ7O09BRUc7SUFDSCxxRUFBUyxDQUFBO0lBRVQ7O09BRUc7SUFDSCwrREFBTSxDQUFBO0FBQ1YsQ0FBQyxFQWZXLGtCQUFrQixLQUFsQixrQkFBa0IsUUFlN0I7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxjQUFjO0lBOEN2Qjs7Ozs7OztPQU9HO0lBQ0gsWUFDSSxFQUNJLFlBQVksRUFDWixhQUFhLEVBQ2IsYUFBYSxHQUFHLEtBQUssRUFDckIsUUFBUSxHQUFHLGtCQUFrQixDQUFDLFNBQVMsRUFDdkMsR0FBRyxJQUFJLEVBT1Y7UUFsRUw7Ozs7O1dBS0c7UUFDYSxrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUUvQzs7Ozs7V0FLRztRQUNhLGFBQVEsR0FBdUIsa0JBQWtCLENBQUMsU0FBUyxDQUFDO1FBNkJwRSxjQUFTLEdBQThCLEVBQUUsQ0FBQztRQXdCOUMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQXhDRDs7Ozs7O09BTUc7SUFDSCxJQUFXLFFBQVE7UUFDZixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQWlDRDs7Ozs7Ozs7Ozs7T0FXRztJQUNLLGVBQWUsQ0FBSSxPQUE4QjtRQUNyRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzNCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQy9ELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO2dCQUM1QixPQUFPLFVBQVUsQ0FBQzthQUNyQjtZQUVELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsS0FBSyxPQUFPLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ2pFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7Z0JBQ3ZELE9BQU8sSUFBSSxZQUFZLENBQUMsaUVBQWlFLE9BQU8sQ0FBQyxnQkFBZ0Isb0JBQW9CLGdCQUFnQixJQUFJLGdCQUFnQixDQUFDLElBQUksVUFBVSxPQUFPLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQzthQUNoUDtZQUVELE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0IsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXhwYW5kbyB9IGZyb20gXCIuLi9leHBhbmRvXCI7XHJcbmltcG9ydCB7IEFic3RyYWN0VHlwZSB9IGZyb20gXCIuLi90eXBlXCI7XHJcbmltcG9ydCB7IEFwcFNlcnZpY2VNZXRhZGF0YSB9IGZyb20gXCIuL2FwcFNlcnZpY2VNZXRhZGF0YVwiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlRXJyb3IgfSBmcm9tIFwiLi9zZXJ2aWNlRXJyb3JcIjtcclxuXHJcbi8qKlxyXG4gKiBFbnVtZXJhdGVzIHRoZSBsaWZldGltZSB2YWx1ZXMgZm9yIGFwcGxpY2F0aW9uIHNlcnZpY2VzLlxyXG4gKlxyXG4gKiBAZXhwb3J0XHJcbiAqIEBlbnVtIHtudW1iZXJ9XHJcbiAqL1xyXG5leHBvcnQgZW51bSBBcHBTZXJ2aWNlTGlmZXRpbWUge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYXBwbGljYXRpb24gc2VydmljZSBpcyBzaGFyZWQgKGRlZmF1bHQpLlxyXG4gICAgICovXHJcbiAgICBTaW5nbGV0b24sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYXBwbGljYXRpb24gc2VydmljZSBpbiBpbnN0YW50aWF0ZWQgd2l0aCBldmVyeSByZXF1ZXN0LlxyXG4gICAgICovXHJcbiAgICBUcmFuc2llbnQsXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYXBwbGljYXRpb24gc2VydmljZSBpcyBzaGFyZWQgd2l0aGluIGEgc2NvcGUuXHJcbiAgICAgKi9cclxuICAgIFNjb3BlZCxcclxufVxyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhcHBsaWNhdGlvbiBzZXJ2aWNlLlxyXG4gKlxyXG4gKiBAZXhwb3J0XHJcbiAqIEBjbGFzcyBBcHBTZXJ2aWNlSW5mb1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEFwcFNlcnZpY2VJbmZvIGltcGxlbWVudHMgRXhwYW5kbyB7XHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgbXVsdGlwbGUgc2VydmljZXMgZm9yIHRoaXMgY29udHJhY3QgYXJlIGFsbG93ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAbWVtYmVyb2YgQXBwU2VydmljZUluZm9cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlYWRvbmx5IGFsbG93TXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGFwcGxpY2F0aW9uIHNlcnZpY2UgbGlmZXRpbWUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0FwcFNlcnZpY2VMaWZldGltZX1cclxuICAgICAqIEBtZW1iZXJvZiBBcHBTZXJ2aWNlSW5mb1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgbGlmZXRpbWU6IEFwcFNlcnZpY2VMaWZldGltZSA9IEFwcFNlcnZpY2VMaWZldGltZS5TaW5nbGV0b247XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBjb250cmFjdCB0eXBlIG9mIHRoZSBzZXJ2aWNlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtBYnN0cmFjdFR5cGV9XHJcbiAgICAgKiBAbWVtYmVyb2YgQXBwU2VydmljZUluZm9cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlYWRvbmx5IGNvbnRyYWN0VHlwZTogQWJzdHJhY3RUeXBlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgY29udHJhY3QgdG9rZW4gb2YgdGhlIHNlcnZpY2UuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUgeyp9XHJcbiAgICAgKiBAbWVtYmVyb2YgQXBwU2VydmljZUluZm9cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlYWRvbmx5IGNvbnRyYWN0VG9rZW46IGFueTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYW4gaXRlcmF0aW9uIG9mIHJlZ2lzdGVyZWQgc2VydmljZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJlYWRvbmx5XHJcbiAgICAgKiBAdHlwZSB7SXRlcmFibGVJdGVyYXRvcjxBcHBTZXJ2aWNlTWV0YWRhdGE+fVxyXG4gICAgICogQG1lbWJlcm9mIEFwcFNlcnZpY2VJbmZvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgc2VydmljZXMoKTogSXRlcmFibGVJdGVyYXRvcjxBcHBTZXJ2aWNlTWV0YWRhdGE8YW55Pj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlcy52YWx1ZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9zZXJ2aWNlczogQXBwU2VydmljZU1ldGFkYXRhPGFueT5bXSA9IFtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBBcHBTZXJ2aWNlSW5mby5cclxuICAgICAqIEBwYXJhbSB7VHlwZTxUPn0gY29udHJhY3RUeXBlIFRoZSBjb250cmFjdCB0eXBlLlxyXG4gICAgICogQHBhcmFtIHsqfSBjb250cmFjdFRva2VuIFRoZSBjb250cmFjdCB0b2tlbi5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FsbG93TXVsdGlwbGU9ZmFsc2VdIEluZGljYXRlcyB3aGV0aGVyIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgcHJvdmlkZWRcclxuICAgICAqIEBwYXJhbSB7QXBwU2VydmljZUxpZmV0aW1lfSBbbGlmZXRpbWU9QXBwU2VydmljZUxpZmV0aW1lLlNpbmdsZXRvbl0gVGhlIGFwcGxpY2F0aW9uIHNlcnZpY2UgbGlmZXRpbWUuXHJcbiAgICAgKiBAbWVtYmVyb2YgQXBwU2VydmljZUluZm9cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb250cmFjdFR5cGUsXHJcbiAgICAgICAgICAgIGNvbnRyYWN0VG9rZW4sXHJcbiAgICAgICAgICAgIGFsbG93TXVsdGlwbGUgPSBmYWxzZSxcclxuICAgICAgICAgICAgbGlmZXRpbWUgPSBBcHBTZXJ2aWNlTGlmZXRpbWUuU2luZ2xldG9uLFxyXG4gICAgICAgICAgICAuLi5hcmdzXHJcbiAgICAgICAgfToge1xyXG4gICAgICAgICAgICBjb250cmFjdFR5cGU6IEFic3RyYWN0VHlwZTtcclxuICAgICAgICAgICAgY29udHJhY3RUb2tlbj86IGFueTtcclxuICAgICAgICAgICAgYWxsb3dNdWx0aXBsZT86IGJvb2xlYW47XHJcbiAgICAgICAgICAgIGxpZmV0aW1lPzogQXBwU2VydmljZUxpZmV0aW1lO1xyXG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XHJcbiAgICAgICAgfSkge1xyXG4gICAgICAgIHRoaXMuY29udHJhY3RUeXBlID0gY29udHJhY3RUeXBlO1xyXG4gICAgICAgIHRoaXMuY29udHJhY3RUb2tlbiA9IGNvbnRyYWN0VG9rZW47XHJcbiAgICAgICAgdGhpcy5hbGxvd011bHRpcGxlID0gYWxsb3dNdWx0aXBsZTtcclxuICAgICAgICB0aGlzLmxpZmV0aW1lID0gbGlmZXRpbWU7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBhcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVycyBhIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgY29udHJhY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHRlbXBsYXRlIFQgVGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gdHlwZS5cclxuICAgICAqIEBwYXJhbSB7QXBwU2VydmljZU1ldGFkYXRhPFQ+fSBzZXJ2aWNlXHJcbiAgICAgKiBAcmV0dXJucyB7KGJvb2xlYW4gfCBTZXJ2aWNlRXJyb3IgfCBBcHBTZXJ2aWNlTWV0YWRhdGE8YW55Pil9XHJcbiAgICAgKiBUcnVlLCBpZiB0aGUgc2VydmljZSB3YXMgcmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHkuXHJcbiAgICAgKiBGYWxzZSwgaWYgdGhlIHNlcnZpY2Ugd2FzIG5vdCByZWdpc3RlcmVkIGR1ZSB0byBhIGhpZ2hlciBvdmVycmlkZSBwcmlvcml0eSBzZXJ2aWNlIGFscmVhZHkgcmVnaXN0ZXJlZC5cclxuICAgICAqIFNlcnZpY2VFcnJvciwgaWYgYSBzZXJ2aWNlIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzYW1lIG92ZXJyaWRlIHByaW9yaXR5LlxyXG4gICAgICogQXBwU2VydmljZU1ldGFkYXRhPGFueT4sIGlmIHRoZSBzZXJ2aWNlIHRvIHJlZ2lzdGVyIG92ZXJyaWQgYW4gZXhpc3Rpbmcgb25lLiBUaGUgb3ZlcnJpZGRlbiBzZXJ2aWNlIGlzIHJldHVybmVkLlxyXG4gICAgICogQG1lbWJlcm9mIEFwcFNlcnZpY2VJbmZvXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmVnaXN0ZXJTZXJ2aWNlPFQ+KHNlcnZpY2U6IEFwcFNlcnZpY2VNZXRhZGF0YTxUPik6IGJvb2xlYW4gfCBTZXJ2aWNlRXJyb3IgfCBBcHBTZXJ2aWNlTWV0YWRhdGE8YW55PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuYWxsb3dNdWx0aXBsZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXJ2aWNlcy5wdXNoKHNlcnZpY2UpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zZXJ2aWNlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zZXJ2aWNlc1swXS5vdmVycmlkZVByaW9yaXR5ID4gc2VydmljZS5vdmVycmlkZVByaW9yaXR5KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvdmVycmlkZGVuID0gdGhpcy5fc2VydmljZXNbMF07XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXJ2aWNlc1swXSA9IHNlcnZpY2U7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGRlbjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3NlcnZpY2VzWzBdLm92ZXJyaWRlUHJpb3JpdHkgPT09IHNlcnZpY2Uub3ZlcnJpZGVQcmlvcml0eSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RTZXJ2aWNlVHlwZSA9IHRoaXMuX3NlcnZpY2VzWzBdLnNlcnZpY2VUeXBlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlRXJyb3IoYE11bHRpcGxlIHNlcnZpY2VzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc2FtZSBvdmVycmlkZSBwcmlvcml0eSAnJHtzZXJ2aWNlLm92ZXJyaWRlUHJpb3JpdHl9JyBhcyBzaW5nbGV0b246ICcke2ZpcnN0U2VydmljZVR5cGUgJiYgZmlyc3RTZXJ2aWNlVHlwZS5uYW1lfScgYW5kICcke3NlcnZpY2Uuc2VydmljZVR5cGUgJiYgc2VydmljZS5zZXJ2aWNlVHlwZS5uYW1lfScuYCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3NlcnZpY2VzLnB1c2goc2VydmljZSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbn1cclxuIl19