src / image_search / providers / ImageProviderFactory.ts
import { Config } from "../../config/Config";
import { HTTPClient } from "../../http/HTTPClient";
import { BaseImageProvider } from "./BaseImageProvider";
import { BingImageProvider } from "./BingImageProvider";
import { DuckDuckGoImageProvider } from "./DuckDuckGoImageProvider";
import { PexelsImageProvider } from "./PexelsImageProvider";
import { SerpApiImageProvider } from "./SerpApiImageProvider";
export interface CreateImageProviderOptions {
httpClient?: HTTPClient;
}
/**
* Dedicated factory class for instantiating image search provider subclasses.
* Separated from ImageProviderRegistry to break circular dependency with Config.
*/
export class ImageProviderFactory {
/**
* Instantiate and return configured active BaseImageProvider instance by name string.
*
* @param providerName Optional image search provider name string (defaults to Config.getImageProviderName()).
* @param options Optional httpClient override.
* @returns Configured BaseImageProvider subclass instance.
*/
public static createImageProvider(
providerName?: string,
options: CreateImageProviderOptions = {}
): BaseImageProvider {
const targetName = (providerName || Config.getImageProviderName()).toLowerCase().trim();
const httpClient =
options.httpClient ?? new HTTPClient({ timeoutSeconds: Config.getHttpTimeout() });
if (targetName === "bing") {
return new BingImageProvider({ httpClient });
}
if (targetName === "serpapi") {
const keys = Config.getProviderKeys("serpapi");
return new SerpApiImageProvider({
keys,
httpClient,
});
}
if (targetName === "pexels") {
const keys = Config.getProviderKeys("pexels");
return new PexelsImageProvider({
keys,
httpClient,
});
}
// Default to DuckDuckGo (requires no API keys)
return new DuckDuckGoImageProvider({ httpClient });
}
}
src / image_search / providers / ImageProviderFactory.ts
import { Config } from "../../config/Config";
import { HTTPClient } from "../../http/HTTPClient";
import { BaseImageProvider } from "./BaseImageProvider";
import { BingImageProvider } from "./BingImageProvider";
import { DuckDuckGoImageProvider } from "./DuckDuckGoImageProvider";
import { PexelsImageProvider } from "./PexelsImageProvider";
import { SerpApiImageProvider } from "./SerpApiImageProvider";
export interface CreateImageProviderOptions {
httpClient?: HTTPClient;
}
/**
* Dedicated factory class for instantiating image search provider subclasses.
* Separated from ImageProviderRegistry to break circular dependency with Config.
*/
export class ImageProviderFactory {
/**
* Instantiate and return configured active BaseImageProvider instance by name string.
*
* @param providerName Optional image search provider name string (defaults to Config.getImageProviderName()).
* @param options Optional httpClient override.
* @returns Configured BaseImageProvider subclass instance.
*/
public static createImageProvider(
providerName?: string,
options: CreateImageProviderOptions = {}
): BaseImageProvider {
const targetName = (providerName || Config.getImageProviderName()).toLowerCase().trim();
const httpClient =
options.httpClient ?? new HTTPClient({ timeoutSeconds: Config.getHttpTimeout() });
if (targetName === "bing") {
return new BingImageProvider({ httpClient });
}
if (targetName === "serpapi") {
const keys = Config.getProviderKeys("serpapi");
return new SerpApiImageProvider({
keys,
httpClient,
});
}
if (targetName === "pexels") {
const keys = Config.getProviderKeys("pexels");
return new PexelsImageProvider({
keys,
httpClient,
});
}
// Default to DuckDuckGo (requires no API keys)
return new DuckDuckGoImageProvider({ httpClient });
}
}