{"version":3,"file":"rxap-config.mjs","sources":["../../../../../packages/angular/config/src/lib/config-loader.service.ts","../../../../../packages/angular/config/src/lib/config-testing-service.ts","../../../../../packages/angular/config/src/lib/tokens.ts","../../../../../packages/angular/config/src/lib/utilities.ts","../../../../../packages/angular/config/src/lib/config.service.ts","../../../../../packages/angular/config/src/lib/provide-config.ts","../../../../../packages/angular/config/src/index.ts","../../../../../packages/angular/config/src/rxap-config.ts"],"sourcesContent":["import {\n  Inject,\n  Injectable,\n} from '@angular/core';\nimport {\n  firstValueFrom,\n  Observable,\n} from 'rxjs';\nimport { HttpClient } from '@angular/common/http';\nimport {\n  finalize,\n  share,\n} from 'rxjs/operators';\n\n@Injectable({ providedIn: 'root' })\nexport class ConfigLoaderService {\n  public readonly configs = new Map<string, any>();\n\n  public readonly configLoading = new Map<string, Observable<any>>();\n\n  constructor(\n    @Inject(HttpClient)\n    public readonly http: HttpClient,\n  ) {\n  }\n\n  public async load$<T = any>(url: string): Promise<T> {\n    if (this.configs.has(url)) {\n      return this.configs.get(url);\n    }\n\n    if (this.configLoading.has(url)) {\n      return this.configLoading.get(url)!.toPromise();\n    }\n\n    const loading$ = this.http.get<T>(url).pipe(\n      finalize(() => this.configLoading.delete(url)),\n      share(),\n    );\n\n    this.configLoading.set(url, loading$);\n\n    return firstValueFrom(loading$);\n  }\n}\n","import { Injectable } from '@angular/core';\nimport {\n  getFromObject,\n  SetToObject,\n} from '@rxap/utilities';\nimport { ConfigService } from './config.service';\n\n@Injectable()\nexport class ConfigTestingService implements ConfigService {\n  readonly config: Record<string, any> = {};\n\n  // eslint-disable-next-line @typescript-eslint/no-empty-function\n  clearLocalConfig(): void {\n  }\n\n  set<T>(propertyPath: string, value: T): void {\n    SetToObject(this.config, propertyPath, value);\n  }\n\n  get<T>(propertyPath: string, defaultValue?: T): T | undefined {\n    return getFromObject<T, T>(this.config, propertyPath, defaultValue);\n  }\n\n  getOrThrow<T>(propertyPath: string): T {\n    const value = this.get<T>(propertyPath);\n    if (value === undefined) {\n      throw new Error(`Could not find config in path '${ propertyPath }'`);\n    }\n    return value;\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-empty-function\n  setLocalConfig(config: Record<string, any>): void {\n  }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const RXAP_CONFIG = new InjectionToken('rxap/config');\n","// TODO : move to separate package\n\nimport { log } from '@rxap/rxjs';\nimport { JoinPath } from '@rxap/utilities';\nimport {\n  catchError,\n  EMPTY,\n  firstValueFrom,\n  Observable,\n  race,\n} from 'rxjs';\n\n/**\n * Similar to Promise.race() but only resolves with the first successful promise.\n * It will only reject if all promises reject.\n */\nexport async function raceSuccess<T>(promises: Promise<T>[]): Promise<T> {\n  return new Promise<T>((resolve, reject) => {\n    let rejectionCount = 0;\n\n    promises.forEach((promise) => {\n      promise.then(\n        // On success, resolve the entire raceSuccess promise\n        (value) => resolve(value),\n        // On rejection, count it and check if all promises rejected\n        () => {\n          rejectionCount++;\n          if (rejectionCount === promises.length) {\n            reject(new Error('All promises were rejected'));\n          }\n          // Otherwise continue waiting for other promises\n        }\n      );\n    });\n  });\n}\n\n\nexport async function dnsResolver(endpoint: string, name: string, type: string): Promise<string> {\n  const response = await fetch(`${endpoint}?name=${name}&type=${type}`, {\n    method: 'GET',\n    headers: { 'Accept': 'application/dns-json' },\n  });\n  if (!response.ok) {\n    throw new Error(`Failed to resolve DNS via ${endpoint} (${response.status}): ${response.statusText}`);\n  }\n  const result = await response.json();\n  // Basic validation of the response structure\n  if (!result || !Array.isArray(result.Answer) || result.Answer.length === 0 || !result.Answer[0].data) {\n    throw new Error(`Invalid DNS response structure from ${endpoint} for ${name} ${type}`);\n  }\n  const data = result.Answer[0].data;\n  // Remove surrounding quotes often found in TXT records\n  return data.replace(/^\"(.*)\"$/, '$1');\n}\n\nexport async function dnsLookup(\n  name: string,\n  type: string,\n  dnsServers = [\n    'https://dns.google/resolve',\n    'https://cloudflare-dns.com/dns-query'\n  ]\n): Promise<string> {\n  type = type.toUpperCase();\n  console.log(`Performing DNS lookup for ${type} record of ${name} using servers: ${dnsServers.join(', ')}`);\n  try {\n    // Use Promise.race to get the first successful response\n    return await raceSuccess(dnsServers.map(server => dnsResolver(server, name, type)));\n  } catch (error: any) {\n    console.error(`Failed to resolve DNS TXT record for ${name} using any server: ${error.message}`);\n    throw new Error(`DNS lookup failed for ${name} (${type})`); // Re-throw a more specific error\n  }\n}\n\nexport function fetchContentViaHttp(url: string): Observable<Blob | null> {\n  return new Observable<Blob>((subscriber) => {\n    let controller: AbortController | null = new AbortController(); // For cancellation\n\n    fetch(url)\n      .then(response => {\n        if (!response.ok) {\n          // Don't complete here, let catchError handle it\n          throw new Error(`HTTP error ${response.status} for ${url}: ${response.statusText}`);\n        }\n        return response.blob();\n      })\n      .then(blob => {\n        if (!subscriber.closed) {\n          subscriber.next(blob);\n          subscriber.complete();\n        }\n      })\n      .catch(error => {\n        if (error.name !== 'AbortError' && !subscriber.closed) {\n          console.warn(`Fetch error for ${url}:`, error);\n        }\n      });\n\n    // Cleanup function for when the observable is unsubscribed\n    return () => {\n      controller?.abort();\n      controller = null; // Release reference\n    };\n\n  }).pipe(\n    catchError(error => {\n      // Log the error but return null to signal failure without stopping the race\n      console.error(`Fetch failed for ${url}: ${error.message}`);\n      return EMPTY; // Signal failure with null\n    }),\n  );\n}\n\nexport function fetchCidContentViaHttp(cid: string, path?: string): Observable<Blob | null> {\n  return race(\n    // Attempt 1: w3s.link\n    fetchContentViaHttp(JoinPath(`https://${ cid }.ipfs.w3s.link`, path)).pipe(\n      log(`w3s fetch attempt for ${cid}`),\n    ),\n    // Attempt 2: Local gateway\n    fetchContentViaHttp(JoinPath(`${location.origin}/ipfs/${ cid }`, path)).pipe(\n      log(`local fetch attempt for ${cid}`),\n    )\n    // Add more sources here if needed\n  ).pipe(\n    log(`Race winner for ${cid}`), // Log which source won (will show Blob or null)\n  );\n}\n\nexport async function fetchCidContent(cid: string, path?: string): Promise<Blob | null> {\n  console.log(`Fetching content for CID: ${cid}`);\n  // Example: Fetch from an IPFS gateway or other source\n  // const gatewayUrl = `https://ipfs.io/ipfs/${cid}`;\n  try {\n    return await firstValueFrom(\n      race(\n        fetchCidContentViaHttp(cid, path)\n      ),\n      { defaultValue: null } // Return null if the stream completes empty\n    );\n  } catch (error) {\n    console.error(`Error fetching or parsing content for CID ${cid}:`, error);\n    return null; // Return null on error\n  }\n}\n\nexport async function fetchCidContentAsJson(cid: string, path?: string): Promise<any | null> {\n  console.log(`Fetching JSON content for CID: ${cid}`);\n  const blob = await fetchCidContent(cid, path);\n  if (blob) {\n    try {\n      const text = await blob.text();\n      return JSON.parse(text);\n    } catch (error) {\n      console.error(`Error parsing JSON content for CID ${cid}:`, error);\n      return null; // Return null on error\n    }\n  }\n  console.warn(`No blob available for CID ${cid}, cannot parse as JSON.`);\n  return null; // Return null if blob is not available\n}\n","import {\n  Inject,\n  Injectable,\n  Optional,\n} from '@angular/core';\nimport { Environment } from '@rxap/environment';\nimport {\n  coerceArray,\n  CoercePrefix,\n  deepMerge,\n  SetObjectValue,\n} from '@rxap/utilities';\nimport { ReplaySubject } from 'rxjs';\nimport { RXAP_CONFIG } from './tokens';\nimport { NoInferType } from './types';\nimport {\n  dnsLookup,\n  fetchCidContentAsJson,\n} from './utilities';\n\nexport type AnySchema = { validateAsync: (...args: any[]) => any };\n\nexport interface ConfigLoadOptions {\n  fromUrlParam?: string | boolean;\n  fromLocalStorage?: boolean;\n  schema?: AnySchema;\n  url?: string | string[] | ((environment: Environment) => string | string[]);\n  /**\n   * static config values\n   */\n  static?: Record<string, any>;\n  /**\n   * Load additional configuration based on a CID found in a DNS TXT record.\n   * If true, uses `location.hostname`. If a string, uses that domain.\n   */\n  fromDns?: string | boolean;\n  /**\n   * Load additional configuration directly from the given Content Identifier (CID).\n   * This takes precedence over `fromDns` if both are provided.\n   */\n  fromCid?: string;\n}\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class ConfigService<Config extends Record<string, any> = Record<string, any>> {\n\n  public static onError = new ReplaySubject<unknown>(1);\n  public static onRequestError = new ReplaySubject<Response>(1);\n\n  public static onErrorFnc: Array<(error: any) => void> = [];\n  public static onRequestErrorFnc: Array<(response: Response) => void> = [];\n\n  public static Config: any = null;\n\n  /**\n   * Static default values for the config object.\n   * Will be overwritten by an dynamic config file specified in\n   * the Urls array.\n   */\n  public static Defaults: any = {};\n\n  /**\n   * Any value definition in the Overwrites object will overwrite any\n   * value form the Defaults values or dynamic config files\n   */\n  public static Overwrites: any = {};\n\n  public static LocalStorageKey = 'rxap/config/local-config';\n\n  /**\n   * @deprecated instead use the url property of the ConfigLoadOptions\n   */\n  public static Urls = [];\n  public readonly config!: Config;\n\n  constructor(@Optional() @Inject(RXAP_CONFIG) config: any | null = null) {\n    this.config = ConfigService.Config;\n    if (config) {\n      this.config = deepMerge(this.config ?? {}, config);\n    }\n    if (!this.config) {\n      throw new Error('config not available');\n    }\n  }\n\n  /**\n   * Used to load the app config from a remote resource.\n   *\n   * Promise.all([ ConfigService.Load() ])\n   * .then(() => platformBrowserDynamic().bootstrapModule(AppModule))\n   * .catch(err => console.error(err))\n   *\n   */\n  public static async Load(options?: ConfigLoadOptions, environment?: Environment): Promise<void> {\n    options ??= {};\n\n    let config: any = deepMerge(this.Defaults, {});\n\n    if (environment?.config) {\n      if (typeof environment.config === 'string') {\n        options.url = environment.config;\n      } else {\n        options.static = environment.config.static;\n        options.url    = environment.config.url;\n        options.fromUrlParam = environment.config.fromUrlParam;\n        options.fromLocalStorage = environment.config.fromLocalStorage;\n        options.schema = environment.config.schema;\n      }\n    }\n\n    config = deepMerge(config, options?.static ?? {});\n\n    const urls = (options?.url ? coerceArray(options.url) : ConfigService.Urls).map(url => {\n      if (typeof url === 'function') {\n        if (!environment) {\n          throw new Error('environment is required when url is a function');\n        }\n        return coerceArray(url(environment));\n      }\n      return coerceArray(url);\n    }).flat();\n\n    for (const url of urls) {\n      config = deepMerge(config, await this.loadConfig(url, true, options?.schema));\n    }\n\n    config = deepMerge(config, this.Overwrites);\n\n    if (options?.fromLocalStorage !== false) {\n\n      const localConfig = localStorage.getItem(ConfigService.LocalStorageKey);\n\n      if (localConfig) {\n        try {\n          config = deepMerge(config, JSON.parse(localConfig));\n        } catch (e: any) {\n          console.error('local config could not be parsed');\n        }\n      }\n\n    }\n\n    if (options?.fromUrlParam) {\n      const param = typeof options.fromUrlParam === 'string' ? options.fromUrlParam : 'config';\n      config = deepMerge(config, this.LoadConfigDefaultFromUrlParam(param));\n    }\n\n    if (options?.fromDns) {\n      await this.loadConfigFromDns(options as any);\n    }\n\n    if (options?.fromCid) {\n      config = deepMerge(config, await this.loadConfigFromCid(options as any));\n    }\n\n    console.debug('app config', config);\n\n    this.Config = config;\n  }\n\n  private static async loadConfigFromCid(options: ConfigLoadOptions & { fromCid: string | boolean }) {\n    console.debug('Loading config from CID: ', options.fromCid);\n    try {\n      const cidContent = await fetchCidContentAsJson(options.fromCid);\n      if (cidContent && typeof cidContent === 'object') {\n        console.log(`Merging configuration from CID ${options.fromCid}.`, cidContent);\n        // Merge CID content into the existing config object\n        console.log('Configuration merged successfully.');\n        return cidContent;\n      } else if (cidContent) {\n        console.warn(`Content fetched from CID ${options.fromCid} is not a mergeable object, skipping merge.`);\n      } else {\n        console.warn(`No content fetched or content was null for CID ${options.fromCid}.`);\n      }\n    } catch (error) {\n      console.error(`Failed to fetch or process content for CID ${options.fromCid}:`, error);\n      // Decide how to handle fetch/processing errors\n    }\n  }\n\n  private static async loadConfigFromDns(options: ConfigLoadOptions & { fromDns: string | boolean }) {\n    console.debug('Loading config from DNS');\n    let domain = location.hostname;\n    if (typeof options.fromDns === 'string') {\n      domain = options.fromDns;\n    }\n    domain = CoercePrefix(domain, '_config.');\n    try {\n      console.log(`Attempting DNS lookup for domain: ${domain}`);\n      const txtData = await dnsLookup(domain, 'TXT');\n      console.log(`DNS TXT record data found: ${txtData}`);\n      // Example CID extraction logic (adapt to your TXT record format)\n      // This looks for IPFS CIDs (v0 'Qm...' or v1 'b...') potentially after 'ipfs://' or '/'\n      const cidMatch = txtData.match(/(?:ipfs:\\/\\/|\\/|^)([a-zA-Z0-9]{40,})$/);\n      if (cidMatch && cidMatch[1]) {\n        options.fromCid = cidMatch[1];\n        console.log(`Extracted CID from DNS: ${options.fromCid}`);\n      } else {\n        console.warn(`Could not extract a valid CID format from DNS TXT data: \"${txtData}\"`);\n      }\n    } catch (error) {\n      console.error(`DNS lookup for ${domain} failed:`, error);\n      // Decide if failure is critical or recoverable\n    }\n  }\n\n  private static handleError(error: any) {\n    this.onError.next(error);\n    for (const fnc of this.onErrorFnc) {\n      try {\n        fnc(error);\n      } catch (e: any) {\n        console.error('Error in onErrorFnc', e);\n      }\n    }\n  }\n\n  private static handleRequestError(response: Response) {\n    this.onRequestError.next(response);\n    for (const fnc of this.onRequestErrorFnc) {\n      try {\n        fnc(response);\n      } catch (e: any) {\n        console.error('Error in onRequestErrorFnc', e);\n      }\n    }\n  }\n\n  private static async loadConfig<T = any>(url: string, required?: boolean, schema?: AnySchema): Promise<T | null> {\n\n    let config: any;\n    let response: any;\n\n    try {\n      response = await fetch(url);\n    } catch (error: any) {\n      const message = `Could not fetch config from '${ url }': ${ error.message }`;\n      if (required) {\n        this.handleError(error);\n        this.showError(message);\n        throw new Error(message);\n      } else {\n        console.warn(message);\n        return null;\n      }\n    }\n\n    if (!response.ok) {\n      let message = `Config request results in non ok response for '${ url }': (${ response.status }) ${ response.statusText }`;\n      switch (response.status) {\n        case 404:\n          message = `Config not found at '${ url }'`;\n          break;\n        case 405:\n          message = `Config service is not started yet. Wait 30s and try again.`;\n          break;\n        case 401:\n          message = `Unauthorized to fetch config from '${ url }'`;\n          break;\n      }\n      if (required) {\n        this.handleRequestError(response);\n        this.showError(message);\n        throw new Error(message);\n      } else {\n        console.warn(message);\n        return null;\n      }\n    }\n\n    try {\n      config = await response.json();\n    } catch (error: any) {\n      const message = `Could not parse config from '${ url }' to a json object: ${ error.message }`;\n      if (required) {\n        this.handleError(error);\n        this.showError(message);\n        throw new Error(message);\n      } else {\n        console.warn(message);\n        return null;\n      }\n    }\n\n    if (schema) {\n      try {\n        config = await schema.validateAsync(config);\n      } catch (error: any) {\n        const message = `Config from '${ url }' is not valid: ${ error.message }`;\n        if (required) {\n          this.handleError(error);\n          this.showError(message);\n          throw new Error(message);\n        } else {\n          console.warn(message);\n          return null;\n        }\n      }\n    }\n\n    return config;\n\n  }\n\n  private static LoadConfigDefaultFromUrlParam(param = 'config') {\n\n    const queryString = window.location.search;\n    const urlParams = new URLSearchParams(queryString);\n\n    const configFromParams = {};\n\n    for (const configParam of urlParams.getAll('config')) {\n\n      try {\n        const split = configParam.split(';');\n        if (split.length === 2) {\n          const keyPath = split[0];\n          const value = split[1];\n          SetObjectValue(configFromParams, keyPath, value);\n        }\n      } catch (e: any) {\n        console.warn(`Parsing of url config param failed for '${ configParam }': ${ e.message }`);\n      }\n\n    }\n\n    return configFromParams;\n\n  }\n\n  public static async SideLoad(\n    url: string,\n    propertyPath: string,\n    required?: boolean,\n    schema?: AnySchema,\n  ): Promise<void> {\n\n    if (!this.Config) {\n      throw new Error('Config side load is only possible after the initial config load.');\n    }\n\n    const config = await this.loadConfig(url, required, schema);\n\n    SetObjectValue(this.Config, propertyPath, config);\n\n    console.debug(`Side loaded config for '${ propertyPath }' successful`, this.Config);\n\n  }\n\n  public static Get<T = any, K extends Record<string, any> = Record<string, any>>(\n    path: string,\n    defaultValue: T | undefined,\n    config: Record<string, any>,\n  ): T\n\n  public static Get<T = any, K extends Record<string, any> = Record<string, any>>(\n    path: string,\n    defaultValue: NoInferType<T>,\n    config: Record<string, any> = this.Config,\n  ): T {\n    if (!config) {\n      throw new Error('config not loaded');\n    }\n    let configValue: any = config;\n    if (typeof path !== 'string') {\n      throw new Error('The config property path is not a string');\n    }\n    for (const fragment of path.split('.')) {\n      if (configValue && typeof configValue === 'object' && fragment in configValue) {\n        configValue = configValue[fragment];\n      } else {\n        if (defaultValue !== undefined) {\n          return defaultValue;\n        }\n        console.debug(`Config with path '${ path }' not found`);\n        return undefined as any;\n      }\n    }\n    return configValue;\n  }\n\n  private static showError(message: string) {\n    const hasUl = document.getElementById('rxap-config-error') !== null;\n    const ul = document.getElementById('rxap-config-error') ?? document.createElement('ul');\n    ul.id = 'rxap-config-error';\n    ul.style.position = 'fixed';\n    ul.style.bottom = '16px';\n    ul.style.right = '16px';\n    ul.style.backgroundColor = 'white';\n    ul.style.padding = '32px';\n    ul.style.zIndex = '99999999';\n    ul.style.color = 'black';\n    const messageLi = document.createElement('li');\n    messageLi.innerText = message;\n    ul.appendChild(messageLi);\n    const refreshHintLi = document.createElement('li');\n    refreshHintLi.innerText = 'Please refresh the page to try again.';\n    ul.appendChild(refreshHintLi);\n    const autoRefreshHintLi = document.createElement('li');\n    autoRefreshHintLi.innerText = 'The page will refresh automatically in 30 seconds.';\n    ul.appendChild(autoRefreshHintLi);\n    if (!hasUl) {\n      document.body.appendChild(ul);\n    }\n    setTimeout(() => location.reload(), 30000);\n  }\n\n  public setLocalConfig(config: Config): void {\n    localStorage.setItem(ConfigService.LocalStorageKey, JSON.stringify(config));\n  }\n\n  public clearLocalConfig(): void {\n    localStorage.removeItem(ConfigService.LocalStorageKey);\n  }\n\n  public get<T = any>(propertyPath: string): T | undefined;\n  public get<T = any>(propertyPath: string, defaultValue: NoInferType<T>): T;\n  public get<T = any>(propertyPath: string, defaultValue?: T): T | undefined {\n    return ConfigService.Get(propertyPath, defaultValue, this.config);\n  }\n\n  public getOrThrow<T = any>(propertyPath: string): T;\n  public getOrThrow<T = any>(propertyPath: string, defaultValue: NoInferType<T>): T;\n  public getOrThrow<T = any>(propertyPath: string, defaultValue?: T): T {\n    const value = ConfigService.Get(propertyPath, defaultValue, this.config);\n    if (value === undefined) {\n      throw new Error(`Could not find config in path '${ propertyPath }'`);\n    }\n    return value;\n  }\n\n}\n","import { RXAP_CONFIG } from './tokens';\n\nexport function ProvideConfig(config: Record<string, unknown> = {}) {\n  return {\n    provide: RXAP_CONFIG,\n    useValue: config,\n  };\n}\n","// region \nexport * from './lib/config-loader.service';\nexport * from './lib/config-testing-service';\nexport * from './lib/config.service';\nexport * from './lib/config';\nexport * from './lib/provide-config';\nexport * from './lib/tokens';\nexport * from './lib/types';\nexport * from './lib/utilities';\n// endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}