Create scaffolding of consumers

This commit is contained in:
2024-11-13 16:38:54 +01:00
parent 3bc4785fdb
commit 0d5ce4d0d6
3 changed files with 48 additions and 1 deletions

View File

@@ -1,12 +1,15 @@
import { ConsumerConfig } from "../consumers/types";
export type Config = {
/**
* Tauron service configuration
*/
tauron: TauronConfig;
consumers: Record<string, unknown>;
};
export type TauronConfig = {
export type TauronConfig = ConsumerConfig & {
/**
* Path to file containing a username of Tauron account
*/

11
src/consumers/index.ts Normal file
View 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
View 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);
}
};