gemi 0.148.0 → 0.149.0

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.
Files changed (29) hide show
  1. package/dist/ai/index.js +1 -1
  2. package/dist/{chunk-95vm1de8.js → chunk-1z619xe0.js} +6 -6
  3. package/dist/{chunk-95vm1de8.js.map → chunk-1z619xe0.js.map} +3 -3
  4. package/dist/{chunk-h34n0w2w.js → chunk-g6a4axhj.js} +1 -1
  5. package/dist/{chunk-56k4fg31.js → chunk-hgz3728r.js} +2 -2
  6. package/dist/{chunk-56k4fg31.js.map → chunk-hgz3728r.js.map} +1 -1
  7. package/dist/{chunk-01tw5f26.js → chunk-k2cj2577.js} +1 -1
  8. package/dist/{chunk-r9arr68h.js → chunk-nb42h4qa.js} +1 -1
  9. package/dist/{chunk-b4pqgz0f.js → chunk-nhdx7cpz.js} +1 -1
  10. package/dist/{chunk-8vx9dws4.js → chunk-pyhgsasa.js} +1 -1
  11. package/dist/facades/index.js +1 -1
  12. package/dist/http/index.js +1 -1
  13. package/dist/i18n/index.js +1 -1
  14. package/dist/kernel/index.js +1 -1
  15. package/dist/server/index.js +1 -1
  16. package/dist/services/index.d.ts +1 -1
  17. package/dist/services/index.d.ts.map +1 -1
  18. package/dist/services/index.js +9 -9
  19. package/dist/services/index.js.map +3 -3
  20. package/dist/services/rate-limiter/drivers/RedisRateLimiterDriver.d.ts +21 -0
  21. package/dist/services/rate-limiter/drivers/RedisRateLimiterDriver.d.ts.map +1 -1
  22. package/dist/services/redis/RedisManager.d.ts +23 -4
  23. package/dist/services/redis/RedisManager.d.ts.map +1 -1
  24. package/package.json +1 -1
  25. /package/dist/{chunk-h34n0w2w.js.map → chunk-g6a4axhj.js.map} +0 -0
  26. /package/dist/{chunk-01tw5f26.js.map → chunk-k2cj2577.js.map} +0 -0
  27. /package/dist/{chunk-r9arr68h.js.map → chunk-nb42h4qa.js.map} +0 -0
  28. /package/dist/{chunk-b4pqgz0f.js.map → chunk-nhdx7cpz.js.map} +0 -0
  29. /package/dist/{chunk-8vx9dws4.js.map → chunk-pyhgsasa.js.map} +0 -0
@@ -24,9 +24,22 @@ export interface RedisRateLimiterOptions {
24
24
  * one (payments, sign-up, anything that costs money per call).
25
25
  */
26
26
  failOpen?: boolean;
27
+ /**
28
+ * How long one `consume` may wait for Redis, in ms, before it gives up and
29
+ * follows `failOpen`. Default `250`. Without it, a request waits as long as
30
+ * the client does: up to the connect timeout and the reconnect loop (10 to
31
+ * 30 s) while Redis is down, and with no limit when Redis stops answering on
32
+ * an open connection. `0` turns it off.
33
+ */
34
+ timeout?: number;
27
35
  /** Called with every Redis failure. Defaults to `console.error`. */
28
36
  onError?: (error: unknown) => void;
29
37
  }
38
+ /** What `onError` gets when a `consume` ran past `timeout`. */
39
+ export declare class RedisRateLimiterTimeoutError extends Error {
40
+ readonly code = "ERR_RATE_LIMITER_TIMEOUT";
41
+ constructor(timeout: number);
42
+ }
30
43
  /**
31
44
  * Rate limiter backed by Redis, so every instance of the app counts against the
32
45
  * same budget. Use it as soon as you run more than one process.
@@ -48,11 +61,19 @@ export declare class RedisRateLimiter extends RateLimiterDriver {
48
61
  private injectedClient?;
49
62
  private prefix;
50
63
  private failOpen;
64
+ private timeout;
51
65
  private onError;
52
66
  /** Cached `SCRIPT LOAD` result, so the script body is sent at most once. */
53
67
  private scriptSha;
54
68
  constructor(options?: RedisRateLimiterOptions);
55
69
  consume(params: ConsumeParams): Promise<RateLimitResult>;
70
+ /**
71
+ * Settles with `work`, or rejects with `RedisRateLimiterTimeoutError` once
72
+ * `timeout` passes. The command itself is not cancelled (Redis may still run
73
+ * the script, so a request that timed out can still be counted); its late
74
+ * outcome is ignored.
75
+ */
76
+ private withTimeout;
56
77
  private get client();
57
78
  /** Runs the script by digest, loading it on first use and after a flush. */
58
79
  private run;
