UNPKG

@tsclean/core

Version:

Plugin for API Rest Full development, based on Clean Architecture, IoC and Dependency Injection.

178 lines 25.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ContainerIoC = void 0; const errors_1 = require("../../errors"); const router_1 = require("../../router"); const compiler_1 = require("./compiler"); const internal_core_module_1 = require("./internal-core-module"); const internal_providers_storage_1 = require("./internal-providers-storage"); const module_1 = require("./module"); const module_token_factory_1 = require("./module-token-factory"); const modules_container_1 = require("./modules-container"); const helpers_1 = require("../../helpers"); const serialized_graph_1 = require("../../inspector/serialized-graph"); const discovery_1 = require("../../core/discovery"); class ContainerIoC { constructor(_applicationConfig = undefined) { this._applicationConfig = _applicationConfig; this.globalModules = new Set(); this.moduleTokenFactory = new module_token_factory_1.ModuleTokenFactory(); this.moduleCompiler = new compiler_1.ModuleCompiler(this.moduleTokenFactory); this.modules = new modules_container_1.ModulesContainer(); this.dynamicModulesMetadata = new Map(); this.internalProvidersStorage = new internal_providers_storage_1.InternalProvidersStorage(); this._serializedGraph = new serialized_graph_1.SerializedGraph(); } get serializedGraph() { return this._serializedGraph; } get applicationConfig() { return this._applicationConfig; } setHttpAdapter(httpAdapter) { this.internalProvidersStorage.httpAdapter = httpAdapter; if (!this.internalProvidersStorage.httpAdapterHost) { return; } const host = this.internalProvidersStorage.httpAdapterHost; host.httpAdapter = httpAdapter; } getHttpAdapterRef() { return this.internalProvidersStorage.httpAdapter; } getHttpAdapterHostRef() { return this.internalProvidersStorage.httpAdapterHost; } async addModule(metaType, scope) { if (!metaType) throw new errors_1.UndefinedForwardRefException(scope); const { type, dynamicMetadata, token } = await this.moduleCompiler.compile(metaType); if (this.modules.has(token)) return this.modules.get(token); const moduleRef = new module_1.Module(type, this); moduleRef.token = token; this.modules.set(token, moduleRef); await this.addDynamicMetadata(token, dynamicMetadata, [].concat(scope, type)); if (this.isGlobalModule(type, dynamicMetadata)) { this.addGlobalModule(moduleRef); } return moduleRef; } async addDynamicMetadata(token, dynamicModuleMetadata, scope) { if (!dynamicModuleMetadata) { return; } this.dynamicModulesMetadata.set(token, dynamicModuleMetadata); const { imports } = dynamicModuleMetadata; await this.addDynamicModules(imports, scope); } async addDynamicModules(modules, scope) { if (!modules) { return; } await Promise.all(modules.map(module => this.addModule(module, scope))); } isGlobalModule(metatype, dynamicMetadata) { if (dynamicMetadata && dynamicMetadata.global) { return true; } return !!Reflect.getMetadata(helpers_1.GLOBAL_MODULE_METADATA, metatype); } addGlobalModule(module) { this.globalModules.add(module); } getModules() { return this.modules; } getModuleCompiler() { return this.moduleCompiler; } getModuleByKey(moduleKey) { return this.modules.get(moduleKey); } getInternalCoreModuleRef() { return this.internalCoreModule; } async addImport(relatedModule, token) { if (!this.modules.has(token)) { return; } const moduleRef = this.modules.get(token); const { token: relatedModuleToken } = await this.moduleCompiler.compile(relatedModule); const related = this.modules.get(relatedModuleToken); moduleRef.addRelatedModule(related); } addProvider(provider, token, enhancerSubtype) { const moduleRef = this.modules.get(token); if (!provider) { throw new errors_1.CircularDependencyException(moduleRef === null || moduleRef === void 0 ? void 0 : moduleRef.metaType.name); } if (!moduleRef) { throw new errors_1.UnknownModuleException(); } const providerKey = moduleRef.addProvider(provider, enhancerSubtype); const providerRef = moduleRef.getProviderByKey(providerKey); discovery_1.DiscoverableMetaHostCollection.inspectProvider(this.modules, providerRef); return providerKey; } addInjectable(injectable, token, enhancerSubtype, host) { if (!this.modules.has(token)) { throw new errors_1.UnknownModuleException(); } const moduleRef = this.modules.get(token); return moduleRef.addInjectable(injectable, enhancerSubtype, host); } addExportedProvider(provider, token) { if (!this.modules.has(token)) { throw new errors_1.UnknownModuleException(); } const moduleRef = this.modules.get(token); moduleRef.addExportedProvider(provider); } addController(controller, token) { if (!this.modules.has(token)) { throw new errors_1.UnknownModuleException(); } const moduleRef = this.modules.get(token); moduleRef.addController(controller); } clear() { this.modules.clear(); } replace(toReplace, options) { this.modules.forEach(moduleRef => moduleRef.replace(toReplace, options)); } bindGlobalScope() { this.modules.forEach(moduleRef => this.bindGlobalsToImports(moduleRef)); } bindGlobalsToImports(moduleRef) { this.globalModules.forEach(globalModule => this.bindGlobalModuleToModule(moduleRef, globalModule)); } bindGlobalModuleToModule(target, globalModule) { if (target === globalModule || target === this.internalCoreModule) { return; } target.addRelatedModule(globalModule); } getDynamicMetadataByToken(token, metadataKey) { var _a; const metadata = this.dynamicModulesMetadata.get(token); return metadataKey ? ((_a = metadata === null || metadata === void 0 ? void 0 : metadata[metadataKey]) !== null && _a !== void 0 ? _a : []) : metadata; } registerCoreModuleRef(moduleRef) { this.internalCoreModule = moduleRef; this.modules[internal_core_module_1.InternalCoreModule.name] = moduleRef; } getModuleTokenFactory() { return this.moduleTokenFactory; } registerRequestProvider(request, contextId) { const wrapper = this.internalCoreModule.getProviderByKey(router_1.REQUEST); wrapper.setInstanceByContextId(contextId, { instance: request, isResolved: true }); } } exports.ContainerIoC = ContainerIoC; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvcmUvaW5qZWN0b3IvY29udGFpbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHlDQUlxQjtBQUNyQix5Q0FBc0M7QUFDdEMseUNBQTJDO0FBRTNDLGlFQUEyRDtBQUMzRCw2RUFBdUU7QUFDdkUscUNBQWlDO0FBQ2pDLGlFQUEyRDtBQUMzRCwyREFBc0Q7QUFFdEQsMkNBQXVFO0FBRXZFLHVFQUFrRTtBQUNsRSxvREFBcUU7QUFFckUsTUFBYSxZQUFZO0lBYXZCLFlBQ21CLHFCQUF3QyxTQUFTO1FBQWpELHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBK0I7UUFibkQsa0JBQWEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFBO1FBQ2pDLHVCQUFrQixHQUFHLElBQUkseUNBQWtCLEVBQUUsQ0FBQTtRQUM3QyxtQkFBYyxHQUFHLElBQUkseUJBQWMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtRQUM1RCxZQUFPLEdBQUcsSUFBSSxvQ0FBZ0IsRUFBRSxDQUFBO1FBQ2hDLDJCQUFzQixHQUFHLElBQUksR0FBRyxFQUc5QyxDQUFBO1FBQ2MsNkJBQXdCLEdBQUcsSUFBSSxxREFBd0IsRUFBRSxDQUFBO1FBQ3pELHFCQUFnQixHQUFHLElBQUksa0NBQWUsRUFBRSxDQUFBO0lBS3RELENBQUM7SUFFSixJQUFJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUE7SUFDOUIsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFBO0lBQ2hDLENBQUM7SUFFTSxjQUFjLENBQUUsV0FBZ0I7UUFDckMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUE7UUFFdkQsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNuRCxPQUFN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SyxDQUFDLENBQUM7UUFDeEQsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBQSxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUcsV0FBVyxDQUFDLG1DQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDbEUsQ0FBQztJQUVNLHFCQUFxQixDQUFFLFNBQWlCO1FBQzdDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUE7UUFDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyx5Q0FBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUE7SUFDbkQsQ0FBQztJQUVNLHFCQUFxQjtRQUMxQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQTtJQUNoQyxDQUFDO0lBRU0sdUJBQXVCLENBQVcsT0FBVSxFQUFFLFNBQW9CO1FBQ3ZFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBTyxDQUFDLENBQUE7UUFDakUsT0FBTyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsRUFBRTtZQUN4QyxRQUFRLEVBQUUsT0FBTztZQUNqQixVQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDLENBQUE7SUFDSixDQUFDO0NBQ0Y7QUFsUEQsb0NBa1BDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBwbGljYXRpb25Db25maWcgfSBmcm9tICcuLi8uLi9hcHAnXG5pbXBvcnQge1xuICBDaXJjdWxhckRlcGVuZGVuY3lFeGNlcHRpb24sXG4gIFVuZGVmaW5lZEZvcndhcmRSZWZFeGNlcHRpb24sXG4gIFVua25vd25Nb2R1bGVFeGNlcHRpb25cbn0gZnJvbSAnLi4vLi4vZXJyb3JzJ1xuaW1wb3J0IHsgUkVRVUVTVCB9IGZyb20gJy4uLy4uL3JvdXRlcidcbmltcG9ydCB7IE1vZHVsZUNvbXBpbGVyIH0gZnJvbSAnLi9jb21waWxlcidcbmltcG9ydCB7IENvbnRleHRJZCB9IGZyb20gJy4vaW5zdGFuY2Utd3JhcHBlcidcbmltcG9ydCB7IEludGVybmFsQ29yZU1vZHVsZSB9IGZyb20gJy4vaW50ZXJuYWwtY29yZS1tb2R1bGUnXG5pbXBvcnQgeyBJbnRlcm5hbFByb3ZpZGVyc1N0b3JhZ2UgfSBmcm9tICcuL2ludGVybmFsLXByb3ZpZGVycy1zdG9yYWdlJ1xuaW1wb3J0IHsgTW9kdWxlIH0gZnJvbSAnLi9tb2R1bGUnXG5pbXBvcnQgeyBNb2R1bGVUb2tlbkZhY3RvcnkgfSBmcm9tICcuL21vZHVsZS10b2tlbi1mYWN0b3J5J1xuaW1wb3J0IHsgTW9kdWxlc0NvbnRhaW5lciB9IGZyb20gJy4vbW9kdWxlcy1jb250YWluZXInXG5pbXBvcnQgeyBEeW5hbWljTW9kdWxlSW50ZXJmYWNlLCBUeXBlIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzJ1xuaW1wb3J0IHsgRW5oYW5jZXJTdWJ0eXBlLCBHTE9CQUxfTU9EVUxFX01FVEFEQVRBIH0gZnJvbSAnLi4vLi4vaGVscGVycydcbmltcG9ydCB7IEluamVjdGFibGVUeXBlLCBQcm92aWRlclR5cGUgfSBmcm9tICcuLi8uLi90eXBlcydcbmltcG9ydCB7IFNlcmlhbGl6ZWRHcmFwaCB9IGZyb20gJy4uLy4uL2luc3BlY3Rvci9zZXJpYWxpemVkLWdyYXBoJ1xuaW1wb3J0IHsgRGlzY292ZXJhYmxlTWV0YUhvc3RDb2xsZWN0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS9kaXNjb3ZlcnknXG5cbmV4cG9ydCBjbGFzcyBDb250YWluZXJJb0Mge1xuICBwcml2YXRlIHJlYWRvbmx5IGdsb2JhbE1vZHVsZXMgPSBuZXcgU2V0PE1vZHVsZT4oKVxuICBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZVRva2VuRmFjdG9yeSA9IG5ldyBNb2R1bGVUb2tlbkZhY3RvcnkoKVxuICBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZUNvbXBpbGVyID0gbmV3IE1vZHVsZUNvbXBpbGVyKHRoaXMubW9kdWxlVG9rZW5GYWN0b3J5KVxuICBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZXMgPSBuZXcgTW9kdWxlc0NvbnRhaW5lcigpXG4gIHByaXZhdGUgcmVhZG9ubHkgZHluYW1pY01vZHVsZXNNZXRhZGF0YSA9IG5ldyBNYXA8XG4gICAgc3RyaW5nLFxuICAgIFBhcnRpYWw8RHluYW1pY01vZHVsZUludGVyZmFjZT5cbiAgPigpXG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJuYWxQcm92aWRlcnNTdG9yYWdlID0gbmV3IEludGVybmFsUHJvdmlkZXJzU3RvcmFnZSgpXG4gIHByaXZhdGUgcmVhZG9ubHkgX3NlcmlhbGl6ZWRHcmFwaCA9IG5ldyBTZXJpYWxpemVkR3JhcGgoKVxuICBwcml2YXRlIGludGVybmFsQ29yZU1vZHVsZTogTW9kdWxlXG5cbiAgY29uc3RydWN0b3IgKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2FwcGxpY2F0aW9uQ29uZmlnOiBBcHBsaWNhdGlvbkNvbmZpZyA9IHVuZGVmaW5lZFxuICApIHt9XG5cbiAgZ2V0IHNlcmlhbGl6ZWRHcmFwaCAoKTogU2VyaWFsaXplZEdyYXBoIHtcbiAgICByZXR1cm4gdGhpcy5fc2VyaWFsaXplZEdyYXBoXG4gIH1cblxuICBnZXQgYXBwbGljYXRpb25Db25maWcgKCk6IEFwcGxpY2F0aW9uQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYXBwbGljYXRpb25Db25maWdcbiAgfVxuXG4gIHB1YmxpYyBzZXRIdHRwQWRhcHRlciAoaHR0cEFkYXB0ZXI6IGFueSkge1xuICAgIHRoaXMuaW50ZXJuYWxQcm92aWRlcnNTdG9yYWdlLmh0dHBBZGFwdGVyID0gaHR0cEFkYXB0ZXJcblxuICAgIGlmICghdGhpcy5pbnRlcm5hbFByb3ZpZGVyc1N0b3JhZ2UuaHR0cEFkYXB0ZXJIb3N0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuaW50ZXJuYWxQcm92aWRlcnNTdG9yYWdlLmh0dHBBZGFwdGVySG9zdFxuICAgIGhvc3QuaHR0cEFkYXB0ZXIgPSBodHRwQWRhcHRlclxuICB9XG5cbiAgcHVibGljIGdldEh0dHBBZGFwdGVyUmVmICgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlcm5hbFByb3ZpZGVyc1N0b3JhZ2UuaHR0cEFkYXB0ZXJcbiAgfVxuXG4gIHB1YmxpYyBnZXRIdHRwQWRhcHRlckhvc3RSZWYgKCkge1xuICAgIHJldHVybiB0aGlzLmludGVybmFsUHJvdmlkZXJzU3RvcmFnZS5odHRwQWRhcHRlckhvc3RcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhZGRNb2R1bGUgKFxuICAgIG1ldGFUeXBlOlxuICAgICAgfCBUeXBlPGFueT5cbiAgICAgIHwgRHluYW1pY01vZHVsZUludGVyZmFjZVxuICAgICAgfCBQcm9taXNlPER5bmFtaWNNb2R1bGVJbnRlcmZhY2U+LFxuICAgIHNjb3BlOiBUeXBlPGFueT5bXVxuICApOiBQcm9taXNlPE1vZHVsZSB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghbWV0YVR5cGUpIHRocm93IG5ldyBVbmRlZmluZWRGb3J3YXJkUmVmRXhjZXB0aW9uKHNjb3BlKVxuXG4gICAgY29uc3QgeyB0eXBlLCBkeW5hbWljTWV0YWRhdGEsIHRva2VuIH0gPSBhd2FpdCB0aGlzLm1vZHVsZUNvbXBpbGVyLmNvbXBpbGUoXG4gICAgICBtZXRhVHlwZVxuICAgIClcbiAgICBpZiAodGhpcy5tb2R1bGVzLmhhcyh0b2tlbikpIHJldHVybiB0aGlzLm1vZHVsZXMuZ2V0KHRva2VuKVxuXG4gICAgY29uc3QgbW9kdWxlUmVmID0gbmV3IE1vZHVsZSh0eXBlLCB0aGlzKVxuICAgIG1vZHVsZVJlZi50b2tlbiA9IHRva2VuXG4gICAgdGhpcy5tb2R1bGVzLnNldCh0b2tlbiwgbW9kdWxlUmVmKVxuXG4gICAgYXdhaXQgdGhpcy5hZGREeW5hbWljTWV0YWRhdGEoXG4gICAgICB0b2tlbixcbiAgICAgIGR5bmFtaWNNZXRhZGF0YSxcbiAgICAgIFtdLmNvbmNhdChzY29wZSwgdHlwZSlcbiAgICApXG5cbiAgICBpZiAodGhpcy5pc0dsb2JhbE1vZHVsZSh0eXBlLCBkeW5hbWljTWV0YWRhdGEpKSB7XG4gICAgICB0aGlzLmFkZEdsb2JhbE1vZHVsZShtb2R1bGVSZWYpXG4gICAgfVxuICAgIHJldHVybiBtb2R1bGVSZWZcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhZGREeW5hbWljTWV0YWRhdGEgKFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgZHluYW1pY01vZHVsZU1ldGFkYXRhOiBQYXJ0aWFsPER5bmFtaWNNb2R1bGVJbnRlcmZhY2U+LFxuICAgIHNjb3BlOiBUeXBlPGFueT5bXVxuICApIHtcbiAgICBpZiAoIWR5bmFtaWNNb2R1bGVNZXRhZGF0YSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMuZHluYW1pY01vZHVsZXNNZXRhZGF0YS5zZXQodG9rZW4sIGR5bmFtaWNNb2R1bGVNZXRhZGF0YSlcblxuICAgIGNvbnN0IHsgaW1wb3J0cyB9ID0gZHluYW1pY01vZHVsZU1ldGFkYXRhXG4gICAgYXdhaXQgdGhpcy5hZGREeW5hbWljTW9kdWxlcyhpbXBvcnRzLCBzY29wZSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhZGREeW5hbWljTW9kdWxlcyAobW9kdWxlczogYW55W10sIHNjb3BlOiBUeXBlPGFueT5bXSkge1xuICAgIGlmICghbW9kdWxlcykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKG1vZHVsZXMubWFwKG1vZHVsZSA9PiB0aGlzLmFkZE1vZHVsZShtb2R1bGUsIHNjb3BlKSkpXG4gIH1cblxuICBwdWJsaWMgaXNHbG9iYWxNb2R1bGUgKFxuICAgIG1ldGF0eXBlOiBUeXBlPGFueT4sXG4gICAgZHluYW1pY01ldGFkYXRhPzogUGFydGlhbDxEeW5hbWljTW9kdWxlSW50ZXJmYWNlPlxuICApOiBib29sZWFuIHtcbiAgICBpZiAoZHluYW1pY01ldGFkYXRhICYmIGR5bmFtaWNNZXRhZGF0YS5nbG9iYWwpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiAhIVJlZmxlY3QuZ2V0TWV0YWRhdGEoR0xPQkFMX01PRFVMRV9NRVRBREFUQSwgbWV0YXR5cGUpXG4gIH1cblxuICBwdWJsaWMgYWRkR2xvYmFsTW9kdWxlIChtb2R1bGU6IE1vZHVsZSkge1xuICAgIHRoaXMuZ2xvYmFsTW9kdWxlcy5hZGQobW9kdWxlKVxuICB9XG5cbiAgcHVibGljIGdldE1vZHVsZXMgKCk6IE1vZHVsZXNDb250YWluZXIge1xuICAgIHJldHVybiB0aGlzLm1vZHVsZXNcbiAgfVxuXG4gIHB1YmxpYyBnZXRNb2R1bGVDb21waWxlciAoKTogTW9kdWxlQ29tcGlsZXIge1xuICAgIHJldHVybiB0aGlzLm1vZHVsZUNvbXBpbGVyXG4gIH1cblxuICBwdWJsaWMgZ2V0TW9kdWxlQnlLZXkgKG1vZHVsZUtleTogc3RyaW5nKTogTW9kdWxlIHtcbiAgICByZXR1cm4gdGhpcy5tb2R1bGVzLmdldChtb2R1bGVLZXkpXG4gIH1cblxuICBwdWJsaWMgZ2V0SW50ZXJuYWxDb3JlTW9kdWxlUmVmICgpOiBNb2R1bGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmludGVybmFsQ29yZU1vZHVsZVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGFkZEltcG9ydCAoXG4gICAgcmVsYXRlZE1vZHVsZTogVHlwZTxhbnk+IHwgRHluYW1pY01vZHVsZUludGVyZmFjZSxcbiAgICB0b2tlbjogc3RyaW5nXG4gICkge1xuICAgIGlmICghdGhpcy5tb2R1bGVzLmhhcyh0b2tlbikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBtb2R1bGVSZWYgPSB0aGlzLm1vZHVsZXMuZ2V0KHRva2VuKVxuICAgIGNvbnN0IHsgdG9rZW46IHJlbGF0ZWRNb2R1bGVUb2tlbiB9ID0gYXdhaXQgdGhpcy5tb2R1bGVDb21waWxlci5jb21waWxlKFxuICAgICAgcmVsYXRlZE1vZHVsZVxuICAgIClcbiAgICBjb25zdCByZWxhdGVkID0gdGhpcy5tb2R1bGVzLmdldChyZWxhdGVkTW9kdWxlVG9rZW4pXG4gICAgbW9kdWxlUmVmLmFkZFJlbGF0ZWRNb2R1bGUocmVsYXRlZClcbiAgfVxuXG4gIHB1YmxpYyBhZGRQcm92aWRlciAoXG4gICAgcHJvdmlkZXI6IFByb3ZpZGVyVHlwZSxcbiAgICB0b2tlbjogc3RyaW5nLFxuICAgIGVuaGFuY2VyU3VidHlwZT86IEVuaGFuY2VyU3VidHlwZSxcbiAgKTogc3RyaW5nIHwgc3ltYm9sIHwgRnVuY3Rpb24ge1xuICAgIGNvbnN0IG1vZHVsZVJlZiA9IHRoaXMubW9kdWxlcy5nZXQodG9rZW4pO1xuICAgIGlmICghcHJvdmlkZXIpIHtcbiAgICAgIHRocm93IG5ldyBDaXJjdWxhckRlcGVuZGVuY3lFeGNlcHRpb24obW9kdWxlUmVmPy5tZXRhVHlwZS5uYW1lKTtcbiAgICB9XG4gICAgaWYgKCFtb2R1bGVSZWYpIHtcbiAgICAgIHRocm93IG5ldyBVbmtub3duTW9kdWxlRXhjZXB0aW9uKCk7XG4gICAgfVxuICAgIGNvbnN0IHByb3ZpZGVyS2V5ID0gbW9kdWxlUmVmLmFkZFByb3ZpZGVyKHByb3ZpZGVyLCBlbmhhbmNlclN1YnR5cGUpO1xuICAgIGNvbnN0IHByb3ZpZGVyUmVmID0gbW9kdWxlUmVmLmdldFByb3ZpZGVyQnlLZXkocHJvdmlkZXJLZXkpO1xuXG4gICAgRGlzY292ZXJhYmxlTWV0YUhvc3RDb2xsZWN0aW9uLmluc3BlY3RQcm92aWRlcih0aGlzLm1vZHVsZXMsIHByb3ZpZGVyUmVmKTtcblxuICAgIHJldHVybiBwcm92aWRlcktleSBhcyBGdW5jdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBhZGRJbmplY3RhYmxlIChcbiAgICBpbmplY3RhYmxlOiBQcm92aWRlclR5cGUsXG4gICAgdG9rZW46IHN0cmluZyxcbiAgICBlbmhhbmNlclN1YnR5cGU6IEVuaGFuY2VyU3VidHlwZSxcbiAgICBob3N0PzogVHlwZTxJbmplY3RhYmxlVHlwZT5cbiAgKSB7XG4gICAgaWYgKCF0aGlzLm1vZHVsZXMuaGFzKHRva2VuKSkge1xuICAgICAgdGhyb3cgbmV3IFVua25vd25Nb2R1bGVFeGNlcHRpb24oKVxuICAgIH1cbiAgICBjb25zdCBtb2R1bGVSZWYgPSB0aGlzLm1vZHVsZXMuZ2V0KHRva2VuKVxuICAgIHJldHVybiBtb2R1bGVSZWYuYWRkSW5qZWN0YWJsZShpbmplY3RhYmxlLCBlbmhhbmNlclN1YnR5cGUsIGhvc3QpO1xuICB9XG5cbiAgcHVibGljIGFkZEV4cG9ydGVkUHJvdmlkZXIgKHByb3ZpZGVyOiBUeXBlPGFueT4sIHRva2VuOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMubW9kdWxlcy5oYXModG9rZW4pKSB7XG4gICAgICB0aHJvdyBuZXcgVW5rbm93bk1vZHVsZUV4Y2VwdGlvbigpXG4gICAgfVxuICAgIGNvbnN0IG1vZHVsZVJlZiA9IHRoaXMubW9kdWxlcy5nZXQodG9rZW4pXG4gICAgbW9kdWxlUmVmLmFkZEV4cG9ydGVkUHJvdmlkZXIocHJvdmlkZXIpXG4gIH1cblxuICBwdWJsaWMgYWRkQ29udHJvbGxlciAoY29udHJvbGxlcjogVHlwZTxhbnk+LCB0b2tlbjogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLm1vZHVsZXMuaGFzKHRva2VuKSkge1xuICAgICAgdGhyb3cgbmV3IFVua25vd25Nb2R1bGVFeGNlcHRpb24oKVxuICAgIH1cbiAgICBjb25zdCBtb2R1bGVSZWYgPSB0aGlzLm1vZHVsZXMuZ2V0KHRva2VuKVxuICAgIG1vZHVsZVJlZi5hZGRDb250cm9sbGVyKGNvbnRyb2xsZXIpXG4gIH1cblxuICBwdWJsaWMgY2xlYXIgKCkge1xuICAgIHRoaXMubW9kdWxlcy5jbGVhcigpXG4gIH1cblxuICBwdWJsaWMgcmVwbGFjZSAodG9SZXBsYWNlOiBhbnksIG9wdGlvbnM6IGFueSAmIHsgc2NvcGU6IGFueVtdIHwgbnVsbCB9KSB7XG4gICAgdGhpcy5tb2R1bGVzLmZvckVhY2gobW9kdWxlUmVmID0+IG1vZHVsZVJlZi5yZXBsYWNlKHRvUmVwbGFjZSwgb3B0aW9ucykpXG4gIH1cblxuICBwdWJsaWMgYmluZEdsb2JhbFNjb3BlICgpIHtcbiAgICB0aGlzLm1vZHVsZXMuZm9yRWFjaChtb2R1bGVSZWYgPT4gdGhpcy5iaW5kR2xvYmFsc1RvSW1wb3J0cyhtb2R1bGVSZWYpKVxuICB9XG5cbiAgcHVibGljIGJpbmRHbG9iYWxzVG9JbXBvcnRzIChtb2R1bGVSZWY6IE1vZHVsZSkge1xuICAgIHRoaXMuZ2xvYmFsTW9kdWxlcy5mb3JFYWNoKGdsb2JhbE1vZHVsZSA9PlxuICAgICAgdGhpcy5iaW5kR2xvYmFsTW9kdWxlVG9Nb2R1bGUobW9kdWxlUmVmLCBnbG9iYWxNb2R1bGUpXG4gICAgKVxuICB9XG5cbiAgcHVibGljIGJpbmRHbG9iYWxNb2R1bGVUb01vZHVsZSAodGFyZ2V0OiBNb2R1bGUsIGdsb2JhbE1vZHVsZTogTW9kdWxlKSB7XG4gICAgaWYgKHRhcmdldCA9PT0gZ2xvYmFsTW9kdWxlIHx8IHRhcmdldCA9PT0gdGhpcy5pbnRlcm5hbENvcmVNb2R1bGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0YXJnZXQuYWRkUmVsYXRlZE1vZHVsZShnbG9iYWxNb2R1bGUpXG4gIH1cblxuICBwdWJsaWMgZ2V0RHluYW1pY01ldGFkYXRhQnlUb2tlbih0b2tlbjogc3RyaW5nKTogUGFydGlhbDxEeW5hbWljTW9kdWxlSW50ZXJmYWNlPjtcbiAgcHVibGljIGdldER5bmFtaWNNZXRhZGF0YUJ5VG9rZW48XG4gICAgSyBleHRlbmRzIEV4Y2x1ZGU8a2V5b2YgRHluYW1pY01vZHVsZUludGVyZmFjZSwgJ2dsb2JhbCcgfCAnbW9kdWxlJz4sXG4gID4odG9rZW46IHN0cmluZywgbWV0YWRhdGFLZXk6IEspOiBEeW5hbWljTW9kdWxlSW50ZXJmYWNlW0tdO1xuXG4gIHB1YmxpYyBnZXREeW5hbWljTWV0YWRhdGFCeVRva2VuIChcbiAgICB0b2tlbjogc3RyaW5nLFxuICAgIG1ldGFkYXRhS2V5PzogRXhjbHVkZTxrZXlvZiBEeW5hbWljTW9kdWxlSW50ZXJmYWNlLCAnZ2xvYmFsJyB8ICdtb2R1bGUnPixcbiAgKSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmR5bmFtaWNNb2R1bGVzTWV0YWRhdGEuZ2V0KHRva2VuKTtcbiAgICByZXR1cm4gbWV0YWRhdGFLZXkgPyAobWV0YWRhdGE/LlttZXRhZGF0YUtleV0gPz8gW10pIDogbWV0YWRhdGE7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJDb3JlTW9kdWxlUmVmIChtb2R1bGVSZWY6IE1vZHVsZSkge1xuICAgIHRoaXMuaW50ZXJuYWxDb3JlTW9kdWxlID0gbW9kdWxlUmVmXG4gICAgdGhpcy5tb2R1bGVzW0ludGVybmFsQ29yZU1vZHVsZS5uYW1lXSA9IG1vZHVsZVJlZlxuICB9XG5cbiAgcHVibGljIGdldE1vZHVsZVRva2VuRmFjdG9yeSAoKTogTW9kdWxlVG9rZW5GYWN0b3J5IHtcbiAgICByZXR1cm4gdGhpcy5tb2R1bGVUb2tlbkZhY3RvcnlcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlclJlcXVlc3RQcm92aWRlcjxUID0gYW55PiAocmVxdWVzdDogVCwgY29udGV4dElkOiBDb250ZXh0SWQpIHtcbiAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5pbnRlcm5hbENvcmVNb2R1bGUuZ2V0UHJvdmlkZXJCeUtleShSRVFVRVNUKVxuICAgIHdyYXBwZXIuc2V0SW5zdGFuY2VCeUNvbnRleHRJZChjb250ZXh0SWQsIHtcbiAgICAgIGluc3RhbmNlOiByZXF1ZXN0LFxuICAgICAgaXNSZXNvbHZlZDogdHJ1ZVxuICAgIH0pXG4gIH1cbn1cbiJdfQ==