UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

77 lines 9.46 kB
import { Injectable, InjectionToken, Injector } from '@angular/core'; import { PluginsResolveService } from '../plugins'; import { hookGeneric } from './extension-hooks'; import * as i0 from "@angular/core"; import * as i1 from "../plugins"; const SERVICE_HOOK_TOKENS = new Map(); /** * Registers a service using a specified extension key. * This function facilitates dynamic service registration, enabling services * to be retrieved and used throughout the application based on their extension key. * * @param extensionKey The unique identifier for the service, defined within the ExtensionKeys interface. * @param service The class type of the service to register. * @returns A provider configuration for Angular's dependency injection, allowing the service to be injected where needed. * * * @example * ```typescript * hookService('layersServiceKey', TestService); * ``` */ export function hookService(extensionKey, service) { let token = SERVICE_HOOK_TOKENS.get(extensionKey); if (!token) { token = new InjectionToken(extensionKey); SERVICE_HOOK_TOKENS.set(extensionKey, token); } return hookGeneric(service, token); } /** * Service for managing and retrieving dynamically registered services within the application. * It leverages a map of InjectionTokens to associate services with unique extension keys. */ export class ServiceRegistry { constructor(rootInjector, pluginService) { this.injectors = [rootInjector]; pluginService.injectors$.subscribe(injector => this.injectors.push(injector)); } /** * Retrieves instances of services registered under a specified extension key. * * @param key - The extension key associated with the desired service. * @returns An array of service instances registered under the given key. * * @example * ```typescript * // Retrieving instances of Service example * const layersServices = serviceRegistry.get('layersServiceKey'); * layersServices.forEach(service => service.get().then(layer => console.log(layer))); * ``` */ get(key) { const token = SERVICE_HOOK_TOKENS.get(key); if (!token) { return []; } return this.injectors .map(injector => injector.get(token, [], { self: true, optional: true })) .flat(); } /** * Allows to retrieve all registered extension keys. * * @returns An array of extension keys that have been registered. */ getRegisteredExtensionKeys() { return Array.from(SERVICE_HOOK_TOKENS.keys()); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServiceRegistry, deps: [{ token: i0.Injector }, { token: i1.PluginsResolveService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServiceRegistry, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ServiceRegistry, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.PluginsResolveService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1yZWdpc3RyeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS9jb21tb24vc2VydmljZS1yZWdpc3RyeS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBUSxNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7QUFFaEQsTUFBTSxtQkFBbUIsR0FHckIsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUVkOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUV6QixZQUFlLEVBQUUsT0FBeUQ7SUFDMUUsSUFBSSxLQUFLLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRWxELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLEtBQUssR0FBRyxJQUFJLGNBQWMsQ0FBaUIsWUFBc0IsQ0FBQyxDQUFDO1FBQ25FLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELE9BQU8sV0FBVyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNyQyxDQUFDO0FBRUQ7OztHQUdHO0FBSUgsTUFBTSxPQUFPLGVBQWU7SUFHMUIsWUFBWSxZQUFzQixFQUFFLGFBQW9DO1FBQ3RFLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoQyxhQUFhLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILEdBQUcsQ0FHRCxHQUFNO1FBQ04sTUFBTSxLQUFLLEdBQXdCLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTO2FBQ2xCLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7YUFDeEUsSUFBSSxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILDBCQUEwQjtRQUN4QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNoRCxDQUFDOytHQXpDVSxlQUFlO21IQUFmLGVBQWUsY0FGZCxNQUFNOzs0RkFFUCxlQUFlO2tCQUgzQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBJbmplY3RvciwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGx1Z2luc1Jlc29sdmVTZXJ2aWNlIH0gZnJvbSAnLi4vcGx1Z2lucyc7XG5pbXBvcnQgeyBob29rR2VuZXJpYyB9IGZyb20gJy4vZXh0ZW5zaW9uLWhvb2tzJztcblxuY29uc3QgU0VSVklDRV9IT09LX1RPS0VOUzogTWFwPFxuICBrZXlvZiBDdW11bG9jaXR5U2VydmljZVJlZ2lzdHJ5LkV4dGVuc2lvbktleXMsXG4gIEluamVjdGlvblRva2VuPGFueT5cbj4gPSBuZXcgTWFwKCk7XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgc2VydmljZSB1c2luZyBhIHNwZWNpZmllZCBleHRlbnNpb24ga2V5LlxuICogVGhpcyBmdW5jdGlvbiBmYWNpbGl0YXRlcyBkeW5hbWljIHNlcnZpY2UgcmVnaXN0cmF0aW9uLCBlbmFibGluZyBzZXJ2aWNlc1xuICogdG8gYmUgcmV0cmlldmVkIGFuZCB1c2VkIHRocm91Z2hvdXQgdGhlIGFwcGxpY2F0aW9uIGJhc2VkIG9uIHRoZWlyIGV4dGVuc2lvbiBrZXkuXG4gKlxuICogQHBhcmFtIGV4dGVuc2lvbktleSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBzZXJ2aWNlLCBkZWZpbmVkIHdpdGhpbiB0aGUgRXh0ZW5zaW9uS2V5cyBpbnRlcmZhY2UuXG4gKiBAcGFyYW0gc2VydmljZSBUaGUgY2xhc3MgdHlwZSBvZiB0aGUgc2VydmljZSB0byByZWdpc3Rlci5cbiAqIEByZXR1cm5zIEEgcHJvdmlkZXIgY29uZmlndXJhdGlvbiBmb3IgQW5ndWxhcidzIGRlcGVuZGVuY3kgaW5qZWN0aW9uLCBhbGxvd2luZyB0aGUgc2VydmljZSB0byBiZSBpbmplY3RlZCB3aGVyZSBuZWVkZWQuXG4gKlxuICogICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGhvb2tTZXJ2aWNlKCdsYXllcnNTZXJ2aWNlS2V5JywgVGVzdFNlcnZpY2UpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBob29rU2VydmljZTxcbiAgVCBleHRlbmRzIHN0cmluZyA9IGtleW9mIEN1bXVsb2NpdHlTZXJ2aWNlUmVnaXN0cnkuU3BlY2lmaWNFeHRlbnNpb25LZXlzXG4+KGV4dGVuc2lvbktleTogVCwgc2VydmljZTogVHlwZTxDdW11bG9jaXR5U2VydmljZVJlZ2lzdHJ5LkV4dGVuc2lvbktleXNbVF0+KSB7XG4gIGxldCB0b2tlbiA9IFNFUlZJQ0VfSE9PS19UT0tFTlMuZ2V0KGV4dGVuc2lvbktleSk7XG5cbiAgaWYgKCF0b2tlbikge1xuICAgIHRva2VuID0gbmV3IEluamVjdGlvblRva2VuPHR5cGVvZiBzZXJ2aWNlPihleHRlbnNpb25LZXkgYXMgc3RyaW5nKTtcbiAgICBTRVJWSUNFX0hPT0tfVE9LRU5TLnNldChleHRlbnNpb25LZXksIHRva2VuKTtcbiAgfVxuXG4gIHJldHVybiBob29rR2VuZXJpYyhzZXJ2aWNlLCB0b2tlbik7XG59XG5cbi8qKlxuICogU2VydmljZSBmb3IgbWFuYWdpbmcgYW5kIHJldHJpZXZpbmcgZHluYW1pY2FsbHkgcmVnaXN0ZXJlZCBzZXJ2aWNlcyB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uLlxuICogSXQgbGV2ZXJhZ2VzIGEgbWFwIG9mIEluamVjdGlvblRva2VucyB0byBhc3NvY2lhdGUgc2VydmljZXMgd2l0aCB1bmlxdWUgZXh0ZW5zaW9uIGtleXMuXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFNlcnZpY2VSZWdpc3RyeSB7XG4gIHByb3RlY3RlZCBpbmplY3RvcnM6IEluamVjdG9yW107XG5cbiAgY29uc3RydWN0b3Iocm9vdEluamVjdG9yOiBJbmplY3RvciwgcGx1Z2luU2VydmljZTogUGx1Z2luc1Jlc29sdmVTZXJ2aWNlKSB7XG4gICAgdGhpcy5pbmplY3RvcnMgPSBbcm9vdEluamVjdG9yXTtcbiAgICBwbHVnaW5TZXJ2aWNlLmluamVjdG9ycyQuc3Vic2NyaWJlKGluamVjdG9yID0+IHRoaXMuaW5qZWN0b3JzLnB1c2goaW5qZWN0b3IpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgaW5zdGFuY2VzIG9mIHNlcnZpY2VzIHJlZ2lzdGVyZWQgdW5kZXIgYSBzcGVjaWZpZWQgZXh0ZW5zaW9uIGtleS5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFRoZSBleHRlbnNpb24ga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVzaXJlZCBzZXJ2aWNlLlxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBzZXJ2aWNlIGluc3RhbmNlcyByZWdpc3RlcmVkIHVuZGVyIHRoZSBnaXZlbiBrZXkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gUmV0cmlldmluZyBpbnN0YW5jZXMgb2YgU2VydmljZSBleGFtcGxlXG4gICAqIGNvbnN0IGxheWVyc1NlcnZpY2VzID0gc2VydmljZVJlZ2lzdHJ5LmdldCgnbGF5ZXJzU2VydmljZUtleScpO1xuICAgKiBsYXllcnNTZXJ2aWNlcy5mb3JFYWNoKHNlcnZpY2UgPT4gc2VydmljZS5nZXQoKS50aGVuKGxheWVyID0+IGNvbnNvbGUubG9nKGxheWVyKSkpO1xuICAgKiBgYGBcbiAgICovXG4gIGdldDxcbiAgICBUIGV4dGVuZHMgc3RyaW5nID0ga2V5b2YgQ3VtdWxvY2l0eVNlcnZpY2VSZWdpc3RyeS5TcGVjaWZpY0V4dGVuc2lvbktleXMsXG4gICAgUiA9IEN1bXVsb2NpdHlTZXJ2aWNlUmVnaXN0cnkuRXh0ZW5zaW9uS2V5c1tUXVxuICA+KGtleTogVCk6IFJbXSB7XG4gICAgY29uc3QgdG9rZW46IEluamVjdGlvblRva2VuPFJbXT4gPSBTRVJWSUNFX0hPT0tfVE9LRU5TLmdldChrZXkpO1xuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaW5qZWN0b3JzXG4gICAgICAubWFwKGluamVjdG9yID0+IGluamVjdG9yLmdldCh0b2tlbiwgW10sIHsgc2VsZjogdHJ1ZSwgb3B0aW9uYWw6IHRydWUgfSkpXG4gICAgICAuZmxhdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93cyB0byByZXRyaWV2ZSBhbGwgcmVnaXN0ZXJlZCBleHRlbnNpb24ga2V5cy5cbiAgICpcbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgZXh0ZW5zaW9uIGtleXMgdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZC5cbiAgICovXG4gIGdldFJlZ2lzdGVyZWRFeHRlbnNpb25LZXlzKCk6IEFycmF5PGtleW9mIEN1bXVsb2NpdHlTZXJ2aWNlUmVnaXN0cnkuRXh0ZW5zaW9uS2V5cz4ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKFNFUlZJQ0VfSE9PS19UT0tFTlMua2V5cygpKTtcbiAgfVxufVxuIl19