{"version":3,"sources":["../../src/common/client.ts"],"sourcesContent":["import fetchRetry from \"fetch-retry\";\nimport { randomUUID } from \"node:crypto\";\n\nimport ConsumerRegistry from \"./consumerRegistry.js\";\nimport { getOrCreateInstanceUuid } from \"./instance.js\";\nimport { Logger, getLogger } from \"./logging.js\";\nimport { isValidClientId, isValidEnv } from \"./paramValidation.js\";\nimport RequestCounter from \"./requestCounter.js\";\nimport RequestLogger from \"./requestLogger.js\";\nimport { getCpuMemoryUsage } from \"./resources.js\";\nimport ServerErrorCounter from \"./serverErrorCounter.js\";\nimport SpanCollector from \"./spanCollector.js\";\nimport {\n  ApitallyConfig,\n  StartupData,\n  StartupPayload,\n  SyncPayload,\n} from \"./types.js\";\nimport ValidationErrorCounter from \"./validationErrorCounter.js\";\n\nconst SYNC_INTERVAL = 60000; // 60 seconds\nconst INITIAL_SYNC_INTERVAL = 10000; // 10 seconds\nconst INITIAL_SYNC_INTERVAL_DURATION = 3600000; // 1 hour\nconst MAX_QUEUE_TIME = 3.6e6; // 1 hour\n\nclass HTTPError extends Error {\n  public response: Response;\n\n  constructor(response: Response) {\n    const reason = response.status\n      ? `status code ${response.status}`\n      : \"an unknown error\";\n    super(`Request failed with ${reason}`);\n    this.response = response;\n  }\n}\n\nexport class ApitallyClient {\n  private clientId: string;\n  private env: string;\n\n  private static instance?: ApitallyClient;\n  private instanceUuid: string;\n  private syncDataQueue: SyncPayload[];\n  private syncIntervalId?: NodeJS.Timeout;\n  public startupData?: StartupData;\n  private startupDataSent: boolean = false;\n  private enabled: boolean = true;\n\n  public requestCounter: RequestCounter;\n  public requestLogger: RequestLogger;\n  public spanCollector: SpanCollector;\n  public validationErrorCounter: ValidationErrorCounter;\n  public serverErrorCounter: ServerErrorCounter;\n  public consumerRegistry: ConsumerRegistry;\n  public logger: Logger;\n\n  constructor({\n    clientId,\n    env = \"dev\",\n    requestLogging,\n    requestLoggingConfig,\n    logger,\n  }: ApitallyConfig) {\n    if (ApitallyClient.instance) {\n      throw new Error(\"Apitally client is already initialized\");\n    }\n\n    this.logger = logger ?? getLogger();\n\n    if (!isValidClientId(clientId)) {\n      this.logger.error(\n        `Invalid Apitally client ID '${clientId}' (expecting hexadecimal UUID format)`,\n      );\n      this.enabled = false;\n    }\n    if (!isValidEnv(env)) {\n      this.logger.error(\n        `Invalid Apitally env '${env}' (expecting 1-32 alphanumeric characters and hyphens only)`,\n      );\n      this.enabled = false;\n    }\n    if (requestLoggingConfig && !requestLogging) {\n      console.warn(\n        \"requestLoggingConfig is deprecated, use requestLogging instead.\",\n      );\n    }\n\n    ApitallyClient.instance = this;\n    this.clientId = clientId;\n    this.env = env;\n    this.instanceUuid = getOrCreateInstanceUuid(clientId, env);\n    this.syncDataQueue = [];\n    this.requestCounter = new RequestCounter();\n    this.requestLogger = new RequestLogger(\n      requestLogging ?? requestLoggingConfig,\n    );\n    this.spanCollector = new SpanCollector(\n      this.enabled &&\n        this.requestLogger.enabled &&\n        this.requestLogger.config.captureTraces,\n    );\n    this.validationErrorCounter = new ValidationErrorCounter();\n    this.serverErrorCounter = new ServerErrorCounter();\n    this.consumerRegistry = new ConsumerRegistry();\n    this.handleShutdown = this.handleShutdown.bind(this);\n  }\n\n  public static getInstance() {\n    if (!ApitallyClient.instance) {\n      throw new Error(\"Apitally client is not initialized\");\n    }\n    return ApitallyClient.instance;\n  }\n\n  public isEnabled() {\n    return this.enabled;\n  }\n\n  public static async shutdown() {\n    if (ApitallyClient.instance) {\n      await ApitallyClient.instance.handleShutdown();\n    }\n  }\n\n  public async handleShutdown() {\n    this.enabled = false;\n    this.stopSync();\n    await this.sendSyncData();\n    await this.sendLogData();\n    await this.spanCollector.shutdown();\n    await this.requestLogger.close();\n    ApitallyClient.instance = undefined;\n  }\n\n  private getHubUrlPrefix() {\n    const baseURL =\n      process.env.APITALLY_HUB_BASE_URL || \"https://hub.apitally.io\";\n    const version = \"v2\";\n    return `${baseURL}/${version}/${this.clientId}/${this.env}/`;\n  }\n\n  private async sendData(url: string, payload: any) {\n    const fetchWithRetry = fetchRetry(fetch, {\n      retries: 3,\n      retryDelay: 1000,\n      retryOn: [408, 429, 500, 502, 503, 504],\n    });\n    const response = await fetchWithRetry(this.getHubUrlPrefix() + url, {\n      method: \"POST\",\n      body: JSON.stringify(payload),\n      headers: { \"Content-Type\": \"application/json\" },\n    });\n    if (!response.ok) {\n      throw new HTTPError(response);\n    }\n  }\n\n  public startSync() {\n    if (!this.enabled) {\n      return;\n    }\n    this.sync();\n    this.syncIntervalId = setInterval(() => {\n      this.sync();\n    }, INITIAL_SYNC_INTERVAL);\n    setTimeout(() => {\n      if (this.syncIntervalId) {\n        clearInterval(this.syncIntervalId);\n        this.syncIntervalId = setInterval(() => {\n          this.sync();\n        }, SYNC_INTERVAL);\n      }\n    }, INITIAL_SYNC_INTERVAL_DURATION);\n  }\n\n  private async sync() {\n    try {\n      const promises = [this.sendSyncData(), this.sendLogData()];\n      if (!this.startupDataSent) {\n        promises.push(this.sendStartupData());\n      }\n      await Promise.all(promises);\n    } catch (error) {\n      this.logger.error(\"Error while syncing with Apitally Hub\", {\n        error,\n      });\n    }\n  }\n\n  private stopSync() {\n    if (this.syncIntervalId) {\n      clearInterval(this.syncIntervalId);\n      this.syncIntervalId = undefined;\n    }\n  }\n\n  public setStartupData(data: StartupData) {\n    this.startupData = data;\n    this.startupDataSent = false;\n  }\n\n  private async sendStartupData() {\n    if (this.startupData) {\n      this.logger.debug(\"Sending startup data to Apitally Hub\");\n      const payload: StartupPayload = {\n        instance_uuid: this.instanceUuid,\n        message_uuid: randomUUID(),\n        ...this.startupData,\n      };\n      try {\n        await this.sendData(\"startup\", payload);\n        this.startupDataSent = true;\n      } catch (error) {\n        const handled = this.handleHubError(error);\n        if (!handled) {\n          this.logger.error((error as Error).message);\n          this.logger.debug(\n            \"Error while sending startup data to Apitally Hub (will retry)\",\n            { error },\n          );\n        }\n      }\n    }\n  }\n\n  private async sendSyncData() {\n    this.logger.debug(\"Synchronizing data with Apitally Hub\");\n    const newPayload: SyncPayload = {\n      timestamp: Date.now() / 1000,\n      instance_uuid: this.instanceUuid,\n      message_uuid: randomUUID(),\n      requests: this.requestCounter.getAndResetRequests(),\n      validation_errors:\n        this.validationErrorCounter.getAndResetValidationErrors(),\n      server_errors: this.serverErrorCounter.getAndResetServerErrors(),\n      consumers: this.consumerRegistry.getAndResetUpdatedConsumers(),\n      resources: getCpuMemoryUsage(),\n    };\n    this.syncDataQueue.push(newPayload);\n\n    let i = 0;\n    while (this.syncDataQueue.length > 0) {\n      const payload = this.syncDataQueue.shift();\n      if (payload) {\n        try {\n          if (Date.now() - payload.timestamp * 1000 <= MAX_QUEUE_TIME) {\n            if (i > 0) {\n              await this.randomDelay();\n            }\n            await this.sendData(\"sync\", payload);\n            i += 1;\n          }\n        } catch (error) {\n          const handled = this.handleHubError(error);\n          if (!handled) {\n            this.logger.debug(\n              \"Error while synchronizing data with Apitally Hub (will retry)\",\n              { error },\n            );\n            this.syncDataQueue.push(payload);\n            break;\n          }\n        }\n      }\n    }\n  }\n\n  private async sendLogData() {\n    this.logger.debug(\"Sending request log data to Apitally Hub\");\n    await this.requestLogger.rotateFile();\n\n    const fetchWithRetry = fetchRetry(fetch, {\n      retries: 3,\n      retryDelay: 1000,\n      retryOn: [408, 429, 500, 502, 503, 504],\n    });\n\n    let i = 0;\n    let logFile;\n    while ((logFile = this.requestLogger.getFile())) {\n      if (i > 0) {\n        await this.randomDelay();\n      }\n\n      try {\n        const response = await fetchWithRetry(\n          `${this.getHubUrlPrefix()}log?uuid=${logFile.uuid}`,\n          {\n            method: \"POST\",\n            body: (await logFile.getContent()) as any,\n          },\n        );\n\n        if (response.status === 402 && response.headers.has(\"Retry-After\")) {\n          const retryAfter = parseInt(\n            response.headers.get(\"Retry-After\") ?? \"0\",\n          );\n          if (retryAfter > 0) {\n            this.requestLogger.suspendUntil = Date.now() + retryAfter * 1000;\n            this.requestLogger.clear();\n            return;\n          }\n        }\n\n        if (!response.ok) {\n          throw new HTTPError(response);\n        }\n\n        logFile.delete();\n      } catch (error) {\n        this.requestLogger.retryFileLater(logFile);\n        break;\n      }\n\n      i++;\n      if (i >= 10) break;\n    }\n  }\n\n  private handleHubError(error: unknown) {\n    if (error instanceof HTTPError) {\n      if (error.response.status === 404) {\n        this.logger.error(`Invalid Apitally client ID: '${this.clientId}'`);\n        this.enabled = false;\n        this.stopSync();\n        return true;\n      }\n      if (error.response.status === 422) {\n        this.logger.error(\"Received validation error from Apitally Hub\");\n        return true;\n      }\n    }\n    return false;\n  }\n\n  private async randomDelay() {\n    const delay = 100 + Math.random() * 400;\n    await new Promise((resolve) => setTimeout(resolve, delay));\n  }\n}\n"],"mappings":"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","names":["SYNC_INTERVAL","INITIAL_SYNC_INTERVAL","INITIAL_SYNC_INTERVAL_DURATION","MAX_QUEUE_TIME","HTTPError","Error","response","reason","status","ApitallyClient","clientId","env","instanceUuid","syncDataQueue","syncIntervalId","startupData","startupDataSent","enabled","requestCounter","requestLogger","spanCollector","validationErrorCounter","serverErrorCounter","consumerRegistry","logger","requestLogging","requestLoggingConfig","instance","getLogger","isValidClientId","error","isValidEnv","console","warn","getOrCreateInstanceUuid","RequestCounter","RequestLogger","SpanCollector","config","captureTraces","ValidationErrorCounter","ServerErrorCounter","ConsumerRegistry","handleShutdown","bind","getInstance","isEnabled","shutdown","stopSync","sendSyncData","sendLogData","close","undefined","getHubUrlPrefix","baseURL","process","APITALLY_HUB_BASE_URL","version","sendData","url","payload","fetchWithRetry","fetchRetry","fetch","retries","retryDelay","retryOn","method","body","JSON","stringify","headers","ok","startSync","sync","setInterval","setTimeout","clearInterval","promises","push","sendStartupData","Promise","all","setStartupData","data","debug","instance_uuid","message_uuid","randomUUID","handled","handleHubError","message","newPayload","timestamp","Date","now","requests","getAndResetRequests","validation_errors","getAndResetValidationErrors","server_errors","getAndResetServerErrors","consumers","getAndResetUpdatedConsumers","resources","getCpuMemoryUsage","i","length","shift","randomDelay","rotateFile","logFile","getFile","uuid","getContent","has","retryAfter","parseInt","get","suspendUntil","clear","delete","retryFileLater","delay","Math","random","resolve"]}