to functional constants

This commit is contained in:
iPromKnight
2024-02-06 11:00:29 +00:00
committed by iPromKnight
parent 457df6b326
commit 7cb69a69d9
9 changed files with 72 additions and 90 deletions

View File

@@ -1,37 +1,24 @@
export class PromiseHelpers { export const PromiseHelpers = {
public static async sequence(promises: Array<() => Promise<any>>): Promise<any[]> {
return promises.reduce((promise: Promise<any[]>, func: () => Promise<any>) =>
promise.then(result => func().then(res => result.concat(res))), Promise.resolve([]));
}
/** sequence: async function(promises: (() => Promise<any>)[]) {
* Return first resolved promise as the result. return promises.reduce((promise, func) =>
*/ promise.then(result => func().then(res => result.concat(res))), Promise.resolve([]));
public static async first(promises: Array<Promise<any>>): Promise<any> { },
first: async function(promises) {
return Promise.all(promises.map(p => { return Promise.all(promises.map(p => {
// If a request fails, count that as a resolution so it will keep
// waiting for other possible successes. If a request succeeds,
// treat it as a rejection so Promise.all immediately bails out.
return p.then((val) => Promise.reject(val), (err) => Promise.resolve(err)); return p.then((val) => Promise.reject(val), (err) => Promise.resolve(err));
})).then( })).then(
// If '.all' resolved, we've just got an array of errors.
(errors) => Promise.reject(errors), (errors) => Promise.reject(errors),
// If '.all' rejected, we've got the result we wanted.
(val) => Promise.resolve(val) (val) => Promise.resolve(val)
); );
} },
/** delay: async function(duration: number) {
* Delay promise return new Promise<void>(resolve => setTimeout(() => resolve(), duration));
*/ },
public static async delay(duration: number): Promise<void> {
return new Promise((resolve) => setTimeout(() => resolve(), duration));
}
/** timeout: async function(timeoutMs: number, promise, message = 'Timed out') {
* Timeout promise after a set time in ms
*/
public static async timeout(timeoutMs: number, promise: Promise<any>, message = 'Timed out'): Promise<any> {
return Promise.race([ return Promise.race([
promise, promise,
new Promise(function (resolve, reject) { new Promise(function (resolve, reject) {
@@ -40,12 +27,9 @@ export class PromiseHelpers {
}, timeoutMs); }, timeoutMs);
}) })
]); ]);
} },
/** mostCommonValue: function(array) {
* Return most common value from given array.
*/
public static mostCommonValue(array: any[]): any {
return array.sort((a, b) => array.filter(v => v === a).length - array.filter(v => v === b).length).pop(); return array.sort((a, b) => array.filter(v => v === a).length - array.filter(v => v === b).length).pop();
} }
} };

View File

@@ -1,15 +1,15 @@
import {BooleanHelpers} from "../../helpers/boolean_helpers"; import {BooleanHelpers} from "../../helpers/boolean_helpers";
export class CacheConfig { export const cacheConfig = {
public MONGODB_HOST: string = process.env.MONGODB_HOST || 'mongodb'; MONGODB_HOST: process.env.MONGODB_HOST || 'mongodb',
public MONGODB_PORT: string = process.env.MONGODB_PORT || '27017'; MONGODB_PORT: process.env.MONGODB_PORT || '27017',
public MONGODB_DB: string = process.env.MONGODB_DB || 'knightcrawler'; MONGODB_DB: process.env.MONGODB_DB || 'knightcrawler',
public MONGO_INITDB_ROOT_USERNAME: string = process.env.MONGO_INITDB_ROOT_USERNAME || 'mongo'; MONGO_INITDB_ROOT_USERNAME: process.env.MONGO_INITDB_ROOT_USERNAME || 'mongo',
public MONGO_INITDB_ROOT_PASSWORD: string = process.env.MONGO_INITDB_ROOT_PASSWORD || 'mongo'; MONGO_INITDB_ROOT_PASSWORD: process.env.MONGO_INITDB_ROOT_PASSWORD || 'mongo',
public NO_CACHE: boolean = BooleanHelpers.parseBool(process.env.NO_CACHE, false); NO_CACHE: BooleanHelpers.parseBool(process.env.NO_CACHE, false),
public COLLECTION_NAME: string = process.env.MONGODB_COLLECTION || 'knightcrawler_consumer_collection'; COLLECTION_NAME: process.env.MONGODB_COLLECTION || 'knightcrawler_consumer_collection',
public get MONGO_URI() { get MONGO_URI() {
return `mongodb://${this.MONGO_INITDB_ROOT_USERNAME}:${this.MONGO_INITDB_ROOT_PASSWORD}@${this.MONGODB_HOST}:${this.MONGODB_PORT}/${this.MONGODB_DB}?authSource=admin`; return `mongodb://${this.MONGO_INITDB_ROOT_USERNAME}:${this.MONGO_INITDB_ROOT_PASSWORD}@${this.MONGODB_HOST}:${this.MONGODB_PORT}/${this.MONGODB_DB}?authSource=admin`;
} }
} };

