Skip to content

Commit dde8c83

Browse files
committed
feat(config-files): add CacheConfigFileContent decorator
1 parent 6fd5498 commit dde8c83

2 files changed

Lines changed: 26 additions & 0 deletions

File tree

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { Observable, shareReplay } from 'rxjs';
2+
3+
import { ConfigFileDefinition } from './definition';
4+
import { ConfigFileLoader } from './loader';
5+
6+
/**
7+
* Decorator for {@link ConfigFileLoader}
8+
* that caches the loaded configuration objects of each definition.
9+
*/
10+
export class CacheConfigFileContent implements ConfigFileLoader {
11+
#cache = new Map<
12+
ConfigFileDefinition<unknown, unknown>,
13+
Observable<unknown>
14+
>();
15+
16+
constructor(private kernel: ConfigFileLoader) {}
17+
18+
load<T, Schema>(def: ConfigFileDefinition<T, Schema>): Observable<T> {
19+
const cached = this.#cache.get(def);
20+
if (cached) return cached as Observable<T>;
21+
const result$ = this.kernel.load(def).pipe(shareReplay(1));
22+
this.#cache.set(def, result$);
23+
return result$;
24+
}
25+
}

packages/config-files/src/public-api.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { defineConfigFile } from './definition';
33
/**@deprecated */
44
export const defineConfigFileMetadata = defineConfigFile;
55

6+
export * from './behaviors';
67
export * from './definition';
78
export * from './loader';
89
export * from './parser';

0 commit comments

Comments
 (0)