import * as plugins from './tsdocker.plugins.js'; import { logger } from './tsdocker.logging.js'; import { DockerRegistry } from './classes.dockerregistry.js'; /** * Storage class for managing multiple Docker registries */ export class RegistryStorage { public objectMap = new plugins.lik.ObjectMap(); constructor() { // Nothing here } /** * Adds a registry to the storage */ public addRegistry(registryArg: DockerRegistry): void { this.objectMap.add(registryArg); } /** * Gets a registry by its URL */ public getRegistryByUrl(registryUrlArg: string): DockerRegistry | undefined { return this.objectMap.findSync((registryArg) => { return registryArg.registryUrl === registryUrlArg; }); } /** * Gets all registries */ public getAllRegistries(): DockerRegistry[] { return this.objectMap.getArray(); } /** * Logs in to all registries */ public async loginAll(): Promise { await this.objectMap.forEach(async (registryArg) => { await registryArg.login(); }); logger.log('success', 'logged in successfully into all available DockerRegistries!'); } /** * Logs out from all registries */ public async logoutAll(): Promise { await this.objectMap.forEach(async (registryArg) => { await registryArg.logout(); }); logger.log('info', 'logged out from all DockerRegistries'); } /** * Loads registries from environment variables * Looks for DOCKER_REGISTRY_1, DOCKER_REGISTRY_2, etc. (pipe-delimited format) * Or individual registries like DOCKER_REGISTRY_GITLAB_URL, etc. */ public loadFromEnv(): void { // Check for numbered registry env vars (pipe-delimited format) for (let i = 1; i <= 10; i++) { const envVar = process.env[`DOCKER_REGISTRY_${i}`]; if (envVar) { try { const registry = DockerRegistry.fromEnvString(envVar); this.addRegistry(registry); } catch (err) { logger.log('warn', `Failed to parse DOCKER_REGISTRY_${i}: ${(err as Error).message}`); } } } // Check for default registry const defaultRegistry = DockerRegistry.fromEnv(); if (defaultRegistry) { this.addRegistry(defaultRegistry); } } }