View File

@@ -1,14 +1,14 @@
import {BooleanHelpers} from "../../helpers/boolean_helpers"; import {BooleanHelpers} from "../../helpers/boolean_helpers";
export class DatabaseConfig { export const databaseConfig = {
public POSTGRES_HOST: string = process.env.POSTGRES_HOST || 'postgres'; POSTGRES_HOST: process.env.POSTGRES_HOST || 'postgres',
public POSTGRES_PORT: number = parseInt(process.env.POSTGRES_PORT || '5432'); POSTGRES_PORT: parseInt(process.env.POSTGRES_PORT || '5432'),
public POSTGRES_DB: string = process.env.POSTGRES_DB || 'knightcrawler'; POSTGRES_DB: process.env.POSTGRES_DB || 'knightcrawler',
public POSTGRES_USER: string = process.env.POSTGRES_USER || 'postgres'; POSTGRES_USER: process.env.POSTGRES_USER || 'postgres',
public POSTGRES_PASSWORD: string = process.env.POSTGRES_PASSWORD || 'postgres'; POSTGRES_PASSWORD: process.env.POSTGRES_PASSWORD || 'postgres',
public AUTO_CREATE_AND_APPLY_MIGRATIONS : boolean = BooleanHelpers.parseBool(process.env.AUTO_CREATE_AND_APPLY_MIGRATIONS, false); AUTO_CREATE_AND_APPLY_MIGRATIONS: BooleanHelpers.parseBool(process.env.AUTO_CREATE_AND_APPLY_MIGRATIONS, false),
public get POSTGRES_URI() { get POSTGRES_URI() {
return `postgres://${this.POSTGRES_USER}:${this.POSTGRES_PASSWORD}@${this.POSTGRES_HOST}:${this.POSTGRES_PORT}/${this.POSTGRES_DB}`; return `postgres://${this.POSTGRES_USER}:${this.POSTGRES_PASSWORD}@${this.POSTGRES_HOST}:${this.POSTGRES_PORT}/${this.POSTGRES_DB}`;
} }
} };

View File

@@ -1,6 +1,6 @@
import {BooleanHelpers} from "../../helpers/boolean_helpers"; import {BooleanHelpers} from "../../helpers/boolean_helpers";
export class JobConfig { export const jobConfig = {
public JOB_CONCURRENCY: number = parseInt(process.env.JOB_CONCURRENCY || "1", 10); JOB_CONCURRENCY: parseInt(process.env.JOB_CONCURRENCY || "1", 10),
public JOBS_ENABLED: boolean = BooleanHelpers.parseBool(process.env.JOBS_ENABLED, true); JOBS_ENABLED: BooleanHelpers.parseBool(process.env.JOBS_ENABLED, true)
} };

View File

