@libp2p/utils 6.6.5-2a7425cdb → 6.6.5-307d0ba58

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.
@@ -3,6 +3,8 @@ import type { ClearableSignal } from 'any-signal';
3
3
  export declare const DEFAULT_TIMEOUT_MULTIPLIER = 1.2;
4
4
  export declare const DEFAULT_FAILURE_MULTIPLIER = 2;
5
5
  export declare const DEFAULT_MIN_TIMEOUT = 5000;
6
+ export declare const DEFAULT_MAX_TIMEOUT = 60000;
7
+ export declare const DEFAULT_INTERVAL = 5000;
6
8
  export interface AdaptiveTimeoutSignal extends ClearableSignal {
7
9
  start: number;
8
10
  timeout: number;
@@ -14,6 +16,7 @@ export interface AdaptiveTimeoutInit {
14
16
  timeoutMultiplier?: number;
15
17
  failureMultiplier?: number;
16
18
  minTimeout?: number;
19
+ maxTimeout?: number;
17
20
  }
18
21
  export interface GetTimeoutSignalOptions {
19
22
  timeoutFactor?: number;
@@ -27,6 +30,7 @@ export declare class AdaptiveTimeout {
27
30
  private readonly timeoutMultiplier;
28
31
  private readonly failureMultiplier;
29
32
  private readonly minTimeout;
33
+ private readonly maxTimeout;
30
34
  constructor(init?: AdaptiveTimeoutInit);
31
35
  getTimeoutSignal(options?: GetTimeoutSignalOptions): AdaptiveTimeoutSignal;
32
36
  cleanUp(signal: AdaptiveTimeoutSignal): void;
@@ -1 +1 @@
1
- {"version":3,"file":"adaptive-timeout.d.ts","sourceRoot":"","sources":["../../src/adaptive-timeout.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAe,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD,eAAO,MAAM,0BAA0B,MAAM,CAAA;AAC7C,eAAO,MAAM,0BAA0B,IAAI,CAAA;AAC3C,eAAO,MAAM,mBAAmB,OAAO,CAAA;AAEvC,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAC5D,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAe;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAQ;IAC1C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAQ;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;gBAEtB,IAAI,GAAE,mBAAwB;IAa3C,gBAAgB,CAAE,OAAO,GAAE,uBAA4B,GAAG,qBAAqB;IAiB/E,OAAO,CAAE,MAAM,EAAE,qBAAqB,GAAG,IAAI;CAyB9C"}
1
+ {"version":3,"file":"adaptive-timeout.d.ts","sourceRoot":"","sources":["../../src/adaptive-timeout.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAe,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD,eAAO,MAAM,0BAA0B,MAAM,CAAA;AAC7C,eAAO,MAAM,0BAA0B,IAAI,CAAA;AAC3C,eAAO,MAAM,mBAAmB,OAAQ,CAAA;AACxC,eAAO,MAAM,mBAAmB,QAAS,CAAA;AACzC,eAAO,MAAM,gBAAgB,OAAQ,CAAA;AAErC,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAC5D,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAe;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAQ;IAC1C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAQ;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;gBAEtB,IAAI,GAAE,mBAAwB;IAe3C,gBAAgB,CAAE,OAAO,GAAE,uBAA4B,GAAG,qBAAqB;IAuB/E,OAAO,CAAE,MAAM,EAAE,qBAAqB,GAAG,IAAI;CAyB9C"}
@@ -3,7 +3,9 @@ import { anySignal } from 'any-signal';
3
3
  import { MovingAverage } from './moving-average.js';
4
4
  export const DEFAULT_TIMEOUT_MULTIPLIER = 1.2;
5
5
  export const DEFAULT_FAILURE_MULTIPLIER = 2;
6
- export const DEFAULT_MIN_TIMEOUT = 5000;
6
+ export const DEFAULT_MIN_TIMEOUT = 5_000;
7
+ export const DEFAULT_MAX_TIMEOUT = 60_000;
8
+ export const DEFAULT_INTERVAL = 5_000;
7
9
  export class AdaptiveTimeout {
8
10
  success;
9
11
  failure;
@@ -12,13 +14,16 @@ export class AdaptiveTimeout {
12
14
  timeoutMultiplier;
13
15
  failureMultiplier;
14
16
  minTimeout;
17
+ maxTimeout;
15
18
  constructor(init = {}) {
16
- this.success = new MovingAverage(init.interval ?? 5000);
17
- this.failure = new MovingAverage(init.interval ?? 5000);
18
- this.next = new MovingAverage(init.interval ?? 5000);
19
+ const interval = init.interval ?? DEFAULT_INTERVAL;
20
+ this.success = new MovingAverage(interval);
21
+ this.failure = new MovingAverage(interval);
22
+ this.next = new MovingAverage(interval);
19
23
  this.failureMultiplier = init.failureMultiplier ?? DEFAULT_FAILURE_MULTIPLIER;
20
24
  this.timeoutMultiplier = init.timeoutMultiplier ?? DEFAULT_TIMEOUT_MULTIPLIER;
21
25
  this.minTimeout = init.minTimeout ?? DEFAULT_MIN_TIMEOUT;
26
+ this.maxTimeout = init.maxTimeout ?? DEFAULT_MAX_TIMEOUT;
22
27
  if (init.metricName != null) {
23
28
  this.metric = init.metrics?.registerMetricGroup(init.metricName);
24
29
  }
@@ -26,7 +31,13 @@ export class AdaptiveTimeout {
26
31
  getTimeoutSignal(options = {}) {
27
32
  // calculate timeout for individual peers based on moving average of
28
33
  // previous successful requests
29
- const timeout = Math.max(Math.round(this.next.movingAverage * (options.timeoutFactor ?? this.timeoutMultiplier)), this.minTimeout);
34
+ let timeout = Math.round(this.next.movingAverage * (options.timeoutFactor ?? this.timeoutMultiplier));
35
+ if (timeout < this.minTimeout) {
36
+ timeout = this.minTimeout;
37
+ }
38
+ if (timeout > this.maxTimeout) {
39
+ timeout = this.maxTimeout;
40
+ }
30
41
  const sendTimeout = AbortSignal.timeout(timeout);
31
42
  const timeoutSignal = anySignal([options.signal, sendTimeout]);
32
43
  setMaxListeners(Infinity, timeoutSignal, sendTimeout);
@@ -1 +1 @@
1
- {"version":3,"file":"adaptive-timeout.js","sourceRoot":"","sources":["../../src/adaptive-timeout.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adaptive-timeout.js","sourceRoot":"","sources":["../../src/adaptive-timeout.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@libp2p/utils",
3
- "version": "6.6.5-2a7425cdb",
3
+ "version": "6.6.5-307d0ba58",
4
4
  "description": "Package to aggregate shared logic and dependencies for the libp2p ecosystem",
5
5
  "license": "Apache-2.0 OR MIT",
6
6
  "homepage": "https://github.com/libp2p/js-libp2p/tree/main/packages/utils#readme",
@@ -191,9 +191,9 @@
191
191
  "dependencies": {
192
192
  "@chainsafe/is-ip": "^2.1.0",
193
193
  "@chainsafe/netmask": "^2.0.0",
194
- "@libp2p/crypto": "5.1.4-2a7425cdb",
195
- "@libp2p/interface": "2.10.2-2a7425cdb",
196
- "@libp2p/logger": "5.1.18-2a7425cdb",
194
+ "@libp2p/crypto": "5.1.4-307d0ba58",
195
+ "@libp2p/interface": "2.10.2-307d0ba58",
196
+ "@libp2p/logger": "5.1.18-307d0ba58",
197
197
  "@multiformats/multiaddr": "^12.4.0",
198
198
  "@sindresorhus/fnv1a": "^3.1.0",
199
199
  "any-signal": "^4.1.1",
@@ -213,7 +213,7 @@
213
213
  "uint8arrays": "^5.1.0"
214
214
  },
215
215
  "devDependencies": {
216
- "@libp2p/peer-id": "5.1.5-2a7425cdb",
216
+ "@libp2p/peer-id": "5.1.5-307d0ba58",
217
217
  "@types/netmask": "^2.0.5",
218
218
  "aegir": "^47.0.14",
219
219
  "benchmark": "^2.1.4",
@@ -6,7 +6,9 @@ import type { ClearableSignal } from 'any-signal'
6
6
 
7
7
  export const DEFAULT_TIMEOUT_MULTIPLIER = 1.2
8
8
  export const DEFAULT_FAILURE_MULTIPLIER = 2
9
- export const DEFAULT_MIN_TIMEOUT = 5000
9
+ export const DEFAULT_MIN_TIMEOUT = 5_000
10
+ export const DEFAULT_MAX_TIMEOUT = 60_000
11
+ export const DEFAULT_INTERVAL = 5_000
10
12
 
11
13
  export interface AdaptiveTimeoutSignal extends ClearableSignal {
12
14
  start: number
@@ -20,6 +22,7 @@ export interface AdaptiveTimeoutInit {
20
22
  timeoutMultiplier?: number
21
23
  failureMultiplier?: number
22
24
  minTimeout?: number
25
+ maxTimeout?: number
23
26
  }
24
27
 
25
28
  export interface GetTimeoutSignalOptions {
@@ -35,14 +38,17 @@ export class AdaptiveTimeout {
35
38
  private readonly timeoutMultiplier: number
36
39
  private readonly failureMultiplier: number
37
40
  private readonly minTimeout: number
41
+ private readonly maxTimeout: number
38
42
 
39
43
  constructor (init: AdaptiveTimeoutInit = {}) {
40
- this.success = new MovingAverage(init.interval ?? 5000)
41
- this.failure = new MovingAverage(init.interval ?? 5000)
42
- this.next = new MovingAverage(init.interval ?? 5000)
44
+ const interval = init.interval ?? DEFAULT_INTERVAL
45
+ this.success = new MovingAverage(interval)
46
+ this.failure = new MovingAverage(interval)
47
+ this.next = new MovingAverage(interval)
43
48
  this.failureMultiplier = init.failureMultiplier ?? DEFAULT_FAILURE_MULTIPLIER
44
49
  this.timeoutMultiplier = init.timeoutMultiplier ?? DEFAULT_TIMEOUT_MULTIPLIER
45
50
  this.minTimeout = init.minTimeout ?? DEFAULT_MIN_TIMEOUT
51
+ this.maxTimeout = init.maxTimeout ?? DEFAULT_MAX_TIMEOUT
46
52
 
47
53
  if (init.metricName != null) {
48
54
  this.metric = init.metrics?.registerMetricGroup(init.metricName)
@@ -52,10 +58,16 @@ export class AdaptiveTimeout {
52
58
  getTimeoutSignal (options: GetTimeoutSignalOptions = {}): AdaptiveTimeoutSignal {
53
59
  // calculate timeout for individual peers based on moving average of
54
60
  // previous successful requests
55
- const timeout = Math.max(
56
- Math.round(this.next.movingAverage * (options.timeoutFactor ?? this.timeoutMultiplier)),
57
- this.minTimeout
58
- )
61
+ let timeout = Math.round(this.next.movingAverage * (options.timeoutFactor ?? this.timeoutMultiplier))
62
+
63
+ if (timeout < this.minTimeout) {
64
+ timeout = this.minTimeout
65
+ }
66
+
67
+ if (timeout > this.maxTimeout) {
68
+ timeout = this.maxTimeout
69
+ }
70
+
59
71
  const sendTimeout = AbortSignal.timeout(timeout)
60
72
  const timeoutSignal = anySignal([options.signal, sendTimeout]) as AdaptiveTimeoutSignal
61
73
  setMaxListeners(Infinity, timeoutSignal, sendTimeout)