@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 +1 -1
- package/dist/src/index.d.ts +109 -39
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +99 -64
- package/dist/src/index.js.map +1 -1
- package/package.json +8 -7
- package/src/index.ts +228 -109
- package/dist/typedoc-urls.json +0 -28
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}));
|
package/dist/src/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* ```typescript
|
|
7
7
|
* import { createLibp2p } from 'libp2p'
|
|
8
|
-
* import {
|
|
8
|
+
* import { devToolsMetrics } from '@libp2p/devtools-metrics'
|
|
9
9
|
*
|
|
10
10
|
* const node = await createLibp2p({
|
|
11
11
|
* metrics: devToolsMetrics()
|
|
@@ -18,12 +18,15 @@
|
|
|
18
18
|
import type { ComponentLogger, Libp2pEvents, Metrics, PeerId, PeerStore, TypedEventEmitter } from '@libp2p/interface';
|
|
19
19
|
import type { TransportManager, Registrar, ConnectionManager } from '@libp2p/interface-internal';
|
|
20
20
|
export declare const SOURCE_DEVTOOLS = "@libp2p/devtools-metrics:devtools";
|
|
21
|
-
export declare const
|
|
21
|
+
export declare const SOURCE_SERVICE_WORKER = "@libp2p/devtools-metrics:worker";
|
|
22
|
+
export declare const SOURCE_CONTENT_SCRIPT = "@libp2p/devtools-metrics:content";
|
|
23
|
+
export declare const SOURCE_METRICS = "@libp2p/devtools-metrics:metrics";
|
|
24
|
+
export declare const LIBP2P_DEVTOOLS_METRICS_KEY = "________libp2p_devtools_metrics";
|
|
22
25
|
/**
|
|
23
26
|
* Sent when new metrics are available
|
|
24
27
|
*/
|
|
25
28
|
export interface MetricsMessage {
|
|
26
|
-
source:
|
|
29
|
+
source: typeof SOURCE_METRICS;
|
|
27
30
|
type: 'metrics';
|
|
28
31
|
metrics: Record<string, any>;
|
|
29
32
|
}
|
|
@@ -31,55 +34,46 @@ export interface MetricsMessage {
|
|
|
31
34
|
* This message represents the current state of the libp2p node
|
|
32
35
|
*/
|
|
33
36
|
export interface SelfMessage {
|
|
34
|
-
source:
|
|
37
|
+
source: typeof SOURCE_METRICS;
|
|
35
38
|
type: 'self';
|
|
36
|
-
|
|
37
|
-
multiaddrs: string[];
|
|
38
|
-
protocols: string[];
|
|
39
|
-
}
|
|
40
|
-
export interface Peer {
|
|
41
|
-
/**
|
|
42
|
-
* The identifier of the remote peer
|
|
43
|
-
*/
|
|
44
|
-
peerId: string;
|
|
45
|
-
/**
|
|
46
|
-
* The addresses we are connected to the peer via
|
|
47
|
-
*/
|
|
48
|
-
addresses: string[];
|
|
49
|
-
/**
|
|
50
|
-
* The complete list of addresses the peer has, if known
|
|
51
|
-
*/
|
|
52
|
-
multiaddrs: Array<{
|
|
53
|
-
isCertified?: boolean;
|
|
54
|
-
multiaddr: string;
|
|
55
|
-
}>;
|
|
56
|
-
/**
|
|
57
|
-
* Any peer store tags the peer has
|
|
58
|
-
*/
|
|
59
|
-
tags: Record<string, number>;
|
|
60
|
-
/**
|
|
61
|
-
* Any peer store tags the peer has
|
|
62
|
-
*/
|
|
63
|
-
metadata: Record<string, string>;
|
|
64
|
-
/**
|
|
65
|
-
* The protocols the peer supports, if known
|
|
66
|
-
*/
|
|
67
|
-
protocols: string[];
|
|
39
|
+
peer: SelfPeer;
|
|
68
40
|
}
|
|
69
41
|
/**
|
|
70
42
|
* This message represents the current state of the libp2p node
|
|
71
43
|
*/
|
|
72
44
|
export interface PeersMessage {
|
|
73
|
-
source:
|
|
45
|
+
source: typeof SOURCE_METRICS;
|
|
74
46
|
type: 'peers';
|
|
75
47
|
peers: Peer[];
|
|
76
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Sent by the DevTools service worker to the DevTools panel when the inspected
|
|
51
|
+
* page has finished (re)loading
|
|
52
|
+
*/
|
|
53
|
+
export interface PageLoadedMessage {
|
|
54
|
+
source: '@libp2p/devtools-metrics:devtools';
|
|
55
|
+
type: 'page-loaded';
|
|
56
|
+
tabId: number;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Sent by the DevTools service worker to the DevTools panel when it has failed
|
|
60
|
+
* to send a message to the inspected page as there is no receiving end present.
|
|
61
|
+
*
|
|
62
|
+
* This normally means the content script has not been loaded due to the user
|
|
63
|
+
* not having granted permission for the script to run.
|
|
64
|
+
*/
|
|
65
|
+
export interface PermissionsErrorMessage {
|
|
66
|
+
source: '@libp2p/devtools-metrics:devtools';
|
|
67
|
+
type: 'permissions-error';
|
|
68
|
+
tabId: number;
|
|
69
|
+
}
|
|
77
70
|
/**
|
|
78
71
|
* This message is sent by DevTools when no `self` message has been received
|
|
79
72
|
*/
|
|
80
73
|
export interface IdentifyMessage {
|
|
81
74
|
source: '@libp2p/devtools-metrics:devtools';
|
|
82
75
|
type: 'identify';
|
|
76
|
+
tabId: number;
|
|
83
77
|
}
|
|
84
78
|
/**
|
|
85
79
|
* This message is sent by DevTools when no `self` message has been received
|
|
@@ -88,15 +82,91 @@ export interface EnableDebugMessage {
|
|
|
88
82
|
source: '@libp2p/devtools-metrics:devtools';
|
|
89
83
|
type: 'debug';
|
|
90
84
|
namespace: string;
|
|
85
|
+
tabId: number;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* We cannot use the web extension API to copy text to the cliboard yet as it's
|
|
89
|
+
* not supported in Firefox yet, so get the page to do it
|
|
90
|
+
*
|
|
91
|
+
* @see https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Interact_with_the_clipboard#writing_to_the_clipboard
|
|
92
|
+
*/
|
|
93
|
+
export interface CopyToClipboardMessage {
|
|
94
|
+
source: '@libp2p/devtools-metrics:devtools';
|
|
95
|
+
type: 'copy-to-clipboard';
|
|
96
|
+
value: string;
|
|
97
|
+
tabId: number;
|
|
91
98
|
}
|
|
92
99
|
/**
|
|
93
100
|
* Messages that are sent from the application page to the DevTools panel
|
|
94
101
|
*/
|
|
95
|
-
export type
|
|
102
|
+
export type ApplicationMessage = MetricsMessage | SelfMessage | PeersMessage;
|
|
103
|
+
/**
|
|
104
|
+
* Messages that are sent from the service worker
|
|
105
|
+
*/
|
|
106
|
+
export type WorkerMessage = PageLoadedMessage | PermissionsErrorMessage;
|
|
96
107
|
/**
|
|
97
108
|
* Messages that are sent from the DevTools panel page to the application page
|
|
98
109
|
*/
|
|
99
|
-
export type DevToolsMessage = IdentifyMessage | EnableDebugMessage;
|
|
110
|
+
export type DevToolsMessage = IdentifyMessage | EnableDebugMessage | CopyToClipboardMessage;
|
|
111
|
+
export interface SelfPeer {
|
|
112
|
+
/**
|
|
113
|
+
* The identifier of the peer
|
|
114
|
+
*/
|
|
115
|
+
id: string;
|
|
116
|
+
/**
|
|
117
|
+
* The list of multiaddrs the peer is listening on
|
|
118
|
+
*/
|
|
119
|
+
multiaddrs: string[];
|
|
120
|
+
/**
|
|
121
|
+
* Any peer store tags the peer has
|
|
122
|
+
*/
|
|
123
|
+
tags: Record<string, number>;
|
|
124
|
+
/**
|
|
125
|
+
* Any peer store metadata the peer has
|
|
126
|
+
*/
|
|
127
|
+
metadata: Record<string, string>;
|
|
128
|
+
/**
|
|
129
|
+
* The protocols the peer supports
|
|
130
|
+
*/
|
|
131
|
+
protocols: string[];
|
|
132
|
+
}
|
|
133
|
+
export interface Address {
|
|
134
|
+
/**
|
|
135
|
+
* The multiaddr this address represents
|
|
136
|
+
*/
|
|
137
|
+
multiaddr: string;
|
|
138
|
+
/**
|
|
139
|
+
* If `true`, this multiaddr came from a signed peer record
|
|
140
|
+
*/
|
|
141
|
+
isCertified?: boolean;
|
|
142
|
+
/**
|
|
143
|
+
* If `true`, the current node has an active connection to this peer via this
|
|
144
|
+
* address
|
|
145
|
+
*/
|
|
146
|
+
isConnected?: boolean;
|
|
147
|
+
}
|
|
148
|
+
export interface Peer {
|
|
149
|
+
/**
|
|
150
|
+
* The identifier of the remote peer
|
|
151
|
+
*/
|
|
152
|
+
id: string;
|
|
153
|
+
/**
|
|
154
|
+
* The list of addresses the peer has that we know about
|
|
155
|
+
*/
|
|
156
|
+
addresses: Address[];
|
|
157
|
+
/**
|
|
158
|
+
* Any peer store tags the peer has
|
|
159
|
+
*/
|
|
160
|
+
tags: Record<string, number>;
|
|
161
|
+
/**
|
|
162
|
+
* Any peer store metadata the peer has
|
|
163
|
+
*/
|
|
164
|
+
metadata: Record<string, string>;
|
|
165
|
+
/**
|
|
166
|
+
* The protocols the peer supports, if known
|
|
167
|
+
*/
|
|
168
|
+
protocols: string[];
|
|
169
|
+
}
|
|
100
170
|
export interface DevToolsMetricsInit {
|
|
101
171
|
/**
|
|
102
172
|
* How often to pass metrics to the DevTools panel
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAc,YAAY,EAAU,OAAO,EAAuB,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* ```typescript
|
|
7
7
|
* import { createLibp2p } from 'libp2p'
|
|
8
|
-
* import {
|
|
8
|
+
* import { devToolsMetrics } from '@libp2p/devtools-metrics'
|
|
9
9
|
*
|
|
10
10
|
* const node = await createLibp2p({
|
|
11
11
|
* metrics: devToolsMetrics()
|
|
@@ -20,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
|
|
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.
|
|
35
|
-
this.
|
|
36
|
-
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
|
|
61
|
+
this.simpleMetrics.trackMultiaddrConnection(maConn);
|
|
40
62
|
}
|
|
41
63
|
trackProtocolStream(stream, connection) {
|
|
42
|
-
this.simpleMetrics
|
|
64
|
+
this.simpleMetrics.trackProtocolStream(stream, connection);
|
|
43
65
|
}
|
|
44
66
|
registerMetric(name, options) {
|
|
45
|
-
return this.simpleMetrics
|
|
67
|
+
return this.simpleMetrics.registerMetric(name, options);
|
|
46
68
|
}
|
|
47
69
|
registerMetricGroup(name, options) {
|
|
48
|
-
return this.simpleMetrics
|
|
70
|
+
return this.simpleMetrics.registerMetricGroup(name, options);
|
|
49
71
|
}
|
|
50
72
|
registerCounter(name, options) {
|
|
51
|
-
return this.simpleMetrics
|
|
73
|
+
return this.simpleMetrics.registerCounter(name, options);
|
|
52
74
|
}
|
|
53
75
|
registerCounterGroup(name, options) {
|
|
54
|
-
return this.simpleMetrics
|
|
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.
|
|
59
|
-
this.components.events.addEventListener('peer:disconnect', this.
|
|
60
|
-
this.components.events.addEventListener('peer:identify', this.
|
|
61
|
-
this.components.events.addEventListener('peer:update', this.
|
|
80
|
+
this.components.events.addEventListener('peer:connect', this.onPeersUpdate);
|
|
81
|
+
this.components.events.addEventListener('peer:disconnect', this.onPeersUpdate);
|
|
82
|
+
this.components.events.addEventListener('peer:identify', this.onPeersUpdate);
|
|
83
|
+
this.components.events.addEventListener('peer:update', this.onPeersUpdate);
|
|
62
84
|
// send node status updates
|
|
63
|
-
this.components.events.addEventListener('self:peer:update', this.
|
|
85
|
+
this.components.events.addEventListener('self:peer:update', this.onSelfUpdate);
|
|
64
86
|
// process incoming messages from devtools
|
|
65
|
-
window.addEventListener('message', this.
|
|
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.
|
|
83
|
-
this.components.events.removeEventListener('self:peer:update', this.
|
|
84
|
-
this.components.events.removeEventListener('peer:connect', this.
|
|
85
|
-
this.components.events.removeEventListener('peer:disconnect', this.
|
|
86
|
-
this.components.events.removeEventListener('peer:identify', this.
|
|
87
|
-
this.components.events.removeEventListener('peer:update', this.
|
|
92
|
+
window.removeEventListener('message', this.onIncomingMessage);
|
|
93
|
+
this.components.events.removeEventListener('self:peer:update', this.onSelfUpdate);
|
|
94
|
+
this.components.events.removeEventListener('peer:connect', this.onPeersUpdate);
|
|
95
|
+
this.components.events.removeEventListener('peer:disconnect', this.onPeersUpdate);
|
|
96
|
+
this.components.events.removeEventListener('peer:identify', this.onPeersUpdate);
|
|
97
|
+
this.components.events.removeEventListener('peer:update', this.onPeersUpdate);
|
|
88
98
|
await stop(this.simpleMetrics);
|
|
89
99
|
}
|
|
90
|
-
|
|
100
|
+
onPeersUpdate() {
|
|
91
101
|
Promise.resolve().then(async () => {
|
|
92
102
|
const message = {
|
|
93
|
-
source:
|
|
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
|
-
|
|
103
|
-
addresses:
|
|
104
|
-
|
|
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
|
-
|
|
114
|
-
addresses: conns.map(conn =>
|
|
115
|
-
|
|
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
|
-
|
|
129
|
-
|
|
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
|
-
|
|
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
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
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') {
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAIlD,MAAM,CAAC,MAAM,eAAe,GAAG,mCAAmC,CAAA;AAClE,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAIlD,MAAM,CAAC,MAAM,eAAe,GAAG,mCAAmC,CAAA;AAClE,MAAM,CAAC,MAAM,qBAAqB,GAAG,iCAAiC,CAAA;AACtE,MAAM,CAAC,MAAM,qBAAqB,GAAG,kCAAkC,CAAA;AACvE,MAAM,CAAC,MAAM,cAAc,GAAG,kCAAkC,CAAA;AAChE,MAAM,CAAC,MAAM,2BAA2B,GAAG,iCAAiC,CAAA;AAE5E,gCAAgC;AAChC,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,2BAA2B,EAAE;IAC7D,KAAK,EAAE,IAAI;IACX,UAAU,EAAE,KAAK;IACjB,QAAQ,EAAE,KAAK;CAChB,CAAC,CAAA;AA4LF,MAAM,eAAe;IACF,GAAG,CAAQ;IACX,UAAU,CAA2B;IACrC,aAAa,CAAS;IACtB,UAAU,CAAS;IAEpC,YAAa,UAAqC,EAAE,IAAmC;QACrF,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAA;QACpE,IAAI,CAAC,UAAU,GAAG,IAAI,EAAE,UAAU,CAAA;QAClC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAE5B,0EAA0E;QAC1E,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAA;QAClE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAE1D,kBAAkB;QAClB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;YACjC,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;gBACrB,MAAM,OAAO,GAAmB;oBAC9B,MAAM,EAAE,cAAc;oBACtB,IAAI,EAAE,SAAS;oBACf,OAAO;iBACR,CAAA;gBAED,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;gBAChC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;YAClC,CAAC;SACF,CAAC,CAAC,EAAE,CAAC,CAAA;IACR,CAAC;IAED,wBAAwB,CAAE,MAA2B;QACnD,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAA;IACrD,CAAC;IAED,mBAAmB,CAAE,MAAc,EAAE,UAAsB;QACzD,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAC5D,CAAC;IAED,cAAc,CAAE,IAAS,EAAE,OAAY;QACrC,OAAO,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACzD,CAAC;IAED,mBAAmB,CAAE,IAAS,EAAE,OAAY;QAC1C,OAAO,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC9D,CAAC;IAED,eAAe,CAAE,IAAS,EAAE,OAAY;QACtC,OAAO,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC1D,CAAC;IAED,oBAAoB,CAAE,IAAS,EAAE,OAAY;QAC3C,OAAO,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC/D,CAAC;IAED,KAAK,CAAC,KAAK;QACT,oBAAoB;QACpB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;QAC3E,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;QAC9E,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,eAAe,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;QAC5E,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;QAE1E,2BAA2B;QAC3B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;QAE9E,0CAA0C;QAC1C,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAA;QAE1D,eAAe;QACf,MAAM,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IACjC,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAA;QAC7D,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;QACjF,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,mBAAmB,CAAC,cAAc,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;QAC9E,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;QACjF,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,mBAAmB,CAAC,eAAe,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;QAC/E,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;QAC7E,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAChC,CAAC;IAEO,aAAa;QACnB,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YAChC,MAAM,OAAO,GAAiB;gBAC5B,MAAM,EAAE,cAAc;gBACtB,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE;aACV,CAAA;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,CAAA;YACzE,MAAM,kBAAkB,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAA;YAElH,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;gBACpD,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;oBAExD,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;wBACjB,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE;wBACrB,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,EAAE;4BAC3D,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAA;4BAEjC,OAAO;gCACL,SAAS,EAAE,IAAI;gCACf,WAAW;gCACX,WAAW,EAAE,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC;6BAC/C,CAAA;wBACH,CAAC,CAAC;wBACF,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;wBAC9B,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;wBACzC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;qBAC/D,CAAC,CAAA;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,0CAA0C,EAAE,GAAG,CAAC,CAAA;oBAE/D,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;wBACjB,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE;wBACrB,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;4BAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAA;4BAEvC,OAAO;gCACL,SAAS,EAAE,IAAI;gCACf,WAAW,EAAE,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC;6BAC/C,CAAA;wBACH,CAAC,CAAC;wBACF,SAAS,EAAE,EAAE;wBACb,IAAI,EAAE,EAAE;wBACR,QAAQ,EAAE,EAAE;qBACb,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;YAED,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAClC,CAAC,CAAC;aACC,KAAK,CAAC,GAAG,CAAC,EAAE;YACX,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAA;QACpD,CAAC,CAAC,CAAA;IACN,CAAC;IAEO,YAAY,CAAE,GAA4B;QAChD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACtC,CAAC;IAEO,cAAc,CAAE,IAAmB;QACzC,OAAO,CAAC,OAAO,EAAE;aACd,IAAI,CAAC,KAAK,IAAI,EAAE;YACf,MAAM,OAAO,GAAgB;gBAC3B,MAAM,EAAE,cAAc;gBACtB,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE;oBACJ,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE;oBACtB,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;oBACvE,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;oBAC9B,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;oBACzC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;iBAC/D;aACF,CAAA;YAED,IAAI,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;YACpC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAClC,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,CAAC,EAAE;YACX,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;IACN,CAAC;IAEO,iBAAiB,CAAE,KAAoC;QAC7D,uCAAuC;QACvC,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC5B,OAAM;QACR,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAA;QAE1B,wDAAwD;QACxD,IAAI,OAAO,EAAE,MAAM,KAAK,eAAe,EAAE,CAAC;YACxC,OAAM;QACR,CAAC;QAED,8BAA8B;QAC9B,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAChC,OAAO,CAAC,OAAO,EAAE;iBACd,IAAI,CAAC,KAAK,IAAI,EAAE;gBACf,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;gBAExE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;gBACzB,kCAAkC;gBAClC,IAAI,CAAC,aAAa,EAAE,CAAA;YACtB,CAAC,CAAC;iBACD,KAAK,CAAC,GAAG,CAAC,EAAE;gBACX,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAA;YACxD,CAAC,CAAC,CAAA;QACN,CAAC;QAED,6CAA6C;QAC7C,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC7B,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;YAC3B,CAAC;iBAAM,CAAC;gBACN,OAAO,EAAE,CAAA;YACX,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAE,IAAmC;IAClE,OAAO,CAAC,UAAU,EAAE,EAAE;QACpB,OAAO,IAAI,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;IAC9C,CAAC,CAAA;AACH,CAAC;AAED,SAAS,QAAQ,CAAS,GAAmB,EAAE,SAA0B;IACvE,MAAM,MAAM,GAAwB,EAAE,CAAA;IAEtC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAA;IAChC,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,QAAQ,CAAE,QAAoB,EAAE,OAAe,GAAG;IACzD,IAAI,OAAsC,CAAA;IAC1C,IAAI,KAAyB,CAAA;IAE7B,OAAO,GAAS,EAAE;QAChB,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACpB,CAAC;QAED,IAAI,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,IAAI,EAAE,CAAC;YACjD,YAAY,CAAC,OAAO,CAAC,CAAA;YACrB,KAAK,GAAG,SAAS,CAAA;YACjB,QAAQ,EAAE,CAAA;YACV,OAAM;QACR,CAAC;QAED,YAAY,CAAC,OAAO,CAAC,CAAA;QACrB,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YACxB,KAAK,GAAG,SAAS,CAAA;YACjB,QAAQ,EAAE,CAAA;QACZ,CAAC,EAAE,IAAI,CAAC,CAAA;IACV,CAAC,CAAA;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libp2p/devtools-metrics",
|
|
3
|
-
"version": "0.0
|
|
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": "
|
|
50
|
-
"@libp2p/interface-internal": "
|
|
51
|
-
"@libp2p/logger": "
|
|
52
|
-
"@libp2p/simple-metrics": "
|
|
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": "
|
|
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 {
|
|
8
|
+
* import { devToolsMetrics } from '@libp2p/devtools-metrics'
|
|
9
9
|
*
|
|
10
10
|
* const node = await createLibp2p({
|
|
11
11
|
* metrics: devToolsMetrics()
|
|
@@ -20,17 +20,27 @@ import { start, stop } from '@libp2p/interface'
|
|
|
20
20
|
import { enable, disable } from '@libp2p/logger'
|
|
21
21
|
import { simpleMetrics } from '@libp2p/simple-metrics'
|
|
22
22
|
import { base64 } from 'multiformats/bases/base64'
|
|
23
|
-
import type { ComponentLogger, Connection, Libp2pEvents, Logger, Metrics, MultiaddrConnection, PeerId, PeerStore, PeerUpdate, Stream, TypedEventEmitter } from '@libp2p/interface'
|
|
23
|
+
import type { ComponentLogger, Connection, Libp2pEvents, Logger, Metrics, MultiaddrConnection, PeerId, Peer as PeerStorePeer, PeerStore, PeerUpdate, Stream, TypedEventEmitter } from '@libp2p/interface'
|
|
24
24
|
import type { TransportManager, Registrar, ConnectionManager } from '@libp2p/interface-internal'
|
|
25
25
|
|
|
26
26
|
export const SOURCE_DEVTOOLS = '@libp2p/devtools-metrics:devtools'
|
|
27
|
-
export const
|
|
27
|
+
export const SOURCE_SERVICE_WORKER = '@libp2p/devtools-metrics:worker'
|
|
28
|
+
export const SOURCE_CONTENT_SCRIPT = '@libp2p/devtools-metrics:content'
|
|
29
|
+
export const SOURCE_METRICS = '@libp2p/devtools-metrics:metrics'
|
|
30
|
+
export const LIBP2P_DEVTOOLS_METRICS_KEY = '________libp2p_devtools_metrics'
|
|
31
|
+
|
|
32
|
+
// let devtools know we are here
|
|
33
|
+
Object.defineProperty(globalThis, LIBP2P_DEVTOOLS_METRICS_KEY, {
|
|
34
|
+
value: true,
|
|
35
|
+
enumerable: false,
|
|
36
|
+
writable: false
|
|
37
|
+
})
|
|
28
38
|
|
|
29
39
|
/**
|
|
30
40
|
* Sent when new metrics are available
|
|
31
41
|
*/
|
|
32
42
|
export interface MetricsMessage {
|
|
33
|
-
source:
|
|
43
|
+
source: typeof SOURCE_METRICS
|
|
34
44
|
type: 'metrics'
|
|
35
45
|
metrics: Record<string, any>
|
|
36
46
|
}
|
|
@@ -39,60 +49,50 @@ export interface MetricsMessage {
|
|
|
39
49
|
* This message represents the current state of the libp2p node
|
|
40
50
|
*/
|
|
41
51
|
export interface SelfMessage {
|
|
42
|
-
source:
|
|
52
|
+
source: typeof SOURCE_METRICS
|
|
43
53
|
type: 'self'
|
|
44
|
-
|
|
45
|
-
multiaddrs: string[]
|
|
46
|
-
protocols: string[]
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export interface Peer {
|
|
50
|
-
/**
|
|
51
|
-
* The identifier of the remote peer
|
|
52
|
-
*/
|
|
53
|
-
peerId: string
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* The addresses we are connected to the peer via
|
|
57
|
-
*/
|
|
58
|
-
addresses: string[]
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* The complete list of addresses the peer has, if known
|
|
62
|
-
*/
|
|
63
|
-
multiaddrs: Array<{ isCertified?: boolean, multiaddr: string }>
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Any peer store tags the peer has
|
|
67
|
-
*/
|
|
68
|
-
tags: Record<string, number>
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Any peer store tags the peer has
|
|
72
|
-
*/
|
|
73
|
-
metadata: Record<string, string>
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* The protocols the peer supports, if known
|
|
77
|
-
*/
|
|
78
|
-
protocols: string[]
|
|
54
|
+
peer: SelfPeer
|
|
79
55
|
}
|
|
80
56
|
|
|
81
57
|
/**
|
|
82
58
|
* This message represents the current state of the libp2p node
|
|
83
59
|
*/
|
|
84
60
|
export interface PeersMessage {
|
|
85
|
-
source:
|
|
61
|
+
source: typeof SOURCE_METRICS
|
|
86
62
|
type: 'peers'
|
|
87
63
|
peers: Peer[]
|
|
88
64
|
}
|
|
89
65
|
|
|
66
|
+
/**
|
|
67
|
+
* Sent by the DevTools service worker to the DevTools panel when the inspected
|
|
68
|
+
* page has finished (re)loading
|
|
69
|
+
*/
|
|
70
|
+
export interface PageLoadedMessage {
|
|
71
|
+
source: '@libp2p/devtools-metrics:devtools'
|
|
72
|
+
type: 'page-loaded'
|
|
73
|
+
tabId: number
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Sent by the DevTools service worker to the DevTools panel when it has failed
|
|
78
|
+
* to send a message to the inspected page as there is no receiving end present.
|
|
79
|
+
*
|
|
80
|
+
* This normally means the content script has not been loaded due to the user
|
|
81
|
+
* not having granted permission for the script to run.
|
|
82
|
+
*/
|
|
83
|
+
export interface PermissionsErrorMessage {
|
|
84
|
+
source: '@libp2p/devtools-metrics:devtools'
|
|
85
|
+
type: 'permissions-error'
|
|
86
|
+
tabId: number
|
|
87
|
+
}
|
|
88
|
+
|
|
90
89
|
/**
|
|
91
90
|
* This message is sent by DevTools when no `self` message has been received
|
|
92
91
|
*/
|
|
93
92
|
export interface IdentifyMessage {
|
|
94
93
|
source: '@libp2p/devtools-metrics:devtools'
|
|
95
94
|
type: 'identify'
|
|
95
|
+
tabId: number
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
/**
|
|
@@ -102,17 +102,108 @@ export interface EnableDebugMessage {
|
|
|
102
102
|
source: '@libp2p/devtools-metrics:devtools'
|
|
103
103
|
type: 'debug'
|
|
104
104
|
namespace: string
|
|
105
|
+
tabId: number
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* We cannot use the web extension API to copy text to the cliboard yet as it's
|
|
110
|
+
* not supported in Firefox yet, so get the page to do it
|
|
111
|
+
*
|
|
112
|
+
* @see https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Interact_with_the_clipboard#writing_to_the_clipboard
|
|
113
|
+
*/
|
|
114
|
+
export interface CopyToClipboardMessage {
|
|
115
|
+
source: '@libp2p/devtools-metrics:devtools'
|
|
116
|
+
type: 'copy-to-clipboard'
|
|
117
|
+
value: string
|
|
118
|
+
tabId: number
|
|
105
119
|
}
|
|
106
120
|
|
|
107
121
|
/**
|
|
108
122
|
* Messages that are sent from the application page to the DevTools panel
|
|
109
123
|
*/
|
|
110
|
-
export type
|
|
124
|
+
export type ApplicationMessage = MetricsMessage | SelfMessage | PeersMessage
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Messages that are sent from the service worker
|
|
128
|
+
*/
|
|
129
|
+
export type WorkerMessage = PageLoadedMessage | PermissionsErrorMessage
|
|
111
130
|
|
|
112
131
|
/**
|
|
113
132
|
* Messages that are sent from the DevTools panel page to the application page
|
|
114
133
|
*/
|
|
115
|
-
export type DevToolsMessage = IdentifyMessage | EnableDebugMessage
|
|
134
|
+
export type DevToolsMessage = IdentifyMessage | EnableDebugMessage | CopyToClipboardMessage
|
|
135
|
+
|
|
136
|
+
export interface SelfPeer {
|
|
137
|
+
/**
|
|
138
|
+
* The identifier of the peer
|
|
139
|
+
*/
|
|
140
|
+
id: string
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* The list of multiaddrs the peer is listening on
|
|
144
|
+
*/
|
|
145
|
+
multiaddrs: string[]
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Any peer store tags the peer has
|
|
149
|
+
*/
|
|
150
|
+
tags: Record<string, number>
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Any peer store metadata the peer has
|
|
154
|
+
*/
|
|
155
|
+
metadata: Record<string, string>
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* The protocols the peer supports
|
|
159
|
+
*/
|
|
160
|
+
protocols: string[]
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export interface Address {
|
|
164
|
+
/**
|
|
165
|
+
* The multiaddr this address represents
|
|
166
|
+
*/
|
|
167
|
+
multiaddr: string
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* If `true`, this multiaddr came from a signed peer record
|
|
171
|
+
*/
|
|
172
|
+
isCertified?: boolean
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* If `true`, the current node has an active connection to this peer via this
|
|
176
|
+
* address
|
|
177
|
+
*/
|
|
178
|
+
isConnected?: boolean
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export interface Peer {
|
|
182
|
+
/**
|
|
183
|
+
* The identifier of the remote peer
|
|
184
|
+
*/
|
|
185
|
+
id: string
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* The list of addresses the peer has that we know about
|
|
189
|
+
*/
|
|
190
|
+
addresses: Address[]
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Any peer store tags the peer has
|
|
194
|
+
*/
|
|
195
|
+
tags: Record<string, number>
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Any peer store metadata the peer has
|
|
199
|
+
*/
|
|
200
|
+
metadata: Record<string, string>
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* The protocols the peer supports, if known
|
|
204
|
+
*/
|
|
205
|
+
protocols: string[]
|
|
206
|
+
}
|
|
116
207
|
|
|
117
208
|
export interface DevToolsMetricsInit {
|
|
118
209
|
/**
|
|
@@ -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
|
|
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.
|
|
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
|
-
|
|
149
|
-
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
|
|
258
|
+
this.simpleMetrics.trackMultiaddrConnection(maConn)
|
|
154
259
|
}
|
|
155
260
|
|
|
156
261
|
trackProtocolStream (stream: Stream, connection: Connection): void {
|
|
157
|
-
this.simpleMetrics
|
|
262
|
+
this.simpleMetrics.trackProtocolStream(stream, connection)
|
|
158
263
|
}
|
|
159
264
|
|
|
160
265
|
registerMetric (name: any, options: any): any {
|
|
161
|
-
return this.simpleMetrics
|
|
266
|
+
return this.simpleMetrics.registerMetric(name, options)
|
|
162
267
|
}
|
|
163
268
|
|
|
164
269
|
registerMetricGroup (name: any, options: any): any {
|
|
165
|
-
return this.simpleMetrics
|
|
270
|
+
return this.simpleMetrics.registerMetricGroup(name, options)
|
|
166
271
|
}
|
|
167
272
|
|
|
168
273
|
registerCounter (name: any, options: any): any {
|
|
169
|
-
return this.simpleMetrics
|
|
274
|
+
return this.simpleMetrics.registerCounter(name, options)
|
|
170
275
|
}
|
|
171
276
|
|
|
172
277
|
registerCounterGroup (name: any, options: any): any {
|
|
173
|
-
return this.simpleMetrics
|
|
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.
|
|
179
|
-
this.components.events.addEventListener('peer:disconnect', this.
|
|
180
|
-
this.components.events.addEventListener('peer:identify', this.
|
|
181
|
-
this.components.events.addEventListener('peer:update', this.
|
|
283
|
+
this.components.events.addEventListener('peer:connect', this.onPeersUpdate)
|
|
284
|
+
this.components.events.addEventListener('peer:disconnect', this.onPeersUpdate)
|
|
285
|
+
this.components.events.addEventListener('peer:identify', this.onPeersUpdate)
|
|
286
|
+
this.components.events.addEventListener('peer:update', this.onPeersUpdate)
|
|
182
287
|
|
|
183
288
|
// send node status updates
|
|
184
|
-
this.components.events.addEventListener('self:peer:update', this.
|
|
289
|
+
this.components.events.addEventListener('self:peer:update', this.onSelfUpdate)
|
|
185
290
|
|
|
186
291
|
// process incoming messages from devtools
|
|
187
|
-
window.addEventListener('message', this.
|
|
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.
|
|
208
|
-
this.components.events.removeEventListener('self:peer:update', this.
|
|
209
|
-
this.components.events.removeEventListener('peer:connect', this.
|
|
210
|
-
this.components.events.removeEventListener('peer:disconnect', this.
|
|
211
|
-
this.components.events.removeEventListener('peer:identify', this.
|
|
212
|
-
this.components.events.removeEventListener('peer:update', this.
|
|
299
|
+
window.removeEventListener('message', this.onIncomingMessage)
|
|
300
|
+
this.components.events.removeEventListener('self:peer:update', this.onSelfUpdate)
|
|
301
|
+
this.components.events.removeEventListener('peer:connect', this.onPeersUpdate)
|
|
302
|
+
this.components.events.removeEventListener('peer:disconnect', this.onPeersUpdate)
|
|
303
|
+
this.components.events.removeEventListener('peer:identify', this.onPeersUpdate)
|
|
304
|
+
this.components.events.removeEventListener('peer:update', this.onPeersUpdate)
|
|
213
305
|
await stop(this.simpleMetrics)
|
|
214
306
|
}
|
|
215
307
|
|
|
216
|
-
private
|
|
308
|
+
private onPeersUpdate (): void {
|
|
217
309
|
Promise.resolve().then(async () => {
|
|
218
310
|
const message: PeersMessage = {
|
|
219
|
-
source:
|
|
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
|
-
|
|
232
|
-
addresses:
|
|
233
|
-
|
|
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
|
-
|
|
243
|
-
addresses: conns.map(conn =>
|
|
244
|
-
|
|
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
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
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
|
-
|
|
269
|
-
|
|
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
|
|
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
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
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
|
package/dist/typedoc-urls.json
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"DevToolsMetricsComponents": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.DevToolsMetricsComponents.html",
|
|
3
|
-
".:DevToolsMetricsComponents": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.DevToolsMetricsComponents.html",
|
|
4
|
-
"DevToolsMetricsInit": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.DevToolsMetricsInit.html",
|
|
5
|
-
".:DevToolsMetricsInit": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.DevToolsMetricsInit.html",
|
|
6
|
-
"EnableDebugMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.EnableDebugMessage.html",
|
|
7
|
-
".:EnableDebugMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.EnableDebugMessage.html",
|
|
8
|
-
"IdentifyMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.IdentifyMessage.html",
|
|
9
|
-
".:IdentifyMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.IdentifyMessage.html",
|
|
10
|
-
"MetricsMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.MetricsMessage.html",
|
|
11
|
-
".:MetricsMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.MetricsMessage.html",
|
|
12
|
-
"Peer": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.Peer.html",
|
|
13
|
-
".:Peer": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.Peer.html",
|
|
14
|
-
"PeersMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.PeersMessage.html",
|
|
15
|
-
".:PeersMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.PeersMessage.html",
|
|
16
|
-
"SelfMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.SelfMessage.html",
|
|
17
|
-
".:SelfMessage": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_devtools_metrics.SelfMessage.html",
|
|
18
|
-
"BrowserMessage": "https://libp2p.github.io/js-libp2p/types/_libp2p_devtools_metrics.BrowserMessage.html",
|
|
19
|
-
".:BrowserMessage": "https://libp2p.github.io/js-libp2p/types/_libp2p_devtools_metrics.BrowserMessage.html",
|
|
20
|
-
"DevToolsMessage": "https://libp2p.github.io/js-libp2p/types/_libp2p_devtools_metrics.DevToolsMessage.html",
|
|
21
|
-
".:DevToolsMessage": "https://libp2p.github.io/js-libp2p/types/_libp2p_devtools_metrics.DevToolsMessage.html",
|
|
22
|
-
"SOURCE_APPLICATION": "https://libp2p.github.io/js-libp2p/variables/_libp2p_devtools_metrics.SOURCE_APPLICATION.html",
|
|
23
|
-
".:SOURCE_APPLICATION": "https://libp2p.github.io/js-libp2p/variables/_libp2p_devtools_metrics.SOURCE_APPLICATION.html",
|
|
24
|
-
"SOURCE_DEVTOOLS": "https://libp2p.github.io/js-libp2p/variables/_libp2p_devtools_metrics.SOURCE_DEVTOOLS.html",
|
|
25
|
-
".:SOURCE_DEVTOOLS": "https://libp2p.github.io/js-libp2p/variables/_libp2p_devtools_metrics.SOURCE_DEVTOOLS.html",
|
|
26
|
-
"devToolsMetrics": "https://libp2p.github.io/js-libp2p/functions/_libp2p_devtools_metrics.devToolsMetrics.html",
|
|
27
|
-
".:devToolsMetrics": "https://libp2p.github.io/js-libp2p/functions/_libp2p_devtools_metrics.devToolsMetrics.html"
|
|
28
|
-
}
|