wormhole-explorer/blockchain-watcher/src/infrastructure/RepositoriesBuilder.ts

99 lines
2.7 KiB
TypeScript
Raw Normal View History

import { SNSClient, SNSClientConfig } from "@aws-sdk/client-sns";
import { Config } from "./config";
import {
SnsEventRepository,
EvmJsonRPCBlockRepository,
FileMetadataRepository,
2023-11-12 18:53:11 -08:00
PromStatRepository,
2023-11-14 09:03:11 -08:00
StaticJobRepository,
2023-11-21 04:37:21 -08:00
Web3SolanaSlotRepository,
RateLimitedSolanaSlotRepository,
} from "./repositories";
2023-11-14 09:03:11 -08:00
import { JobRepository } from "../domain/repositories";
2023-11-27 04:10:56 -08:00
import { RepositoriesStrategy } from "./repositories/strategies/RepositoriesStrategy";
export class RepositoriesBuilder {
private cfg: Config;
private snsClient?: SNSClient;
2023-11-28 04:29:47 -08:00
private repositories = new Map<string, any>();
constructor(cfg: Config) {
this.cfg = cfg;
this.build();
}
2023-11-27 04:10:56 -08:00
private build(): void {
this.snsClient = this.createSnsClient();
2023-11-27 04:10:56 -08:00
const repositoryStrategy = new RepositoriesStrategy(this.snsClient, this.cfg);
2023-11-28 04:29:47 -08:00
const staticRepositories = repositoryStrategy.executeStatic();
const dynamicRepositories = repositoryStrategy.executeDynamic();
2023-11-28 10:47:46 -08:00
staticRepositories.forEach((instance, name) => {
this.repositories.set(name, instance);
});
dynamicRepositories.forEach((instance, name) => {
this.repositories.set(name, instance);
});
2023-11-14 09:03:11 -08:00
this.repositories.set(
"jobs",
2023-11-27 04:10:56 -08:00
new StaticJobRepository(this.cfg, (chain: string) => this.getEvmBlockRepository(chain), {
metadataRepo: this.getMetadataRepository(),
statsRepo: this.getStatsRepository(),
snsRepo: this.getSnsEventRepository(),
solanaSlotRepo: this.getSolanaSlotRepository(),
})
2023-11-14 09:03:11 -08:00
);
}
public getEvmBlockRepository(chain: string): EvmJsonRPCBlockRepository {
2023-11-21 04:37:21 -08:00
return this.getRepo(`${chain}-evmRepo`);
}
public getSnsEventRepository(): SnsEventRepository {
2023-11-21 04:37:21 -08:00
return this.getRepo("sns");
}
public getMetadataRepository(): FileMetadataRepository {
2023-11-21 04:37:21 -08:00
return this.getRepo("metadata");
}
2023-11-12 18:53:11 -08:00
public getStatsRepository(): PromStatRepository {
2023-11-21 04:37:21 -08:00
return this.getRepo("metrics");
2023-11-12 18:53:11 -08:00
}
2023-11-14 09:03:11 -08:00
public getJobsRepository(): JobRepository {
2023-11-21 04:37:21 -08:00
return this.getRepo("jobs");
}
public getSolanaSlotRepository(): Web3SolanaSlotRepository {
return this.getRepo("solana-slotRepo");
}
private getRepo(name: string): any {
const repo = this.repositories.get(name);
if (!repo) throw new Error(`No repository ${name}`);
2023-11-14 09:03:11 -08:00
return repo;
}
public close(): void {
this.snsClient?.destroy();
}
private createSnsClient(): SNSClient {
const snsCfg: SNSClientConfig = { region: this.cfg.sns.region };
if (this.cfg.sns.credentials) {
snsCfg.credentials = {
accessKeyId: this.cfg.sns.credentials.accessKeyId,
secretAccessKey: this.cfg.sns.credentials.secretAccessKey,
};
snsCfg.endpoint = this.cfg.sns.credentials.url;
}
return new SNSClient(snsCfg);
}
}