@shivaedev/rate-limit 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.1 - 2026-11-02
4
+
5
+ ### Changed
6
+
7
+ - Update `@shivaedev/sql` from 0.32.0 to 0.33.0.
8
+
9
+ ## 0.2.0 - 2026-11-02
10
+
11
+ ### Added
12
+
13
+ - `@shivaedev/errors`' shared `TooManyRequests` accepts optional `key` and `retryAt` fields, preserving rate-limit details across RPC while still accepting message-only failures.
14
+
15
+ ### Breaking
16
+
17
+ - `@shivaedev/rate-limit` now fails with the shared `TooManyRequests`. Replace imports from `@shivaedev/rate-limit/TooManyRequests.ts` with `@shivaedev/errors/taxonomy.ts` and add `@shivaedev/errors` as a dependency. Use that shared schema in contract rejections and custom stores. Its `key` and `retryAt` fields are optional because other callers can create message-only failures; check for their presence before using them. The limiter continues to supply both fields. The old module is removed without an alias.
18
+
3
19
  ## 0.1.0 - 2026-11-01
4
20
 
5
21
  ### Added
package/README.md CHANGED
@@ -40,14 +40,14 @@ The migration creates `rate_limit_windows`. PostgreSQL retains one row per key;
40
40
 
41
41
  `rateLimit({ key, per, window })` reads `Store` from the environment and returns `void`. `per` must be a positive safe integer and `window` a finite positive Effect duration; invalid policies die with `RangeError`.
42
42
 
43
- `TooManyRequests`, from `@shivaedev/rate-limit/TooManyRequests.ts`, is an Effect Schema tagged error with `key`, `message` and `retryAt`. The retry time is Unix epoch milliseconds. Declare this schema in a contract's rejections to preserve it across RPC. Applications choose the message shown to the user and whether to retry. Refusals are immediate; the limiter does not sleep or queue callers.
43
+ `TooManyRequests`, from `@shivaedev/errors/taxonomy.ts`, is an Effect Schema tagged error with `message` and optional `key` and `retryAt` fields. Both built-in stores supply `key` and `retryAt` on every refusal. The retry time is Unix epoch milliseconds. Declare this schema in a contract's rejections to preserve it across RPC. Applications choose the message shown to the user and whether to retry. Refusals are immediate; the limiter does not sleep or queue callers.
44
44
 
45
45
  A custom store implements `Store.consume` from `@shivaedev/rate-limit/Store.ts`, atomically consuming a `WindowRequest` or failing with `TooManyRequests` or `StoreError`. A store owns its clock and consistency boundary.
46
46
 
47
47
  ### Install
48
48
 
49
49
  ```sh
50
- pnpm add @shivaedev/rate-limit effect
50
+ pnpm add @shivaedev/rate-limit @shivaedev/errors effect
51
51
  ```
52
52
 
53
53
  For PostgreSQL, also install `@shivaedev/sql` and its PostgreSQL driver peer. Applications depending on `@shivaedev/platform` reach the limiter through the framework hoist.
package/dist/Store.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Context, type Effect } from "effect";
2
- import type { TooManyRequests } from "#TooManyRequests.ts";
2
+ import type { TooManyRequests } from "@shivaedev/errors/taxonomy.ts";
3
3
  declare const StoreError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
4
4
  readonly _tag: "RateLimitStoreError";
5
5
  } & Readonly<A>;
