@libp2p/simple-metrics 1.0.0 → 1.0.1-1cc6a9405

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/README.md CHANGED
@@ -1,26 +1,57 @@
1
- # @libp2p/simple-metrics <!-- omit in toc -->
1
+ # @libp2p/simple-metrics
2
2
 
3
3
  [![libp2p.io](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](http://libp2p.io/)
4
4
  [![Discuss](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg?style=flat-square)](https://discuss.libp2p.io)
5
- [![codecov](https://img.shields.io/codecov/c/github/libp2p/js-libp2p-simple-metrics.svg?style=flat-square)](https://codecov.io/gh/libp2p/js-libp2p-simple-metrics)
6
- [![CI](https://img.shields.io/github/actions/workflow/status/libp2p/js-libp2p-simple-metrics/js-test-and-release.yml?branch=main\&style=flat-square)](https://github.com/libp2p/js-libp2p-simple-metrics/actions/workflows/js-test-and-release.yml?query=branch%3Amain)
5
+ [![codecov](https://img.shields.io/codecov/c/github/libp2p/js-libp2p.svg?style=flat-square)](https://codecov.io/gh/libp2p/js-libp2p)
6
+ [![CI](https://img.shields.io/github/actions/workflow/status/libp2p/js-libp2p/main.yml?branch=main\&style=flat-square)](https://github.com/libp2p/js-libp2p/actions/workflows/main.yml?query=branch%3Amain)
7
7
 
8
8
  > Simple in-memory metrics gathering for libp2p
9
9
 
10
- ## Table of contents <!-- omit in toc -->
10
+ # About
11
11
 
12
- - [Install](#install)
13
- - [Browser `<script>` tag](#browser-script-tag)
14
- - [License](#license)
15
- - [Contribution](#contribution)
12
+ <!--
16
13
 
17
- ## Install
14
+ !IMPORTANT!
15
+
16
+ Everything in this README between "# About" and "# Install" is automatically
17
+ generated and will be overwritten the next time the doc generator is run.
18
+
19
+ To make changes to this section, please update the @packageDocumentation section
20
+ of src/index.js or src/index.ts
21
+
22
+ To experiment with formatting, please run "npm run docs" from the root of this
23
+ repo and examine the changes made.
24
+
25
+ -->
26
+
27
+ Stores metrics in memory and periodically invokes a configured callback
28
+ to receive them.
29
+
30
+ ## Example
31
+
32
+ ```ts
33
+ import { createLibp2p } from 'libp2p'
34
+ import { simpleMetrics } from '@libp2p/simple-metrics'
35
+
36
+ const node = await createLibp2p({
37
+ // ... other options
38
+ metrics: simpleMetrics({
39
+ onMetrics: (metrics) => {
40
+ // do something with metrics
41
+ }
42
+ }),
43
+ intervalMs: 1000 // default 1s
44
+ })
45
+
46
+ ```
47
+
48
+ # Install
18
49
 
19
50
  ```console
20
51
  $ npm i @libp2p/simple-metrics
21
52
  ```
22
53
 
23
- ### Browser `<script>` tag
54
+ ## Browser `<script>` tag
24
55
 
25
56
  Loading this module through a script tag will make it's exports available as `Libp2pSimpleMetrics` in the global namespace.
26
57
 
@@ -28,13 +59,17 @@ Loading this module through a script tag will make it's exports available as `Li
28
59
  <script src="https://unpkg.com/@libp2p/simple-metrics/dist/index.min.js"></script>
29
60
  ```
30
61
 
31
- ## License
62
+ # API Docs
63
+
64
+ - <https://libp2p.github.io/js-libp2p/modules/_libp2p_simple_metrics.html>
65
+
66
+ # License
32
67
 
33
68
  Licensed under either of
34
69
 
35
- - Apache 2.0, ([LICENSE-APACHE](LICENSE-APACHE) / <http://www.apache.org/licenses/LICENSE-2.0>)
36
- - MIT ([LICENSE-MIT](LICENSE-MIT) / <http://opensource.org/licenses/MIT>)
70
+ - Apache 2.0, ([LICENSE-APACHE](https://github.com/libp2p/js-libp2p/blob/main/packages/metrics-simple/LICENSE-APACHE) / <http://www.apache.org/licenses/LICENSE-2.0>)
71
+ - MIT ([LICENSE-MIT](https://github.com/libp2p/js-libp2p/blob/main/packages/metrics-simple/LICENSE-MIT) / <http://opensource.org/licenses/MIT>)
37
72
 
38
- ## Contribution
73
+ # Contribution
39
74
 
40
75
  Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
package/dist/index.min.js CHANGED
@@ -1,3 +1,3 @@
1
1
  (function (root, factory) {(typeof module === 'object' && module.exports) ? module.exports = factory() : root.Libp2PSimpleMetrics = factory()}(typeof self !== 'undefined' ? self : this, function () {
2
- "use strict";var Libp2PSimpleMetrics=(()=>{var oe=Object.create;var I=Object.defineProperty;var ie=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var ce=Object.getPrototypeOf,le=Object.prototype.hasOwnProperty;var $=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),ue=(t,e)=>{for(var r in e)I(t,r,{get:e[r],enumerable:!0})},_=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of ae(e))!le.call(t,o)&&o!==r&&I(t,o,{get:()=>e[o],enumerable:!(n=ie(e,o))||n.enumerable});return t};var fe=(t,e,r)=>(r=t!=null?oe(ce(t)):{},_(e||!t||!t.__esModule?I(r,"default",{value:t,enumerable:!0}):r,t)),de=t=>_(I({},"__esModule",{value:!0}),t);var X=$((Ie,G)=>{var k=1e3,O=k*60,N=O*60,M=N*24,he=M*7,pe=M*365.25;G.exports=function(t,e){e=e||{};var r=typeof t;if(r==="string"&&t.length>0)return me(t);if(r==="number"&&isFinite(t))return e.long?Ce(t):be(t);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(t))};function me(t){if(t=String(t),!(t.length>100)){var e=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(t);if(e){var r=parseFloat(e[1]),n=(e[2]||"ms").toLowerCase();switch(n){case"years":case"year":case"yrs":case"yr":case"y":return r*pe;case"weeks":case"week":case"w":return r*he;case"days":case"day":case"d":return r*M;case"hours":case"hour":case"hrs":case"hr":case"h":return r*N;case"minutes":case"minute":case"mins":case"min":case"m":return r*O;case"seconds":case"second":case"secs":case"sec":case"s":return r*k;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return r;default:return}}}}function be(t){var e=Math.abs(t);return e>=M?Math.round(t/M)+"d":e>=N?Math.round(t/N)+"h":e>=O?Math.round(t/O)+"m":e>=k?Math.round(t/k)+"s":t+"ms"}function Ce(t){var e=Math.abs(t);return e>=M?D(t,e,M,"day"):e>=N?D(t,e,N,"hour"):e>=O?D(t,e,O,"minute"):e>=k?D(t,e,k,"second"):t+" ms"}function D(t,e,r,n){var o=e>=r*1.5;return Math.round(t/r)+" "+n+(o?"s":"")}});var K=$((De,Z)=>{function ge(t){r.debug=r,r.default=r,r.coerce=g,r.disable=h,r.enable=o,r.enabled=C,r.humanize=X(),r.destroy=z,Object.keys(t).forEach(s=>{r[s]=t[s]}),r.names=[],r.skips=[],r.formatters={};function e(s){let i=0;for(let l=0;l<s.length;l++)i=(i<<5)-i+s.charCodeAt(l),i|=0;return r.colors[Math.abs(i)%r.colors.length]}r.selectColor=e;function r(s){let i,l=null,U,a;function c(...f){if(!c.enabled)return;let d=c,m=Number(new Date),x=m-(i||m);d.diff=x,d.prev=i,d.curr=m,i=m,f[0]=r.coerce(f[0]),typeof f[0]!="string"&&f.unshift("%O");let p=0;f[0]=f[0].replace(/%([a-zA-Z%])/g,(F,w)=>{if(F==="%%")return"%";p++;let A=r.formatters[w];if(typeof A=="function"){let S=f[p];F=A.call(d,S),f.splice(p,1),p--}return F}),r.formatArgs.call(d,f),(d.log||r.log).apply(d,f)}return c.namespace=s,c.useColors=r.useColors(),c.color=r.selectColor(s),c.extend=n,c.destroy=r.destroy,Object.defineProperty(c,"enabled",{enumerable:!0,configurable:!1,get:()=>l!==null?l:(U!==r.namespaces&&(U=r.namespaces,a=r.enabled(s)),a),set:f=>{l=f}}),typeof r.init=="function"&&r.init(c),c}function n(s,i){let l=r(this.namespace+(typeof i>"u"?":":i)+s);return l.log=this.log,l}function o(s){r.save(s),r.namespaces=s,r.names=[],r.skips=[];let i,l=(typeof s=="string"?s:"").split(/[\s,]+/),U=l.length;for(i=0;i<U;i++)l[i]&&(s=l[i].replace(/\*/g,".*?"),s[0]==="-"?r.skips.push(new RegExp("^"+s.slice(1)+"$")):r.names.push(new RegExp("^"+s+"$")))}function h(){let s=[...r.names.map(u),...r.skips.map(u).map(i=>"-"+i)].join(",");return r.enable(""),s}function C(s){if(s[s.length-1]==="*")return!0;let i,l;for(i=0,l=r.skips.length;i<l;i++)if(r.skips[i].test(s))return!1;for(i=0,l=r.names.length;i<l;i++)if(r.names[i].test(s))return!0;return!1}function u(s){return s.toString().substring(2,s.toString().length-2).replace(/\.\*\?$/,"*")}function g(s){return s instanceof Error?s.stack||s.message:s}function z(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return r.enable(r.load()),r}Z.exports=ge});var Q=$((y,q)=>{y.formatArgs=ye;y.save=ve;y.load=xe;y.useColors=we;y.storage=Fe();y.destroy=(()=>{let t=!1;return()=>{t||(t=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})();y.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function we(){return typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs)?!0:typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)?!1:typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function ye(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+q.exports.humanize(this.diff),!this.useColors)return;let e="color: "+this.color;t.splice(1,0,e,"color: inherit");let r=0,n=0;t[0].replace(/%[a-zA-Z%]/g,o=>{o!=="%%"&&(r++,o==="%c"&&(n=r))}),t.splice(n,0,e)}y.log=console.debug||console.log||(()=>{});function ve(t){try{t?y.storage.setItem("debug",t):y.storage.removeItem("debug")}catch{}}function xe(){let t;try{t=y.storage.getItem("debug")}catch{}return!t&&typeof process<"u"&&"env"in process&&(t=process.env.DEBUG),t}function Fe(){try{return localStorage}catch{}}q.exports=K()(y);var{formatters:Ae}=q.exports;Ae.j=function(t){try{return JSON.stringify(t)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}});var je={};ue(je,{simpleMetrics:()=>ze});var v=fe(Q(),1);function Ee(t,e){if(t.length>=255)throw new TypeError("Alphabet too long");for(var r=new Uint8Array(256),n=0;n<r.length;n++)r[n]=255;for(var o=0;o<t.length;o++){var h=t.charAt(o),C=h.charCodeAt(0);if(r[C]!==255)throw new TypeError(h+" is ambiguous");r[C]=o}var u=t.length,g=t.charAt(0),z=Math.log(u)/Math.log(256),s=Math.log(256)/Math.log(u);function i(a){if(a instanceof Uint8Array||(ArrayBuffer.isView(a)?a=new Uint8Array(a.buffer,a.byteOffset,a.byteLength):Array.isArray(a)&&(a=Uint8Array.from(a))),!(a instanceof Uint8Array))throw new TypeError("Expected Uint8Array");if(a.length===0)return"";for(var c=0,f=0,d=0,m=a.length;d!==m&&a[d]===0;)d++,c++;for(var x=(m-d)*s+1>>>0,p=new Uint8Array(x);d!==m;){for(var E=a[d],F=0,w=x-1;(E!==0||F<f)&&w!==-1;w--,F++)E+=256*p[w]>>>0,p[w]=E%u>>>0,E=E/u>>>0;if(E!==0)throw new Error("Non-zero carry");f=F,d++}for(var A=x-f;A!==x&&p[A]===0;)A++;for(var S=g.repeat(c);A<x;++A)S+=t.charAt(p[A]);return S}function l(a){if(typeof a!="string")throw new TypeError("Expected String");if(a.length===0)return new Uint8Array;var c=0;if(a[c]!==" "){for(var f=0,d=0;a[c]===g;)f++,c++;for(var m=(a.length-c)*z+1>>>0,x=new Uint8Array(m);a[c];){var p=r[a.charCodeAt(c)];if(p===255)return;for(var E=0,F=m-1;(p!==0||E<d)&&F!==-1;F--,E++)p+=u*x[F]>>>0,x[F]=p%256>>>0,p=p/256>>>0;if(p!==0)throw new Error("Non-zero carry");d=E,c++}if(a[c]!==" "){for(var w=m-d;w!==m&&x[w]===0;)w++;for(var A=new Uint8Array(f+(m-w)),S=f;w!==m;)A[S++]=x[w++];return A}}}function U(a){var c=l(a);if(c)return c;throw new Error(`Non-${e} character`)}return{encode:i,decodeUnsafe:l,decode:U}}var Me=Ee,Ue=Me,W=Ue;var $e=new Uint8Array(0);var Y=t=>{if(t instanceof Uint8Array&&t.constructor.name==="Uint8Array")return t;if(t instanceof ArrayBuffer)return new Uint8Array(t);if(ArrayBuffer.isView(t))return new Uint8Array(t.buffer,t.byteOffset,t.byteLength);throw new Error("Unknown type, must be binary type")};var J=class{constructor(e,r,n){this.name=e,this.prefix=r,this.baseEncode=n}encode(e){if(e instanceof Uint8Array)return`${this.prefix}${this.baseEncode(e)}`;throw Error("Unknown type, must be binary type")}},L=class{constructor(e,r,n){if(this.name=e,this.prefix=r,r.codePointAt(0)===void 0)throw new Error("Invalid prefix character");this.prefixCodePoint=r.codePointAt(0),this.baseDecode=n}decode(e){if(typeof e=="string"){if(e.codePointAt(0)!==this.prefixCodePoint)throw Error(`Unable to decode multibase string ${JSON.stringify(e)}, ${this.name} decoder only supports inputs prefixed with ${this.prefix}`);return this.baseDecode(e.slice(this.prefix.length))}else throw Error("Can only multibase decode strings")}or(e){return H(this,e)}},R=class{constructor(e){this.decoders=e}or(e){return H(this,e)}decode(e){let r=e[0],n=this.decoders[r];if(n)return n.decode(e);throw RangeError(`Unable to decode multibase string ${JSON.stringify(e)}, only inputs prefixed with ${Object.keys(this.decoders)} are supported`)}},H=(t,e)=>new R({...t.decoders||{[t.prefix]:t},...e.decoders||{[e.prefix]:e}}),B=class{constructor(e,r,n,o){this.name=e,this.prefix=r,this.baseEncode=n,this.baseDecode=o,this.encoder=new J(e,r,n),this.decoder=new L(e,r,o)}encode(e){return this.encoder.encode(e)}decode(e){return this.decoder.decode(e)}},ee=({name:t,prefix:e,encode:r,decode:n})=>new B(t,e,r,n),T=({prefix:t,name:e,alphabet:r})=>{let{encode:n,decode:o}=W(r,e);return ee({prefix:t,name:e,encode:n,decode:h=>Y(o(h))})},Se=(t,e,r,n)=>{let o={};for(let s=0;s<e.length;++s)o[e[s]]=s;let h=t.length;for(;t[h-1]==="=";)--h;let C=new Uint8Array(h*r/8|0),u=0,g=0,z=0;for(let s=0;s<h;++s){let i=o[t[s]];if(i===void 0)throw new SyntaxError(`Non-${n} character`);g=g<<r|i,u+=r,u>=8&&(u-=8,C[z++]=255&g>>u)}if(u>=r||255&g<<8-u)throw new SyntaxError("Unexpected end of data");return C},ke=(t,e,r)=>{let n=e[e.length-1]==="=",o=(1<<r)-1,h="",C=0,u=0;for(let g=0;g<t.length;++g)for(u=u<<8|t[g],C+=8;C>r;)C-=r,h+=e[o&u>>C];if(C&&(h+=e[o&u<<r-C]),n)for(;h.length*r&7;)h+="=";return h},b=({name:t,prefix:e,bitsPerChar:r,alphabet:n})=>ee({prefix:e,name:t,encode(o){return ke(o,n,r)},decode(o){return Se(o,n,r,t)}});var re=b({prefix:"b",name:"base32",alphabet:"abcdefghijklmnopqrstuvwxyz234567",bitsPerChar:5}),Ve=b({prefix:"B",name:"base32upper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",bitsPerChar:5}),_e=b({prefix:"c",name:"base32pad",alphabet:"abcdefghijklmnopqrstuvwxyz234567=",bitsPerChar:5}),Ge=b({prefix:"C",name:"base32padupper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",bitsPerChar:5}),Xe=b({prefix:"v",name:"base32hex",alphabet:"0123456789abcdefghijklmnopqrstuv",bitsPerChar:5}),Ze=b({prefix:"V",name:"base32hexupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV",bitsPerChar:5}),Ke=b({prefix:"t",name:"base32hexpad",alphabet:"0123456789abcdefghijklmnopqrstuv=",bitsPerChar:5}),Qe=b({prefix:"T",name:"base32hexpadupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV=",bitsPerChar:5}),We=b({prefix:"h",name:"base32z",alphabet:"ybndrfg8ejkmcpqxot1uwisza345h769",bitsPerChar:5});var te=T({name:"base58btc",prefix:"z",alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"}),er=T({name:"base58flickr",prefix:"Z",alphabet:"123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"});var ne=b({prefix:"m",name:"base64",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",bitsPerChar:6}),nr=b({prefix:"M",name:"base64pad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",bitsPerChar:6}),sr=b({prefix:"u",name:"base64url",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",bitsPerChar:6}),or=b({prefix:"U",name:"base64urlpad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=",bitsPerChar:6});v.default.formatters.b=t=>t==null?"undefined":te.baseEncode(t);v.default.formatters.t=t=>t==null?"undefined":re.baseEncode(t);v.default.formatters.m=t=>t==null?"undefined":ne.baseEncode(t);v.default.formatters.p=t=>t==null?"undefined":t.toString();v.default.formatters.c=t=>t==null?"undefined":t.toString();v.default.formatters.k=t=>t==null?"undefined":t.toString();v.default.formatters.a=t=>t==null?"undefined":t.toString();function Oe(t){let e=()=>{};return e.enabled=!1,e.color="",e.diff=0,e.log=()=>{},e.namespace=t,e.destroy=()=>!0,e.extend=()=>e,e}function se(t){let e=Oe(`${t}:trace`);return v.default.enabled(`${t}:trace`)&&v.default.names.map(r=>r.toString()).find(r=>r.includes(":trace"))!=null&&(e=(0,v.default)(`${t}:trace`)),Object.assign((0,v.default)(t),{error:(0,v.default)(`${t}:error`),trace:e})}var Ne=se("libp2p:simple-metrics"),j=class{value=0;update(e){this.value=e}increment(e=1){this.value+=e}decrement(e=1){this.value-=e}reset(){this.value=0}timer(){let e=Date.now();return()=>{this.value=Date.now()-e}}},P=class{values={};update(e){Object.entries(e).forEach(([r,n])=>{this.values[r]=n})}increment(e){Object.entries(e).forEach(([r,n])=>{this.values[r]=this.values[r]??0;let o=typeof n=="number"?n:1;this.values[r]+=Number(o)})}decrement(e){Object.entries(e).forEach(([r,n])=>{this.values[r]=this.values[r]??0;let o=typeof n=="number"?n:1;this.values[r]-=Number(o)})}reset(){this.values={}}timer(e){let r=Date.now();return()=>{this.values[e]=Date.now()-r}}},V=class{metrics=new Map;started;interval;intervalMs;onMetrics;constructor(e,r){this.started=!1,this._emitMetrics=this._emitMetrics.bind(this),this.intervalMs=r.intervalMs??1e3,this.onMetrics=r.onMetrics}isStarted(){return this.started}start(){this.started=!0,this.interval=setInterval(this._emitMetrics,this.intervalMs)}stop(){this.started=!1,clearInterval(this.interval)}_emitMetrics(){Promise.resolve().then(async()=>{let e={};for(let[r,n]of this.metrics.entries())n instanceof j?e[r]=n.value:n instanceof P?e[r]=n.values:e[r]=await n();this.onMetrics(JSON.parse(JSON.stringify(e)))}).catch(e=>{Ne.error("could not invoke onMetrics callback",e)})}trackMultiaddrConnection(e){}trackProtocolStream(e,r){}registerMetric(e,r={}){if(e==null)throw new Error("Metric name is required");if(r?.calculate!=null){this.metrics.set(e,r.calculate);return}let n=new j;return this.metrics.set(e,n),n}registerMetricGroup(e,r={}){if(e==null)throw new Error("Metric name is required");if(r?.calculate!=null){this.metrics.set(e,r.calculate);return}let n=new j;return this.metrics.set(e,n),n}registerCounter(e,r={}){if(e==null)throw new Error("Metric name is required");if(r?.calculate!=null){this.metrics.set(e,r.calculate);return}let n=new P;return this.metrics.set(e,n),n}registerCounterGroup(e,r={}){if(e==null)throw new Error("Metric name is required");if(r?.calculate!=null){this.metrics.set(e,r.calculate);return}let n=new P;return this.metrics.set(e,n),n}};function ze(t){return e=>new V(e,t)}return de(je);})();
2
+ "use strict";var Libp2PSimpleMetrics=(()=>{var ce=Object.create;var j=Object.defineProperty;var ue=Object.getOwnPropertyDescriptor;var le=Object.getOwnPropertyNames;var fe=Object.getPrototypeOf,de=Object.prototype.hasOwnProperty;var D=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),he=(r,e)=>{for(var t in e)j(r,t,{get:e[t],enumerable:!0})},G=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of le(e))!de.call(r,s)&&s!==t&&j(r,s,{get:()=>e[s],enumerable:!(n=ue(e,s))||n.enumerable});return r};var pe=(r,e,t)=>(t=r!=null?ce(fe(r)):{},G(e||!r||!r.__esModule?j(t,"default",{value:r,enumerable:!0}):t,r)),be=r=>G(j({},"__esModule",{value:!0}),r);var Z=D((Re,X)=>{var I=1e3,O=I*60,P=O*60,M=P*24,me=M*7,Ce=M*365.25;X.exports=function(r,e){e=e||{};var t=typeof r;if(t==="string"&&r.length>0)return ge(r);if(t==="number"&&isFinite(r))return e.long?ye(r):we(r);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(r))};function ge(r){if(r=String(r),!(r.length>100)){var e=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(r);if(e){var t=parseFloat(e[1]),n=(e[2]||"ms").toLowerCase();switch(n){case"years":case"year":case"yrs":case"yr":case"y":return t*Ce;case"weeks":case"week":case"w":return t*me;case"days":case"day":case"d":return t*M;case"hours":case"hour":case"hrs":case"hr":case"h":return t*P;case"minutes":case"minute":case"mins":case"min":case"m":return t*O;case"seconds":case"second":case"secs":case"sec":case"s":return t*I;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return t;default:return}}}}function we(r){var e=Math.abs(r);return e>=M?Math.round(r/M)+"d":e>=P?Math.round(r/P)+"h":e>=O?Math.round(r/O)+"m":e>=I?Math.round(r/I)+"s":r+"ms"}function ye(r){var e=Math.abs(r);return e>=M?L(r,e,M,"day"):e>=P?L(r,e,P,"hour"):e>=O?L(r,e,O,"minute"):e>=I?L(r,e,I,"second"):r+" ms"}function L(r,e,t,n){var s=e>=t*1.5;return Math.round(r/t)+" "+n+(s?"s":"")}});var Q=D((Ve,K)=>{function xe(r){t.debug=t,t.default=t,t.coerce=l,t.disable=d,t.enable=s,t.enabled=b,t.humanize=Z(),t.destroy=E,Object.keys(r).forEach(o=>{t[o]=r[o]}),t.names=[],t.skips=[],t.formatters={};function e(o){let i=0;for(let f=0;f<o.length;f++)i=(i<<5)-i+o.charCodeAt(f),i|=0;return t.colors[Math.abs(i)%t.colors.length]}t.selectColor=e;function t(o){let i,f=null,k,a;function c(...h){if(!c.enabled)return;let p=c,C=Number(new Date),v=C-(i||C);p.diff=v,p.prev=i,p.curr=C,i=C,h[0]=t.coerce(h[0]),typeof h[0]!="string"&&h.unshift("%O");let m=0;h[0]=h[0].replace(/%([a-zA-Z%])/g,(F,w)=>{if(F==="%%")return"%";m++;let A=t.formatters[w];if(typeof A=="function"){let U=h[m];F=A.call(p,U),h.splice(m,1),m--}return F}),t.formatArgs.call(p,h),(p.log||t.log).apply(p,h)}return c.namespace=o,c.useColors=t.useColors(),c.color=t.selectColor(o),c.extend=n,c.destroy=t.destroy,Object.defineProperty(c,"enabled",{enumerable:!0,configurable:!1,get:()=>f!==null?f:(k!==t.namespaces&&(k=t.namespaces,a=t.enabled(o)),a),set:h=>{f=h}}),typeof t.init=="function"&&t.init(c),c}function n(o,i){let f=t(this.namespace+(typeof i>"u"?":":i)+o);return f.log=this.log,f}function s(o){t.save(o),t.namespaces=o,t.names=[],t.skips=[];let i,f=(typeof o=="string"?o:"").split(/[\s,]+/),k=f.length;for(i=0;i<k;i++)f[i]&&(o=f[i].replace(/\*/g,".*?"),o[0]==="-"?t.skips.push(new RegExp("^"+o.slice(1)+"$")):t.names.push(new RegExp("^"+o+"$")))}function d(){let o=[...t.names.map(u),...t.skips.map(u).map(i=>"-"+i)].join(",");return t.enable(""),o}function b(o){if(o[o.length-1]==="*")return!0;let i,f;for(i=0,f=t.skips.length;i<f;i++)if(t.skips[i].test(o))return!1;for(i=0,f=t.names.length;i<f;i++)if(t.names[i].test(o))return!0;return!1}function u(o){return o.toString().substring(2,o.toString().length-2).replace(/\.\*\?$/,"*")}function l(o){return o instanceof Error?o.stack||o.message:o}function E(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return t.enable(t.load()),t}K.exports=xe});var W=D((y,$)=>{y.formatArgs=Fe;y.save=Ae;y.load=Ee;y.useColors=ve;y.storage=Se();y.destroy=(()=>{let r=!1;return()=>{r||(r=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})();y.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function ve(){return typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs)?!0:typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)?!1:typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function Fe(r){if(r[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+r[0]+(this.useColors?"%c ":" ")+"+"+$.exports.humanize(this.diff),!this.useColors)return;let e="color: "+this.color;r.splice(1,0,e,"color: inherit");let t=0,n=0;r[0].replace(/%[a-zA-Z%]/g,s=>{s!=="%%"&&(t++,s==="%c"&&(n=t))}),r.splice(n,0,e)}y.log=console.debug||console.log||(()=>{});function Ae(r){try{r?y.storage.setItem("debug",r):y.storage.removeItem("debug")}catch{}}function Ee(){let r;try{r=y.storage.getItem("debug")}catch{}return!r&&typeof process<"u"&&"env"in process&&(r=process.env.DEBUG),r}function Se(){try{return localStorage}catch{}}$.exports=Q()(y);var{formatters:Me}=$.exports;Me.j=function(r){try{return JSON.stringify(r)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}});var _e={};he(_e,{simpleMetrics:()=>De});var x=pe(W(),1);var Be=new Uint8Array(0);function Y(r){if(r instanceof Uint8Array&&r.constructor.name==="Uint8Array")return r;if(r instanceof ArrayBuffer)return new Uint8Array(r);if(ArrayBuffer.isView(r))return new Uint8Array(r.buffer,r.byteOffset,r.byteLength);throw new Error("Unknown type, must be binary type")}function ke(r,e){if(r.length>=255)throw new TypeError("Alphabet too long");for(var t=new Uint8Array(256),n=0;n<t.length;n++)t[n]=255;for(var s=0;s<r.length;s++){var d=r.charAt(s),b=d.charCodeAt(0);if(t[b]!==255)throw new TypeError(d+" is ambiguous");t[b]=s}var u=r.length,l=r.charAt(0),E=Math.log(u)/Math.log(256),o=Math.log(256)/Math.log(u);function i(a){if(a instanceof Uint8Array||(ArrayBuffer.isView(a)?a=new Uint8Array(a.buffer,a.byteOffset,a.byteLength):Array.isArray(a)&&(a=Uint8Array.from(a))),!(a instanceof Uint8Array))throw new TypeError("Expected Uint8Array");if(a.length===0)return"";for(var c=0,h=0,p=0,C=a.length;p!==C&&a[p]===0;)p++,c++;for(var v=(C-p)*o+1>>>0,m=new Uint8Array(v);p!==C;){for(var S=a[p],F=0,w=v-1;(S!==0||F<h)&&w!==-1;w--,F++)S+=256*m[w]>>>0,m[w]=S%u>>>0,S=S/u>>>0;if(S!==0)throw new Error("Non-zero carry");h=F,p++}for(var A=v-h;A!==v&&m[A]===0;)A++;for(var U=l.repeat(c);A<v;++A)U+=r.charAt(m[A]);return U}function f(a){if(typeof a!="string")throw new TypeError("Expected String");if(a.length===0)return new Uint8Array;var c=0;if(a[c]!==" "){for(var h=0,p=0;a[c]===l;)h++,c++;for(var C=(a.length-c)*E+1>>>0,v=new Uint8Array(C);a[c];){var m=t[a.charCodeAt(c)];if(m===255)return;for(var S=0,F=C-1;(m!==0||S<p)&&F!==-1;F--,S++)m+=u*v[F]>>>0,v[F]=m%256>>>0,m=m/256>>>0;if(m!==0)throw new Error("Non-zero carry");p=S,c++}if(a[c]!==" "){for(var w=C-p;w!==C&&v[w]===0;)w++;for(var A=new Uint8Array(h+(C-w)),U=h;w!==C;)A[U++]=v[w++];return A}}}function k(a){var c=f(a);if(c)return c;throw new Error(`Non-${e} character`)}return{encode:i,decodeUnsafe:f,decode:k}}var Ue=ke,Ie=Ue,H=Ie;var _=class{name;prefix;baseEncode;constructor(e,t,n){this.name=e,this.prefix=t,this.baseEncode=n}encode(e){if(e instanceof Uint8Array)return`${this.prefix}${this.baseEncode(e)}`;throw Error("Unknown type, must be binary type")}},q=class{name;prefix;baseDecode;prefixCodePoint;constructor(e,t,n){if(this.name=e,this.prefix=t,t.codePointAt(0)===void 0)throw new Error("Invalid prefix character");this.prefixCodePoint=t.codePointAt(0),this.baseDecode=n}decode(e){if(typeof e=="string"){if(e.codePointAt(0)!==this.prefixCodePoint)throw Error(`Unable to decode multibase string ${JSON.stringify(e)}, ${this.name} decoder only supports inputs prefixed with ${this.prefix}`);return this.baseDecode(e.slice(this.prefix.length))}else throw Error("Can only multibase decode strings")}or(e){return ee(this,e)}},R=class{decoders;constructor(e){this.decoders=e}or(e){return ee(this,e)}decode(e){let t=e[0],n=this.decoders[t];if(n!=null)return n.decode(e);throw RangeError(`Unable to decode multibase string ${JSON.stringify(e)}, only inputs prefixed with ${Object.keys(this.decoders)} are supported`)}};function ee(r,e){return new R({...r.decoders??{[r.prefix]:r},...e.decoders??{[e.prefix]:e}})}var V=class{name;prefix;baseEncode;baseDecode;encoder;decoder;constructor(e,t,n,s){this.name=e,this.prefix=t,this.baseEncode=n,this.baseDecode=s,this.encoder=new _(e,t,n),this.decoder=new q(e,t,s)}encode(e){return this.encoder.encode(e)}decode(e){return this.decoder.decode(e)}};function te({name:r,prefix:e,encode:t,decode:n}){return new V(r,e,t,n)}function B({name:r,prefix:e,alphabet:t}){let{encode:n,decode:s}=H(t,r);return te({prefix:e,name:r,encode:n,decode:d=>Y(s(d))})}function Oe(r,e,t,n){let s={};for(let o=0;o<e.length;++o)s[e[o]]=o;let d=r.length;for(;r[d-1]==="=";)--d;let b=new Uint8Array(d*t/8|0),u=0,l=0,E=0;for(let o=0;o<d;++o){let i=s[r[o]];if(i===void 0)throw new SyntaxError(`Non-${n} character`);l=l<<t|i,u+=t,u>=8&&(u-=8,b[E++]=255&l>>u)}if(u>=t||255&l<<8-u)throw new SyntaxError("Unexpected end of data");return b}function Pe(r,e,t){let n=e[e.length-1]==="=",s=(1<<t)-1,d="",b=0,u=0;for(let l=0;l<r.length;++l)for(u=u<<8|r[l],b+=8;b>t;)b-=t,d+=e[s&u>>b];if(b!==0&&(d+=e[s&u<<t-b]),n)for(;d.length*t&7;)d+="=";return d}function g({name:r,prefix:e,bitsPerChar:t,alphabet:n}){return te({prefix:e,name:r,encode(s){return Pe(s,n,t)},decode(s){return Oe(s,n,t,r)}})}var re=g({prefix:"b",name:"base32",alphabet:"abcdefghijklmnopqrstuvwxyz234567",bitsPerChar:5}),Qe=g({prefix:"B",name:"base32upper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",bitsPerChar:5}),We=g({prefix:"c",name:"base32pad",alphabet:"abcdefghijklmnopqrstuvwxyz234567=",bitsPerChar:5}),Ye=g({prefix:"C",name:"base32padupper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",bitsPerChar:5}),He=g({prefix:"v",name:"base32hex",alphabet:"0123456789abcdefghijklmnopqrstuv",bitsPerChar:5}),et=g({prefix:"V",name:"base32hexupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV",bitsPerChar:5}),tt=g({prefix:"t",name:"base32hexpad",alphabet:"0123456789abcdefghijklmnopqrstuv=",bitsPerChar:5}),rt=g({prefix:"T",name:"base32hexpadupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV=",bitsPerChar:5}),nt=g({prefix:"h",name:"base32z",alphabet:"ybndrfg8ejkmcpqxot1uwisza345h769",bitsPerChar:5});var ne=B({name:"base58btc",prefix:"z",alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"}),it=B({name:"base58flickr",prefix:"Z",alphabet:"123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"});var oe=g({prefix:"m",name:"base64",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",bitsPerChar:6}),ut=g({prefix:"M",name:"base64pad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",bitsPerChar:6}),lt=g({prefix:"u",name:"base64url",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",bitsPerChar:6}),ft=g({prefix:"U",name:"base64urlpad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=",bitsPerChar:6});x.default.formatters.b=r=>r==null?"undefined":ne.baseEncode(r);x.default.formatters.t=r=>r==null?"undefined":re.baseEncode(r);x.default.formatters.m=r=>r==null?"undefined":oe.baseEncode(r);x.default.formatters.p=r=>r==null?"undefined":r.toString();x.default.formatters.c=r=>r==null?"undefined":r.toString();x.default.formatters.k=r=>r==null?"undefined":r.toString();x.default.formatters.a=r=>r==null?"undefined":r.toString();function ze(r){let e=()=>{};return e.enabled=!1,e.color="",e.diff=0,e.log=()=>{},e.namespace=r,e.destroy=()=>!0,e.extend=()=>e,e}function se(r){let e=ze(`${r}:trace`);return x.default.enabled(`${r}:trace`)&&x.default.names.map(t=>t.toString()).find(t=>t.includes(":trace"))!=null&&(e=(0,x.default)(`${r}:trace`)),Object.assign((0,x.default)(r),{error:(0,x.default)(`${r}:error`),trace:e})}function Ne(r){let[e,t]=r[Symbol.asyncIterator]!=null?[r[Symbol.asyncIterator](),Symbol.asyncIterator]:[r[Symbol.iterator](),Symbol.iterator],n=[];return{peek:()=>e.next(),push:s=>{n.push(s)},next:()=>n.length>0?{done:!1,value:n.shift()}:e.next(),[t](){return this}}}var ie=Ne;function je(r){return r[Symbol.asyncIterator]!=null}function ae(r){return r?.then!=null}function Le(r,e){let t=0;if(je(r))return async function*(){for await(let l of r){let E=e(l,t++);ae(E)&&await E,yield l}}();let n=ie(r),{value:s,done:d}=n.next();if(d===!0)return function*(){}();if(typeof e(s,t++)?.then=="function")return async function*(){yield s;for await(let l of n){let E=e(l,t++);ae(E)&&await E,yield l}}();let u=e;return function*(){yield s;for(let l of n)u(l,t++),yield l}()}var J=Le;var $e=se("libp2p:simple-metrics"),z=class{value=0;update(e){this.value=e}increment(e=1){this.value+=e}decrement(e=1){this.value-=e}reset(){this.value=0}timer(){let e=Date.now();return()=>{this.value=Date.now()-e}}},N=class{values={};update(e){Object.entries(e).forEach(([t,n])=>{this.values[t]=n})}increment(e){Object.entries(e).forEach(([t,n])=>{this.values[t]=this.values[t]??0;let s=typeof n=="number"?n:1;this.values[t]+=Number(s)})}decrement(e){Object.entries(e).forEach(([t,n])=>{this.values[t]=this.values[t]??0;let s=typeof n=="number"?n:1;this.values[t]-=Number(s)})}reset(){this.values={}}timer(e){let t=Date.now();return()=>{this.values[e]=Date.now()-t}}},T=class{metrics=new Map;transferStats;started;interval;intervalMs;onMetrics;constructor(e,t){this.started=!1,this._emitMetrics=this._emitMetrics.bind(this),this.intervalMs=t.intervalMs??1e3,this.onMetrics=t.onMetrics,this.transferStats=new Map}isStarted(){return this.started}start(){this.started=!0,this.interval=setInterval(this._emitMetrics,this.intervalMs)}stop(){this.started=!1,clearInterval(this.interval)}_emitMetrics(){Promise.resolve().then(async()=>{let e={};for(let[t,n]of this.metrics.entries())n instanceof z?e[t]=n.value:n instanceof N?e[t]=n.values:e[t]=await n();this.onMetrics(structuredClone(e))}).catch(e=>{$e.error("could not invoke onMetrics callback",e)})}_incrementValue(e,t){let n=this.transferStats.get(e)??0;this.transferStats.set(e,n+t)}_track(e,t){let n=this,s=e.sink;e.sink=async function(u){await s(J(u,l=>{n._incrementValue(`${t} sent`,l.byteLength)}))};let d=e.source;e.source=J(d,b=>{n._incrementValue(`${t} received`,b.byteLength)})}trackMultiaddrConnection(e){this._track(e,"global")}trackProtocolStream(e,t){e.protocol!=null&&this._track(e,e.protocol)}registerMetric(e,t={}){if(e==null||e.trim()==="")throw new Error("Metric name is required");if(t?.calculate!=null){this.metrics.set(e,t.calculate);return}let n=new z;return this.metrics.set(e,n),n}registerMetricGroup(e,t={}){if(e==null||e.trim()==="")throw new Error("Metric name is required");if(t?.calculate!=null){this.metrics.set(e,t.calculate);return}let n=new z;return this.metrics.set(e,n),n}registerCounter(e,t={}){if(e==null||e.trim()==="")throw new Error("Metric name is required");if(t?.calculate!=null){this.metrics.set(e,t.calculate);return}let n=new N;return this.metrics.set(e,n),n}registerCounterGroup(e,t={}){if(e==null||e.trim()==="")throw new Error("Metric name is required");if(t?.calculate!=null){this.metrics.set(e,t.calculate);return}let n=new N;return this.metrics.set(e,n),n}};function De(r){return e=>new T(e,r)}return be(_e);})();
3
3
  return Libp2PSimpleMetrics}));
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * @packageDocumentation
3
3
  *
4
- * Stores metrics in memory and periodically invokes a configured callback
5
- * to receive them.
4
+ * Stores metrics in memory and periodically invokes a configured callback to
5
+ * receive them.
6
6
  *
7
7
  * @example
8
8
  *
@@ -22,7 +22,7 @@
22
22
  *
23
23
  * ```
24
24
  */
25
- import type { Metrics } from '@libp2p/interface/metrics';
25
+ import type { Metrics } from '@libp2p/interface';
26
26
  export interface OnMetrics {
27
27
  (metrics: Record<string, any>): void;
28
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAKH,OAAO,KAAK,EAAkC,OAAO,EAAkF,MAAM,2BAA2B,CAAA;AAwExK,MAAM,WAAW,SAAS;IAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAA;CAAE;AAEnE,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB;;OAEG;IACH,SAAS,EAAE,SAAS,CAAA;CACrB;AA4ID,wBAAgB,aAAa,CAAE,IAAI,EAAE,iBAAiB,GAAG,CAAC,UAAU,EAAE,OAAO,KAAK,OAAO,CAExF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,OAAO,KAAK,EAAsF,OAAO,EAAkF,MAAM,mBAAmB,CAAA;AAyEpN,MAAM,WAAW,SAAS;IAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAA;CAAE;AAEnE,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB;;OAEG;IACH,SAAS,EAAE,SAAS,CAAA;CACrB;AAoLD,wBAAgB,aAAa,CAAE,IAAI,EAAE,iBAAiB,GAAG,CAAC,UAAU,EAAE,OAAO,KAAK,OAAO,CAExF"}
package/dist/src/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * @packageDocumentation
3
3
  *
4
- * Stores metrics in memory and periodically invokes a configured callback
5
- * to receive them.
4
+ * Stores metrics in memory and periodically invokes a configured callback to
5
+ * receive them.
6
6
  *
7
7
  * @example
8
8
  *
@@ -23,6 +23,7 @@
23
23
  * ```
24
24
  */
25
25
  import { logger } from '@libp2p/logger';
26
+ import each from 'it-foreach';
26
27
  const log = logger('libp2p:simple-metrics');
27
28
  class DefaultMetric {
28
29
  value = 0;
@@ -78,6 +79,7 @@ class DefaultGroupMetric {
78
79
  }
79
80
  class SimpleMetrics {
80
81
  metrics = new Map();
82
+ transferStats;
81
83
  started;
82
84
  interval;
83
85
  intervalMs;
@@ -87,6 +89,8 @@ class SimpleMetrics {
87
89
  this._emitMetrics = this._emitMetrics.bind(this);
88
90
  this.intervalMs = init.intervalMs ?? 1000;
89
91
  this.onMetrics = init.onMetrics;
92
+ // holds global and per-protocol sent/received stats
93
+ this.transferStats = new Map();
90
94
  }
91
95
  isStarted() {
92
96
  return this.started;
@@ -113,18 +117,50 @@ class SimpleMetrics {
113
117
  output[name] = await metric();
114
118
  }
115
119
  }
116
- this.onMetrics(JSON.parse(JSON.stringify(output)));
120
+ this.onMetrics(structuredClone(output));
117
121
  })
118
122
  .catch(err => {
119
123
  log.error('could not invoke onMetrics callback', err);
120
124
  });
121
125
  }
126
+ /**
127
+ * Increment the transfer stat for the passed key, making sure
128
+ * it exists first
129
+ */
130
+ _incrementValue(key, value) {
131
+ const existing = this.transferStats.get(key) ?? 0;
132
+ this.transferStats.set(key, existing + value);
133
+ }
134
+ /**
135
+ * Override the sink/source of the stream to count the bytes
136
+ * in and out
137
+ */
138
+ _track(stream, name) {
139
+ const self = this;
140
+ const sink = stream.sink;
141
+ stream.sink = async function trackedSink(source) {
142
+ await sink(each(source, buf => {
143
+ self._incrementValue(`${name} sent`, buf.byteLength);
144
+ }));
145
+ };
146
+ const source = stream.source;
147
+ stream.source = each(source, buf => {
148
+ self._incrementValue(`${name} received`, buf.byteLength);
149
+ });
150
+ }
122
151
  trackMultiaddrConnection(maConn) {
152
+ this._track(maConn, 'global');
123
153
  }
124
154
  trackProtocolStream(stream, connection) {
155
+ if (stream.protocol == null) {
156
+ // protocol not negotiated yet, should not happen as the upgrader
157
+ // calls this handler after protocol negotiation
158
+ return;
159
+ }
160
+ this._track(stream, stream.protocol);
125
161
  }
126
162
  registerMetric(name, opts = {}) {
127
- if (name == null ?? name.trim() === '') {
163
+ if (name == null || name.trim() === '') {
128
164
  throw new Error('Metric name is required');
129
165
  }
130
166
  if (opts?.calculate != null) {
@@ -137,7 +173,7 @@ class SimpleMetrics {
137
173
  return metric;
138
174
  }
139
175
  registerMetricGroup(name, opts = {}) {
140
- if (name == null ?? name.trim() === '') {
176
+ if (name == null || name.trim() === '') {
141
177
  throw new Error('Metric name is required');
142
178
  }
143
179
  if (opts?.calculate != null) {
@@ -150,7 +186,7 @@ class SimpleMetrics {
150
186
  return metric;
151
187
  }
152
188
  registerCounter(name, opts = {}) {
153
- if (name == null ?? name.trim() === '') {
189
+ if (name == null || name.trim() === '') {
154
190
  throw new Error('Metric name is required');
155
191
  }
156
192
  if (opts?.calculate != null) {
@@ -163,7 +199,7 @@ class SimpleMetrics {
163
199
  return metric;
164
200
  }
165
201
  registerCounterGroup(name, opts = {}) {
166
- if (name == null ?? name.trim() === '') {
202
+ if (name == null || name.trim() === '') {
167
203
  throw new Error('Metric name is required');
168
204
  }
169
205
  if (opts?.calculate != null) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,IAAI,MAAM,YAAY,CAAA;AAI7B,MAAM,GAAG,GAAG,MAAM,CAAC,uBAAuB,CAAC,CAAA;AAE3C,MAAM,aAAa;IACV,KAAK,GAAW,CAAC,CAAA;IAExB,MAAM,CAAE,KAAa;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IAED,SAAS,CAAE,QAAgB,CAAC;QAC1B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAA;IACrB,CAAC;IAED,SAAS,CAAE,QAAgB,CAAC;QAC1B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAA;IACrB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;IAChB,CAAC;IAED,KAAK;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAExB,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAA;QACjC,CAAC,CAAA;IACH,CAAC;CACF;AAED,MAAM,kBAAkB;IACf,MAAM,GAA2B,EAAE,CAAA;IAE1C,MAAM,CAAE,MAA8B;QACpC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YAC9C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QAC1B,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,SAAS,CAAE,MAAwC;QACjD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YAC9C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAEjD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAA;QACjC,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,SAAS,CAAE,MAAwC;QACjD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YAC9C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACxC,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAEjD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAA;QACjC,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,EAAE,CAAA;IAClB,CAAC;IAED,KAAK,CAAE,GAAW;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAExB,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAA;QACvC,CAAC,CAAA;IACH,CAAC;CACF;AAgBD,MAAM,aAAa;IACV,OAAO,GAAG,IAAI,GAAG,EAAgE,CAAA;IACvE,aAAa,CAAqB;IAC3C,OAAO,CAAS;IAChB,QAAQ,CAAiC;IAChC,UAAU,CAAQ;IAClB,SAAS,CAAW;IAErC,YAAa,UAAmB,EAAE,IAAuB;QACvD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QAEpB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEhD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAA;QACzC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;QAE/B,oDAAoD;QACpD,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,EAAE,CAAA;IAChC,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QAEnB,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;IACjE,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QAEpB,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC9B,CAAC;IAEO,YAAY;QAClB,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YACrC,MAAM,MAAM,GAAwB,EAAE,CAAA;YAEtC,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;gBACpD,IAAI,MAAM,YAAY,aAAa,EAAE,CAAC;oBACpC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAA;gBAC7B,CAAC;qBAAM,IAAI,MAAM,YAAY,kBAAkB,EAAE,CAAC;oBAChD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAA;gBAC9B,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,MAAM,EAAE,CAAA;gBAC/B,CAAC;YACH,CAAC;YAED,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAA;QACzC,CAAC,CAAC;aACC,KAAK,CAAC,GAAG,CAAC,EAAE;YACX,GAAG,CAAC,KAAK,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAA;QACvD,CAAC,CAAC,CAAA;IACN,CAAC;IAED;;;OAGG;IACH,eAAe,CAAE,GAAW,EAAE,KAAa;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAEjD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,GAAG,KAAK,CAAC,CAAA;IAC/C,CAAC;IAED;;;OAGG;IACH,MAAM,CAAE,MAAmC,EAAE,IAAY;QACvD,MAAM,IAAI,GAAG,IAAI,CAAA;QAEjB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;QACxB,MAAM,CAAC,IAAI,GAAG,KAAK,UAAU,WAAW,CAAE,MAAM;YAC9C,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;gBAC5B,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC,CAAA;YACtD,CAAC,CAAC,CAAC,CAAA;QACL,CAAC,CAAA;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;QAC5B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;YACjC,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,WAAW,EAAE,GAAG,CAAC,UAAU,CAAC,CAAA;QAC1D,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,wBAAwB,CAAE,MAA2B;QACnD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAC/B,CAAC;IAED,mBAAmB,CAAE,MAAc,EAAE,UAAsB;QACzD,IAAI,MAAM,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;YAC5B,iEAAiE;YACjE,gDAAgD;YAChD,OAAM;QACR,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;IACtC,CAAC;IAID,cAAc,CAAE,IAAY,EAAE,OAAY,EAAE;QAC1C,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;QAC5C,CAAC;QAED,IAAI,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE,CAAC;YAC5B,oBAAoB;YACpB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;YACtC,OAAM;QACR,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAA;QAClC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAE9B,OAAO,MAAM,CAAA;IACf,CAAC;IAID,mBAAmB,CAAE,IAAY,EAAE,OAAY,EAAE;QAC/C,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;QAC5C,CAAC;QAED,IAAI,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE,CAAC;YAC5B,oBAAoB;YACpB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;YACtC,OAAM;QACR,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAA;QAClC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAE9B,OAAO,MAAM,CAAA;IACf,CAAC;IAID,eAAe,CAAE,IAAY,EAAE,OAAY,EAAE;QAC3C,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;QAC5C,CAAC;QAED,IAAI,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE,CAAC;YAC5B,oBAAoB;YACpB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;YACtC,OAAM;QACR,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAA;QACvC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAE9B,OAAO,MAAM,CAAA;IACf,CAAC;IAID,oBAAoB,CAAE,IAAY,EAAE,OAAY,EAAE;QAChD,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;QAC5C,CAAC;QAED,IAAI,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE,CAAC;YAC5B,oBAAoB;YACpB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;YACtC,OAAM;QACR,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAA;QACvC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAE9B,OAAO,MAAM,CAAA;IACf,CAAC;CACF;AAED,MAAM,UAAU,aAAa,CAAE,IAAuB;IACpD,OAAO,CAAC,UAAmB,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;AACrE,CAAC"}
package/package.json CHANGED
@@ -1,15 +1,19 @@
1
1
  {
2
2
  "name": "@libp2p/simple-metrics",
3
- "version": "1.0.0",
3
+ "version": "1.0.1-1cc6a9405",
4
4
  "description": "Simple in-memory metrics gathering for libp2p",
5
5
  "license": "Apache-2.0 OR MIT",
6
- "homepage": "https://github.com/libp2p/js-libp2p-simple-metrics#readme",
6
+ "homepage": "https://github.com/libp2p/js-libp2p/tree/main/packages/metrics-simple#readme",
7
7
  "repository": {
8
8
  "type": "git",
9
- "url": "git+https://github.com/libp2p/js-libp2p-simple-metrics.git"
9
+ "url": "git+https://github.com/libp2p/js-libp2p.git"
10
10
  },
11
11
  "bugs": {
12
- "url": "https://github.com/libp2p/js-libp2p-simple-metrics/issues"
12
+ "url": "https://github.com/libp2p/js-libp2p/issues"
13
+ },
14
+ "publishConfig": {
15
+ "access": "public",
16
+ "provenance": true
13
17
  },
14
18
  "type": "module",
15
19
  "types": "./dist/src/index.d.ts",
@@ -28,94 +32,10 @@
28
32
  "eslintConfig": {
29
33
  "extends": "ipfs",
30
34
  "parserOptions": {
35
+ "project": true,
31
36
  "sourceType": "module"
32
37
  }
33
38
  },
34
- "release": {
35
- "branches": [
36
- "main"
37
- ],
38
- "plugins": [
39
- [
40
- "@semantic-release/commit-analyzer",
41
- {
42
- "preset": "conventionalcommits",
43
- "releaseRules": [
44
- {
45
- "breaking": true,
46
- "release": "major"
47
- },
48
- {
49
- "revert": true,
50
- "release": "patch"
51
- },
52
- {
53
- "type": "feat",
54
- "release": "minor"
55
- },
56
- {
57
- "type": "fix",
58
- "release": "patch"
59
- },
60
- {
61
- "type": "docs",
62
- "release": "patch"
63
- },
64
- {
65
- "type": "test",
66
- "release": "patch"
67
- },
68
- {
69
- "type": "deps",
70
- "release": "patch"
71
- },
72
- {
73
- "scope": "no-release",
74
- "release": false
75
- }
76
- ]
77
- }
78
- ],
79
- [
80
- "@semantic-release/release-notes-generator",
81
- {
82
- "preset": "conventionalcommits",
83
- "presetConfig": {
84
- "types": [
85
- {
86
- "type": "feat",
87
- "section": "Features"
88
- },
89
- {
90
- "type": "fix",
91
- "section": "Bug Fixes"
92
- },
93
- {
94
- "type": "chore",
95
- "section": "Trivial Changes"
96
- },
97
- {
98
- "type": "docs",
99
- "section": "Documentation"
100
- },
101
- {
102
- "type": "deps",
103
- "section": "Dependencies"
104
- },
105
- {
106
- "type": "test",
107
- "section": "Tests"
108
- }
109
- ]
110
- }
111
- }
112
- ],
113
- "@semantic-release/changelog",
114
- "@semantic-release/npm",
115
- "@semantic-release/github",
116
- "@semantic-release/git"
117
- ]
118
- },
119
39
  "scripts": {
120
40
  "clean": "aegir clean",
121
41
  "lint": "aegir lint",
@@ -130,11 +50,13 @@
130
50
  "dep-check": "aegir dep-check -i events"
131
51
  },
132
52
  "dependencies": {
133
- "@libp2p/interface": "^0.1.2",
134
- "@libp2p/logger": "^3.0.2"
53
+ "@libp2p/interface": "1.3.1-1cc6a9405",
54
+ "@libp2p/logger": "4.0.12-1cc6a9405",
55
+ "it-foreach": "^2.0.4",
56
+ "it-stream-types": "^2.0.1"
135
57
  },
136
58
  "devDependencies": {
137
- "aegir": "^40.0.13",
59
+ "aegir": "^42.2.11",
138
60
  "p-defer": "^4.0.0"
139
61
  }
140
62
  }
package/src/index.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * @packageDocumentation
3
3
  *
4
- * Stores metrics in memory and periodically invokes a configured callback
5
- * to receive them.
4
+ * Stores metrics in memory and periodically invokes a configured callback to
5
+ * receive them.
6
6
  *
7
7
  * @example
8
8
  *
@@ -24,9 +24,9 @@
24
24
  */
25
25
 
26
26
  import { logger } from '@libp2p/logger'
27
- import type { MultiaddrConnection, Stream, Connection } from '@libp2p/interface/connection'
28
- import type { Startable } from '@libp2p/interface/dist/src/startable'
29
- import type { Metric, MetricGroup, StopTimer, Metrics, CalculatedMetricOptions, MetricOptions, Counter, CounterGroup, CalculateMetric } from '@libp2p/interface/metrics'
27
+ import each from 'it-foreach'
28
+ import type { Startable, MultiaddrConnection, Stream, Connection, Metric, MetricGroup, StopTimer, Metrics, CalculatedMetricOptions, MetricOptions, Counter, CounterGroup, CalculateMetric } from '@libp2p/interface'
29
+ import type { Duplex } from 'it-stream-types'
30
30
 
31
31
  const log = logger('libp2p:simple-metrics')
32
32
 
@@ -114,6 +114,7 @@ export interface SimpleMetricsInit {
114
114
 
115
115
  class SimpleMetrics implements Metrics, Startable {
116
116
  public metrics = new Map<string, DefaultMetric | DefaultGroupMetric | CalculateMetric>()
117
+ private readonly transferStats: Map<string, number>
117
118
  private started: boolean
118
119
  private interval?: ReturnType<typeof setInterval>
119
120
  private readonly intervalMs: number
@@ -126,6 +127,9 @@ class SimpleMetrics implements Metrics, Startable {
126
127
 
127
128
  this.intervalMs = init.intervalMs ?? 1000
128
129
  this.onMetrics = init.onMetrics
130
+
131
+ // holds global and per-protocol sent/received stats
132
+ this.transferStats = new Map()
129
133
  }
130
134
 
131
135
  isStarted (): boolean {
@@ -158,25 +162,61 @@ class SimpleMetrics implements Metrics, Startable {
158
162
  }
159
163
  }
160
164
 
161
- this.onMetrics(JSON.parse(JSON.stringify(output)))
165
+ this.onMetrics(structuredClone(output))
162
166
  })
163
167
  .catch(err => {
164
168
  log.error('could not invoke onMetrics callback', err)
165
169
  })
166
170
  }
167
171
 
168
- trackMultiaddrConnection (maConn: MultiaddrConnection): void {
172
+ /**
173
+ * Increment the transfer stat for the passed key, making sure
174
+ * it exists first
175
+ */
176
+ _incrementValue (key: string, value: number): void {
177
+ const existing = this.transferStats.get(key) ?? 0
178
+
179
+ this.transferStats.set(key, existing + value)
180
+ }
181
+
182
+ /**
183
+ * Override the sink/source of the stream to count the bytes
184
+ * in and out
185
+ */
186
+ _track (stream: Duplex<AsyncGenerator<any>>, name: string): void {
187
+ const self = this
188
+
189
+ const sink = stream.sink
190
+ stream.sink = async function trackedSink (source) {
191
+ await sink(each(source, buf => {
192
+ self._incrementValue(`${name} sent`, buf.byteLength)
193
+ }))
194
+ }
195
+
196
+ const source = stream.source
197
+ stream.source = each(source, buf => {
198
+ self._incrementValue(`${name} received`, buf.byteLength)
199
+ })
200
+ }
169
201
 
202
+ trackMultiaddrConnection (maConn: MultiaddrConnection): void {
203
+ this._track(maConn, 'global')
170
204
  }
171
205
 
172
206
  trackProtocolStream (stream: Stream, connection: Connection): void {
207
+ if (stream.protocol == null) {
208
+ // protocol not negotiated yet, should not happen as the upgrader
209
+ // calls this handler after protocol negotiation
210
+ return
211
+ }
173
212
 
213
+ this._track(stream, stream.protocol)
174
214
  }
175
215
 
176
216
  registerMetric (name: string, opts: CalculatedMetricOptions): void
177
217
  registerMetric (name: string, opts?: MetricOptions): Metric
178
218
  registerMetric (name: string, opts: any = {}): any {
179
- if (name == null ?? name.trim() === '') {
219
+ if (name == null || name.trim() === '') {
180
220
  throw new Error('Metric name is required')
181
221
  }
182
222
 
@@ -195,7 +235,7 @@ class SimpleMetrics implements Metrics, Startable {
195
235
  registerMetricGroup (name: string, opts: CalculatedMetricOptions<Record<string, number>>): void
196
236
  registerMetricGroup (name: string, opts?: MetricOptions): MetricGroup
197
237
  registerMetricGroup (name: string, opts: any = {}): any {
198
- if (name == null ?? name.trim() === '') {
238
+ if (name == null || name.trim() === '') {
199
239
  throw new Error('Metric name is required')
200
240
  }
201
241
 
@@ -214,7 +254,7 @@ class SimpleMetrics implements Metrics, Startable {
214
254
  registerCounter (name: string, opts: CalculatedMetricOptions): void
215
255
  registerCounter (name: string, opts?: MetricOptions): Counter
216
256
  registerCounter (name: string, opts: any = {}): any {
217
- if (name == null ?? name.trim() === '') {
257
+ if (name == null || name.trim() === '') {
218
258
  throw new Error('Metric name is required')
219
259
  }
220
260
 
@@ -233,7 +273,7 @@ class SimpleMetrics implements Metrics, Startable {
233
273
  registerCounterGroup (name: string, opts: CalculatedMetricOptions<Record<string, number>>): void
234
274
  registerCounterGroup (name: string, opts?: MetricOptions): CounterGroup
235
275
  registerCounterGroup (name: string, opts: any = {}): any {
236
- if (name == null ?? name.trim() === '') {
276
+ if (name == null || name.trim() === '') {
237
277
  throw new Error('Metric name is required')
238
278
  }
239
279