@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
77 lines • 9.46 kB
JavaScript
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