{
  "version": 3,
  "sources": ["../../../../src/workers/ratelimit/ratelimit-object.worker.ts"],
  "sourcesContent": ["// Durable Object backing the emulated Ratelimit binding. Moving bucket/epoch\n// state here (instead of an in-memory object behind a `wrapped` binding)\n// means it's automatically torn down by `deleteAllDurableObjects()`, so\n// vitest-pool-workers' `reset()` clears it for free.\nimport { MiniflareDurableObject, POST } from \"miniflare:shared\";\nimport type { RouteHandler } from \"miniflare:shared\";\n\ninterface LimitRequestBody {\n\tkey: string;\n\tlimit: number;\n\tperiod: number;\n}\n\ninterface LimitResult {\n\tsuccess: boolean;\n}\n\nexport class RateLimiterObject extends MiniflareDurableObject {\n\t#buckets = new Map<string, number>();\n\t#epoch = 0;\n\n\t@POST(\"/limit\")\n\tlimit: RouteHandler = async (req) => {\n\t\tconst { key, limit, period } = await req.json<LimitRequestBody>();\n\n\t\tconst epoch = Math.floor(Date.now() / (period * 1000));\n\t\tif (epoch !== this.#epoch) {\n\t\t\tthis.#epoch = epoch;\n\t\t\tthis.#buckets.clear();\n\t\t}\n\n\t\tconst value = this.#buckets.get(key) ?? 0;\n\t\tif (value >= limit) {\n\t\t\treturn Response.json({ success: false } satisfies LimitResult);\n\t\t}\n\t\tthis.#buckets.set(key, value + 1);\n\t\treturn Response.json({ success: true } satisfies LimitResult);\n\t};\n}\n"],
  "mappings": ";;;;;;;;;AAIA,SAAS,wBAAwB,YAAY;AAatC,IAAM,oBAAN,cAAgC,uBAAuB;AAAA,EAC7D,WAAW,oBAAI,IAAoB;AAAA,EACnC,SAAS;AAAA,EAGT,QAAsB,OAAO,QAAQ;AACpC,QAAM,EAAE,KAAK,OAAO,OAAO,IAAI,MAAM,IAAI,KAAuB,GAE1D,QAAQ,KAAK,MAAM,KAAK,IAAI,KAAK,SAAS,IAAK;AACrD,IAAI,UAAU,KAAK,WAClB,KAAK,SAAS,OACd,KAAK,SAAS,MAAM;AAGrB,QAAM,QAAQ,KAAK,SAAS,IAAI,GAAG,KAAK;AACxC,WAAI,SAAS,QACL,SAAS,KAAK,EAAE,SAAS,GAAM,CAAuB,KAE9D,KAAK,SAAS,IAAI,KAAK,QAAQ,CAAC,GACzB,SAAS,KAAK,EAAE,SAAS,GAAK,CAAuB;AAAA,EAC7D;AACD;AAhBC;AAAA,EADC,KAAK,QAAQ;AAAA,GAJF,kBAKZ;",
  "names": []
}
