@libp2p/devtools-metrics 0.0.0 → 0.0.1-7464dc00c
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 +1 -1
- package/dist/index.min.js +1 -1
- package/dist/src/index.d.ts +109 -39
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +104 -79
- package/dist/src/index.js.map +1 -1
- package/package.json +8 -7
- package/src/index.ts +233 -124
- package/dist/typedoc-urls.json +0 -28
package/README.md
CHANGED
|
@@ -28,7 +28,7 @@ Configure your browser-based libp2p node with DevTools metrics:
|
|
|
28
28
|
|
|
29
29
|
```typescript
|
|
30
30
|
import { createLibp2p } from 'libp2p'
|
|
31
|
-
import {
|
|
31
|
+
import { devToolsMetrics } from '@libp2p/devtools-metrics'
|
|
32
32
|
|
|
33
33
|
const node = await createLibp2p({
|
|
34
34
|
metrics: devToolsMetrics()
|
package/dist/index.min.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
(function (root, factory) {(typeof module === 'object' && module.exports) ? module.exports = factory() : root.Libp2PDevtoolsMetrics = factory()}(typeof self !== 'undefined' ? self : this, function () {
|
|
2
|
-
"use strict";var Libp2PDevtoolsMetrics=(()=>{var ge=Object.create;var j=Object.defineProperty;var be=Object.getOwnPropertyDescriptor;var Ce=Object.getOwnPropertyNames;var we=Object.getPrototypeOf,ve=Object.prototype.hasOwnProperty;var $=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),ye=(r,e)=>{for(var t in e)j(r,t,{get:e[t],enumerable:!0})},Z=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Ce(e))!ve.call(r,s)&&s!==t&&j(r,s,{get:()=>e[s],enumerable:!(n=be(e,s))||n.enumerable});return r};var xe=(r,e,t)=>(t=r!=null?ge(we(r)):{},Z(e||!r||!r.__esModule?j(t,"default",{value:r,enumerable:!0}):t,r)),Fe=r=>Z(j({},"__esModule",{value:!0}),r);var H=$((He,Y)=>{var U=1e3,I=U*60,L=I*60,A=L*24,Me=A*7,Se=A*365.25;Y.exports=function(r,e){e=e||{};var t=typeof r;if(t==="string"&&r.length>0)return Ee(r);if(t==="number"&&isFinite(r))return e.long?Pe(r):Ae(r);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(r))};function Ee(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*Se;case"weeks":case"week":case"w":return t*Me;case"days":case"day":case"d":return t*A;case"hours":case"hour":case"hrs":case"hr":case"h":return t*L;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 Ae(r){var e=Math.abs(r);return e>=A?Math.round(r/A)+"d":e>=L?Math.round(r/L)+"h":e>=I?Math.round(r/I)+"m":e>=U?Math.round(r/U)+"s":r+"ms"}function Pe(r){var e=Math.abs(r);return e>=A?z(r,e,A,"day"):e>=L?z(r,e,L,"hour"):e>=I?z(r,e,I,"minute"):e>=U?z(r,e,U,"second"):r+" ms"}function z(r,e,t,n){var s=e>=t*1.5;return Math.round(r/t)+" "+n+(s?"s":"")}});var te=$((et,ee)=>{function ke(r){t.debug=t,t.default=t,t.coerce=f,t.disable=a,t.enable=s,t.enabled=c,t.humanize=H(),t.destroy=S,Object.keys(r).forEach(o=>{t[o]=r[o]}),t.names=[],t.skips=[],t.formatters={};function e(o){let i=0;for(let p=0;p<o.length;p++)i=(i<<5)-i+o.charCodeAt(p),i|=0;return t.colors[Math.abs(i)%t.colors.length]}t.selectColor=e;function t(o){let i,p=null,P,l;function d(...h){if(!d.enabled)return;let m=d,b=Number(new Date),x=b-(i||b);m.diff=x,m.prev=i,m.curr=b,i=b,h[0]=t.coerce(h[0]),typeof h[0]!="string"&&h.unshift("%O");let g=0;h[0]=h[0].replace(/%([a-zA-Z%])/g,(F,v)=>{if(F==="%%")return"%";g++;let M=t.formatters[v];if(typeof M=="function"){let k=h[g];F=M.call(m,k),h.splice(g,1),g--}return F}),t.formatArgs.call(m,h),(m.log||t.log).apply(m,h)}return d.namespace=o,d.useColors=t.useColors(),d.color=t.selectColor(o),d.extend=n,d.destroy=t.destroy,Object.defineProperty(d,"enabled",{enumerable:!0,configurable:!1,get:()=>p!==null?p:(P!==t.namespaces&&(P=t.namespaces,l=t.enabled(o)),l),set:h=>{p=h}}),typeof t.init=="function"&&t.init(d),d}function n(o,i){let p=t(this.namespace+(typeof i>"u"?":":i)+o);return p.log=this.log,p}function s(o){t.save(o),t.namespaces=o,t.names=[],t.skips=[];let i,p=(typeof o=="string"?o:"").split(/[\s,]+/),P=p.length;for(i=0;i<P;i++)p[i]&&(o=p[i].replace(/\*/g,".*?"),o[0]==="-"?t.skips.push(new RegExp("^"+o.slice(1)+"$")):t.names.push(new RegExp("^"+o+"$")))}function a(){let o=[...t.names.map(u),...t.skips.map(u).map(i=>"-"+i)].join(",");return t.enable(""),o}function c(o){if(o[o.length-1]==="*")return!0;let i,p;for(i=0,p=t.skips.length;i<p;i++)if(t.skips[i].test(o))return!1;for(i=0,p=t.names.length;i<p;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 f(o){return o instanceof Error?o.stack||o.message:o}function S(){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}ee.exports=ke});var re=$((y,D)=>{y.formatArgs=Ie;y.save=Le;y.load=Oe;y.useColors=Ue;y.storage=Ne();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 Ue(){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 Ie(r){if(r[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+r[0]+(this.useColors?"%c ":" ")+"+"+D.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 Le(r){try{r?y.storage.setItem("debug",r):y.storage.removeItem("debug")}catch{}}function Oe(){let r;try{r=y.storage.getItem("debug")}catch{}return!r&&typeof process<"u"&&"env"in process&&(r=process.env.DEBUG),r}function Ne(){try{return localStorage}catch{}}D.exports=te()(y);var{formatters:je}=D.exports;je.j=function(r){try{return JSON.stringify(r)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}});var Qe={};ye(Qe,{SOURCE_APPLICATION:()=>Xe,SOURCE_DEVTOOLS:()=>Je,devToolsMetrics:()=>Ze});function K(r){return r!=null&&typeof r.start=="function"&&typeof r.stop=="function"}async function Q(...r){let e=[];for(let t of r)K(t)&&e.push(t);await Promise.all(e.map(async t=>{t.beforeStart!=null&&await t.beforeStart()})),await Promise.all(e.map(async t=>{await t.start()})),await Promise.all(e.map(async t=>{t.afterStart!=null&&await t.afterStart()}))}async function W(...r){let e=[];for(let t of r)K(t)&&e.push(t);await Promise.all(e.map(async t=>{t.beforeStop!=null&&await t.beforeStop()})),await Promise.all(e.map(async t=>{await t.stop()})),await Promise.all(e.map(async t=>{t.afterStop!=null&&await t.afterStop()}))}var w=xe(re(),1);var tt=new Uint8Array(0);function ne(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 ze(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 a=r.charAt(s),c=a.charCodeAt(0);if(t[c]!==255)throw new TypeError(a+" is ambiguous");t[c]=s}var u=r.length,f=r.charAt(0),S=Math.log(u)/Math.log(256),o=Math.log(256)/Math.log(u);function i(l){if(l instanceof Uint8Array||(ArrayBuffer.isView(l)?l=new Uint8Array(l.buffer,l.byteOffset,l.byteLength):Array.isArray(l)&&(l=Uint8Array.from(l))),!(l instanceof Uint8Array))throw new TypeError("Expected Uint8Array");if(l.length===0)return"";for(var d=0,h=0,m=0,b=l.length;m!==b&&l[m]===0;)m++,d++;for(var x=(b-m)*o+1>>>0,g=new Uint8Array(x);m!==b;){for(var E=l[m],F=0,v=x-1;(E!==0||F<h)&&v!==-1;v--,F++)E+=256*g[v]>>>0,g[v]=E%u>>>0,E=E/u>>>0;if(E!==0)throw new Error("Non-zero carry");h=F,m++}for(var M=x-h;M!==x&&g[M]===0;)M++;for(var k=f.repeat(d);M<x;++M)k+=r.charAt(g[M]);return k}function p(l){if(typeof l!="string")throw new TypeError("Expected String");if(l.length===0)return new Uint8Array;var d=0;if(l[d]!==" "){for(var h=0,m=0;l[d]===f;)h++,d++;for(var b=(l.length-d)*S+1>>>0,x=new Uint8Array(b);l[d];){var g=t[l.charCodeAt(d)];if(g===255)return;for(var E=0,F=b-1;(g!==0||E<m)&&F!==-1;F--,E++)g+=u*x[F]>>>0,x[F]=g%256>>>0,g=g/256>>>0;if(g!==0)throw new Error("Non-zero carry");m=E,d++}if(l[d]!==" "){for(var v=b-m;v!==b&&x[v]===0;)v++;for(var M=new Uint8Array(h+(b-v)),k=h;v!==b;)M[k++]=x[v++];return M}}}function P(l){var d=p(l);if(d)return d;throw new Error(`Non-${e} character`)}return{encode:i,decodeUnsafe:p,decode:P}}var De=ze,_e=De,se=_e;var T=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 oe(this,e)}},R=class{decoders;constructor(e){this.decoders=e}or(e){return oe(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 oe(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 T(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 ie({name:r,prefix:e,encode:t,decode:n}){return new V(r,e,t,n)}function G({name:r,prefix:e,alphabet:t}){let{encode:n,decode:s}=se(t,r);return ie({prefix:e,name:r,encode:n,decode:a=>ne(s(a))})}function $e(r,e,t,n){let s={};for(let o=0;o<e.length;++o)s[e[o]]=o;let a=r.length;for(;r[a-1]==="=";)--a;let c=new Uint8Array(a*t/8|0),u=0,f=0,S=0;for(let o=0;o<a;++o){let i=s[r[o]];if(i===void 0)throw new SyntaxError(`Non-${n} character`);f=f<<t|i,u+=t,u>=8&&(u-=8,c[S++]=255&f>>u)}if(u>=t||255&f<<8-u)throw new SyntaxError("Unexpected end of data");return c}function Te(r,e,t){let n=e[e.length-1]==="=",s=(1<<t)-1,a="",c=0,u=0;for(let f=0;f<r.length;++f)for(u=u<<8|r[f],c+=8;c>t;)c-=t,a+=e[s&u>>c];if(c!==0&&(a+=e[s&u<<t-c]),n)for(;a.length*t&7;)a+="=";return a}function C({name:r,prefix:e,bitsPerChar:t,alphabet:n}){return ie({prefix:e,name:r,encode(s){return Te(s,n,t)},decode(s){return $e(s,n,t,r)}})}var ae=C({prefix:"b",name:"base32",alphabet:"abcdefghijklmnopqrstuvwxyz234567",bitsPerChar:5}),ct=C({prefix:"B",name:"base32upper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",bitsPerChar:5}),lt=C({prefix:"c",name:"base32pad",alphabet:"abcdefghijklmnopqrstuvwxyz234567=",bitsPerChar:5}),ut=C({prefix:"C",name:"base32padupper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",bitsPerChar:5}),dt=C({prefix:"v",name:"base32hex",alphabet:"0123456789abcdefghijklmnopqrstuv",bitsPerChar:5}),ft=C({prefix:"V",name:"base32hexupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV",bitsPerChar:5}),pt=C({prefix:"t",name:"base32hexpad",alphabet:"0123456789abcdefghijklmnopqrstuv=",bitsPerChar:5}),ht=C({prefix:"T",name:"base32hexpadupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV=",bitsPerChar:5}),mt=C({prefix:"h",name:"base32z",alphabet:"ybndrfg8ejkmcpqxot1uwisza345h769",bitsPerChar:5});var ce=G({name:"base58btc",prefix:"z",alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"}),Ct=G({name:"base58flickr",prefix:"Z",alphabet:"123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"});var _=C({prefix:"m",name:"base64",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",bitsPerChar:6}),yt=C({prefix:"M",name:"base64pad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",bitsPerChar:6}),xt=C({prefix:"u",name:"base64url",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",bitsPerChar:6}),Ft=C({prefix:"U",name:"base64urlpad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=",bitsPerChar:6});w.default.formatters.b=r=>r==null?"undefined":ce.baseEncode(r);w.default.formatters.t=r=>r==null?"undefined":ae.baseEncode(r);w.default.formatters.m=r=>r==null?"undefined":_.baseEncode(r);w.default.formatters.p=r=>r==null?"undefined":r.toString();w.default.formatters.c=r=>r==null?"undefined":r.toString();w.default.formatters.k=r=>r==null?"undefined":r.toString();w.default.formatters.a=r=>r==null?"undefined":r.toString();function qe(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 le(r){let e=qe(`${r}:trace`);return w.default.enabled(`${r}:trace`)&&w.default.names.map(t=>t.toString()).find(t=>t.includes(":trace"))!=null&&(e=(0,w.default)(`${r}:trace`)),Object.assign((0,w.default)(r),{error:(0,w.default)(`${r}:error`),trace:e})}function ue(){w.default.disable()}function de(r){w.default.enable(r)}function Re(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 fe=Re;function Ve(r){return r[Symbol.asyncIterator]!=null}function pe(r){return r?.then!=null}function Ge(r,e){let t=0;if(Ve(r))return async function*(){for await(let f of r){let S=e(f,t++);pe(S)&&await S,yield f}}();let n=fe(r),{value:s,done:a}=n.next();if(a===!0)return function*(){}();if(typeof e(s,t++)?.then=="function")return async function*(){yield s;for await(let f of n){let S=e(f,t++);pe(S)&&await S,yield f}}();let u=e;return function*(){yield s;for(let f of n)u(f,t++),yield f}()}var B=Ge;var Be=le("libp2p:simple-metrics"),O=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}}},J=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 O?e[t]=n.value:n instanceof N?e[t]=n.values:e[t]=await n();this.onMetrics(structuredClone(e))}).catch(e=>{Be.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(B(u,f=>{n._incrementValue(`${t} sent`,f.byteLength)}))};let a=e.source;e.source=B(a,c=>{n._incrementValue(`${t} received`,c.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 O;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 O;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 he(r){return e=>new J(e,r)}var Je="@libp2p/devtools-metrics:devtools",Xe="@libp2p/devtools-metrics:node",X=class{log;events;peerId;transportManager;registrar;connectionManager;peerStore;simpleMetrics;intervalMs;constructor(e,t){this.log=e.logger.forComponent("libp2p:devtools-metrics"),this.events=e.events,this.peerId=e.peerId,this.transportManager=e.transportManager,this.registrar=e.registrar,this.connectionManager=e.connectionManager,this.peerStore=e.peerStore,this.intervalMs=t?.intervalMs,this.sendPeers=Ke(this.sendPeers.bind(this),1e3),this.sendSelfUpdate=this.sendSelfUpdate.bind(this),this.processIncomingMessage=this.processIncomingMessage.bind(this)}trackMultiaddrConnection(e){this.simpleMetrics?.trackMultiaddrConnection(e)}trackProtocolStream(e,t){this.simpleMetrics?.trackProtocolStream(e,t)}registerMetric(e,t){return this.simpleMetrics?.registerMetric(e,t)}registerMetricGroup(e,t){return this.simpleMetrics?.registerMetricGroup(e,t)}registerCounter(e,t){return this.simpleMetrics?.registerCounter(e,t)}registerCounterGroup(e,t){return this.simpleMetrics?.registerCounterGroup(e,t)}async start(){this.events.addEventListener("peer:connect",this.sendPeers),this.events.addEventListener("peer:disconnect",this.sendPeers),this.events.addEventListener("peer:identify",this.sendPeers),this.events.addEventListener("peer:update",this.sendPeers),this.events.addEventListener("self:peer:update",this.sendSelfUpdate),window.addEventListener("message",this.processIncomingMessage),this.simpleMetrics=he({intervalMs:this.intervalMs,onMetrics:e=>{let t={source:"@libp2p/devtools-metrics:node",type:"metrics",metrics:e};this.log("post metrics message"),window.postMessage(t,"*")}})({}),await Q(this.simpleMetrics)}async stop(){window.removeEventListener("message",this.processIncomingMessage),this.events.removeEventListener("self:peer:update",this.sendSelfUpdate),this.events.removeEventListener("peer:connect",this.sendPeers),this.events.removeEventListener("peer:disconnect",this.sendPeers),this.events.removeEventListener("peer:identify",this.sendPeers),this.events.removeEventListener("peer:update",this.sendPeers),await W(this.simpleMetrics)}sendPeers(){Promise.resolve().then(async()=>{let e={source:"@libp2p/devtools-metrics:node",type:"peers",peers:[]},t=this.connectionManager.getConnectionsMap();for(let[n,s]of t.entries())try{let a=await this.peerStore.get(n);e.peers.push({peerId:n.toString(),addresses:s.map(c=>c.remoteAddr.toString()),multiaddrs:a.addresses.map(({isCertified:c,multiaddr:u})=>({isCertified:c,multiaddr:u.toString()})),protocols:[...a.protocols],tags:me(a.tags,c=>c.value),metadata:me(a.metadata,c=>_.encode(c))})}catch(a){this.log.error("could not load peer data from peer store",a),e.peers.push({peerId:n.toString(),addresses:s.map(c=>c.remoteAddr.toString()),multiaddrs:[],protocols:[],tags:{},metadata:{}})}window.postMessage(e,"*")}).catch(e=>{this.log.error("error sending peers message",e)})}sendSelfUpdate(e){let t={source:"@libp2p/devtools-metrics:node",type:"self",peerId:e.detail.peer.id.toString(),multiaddrs:e.detail.peer.addresses.map(({multiaddr:n})=>n.toString()),protocols:[...e.detail.peer.protocols]};this.log("post node update message"),window.postMessage(t,"*")}processIncomingMessage(e){if(e.source!==window)return;let t=e.data;if(t?.source==="@libp2p/devtools-metrics:devtools"){if(t.type==="identify"){let n={source:"@libp2p/devtools-metrics:node",type:"self",peerId:this.peerId.toString(),multiaddrs:this.transportManager.getListeners().flatMap(s=>s.getAddrs()).map(s=>s.toString()),protocols:this.registrar.getProtocols()};window.postMessage(n,"*"),this.sendPeers()}t.type==="debug"&&(t.namespace.length>0?de(t.namespace):ue())}}};function Ze(r){return e=>new X(e,r)}function me(r,e){let t={};for(let[n,s]of r.entries())t[n]=e(s);return t}function Ke(r,e=100){let t,n;return()=>{if(n==null&&(n=Date.now()),t!=null&&Date.now()-n>e){clearTimeout(t),n=void 0,r();return}clearTimeout(t),t=setTimeout(()=>{n=void 0,r()},e)}}return Fe(Qe);})();
|
|
2
|
+
"use strict";var Libp2PDevtoolsMetrics=(()=>{var we=Object.create;var T=Object.defineProperty;var ve=Object.getOwnPropertyDescriptor;var ye=Object.getOwnPropertyNames;var xe=Object.getPrototypeOf,Fe=Object.prototype.hasOwnProperty;var $=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),Se=(r,e)=>{for(var t in e)T(r,t,{get:e[t],enumerable:!0})},Q=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of ye(e))!Fe.call(r,s)&&s!==t&&T(r,s,{get:()=>e[s],enumerable:!(n=ve(e,s))||n.enumerable});return r};var Me=(r,e,t)=>(t=r!=null?we(xe(r)):{},Q(e||!r||!r.__esModule?T(t,"default",{value:r,enumerable:!0}):t,r)),Ee=r=>Q(T({},"__esModule",{value:!0}),r);var te=$((rt,ee)=>{var k=1e3,_=k*60,I=_*60,U=I*24,Ue=U*7,Ae=U*365.25;ee.exports=function(r,e){e=e||{};var t=typeof r;if(t==="string"&&r.length>0)return Pe(r);if(t==="number"&&isFinite(r))return e.long?_e(r):ke(r);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(r))};function Pe(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*Ae;case"weeks":case"week":case"w":return t*Ue;case"days":case"day":case"d":return t*U;case"hours":case"hour":case"hrs":case"hr":case"h":return t*I;case"minutes":case"minute":case"mins":case"min":case"m":return t*_;case"seconds":case"second":case"secs":case"sec":case"s":return t*k;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return t;default:return}}}}function ke(r){var e=Math.abs(r);return e>=U?Math.round(r/U)+"d":e>=I?Math.round(r/I)+"h":e>=_?Math.round(r/_)+"m":e>=k?Math.round(r/k)+"s":r+"ms"}function _e(r){var e=Math.abs(r);return e>=U?N(r,e,U,"day"):e>=I?N(r,e,I,"hour"):e>=_?N(r,e,_,"minute"):e>=k?N(r,e,k,"second"):r+" ms"}function N(r,e,t,n){var s=e>=t*1.5;return Math.round(r/t)+" "+n+(s?"s":"")}});var ne=$((nt,re)=>{function Ie(r){t.debug=t,t.default=t,t.coerce=c,t.disable=f,t.enable=s,t.enabled=u,t.humanize=te(),t.destroy=v,Object.keys(r).forEach(o=>{t[o]=r[o]}),t.names=[],t.skips=[],t.formatters={};function e(o){let i=0;for(let p=0;p<o.length;p++)i=(i<<5)-i+o.charCodeAt(p),i|=0;return t.colors[Math.abs(i)%t.colors.length]}t.selectColor=e;function t(o){let i,p=null,A,l;function d(...h){if(!d.enabled)return;let m=d,b=Number(new Date),F=b-(i||b);m.diff=F,m.prev=i,m.curr=b,i=b,h[0]=t.coerce(h[0]),typeof h[0]!="string"&&h.unshift("%O");let g=0;h[0]=h[0].replace(/%([a-zA-Z%])/g,(S,y)=>{if(S==="%%")return"%";g++;let M=t.formatters[y];if(typeof M=="function"){let P=h[g];S=M.call(m,P),h.splice(g,1),g--}return S}),t.formatArgs.call(m,h),(m.log||t.log).apply(m,h)}return d.namespace=o,d.useColors=t.useColors(),d.color=t.selectColor(o),d.extend=n,d.destroy=t.destroy,Object.defineProperty(d,"enabled",{enumerable:!0,configurable:!1,get:()=>p!==null?p:(A!==t.namespaces&&(A=t.namespaces,l=t.enabled(o)),l),set:h=>{p=h}}),typeof t.init=="function"&&t.init(d),d}function n(o,i){let p=t(this.namespace+(typeof i>"u"?":":i)+o);return p.log=this.log,p}function s(o){t.save(o),t.namespaces=o,t.names=[],t.skips=[];let i,p=(typeof o=="string"?o:"").split(/[\s,]+/),A=p.length;for(i=0;i<A;i++)p[i]&&(o=p[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 u(o){if(o[o.length-1]==="*")return!0;let i,p;for(i=0,p=t.skips.length;i<p;i++)if(t.skips[i].test(o))return!1;for(i=0,p=t.names.length;i<p;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 c(o){return o instanceof Error?o.stack||o.message:o}function v(){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}re.exports=Ie});var se=$((x,j)=>{x.formatArgs=Le;x.save=Re;x.load=Te;x.useColors=Oe;x.storage=Ne();x.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`."))}})();x.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 Oe(){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 Le(r){if(r[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+r[0]+(this.useColors?"%c ":" ")+"+"+j.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)}x.log=console.debug||console.log||(()=>{});function Re(r){try{r?x.storage.setItem("debug",r):x.storage.removeItem("debug")}catch{}}function Te(){let r;try{r=x.storage.getItem("debug")}catch{}return!r&&typeof process<"u"&&"env"in process&&(r=process.env.DEBUG),r}function Ne(){try{return localStorage}catch{}}j.exports=ne()(x);var{formatters:je}=j.exports;je.j=function(r){try{return JSON.stringify(r)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}});var He={};Se(He,{LIBP2P_DEVTOOLS_METRICS_KEY:()=>Ce,SOURCE_CONTENT_SCRIPT:()=>Qe,SOURCE_DEVTOOLS:()=>be,SOURCE_METRICS:()=>z,SOURCE_SERVICE_WORKER:()=>Ze,devToolsMetrics:()=>We});function W(r){return r!=null&&typeof r.start=="function"&&typeof r.stop=="function"}async function Y(...r){let e=[];for(let t of r)W(t)&&e.push(t);await Promise.all(e.map(async t=>{t.beforeStart!=null&&await t.beforeStart()})),await Promise.all(e.map(async t=>{await t.start()})),await Promise.all(e.map(async t=>{t.afterStart!=null&&await t.afterStart()}))}async function H(...r){let e=[];for(let t of r)W(t)&&e.push(t);await Promise.all(e.map(async t=>{t.beforeStop!=null&&await t.beforeStop()})),await Promise.all(e.map(async t=>{await t.stop()})),await Promise.all(e.map(async t=>{t.afterStop!=null&&await t.afterStop()}))}var w=Me(se(),1);var st=new Uint8Array(0);function oe(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 De(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),u=f.charCodeAt(0);if(t[u]!==255)throw new TypeError(f+" is ambiguous");t[u]=s}var a=r.length,c=r.charAt(0),v=Math.log(a)/Math.log(256),o=Math.log(256)/Math.log(a);function i(l){if(l instanceof Uint8Array||(ArrayBuffer.isView(l)?l=new Uint8Array(l.buffer,l.byteOffset,l.byteLength):Array.isArray(l)&&(l=Uint8Array.from(l))),!(l instanceof Uint8Array))throw new TypeError("Expected Uint8Array");if(l.length===0)return"";for(var d=0,h=0,m=0,b=l.length;m!==b&&l[m]===0;)m++,d++;for(var F=(b-m)*o+1>>>0,g=new Uint8Array(F);m!==b;){for(var E=l[m],S=0,y=F-1;(E!==0||S<h)&&y!==-1;y--,S++)E+=256*g[y]>>>0,g[y]=E%a>>>0,E=E/a>>>0;if(E!==0)throw new Error("Non-zero carry");h=S,m++}for(var M=F-h;M!==F&&g[M]===0;)M++;for(var P=c.repeat(d);M<F;++M)P+=r.charAt(g[M]);return P}function p(l){if(typeof l!="string")throw new TypeError("Expected String");if(l.length===0)return new Uint8Array;var d=0;if(l[d]!==" "){for(var h=0,m=0;l[d]===c;)h++,d++;for(var b=(l.length-d)*v+1>>>0,F=new Uint8Array(b);l[d];){var g=t[l.charCodeAt(d)];if(g===255)return;for(var E=0,S=b-1;(g!==0||E<m)&&S!==-1;S--,E++)g+=a*F[S]>>>0,F[S]=g%256>>>0,g=g/256>>>0;if(g!==0)throw new Error("Non-zero carry");m=E,d++}if(l[d]!==" "){for(var y=b-m;y!==b&&F[y]===0;)y++;for(var M=new Uint8Array(h+(b-y)),P=h;y!==b;)M[P++]=F[y++];return M}}}function A(l){var d=p(l);if(d)return d;throw new Error(`Non-${e} character`)}return{encode:i,decodeUnsafe:p,decode:A}}var ze=De,$e=ze,ie=$e;var V=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 ae(this,e)}},B=class{decoders;constructor(e){this.decoders=e}or(e){return ae(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 ae(r,e){return new B({...r.decoders??{[r.prefix]:r},...e.decoders??{[e.prefix]:e}})}var G=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 V(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 ce({name:r,prefix:e,encode:t,decode:n}){return new G(r,e,t,n)}function J({name:r,prefix:e,alphabet:t}){let{encode:n,decode:s}=ie(t,r);return ce({prefix:e,name:r,encode:n,decode:f=>oe(s(f))})}function Ve(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 u=new Uint8Array(f*t/8|0),a=0,c=0,v=0;for(let o=0;o<f;++o){let i=s[r[o]];if(i===void 0)throw new SyntaxError(`Non-${n} character`);c=c<<t|i,a+=t,a>=8&&(a-=8,u[v++]=255&c>>a)}if(a>=t||255&c<<8-a)throw new SyntaxError("Unexpected end of data");return u}function qe(r,e,t){let n=e[e.length-1]==="=",s=(1<<t)-1,f="",u=0,a=0;for(let c=0;c<r.length;++c)for(a=a<<8|r[c],u+=8;u>t;)u-=t,f+=e[s&a>>u];if(u!==0&&(f+=e[s&a<<t-u]),n)for(;f.length*t&7;)f+="=";return f}function C({name:r,prefix:e,bitsPerChar:t,alphabet:n}){return ce({prefix:e,name:r,encode(s){return qe(s,n,t)},decode(s){return Ve(s,n,t,r)}})}var le=C({prefix:"b",name:"base32",alphabet:"abcdefghijklmnopqrstuvwxyz234567",bitsPerChar:5}),dt=C({prefix:"B",name:"base32upper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",bitsPerChar:5}),ft=C({prefix:"c",name:"base32pad",alphabet:"abcdefghijklmnopqrstuvwxyz234567=",bitsPerChar:5}),pt=C({prefix:"C",name:"base32padupper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",bitsPerChar:5}),ht=C({prefix:"v",name:"base32hex",alphabet:"0123456789abcdefghijklmnopqrstuv",bitsPerChar:5}),mt=C({prefix:"V",name:"base32hexupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV",bitsPerChar:5}),gt=C({prefix:"t",name:"base32hexpad",alphabet:"0123456789abcdefghijklmnopqrstuv=",bitsPerChar:5}),bt=C({prefix:"T",name:"base32hexpadupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV=",bitsPerChar:5}),Ct=C({prefix:"h",name:"base32z",alphabet:"ybndrfg8ejkmcpqxot1uwisza345h769",bitsPerChar:5});var ue=J({name:"base58btc",prefix:"z",alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"}),yt=J({name:"base58flickr",prefix:"Z",alphabet:"123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"});var O=C({prefix:"m",name:"base64",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",bitsPerChar:6}),St=C({prefix:"M",name:"base64pad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",bitsPerChar:6}),Mt=C({prefix:"u",name:"base64url",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",bitsPerChar:6}),Et=C({prefix:"U",name:"base64urlpad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=",bitsPerChar:6});w.default.formatters.b=r=>r==null?"undefined":ue.baseEncode(r);w.default.formatters.t=r=>r==null?"undefined":le.baseEncode(r);w.default.formatters.m=r=>r==null?"undefined":O.baseEncode(r);w.default.formatters.p=r=>r==null?"undefined":r.toString();w.default.formatters.c=r=>r==null?"undefined":r.toString();w.default.formatters.k=r=>r==null?"undefined":r.toString();w.default.formatters.a=r=>r==null?"undefined":r.toString();function Be(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 de(r){let e=Be(`${r}:trace`);return w.default.enabled(`${r}:trace`)&&w.default.names.map(t=>t.toString()).find(t=>t.includes(":trace"))!=null&&(e=(0,w.default)(`${r}:trace`)),Object.assign((0,w.default)(r),{error:(0,w.default)(`${r}:error`),trace:e})}function fe(){w.default.disable()}function pe(r){w.default.enable(r)}function Ge(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 he=Ge;function Je(r){return r[Symbol.asyncIterator]!=null}function me(r){return r?.then!=null}function Ke(r,e){let t=0;if(Je(r))return async function*(){for await(let c of r){let v=e(c,t++);me(v)&&await v,yield c}}();let n=he(r),{value:s,done:f}=n.next();if(f===!0)return function*(){}();if(typeof e(s,t++)?.then=="function")return async function*(){yield s;for await(let c of n){let v=e(c,t++);me(v)&&await v,yield c}}();let a=e;return function*(){yield s;for(let c of n)a(c,t++),yield c}()}var K=Ke;var Xe=de("libp2p:simple-metrics"),L=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}}},R=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}}},X=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 L?e[t]=n.value:n instanceof R?e[t]=n.values:e[t]=await n();this.onMetrics(structuredClone(e))}).catch(e=>{Xe.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(K(a,c=>{n._incrementValue(`${t} sent`,c.byteLength)}))};let f=e.source;e.source=K(f,u=>{n._incrementValue(`${t} received`,u.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 L;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 R;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 L;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 R;return this.metrics.set(e,n),n}};function ge(r){return e=>new X(e,r)}var be="@libp2p/devtools-metrics:devtools",Ze="@libp2p/devtools-metrics:worker",Qe="@libp2p/devtools-metrics:content",z="@libp2p/devtools-metrics:metrics",Ce="________libp2p_devtools_metrics";Object.defineProperty(globalThis,Ce,{value:!0,enumerable:!1,writable:!1});var Z=class{log;components;simpleMetrics;intervalMs;constructor(e,t){this.log=e.logger.forComponent("libp2p:devtools-metrics"),this.intervalMs=t?.intervalMs,this.components=e,this.onPeersUpdate=Ye(this.onPeersUpdate.bind(this),1e3),this.onSelfUpdate=this.onSelfUpdate.bind(this),this.onIncomingMessage=this.onIncomingMessage.bind(this),this.simpleMetrics=ge({intervalMs:this.intervalMs,onMetrics:n=>{let s={source:z,type:"metrics",metrics:n};this.log("post metrics message"),window.postMessage(s,"*")}})({})}trackMultiaddrConnection(e){this.simpleMetrics.trackMultiaddrConnection(e)}trackProtocolStream(e,t){this.simpleMetrics.trackProtocolStream(e,t)}registerMetric(e,t){return this.simpleMetrics.registerMetric(e,t)}registerMetricGroup(e,t){return this.simpleMetrics.registerMetricGroup(e,t)}registerCounter(e,t){return this.simpleMetrics.registerCounter(e,t)}registerCounterGroup(e,t){return this.simpleMetrics.registerCounterGroup(e,t)}async start(){this.components.events.addEventListener("peer:connect",this.onPeersUpdate),this.components.events.addEventListener("peer:disconnect",this.onPeersUpdate),this.components.events.addEventListener("peer:identify",this.onPeersUpdate),this.components.events.addEventListener("peer:update",this.onPeersUpdate),this.components.events.addEventListener("self:peer:update",this.onSelfUpdate),window.addEventListener("message",this.onIncomingMessage),await Y(this.simpleMetrics)}async stop(){window.removeEventListener("message",this.onIncomingMessage),this.components.events.removeEventListener("self:peer:update",this.onSelfUpdate),this.components.events.removeEventListener("peer:connect",this.onPeersUpdate),this.components.events.removeEventListener("peer:disconnect",this.onPeersUpdate),this.components.events.removeEventListener("peer:identify",this.onPeersUpdate),this.components.events.removeEventListener("peer:update",this.onPeersUpdate),await H(this.simpleMetrics)}onPeersUpdate(){Promise.resolve().then(async()=>{let e={source:z,type:"peers",peers:[]},t=this.components.connectionManager.getConnectionsMap(),n=[...t.values()].flatMap(s=>s).map(s=>s.remoteAddr.toString());for(let[s,f]of t.entries())try{let u=await this.components.peerStore.get(s);e.peers.push({id:s.toString(),addresses:u.addresses.map(({isCertified:a,multiaddr:c})=>{let v=c.toString();return{multiaddr:v,isCertified:a,isConnected:n.includes(v)}}),protocols:[...u.protocols],tags:D(u.tags,a=>a.value),metadata:D(u.metadata,a=>O.encode(a))})}catch(u){this.log.error("could not load peer data from peer store",u),e.peers.push({id:s.toString(),addresses:f.map(a=>{let c=a.remoteAddr.toString();return{multiaddr:c,isConnected:n.includes(c)}}),protocols:[],tags:{},metadata:{}})}window.postMessage(e,"*")}).catch(e=>{this.log.error("error sending peers message",e)})}onSelfUpdate(e){this.sendSelfUpdate(e.detail.peer)}sendSelfUpdate(e){Promise.resolve().then(async()=>{let t={source:z,type:"self",peer:{id:e.id.toString(),multiaddrs:e.addresses.map(({multiaddr:n})=>n.toString()),protocols:[...e.protocols],tags:D(e.tags,n=>n.value),metadata:D(e.metadata,n=>O.encode(n))}};this.log("post node update message"),window.postMessage(t,"*")}).catch(t=>{this.log.error("error sending self update",t)})}onIncomingMessage(e){if(e.source!==window)return;let t=e.data;t?.source===be&&(t.type==="identify"&&Promise.resolve().then(async()=>{let n=await this.components.peerStore.get(this.components.peerId);this.sendSelfUpdate(n),this.onPeersUpdate()}).catch(n=>{this.log.error("error sending identify response",n)}),t.type==="debug"&&(t.namespace.length>0?pe(t.namespace):fe()))}};function We(r){return e=>new Z(e,r)}function D(r,e){let t={};for(let[n,s]of r.entries())t[n]=e(s);return t}function Ye(r,e=100){let t,n;return()=>{if(n==null&&(n=Date.now()),t!=null&&Date.now()-n>e){clearTimeout(t),n=void 0,r();return}clearTimeout(t),t=setTimeout(()=>{n=void 0,r()},e)}}return Ee(He);})();
|
|
3
3
|
return Libp2PDevtoolsMetrics}));
|
package/dist/src/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* ```typescript
|
|
7
7
|
* import { createLibp2p } from 'libp2p'
|
|
8
|
-
* import {
|
|
8
|
+
* import { devToolsMetrics } from '@libp2p/devtools-metrics'
|
|
9
9
|
*
|
|
10
10
|
* const node = await createLibp2p({
|
|
11
11
|
* metrics: devToolsMetrics()
|
|
@@ -18,12 +18,15 @@
|
|
|
18
18
|
import type { ComponentLogger, Libp2pEvents, Metrics, PeerId, PeerStore, TypedEventEmitter } from '@libp2p/interface';
|
|
19
19
|
import type { TransportManager, Registrar, ConnectionManager } from '@libp2p/interface-internal';
|
|
20
20
|
export declare const SOURCE_DEVTOOLS = "@libp2p/devtools-metrics:devtools";
|
|
21
|
-
export declare const
|
|
21
|
+
export declare const SOURCE_SERVICE_WORKER = "@libp2p/devtools-metrics:worker";
|
|
22
|
+
export declare const SOURCE_CONTENT_SCRIPT = "@libp2p/devtools-metrics:content";
|
|
23
|
+
export declare const SOURCE_METRICS = "@libp2p/devtools-metrics:metrics";
|
|
24
|
+
export declare const LIBP2P_DEVTOOLS_METRICS_KEY = "________libp2p_devtools_metrics";
|
|
22
25
|
/**
|
|
23
26
|
* Sent when new metrics are available
|
|
24
27
|
*/
|
|
25
28
|
export interface MetricsMessage {
|
|
26
|
-
source:
|
|
29
|
+
source: typeof SOURCE_METRICS;
|
|
27
30
|
type: 'metrics';
|
|
28
31
|
metrics: Record<string, any>;
|
|
29
32
|
}
|
|
@@ -31,55 +34,46 @@ export interface MetricsMessage {
|
|
|
31
34
|
* This message represents the current state of the libp2p node
|
|
32
35
|
*/
|
|
33
36
|
export interface SelfMessage {
|
|
34
|
-
source:
|
|
37
|
+
source: typeof SOURCE_METRICS;
|
|
35
38
|
type: 'self';
|
|
36
|
-
|
|
37
|
-
multiaddrs: string[];
|
|
38
|
-
protocols: string[];
|
|
39
|
-
}
|
|
40
|
-
export interface Peer {
|
|
41
|
-
/**
|
|
42
|
-
* The identifier of the remote peer
|
|
43
|
-
*/
|
|
44
|
-
peerId: string;
|
|
45
|
-
/**
|
|
46
|
-
* The addresses we are connected to the peer via
|
|
47
|
-
*/
|
|
48
|
-
addresses: string[];
|
|
49
|
-
/**
|
|
50
|
-
* The complete list of addresses the peer has, if known
|
|
51
|
-
*/
|
|
52
|
-
multiaddrs: Array<{
|
|
53
|
-
isCertified?: boolean;
|
|
54
|
-
multiaddr: string;
|
|
55
|
-
}>;
|
|
56
|
-
/**
|
|
57
|
-
* Any peer store tags the peer has
|
|
58
|
-
*/
|
|
59
|
-
tags: Record<string, number>;
|
|
60
|
-
/**
|
|
61
|
-
* Any peer store tags the peer has
|
|
62
|
-
*/
|
|
63
|
-
metadata: Record<string, string>;
|
|
64
|
-
/**
|
|
65
|
-
* The protocols the peer supports, if known
|
|
66
|
-
*/
|
|
67
|
-
protocols: string[];
|
|
39
|
+
peer: SelfPeer;
|
|
68
40
|
}
|
|
69
41
|
/**
|
|
70
42
|
* This message represents the current state of the libp2p node
|
|
71
43
|
*/
|
|
72
44
|
export interface PeersMessage {
|
|
73
|
-
source:
|
|
45
|
+
source: typeof SOURCE_METRICS;
|
|
74
46
|
type: 'peers';
|
|
75
47
|
peers: Peer[];
|
|
76
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Sent by the DevTools service worker to the DevTools panel when the inspected
|
|
51
|
+
* page has finished (re)loading
|
|
52
|
+
*/
|
|
53
|
+
export interface PageLoadedMessage {
|
|
54
|
+
source: '@libp2p/devtools-metrics:devtools';
|
|
55
|
+
type: 'page-loaded';
|
|
56
|
+
tabId: number;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Sent by the DevTools service worker to the DevTools panel when it has failed
|
|
60
|
+
* to send a message to the inspected page as there is no receiving end present.
|
|
61
|
+
*
|
|
62
|
+
* This normally means the content script has not been loaded due to the user
|
|
63
|
+
* not having granted permission for the script to run.
|
|
64
|
+
*/
|
|
65
|
+
export interface PermissionsErrorMessage {
|
|
66
|
+
source: '@libp2p/devtools-metrics:devtools';
|
|
67
|
+
type: 'permissions-error';
|
|
68
|
+
tabId: number;
|
|
69
|
+
}
|
|
77
70
|
/**
|
|
78
71
|
* This message is sent by DevTools when no `self` message has been received
|
|
79
72
|
*/
|
|
80
73
|
export interface IdentifyMessage {
|
|
81
74
|
source: '@libp2p/devtools-metrics:devtools';
|
|
82
75
|
type: 'identify';
|
|
76
|
+
tabId: number;
|
|
83
77
|
}
|
|
84
78
|
/**
|
|
85
79
|
* This message is sent by DevTools when no `self` message has been received
|
|
@@ -88,15 +82,91 @@ export interface EnableDebugMessage {
|
|
|
88
82
|
source: '@libp2p/devtools-metrics:devtools';
|
|
89
83
|
type: 'debug';
|
|
90
84
|
namespace: string;
|
|
85
|
+
tabId: number;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* We cannot use the web extension API to copy text to the cliboard yet as it's
|
|
89
|
+
* not supported in Firefox yet, so get the page to do it
|
|
90
|
+
*
|
|
91
|
+
* @see https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Interact_with_the_clipboard#writing_to_the_clipboard
|
|
92
|
+
*/
|
|
93
|
+
export interface CopyToClipboardMessage {
|
|
94
|
+
source: '@libp2p/devtools-metrics:devtools';
|
|
95
|
+
type: 'copy-to-clipboard';
|
|
96
|
+
value: string;
|
|
97
|
+
tabId: number;
|
|
91
98
|
}
|
|
92
99
|
/**
|
|
93
100
|
* Messages that are sent from the application page to the DevTools panel
|
|
94
101
|
*/
|
|
95
|
-
export type
|
|
102
|
+
export type ApplicationMessage = MetricsMessage | SelfMessage | PeersMessage;
|
|
103
|
+
/**
|
|
104
|
+
* Messages that are sent from the service worker
|
|
105
|
+
*/
|
|
106
|
+
export type WorkerMessage = PageLoadedMessage | PermissionsErrorMessage;
|
|
96
107
|
/**
|
|
97
108
|
* Messages that are sent from the DevTools panel page to the application page
|
|
98
109
|
*/
|
|
99
|
-
export type DevToolsMessage = IdentifyMessage | EnableDebugMessage;
|
|
110
|
+
export type DevToolsMessage = IdentifyMessage | EnableDebugMessage | CopyToClipboardMessage;
|
|
111
|
+
export interface SelfPeer {
|
|
112
|
+
/**
|
|
113
|
+
* The identifier of the peer
|
|
114
|
+
*/
|
|
115
|
+
id: string;
|
|
116
|
+
/**
|
|
117
|
+
* The list of multiaddrs the peer is listening on
|
|
118
|
+
*/
|
|
119
|
+
multiaddrs: string[];
|
|
120
|
+
/**
|
|
121
|
+
* Any peer store tags the peer has
|
|
122
|
+
*/
|
|
123
|
+
tags: Record<string, number>;
|
|
124
|
+
/**
|
|
125
|
+
* Any peer store metadata the peer has
|
|
126
|
+
*/
|
|
127
|
+
metadata: Record<string, string>;
|
|
128
|
+
/**
|
|
129
|
+
* The protocols the peer supports
|
|
130
|
+
*/
|
|
131
|
+
protocols: string[];
|
|
132
|
+
}
|
|
133
|
+
export interface Address {
|
|
134
|
+
/**
|
|
135
|
+
* The multiaddr this address represents
|
|
136
|
+
*/
|
|
137
|
+
multiaddr: string;
|
|
138
|
+
/**
|
|
139
|
+
* If `true`, this multiaddr came from a signed peer record
|
|
140
|
+
*/
|
|
141
|
+
isCertified?: boolean;
|
|
142
|
+
/**
|
|
143
|
+
* If `true`, the current node has an active connection to this peer via this
|
|
144
|
+
* address
|
|
145
|
+
*/
|
|
146
|
+
isConnected?: boolean;
|
|
147
|
+
}
|
|
148
|
+
export interface Peer {
|
|
149
|
+
/**
|
|
150
|
+
* The identifier of the remote peer
|
|
151
|
+
*/
|
|
152
|
+
id: string;
|
|
153
|
+
/**
|
|
154
|
+
* The list of addresses the peer has that we know about
|
|
155
|
+
*/
|
|
156
|
+
addresses: Address[];
|
|
157
|
+
/**
|
|
158
|
+
* Any peer store tags the peer has
|
|
159
|
+
*/
|
|
160
|
+
tags: Record<string, number>;
|
|
161
|
+
/**
|
|
162
|
+
* Any peer store metadata the peer has
|
|
163
|
+
*/
|
|
164
|
+
metadata: Record<string, string>;
|
|
165
|
+
/**
|
|
166
|
+
* The protocols the peer supports, if known
|
|
167
|
+
*/
|
|
168
|
+
protocols: string[];
|
|
169
|
+
}
|
|
100
170
|
export interface DevToolsMetricsInit {
|
|
101
171
|
/**
|
|
102
172
|
* How often to pass metrics to the DevTools panel
|
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;;;;;;;;;;;;;;;;GAgBG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAc,YAAY,EAAU,OAAO,EAAuB,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* ```typescript
|
|
7
7
|
* import { createLibp2p } from 'libp2p'
|
|
8
|
-
* import {
|
|
8
|
+
* import { devToolsMetrics } from '@libp2p/devtools-metrics'
|
|
9
9
|
*
|
|
10
10
|
* const node = await createLibp2p({
|
|
11
11
|
* metrics: devToolsMetrics()
|
|
@@ -20,98 +20,105 @@ import { enable, disable } from '@libp2p/logger';
|
|
|
20
20
|
import { simpleMetrics } from '@libp2p/simple-metrics';
|
|
21
21
|
import { base64 } from 'multiformats/bases/base64';
|
|
22
22
|
export const SOURCE_DEVTOOLS = '@libp2p/devtools-metrics:devtools';
|
|
23
|
-
export const
|
|
23
|
+
export const SOURCE_SERVICE_WORKER = '@libp2p/devtools-metrics:worker';
|
|
24
|
+
export const SOURCE_CONTENT_SCRIPT = '@libp2p/devtools-metrics:content';
|
|
25
|
+
export const SOURCE_METRICS = '@libp2p/devtools-metrics:metrics';
|
|
26
|
+
export const LIBP2P_DEVTOOLS_METRICS_KEY = '________libp2p_devtools_metrics';
|
|
27
|
+
// let devtools know we are here
|
|
28
|
+
Object.defineProperty(globalThis, LIBP2P_DEVTOOLS_METRICS_KEY, {
|
|
29
|
+
value: true,
|
|
30
|
+
enumerable: false,
|
|
31
|
+
writable: false
|
|
32
|
+
});
|
|
24
33
|
class DevToolsMetrics {
|
|
25
34
|
log;
|
|
26
|
-
|
|
27
|
-
peerId;
|
|
28
|
-
transportManager;
|
|
29
|
-
registrar;
|
|
30
|
-
connectionManager;
|
|
31
|
-
peerStore;
|
|
35
|
+
components;
|
|
32
36
|
simpleMetrics;
|
|
33
37
|
intervalMs;
|
|
34
38
|
constructor(components, init) {
|
|
35
39
|
this.log = components.logger.forComponent('libp2p:devtools-metrics');
|
|
36
|
-
this.events = components.events;
|
|
37
|
-
this.peerId = components.peerId;
|
|
38
|
-
this.transportManager = components.transportManager;
|
|
39
|
-
this.registrar = components.registrar;
|
|
40
|
-
this.connectionManager = components.connectionManager;
|
|
41
|
-
this.peerStore = components.peerStore;
|
|
42
40
|
this.intervalMs = init?.intervalMs;
|
|
41
|
+
this.components = components;
|
|
43
42
|
// collect information on current peers and sent it to the dev tools panel
|
|
44
|
-
this.
|
|
45
|
-
this.
|
|
46
|
-
this.
|
|
43
|
+
this.onPeersUpdate = debounce(this.onPeersUpdate.bind(this), 1000);
|
|
44
|
+
this.onSelfUpdate = this.onSelfUpdate.bind(this);
|
|
45
|
+
this.onIncomingMessage = this.onIncomingMessage.bind(this);
|
|
46
|
+
// collect metrics
|
|
47
|
+
this.simpleMetrics = simpleMetrics({
|
|
48
|
+
intervalMs: this.intervalMs,
|
|
49
|
+
onMetrics: (metrics) => {
|
|
50
|
+
const message = {
|
|
51
|
+
source: SOURCE_METRICS,
|
|
52
|
+
type: 'metrics',
|
|
53
|
+
metrics
|
|
54
|
+
};
|
|
55
|
+
this.log('post metrics message');
|
|
56
|
+
window.postMessage(message, '*');
|
|
57
|
+
}
|
|
58
|
+
})({});
|
|
47
59
|
}
|
|
48
60
|
trackMultiaddrConnection(maConn) {
|
|
49
|
-
this.simpleMetrics
|
|
61
|
+
this.simpleMetrics.trackMultiaddrConnection(maConn);
|
|
50
62
|
}
|
|
51
63
|
trackProtocolStream(stream, connection) {
|
|
52
|
-
this.simpleMetrics
|
|
64
|
+
this.simpleMetrics.trackProtocolStream(stream, connection);
|
|
53
65
|
}
|
|
54
66
|
registerMetric(name, options) {
|
|
55
|
-
return this.simpleMetrics
|
|
67
|
+
return this.simpleMetrics.registerMetric(name, options);
|
|
56
68
|
}
|
|
57
69
|
registerMetricGroup(name, options) {
|
|
58
|
-
return this.simpleMetrics
|
|
70
|
+
return this.simpleMetrics.registerMetricGroup(name, options);
|
|
59
71
|
}
|
|
60
72
|
registerCounter(name, options) {
|
|
61
|
-
return this.simpleMetrics
|
|
73
|
+
return this.simpleMetrics.registerCounter(name, options);
|
|
62
74
|
}
|
|
63
75
|
registerCounterGroup(name, options) {
|
|
64
|
-
return this.simpleMetrics
|
|
76
|
+
return this.simpleMetrics.registerCounterGroup(name, options);
|
|
65
77
|
}
|
|
66
78
|
async start() {
|
|
67
79
|
// send peer updates
|
|
68
|
-
this.events.addEventListener('peer:connect', this.
|
|
69
|
-
this.events.addEventListener('peer:disconnect', this.
|
|
70
|
-
this.events.addEventListener('peer:identify', this.
|
|
71
|
-
this.events.addEventListener('peer:update', this.
|
|
80
|
+
this.components.events.addEventListener('peer:connect', this.onPeersUpdate);
|
|
81
|
+
this.components.events.addEventListener('peer:disconnect', this.onPeersUpdate);
|
|
82
|
+
this.components.events.addEventListener('peer:identify', this.onPeersUpdate);
|
|
83
|
+
this.components.events.addEventListener('peer:update', this.onPeersUpdate);
|
|
72
84
|
// send node status updates
|
|
73
|
-
this.events.addEventListener('self:peer:update', this.
|
|
85
|
+
this.components.events.addEventListener('self:peer:update', this.onSelfUpdate);
|
|
74
86
|
// process incoming messages from devtools
|
|
75
|
-
window.addEventListener('message', this.
|
|
87
|
+
window.addEventListener('message', this.onIncomingMessage);
|
|
76
88
|
// send metrics
|
|
77
|
-
this.simpleMetrics = simpleMetrics({
|
|
78
|
-
intervalMs: this.intervalMs,
|
|
79
|
-
onMetrics: (metrics) => {
|
|
80
|
-
const message = {
|
|
81
|
-
source: '@libp2p/devtools-metrics:node',
|
|
82
|
-
type: 'metrics',
|
|
83
|
-
metrics
|
|
84
|
-
};
|
|
85
|
-
this.log('post metrics message');
|
|
86
|
-
window.postMessage(message, '*');
|
|
87
|
-
}
|
|
88
|
-
})({});
|
|
89
89
|
await start(this.simpleMetrics);
|
|
90
90
|
}
|
|
91
91
|
async stop() {
|
|
92
|
-
window.removeEventListener('message', this.
|
|
93
|
-
this.events.removeEventListener('self:peer:update', this.
|
|
94
|
-
this.events.removeEventListener('peer:connect', this.
|
|
95
|
-
this.events.removeEventListener('peer:disconnect', this.
|
|
96
|
-
this.events.removeEventListener('peer:identify', this.
|
|
97
|
-
this.events.removeEventListener('peer:update', this.
|
|
92
|
+
window.removeEventListener('message', this.onIncomingMessage);
|
|
93
|
+
this.components.events.removeEventListener('self:peer:update', this.onSelfUpdate);
|
|
94
|
+
this.components.events.removeEventListener('peer:connect', this.onPeersUpdate);
|
|
95
|
+
this.components.events.removeEventListener('peer:disconnect', this.onPeersUpdate);
|
|
96
|
+
this.components.events.removeEventListener('peer:identify', this.onPeersUpdate);
|
|
97
|
+
this.components.events.removeEventListener('peer:update', this.onPeersUpdate);
|
|
98
98
|
await stop(this.simpleMetrics);
|
|
99
99
|
}
|
|
100
|
-
|
|
100
|
+
onPeersUpdate() {
|
|
101
101
|
Promise.resolve().then(async () => {
|
|
102
102
|
const message = {
|
|
103
|
-
source:
|
|
103
|
+
source: SOURCE_METRICS,
|
|
104
104
|
type: 'peers',
|
|
105
105
|
peers: []
|
|
106
106
|
};
|
|
107
|
-
const connections = this.connectionManager.getConnectionsMap();
|
|
107
|
+
const connections = this.components.connectionManager.getConnectionsMap();
|
|
108
|
+
const connectedAddresses = [...connections.values()].flatMap(conn => conn).map(conn => conn.remoteAddr.toString());
|
|
108
109
|
for (const [peerId, conns] of connections.entries()) {
|
|
109
110
|
try {
|
|
110
|
-
const peer = await this.peerStore.get(peerId);
|
|
111
|
+
const peer = await this.components.peerStore.get(peerId);
|
|
111
112
|
message.peers.push({
|
|
112
|
-
|
|
113
|
-
addresses:
|
|
114
|
-
|
|
113
|
+
id: peerId.toString(),
|
|
114
|
+
addresses: peer.addresses.map(({ isCertified, multiaddr }) => {
|
|
115
|
+
const addr = multiaddr.toString();
|
|
116
|
+
return {
|
|
117
|
+
multiaddr: addr,
|
|
118
|
+
isCertified,
|
|
119
|
+
isConnected: connectedAddresses.includes(addr)
|
|
120
|
+
};
|
|
121
|
+
}),
|
|
115
122
|
protocols: [...peer.protocols],
|
|
116
123
|
tags: toObject(peer.tags, (t) => t.value),
|
|
117
124
|
metadata: toObject(peer.metadata, (buf) => base64.encode(buf))
|
|
@@ -120,9 +127,14 @@ class DevToolsMetrics {
|
|
|
120
127
|
catch (err) {
|
|
121
128
|
this.log.error('could not load peer data from peer store', err);
|
|
122
129
|
message.peers.push({
|
|
123
|
-
|
|
124
|
-
addresses: conns.map(conn =>
|
|
125
|
-
|
|
130
|
+
id: peerId.toString(),
|
|
131
|
+
addresses: conns.map(conn => {
|
|
132
|
+
const addr = conn.remoteAddr.toString();
|
|
133
|
+
return {
|
|
134
|
+
multiaddr: addr,
|
|
135
|
+
isConnected: connectedAddresses.includes(addr)
|
|
136
|
+
};
|
|
137
|
+
}),
|
|
126
138
|
protocols: [],
|
|
127
139
|
tags: {},
|
|
128
140
|
metadata: {}
|
|
@@ -135,39 +147,52 @@ class DevToolsMetrics {
|
|
|
135
147
|
this.log.error('error sending peers message', err);
|
|
136
148
|
});
|
|
137
149
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
source: '@libp2p/devtools-metrics:node',
|
|
141
|
-
type: 'self',
|
|
142
|
-
peerId: evt.detail.peer.id.toString(),
|
|
143
|
-
multiaddrs: evt.detail.peer.addresses.map(({ multiaddr }) => multiaddr.toString()),
|
|
144
|
-
protocols: [...evt.detail.peer.protocols]
|
|
145
|
-
};
|
|
146
|
-
this.log('post node update message');
|
|
147
|
-
window.postMessage(message, '*');
|
|
150
|
+
onSelfUpdate(evt) {
|
|
151
|
+
this.sendSelfUpdate(evt.detail.peer);
|
|
148
152
|
}
|
|
149
|
-
|
|
153
|
+
sendSelfUpdate(peer) {
|
|
154
|
+
Promise.resolve()
|
|
155
|
+
.then(async () => {
|
|
156
|
+
const message = {
|
|
157
|
+
source: SOURCE_METRICS,
|
|
158
|
+
type: 'self',
|
|
159
|
+
peer: {
|
|
160
|
+
id: peer.id.toString(),
|
|
161
|
+
multiaddrs: peer.addresses.map(({ multiaddr }) => multiaddr.toString()),
|
|
162
|
+
protocols: [...peer.protocols],
|
|
163
|
+
tags: toObject(peer.tags, (t) => t.value),
|
|
164
|
+
metadata: toObject(peer.metadata, (buf) => base64.encode(buf))
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
this.log('post node update message');
|
|
168
|
+
window.postMessage(message, '*');
|
|
169
|
+
})
|
|
170
|
+
.catch(err => {
|
|
171
|
+
this.log.error('error sending self update', err);
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
onIncomingMessage(event) {
|
|
150
175
|
// Only accept messages from same frame
|
|
151
176
|
if (event.source !== window) {
|
|
152
177
|
return;
|
|
153
178
|
}
|
|
154
179
|
const message = event.data;
|
|
155
180
|
// Only accept messages of correct format (our messages)
|
|
156
|
-
if (message?.source !==
|
|
181
|
+
if (message?.source !== SOURCE_DEVTOOLS) {
|
|
157
182
|
return;
|
|
158
183
|
}
|
|
159
184
|
// respond to identify request
|
|
160
185
|
if (message.type === 'identify') {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
186
|
+
Promise.resolve()
|
|
187
|
+
.then(async () => {
|
|
188
|
+
const peer = await this.components.peerStore.get(this.components.peerId);
|
|
189
|
+
this.sendSelfUpdate(peer);
|
|
190
|
+
// also send our current peer list
|
|
191
|
+
this.onPeersUpdate();
|
|
192
|
+
})
|
|
193
|
+
.catch(err => {
|
|
194
|
+
this.log.error('error sending identify response', err);
|
|
195
|
+
});
|
|
171
196
|
}
|
|
172
197
|
// handle enabling/disabling debug namespaces
|
|
173
198
|
if (message.type === 'debug') {
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAIlD,MAAM,CAAC,MAAM,eAAe,GAAG,mCAAmC,CAAA;AAClE,MAAM,CAAC,MAAM,
|
|
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/devtools-metrics",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.1-7464dc00c",
|
|
4
4
|
"description": "Collect libp2p metrics and send them to browser DevTools",
|
|
5
5
|
"author": "",
|
|
6
6
|
"license": "Apache-2.0 OR MIT",
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
"url": "https://github.com/libp2p/js-libp2p/issues"
|
|
14
14
|
},
|
|
15
15
|
"publishConfig": {
|
|
16
|
-
"access": "public"
|
|
16
|
+
"access": "public",
|
|
17
|
+
"provenance": true
|
|
17
18
|
},
|
|
18
19
|
"type": "module",
|
|
19
20
|
"types": "./dist/src/index.d.ts",
|
|
@@ -46,14 +47,14 @@
|
|
|
46
47
|
"test:chrome": "aegir test -t browser --cov"
|
|
47
48
|
},
|
|
48
49
|
"dependencies": {
|
|
49
|
-
"@libp2p/interface": "
|
|
50
|
-
"@libp2p/interface-internal": "
|
|
51
|
-
"@libp2p/logger": "
|
|
52
|
-
"@libp2p/simple-metrics": "
|
|
50
|
+
"@libp2p/interface": "1.4.0-7464dc00c",
|
|
51
|
+
"@libp2p/interface-internal": "1.2.2-7464dc00c",
|
|
52
|
+
"@libp2p/logger": "4.0.13-7464dc00c",
|
|
53
|
+
"@libp2p/simple-metrics": "1.0.2-7464dc00c",
|
|
53
54
|
"multiformats": "^13.1.0"
|
|
54
55
|
},
|
|
55
56
|
"devDependencies": {
|
|
56
|
-
"@libp2p/peer-id-factory": "
|
|
57
|
+
"@libp2p/peer-id-factory": "4.1.2-7464dc00c",
|
|
57
58
|
"aegir": "^42.2.5",
|
|
58
59
|
"race-event": "^1.3.0",
|
|
59
60
|
"sinon-ts": "^2.0.0"
|
package/src/index.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* ```typescript
|
|
7
7
|
* import { createLibp2p } from 'libp2p'
|
|
8
|
-
* import {
|
|
8
|
+
* import { devToolsMetrics } from '@libp2p/devtools-metrics'
|
|
9
9
|
*
|
|
10
10
|
* const node = await createLibp2p({
|
|
11
11
|
* metrics: devToolsMetrics()
|
|
@@ -20,17 +20,27 @@ import { start, stop } from '@libp2p/interface'
|
|
|
20
20
|
import { enable, disable } from '@libp2p/logger'
|
|
21
21
|
import { simpleMetrics } from '@libp2p/simple-metrics'
|
|
22
22
|
import { base64 } from 'multiformats/bases/base64'
|
|
23
|
-
import type { ComponentLogger, Connection, Libp2pEvents, Logger, Metrics, MultiaddrConnection, PeerId, PeerStore, PeerUpdate, Stream, TypedEventEmitter } from '@libp2p/interface'
|
|
23
|
+
import type { ComponentLogger, Connection, Libp2pEvents, Logger, Metrics, MultiaddrConnection, PeerId, Peer as PeerStorePeer, PeerStore, PeerUpdate, Stream, TypedEventEmitter } from '@libp2p/interface'
|
|
24
24
|
import type { TransportManager, Registrar, ConnectionManager } from '@libp2p/interface-internal'
|
|
25
25
|
|
|
26
26
|
export const SOURCE_DEVTOOLS = '@libp2p/devtools-metrics:devtools'
|
|
27
|
-
export const
|
|
27
|
+
export const SOURCE_SERVICE_WORKER = '@libp2p/devtools-metrics:worker'
|
|
28
|
+
export const SOURCE_CONTENT_SCRIPT = '@libp2p/devtools-metrics:content'
|
|
29
|
+
export const SOURCE_METRICS = '@libp2p/devtools-metrics:metrics'
|
|
30
|
+
export const LIBP2P_DEVTOOLS_METRICS_KEY = '________libp2p_devtools_metrics'
|
|
31
|
+
|
|
32
|
+
// let devtools know we are here
|
|
33
|
+
Object.defineProperty(globalThis, LIBP2P_DEVTOOLS_METRICS_KEY, {
|
|
34
|
+
value: true,
|
|
35
|
+
enumerable: false,
|
|
36
|
+
writable: false
|
|
37
|
+
})
|
|
28
38
|
|
|
29
39
|
/**
|
|
30
40
|
* Sent when new metrics are available
|
|
31
41
|
*/
|
|
32
42
|
export interface MetricsMessage {
|
|
33
|
-
source:
|
|
43
|
+
source: typeof SOURCE_METRICS
|
|
34
44
|
type: 'metrics'
|
|
35
45
|
metrics: Record<string, any>
|
|
36
46
|
}
|
|
@@ -39,60 +49,50 @@ export interface MetricsMessage {
|
|
|
39
49
|
* This message represents the current state of the libp2p node
|
|
40
50
|
*/
|
|
41
51
|
export interface SelfMessage {
|
|
42
|
-
source:
|
|
52
|
+
source: typeof SOURCE_METRICS
|
|
43
53
|
type: 'self'
|
|
44
|
-
|
|
45
|
-
multiaddrs: string[]
|
|
46
|
-
protocols: string[]
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export interface Peer {
|
|
50
|
-
/**
|
|
51
|
-
* The identifier of the remote peer
|
|
52
|
-
*/
|
|
53
|
-
peerId: string
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* The addresses we are connected to the peer via
|
|
57
|
-
*/
|
|
58
|
-
addresses: string[]
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* The complete list of addresses the peer has, if known
|
|
62
|
-
*/
|
|
63
|
-
multiaddrs: Array<{ isCertified?: boolean, multiaddr: string }>
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Any peer store tags the peer has
|
|
67
|
-
*/
|
|
68
|
-
tags: Record<string, number>
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Any peer store tags the peer has
|
|
72
|
-
*/
|
|
73
|
-
metadata: Record<string, string>
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* The protocols the peer supports, if known
|
|
77
|
-
*/
|
|
78
|
-
protocols: string[]
|
|
54
|
+
peer: SelfPeer
|
|
79
55
|
}
|
|
80
56
|
|
|
81
57
|
/**
|
|
82
58
|
* This message represents the current state of the libp2p node
|
|
83
59
|
*/
|
|
84
60
|
export interface PeersMessage {
|
|
85
|
-
source:
|
|
61
|
+
source: typeof SOURCE_METRICS
|
|
86
62
|
type: 'peers'
|
|
87
63
|
peers: Peer[]
|
|
88
64
|
}
|
|
89
65
|
|
|
66
|
+
/**
|
|
67
|
+
* Sent by the DevTools service worker to the DevTools panel when the inspected
|
|
68
|
+
* page has finished (re)loading
|
|
69
|
+
*/
|
|
70
|
+
export interface PageLoadedMessage {
|
|
71
|
+
source: '@libp2p/devtools-metrics:devtools'
|
|
72
|
+
type: 'page-loaded'
|
|
73
|
+
tabId: number
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Sent by the DevTools service worker to the DevTools panel when it has failed
|
|
78
|
+
* to send a message to the inspected page as there is no receiving end present.
|
|
79
|
+
*
|
|
80
|
+
* This normally means the content script has not been loaded due to the user
|
|
81
|
+
* not having granted permission for the script to run.
|
|
82
|
+
*/
|
|
83
|
+
export interface PermissionsErrorMessage {
|
|
84
|
+
source: '@libp2p/devtools-metrics:devtools'
|
|
85
|
+
type: 'permissions-error'
|
|
86
|
+
tabId: number
|
|
87
|
+
}
|
|
88
|
+
|
|
90
89
|
/**
|
|
91
90
|
* This message is sent by DevTools when no `self` message has been received
|
|
92
91
|
*/
|
|
93
92
|
export interface IdentifyMessage {
|
|
94
93
|
source: '@libp2p/devtools-metrics:devtools'
|
|
95
94
|
type: 'identify'
|
|
95
|
+
tabId: number
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
/**
|
|
@@ -102,17 +102,108 @@ export interface EnableDebugMessage {
|
|
|
102
102
|
source: '@libp2p/devtools-metrics:devtools'
|
|
103
103
|
type: 'debug'
|
|
104
104
|
namespace: string
|
|
105
|
+
tabId: number
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* We cannot use the web extension API to copy text to the cliboard yet as it's
|
|
110
|
+
* not supported in Firefox yet, so get the page to do it
|
|
111
|
+
*
|
|
112
|
+
* @see https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Interact_with_the_clipboard#writing_to_the_clipboard
|
|
113
|
+
*/
|
|
114
|
+
export interface CopyToClipboardMessage {
|
|
115
|
+
source: '@libp2p/devtools-metrics:devtools'
|
|
116
|
+
type: 'copy-to-clipboard'
|
|
117
|
+
value: string
|
|
118
|
+
tabId: number
|
|
105
119
|
}
|
|
106
120
|
|
|
107
121
|
/**
|
|
108
122
|
* Messages that are sent from the application page to the DevTools panel
|
|
109
123
|
*/
|
|
110
|
-
export type
|
|
124
|
+
export type ApplicationMessage = MetricsMessage | SelfMessage | PeersMessage
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Messages that are sent from the service worker
|
|
128
|
+
*/
|
|
129
|
+
export type WorkerMessage = PageLoadedMessage | PermissionsErrorMessage
|
|
111
130
|
|
|
112
131
|
/**
|
|
113
132
|
* Messages that are sent from the DevTools panel page to the application page
|
|
114
133
|
*/
|
|
115
|
-
export type DevToolsMessage = IdentifyMessage | EnableDebugMessage
|
|
134
|
+
export type DevToolsMessage = IdentifyMessage | EnableDebugMessage | CopyToClipboardMessage
|
|
135
|
+
|
|
136
|
+
export interface SelfPeer {
|
|
137
|
+
/**
|
|
138
|
+
* The identifier of the peer
|
|
139
|
+
*/
|
|
140
|
+
id: string
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* The list of multiaddrs the peer is listening on
|
|
144
|
+
*/
|
|
145
|
+
multiaddrs: string[]
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Any peer store tags the peer has
|
|
149
|
+
*/
|
|
150
|
+
tags: Record<string, number>
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Any peer store metadata the peer has
|
|
154
|
+
*/
|
|
155
|
+
metadata: Record<string, string>
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* The protocols the peer supports
|
|
159
|
+
*/
|
|
160
|
+
protocols: string[]
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export interface Address {
|
|
164
|
+
/**
|
|
165
|
+
* The multiaddr this address represents
|
|
166
|
+
*/
|
|
167
|
+
multiaddr: string
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* If `true`, this multiaddr came from a signed peer record
|
|
171
|
+
*/
|
|
172
|
+
isCertified?: boolean
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* If `true`, the current node has an active connection to this peer via this
|
|
176
|
+
* address
|
|
177
|
+
*/
|
|
178
|
+
isConnected?: boolean
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export interface Peer {
|
|
182
|
+
/**
|
|
183
|
+
* The identifier of the remote peer
|
|
184
|
+
*/
|
|
185
|
+
id: string
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* The list of addresses the peer has that we know about
|
|
189
|
+
*/
|
|
190
|
+
addresses: Address[]
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Any peer store tags the peer has
|
|
194
|
+
*/
|
|
195
|
+
tags: Record<string, number>
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Any peer store metadata the peer has
|
|
199
|
+
*/
|
|
200
|
+
metadata: Record<string, string>
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* The protocols the peer supports, if known
|
|
204
|
+
*/
|
|
205
|
+
protocols: string[]
|
|
206
|
+
}
|
|
116
207
|
|
|
117
208
|
export interface DevToolsMetricsInit {
|
|
118
209
|
/**
|
|
@@ -133,114 +224,113 @@ export interface DevToolsMetricsComponents {
|
|
|
133
224
|
|
|
134
225
|
class DevToolsMetrics implements Metrics {
|
|
135
226
|
private readonly log: Logger
|
|
136
|
-
private readonly
|
|
137
|
-
private readonly
|
|
138
|
-
private readonly transportManager: TransportManager
|
|
139
|
-
private readonly registrar: Registrar
|
|
140
|
-
private readonly connectionManager: ConnectionManager
|
|
141
|
-
private readonly peerStore: PeerStore
|
|
142
|
-
private simpleMetrics?: Metrics
|
|
227
|
+
private readonly components: DevToolsMetricsComponents
|
|
228
|
+
private readonly simpleMetrics: Metrics
|
|
143
229
|
private readonly intervalMs?: number
|
|
144
230
|
|
|
145
231
|
constructor (components: DevToolsMetricsComponents, init?: Partial<DevToolsMetricsInit>) {
|
|
146
232
|
this.log = components.logger.forComponent('libp2p:devtools-metrics')
|
|
147
|
-
this.events = components.events
|
|
148
|
-
this.peerId = components.peerId
|
|
149
|
-
this.transportManager = components.transportManager
|
|
150
|
-
this.registrar = components.registrar
|
|
151
|
-
this.connectionManager = components.connectionManager
|
|
152
|
-
this.peerStore = components.peerStore
|
|
153
233
|
this.intervalMs = init?.intervalMs
|
|
234
|
+
this.components = components
|
|
154
235
|
|
|
155
236
|
// collect information on current peers and sent it to the dev tools panel
|
|
156
|
-
this.
|
|
237
|
+
this.onPeersUpdate = debounce(this.onPeersUpdate.bind(this), 1000)
|
|
238
|
+
this.onSelfUpdate = this.onSelfUpdate.bind(this)
|
|
239
|
+
this.onIncomingMessage = this.onIncomingMessage.bind(this)
|
|
157
240
|
|
|
158
|
-
|
|
159
|
-
this.
|
|
241
|
+
// collect metrics
|
|
242
|
+
this.simpleMetrics = simpleMetrics({
|
|
243
|
+
intervalMs: this.intervalMs,
|
|
244
|
+
onMetrics: (metrics) => {
|
|
245
|
+
const message: MetricsMessage = {
|
|
246
|
+
source: SOURCE_METRICS,
|
|
247
|
+
type: 'metrics',
|
|
248
|
+
metrics
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
this.log('post metrics message')
|
|
252
|
+
window.postMessage(message, '*')
|
|
253
|
+
}
|
|
254
|
+
})({})
|
|
160
255
|
}
|
|
161
256
|
|
|
162
257
|
trackMultiaddrConnection (maConn: MultiaddrConnection): void {
|
|
163
|
-
this.simpleMetrics
|
|
258
|
+
this.simpleMetrics.trackMultiaddrConnection(maConn)
|
|
164
259
|
}
|
|
165
260
|
|
|
166
261
|
trackProtocolStream (stream: Stream, connection: Connection): void {
|
|
167
|
-
this.simpleMetrics
|
|
262
|
+
this.simpleMetrics.trackProtocolStream(stream, connection)
|
|
168
263
|
}
|
|
169
264
|
|
|
170
265
|
registerMetric (name: any, options: any): any {
|
|
171
|
-
return this.simpleMetrics
|
|
266
|
+
return this.simpleMetrics.registerMetric(name, options)
|
|
172
267
|
}
|
|
173
268
|
|
|
174
269
|
registerMetricGroup (name: any, options: any): any {
|
|
175
|
-
return this.simpleMetrics
|
|
270
|
+
return this.simpleMetrics.registerMetricGroup(name, options)
|
|
176
271
|
}
|
|
177
272
|
|
|
178
273
|
registerCounter (name: any, options: any): any {
|
|
179
|
-
return this.simpleMetrics
|
|
274
|
+
return this.simpleMetrics.registerCounter(name, options)
|
|
180
275
|
}
|
|
181
276
|
|
|
182
277
|
registerCounterGroup (name: any, options: any): any {
|
|
183
|
-
return this.simpleMetrics
|
|
278
|
+
return this.simpleMetrics.registerCounterGroup(name, options)
|
|
184
279
|
}
|
|
185
280
|
|
|
186
281
|
async start (): Promise<void> {
|
|
187
282
|
// send peer updates
|
|
188
|
-
this.events.addEventListener('peer:connect', this.
|
|
189
|
-
this.events.addEventListener('peer:disconnect', this.
|
|
190
|
-
this.events.addEventListener('peer:identify', this.
|
|
191
|
-
this.events.addEventListener('peer:update', this.
|
|
283
|
+
this.components.events.addEventListener('peer:connect', this.onPeersUpdate)
|
|
284
|
+
this.components.events.addEventListener('peer:disconnect', this.onPeersUpdate)
|
|
285
|
+
this.components.events.addEventListener('peer:identify', this.onPeersUpdate)
|
|
286
|
+
this.components.events.addEventListener('peer:update', this.onPeersUpdate)
|
|
192
287
|
|
|
193
288
|
// send node status updates
|
|
194
|
-
this.events.addEventListener('self:peer:update', this.
|
|
289
|
+
this.components.events.addEventListener('self:peer:update', this.onSelfUpdate)
|
|
195
290
|
|
|
196
291
|
// process incoming messages from devtools
|
|
197
|
-
window.addEventListener('message', this.
|
|
292
|
+
window.addEventListener('message', this.onIncomingMessage)
|
|
198
293
|
|
|
199
294
|
// send metrics
|
|
200
|
-
this.simpleMetrics = simpleMetrics({
|
|
201
|
-
intervalMs: this.intervalMs,
|
|
202
|
-
onMetrics: (metrics) => {
|
|
203
|
-
const message: MetricsMessage = {
|
|
204
|
-
source: '@libp2p/devtools-metrics:node',
|
|
205
|
-
type: 'metrics',
|
|
206
|
-
metrics
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
this.log('post metrics message')
|
|
210
|
-
window.postMessage(message, '*')
|
|
211
|
-
}
|
|
212
|
-
})({})
|
|
213
295
|
await start(this.simpleMetrics)
|
|
214
296
|
}
|
|
215
297
|
|
|
216
298
|
async stop (): Promise<void> {
|
|
217
|
-
window.removeEventListener('message', this.
|
|
218
|
-
this.events.removeEventListener('self:peer:update', this.
|
|
219
|
-
this.events.removeEventListener('peer:connect', this.
|
|
220
|
-
this.events.removeEventListener('peer:disconnect', this.
|
|
221
|
-
this.events.removeEventListener('peer:identify', this.
|
|
222
|
-
this.events.removeEventListener('peer:update', this.
|
|
299
|
+
window.removeEventListener('message', this.onIncomingMessage)
|
|
300
|
+
this.components.events.removeEventListener('self:peer:update', this.onSelfUpdate)
|
|
301
|
+
this.components.events.removeEventListener('peer:connect', this.onPeersUpdate)
|
|
302
|
+
this.components.events.removeEventListener('peer:disconnect', this.onPeersUpdate)
|
|
303
|
+
this.components.events.removeEventListener('peer:identify', this.onPeersUpdate)
|
|
304
|
+
this.components.events.removeEventListener('peer:update', this.onPeersUpdate)
|
|
223
305
|
await stop(this.simpleMetrics)
|
|
224
306
|
}
|
|
225
307
|
|
|
226
|
-
private
|
|
308
|
+
private onPeersUpdate (): void {
|
|
227
309
|
Promise.resolve().then(async () => {
|
|
228
310
|
const message: PeersMessage = {
|
|
229
|
-
source:
|
|
311
|
+
source: SOURCE_METRICS,
|
|
230
312
|
type: 'peers',
|
|
231
313
|
peers: []
|
|
232
314
|
}
|
|
233
315
|
|
|
234
|
-
const connections = this.connectionManager.getConnectionsMap()
|
|
316
|
+
const connections = this.components.connectionManager.getConnectionsMap()
|
|
317
|
+
const connectedAddresses = [...connections.values()].flatMap(conn => conn).map(conn => conn.remoteAddr.toString())
|
|
235
318
|
|
|
236
319
|
for (const [peerId, conns] of connections.entries()) {
|
|
237
320
|
try {
|
|
238
|
-
const peer = await this.peerStore.get(peerId)
|
|
321
|
+
const peer = await this.components.peerStore.get(peerId)
|
|
239
322
|
|
|
240
323
|
message.peers.push({
|
|
241
|
-
|
|
242
|
-
addresses:
|
|
243
|
-
|
|
324
|
+
id: peerId.toString(),
|
|
325
|
+
addresses: peer.addresses.map(({ isCertified, multiaddr }) => {
|
|
326
|
+
const addr = multiaddr.toString()
|
|
327
|
+
|
|
328
|
+
return {
|
|
329
|
+
multiaddr: addr,
|
|
330
|
+
isCertified,
|
|
331
|
+
isConnected: connectedAddresses.includes(addr)
|
|
332
|
+
}
|
|
333
|
+
}),
|
|
244
334
|
protocols: [...peer.protocols],
|
|
245
335
|
tags: toObject(peer.tags, (t) => t.value),
|
|
246
336
|
metadata: toObject(peer.metadata, (buf) => base64.encode(buf))
|
|
@@ -249,9 +339,15 @@ class DevToolsMetrics implements Metrics {
|
|
|
249
339
|
this.log.error('could not load peer data from peer store', err)
|
|
250
340
|
|
|
251
341
|
message.peers.push({
|
|
252
|
-
|
|
253
|
-
addresses: conns.map(conn =>
|
|
254
|
-
|
|
342
|
+
id: peerId.toString(),
|
|
343
|
+
addresses: conns.map(conn => {
|
|
344
|
+
const addr = conn.remoteAddr.toString()
|
|
345
|
+
|
|
346
|
+
return {
|
|
347
|
+
multiaddr: addr,
|
|
348
|
+
isConnected: connectedAddresses.includes(addr)
|
|
349
|
+
}
|
|
350
|
+
}),
|
|
255
351
|
protocols: [],
|
|
256
352
|
tags: {},
|
|
257
353
|
metadata: {}
|
|
@@ -266,20 +362,34 @@ class DevToolsMetrics implements Metrics {
|
|
|
266
362
|
})
|
|
267
363
|
}
|
|
268
364
|
|
|
269
|
-
private
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
365
|
+
private onSelfUpdate (evt: CustomEvent<PeerUpdate>): void {
|
|
366
|
+
this.sendSelfUpdate(evt.detail.peer)
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
private sendSelfUpdate (peer: PeerStorePeer): void {
|
|
370
|
+
Promise.resolve()
|
|
371
|
+
.then(async () => {
|
|
372
|
+
const message: SelfMessage = {
|
|
373
|
+
source: SOURCE_METRICS,
|
|
374
|
+
type: 'self',
|
|
375
|
+
peer: {
|
|
376
|
+
id: peer.id.toString(),
|
|
377
|
+
multiaddrs: peer.addresses.map(({ multiaddr }) => multiaddr.toString()),
|
|
378
|
+
protocols: [...peer.protocols],
|
|
379
|
+
tags: toObject(peer.tags, (t) => t.value),
|
|
380
|
+
metadata: toObject(peer.metadata, (buf) => base64.encode(buf))
|
|
381
|
+
}
|
|
382
|
+
}
|
|
277
383
|
|
|
278
|
-
|
|
279
|
-
|
|
384
|
+
this.log('post node update message')
|
|
385
|
+
window.postMessage(message, '*')
|
|
386
|
+
})
|
|
387
|
+
.catch(err => {
|
|
388
|
+
this.log.error('error sending self update', err)
|
|
389
|
+
})
|
|
280
390
|
}
|
|
281
391
|
|
|
282
|
-
private
|
|
392
|
+
private onIncomingMessage (event: MessageEvent<DevToolsMessage>): void {
|
|
283
393
|
// Only accept messages from same frame
|
|
284
394
|
if (event.source !== window) {
|
|
285
395
|
return
|
|
@@ -288,24 +398,23 @@ class DevToolsMetrics implements Metrics {
|
|
|
288
398
|
const message = event.data
|
|
289
399
|
|
|
290
400
|
// Only accept messages of correct format (our messages)
|
|
291
|
-
if (message?.source !==
|
|
401
|
+
if (message?.source !== SOURCE_DEVTOOLS) {
|
|
292
402
|
return
|
|
293
403
|
}
|
|
294
404
|
|
|
295
405
|
// respond to identify request
|
|
296
406
|
if (message.type === 'identify') {
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
this.sendPeers()
|
|
407
|
+
Promise.resolve()
|
|
408
|
+
.then(async () => {
|
|
409
|
+
const peer = await this.components.peerStore.get(this.components.peerId)
|
|
410
|
+
|
|
411
|
+
this.sendSelfUpdate(peer)
|
|
412
|
+
// also send our current peer list
|
|
413
|
+
this.onPeersUpdate()
|
|
414
|
+
})
|
|
415
|
+
.catch(err => {
|
|
416
|
+
this.log.error('error sending identify response', err)
|
|
417
|
+
})
|
|
309
418
|
}
|
|
310
419
|
|
|
311
420
|
// handle enabling/disabling debug namespaces
|
package/dist/typedoc-urls.json
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"DevToolsMetricsComponents": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.DevToolsMetricsComponents.html",
|
|
3
|
-
".:DevToolsMetricsComponents": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.DevToolsMetricsComponents.html",
|
|
4
|
-
"DevToolsMetricsInit": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.DevToolsMetricsInit.html",
|
|
5
|
-
".:DevToolsMetricsInit": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.DevToolsMetricsInit.html",
|
|
6
|
-
"EnableDebugMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.EnableDebugMessage.html",
|
|
7
|
-
".:EnableDebugMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.EnableDebugMessage.html",
|
|
8
|
-
"IdentifyMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.IdentifyMessage.html",
|
|
9
|
-
".:IdentifyMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.IdentifyMessage.html",
|
|
10
|
-
"MetricsMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.MetricsMessage.html",
|
|
11
|
-
".:MetricsMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.MetricsMessage.html",
|
|
12
|
-
"Peer": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.Peer.html",
|
|
13
|
-
".:Peer": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.Peer.html",
|
|
14
|
-
"PeersMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.PeersMessage.html",
|
|
15
|
-
".:PeersMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.PeersMessage.html",
|
|
16
|
-
"SelfMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.SelfMessage.html",
|
|
17
|
-
".:SelfMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.SelfMessage.html",
|
|
18
|
-
"BrowserMessage": "https://libp2p.github.io/js-libp2p/types/_libp2p_devtools_metrics.BrowserMessage.html",
|
|
19
|
-
".:BrowserMessage": "https://libp2p.github.io/js-libp2p/types/_libp2p_devtools_metrics.BrowserMessage.html",
|
|
20
|
-
"DevToolsMessage": "https://libp2p.github.io/js-libp2p/types/_libp2p_devtools_metrics.DevToolsMessage.html",
|
|
21
|
-
".:DevToolsMessage": "https://libp2p.github.io/js-libp2p/types/_libp2p_devtools_metrics.DevToolsMessage.html",
|
|
22
|
-
"SOURCE_APPLICATION": "https://libp2p.github.io/js-libp2p/variables/_libp2p_devtools_metrics.SOURCE_APPLICATION.html",
|
|
23
|
-
".:SOURCE_APPLICATION": "https://libp2p.github.io/js-libp2p/variables/_libp2p_devtools_metrics.SOURCE_APPLICATION.html",
|
|
24
|
-
"SOURCE_DEVTOOLS": "https://libp2p.github.io/js-libp2p/variables/_libp2p_devtools_metrics.SOURCE_DEVTOOLS.html",
|
|
25
|
-
".:SOURCE_DEVTOOLS": "https://libp2p.github.io/js-libp2p/variables/_libp2p_devtools_metrics.SOURCE_DEVTOOLS.html",
|
|
26
|
-
"devToolsMetrics": "https://libp2p.github.io/js-libp2p/functions/_libp2p_devtools_metrics.devToolsMetrics.html",
|
|
27
|
-
".:devToolsMetrics": "https://libp2p.github.io/js-libp2p/functions/_libp2p_devtools_metrics.devToolsMetrics.html"
|
|
28
|
-
}
|