import { ConfigValidationError, normalizeRewardedAdsConfig } from '../../core/src/config.ts'; import type { RewardedAdsConfig, RewardedAdapter, RewardedAdapterFactory, RewardedAdResult, RewardedAdTargetPlatform, } from '../../core/src/types.ts'; import { createActiveAdapterFactory } from './active-adapter.ts'; import { getGeneratedRewardedAdsConfig } from './registry.ts'; function createConfigInvalidResult(message: string): RewardedAdResult { return { completed: false, cancelled: false, earned: false, error: { code: 'configInvalid', message, }, }; } export class RewardedAdsRuntime { #platform: RewardedAdTargetPlatform; #config: RewardedAdsConfig | null; #adapterFactory: RewardedAdapterFactory | null; #adapter: RewardedAdapter | null = null; #initialized = false; constructor(options: { platform: RewardedAdTargetPlatform; config?: RewardedAdsConfig | null; adapterFactory?: RewardedAdapterFactory | null; }) { this.#platform = options.platform; this.#config = options.config ?? getGeneratedRewardedAdsConfig(); this.#adapterFactory = options.adapterFactory ?? createActiveAdapterFactory(); } async init() { if (this.#initialized) { return; } if (!this.#config) { throw new ConfigValidationError('generated rewarded ads config is unavailable'); } if (!this.#adapterFactory) { throw new ConfigValidationError('generated rewarded adapter factory is unavailable'); } const normalizedConfig = normalizeRewardedAdsConfig({ platform: this.#platform, config: this.#config, }); this.#adapter = this.#adapterFactory({ platform: this.#platform, config: normalizedConfig, }); await this.#adapter.init(); this.#initialized = true; } async preload(placement: string) { if (!this.#adapter || !this.#initialized) { throw new ConfigValidationError('rewarded ads runtime has not been initialized'); } await this.#adapter.preload(placement); } async show(placement: string) { if (!this.#adapter || !this.#initialized) { return createConfigInvalidResult('rewarded ads runtime has not been initialized'); } return await this.#adapter.show(placement); } isReady(placement: string) { if (!this.#adapter || !this.#initialized) { return false; } return this.#adapter.isReady(placement); } getState(placement: string) { if (!this.#adapter || !this.#initialized) { return 'idle'; } return this.#adapter.getState(placement); } reset(placement?: string) { if (!this.#adapter || !this.#initialized) { return; } this.#adapter.reset(placement); } } export function createRewardedAdsRuntime(options: { platform: RewardedAdTargetPlatform; config?: RewardedAdsConfig | null; adapterFactory?: RewardedAdapterFactory | null; }) { return new RewardedAdsRuntime(options); }