@libp2p/devtools-metrics 0.0.1 → 0.1.0-169c9d85e

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.min.js 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 Ce=Object.create;var j=Object.defineProperty;var we=Object.getOwnPropertyDescriptor;var ye=Object.getOwnPropertyNames;var ve=Object.getPrototypeOf,xe=Object.prototype.hasOwnProperty;var T=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),Fe=(r,e)=>{for(var t in e)j(r,t,{get:e[t],enumerable:!0})},K=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of ye(e))!xe.call(r,s)&&s!==t&&j(r,s,{get:()=>e[s],enumerable:!(n=we(e,s))||n.enumerable});return r};var Me=(r,e,t)=>(t=r!=null?Ce(ve(r)):{},K(e||!r||!r.__esModule?j(t,"default",{value:r,enumerable:!0}):t,r)),Se=r=>K(j({},"__esModule",{value:!0}),r);var ee=T((He,H)=>{var U=1e3,I=U*60,L=I*60,A=L*24,Ee=A*7,Ae=A*365.25;H.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?Ue(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*Ee;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 ke(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 Ue(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 re=T((et,te)=>{function Ie(r){t.debug=t,t.default=t,t.coerce=d,t.disable=a,t.enable=s,t.enabled=c,t.humanize=ee(),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 f(...h){if(!f.enabled)return;let m=f,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,y)=>{if(F==="%%")return"%";g++;let M=t.formatters[y];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 f.namespace=o,f.useColors=t.useColors(),f.color=t.selectColor(o),f.extend=n,f.destroy=t.destroy,Object.defineProperty(f,"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(f),f}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 d(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}te.exports=Ie});var ne=T((v,D)=>{v.formatArgs=Oe;v.save=Ne;v.load=je;v.useColors=Le;v.storage=ze();v.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`."))}})();v.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function Le(){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 Oe(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)}v.log=console.debug||console.log||(()=>{});function Ne(r){try{r?v.storage.setItem("debug",r):v.storage.removeItem("debug")}catch{}}function je(){let r;try{r=v.storage.getItem("debug")}catch{}return!r&&typeof process<"u"&&"env"in process&&(r=process.env.DEBUG),r}function ze(){try{return localStorage}catch{}}D.exports=re()(v);var{formatters:De}=D.exports;De.j=function(r){try{return JSON.stringify(r)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}});var Qe={};Fe(Qe,{SOURCE_APPLICATION:()=>$,SOURCE_DEVTOOLS:()=>be,devToolsMetrics:()=>Ze});function Q(r){return r!=null&&typeof r.start=="function"&&typeof r.stop=="function"}async function W(...r){let e=[];for(let t of r)Q(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 Y(...r){let e=[];for(let t of r)Q(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(ne(),1);var tt=new Uint8Array(0);function se(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 _e(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,d=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 f=0,h=0,m=0,b=l.length;m!==b&&l[m]===0;)m++,f++;for(var x=(b-m)*o+1>>>0,g=new Uint8Array(x);m!==b;){for(var E=l[m],F=0,y=x-1;(E!==0||F<h)&&y!==-1;y--,F++)E+=256*g[y]>>>0,g[y]=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=d.repeat(f);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 f=0;if(l[f]!==" "){for(var h=0,m=0;l[f]===d;)h++,f++;for(var b=(l.length-f)*S+1>>>0,x=new Uint8Array(b);l[f];){var g=t[l.charCodeAt(f)];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,f++}if(l[f]!==" "){for(var y=b-m;y!==b&&x[y]===0;)y++;for(var M=new Uint8Array(h+(b-y)),k=h;y!==b;)M[k++]=x[y++];return M}}}function P(l){var f=p(l);if(f)return f;throw new Error(`Non-${e} character`)}return{encode:i,decodeUnsafe:p,decode:P}}var $e=_e,Te=$e,oe=Te;var q=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")}},R=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 ie(this,e)}},V=class{decoders;constructor(e){this.decoders=e}or(e){return ie(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 ie(r,e){return new V({...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 q(e,t,n),this.decoder=new R(e,t,s)}encode(e){return this.encoder.encode(e)}decode(e){return this.decoder.decode(e)}};function ae({name:r,prefix:e,encode:t,decode:n}){return new G(r,e,t,n)}function B({name:r,prefix:e,alphabet:t}){let{encode:n,decode:s}=oe(t,r);return ae({prefix:e,name:r,encode:n,decode:a=>se(s(a))})}function qe(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,d=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`);d=d<<t|i,u+=t,u>=8&&(u-=8,c[S++]=255&d>>u)}if(u>=t||255&d<<8-u)throw new SyntaxError("Unexpected end of data");return c}function Re(r,e,t){let n=e[e.length-1]==="=",s=(1<<t)-1,a="",c=0,u=0;for(let d=0;d<r.length;++d)for(u=u<<8|r[d],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 ae({prefix:e,name:r,encode(s){return Re(s,n,t)},decode(s){return qe(s,n,t,r)}})}var ce=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}),ft=C({prefix:"v",name:"base32hex",alphabet:"0123456789abcdefghijklmnopqrstuv",bitsPerChar:5}),dt=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 le=B({name:"base58btc",prefix:"z",alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"}),Ct=B({name:"base58flickr",prefix:"Z",alphabet:"123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"});var _=C({prefix:"m",name:"base64",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",bitsPerChar:6}),vt=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":le.baseEncode(r);w.default.formatters.t=r=>r==null?"undefined":ce.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 Ve(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 ue(r){let e=Ve(`${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 de(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 pe=Ge;function Be(r){return r[Symbol.asyncIterator]!=null}function he(r){return r?.then!=null}function Je(r,e){let t=0;if(Be(r))return async function*(){for await(let d of r){let S=e(d,t++);he(S)&&await S,yield d}}();let n=pe(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 d of n){let S=e(d,t++);he(S)&&await S,yield d}}();let u=e;return function*(){yield s;for(let d of n)u(d,t++),yield d}()}var J=Je;var Xe=ue("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}}},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 O?e[t]=n.value:n instanceof N?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(u){await s(J(u,d=>{n._incrementValue(`${t} sent`,d.byteLength)}))};let a=e.source;e.source=J(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 me(r){return e=>new X(e,r)}var be="@libp2p/devtools-metrics:devtools",$="@libp2p/devtools-metrics:node",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.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.components.events.addEventListener("peer:connect",this.sendPeers),this.components.events.addEventListener("peer:disconnect",this.sendPeers),this.components.events.addEventListener("peer:identify",this.sendPeers),this.components.events.addEventListener("peer:update",this.sendPeers),this.components.events.addEventListener("self:peer:update",this.sendSelfUpdate),window.addEventListener("message",this.processIncomingMessage),this.simpleMetrics=me({intervalMs:this.intervalMs,onMetrics:e=>{let t={source:$,type:"metrics",metrics:e};this.log("post metrics message"),window.postMessage(t,"*")}})({}),await W(this.simpleMetrics)}async stop(){window.removeEventListener("message",this.processIncomingMessage),this.components.events.removeEventListener("self:peer:update",this.sendSelfUpdate),this.components.events.removeEventListener("peer:connect",this.sendPeers),this.components.events.removeEventListener("peer:disconnect",this.sendPeers),this.components.events.removeEventListener("peer:identify",this.sendPeers),this.components.events.removeEventListener("peer:update",this.sendPeers),await Y(this.simpleMetrics)}sendPeers(){Promise.resolve().then(async()=>{let e={source:"@libp2p/devtools-metrics:node",type:"peers",peers:[]},t=this.components.connectionManager.getConnectionsMap();for(let[n,s]of t.entries())try{let a=await this.components.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:ge(a.tags,c=>c.value),metadata:ge(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:$,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===be){if(t.type==="identify"){let n={source:$,type:"self",peerId:this.components.peerId.toString(),multiaddrs:this.components.transportManager.getListeners().flatMap(s=>s.getAddrs()).map(s=>s.toString()),protocols:this.components.registrar.getProtocols()};window.postMessage(n,"*"),this.sendPeers()}t.type==="debug"&&(t.namespace.length>0?de(t.namespace):fe())}}};function Ze(r){return e=>new Z(e,r)}function ge(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 Se(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;AAoLD,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":"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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 { 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,7 +20,16 @@ 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
35
  components;
@@ -31,77 +40,85 @@ class DevToolsMetrics {
31
40
  this.intervalMs = init?.intervalMs;
32
41
  this.components = components;
33
42
  // collect information on current peers and sent it to the dev tools panel
34
- this.sendPeers = debounce(this.sendPeers.bind(this), 1000);
35
- this.sendSelfUpdate = this.sendSelfUpdate.bind(this);
36
- 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
+ })({});
37
59
  }
38
60
  trackMultiaddrConnection(maConn) {
39
- this.simpleMetrics?.trackMultiaddrConnection(maConn);
61
+ this.simpleMetrics.trackMultiaddrConnection(maConn);
40
62
  }
41
63
  trackProtocolStream(stream, connection) {
42
- this.simpleMetrics?.trackProtocolStream(stream, connection);
64
+ this.simpleMetrics.trackProtocolStream(stream, connection);
43
65
  }
44
66
  registerMetric(name, options) {
45
- return this.simpleMetrics?.registerMetric(name, options);
67
+ return this.simpleMetrics.registerMetric(name, options);
46
68
  }
47
69
  registerMetricGroup(name, options) {
48
- return this.simpleMetrics?.registerMetricGroup(name, options);
70
+ return this.simpleMetrics.registerMetricGroup(name, options);
49
71
  }
50
72
  registerCounter(name, options) {
51
- return this.simpleMetrics?.registerCounter(name, options);
73
+ return this.simpleMetrics.registerCounter(name, options);
52
74
  }
53
75
  registerCounterGroup(name, options) {
54
- return this.simpleMetrics?.registerCounterGroup(name, options);
76
+ return this.simpleMetrics.registerCounterGroup(name, options);
55
77
  }
56
78
  async start() {
57
79
  // send peer updates
58
- this.components.events.addEventListener('peer:connect', this.sendPeers);
59
- this.components.events.addEventListener('peer:disconnect', this.sendPeers);
60
- this.components.events.addEventListener('peer:identify', this.sendPeers);
61
- this.components.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);
62
84
  // send node status updates
63
- this.components.events.addEventListener('self:peer:update', this.sendSelfUpdate);
85
+ this.components.events.addEventListener('self:peer:update', this.onSelfUpdate);
64
86
  // process incoming messages from devtools
65
- window.addEventListener('message', this.processIncomingMessage);
87
+ window.addEventListener('message', this.onIncomingMessage);
66
88
  // send metrics
67
- this.simpleMetrics = simpleMetrics({
68
- intervalMs: this.intervalMs,
69
- onMetrics: (metrics) => {
70
- const message = {
71
- source: SOURCE_APPLICATION,
72
- type: 'metrics',
73
- metrics
74
- };
75
- this.log('post metrics message');
76
- window.postMessage(message, '*');
77
- }
78
- })({});
79
89
  await start(this.simpleMetrics);
80
90
  }
81
91
  async stop() {
82
- window.removeEventListener('message', this.processIncomingMessage);
83
- this.components.events.removeEventListener('self:peer:update', this.sendSelfUpdate);
84
- this.components.events.removeEventListener('peer:connect', this.sendPeers);
85
- this.components.events.removeEventListener('peer:disconnect', this.sendPeers);
86
- this.components.events.removeEventListener('peer:identify', this.sendPeers);
87
- this.components.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);
88
98
  await stop(this.simpleMetrics);
89
99
  }
90
- sendPeers() {
100
+ onPeersUpdate() {
91
101
  Promise.resolve().then(async () => {
92
102
  const message = {
93
- source: '@libp2p/devtools-metrics:node',
103
+ source: SOURCE_METRICS,
94
104
  type: 'peers',
95
105
  peers: []
96
106
  };
97
107
  const connections = this.components.connectionManager.getConnectionsMap();
108
+ const connectedAddresses = [...connections.values()].flatMap(conn => conn).map(conn => conn.remoteAddr.toString());
98
109
  for (const [peerId, conns] of connections.entries()) {
99
110
  try {
100
111
  const peer = await this.components.peerStore.get(peerId);
101
112
  message.peers.push({
102
- peerId: peerId.toString(),
103
- addresses: conns.map(conn => conn.remoteAddr.toString()),
104
- 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
+ }),
105
122
  protocols: [...peer.protocols],
106
123
  tags: toObject(peer.tags, (t) => t.value),
107
124
  metadata: toObject(peer.metadata, (buf) => base64.encode(buf))
@@ -110,9 +127,14 @@ class DevToolsMetrics {
110
127
  catch (err) {
111
128
  this.log.error('could not load peer data from peer store', err);
112
129
  message.peers.push({
113
- peerId: peerId.toString(),
114
- addresses: conns.map(conn => conn.remoteAddr.toString()),
115
- 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
+ }),
116
138
  protocols: [],
117
139
  tags: {},
118
140
  metadata: {}
@@ -125,18 +147,31 @@ class DevToolsMetrics {
125
147
  this.log.error('error sending peers message', err);
126
148
  });
127
149
  }
128
- sendSelfUpdate(evt) {
129
- const message = {
130
- source: SOURCE_APPLICATION,
131
- type: 'self',
132
- peerId: evt.detail.peer.id.toString(),
133
- multiaddrs: evt.detail.peer.addresses.map(({ multiaddr }) => multiaddr.toString()),
134
- protocols: [...evt.detail.peer.protocols]
135
- };
136
- this.log('post node update message');
137
- window.postMessage(message, '*');
150
+ onSelfUpdate(evt) {
151
+ this.sendSelfUpdate(evt.detail.peer);
138
152
  }
139
- 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) {
140
175
  // Only accept messages from same frame
141
176
  if (event.source !== window) {
142
177
  return;
@@ -148,16 +183,16 @@ class DevToolsMetrics {
148
183
  }
149
184
  // respond to identify request
150
185
  if (message.type === 'identify') {
151
- const message = {
152
- source: SOURCE_APPLICATION,
153
- type: 'self',
154
- peerId: this.components.peerId.toString(),
155
- multiaddrs: this.components.transportManager.getListeners().flatMap(listener => listener.getAddrs()).map(ma => ma.toString()),
156
- protocols: this.components.registrar.getProtocols()
157
- };
158
- window.postMessage(message, '*');
159
- // also send our current peer list
160
- 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
+ });
161
196
  }
162
197
  // handle enabling/disabling debug namespaces
163
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.1",
3
+ "version": "0.1.0-169c9d85e",
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-169c9d85e",
51
+ "@libp2p/interface-internal": "1.2.2-169c9d85e",
52
+ "@libp2p/logger": "4.0.13-169c9d85e",
53
+ "@libp2p/simple-metrics": "1.0.2-169c9d85e",
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-169c9d85e",
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
  /**
@@ -134,7 +225,7 @@ export interface DevToolsMetricsComponents {
134
225
  class DevToolsMetrics implements Metrics {
135
226
  private readonly log: Logger
136
227
  private readonly components: DevToolsMetricsComponents
137
- private simpleMetrics?: Metrics
228
+ private readonly simpleMetrics: Metrics
138
229
  private readonly intervalMs?: number
139
230
 
140
231
  constructor (components: DevToolsMetricsComponents, init?: Partial<DevToolsMetricsInit>) {
@@ -143,94 +234,103 @@ class DevToolsMetrics implements Metrics {
143
234
  this.components = components
144
235
 
145
236
  // collect information on current peers and sent it to the dev tools panel
146
- 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)
147
240
 
148
- this.sendSelfUpdate = this.sendSelfUpdate.bind(this)
149
- 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
+ })({})
150
255
  }
151
256
 
152
257
  trackMultiaddrConnection (maConn: MultiaddrConnection): void {
153
- this.simpleMetrics?.trackMultiaddrConnection(maConn)
258
+ this.simpleMetrics.trackMultiaddrConnection(maConn)
154
259
  }
155
260
 
156
261
  trackProtocolStream (stream: Stream, connection: Connection): void {
157
- this.simpleMetrics?.trackProtocolStream(stream, connection)
262
+ this.simpleMetrics.trackProtocolStream(stream, connection)
158
263
  }
159
264
 
160
265
  registerMetric (name: any, options: any): any {
161
- return this.simpleMetrics?.registerMetric(name, options)
266
+ return this.simpleMetrics.registerMetric(name, options)
162
267
  }
163
268
 
164
269
  registerMetricGroup (name: any, options: any): any {
165
- return this.simpleMetrics?.registerMetricGroup(name, options)
270
+ return this.simpleMetrics.registerMetricGroup(name, options)
166
271
  }
167
272
 
168
273
  registerCounter (name: any, options: any): any {
169
- return this.simpleMetrics?.registerCounter(name, options)
274
+ return this.simpleMetrics.registerCounter(name, options)
170
275
  }
171
276
 
172
277
  registerCounterGroup (name: any, options: any): any {
173
- return this.simpleMetrics?.registerCounterGroup(name, options)
278
+ return this.simpleMetrics.registerCounterGroup(name, options)
174
279
  }
175
280
 
176
281
  async start (): Promise<void> {
177
282
  // send peer updates
178
- this.components.events.addEventListener('peer:connect', this.sendPeers)
179
- this.components.events.addEventListener('peer:disconnect', this.sendPeers)
180
- this.components.events.addEventListener('peer:identify', this.sendPeers)
181
- this.components.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)
182
287
 
183
288
  // send node status updates
184
- this.components.events.addEventListener('self:peer:update', this.sendSelfUpdate)
289
+ this.components.events.addEventListener('self:peer:update', this.onSelfUpdate)
185
290
 
186
291
  // process incoming messages from devtools
187
- window.addEventListener('message', this.processIncomingMessage)
292
+ window.addEventListener('message', this.onIncomingMessage)
188
293
 
189
294
  // send metrics
190
- this.simpleMetrics = simpleMetrics({
191
- intervalMs: this.intervalMs,
192
- onMetrics: (metrics) => {
193
- const message: MetricsMessage = {
194
- source: SOURCE_APPLICATION,
195
- type: 'metrics',
196
- metrics
197
- }
198
-
199
- this.log('post metrics message')
200
- window.postMessage(message, '*')
201
- }
202
- })({})
203
295
  await start(this.simpleMetrics)
204
296
  }
205
297
 
206
298
  async stop (): Promise<void> {
207
- window.removeEventListener('message', this.processIncomingMessage)
208
- this.components.events.removeEventListener('self:peer:update', this.sendSelfUpdate)
209
- this.components.events.removeEventListener('peer:connect', this.sendPeers)
210
- this.components.events.removeEventListener('peer:disconnect', this.sendPeers)
211
- this.components.events.removeEventListener('peer:identify', this.sendPeers)
212
- this.components.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)
213
305
  await stop(this.simpleMetrics)
214
306
  }
215
307
 
216
- private sendPeers (): void {
308
+ private onPeersUpdate (): void {
217
309
  Promise.resolve().then(async () => {
218
310
  const message: PeersMessage = {
219
- source: '@libp2p/devtools-metrics:node',
311
+ source: SOURCE_METRICS,
220
312
  type: 'peers',
221
313
  peers: []
222
314
  }
223
315
 
224
316
  const connections = this.components.connectionManager.getConnectionsMap()
317
+ const connectedAddresses = [...connections.values()].flatMap(conn => conn).map(conn => conn.remoteAddr.toString())
225
318
 
226
319
  for (const [peerId, conns] of connections.entries()) {
227
320
  try {
228
321
  const peer = await this.components.peerStore.get(peerId)
229
322
 
230
323
  message.peers.push({
231
- peerId: peerId.toString(),
232
- addresses: conns.map(conn => conn.remoteAddr.toString()),
233
- 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
+ }),
234
334
  protocols: [...peer.protocols],
235
335
  tags: toObject(peer.tags, (t) => t.value),
236
336
  metadata: toObject(peer.metadata, (buf) => base64.encode(buf))
@@ -239,9 +339,15 @@ class DevToolsMetrics implements Metrics {
239
339
  this.log.error('could not load peer data from peer store', err)
240
340
 
241
341
  message.peers.push({
242
- peerId: peerId.toString(),
243
- addresses: conns.map(conn => conn.remoteAddr.toString()),
244
- 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
+ }),
245
351
  protocols: [],
246
352
  tags: {},
247
353
  metadata: {}
@@ -256,20 +362,34 @@ class DevToolsMetrics implements Metrics {
256
362
  })
257
363
  }
258
364
 
259
- private sendSelfUpdate (evt: CustomEvent<PeerUpdate>): void {
260
- const message: SelfMessage = {
261
- source: SOURCE_APPLICATION,
262
- type: 'self',
263
- peerId: evt.detail.peer.id.toString(),
264
- multiaddrs: evt.detail.peer.addresses.map(({ multiaddr }) => multiaddr.toString()),
265
- protocols: [...evt.detail.peer.protocols]
266
- }
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
+ }
267
383
 
268
- this.log('post node update message')
269
- 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
+ })
270
390
  }
271
391
 
272
- private processIncomingMessage (event: MessageEvent<DevToolsMessage>): void {
392
+ private onIncomingMessage (event: MessageEvent<DevToolsMessage>): void {
273
393
  // Only accept messages from same frame
274
394
  if (event.source !== window) {
275
395
  return
@@ -284,18 +404,17 @@ class DevToolsMetrics implements Metrics {
284
404
 
285
405
  // respond to identify request
286
406
  if (message.type === 'identify') {
287
- const message: SelfMessage = {
288
- source: SOURCE_APPLICATION,
289
- type: 'self',
290
- peerId: this.components.peerId.toString(),
291
- multiaddrs: this.components.transportManager.getListeners().flatMap(listener => listener.getAddrs()).map(ma => ma.toString()),
292
- protocols: this.components.registrar.getProtocols()
293
- }
294
-
295
- window.postMessage(message, '*')
296
-
297
- // also send our current peer list
298
- 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
+ })
299
418
  }
300
419
 
301
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
- }