UNPKG

@kephas/core

Version:

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

140 lines 19.6 kB
var LiteInjector_1; import { __decorate, __metadata } from "tslib"; import 'reflect-metadata'; import { AppService } from '../services/appService'; import { AppServiceInfo, AppServiceLifetime } from '../services/appServiceInfo'; import { AppServiceInfoRegistry } from '../services/appServiceInfoRegistry'; import { AppServiceMetadata, Priority } from '../services/appServiceMetadata'; import { Injector } from './injector'; import { InjectionError } from './injectionError'; /** * Provides a container for the dependency injection. * * @export * @class LiteInjector */ let LiteInjector = LiteInjector_1 = class LiteInjector extends Injector { /** * Creates an instance of LiteInjector. * @param {AppServiceInfoRegistry} [registry] * @memberof LiteInjector */ constructor(registry) { super(); this._singletons = new WeakMap(); this._registry = registry || (registry = AppServiceInfoRegistry.Instance); if (registry !== AppServiceInfoRegistry.Instance) { const appServiceInfo = new AppServiceInfo({ contractType: Injector, allowMultiple: false, lifetime: AppServiceLifetime.Singleton, }); registry.registerServiceContract(Injector, appServiceInfo); registry.registerService(LiteInjector_1, new AppServiceMetadata({ overridePriority: Priority.Low, _serviceContract: appServiceInfo, serviceType: LiteInjector_1, serviceInstance: this, })); } } /** * Gets the service instance of the required service contract type. * * @template T * @param {Type<T>} type The service contract type. * @param notFoundResolver A resolver for the case when a type cannot be resolved. * @returns {T} The requested service. * @memberof LiteInjector */ resolve(type, notFoundResolver) { const serviceInfo = notFoundResolver ? this._tryGetServiceContract(type) : this._getServiceContract(type); if (!serviceInfo) { return notFoundResolver(type); } if (serviceInfo.lifetime === AppServiceLifetime.Singleton) { let service = this._singletons.get(type); if (!service) { const serviceMetadata = this._getSingleServiceMetadata(serviceInfo); service = this._createInstance(serviceMetadata, notFoundResolver); this._singletons.set(type, service); } return service; } else { return this._createInstance(this._getSingleServiceMetadata(serviceInfo), notFoundResolver); } } /** * Gets an array of service instances. * * @template T * @param {Type<T>} type The service contract type. * @param notFoundResolver A resolver for the case when a type cannot be resolved. * @returns {T[]} The array of the requested service. * @memberof LiteInjector */ resolveMany(type, notFoundResolver) { const serviceInfo = notFoundResolver ? this._tryGetServiceContract(type) : this._getServiceContract(type); if (!serviceInfo) { // the resolver should know that it should return an array of items. return notFoundResolver(type); } if (serviceInfo.lifetime === AppServiceLifetime.Singleton) { let services = this._singletons.get(type); if (services === undefined || services === null) { services = [...serviceInfo.services].map(s => this._createInstance(s, notFoundResolver)); this._singletons.set(type, services); } return services; } else { return [...serviceInfo.services].map(s => this._createInstance(s, notFoundResolver)); } } _tryGetServiceContract(type) { return this._registry.getServiceContract(type); } _getServiceContract(type) { const serviceInfo = this._registry.getServiceContract(type); if (!serviceInfo) { throw new InjectionError(`The type '${type.name}' is not registered as a service contract.`); } return serviceInfo; } _getSingleServiceMetadata(serviceInfo) { const services = [...serviceInfo.services]; if (services.length === 0) { throw new InjectionError(`The service contract '${serviceInfo.contractType.name}' does not have any services registered.`); } if (services.length > 1) { throw new InjectionError(`The service contract '${serviceInfo.contractType.name}' has multiple services registered: '${services.join("', '")}'.`); } return services[0]; } _createInstance(serviceMetadata, notFoundResolver) { if (serviceMetadata.serviceInstance) { return serviceMetadata.serviceInstance; } if (serviceMetadata.serviceFactory) { return serviceMetadata.serviceFactory(this); } const serviceType = serviceMetadata.serviceType; const paramTypes = Reflect.getOwnMetadata('design:paramtypes', serviceType); if (paramTypes) { const ctorArgs = paramTypes.map(t => this.resolve(t, notFoundResolver)); return new serviceType(...ctorArgs); } return new serviceType(); } }; LiteInjector = LiteInjector_1 = __decorate([ AppService({ overridePriority: Priority.Low, provider: _ => Injector.instance }), __metadata("design:paramtypes", [AppServiceInfoRegistry]) ], LiteInjector); export { LiteInjector }; // make sure the injector is set. if (!Injector.instance) { Injector.instance = new LiteInjector(); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl0ZUluamVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2VwaGFzL2NvcmUvc3JjL2xpYi9pbmplY3Rpb24vbGl0ZUluamVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUU5RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVsRDs7Ozs7R0FLRztBQUVILElBQWEsWUFBWSxvQkFBekIsTUFBYSxZQUFhLFNBQVEsUUFBUTtJQUl4Qzs7OztPQUlHO0lBQ0gsWUFBWSxRQUFpQztRQUMzQyxLQUFLLEVBQUUsQ0FBQztRQVJGLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQXFCLENBQUM7UUFTckQsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLElBQUksQ0FBQyxRQUFRLEdBQUcsc0JBQXNCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUUsSUFBSSxRQUFRLEtBQUssc0JBQXNCLENBQUMsUUFBUSxFQUFFO1lBQ2hELE1BQU0sY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDO2dCQUN4QyxZQUFZLEVBQUUsUUFBUTtnQkFDdEIsYUFBYSxFQUFFLEtBQUs7Z0JBQ3BCLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxTQUFTO2FBQ3ZDLENBQUMsQ0FBQztZQUNILFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLEVB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QUMsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDekYsSUFBSSxVQUFVLEVBQUU7WUFDZCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLE9BQU8sSUFBSSxXQUFXLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztTQUNyQztRQUVELE9BQU8sSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUMzQixDQUFDO0NBQ0YsQ0FBQTtBQWxJWSxZQUFZO0lBRHhCLFVBQVUsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO3FDQVV4RCxzQkFBc0I7R0FUbEMsWUFBWSxDQWtJeEI7U0FsSVksWUFBWTtBQW9JekIsaUNBQWlDO0FBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFO0lBQ3RCLFFBQVEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztDQUN4QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAncmVmbGVjdC1tZXRhZGF0YSc7XHJcbmltcG9ydCB7IEFwcFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9hcHBTZXJ2aWNlJztcclxuaW1wb3J0IHsgQXBwU2VydmljZUluZm8sIEFwcFNlcnZpY2VMaWZldGltZSB9IGZyb20gJy4uL3NlcnZpY2VzL2FwcFNlcnZpY2VJbmZvJztcclxuaW1wb3J0IHsgQXBwU2VydmljZUluZm9SZWdpc3RyeSB9IGZyb20gJy4uL3NlcnZpY2VzL2FwcFNlcnZpY2VJbmZvUmVnaXN0cnknO1xyXG5pbXBvcnQgeyBBcHBTZXJ2aWNlTWV0YWRhdGEsIFByaW9yaXR5IH0gZnJvbSAnLi4vc2VydmljZXMvYXBwU2VydmljZU1ldGFkYXRhJztcclxuaW1wb3J0IHsgQWJzdHJhY3RUeXBlLCBUeXBlIH0gZnJvbSAnLi4vdHlwZSc7XHJcbmltcG9ydCB7IEluamVjdG9yIH0gZnJvbSAnLi9pbmplY3Rvcic7XHJcbmltcG9ydCB7IEluamVjdGlvbkVycm9yIH0gZnJvbSAnLi9pbmplY3Rpb25FcnJvcic7XHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgYSBjb250YWluZXIgZm9yIHRoZSBkZXBlbmRlbmN5IGluamVjdGlvbi5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAY2xhc3MgTGl0ZUluamVjdG9yXHJcbiAqL1xyXG5AQXBwU2VydmljZSh7IG92ZXJyaWRlUHJpb3JpdHk6IFByaW9yaXR5LkxvdywgcHJvdmlkZXI6IF8gPT4gSW5qZWN0b3IuaW5zdGFuY2UgfSlcclxuZXhwb3J0IGNsYXNzIExpdGVJbmplY3RvciBleHRlbmRzIEluamVjdG9yIHtcclxuICBwcml2YXRlIF9yZWdpc3RyeTogQXBwU2VydmljZUluZm9SZWdpc3RyeTtcclxuICBwcml2YXRlIF9zaW5nbGV0b25zID0gbmV3IFdlYWtNYXA8QWJzdHJhY3RUeXBlLCBhbnk+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgTGl0ZUluamVjdG9yLlxyXG4gICAqIEBwYXJhbSB7QXBwU2VydmljZUluZm9SZWdpc3RyeX0gW3JlZ2lzdHJ5XVxyXG4gICAqIEBtZW1iZXJvZiBMaXRlSW5qZWN0b3JcclxuICAgKi9cclxuICBjb25zdHJ1Y3RvcihyZWdpc3RyeT86IEFwcFNlcnZpY2VJbmZvUmVnaXN0cnkpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLl9yZWdpc3RyeSA9IHJlZ2lzdHJ5IHx8IChyZWdpc3RyeSA9IEFwcFNlcnZpY2VJbmZvUmVnaXN0cnkuSW5zdGFuY2UpO1xyXG4gICAgaWYgKHJlZ2lzdHJ5ICE9PSBBcHBTZXJ2aWNlSW5mb1JlZ2lzdHJ5Lkluc3RhbmNlKSB7XHJcbiAgICAgIGNvbnN0IGFwcFNlcnZpY2VJbmZvID0gbmV3IEFwcFNlcnZpY2VJbmZvKHtcclxuICAgICAgICBjb250cmFjdFR5cGU6IEluamVjdG9yLFxyXG4gICAgICAgIGFsbG93TXVsdGlwbGU6IGZhbHNlLFxyXG4gICAgICAgIGxpZmV0aW1lOiBBcHBTZXJ2aWNlTGlmZXRpbWUuU2luZ2xldG9uLFxyXG4gICAgICB9KTtcclxuICAgICAgcmVnaXN0cnkucmVnaXN0ZXJTZXJ2aWNlQ29udHJhY3QoSW5qZWN0b3IsIGFwcFNlcnZpY2VJbmZvKTtcclxuICAgICAgcmVnaXN0cnkucmVnaXN0ZXJTZXJ2aWNlKExpdGVJbmplY3RvciwgbmV3IEFwcFNlcnZpY2VNZXRhZGF0YSh7XHJcbiAgICAgICAgb3ZlcnJpZGVQcmlvcml0eTogUHJpb3JpdHkuTG93LFxyXG4gICAgICAgIF9zZXJ2aWNlQ29udHJhY3Q6IGFwcFNlcnZpY2VJbmZvLCAvLyBIQUNLOiBzZXQgdGhlIGJhY2tncm91bmQgZmllbGQgb2Ygc2VydmljZUNvbnRyYWN0XHJcbiAgICAgICAgc2VydmljZVR5cGU6IExpdGVJbmplY3RvcixcclxuICAgICAgICBzZXJ2aWNlSW5zdGFuY2U6IHRoaXMsXHJcbiAgICAgIH0pKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgc2VydmljZSBpbnN0YW5jZSBvZiB0aGUgcmVxdWlyZWQgc2VydmljZSBjb250cmFjdCB0eXBlLlxyXG4gICAqXHJcbiAgICogQHRlbXBsYXRlIFRcclxuICAgKiBAcGFyYW0ge1R5cGU8VD59IHR5cGUgVGhlIHNlcnZpY2UgY29udHJhY3QgdHlwZS5cclxuICAgKiBAcGFyYW0gbm90Rm91bmRSZXNvbHZlciBBIHJlc29sdmVyIGZvciB0aGUgY2FzZSB3aGVuIGEgdHlwZSBjYW5ub3QgYmUgcmVzb2x2ZWQuXHJcbiAgICogQHJldHVybnMge1R9IFRoZSByZXF1ZXN0ZWQgc2VydmljZS5cclxuICAgKiBAbWVtYmVyb2YgTGl0ZUluamVjdG9yXHJcbiAgICovXHJcbiAgcHVibGljIHJlc29sdmU8VD4odHlwZTogVHlwZTxUPiB8IEFic3RyYWN0VHlwZSwgbm90Rm91bmRSZXNvbHZlcj86ICh0eXBlOiBUeXBlPFQ+IHwgQWJzdHJhY3RUeXBlKSA9PiBhbnkpOiBUIHtcclxuICAgIGNvbnN0IHNlcnZpY2VJbmZvID0gbm90Rm91bmRSZXNvbHZlciA/IHRoaXMuX3RyeUdldFNlcnZpY2VDb250cmFjdCh0eXBlKSA6IHRoaXMuX2dldFNlcnZpY2VDb250cmFjdCh0eXBlKTtcclxuICAgIGlmICghc2VydmljZUluZm8pIHtcclxuICAgICAgcmV0dXJuIG5vdEZvdW5kUmVzb2x2ZXIhKHR5cGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZXJ2aWNlSW5mby5saWZldGltZSA9PT0gQXBwU2VydmljZUxpZmV0aW1lLlNpbmdsZXRvbikge1xyXG4gICAgICBsZXQgc2VydmljZSA9IHRoaXMuX3NpbmdsZXRvbnMuZ2V0KHR5cGUpO1xyXG4gICAgICBpZiAoIXNlcnZpY2UpIHtcclxuICAgICAgICBjb25zdCBzZXJ2aWNlTWV0YWRhdGEgPSB0aGlzLl9nZXRTaW5nbGVTZXJ2aWNlTWV0YWRhdGEoc2VydmljZUluZm8pO1xyXG4gICAgICAgIHNlcnZpY2UgPSB0aGlzLl9jcmVhdGVJbnN0YW5jZShzZXJ2aWNlTWV0YWRhdGEsIG5vdEZvdW5kUmVzb2x2ZXIpO1xyXG4gICAgICAgIHRoaXMuX3NpbmdsZXRvbnMuc2V0KHR5cGUsIHNlcnZpY2UpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBzZXJ2aWNlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVJbnN0YW5jZSh0aGlzLl9nZXRTaW5nbGVTZXJ2aWNlTWV0YWRhdGEoc2VydmljZUluZm8pLCBub3RGb3VuZFJlc29sdmVyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgYW4gYXJyYXkgb2Ygc2VydmljZSBpbnN0YW5jZXMuXHJcbiAgICpcclxuICAgKiBAdGVtcGxhdGUgVFxyXG4gICAqIEBwYXJhbSB7VHlwZTxUPn0gdHlwZSBUaGUgc2VydmljZSBjb250cmFjdCB0eXBlLlxyXG4gICAqIEBwYXJhbSBub3RGb3VuZFJlc29sdmVyIEEgcmVzb2x2ZXIgZm9yIHRoZSBjYXNlIHdoZW4gYSB0eXBlIGNhbm5vdCBiZSByZXNvbHZlZC5cclxuICAgKiBAcmV0dXJucyB7VFtdfSBUaGUgYXJyYXkgb2YgdGhlIHJlcXVlc3RlZCBzZXJ2aWNlLlxyXG4gICAqIEBtZW1iZXJvZiBMaXRlSW5qZWN0b3JcclxuICAgKi9cclxuICBwdWJsaWMgcmVzb2x2ZU1hbnk8VD4odHlwZTogVHlwZTxUPiB8IEFic3RyYWN0VHlwZSwgbm90Rm91bmRSZXNvbHZlcj86ICh0eXBlOiBUeXBlPFQ+IHwgQWJzdHJhY3RUeXBlKSA9PiBhbnkpOiBUW10ge1xyXG4gICAgY29uc3Qgc2VydmljZUluZm8gPSBub3RGb3VuZFJlc29sdmVyID8gdGhpcy5fdHJ5R2V0U2VydmljZUNvbnRyYWN0KHR5cGUpIDogdGhpcy5fZ2V0U2VydmljZUNvbnRyYWN0KHR5cGUpO1xyXG4gICAgaWYgKCFzZXJ2aWNlSW5mbykge1xyXG4gICAgICAvLyB0aGUgcmVzb2x2ZXIgc2hvdWxkIGtub3cgdGhhdCBpdCBzaG91bGQgcmV0dXJuIGFuIGFycmF5IG9mIGl0ZW1zLlxyXG4gICAgICByZXR1cm4gbm90Rm91bmRSZXNvbHZlciEodHlwZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNlcnZpY2VJbmZvLmxpZmV0aW1lID09PSBBcHBTZXJ2aWNlTGlmZXRpbWUuU2luZ2xldG9uKSB7XHJcbiAgICAgIGxldCBzZXJ2aWNlcyA9IHRoaXMuX3NpbmdsZXRvbnMuZ2V0KHR5cGUpO1xyXG4gICAgICBpZiAoc2VydmljZXMgPT09IHVuZGVmaW5lZCB8fCBzZXJ2aWNlcyA9PT0gbnVsbCkge1xyXG4gICAgICAgIHNlcnZpY2VzID0gWy4uLnNlcnZpY2VJbmZvLnNlcnZpY2VzXS5tYXAocyA9PiB0aGlzLl9jcmVhdGVJbnN0YW5jZShzLCBub3RGb3VuZFJlc29sdmVyKSk7XHJcbiAgICAgICAgdGhpcy5fc2luZ2xldG9ucy5zZXQodHlwZSwgc2VydmljZXMpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBzZXJ2aWNlcztcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gWy4uLnNlcnZpY2VJbmZvLnNlcnZpY2VzXS5tYXAocyA9PiB0aGlzLl9jcmVhdGVJbnN0YW5jZShzLCBub3RGb3VuZFJlc29sdmVyKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF90cnlHZXRTZXJ2aWNlQ29udHJhY3QodHlwZTogQWJzdHJhY3RUeXBlKTogQXBwU2VydmljZUluZm8gfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWdpc3RyeS5nZXRTZXJ2aWNlQ29udHJhY3QodHlwZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRTZXJ2aWNlQ29udHJhY3QodHlwZTogQWJzdHJhY3RUeXBlKTogQXBwU2VydmljZUluZm8ge1xyXG4gICAgY29uc3Qgc2VydmljZUluZm8gPSB0aGlzLl9yZWdpc3RyeS5nZXRTZXJ2aWNlQ29udHJhY3QodHlwZSk7XHJcbiAgICBpZiAoIXNlcnZpY2VJbmZvKSB7XHJcbiAgICAgIHRocm93IG5ldyBJbmplY3Rpb25FcnJvcihgVGhlIHR5cGUgJyR7dHlwZS5uYW1lfScgaXMgbm90IHJlZ2lzdGVyZWQgYXMgYSBzZXJ2aWNlIGNvbnRyYWN0LmApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzZXJ2aWNlSW5mbztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldFNpbmdsZVNlcnZpY2VNZXRhZGF0YShzZXJ2aWNlSW5mbzogQXBwU2VydmljZUluZm8pOiBBcHBTZXJ2aWNlTWV0YWRhdGE8YW55PiB7XHJcbiAgICBjb25zdCBzZXJ2aWNlcyA9IFsuLi5zZXJ2aWNlSW5mby5zZXJ2aWNlc107XHJcbiAgICBpZiAoc2VydmljZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBJbmplY3Rpb25FcnJvcihgVGhlIHNlcnZpY2UgY29udHJhY3QgJyR7c2VydmljZUluZm8uY29udHJhY3RUeXBlLm5hbWV9JyBkb2VzIG5vdCBoYXZlIGFueSBzZXJ2aWNlcyByZWdpc3RlcmVkLmApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZXJ2aWNlcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgIHRocm93IG5ldyBJbmplY3Rpb25FcnJvcihgVGhlIHNlcnZpY2UgY29udHJhY3QgJyR7c2VydmljZUluZm8uY29udHJhY3RUeXBlLm5hbWV9JyBoYXMgbXVsdGlwbGUgc2VydmljZXMgcmVnaXN0ZXJlZDogJyR7c2VydmljZXMuam9pbihcIicsICdcIil9Jy5gKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2VydmljZXNbMF07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVJbnN0YW5jZTxUPihzZXJ2aWNlTWV0YWRhdGE6IEFwcFNlcnZpY2VNZXRhZGF0YTxhbnk+LCBub3RGb3VuZFJlc29sdmVyPzogKHR5cGU6IFR5cGU8VD4gfCBBYnN0cmFjdFR5cGUpID0+IGFueSk6IGFueSB7XHJcbiAgICBpZiAoc2VydmljZU1ldGFkYXRhLnNlcnZpY2VJbnN0YW5jZSkge1xyXG4gICAgICByZXR1cm4gc2VydmljZU1ldGFkYXRhLnNlcnZpY2VJbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2VydmljZU1ldGFkYXRhLnNlcnZpY2VGYWN0b3J5KSB7XHJcbiAgICAgIHJldHVybiBzZXJ2aWNlTWV0YWRhdGEuc2VydmljZUZhY3RvcnkodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2VydmljZVR5cGUgPSBzZXJ2aWNlTWV0YWRhdGEuc2VydmljZVR5cGUhO1xyXG4gICAgY29uc3QgcGFyYW1UeXBlczogVHlwZTxhbnk+W10gPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKCdkZXNpZ246cGFyYW10eXBlcycsIHNlcnZpY2VUeXBlKTtcclxuICAgIGlmIChwYXJhbVR5cGVzKSB7XHJcbiAgICAgIGNvbnN0IGN0b3JBcmdzID0gcGFyYW1UeXBlcy5tYXAodCA9PiB0aGlzLnJlc29sdmUodCwgbm90Rm91bmRSZXNvbHZlcikpO1xyXG4gICAgICByZXR1cm4gbmV3IHNlcnZpY2VUeXBlKC4uLmN0b3JBcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IHNlcnZpY2VUeXBlKCk7XHJcbiAgfVxyXG59XHJcblxyXG4vLyBtYWtlIHN1cmUgdGhlIGluamVjdG9yIGlzIHNldC5cclxuaWYgKCFJbmplY3Rvci5pbnN0YW5jZSkge1xyXG4gIEluamVjdG9yLmluc3RhbmNlID0gbmV3IExpdGVJbmplY3RvcigpO1xyXG59XHJcbiJdfQ==