@@ -1,4 +1,4 @@
export class MetadataConfig { export const metadataConfig = {
public IMDB_CONCURRENT: number = parseInt(process.env.IMDB_CONCURRENT || "1", 10); IMDB_CONCURRENT: parseInt(process.env.IMDB_CONCURRENT || "1", 10),
public IMDB_INTERVAL_MS: number = parseInt(process.env.IMDB_INTERVAL_MS || "1000", 10); IMDB_INTERVAL_MS: parseInt(process.env.IMDB_INTERVAL_MS || "1000", 10)
} };

View File

@@ -1,4 +1,4 @@
export class RabbitConfig { export const rabbitConfig = {
public RABBIT_URI: string = process.env.RABBIT_URI || 'amqp://localhost'; RABBIT_URI: process.env.RABBIT_URI || 'amqp://localhost',
public QUEUE_NAME: string = process.env.QUEUE_NAME || 'test-queue'; QUEUE_NAME: process.env.QUEUE_NAME || 'test-queue'
} };

View File

@@ -1,4 +1,4 @@
export class TorrentConfig { export const torrentConfig = {
public MAX_CONNECTIONS_PER_TORRENT: number = parseInt(process.env.MAX_SINGLE_TORRENT_CONNECTIONS || "20", 10); MAX_CONNECTIONS_PER_TORRENT: parseInt(process.env.MAX_SINGLE_TORRENT_CONNECTIONS || "20", 10),
public TIMEOUT: number = parseInt(process.env.TORRENT_TIMEOUT || "30000", 10); TIMEOUT: parseInt(process.env.TORRENT_TIMEOUT || "30000", 10)
} };

View File

@@ -1,6 +1,6 @@
import {BooleanHelpers} from "../../helpers/boolean_helpers"; import {BooleanHelpers} from "../../helpers/boolean_helpers";
export class TrackerConfig { export const trackerConfig = {
public TRACKERS_URL: string = process.env.TRACKERS_URL || 'https://ngosang.github.io/trackerslist/trackers_all.txt'; TRACKERS_URL: process.env.TRACKERS_URL || 'https://ngosang.github.io/trackerslist/trackers_all.txt',
public UDP_ENABLED: boolean = BooleanHelpers.parseBool(process.env.UDP_TRACKERS_ENABLED, false); UDP_ENABLED: BooleanHelpers.parseBool(process.env.UDP_TRACKERS_ENABLED, false)
} };

View File

@@ -1,19 +1,17 @@
import {RabbitConfig} from "../models/configuration/rabbit_config"; import {rabbitConfig} from "../models/configuration/rabbit_config";
import {CacheConfig} from "../models/configuration/cache_config"; import {cacheConfig} from "../models/configuration/cache_config";
import {DatabaseConfig} from "../models/configuration/database_config"; import {databaseConfig} from "../models/configuration/database_config";
import {JobConfig} from "../models/configuration/job_config"; import {jobConfig} from "../models/configuration/job_config";
import {MetadataConfig} from "../models/configuration/metadata_config"; import {metadataConfig} from "../models/configuration/metadata_config";
import {TrackerConfig} from "../models/configuration/tracker_config"; import {trackerConfig} from "../models/configuration/tracker_config";
import {TorrentConfig} from "../models/configuration/torrent_config"; import {torrentConfig} from "../models/configuration/torrent_config";
class ConfigurationService { export const configurationService = {
public readonly rabbitConfig = new RabbitConfig(); rabbitConfig: rabbitConfig,
public readonly cacheConfig = new CacheConfig(); cacheConfig: cacheConfig,
public readonly databaseConfig = new DatabaseConfig(); databaseConfig: databaseConfig,
public readonly jobConfig = new JobConfig(); jobConfig: jobConfig,
public readonly metadataConfig = new MetadataConfig(); metadataConfig: metadataConfig,
public readonly trackerConfig = new TrackerConfig(); trackerConfig: trackerConfig,
public readonly torrentConfig = new TorrentConfig(); torrentConfig: torrentConfig
} };
export const configurationService = new ConfigurationService();