@@ -1 +1 @@
1
- {"version":3,"file":"RedisRateLimiterDriver.d.ts","sourceRoot":"","sources":["../../../../services/rate-limiter/drivers/RedisRateLimiterDriver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oEAAoE;IACpE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC;AAyCD;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,gBAAiB,SAAQ,iBAAiB;IACrD,OAAO,CAAC,cAAc,CAAC,CAAyB;IAChD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,OAAO,CAA2B;IAE1C,4EAA4E;IAC5E,OAAO,CAAC,SAAS,CAAgC;gBAErC,OAAO,GAAE,uBAA4B;IAQ3C,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;IAwD9D,OAAO,KAAK,MAAM,GAuBjB;IAED,4EAA4E;YAC9D,GAAG;IAejB,OAAO,CAAC,IAAI;CAcb"}
1
+ {"version":3,"file":"RedisRateLimiterDriver.d.ts","sourceRoot":"","sources":["../../../../services/rate-limiter/drivers/RedisRateLimiterDriver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC;AAED,+DAA+D;AAC/D,qBAAa,4BAA6B,SAAQ,KAAK;IACrD,QAAQ,CAAC,IAAI,8BAA8B;gBAE/B,OAAO,EAAE,MAAM;CAI5B;AAyCD;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,gBAAiB,SAAQ,iBAAiB;IACrD,OAAO,CAAC,cAAc,CAAC,CAAyB;IAChD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAA2B;IAE1C,4EAA4E;IAC5E,OAAO,CAAC,SAAS,CAAgC;gBAErC,OAAO,GAAE,uBAA4B;IAS3C,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;IA0D9D;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAkBnB,OAAO,KAAK,MAAM,GAuBjB;IAED,4EAA4E;YAC9D,GAAG;IAejB,OAAO,CAAC,IAAI;CAcb"}
@@ -4,13 +4,30 @@ export declare class RedisManager {
4
4
  config: RedisConfig;
5
5
  static token: string;
6
6
  private instance;
7
+ /** When the connect the manager started on `instance` began, while it is pending. */
8
+ private connectingSince;
9
+ /** When `instance` was first seen down, after its connect settled. */
10
+ private downSince;
11
+ /** How long a client must be down before it is replaced. */
12
+ private replaceDelay;
7
13
  constructor(config?: RedisConfig);
8
14
  /**
9
- * Bun's Redis client. Built on first access and memoized.
15
+ * Bun's Redis client. Built on first access and memoized; building it starts
16
+ * the connection, which the first command would do anyway.
10
17
  *
11
- * It connects lazily on the first command, so building it here is safe even
12
- * when Redis isn't running or configured — nothing connects until something
13
- * actually issues a command.
18
+ * Once Bun's client gives up on a connection (a connect timeout, or
19
+ * `maxRetries` reconnects in a row) it never connects again, and every later
20
+ * command fails at once with `Connection has failed`, even after Redis is
21
+ * back (#982); calling its `connect()` again can hang. So an access that
22
+ * finds the client down replaces it: the old one is closed and a new one
23
+ * built. A client is down when it is not connected and no connect the
24
+ * manager started on it is still pending. It gets a grace period first, so a
25
+ * blip that Bun's own reconnect covers costs nothing: 0.5 s, doubling with
26
+ * each replacement that does not connect, up to 10 s, and back to 0.5 s once
27
+ * one connects. So a Redis that stays down is tried at most every 10 s.
28
+ *
29
+ * Read `client` each time rather than keeping it: a kept reference can be a
30
+ * client that was replaced and closed.
14
31
  */
15
32
  get client(): RedisClient;
16
33
  /**
@@ -27,5 +44,7 @@ export declare class RedisManager {
27
44
  * Does not build one to close it.
28
45
  */
29
46
  close(): void;
47
+ private build;
48
+ private isDown;
30
49
  }
31
50
  //# sourceMappingURL=RedisManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RedisManager.d.ts","sourceRoot":"","sources":["../../../services/redis/RedisManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,KAAK,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAsB5C,qBAAa,YAAY;IAKJ,MAAM,EAAE,WAAW;IAJtC,MAAM,CAAC,KAAK,SAAW;IAEvB,OAAO,CAAC,QAAQ,CAA4B;gBAEzB,MAAM,GAAE,WAAgB;IAE3C;;;;;;OAMG;IACH,IAAI,MAAM,IAAI,WAAW,CAKxB;IAED;;;;;;;OAOG;IACH,IAAI,MAAM,CAAC,MAAM,EAAE,WAAW,EAE7B;IAED;;;OAGG;IACH,KAAK,IAAI,IAAI;CAKd"}
1
+ {"version":3,"file":"RedisManager.d.ts","sourceRoot":"","sources":["../../../services/redis/RedisManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,KAAK,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AA+B5C,qBAAa,YAAY;IAYJ,MAAM,EAAE,WAAW;IAXtC,MAAM,CAAC,KAAK,SAAW;IAEvB,OAAO,CAAC,QAAQ,CAA4B;IAE5C,qFAAqF;IACrF,OAAO,CAAC,eAAe,CAAuB;IAC9C,sEAAsE;IACtE,OAAO,CAAC,SAAS,CAAuB;IACxC,4DAA4D;IAC5D,OAAO,CAAC,YAAY,CAAwB;gBAEzB,MAAM,GAAE,WAAgB;IAE3C;;;;;;;;;;;;;;;;;OAiBG;IACH,IAAI,MAAM,IAAI,WAAW,CAYxB;IAED;;;;;;;OAOG;IACH,IAAI,MAAM,CAAC,MAAM,EAAE,WAAW,EAK7B;IAED;;;OAGG;IACH,KAAK,IAAI,IAAI;IASb,OAAO,CAAC,KAAK;IAqCb,OAAO,CAAC,MAAM;CAqBf"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gemi",
3
- "version": "0.148.0",
3
+ "version": "0.149.0",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "author": "Enes Tufekci <enes@gemijs.dev>",