Create scaffolding of consumers
This commit is contained in:
@@ -1,12 +1,15 @@
|
|||||||
|
import { ConsumerConfig } from "../consumers/types";
|
||||||
|
|
||||||
export type Config = {
|
export type Config = {
|
||||||
/**
|
/**
|
||||||
* Tauron service configuration
|
* Tauron service configuration
|
||||||
*/
|
*/
|
||||||
tauron: TauronConfig;
|
tauron: TauronConfig;
|
||||||
|
|
||||||
|
consumers: Record<string, unknown>;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type TauronConfig = {
|
export type TauronConfig = ConsumerConfig & {
|
||||||
/**
|
/**
|
||||||
* Path to file containing a username of Tauron account
|
* Path to file containing a username of Tauron account
|
||||||
*/
|
*/
|
||||||
|
|||||||
11
src/consumers/index.ts
Normal file
11
src/consumers/index.ts
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import { Dayjs } from "dayjs";
|
||||||
|
import { Config } from "../config";
|
||||||
|
import { MQTTConsumer } from "./mqtt";
|
||||||
|
import { Measurement } from "../fetcher/types";
|
||||||
|
|
||||||
|
const consumers = [
|
||||||
|
new MQTTConsumer()
|
||||||
|
];
|
||||||
|
|
||||||
|
export const consume = (config: Config, date: Dayjs, measurement: Measurement) =>
|
||||||
|
consumers.forEach(consumer => consumer.consume(config, date, measurement));
|
||||||
33
src/consumers/types.ts
Normal file
33
src/consumers/types.ts
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
import { Dayjs } from "dayjs";
|
||||||
|
import { Measurement } from "../fetcher/types";
|
||||||
|
import { Config } from "../config";
|
||||||
|
|
||||||
|
export type ConsumerConfig = {
|
||||||
|
enable?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export abstract class Consumer<C extends ConsumerConfig> {
|
||||||
|
public abstract readonly name: string;
|
||||||
|
protected abstract requiredFields: readonly (keyof C)[];
|
||||||
|
protected abstract publish(config: C, date: Dayjs, measurement: Measurement): void;
|
||||||
|
|
||||||
|
#validate(config: Partial<C>): C {
|
||||||
|
for (const field of this.requiredFields) {
|
||||||
|
if (config[field] === undefined) {
|
||||||
|
throw new Error(`The '${String(field)}' configuration field of'${this.name}' consumer is required`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return config as C;
|
||||||
|
}
|
||||||
|
|
||||||
|
consume(config: Config, date: Dayjs, measurement: Measurement): void {
|
||||||
|
const cfg = config.consumers[this.name] as Partial<C>;
|
||||||
|
|
||||||
|
if (cfg.enable !== true) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this.publish(this.#validate(cfg), date, measurement);
|
||||||
|
}
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user