@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 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 { devtoolsMetrics } from '@libp2p/devtools-metrics'
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}));
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * ```typescript
7
7
  * import { createLibp2p } from 'libp2p'
8
- * import { devtoolsMetrics } from '@libp2p/devtools-metrics'
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 SOURCE_APPLICATION = "@libp2p/devtools-metrics:node";
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: '@libp2p/devtools-metrics:node';
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: '@libp2p/devtools-metrics:node';
37
+ source: typeof SOURCE_METRICS;
35
38
  type: 'self';
36
- peerId: string;
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: '@libp2p/devtools-metrics:node';
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 BrowserMessage = MetricsMessage | SelfMessage | PeersMessage;
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
@@ -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,EAAE,SAAS,EAAsB,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAClL,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAEhG,eAAO,MAAM,eAAe,sCAAsC,CAAA;AAClE,eAAO,MAAM,kBAAkB,kCAAkC,CAAA;AAEjE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,+BAA+B,CAAA;IACvC,IAAI,EAAE,SAAS,CAAA;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,+BAA+B,CAAA;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,IAAI;IACnB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IAEd;;OAEG;IACH,SAAS,EAAE,MAAM,EAAE,CAAA;IAEnB;;OAEG;IACH,UAAU,EAAE,KAAK,CAAC;QAAE,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAE/D;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAE5B;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAEhC;;OAEG;IACH,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,+BAA+B,CAAA;IACvC,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE,IAAI,EAAE,CAAA;CACd;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,mCAAmC,CAAA;IAC3C,IAAI,EAAE,UAAU,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,mCAAmC,CAAA;IAC3C,IAAI,EAAE,OAAO,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,WAAW,GAAG,YAAY,CAAA;AAExE;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,eAAe,GAAG,kBAAkB,CAAA;AAElE,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,eAAe,CAAA;IACvB,MAAM,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAA;IACvC,MAAM,EAAE,MAAM,CAAA;IACd,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,SAAS,EAAE,SAAS,CAAA;IACpB,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,SAAS,EAAE,SAAS,CAAA;CACrB;AA8LD,wBAAgB,eAAe,CAAE,IAAI,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,EAAE,yBAAyB,KAAK,OAAO,CAIxH"}
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,EAAyB,SAAS,EAAsB,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACzM,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAEhG,eAAO,MAAM,eAAe,sCAAsC,CAAA;AAClE,eAAO,MAAM,qBAAqB,oCAAoC,CAAA;AACtE,eAAO,MAAM,qBAAqB,qCAAqC,CAAA;AACvE,eAAO,MAAM,cAAc,qCAAqC,CAAA;AAChE,eAAO,MAAM,2BAA2B,oCAAoC,CAAA;AAS5E;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,cAAc,CAAA;IAC7B,IAAI,EAAE,SAAS,CAAA;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,cAAc,CAAA;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,QAAQ,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,OAAO,cAAc,CAAA;IAC7B,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE,IAAI,EAAE,CAAA;CACd;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,mCAAmC,CAAA;IAC3C,IAAI,EAAE,aAAa,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;;;;GAMG;AACH,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,mCAAmC,CAAA;IAC3C,IAAI,EAAE,mBAAmB,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,mCAAmC,CAAA;IAC3C,IAAI,EAAE,UAAU,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,mCAAmC,CAAA;IAC3C,IAAI,EAAE,OAAO,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,mCAAmC,CAAA;IAC3C,IAAI,EAAE,mBAAmB,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,cAAc,GAAG,WAAW,GAAG,YAAY,CAAA;AAE5E;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,iBAAiB,GAAG,uBAAuB,CAAA;AAEvE;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,eAAe,GAAG,kBAAkB,GAAG,sBAAsB,CAAA;AAE3F,MAAM,WAAW,QAAQ;IACvB;;OAEG;IACH,EAAE,EAAE,MAAM,CAAA;IAEV;;OAEG;IACH,UAAU,EAAE,MAAM,EAAE,CAAA;IAEpB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAE5B;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAEhC;;OAEG;IACH,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,OAAO;IACtB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IAErB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,MAAM,WAAW,IAAI;IACnB;;OAEG;IACH,EAAE,EAAE,MAAM,CAAA;IAEV;;OAEG;IACH,SAAS,EAAE,OAAO,EAAE,CAAA;IAEpB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAE5B;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAEhC;;OAEG;IACH,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,eAAe,CAAA;IACvB,MAAM,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAA;IACvC,MAAM,EAAE,MAAM,CAAA;IACd,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,SAAS,EAAE,SAAS,CAAA;IACpB,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,SAAS,EAAE,SAAS,CAAA;CACrB;AAgND,wBAAgB,eAAe,CAAE,IAAI,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,EAAE,yBAAyB,KAAK,OAAO,CAIxH"}
package/dist/src/index.js CHANGED
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * ```typescript
7
7
  * import { createLibp2p } from 'libp2p'
