@libp2p/simple-metrics 0.0.0 → 1.0.1
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/dist/index.min.js +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +37 -1
- package/dist/src/index.js.map +1 -1
- package/package.json +90 -2
- package/src/index.ts +44 -2
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 ae=Object.create;var P=Object.defineProperty;var ce=Object.getOwnPropertyDescriptor;var le=Object.getOwnPropertyNames;var ue=Object.getPrototypeOf,fe=Object.prototype.hasOwnProperty;var q=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),de=(r,e)=>{for(var t in e)P(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))!fe.call(r,s)&&s!==t&&P(r,s,{get:()=>e[s],enumerable:!(n=ce(e,s))||n.enumerable});return r};var he=(r,e,t)=>(t=r!=null?ae(ue(r)):{},G(e||!r||!r.__esModule?P(t,"default",{value:r,enumerable:!0}):t,r)),pe=r=>G(P({},"__esModule",{value:!0}),r);var Z=q((Le,X)=>{var U=1e3,I=U*60,O=I*60,S=O*24,be=S*7,me=S*365.25;X.exports=function(r,e){e=e||{};var t=typeof r;if(t==="string"&&r.length>0)return Ce(r);if(t==="number"&&isFinite(r))return e.long?we(r):ge(r);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(r))};function Ce(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*me;case"weeks":case"week":case"w":return t*be;case"days":case"day":case"d":return t*S;case"hours":case"hour":case"hrs":case"hr":case"h":return t*O;case"minutes":case"minute":case"mins":case"min":case"m":return t*I;case"seconds":case"second":case"secs":case"sec":case"s":return t*U;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return t;default:return}}}}function ge(r){var e=Math.abs(r);return e>=S?Math.round(r/S)+"d":e>=O?Math.round(r/O)+"h":e>=I?Math.round(r/I)+"m":e>=U?Math.round(r/U)+"s":r+"ms"}function we(r){var e=Math.abs(r);return e>=S?_(r,e,S,"day"):e>=O?_(r,e,O,"hour"):e>=I?_(r,e,I,"minute"):e>=U?_(r,e,U,"second"):r+" ms"}function _(r,e,t,n){var s=e>=t*1.5;return Math.round(r/t)+" "+n+(s?"s":"")}});var Q=q((Re,K)=>{function ye(r){t.debug=t,t.default=t,t.coerce=m,t.disable=f,t.enable=s,t.enabled=h,t.humanize=Z(),t.destroy=z,Object.keys(r).forEach(o=>{t[o]=r[o]}),t.names=[],t.skips=[],t.formatters={};function e(o){let i=0;for(let u=0;u<o.length;u++)i=(i<<5)-i+o.charCodeAt(u),i|=0;return t.colors[Math.abs(i)%t.colors.length]}t.selectColor=e;function t(o){let i,u=null,M,c;function l(...d){if(!l.enabled)return;let p=l,C=Number(new Date),x=C-(i||C);p.diff=x,p.prev=i,p.curr=C,i=C,d[0]=t.coerce(d[0]),typeof d[0]!="string"&&d.unshift("%O");let b=0;d[0]=d[0].replace(/%([a-zA-Z%])/g,(F,w)=>{if(F==="%%")return"%";b++;let A=t.formatters[w];if(typeof A=="function"){let k=d[b];F=A.call(p,k),d.splice(b,1),b--}return F}),t.formatArgs.call(p,d),(p.log||t.log).apply(p,d)}return l.namespace=o,l.useColors=t.useColors(),l.color=t.selectColor(o),l.extend=n,l.destroy=t.destroy,Object.defineProperty(l,"enabled",{enumerable:!0,configurable:!1,get:()=>u!==null?u:(M!==t.namespaces&&(M=t.namespaces,c=t.enabled(o)),c),set:d=>{u=d}}),typeof t.init=="function"&&t.init(l),l}function n(o,i){let u=t(this.namespace+(typeof i>"u"?":":i)+o);return u.log=this.log,u}function s(o){t.save(o),t.namespaces=o,t.names=[],t.skips=[];let i,u=(typeof o=="string"?o:"").split(/[\s,]+/),M=u.length;for(i=0;i<M;i++)u[i]&&(o=u[i].replace(/\*/g,".*?"),o[0]==="-"?t.skips.push(new RegExp("^"+o.slice(1)+"$")):t.names.push(new RegExp("^"+o+"$")))}function f(){let o=[...t.names.map(a),...t.skips.map(a).map(i=>"-"+i)].join(",");return t.enable(""),o}function h(o){if(o[o.length-1]==="*")return!0;let i,u;for(i=0,u=t.skips.length;i<u;i++)if(t.skips[i].test(o))return!1;for(i=0,u=t.names.length;i<u;i++)if(t.names[i].test(o))return!0;return!1}function a(o){return o.toString().substring(2,o.toString().length-2).replace(/\.\*\?$/,"*")}function m(o){return o instanceof Error?o.stack||o.message:o}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 t.enable(t.load()),t}K.exports=ye});var W=q((y,$)=>{y.formatArgs=xe;y.save=Fe;y.load=Ae;y.useColors=ve;y.storage=Ee();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 xe(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 Fe(r){try{r?y.storage.setItem("debug",r):y.storage.removeItem("debug")}catch{}}function Ae(){let r;try{r=y.storage.getItem("debug")}catch{}return!r&&typeof process<"u"&&"env"in process&&(r=process.env.DEBUG),r}function Ee(){try{return localStorage}catch{}}$.exports=Q()(y);var{formatters:Se}=$.exports;Se.j=function(r){try{return JSON.stringify(r)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}});var qe={};de(qe,{simpleMetrics:()=>$e});var v=he(W(),1);function Me(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 f=r.charAt(s),h=f.charCodeAt(0);if(t[h]!==255)throw new TypeError(f+" is ambiguous");t[h]=s}var a=r.length,m=r.charAt(0),z=Math.log(a)/Math.log(256),o=Math.log(256)/Math.log(a);function i(c){if(c instanceof Uint8Array||(ArrayBuffer.isView(c)?c=new Uint8Array(c.buffer,c.byteOffset,c.byteLength):Array.isArray(c)&&(c=Uint8Array.from(c))),!(c instanceof Uint8Array))throw new TypeError("Expected Uint8Array");if(c.length===0)return"";for(var l=0,d=0,p=0,C=c.length;p!==C&&c[p]===0;)p++,l++;for(var x=(C-p)*o+1>>>0,b=new Uint8Array(x);p!==C;){for(var E=c[p],F=0,w=x-1;(E!==0||F<d)&&w!==-1;w--,F++)E+=256*b[w]>>>0,b[w]=E%a>>>0,E=E/a>>>0;if(E!==0)throw new Error("Non-zero carry");d=F,p++}for(var A=x-d;A!==x&&b[A]===0;)A++;for(var k=m.repeat(l);A<x;++A)k+=r.charAt(b[A]);return k}function u(c){if(typeof c!="string")throw new TypeError("Expected String");if(c.length===0)return new Uint8Array;var l=0;if(c[l]!==" "){for(var d=0,p=0;c[l]===m;)d++,l++;for(var C=(c.length-l)*z+1>>>0,x=new Uint8Array(C);c[l];){var b=t[c.charCodeAt(l)];if(b===255)return;for(var E=0,F=C-1;(b!==0||E<p)&&F!==-1;F--,E++)b+=a*x[F]>>>0,x[F]=b%256>>>0,b=b/256>>>0;if(b!==0)throw new Error("Non-zero carry");p=E,l++}if(c[l]!==" "){for(var w=C-p;w!==C&&x[w]===0;)w++;for(var A=new Uint8Array(d+(C-w)),k=d;w!==C;)A[k++]=x[w++];return A}}}function M(c){var l=u(c);if(l)return l;throw new Error(`Non-${e} character`)}return{encode:i,decodeUnsafe:u,decode:M}}var ke=Me,Ue=ke,Y=Ue;var Be=new Uint8Array(0);var H=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")};var D=class{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")}},L=class{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{constructor(e){this.decoders=e}or(e){return ee(this,e)}decode(e){let t=e[0],n=this.decoders[t];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`)}},ee=(r,e)=>new R({...r.decoders||{[r.prefix]:r},...e.decoders||{[e.prefix]:e}}),V=class{constructor(e,t,n,s){this.name=e,this.prefix=t,this.baseEncode=n,this.baseDecode=s,this.encoder=new D(e,t,n),this.decoder=new L(e,t,s)}encode(e){return this.encoder.encode(e)}decode(e){return this.decoder.decode(e)}},te=({name:r,prefix:e,encode:t,decode:n})=>new V(r,e,t,n),B=({prefix:r,name:e,alphabet:t})=>{let{encode:n,decode:s}=Y(t,e);return te({prefix:r,name:e,encode:n,decode:f=>H(s(f))})},Ie=(r,e,t,n)=>{let s={};for(let o=0;o<e.length;++o)s[e[o]]=o;let f=r.length;for(;r[f-1]==="=";)--f;let h=new Uint8Array(f*t/8|0),a=0,m=0,z=0;for(let o=0;o<f;++o){let i=s[r[o]];if(i===void 0)throw new SyntaxError(`Non-${n} character`);m=m<<t|i,a+=t,a>=8&&(a-=8,h[z++]=255&m>>a)}if(a>=t||255&m<<8-a)throw new SyntaxError("Unexpected end of data");return h},Oe=(r,e,t)=>{let n=e[e.length-1]==="=",s=(1<<t)-1,f="",h=0,a=0;for(let m=0;m<r.length;++m)for(a=a<<8|r[m],h+=8;h>t;)h-=t,f+=e[s&a>>h];if(h&&(f+=e[s&a<<t-h]),n)for(;f.length*t&7;)f+="=";return f},g=({name:r,prefix:e,bitsPerChar:t,alphabet:n})=>te({prefix:e,name:r,encode(s){return Oe(s,n,t)},decode(s){return Ie(s,n,t,r)}});var re=g({prefix:"b",name:"base32",alphabet:"abcdefghijklmnopqrstuvwxyz234567",bitsPerChar:5}),Ke=g({prefix:"B",name:"base32upper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",bitsPerChar:5}),Qe=g({prefix:"c",name:"base32pad",alphabet:"abcdefghijklmnopqrstuvwxyz234567=",bitsPerChar:5}),We=g({prefix:"C",name:"base32padupper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",bitsPerChar:5}),Ye=g({prefix:"v",name:"base32hex",alphabet:"0123456789abcdefghijklmnopqrstuv",bitsPerChar:5}),He=g({prefix:"V",name:"base32hexupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV",bitsPerChar:5}),et=g({prefix:"t",name:"base32hexpad",alphabet:"0123456789abcdefghijklmnopqrstuv=",bitsPerChar:5}),tt=g({prefix:"T",name:"base32hexpadupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV=",bitsPerChar:5}),rt=g({prefix:"h",name:"base32z",alphabet:"ybndrfg8ejkmcpqxot1uwisza345h769",bitsPerChar:5});var ne=B({name:"base58btc",prefix:"z",alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"}),st=B({name:"base58flickr",prefix:"Z",alphabet:"123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"});var oe=g({prefix:"m",name:"base64",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",bitsPerChar:6}),ct=g({prefix:"M",name:"base64pad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",bitsPerChar:6}),lt=g({prefix:"u",name:"base64url",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",bitsPerChar:6}),ut=g({prefix:"U",name:"base64urlpad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=",bitsPerChar:6});v.default.formatters.b=r=>r==null?"undefined":ne.baseEncode(r);v.default.formatters.t=r=>r==null?"undefined":re.baseEncode(r);v.default.formatters.m=r=>r==null?"undefined":oe.baseEncode(r);v.default.formatters.p=r=>r==null?"undefined":r.toString();v.default.formatters.c=r=>r==null?"undefined":r.toString();v.default.formatters.k=r=>r==null?"undefined":r.toString();v.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 v.default.enabled(`${r}:trace`)&&v.default.names.map(t=>t.toString()).find(t=>t.includes(":trace"))!=null&&(e=(0,v.default)(`${r}:trace`)),Object.assign((0,v.default)(r),{error:(0,v.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 Pe(r,e){if(je(r))return async function*(){for await(let a of r)await e(a),yield a}();let t=ie(r),{value:n,done:s}=t.next();if(s===!0)return function*(){}();if(typeof e(n)?.then=="function")return async function*(){yield n;for await(let a of t)await e(a),yield a}();let h=e;return function*(){yield n;for(let a of t)h(a),yield a}()}var J=Pe;var _e=se("libp2p:simple-metrics"),N=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}}},j=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 N?e[t]=n.value:n instanceof j?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(a){await s(J(a,m=>{n._incrementValue(`${t} sent`,m.byteLength)}))};let f=e.source;e.source=J(f,h=>{n._incrementValue(`${t} received`,h.byteLength)})}trackMultiaddrConnection(e){this._track(e,"global")}trackProtocolStream(e,t){e.protocol!=null&&this._track(e,e.protocol)}registerMetric(e,t={}){if(e==null)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}registerMetricGroup(e,t={}){if(e==null)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)throw new Error("Metric name is required");if(t?.calculate!=null){this.metrics.set(e,t.calculate);return}let n=new j;return this.metrics.set(e,n),n}registerCounterGroup(e,t={}){if(e==null)throw new Error("Metric name is required");if(t?.calculate!=null){this.metrics.set(e,t.calculate);return}let n=new j;return this.metrics.set(e,n),n}};function $e(r){return e=>new T(e,r)}return pe(qe);})();
|
|
3
3
|
return Libp2PSimpleMetrics}));
|
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;AAMH,OAAO,KAAK,EAAkC,OAAO,EAAkF,MAAM,2BAA2B,CAAA;AAyExK,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
|
@@ -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,15 +117,47 @@ 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
163
|
if (name == null ?? name.trim() === '') {
|
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":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libp2p/simple-metrics",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Simple in-memory metrics gathering for libp2p",
|
|
5
5
|
"license": "Apache-2.0 OR MIT",
|
|
6
6
|
"homepage": "https://github.com/libp2p/js-libp2p-simple-metrics#readme",
|
|
@@ -31,6 +31,91 @@
|
|
|
31
31
|
"sourceType": "module"
|
|
32
32
|
}
|
|
33
33
|
},
|
|
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
|
+
},
|
|
34
119
|
"scripts": {
|
|
35
120
|
"clean": "aegir clean",
|
|
36
121
|
"lint": "aegir lint",
|
|
@@ -41,11 +126,14 @@
|
|
|
41
126
|
"test:chrome-webworker": "aegir test -t webworker",
|
|
42
127
|
"test:firefox": "aegir test -t browser -- --browser firefox",
|
|
43
128
|
"test:firefox-webworker": "aegir test -t webworker -- --browser firefox",
|
|
129
|
+
"release": "aegir release",
|
|
44
130
|
"dep-check": "aegir dep-check -i events"
|
|
45
131
|
},
|
|
46
132
|
"dependencies": {
|
|
47
133
|
"@libp2p/interface": "^0.1.2",
|
|
48
|
-
"@libp2p/logger": "^3.0.2"
|
|
134
|
+
"@libp2p/logger": "^3.0.2",
|
|
135
|
+
"it-foreach": "^2.0.4",
|
|
136
|
+
"it-stream-types": "^2.0.1"
|
|
49
137
|
},
|
|
50
138
|
"devDependencies": {
|
|
51
139
|
"aegir": "^40.0.13",
|
package/src/index.ts
CHANGED
|
@@ -24,9 +24,11 @@
|
|
|
24
24
|
*/
|
|
25
25
|
|
|
26
26
|
import { logger } from '@libp2p/logger'
|
|
27
|
+
import each from 'it-foreach'
|
|
27
28
|
import type { MultiaddrConnection, Stream, Connection } from '@libp2p/interface/connection'
|
|
28
29
|
import type { Startable } from '@libp2p/interface/dist/src/startable'
|
|
29
30
|
import type { Metric, MetricGroup, StopTimer, Metrics, CalculatedMetricOptions, MetricOptions, Counter, CounterGroup, CalculateMetric } from '@libp2p/interface/metrics'
|
|
31
|
+
import type { Duplex, Source } from 'it-stream-types'
|
|
30
32
|
|
|
31
33
|
const log = logger('libp2p:simple-metrics')
|
|
32
34
|
|
|
@@ -114,6 +116,7 @@ export interface SimpleMetricsInit {
|
|
|
114
116
|
|
|
115
117
|
class SimpleMetrics implements Metrics, Startable {
|
|
116
118
|
public metrics = new Map<string, DefaultMetric | DefaultGroupMetric | CalculateMetric>()
|
|
119
|
+
private readonly transferStats: Map<string, number>
|
|
117
120
|
private started: boolean
|
|
118
121
|
private interval?: ReturnType<typeof setInterval>
|
|
119
122
|
private readonly intervalMs: number
|
|
@@ -126,6 +129,9 @@ class SimpleMetrics implements Metrics, Startable {
|
|
|
126
129
|
|
|
127
130
|
this.intervalMs = init.intervalMs ?? 1000
|
|
128
131
|
this.onMetrics = init.onMetrics
|
|
132
|
+
|
|
133
|
+
// holds global and per-protocol sent/received stats
|
|
134
|
+
this.transferStats = new Map()
|
|
129
135
|
}
|
|
130
136
|
|
|
131
137
|
isStarted (): boolean {
|
|
@@ -158,19 +164,55 @@ class SimpleMetrics implements Metrics, Startable {
|
|
|
158
164
|
}
|
|
159
165
|
}
|
|
160
166
|
|
|
161
|
-
this.onMetrics(output)
|
|
167
|
+
this.onMetrics(structuredClone(output))
|
|
162
168
|
})
|
|
163
169
|
.catch(err => {
|
|
164
170
|
log.error('could not invoke onMetrics callback', err)
|
|
165
171
|
})
|
|
166
172
|
}
|
|
167
173
|
|
|
168
|
-
|
|
174
|
+
/**
|
|
175
|
+
* Increment the transfer stat for the passed key, making sure
|
|
176
|
+
* it exists first
|
|
177
|
+
*/
|
|
178
|
+
_incrementValue (key: string, value: number): void {
|
|
179
|
+
const existing = this.transferStats.get(key) ?? 0
|
|
180
|
+
|
|
181
|
+
this.transferStats.set(key, existing + value)
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Override the sink/source of the stream to count the bytes
|
|
186
|
+
* in and out
|
|
187
|
+
*/
|
|
188
|
+
_track (stream: Duplex<Source<any>>, name: string): void {
|
|
189
|
+
const self = this
|
|
190
|
+
|
|
191
|
+
const sink = stream.sink
|
|
192
|
+
stream.sink = async function trackedSink (source) {
|
|
193
|
+
await sink(each(source, buf => {
|
|
194
|
+
self._incrementValue(`${name} sent`, buf.byteLength)
|
|
195
|
+
}))
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
const source = stream.source
|
|
199
|
+
stream.source = each(source, buf => {
|
|
200
|
+
self._incrementValue(`${name} received`, buf.byteLength)
|
|
201
|
+
})
|
|
202
|
+
}
|
|
169
203
|
|
|
204
|
+
trackMultiaddrConnection (maConn: MultiaddrConnection): void {
|
|
205
|
+
this._track(maConn, 'global')
|
|
170
206
|
}
|
|
171
207
|
|
|
172
208
|
trackProtocolStream (stream: Stream, connection: Connection): void {
|
|
209
|
+
if (stream.protocol == null) {
|
|
210
|
+
// protocol not negotiated yet, should not happen as the upgrader
|
|
211
|
+
// calls this handler after protocol negotiation
|
|
212
|
+
return
|
|
213
|
+
}
|
|
173
214
|
|
|
215
|
+
this._track(stream, stream.protocol)
|
|
174
216
|
}
|
|
175
217
|
|
|
176
218
|
registerMetric (name: string, opts: CalculatedMetricOptions): void
|