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 {
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([]));
}
export const PromiseHelpers = {
/**
* Return first resolved promise as the result.
*/
public static async first(promises: Array<Promise<any>>): Promise<any> {
sequence: async function(promises: (() => Promise<any>)[]) {
return promises.reduce((promise, func) =>
promise.then(result => func().then(res => result.concat(res))), Promise.resolve([]));
},
first: async function(promises) {
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));
})).then(
// If '.all' resolved, we've just got an array of errors.
(errors) => Promise.reject(errors),
// If '.all' rejected, we've got the result we wanted.
(val) => Promise.resolve(val)
);
}
},
/**
* Delay promise
*/
public static async delay(duration: number): Promise<void> {
return new Promise((resolve) => setTimeout(() => resolve(), duration));
}
delay: async function(duration: number) {
return new Promise<void>(resolve => setTimeout(() => resolve(), duration));
},
/**
* Timeout promise after a set time in ms
*/
public static async timeout(timeoutMs: number, promise: Promise<any>, message = 'Timed out'): Promise<any> {
timeout: async function(timeoutMs: number, promise, message = 'Timed out') {
return Promise.race([
promise,
new Promise(function (resolve, reject) {
@@ -40,12 +27,9 @@ export class PromiseHelpers {
}, timeoutMs);
})
]);
}
},
/**
* Return most common value from given array.
*/
public static mostCommonValue(array: any[]): any {
mostCommonValue: function(array) {
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";
export class CacheConfig {
public MONGODB_HOST: string = process.env.MONGODB_HOST || 'mongodb';
public MONGODB_PORT: string = process.env.MONGODB_PORT || '27017';
public MONGODB_DB: string = process.env.MONGODB_DB || 'knightcrawler';
public MONGO_INITDB_ROOT_USERNAME: string = process.env.MONGO_INITDB_ROOT_USERNAME || 'mongo';
public MONGO_INITDB_ROOT_PASSWORD: string = process.env.MONGO_INITDB_ROOT_PASSWORD || 'mongo';
public NO_CACHE: boolean = BooleanHelpers.parseBool(process.env.NO_CACHE, false);
public COLLECTION_NAME: string = process.env.MONGODB_COLLECTION || 'knightcrawler_consumer_collection';
public get MONGO_URI() {
export const cacheConfig = {
MONGODB_HOST: process.env.MONGODB_HOST || 'mongodb',
MONGODB_PORT: process.env.MONGODB_PORT || '27017',
MONGODB_DB: process.env.MONGODB_DB || 'knightcrawler',
MONGO_INITDB_ROOT_USERNAME: process.env.MONGO_INITDB_ROOT_USERNAME || 'mongo',
MONGO_INITDB_ROOT_PASSWORD: process.env.MONGO_INITDB_ROOT_PASSWORD || 'mongo',
NO_CACHE: BooleanHelpers.parseBool(process.env.NO_CACHE, false),
COLLECTION_NAME: process.env.MONGODB_COLLECTION || 'knightcrawler_consumer_collection',
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`;
}
}
};

View File

@@ -1,14 +1,14 @@
import {BooleanHelpers} from "../../helpers/boolean_helpers";
export class DatabaseConfig {
public POSTGRES_HOST: string = process.env.POSTGRES_HOST || 'postgres';
public POSTGRES_PORT: number = parseInt(process.env.POSTGRES_PORT || '5432');
public POSTGRES_DB: string = process.env.POSTGRES_DB || 'knightcrawler';
public POSTGRES_USER: string = process.env.POSTGRES_USER || 'postgres';
public POSTGRES_PASSWORD: string = process.env.POSTGRES_PASSWORD || 'postgres';
public AUTO_CREATE_AND_APPLY_MIGRATIONS : boolean = BooleanHelpers.parseBool(process.env.AUTO_CREATE_AND_APPLY_MIGRATIONS, false);
public get POSTGRES_URI() {
export const databaseConfig = {
POSTGRES_HOST: process.env.POSTGRES_HOST || 'postgres',
POSTGRES_PORT: parseInt(process.env.POSTGRES_PORT || '5432'),
POSTGRES_DB: process.env.POSTGRES_DB || 'knightcrawler',
POSTGRES_USER: process.env.POSTGRES_USER || 'postgres',
POSTGRES_PASSWORD: process.env.POSTGRES_PASSWORD || 'postgres',
AUTO_CREATE_AND_APPLY_MIGRATIONS: BooleanHelpers.parseBool(process.env.AUTO_CREATE_AND_APPLY_MIGRATIONS, false),
get POSTGRES_URI() {
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";
export class JobConfig {
public JOB_CONCURRENCY: number = parseInt(process.env.JOB_CONCURRENCY || "1", 10);
public JOBS_ENABLED: boolean = BooleanHelpers.parseBool(process.env.JOBS_ENABLED, true);
}
export const jobConfig = {
JOB_CONCURRENCY: parseInt(process.env.JOB_CONCURRENCY || "1", 10),
JOBS_ENABLED: BooleanHelpers.parseBool(process.env.JOBS_ENABLED, true)
};

View File

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

View File

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

View File

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

View File

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

View File

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