8
- * import { devtoolsMetrics } from '@libp2p/devtools-metrics'
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 SOURCE_APPLICATION = '@libp2p/devtools-metrics:node';
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
- events;
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.sendPeers = debounce(this.sendPeers.bind(this), 1000);
45
- this.sendSelfUpdate = this.sendSelfUpdate.bind(this);
46
- this.processIncomingMessage = this.processIncomingMessage.bind(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?.trackMultiaddrConnection(maConn);
61
+ this.simpleMetrics.trackMultiaddrConnection(maConn);
50
62
  }
51
63
  trackProtocolStream(stream, connection) {
52
- this.simpleMetrics?.trackProtocolStream(stream, connection);
64
+ this.simpleMetrics.trackProtocolStream(stream, connection);
53
65
  }
54
66
  registerMetric(name, options) {
55
- return this.simpleMetrics?.registerMetric(name, options);
67
+ return this.simpleMetrics.registerMetric(name, options);
56
68
  }
57
69
  registerMetricGroup(name, options) {
58
- return this.simpleMetrics?.registerMetricGroup(name, options);
70
+ return this.simpleMetrics.registerMetricGroup(name, options);
59
71
  }
60
72
  registerCounter(name, options) {
61
- return this.simpleMetrics?.registerCounter(name, options);
73
+ return this.simpleMetrics.registerCounter(name, options);
62
74
  }
63
75
  registerCounterGroup(name, options) {
64
- return this.simpleMetrics?.registerCounterGroup(name, options);
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.sendPeers);
69
- this.events.addEventListener('peer:disconnect', this.sendPeers);
70
- this.events.addEventListener('peer:identify', this.sendPeers);
71
- this.events.addEventListener('peer:update', this.sendPeers);
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.sendSelfUpdate);
85
+ this.components.events.addEventListener('self:peer:update', this.onSelfUpdate);
74
86
  // process incoming messages from devtools
