{"version":3,"sources":["../package.json","../src/reforge.ts","../src/config.ts","../src/base64Encode.ts","../src/context.ts","../src/exponentialBackoff.ts","../src/logger.ts","../src/periodicSync.ts","../src/evaluationSummaryAggregator.ts","../src/apiHelpers.ts","../src/loader.ts","../src/telemetryUploader.ts","../src/loggerAggregator.ts","../index.ts"],"sourcesContent":["{\n  \"packageManager\": \"yarn@4.11.0\",\n  \"name\": \"@reforge-com/javascript\",\n  \"version\": \"0.0.5\",\n  \"description\": \"Feature Flags & Dynamic Configuration as a Service\",\n  \"main\": \"dist/index.cjs\",\n  \"module\": \"dist/index.mjs\",\n  \"types\": \"dist/index.d.ts\",\n  \"author\": \"Jeffrey Chupp\",\n  \"license\": \"ISC\",\n  \"devDependencies\": {\n    \"@types/eslint-plugin-jsx-a11y\": \"^6\",\n    \"@types/express\": \"^4.17.13\",\n    \"@types/jest\": \"^28.1.6\",\n    \"@types/uuid\": \"^9.0.5\",\n    \"@typescript-eslint/eslint-plugin\": \"^5.33.0\",\n    \"@typescript-eslint/parser\": \"^5.33.0\",\n    \"esbuild\": \"^0.25.11\",\n    \"eslint\": \"^8.21.0\",\n    \"eslint-config-airbnb\": \"^19.0.4\",\n    \"eslint-config-airbnb-typescript\": \"^17.0.0\",\n    \"eslint-config-prettier\": \"^8.8.0\",\n    \"eslint-plugin-import\": \"^2.26.0\",\n    \"eslint-plugin-jest\": \"^26.8.0\",\n    \"eslint-plugin-jsx-a11y\": \"^6.10.2\",\n    \"eslint-plugin-react\": \"^7.37.5\",\n    \"jest\": \"^29.0.0\",\n    \"jest-environment-jsdom\": \"^30.2.0\",\n    \"jest-fetch-mock\": \"^3.0.3\",\n    \"prettier\": \"^3.0.0\",\n    \"ts-jest\": \"^29.1.1\",\n    \"ts-node\": \"^10.9.1\",\n    \"tsup\": \"^8.0.2\",\n    \"typescript\": \"^5.1.6\"\n  },\n  \"scripts\": {\n    \"build\": \"rm -rf dist/ && tsup\",\n    \"dev\": \"tsup --watch\",\n    \"bundle\": \"esbuild --minify --target=esnext --bundle --outfile=dist/reforge.bundle.js --global-name=window.reforgeNamespace dist/index.cjs && echo 'window.reforge = window.reforgeNamespace.reforge' >> dist/reforge.bundle.js\",\n    \"lint\": \"eslint --ext .ts,.tsx src/\",\n    \"lint:fix\": \"eslint --fix --ext .ts,.tsx src/\",\n    \"prettier\": \"prettier . -l\",\n    \"prettier:fix\": \"prettier --write .\",\n    \"test\": \"jest --verbose\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/ReforgeHQ/sdk-javascript.git\"\n  },\n  \"keywords\": [\n    \"feature-flags\",\n    \"config\"\n  ],\n  \"bugs\": {\n    \"url\": \"https://github.com/ReforgeHQ/sdk-javascript/issues\"\n  },\n  \"homepage\": \"https://github.com/ReforgeHQ/sdk-javascript#readme\",\n  \"dependencies\": {\n    \"uuid\": \"^9.0.1\"\n  },\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.mjs\",\n      \"require\": \"./dist/index.cjs\"\n    }\n  }\n}\n","/* eslint-disable max-classes-per-file */\nimport { v4 as uuid } from \"uuid\";\n\nimport { Config, EvaluationPayload, RawConfigWithoutTypes } from \"./config\";\nimport type {\n  Duration,\n  TypedFrontEndConfigurationRaw,\n  FrontEndConfigurationRaw,\n  Contexts,\n} from \"./types\";\nimport Context from \"./context\";\nimport { EvaluationSummaryAggregator } from \"./evaluationSummaryAggregator\";\nimport Loader, { CollectContextModeType } from \"./loader\";\nimport {\n  PREFIX as loggerPrefix,\n  shouldLog,\n  ShouldLogParams,\n  LogLevel,\n  shouldLogAtLevel,\n} from \"./logger\";\nimport TelemetryUploader from \"./telemetryUploader\";\nimport { LoggerAggregator } from \"./loggerAggregator\";\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { version } = require(\"../package.json\");\n\ntype EvaluationCallback = <K extends keyof TypedFrontEndConfigurationRaw>(\n  key: K,\n  value: TypedFrontEndConfigurationRaw[K],\n  context: Context | undefined\n) => void;\n\nexport interface ReforgeBootstrap {\n  evaluations: EvaluationPayload;\n  context: Contexts;\n}\n\nexport type ReforgeInitParams = {\n  sdkKey: string;\n  context: Context;\n  endpoints?: string[] | undefined;\n  apiEndpoint?: string;\n  timeout?: number;\n  afterEvaluationCallback?: EvaluationCallback;\n  collectEvaluationSummaries?: boolean;\n  collectLoggerNames?: boolean;\n  collectContextMode?: CollectContextModeType;\n  clientNameString?: string;\n  clientVersionString?: string;\n  loggerKey?: string;\n};\n\ntype PollStatus =\n  | { status: \"not-started\" }\n  | { status: \"pending\" }\n  | { status: \"stopped\" }\n  | { status: \"running\"; frequencyInMs: number };\n\ntype PublicShouldLogParams = Omit<ShouldLogParams, \"get\">;\n\n// Forward declaration for ReforgeLogger\n// eslint-disable-next-line @typescript-eslint/no-use-before-define\nclass ReforgeLogger {\n  // eslint-disable-next-line no-use-before-define\n  private reforge: Reforge;\n\n  // eslint-disable-next-line no-use-before-define\n  constructor(reforge: Reforge) {\n    this.reforge = reforge;\n  }\n\n  private log(message: string, level: LogLevel): void {\n    const configuredLevel = this.reforge.getLogLevel(\"\");\n\n    if (shouldLogAtLevel(configuredLevel, level)) {\n      switch (level) {\n        case LogLevel.TRACE:\n        case LogLevel.DEBUG:\n          // eslint-disable-next-line no-console\n          console.debug(message);\n          break;\n        case LogLevel.INFO:\n          // eslint-disable-next-line no-console\n          console.info(message);\n          break;\n        case LogLevel.WARN:\n          // eslint-disable-next-line no-console\n          console.warn(message);\n          break;\n        case LogLevel.ERROR:\n        case LogLevel.FATAL:\n          // eslint-disable-next-line no-console\n          console.error(message);\n          break;\n        default:\n          // eslint-disable-next-line no-console\n          console.error(message);\n      }\n    }\n  }\n\n  trace(message: string): void {\n    this.log(message, LogLevel.TRACE);\n  }\n\n  debug(message: string): void {\n    this.log(message, LogLevel.DEBUG);\n  }\n\n  info(message: string): void {\n    this.log(message, LogLevel.INFO);\n  }\n\n  warn(message: string): void {\n    this.log(message, LogLevel.WARN);\n  }\n\n  error(message: string): void {\n    this.log(message, LogLevel.ERROR);\n  }\n\n  fatal(message: string): void {\n    this.log(message, LogLevel.FATAL);\n  }\n}\n\nexport class Reforge {\n  private _configs: { [key: string]: Config } = {};\n\n  private _telemetryUploader: TelemetryUploader | undefined;\n\n  private _pollCount = 0;\n\n  private _pollStatus: PollStatus = { status: \"not-started\" };\n\n  private _pollTimeoutId = undefined as ReturnType<typeof setTimeout> | undefined;\n\n  private _instanceHash: string = uuid();\n\n  private collectEvaluationSummaries = true;\n\n  private collectLoggerNames = false;\n\n  private evalutionSummaryAggregator: EvaluationSummaryAggregator | undefined;\n\n  private loggerAggregator: LoggerAggregator | undefined;\n\n  public clientNameString = \"sdk-javascript\";\n\n  public loaded = false;\n\n  public loader: Loader | undefined;\n\n  public afterEvaluationCallback = (() => {}) as EvaluationCallback;\n\n  private _context: Context = new Context({});\n\n  private _loggerKey = \"log-levels.default\";\n\n  public logger: ReforgeLogger;\n\n  constructor() {\n    this.logger = new ReforgeLogger(this);\n  }\n\n  async init({\n    sdkKey,\n    context: providedContext,\n    endpoints = undefined,\n    apiEndpoint,\n    timeout = undefined,\n    afterEvaluationCallback = () => {},\n    collectEvaluationSummaries = true,\n    collectLoggerNames = false,\n    collectContextMode = \"PERIODIC_EXAMPLE\",\n    clientNameString = \"sdk-javascript\",\n    clientVersionString = version,\n    loggerKey = \"log-levels.default\",\n  }: ReforgeInitParams) {\n    const context = providedContext ?? this.context;\n\n    if (!context) {\n      throw new Error(\"Context must be provided\");\n    }\n\n    this._context = context;\n    this._loggerKey = loggerKey;\n\n    this.clientNameString = clientNameString;\n    const clientNameAndVersionString = `${clientNameString}-${clientVersionString}`;\n\n    this.loader = new Loader({\n      sdkKey,\n      context,\n      endpoints,\n      timeout,\n      collectContextMode,\n      clientVersion: clientNameAndVersionString,\n    });\n\n    this._telemetryUploader = new TelemetryUploader({\n      sdkKey,\n      apiEndpoint,\n      timeout,\n      clientVersion: clientNameAndVersionString,\n    });\n\n    this.collectEvaluationSummaries = collectEvaluationSummaries;\n    if (collectEvaluationSummaries) {\n      this.evalutionSummaryAggregator = new EvaluationSummaryAggregator(this, 100000);\n    }\n\n    this.collectLoggerNames = collectLoggerNames;\n    if (collectLoggerNames) {\n      this.loggerAggregator = new LoggerAggregator(this, 100000);\n    }\n\n    if (\n      (collectEvaluationSummaries || collectLoggerNames) &&\n      typeof window !== \"undefined\" &&\n      typeof window.addEventListener === \"function\"\n    ) {\n      window.addEventListener(\"beforeunload\", () => {\n        this.evalutionSummaryAggregator?.sync();\n        this.loggerAggregator?.sync();\n      });\n    }\n\n    this.afterEvaluationCallback = afterEvaluationCallback;\n\n    return this.load();\n  }\n\n  public extract(): Record<string, Config[\"value\"]> {\n    return Object.entries(this._configs).reduce(\n      (agg, [key, value]) => ({\n        ...agg,\n        [key]: value.value,\n      }),\n      {} as Record<string, Config[\"value\"]>\n    );\n  }\n\n  public hydrate(rawValues: RawConfigWithoutTypes | EvaluationPayload): void {\n    this.setConfigPrivate(rawValues);\n  }\n\n  get context(): Context {\n    return this._context;\n  }\n\n  get instanceHash(): string {\n    return this._instanceHash;\n  }\n\n  get pollTimeoutId() {\n    return this._pollTimeoutId;\n  }\n\n  get pollCount() {\n    return this._pollCount;\n  }\n\n  get pollStatus() {\n    return this._pollStatus;\n  }\n\n  get telemetryUploader(): TelemetryUploader | undefined {\n    return this._telemetryUploader;\n  }\n\n  private async load() {\n    if (!this.loader || !this.context) {\n      throw new Error(\"Reforge not initialized. Call init() first.\");\n    }\n\n    /* eslint-disable no-underscore-dangle */\n    if (globalThis && (globalThis as any)._reforgeBootstrap) {\n      /* eslint-disable no-underscore-dangle */\n      const reforgeBootstrap = (globalThis as any)._reforgeBootstrap as ReforgeBootstrap;\n      const bootstrapContext = new Context(reforgeBootstrap.context);\n\n      if (this.context.equals(bootstrapContext)) {\n        this.setConfigPrivate({ evaluations: reforgeBootstrap.evaluations });\n        return Promise.resolve();\n      }\n    }\n\n    // make sure we have the freshest context\n    this.loader.context = this.context;\n\n    return this.loader\n      .load()\n      .then((rawValues: any) => {\n        this.setConfigPrivate(rawValues as EvaluationPayload);\n      })\n      .finally(() => {\n        if (this.pollStatus.status === \"running\") {\n          this._pollCount += 1;\n        }\n      });\n  }\n\n  async updateContext(context: Context, skipLoad = false) {\n    if (!this.loader) {\n      throw new Error(\"Reforge not initialized. Call init() first.\");\n    }\n\n    this._context = context;\n\n    if (skipLoad) {\n      return Promise.resolve();\n    }\n\n    return this.load();\n  }\n\n  async poll({ frequencyInMs }: { frequencyInMs: number }) {\n    if (!this.loader) {\n      throw new Error(\"Reforge not initialized. Call init() first.\");\n    }\n\n    this.stopPolling();\n\n    this._pollStatus = { status: \"pending\" };\n\n    return this.loader.load().finally(() => {\n      this.doPolling({ frequencyInMs });\n    });\n  }\n\n  private doPolling({ frequencyInMs }: { frequencyInMs: number }) {\n    this._pollTimeoutId = setTimeout(() => {\n      this.load().finally(() => {\n        if (this.pollStatus.status === \"running\") {\n          this.doPolling({ frequencyInMs });\n        }\n      });\n    }, frequencyInMs);\n\n    this._pollStatus = {\n      status: \"running\",\n      frequencyInMs,\n    };\n  }\n\n  stopPolling() {\n    if (this.pollTimeoutId) {\n      clearTimeout(this.pollTimeoutId);\n      this._pollTimeoutId = undefined;\n    }\n\n    this._pollStatus = { status: \"stopped\" };\n  }\n\n  stopTelemetry() {\n    if (this.telemetryUploader) {\n      this.evalutionSummaryAggregator?.stop();\n      this.loggerAggregator?.stop();\n    }\n  }\n\n  private setConfigPrivate(rawValues: RawConfigWithoutTypes | EvaluationPayload) {\n    this._configs = Config.digest(rawValues);\n    this.loaded = true;\n  }\n\n  isEnabled<\n    // We need to calcuate these live and not store in a type to ensure dynamic evaluation\n    // in upstream libraries that override the FrontEndConfigurationRaw interface\n    K extends keyof FrontEndConfigurationRaw extends never\n      ? string\n      : {\n          [IK in keyof TypedFrontEndConfigurationRaw]: TypedFrontEndConfigurationRaw[IK] extends boolean\n            ? IK\n            : never;\n        }[keyof TypedFrontEndConfigurationRaw],\n  >(key: K): boolean {\n    return this.get(key) === true;\n  }\n\n  get<K extends keyof TypedFrontEndConfigurationRaw>(key: K): TypedFrontEndConfigurationRaw[K] {\n    if (!this.loaded) {\n      if (!key.startsWith(loggerPrefix)) {\n        // eslint-disable-next-line no-console\n        console.warn(\n          `Reforge warning: The client has not finished loading data yet. Unable to look up actual value for key \"${key}\".`\n        );\n      }\n\n      return undefined;\n    }\n\n    const config = this._configs[key];\n\n    const value = config?.value;\n\n    if (!key.startsWith(loggerPrefix)) {\n      if (this.collectEvaluationSummaries) {\n        setTimeout(() => this.evalutionSummaryAggregator?.record(config));\n      }\n\n      setTimeout(() => this.afterEvaluationCallback(key, value, this.context));\n    }\n\n    return value;\n  }\n\n  getDuration<\n    // We need to calcuate these live and not store in a type to ensure dynamic evaluation\n    // in upstream libraries that override the FrontEndConfigurationRaw interface\n    K extends keyof FrontEndConfigurationRaw extends never\n      ? string\n      : {\n          [IK in keyof TypedFrontEndConfigurationRaw]: TypedFrontEndConfigurationRaw[IK] extends Duration\n            ? IK\n            : never;\n        }[keyof TypedFrontEndConfigurationRaw],\n  >(key: K): Duration | undefined {\n    const value = this.get(key);\n\n    if (!value) {\n      return undefined;\n    }\n\n    if (\n      !Object.prototype.hasOwnProperty.call(value, \"seconds\") ||\n      !Object.prototype.hasOwnProperty.call(value, \"ms\")\n    ) {\n      throw new Error(`Value for key \"${key}\" is not a duration`);\n    }\n\n    return value as Duration;\n  }\n\n  shouldLog(args: PublicShouldLogParams, async = true): boolean {\n    if (this.collectLoggerNames) {\n      const record = () => this.loggerAggregator?.record(args.loggerName, args.desiredLevel);\n      if (async) {\n        setTimeout(record);\n      } else {\n        record();\n      }\n    }\n\n    return shouldLog({ ...args, get: this.get.bind(this) });\n  }\n\n  getLogLevel(_loggerName: string): LogLevel {\n    const value = this.get(this._loggerKey);\n\n    if (value && typeof value === \"string\") {\n      const upperValue = value.toUpperCase();\n      if (upperValue in LogLevel) {\n        return LogLevel[upperValue as keyof typeof LogLevel];\n      }\n    }\n\n    // Default to DEBUG if no config found or invalid value\n    return LogLevel.DEBUG;\n  }\n\n  isCollectingEvaluationSummaries(): boolean {\n    return this.collectEvaluationSummaries;\n  }\n\n  isCollectingLoggerNames(): boolean {\n    return this.collectLoggerNames;\n  }\n}\n\nexport const reforge = new Reforge();\n\nexport function prefetchReforgeConfig({\n  sdkKey,\n  context,\n  endpoints = undefined,\n  timeout = undefined,\n  collectContextMode = \"PERIODIC_EXAMPLE\",\n  clientNameString = \"sdk-javascript\",\n  clientVersionString = version,\n}: ReforgeInitParams) {\n  const clientNameAndVersionString = `${clientNameString}-${clientVersionString}`;\n\n  const loader = new Loader({\n    sdkKey,\n    context,\n    endpoints,\n    timeout,\n    collectContextMode,\n    clientVersion: clientNameAndVersionString,\n  });\n\n  (window as any).REFORGE_SDK_PREFETCH_PROMISE = loader.load();\n}\n\nexport default prefetchReforgeConfig;\n","import { ReforgeLogLevel } from \"./logger\";\nimport { TypedFrontEndConfigurationRaw, ConfigEvaluationMetadata } from \"./types\";\n\nexport type RawConfigWithoutTypes = Record<string, any>;\n\ntype APIKeyMetadata = {\n  id: string | number;\n};\n\n// TODO: Why is this definition different from the one in ./types.ts?\ntype Duration = {\n  definition: string;\n  millis: number;\n};\n\nexport interface IntRange {\n  /** if empty treat as Number.MIN_VALUE. Inclusive */\n  start?: bigint | undefined;\n  /** if empty treat as Number.MAX_VALUE. Exclusive */\n  end?: bigint | undefined;\n}\n\nexport enum ProvidedSource {\n  EnvVar = \"ENV_VAR\",\n}\nexport interface Provided {\n  source?: ProvidedSource | undefined;\n  /** eg MY_ENV_VAR */\n  lookup?: string | undefined;\n}\n\nexport enum SchemaType {\n  UNKNOWN = 0,\n  ZOD = 1,\n  JSON_SCHEMA = 2,\n}\n\nexport interface Schema {\n  schema: string;\n  schemaType: SchemaType;\n}\n\nexport interface WeightedValue {\n  /** out of 1000 */\n  weight: number;\n  // eslint-disable-next-line no-use-before-define\n  value: ConfigValue | undefined;\n}\n\nexport enum LimitResponse_LimitPolicyNames {\n  SecondlyRolling = 1,\n  MinutelyRolling = 3,\n  HourlyRolling = 5,\n  DailyRolling = 7,\n  MonthlyRolling = 8,\n  Infinite = 9,\n  YearlyRolling = 10,\n}\n\nexport enum LimitDefinition_SafetyLevel {\n  L4_BEST_EFFORT = 4,\n  L5_BOMBPROOF = 5,\n}\n\nexport interface LimitDefinition {\n  policyName: LimitResponse_LimitPolicyNames;\n  limit: number;\n  burst: number;\n  accountId: number;\n  lastModified: number;\n  returnable: boolean;\n  /** [default = L4_BEST_EFFORT]; // Overridable by request */\n  safetyLevel: LimitDefinition_SafetyLevel;\n}\nexport interface WeightedValues {\n  weightedValues: WeightedValue[];\n  hashByPropertyName?: string | undefined;\n}\n\nexport type ConfigValue =\n  | {\n      int: number | undefined;\n    }\n  | {\n      string: string | undefined;\n    }\n  | {\n      bytes: Buffer | undefined;\n    }\n  | {\n      double: number | undefined;\n    }\n  | {\n      bool: boolean | undefined;\n    }\n  | {\n      weightedValues?: WeightedValues | undefined;\n    }\n  | {\n      limitDefinition?: LimitDefinition | undefined;\n    }\n  | {\n      logLevel: ReforgeLogLevel | undefined;\n    }\n  | {\n      stringList: string[] | undefined;\n    }\n  | {\n      intRange: IntRange | undefined;\n    }\n  | {\n      provided: Provided | undefined;\n    }\n  | {\n      duration: Duration | undefined;\n    }\n  | {\n      json: string | undefined;\n    }\n  | {\n      schema: Schema | undefined;\n    }\n  | {\n      /** don't log or telemetry this value */\n      confidential: boolean | undefined;\n    }\n  | {\n      /** key name to decrypt with */\n      decryptWith: string | undefined;\n    };\n\ntype Evaluation = {\n  value: ConfigValue;\n  configEvaluationMetadata: {\n    configRowIndex: string | number;\n    conditionalValueIndex: string | number;\n    weightedValueIndex?: string | number;\n    type: string;\n    valueType: string;\n    id: string;\n  };\n};\n\nexport type EvaluationPayload = {\n  evaluations: { [key: string]: Evaluation };\n  apikeyMetadata: APIKeyMetadata;\n};\n\nconst parseRawMetadata = (metadata: any) => ({\n  configRowIndex: parseInt(metadata.configRowIndex, 10),\n  conditionalValueIndex: parseInt(metadata.conditionalValueIndex, 10),\n  type: metadata.type,\n  configId: metadata.id,\n});\n\nconst valueFor = <K extends keyof TypedFrontEndConfigurationRaw>(\n  value: ConfigValue,\n  type: keyof ConfigValue,\n  key: K\n): TypedFrontEndConfigurationRaw[K] => {\n  const rawValue = value[type];\n\n  switch (type) {\n    case \"json\":\n      try {\n        return JSON.parse(rawValue as string);\n      } catch (e) {\n        // eslint-disable-next-line no-console\n        console.error(`Error parsing JSON from Reforge config ${key}`, e, rawValue);\n        return value[type];\n      }\n    case \"duration\": {\n      const duration = rawValue as Duration;\n      return {\n        ms: duration.millis,\n        seconds: duration.millis / 1000,\n      };\n    }\n    default:\n      return rawValue;\n  }\n};\n\nexport const parseEvaluationPayload = (payload: EvaluationPayload) => {\n  // eslint-disable-next-line no-use-before-define\n  const configs = {} as { [key: string]: Config };\n  Object.keys(payload.evaluations).forEach((key) => {\n    const evaluation = payload.evaluations[key];\n\n    const type = Object.keys(evaluation.value)[0] as keyof ConfigValue;\n\n    // eslint-disable-next-line no-use-before-define\n    configs[key] = new Config(\n      key,\n      valueFor(evaluation.value, type, key),\n      type,\n      evaluation.value,\n      evaluation.configEvaluationMetadata\n        ? parseRawMetadata(evaluation.configEvaluationMetadata)\n        : undefined\n    );\n  });\n\n  return configs;\n};\n\nconst parseRawConfigWithoutTypes = (payload: RawConfigWithoutTypes) => {\n  // eslint-disable-next-line no-use-before-define\n  const configs = {} as { [key: string]: Config };\n  Object.keys(payload).forEach((key) => {\n    const type = typeof payload[key] as keyof ConfigValue;\n    // eslint-disable-next-line no-use-before-define\n    configs[key] = new Config(key, valueFor({ [type]: payload[key] }, type, key), type);\n  });\n\n  return configs;\n};\n\nexport class Config<\n  K extends keyof TypedFrontEndConfigurationRaw = keyof TypedFrontEndConfigurationRaw,\n> {\n  key: K;\n\n  value: TypedFrontEndConfigurationRaw[K];\n\n  rawValue: ConfigValue | undefined;\n\n  type: keyof ConfigValue;\n\n  configEvaluationMetadata: ConfigEvaluationMetadata | undefined;\n\n  constructor(\n    key: K,\n    value: TypedFrontEndConfigurationRaw[K],\n    type: keyof ConfigValue,\n    rawValue?: ConfigValue,\n    metadata?: ConfigEvaluationMetadata\n  ) {\n    this.key = key;\n    this.value = value;\n    this.type = type;\n    this.rawValue = rawValue;\n    this.configEvaluationMetadata = metadata;\n  }\n\n  static digest(payload: EvaluationPayload | RawConfigWithoutTypes) {\n    if (payload === undefined) {\n      // eslint-disable-next-line no-console\n      console.trace(\"Config.digest called with undefined payload\");\n    }\n\n    if (\"evaluations\" in payload) {\n      return parseEvaluationPayload(payload as EvaluationPayload);\n    }\n\n    return parseRawConfigWithoutTypes(payload as RawConfigWithoutTypes);\n  }\n}\n","const base64Encode = (obj: string) => {\n  if (typeof window !== \"undefined\") {\n    if (typeof TextEncoder === \"undefined\") {\n      return window.btoa(obj);\n    }\n\n    const bytes = new TextEncoder().encode(obj);\n    const binString = Array.from(bytes, (byte) => String.fromCodePoint(byte)).join(\"\");\n    return btoa(binString);\n  }\n\n  return Buffer.from(obj).toString(\"base64\");\n};\n\nexport default base64Encode;\n","import { Contexts, ContextValue } from \"./types\";\nimport base64Encode from \"./base64Encode\";\n\nconst isEqual = (a: Contexts, b: Contexts) => {\n  const aKeys = Object.keys(a);\n  const bKeys = Object.keys(b);\n\n  if (aKeys.length !== bKeys.length) {\n    return false;\n  }\n\n  return aKeys.every((key) => {\n    const aValues = a[key];\n    const bValues = b[key];\n\n    const aValuesKeys = Object.keys(aValues);\n    const bValuesKeys = Object.keys(bValues);\n\n    if (aValuesKeys.length !== bValuesKeys.length) {\n      return false;\n    }\n\n    return aValuesKeys.every((ckey) => {\n      const aValue = aValues[ckey];\n      const bValue = bValues[ckey];\n\n      return aValue === bValue;\n    });\n  });\n};\n\nconst getType = (value: ContextValue) => {\n  if (typeof value === \"string\") {\n    return \"string\";\n  }\n\n  if (typeof value === \"number\") {\n    if (Number.isInteger(value)) {\n      return \"int\";\n    }\n\n    return \"double\";\n  }\n\n  return \"bool\";\n};\n\nexport default class Context {\n  contexts: Contexts;\n\n  constructor(contexts: Contexts) {\n    if (!Object.values(contexts).every((item: any) => typeof item === \"object\")) {\n      // eslint-disable-next-line no-console\n      console.error(\"Context must be an object where the value of each key is also an object\");\n    }\n\n    if (\n      Object.values(contexts).some((item: any) =>\n        Object.values(item).some((value: any) => typeof value === \"object\" && value !== null)\n      )\n    ) {\n      // we decided to allow null values, which requres an extra check since typeof null is object\n      // eslint-disable-next-line no-console\n      console.error(\"Nested objects are not supported in context values at this time\");\n    }\n\n    this.contexts = contexts;\n  }\n\n  equals(other: Context) {\n    return isEqual(this.contexts, other.contexts);\n  }\n\n  encode() {\n    const formatted = Object.keys(this.contexts).map((key) => {\n      const values: Record<string, Record<string, ContextValue>> = {};\n\n      Object.keys(this.contexts[key]).forEach((ckey) => {\n        values[ckey] = {\n          [getType(this.contexts[key][ckey])]: this.contexts[key][ckey],\n        };\n      });\n\n      return {\n        type: key,\n        values,\n      };\n    });\n\n    return encodeURIComponent(base64Encode(JSON.stringify({ contexts: formatted })));\n  }\n}\n","export class ExponentialBackoff {\n  private maxDelay: number;\n\n  private multiplier: number;\n\n  private delay: number;\n\n  // arguments are in seconds\n  constructor(maxDelay: number, initialDelay = 2, multiplier = 2) {\n    this.maxDelay = maxDelay;\n    this.multiplier = multiplier;\n    this.delay = initialDelay;\n  }\n\n  call(): number {\n    const delayValue = this.delay;\n    this.delay = Math.min(this.delay * this.multiplier, this.maxDelay);\n    return delayValue * 1000;\n  }\n}\n","import { TypedFrontEndConfigurationRaw } from \"./types\";\n\nexport const PREFIX = \"log-level\";\nexport enum ReforgeLogLevel {\n  Trace = 1,\n  Debug = 2,\n  Info = 3,\n  Warn = 4,\n  Error = 5,\n  Fatal = 6,\n}\n\nexport type LogLevelWord = Uppercase<keyof typeof ReforgeLogLevel>;\n\nconst WORD_LEVEL_LOOKUP: Readonly<Record<LogLevelWord, ReforgeLogLevel>> = {\n  TRACE: ReforgeLogLevel.Trace,\n  DEBUG: ReforgeLogLevel.Debug,\n  INFO: ReforgeLogLevel.Info,\n  WARN: ReforgeLogLevel.Warn,\n  ERROR: ReforgeLogLevel.Error,\n  FATAL: ReforgeLogLevel.Fatal,\n};\n\nexport const isValidLogLevel = (possibleLogLevel: string) =>\n  Object.keys(WORD_LEVEL_LOOKUP).includes(possibleLogLevel.toUpperCase());\n\nexport interface ShouldLogParams {\n  loggerName: string;\n  desiredLevel: ReforgeLogLevel;\n  defaultLevel: ReforgeLogLevel;\n  get: <K extends keyof TypedFrontEndConfigurationRaw>(key: K) => TypedFrontEndConfigurationRaw[K];\n}\n\n// LogLevel enum for public API\nexport enum LogLevel {\n  TRACE = \"TRACE\",\n  DEBUG = \"DEBUG\",\n  INFO = \"INFO\",\n  WARN = \"WARN\",\n  ERROR = \"ERROR\",\n  FATAL = \"FATAL\",\n}\n\n// Get the numeric severity value for a LogLevel (lower = more verbose)\nexport const getLogLevelSeverity = (level: LogLevel): number => WORD_LEVEL_LOOKUP[level];\n\n// Check if a log at desiredLevel should be logged given the configured level\n// Returns true if desiredLevel is at or above the configured level's severity\nexport const shouldLogAtLevel = (configuredLevel: LogLevel, desiredLevel: LogLevel): boolean =>\n  WORD_LEVEL_LOOKUP[configuredLevel] <= WORD_LEVEL_LOOKUP[desiredLevel];\n\nexport const shouldLog = ({\n  loggerName,\n  desiredLevel,\n  defaultLevel,\n  get,\n}: ShouldLogParams): boolean => {\n  const loggerNameWithPrefix = `${PREFIX}.${loggerName}`;\n\n  const resolvedLevel = get(loggerNameWithPrefix);\n\n  if (resolvedLevel) {\n    return (\n      WORD_LEVEL_LOOKUP[resolvedLevel.toString().toUpperCase() as LogLevelWord] <= desiredLevel\n    );\n  }\n\n  return defaultLevel <= desiredLevel;\n};\n","import { ExponentialBackoff } from \"./exponentialBackoff\";\nimport { ReforgeLogLevel } from \"./logger\";\nimport { type reforge } from \"./reforge\";\n\nabstract class PeriodicSync<T> {\n  protected data: Map<string, T> = new Map();\n\n  private startAt: Date;\n\n  private syncInterval: any;\n\n  protected client: typeof reforge;\n\n  private name: string;\n\n  private timeoutID: ReturnType<typeof setTimeout> | undefined;\n\n  constructor(client: typeof reforge, name: string, syncInterval?: number) {\n    this.client = client;\n    this.name = name;\n\n    this.startAt = new Date();\n\n    this.startPeriodicSync(syncInterval);\n  }\n\n  stop(): void {\n    clearTimeout(this.timeoutID);\n  }\n\n  sync(): void {\n    if (this.data.size === 0) return;\n\n    this.logInternal(`${this.name} syncing ${this.data.size} items`);\n\n    const startAtWas = this.startAt;\n    this.startAt = new Date();\n\n    this.flush(this.prepareData(), startAtWas);\n  }\n\n  protected abstract flush(toShip: Map<string, T>, startAtWas: Date): void;\n\n  private prepareData(): Map<string, T> {\n    const toShip = new Map(this.data);\n    this.data.clear();\n\n    return toShip;\n  }\n\n  private startPeriodicSync(syncInterval?: number): void {\n    this.startAt = new Date();\n    this.syncInterval = PeriodicSync.calculateSyncInterval(syncInterval);\n\n    this.scheduleNextSync();\n  }\n\n  private scheduleNextSync() {\n    const interval = this.syncInterval();\n    this.timeoutID = setTimeout(() => {\n      this.sync();\n      this.scheduleNextSync(); // Schedule the next sync after the current one completes\n    }, interval);\n  }\n\n  private static calculateSyncInterval(syncInterval?: number): any {\n    if (syncInterval !== undefined) {\n      return () => syncInterval;\n    }\n\n    const backoff = new ExponentialBackoff(60 * 5, 8);\n    return () => backoff.call();\n  }\n\n  protected logInternal(message: string): void {\n    const loggerName = `${this.client.clientNameString}.reforge.${this.name}`;\n\n    if (\n      this.client.shouldLog(\n        {\n          loggerName,\n          desiredLevel: ReforgeLogLevel.Debug,\n          defaultLevel: ReforgeLogLevel.Error,\n        },\n        false // synchronous so that this log ends up in the current batch\n      )\n    ) {\n      // eslint-disable-next-line no-console\n      console.log(`${loggerName}: ${message}`);\n    }\n  }\n}\n\nexport { PeriodicSync };\n","// TODO: should we retry the data chunk if a flush fails?\n\n// TODO: pause when offline?\n\n// TODO: flush when we receive a config update (or as a result of a context update...but that should trigger a config update anyway)\n\nimport { PeriodicSync } from \"./periodicSync\";\nimport { Config } from \"./config\";\nimport { type reforge } from \"./reforge\";\nimport {\n  ConfigEvaluationCounter,\n  ConfigEvaluationSummaries,\n  ConfigEvaluationSummary,\n  TelemetryEvents,\n  ConfigEvaluationMetadata,\n} from \"./types\";\n\nexport const massageSelectedValue = (config: Config): any => {\n  if (config.rawValue && (config.type === \"duration\" || config.type === \"json\")) {\n    if (config.type === \"json\") {\n      return { json: config.rawValue[config.type] };\n    }\n\n    return config.rawValue[config.type];\n  }\n\n  return config.type === \"stringList\" ? { values: config.value } : config.value;\n};\n\nexport const massageConfigForTelemetry = (\n  config: Config,\n  metadata: Omit<ConfigEvaluationMetadata, \"type\">\n) => ({\n  ...metadata,\n  selectedValue: {\n    [config.type]: massageSelectedValue(config),\n  },\n  count: 0,\n});\n\nclass EvaluationSummaryAggregator extends PeriodicSync<ConfigEvaluationCounter> {\n  private maxKeys: number;\n\n  constructor(client: typeof reforge, maxKeys: number, syncInterval?: number) {\n    super(client, \"EvaluationSummaryAggregator\", syncInterval ?? 30000);\n\n    this.maxKeys = maxKeys;\n  }\n\n  record(config: Config): void {\n    if (this.data.size >= this.maxKeys) return;\n\n    if (config?.configEvaluationMetadata) {\n      const { type, ...metadata } = config.configEvaluationMetadata;\n      const key = `${config.key},${type}`;\n\n      // create counter entry if it doesn't exist\n      if (!this.data.has(key)) {\n        this.data.set(key, massageConfigForTelemetry(config, metadata));\n      }\n\n      // increment count\n      const counter = this.data.get(key);\n      if (counter) {\n        counter.count += 1;\n      }\n    }\n  }\n\n  protected flush(toShip: Map<string, ConfigEvaluationCounter>, startAtWas: Date): void {\n    const summaries = {\n      start: startAtWas.getTime(),\n      end: new Date().getTime(),\n      summaries: EvaluationSummaryAggregator.summaries(toShip),\n    };\n\n    this.client.telemetryUploader?.post(this.events(summaries));\n  }\n\n  private static summaries(data: Map<string, ConfigEvaluationCounter>): ConfigEvaluationSummary[] {\n    return Array.from(data).map((entry: [string, ConfigEvaluationCounter]) => {\n      const [configKey, configType] = entry[0].split(\",\");\n      const counter = entry[1];\n      const counters = [counter]; // this client only ever has one set of counter info per key\n\n      return {\n        key: configKey,\n        type: configType,\n        counters,\n      };\n    });\n  }\n\n  private events(summaries: ConfigEvaluationSummaries): TelemetryEvents {\n    const event = { summaries };\n\n    return {\n      instanceHash: this.client.instanceHash,\n      events: [event],\n    };\n  }\n}\n\nexport { EvaluationSummaryAggregator };\n","import base64Encode from \"./base64Encode\";\n\nexport const headers = (sdkKey: string, clientVersion: string) => ({\n  Authorization: `Basic ${base64Encode(`u:${sdkKey}`)}`,\n  \"X-Reforge-SDK-Version\": clientVersion,\n});\n\nexport const DEFAULT_TIMEOUT = 10000;\n","import { DEFAULT_TIMEOUT, headers } from \"./apiHelpers\";\nimport { EvaluationPayload } from \"./config\";\nimport Context from \"./context\";\n\nexport type CollectContextModeType = \"NONE\" | \"SHAPE_ONLY\" | \"PERIODIC_EXAMPLE\";\n\nexport type LoaderParams = {\n  sdkKey: string;\n  context: Context;\n  endpoints?: string[] | undefined;\n  timeout?: number;\n  collectContextMode?: CollectContextModeType;\n  clientVersion?: string;\n};\n\nexport type Headers = {\n  [key: string]: string;\n};\n\nexport type FetchOptions = {\n  headers: Headers;\n};\n\nconst defaultEndpoints = [\n  \"https://primary.reforge.com/api/v2\",\n  \"https://secondary.reforge.com/api/v2\",\n];\n\nconst EARLY_TIMEOUT = 2000;\n\nexport default class Loader {\n  sdkKey: string;\n\n  context: Context;\n\n  endpoints: string[];\n\n  timeout: number;\n\n  abortTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n  collectContextMode: CollectContextModeType = \"PERIODIC_EXAMPLE\";\n\n  clientVersion: string;\n\n  abortController: AbortController | undefined;\n\n  isAborted = false;\n\n  constructor({\n    sdkKey,\n    context,\n    endpoints = undefined,\n    timeout,\n    collectContextMode = \"PERIODIC_EXAMPLE\",\n    clientVersion = \"\",\n  }: LoaderParams) {\n    this.sdkKey = sdkKey;\n    this.context = context;\n    this.endpoints = endpoints || defaultEndpoints;\n    this.timeout = timeout || DEFAULT_TIMEOUT;\n    this.collectContextMode = collectContextMode;\n    this.clientVersion = clientVersion;\n  }\n\n  url(root: string) {\n    return `${root}/configs/eval-with-context/${this.context.encode()}?collectContextMode=${\n      this.collectContextMode\n    }`;\n  }\n\n  loadFromEndpoint(\n    index: number,\n    options: FetchOptions,\n    resolve: (value: any) => void,\n    reject: (value: any) => void\n  ) {\n    this.abortController = new AbortController() as AbortController;\n    const { signal } = this.abortController;\n    this.isAborted = false;\n\n    const endpoint = this.endpoints[index];\n    const url = this.url(endpoint);\n\n    fetch(url, { signal, ...options })\n      .then((response) => {\n        this.clearAbortTimeout();\n\n        if (response.ok) {\n          return response.json();\n        }\n        throw new Error(`${response.status} ${response.statusText}`);\n      })\n      .then((data) => {\n        if (!(\"evaluations\" in data)) {\n          throw new Error(`Invalid payload:${JSON.stringify(data)}`);\n        }\n\n        resolve(data as EvaluationPayload);\n      })\n      .catch((error) => {\n        this.clearAbortTimeout();\n\n        if (index < this.endpoints.length - 1) {\n          this.loadFromEndpoint(index + 1, options, resolve, reject);\n        } else {\n          reject(error);\n        }\n      });\n\n    // Use an early timeout if we're not on the last endpoint. But if the user-provided timeout is less than EARLY_TIMEOUT, use that\n    const timeout =\n      index < this.endpoints.length - 1 ? Math.min(this.timeout, EARLY_TIMEOUT) : this.timeout;\n\n    this.abortTimeoutId = setTimeout(() => {\n      if (!this.isAborted) {\n        this.isAborted = true;\n        this.abortController?.abort();\n      }\n    }, timeout);\n  }\n\n  load() {\n    if (!this.isAborted) {\n      this.isAborted = true;\n      this.abortController?.abort();\n    }\n\n    const options = {\n      headers: headers(this.sdkKey, this.clientVersion),\n    };\n\n    const prefetchPromise =\n      typeof window !== \"undefined\" ? (window as any).REFORGE_SDK_PREFETCH_PROMISE : undefined;\n\n    if (prefetchPromise && prefetchPromise instanceof Promise) {\n      (window as any).REFORGE_SDK_PREFETCH_PROMISE = undefined;\n      return prefetchPromise.catch(\n        () =>\n          // If the prefetch failed, we should try to load from the endpoints\n          new Promise((resolve, reject) => {\n            this.loadFromEndpoint(0, options, resolve, reject);\n          })\n      );\n    }\n\n    const promise = new Promise((resolve, reject) => {\n      this.loadFromEndpoint(0, options, resolve, reject);\n    });\n\n    return promise;\n  }\n\n  clearAbortTimeout() {\n    clearTimeout(this.abortTimeoutId);\n  }\n}\n","import { DEFAULT_TIMEOUT, headers } from \"./apiHelpers\";\nimport { TelemetryEvents } from \"./types\";\n\nexport type TelemetryUploaderParams = {\n  sdkKey: string;\n  apiEndpoint?: string;\n  timeout?: number;\n  clientVersion: string;\n};\n\nexport default class TelemetryUploader {\n  sdkKey: Required<TelemetryUploaderParams>[\"sdkKey\"];\n\n  apiEndpoint: Required<TelemetryUploaderParams>[\"apiEndpoint\"];\n\n  timeout: Required<TelemetryUploaderParams>[\"timeout\"];\n\n  clientVersion: Required<TelemetryUploaderParams>[\"clientVersion\"];\n\n  abortTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n  constructor({\n    sdkKey,\n    apiEndpoint = undefined,\n    timeout,\n    clientVersion,\n  }: TelemetryUploaderParams) {\n    this.sdkKey = sdkKey;\n    this.apiEndpoint = apiEndpoint || \"https://telemetry.reforge.com/api/v1\";\n    this.timeout = timeout || DEFAULT_TIMEOUT;\n    this.clientVersion = clientVersion;\n  }\n\n  clearAbortTimeout() {\n    clearTimeout(this.abortTimeoutId);\n  }\n\n  static postUrl(root: string) {\n    return `${root}/telemetry`;\n  }\n\n  postToEndpoint(\n    options: RequestInit,\n    resolve: (value: unknown) => void,\n    reject: (value: unknown) => void\n  ) {\n    const controller = new AbortController() as AbortController;\n    const signal = controller?.signal;\n    let isAborted = false;\n\n    const url = TelemetryUploader.postUrl(this.apiEndpoint);\n\n    fetch(url, { signal, ...options })\n      .then((response) => {\n        this.clearAbortTimeout();\n\n        if (response.ok) {\n          return response.json();\n        }\n\n        // eslint-disable-next-line no-console\n        console.warn(\n          `Reforge warning: Error uploading telemetry ${response.status} ${response.statusText}`\n        );\n\n        return response.status;\n      })\n      .then((response) => {\n        resolve(response);\n      })\n      .catch((error) => {\n        this.clearAbortTimeout();\n\n        // Silently handle AbortErrors (from timeouts or page navigations)\n        if (error.name === \"AbortError\") {\n          try {\n            // eslint-disable-next-line no-console\n            console.debug(\"Reforge telemetry request aborted\");\n          } catch (e) {\n            // no-op\n          }\n          resolve({ status: \"aborted\" });\n          return;\n        }\n\n        reject(error);\n      });\n\n    this.abortTimeoutId = setTimeout(() => {\n      if (!isAborted) {\n        isAborted = true;\n        controller.abort();\n      }\n    }, this.timeout);\n  }\n\n  post(data: TelemetryEvents) {\n    const options = {\n      method: \"POST\",\n      headers: {\n        ...headers(this.sdkKey, this.clientVersion),\n        \"Content-Type\": \"application/json\",\n        Accept: \"application/json\",\n      },\n      body: JSON.stringify(data),\n      keepalive: true, // needed for flushing when the window is closed\n    };\n\n    const promise = new Promise((resolve, reject) => {\n      this.postToEndpoint(options, resolve, reject);\n    });\n\n    return promise;\n  }\n}\n","// TODO: should we retry the data chunk if a flush fails?\n\n// TODO: pause when offline?\n\nimport { ReforgeLogLevel } from \"./logger\";\nimport { PeriodicSync } from \"./periodicSync\";\nimport { type reforge } from \"./reforge\";\nimport { LoggerCounter, LoggersTelemetryEvent, TelemetryEvents } from \"./types\";\n\nconst SEVERITY_KEY: { [key in ReforgeLogLevel]: Omit<keyof LoggerCounter, \"loggerName\"> } = {\n  [ReforgeLogLevel.Trace]: \"traces\",\n  [ReforgeLogLevel.Debug]: \"debugs\",\n  [ReforgeLogLevel.Info]: \"infos\",\n  [ReforgeLogLevel.Warn]: \"warns\",\n  [ReforgeLogLevel.Error]: \"errors\",\n  [ReforgeLogLevel.Fatal]: \"fatals\",\n};\n\nclass LoggerAggregator extends PeriodicSync<LoggerCounter> {\n  private maxLoggers: number;\n\n  constructor(client: typeof reforge, maxLoggers: number, syncInterval?: number) {\n    super(client, \"LoggerAggregator\", syncInterval ?? 30000);\n\n    this.maxLoggers = maxLoggers;\n  }\n\n  record(logger: string, level: ReforgeLogLevel): void {\n    if (this.data.size >= this.maxLoggers) return;\n\n    // create counter entry if it doesn't exist\n    if (!this.data.has(logger)) {\n      this.data.set(logger, {\n        loggerName: logger,\n        traces: 0,\n        debugs: 0,\n        infos: 0,\n        warns: 0,\n        errors: 0,\n        fatals: 0,\n      });\n    }\n\n    // increment count\n    const counter = this.data.get(logger);\n    if (counter) {\n      const severityKey = SEVERITY_KEY[level] as keyof LoggerCounter;\n      (counter[severityKey] as number) += 1;\n    }\n  }\n\n  protected flush(toShip: Map<string, LoggerCounter>, startAtWas: Date): void {\n    const loggers = {\n      startAt: startAtWas.getTime(),\n      endAt: new Date().getTime(),\n      loggers: Array.from(toShip.values()),\n    };\n\n    this.client.telemetryUploader?.post(this.events(loggers));\n  }\n\n  private events(loggers: LoggersTelemetryEvent): TelemetryEvents {\n    const event = { loggers };\n\n    return {\n      instanceHash: this.client.instanceHash,\n      events: [event],\n    };\n  }\n}\n\nexport { LoggerAggregator };\n","import {\n  reforge,\n  Reforge,\n  ReforgeInitParams,\n  ReforgeBootstrap,\n  prefetchReforgeConfig,\n} from \"./src/reforge\";\nimport { Config } from \"./src/config\";\nimport Context from \"./src/context\";\nimport { LogLevel, getLogLevelSeverity, shouldLogAtLevel } from \"./src/logger\";\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { version } = require(\"./package.json\");\n\nexport {\n  reforge,\n  Reforge,\n  ReforgeInitParams,\n  Config,\n  Context,\n  LogLevel,\n  getLogLevelSeverity,\n  shouldLogAtLevel,\n  version,\n  prefetchReforgeConfig,\n};\n\nexport { ReforgeBootstrap };\n\nexport type { ConfigValue } from \"./src/config\";\nexport type {\n  Duration,\n  ContextValue,\n  Contexts,\n  TypedFrontEndConfigurationRaw,\n  FrontEndConfigurationRaw,\n} from \"./src/types\";\nexport type { CollectContextModeType } from \"./src/loader\";\n"],"mappings":"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","names":["LogLevel","reforge","version"]}