{"version":3,"file":"middleware.mjs","sources":["../../../src/services/metrics/middleware.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport type { Sender } from './sender';\n\ninterface State {\n  expires: number;\n  counter: number;\n}\n\nfunction nextResetDate(): number {\n  return Date.now() + 24 * 60 * 60 * 1000; // Now + 24 hours.\n}\n\nconst createMiddleware = ({ sendEvent, strapi }: { sendEvent: Sender; strapi: Core.Strapi }) => {\n  const state: State = {\n    expires: nextResetDate(),\n    counter: 0,\n  };\n\n  const middleware: Core.MiddlewareHandler = async (ctx, next) => {\n    const { url, method } = ctx.request;\n\n    // Only track API requests (skip static assets)\n    const shouldTrack =\n      !url.includes('.') &&\n      url.includes(strapi.config.get('api.rest.prefix')) &&\n      ['GET', 'PUT', 'POST', 'DELETE'].includes(method);\n\n    if (shouldTrack) {\n      // Reset counter if expired\n      if (Date.now() > state.expires) {\n        state.expires = nextResetDate();\n        state.counter = 0;\n      }\n\n      // Track on response finish if under limit\n      // Increment counter immediately to prevent race conditions\n      if (state.counter < 1000) {\n        state.counter += 1;\n\n        let tracked = false;\n        const trackOnFinish = () => {\n          if (tracked) return;\n          tracked = true;\n\n          const statusCode = typeof ctx.response?.status === 'number' ? ctx.response.status : 500;\n          const success = statusCode >= 200 && statusCode < 300;\n\n          // Silently handle tracking errors - telemetry failures shouldn't affect the app\n          Promise.resolve(\n            sendEvent('didReceiveRequest', {\n              eventProperties: {\n                url: ctx.request.url,\n                success,\n                statusCode,\n              },\n            })\n          ).catch(() => {\n            // Ignore tracking errors\n          });\n        };\n\n        // Track when response finishes (success or error)\n        ctx.res.once('finish', trackOnFinish);\n        ctx.res.once('close', trackOnFinish);\n      }\n    }\n\n    await next();\n  };\n\n  return middleware;\n};\n\nexport default createMiddleware;\n"],"names":["nextResetDate","Date","now","createMiddleware","sendEvent","strapi","state","expires","counter","middleware","ctx","next","url","method","request","shouldTrack","includes","config","get","tracked","trackOnFinish","statusCode","response","status","success","Promise","resolve","eventProperties","catch","res","once"],"mappings":"AAQA,SAASA,aAAAA,GAAAA;AACP,IAAA,OAAOC,KAAKC,GAAG,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,GAAK;AACrC;AAEA,MAAMC,mBAAmB,CAAC,EAAEC,SAAS,EAAEC,MAAM,EAA8C,GAAA;AACzF,IAAA,MAAMC,KAAAA,GAAe;QACnBC,OAAAA,EAASP,aAAAA,EAAAA;QACTQ,OAAAA,EAAS;AACX,KAAA;IAEA,MAAMC,UAAAA,GAAqC,OAAOC,GAAAA,EAAKC,IAAAA,GAAAA;AACrD,QAAA,MAAM,EAAEC,GAAG,EAAEC,MAAM,EAAE,GAAGH,IAAII,OAAO;;AAGnC,QAAA,MAAMC,WAAAA,GACJ,CAACH,GAAAA,CAAII,QAAQ,CAAC,GAAA,CAAA,IACdJ,GAAAA,CAAII,QAAQ,CAACX,MAAAA,CAAOY,MAAM,CAACC,GAAG,CAAC,iBAAA,CAAA,CAAA,IAC/B;AAAC,YAAA,KAAA;AAAO,YAAA,KAAA;AAAO,YAAA,MAAA;AAAQ,YAAA;AAAS,SAAA,CAACF,QAAQ,CAACH,MAAAA,CAAAA;AAE5C,QAAA,IAAIE,WAAAA,EAAa;;AAEf,YAAA,IAAId,IAAAA,CAAKC,GAAG,EAAA,GAAKI,KAAAA,CAAMC,OAAO,EAAE;AAC9BD,gBAAAA,KAAAA,CAAMC,OAAO,GAAGP,aAAAA,EAAAA;AAChBM,gBAAAA,KAAAA,CAAME,OAAO,GAAG,CAAA;AAClB,YAAA;;;YAIA,IAAIF,KAAAA,CAAME,OAAO,GAAG,IAAA,EAAM;AACxBF,gBAAAA,KAAAA,CAAME,OAAO,IAAI,CAAA;AAEjB,gBAAA,IAAIW,OAAAA,GAAU,KAAA;AACd,gBAAA,MAAMC,aAAAA,GAAgB,IAAA;AACpB,oBAAA,IAAID,OAAAA,EAAS;oBACbA,OAAAA,GAAU,IAAA;oBAEV,MAAME,UAAAA,GAAa,OAAOX,GAAAA,CAAIY,QAAQ,EAAEC,MAAAA,KAAW,QAAA,GAAWb,GAAAA,CAAIY,QAAQ,CAACC,MAAM,GAAG,GAAA;oBACpF,MAAMC,OAAAA,GAAUH,UAAAA,IAAc,GAAA,IAAOA,UAAAA,GAAa,GAAA;;oBAGlDI,OAAAA,CAAQC,OAAO,CACbtB,SAAAA,CAAU,mBAAA,EAAqB;wBAC7BuB,eAAAA,EAAiB;4BACff,GAAAA,EAAKF,GAAAA,CAAII,OAAO,CAACF,GAAG;AACpBY,4BAAAA,OAAAA;AACAH,4BAAAA;AACF;AACF,qBAAA,CAAA,CAAA,CACAO,KAAK,CAAC,IAAA;;AAER,oBAAA,CAAA,CAAA;AACF,gBAAA,CAAA;;AAGAlB,gBAAAA,GAAAA,CAAImB,GAAG,CAACC,IAAI,CAAC,QAAA,EAAUV,aAAAA,CAAAA;AACvBV,gBAAAA,GAAAA,CAAImB,GAAG,CAACC,IAAI,CAAC,OAAA,EAASV,aAAAA,CAAAA;AACxB,YAAA;AACF,QAAA;QAEA,MAAMT,IAAAA,EAAAA;AACR,IAAA,CAAA;IAEA,OAAOF,UAAAA;AACT;;;;"}