libp2p 0.40.0 → 0.41.0-19e96cc

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 (101) hide show
  1. package/README.md +26 -6
  2. package/dist/index.min.js +50 -0
  3. package/dist/src/address-manager/index.d.ts.map +1 -1
  4. package/dist/src/address-manager/index.js +1 -1
  5. package/dist/src/address-manager/index.js.map +1 -1
  6. package/dist/src/config.d.ts.map +1 -1
  7. package/dist/src/config.js +0 -11
  8. package/dist/src/config.js.map +1 -1
  9. package/dist/src/connection/index.d.ts +83 -0
  10. package/dist/src/connection/index.d.ts.map +1 -0
  11. package/dist/src/connection/index.js +96 -0
  12. package/dist/src/connection/index.js.map +1 -0
  13. package/dist/src/connection-manager/dialer/index.d.ts +13 -14
  14. package/dist/src/connection-manager/dialer/index.d.ts.map +1 -1
  15. package/dist/src/connection-manager/dialer/index.js +82 -62
  16. package/dist/src/connection-manager/dialer/index.js.map +1 -1
  17. package/dist/src/connection-manager/index.d.ts +7 -115
  18. package/dist/src/connection-manager/index.d.ts.map +1 -1
  19. package/dist/src/connection-manager/index.js +21 -57
  20. package/dist/src/connection-manager/index.js.map +1 -1
  21. package/dist/src/fetch/index.d.ts +14 -0
  22. package/dist/src/fetch/index.d.ts.map +1 -1
  23. package/dist/src/fetch/index.js +29 -3
  24. package/dist/src/fetch/index.js.map +1 -1
  25. package/dist/src/get-peer.d.ts +2 -2
  26. package/dist/src/get-peer.d.ts.map +1 -1
  27. package/dist/src/get-peer.js +2 -5
  28. package/dist/src/get-peer.js.map +1 -1
  29. package/dist/src/index.d.ts +192 -77
  30. package/dist/src/index.d.ts.map +1 -1
  31. package/dist/src/index.js +41 -1
  32. package/dist/src/index.js.map +1 -1
  33. package/dist/src/insecure/index.d.ts +23 -0
  34. package/dist/src/insecure/index.d.ts.map +1 -1
  35. package/dist/src/insecure/index.js +23 -0
  36. package/dist/src/insecure/index.js.map +1 -1
  37. package/dist/src/keychain/index.d.ts +1 -1
  38. package/dist/src/keychain/index.d.ts.map +1 -1
  39. package/dist/src/libp2p.d.ts +3 -3
  40. package/dist/src/libp2p.d.ts.map +1 -1
  41. package/dist/src/libp2p.js +2 -3
  42. package/dist/src/libp2p.js.map +1 -1
  43. package/dist/src/nat-manager.d.ts.map +1 -1
  44. package/dist/src/nat-manager.js +5 -1
  45. package/dist/src/nat-manager.js.map +1 -1
  46. package/dist/src/pnet/index.d.ts +23 -0
  47. package/dist/src/pnet/index.d.ts.map +1 -1
  48. package/dist/src/pnet/index.js +23 -0
  49. package/dist/src/pnet/index.js.map +1 -1
  50. package/dist/src/pnet/key-generator.d.ts +3 -2
  51. package/dist/src/pnet/key-generator.d.ts.map +1 -1
  52. package/dist/src/pnet/key-generator.js +7 -10
  53. package/dist/src/pnet/key-generator.js.map +1 -1
  54. package/dist/src/registrar.d.ts +5 -0
  55. package/dist/src/registrar.d.ts.map +1 -1
  56. package/dist/src/registrar.js +25 -0
  57. package/dist/src/registrar.js.map +1 -1
  58. package/dist/src/transport-manager.d.ts.map +1 -1
  59. package/dist/src/transport-manager.js +1 -2
  60. package/dist/src/transport-manager.js.map +1 -1
  61. package/dist/src/upgrader.d.ts +1 -1
  62. package/dist/src/upgrader.d.ts.map +1 -1
  63. package/dist/src/upgrader.js +46 -59
  64. package/dist/src/upgrader.js.map +1 -1
  65. package/package.json +15 -14
  66. package/src/address-manager/index.ts +3 -2
  67. package/src/circuit/README.md +6 -6
  68. package/src/config.ts +0 -11
  69. package/src/connection/index.ts +171 -0
  70. package/src/connection-manager/dialer/index.ts +100 -75
  71. package/src/connection-manager/index.ts +29 -192
  72. package/src/fetch/README.md +7 -2
  73. package/src/fetch/index.ts +30 -3
  74. package/src/get-peer.ts +3 -7
  75. package/src/index.ts +224 -83
  76. package/src/insecure/index.ts +24 -0
  77. package/src/keychain/index.ts +1 -1
  78. package/src/libp2p.ts +5 -6
  79. package/src/nat-manager.ts +6 -1
  80. package/src/pnet/README.md +31 -29
  81. package/src/pnet/index.ts +24 -0
  82. package/src/pnet/key-generator.ts +7 -12
  83. package/src/registrar.ts +29 -2
  84. package/src/transport-manager.ts +1 -2
  85. package/src/upgrader.ts +51 -64
  86. package/src/version.ts +1 -1
  87. package/dist/src/metrics/index.d.ts +0 -93
  88. package/dist/src/metrics/index.d.ts.map +0 -1
  89. package/dist/src/metrics/index.js +0 -234
  90. package/dist/src/metrics/index.js.map +0 -1
  91. package/dist/src/metrics/moving-average.d.ts +0 -14
  92. package/dist/src/metrics/moving-average.d.ts.map +0 -1
  93. package/dist/src/metrics/moving-average.js +0 -40
  94. package/dist/src/metrics/moving-average.js.map +0 -1
  95. package/dist/src/metrics/stats.d.ts +0 -87
  96. package/dist/src/metrics/stats.d.ts.map +0 -1
  97. package/dist/src/metrics/stats.js +0 -183
  98. package/dist/src/metrics/stats.js.map +0 -1
  99. package/src/metrics/index.ts +0 -311
  100. package/src/metrics/moving-average.ts +0 -53
  101. package/src/metrics/stats.ts +0 -238
