{"version":3,"sources":["../src/index.ts","../src/di/container.ts","../src/di/services.ts","../src/config/utils.ts","../src/config/constants.ts","../src/api/error/service-error.ts","../src/config/validator.ts","../src/logger/utils.ts","../src/logger/logger.ts","../src/logger/logger-factory.ts","../src/api/clients/http-client.ts","../src/api/clients/sdk-client.ts","../src/api/clients/track-client.ts","../src/api/api-client-factory.ts","../src/managers/event/deferred-event-emitter.ts","../src/managers/event/event-manager-factory.ts","../src/logger/messages.ts","../src/managers/flag/flag-eval-engine/eval-engine.service.ts","../src/managers/flag/flag-eval-engine/rollout-engine.service.ts","../src/managers/flag/flag-eval-engine/rule-engine.service.ts","../src/managers/flag/flag-manager.ts","../src/managers/flag/flag-manager-factory.ts","../src/managers/kill/kill-manager.ts","../src/api/error/service-error-factory.ts","../src/managers/event/types.ts","../src/managers/service/service-manager.ts","../src/managers/storage/memory-manager.ts","../src/managers/storage/storage-manger-factory.ts","../src/config/types.ts","../src/managers/sync/poll-manager.ts","../src/managers/sync/stream-manager.ts","../src/managers/sync/ws-manager.ts","../src/managers/sync/sync-manager-factory.ts","../src/managers/track/caches/track-cache.ts","../src/managers/track/events/events-log-strategy.ts","../src/managers/track/events/events-cache.ts","../src/managers/track/events/events-manager.ts","../src/managers/track/events/events-manager-factory.ts","../src/managers/track/impressions/impressions-log-strategy.ts","../src/managers/track/impressions/impressions-cache.ts","../src/managers/track/impressions/impressions-manager.ts","../src/managers/track/impressions/impressions-manager-factory.ts","../src/managers/track/track-manager-factory.ts","../src/client/fs-client.ts"],"sourcesContent":["import { FsClient } from '~sdk/client/fs-client';\n\nimport { FsConfig } from '~config/types';\n\nimport { FsServiceError } from '~api/error/service-error';\nimport { ServiceErrorFactory } from '~api/error/service-error-factory';\n\nexport { FsServiceError };\nexport { ServiceErrorFactory };\nexport * from '~config/types';\nexport type { LogLevel } from '~logger/types';\nexport type { FsUserContext } from '~config/types';\nexport type {\n  FsEventTypePayload,\n  EventCallback,\n  FsEventType,\n} from '~managers/event/types';\n\nexport { NoExplicitReturn } from '~managers/flag/types';\n\nexport type {\n  FeatureFlags,\n  NoExplicitReturnType,\n  IsFeatureFlagsEmpty,\n  FlagReturnType,\n} from '~managers/flag/types';\n\nexport { FsEvent } from '~managers/event/types';\n\nexport type FsErrorSource = 'api' | 'sdk';\nexport type FsErrorEvent = {\n  type: FsErrorSource;\n  error: Error | FsServiceError;\n};\n\nexport type { FsClient };\n\nexport function FlagSyncFactory(config: FsConfig): {\n  client: () => FsClient;\n} {\n  const client = new FsClient(config);\n  return {\n    client: () => client,\n  };\n}\n","import { FsSettings } from '~config/types.internal';\n\nimport { ServiceKey } from './services';\nimport { ServiceTypes } from './types';\n\nexport class Container {\n  private static instance: Container | null = null;\n  private readonly services: Map<ServiceKey, any> = new Map();\n  private readonly settings: FsSettings;\n\n  private constructor(settings: FsSettings) {\n    this.settings = settings;\n  }\n\n  static getInstance(settings?: FsSettings): Container {\n    if (!Container.instance && !settings) {\n      throw new Error('Container must be initialized with settings first');\n    }\n    if (!Container.instance && settings) {\n      Container.instance = new Container(settings);\n    }\n    return Container.instance!;\n  }\n\n  static resetInstance(): void {\n    Container.instance = null;\n  }\n\n  getSettings(): FsSettings {\n    return this.settings;\n  }\n\n  register<K extends ServiceKey>(\n    key: K,\n    factory: (container: Container) => ServiceTypes[K],\n  ): void {\n    const instance = factory(this);\n    this.services.set(key, instance);\n  }\n\n  get<K extends ServiceKey>(key: K): ServiceTypes[K] {\n    if (!this.services.has(key)) {\n      throw new Error(`Service '${key}' not found`);\n    }\n    return this.services.get(key) as ServiceTypes[K];\n  }\n\n  hasService(key: ServiceKey): boolean {\n    return this.services.has(key);\n  }\n\n  clear(): void {\n    this.services.clear();\n  }\n}\n","export const ServiceKeys = {\n  ApiClient: 'apiClient' as const,\n  EventManager: 'eventManager' as const,\n  SyncManager: 'syncManager' as const,\n  StorageManager: 'storageManager' as const,\n  TrackManager: 'trackManager' as const,\n  FlagManager: 'flagManager' as const,\n  ServiceManager: 'serviceManager' as const,\n  KillManager: 'killManager' as const,\n} as const;\n\nexport type ServiceKey = (typeof ServiceKeys)[keyof typeof ServiceKeys];\n","import deepmerge from 'deepmerge';\n\nimport { DEFAULT_CONFIG } from '~config/constants';\nimport { FsConfig } from '~config/types';\nimport { FsSettings } from '~config/types.internal';\nimport { ConfigValidator } from '~config/validator';\n\nimport { loggerFactory } from '~logger/logger-factory';\n\nexport function buildSettingsFromConfig(config: FsConfig): FsSettings {\n  const settings = deepmerge<FsSettings, FsConfig>(DEFAULT_CONFIG, config);\n  settings.log = loggerFactory(settings, config.logger);\n\n  const metadata = config.metadata ?? {};\n\n  (settings as FsSettings).metadata = {\n    sdkName: '@flagsync/node-sdk',\n    sdkVersion: '0.9.0',\n    ...metadata,\n  };\n\n  settings.sdkContext = {\n    sdkName: settings.metadata.sdkName,\n    sdkVersion: settings.metadata.sdkVersion,\n  };\n\n  settings.platform = 'node';\n\n  ConfigValidator.validate(settings);\n\n  return settings;\n}\n","import { FsSettings } from '~config/types.internal';\n\nexport const UNREADY_FLAG_VALUE: string = 'control';\n\nconst SDK_URLS = {\n  api: 'https://sdk.flagsync.com',\n  worker: 'https://sdk.flagsync.com/worker',\n};\n\nexport const DEFAULT_CONFIG = {\n  sdkKey: undefined,\n  bootstrap: {},\n  sync: {\n    type: 'ws',\n    pollRateInSec: 60,\n  },\n  tracking: {\n    impressions: {\n      maxQueueSize: 50,\n      pushRateInSec: 60,\n    },\n    events: {\n      maxQueueSize: 50,\n      pushRateInSec: 60,\n    },\n  },\n  urls: {\n    ws: SDK_URLS.worker,\n    flags: SDK_URLS.worker,\n    sse: SDK_URLS.api,\n    events: SDK_URLS.api,\n  },\n  debug: false,\n} as unknown as FsSettings;\n","export enum ServiceErrorCode {\n  InvalidSdkKey = 'INVALID_SDK_KEY',\n  InvalidConfiguration = 'INVALID_CONFIGURATION',\n  UnknownError = 'UNKNOWN_ERROR',\n  InvalidSdkDefinition = 'INVALID_SDK_DEFINITION',\n  UserContextNotFound = 'USER_CONTEXT_NOT_FOUND',\n}\n\nexport type FlagSyncErrorResponse = {\n  path: string;\n  message: string;\n  statusCode: number;\n  errorCode: ServiceErrorCode;\n};\n\ninterface ServiceErrorInput {\n  errorCode?: ServiceErrorCode;\n  statusCode?: number;\n  message?: string;\n  path?: string;\n}\n\nexport class FsServiceError extends Error {\n  public errorCode: ServiceErrorCode;\n  public statusCode: number;\n  public message: string;\n  public path: string;\n\n  constructor({\n    errorCode = ServiceErrorCode.UnknownError,\n    statusCode = 500,\n    path = '/',\n    message = 'Unknown error',\n  }: ServiceErrorInput = {}) {\n    super();\n    this.statusCode = statusCode;\n    this.errorCode = errorCode;\n    this.message = `[FsServiceError]: status: ${statusCode}, code: ${errorCode}, msg: ${message}`;\n    this.path = path;\n  }\n}\n","import { FsSettings } from '~config/types.internal';\n\nimport { FsServiceError, ServiceErrorCode } from '~api/error/service-error';\n\ninterface ValidationRule {\n  validate: (settings: FsSettings) => boolean;\n  message: string;\n}\n\nexport class ConfigValidator {\n  private static rules: ValidationRule[] = [\n    {\n      validate: (settings) => !!settings.sdkKey,\n      message: 'sdkKey is required',\n    },\n    {\n      validate: (settings) => settings.tracking.impressions.pushRateInSec >= 30,\n      message: 'tracking.impressions.pushRateInSec must be >= 30',\n    },\n    {\n      validate: (settings) => settings.tracking.impressions.maxQueueSize >= 50,\n      message: 'tracking.impressions.maxQueueSize must be >= 50',\n    },\n    {\n      validate: (settings) => settings.tracking.events.pushRateInSec >= 30,\n      message: 'tracking.events.pushRateInSec must be >= 30',\n    },\n    {\n      validate: (settings) => settings.tracking.events.maxQueueSize >= 50,\n      message: 'tracking.events.maxQueueSize must be >= 50',\n    },\n    {\n      validate: (settings) => settings.sync.pollRateInSec >= 30,\n      message: 'sync.pollRateInSec must be >= 30',\n    },\n    {\n      validate: (settings) =>\n        !!(settings.metadata.sdkName && settings.metadata.sdkVersion),\n      message:\n        'Unable to determine SDK name or version. Please contact support.',\n    },\n  ];\n\n  public static validate(settings: FsSettings): void {\n    for (const rule of this.rules) {\n      if (!rule.validate(settings)) {\n        throw new FsServiceError({\n          errorCode: ServiceErrorCode.InvalidConfiguration,\n          message: rule.message,\n        });\n      }\n    }\n  }\n\n  public static addRule(rule: ValidationRule): void {\n    this.rules.push(rule);\n  }\n}\n","import { MESSAGE } from '~logger/messages';\n\nexport function formatISODateToCustom(date: Date) {\n  const pad = (num: number) => num.toString().padStart(2, '0');\n\n  const month = pad(date.getMonth() + 1);\n  const day = pad(date.getDate());\n  const year = date.getFullYear();\n  let hours: string | number = date.getHours();\n  const minutes = pad(date.getMinutes());\n  const seconds = pad(date.getSeconds());\n  const ampm = hours >= 12 ? 'PM' : 'AM';\n  hours = hours % 12;\n  hours = hours ? pad(hours) : 12;\n\n  return `${month}/${day}/${year}, ${hours}:${minutes}:${seconds} ${ampm}`;\n}\n\nexport function formatMsg(\n  prefix: string,\n  message: (typeof MESSAGE)[keyof typeof MESSAGE],\n) {\n  return `${prefix}: ${message}`;\n}\n","import { ILogger, LogLevel } from './types';\nimport { formatISODateToCustom } from './utils';\n\nconst logPrefix = 'flagsync';\n\nexport const LogLevels = {\n  DEBUG: 'DEBUG',\n  INFO: 'INFO',\n  WARN: 'WARN',\n  ERROR: 'ERROR',\n  NONE: 'NONE',\n} as const;\n\nconst LogLevelIndices = {\n  DEBUG: 1,\n  INFO: 2,\n  WARN: 3,\n  ERROR: 4,\n  NONE: 5,\n};\n\nexport class Logger implements ILogger {\n  private logLevel: number;\n  private readonly customLogger: Partial<ILogger> | undefined;\n\n  constructor({\n    logLevel,\n    customLogger,\n  }: {\n    logLevel: LogLevel;\n    customLogger: Partial<ILogger> | undefined;\n  }) {\n    this.logLevel = LogLevelIndices[logLevel];\n    this.customLogger = customLogger;\n  }\n\n  setLogLevel(level: LogLevel) {\n    this.logLevel = LogLevelIndices[level];\n  }\n\n  debug(message: any, ...optionalParams: [...any, string?, string?]): void {\n    if (this.canLog(LogLevelIndices.DEBUG)) {\n      this._log(LogLevels.DEBUG, message, ...optionalParams);\n    }\n  }\n  log(message: any, ...optionalParams: [...any, string?, string?]): void {\n    if (this.canLog(LogLevelIndices.INFO)) {\n      this._log(LogLevels.INFO, message, ...optionalParams);\n    }\n  }\n  info(message: any, ...optionalParams: [...any, string?, string?]): void {\n    if (this.canLog(LogLevelIndices.INFO)) {\n      this._log(LogLevels.INFO, message, ...optionalParams);\n    }\n  }\n  warn(message: any, ...optionalParams: [...any, string?, string?]): void {\n    if (this.canLog(LogLevelIndices.WARN)) {\n      this._log(LogLevels.WARN, message, ...optionalParams);\n    }\n  }\n  error(message: any, ...optionalParams: [...any, string?, string?]): void {\n    if (this.canLog(LogLevelIndices.ERROR)) {\n      this._log(LogLevels.ERROR, message, ...optionalParams);\n    }\n  }\n\n  private canLog(level: number): boolean {\n    return level >= this.logLevel;\n  }\n\n  private _log(\n    level: LogLevel,\n    message: any,\n    ...optionalParams: [...any, string?, string?]\n  ) {\n    if (this.customLogger) {\n      const method = this.getCustomLoggerMethod(level);\n      method(message, ...optionalParams);\n      return;\n    }\n\n    const msg = this.buildMessage(level, message);\n    console.log(msg, ...optionalParams);\n  }\n\n  private buildMessage(level: LogLevel, message: any) {\n    const padding =\n      level === LogLevels.INFO || level === LogLevels.WARN ? ' ' : '';\n\n    return `${logPrefix} [${formatISODateToCustom(new Date())}] [${level}]${padding} => ${message}`;\n  }\n\n  private getCustomLoggerMethod(level: LogLevel) {\n    if (!this.customLogger) {\n      return console.log;\n    }\n\n    let method;\n    switch (level) {\n      case LogLevels.DEBUG:\n        method = this.customLogger.debug;\n        break;\n      case LogLevels.INFO:\n        method = this.customLogger.log ?? this.customLogger.info;\n        break;\n      case LogLevels.WARN:\n        method = this.customLogger.warn;\n        break;\n      case LogLevels.ERROR:\n        method = this.customLogger.error;\n        break;\n    }\n\n    if (method) {\n      return method;\n    }\n\n    console.error(\n      `Custom logger does not have a method for ${level}. Falling back to console.log`,\n    );\n    return console.log;\n  }\n}\n","import { FsSettings } from '../config/types.internal';\nimport { LogLevels, Logger } from './logger';\nimport { ILogger } from './types';\n\nconst defaultLevel = LogLevels.NONE;\n\nexport function loggerFactory(\n  settings: Partial<FsSettings>,\n  customLogger: Partial<ILogger> | undefined,\n): ILogger {\n  const { logLevel } = settings;\n\n  const derivedLevel = logLevel || defaultLevel;\n\n  if (customLogger) {\n    if (\n      !customLogger.debug &&\n      !customLogger.info &&\n      !customLogger.warn &&\n      !customLogger.error &&\n      !customLogger.log\n    ) {\n      throw new Error('Custom logger must have at least one log method');\n    }\n  }\n\n  return new Logger({ logLevel: derivedLevel, customLogger });\n}\n","export type QueryParamsType = Record<string | number, any>;\n\nexport interface FullRequestParams\n  extends Omit<RequestInit, 'body' | 'signal'> {\n  secure?: boolean;\n  path: string;\n  query?: QueryParamsType;\n  body?: unknown;\n}\n\nexport type RequestParams = Omit<\n  FullRequestParams,\n  'body' | 'method' | 'query' | 'path'\n>;\n\nexport interface ApiConfig extends Omit<RequestInit, 'body'> {\n  baseURL?: string;\n}\n\nexport class HttpClient {\n  private readonly baseURL: string = '';\n  private readonly defaultRequestInit?: RequestInit;\n\n  constructor({ baseURL = '', ...fetchConfig }: ApiConfig = {}) {\n    this.baseURL = baseURL;\n    this.defaultRequestInit = fetchConfig;\n  }\n\n  protected mergeRequestParams(\n    params1: RequestInit,\n    params2?: RequestInit,\n  ): RequestInit {\n    return {\n      ...this.defaultRequestInit,\n      ...params1,\n      ...params2,\n      headers: {\n        ...((this.defaultRequestInit?.headers as Record<string, string>) || {}),\n        ...((params1.headers as Record<string, string>) || {}),\n        ...((params2?.headers as Record<string, string>) || {}),\n      },\n    };\n  }\n\n  public request = async <T = any>({\n    path,\n    query,\n    body,\n    ...params\n  }: FullRequestParams): Promise<T> => {\n    const requestParams = this.mergeRequestParams(params);\n    const url = new URL(`${this.baseURL}${path}`);\n\n    if (query) {\n      Object.keys(query).forEach((key) => {\n        url.searchParams.append(key, query[key]);\n      });\n    }\n\n    const finalRequestInit: RequestInit = {\n      ...requestParams,\n      body: body ? JSON.stringify(body) : undefined,\n      method: requestParams.method || 'GET',\n      headers: {\n        ...requestParams.headers,\n        'Content-Type': 'application/json',\n        Accept: 'application/json',\n      },\n    };\n\n    try {\n      const response = await fetch(url.toString(), finalRequestInit);\n\n      const hasContent = response.headers.get('Content-Length') !== '0';\n\n      if (!response.ok) {\n        throw response;\n      }\n\n      if (hasContent) {\n        return (await response.json()) as T;\n      } else {\n        return null as T;\n      }\n    } catch (error) {\n      throw error;\n    }\n  };\n}\n","import { HttpClient, RequestParams } from '~api/clients/http-client';\n\nimport {\n  SdkEnvironmentFlagRulesGetResponse,\n  SdkInitServerRequest,\n} from '../types';\n\nexport class SdkClient extends HttpClient {\n  /**\n   * No description\n   *\n   * @name SdkControllerInitServerContext\n   * @request POST:/sdk/init-server\n   */\n  sdkControllerInitServerContext = (\n    data: SdkInitServerRequest,\n    params: RequestParams = {},\n  ) =>\n    this.request<void>({\n      path: `/sdk/init-server`,\n      method: 'POST',\n      body: data,\n      ...params,\n    });\n  /**\n   * No description\n   *\n   * @name SdkControllerGetFlagRules\n   * @request GET:/sdk/rules\n   */\n  sdkControllerGetFlagRules = (params: RequestParams = {}) =>\n    this.request<SdkEnvironmentFlagRulesGetResponse>({\n      path: `/sdk/rules`,\n      method: 'GET',\n      ...params,\n    });\n}\n","import { HttpClient, RequestParams } from '~api/clients/http-client';\n\nimport {\n  SdkServerTrackEventRequest,\n  SdkServerTrackImpressionsRequest,\n} from '../types';\n\nexport class TrackClient extends HttpClient {\n  /**\n   * No description\n   *\n   * @name SdkTrackControllerPostServerBatchEvents\n   * @request POST:/track/events/server\n   */\n  sdkTrackControllerPostServerBatchEvents = (\n    data: SdkServerTrackEventRequest,\n    params: RequestParams = {},\n  ) =>\n    this.request<void>({\n      path: `/track/events/server`,\n      method: 'POST',\n      body: data,\n      ...params,\n    });\n\n  /**\n   * No description\n   *\n   * @name SdkTrackControllerPostServerBatchImpressions\n   * @request POST:/track/impressions/server\n   */\n  sdkTrackControllerPostServerBatchImpressions = (\n    data: SdkServerTrackImpressionsRequest,\n    params: RequestParams = {},\n  ) =>\n    this.request<void>({\n      path: `/track/impressions/server`,\n      method: 'POST',\n      body: data,\n      ...params,\n    });\n}\n","import { FsSettings } from '~config/types.internal';\n\nimport { SdkClient } from '~api/clients/sdk-client';\nimport { TrackClient } from '~api/clients/track-client';\n\nexport type ApiClientFactory = {\n  sdk: SdkClient;\n  track: TrackClient;\n};\n\nlet client: ApiClientFactory;\n\nexport function apiClientFactory(params: FsSettings) {\n  if (client) {\n    return client;\n  }\n\n  client = {\n    sdk: new SdkClient({\n      baseURL: params.urls.flags,\n      credentials: 'include',\n      headers: {\n        'Content-Type': 'application/json',\n        'x-ridgeline-key': params.sdkKey,\n      },\n    }),\n    track: new TrackClient({\n      baseURL: params.urls.events,\n      credentials: 'include',\n      headers: {\n        'Content-Type': 'application/json',\n        'x-ridgeline-key': params.sdkKey,\n      },\n    }),\n  };\n\n  return client;\n}\n","import EventEmitter from 'eventemitter3';\n\ntype EventListenerFunction = (...args: any[]) => void;\n\n/**\n * A custom event emitter that defers emitting events until a listener is added\n */\nexport class DeferredEventEmitter extends EventEmitter {\n  private eventQueue: Map<string | symbol, any[][]> = new Map();\n\n  constructor() {\n    super();\n  }\n\n  emit(event: string | symbol, ...args: any[]): boolean {\n    /**\n     * Check if there are listeners for the event\n     */\n    if (this.listenerCount(event) === 0) {\n      /**\n       * No listeners, queue the event\n       */\n      if (!this.eventQueue.has(event)) {\n        this.eventQueue.set(event, []);\n      }\n\n      this.eventQueue.get(event)?.push(args);\n\n      return false;\n    }\n\n    /**\n     * Listeners exist, emit the event as normal\n     */\n    return super.emit(event, ...args);\n  }\n\n  on(event: string | symbol, fn: EventListenerFunction, context?: any): this {\n    super.on(event, fn, context);\n    this.flushEventQueue(event);\n    return this;\n  }\n\n  once(event: string | symbol, fn: EventListenerFunction, context?: any): this {\n    super.once(event, fn, context);\n    this.flushEventQueue(event);\n    return this;\n  }\n\n  private flushEventQueue(event: string | symbol): void {\n    if (this.eventQueue.has(event)) {\n      const queue = this.eventQueue.get(event);\n      if (queue) {\n        for (const args of queue) {\n          super.emit(event, ...args);\n        }\n      }\n    }\n  }\n}\n","import { DeferredEventEmitter } from '~managers/event/deferred-event-emitter';\nimport {\n  EventCallback,\n  EventInternalCallback,\n  FsEventType,\n  FsEventTypePayload,\n  FsInternalEventTypePayload,\n  FsIntervalEventType,\n  IEventManager,\n} from '~managers/event/types';\n\nexport function eventManagerFactory(): IEventManager {\n  const emitter = new DeferredEventEmitter();\n\n  function on<T extends FsEventType>(event: T, callback: EventCallback<T>) {\n    emitter.on(event, callback);\n  }\n\n  function once<T extends FsEventType>(event: T, callback: EventCallback<T>) {\n    emitter.once(event, callback);\n  }\n\n  function emit<T extends FsEventType>(\n    event: T,\n    payload?: FsEventTypePayload[T],\n  ) {\n    emitter.emit(event, payload);\n  }\n\n  function off<T extends FsEventType>(event: T, callback?: EventCallback<T>) {\n    emitter.off(event, callback);\n  }\n\n  /**\n   * Interval events are meant to serve as messaging between\n   * certain parts of the SDK that are not directly consumed\n   * by the public API.\n   */\n  const internal = {\n    on: <T extends FsIntervalEventType>(\n      event: T,\n      callback: EventInternalCallback<T>,\n    ) => {\n      emitter.on(event, callback);\n    },\n    once: <T extends FsIntervalEventType>(\n      event: T,\n      callback: EventInternalCallback<T>,\n    ) => {\n      emitter.on(event, callback);\n    },\n    emit: <T extends FsIntervalEventType>(\n      event: T,\n      payload?: FsInternalEventTypePayload[T],\n    ) => {\n      emitter.emit(event, payload);\n    },\n  };\n\n  const kill = () => {\n    emitter.removeAllListeners();\n  };\n\n  return {\n    on,\n    once,\n    emit,\n    off,\n    internal,\n    kill,\n  };\n}\n","const KILL_MANAGER_MESSAGE = {\n  KILL_KILLING: 'SDK shutting down',\n  KILL_ALREADY_KILLING: 'already handling kill, skipping...',\n} as const;\n\nconst STORAGE_MANAGER_MESSAGE = {\n  STORAGE_SET_FLAG_RULES: 'storing flag rules',\n  STORAGE_REPLACE_FLAG_RULES: 'replacing flag rules',\n  STORAGE_GET_FLAG_RULES: 'getting flag rules',\n} as const;\n\nconst SERVICE_MANAGER_MESSAGE = {\n  SDK_READY: 'SDK ready',\n  SDK_FAILED: 'SDK init failed',\n};\n\nconst STREAM_MANAGER_MESSAGE = {\n  STREAM_CONNECTED: 'connection established',\n  STREAM_MESSAGE_RECEIVED: 'message received',\n  STREAM_FULL_SET_RECEIVED: 'full flag set received',\n  STREAM_CONN_OPEN: 'connection is open',\n  STREAM_CONN_CLOSE: 'ungraceful connection close',\n  STREAM_CONN_CLOSING: 'gracefully closing event stream',\n  STREAM_RECONNECT: 'reestablishing connection',\n  STREAM_STALE: 'no events or heartbeats received, restarting connection',\n  STREAM_RESYNC_SUCCESS: 'flag rules resynced after reconnect',\n  STREAM_RESYNC_FAILED: 'flag rules resync failed',\n  STREAM_MALFORMED_EVENT: 'malformed message event',\n  STREAM_UNKNOWN_EVENT_STATE: 'unknown error state',\n} as const;\n\nconst POLL_MANAGER_MESSAGE = {\n  POLL_STARTED: 'polling started',\n  POLL_SUCCESS: 'polling success',\n  POLL_FAILED: 'polling failed',\n  POLL_STOPPED: 'gracefully stopping poller',\n} as const;\n\nconst BEACON_MANAGER_MESSAGE = {\n  BEACON_FLUSHING: 'flushing with beacon',\n  BEACON_FLUSHING_HIDDEN: 'flushing with beacon (hidden)',\n  BEACON_FAILED: 'failed to send with beacon to',\n} as const;\n\nconst TRACK_CACHE_MESSAGE = {\n  CACHE_ITEM_ENQUEUED: 'item enqueued',\n};\n\nconst EVENTS_CACHE_MESSAGE = {\n  INVALID_NUMBER: 'Value must be a finite number, null, or undefined',\n  INVALID_PROPERTIES: 'Properties must be a plain object, null, or undefined',\n};\n\nconst TRACK_MANAGER_MESSAGE = {\n  TRACK_SEND_FAIL: 'batch send failed',\n  TRACK_BATCH_SENT: 'batch sent',\n  TRACK_FLUSHING: 'flushing queue',\n  TRACK_STOPPING: 'gracefully stopping submitter',\n  TRACK_STARTING: 'starting submitter',\n} as const;\n\nconst SYNC_MANAGER = {\n  SYNC_STARTED: 'syncing started',\n} as const;\n\nconst EVAL_ENGINE_MESSAGE = {\n  UNSUPPORTED_VARIANT_DATA_TYPE: 'Unsupported variant data type',\n};\n\nexport const MESSAGE = {\n  ...SERVICE_MANAGER_MESSAGE,\n  ...KILL_MANAGER_MESSAGE,\n  ...STORAGE_MANAGER_MESSAGE,\n  ...STREAM_MANAGER_MESSAGE,\n  ...POLL_MANAGER_MESSAGE,\n  ...BEACON_MANAGER_MESSAGE,\n  ...EVENTS_CACHE_MESSAGE,\n  ...TRACK_MANAGER_MESSAGE,\n  ...TRACK_CACHE_MESSAGE,\n  ...EVAL_ENGINE_MESSAGE,\n  ...SYNC_MANAGER,\n} as const;\n","import { FsSettings } from '~config/types.internal';\n\nimport { FeatureFlagEnvironmentDetailDto, SdkUserContext } from '~api/types';\n\nimport { RolloutEngineService } from '~managers/flag/flag-eval-engine/rollout-engine.service';\nimport { RuleEngineService } from '~managers/flag/flag-eval-engine/rule-engine.service';\nimport { DataTypeCode } from '~managers/flag/flag-eval-engine/types';\n\nimport { MESSAGE } from '~logger/messages';\nimport { ILogger } from '~logger/types';\nimport { formatMsg } from '~logger/utils';\n\nconst formatter = formatMsg.bind(null, 'eval-engine-service');\n\nexport class EvalEngineService {\n  private log: ILogger;\n\n  constructor(\n    settings: FsSettings,\n    private readonly ruleEngine: RuleEngineService,\n    private readonly rolloutEngine: RolloutEngineService,\n  ) {\n    this.log = settings.log;\n  }\n\n  getValueToServe(\n    detail: FeatureFlagEnvironmentDetailDto,\n    context: SdkUserContext,\n  ) {\n    const variantId = detail.state.isEnabled\n      ? this.deriveEnabledVariantId(detail, context)\n      : detail.state.disabledSingleVariantId;\n\n    const variant = detail.featureFlag.variants.find(\n      (v) => v.variantId === variantId,\n    );\n\n    /**\n     * This should never happen since Skyline has robust validation, but put in a\n     * defensive check nonetheless.\n     */\n    if (!variant) {\n      this.log.warn(\n        `Unable to find variantId \"${variantId}\" in flag \"${detail.featureFlag.key}\"`,\n      );\n      return;\n    }\n\n    switch (variant.dataTypeCode) {\n      case DataTypeCode.Number:\n        return variant.numberValue;\n      case DataTypeCode.Boolean:\n        return variant.booleanValue;\n      case DataTypeCode.String:\n        return variant.stringValue;\n      case DataTypeCode.JSON:\n        return variant.jsonValue;\n      default: {\n        this.log.warn(\n          `${formatter(MESSAGE.UNSUPPORTED_VARIANT_DATA_TYPE)} (\"${variant.dataTypeCode}\")`,\n        );\n      }\n    }\n  }\n\n  /**\n   * Determines the enabled \"variantId\" for a user based on the feature flag config.\n   * First, delegate to the percentage rollout strategy if configured.\n   *\n   * Otherwise, return the \"enabledSingleVariantId\", which represents a variant that is\n   * globally enabled for all users.\n   * @param detail\n   * @param context\n   * @private\n   */\n  private deriveEnabledVariantId(\n    detail: FeatureFlagEnvironmentDetailDto,\n    context: SdkUserContext,\n  ) {\n    const { enabledSingleVariantId, percentageRollout, targetingRules } =\n      detail.state;\n\n    if (targetingRules.length > 0) {\n      const result = this.deriveVariantIdFromTargetingRules(context, detail);\n      if (result.isTarget) {\n        return result.variantId;\n      }\n    }\n\n    if (percentageRollout.length > 0) {\n      return this.rolloutEngine.getBucketVariantId(context, detail);\n    }\n\n    return enabledSingleVariantId;\n  }\n\n  /**\n   * Determines the \"variantId\" for a user based on a targeting rules strategy.\n   * @param context\n   * @param detail\n   * @private\n   */\n  private deriveVariantIdFromTargetingRules(\n    context: SdkUserContext,\n    detail: FeatureFlagEnvironmentDetailDto,\n  ) {\n    const {\n      state: { targetingRules, enabledSingleVariantId },\n    } = detail;\n\n    for (const rule of targetingRules) {\n      if (this.ruleEngine.isContextTargetedByRule(rule, context)) {\n        return {\n          isTarget: true,\n          variantId: rule.variantId,\n        };\n      }\n    }\n\n    return {\n      isTarget: false,\n      variantId: enabledSingleVariantId,\n    };\n  }\n}\n","import * as crypto from 'crypto';\n\nimport { FsSettings } from '~config/types.internal';\n\nimport { FeatureFlagEnvironmentDetailDto, SdkUserContext } from '~api/types';\n\nimport { ILogger } from '~logger/types';\n\nexport class RolloutEngineService {\n  private readonly log: ILogger;\n\n  constructor(settings: FsSettings) {\n    this.log = settings.log;\n  }\n\n  /**\n   * Determines the \"variantId\" for a user based on a percentage rollout strategy.\n   * Combine the context key and a seed value, hash it, then uses this hash to assign the\n   * user variant bucket.\n   *\n   * Hashing ensures deterministic assignment of users across the variants.\n   *\n   * Note: If a user choose to reallocate the percentage rollout in the UI dashboard,\n   * a new seed is generated, and users may be reassigned to a new variant.\n   * @param context\n   * @param detail\n   * @private\n   */\n  getBucketVariantId(\n    context: SdkUserContext,\n    detail: FeatureFlagEnvironmentDetailDto,\n  ) {\n    const { key } = context;\n    const { percentageRollout, seed, disabledSingleVariantId } = detail.state;\n\n    const data = key + seed;\n    const hash = crypto.createHash('sha256').update(data).digest('hex');\n\n    const intHash = parseInt(hash.substring(0, 12), 16);\n\n    // Scale to 0-99\n    const scaledHash = intHash % 100;\n\n    /**\n     * Iterates through the \"percentageRollout\", adding up the percentages.\n     * When the scaled hash value is less than the cumulative percentage,\n     * the corresponding variant is selected.\n     *\n     * This distributes users evenly among variants. Basically, it drops the user\n     * in a bucket that corresponds to the variant's weight.\n     *\n     * For example, if a variant has a 20% weight in \"percentageRollout\", about 20%\n     * of all users should be assigned to this variant.\n     *\n     * Example:\n     *       [\n     *         { variantId: 1, percentage: 60 }, // Hash 0-59\n     *         { variantId: 2, percentage: 5 },  // Hash 60-64\n     *         { variantId: 3, percentage: 10 }, // Hash 65-74\n     *         { variantId: 4, percentage: 2 },  // Hash 75-76\n     *         { variantId: 5, percentage: 23 }, // Hash 77-99\n     *       ];\n     */\n    let cumulativePercentage = 0;\n    for (const entry of percentageRollout) {\n      cumulativePercentage += entry.percentage;\n      if (scaledHash < cumulativePercentage) {\n        this.log.debug(\n          `Context key \"${key}\" is in bucket ${entry.variantId} for flag \"${detail.featureFlag.key}\"`,\n        );\n        return entry.variantId;\n      }\n    }\n\n    this.log.error(\n      `Context key \"${key}\" could not be placed in a bucket for flag \"${detail.featureFlag.key}\"`,\n    );\n\n    return disabledSingleVariantId;\n  }\n}\n","import { FsUserContext } from '~config/types';\nimport { FsSettings } from '~config/types.internal';\n\nimport {\n  SdkUserContext,\n  TargetingRuleClauseDto,\n  TargetingRuleClauseValueDto,\n  VariantEnvironmentTargetingRuleDto,\n} from '~api/types';\n\nimport {\n  TargetingRuleClauseAttributeCode,\n  TargetingRuleClauseOperatorCode,\n} from '~managers/flag/flag-eval-engine/types';\n\nimport { ILogger } from '~logger/types';\n\nexport class RuleEngineService {\n  private readonly settings: FsSettings;\n  private readonly log: ILogger;\n\n  constructor(settings: FsSettings) {\n    this.settings = settings;\n    this.log = settings.log;\n  }\n\n  public isContextTargetedByRule(\n    rule: VariantEnvironmentTargetingRuleDto,\n    context: SdkUserContext,\n  ): boolean {\n    return rule.clauses.every((clause) => {\n      const matched = this.isClauseSatisfied(clause, context);\n      if (matched) {\n        this.logDebugMatch(clause, context);\n      }\n      return matched;\n    });\n  }\n\n  private logDebugMatch(\n    clause: TargetingRuleClauseDto,\n    context: SdkUserContext,\n  ) {\n    this.log.debug('************* Matched Clause *************');\n    this.log.debug(` Attribute: ${clause.attribute}`);\n    this.log.debug(`  Operator: ${clause.operator}`);\n    this.log.debug(`    Custom: ${clause.operator}`);\n    if (clause.customAttribute) {\n      this.log.debug(`    Custom: ${clause.customAttribute.name}`);\n    }\n    this.log.debug(\n      `    Values: ${clause.values.map((v) => v.value).join(', ')}`,\n    );\n    this.log.debug('**************** Context *****************');\n    this.log.debug(`   Ctx Key: ${context.key}`);\n    this.log.debug(`Ctx Custom: ${JSON.stringify(context.attributes ?? {})}`);\n  }\n\n  private isClauseSatisfied(\n    clause: TargetingRuleClauseDto,\n    context: SdkUserContext,\n  ): boolean {\n    let ctxValue: string | undefined | null;\n\n    try {\n      ctxValue = this.getContextValueByAttribute(context, clause);\n    } catch (error) {\n      this.log.error(error);\n      return false;\n    }\n\n    if (ctxValue === undefined || ctxValue === null) {\n      return false;\n    }\n\n    const { operator, values } = clause;\n\n    // Logic for each operator type\n    switch (operator) {\n      case TargetingRuleClauseOperatorCode.IS_ONE_OF:\n        return values.some((value) => this.isEqual(value, ctxValue));\n      case TargetingRuleClauseOperatorCode.IS_NOT_ONE_OF:\n        return !values.some((value) => this.isEqual(value, ctxValue));\n      case TargetingRuleClauseOperatorCode.STARTS_WITH:\n        return values.some((value) => this.startsWith(value, ctxValue));\n      case TargetingRuleClauseOperatorCode.DOES_NOT_START_WITH:\n        return !values.some((value) => this.startsWith(value, ctxValue));\n      case TargetingRuleClauseOperatorCode.ENDS_WITH:\n        return values.some((value) => this.endsWith(value, ctxValue));\n      case TargetingRuleClauseOperatorCode.DOES_NOT_END_WITH:\n        return !values.some((value) => this.endsWith(value, ctxValue));\n      case TargetingRuleClauseOperatorCode.MATCHES_REGEX:\n        return values.some((value) => this.matchesRegExp(value, ctxValue));\n      case TargetingRuleClauseOperatorCode.DOES_NOT_MATCH_REGEX:\n        return !values.some((value) => this.matchesRegExp(value, ctxValue));\n      case TargetingRuleClauseOperatorCode.GREATER_THAN:\n        return values.some((value) => this.isGreaterThan(value, ctxValue));\n      case TargetingRuleClauseOperatorCode.GREATER_THAN_OR_EQUAL:\n        return values.some((value) => this.isGreaterThanEqual(value, ctxValue));\n      case TargetingRuleClauseOperatorCode.LESS_THAN:\n        return values.some((value) => this.isLessThan(value, ctxValue));\n      case TargetingRuleClauseOperatorCode.LESS_THAN_OR_EQUAL:\n        return values.some((value) => this.isLessThanEqual(value, ctxValue));\n      case TargetingRuleClauseOperatorCode.SEMVER_GREATER_THAN:\n        return values.some((value) =>\n          this.isSemVerGreaterThan(value, ctxValue),\n        );\n      case TargetingRuleClauseOperatorCode.SEMVER_GREATER_THAN_OR_EQUAL:\n        return values.some((value) =>\n          this.isSemVerGreaterThanEqual(value, ctxValue),\n        );\n      case TargetingRuleClauseOperatorCode.SEMVER_LESS_THAN:\n        return values.some((value) => this.isSemVerLessThan(value, ctxValue));\n      case TargetingRuleClauseOperatorCode.SEMVER_LESS_THAN_OR_EQUAL:\n        return values.some((value) =>\n          this.isSemVerLessThanEqual(value, ctxValue),\n        );\n      default: {\n        this.log.warn(\n          `Unsupported targeting rule clause operator \"${clause.operator}\"`,\n        );\n      }\n    }\n\n    return false;\n  }\n\n  /**\n   * Given the targeting rule attribute, return the applicable value\n   * from the context. It's possible that the context does not have this\n   * value, in which case, the rule can be short-circuited.\n   * @param context\n   * @param clause\n   * @private\n   */\n  private getContextValueByAttribute(\n    context: FsUserContext,\n    clause: TargetingRuleClauseDto,\n  ): string | undefined | null {\n    const { attribute, customAttribute } = clause;\n\n    switch (attribute) {\n      case TargetingRuleClauseAttributeCode.EMAIL:\n        return context.attributes?.email;\n      case TargetingRuleClauseAttributeCode.KEY:\n        return context.key;\n      case TargetingRuleClauseAttributeCode.CUSTOM:\n        return (context.attributes ?? {})[customAttribute?.name];\n      default: {\n        this.log.warn(\n          `Unsupported targeting rule clause attribute \"${attribute}\"`,\n        );\n      }\n    }\n\n    return undefined;\n  }\n\n  private isEqual(\n    ruleValue: TargetingRuleClauseValueDto,\n    contextValue: string,\n  ): boolean {\n    return ruleValue.value === contextValue;\n  }\n\n  private startsWith(\n    ruleValue: TargetingRuleClauseValueDto,\n    contextValue: string,\n  ): boolean {\n    return contextValue.startsWith(ruleValue.value);\n  }\n\n  private endsWith(\n    ruleValue: TargetingRuleClauseValueDto,\n    contextValue: string,\n  ): boolean {\n    return contextValue.endsWith(ruleValue.value);\n  }\n\n  private matchesRegExp(\n    ruleValue: TargetingRuleClauseValueDto,\n    contextValue: string,\n  ): boolean {\n    const regex = new RegExp(ruleValue.value);\n    return regex.test(contextValue);\n  }\n\n  private isGreaterThan(\n    ruleValue: TargetingRuleClauseValueDto,\n    contextValue: string,\n  ): boolean {\n    const results = this.getNumberValues(ruleValue, contextValue);\n    return !results ? false : results.contextNumber > results.ruleNumber;\n  }\n\n  private isLessThan(\n    ruleValue: TargetingRuleClauseValueDto,\n    contextValue: string,\n  ): boolean {\n    const results = this.getNumberValues(ruleValue, contextValue);\n    return !results ? false : results.contextNumber < results.ruleNumber;\n  }\n\n  private isGreaterThanEqual(\n    ruleValue: TargetingRuleClauseValueDto,\n    contextValue: string,\n  ): boolean {\n    const results = this.getNumberValues(ruleValue, contextValue);\n    return !results ? false : results.contextNumber >= results.ruleNumber;\n  }\n\n  private isLessThanEqual(\n    ruleValue: TargetingRuleClauseValueDto,\n    contextValue: string,\n  ): boolean {\n    const results = this.getNumberValues(ruleValue, contextValue);\n    return !results ? false : results.contextNumber <= results.ruleNumber;\n  }\n\n  private isSemVerGreaterThan(\n    ruleValue: TargetingRuleClauseValueDto,\n    contextValue: string,\n  ): boolean {\n    try {\n      const [major1 = 0, minor1 = 0, patch1 = 0] =\n        this.parseSemVer(contextValue);\n      const [major2 = 0, minor2 = 0, patch2 = 0] = this.parseSemVer(\n        ruleValue.value,\n      );\n      if (major1 !== major2) {\n        return major1 > major2;\n      }\n      if (minor1 !== minor2) {\n        return minor1 > minor2;\n      }\n\n      return patch1 > patch2;\n    } catch (error) {\n      this.log.error(error);\n      return false;\n    }\n  }\n\n  private isSemVerLessThan(\n    ruleValue: TargetingRuleClauseValueDto,\n    contextValue: string,\n  ): boolean {\n    try {\n      const [major1 = 0, minor1 = 0, patch1 = 0] =\n        this.parseSemVer(contextValue);\n      const [major2 = 0, minor2 = 0, patch2 = 0] = this.parseSemVer(\n        ruleValue.value,\n      );\n\n      if (major1 !== major2) {\n        return major1 < major2;\n      }\n      if (minor1 !== minor2) {\n        return minor1 < minor2;\n      }\n\n      return patch1 < patch2;\n    } catch (error) {\n      this.log.error(error);\n      return false;\n    }\n  }\n\n  private isSemVerGreaterThanEqual(\n    ruleValue: TargetingRuleClauseValueDto,\n    contextValue: string,\n  ) {\n    try {\n      const [major1 = 0, minor1 = 0, patch1 = 0] =\n        this.parseSemVer(contextValue);\n      const [major2 = 0, minor2 = 0, patch2 = 0] = this.parseSemVer(\n        ruleValue.value,\n      );\n\n      if (major1 !== major2) {\n        return major1 >= major2;\n      }\n      if (minor1 !== minor2) {\n        return minor1 >= minor2;\n      }\n\n      return patch1 >= patch2;\n    } catch (error) {\n      this.log.error(error);\n      return false;\n    }\n  }\n\n  private isSemVerLessThanEqual(\n    ruleValue: TargetingRuleClauseValueDto,\n    contextValue: string,\n  ) {\n    try {\n      const [major1 = 0, minor1 = 0, patch1 = 0] =\n        this.parseSemVer(contextValue);\n      const [major2 = 0, minor2 = 0, patch2 = 0] = this.parseSemVer(\n        ruleValue.value,\n      );\n\n      if (major1 !== major2) {\n        return major1 <= major2;\n      }\n      if (minor1 !== minor2) {\n        return minor1 <= minor2;\n      }\n\n      return patch1 <= patch2;\n    } catch (error) {\n      this.log.error(error);\n      return false;\n    }\n  }\n\n  private getNumberValues(\n    ruleValue: TargetingRuleClauseValueDto,\n    contextValue: string,\n  ): { ruleNumber: number; contextNumber: number } | undefined {\n    const ruleNumber = parseFloat(ruleValue.value);\n    const contextNumber = parseFloat(contextValue);\n\n    if (isNaN(ruleNumber) || isNaN(contextNumber)) {\n      return undefined;\n    }\n\n    return { ruleNumber, contextNumber };\n  }\n\n  private parseSemVer(version: string) {\n    const parts = version.split('.').map((num) => parseInt(num, 10));\n    if (parts.some(isNaN)) {\n      throw new Error(`[parseSemVer]: Invalid version format: ${version}`);\n    }\n    return parts;\n  }\n}\n","import { UNREADY_FLAG_VALUE } from '~config/constants';\nimport { FsUserContext } from '~config/types';\n\nimport { EvalEngineService } from '~managers/flag/flag-eval-engine/eval-engine.service';\nimport { IFlagManager } from '~managers/flag/types';\nimport { IStoreManager } from '~managers/storage/types';\nimport { ITrackManager } from '~managers/track/types';\n\nexport function flagManager(\n  evalEngine: EvalEngineService,\n  storageManager: IStoreManager,\n  trackManager: ITrackManager,\n): IFlagManager {\n  // Implementation\n  function flag<T = any>(\n    context: FsUserContext,\n    flagKey: string,\n    defaultValue?: T,\n  ): T {\n    if (!flagKey || typeof flagKey !== 'string') {\n      return (defaultValue ?? UNREADY_FLAG_VALUE) as T;\n    }\n\n    const flags = storageManager.get();\n    const flag = flags[flagKey];\n\n    if (!flag) {\n      return (defaultValue ?? UNREADY_FLAG_VALUE) as T;\n    }\n\n    const value = evalEngine.getValueToServe(flag, context);\n    const flagValue = value ?? defaultValue ?? UNREADY_FLAG_VALUE;\n\n    trackManager.impressionsManager.track({\n      flagKey,\n      flagValue: flagValue as object,\n      context,\n    });\n\n    return flagValue as T;\n  }\n\n  return {\n    flag,\n  };\n}\n","import { FsSettings } from '~config/types.internal';\n\nimport { EvalEngineService } from '~managers/flag/flag-eval-engine/eval-engine.service';\nimport { RolloutEngineService } from '~managers/flag/flag-eval-engine/rollout-engine.service';\nimport { RuleEngineService } from '~managers/flag/flag-eval-engine/rule-engine.service';\nimport { flagManager } from '~managers/flag/flag-manager';\nimport { IStoreManager } from '~managers/storage/types';\nimport { ITrackManager } from '~managers/track/types';\n\nexport function flagManagerFactory(\n  settings: FsSettings,\n  storageManager: IStoreManager,\n  trackManager: ITrackManager,\n) {\n  const rolloutEngine = new RolloutEngineService(settings);\n  const ruleEngine = new RuleEngineService(settings);\n  const evalEngine = new EvalEngineService(settings, ruleEngine, rolloutEngine);\n\n  return flagManager(evalEngine, storageManager, trackManager);\n}\n","import { FsSettings } from '~config/types.internal';\n\nimport { IEventManager } from '~managers/event/types';\nimport { IKillManager } from '~managers/kill/types';\nimport { ISyncManager } from '~managers/sync/types';\nimport { ITrackManager } from '~managers/track/types';\n\nimport { MESSAGE } from '~logger/messages';\nimport { formatMsg } from '~logger/utils';\n\nconst format = formatMsg.bind(null, 'kill-manager');\n\nexport function killManager(\n  settings: FsSettings,\n  eventManager: IEventManager,\n  syncManager: ISyncManager,\n  trackManager: ITrackManager,\n): IKillManager {\n  const { log } = settings;\n\n  let killing = false;\n\n  async function destroy(): Promise<void> {\n    if (!killing) {\n      killing = true;\n      log.info(format(MESSAGE.KILL_KILLING));\n      // for (const eventKey in FsEvent) {\n      //   eventManager.off(FsEvent[eventKey as keyof typeof FsEvent]);\n      // }\n      syncManager.kill();\n      eventManager.kill();\n      await trackManager.kill();\n    } else {\n      log.info(format(MESSAGE.KILL_ALREADY_KILLING));\n    }\n  }\n\n  process.on('exit', destroy); // Process termination event\n  process.on('SIGINT', destroy); // Signal handling (SIGINT)\n  process.on('SIGTERM', destroy); // Signal handling (SIGTERM)\n\n  return {\n    destroy,\n  };\n}\n","import {\n  FlagSyncErrorResponse,\n  FsServiceError,\n  ServiceErrorCode,\n} from './service-error';\n\ntype ApiErrorResponse = {\n  errorCode: ServiceErrorCode;\n  message: string;\n  statusCode: number;\n  path: string;\n};\n\nfunction isApiErrorResponse(obj: any): obj is ApiErrorResponse {\n  return (\n    obj !== null &&\n    typeof obj === 'object' &&\n    typeof obj.errorCode === 'string' &&\n    typeof obj.message === 'string' &&\n    typeof obj.statusCode === 'number' &&\n    typeof obj.path === 'string'\n  );\n}\n\nexport class ServiceErrorFactory {\n  /**\n   * Creates a ServiceError from a thrown object.\n   *\n   * @param e The thrown error object, which could be an Error or a Response.\n   */\n  static async create(e: unknown): Promise<FsServiceError> {\n    if (e instanceof Response) {\n      try {\n        const data = await e.json();\n\n        if (isApiErrorResponse(data)) {\n          return this.createFromResponse(e.status, data);\n        }\n      } catch (jsonError) {\n        // If parsing fails, we'll treat it as a generic error below.\n      }\n\n      return this.createGeneric(e);\n    }\n\n    if (e instanceof Error) {\n      return this.createGeneric(e);\n    }\n\n    return new FsServiceError();\n  }\n\n  /**\n   * Creates a ServiceError from a Response object with structured error data.\n   * @param status The HTTP status code.\n   * @param res The parsed JSON body of the error response.\n   */\n  private static createFromResponse(\n    status: number,\n    res: FlagSyncErrorResponse,\n  ): FsServiceError {\n    return new FsServiceError({\n      statusCode: res.statusCode || status,\n      errorCode: res.errorCode || ServiceErrorCode.UnknownError,\n      message: res.message,\n      path: res.path,\n    });\n  }\n\n  /**\n   * Creates a generic ServiceError from an unknown or Error object.\n   * @param e The error object.\n   */\n  private static createGeneric(e: unknown): FsServiceError {\n    const defaultMessage = 'An unknown error occurred.';\n    const defaultStatusCode = 500;\n\n    if (e instanceof Response) {\n      return new FsServiceError({\n        message: e.statusText || defaultMessage,\n        path: '/',\n        errorCode: ServiceErrorCode.UnknownError,\n        statusCode: e.status || defaultStatusCode,\n      });\n    }\n\n    if (e instanceof Error) {\n      return new FsServiceError({\n        message: e.message,\n        path: '/',\n        errorCode: ServiceErrorCode.UnknownError,\n        statusCode: defaultStatusCode,\n      });\n    }\n\n    // For any other unknown object, use the default message.\n    return new FsServiceError({\n      message: defaultMessage,\n      path: '/',\n      errorCode: ServiceErrorCode.UnknownError,\n      statusCode: defaultStatusCode,\n    });\n  }\n}\n","import { FsErrorEvent } from '~sdk/index';\n\nimport { FsFlagSet } from '~config/types';\n\nexport type EventCallback<T extends FsEventType> = (\n  payload: FsEventTypePayload[T],\n) => void;\n\nexport type EventInternalCallback<T extends FsIntervalEventType> = (\n  payload: FsInternalEventTypePayload[T],\n) => void;\n\nexport interface IEventManager {\n  on<T extends FsEventType>(event: T, callback: EventCallback<T>): void;\n  once<T extends FsEventType>(event: T, callback: EventCallback<T>): void;\n  emit<T extends FsEventType>(event: T, payload?: FsEventTypePayload[T]): void;\n  off<T extends FsEventType>(event: T, callback?: EventCallback<T>): void;\n  kill: () => void;\n  internal: {\n    on<T extends FsIntervalEventType>(\n      event: T,\n      callback: EventInternalCallback<T>,\n    ): void;\n    once<T extends FsIntervalEventType>(\n      event: T,\n      callback: EventInternalCallback<T>,\n    ): void;\n    emit<T extends FsIntervalEventType>(\n      event: T,\n      payload?: FsInternalEventTypePayload[T],\n    ): void;\n  };\n}\n\nexport const FsEvent = {\n  SDK_READY: 'init::ready',\n  SDK_READY_FROM_STORE: 'init::ready-store',\n  ERROR: 'sdk::error',\n  SDK_UPDATE: 'state::update',\n} as const;\n\nexport type FsEventType = (typeof FsEvent)[keyof typeof FsEvent];\n\nexport const FsIntervalEvent = {\n  UPDATE_RECEIVED: 'state::update-received',\n  UPDATE_RECEIVED_FULL: 'state::update-received-full',\n} as const;\n\nexport type FsIntervalEventType =\n  (typeof FsIntervalEvent)[keyof typeof FsIntervalEvent];\n\ntype EventVoidPayload = void;\ntype EventErrorPayload = FsErrorEvent;\ntype EventFlagSetPayload = FsFlagSet;\n\nexport interface FsEventTypePayload {\n  [FsEvent.SDK_READY]: EventVoidPayload;\n  [FsEvent.ERROR]: EventErrorPayload;\n  [FsEvent.SDK_UPDATE]: EventVoidPayload;\n  [FsEvent.SDK_READY_FROM_STORE]: EventVoidPayload;\n}\n\nexport interface FsInternalEventTypePayload {\n  [FsIntervalEvent.UPDATE_RECEIVED]: EventFlagSetPayload;\n  [FsIntervalEvent.UPDATE_RECEIVED_FULL]: EventFlagSetPayload;\n}\n","import { FsSettings } from '~config/types.internal';\n\nimport { SdkClient } from '~api/clients/sdk-client';\nimport { FsServiceError } from '~api/error/service-error';\nimport { ServiceErrorFactory } from '~api/error/service-error-factory';\n\nimport { FsEvent, IEventManager } from '~managers/event/types';\nimport { IStoreManager } from '~managers/storage/types';\n\nimport { MESSAGE } from '~logger/messages';\nimport { formatMsg } from '~logger/utils';\n\nimport { IServiceManager } from './types';\n\nconst format = formatMsg.bind(null, 'service-manager');\n\nexport function serviceManager(\n  settings: FsSettings,\n  sdk: SdkClient,\n  storageManager: IStoreManager,\n  eventEmitter: IEventManager,\n): IServiceManager {\n  const { log, sdkContext } = settings;\n\n  const initWithWithThrow = sdk\n    .sdkControllerInitServerContext({\n      sdkContext,\n    })\n    .then(() => sdk.sdkControllerGetFlagRules())\n    .then((res) => {\n      storageManager.set(res?.flags ?? {});\n      log.debug(format(MESSAGE.SDK_READY));\n      eventEmitter.emit(FsEvent.SDK_READY);\n    })\n    .catch((e: unknown) => {\n      throw ServiceErrorFactory.create(e);\n    });\n\n  const initWithCatch = initWithWithThrow.catch((e: FsServiceError) => {\n    log.error(format(MESSAGE.SDK_FAILED), e.path, e.errorCode, e.message);\n    eventEmitter.emit(FsEvent.ERROR, {\n      type: 'api',\n      error: e,\n    });\n  });\n\n  return {\n    initWithCatch,\n    initWithWithThrow,\n  };\n}\n","import { FsFlagSet } from '~config/types';\nimport { FsSettings } from '~config/types.internal';\n\nimport { MESSAGE } from '~logger/messages';\nimport { formatMsg } from '~logger/utils';\n\nimport { IStoreManager } from './types';\n\nconst formatter = formatMsg.bind(null, 'memory-manager');\n\nexport function memoryManager(params: FsSettings): IStoreManager {\n  const { log } = params;\n\n  let flagSet: FsFlagSet = {};\n\n  function set(incoming: FsFlagSet) {\n    log.debug(formatter(MESSAGE.STORAGE_SET_FLAG_RULES));\n    flagSet = {\n      ...flagSet,\n      ...incoming,\n    };\n  }\n\n  /**\n   * Replace the entire flag set. Unlike the merge in `set`, this drops flags\n   * absent from the incoming set — the only way deletes can take effect.\n   */\n  function replace(incoming: FsFlagSet) {\n    log.debug(formatter(MESSAGE.STORAGE_REPLACE_FLAG_RULES));\n    flagSet = {\n      ...incoming,\n    };\n  }\n\n  function get(): FsFlagSet {\n    log.debug(formatter(MESSAGE.STORAGE_GET_FLAG_RULES));\n    return {\n      ...flagSet,\n    };\n  }\n\n  return {\n    set,\n    replace,\n    get,\n  };\n}\n","import { FsFlagSet } from '~config/types';\nimport { FsSettings } from '~config/types.internal';\n\nimport { FsEvent, FsIntervalEvent, IEventManager } from '~managers/event/types';\nimport { memoryManager } from '~managers/storage/memory-manager';\n\nimport { IStoreManager } from './types';\n\nexport function storageManagerFactory(\n  params: FsSettings,\n  eventManager: IEventManager,\n): IStoreManager {\n  const manager = memoryManager(params);\n\n  /**\n   * The sync managers emit internal events when updates are received.\n   * UPDATE_RECEIVED carries a partial set (legacy SSE updates) and is merged;\n   * UPDATE_RECEIVED_FULL carries the entire flag set (poll, WebSocket, and\n   * full-sync SSE) and replaces the store, so deleted flags drop out.\n   */\n  eventManager.internal.on(\n    FsIntervalEvent.UPDATE_RECEIVED,\n    (flagSet: FsFlagSet) => {\n      manager.set(flagSet);\n      eventManager.emit(FsEvent.SDK_UPDATE);\n    },\n  );\n\n  eventManager.internal.on(\n    FsIntervalEvent.UPDATE_RECEIVED_FULL,\n    (flagSet: FsFlagSet) => {\n      manager.replace(flagSet);\n      eventManager.emit(FsEvent.SDK_UPDATE);\n    },\n  );\n\n  return manager;\n}\n","import { FeatureFlagEnvironmentDetailDto } from '~api/types';\n\nimport { ILogger, LogLevel } from '~logger/types';\n\nexport type FsFlagSet = Record<string, FeatureFlagEnvironmentDetailDto>;\n\nexport type CustomAttributeValue = any;\nexport type CustomAttributes = Record<string, CustomAttributeValue>;\n\nexport type FsUserContext = {\n  key: string;\n  attributes?: CustomAttributes;\n};\n\nexport const SyncType = {\n  Sse: 'sse',\n  Ws: 'ws',\n  Poll: 'poll',\n  Off: 'off',\n} as const;\n\nexport const Platform = {\n  Node: 'node',\n} as const;\n\ntype PollingSync = {\n  type: typeof SyncType.Poll;\n  pollRateInSec: number;\n};\n\ntype NonPollingSync = {\n  type?: Exclude<\n    (typeof SyncType)[keyof typeof SyncType],\n    typeof SyncType.Poll\n  >;\n  pollRateInSec?: never;\n};\n\nexport interface FsConfig {\n  readonly sdkKey: string;\n  readonly sync?: PollingSync | NonPollingSync;\n  readonly tracking?: {\n    impressions?: {\n      maxQueueSize: number;\n      pushRateInSec: number;\n    };\n    events?: {\n      maxQueueSize: number;\n      pushRateInSec: number;\n    };\n  };\n  readonly urls?: {\n    ws?: string;\n    sse?: string;\n    flags?: string;\n    events?: string;\n  };\n  logger?: Partial<ILogger>;\n  readonly logLevel?: LogLevel;\n  readonly metadata?: Record<string, any>;\n}\n","import { FsSettings } from '~config/types.internal';\n\nimport { apiClientFactory } from '~api/api-client-factory';\nimport { ServiceErrorFactory } from '~api/error/service-error-factory';\n\nimport { FsEvent, FsIntervalEvent, IEventManager } from '~managers/event/types';\nimport { ISyncManager } from '~managers/sync/types';\n\nimport { MESSAGE } from '~logger/messages';\nimport { formatMsg } from '~logger/utils';\n\nconst formatter = formatMsg.bind(null, 'poll-manager');\n\nexport function pollManager(\n  settings: FsSettings,\n  eventManager: IEventManager,\n): ISyncManager {\n  const { log, sync } = settings;\n\n  const { sdk } = apiClientFactory(settings);\n\n  let timeout: number | NodeJS.Timeout;\n  const interval = sync.pollRateInSec * 1000;\n\n  async function poll() {\n    try {\n      const res = await sdk.sdkControllerGetFlagRules();\n      log.debug(formatter(MESSAGE.POLL_SUCCESS));\n      eventManager.internal.emit(\n        FsIntervalEvent.UPDATE_RECEIVED_FULL,\n        res?.flags ?? {},\n      );\n    } catch (e) {\n      const error = await ServiceErrorFactory.create(e);\n      log.error(\n        formatter(MESSAGE.POLL_FAILED),\n        error.path,\n        error.errorCode,\n        error.message,\n      );\n\n      eventManager.emit(FsEvent.ERROR, {\n        type: 'api',\n        error: error,\n      });\n    } finally {\n      timeout = setTimeout(poll, interval);\n    }\n  }\n\n  function start() {\n    log.debug(formatter(MESSAGE.POLL_STARTED));\n    timeout = setTimeout(poll, interval);\n  }\n\n  function kill() {\n    if (timeout) {\n      log.debug(formatter(MESSAGE.POLL_STOPPED));\n      clearTimeout(timeout);\n    }\n  }\n\n  return {\n    start,\n    kill,\n  };\n}\n","import { EventSource } from 'eventsource';\n\nimport { FsFlagSet } from '~config/types';\nimport { FsSettings } from '~config/types.internal';\n\nimport { apiClientFactory } from '~api/api-client-factory';\n\nimport { FsIntervalEvent, IEventManager } from '~managers/event/types';\nimport { ISyncManager } from '~managers/sync/types';\n\nimport { MESSAGE } from '~logger/messages';\nimport { formatMsg } from '~logger/utils';\n\nconst formatter = formatMsg.bind(null, 'stream-manager');\n\n/**\n * Next.js patches the global fetch with caching layers (the Data Cache, and\n * in `next dev` an HMR cache) that clone the response and buffer its entire\n * body. An SSE body never ends, so buffering it leaks memory and logs\n * \"Failed to set fetch cache <url> TypeError: terminated\" once the connection\n * drops. `eventsource` already sends `cache: 'no-store'`, but the dev-time\n * HMR cache buffers even `no-store` requests, so prefer the original,\n * un-patched fetch that Next.js exposes on the patched function.\n */\nfunction getBaseFetch(): typeof fetch {\n  const patched = globalThis.fetch as typeof fetch & {\n    _nextOriginalFetch?: typeof fetch;\n  };\n  return patched._nextOriginalFetch ?? patched;\n}\n\n/**\n * The server emits a heartbeat every 25s to keep intermediaries (Cloudflare)\n * from closing the connection as idle. If nothing at all arrives for several\n * heartbeat periods, the connection is presumed half-dead and restarted.\n */\nconst STALE_CONNECTION_TIMEOUT_MS = 80_000;\n\nexport const streamManager = (\n  settings: FsSettings,\n  eventManager: IEventManager,\n): ISyncManager => {\n  const { urls, log, sdkContext } = settings;\n  const { sdk } = apiClientFactory(settings);\n\n  let es: EventSource | undefined;\n  let watchdog: NodeJS.Timeout | undefined;\n  let killed = false;\n  let hasConnected = false;\n\n  /**\n   * Servers that support full-set sync send the entire ruleset as named\n   * \"flags\" events. Once one is seen, legacy partial \"message\" events are\n   * ignored to avoid applying the same change twice.\n   */\n  let serverSupportsFullSync = false;\n\n  /**\n   * Restart the connection if no event, heartbeat, or open arrives within\n   * the stale window. Catches half-dead sockets that emit no error, which\n   * `EventSource` would otherwise never recover from.\n   */\n  function resetWatchdog() {\n    clearTimeout(watchdog);\n    watchdog = setTimeout(() => {\n      log.warn(formatter(MESSAGE.STREAM_STALE));\n      es?.close();\n      start();\n    }, STALE_CONNECTION_TIMEOUT_MS);\n    watchdog.unref?.();\n  }\n\n  /**\n   * Updates emitted while the connection was down are lost — there is no\n   * replay on reconnect — so fetch the full ruleset to converge the store.\n   */\n  async function resyncOnReconnect() {\n    try {\n      const res = await sdk.sdkControllerGetFlagRules();\n      eventManager.internal.emit(\n        FsIntervalEvent.UPDATE_RECEIVED_FULL,\n        res?.flags ?? {},\n      );\n      log.debug(formatter(MESSAGE.STREAM_RESYNC_SUCCESS));\n    } catch (error) {\n      log.error(formatter(MESSAGE.STREAM_RESYNC_FAILED), error?.toString());\n    }\n  }\n\n  function start() {\n    if (killed) {\n      return;\n    }\n\n    /**\n     * Create a new EventSource instance and listen for incoming flag updates.\n     * Handlers close over `source` rather than the reassignable `es`, so a\n     * lingering handler from a restarted connection can't act on the new one.\n     */\n    const source = new EventSource(`${urls.sse}/sse/sdk-updates/server`, {\n      withCredentials: true,\n      fetch: (input, init) =>\n        getBaseFetch()(input, {\n          ...init,\n          headers: {\n            ...init.headers,\n            'x-ridgeline-key': settings.sdkKey,\n            'x-ridgeline-sdk-ctx': JSON.stringify(sdkContext),\n          },\n        }),\n    });\n    es = source;\n\n    resetWatchdog();\n\n    source.onopen = () => {\n      log.debug(formatter(MESSAGE.STREAM_CONNECTED));\n      resetWatchdog();\n      if (hasConnected) {\n        resyncOnReconnect();\n      }\n      hasConnected = true;\n    };\n\n    /**\n     * Full-set sync: the server sends the entire ruleset, which replaces\n     * the store. This is how flag creates and deletes take effect.\n     * @param event\n     */\n    source.addEventListener('flags', (event) => {\n      resetWatchdog();\n      try {\n        const flagSet = JSON.parse(event.data) as FsFlagSet;\n        log.debug(formatter(MESSAGE.STREAM_FULL_SET_RECEIVED));\n        serverSupportsFullSync = true;\n        eventManager.internal.emit(\n          FsIntervalEvent.UPDATE_RECEIVED_FULL,\n          flagSet,\n        );\n      } catch (error) {\n        log.error(formatter(MESSAGE.STREAM_MALFORMED_EVENT), error?.toString());\n      }\n    });\n\n    /**\n     * Heartbeats carry no data; they keep intermediaries from closing the\n     * connection as idle and feed the staleness watchdog.\n     */\n    source.addEventListener('heartbeat', () => {\n      resetWatchdog();\n    });\n\n    /**\n     * Legacy partial update: only the changed flag, merged into the store.\n     * Servers that send full-set \"flags\" events also send these for older\n     * SDKs; ignore them once full-set support has been observed.\n     * @param event\n     */\n    source.onmessage = (event) => {\n      resetWatchdog();\n      if (serverSupportsFullSync) {\n        return;\n      }\n      try {\n        const flagRule = JSON.parse(event.data) as FsFlagSet;\n        log.debug(formatter(MESSAGE.STREAM_MESSAGE_RECEIVED));\n        eventManager.internal.emit(FsIntervalEvent.UPDATE_RECEIVED, flagRule);\n      } catch (error) {\n        log.error(formatter(MESSAGE.STREAM_MALFORMED_EVENT), error?.toString());\n      }\n    };\n\n    source.onerror = (event: Event) => {\n      switch (source.readyState) {\n        case source.CONNECTING:\n          log.debug(formatter(MESSAGE.STREAM_RECONNECT));\n          break;\n        case source.OPEN:\n          log.debug(formatter(MESSAGE.STREAM_CONN_OPEN));\n          break;\n        case source.CLOSED:\n          log.debug(formatter(MESSAGE.STREAM_CONN_CLOSE));\n          break;\n        default:\n          log.debug(\n            `${formatter(MESSAGE.STREAM_UNKNOWN_EVENT_STATE)}: \"${source.readyState}\"`,\n            event.toString(),\n          );\n      }\n    };\n  }\n\n  function kill() {\n    killed = true;\n    clearTimeout(watchdog);\n    if (es) {\n      log.debug(formatter(MESSAGE.STREAM_CONN_CLOSING));\n      es.close();\n    }\n  }\n\n  return {\n    start,\n    kill,\n  };\n};\n","import WebSocket from 'ws';\n\nimport { FsFlagSet } from '~config/types';\nimport { FsSettings } from '~config/types.internal';\n\nimport { FsIntervalEvent, IEventManager } from '~managers/event/types';\nimport { ISyncManager } from '~managers/sync/types';\n\nimport { MESSAGE } from '~logger/messages';\nimport { formatMsg } from '~logger/utils';\n\nconst formatter = formatMsg.bind(null, 'ws-manager');\n\nexport const wsManager = (\n  settings: FsSettings,\n  eventManager: IEventManager,\n): ISyncManager => {\n  const { urls, log, sdkContext } = settings;\n\n  let ws: WebSocket;\n  let reconnectTimeout: NodeJS.Timeout | null = null;\n  let killed = false;\n  const RECONNECT_DELAY = 5000;\n\n  function connect() {\n    if (killed) {\n      return;\n    }\n    const wsUrl = `${urls.ws.replace('https', 'wss')}/sdk/connect`;\n\n    ws = new WebSocket(wsUrl, {\n      headers: {\n        'x-ridgeline-key': settings.sdkKey,\n        'x-ridgeline-sdk-ctx': JSON.stringify(sdkContext),\n      },\n    });\n\n    /**\n     * Fired when the WebSocket connection is opened.\n     */\n    ws.onopen = () => {\n      log.debug(formatter(MESSAGE.STREAM_CONNECTED));\n      if (reconnectTimeout) {\n        clearTimeout(reconnectTimeout);\n        reconnectTimeout = null;\n      }\n    };\n\n    /**\n     * Fired when a message is received.\n     * @param event\n     */\n    ws.onmessage = (event) => {\n      try {\n        const data = JSON.parse(event.data.toString());\n        log.debug(formatter(MESSAGE.STREAM_MESSAGE_RECEIVED));\n        if (data.type === 'flagUpdate') {\n          // Sunrise always pushes the entire ruleset, so replace the store\n          // rather than merge — this is how deletes propagate.\n          const ruleset = data.flags as FsFlagSet;\n          eventManager.internal.emit(\n            FsIntervalEvent.UPDATE_RECEIVED_FULL,\n            ruleset,\n          );\n        }\n      } catch (error) {\n        log.error(formatter(MESSAGE.STREAM_MALFORMED_EVENT), error?.toString());\n      }\n    };\n\n    /**\n     * Fired when the WebSocket connection is closed.\n     */\n    ws.onclose = (event) => {\n      log.debug(\n        formatter(MESSAGE.STREAM_CONN_CLOSE),\n        `Code: ${event.code}, Reason: ${event.reason}`,\n      );\n      if (!killed && event.code !== 1000) {\n        log.debug(formatter(MESSAGE.STREAM_RECONNECT));\n        reconnectTimeout = setTimeout(connect, RECONNECT_DELAY);\n      }\n    };\n\n    /**\n     * Fired when an error occurs.\n     */\n    ws.onerror = (error) => {\n      log.error(\n        formatter(MESSAGE.STREAM_UNKNOWN_EVENT_STATE),\n        error?.toString(),\n      );\n    };\n  }\n\n  function start() {\n    connect();\n  }\n\n  /**\n   * A kill must tear down whatever state the connection cycle is in: a\n   * pending reconnect timer or a CONNECTING socket would otherwise keep the\n   * event loop alive (and reconnect after shutdown), hanging SIGINT.\n   */\n  function kill() {\n    killed = true;\n    if (reconnectTimeout) {\n      clearTimeout(reconnectTimeout);\n      reconnectTimeout = null;\n    }\n    if (ws && ws.readyState === ws.CONNECTING) {\n      // close() mid-handshake surfaces an abort error; terminate() doesn't.\n      log.debug(formatter(MESSAGE.STREAM_CONN_CLOSING));\n      ws.terminate();\n    } else if (ws && ws.readyState === ws.OPEN) {\n      log.debug(formatter(MESSAGE.STREAM_CONN_CLOSING));\n      // Use code 1000 for normal closure\n      ws.close(1000, 'SDK shutting down.');\n    }\n  }\n\n  return {\n    start,\n    kill,\n  };\n};\n","import { SyncType } from '~config/types';\nimport { FsSettings } from '~config/types.internal';\n\nimport { FsEvent, IEventManager } from '~managers/event/types';\nimport { pollManager } from '~managers/sync/poll-manager';\nimport { streamManager } from '~managers/sync/stream-manager';\nimport { ISyncManager } from '~managers/sync/types';\nimport { wsManager } from '~managers/sync/ws-manager';\n\nimport { MESSAGE } from '~logger/messages';\nimport { formatMsg } from '~logger/utils';\n\nconst noop = () => {};\n\nconst formatter = formatMsg.bind(null, 'sync-manager-factory');\n\nexport function syncManagerFactory(\n  settings: FsSettings,\n  eventManager: IEventManager,\n): ISyncManager {\n  const { log, sync } = settings;\n\n  let manager: ISyncManager;\n  switch (sync.type) {\n    case SyncType.Poll:\n      manager = pollManager(settings, eventManager);\n      break;\n    case SyncType.Sse:\n      manager = streamManager(settings, eventManager);\n      break;\n    case SyncType.Ws:\n      manager = wsManager(settings, eventManager);\n      break;\n    default:\n      manager = {\n        start: noop,\n        kill: noop,\n      };\n      break;\n  }\n\n  eventManager.on(FsEvent.SDK_READY, () => {\n    log.debug(`${formatter(MESSAGE.SYNC_STARTED)} - type: ${sync.type}`);\n    manager.start();\n  });\n\n  return manager;\n}\n","import {\n  ITrackCache,\n  ITrackCacheConfig,\n  ITrackCacheLogStrategy,\n} from '~managers/track/caches/types';\n\nimport { MESSAGE } from '~logger/messages';\nimport { ILogger } from '~logger/types';\nimport { formatMsg } from '~logger/utils';\n\nexport class TrackCache<T> implements ITrackCache<T> {\n  private queue: T[] = [];\n\n  private onFullQueue?: () => void;\n  protected readonly log: ILogger;\n  private readonly maxQueueSize: number;\n  private readonly logPrefix: string;\n  private readonly logStrategy: ITrackCacheLogStrategy<T>;\n\n  constructor({\n    log,\n    onFullQueue,\n    maxQueueSize,\n    logPrefix,\n    logStrategy,\n  }: ITrackCacheConfig<T>) {\n    this.log = log;\n    this.maxQueueSize = maxQueueSize;\n    this.onFullQueue = onFullQueue;\n    this.logPrefix = logPrefix;\n    this.logStrategy = logStrategy;\n  }\n\n  setOnFullQueueCb(cb: () => void): void {\n    this.onFullQueue = cb;\n  }\n\n  push(item: T): void {\n    this.queue.push(item);\n\n    const vals = this.logStrategy.getLogItem(item);\n    this.log.debug(\n      formatMsg(this.logPrefix, MESSAGE.CACHE_ITEM_ENQUEUED),\n      ...vals,\n    );\n\n    if (this.queue.length >= this.maxQueueSize && this.onFullQueue) {\n      this.onFullQueue();\n    }\n  }\n\n  clear(): void {\n    this.queue = [];\n  }\n\n  pop(): T[] {\n    const queue = this.queue;\n    this.clear();\n    return queue;\n  }\n\n  isEmpty(): boolean {\n    return this.queue.length === 0;\n  }\n}\n","import { SdkServerTrackEvent } from '~api/types';\n\nimport { ITrackCacheLogStrategy } from '~managers/track/caches/types';\n\nexport class EventLogStrategy\n  implements ITrackCacheLogStrategy<SdkServerTrackEvent>\n{\n  getLogItem(item: SdkServerTrackEvent): [string, string] {\n    return [item.eventKey, JSON.stringify(item)];\n  }\n}\n","import { FsSettings } from '~config/types.internal';\n\nimport { SdkServerTrackEvent, SdkUserContext } from '~api/types';\n\nimport { TrackCache } from '~managers/track/caches/track-cache';\nimport { ITrackCache } from '~managers/track/caches/types';\nimport { EventLogStrategy } from '~managers/track/events/events-log-strategy';\n\nimport { MESSAGE } from '~logger/messages';\nimport { formatMsg } from '~logger/utils';\n\nconst formatter = formatMsg.bind(null, 'events-cache');\n\nexport interface IEventsCache extends ITrackCache<SdkServerTrackEvent> {\n  track(\n    context: SdkUserContext,\n    eventKey: string,\n    value?: number,\n    properties?: Record<string, any>,\n  ): void;\n}\n\nexport class EventsCache\n  extends TrackCache<SdkServerTrackEvent>\n  implements IEventsCache\n{\n  constructor(settings: FsSettings, onFullQueue: () => void) {\n    super({\n      log: settings.log,\n      maxQueueSize: settings.tracking.events.maxQueueSize,\n      logPrefix: 'events-cache',\n      logStrategy: new EventLogStrategy(),\n      onFullQueue: onFullQueue,\n    });\n  }\n\n  track(\n    context: SdkUserContext,\n    eventKey: string,\n    value?: number | null | undefined,\n    properties?: Record<string, any> | null | undefined,\n  ): void {\n    if (\n      !(typeof value === 'number' && !isNaN(value) && isFinite(value)) &&\n      value !== null &&\n      value !== undefined\n    ) {\n      this.log.warn(formatter(MESSAGE.INVALID_NUMBER));\n    }\n\n    // Validate properties to ensure it's a plain object, null, or undefined\n    if (properties !== null && properties !== undefined) {\n      if (!(typeof properties === 'object' && !Array.isArray(properties))) {\n        this.log.warn(formatter(MESSAGE.INVALID_PROPERTIES));\n      }\n      // Check for inclusions of prototypes or methods\n      if (Object.getPrototypeOf(properties) !== Object.prototype) {\n        this.log.warn(formatter(MESSAGE.INVALID_PROPERTIES));\n      }\n    }\n\n    const event: SdkServerTrackEvent = {\n      context,\n      eventKey,\n      value,\n      properties,\n      timestamp: new Date().toISOString(),\n    };\n\n    this.push(event);\n  }\n}\n","import { FsSettings } from '~config/types.internal';\n\nimport { TrackClient } from '~api/clients/track-client';\nimport { ServiceErrorFactory } from '~api/error/service-error-factory';\n\nimport { FsEvent, IEventManager } from '~managers/event/types';\nimport { EventsCache } from '~managers/track/events/events-cache';\nimport { IEventsManager } from '~managers/track/events/types';\n\nimport { MESSAGE } from '~logger/messages';\nimport { formatMsg } from '~logger/utils';\n\nconst START_DELAY_MS = 3000;\n\nconst formatter = formatMsg.bind(null, 'events-manager');\n\nexport function eventsManager(\n  settings: FsSettings,\n  track: TrackClient,\n  eventManager: IEventManager,\n): IEventsManager {\n  const {\n    log,\n    sdkContext,\n    tracking: {\n      events: { pushRateInSec },\n    },\n  } = settings;\n\n  const cache = new EventsCache(settings, flushQueue);\n\n  let timeout: number | NodeJS.Timeout;\n  const interval = pushRateInSec * 1000;\n\n  async function batchSend(): Promise<void> {\n    if (cache.isEmpty()) {\n      if (timeout) {\n        clearTimeout(timeout);\n      }\n      timeout = setTimeout(batchSend, interval);\n      return;\n    }\n\n    const sendQueue = cache.pop();\n\n    try {\n      await track.sdkTrackControllerPostServerBatchEvents({\n        events: sendQueue,\n        sdkContext,\n      });\n      log.debug(\n        `${formatter(MESSAGE.TRACK_BATCH_SENT)} (${sendQueue.length} events)`,\n      );\n    } catch (e) {\n      const error = await ServiceErrorFactory.create(e);\n      log.error(\n        formatter(MESSAGE.TRACK_SEND_FAIL),\n        error.path,\n        error.errorCode,\n        error.message,\n      );\n      eventManager.emit(FsEvent.ERROR, {\n        type: 'api',\n        error: error,\n      });\n    } finally {\n      timeout = setTimeout(batchSend, interval);\n    }\n  }\n\n  async function flushQueue() {\n    log.debug(formatter(MESSAGE.TRACK_FLUSHING));\n    await batchSend();\n  }\n\n  function start() {\n    log.debug(`${formatter(MESSAGE.TRACK_STARTING)} (${START_DELAY_MS}ms)`);\n    timeout = setTimeout(batchSend, START_DELAY_MS);\n  }\n\n  async function flushQueueAndStop(): Promise<void> {\n    try {\n      await flushQueue();\n    } finally {\n      stopSubmitter();\n    }\n  }\n\n  function stopSubmitter() {\n    if (timeout) {\n      log.debug(formatter(MESSAGE.TRACK_STOPPING));\n      clearTimeout(timeout);\n    }\n  }\n\n  return {\n    start,\n    stopSubmitter,\n    flushQueueAndStop,\n    pop: () => cache.pop(),\n    isEmpty: () => cache.isEmpty(),\n    track: cache.track.bind(cache),\n  };\n}\n","import { FsSettings } from '~config/types.internal';\n\nimport { TrackClient } from '~api/clients/track-client';\n\nimport { FsEvent, IEventManager } from '~managers/event/types';\nimport { eventsManager } from '~managers/track/events/events-manager';\nimport { IEventsManager } from '~managers/track/events/types';\n\nexport function eventsManagerFactory(\n  settings: FsSettings,\n  track: TrackClient,\n  eventManager: IEventManager,\n): IEventsManager {\n  const manager = eventsManager(settings, track, eventManager);\n\n  eventManager.on(FsEvent.SDK_READY, () => {\n    manager.start();\n  });\n\n  return manager;\n}\n","import { SdkServerTrackImpression } from '~api/types';\n\nimport { ITrackCacheLogStrategy } from '~managers/track/caches/types';\n\nexport class ImpressionLogStrategy\n  implements ITrackCacheLogStrategy<SdkServerTrackImpression>\n{\n  getLogItem(item: SdkServerTrackImpression): [string, string] {\n    return [item.flagKey, JSON.stringify(item.flagValue)];\n  }\n}\n","import { FsSettings } from '~config/types.internal';\n\nimport { SdkServerTrackImpression } from '~api/types';\n\nimport { TrackCache } from '~managers/track/caches/track-cache';\nimport { ITrackCache } from '~managers/track/caches/types';\nimport { ImpressionLogStrategy } from '~managers/track/impressions/impressions-log-strategy';\n\nexport interface IImpressionCache\n  extends ITrackCache<SdkServerTrackImpression> {\n  track(event: SdkServerTrackImpression): void;\n}\n\nexport class ImpressionsCache\n  extends TrackCache<SdkServerTrackImpression>\n  implements IImpressionCache\n{\n  constructor(settings: FsSettings, onFullQueue: () => void) {\n    super({\n      log: settings.log,\n      maxQueueSize: settings.tracking.impressions.maxQueueSize,\n      logPrefix: 'impressions-cache',\n      logStrategy: new ImpressionLogStrategy(),\n      onFullQueue: onFullQueue,\n    });\n  }\n\n  track(impression: SdkServerTrackImpression): void {\n    this.push(impression);\n  }\n}\n","import { FsSettings } from '~config/types.internal';\n\nimport { TrackClient } from '~api/clients/track-client';\nimport { ServiceErrorFactory } from '~api/error/service-error-factory';\n\nimport { FsEvent, IEventManager } from '~managers/event/types';\nimport { ImpressionsCache } from '~managers/track/impressions/impressions-cache';\nimport {\n  IImpressionsManager,\n  PartialTrackImpression,\n} from '~managers/track/impressions/types';\n\nimport { MESSAGE } from '~logger/messages';\nimport { formatMsg } from '~logger/utils';\n\nconst START_DELAY_MS = 3000;\n\nconst formatter = formatMsg.bind(null, 'impressions-manager');\n\nexport function impressionsManager(\n  settings: FsSettings,\n  track: TrackClient,\n  eventManager: IEventManager,\n): IImpressionsManager {\n  const {\n    log,\n    sdkContext,\n    tracking: {\n      impressions: { pushRateInSec },\n    },\n  } = settings;\n\n  const cache = new ImpressionsCache(settings, flushQueue);\n\n  let timeout: number | NodeJS.Timeout;\n  const interval = pushRateInSec * 1000;\n\n  async function batchSend() {\n    if (cache.isEmpty()) {\n      if (timeout) {\n        clearTimeout(timeout);\n      }\n      timeout = setTimeout(batchSend, interval);\n      return;\n    }\n\n    const sendQueue = cache.pop();\n\n    try {\n      await track.sdkTrackControllerPostServerBatchImpressions({\n        impressions: sendQueue,\n        sdkContext,\n      });\n      log.debug(\n        `${formatter(MESSAGE.TRACK_BATCH_SENT)} (${sendQueue.length} impressions)`,\n      );\n    } catch (e) {\n      const error = await ServiceErrorFactory.create(e);\n      log.error(\n        formatter(MESSAGE.TRACK_SEND_FAIL),\n        error.path,\n        error.errorCode,\n        error.message,\n      );\n      eventManager.emit(FsEvent.ERROR, {\n        type: 'api',\n        error: error,\n      });\n    } finally {\n      timeout = setTimeout(batchSend, interval);\n    }\n  }\n\n  async function flushQueue() {\n    log.debug(formatter(MESSAGE.TRACK_FLUSHING));\n    await batchSend();\n  }\n\n  function start() {\n    log.debug(`${formatter(MESSAGE.TRACK_STARTING)} (${START_DELAY_MS}ms)`);\n    timeout = setTimeout(batchSend, START_DELAY_MS);\n  }\n\n  async function flushQueueAndStop() {\n    try {\n      await flushQueue();\n    } finally {\n      stopSubmitter();\n    }\n  }\n\n  function stopSubmitter() {\n    if (timeout) {\n      log.debug(formatter(MESSAGE.TRACK_STOPPING));\n      clearTimeout(timeout);\n    }\n  }\n\n  function publicTrack(impression: PartialTrackImpression) {\n    cache.track({\n      ...impression,\n      timestamp: new Date().toISOString(),\n    });\n  }\n\n  return {\n    start,\n    flushQueueAndStop,\n    stopSubmitter,\n    pop: () => cache.pop(),\n    isEmpty: () => cache.isEmpty(),\n    track: publicTrack,\n  };\n}\n","import { FsSettings } from '~config/types.internal';\n\nimport { TrackClient } from '~api/clients/track-client';\n\nimport { FsEvent, IEventManager } from '~managers/event/types';\nimport { impressionsManager } from '~managers/track/impressions/impressions-manager';\nimport { IImpressionsManager } from '~managers/track/impressions/types';\n\nexport function impressionsManagerFactory(\n  settings: FsSettings,\n  track: TrackClient,\n  eventManager: IEventManager,\n): IImpressionsManager {\n  const manager = impressionsManager(settings, track, eventManager);\n\n  eventManager.on(FsEvent.SDK_READY, () => {\n    manager.start();\n  });\n\n  return manager;\n}\n","import { FsSettings } from '~config/types.internal';\n\nimport { TrackClient } from '~api/clients/track-client';\n\nimport { IEventManager } from '~managers/event/types';\nimport { eventsManagerFactory } from '~managers/track/events/events-manager-factory';\nimport { impressionsManagerFactory } from '~managers/track/impressions/impressions-manager-factory';\nimport { ITrackManager } from '~managers/track/types';\n\nexport function trackManagerFactory(\n  settings: FsSettings,\n  track: TrackClient,\n  eventManager: IEventManager,\n): ITrackManager {\n  const impressionsManager = impressionsManagerFactory(\n    settings,\n    track,\n    eventManager,\n  );\n  const eventsManager = eventsManagerFactory(settings, track, eventManager);\n\n  async function kill(): Promise<void> {\n    await impressionsManager.flushQueueAndStop();\n    await eventsManager.flushQueueAndStop();\n  }\n\n  return {\n    kill,\n    eventsManager,\n    impressionsManager,\n  };\n}\n","import { Container } from '~di/container';\nimport { ServiceKeys } from '~di/services';\n\nimport { FsConfig, FsUserContext } from '~config/types';\nimport { buildSettingsFromConfig } from '~config/utils';\n\nimport { apiClientFactory } from '~api/api-client-factory';\nimport { SdkUserContext } from '~api/types';\n\nimport { eventManagerFactory } from '~managers/event/event-manager-factory';\nimport { EventCallback, FsEventType } from '~managers/event/types';\nimport { flagManagerFactory } from '~managers/flag/flag-manager-factory';\nimport {\n  FeatureFlags,\n  FlagReturnType,\n  IsFeatureFlagsEmpty,\n  NoExplicitReturnType,\n} from '~managers/flag/types';\nimport { killManager } from '~managers/kill/kill-manager';\nimport { serviceManager } from '~managers/service/service-manager';\nimport { storageManagerFactory } from '~managers/storage/storage-manger-factory';\nimport { syncManagerFactory } from '~managers/sync/sync-manager-factory';\nimport { trackManagerFactory } from '~managers/track/track-manager-factory';\n\nexport class FsClient {\n  private readonly container: Container;\n  private initialized = false;\n\n  constructor(config: FsConfig) {\n    const settings = buildSettingsFromConfig(config);\n    this.container = Container.getInstance(settings);\n    this.registerServices();\n  }\n\n  private registerServices(): void {\n    if (this.initialized) return;\n\n    this.container.register(ServiceKeys.ApiClient, () =>\n      apiClientFactory(this.container.getSettings()),\n    );\n\n    this.container.register(ServiceKeys.EventManager, () =>\n      eventManagerFactory(),\n    );\n\n    this.container.register(ServiceKeys.StorageManager, (c) => {\n      return storageManagerFactory(\n        c.getSettings(),\n        c.get(ServiceKeys.EventManager),\n      );\n    });\n\n    this.container.register(ServiceKeys.SyncManager, (c) => {\n      return syncManagerFactory(\n        c.getSettings(),\n        c.get(ServiceKeys.EventManager),\n      );\n    });\n\n    this.container.register(ServiceKeys.TrackManager, (c) => {\n      return trackManagerFactory(\n        c.getSettings(),\n        c.get(ServiceKeys.ApiClient).track,\n        c.get(ServiceKeys.EventManager),\n      );\n    });\n\n    this.container.register(ServiceKeys.FlagManager, (c) => {\n      return flagManagerFactory(\n        c.getSettings(),\n        c.get(ServiceKeys.StorageManager),\n        c.get(ServiceKeys.TrackManager),\n      );\n    });\n\n    this.container.register(ServiceKeys.ServiceManager, (c) => {\n      return serviceManager(\n        c.getSettings(),\n        c.get(ServiceKeys.ApiClient).sdk,\n        c.get(ServiceKeys.StorageManager),\n        c.get(ServiceKeys.EventManager),\n      );\n    });\n\n    this.container.register(ServiceKeys.KillManager, (c) => {\n      return killManager(\n        c.getSettings(),\n        c.get(ServiceKeys.EventManager),\n        c.get(ServiceKeys.SyncManager),\n        c.get(ServiceKeys.TrackManager),\n      );\n    });\n\n    this.initialized = true;\n  }\n\n  /**\n   * Evaluates a feature flag for a given user context with full type-safety.\n   *\n   * This function is designed to work with or without `FlagSync CLI` generated\n   * TypeScript types, providing robust type inference, validation, and autocompletion.\n   *\n   * @example With FlagSync CLI generated types (recommended for full type-safety and DX):\n   * ```ts\n   * declare module '@flagsync/node-sdk' {\n   *   interface FeatureFlags {\n   *     'price-discount': 0.1 | 0.2;\n   *     'layout': 'v1' | 'v2' | 'v3';\n   *     'killswitch': boolean;\n   *   }\n   * }\n   *\n   * const ctx = { key: 'user123' };\n   *\n   * const discount = client.flag(ctx, 'price-discount');         // Type: 0.1 | 0.2\n   * const layout = client.flag(ctx, 'layout', 'v1');             // Type: 'v1' | 'v2' | 'v3' (defaultValue must be 'v1' | 'v2' | 'v3')\n   * const isEnabled = client.flag(ctx, 'killswitch');            // Type: boolean\n   * const value = client.flag(ctx, 'not-a-real-flag');           // ❌ TS Error: Argument is not a key of FeatureFlags\n   * const badDefault = client.flag(ctx, 'price-discount', 0.5);  // ❌ TS Error: Default value type mismatch\n   * ```\n   *\n   * When not using FlagSync CLI, you must manually type the flag value, or\n   * it will be inferred as \"unknown\"\n   *\n   * @example Without FlagSync CLI generated types (manual type specification or inference as `unknown`):\n   * ```ts\n   * const ctx = { userId: 'user456' };\n   *\n   * const layout = client.flag<'v1' | 'v2'>(ctx, 'layout');             // Type: 'v1' | 'v2'\n   * const discount = client.flag<number>(ctx, 'price-discount');        // Type: number\n   * const enabled = client.flag<boolean>(ctx, 'enable-feature', false); // Type: boolean (defaultValue must be true or false)\n   *\n   * // Without an explicit generic (and no generated types), the return type is `unknown`:\n   * const someDynamicKey = client.flag(ctx, 'some-dynamic-key');        // Type: unknown\n   * ```\n   */\n  public flag<TReturn = NoExplicitReturnType, TKey extends string = string>(\n    context: FsUserContext,\n    flagKey: IsFeatureFlagsEmpty<FeatureFlags> extends true\n      ? TKey\n      :\n          | (TKey extends keyof FeatureFlags ? TKey : never)\n          | (keyof FeatureFlags extends never ? never : keyof FeatureFlags),\n\n    defaultValue?: FlagReturnType<TReturn, TKey, FeatureFlags>,\n  ): FlagReturnType<TReturn, TKey, FeatureFlags> {\n    return this.container\n      .get(ServiceKeys.FlagManager)\n      .flag(context, flagKey, defaultValue);\n  }\n\n  public destroy(): Promise<void> {\n    return this.container.get(ServiceKeys.KillManager).destroy();\n  }\n\n  public on<T extends FsEventType>(event: T, callback: EventCallback<T>): void {\n    return this.container.get(ServiceKeys.EventManager).on(event, callback);\n  }\n\n  public once<T extends FsEventType>(\n    event: T,\n    callback: EventCallback<T>,\n  ): void {\n    return this.container.get(ServiceKeys.EventManager).once(event, callback);\n  }\n\n  public off<T extends FsEventType>(\n    event: T,\n    callback?: EventCallback<T>,\n  ): void {\n    return this.container.get(ServiceKeys.EventManager).off(event, callback);\n  }\n\n  public track(\n    context: SdkUserContext,\n    eventKey: string,\n    value?: number | null | undefined,\n    properties?: Record<string, any>,\n  ): void {\n    return this.container\n      .get(ServiceKeys.TrackManager)\n      .eventsManager.track(context, eventKey, value, properties);\n  }\n\n  public async waitForReady(): Promise<void> {\n    return this.container.get(ServiceKeys.ServiceManager).initWithCatch;\n  }\n\n  public async waitForReadyCanThrow(): Promise<void> {\n    return this.container.get(ServiceKeys.ServiceManager).initWithWithThrow;\n  }\n}\n"],"mappings":"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","names":["deepmerge","EventEmitter","flag","format","formatter","formatter","formatter","formatter","WebSocket","formatter","logPrefix","formatter","formatter","START_DELAY_MS","formatter","impressionsManager","eventsManager","client"]}