75
- window.addEventListener('message', this.processIncomingMessage);
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.processIncomingMessage);
93
- this.events.removeEventListener('self:peer:update', this.sendSelfUpdate);
94
- this.events.removeEventListener('peer:connect', this.sendPeers);
95
- this.events.removeEventListener('peer:disconnect', this.sendPeers);
96
- this.events.removeEventListener('peer:identify', this.sendPeers);
97
- this.events.removeEventListener('peer:update', this.sendPeers);
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
- sendPeers() {
100
+ onPeersUpdate() {
101
101
  Promise.resolve().then(async () => {
102
102
  const message = {
103
- source: '@libp2p/devtools-metrics:node',
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
- peerId: peerId.toString(),
113
- addresses: conns.map(conn => conn.remoteAddr.toString()),
114
- multiaddrs: peer.addresses.map(({ isCertified, multiaddr }) => ({ isCertified, multiaddr: multiaddr.toString() })),
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
- peerId: peerId.toString(),
124
- addresses: conns.map(conn => conn.remoteAddr.toString()),
125
- multiaddrs: [],
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
- sendSelfUpdate(evt) {
139
- const message = {
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
- processIncomingMessage(event) {
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 !== '@libp2p/devtools-metrics:devtools') {
181
+ if (message?.source !== SOURCE_DEVTOOLS) {
157
182
  return;
158
183
  }
159
184
  // respond to identify request
160
185
  if (message.type === 'identify') {
161
- const message = {
162
- source: '@libp2p/devtools-metrics:node',
163
- type: 'self',
164
- peerId: this.peerId.toString(),
165
- multiaddrs: this.transportManager.getListeners().flatMap(listener => listener.getAddrs()).map(ma => ma.toString()),
166
- protocols: this.registrar.getProtocols()
167
- };
168
- window.postMessage(message, '*');
169
- // also send our current peer list
170
- this.sendPeers();
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') {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@libp2p/devtools-metrics",
3
- "version": "0.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": "^1.3.1",
50
- "@libp2p/interface-internal": "^1.2.1",
51
- "@libp2p/logger": "^4.0.12",
52
- "@libp2p/simple-metrics": "^1.0.1",
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": "^4.1.1",
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 { devtoolsMetrics } from '@libp2p/devtools-metrics'
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 SOURCE_APPLICATION = '@libp2p/devtools-metrics:node'
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: '@libp2p/devtools-metrics:node'
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: '@libp2p/devtools-metrics:node'
52
+ source: typeof SOURCE_METRICS
43
53
  type: 'self'
44
- peerId: string
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: '@libp2p/devtools-metrics:node'
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 BrowserMessage = MetricsMessage | SelfMessage | PeersMessage
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 events: TypedEventEmitter<Libp2pEvents>
137
- private readonly peerId: PeerId
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.sendPeers = debounce(this.sendPeers.bind(this), 1000)
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
- this.sendSelfUpdate = this.sendSelfUpdate.bind(this)
159
- this.processIncomingMessage = this.processIncomingMessage.bind(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?.trackMultiaddrConnection(maConn)
258
+ this.simpleMetrics.trackMultiaddrConnection(maConn)
164
259
  }
165
260
 
166
261
  trackProtocolStream (stream: Stream, connection: Connection): void {
167
- this.simpleMetrics?.trackProtocolStream(stream, connection)
262
+ this.simpleMetrics.trackProtocolStream(stream, connection)
168
263
  }
169
264
 
170
265
  registerMetric (name: any, options: any): any {
171
- return this.simpleMetrics?.registerMetric(name, options)
266
+ return this.simpleMetrics.registerMetric(name, options)
172
267
  }
173
268
 
174
269
  registerMetricGroup (name: any, options: any): any {
175
- return this.simpleMetrics?.registerMetricGroup(name, options)
270
+ return this.simpleMetrics.registerMetricGroup(name, options)
176
271
  }
177
272
 
178
273
  registerCounter (name: any, options: any): any {
179
- return this.simpleMetrics?.registerCounter(name, options)
274
+ return this.simpleMetrics.registerCounter(name, options)
180
275
  }
181
276
 
182
277
  registerCounterGroup (name: any, options: any): any {
183
- return this.simpleMetrics?.registerCounterGroup(name, options)
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.sendPeers)
189
- this.events.addEventListener('peer:disconnect', this.sendPeers)
190
- this.events.addEventListener('peer:identify', this.sendPeers)
191
- this.events.addEventListener('peer:update', this.sendPeers)
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.sendSelfUpdate)
289
+ this.components.events.addEventListener('self:peer:update', this.onSelfUpdate)
195
290
 
196
291
  // process incoming messages from devtools
197
- window.addEventListener('message', this.processIncomingMessage)
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.processIncomingMessage)
218
- this.events.removeEventListener('self:peer:update', this.sendSelfUpdate)
219
- this.events.removeEventListener('peer:connect', this.sendPeers)
220
- this.events.removeEventListener('peer:disconnect', this.sendPeers)
221
- this.events.removeEventListener('peer:identify', this.sendPeers)
222
- this.events.removeEventListener('peer:update', this.sendPeers)
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 sendPeers (): void {
308
+ private onPeersUpdate (): void {
227
309
  Promise.resolve().then(async () => {
228
310
  const message: PeersMessage = {
229
- source: '@libp2p/devtools-metrics:node',
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
- peerId: peerId.toString(),
242
- addresses: conns.map(conn => conn.remoteAddr.toString()),
243
- multiaddrs: peer.addresses.map(({ isCertified, multiaddr }) => ({ isCertified, multiaddr: multiaddr.toString() })),
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
- peerId: peerId.toString(),
253
- addresses: conns.map(conn => conn.remoteAddr.toString()),
254
- multiaddrs: [],
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 sendSelfUpdate (evt: CustomEvent<PeerUpdate>): void {
270
- const message: SelfMessage = {
271
- source: '@libp2p/devtools-metrics:node',
272
- type: 'self',
273
- peerId: evt.detail.peer.id.toString(),
274
- multiaddrs: evt.detail.peer.addresses.map(({ multiaddr }) => multiaddr.toString()),
275
- protocols: [...evt.detail.peer.protocols]
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
- this.log('post node update message')
279
- window.postMessage(message, '*')
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 processIncomingMessage (event: MessageEvent<DevToolsMessage>): void {
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 !== '@libp2p/devtools-metrics:devtools') {
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
- const message: SelfMessage = {
298
- source: '@libp2p/devtools-metrics:node',
299
- type: 'self',
300
- peerId: this.peerId.toString(),
301
- multiaddrs: this.transportManager.getListeners().flatMap(listener => listener.getAddrs()).map(ma => ma.toString()),
302
- protocols: this.registrar.getProtocols()
303
- }
304
-
305
- window.postMessage(message, '*')
306
-
307
- // also send our current peer list
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
@@ -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
- }