@@ -1,234 +0,0 @@
1
- import { pipe } from 'it-pipe';
2
- import each from 'it-foreach';
3
- import LRU from 'hashlru';
4
- import { METRICS as defaultOptions } from '../constants.js';
5
- import { DefaultStats } from './stats.js';
6
- const initialCounters = [
7
- 'dataReceived',
8
- 'dataSent'
9
- ];
10
- const directionToEvent = {
11
- in: 'dataReceived',
12
- out: 'dataSent'
13
- };
14
- export class DefaultMetrics {
15
- constructor(init) {
16
- this.enabled = init.enabled;
17
- this.statsInit = {
18
- ...init,
19
- initialCounters
20
- };
21
- this.globalStats = new DefaultStats(this.statsInit);
22
- this.peerStats = new Map();
23
- this.protocolStats = new Map();
24
- this.oldPeers = LRU(init.maxOldPeersRetention ?? defaultOptions.maxOldPeersRetention);
25
- this.running = false;
26
- this._onMessage = this._onMessage.bind(this);
27
- this.systems = new Map();
28
- }
29
- isStarted() {
30
- return this.running;
31
- }
32
- /**
33
- * Must be called for stats to saved. Any data pushed for tracking
34
- * will be ignored.
35
- */
36
- async start() {
37
- if (!this.enabled) {
38
- return;
39
- }
40
- this.running = true;
41
- }
42
- /**
43
- * Stops all averages timers and prevents new data from being tracked.
44
- * Once `stop` is called, `start` must be called to resume stats tracking.
45
- */
46
- async stop() {
47
- if (!this.running) {
48
- return;
49
- }
50
- this.running = false;
51
- this.globalStats.stop();
52
- for (const stats of this.peerStats.values()) {
53
- stats.stop();
54
- }
55
- for (const stats of this.protocolStats.values()) {
56
- stats.stop();
57
- }
58
- }
59
- /**
60
- * Gets the global `Stats` object
61
- */
62
- getGlobal() {
63
- return this.globalStats;
64
- }
65
- /**
66
- * Returns a list of `PeerId` strings currently being tracked
67
- */
68
- getPeers() {
69
- return Array.from(this.peerStats.keys());
70
- }
71
- getComponentMetrics() {
72
- return this.systems;
73
- }
74
- updateComponentMetric(update) {
75
- const { system = 'libp2p', component, metric, value, label, help } = update;
76
- if (!this.systems.has(system)) {
77
- this.systems.set(system, new Map());
78
- }
79
- const systemMetrics = this.systems.get(system);
80
- if (systemMetrics == null) {
81
- throw new Error('Unknown metric system');
82
- }
83
- if (!systemMetrics.has(component)) {
84
- systemMetrics.set(component, new Map());
85
- }
86
- const componentMetrics = systemMetrics.get(component);
87
- if (componentMetrics == null) {
88
- throw new Error('Unknown metric component');
89
- }
90
- componentMetrics.set(metric, {
91
- label,
92
- help,
93
- calculate: typeof value !== 'function' ? () => value : value
94
- });
95
- }
96
- /**
97
- * Returns the `Stats` object for the given `PeerId` whether it
98
- * is a live peer, or in the disconnected peer LRU cache.
99
- */
100
- forPeer(peerId) {
101
- const idString = peerId.toString();
102
- return this.peerStats.get(idString) ?? this.oldPeers.get(idString);
103
- }
104
- /**
105
- * Returns a list of all protocol strings currently being tracked
106
- */
107
- getProtocols() {
108
- return Array.from(this.protocolStats.keys());
109
- }
110
- /**
111
- * Returns the `Stats` object for the given `protocol`
112
- */
113
- forProtocol(protocol) {
114
- return this.protocolStats.get(protocol);
115
- }
116
- /**
117
- * Should be called when all connections to a given peer
118
- * have closed. The `Stats` collection for the peer will
119
- * be stopped and moved to an LRU for temporary retention.
120
- */
121
- onPeerDisconnected(peerId) {
122
- const idString = peerId.toString();
123
- const peerStats = this.peerStats.get(idString);
124
- if (peerStats != null) {
125
- peerStats.stop();
126
- this.peerStats.delete(idString);
127
- this.oldPeers.set(idString, peerStats);
128
- }
129
- }
130
- /**
131
- * Takes the metadata for a message and tracks it in the
132
- * appropriate categories. If the protocol is present, protocol
133
- * stats will also be tracked.
134
- */
135
- _onMessage(opts) {
136
- if (!this.running) {
137
- return;
138
- }
139
- const { remotePeer, protocol, direction, dataLength } = opts;
140
- const key = directionToEvent[direction];
141
- let peerStats = this.forPeer(remotePeer);
142
- if (peerStats == null) {
143
- const stats = new DefaultStats(this.statsInit);
144
- this.peerStats.set(remotePeer.toString(), stats);
145
- peerStats = stats;
146
- }
147
- // Peer and global stats
148
- peerStats.push(key, dataLength);
149
- this.globalStats.push(key, dataLength);
150
- // Protocol specific stats
151
- if (protocol != null) {
152
- let protocolStats = this.forProtocol(protocol);
153
- if (protocolStats == null) {
154
- const stats = new DefaultStats(this.statsInit);
155
- this.protocolStats.set(protocol, stats);
156
- protocolStats = stats;
157
- }
158
- protocolStats.push(key, dataLength);
159
- }
160
- }
161
- /**
162
- * Replaces the `PeerId` string with the given `peerId`.
163
- * If stats are already being tracked for the given `peerId`, the
164
- * placeholder stats will be merged with the existing stats.
165
- *
166
- * @param {PeerId} placeholder - A peerId string
167
- * @param {PeerId} peerId
168
- * @returns {void}
169
- */
170
- updatePlaceholder(placeholder, peerId) {
171
- if (!this.running) {
172
- return;
173
- }
174
- const placeholderString = placeholder.toString();
175
- const placeholderStats = this.peerStats.get(placeholderString) ?? this.oldPeers.get(placeholderString);
176
- const peerIdString = peerId.toString();
177
- const existingStats = this.peerStats.get(peerIdString) ?? this.oldPeers.get(peerIdString);
178
- let mergedStats = placeholderStats;
179
- // If we already have stats, merge the two
180
- if (existingStats != null) {
181
- // If existing, merge
182
- mergedStats = mergeStats(existingStats, mergedStats);
183
- // Attempt to delete from the old peers list just in case it was tracked there
184
- this.oldPeers.remove(peerIdString);
185
- }
186
- this.peerStats.delete(placeholder.toString());
187
- this.peerStats.set(peerIdString, mergedStats);
188
- mergedStats.start();
189
- }
190
- /**
191
- * Tracks data running through a given Duplex Iterable `stream`. If
192
- * the `peerId` is not provided, a placeholder string will be created and
193
- * returned. This allows lazy tracking of a peer when the peer is not yet known.
194
- * When the `PeerId` is known, `Metrics.updatePlaceholder` should be called
195
- * with the placeholder string returned from here, and the known `PeerId`.
196
- */
197
- trackStream(opts) {
198
- const { stream, remotePeer, protocol } = opts;
199
- if (!this.running) {
200
- return;
201
- }
202
- const source = stream.source;
203
- stream.source = each(source, chunk => this._onMessage({
204
- remotePeer,
205
- protocol,
206
- direction: 'in',
207
- dataLength: chunk.byteLength
208
- }));
209
- const sink = stream.sink;
210
- stream.sink = async (source) => {
211
- return await pipe(source, (source) => each(source, chunk => {
212
- this._onMessage({
213
- remotePeer,
214
- protocol,
215
- direction: 'out',
216
- dataLength: chunk.byteLength
217
- });
218
- }), sink);
219
- };
220
- }
221
- }
222
- /**
223
- * Merges `other` into `target`. `target` will be modified
224
- * and returned
225
- */
226
- function mergeStats(target, other) {
227
- target.stop();
228
- other.stop();
229
- // Merge queues
230
- target.queue = [...target.queue, ...other.queue];
231
- // TODO: how to merge moving averages?
232
- return target;
233
- }
234
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/metrics/index.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- import type { MovingAverage } from '@libp2p/interface-metrics';
2
- export declare class DefaultMovingAverage {
3
- movingAverage: number;
4
- variance: number;
5
- deviation: number;
6
- forecast: number;
7
- private readonly timespan;
8
- private previousTime?;
9
- constructor(timespan: number);
10
- alpha(t: number, pt: number): number;
11
- push(time: number, value: number): void;
12
- }
13
- export declare function createMovingAverage(timespan: number): MovingAverage;
14
- //# sourceMappingURL=moving-average.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"moving-average.d.ts","sourceRoot":"","sources":["../../../src/metrics/moving-average.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAE9D,qBAAa,oBAAoB;IACxB,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,YAAY,CAAC,CAAQ;gBAEhB,QAAQ,EAAE,MAAM;IAgB7B,KAAK,CAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAI5B,IAAI,CAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;CAkBlC;AAED,wBAAgB,mBAAmB,CAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,CAEpE"}
@@ -1,40 +0,0 @@
1
- export class DefaultMovingAverage {
2
- constructor(timespan) {
3
- if (typeof timespan !== 'number') {
4
- throw new Error('must provide a timespan to the moving average constructor');
5
- }
6
- if (timespan <= 0) {
7
- throw new Error('must provide a timespan > 0 to the moving average constructor');
8
- }
9
- this.timespan = timespan;
10
- this.movingAverage = 0;
11
- this.variance = 0;
12
- this.deviation = 0;
13
- this.forecast = 0;
14
- }
15
- alpha(t, pt) {
16
- return 1 - (Math.exp(-(t - pt) / this.timespan));
17
- }
18
- push(time, value) {
19
- if (this.previousTime != null) {
20
- // calculate moving average
21
- const a = this.alpha(time, this.previousTime);
22
- const diff = value - this.movingAverage;
23
- const incr = a * diff;
24
- this.movingAverage = a * value + (1 - a) * this.movingAverage;
25
- // calculate variance & deviation
26
- this.variance = (1 - a) * (this.variance + diff * incr);
27
- this.deviation = Math.sqrt(this.variance);
28
- // calculate forecast
29
- this.forecast = this.movingAverage + a * diff;
30
- }
31
- else {
32
- this.movingAverage = value;
33
- }
34
- this.previousTime = time;
35
- }
36
- }
37
- export function createMovingAverage(timespan) {
38
- return new DefaultMovingAverage(timespan);
39
- }
40
- //# sourceMappingURL=moving-average.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"moving-average.js","sourceRoot":"","sources":["../../../src/metrics/moving-average.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,oBAAoB;IAQ/B,YAAa,QAAgB;QAC3B,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAA;SAC7E;QAED,IAAI,QAAQ,IAAI,CAAC,EAAE;YACjB,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAA;SACjF;QAED,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAA;QACtB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;QACjB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;QAClB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;IACnB,CAAC;IAED,KAAK,CAAE,CAAS,EAAE,EAAU;QAC1B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAA;IAClD,CAAC;IAED,IAAI,CAAE,IAAY,EAAE,KAAa;QAC/B,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE;YAC7B,2BAA2B;YAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;YAC7C,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,aAAa,CAAA;YACvC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAA;YACrB,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,CAAA;YAC7D,iCAAiC;YACjC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC,CAAA;YACvD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACzC,qBAAqB;YACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,IAAI,CAAA;SAC9C;aAAM;YACL,IAAI,CAAC,aAAa,GAAG,KAAK,CAAA;SAC3B;QAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;IAC1B,CAAC;CACF;AAED,MAAM,UAAU,mBAAmB,CAAE,QAAgB;IACnD,OAAO,IAAI,oBAAoB,CAAC,QAAQ,CAAC,CAAA;AAC3C,CAAC"}
@@ -1,87 +0,0 @@
1
- import { EventEmitter } from '@libp2p/interfaces/events';
2
- import type { MovingAverages, Stats, TransferStats } from '@libp2p/interface-metrics';
3
- export interface StatsEvents {
4
- 'update': CustomEvent<TransferStats>;
5
- }
6
- export interface StatsInit {
7
- enabled: boolean;
8
- initialCounters: ['dataReceived', 'dataSent'];
9
- movingAverageIntervals: number[];
10
- computeThrottleMaxQueueSize: number;
11
- computeThrottleTimeout: number;
12
- }
13
- export declare class DefaultStats extends EventEmitter<StatsEvents> implements Stats {
14
- private readonly enabled;
15
- queue: Array<[string, number, number]>;
16
- private stats;
17
- private frequencyLastTime;
18
- private frequencyAccumulators;
19
- private movingAverages;
20
- private timeout?;
21
- private readonly computeThrottleMaxQueueSize;
22
- private readonly computeThrottleTimeout;
23
- private readonly movingAverageIntervals;
24
- /**
25
- * A queue based manager for stat processing
26
- */
27
- constructor(init: StatsInit);
28
- /**
29
- * Initializes the internal timer if there are items in the queue. This
30
- * should only need to be called if `Stats.stop` was previously called, as
31
- * `Stats.push` will also start the processing
32
- */
33
- start(): void;
34
- /**
35
- * Stops processing and computing of stats by clearing the internal
36
- * timer
37
- */
38
- stop(): void;
39
- /**
40
- * Returns a clone of the current stats.
41
- */
42
- getSnapshot(): TransferStats;
43
- /**
44
- * Returns a clone of the internal movingAverages
45
- */
46
- getMovingAverages(): MovingAverages;
47
- /**
48
- * Pushes the given operation data to the queue, along with the
49
- * current Timestamp, then resets the update timer.
50
- */
51
- push(counter: string, inc: number): void;
52
- /**
53
- * Resets the timeout for triggering updates.
54
- */
55
- _resetComputeTimeout(): void;
56
- /**
57
- * Calculates and returns the timeout for the next update based on
58
- * the urgency of the update.
59
- */
60
- _nextTimeout(): number;
61
- /**
62
- * If there are items in the queue, they will will be processed and
63
- * the frequency for all items will be updated based on the Timestamp
64
- * of the last item in the queue. The `update` event will also be emitted
65
- * with the latest stats.
66
- *
67
- * If there are no items in the queue, no action is taken.
68
- */
69
- _update(): void;
70
- /**
71
- * For each key in the stats, the frequency and moving averages
72
- * will be updated via Stats._updateFrequencyFor based on the time
73
- * difference between calls to this method.
74
- */
75
- _updateFrequency(latestTime: number): void;
76
- /**
77
- * Updates the `movingAverages` for the given `key` and also
78
- * resets the `frequencyAccumulator` for the `key`.
79
- */
80
- _updateFrequencyFor(key: 'dataReceived' | 'dataSent', timeDiffMS: number, latestTime: number): void;
81
- /**
82
- * For the given operation, `op`, the stats and `frequencyAccumulator`
83
- * will be updated or initialized if they don't already exist.
84
- */
85
- _applyOp(op: [string, number, number]): void;
86
- }
87
- //# sourceMappingURL=stats.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/metrics/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAIrE,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAErF,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,WAAW,CAAC,aAAa,CAAC,CAAA;CACrC;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,eAAe,EAAE,CAAC,cAAc,EAAE,UAAU,CAAC,CAAA;IAC7C,sBAAsB,EAAE,MAAM,EAAE,CAAA;IAChC,2BAA2B,EAAE,MAAM,CAAA;IACnC,sBAAsB,EAAE,MAAM,CAAA;CAC/B;AAED,qBAAa,YAAa,SAAQ,YAAY,CAAC,WAAW,CAAE,YAAW,KAAK;IAC1E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAC1B,KAAK,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAC7C,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,iBAAiB,CAAQ;IACjC,OAAO,CAAC,qBAAqB,CAAwB;IACrD,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,OAAO,CAAC,CAAK;IACrB,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAQ;IACpD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAQ;IAC/C,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAU;IAEjD;;OAEG;gBACU,IAAI,EAAE,SAAS;IAmC5B;;;;OAIG;IACH,KAAK;IAUL;;;OAGG;IACH,IAAI;IAOJ;;OAEG;IACH,WAAW;IAIX;;OAEG;IACH,iBAAiB,IAAK,cAAc;IAIpC;;;OAGG;IACH,IAAI,CAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAKlC;;OAEG;IACH,oBAAoB;IAIpB;;;OAGG;IACH,YAAY;IAOZ;;;;;;;OAOG;IACH,OAAO;IAqBP;;;;OAIG;IACH,gBAAgB,CAAE,UAAU,EAAE,MAAM;IASpC;;;OAGG;IACH,mBAAmB,CAAE,GAAG,EAAE,cAAc,GAAG,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAwB7F;;;OAGG;IACH,QAAQ,CAAE,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;CA2BvC"}
@@ -1,183 +0,0 @@
1
- import { CustomEvent, EventEmitter } from '@libp2p/interfaces/events';
2
- import { createMovingAverage } from './moving-average.js';
3
- // @ts-expect-error no types
4
- import retimer from 'retimer';
5
- export class DefaultStats extends EventEmitter {
6
- /**
7
- * A queue based manager for stat processing
8
- */
9
- constructor(init) {
10
- super();
11
- this.enabled = init.enabled;
12
- this.queue = [];
13
- this.stats = {
14
- dataReceived: 0n,
15
- dataSent: 0n
16
- };
17
- this.frequencyLastTime = Date.now();
18
- this.frequencyAccumulators = {};
19
- this.movingAverages = {
20
- dataReceived: [],
21
- dataSent: []
22
- };
23
- this.computeThrottleMaxQueueSize = init.computeThrottleMaxQueueSize;
24
- this.computeThrottleTimeout = init.computeThrottleTimeout;
25
- this._update = this._update.bind(this);
26
- this.movingAverageIntervals = init.movingAverageIntervals;
27
- for (let i = 0; i < init.initialCounters.length; i++) {
28
- const key = init.initialCounters[i];
29
- this.stats[key] = 0n;
30
- this.movingAverages[key] = [];
31
- for (let k = 0; k < this.movingAverageIntervals.length; k++) {
32
- const interval = this.movingAverageIntervals[k];
33
- const ma = this.movingAverages[key][interval] = createMovingAverage(interval);
34
- ma.push(this.frequencyLastTime, 0);
35
- }
36
- }
37
- }
38
- /**
39
- * Initializes the internal timer if there are items in the queue. This
40
- * should only need to be called if `Stats.stop` was previously called, as
41
- * `Stats.push` will also start the processing
42
- */
43
- start() {
44
- if (!this.enabled) {
45
- return;
46
- }
47
- if (this.queue.length > 0) {
48
- this._resetComputeTimeout();
49
- }
50
- }
51
- /**
52
- * Stops processing and computing of stats by clearing the internal
53
- * timer
54
- */
55
- stop() {
56
- if (this.timeout != null) {
57
- this.timeout.clear();
58
- this.timeout = null;
59
- }
60
- }
61
- /**
62
- * Returns a clone of the current stats.
63
- */
64
- getSnapshot() {
65
- return Object.assign({}, this.stats);
66
- }
67
- /**
68
- * Returns a clone of the internal movingAverages
69
- */
70
- getMovingAverages() {
71
- return Object.assign({}, this.movingAverages);
72
- }
73
- /**
74
- * Pushes the given operation data to the queue, along with the
75
- * current Timestamp, then resets the update timer.
76
- */
77
- push(counter, inc) {
78
- this.queue.push([counter, inc, Date.now()]);
79
- this._resetComputeTimeout();
80
- }
81
- /**
82
- * Resets the timeout for triggering updates.
83
- */
84
- _resetComputeTimeout() {
85
- this.timeout = retimer(this._update, this._nextTimeout());
86
- }
87
- /**
88
- * Calculates and returns the timeout for the next update based on
89
- * the urgency of the update.
90
- */
91
- _nextTimeout() {
92
- // calculate the need for an update, depending on the queue length
93
- const urgency = this.queue.length / this.computeThrottleMaxQueueSize;
94
- const timeout = Math.max(this.computeThrottleTimeout * (1 - urgency), 0);
95
- return timeout;
96
- }
97
- /**
98
- * If there are items in the queue, they will will be processed and
99
- * the frequency for all items will be updated based on the Timestamp
100
- * of the last item in the queue. The `update` event will also be emitted
101
- * with the latest stats.
102
- *
103
- * If there are no items in the queue, no action is taken.
104
- */
105
- _update() {
106
- this.timeout = null;
107
- if (this.queue.length > 0) {
108
- let last = ['', 0, 0];
109
- for (last of this.queue) {
110
- this._applyOp(last);
111
- }
112
- this.queue = [];
113
- if (last.length > 2 && last[0] !== '') {
114
- this._updateFrequency(last[2]); // contains timestamp of last op
115
- }
116
- this.dispatchEvent(new CustomEvent('update', {
117
- detail: this.stats
118
- }));
119
- }
120
- }
121
- /**
122
- * For each key in the stats, the frequency and moving averages
123
- * will be updated via Stats._updateFrequencyFor based on the time
124
- * difference between calls to this method.
125
- */
126
- _updateFrequency(latestTime) {
127
- const timeDiff = latestTime - this.frequencyLastTime;
128
- this._updateFrequencyFor('dataReceived', timeDiff, latestTime);
129
- this._updateFrequencyFor('dataSent', timeDiff, latestTime);
130
- this.frequencyLastTime = latestTime;
131
- }
132
- /**
133
- * Updates the `movingAverages` for the given `key` and also
134
- * resets the `frequencyAccumulator` for the `key`.
135
- */
136
- _updateFrequencyFor(key, timeDiffMS, latestTime) {
137
- const count = this.frequencyAccumulators[key] ?? 0;
138
- this.frequencyAccumulators[key] = 0;
139
- // if `timeDiff` is zero, `hz` becomes Infinity, so we fallback to 1ms
140
- const safeTimeDiff = timeDiffMS ?? 1;
141
- const hz = (count / safeTimeDiff) * 1000;
142
- let movingAverages = this.movingAverages[key];
143
- if (movingAverages == null) {
144
- movingAverages = this.movingAverages[key] = [];
145
- }
146
- const intervals = this.movingAverageIntervals;
147
- for (let i = 0; i < intervals.length; i++) {
148
- const movingAverageInterval = intervals[i];
149
- let movingAverage = movingAverages[movingAverageInterval];
150
- if (movingAverage == null) {
151
- movingAverage = movingAverages[movingAverageInterval] = createMovingAverage(movingAverageInterval);
152
- }
153
- movingAverage.push(latestTime, hz);
154
- }
155
- }
156
- /**
157
- * For the given operation, `op`, the stats and `frequencyAccumulator`
158
- * will be updated or initialized if they don't already exist.
159
- */
160
- _applyOp(op) {
161
- const key = op[0];
162
- const inc = op[1];
163
- if (typeof inc !== 'number') {
164
- throw new Error('invalid increment number');
165
- }
166
- let n;
167
- if (!Object.prototype.hasOwnProperty.call(this.stats, key)) {
168
- // @ts-expect-error cannot index type with key
169
- n = this.stats[key] = 0n;
170
- }
171
- else {
172
- // @ts-expect-error cannot index type with key
173
- n = this.stats[key];
174
- }
175
- // @ts-expect-error cannot index type with key
176
- this.stats[key] = n + BigInt(inc);
177
- if (this.frequencyAccumulators[key] == null) {
178
- this.frequencyAccumulators[key] = 0;
179
- }
180
- this.frequencyAccumulators[key] += inc;
181
- }
182
- }
183
- //# sourceMappingURL=stats.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/metrics/stats.ts"],"names":[],"mappings":"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"}