import { readObj } from '@rsdk/common.node'; import { LoggerFactory } from '@rsdk/logging'; import { watch } from 'node:fs'; import { DeclareProperty, InjectProperty } from '../../metadata'; import { FsPathParser } from '../../parsers'; import { ReloadEvents } from '../../reload'; import { ReloadableConfigSource } from '../base'; import { Source } from '../config-source.decorator'; @Source('reloadable') @DeclareProperty('CONFIG_PATH', new FsPathParser('file'), { description: 'Path to some configuration file', }) export class ReloadableFileSource extends ReloadableConfigSource { constructor( @InjectProperty('CONFIG_PATH') private readonly path: string, reloadEvents: ReloadEvents, ) { super(LoggerFactory.create(ReloadableFileSource), reloadEvents); } override name(): string { return `Configuration file: ${this.path}`; } override loadRaw(): Promise { return readObj(this.path); } override init(): void { watch(this.path, (event) => { if (event !== 'change') { return; } this.logger.info('Changes detected', { source: this.name }); this.reload(); }); } }