{"version":3,"file":"createEventRateLimiter.mjs","names":[],"sources":["../../../src/domain/eventRateLimiter/createEventRateLimiter.ts"],"sourcesContent":["import { ONE_MINUTE, clocksNow } from '@openobserve/js-core/time'\nimport { setTimeout } from '../../tools/timer'\nimport type { RawError } from '../error/error.types'\nimport { ErrorSource } from '../error/error.types'\n\nexport type EventRateLimiter = ReturnType<typeof createEventRateLimiter>\n\n// Limit the maximum number of actions, errors and logs per minutes\nconst EVENT_RATE_LIMIT = 3000\n\nexport function createEventRateLimiter(\n  eventType: string,\n  onLimitReached: (limitError: RawError) => void,\n  limit = EVENT_RATE_LIMIT\n) {\n  let eventCount = 0\n  let allowNextEvent = false\n\n  return {\n    isLimitReached() {\n      if (eventCount === 0) {\n        setTimeout(() => {\n          eventCount = 0\n        }, ONE_MINUTE)\n      }\n\n      eventCount += 1\n      if (eventCount <= limit || allowNextEvent) {\n        allowNextEvent = false\n        return false\n      }\n\n      if (eventCount === limit + 1) {\n        allowNextEvent = true\n        try {\n          onLimitReached({\n            message: `Reached max number of ${eventType}s by minute: ${limit}`,\n            source: ErrorSource.AGENT,\n            startClocks: clocksNow(),\n          })\n        } finally {\n          allowNextEvent = false\n        }\n      }\n\n      return true\n    },\n  }\n}\n"],"mappings":";;;;AAQA,MAAM,mBAAmB;AAEzB,SAAgB,uBACd,WACA,gBACA,QAAQ,kBACR;CACA,IAAI,aAAa;CACjB,IAAI,iBAAiB;CAErB,OAAO,EACL,iBAAiB;EACf,IAAI,eAAe,GACjB,iBAAiB;GACf,aAAa;EACf,GAAG,UAAU;EAGf,cAAc;EACd,IAAI,cAAc,SAAS,gBAAgB;GACzC,iBAAiB;GACjB,OAAO;EACT;EAEA,IAAI,eAAe,QAAQ,GAAG;GAC5B,iBAAiB;GACjB,IAAI;IACF,eAAe;KACb,SAAS,yBAAyB,UAAU,eAAe;KAC3D,QAAQ,YAAY;KACpB,aAAa,UAAU;IACzB,CAAC;GACH,UAAU;IACR,iBAAiB;GACnB;EACF;EAEA,OAAO;CACT,EACF;AACF"}