@@ -1 +1 @@
1
- {"version":3,"file":"Store.d.ts","sourceRoot":"","sources":["../src/Store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;;;;AAE3D,qBAAa,UAAW,SAAQ,gBAAwC;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;CAAG;AAEvG,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC9B;;sBAKmB,CAAC,OAAO,EAAE,aAAa,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,UAAU,CAAC;;AAHjG,qBAAa,KAAM,SAAQ,UAKO;CAAG"}
1
+ {"version":3,"file":"Store.d.ts","sourceRoot":"","sources":["../src/Store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;;;;AAErE,qBAAa,UAAW,SAAQ,gBAAwC;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;CAAG;AAEvG,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC9B;;sBAKmB,CAAC,OAAO,EAAE,aAAa,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,UAAU,CAAC;;AAHjG,qBAAa,KAAM,SAAQ,UAKO;CAAG"}
@@ -1 +1 @@
1
- {"version":3,"file":"postgresStore.d.ts","sourceRoot":"","sources":["../../src/adapters/postgresStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,UAAU,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,KAAK,EAAkC,MAAM,WAAW,CAAC;AAGlE,eAAO,MAAM,aAAa,wEAmCzB,CAAC"}
1
+ {"version":3,"file":"postgresStore.d.ts","sourceRoot":"","sources":["../../src/adapters/postgresStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,UAAU,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAIvC,OAAO,EAAE,KAAK,EAAkC,MAAM,WAAW,CAAC;AAElE,eAAO,MAAM,aAAa,wEAmCzB,CAAC"}
@@ -1,10 +1,10 @@
1
1
  import { Effect, Layer } from "effect";
2
2
  import * as Reactivity from "effect/reactivity/Reactivity";
3
3
  import { SqlClient } from "effect/sql";
4
+ import { TooManyRequests } from "@shivaedev/errors/taxonomy.ts";
4
5
  import { advisoryXactLock } from "@shivaedev/sql/advisoryXactLock.ts";
5
6
  import { transact } from "@shivaedev/sql/transact.ts";
6
7
  import { Store, StoreError } from "#Store.ts";
7
- import { TooManyRequests } from "#TooManyRequests.ts";
8
8
  export const postgresStore = Layer.effect(Store)(Effect.gen(function* () {
9
9
  const sql = (yield* SqlClient.SqlClient).withoutTransforms();
10
10
  const reactivity = yield* Reactivity.Reactivity;
@@ -1 +1 @@
1
- {"version":3,"file":"postgresStore.js","sourceRoot":"","sources":["../../src/adapters/postgresStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,UAAU,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAsB,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAC/C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACnB,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,iBAAiB,EAAE,CAAC;IAC7D,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;IAChD,OAAO;QACN,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,YAAY,EAAiB,EAAE,EAAE,CACtD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YACnB,KAAK,CAAC,CAAC,gBAAgB,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,gCAAgC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5H,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAiB,8EAA8E,CAAC;YAC1H,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;YACrE,CAAC;YACD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;YACtB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAuB;cACrC,GAAG,QAAQ,GAAG,GAAG,YAAY;;0DAEe,GAAG;+DACE,GAAG,SAAS,GAAG,GAAG,YAAY;6CAChD,GAAG,kCAAkC,GAAG;wCAC7C,CAAC;YACpC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,OAAO;YACR,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAuB,wEAAwE,GAAG,EAAE,CAAC;YAC/H,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC;YACnF,CAAC;YACD,OAAO,KAAK,CAAC,CAAC,IAAI,eAAe,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QACtG,CAAC,CAAC,CAAC,IAAI,CACN,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAC9D,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,EAC/C,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CACxD;KACF,CAAC;AACH,CAAC,CAAC,CACF,CAAC"}
1
+ {"version":3,"file":"postgresStore.js","sourceRoot":"","sources":["../../src/adapters/postgresStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,UAAU,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAsB,MAAM,WAAW,CAAC;AAElE,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAC/C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACnB,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,iBAAiB,EAAE,CAAC;IAC7D,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;IAChD,OAAO;QACN,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,YAAY,EAAiB,EAAE,EAAE,CACtD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YACnB,KAAK,CAAC,CAAC,gBAAgB,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,gCAAgC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5H,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAiB,8EAA8E,CAAC;YAC1H,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;YACrE,CAAC;YACD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;YACtB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAuB;cACrC,GAAG,QAAQ,GAAG,GAAG,YAAY;;0DAEe,GAAG;+DACE,GAAG,SAAS,GAAG,GAAG,YAAY;6CAChD,GAAG,kCAAkC,GAAG;wCAC7C,CAAC;YACpC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,OAAO;YACR,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAuB,wEAAwE,GAAG,EAAE,CAAC;YAC/H,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC;YACnF,CAAC;YACD,OAAO,KAAK,CAAC,CAAC,IAAI,eAAe,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QACtG,CAAC,CAAC,CAAC,IAAI,CACN,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAC9D,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,EAC/C,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CACxD;KACF,CAAC;AACH,CAAC,CAAC,CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"memoryStore.d.ts","sourceRoot":"","sources":["../src/memoryStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAsB,MAAM,WAAW,CAAC;AAQtD,eAAO,MAAM,WAAW,kCAuBvB,CAAC"}
1
+ {"version":3,"file":"memoryStore.d.ts","sourceRoot":"","sources":["../src/memoryStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,KAAK,EAAsB,MAAM,WAAW,CAAC;AAOtD,eAAO,MAAM,WAAW,kCAuBvB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { Clock, Effect, Layer } from "effect";
2
+ import { TooManyRequests } from "@shivaedev/errors/taxonomy.ts";
2
3
  import { Store } from "#Store.ts";
3
- import { TooManyRequests } from "#TooManyRequests.ts";
4
4
  export const memoryStore = Layer.effect(Store)(Effect.sync(() => {
5
5
  const windows = new Map();
6
6
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"memoryStore.js","sourceRoot":"","sources":["../src/memoryStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAsB,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAOtD,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAC7C,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;IAChB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,OAAO;QACN,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,YAAY,EAAiB;YAC7F,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;YAC3C,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;gBACjC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;oBACrC,IAAI,KAAK,CAAC,SAAS,IAAI,GAAG,EAAE,CAAC;wBAC5B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBACtB,CAAC;gBACF,CAAC;gBACD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,GAAG,YAAY,EAAE,CAAC;gBAC9E,IAAI,KAAK,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC;oBACxB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;gBAC5G,CAAC;gBACD,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACxB,OAAO,MAAM,CAAC,IAAI,CAAC;YACpB,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC;KACF,CAAC;AACH,CAAC,CAAC,CACF,CAAC"}
1
+ {"version":3,"file":"memoryStore.js","sourceRoot":"","sources":["../src/memoryStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,KAAK,EAAsB,MAAM,WAAW,CAAC;AAOtD,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAC7C,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;IAChB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,OAAO;QACN,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,YAAY,EAAiB;YAC7F,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;YAC3C,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;gBACjC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;oBACrC,IAAI,KAAK,CAAC,SAAS,IAAI,GAAG,EAAE,CAAC;wBAC5B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBACtB,CAAC;gBACF,CAAC;gBACD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,GAAG,YAAY,EAAE,CAAC;gBAC9E,IAAI,KAAK,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC;oBACxB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;gBAC5G,CAAC;gBACD,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACxB,OAAO,MAAM,CAAC,IAAI,CAAC;YACpB,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC;KACF,CAAC;AACH,CAAC,CAAC,CACF,CAAC"}
@@ -5,5 +5,5 @@ export interface RateLimitOptions {
5
5
  readonly per: number;
6
6
  readonly window: Duration.Input;
7
7
  }
8
- export declare const rateLimit: (args_0: RateLimitOptions) => Effect.Effect<undefined, import("#Store.ts").StoreError | import("./TooManyRequests.ts").TooManyRequests, Store>;
8
+ export declare const rateLimit: (args_0: RateLimitOptions) => Effect.Effect<undefined, import("#Store.ts").StoreError | import("@shivaedev/errors/taxonomy.ts").TooManyRequests, Store>;
9
9
  //# sourceMappingURL=rateLimit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rateLimit.d.ts","sourceRoot":"","sources":["../src/rateLimit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC;CAChC;AAED,eAAO,MAAM,SAAS,gJAOpB,CAAC"}
1
+ {"version":3,"file":"rateLimit.d.ts","sourceRoot":"","sources":["../src/rateLimit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC;CAChC;AAED,eAAO,MAAM,SAAS,yJAOpB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shivaedev/rate-limit",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "Per-key rate limits with memory and PostgreSQL stores for Effect applications",
5
5
  "keywords": [
6
6
  "effect"
@@ -44,19 +44,21 @@
44
44
  "CHANGELOG.md",
45
45
  "README.md"
46
46
  ],
47
- "dependencies": {},
47
+ "dependencies": {
48
+ "@shivaedev/errors": "0.5.0"
49
+ },
48
50
  "devDependencies": {
49
- "@shivaedev/quality": "0.54.0",
50
- "@shivaedev/sql": "0.31.0",
51
- "@shivaedev/test-sql": "0.16.0",
52
- "@shivaedev/test-story": "0.32.0",
51
+ "@shivaedev/quality": "0.56.0",
52
+ "@shivaedev/sql": "0.33.0",
53
+ "@shivaedev/test-sql": "0.16.2",
54
+ "@shivaedev/test-story": "0.34.0",
53
55
  "@types/node": "24.19.2",
54
56
  "effect": "4.0.6",
55
57
  "typescript": "7.0.2",
56
58
  "vitest": "5.0.5"
57
59
  },
58
60
  "peerDependencies": {
59
- "@shivaedev/sql": "0.31.0",
61
+ "@shivaedev/sql": "0.33.0",
60
62
  "effect": "4.0.6"
61
63
  },
62
64
  "peerDependenciesMeta": {
package/src/Store.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Context, Data, type Effect } from "effect";
2
- import type { TooManyRequests } from "#TooManyRequests.ts";
2
+ import type { TooManyRequests } from "@shivaedev/errors/taxonomy.ts";
3
3
 
4
4
  export class StoreError extends Data.TaggedError("RateLimitStoreError")<{ readonly cause: unknown }> {}
5
5
 
@@ -1,10 +1,10 @@
1
1
  import { Effect, Layer } from "effect";
2
2
  import * as Reactivity from "effect/reactivity/Reactivity";
3
3
  import { SqlClient } from "effect/sql";
4
+ import { TooManyRequests } from "@shivaedev/errors/taxonomy.ts";
4
5
  import { advisoryXactLock } from "@shivaedev/sql/advisoryXactLock.ts";
5
6
  import { transact } from "@shivaedev/sql/transact.ts";
6
7
  import { Store, StoreError, type WindowRequest } from "#Store.ts";
7
- import { TooManyRequests } from "#TooManyRequests.ts";
8
8
 
9
9
  export const postgresStore = Layer.effect(Store)(
10
10
  Effect.gen(function* () {
@@ -1,6 +1,6 @@
1
1
  import { Clock, Effect, Layer } from "effect";
2
+ import { TooManyRequests } from "@shivaedev/errors/taxonomy.ts";
2
3
  import { Store, type WindowRequest } from "#Store.ts";
3
- import { TooManyRequests } from "#TooManyRequests.ts";
4
4
 
5
5
  interface Window {
6
6
  count: number;
@@ -1,10 +0,0 @@
1
- import { Schema } from "effect";
2
- declare const TooManyRequests_base: Schema.Class<TooManyRequests, Schema.TaggedStruct<"TooManyRequests", {
3
- readonly key: Schema.String;
4
- readonly message: Schema.String;
5
- readonly retryAt: Schema.Number;
6
- }>, import("effect/Cause").YieldableError>;
7
- export declare class TooManyRequests extends TooManyRequests_base {
8
- }
9
- export {};
10
- //# sourceMappingURL=TooManyRequests.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TooManyRequests.d.ts","sourceRoot":"","sources":["../src/TooManyRequests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;;;;;;AAEhC,qBAAa,eAAgB,SAAQ,oBAInC;CAAG"}
@@ -1,8 +0,0 @@
1
- import { Schema } from "effect";
2
- export class TooManyRequests extends Schema.TaggedError()("TooManyRequests", {
3
- key: Schema.String,
4
- message: Schema.String,
5
- retryAt: Schema.Number,
6
- }) {
7
- }
8
- //# sourceMappingURL=TooManyRequests.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TooManyRequests.js","sourceRoot":"","sources":["../src/TooManyRequests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,OAAO,eAAgB,SAAQ,MAAM,CAAC,WAAW,EAAmB,CAAC,iBAAiB,EAAE;IAC7F,GAAG,EAAE,MAAM,CAAC,MAAM;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM;CACtB,CAAC;CAAG"}
@@ -1,7 +0,0 @@
1
- import { Schema } from "effect";
2
-
3
- export class TooManyRequests extends Schema.TaggedError<TooManyRequests>()("TooManyRequests", {
4
- key: Schema.String,
5
- message: Schema.String,
6
- retryAt: Schema.Number,
7
- }) {}