@libp2p/simple-metrics 0.0.0 → 1.0.1-1a41c28bb
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 +49 -14
- package/dist/index.min.js +1 -1
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +45 -9
- package/dist/src/index.js.map +1 -1
- package/package.json +15 -7
- package/src/index.ts +53 -13
package/README.md
CHANGED
|
@@ -1,26 +1,57 @@
|
|
|
1
|
-
# @libp2p/simple-metrics
|
|
1
|
+
# @libp2p/simple-metrics
|
|
2
2
|
|
|
3
3
|
[](http://libp2p.io/)
|
|
4
4
|
[](https://discuss.libp2p.io)
|
|
5
|
-
[](https://codecov.io/gh/libp2p/js-libp2p)
|
|
6
|
+
[](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
|
-
|
|
10
|
+
# About
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
- [Browser `<script>` tag](#browser-script-tag)
|
|
14
|
-
- [License](#license)
|
|
15
|
-
- [Contribution](#contribution)
|
|
12
|
+
<!--
|
|
16
13
|
|
|
17
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 ie=Object.create;var j=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var ce=Object.getPrototypeOf,ue=Object.prototype.hasOwnProperty;var D=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),le=(t,e)=>{for(var r in e)j(t,r,{get:e[r],enumerable:!0})},V=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of ae(e))!ue.call(t,i)&&i!==r&&j(t,i,{get:()=>e[i],enumerable:!(n=se(e,i))||n.enumerable});return t};var de=(t,e,r)=>(r=t!=null?ie(ce(t)):{},V(e||!t||!t.__esModule?j(r,"default",{value:t,enumerable:!0}):r,t)),fe=t=>V(j({},"__esModule",{value:!0}),t);var X=D((je,_)=>{var U=1e3,k=U*60,R=k*60,E=R*24,pe=E*7,he=E*365.25;_.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*he;case"weeks":case"week":case"w":return r*pe;case"days":case"day":case"d":return r*E;case"hours":case"hour":case"hrs":case"hr":case"h":return r*R;case"minutes":case"minute":case"mins":case"min":case"m":return r*k;case"seconds":case"second":case"secs":case"sec":case"s":return r*U;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return r;default:return}}}}function be(t){var e=Math.abs(t);return e>=E?Math.round(t/E)+"d":e>=R?Math.round(t/R)+"h":e>=k?Math.round(t/k)+"m":e>=U?Math.round(t/U)+"s":t+"ms"}function Ce(t){var e=Math.abs(t);return e>=E?G(t,e,E,"day"):e>=R?G(t,e,R,"hour"):e>=k?G(t,e,k,"minute"):e>=U?G(t,e,U,"second"):t+" ms"}function G(t,e,r,n){var i=e>=r*1.5;return Math.round(t/r)+" "+n+(i?"s":"")}});var K=D((Ge,Z)=>{function ge(t){r.debug=r,r.default=r,r.coerce=g,r.disable=p,r.enable=i,r.enabled=C,r.humanize=X(),r.destroy=I,Object.keys(t).forEach(o=>{r[o]=t[o]}),r.names=[],r.skips=[],r.formatters={};function e(o){let s=0;for(let u=0;u<o.length;u++)s=(s<<5)-s+o.charCodeAt(u),s|=0;return r.colors[Math.abs(s)%r.colors.length]}r.selectColor=e;function r(o){let s,u=null,S,a;function c(...d){if(!c.enabled)return;let f=c,m=Number(new Date),x=m-(s||m);f.diff=x,f.prev=s,f.curr=m,s=m,d[0]=r.coerce(d[0]),typeof d[0]!="string"&&d.unshift("%O");let h=0;d[0]=d[0].replace(/%([a-zA-Z%])/g,(F,w)=>{if(F==="%%")return"%";h++;let M=r.formatters[w];if(typeof M=="function"){let O=d[h];F=M.call(f,O),d.splice(h,1),h--}return F}),r.formatArgs.call(f,d),(f.log||r.log).apply(f,d)}return c.namespace=o,c.useColors=r.useColors(),c.color=r.selectColor(o),c.extend=n,c.destroy=r.destroy,Object.defineProperty(c,"enabled",{enumerable:!0,configurable:!1,get:()=>u!==null?u:(S!==r.namespaces&&(S=r.namespaces,a=r.enabled(o)),a),set:d=>{u=d}}),typeof r.init=="function"&&r.init(c),c}function n(o,s){let u=r(this.namespace+(typeof s>"u"?":":s)+o);return u.log=this.log,u}function i(o){r.save(o),r.namespaces=o,r.names=[],r.skips=[];let s,u=(typeof o=="string"?o:"").split(/[\s,]+/),S=u.length;for(s=0;s<S;s++)u[s]&&(o=u[s].replace(/\*/g,".*?"),o[0]==="-"?r.skips.push(new RegExp("^"+o.slice(1)+"$")):r.names.push(new RegExp("^"+o+"$")))}function p(){let o=[...r.names.map(l),...r.skips.map(l).map(s=>"-"+s)].join(",");return r.enable(""),o}function C(o){if(o[o.length-1]==="*")return!0;let s,u;for(s=0,u=r.skips.length;s<u;s++)if(r.skips[s].test(o))return!1;for(s=0,u=r.names.length;s<u;s++)if(r.names[s].test(o))return!0;return!1}function l(o){return o.toString().substring(2,o.toString().length-2).replace(/\.\*\?$/,"*")}function g(o){return o instanceof Error?o.stack||o.message:o}function I(){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=D((v,P)=>{v.formatArgs=ve;v.save=ye;v.load=xe;v.useColors=we;v.storage=Fe();v.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`."))}})();v.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 ve(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+P.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,i=>{i!=="%%"&&(r++,i==="%c"&&(n=r))}),t.splice(n,0,e)}v.log=console.debug||console.log||(()=>{});function ye(t){try{t?v.storage.setItem("debug",t):v.storage.removeItem("debug")}catch{}}function xe(){let t;try{t=v.storage.getItem("debug")}catch{}return!t&&typeof process<"u"&&"env"in process&&(t=process.env.DEBUG),t}function Fe(){try{return localStorage}catch{}}P.exports=K()(v);var{formatters:Me}=P.exports;Me.j=function(t){try{return JSON.stringify(t)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}});var ze={};le(ze,{simpleMetrics:()=>Ie});var y=de(Q(),1);function Ae(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 i=0;i<t.length;i++){var p=t.charAt(i),C=p.charCodeAt(0);if(r[C]!==255)throw new TypeError(p+" is ambiguous");r[C]=i}var l=t.length,g=t.charAt(0),I=Math.log(l)/Math.log(256),o=Math.log(256)/Math.log(l);function s(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,d=0,f=0,m=a.length;f!==m&&a[f]===0;)f++,c++;for(var x=(m-f)*o+1>>>0,h=new Uint8Array(x);f!==m;){for(var A=a[f],F=0,w=x-1;(A!==0||F<d)&&w!==-1;w--,F++)A+=256*h[w]>>>0,h[w]=A%l>>>0,A=A/l>>>0;if(A!==0)throw new Error("Non-zero carry");d=F,f++}for(var M=x-d;M!==x&&h[M]===0;)M++;for(var O=g.repeat(c);M<x;++M)O+=t.charAt(h[M]);return O}function u(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 d=0,f=0;a[c]===g;)d++,c++;for(var m=(a.length-c)*I+1>>>0,x=new Uint8Array(m);a[c];){var h=r[a.charCodeAt(c)];if(h===255)return;for(var A=0,F=m-1;(h!==0||A<f)&&F!==-1;F--,A++)h+=l*x[F]>>>0,x[F]=h%256>>>0,h=h/256>>>0;if(h!==0)throw new Error("Non-zero carry");f=A,c++}if(a[c]!==" "){for(var w=m-f;w!==m&&x[w]===0;)w++;for(var M=new Uint8Array(d+(m-w)),O=d;w!==m;)M[O++]=x[w++];return M}}}function S(a){var c=u(a);if(c)return c;throw new Error(`Non-${e} character`)}return{encode:s,decodeUnsafe:u,decode:S}}var Ee=Ae,Se=Ee,W=Se;var De=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 T=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")}},q=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)}},$=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 $({...t.decoders||{[t.prefix]:t},...e.decoders||{[e.prefix]:e}}),L=class{constructor(e,r,n,i){this.name=e,this.prefix=r,this.baseEncode=n,this.baseDecode=i,this.encoder=new T(e,r,n),this.decoder=new q(e,r,i)}encode(e){return this.encoder.encode(e)}decode(e){return this.decoder.decode(e)}},ee=({name:t,prefix:e,encode:r,decode:n})=>new L(t,e,r,n),B=({prefix:t,name:e,alphabet:r})=>{let{encode:n,decode:i}=W(r,e);return ee({prefix:t,name:e,encode:n,decode:p=>Y(i(p))})},Oe=(t,e,r,n)=>{let i={};for(let o=0;o<e.length;++o)i[e[o]]=o;let p=t.length;for(;t[p-1]==="=";)--p;let C=new Uint8Array(p*r/8|0),l=0,g=0,I=0;for(let o=0;o<p;++o){let s=i[t[o]];if(s===void 0)throw new SyntaxError(`Non-${n} character`);g=g<<r|s,l+=r,l>=8&&(l-=8,C[I++]=255&g>>l)}if(l>=r||255&g<<8-l)throw new SyntaxError("Unexpected end of data");return C},Ue=(t,e,r)=>{let n=e[e.length-1]==="=",i=(1<<r)-1,p="",C=0,l=0;for(let g=0;g<t.length;++g)for(l=l<<8|t[g],C+=8;C>r;)C-=r,p+=e[i&l>>C];if(C&&(p+=e[i&l<<r-C]),n)for(;p.length*r&7;)p+="=";return p},b=({name:t,prefix:e,bitsPerChar:r,alphabet:n})=>ee({prefix:e,name:t,encode(i){return Ue(i,n,r)},decode(i){return Oe(i,n,r,t)}});var re=b({prefix:"b",name:"base32",alphabet:"abcdefghijklmnopqrstuvwxyz234567",bitsPerChar:5}),Je=b({prefix:"B",name:"base32upper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",bitsPerChar:5}),Ve=b({prefix:"c",name:"base32pad",alphabet:"abcdefghijklmnopqrstuvwxyz234567=",bitsPerChar:5}),_e=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=B({name:"base58btc",prefix:"z",alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"}),er=B({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}),or=b({prefix:"u",name:"base64url",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",bitsPerChar:6}),ir=b({prefix:"U",name:"base64urlpad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=",bitsPerChar:6});y.default.formatters.b=t=>t==null?"undefined":te.baseEncode(t);y.default.formatters.t=t=>t==null?"undefined":re.baseEncode(t);y.default.formatters.m=t=>t==null?"undefined":ne.baseEncode(t);y.default.formatters.p=t=>t==null?"undefined":t.toString();y.default.formatters.c=t=>t==null?"undefined":t.toString();y.default.formatters.k=t=>t==null?"undefined":t.toString();y.default.formatters.a=t=>t==null?"undefined":t.toString();function ke(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 oe(t){let e=ke(`${t}:trace`);return y.default.enabled(`${t}:trace`)&&y.default.names.map(r=>r.toString()).find(r=>r.includes(":trace"))!=null&&(e=(0,y.default)(`${t}:trace`)),Object.assign((0,y.default)(t),{error:(0,y.default)(`${t}:error`),trace:e})}var Re=oe("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(([r,n])=>{this.values[r]=n})}increment(e){Object.entries(e).forEach(([r,n])=>{this.values[r]=this.values[r]??0;let i=typeof n=="number"?n:1;this.values[r]+=Number(i)})}decrement(e){Object.entries(e).forEach(([r,n])=>{this.values[r]=this.values[r]??0;let i=typeof n=="number"?n:1;this.values[r]-=Number(i)})}reset(){this.values={}}timer(e){let r=Date.now();return()=>{this.values[e]=Date.now()-r}}},J=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 z?e[r]=n.value:n instanceof N?e[r]=n.values:e[r]=await n();this.onMetrics(e)}).catch(e=>{Re.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 z;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 z;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 N;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 N;return this.metrics.set(e,n),n}};function Ie(t){return e=>new J(e,t)}return fe(ze);})();
|
|
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 N;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 z;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}));
|
package/dist/src/index.d.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
|
-
*
|
|
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
|
|
25
|
+
import type { Metrics } from '@libp2p/interface';
|
|
26
26
|
export interface OnMetrics {
|
|
27
27
|
(metrics: Record<string, any>): void;
|
|
28
28
|
}
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;
|
|
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
|
-
*
|
|
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(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
|
|
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
|
|
176
|
+
if (name == null || name.trim() === '') {
|
|
141
177
|
throw new Error('Metric name is required');
|
|
142
178
|
}
|
|
143
179
|
if (opts?.calculate != null) {
|
|
@@ -145,12 +181,12 @@ class SimpleMetrics {
|
|
|
145
181
|
this.metrics.set(name, opts.calculate);
|
|
146
182
|
return;
|
|
147
183
|
}
|
|
148
|
-
const metric = new
|
|
184
|
+
const metric = new DefaultGroupMetric();
|
|
149
185
|
this.metrics.set(name, metric);
|
|
150
186
|
return metric;
|
|
151
187
|
}
|
|
152
188
|
registerCounter(name, opts = {}) {
|
|
153
|
-
if (name == null
|
|
189
|
+
if (name == null || name.trim() === '') {
|
|
154
190
|
throw new Error('Metric name is required');
|
|
155
191
|
}
|
|
156
192
|
if (opts?.calculate != null) {
|
|
@@ -158,12 +194,12 @@ class SimpleMetrics {
|
|
|
158
194
|
this.metrics.set(name, opts.calculate);
|
|
159
195
|
return;
|
|
160
196
|
}
|
|
161
|
-
const metric = new
|
|
197
|
+
const metric = new DefaultMetric();
|
|
162
198
|
this.metrics.set(name, metric);
|
|
163
199
|
return metric;
|
|
164
200
|
}
|
|
165
201
|
registerCounterGroup(name, opts = {}) {
|
|
166
|
-
if (name == null
|
|
202
|
+
if (name == null || name.trim() === '') {
|
|
167
203
|
throw new Error('Metric name is required');
|
|
168
204
|
}
|
|
169
205
|
if (opts?.calculate != null) {
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;
|
|
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,kBAAkB,EAAE,CAAA;QACvC,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,aAAa,EAAE,CAAA;QAClC,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": "
|
|
3
|
+
"version": "1.0.1-1a41c28bb",
|
|
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
|
|
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
|
|
9
|
+
"url": "git+https://github.com/libp2p/js-libp2p.git"
|
|
10
10
|
},
|
|
11
11
|
"bugs": {
|
|
12
|
-
"url": "https://github.com/libp2p/js-libp2p
|
|
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,6 +32,7 @@
|
|
|
28
32
|
"eslintConfig": {
|
|
29
33
|
"extends": "ipfs",
|
|
30
34
|
"parserOptions": {
|
|
35
|
+
"project": true,
|
|
31
36
|
"sourceType": "module"
|
|
32
37
|
}
|
|
33
38
|
},
|
|
@@ -41,14 +46,17 @@
|
|
|
41
46
|
"test:chrome-webworker": "aegir test -t webworker",
|
|
42
47
|
"test:firefox": "aegir test -t browser -- --browser firefox",
|
|
43
48
|
"test:firefox-webworker": "aegir test -t webworker -- --browser firefox",
|
|
49
|
+
"release": "aegir release",
|
|
44
50
|
"dep-check": "aegir dep-check -i events"
|
|
45
51
|
},
|
|
46
52
|
"dependencies": {
|
|
47
|
-
"@libp2p/interface": "
|
|
48
|
-
"@libp2p/logger": "
|
|
53
|
+
"@libp2p/interface": "1.3.1-1a41c28bb",
|
|
54
|
+
"@libp2p/logger": "4.0.12-1a41c28bb",
|
|
55
|
+
"it-foreach": "^2.0.4",
|
|
56
|
+
"it-stream-types": "^2.0.1"
|
|
49
57
|
},
|
|
50
58
|
"devDependencies": {
|
|
51
|
-
"aegir": "^
|
|
59
|
+
"aegir": "^42.2.11",
|
|
52
60
|
"p-defer": "^4.0.0"
|
|
53
61
|
}
|
|
54
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
|
-
*
|
|
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
|
|
28
|
-
import type { Startable } from '@libp2p/interface
|
|
29
|
-
import type {
|
|
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(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
|
-
|
|
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
|
+
}
|
|
169
195
|
|
|
196
|
+
const source = stream.source
|
|
197
|
+
stream.source = each(source, buf => {
|
|
198
|
+
self._incrementValue(`${name} received`, buf.byteLength)
|
|
199
|
+
})
|
|
200
|
+
}
|
|
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
|
|
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
|
|
238
|
+
if (name == null || name.trim() === '') {
|
|
199
239
|
throw new Error('Metric name is required')
|
|
200
240
|
}
|
|
201
241
|
|
|
@@ -205,7 +245,7 @@ class SimpleMetrics implements Metrics, Startable {
|
|
|
205
245
|
return
|
|
206
246
|
}
|
|
207
247
|
|
|
208
|
-
const metric = new
|
|
248
|
+
const metric = new DefaultGroupMetric()
|
|
209
249
|
this.metrics.set(name, metric)
|
|
210
250
|
|
|
211
251
|
return metric
|
|
@@ -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
|
|
257
|
+
if (name == null || name.trim() === '') {
|
|
218
258
|
throw new Error('Metric name is required')
|
|
219
259
|
}
|
|
220
260
|
|
|
@@ -224,7 +264,7 @@ class SimpleMetrics implements Metrics, Startable {
|
|
|
224
264
|
return
|
|
225
265
|
}
|
|
226
266
|
|
|
227
|
-
const metric = new
|
|
267
|
+
const metric = new DefaultMetric()
|
|
228
268
|
this.metrics.set(name, metric)
|
|
229
269
|
|
|
230
270
|
return metric
|
|
@@ -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
|
|
276
|
+
if (name == null || name.trim() === '') {
|
|
237
277
|
throw new Error('Metric name is required')
|
|
238
278
|
}
|
|
239
279
|
|