@helia/dnslink 2.0.1 → 2.0.2-aea1416d

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.min.js CHANGED
@@ -1,4 +1,4 @@
1
1
  (function (root, factory) {(typeof module === 'object' && module.exports) ? module.exports = factory() : root.HeliaDnslink = factory()}(typeof self !== 'undefined' ? self : this, function () {
2
- "use strict";var HeliaDnslink=(()=>{var Ke=Object.create;var j=Object.defineProperty;var Ze=Object.getOwnPropertyDescriptor;var et=Object.getOwnPropertyNames;var tt=Object.getPrototypeOf,rt=Object.prototype.hasOwnProperty;var nt=(r,e)=>()=>{try{return e||r((e={exports:{}}).exports,e),e.exports}catch(t){throw e=0,t}},p=(r,e)=>{for(var t in e)j(r,t,{get:e[t],enumerable:!0})},ve=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of et(e))!rt.call(r,s)&&s!==t&&j(r,s,{get:()=>e[s],enumerable:!(n=Ze(e,s))||n.enumerable});return r};var st=(r,e,t)=>(t=r!=null?Ke(tt(r)):{},ve(e||!r||!r.__esModule?j(t,"default",{value:r,enumerable:!0}):t,r)),ot=r=>ve(j({},"__esModule",{value:!0}),r);var Je=nt((zn,He)=>{He.exports=function(r){if(!r)throw Error("hashlru must have a max value, of type number, greater than 0");var e=0,t=Object.create(null),n=Object.create(null);function s(o,i){t[o]=i,e++,e>=r&&(e=0,n=t,t=Object.create(null))}return{has:function(o){return t[o]!==void 0||n[o]!==void 0},remove:function(o){t[o]!==void 0&&(t[o]=void 0),n[o]!==void 0&&(n[o]=void 0)},get:function(o){var i=t[o];if(i!==void 0)return i;if((i=n[o])!==void 0)return s(o,i),i},set:function(o,i){t[o]!==void 0?t[o]=i:s(o,i)},clear:function(){t=Object.create(null),n=Object.create(null)}}}});var yr={};p(yr,{dnsLink:()=>br});var re={};p(re,{base10:()=>lt});var Dr=new Uint8Array(0);function Ee(r,e){if(r===e)return!0;if(r.byteLength!==e.byteLength)return!1;for(let t=0;t<r.byteLength;t++)if(r[t]!==e[t])return!1;return!0}function g(r){if(r instanceof Uint8Array&&r.constructor.name==="Uint8Array")return L(r);if(r instanceof ArrayBuffer)return new Uint8Array(r);if(ArrayBuffer.isView(r))return L(new Uint8Array(r.buffer,r.byteOffset,r.byteLength));throw new Error("Unknown type, must be binary type")}function Ce(r){let e=new Uint8Array(r.length);for(let t=0;t<r.length;t++)e[t]=r.charCodeAt(t);return e}var Ae=4096;function Se(r){let e=r.length;if(e<=Ae)return String.fromCharCode.apply(String,r);let t="",n=0;for(;n<e;)t+=String.fromCharCode.apply(String,r.subarray(n,n+=Ae));return t}function it(r){return r?.buffer instanceof ArrayBuffer}function L(r){return it(r)?r:r.slice()}function at(r,e,t){if(r.length>=255)throw new TypeError("Alphabet too long");for(var n=new Uint8Array(256),s=0;s<n.length;s++)n[s]=255;for(var o=0;o<r.length;o++){var i=r.charAt(o),c=i.charCodeAt(0);if(n[c]!==255)throw new TypeError(i+" is ambiguous");if(n[c]=o,t){var d=i.toLowerCase().charCodeAt(0),f=i.toUpperCase().charCodeAt(0);d!==c&&(n[d]=o),f!==c&&(n[f]=o)}}var a=r.length,S=r.charAt(0),B=Math.log(a)/Math.log(256),F=Math.log(256)/Math.log(a);function H(h){if(h instanceof Uint8Array||(ArrayBuffer.isView(h)?h=new Uint8Array(h.buffer,h.byteOffset,h.byteLength):Array.isArray(h)&&(h=Uint8Array.from(h))),!(h instanceof Uint8Array))throw new TypeError("Expected Uint8Array");if(h.length===0)return"";for(var l=0,I=0,x=0,b=h.length;x!==b&&h[x]===0;)x++,l++;for(var y=(b-x)*F+1>>>0,m=new Uint8Array(y);x!==b;){for(var v=h[x],D=0,w=y-1;(v!==0||D<I)&&w!==-1;w--,D++)v+=256*m[w]>>>0,m[w]=v%a>>>0,v=v/a>>>0;if(v!==0)throw new Error("Non-zero carry");I=D,x++}for(var E=y-I;E!==y&&m[E]===0;)E++;for(var J=S.repeat(l);E<y;++E)J+=r.charAt(m[E]);return J}function ye(h){if(typeof h!="string")throw new TypeError("Expected String");if(h.length===0)return new Uint8Array;var l=0;if(h[l]!==" "){for(var I=0,x=0;h[l]===S;)I++,l++;for(var b=(h.length-l)*B+1>>>0,y=new Uint8Array(b);h[l];){var m=n[h.charCodeAt(l)];if(m===255)return;for(var v=0,D=b-1;(m!==0||v<x)&&D!==-1;D--,v++)m+=a*y[D]>>>0,y[D]=m%256>>>0,m=m/256>>>0;if(m!==0)throw new Error("Non-zero carry");x=v,l++}if(h[l]!==" "){for(var w=b-x;w!==b&&y[w]===0;)w++;for(var E=new Uint8Array(I+(b-w)),J=I;w!==b;)E[J++]=y[w++];return E}}}function Ye(h){var l=ye(h);if(l)return l;throw new Error(`Non-${e} character`)}return{encode:H,decodeUnsafe:ye,decode:Ye}}var ct=at,ht=ct,Te=ht;var K=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")}},Z=class{name;prefix;baseDecode;prefixCodePoint;constructor(e,t,n){this.name=e,this.prefix=t;let s=t.codePointAt(0);if(s===void 0)throw new Error("Invalid prefix character");this.prefixCodePoint=s,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 Ne(this,e)}},ee=class{decoders;constructor(e){this.decoders=e}or(e){return Ne(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 Ne(r,e){return new ee({...r.decoders??{[r.prefix]:r},...e.decoders??{[e.prefix]:e}})}var te=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 K(e,t,n),this.decoder=new Z(e,t,s)}encode(e){return this.encoder.encode(e)}decode(e){return this.decoder.decode(e)}};function U({name:r,prefix:e,encode:t,decode:n}){return new te(r,e,t,n)}function T({name:r,prefix:e,alphabet:t,caseInsensitive:n=!1}){let{encode:s,decode:o}=Te(t,r,n);return U({prefix:e,name:r,encode:s,decode:i=>g(o(i))})}function ft(r,e,t,n){let s=r.length;for(;r[s-1]==="=";)--s;let o=new Uint8Array(s*t/8|0),i=0,c=0,d=0;for(let f=0;f<s;++f){let a=e[r[f]];if(a===void 0)throw new SyntaxError(`Non-${n} character`);c=c<<t|a,i+=t,i>=8&&(i-=8,o[d++]=255&c>>i)}if(i>=t||(255&c<<8-i)!==0)throw new SyntaxError("Unexpected end of data");return o}function ut(r,e,t){let n=e[e.length-1]==="=",s=(1<<t)-1,o="",i=0,c=0;for(let d=0;d<r.length;++d)for(c=c<<8|r[d],i+=8;i>t;)i-=t,o+=e[s&c>>i];if(i!==0&&(o+=e[s&c<<t-i]),n)for(;(o.length*t&7)!==0;)o+="=";return o}function dt(r,e){let t={};for(let n=0;n<r.length;++n)if(t[r[n]]=n,e){let s=r[n].toLowerCase(),o=r[n].toUpperCase();s!==r[n]&&(t[s]=n),o!==r[n]&&(t[o]=n)}return t}function u({name:r,prefix:e,bitsPerChar:t,alphabet:n,caseInsensitive:s=!1}){let o=dt(n,s);return U({prefix:e,name:r,encode(i){return ut(i,n,t)},decode(i){return ft(i,o,t,r)}})}var lt=T({prefix:"9",name:"base10",alphabet:"0123456789"});var ne={};p(ne,{base16:()=>pt,base16upper:()=>mt});var pt=u({prefix:"f",name:"base16",alphabet:"0123456789abcdef",bitsPerChar:4,caseInsensitive:!0}),mt=u({prefix:"F",name:"base16upper",alphabet:"0123456789ABCDEF",bitsPerChar:4,caseInsensitive:!0});var se={};p(se,{base2:()=>gt});var gt=u({prefix:"0",name:"base2",alphabet:"01",bitsPerChar:1});var oe={};p(oe,{base256emoji:()=>vt});var Ie=Array.from("\u{1F680}\u{1FA90}\u2604\u{1F6F0}\u{1F30C}\u{1F311}\u{1F312}\u{1F313}\u{1F314}\u{1F315}\u{1F316}\u{1F317}\u{1F318}\u{1F30D}\u{1F30F}\u{1F30E}\u{1F409}\u2600\u{1F4BB}\u{1F5A5}\u{1F4BE}\u{1F4BF}\u{1F602}\u2764\u{1F60D}\u{1F923}\u{1F60A}\u{1F64F}\u{1F495}\u{1F62D}\u{1F618}\u{1F44D}\u{1F605}\u{1F44F}\u{1F601}\u{1F525}\u{1F970}\u{1F494}\u{1F496}\u{1F499}\u{1F622}\u{1F914}\u{1F606}\u{1F644}\u{1F4AA}\u{1F609}\u263A\u{1F44C}\u{1F917}\u{1F49C}\u{1F614}\u{1F60E}\u{1F607}\u{1F339}\u{1F926}\u{1F389}\u{1F49E}\u270C\u2728\u{1F937}\u{1F631}\u{1F60C}\u{1F338}\u{1F64C}\u{1F60B}\u{1F497}\u{1F49A}\u{1F60F}\u{1F49B}\u{1F642}\u{1F493}\u{1F929}\u{1F604}\u{1F600}\u{1F5A4}\u{1F603}\u{1F4AF}\u{1F648}\u{1F447}\u{1F3B6}\u{1F612}\u{1F92D}\u2763\u{1F61C}\u{1F48B}\u{1F440}\u{1F62A}\u{1F611}\u{1F4A5}\u{1F64B}\u{1F61E}\u{1F629}\u{1F621}\u{1F92A}\u{1F44A}\u{1F973}\u{1F625}\u{1F924}\u{1F449}\u{1F483}\u{1F633}\u270B\u{1F61A}\u{1F61D}\u{1F634}\u{1F31F}\u{1F62C}\u{1F643}\u{1F340}\u{1F337}\u{1F63B}\u{1F613}\u2B50\u2705\u{1F97A}\u{1F308}\u{1F608}\u{1F918}\u{1F4A6}\u2714\u{1F623}\u{1F3C3}\u{1F490}\u2639\u{1F38A}\u{1F498}\u{1F620}\u261D\u{1F615}\u{1F33A}\u{1F382}\u{1F33B}\u{1F610}\u{1F595}\u{1F49D}\u{1F64A}\u{1F639}\u{1F5E3}\u{1F4AB}\u{1F480}\u{1F451}\u{1F3B5}\u{1F91E}\u{1F61B}\u{1F534}\u{1F624}\u{1F33C}\u{1F62B}\u26BD\u{1F919}\u2615\u{1F3C6}\u{1F92B}\u{1F448}\u{1F62E}\u{1F646}\u{1F37B}\u{1F343}\u{1F436}\u{1F481}\u{1F632}\u{1F33F}\u{1F9E1}\u{1F381}\u26A1\u{1F31E}\u{1F388}\u274C\u270A\u{1F44B}\u{1F630}\u{1F928}\u{1F636}\u{1F91D}\u{1F6B6}\u{1F4B0}\u{1F353}\u{1F4A2}\u{1F91F}\u{1F641}\u{1F6A8}\u{1F4A8}\u{1F92C}\u2708\u{1F380}\u{1F37A}\u{1F913}\u{1F619}\u{1F49F}\u{1F331}\u{1F616}\u{1F476}\u{1F974}\u25B6\u27A1\u2753\u{1F48E}\u{1F4B8}\u2B07\u{1F628}\u{1F31A}\u{1F98B}\u{1F637}\u{1F57A}\u26A0\u{1F645}\u{1F61F}\u{1F635}\u{1F44E}\u{1F932}\u{1F920}\u{1F927}\u{1F4CC}\u{1F535}\u{1F485}\u{1F9D0}\u{1F43E}\u{1F352}\u{1F617}\u{1F911}\u{1F30A}\u{1F92F}\u{1F437}\u260E\u{1F4A7}\u{1F62F}\u{1F486}\u{1F446}\u{1F3A4}\u{1F647}\u{1F351}\u2744\u{1F334}\u{1F4A3}\u{1F438}\u{1F48C}\u{1F4CD}\u{1F940}\u{1F922}\u{1F445}\u{1F4A1}\u{1F4A9}\u{1F450}\u{1F4F8}\u{1F47B}\u{1F910}\u{1F92E}\u{1F3BC}\u{1F975}\u{1F6A9}\u{1F34E}\u{1F34A}\u{1F47C}\u{1F48D}\u{1F4E3}\u{1F942}"),xt=Ie.reduce((r,e,t)=>(r[t]=e,r),[]),wt=Ie.reduce((r,e,t)=>{let n=e.codePointAt(0);if(n==null)throw new Error(`Invalid character: ${e}`);return r[n]=t,r},[]);function bt(r){return r.reduce((e,t)=>(e+=xt[t],e),"")}function yt(r){let e=[];for(let t of r){let n=t.codePointAt(0);if(n==null)throw new Error(`Invalid character: ${t}`);let s=wt[n];if(s==null)throw new Error(`Non-base256emoji character: ${t}`);e.push(s)}return new Uint8Array(e)}var vt=U({prefix:"\u{1F680}",name:"base256emoji",encode:bt,decode:yt});var ie={};p(ie,{base32:()=>M,base32hex:()=>St,base32hexpad:()=>Tt,base32hexpadupper:()=>Nt,base32hexupper:()=>Dt,base32pad:()=>Et,base32padupper:()=>Ct,base32upper:()=>At,base32z:()=>It});var M=u({prefix:"b",name:"base32",alphabet:"abcdefghijklmnopqrstuvwxyz234567",bitsPerChar:5,caseInsensitive:!0}),At=u({prefix:"B",name:"base32upper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",bitsPerChar:5,caseInsensitive:!0}),Et=u({prefix:"c",name:"base32pad",alphabet:"abcdefghijklmnopqrstuvwxyz234567=",bitsPerChar:5,caseInsensitive:!0}),Ct=u({prefix:"C",name:"base32padupper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",bitsPerChar:5,caseInsensitive:!0}),St=u({prefix:"v",name:"base32hex",alphabet:"0123456789abcdefghijklmnopqrstuv",bitsPerChar:5,caseInsensitive:!0}),Dt=u({prefix:"V",name:"base32hexupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV",bitsPerChar:5,caseInsensitive:!0}),Tt=u({prefix:"t",name:"base32hexpad",alphabet:"0123456789abcdefghijklmnopqrstuv=",bitsPerChar:5,caseInsensitive:!0}),Nt=u({prefix:"T",name:"base32hexpadupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV=",bitsPerChar:5,caseInsensitive:!0}),It=u({prefix:"h",name:"base32z",alphabet:"ybndrfg8ejkmcpqxot1uwisza345h769",bitsPerChar:5});var ae={};p(ae,{base36:()=>_,base36upper:()=>Lt});var _=T({prefix:"k",name:"base36",alphabet:"0123456789abcdefghijklmnopqrstuvwxyz",caseInsensitive:!0}),Lt=T({prefix:"K",name:"base36upper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",caseInsensitive:!0});var ce={};p(ce,{base58btc:()=>A,base58flickr:()=>Ut});var A=T({name:"base58btc",prefix:"z",alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"}),Ut=T({name:"base58flickr",prefix:"Z",alphabet:"123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"});var he={};p(he,{base64:()=>Mt,base64pad:()=>Rt,base64url:()=>zt,base64urlpad:()=>$t});var Mt=u({prefix:"m",name:"base64",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",bitsPerChar:6}),Rt=u({prefix:"M",name:"base64pad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",bitsPerChar:6}),zt=u({prefix:"u",name:"base64url",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",bitsPerChar:6}),$t=u({prefix:"U",name:"base64urlpad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=",bitsPerChar:6});var fe={};p(fe,{base8:()=>Ot});var Ot=u({prefix:"7",name:"base8",alphabet:"01234567",bitsPerChar:3});var ue={};p(ue,{identity:()=>kt});var kt=U({prefix:"\0",name:"identity",encode:r=>Se(g(r)),decode:r=>g(Ce(r))});var Vr=new TextEncoder,qr=new TextDecoder;var le={};p(le,{identity:()=>ir});var Ft=Me,Le=128,_t=127,Vt=~_t,qt=Math.pow(2,31);function Me(r,e,t){e=e||[],t=t||0;for(var n=t;r>=qt;)e[t++]=r&255|Le,r/=128;for(;r&Vt;)e[t++]=r&255|Le,r>>>=7;return e[t]=r|0,Me.bytes=t-n+1,e}var Xt=de,Qt=128,Ue=127;function de(r,n){var t=0,n=n||0,s=0,o=n,i,c=r.length;do{if(o>=c)throw de.bytes=0,new RangeError("Could not decode varint");i=r[o++],t+=s<28?(i&Ue)<<s:(i&Ue)*Math.pow(2,s),s+=7}while(i>=Qt);return de.bytes=o-n,t}var Ht=Math.pow(2,7),Jt=Math.pow(2,14),jt=Math.pow(2,21),Gt=Math.pow(2,28),Wt=Math.pow(2,35),Yt=Math.pow(2,42),Kt=Math.pow(2,49),Zt=Math.pow(2,56),er=Math.pow(2,63),tr=function(r){return r<Ht?1:r<Jt?2:r<jt?3:r<Gt?4:r<Wt?5:r<Yt?6:r<Kt?7:r<Zt?8:r<er?9:10},rr={encode:Ft,decode:Xt,encodingLength:tr},nr=rr,V=nr;function q(r,e=0){return[V.decode(r,e),V.decode.bytes]}function R(r,e,t=0){return V.encode(r,e,t),e}function z(r){return V.encodingLength(r)}function O(r,e){let t=e.byteLength,n=z(r),s=n+z(t),o=new Uint8Array(s+t);return R(r,o,0),R(t,o,n),o.set(e,s),new $(r,t,e,o)}function Re(r){let e=g(r),[t,n]=q(e),[s,o]=q(e.subarray(n)),i=e.subarray(n+o);if(i.byteLength!==s)throw new Error("Incorrect length");return new $(t,s,i,e)}function ze(r,e){if(r===e)return!0;{let t=e;return r.code===t.code&&r.size===t.size&&t.bytes instanceof Uint8Array&&Ee(r.bytes,t.bytes)}}var $=class{code;size;digest;bytes;constructor(e,t,n,s){this.code=e,this.size=t,this.digest=L(n),this.bytes=L(s)}};var $e=0,sr="identity",Oe=g;function or(r,e){if(e?.truncate!=null&&e.truncate!==r.byteLength){if(e.truncate<0||e.truncate>r.byteLength)throw new Error(`Invalid truncate option, must be less than or equal to ${r.byteLength}`);r=r.subarray(0,e.truncate)}return O($e,Oe(r))}var ir={code:$e,name:sr,encode:Oe,digest:or};var ge={};p(ge,{sha256:()=>cr,sha512:()=>hr});var ar=20;function me({name:r,code:e,encode:t,minDigestLength:n,maxDigestLength:s}){return new pe(r,e,t,n,s)}var pe=class{name;code;encode;minDigestLength;maxDigestLength;constructor(e,t,n,s,o){this.name=e,this.code=t,this.encode=n,this.minDigestLength=s??ar,this.maxDigestLength=o}digest(e,t){if(t?.truncate!=null){if(t.truncate<this.minDigestLength)throw new Error(`Invalid truncate option, must be greater than or equal to ${this.minDigestLength}`);if(this.maxDigestLength!=null&&t.truncate>this.maxDigestLength)throw new Error(`Invalid truncate option, must be less than or equal to ${this.maxDigestLength}`)}if(e instanceof Uint8Array){let n=this.encode(e);return n instanceof Uint8Array?ke(n,this.code,t?.truncate):n.then(s=>ke(s,this.code,t?.truncate))}else throw Error("Unknown type, must be binary type")}};function ke(r,e,t){if(t!=null&&t!==r.byteLength){if(t>r.byteLength)throw new Error(`Invalid truncate option, must be less than or equal to ${r.byteLength}`);r=r.subarray(0,t)}return O(e,r)}function Be(r){return async e=>new Uint8Array(await crypto.subtle.digest(r,e))}var cr=me({name:"sha2-256",code:18,encode:Be("SHA-256")}),hr=me({name:"sha2-512",code:19,encode:Be("SHA-512")});function Fe(r,e){let{bytes:t,version:n}=r;return n===0?ur(t,xe(r),e??A.encoder):dr(t,xe(r),e??M.encoder)}var _e=new WeakMap;function xe(r){let e=_e.get(r);if(e==null){let t=new Map;return _e.set(r,t),t}return e}var N=class r{code;version;multihash;bytes;"/";constructor(e,t,n,s){this.code=t,this.version=e,this.multihash=n,this.bytes=L(s),this["/"]=this.bytes}get asCID(){return this}get byteOffset(){return this.bytes.byteOffset}get byteLength(){return this.bytes.byteLength}toV0(){switch(this.version){case 0:return this;case 1:{let{code:e,multihash:t}=this;if(e!==Q)throw new Error("Cannot convert a non dag-pb CID to CIDv0");if(t.code!==lr)throw new Error("Cannot convert non sha2-256 multihash CID to CIDv0");return r.createV0(t)}default:throw Error(`Can not convert CID version ${this.version} to version 0. This is a bug please report`)}}toV1(){switch(this.version){case 0:{let{code:e,digest:t}=this.multihash,n=O(e,t);return r.createV1(this.code,n)}case 1:return this;default:throw Error(`Can not convert CID version ${this.version} to version 1. This is a bug please report`)}}equals(e){return r.equals(this,e)}static equals(e,t){let n=t;return n!=null&&e.code===n.code&&e.version===n.version&&ze(e.multihash,n.multihash)}toString(e){return Fe(this,e)}toJSON(){return{"/":Fe(this)}}link(){return this}[Symbol.toStringTag]="CID";[Symbol.for("nodejs.util.inspect.custom")](){return`CID(${this.toString()})`}static asCID(e){if(e==null)return null;let t=e;if(t instanceof r)return t;if(t["/"]!=null&&t["/"]===t.bytes||t.asCID===t){let{version:n,code:s,multihash:o,bytes:i}=t;return new r(n,s,o,i??Ve(n,s,o.bytes))}else if(t[pr]===!0){let{version:n,multihash:s,code:o}=t,i=Re(s);return r.create(n,o,i)}else return null}static create(e,t,n){if(typeof t!="number")throw new Error("String codecs are no longer supported");if(!(n.bytes instanceof Uint8Array))throw new Error("Invalid digest");switch(e){case 0:{if(t!==Q)throw new Error(`Version 0 CID must use dag-pb (code: ${Q}) block encoding`);return new r(e,t,n,n.bytes)}case 1:{let s=Ve(e,t,n.bytes);return new r(e,t,n,s)}default:throw new Error("Invalid version")}}static createV0(e){return r.create(0,Q,e)}static createV1(e,t){return r.create(1,e,t)}static decode(e){let[t,n]=r.decodeFirst(e);if(n.length!==0)throw new Error("Incorrect length");return t}static decodeFirst(e){let t=r.inspectBytes(e),n=t.size-t.multihashSize,s=g(e.subarray(n,n+t.multihashSize));if(s.byteLength!==t.multihashSize)throw new Error("Incorrect length");let o=s.subarray(t.multihashSize-t.digestSize),i=new $(t.multihashCode,t.digestSize,o,s);return[t.version===0?r.createV0(i):r.createV1(t.codec,i),e.subarray(t.size)]}static inspectBytes(e){let t=0,n=()=>{let[S,B]=q(e.subarray(t));return t+=B,S},s=n(),o=Q;if(s===18?(s=0,t=0):o=n(),s!==0&&s!==1)throw new RangeError(`Invalid CID version ${s}`);let i=t,c=n(),d=n(),f=t+d,a=f-i;return{version:s,codec:o,multihashCode:c,digestSize:d,multihashSize:a,size:f}}static parse(e,t){let[n,s]=fr(e,t),o=r.decode(s);if(o.version===0&&e[0]!=="Q")throw Error("Version 0 CID string must not include multibase prefix");return xe(o).set(n,e),o}};function fr(r,e){switch(r[0]){case"Q":{let t=e??A;return[A.prefix,t.decode(`${A.prefix}${r}`)]}case A.prefix:{let t=e??A;return[A.prefix,t.decode(r)]}case M.prefix:{let t=e??M;return[M.prefix,t.decode(r)]}case _.prefix:{let t=e??_;return[_.prefix,t.decode(r)]}default:{if(e==null)throw Error("To parse non base32, base36 or base58btc encoded CID multibase decoder must be provided");return[r[0],e.decode(r)]}}}function ur(r,e,t){let{prefix:n}=t;if(n!==A.prefix)throw Error(`Cannot string encode V0 in ${t.name} encoding`);let s=e.get(n);if(s==null){let o=t.encode(r).slice(1);return e.set(n,o),o}else return s}function dr(r,e,t){let{prefix:n}=t,s=e.get(n);if(s==null){let o=t.encode(r);return e.set(n,o),o}else return s}var Q=112,lr=18;function Ve(r,e,t){let n=z(r),s=n+z(e),o=new Uint8Array(s+t.byteLength);return R(r,o,0),R(e,o,n),o.set(t,s),o}var pr=Symbol.for("@ipld/js-cid/CID");var we={...ue,...se,...fe,...re,...ne,...ie,...ae,...ce,...he,...oe},dn={...ge,...le};function qe(r=0){return new Uint8Array(r)}function Qe(r,e,t,n){return{name:r,prefix:e,encoder:{name:r,prefix:e,encode:t},decoder:{decode:n}}}var Xe=Qe("utf8","u",r=>"u"+new TextDecoder("utf8").decode(r),r=>new TextEncoder().encode(r.substring(1))),be=Qe("ascii","a",r=>{let e="a";for(let t=0;t<r.length;t++)e+=String.fromCharCode(r[t]);return e},r=>{r=r.substring(1);let e=qe(r.length);for(let t=0;t<r.length;t++)e[t]=r.charCodeAt(t);return e}),xn={utf8:Xe,"utf-8":Xe,hex:we.base16,latin1:be,ascii:be,binary:be,...we};var wr=st(Je(),1);var C;(function(r){r[r.A=1]="A",r[r.CNAME=5]="CNAME",r[r.TXT=16]="TXT",r[r.AAAA=28]="AAAA"})(C||(C={}));var je=32;var k=class extends Map{#r=0;#e=new Map;#t=new Map;#s;#i;#o;constructor(e={}){if(super(),!(e.maxSize&&e.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");if(typeof e.maxAge=="number"&&e.maxAge===0)throw new TypeError("`maxAge` must be a number greater than 0");this.#s=e.maxSize,this.#i=e.maxAge||Number.POSITIVE_INFINITY,this.#o=e.onEviction}get __oldCache(){return this.#t}#a(e){if(typeof this.#o=="function")for(let[t,n]of e)this.#o(t,n.value)}#n(e,t){return typeof t.expiry=="number"&&t.expiry<=Date.now()?(typeof this.#o=="function"&&this.#o(e,t.value),this.delete(e)):!1}#d(e,t){if(this.#n(e,t)===!1)return t.value}#h(e,t){return t.expiry?this.#d(e,t):t.value}#f(e,t){let n=t.get(e);return this.#h(e,n)}#u(e,t){this.#e.set(e,t),this.#r++,this.#r>=this.#s&&(this.#r=0,this.#a(this.#t),this.#t=this.#e,this.#e=new Map)}#l(e,t){this.#t.delete(e),this.#u(e,t)}*#c(){for(let e of this.#t){let[t,n]=e;this.#e.has(t)||this.#n(t,n)===!1&&(yield e)}for(let e of this.#e){let[t,n]=e;this.#n(t,n)===!1&&(yield e)}}get(e){if(this.#e.has(e)){let t=this.#e.get(e);return this.#h(e,t)}if(this.#t.has(e)){let t=this.#t.get(e);if(this.#n(e,t)===!1)return this.#l(e,t),t.value}}set(e,t,{maxAge:n=this.#i}={}){let s=typeof n=="number"&&n!==Number.POSITIVE_INFINITY?Date.now()+n:void 0;return this.#e.has(e)?this.#e.set(e,{value:t,expiry:s}):this.#u(e,{value:t,expiry:s}),this}has(e){return this.#e.has(e)?!this.#n(e,this.#e.get(e)):this.#t.has(e)?!this.#n(e,this.#t.get(e)):!1}peek(e){if(this.#e.has(e))return this.#f(e,this.#e);if(this.#t.has(e))return this.#f(e,this.#t)}expiresIn(e){let t=this.#e.get(e)??this.#t.get(e);if(t)return t.expiry?t.expiry-Date.now():Number.POSITIVE_INFINITY}delete(e){let t=this.#e.delete(e);return t&&this.#r--,this.#t.delete(e)||t}clear(){this.#e.clear(),this.#t.clear(),this.#r=0}resize(e){if(!(e&&e>0))throw new TypeError("`maxSize` must be a number greater than 0");let t=[...this.#c()],n=t.length-e;n<0?(this.#e=new Map(t),this.#t=new Map,this.#r=t.length):(n>0&&this.#a(t.slice(0,n)),this.#t=new Map(t.slice(n)),this.#e=new Map,this.#r=0),this.#s=e}evict(e=1){let t=Number(e);if(!t||t<=0)return;let n=[...this.#c()],s=Math.trunc(Math.min(t,Math.max(n.length-1,0)));s<=0||(this.#a(n.slice(0,s)),this.#t=new Map(n.slice(s)),this.#e=new Map,this.#r=0)}*keys(){for(let[e]of this)yield e}*values(){for(let[,e]of this)yield e}*[Symbol.iterator](){for(let e of this.#e){let[t,n]=e;this.#n(t,n)===!1&&(yield[t,n.value])}for(let e of this.#t){let[t,n]=e;this.#e.has(t)||this.#n(t,n)===!1&&(yield[t,n.value])}}*entriesDescending(){let e=[...this.#e];for(let t=e.length-1;t>=0;--t){let n=e[t],[s,o]=n;this.#n(s,o)===!1&&(yield[s,o.value])}e=[...this.#t];for(let t=e.length-1;t>=0;--t){let n=e[t],[s,o]=n;this.#e.has(s)||this.#n(s,o)===!1&&(yield[s,o.value])}}*entriesAscending(){for(let[e,t]of this.#c())yield[e,t.value]}get size(){if(!this.#r)return this.#t.size;let e=0;for(let t of this.#t.keys())this.#e.has(t)||e++;return Math.min(this.#r+e,this.#s)}get maxSize(){return this.#s}get maxAge(){return this.#i}entries(){return this.entriesAscending()}forEach(e,t=this){for(let[n,s]of this.entriesAscending())e.call(t,s,n,this)}get[Symbol.toStringTag](){return"QuickLRU"}toString(){return`QuickLRU(${this.size}/${this.maxSize})`}[Symbol.for("nodejs.util.inspect.custom")](){return this.toString()}};var W=class extends Error{static name="DNSLinkNotFoundError";constructor(e="DNSLink not found"){super(e),this.name="DNSLinkNotFoundError"}},P=class extends Error{static name="InvalidNamespaceError";constructor(e="Invalid namespace"){super(e),this.name="InvalidNamespaceError"}};var Ge=(r,e)=>{let[,t,n,...s]=r.split("/");if(t!=="ipfs")throw new P(`Namespace ${t} was not "ipfs"`);return{namespace:"ipfs",cid:N.parse(n),path:s.length>0?`/${s.join("/")}`:"",answer:e}};var We=(r,e)=>{let[,t,n,...s]=r.split("/");if(t!=="ipns")throw new P(`Namespace ${t} was not "ipns"`);try{return{namespace:"ipns",value:N.parse(n).multihash,path:s.length>0?`/${s.join("/")}`:"",answer:e}}catch{return{namespace:"dnslink",value:n,path:s.length>0?`/${s.join("/")}`:"",answer:e}}};var Y=class{dns;log;namespaces;cache;cacheMaxAnswers;constructor(e,t={}){this.dns=e.dns,this.log=e.logger.forComponent("helia:dnslink"),this.namespaces={ipfs:Ge,ipns:We,...t.namespaces},this.cache=new k({maxSize:t.cacheSize??1e3,maxAge:t.cacheMaxAge??3e4}),this.cacheMaxAnswers=t.cacheMaxAnswers??10}async resolve(e,t={}){if(t.nocache!==!0){let i=this.cache.get(e);if(i!=null){let c=[...i.values()];if(c.length>0)return c}}let n=await this.recursiveResolveDomain(e,t.maxRecursiveDepth??je,t),s=new k({maxSize:this.cacheMaxAnswers});n.forEach((i,c)=>{s.set(c,i,{maxAge:i.answer.TTL*1e3})});let o=n.reduce((i,c)=>{let d=c.answer.TTL*1e3;return d>i?d:i},0);return this.cache.maxAge<o&&(o=this.cache.maxAge),this.cache.set(e,s,{maxAge:o}),n}async recursiveResolveDomain(e,t,n={}){if(t===0)throw new Error("recursion limit exceeded");e.startsWith("_dnslink.")||(e=`_dnslink.${e}`);try{return await this.recursiveResolveDnslink(e,t,n)}catch(s){if(s.code!=="ENOTFOUND"&&s.code!=="ENODATA"&&s.name!=="DNSLinkNotFoundError"&&s.name!=="NotFoundError")throw s;return e.startsWith("_dnslink.")?e=e.replace("_dnslink.",""):e=`_dnslink.${e}`,this.recursiveResolveDnslink(e,t,n)}}async recursiveResolveDnslink(e,t,n={}){if(t===0)throw new Error("recursion limit exceeded");this.log("query %s for TXT and CNAME records",e);let o=((await this.dns.query(e,{...n,types:[C.TXT]}))?.Answer??[]).sort((f,a)=>f.data.localeCompare(a.data));this.log("found %d TXT records for %s",o.length,e);let i=[];for(let f of o)try{let a=f.data;if(a.startsWith('"')&&a.endsWith('"')&&(a=a.substring(1,a.length-1)),!a.startsWith("dnslink="))continue;this.log("%s TXT %s",f.name,a),a=a.replace("dnslink=","");let[,S,B]=a.split("/");if(S==="dnslink"){i.push(...await this.recursiveResolveDomain(B,t-1,n));continue}let F=this.namespaces[S];if(F==null){this.log('unknown protocol "%s" in DNSLink record for domain: %s',S,e);continue}let H=F(a,f);if(H.namespace==="dnslink"){i.push(...await this.recursiveResolveDomain(H.value,t-1,n));continue}i.push(F(a,f))}catch(a){this.log.error("could not parse DNS link record for domain %s, %s - %e",e,f.data,a)}if(i.length>0)return i;this.log("no DNSLink records found for %s, falling back to CNAME",e);let d=((await this.dns.query(e,{...n,types:[C.CNAME]}))?.Answer??[]).sort((f,a)=>f.data.localeCompare(a.data));this.log("found %d CNAME records for %s",d.length,e);for(let f of d)try{return await this.recursiveResolveDomain(f.data,t-1,n)}catch(a){this.log.error("domain %s cname %s had no DNSLink records - %e",e,f.data,a)}throw new W(`No DNSLink records found for domain: ${e}`)}};function br(r,e={}){return new Y(r,e)}return ot(yr);})();
2
+ "use strict";var HeliaDnslink=(()=>{var Ke=Object.create;var j=Object.defineProperty;var Ze=Object.getOwnPropertyDescriptor;var et=Object.getOwnPropertyNames;var tt=Object.getPrototypeOf,rt=Object.prototype.hasOwnProperty;var nt=(r,e)=>()=>{try{return e||r((e={exports:{}}).exports,e),e.exports}catch(t){throw e=0,t}},p=(r,e)=>{for(var t in e)j(r,t,{get:e[t],enumerable:!0})},Ae=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of et(e))!rt.call(r,s)&&s!==t&&j(r,s,{get:()=>e[s],enumerable:!(n=Ze(e,s))||n.enumerable});return r};var st=(r,e,t)=>(t=r!=null?Ke(tt(r)):{},Ae(e||!r||!r.__esModule?j(t,"default",{value:r,enumerable:!0}):t,r)),ot=r=>Ae(j({},"__esModule",{value:!0}),r);var Je=nt(($n,He)=>{He.exports=function(r){if(!r)throw Error("hashlru must have a max value, of type number, greater than 0");var e=0,t=Object.create(null),n=Object.create(null);function s(o,i){t[o]=i,e++,e>=r&&(e=0,n=t,t=Object.create(null))}return{has:function(o){return t[o]!==void 0||n[o]!==void 0},remove:function(o){t[o]!==void 0&&(t[o]=void 0),n[o]!==void 0&&(n[o]=void 0)},get:function(o){var i=t[o];if(i!==void 0)return i;if((i=n[o])!==void 0)return s(o,i),i},set:function(o,i){t[o]!==void 0?t[o]=i:s(o,i)},clear:function(){t=Object.create(null),n=Object.create(null)}}}});var vr={};p(vr,{dnsLink:()=>yr});var ne={};p(ne,{base10:()=>lt});var Tr=new Uint8Array(0);function Ce(r,e){if(r===e)return!0;if(r.byteLength!==e.byteLength)return!1;for(let t=0;t<r.byteLength;t++)if(r[t]!==e[t])return!1;return!0}function g(r){if(r instanceof Uint8Array&&r.constructor.name==="Uint8Array")return L(r);if(r instanceof ArrayBuffer)return new Uint8Array(r);if(ArrayBuffer.isView(r))return L(new Uint8Array(r.buffer,r.byteOffset,r.byteLength));throw new Error("Unknown type, must be binary type")}function De(r){let e=new Uint8Array(r.length);for(let t=0;t<r.length;t++)e[t]=r.charCodeAt(t);return e}var Ee=4096;function Se(r){let e=r.length;if(e<=Ee)return String.fromCharCode.apply(String,r);let t="",n=0;for(;n<e;)t+=String.fromCharCode.apply(String,r.subarray(n,n+=Ee));return t}function it(r){return r?.buffer instanceof ArrayBuffer}function L(r){return it(r)?r:r.slice()}function at(r,e,t){if(r.length>=255)throw new TypeError("Alphabet too long");for(var n=new Uint8Array(256),s=0;s<n.length;s++)n[s]=255;for(var o=0;o<r.length;o++){var i=r.charAt(o),c=i.charCodeAt(0);if(n[c]!==255)throw new TypeError(i+" is ambiguous");if(n[c]=o,t){var d=i.toLowerCase().charCodeAt(0),f=i.toUpperCase().charCodeAt(0);d!==c&&(n[d]=o),f!==c&&(n[f]=o)}}var a=r.length,D=r.charAt(0),F=Math.log(a)/Math.log(256),_=Math.log(256)/Math.log(a);function H(h){if(h instanceof Uint8Array||(ArrayBuffer.isView(h)?h=new Uint8Array(h.buffer,h.byteOffset,h.byteLength):Array.isArray(h)&&(h=Uint8Array.from(h))),!(h instanceof Uint8Array))throw new TypeError("Expected Uint8Array");if(h.length===0)return"";for(var l=0,I=0,w=0,y=h.length;w!==y&&h[w]===0;)w++,l++;for(var v=(y-w)*_+1>>>0,m=new Uint8Array(v);w!==y;){for(var A=h[w],S=0,b=v-1;(A!==0||S<I)&&b!==-1;b--,S++)A+=256*m[b]>>>0,m[b]=A%a>>>0,A=A/a>>>0;if(A!==0)throw new Error("Non-zero carry");I=S,w++}for(var E=v-I;E!==v&&m[E]===0;)E++;for(var J=D.repeat(l);E<v;++E)J+=r.charAt(m[E]);return J}function ve(h){if(typeof h!="string")throw new TypeError("Expected String");if(h.length===0)return new Uint8Array;var l=0;if(h[l]!==" "){for(var I=0,w=0;h[l]===D;)I++,l++;for(var y=(h.length-l)*F+1>>>0,v=new Uint8Array(y);h[l];){var m=n[h.charCodeAt(l)];if(m===255)return;for(var A=0,S=y-1;(m!==0||A<w)&&S!==-1;S--,A++)m+=a*v[S]>>>0,v[S]=m%256>>>0,m=m/256>>>0;if(m!==0)throw new Error("Non-zero carry");w=A,l++}if(h[l]!==" "){for(var b=y-w;b!==y&&v[b]===0;)b++;for(var E=new Uint8Array(I+(y-b)),J=I;b!==y;)E[J++]=v[b++];return E}}}function Ye(h){var l=ve(h);if(l)return l;throw new Error(`Non-${e} character`)}return{encode:H,decodeUnsafe:ve,decode:Ye}}var ct=at,ht=ct,Ne=ht;var Z=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")}},ee=class{name;prefix;baseDecode;prefixCodePoint;constructor(e,t,n){this.name=e,this.prefix=t;let s=t.codePointAt(0);if(s===void 0)throw new Error("Invalid prefix character");this.prefixCodePoint=s,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)}},te=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 te({...r.decoders??{[r.prefix]:r},...e.decoders??{[e.prefix]:e}})}var re=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 Z(e,t,n),this.decoder=new ee(e,t,s)}encode(e){return this.encoder.encode(e)}decode(e){return this.decoder.decode(e)}};function U({name:r,prefix:e,encode:t,decode:n}){return new re(r,e,t,n)}function T({name:r,prefix:e,alphabet:t,caseInsensitive:n=!1}){let{encode:s,decode:o}=Ne(t,r,n);return U({prefix:e,name:r,encode:s,decode:i=>g(o(i))})}function ft(r,e,t,n){let s=r.length;for(;r[s-1]==="=";)--s;let o=new Uint8Array(s*t/8|0),i=0,c=0,d=0;for(let f=0;f<s;++f){let a=e[r[f]];if(a===void 0)throw new SyntaxError(`Non-${n} character`);c=c<<t|a,i+=t,i>=8&&(i-=8,o[d++]=255&c>>i)}if(i>=t||(255&c<<8-i)!==0)throw new SyntaxError("Unexpected end of data");return o}function ut(r,e,t){let n=e[e.length-1]==="=",s=(1<<t)-1,o="",i=0,c=0;for(let d=0;d<r.length;++d)for(c=c<<8|r[d],i+=8;i>t;)i-=t,o+=e[s&c>>i];if(i!==0&&(o+=e[s&c<<t-i]),n)for(;(o.length*t&7)!==0;)o+="=";return o}function dt(r,e){let t={};for(let n=0;n<r.length;++n)if(t[r[n]]=n,e){let s=r[n].toLowerCase(),o=r[n].toUpperCase();s!==r[n]&&(t[s]=n),o!==r[n]&&(t[o]=n)}return t}function u({name:r,prefix:e,bitsPerChar:t,alphabet:n,caseInsensitive:s=!1}){let o=dt(n,s);return U({prefix:e,name:r,encode(i){return ut(i,n,t)},decode(i){return ft(i,o,t,r)}})}var lt=T({prefix:"9",name:"base10",alphabet:"0123456789"});var se={};p(se,{base16:()=>pt,base16upper:()=>mt});var pt=u({prefix:"f",name:"base16",alphabet:"0123456789abcdef",bitsPerChar:4,caseInsensitive:!0}),mt=u({prefix:"F",name:"base16upper",alphabet:"0123456789ABCDEF",bitsPerChar:4,caseInsensitive:!0});var oe={};p(oe,{base2:()=>gt});var gt=u({prefix:"0",name:"base2",alphabet:"01",bitsPerChar:1});var ie={};p(ie,{base256emoji:()=>vt});var Le=Array.from("\u{1F680}\u{1FA90}\u2604\u{1F6F0}\u{1F30C}\u{1F311}\u{1F312}\u{1F313}\u{1F314}\u{1F315}\u{1F316}\u{1F317}\u{1F318}\u{1F30D}\u{1F30F}\u{1F30E}\u{1F409}\u2600\u{1F4BB}\u{1F5A5}\u{1F4BE}\u{1F4BF}\u{1F602}\u2764\u{1F60D}\u{1F923}\u{1F60A}\u{1F64F}\u{1F495}\u{1F62D}\u{1F618}\u{1F44D}\u{1F605}\u{1F44F}\u{1F601}\u{1F525}\u{1F970}\u{1F494}\u{1F496}\u{1F499}\u{1F622}\u{1F914}\u{1F606}\u{1F644}\u{1F4AA}\u{1F609}\u263A\u{1F44C}\u{1F917}\u{1F49C}\u{1F614}\u{1F60E}\u{1F607}\u{1F339}\u{1F926}\u{1F389}\u{1F49E}\u270C\u2728\u{1F937}\u{1F631}\u{1F60C}\u{1F338}\u{1F64C}\u{1F60B}\u{1F497}\u{1F49A}\u{1F60F}\u{1F49B}\u{1F642}\u{1F493}\u{1F929}\u{1F604}\u{1F600}\u{1F5A4}\u{1F603}\u{1F4AF}\u{1F648}\u{1F447}\u{1F3B6}\u{1F612}\u{1F92D}\u2763\u{1F61C}\u{1F48B}\u{1F440}\u{1F62A}\u{1F611}\u{1F4A5}\u{1F64B}\u{1F61E}\u{1F629}\u{1F621}\u{1F92A}\u{1F44A}\u{1F973}\u{1F625}\u{1F924}\u{1F449}\u{1F483}\u{1F633}\u270B\u{1F61A}\u{1F61D}\u{1F634}\u{1F31F}\u{1F62C}\u{1F643}\u{1F340}\u{1F337}\u{1F63B}\u{1F613}\u2B50\u2705\u{1F97A}\u{1F308}\u{1F608}\u{1F918}\u{1F4A6}\u2714\u{1F623}\u{1F3C3}\u{1F490}\u2639\u{1F38A}\u{1F498}\u{1F620}\u261D\u{1F615}\u{1F33A}\u{1F382}\u{1F33B}\u{1F610}\u{1F595}\u{1F49D}\u{1F64A}\u{1F639}\u{1F5E3}\u{1F4AB}\u{1F480}\u{1F451}\u{1F3B5}\u{1F91E}\u{1F61B}\u{1F534}\u{1F624}\u{1F33C}\u{1F62B}\u26BD\u{1F919}\u2615\u{1F3C6}\u{1F92B}\u{1F448}\u{1F62E}\u{1F646}\u{1F37B}\u{1F343}\u{1F436}\u{1F481}\u{1F632}\u{1F33F}\u{1F9E1}\u{1F381}\u26A1\u{1F31E}\u{1F388}\u274C\u270A\u{1F44B}\u{1F630}\u{1F928}\u{1F636}\u{1F91D}\u{1F6B6}\u{1F4B0}\u{1F353}\u{1F4A2}\u{1F91F}\u{1F641}\u{1F6A8}\u{1F4A8}\u{1F92C}\u2708\u{1F380}\u{1F37A}\u{1F913}\u{1F619}\u{1F49F}\u{1F331}\u{1F616}\u{1F476}\u{1F974}\u25B6\u27A1\u2753\u{1F48E}\u{1F4B8}\u2B07\u{1F628}\u{1F31A}\u{1F98B}\u{1F637}\u{1F57A}\u26A0\u{1F645}\u{1F61F}\u{1F635}\u{1F44E}\u{1F932}\u{1F920}\u{1F927}\u{1F4CC}\u{1F535}\u{1F485}\u{1F9D0}\u{1F43E}\u{1F352}\u{1F617}\u{1F911}\u{1F30A}\u{1F92F}\u{1F437}\u260E\u{1F4A7}\u{1F62F}\u{1F486}\u{1F446}\u{1F3A4}\u{1F647}\u{1F351}\u2744\u{1F334}\u{1F4A3}\u{1F438}\u{1F48C}\u{1F4CD}\u{1F940}\u{1F922}\u{1F445}\u{1F4A1}\u{1F4A9}\u{1F450}\u{1F4F8}\u{1F47B}\u{1F910}\u{1F92E}\u{1F3BC}\u{1F975}\u{1F6A9}\u{1F34E}\u{1F34A}\u{1F47C}\u{1F48D}\u{1F4E3}\u{1F942}"),xt=Le.reduce((r,e,t)=>(r[t]=e,r),[]),wt=Le.reduce((r,e,t)=>{let n=e.codePointAt(0);if(n==null)throw new Error(`Invalid character: ${e}`);return r[n]=t,r},[]);function bt(r){return r.reduce((e,t)=>(e+=xt[t],e),"")}function yt(r){let e=[];for(let t of r){let n=t.codePointAt(0);if(n==null)throw new Error(`Invalid character: ${t}`);let s=wt[n];if(s==null)throw new Error(`Non-base256emoji character: ${t}`);e.push(s)}return new Uint8Array(e)}var vt=U({prefix:"\u{1F680}",name:"base256emoji",encode:bt,decode:yt});var ae={};p(ae,{base32:()=>M,base32hex:()=>Dt,base32hexpad:()=>Tt,base32hexpadupper:()=>Nt,base32hexupper:()=>St,base32pad:()=>Et,base32padupper:()=>Ct,base32upper:()=>At,base32z:()=>It});var M=u({prefix:"b",name:"base32",alphabet:"abcdefghijklmnopqrstuvwxyz234567",bitsPerChar:5,caseInsensitive:!0}),At=u({prefix:"B",name:"base32upper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",bitsPerChar:5,caseInsensitive:!0}),Et=u({prefix:"c",name:"base32pad",alphabet:"abcdefghijklmnopqrstuvwxyz234567=",bitsPerChar:5,caseInsensitive:!0}),Ct=u({prefix:"C",name:"base32padupper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",bitsPerChar:5,caseInsensitive:!0}),Dt=u({prefix:"v",name:"base32hex",alphabet:"0123456789abcdefghijklmnopqrstuv",bitsPerChar:5,caseInsensitive:!0}),St=u({prefix:"V",name:"base32hexupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV",bitsPerChar:5,caseInsensitive:!0}),Tt=u({prefix:"t",name:"base32hexpad",alphabet:"0123456789abcdefghijklmnopqrstuv=",bitsPerChar:5,caseInsensitive:!0}),Nt=u({prefix:"T",name:"base32hexpadupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV=",bitsPerChar:5,caseInsensitive:!0}),It=u({prefix:"h",name:"base32z",alphabet:"ybndrfg8ejkmcpqxot1uwisza345h769",bitsPerChar:5});var ce={};p(ce,{base36:()=>V,base36upper:()=>Lt});var V=T({prefix:"k",name:"base36",alphabet:"0123456789abcdefghijklmnopqrstuvwxyz",caseInsensitive:!0}),Lt=T({prefix:"K",name:"base36upper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",caseInsensitive:!0});var he={};p(he,{base58btc:()=>x,base58flickr:()=>Ut});var x=T({name:"base58btc",prefix:"z",alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"}),Ut=T({name:"base58flickr",prefix:"Z",alphabet:"123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"});var fe={};p(fe,{base64:()=>Mt,base64pad:()=>Rt,base64url:()=>zt,base64urlpad:()=>$t});var Mt=u({prefix:"m",name:"base64",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",bitsPerChar:6}),Rt=u({prefix:"M",name:"base64pad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",bitsPerChar:6}),zt=u({prefix:"u",name:"base64url",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",bitsPerChar:6}),$t=u({prefix:"U",name:"base64urlpad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=",bitsPerChar:6});var ue={};p(ue,{base8:()=>Ot});var Ot=u({prefix:"7",name:"base8",alphabet:"01234567",bitsPerChar:3});var de={};p(de,{identity:()=>kt});var kt=U({prefix:"\0",name:"identity",encode:r=>Se(g(r)),decode:r=>g(De(r))});var qr=new TextEncoder,Xr=new TextDecoder;var pe={};p(pe,{identity:()=>ir});var Ft=Re,Ue=128,_t=127,Vt=~_t,qt=Math.pow(2,31);function Re(r,e,t){e=e||[],t=t||0;for(var n=t;r>=qt;)e[t++]=r&255|Ue,r/=128;for(;r&Vt;)e[t++]=r&255|Ue,r>>>=7;return e[t]=r|0,Re.bytes=t-n+1,e}var Xt=le,Qt=128,Me=127;function le(r,n){var t=0,n=n||0,s=0,o=n,i,c=r.length;do{if(o>=c)throw le.bytes=0,new RangeError("Could not decode varint");i=r[o++],t+=s<28?(i&Me)<<s:(i&Me)*Math.pow(2,s),s+=7}while(i>=Qt);return le.bytes=o-n,t}var Ht=Math.pow(2,7),Jt=Math.pow(2,14),jt=Math.pow(2,21),Gt=Math.pow(2,28),Wt=Math.pow(2,35),Yt=Math.pow(2,42),Kt=Math.pow(2,49),Zt=Math.pow(2,56),er=Math.pow(2,63),tr=function(r){return r<Ht?1:r<Jt?2:r<jt?3:r<Gt?4:r<Wt?5:r<Yt?6:r<Kt?7:r<Zt?8:r<er?9:10},rr={encode:Ft,decode:Xt,encodingLength:tr},nr=rr,q=nr;function X(r,e=0){return[q.decode(r,e),q.decode.bytes]}function R(r,e,t=0){return q.encode(r,e,t),e}function z(r){return q.encodingLength(r)}function O(r,e){let t=e.byteLength,n=z(r),s=n+z(t),o=new Uint8Array(s+t);return R(r,o,0),R(t,o,n),o.set(e,s),new $(r,t,e,o)}function W(r){let e=g(r),[t,n]=X(e),[s,o]=X(e.subarray(n)),i=e.subarray(n+o);if(i.byteLength!==s)throw new Error("Incorrect length");return new $(t,s,i,e)}function ze(r,e){if(r===e)return!0;{let t=e;return r.code===t.code&&r.size===t.size&&t.bytes instanceof Uint8Array&&Ce(r.bytes,t.bytes)}}var $=class{code;size;digest;bytes;constructor(e,t,n,s){this.code=e,this.size=t,this.digest=L(n),this.bytes=L(s)}};var $e=0,sr="identity",Oe=g;function or(r,e){if(e?.truncate!=null&&e.truncate!==r.byteLength){if(e.truncate<0||e.truncate>r.byteLength)throw new Error(`Invalid truncate option, must be less than or equal to ${r.byteLength}`);r=r.subarray(0,e.truncate)}return O($e,Oe(r))}var ir={code:$e,name:sr,encode:Oe,digest:or};var xe={};p(xe,{sha256:()=>cr,sha512:()=>hr});var ar=20;function ge({name:r,code:e,encode:t,minDigestLength:n,maxDigestLength:s}){return new me(r,e,t,n,s)}var me=class{name;code;encode;minDigestLength;maxDigestLength;constructor(e,t,n,s,o){this.name=e,this.code=t,this.encode=n,this.minDigestLength=s??ar,this.maxDigestLength=o}digest(e,t){if(t?.truncate!=null){if(t.truncate<this.minDigestLength)throw new Error(`Invalid truncate option, must be greater than or equal to ${this.minDigestLength}`);if(this.maxDigestLength!=null&&t.truncate>this.maxDigestLength)throw new Error(`Invalid truncate option, must be less than or equal to ${this.maxDigestLength}`)}if(e instanceof Uint8Array){let n=this.encode(e);return n instanceof Uint8Array?ke(n,this.code,t?.truncate):n.then(s=>ke(s,this.code,t?.truncate))}else throw Error("Unknown type, must be binary type")}};function ke(r,e,t){if(t!=null&&t!==r.byteLength){if(t>r.byteLength)throw new Error(`Invalid truncate option, must be less than or equal to ${r.byteLength}`);r=r.subarray(0,t)}return O(e,r)}function Be(r){return async e=>new Uint8Array(await crypto.subtle.digest(r,e))}var cr=ge({name:"sha2-256",code:18,encode:Be("SHA-256")}),hr=ge({name:"sha2-512",code:19,encode:Be("SHA-512")});function Fe(r,e){let{bytes:t,version:n}=r;return n===0?ur(t,we(r),e??x.encoder):dr(t,we(r),e??M.encoder)}var _e=new WeakMap;function we(r){let e=_e.get(r);if(e==null){let t=new Map;return _e.set(r,t),t}return e}var N=class r{code;version;multihash;bytes;"/";constructor(e,t,n,s){this.code=t,this.version=e,this.multihash=n,this.bytes=L(s),this["/"]=this.bytes}get asCID(){return this}get byteOffset(){return this.bytes.byteOffset}get byteLength(){return this.bytes.byteLength}toV0(){switch(this.version){case 0:return this;case 1:{let{code:e,multihash:t}=this;if(e!==Q)throw new Error("Cannot convert a non dag-pb CID to CIDv0");if(t.code!==lr)throw new Error("Cannot convert non sha2-256 multihash CID to CIDv0");return r.createV0(t)}default:throw Error(`Can not convert CID version ${this.version} to version 0. This is a bug please report`)}}toV1(){switch(this.version){case 0:{let{code:e,digest:t}=this.multihash,n=O(e,t);return r.createV1(this.code,n)}case 1:return this;default:throw Error(`Can not convert CID version ${this.version} to version 1. This is a bug please report`)}}equals(e){return r.equals(this,e)}static equals(e,t){let n=t;return n!=null&&e.code===n.code&&e.version===n.version&&ze(e.multihash,n.multihash)}toString(e){return Fe(this,e)}toJSON(){return{"/":Fe(this)}}link(){return this}[Symbol.toStringTag]="CID";[Symbol.for("nodejs.util.inspect.custom")](){return`CID(${this.toString()})`}static asCID(e){if(e==null)return null;let t=e;if(t instanceof r)return t;if(t["/"]!=null&&t["/"]===t.bytes||t.asCID===t){let{version:n,code:s,multihash:o,bytes:i}=t;return new r(n,s,o,i??Ve(n,s,o.bytes))}else if(t[pr]===!0){let{version:n,multihash:s,code:o}=t,i=W(s);return r.create(n,o,i)}else return null}static create(e,t,n){if(typeof t!="number")throw new Error("String codecs are no longer supported");if(!(n.bytes instanceof Uint8Array))throw new Error("Invalid digest");switch(e){case 0:{if(t!==Q)throw new Error(`Version 0 CID must use dag-pb (code: ${Q}) block encoding`);return new r(e,t,n,n.bytes)}case 1:{let s=Ve(e,t,n.bytes);return new r(e,t,n,s)}default:throw new Error("Invalid version")}}static createV0(e){return r.create(0,Q,e)}static createV1(e,t){return r.create(1,e,t)}static decode(e){let[t,n]=r.decodeFirst(e);if(n.length!==0)throw new Error("Incorrect length");return t}static decodeFirst(e){let t=r.inspectBytes(e),n=t.size-t.multihashSize,s=g(e.subarray(n,n+t.multihashSize));if(s.byteLength!==t.multihashSize)throw new Error("Incorrect length");let o=s.subarray(t.multihashSize-t.digestSize),i=new $(t.multihashCode,t.digestSize,o,s);return[t.version===0?r.createV0(i):r.createV1(t.codec,i),e.subarray(t.size)]}static inspectBytes(e){let t=0,n=()=>{let[D,F]=X(e.subarray(t));return t+=F,D},s=n(),o=Q;if(s===18?(s=0,t=0):o=n(),s!==0&&s!==1)throw new RangeError(`Invalid CID version ${s}`);let i=t,c=n(),d=n(),f=t+d,a=f-i;return{version:s,codec:o,multihashCode:c,digestSize:d,multihashSize:a,size:f}}static parse(e,t){let[n,s]=fr(e,t),o=r.decode(s);if(o.version===0&&e[0]!=="Q")throw Error("Version 0 CID string must not include multibase prefix");return we(o).set(n,e),o}};function fr(r,e){switch(r[0]){case"Q":{let t=e??x;return[x.prefix,t.decode(`${x.prefix}${r}`)]}case x.prefix:{let t=e??x;return[x.prefix,t.decode(r)]}case M.prefix:{let t=e??M;return[M.prefix,t.decode(r)]}case V.prefix:{let t=e??V;return[V.prefix,t.decode(r)]}default:{if(e==null)throw Error("To parse non base32, base36 or base58btc encoded CID multibase decoder must be provided");return[r[0],e.decode(r)]}}}function ur(r,e,t){let{prefix:n}=t;if(n!==x.prefix)throw Error(`Cannot string encode V0 in ${t.name} encoding`);let s=e.get(n);if(s==null){let o=t.encode(r).slice(1);return e.set(n,o),o}else return s}function dr(r,e,t){let{prefix:n}=t,s=e.get(n);if(s==null){let o=t.encode(r);return e.set(n,o),o}else return s}var Q=112,lr=18;function Ve(r,e,t){let n=z(r),s=n+z(e),o=new Uint8Array(s+t.byteLength);return R(r,o,0),R(e,o,n),o.set(t,s),o}var pr=Symbol.for("@ipld/js-cid/CID");var be={...de,...oe,...ue,...ne,...se,...ae,...ce,...he,...fe,...ie},ln={...xe,...pe};function qe(r=0){return new Uint8Array(r)}function Qe(r,e,t,n){return{name:r,prefix:e,encoder:{name:r,prefix:e,encode:t},decoder:{decode:n}}}var Xe=Qe("utf8","u",r=>"u"+new TextDecoder("utf8").decode(r),r=>new TextEncoder().encode(r.substring(1))),ye=Qe("ascii","a",r=>{let e="a";for(let t=0;t<r.length;t++)e+=String.fromCharCode(r[t]);return e},r=>{r=r.substring(1);let e=qe(r.length);for(let t=0;t<r.length;t++)e[t]=r.charCodeAt(t);return e}),wn={utf8:Xe,"utf-8":Xe,hex:be.base16,latin1:ye,ascii:ye,binary:ye,...be};var wr=st(Je(),1);var C;(function(r){r[r.A=1]="A",r[r.CNAME=5]="CNAME",r[r.TXT=16]="TXT",r[r.AAAA=28]="AAAA"})(C||(C={}));var je=32;var P=class extends Map{#r=0;#e=new Map;#t=new Map;#s;#i;#o;constructor(e={}){if(super(),!(e.maxSize&&e.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");if(typeof e.maxAge=="number"&&e.maxAge===0)throw new TypeError("`maxAge` must be a number greater than 0");this.#s=e.maxSize,this.#i=e.maxAge||Number.POSITIVE_INFINITY,this.#o=e.onEviction}get __oldCache(){return this.#t}#a(e){if(typeof this.#o=="function")for(let[t,n]of e)this.#o(t,n.value)}#n(e,t){return typeof t.expiry=="number"&&t.expiry<=Date.now()?(typeof this.#o=="function"&&this.#o(e,t.value),this.delete(e)):!1}#d(e,t){if(this.#n(e,t)===!1)return t.value}#h(e,t){return t.expiry?this.#d(e,t):t.value}#f(e,t){let n=t.get(e);return this.#h(e,n)}#u(e,t){this.#e.set(e,t),this.#r++,this.#r>=this.#s&&(this.#r=0,this.#a(this.#t),this.#t=this.#e,this.#e=new Map)}#l(e,t){this.#t.delete(e),this.#u(e,t)}*#c(){for(let e of this.#t){let[t,n]=e;this.#e.has(t)||this.#n(t,n)===!1&&(yield e)}for(let e of this.#e){let[t,n]=e;this.#n(t,n)===!1&&(yield e)}}get(e){if(this.#e.has(e)){let t=this.#e.get(e);return this.#h(e,t)}if(this.#t.has(e)){let t=this.#t.get(e);if(this.#n(e,t)===!1)return this.#l(e,t),t.value}}set(e,t,{maxAge:n=this.#i}={}){let s=typeof n=="number"&&n!==Number.POSITIVE_INFINITY?Date.now()+n:void 0;return this.#e.has(e)?this.#e.set(e,{value:t,expiry:s}):this.#u(e,{value:t,expiry:s}),this}has(e){return this.#e.has(e)?!this.#n(e,this.#e.get(e)):this.#t.has(e)?!this.#n(e,this.#t.get(e)):!1}peek(e){if(this.#e.has(e))return this.#f(e,this.#e);if(this.#t.has(e))return this.#f(e,this.#t)}expiresIn(e){let t=this.#e.get(e)??this.#t.get(e);if(t)return t.expiry?t.expiry-Date.now():Number.POSITIVE_INFINITY}delete(e){let t=this.#e.delete(e);return t&&this.#r--,this.#t.delete(e)||t}clear(){this.#e.clear(),this.#t.clear(),this.#r=0}resize(e){if(!(e&&e>0))throw new TypeError("`maxSize` must be a number greater than 0");let t=[...this.#c()],n=t.length-e;n<0?(this.#e=new Map(t),this.#t=new Map,this.#r=t.length):(n>0&&this.#a(t.slice(0,n)),this.#t=new Map(t.slice(n)),this.#e=new Map,this.#r=0),this.#s=e}evict(e=1){let t=Number(e);if(!t||t<=0)return;let n=[...this.#c()],s=Math.trunc(Math.min(t,Math.max(n.length-1,0)));s<=0||(this.#a(n.slice(0,s)),this.#t=new Map(n.slice(s)),this.#e=new Map,this.#r=0)}*keys(){for(let[e]of this)yield e}*values(){for(let[,e]of this)yield e}*[Symbol.iterator](){for(let e of this.#e){let[t,n]=e;this.#n(t,n)===!1&&(yield[t,n.value])}for(let e of this.#t){let[t,n]=e;this.#e.has(t)||this.#n(t,n)===!1&&(yield[t,n.value])}}*entriesDescending(){let e=[...this.#e];for(let t=e.length-1;t>=0;--t){let n=e[t],[s,o]=n;this.#n(s,o)===!1&&(yield[s,o.value])}e=[...this.#t];for(let t=e.length-1;t>=0;--t){let n=e[t],[s,o]=n;this.#e.has(s)||this.#n(s,o)===!1&&(yield[s,o.value])}}*entriesAscending(){for(let[e,t]of this.#c())yield[e,t.value]}get size(){if(!this.#r)return this.#t.size;let e=0;for(let t of this.#t.keys())this.#e.has(t)||e++;return Math.min(this.#r+e,this.#s)}get maxSize(){return this.#s}get maxAge(){return this.#i}entries(){return this.entriesAscending()}forEach(e,t=this){for(let[n,s]of this.entriesAscending())e.call(t,s,n,this)}get[Symbol.toStringTag](){return"QuickLRU"}toString(){return`QuickLRU(${this.size}/${this.maxSize})`}[Symbol.for("nodejs.util.inspect.custom")](){return this.toString()}};var Y=class extends Error{static name="DNSLinkNotFoundError";constructor(e="DNSLink not found"){super(e),this.name="DNSLinkNotFoundError"}},B=class extends Error{static name="InvalidNamespaceError";constructor(e="Invalid namespace"){super(e),this.name="InvalidNamespaceError"}};var Ge=(r,e)=>{let[,t,n,...s]=r.split("/");if(t!=="ipfs")throw new B(`Namespace ${t} was not "ipfs"`);return{namespace:"ipfs",cid:N.parse(n),path:s.length>0?`/${s.join("/")}`:"",answer:e}};var We=(r,e)=>{let[,t,n,...s]=r.split("/");if(t!=="ipns")throw new B(`Namespace ${t} was not "ipns"`);try{return{namespace:"ipns",value:br(n),path:s.length>0?`/${s.join("/")}`:"",answer:e}}catch{return{namespace:"dnslink",value:n,path:s.length>0?`/${s.join("/")}`:"",answer:e}}};function br(r){try{return W(x.baseDecode(r))}catch{return N.parse(r).multihash}}var K=class{dns;log;namespaces;cache;cacheMaxAnswers;constructor(e,t={}){this.dns=e.dns,this.log=e.logger.forComponent("helia:dnslink"),this.namespaces={ipfs:Ge,ipns:We,...t.namespaces},this.cache=new P({maxSize:t.cacheSize??1e3,maxAge:t.cacheMaxAge??3e4}),this.cacheMaxAnswers=t.cacheMaxAnswers??10}async resolve(e,t={}){if(t.nocache!==!0){let i=this.cache.get(e);if(i!=null){let c=[...i.values()];if(c.length>0)return c}}let n=await this.recursiveResolveDomain(e,t.maxRecursiveDepth??je,t),s=new P({maxSize:this.cacheMaxAnswers});n.forEach((i,c)=>{s.set(c,i,{maxAge:i.answer.TTL*1e3})});let o=n.reduce((i,c)=>{let d=c.answer.TTL*1e3;return d>i?d:i},0);return this.cache.maxAge<o&&(o=this.cache.maxAge),this.cache.set(e,s,{maxAge:o}),n}async recursiveResolveDomain(e,t,n={}){if(t===0)throw new Error("recursion limit exceeded");e.startsWith("_dnslink.")||(e=`_dnslink.${e}`);try{return await this.recursiveResolveDnslink(e,t,n)}catch(s){if(s.code!=="ENOTFOUND"&&s.code!=="ENODATA"&&s.name!=="DNSLinkNotFoundError"&&s.name!=="NotFoundError")throw s;return e.startsWith("_dnslink.")?e=e.replace("_dnslink.",""):e=`_dnslink.${e}`,this.recursiveResolveDnslink(e,t,n)}}async recursiveResolveDnslink(e,t,n={}){if(t===0)throw new Error("recursion limit exceeded");this.log("query %s for TXT and CNAME records",e);let o=((await this.dns.query(e,{...n,types:[C.TXT]}))?.Answer??[]).sort((f,a)=>f.data.localeCompare(a.data));this.log("found %d TXT records for %s",o.length,e);let i=[];for(let f of o)try{let a=f.data;if(a.startsWith('"')&&a.endsWith('"')&&(a=a.substring(1,a.length-1)),!a.startsWith("dnslink="))continue;this.log("%s TXT %s",f.name,a),a=a.replace("dnslink=","");let[,D,F]=a.split("/");if(D==="dnslink"){i.push(...await this.recursiveResolveDomain(F,t-1,n));continue}let _=this.namespaces[D];if(_==null){this.log('unknown protocol "%s" in DNSLink record for domain: %s',D,e);continue}let H=_(a,f);if(H.namespace==="dnslink"){i.push(...await this.recursiveResolveDomain(H.value,t-1,n));continue}i.push(_(a,f))}catch(a){this.log.error("could not parse DNS link record for domain %s, %s - %e",e,f.data,a)}if(i.length>0)return i;this.log("no DNSLink records found for %s, falling back to CNAME",e);let d=((await this.dns.query(e,{...n,types:[C.CNAME]}))?.Answer??[]).sort((f,a)=>f.data.localeCompare(a.data));this.log("found %d CNAME records for %s",d.length,e);for(let f of d)try{return await this.recursiveResolveDomain(f.data,t-1,n)}catch(a){this.log.error("domain %s cname %s had no DNSLink records - %e",e,f.data,a)}throw new Y(`No DNSLink records found for domain: ${e}`)}};function yr(r,e={}){return new K(r,e)}return ot(vr);})();
3
3
  return HeliaDnslink}));
4
4
  //# sourceMappingURL=index.min.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../node_modules/hashlru/index.js", "../src/index.ts", "../../../node_modules/multiformats/src/bases/base10.ts", "../../../node_modules/multiformats/src/bytes.ts", "../../../node_modules/multiformats/src/vendor/base-x.js", "../../../node_modules/multiformats/src/bases/base.ts", "../../../node_modules/multiformats/src/bases/base16.ts", "../../../node_modules/multiformats/src/bases/base2.ts", "../../../node_modules/multiformats/src/bases/base256emoji.ts", "../../../node_modules/multiformats/src/bases/base32.ts", "../../../node_modules/multiformats/src/bases/base36.ts", "../../../node_modules/multiformats/src/bases/base58.ts", "../../../node_modules/multiformats/src/bases/base64.ts", "../../../node_modules/multiformats/src/bases/base8.ts", "../../../node_modules/multiformats/src/bases/identity.ts", "../../../node_modules/multiformats/src/codecs/json.ts", "../../../node_modules/multiformats/src/hashes/identity.ts", "../../../node_modules/multiformats/src/vendor/varint.js", "../../../node_modules/multiformats/src/varint.ts", "../../../node_modules/multiformats/src/hashes/digest.ts", "../../../node_modules/multiformats/src/hashes/sha2-browser.ts", "../../../node_modules/multiformats/src/hashes/hasher.ts", "../../../node_modules/multiformats/src/cid.ts", "../../../node_modules/multiformats/src/basics.ts", "../../../node_modules/uint8arrays/src/alloc.ts", "../../../node_modules/uint8arrays/src/util/bases.ts", "../../../node_modules/@multiformats/dns/src/utils/cache.ts", "../../../node_modules/@multiformats/dns/src/index.ts", "../node_modules/quick-lru/index.js", "../src/errors.ts", "../src/namespaces/ipfs.ts", "../src/namespaces/ipns.ts", "../src/dnslink.ts"],
4
- "sourcesContent": ["module.exports = function (max) {\n\n if (!max) throw Error('hashlru must have a max value, of type number, greater than 0')\n\n var size = 0, cache = Object.create(null), _cache = Object.create(null)\n\n function update (key, value) {\n cache[key] = value\n size ++\n if(size >= max) {\n size = 0\n _cache = cache\n cache = Object.create(null)\n }\n }\n\n return {\n has: function (key) {\n return cache[key] !== undefined || _cache[key] !== undefined\n },\n remove: function (key) {\n if(cache[key] !== undefined)\n cache[key] = undefined\n if(_cache[key] !== undefined)\n _cache[key] = undefined\n },\n get: function (key) {\n var v = cache[key]\n if(v !== undefined) return v\n if((v = _cache[key]) !== undefined) {\n update(key, v)\n return v\n }\n },\n set: function (key, value) {\n if(cache[key] !== undefined) cache[key] = value\n else update(key, value)\n },\n clear: function () {\n cache = Object.create(null)\n _cache = Object.create(null)\n }\n }\n}\n\n\n\n\n\n\n\n", "/**\n * @packageDocumentation\n *\n * [DNSLink](https://dnslink.dev/) operations using a Helia node.\n *\n * @example Using custom DNS over HTTPS resolvers\n *\n * To use custom resolvers, configure Helia's `dns` option:\n *\n * ```TypeScript\n * import { createHelia } from 'helia'\n * import { dnsLink } from '@helia/dnslink'\n * import { dns } from '@multiformats/dns'\n * import { dnsOverHttps } from '@multiformats/dns/resolvers'\n *\n * const node = await createHelia({\n * dns: dns({\n * resolvers: {\n * '.': dnsOverHttps('https://private-dns-server.me/dns-query')\n * }\n * })\n * }).start()\n * const name = dnsLink(node)\n *\n * const result = name.resolve('some-domain-with-dnslink-entry.com')\n * ```\n *\n * @example Resolving a domain with a dnslink entry\n *\n * Calling `resolve` with the `@helia/dnslink` instance:\n *\n * ```TypeScript\n * // resolve a CID from a TXT record in a DNS zone file, using the default\n * // resolver for the current platform eg:\n * // > dig _dnslink.ipfs.tech TXT\n * // ;; ANSWER SECTION:\n * // _dnslink.ipfs.tech. 60 IN CNAME _dnslink.ipfs-tech.on.fleek.co.\n * // _dnslink.ipfs-tech.on.fleek.co. 120 IN TXT \"dnslink=/ipfs/bafybe...\"\n *\n * import { createHelia } from 'helia'\n * import { dnsLink } from '@helia/dnslink'\n *\n * const node = await createHelia().start()\n * const name = dnsLink(node)\n *\n * const [{ answer }] = await name.resolve('blog.ipfs.tech')\n *\n * console.info(answer)\n * // { data: '/ipfs/bafybe...' }\n * ```\n *\n * @example Using DNS-Over-HTTPS\n *\n * This example uses the Mozilla provided RFC 1035 DNS over HTTPS service. This\n * uses binary DNS records so requires extra dependencies to process the\n * response which can increase browser bundle sizes.\n *\n * If this is a concern, use the DNS-JSON-Over-HTTPS resolver instead.\n *\n * ```TypeScript\n * import { createHelia } from 'helia'\n * import { dnsLink } from '@helia/dnslink'\n * import { dns } from '@multiformats/dns'\n * import { dnsOverHttps } from '@multiformats/dns/resolvers'\n *\n * const node = await createHelia({\n * dns: dns({\n * resolvers: {\n * '.': dnsOverHttps('https://mozilla.cloudflare-dns.com/dns-query')\n * }\n * })\n * }).start()\n * const name = dnsLink(node)\n *\n * const result = await name.resolve('blog.ipfs.tech')\n * ```\n *\n * @example Using DNS-JSON-Over-HTTPS\n *\n * DNS-JSON-Over-HTTPS resolvers use the RFC 8427 `application/dns-json` and can\n * result in a smaller browser bundle due to the response being plain JSON.\n *\n * ```TypeScript\n * import { createHelia } from 'helia'\n * import { dnsLink } from '@helia/dnslink'\n * import { dns } from '@multiformats/dns'\n * import { dnsJsonOverHttps } from '@multiformats/dns/resolvers'\n *\n * const node = await createHelia({\n * dns: dns({\n * resolvers: {\n * '.': dnsJsonOverHttps('https://mozilla.cloudflare-dns.com/dns-query')\n * }\n * })\n * }).start()\n * const name = dnsLink(node)\n *\n * const result = await name.resolve('blog.ipfs.tech')\n * ```\n */\n\nimport { DNSLink as DNSLinkClass } from './dnslink.ts'\nimport type { AbortOptions, ComponentLogger } from '@libp2p/interface'\nimport type { Answer, DNS, ResolveDnsProgressEvents as ResolveProgressEvents } from '@multiformats/dns'\nimport type { CID, MultihashDigest } from 'multiformats/cid'\nimport type { ProgressOptions } from 'progress-events'\n\nexport type { ResolveProgressEvents }\n\nexport interface ResolveDNSLinkOptions extends AbortOptions, ProgressOptions<ResolveProgressEvents> {\n /**\n * Do not query the network for the IPNS record\n *\n * @default false\n */\n offline?: boolean\n\n /**\n * Do not use cached DNS entries\n *\n * @default false\n */\n nocache?: boolean\n\n /**\n * When resolving DNSLink records that resolve to other DNSLink records, limit\n * how many times we will recursively resolve them.\n *\n * @default 32\n */\n maxRecursiveDepth?: number\n}\n\nexport interface DNSLinkIPFSResult {\n /**\n * The resolved record\n */\n answer: Answer\n\n /**\n * The IPFS namespace\n */\n namespace: 'ipfs'\n\n /**\n * The resolved value\n */\n cid: CID\n\n /**\n * If the resolved value is an IPFS path, it will be present here\n */\n path: string\n}\n\nexport interface DNSLinkIPNSResult {\n /**\n * The resolved record\n */\n answer: Answer\n\n /**\n * The IPNS namespace\n */\n namespace: 'ipns'\n\n /**\n * The resolved value\n */\n value: MultihashDigest\n\n /**\n * If the resolved value is an IPFS path, it will be present here\n */\n path: string\n}\n\nexport interface DNSLinkDNSLinkResult {\n /**\n * The resolved record\n */\n answer: Answer\n\n /**\n * The IPNS namespace\n */\n namespace: 'dnslink'\n\n /**\n * The resolved value\n */\n value: string\n\n /**\n * If the resolved value is an IPFS path, it will be present here\n */\n path: string\n}\n\nexport interface DNSLinkResolveResult {\n /**\n * The resolved record\n */\n answer: Answer\n\n /**\n * The namespace\n */\n namespace: string\n}\n\nexport interface DNSLinkParser<T extends DNSLinkResolveResult> {\n /**\n * Return a result parsed from a DNSLink value\n */\n (value: string, answer: Answer): T\n}\n\nexport interface DNSLink<DNSLinkResolveResults extends DNSLinkResolveResult = DNSLinkIPFSResult | DNSLinkIPNSResult> {\n /**\n * Resolve a CID from a dns-link style IPNS record\n *\n * @example\n *\n * ```TypeScript\n * import { createHelia } from 'helia'\n * import { dnsLink } from '@helia/dnslink'\n *\n * const helia = await createHelia()\n * const name = dnsLink(helia)\n *\n * const result = await name.resolve('ipfs.io', {\n * signal: AbortSignal.timeout(5_000)\n * })\n *\n * console.info(result) // { answer: ..., value: ... }\n * ```\n */\n resolve(domain: string, options?: ResolveDNSLinkOptions): Promise<Array<DNSLinkResolveResults | DNSLinkIPFSResult | DNSLinkIPNSResult>>\n}\n\nexport interface DNSLinkComponents {\n dns: DNS\n logger: ComponentLogger\n}\n\nexport interface DNSLinkOptions<Namespaces extends Record<string, DNSLinkParser<any>> = Record<string, DNSLinkParser<any>>> {\n /**\n * By default `/ipfs/...`, `/ipns/...` and `/dnslink/...` record values are\n * supported - to support other prefixes pass other value parsers here\n */\n namespaces?: Namespaces\n\n /**\n * How many DNSLink lookups to cache in memory\n *\n * @default 1_000\n */\n cacheSize?: number\n\n /**\n * The maximum number of Answers to cache for each domain\n *\n * @default 10\n */\n cacheMaxAnswers?: number\n\n /**\n * By default the DNS TTL will be used to calculate when a DNSLink lookup\n * should be evicted from the cache, unless one is not available in which case\n * this number of ms will be used.\n *\n * @default 30_000\n */\n cacheMaxAge?: number\n}\n\nexport function dnsLink <R extends DNSLinkResolveResult, T extends Record<string, DNSLinkParser<R>>> (components: DNSLinkComponents, options: DNSLinkOptions<T>): DNSLink<ReturnType<T[keyof T]>>\nexport function dnsLink (components: DNSLinkComponents, options?: DNSLinkOptions): DNSLink\nexport function dnsLink (components: DNSLinkComponents, options: DNSLinkOptions = {}): DNSLink {\n return new DNSLinkClass(components, options)\n}\n", "import { baseX } from './base.ts'\n\nexport const base10 = baseX({\n prefix: '9',\n name: 'base10',\n alphabet: '0123456789'\n})\n", "export const empty = new Uint8Array(0)\n\nexport function toHex (d: Uint8Array): string {\n return d.reduce((hex, byte) => hex + byte.toString(16).padStart(2, '0'), '')\n}\n\nexport function fromHex (hex: string): Uint8Array<ArrayBuffer> {\n const hexes = hex.match(/../g)\n return hexes != null ? new Uint8Array(hexes.map(b => parseInt(b, 16))) : empty\n}\n\nexport function equals (aa: Uint8Array, bb: Uint8Array): boolean {\n if (aa === bb) { return true }\n if (aa.byteLength !== bb.byteLength) {\n return false\n }\n\n for (let ii = 0; ii < aa.byteLength; ii++) {\n if (aa[ii] !== bb[ii]) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * Normalize binary input to a plain `Uint8Array` backed by an `ArrayBuffer`.\n *\n * Returns the input itself when it is already a plain `Uint8Array` over an\n * `ArrayBuffer`, otherwise a fresh view (or, for `SharedArrayBuffer`-backed\n * input, a copy) over the same bytes.\n *\n * Throws if input is not a recognised binary type.\n */\nexport function coerce (o: ArrayBufferView | ArrayBuffer | Uint8Array): Uint8Array<ArrayBuffer> {\n if (o instanceof Uint8Array && o.constructor.name === 'Uint8Array') {\n return toArrayBufferBackedArray(o)\n }\n if (o instanceof ArrayBuffer) {\n return new Uint8Array(o)\n }\n if (ArrayBuffer.isView(o)) {\n return toArrayBufferBackedArray(new Uint8Array(o.buffer, o.byteOffset, o.byteLength))\n }\n throw new Error('Unknown type, must be binary type')\n}\n\nexport function isBinary (o: unknown): o is ArrayBuffer | ArrayBufferView {\n return o instanceof ArrayBuffer || ArrayBuffer.isView(o)\n}\n\n/**\n * Convert the passed string into a byte array, constraining each character\n * value to a single byte\n */\nexport function fromString (str: string): Uint8Array<ArrayBuffer> {\n const output = new Uint8Array(str.length)\n\n for (let i = 0; i < str.length; i++) {\n output[i] = str.charCodeAt(i)\n }\n\n return output\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nconst MAX_ARGUMENTS_LENGTH = 0x1000\n\n/**\n * Convert the passed byte array to a string, interpreting each byte as a single\n * character\n */\nexport function toString (b: Uint8Array): string {\n const len = b.length\n\n if (len <= MAX_ARGUMENTS_LENGTH) {\n // @ts-expect-error cannot ordinarily apply a Uint8Array\n return String.fromCharCode.apply(String, b) // avoid extra subarray()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n let res = ''\n let i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n // @ts-expect-error cannot ordinarily apply a Uint8Array\n b.subarray(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction isByteArrayWithArrayBuffer (b?: Uint8Array): b is Uint8Array<ArrayBuffer> {\n return b?.buffer instanceof ArrayBuffer\n}\n\n/**\n * Ensures `b` is backed by an ArrayBuffer - if not a new Uint8Array will be\n * created and the contents of `b` copied into it.\n */\nexport function toArrayBufferBackedArray (b: Uint8Array): Uint8Array<ArrayBuffer> {\n if (isByteArrayWithArrayBuffer(b)) {\n return b\n }\n\n return b.slice()\n}\n", "/* eslint-disable */\n// base-x encoding / decoding\n// Copyright (c) 2018 base-x contributors\n// Copyright (c) 2014-2018 The Bitcoin Core developers (base58.cpp)\n// Distributed under the MIT software license, see the accompanying\n// file LICENSE or http://www.opensource.org/licenses/mit-license.php.\n/**\n * @param {string} ALPHABET\n * @param {any} name\n * @param {boolean} [caseInsensitive]\n */\nfunction base (ALPHABET, name, caseInsensitive) {\n if (ALPHABET.length >= 255) { throw new TypeError('Alphabet too long') }\n var BASE_MAP = new Uint8Array(256);\n for (var j = 0; j < BASE_MAP.length; j++) {\n BASE_MAP[j] = 255;\n }\n for (var i = 0; i < ALPHABET.length; i++) {\n var x = ALPHABET.charAt(i);\n var xc = x.charCodeAt(0);\n if (BASE_MAP[xc] !== 255) { throw new TypeError(x + ' is ambiguous') }\n BASE_MAP[xc] = i;\n // For case-insensitive codecs, map the opposite case to the same index so\n // differently cased input decodes without errors (multibase spec).\n if (caseInsensitive) {\n var xl = x.toLowerCase().charCodeAt(0);\n var xu = x.toUpperCase().charCodeAt(0);\n if (xl !== xc) { BASE_MAP[xl] = i; }\n if (xu !== xc) { BASE_MAP[xu] = i; }\n }\n }\n var BASE = ALPHABET.length;\n var LEADER = ALPHABET.charAt(0);\n var FACTOR = Math.log(BASE) / Math.log(256); // log(BASE) / log(256), rounded up\n var iFACTOR = Math.log(256) / Math.log(BASE); // log(256) / log(BASE), rounded up\n /**\n * @param {any[] | Iterable<number>} source\n */\n function encode (source) {\n // @ts-ignore\n if (source instanceof Uint8Array) ; else if (ArrayBuffer.isView(source)) {\n source = new Uint8Array(source.buffer, source.byteOffset, source.byteLength);\n } else if (Array.isArray(source)) {\n source = Uint8Array.from(source);\n }\n if (!(source instanceof Uint8Array)) { throw new TypeError('Expected Uint8Array') }\n if (source.length === 0) { return '' }\n // Skip & count leading zeroes.\n var zeroes = 0;\n var length = 0;\n var pbegin = 0;\n var pend = source.length;\n while (pbegin !== pend && source[pbegin] === 0) {\n pbegin++;\n zeroes++;\n }\n // Allocate enough space in big-endian base58 representation.\n var size = ((pend - pbegin) * iFACTOR + 1) >>> 0;\n var b58 = new Uint8Array(size);\n // Process the bytes.\n while (pbegin !== pend) {\n var carry = source[pbegin];\n // Apply \"b58 = b58 * 256 + ch\".\n var i = 0;\n for (var it1 = size - 1; (carry !== 0 || i < length) && (it1 !== -1); it1--, i++) {\n carry += (256 * b58[it1]) >>> 0;\n b58[it1] = (carry % BASE) >>> 0;\n carry = (carry / BASE) >>> 0;\n }\n if (carry !== 0) { throw new Error('Non-zero carry') }\n length = i;\n pbegin++;\n }\n // Skip leading zeroes in base58 result.\n var it2 = size - length;\n while (it2 !== size && b58[it2] === 0) {\n it2++;\n }\n // Translate the result into a string.\n var str = LEADER.repeat(zeroes);\n for (; it2 < size; ++it2) { str += ALPHABET.charAt(b58[it2]); }\n return str\n }\n /**\n * @param {string | string[]} source\n */\n function decodeUnsafe (source) {\n if (typeof source !== 'string') { throw new TypeError('Expected String') }\n if (source.length === 0) { return new Uint8Array() }\n var psz = 0;\n // Skip leading spaces.\n if (source[psz] === ' ') { return }\n // Skip and count leading '1's.\n var zeroes = 0;\n var length = 0;\n while (source[psz] === LEADER) {\n zeroes++;\n psz++;\n }\n // Allocate enough space in big-endian base256 representation.\n var size = (((source.length - psz) * FACTOR) + 1) >>> 0; // log(58) / log(256), rounded up.\n var b256 = new Uint8Array(size);\n // Process the characters.\n while (source[psz]) {\n // Decode character\n var carry = BASE_MAP[source.charCodeAt(psz)];\n // Invalid character\n if (carry === 255) { return }\n var i = 0;\n for (var it3 = size - 1; (carry !== 0 || i < length) && (it3 !== -1); it3--, i++) {\n carry += (BASE * b256[it3]) >>> 0;\n b256[it3] = (carry % 256) >>> 0;\n carry = (carry / 256) >>> 0;\n }\n if (carry !== 0) { throw new Error('Non-zero carry') }\n length = i;\n psz++;\n }\n // Skip trailing spaces.\n if (source[psz] === ' ') { return }\n // Skip leading zeroes in b256.\n var it4 = size - length;\n while (it4 !== size && b256[it4] === 0) {\n it4++;\n }\n var vch = new Uint8Array(zeroes + (size - it4));\n var j = zeroes;\n while (it4 !== size) {\n vch[j++] = b256[it4++];\n }\n return vch\n }\n /**\n * @param {string | string[]} string\n */\n function decode (string) {\n var buffer = decodeUnsafe(string);\n if (buffer) { return buffer }\n throw new Error(`Non-${name} character`)\n }\n return {\n encode: encode,\n decodeUnsafe: decodeUnsafe,\n decode: decode\n }\n}\nvar src = base;\n\nvar _brrp__multiformats_scope_baseX = src;\n\nexport default _brrp__multiformats_scope_baseX;\n", "import { coerce } from '../bytes.ts'\nimport basex from '../vendor/base-x.js'\nimport type { BaseCodec, BaseDecoder, BaseEncoder, CombobaseDecoder, Multibase, MultibaseCodec, MultibaseDecoder, MultibaseEncoder, UnibaseDecoder } from './interface.ts'\n\ninterface EncodeFn { (bytes: Uint8Array): string }\ninterface DecodeFn { (text: string): Uint8Array<ArrayBuffer> }\n\n/**\n * Class represents both BaseEncoder and MultibaseEncoder meaning it\n * can be used to encode to multibase or base encode without multibase\n * prefix.\n */\nclass Encoder<Base extends string, Prefix extends string> implements MultibaseEncoder<Prefix>, BaseEncoder {\n readonly name: Base\n readonly prefix: Prefix\n readonly baseEncode: EncodeFn\n\n constructor (name: Base, prefix: Prefix, baseEncode: EncodeFn) {\n this.name = name\n this.prefix = prefix\n this.baseEncode = baseEncode\n }\n\n encode (bytes: Uint8Array): Multibase<Prefix> {\n if (bytes instanceof Uint8Array) {\n return `${this.prefix}${this.baseEncode(bytes)}`\n } else {\n throw Error('Unknown type, must be binary type')\n }\n }\n}\n\n/**\n * Class represents both BaseDecoder and MultibaseDecoder so it could be used\n * to decode multibases (with matching prefix) or just base decode strings\n * with corresponding base encoding.\n */\nclass Decoder<Base extends string, Prefix extends string> implements MultibaseDecoder<Prefix>, UnibaseDecoder<Prefix>, BaseDecoder {\n readonly name: Base\n readonly prefix: Prefix\n readonly baseDecode: DecodeFn\n private readonly prefixCodePoint: number\n\n constructor (name: Base, prefix: Prefix, baseDecode: DecodeFn) {\n this.name = name\n this.prefix = prefix\n const prefixCodePoint = prefix.codePointAt(0)\n /* c8 ignore next 3 */\n if (prefixCodePoint === undefined) {\n throw new Error('Invalid prefix character')\n }\n this.prefixCodePoint = prefixCodePoint\n this.baseDecode = baseDecode\n }\n\n decode (text: string): Uint8Array<ArrayBuffer> {\n if (typeof text === 'string') {\n if (text.codePointAt(0) !== this.prefixCodePoint) {\n throw Error(`Unable to decode multibase string ${JSON.stringify(text)}, ${this.name} decoder only supports inputs prefixed with ${this.prefix}`)\n }\n return this.baseDecode(text.slice(this.prefix.length))\n } else {\n throw Error('Can only multibase decode strings')\n }\n }\n\n or<OtherPrefix extends string> (decoder: UnibaseDecoder<OtherPrefix> | ComposedDecoder<OtherPrefix>): ComposedDecoder<Prefix | OtherPrefix> {\n return or(this, decoder)\n }\n}\n\ntype Decoders<Prefix extends string> = Record<Prefix, UnibaseDecoder<Prefix>>\n\nclass ComposedDecoder<Prefix extends string> implements MultibaseDecoder<Prefix>, CombobaseDecoder<Prefix> {\n readonly decoders: Decoders<Prefix>\n\n constructor (decoders: Decoders<Prefix>) {\n this.decoders = decoders\n }\n\n or <OtherPrefix extends string> (decoder: UnibaseDecoder<OtherPrefix> | ComposedDecoder<OtherPrefix>): ComposedDecoder<Prefix | OtherPrefix> {\n return or(this, decoder)\n }\n\n decode (input: string): Uint8Array<ArrayBuffer> {\n const prefix = input[0] as Prefix\n const decoder = this.decoders[prefix]\n if (decoder != null) {\n return decoder.decode(input)\n } else {\n throw RangeError(`Unable to decode multibase string ${JSON.stringify(input)}, only inputs prefixed with ${Object.keys(this.decoders)} are supported`)\n }\n }\n}\n\nexport function or <L extends string, R extends string> (left: UnibaseDecoder<L> | CombobaseDecoder<L>, right: UnibaseDecoder<R> | CombobaseDecoder<R>): ComposedDecoder<L | R> {\n return new ComposedDecoder({\n ...(left.decoders ?? { [(left as UnibaseDecoder<L>).prefix]: left }),\n ...(right.decoders ?? { [(right as UnibaseDecoder<R>).prefix]: right })\n } as Decoders<L | R>)\n}\n\nexport class Codec<Base extends string, Prefix extends string> implements MultibaseCodec<Prefix>, MultibaseEncoder<Prefix>, MultibaseDecoder<Prefix>, BaseCodec, BaseEncoder, BaseDecoder {\n readonly name: Base\n readonly prefix: Prefix\n readonly baseEncode: EncodeFn\n readonly baseDecode: DecodeFn\n readonly encoder: Encoder<Base, Prefix>\n readonly decoder: Decoder<Base, Prefix>\n\n constructor (name: Base, prefix: Prefix, baseEncode: EncodeFn, baseDecode: DecodeFn) {\n this.name = name\n this.prefix = prefix\n this.baseEncode = baseEncode\n this.baseDecode = baseDecode\n this.encoder = new Encoder(name, prefix, baseEncode)\n this.decoder = new Decoder(name, prefix, baseDecode)\n }\n\n encode (input: Uint8Array): string {\n return this.encoder.encode(input)\n }\n\n decode (input: string): Uint8Array<ArrayBuffer> {\n return this.decoder.decode(input)\n }\n}\n\nexport function from <Base extends string, Prefix extends string> ({ name, prefix, encode, decode }: { name: Base, prefix: Prefix, encode: EncodeFn, decode: DecodeFn }): Codec<Base, Prefix> {\n return new Codec(name, prefix, encode, decode)\n}\n\nexport function baseX <Base extends string, Prefix extends string> ({ name, prefix, alphabet, caseInsensitive = false }: { name: Base, prefix: Prefix, alphabet: string, caseInsensitive?: boolean }): Codec<Base, Prefix> {\n const { encode, decode } = basex(alphabet, name, caseInsensitive)\n return from({\n prefix,\n name,\n encode,\n decode: (text: string): Uint8Array<ArrayBuffer> => coerce(decode(text))\n })\n}\n\nfunction decode (string: string, alphabetIdx: Record<string, number>, bitsPerChar: number, name: string): Uint8Array<ArrayBuffer> {\n // Count the padding bytes:\n let end = string.length\n while (string[end - 1] === '=') {\n --end\n }\n\n // Allocate the output:\n const out = new Uint8Array((end * bitsPerChar / 8) | 0)\n\n // Parse the data:\n let bits = 0 // Number of bits currently in the buffer\n let buffer = 0 // Bits waiting to be written out, MSB first\n let written = 0 // Next byte to write\n for (let i = 0; i < end; ++i) {\n // Read one character from the string:\n const value = alphabetIdx[string[i]]\n if (value === undefined) {\n throw new SyntaxError(`Non-${name} character`)\n }\n\n // Append the bits to the buffer:\n buffer = (buffer << bitsPerChar) | value\n bits += bitsPerChar\n\n // Write out some bits if the buffer has a byte's worth:\n if (bits >= 8) {\n bits -= 8\n out[written++] = 0xff & (buffer >> bits)\n }\n }\n\n // Verify that we have received just enough bits:\n if (bits >= bitsPerChar || (0xff & (buffer << (8 - bits))) !== 0) {\n throw new SyntaxError('Unexpected end of data')\n }\n\n return out\n}\n\nfunction encode (data: Uint8Array, alphabet: string, bitsPerChar: number): string {\n const pad = alphabet[alphabet.length - 1] === '='\n const mask = (1 << bitsPerChar) - 1\n let out = ''\n\n let bits = 0 // Number of bits currently in the buffer\n let buffer = 0 // Bits waiting to be written out, MSB first\n for (let i = 0; i < data.length; ++i) {\n // Slurp data into the buffer:\n buffer = (buffer << 8) | data[i]\n bits += 8\n\n // Write out as much as we can:\n while (bits > bitsPerChar) {\n bits -= bitsPerChar\n out += alphabet[mask & (buffer >> bits)]\n }\n }\n\n // Partial character:\n if (bits !== 0) {\n out += alphabet[mask & (buffer << (bitsPerChar - bits))]\n }\n\n // Add padding characters until we hit a byte boundary:\n if (pad) {\n while (((out.length * bitsPerChar) & 7) !== 0) {\n out += '='\n }\n }\n\n return out\n}\n\nfunction createAlphabetIdx (alphabet: string, caseInsensitive: boolean): Record<string, number> {\n // Build the character lookup table:\n const alphabetIdx: Record<string, number> = {}\n for (let i = 0; i < alphabet.length; ++i) {\n alphabetIdx[alphabet[i]] = i\n // For case-insensitive codecs, map the opposite case to the same index so\n // differently cased input decodes without errors (multibase spec).\n if (caseInsensitive) {\n const lower = alphabet[i].toLowerCase()\n const upper = alphabet[i].toUpperCase()\n if (lower !== alphabet[i]) {\n alphabetIdx[lower] = i\n }\n if (upper !== alphabet[i]) {\n alphabetIdx[upper] = i\n }\n }\n }\n return alphabetIdx\n}\n\n/**\n * RFC4648 Factory\n */\nexport function rfc4648 <Base extends string, Prefix extends string> ({ name, prefix, bitsPerChar, alphabet, caseInsensitive = false }: { name: Base, prefix: Prefix, bitsPerChar: number, alphabet: string, caseInsensitive?: boolean }): Codec<Base, Prefix> {\n const alphabetIdx = createAlphabetIdx(alphabet, caseInsensitive)\n return from({\n prefix,\n name,\n encode (input: Uint8Array): string {\n return encode(input, alphabet, bitsPerChar)\n },\n decode (input: string): Uint8Array<ArrayBuffer> {\n return decode(input, alphabetIdx, bitsPerChar, name)\n }\n })\n}\n", "import { rfc4648 } from './base.ts'\n\nexport const base16 = rfc4648({\n prefix: 'f',\n name: 'base16',\n alphabet: '0123456789abcdef',\n bitsPerChar: 4,\n caseInsensitive: true\n})\n\nexport const base16upper = rfc4648({\n prefix: 'F',\n name: 'base16upper',\n alphabet: '0123456789ABCDEF',\n bitsPerChar: 4,\n caseInsensitive: true\n})\n", "import { rfc4648 } from './base.ts'\n\nexport const base2 = rfc4648({\n prefix: '0',\n name: 'base2',\n alphabet: '01',\n bitsPerChar: 1\n})\n", "import { from } from './base.ts'\n\nconst alphabet = Array.from('\uD83D\uDE80\uD83E\uDE90\u2604\uD83D\uDEF0\uD83C\uDF0C\uD83C\uDF11\uD83C\uDF12\uD83C\uDF13\uD83C\uDF14\uD83C\uDF15\uD83C\uDF16\uD83C\uDF17\uD83C\uDF18\uD83C\uDF0D\uD83C\uDF0F\uD83C\uDF0E\uD83D\uDC09\u2600\uD83D\uDCBB\uD83D\uDDA5\uD83D\uDCBE\uD83D\uDCBF\uD83D\uDE02\u2764\uD83D\uDE0D\uD83E\uDD23\uD83D\uDE0A\uD83D\uDE4F\uD83D\uDC95\uD83D\uDE2D\uD83D\uDE18\uD83D\uDC4D\uD83D\uDE05\uD83D\uDC4F\uD83D\uDE01\uD83D\uDD25\uD83E\uDD70\uD83D\uDC94\uD83D\uDC96\uD83D\uDC99\uD83D\uDE22\uD83E\uDD14\uD83D\uDE06\uD83D\uDE44\uD83D\uDCAA\uD83D\uDE09\u263A\uD83D\uDC4C\uD83E\uDD17\uD83D\uDC9C\uD83D\uDE14\uD83D\uDE0E\uD83D\uDE07\uD83C\uDF39\uD83E\uDD26\uD83C\uDF89\uD83D\uDC9E\u270C\u2728\uD83E\uDD37\uD83D\uDE31\uD83D\uDE0C\uD83C\uDF38\uD83D\uDE4C\uD83D\uDE0B\uD83D\uDC97\uD83D\uDC9A\uD83D\uDE0F\uD83D\uDC9B\uD83D\uDE42\uD83D\uDC93\uD83E\uDD29\uD83D\uDE04\uD83D\uDE00\uD83D\uDDA4\uD83D\uDE03\uD83D\uDCAF\uD83D\uDE48\uD83D\uDC47\uD83C\uDFB6\uD83D\uDE12\uD83E\uDD2D\u2763\uD83D\uDE1C\uD83D\uDC8B\uD83D\uDC40\uD83D\uDE2A\uD83D\uDE11\uD83D\uDCA5\uD83D\uDE4B\uD83D\uDE1E\uD83D\uDE29\uD83D\uDE21\uD83E\uDD2A\uD83D\uDC4A\uD83E\uDD73\uD83D\uDE25\uD83E\uDD24\uD83D\uDC49\uD83D\uDC83\uD83D\uDE33\u270B\uD83D\uDE1A\uD83D\uDE1D\uD83D\uDE34\uD83C\uDF1F\uD83D\uDE2C\uD83D\uDE43\uD83C\uDF40\uD83C\uDF37\uD83D\uDE3B\uD83D\uDE13\u2B50\u2705\uD83E\uDD7A\uD83C\uDF08\uD83D\uDE08\uD83E\uDD18\uD83D\uDCA6\u2714\uD83D\uDE23\uD83C\uDFC3\uD83D\uDC90\u2639\uD83C\uDF8A\uD83D\uDC98\uD83D\uDE20\u261D\uD83D\uDE15\uD83C\uDF3A\uD83C\uDF82\uD83C\uDF3B\uD83D\uDE10\uD83D\uDD95\uD83D\uDC9D\uD83D\uDE4A\uD83D\uDE39\uD83D\uDDE3\uD83D\uDCAB\uD83D\uDC80\uD83D\uDC51\uD83C\uDFB5\uD83E\uDD1E\uD83D\uDE1B\uD83D\uDD34\uD83D\uDE24\uD83C\uDF3C\uD83D\uDE2B\u26BD\uD83E\uDD19\u2615\uD83C\uDFC6\uD83E\uDD2B\uD83D\uDC48\uD83D\uDE2E\uD83D\uDE46\uD83C\uDF7B\uD83C\uDF43\uD83D\uDC36\uD83D\uDC81\uD83D\uDE32\uD83C\uDF3F\uD83E\uDDE1\uD83C\uDF81\u26A1\uD83C\uDF1E\uD83C\uDF88\u274C\u270A\uD83D\uDC4B\uD83D\uDE30\uD83E\uDD28\uD83D\uDE36\uD83E\uDD1D\uD83D\uDEB6\uD83D\uDCB0\uD83C\uDF53\uD83D\uDCA2\uD83E\uDD1F\uD83D\uDE41\uD83D\uDEA8\uD83D\uDCA8\uD83E\uDD2C\u2708\uD83C\uDF80\uD83C\uDF7A\uD83E\uDD13\uD83D\uDE19\uD83D\uDC9F\uD83C\uDF31\uD83D\uDE16\uD83D\uDC76\uD83E\uDD74\u25B6\u27A1\u2753\uD83D\uDC8E\uD83D\uDCB8\u2B07\uD83D\uDE28\uD83C\uDF1A\uD83E\uDD8B\uD83D\uDE37\uD83D\uDD7A\u26A0\uD83D\uDE45\uD83D\uDE1F\uD83D\uDE35\uD83D\uDC4E\uD83E\uDD32\uD83E\uDD20\uD83E\uDD27\uD83D\uDCCC\uD83D\uDD35\uD83D\uDC85\uD83E\uDDD0\uD83D\uDC3E\uD83C\uDF52\uD83D\uDE17\uD83E\uDD11\uD83C\uDF0A\uD83E\uDD2F\uD83D\uDC37\u260E\uD83D\uDCA7\uD83D\uDE2F\uD83D\uDC86\uD83D\uDC46\uD83C\uDFA4\uD83D\uDE47\uD83C\uDF51\u2744\uD83C\uDF34\uD83D\uDCA3\uD83D\uDC38\uD83D\uDC8C\uD83D\uDCCD\uD83E\uDD40\uD83E\uDD22\uD83D\uDC45\uD83D\uDCA1\uD83D\uDCA9\uD83D\uDC50\uD83D\uDCF8\uD83D\uDC7B\uD83E\uDD10\uD83E\uDD2E\uD83C\uDFBC\uD83E\uDD75\uD83D\uDEA9\uD83C\uDF4E\uD83C\uDF4A\uD83D\uDC7C\uD83D\uDC8D\uD83D\uDCE3\uD83E\uDD42')\nconst alphabetBytesToChars: string[] = (alphabet.reduce<string[]>((p, c, i) => { p[i] = c; return p }, ([])))\nconst alphabetCharsToBytes: number[] = (alphabet.reduce<number[]>((p, c, i) => {\n const codePoint = c.codePointAt(0)\n if (codePoint == null) {\n throw new Error(`Invalid character: ${c}`)\n }\n p[codePoint] = i\n return p\n}, ([])))\n\nfunction encode (data: Uint8Array): string {\n return data.reduce((p, c) => {\n p += alphabetBytesToChars[c]\n return p\n }, '')\n}\n\nfunction decode (str: string): Uint8Array<ArrayBuffer> {\n const byts = []\n for (const char of str) {\n const codePoint = char.codePointAt(0)\n if (codePoint == null) {\n throw new Error(`Invalid character: ${char}`)\n }\n const byt = alphabetCharsToBytes[codePoint]\n if (byt == null) {\n throw new Error(`Non-base256emoji character: ${char}`)\n }\n byts.push(byt)\n }\n return new Uint8Array(byts)\n}\n\nexport const base256emoji = from({\n prefix: '\uD83D\uDE80',\n name: 'base256emoji',\n encode,\n decode\n})\n", "import { rfc4648 } from './base.ts'\n\nexport const base32 = rfc4648({\n prefix: 'b',\n name: 'base32',\n alphabet: 'abcdefghijklmnopqrstuvwxyz234567',\n bitsPerChar: 5,\n caseInsensitive: true\n})\n\nexport const base32upper = rfc4648({\n prefix: 'B',\n name: 'base32upper',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567',\n bitsPerChar: 5,\n caseInsensitive: true\n})\n\nexport const base32pad = rfc4648({\n prefix: 'c',\n name: 'base32pad',\n alphabet: 'abcdefghijklmnopqrstuvwxyz234567=',\n bitsPerChar: 5,\n caseInsensitive: true\n})\n\nexport const base32padupper = rfc4648({\n prefix: 'C',\n name: 'base32padupper',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=',\n bitsPerChar: 5,\n caseInsensitive: true\n})\n\nexport const base32hex = rfc4648({\n prefix: 'v',\n name: 'base32hex',\n alphabet: '0123456789abcdefghijklmnopqrstuv',\n bitsPerChar: 5,\n caseInsensitive: true\n})\n\nexport const base32hexupper = rfc4648({\n prefix: 'V',\n name: 'base32hexupper',\n alphabet: '0123456789ABCDEFGHIJKLMNOPQRSTUV',\n bitsPerChar: 5,\n caseInsensitive: true\n})\n\nexport const base32hexpad = rfc4648({\n prefix: 't',\n name: 'base32hexpad',\n alphabet: '0123456789abcdefghijklmnopqrstuv=',\n bitsPerChar: 5,\n caseInsensitive: true\n})\n\nexport const base32hexpadupper = rfc4648({\n prefix: 'T',\n name: 'base32hexpadupper',\n alphabet: '0123456789ABCDEFGHIJKLMNOPQRSTUV=',\n bitsPerChar: 5,\n caseInsensitive: true\n})\n\nexport const base32z = rfc4648({\n prefix: 'h',\n name: 'base32z',\n alphabet: 'ybndrfg8ejkmcpqxot1uwisza345h769',\n bitsPerChar: 5\n})\n", "import { baseX } from './base.ts'\n\nexport const base36 = baseX({\n prefix: 'k',\n name: 'base36',\n alphabet: '0123456789abcdefghijklmnopqrstuvwxyz',\n caseInsensitive: true\n})\n\nexport const base36upper = baseX({\n prefix: 'K',\n name: 'base36upper',\n alphabet: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n caseInsensitive: true\n})\n", "import { baseX } from './base.ts'\n\nexport const base58btc = baseX({\n name: 'base58btc',\n prefix: 'z',\n alphabet: '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n})\n\nexport const base58flickr = baseX({\n name: 'base58flickr',\n prefix: 'Z',\n alphabet: '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'\n})\n", "import { rfc4648 } from './base.ts'\n\nexport const base64 = rfc4648({\n prefix: 'm',\n name: 'base64',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',\n bitsPerChar: 6\n})\n\nexport const base64pad = rfc4648({\n prefix: 'M',\n name: 'base64pad',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n bitsPerChar: 6\n})\n\nexport const base64url = rfc4648({\n prefix: 'u',\n name: 'base64url',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',\n bitsPerChar: 6\n})\n\nexport const base64urlpad = rfc4648({\n prefix: 'U',\n name: 'base64urlpad',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=',\n bitsPerChar: 6\n})\n", "import { rfc4648 } from './base.ts'\n\nexport const base8 = rfc4648({\n prefix: '7',\n name: 'base8',\n alphabet: '01234567',\n bitsPerChar: 3\n})\n", "import { coerce, fromString, toString } from '../bytes.ts'\nimport { from } from './base.ts'\n\nexport const identity = from({\n prefix: '\\x00',\n name: 'identity',\n encode: (buf) => toString(coerce(buf)),\n decode: (str) => coerce(fromString(str))\n})\n", "import type { ArrayBufferView, ByteView } from './interface.ts'\n\nconst textEncoder = new TextEncoder()\nconst textDecoder = new TextDecoder()\n\nexport const name = 'json'\nexport const code = 0x0200\n\nexport function encode <T> (node: T): ByteView<T> {\n return textEncoder.encode(JSON.stringify(node))\n}\n\nexport function decode <T> (data: ByteView<T> | ArrayBufferView<T>): T {\n return JSON.parse(textDecoder.decode(data))\n}\n", "import { coerce } from '../bytes.ts'\nimport * as Digest from './digest.ts'\nimport type { DigestOptions } from './hasher.ts'\nimport type { SyncMultihashHasher } from './interface.ts'\n\nconst code: 0x0 = 0x0\nconst name = 'identity'\n\nconst encode: (input: Uint8Array) => Uint8Array<ArrayBuffer> = coerce\n\nfunction digest (input: Uint8Array, options?: DigestOptions): Digest.Digest<typeof code, number> {\n if (options?.truncate != null && options.truncate !== input.byteLength) {\n if (options.truncate < 0 || options.truncate > input.byteLength) {\n throw new Error(`Invalid truncate option, must be less than or equal to ${input.byteLength}`)\n }\n\n input = input.subarray(0, options.truncate)\n }\n\n return Digest.create(code, encode(input))\n}\n\nexport const identity: SyncMultihashHasher<0x00> = { code, name, encode, digest }\n", "/* eslint-disable */\nvar encode_1 = encode;\n\nvar MSB = 0x80\n , REST = 0x7F\n , MSBALL = ~REST\n , INT = Math.pow(2, 31);\n\n/**\n * @param {number} num\n * @param {number[]} out\n * @param {number} offset\n */\nfunction encode(num, out, offset) {\n out = out || [];\n offset = offset || 0;\n var oldOffset = offset;\n\n while(num >= INT) {\n out[offset++] = (num & 0xFF) | MSB;\n num /= 128;\n }\n while(num & MSBALL) {\n out[offset++] = (num & 0xFF) | MSB;\n num >>>= 7;\n }\n out[offset] = num | 0;\n \n // @ts-ignore\n encode.bytes = offset - oldOffset + 1;\n \n return out\n}\n\nvar decode = read;\n\nvar MSB$1 = 0x80\n , REST$1 = 0x7F;\n\n/**\n * @param {string | any[]} buf\n * @param {number} offset\n */\nfunction read(buf, offset) {\n var res = 0\n , offset = offset || 0\n , shift = 0\n , counter = offset\n , b\n , l = buf.length;\n\n do {\n if (counter >= l) {\n // @ts-ignore\n read.bytes = 0;\n throw new RangeError('Could not decode varint')\n }\n b = buf[counter++];\n res += shift < 28\n ? (b & REST$1) << shift\n : (b & REST$1) * Math.pow(2, shift);\n shift += 7;\n } while (b >= MSB$1)\n\n // @ts-ignore\n read.bytes = counter - offset;\n\n return res\n}\n\nvar N1 = Math.pow(2, 7);\nvar N2 = Math.pow(2, 14);\nvar N3 = Math.pow(2, 21);\nvar N4 = Math.pow(2, 28);\nvar N5 = Math.pow(2, 35);\nvar N6 = Math.pow(2, 42);\nvar N7 = Math.pow(2, 49);\nvar N8 = Math.pow(2, 56);\nvar N9 = Math.pow(2, 63);\n\nvar length = function (/** @type {number} */ value) {\n return (\n value < N1 ? 1\n : value < N2 ? 2\n : value < N3 ? 3\n : value < N4 ? 4\n : value < N5 ? 5\n : value < N6 ? 6\n : value < N7 ? 7\n : value < N8 ? 8\n : value < N9 ? 9\n : 10\n )\n};\n\nvar varint = {\n encode: encode_1\n , decode: decode\n , encodingLength: length\n};\n\nvar _brrp_varint = varint;\n\nexport default _brrp_varint;\n", "import varint from './vendor/varint.js'\n\nexport function decode (data: Uint8Array, offset = 0): [number, number] {\n const code = varint.decode(data, offset)\n return [code, varint.decode.bytes]\n}\n\nexport function encodeTo (int: number, target: Uint8Array, offset = 0): Uint8Array {\n varint.encode(int, target, offset)\n return target\n}\n\nexport function encodingLength (int: number): number {\n return varint.encodingLength(int)\n}\n", "import { coerce, equals as equalBytes, toArrayBufferBackedArray } from '../bytes.ts'\nimport * as varint from '../varint.ts'\nimport type { MultihashDigest } from './interface.ts'\n\n/**\n * Creates a multihash digest.\n */\nexport function create <Code extends number> (code: Code, digest: Uint8Array): Digest<Code, number> {\n const size = digest.byteLength\n const sizeOffset = varint.encodingLength(code)\n const digestOffset = sizeOffset + varint.encodingLength(size)\n\n const bytes = new Uint8Array(digestOffset + size)\n varint.encodeTo(code, bytes, 0)\n varint.encodeTo(size, bytes, sizeOffset)\n bytes.set(digest, digestOffset)\n\n return new Digest(code, size, digest, bytes)\n}\n\n/**\n * Turns bytes representation of multihash digest into an instance.\n */\nexport function decode (multihash: Uint8Array): MultihashDigest {\n const bytes = coerce(multihash)\n const [code, sizeOffset] = varint.decode(bytes)\n const [size, digestOffset] = varint.decode(bytes.subarray(sizeOffset))\n const digest = bytes.subarray(sizeOffset + digestOffset)\n\n if (digest.byteLength !== size) {\n throw new Error('Incorrect length')\n }\n\n return new Digest(code, size, digest, bytes)\n}\n\nexport function equals (a: MultihashDigest, b: unknown): b is MultihashDigest {\n if (a === b) {\n return true\n } else {\n const data = b as { code?: unknown, size?: unknown, bytes?: unknown }\n\n return (\n a.code === data.code &&\n a.size === data.size &&\n data.bytes instanceof Uint8Array &&\n equalBytes(a.bytes, data.bytes)\n )\n }\n}\n\n/**\n * Represents a multihash digest which carries information about the\n * hashing algorithm and an actual hash digest.\n */\nexport class Digest<Code extends number, Size extends number> implements MultihashDigest {\n readonly code: Code\n readonly size: Size\n readonly digest: Uint8Array<ArrayBuffer>\n readonly bytes: Uint8Array<ArrayBuffer>\n\n /**\n * Creates a multihash digest.\n */\n constructor (code: Code, size: Size, digest: Uint8Array, bytes: Uint8Array) {\n this.code = code\n this.size = size\n this.digest = toArrayBufferBackedArray(digest)\n this.bytes = toArrayBufferBackedArray(bytes)\n }\n}\n\n/**\n * Used to check that the passed multihash has the passed code\n */\nexport function hasCode <T extends number> (digest: MultihashDigest, code: T): digest is MultihashDigest<T> {\n return digest.code === code\n}\n", "import { from } from './hasher.ts'\n\nfunction sha (name: AlgorithmIdentifier): (data: Uint8Array<ArrayBuffer>) => Promise<Uint8Array<ArrayBuffer>> {\n return async data => new Uint8Array(await crypto.subtle.digest(name, data))\n}\n\nexport const sha256 = from({\n name: 'sha2-256',\n code: 0x12,\n encode: sha('SHA-256')\n})\n\nexport const sha512 = from({\n name: 'sha2-512',\n code: 0x13,\n encode: sha('SHA-512')\n})\n", "import * as Digest from './digest.ts'\nimport type { MultihashHasher } from './interface.ts'\n\ntype Await<T> = Promise<T> | T\n\nconst DEFAULT_MIN_DIGEST_LENGTH = 20\n\nexport interface HasherInit <Name extends string, Code extends number> {\n name: Name\n code: Code\n encode(input: Uint8Array): Await<Uint8Array<ArrayBuffer>>\n\n /**\n * The minimum length a hash is allowed to be truncated to in bytes\n *\n * @default 20\n */\n minDigestLength?: number\n\n /**\n * The maximum length a hash is allowed to be truncated to in bytes. If not\n * specified it will be inferred from the length of the digest.\n */\n maxDigestLength?: number\n}\n\nexport function from <Name extends string, Code extends number> ({ name, code, encode, minDigestLength, maxDigestLength }: HasherInit<Name, Code>): MultihashHasher<Code> {\n return new Hasher(name, code, encode, minDigestLength, maxDigestLength)\n}\n\nexport interface DigestOptions {\n /**\n * Truncate the returned digest to this number of bytes.\n *\n * This may cause the digest method to throw/reject if the passed value is\n * greater than the digest length or below a threshold under which the risk of\n * hash collisions is significant.\n *\n * The actual value of this threshold can depend on the hashing algorithm in\n * use.\n */\n truncate?: number\n}\n\n/**\n * Hasher represents a hashing algorithm implementation that produces as\n * `MultihashDigest`.\n */\nexport class Hasher<Name extends string, Code extends number> implements MultihashHasher<Code> {\n readonly name: Name\n readonly code: Code\n readonly encode: (input: Uint8Array) => Await<Uint8Array<ArrayBuffer>>\n readonly minDigestLength: number\n readonly maxDigestLength?: number\n\n constructor (name: Name, code: Code, encode: (input: Uint8Array) => Await<Uint8Array<ArrayBuffer>>, minDigestLength?: number, maxDigestLength?: number) {\n this.name = name\n this.code = code\n this.encode = encode\n this.minDigestLength = minDigestLength ?? DEFAULT_MIN_DIGEST_LENGTH\n this.maxDigestLength = maxDigestLength\n }\n\n digest (input: Uint8Array, options?: DigestOptions): Await<Digest.Digest<Code, number>> {\n if (options?.truncate != null) {\n if (options.truncate < this.minDigestLength) {\n throw new Error(`Invalid truncate option, must be greater than or equal to ${this.minDigestLength}`)\n }\n\n if (this.maxDigestLength != null && options.truncate > this.maxDigestLength) {\n throw new Error(`Invalid truncate option, must be less than or equal to ${this.maxDigestLength}`)\n }\n }\n\n if (input instanceof Uint8Array) {\n const result = this.encode(input)\n\n if (result instanceof Uint8Array) {\n return createDigest(result, this.code, options?.truncate)\n }\n\n return result.then(digest => createDigest(digest, this.code, options?.truncate))\n } else {\n throw Error('Unknown type, must be binary type')\n /* c8 ignore next 1 */\n }\n }\n}\n\n/**\n * Create a Digest from the passed uint8array and code, optionally truncating it\n * first.\n */\nfunction createDigest <Code extends number> (digest: Uint8Array, code: Code, truncate?: number): Digest.Digest<Code, number> {\n if (truncate != null && truncate !== digest.byteLength) {\n if (truncate > digest.byteLength) {\n throw new Error(`Invalid truncate option, must be less than or equal to ${digest.byteLength}`)\n }\n\n digest = digest.subarray(0, truncate)\n }\n\n return Digest.create(code, digest)\n}\n", "import { base32 } from './bases/base32.ts'\nimport { base36 } from './bases/base36.ts'\nimport { base58btc } from './bases/base58.ts'\nimport { coerce, toArrayBufferBackedArray } from './bytes.ts'\nimport * as Digest from './hashes/digest.ts'\nimport * as varint from './varint.ts'\nimport type * as API from './link/interface.ts'\n\n// This way TS will also expose all the types from module\nexport * from './link/interface.ts'\n\nexport function format <T extends API.Link<unknown, number, number, API.Version>, Prefix extends string> (link: T, base?: API.MultibaseEncoder<Prefix>): API.ToString<T, Prefix> {\n const { bytes, version } = link\n switch (version) {\n case 0:\n return toStringV0(\n bytes,\n baseCache(link),\n base as API.MultibaseEncoder<'z'> ?? base58btc.encoder\n )\n default:\n return toStringV1(\n bytes,\n baseCache(link),\n (base ?? base32.encoder) as API.MultibaseEncoder<Prefix>\n )\n }\n}\n\nexport function toJSON <Link extends API.UnknownLink> (link: Link): API.LinkJSON<Link> {\n return {\n '/': format(link)\n }\n}\n\nexport function fromJSON <Link extends API.UnknownLink> (json: API.LinkJSON<Link>): CID<unknown, number, number, API.Version> {\n return CID.parse(json['/'])\n}\n\nconst cache = new WeakMap<API.UnknownLink, Map<string, string>>()\n\nfunction baseCache (cid: API.UnknownLink): Map<string, string> {\n const baseCache = cache.get(cid)\n if (baseCache == null) {\n const baseCache = new Map()\n cache.set(cid, baseCache)\n return baseCache\n }\n return baseCache\n}\n\nexport class CID<Data = unknown, Format extends number = number, Alg extends number = number, Version extends API.Version = API.Version> implements API.Link<Data, Format, Alg, Version> {\n readonly code: Format\n readonly version: Version\n readonly multihash: API.MultihashDigest<Alg>\n readonly bytes: Uint8Array<ArrayBuffer>\n readonly '/': Uint8Array<ArrayBuffer>\n\n /**\n * @param version - Version of the CID\n * @param code - Code of the codec content is encoded in, see https://github.com/multiformats/multicodec/blob/master/table.csv\n * @param multihash - (Multi)hash of the of the content.\n */\n constructor (version: Version, code: Format, multihash: API.MultihashDigest<Alg>, bytes: Uint8Array) {\n this.code = code\n this.version = version\n this.multihash = multihash\n this.bytes = toArrayBufferBackedArray(bytes)\n\n // flag to serializers that this is a CID and\n // should be treated specially\n this['/'] = this.bytes\n }\n\n /**\n * Signalling `cid.asCID === cid` has been replaced with `cid['/'] === cid.bytes`\n * please either use `CID.asCID(cid)` or switch to new signalling mechanism\n *\n * @deprecated\n */\n get asCID (): this {\n return this\n }\n\n // ArrayBufferView\n get byteOffset (): number {\n return this.bytes.byteOffset\n }\n\n // ArrayBufferView\n get byteLength (): number {\n return this.bytes.byteLength\n }\n\n toV0 (): CID<Data, API.DAG_PB, API.SHA_256, 0> {\n switch (this.version) {\n case 0: {\n return this as CID<Data, API.DAG_PB, API.SHA_256, 0>\n }\n case 1: {\n const { code, multihash } = this\n\n if (code !== DAG_PB_CODE) {\n throw new Error('Cannot convert a non dag-pb CID to CIDv0')\n }\n\n // sha2-256\n if (multihash.code !== SHA_256_CODE) {\n throw new Error('Cannot convert non sha2-256 multihash CID to CIDv0')\n }\n\n return (\n CID.createV0(\n multihash as API.MultihashDigest<API.SHA_256>\n )\n )\n }\n default: {\n throw Error(\n `Can not convert CID version ${this.version} to version 0. This is a bug please report`\n )\n }\n }\n }\n\n toV1 (): CID<Data, Format, Alg, 1> {\n switch (this.version) {\n case 0: {\n const { code, digest } = this.multihash\n const multihash = Digest.create(code, digest)\n return (\n CID.createV1(this.code, multihash)\n )\n }\n case 1: {\n return this as CID<Data, Format, Alg, 1>\n }\n default: {\n throw Error(\n `Can not convert CID version ${this.version} to version 1. This is a bug please report`\n )\n }\n }\n }\n\n equals (other: unknown): other is CID<Data, Format, Alg, Version> {\n return CID.equals(this, other)\n }\n\n static equals <Data, Format extends number, Alg extends number, Version extends API.Version>(self: API.Link<Data, Format, Alg, Version>, other: unknown): other is CID {\n const unknown = other as { code?: unknown, version?: unknown, multihash?: unknown }\n return (\n unknown != null &&\n self.code === unknown.code &&\n self.version === unknown.version &&\n Digest.equals(self.multihash, unknown.multihash)\n )\n }\n\n toString (base?: API.MultibaseEncoder<string>): string {\n return format(this, base)\n }\n\n toJSON (): API.LinkJSON<this> {\n return { '/': format(this) }\n }\n\n link (): this {\n return this\n }\n\n readonly [Symbol.toStringTag] = 'CID';\n\n // Legacy\n\n [Symbol.for('nodejs.util.inspect.custom')] (): string {\n return `CID(${this.toString()})`\n }\n\n /**\n * Takes any input `value` and returns a `CID` instance if it was\n * a `CID` otherwise returns `null`. If `value` is instanceof `CID`\n * it will return value back. If `value` is not instance of this CID\n * class, but is compatible CID it will return new instance of this\n * `CID` class. Otherwise returns null.\n *\n * This allows two different incompatible versions of CID library to\n * co-exist and interop as long as binary interface is compatible.\n */\n static asCID <Data, Format extends number, Alg extends number, Version extends API.Version, U>(input: API.Link<Data, Format, Alg, Version> | U): CID<Data, Format, Alg, Version> | null {\n if (input == null) {\n return null\n }\n\n const value = input as any\n if (value instanceof CID) {\n // If value is instance of CID then we're all set.\n return value\n } else if ((value['/'] != null && value['/'] === value.bytes) || value.asCID === value) {\n // If value isn't instance of this CID class but `this.asCID === this` or\n // `value['/'] === value.bytes` is true it is CID instance coming from a\n // different implementation (diff version or duplicate). In that case we\n // rebase it to this `CID` implementation so caller is guaranteed to get\n // instance with expected API.\n const { version, code, multihash, bytes } = value\n return new CID(\n version,\n code,\n multihash as API.MultihashDigest<Alg>,\n bytes ?? encodeCID(version, code, multihash.bytes)\n )\n } else if (value[cidSymbol] === true) {\n // If value is a CID from older implementation that used to be tagged via\n // symbol we still rebase it to the this `CID` implementation by\n // delegating that to a constructor.\n const { version, multihash, code } = value\n const digest = Digest.decode(multihash) as API.MultihashDigest<Alg>\n return CID.create(version, code, digest)\n } else {\n // Otherwise value is not a CID (or an incompatible version of it) in\n // which case we return `null`.\n return null\n }\n }\n\n /**\n * @param version - Version of the CID\n * @param code - Code of the codec content is encoded in, see https://github.com/multiformats/multicodec/blob/master/table.csv\n * @param digest - (Multi)hash of the of the content.\n */\n static create <Data, Format extends number, Alg extends number, Version extends API.Version>(version: Version, code: Format, digest: API.MultihashDigest<Alg>): CID<Data, Format, Alg, Version> {\n if (typeof code !== 'number') {\n throw new Error('String codecs are no longer supported')\n }\n\n if (!(digest.bytes instanceof Uint8Array)) {\n throw new Error('Invalid digest')\n }\n\n switch (version) {\n case 0: {\n if (code !== DAG_PB_CODE) {\n throw new Error(\n `Version 0 CID must use dag-pb (code: ${DAG_PB_CODE}) block encoding`\n )\n } else {\n return new CID(version, code, digest, digest.bytes)\n }\n }\n case 1: {\n const bytes = encodeCID(version, code, digest.bytes)\n return new CID(version, code, digest, bytes)\n }\n default: {\n throw new Error('Invalid version')\n }\n }\n }\n\n /**\n * Simplified version of `create` for CIDv0.\n */\n static createV0 <T = unknown>(digest: API.MultihashDigest<typeof SHA_256_CODE>): CID<T, typeof DAG_PB_CODE, typeof SHA_256_CODE, 0> {\n return CID.create(0, DAG_PB_CODE, digest)\n }\n\n /**\n * Simplified version of `create` for CIDv1.\n *\n * @param code - Content encoding format code.\n * @param digest - Multihash of the content.\n */\n static createV1 <Data, Code extends number, Alg extends number>(code: Code, digest: API.MultihashDigest<Alg>): CID<Data, Code, Alg, 1> {\n return CID.create(1, code, digest)\n }\n\n /**\n * Decoded a CID from its binary representation. The byte array must contain\n * only the CID with no additional bytes.\n *\n * An error will be thrown if the bytes provided do not contain a valid\n * binary representation of a CID.\n */\n static decode <Data, Code extends number, Alg extends number, Version extends API.Version>(bytes: API.ByteView<API.Link<Data, Code, Alg, Version>>): CID<Data, Code, Alg, Version> {\n const [cid, remainder] = CID.decodeFirst(bytes)\n if (remainder.length !== 0) {\n throw new Error('Incorrect length')\n }\n return cid\n }\n\n /**\n * Decoded a CID from its binary representation at the beginning of a byte\n * array.\n *\n * Returns an array with the first element containing the CID and the second\n * element containing the remainder of the original byte array. The remainder\n * will be a zero-length byte array if the provided bytes only contained a\n * binary CID representation.\n */\n static decodeFirst <T, C extends number, A extends number, V extends API.Version>(bytes: API.ByteView<API.Link<T, C, A, V>>): [CID<T, C, A, V>, Uint8Array] {\n const specs = CID.inspectBytes(bytes)\n const prefixSize = specs.size - specs.multihashSize\n const multihashBytes = coerce(\n bytes.subarray(prefixSize, prefixSize + specs.multihashSize)\n )\n if (multihashBytes.byteLength !== specs.multihashSize) {\n throw new Error('Incorrect length')\n }\n const digestBytes = multihashBytes.subarray(\n specs.multihashSize - specs.digestSize\n )\n const digest = new Digest.Digest(\n specs.multihashCode,\n specs.digestSize,\n digestBytes,\n multihashBytes\n )\n const cid =\n specs.version === 0\n ? CID.createV0(digest as API.MultihashDigest<API.SHA_256>)\n : CID.createV1(specs.codec, digest)\n return [cid as CID<T, C, A, V>, bytes.subarray(specs.size)]\n }\n\n /**\n * Inspect the initial bytes of a CID to determine its properties.\n *\n * Involves decoding up to 4 varints. Typically this will require only 4 to 6\n * bytes but for larger multicodec code values and larger multihash digest\n * lengths these varints can be quite large. It is recommended that at least\n * 10 bytes be made available in the `initialBytes` argument for a complete\n * inspection.\n */\n static inspectBytes <T, C extends number, A extends number, V extends API.Version>(initialBytes: API.ByteView<API.Link<T, C, A, V>>): { version: V, codec: C, multihashCode: A, digestSize: number, multihashSize: number, size: number } {\n let offset = 0\n const next = (): number => {\n const [i, length] = varint.decode(initialBytes.subarray(offset))\n offset += length\n return i\n }\n\n let version = next() as V\n let codec = DAG_PB_CODE as C\n if (version as number === 18) {\n // CIDv0\n version = 0 as V\n offset = 0\n } else {\n codec = next() as C\n }\n\n if (version !== 0 && version !== 1) {\n throw new RangeError(`Invalid CID version ${version}`)\n }\n\n const prefixSize = offset\n const multihashCode = next() as A // multihash code\n const digestSize = next() // multihash length\n const size = offset + digestSize\n const multihashSize = size - prefixSize\n\n return { version, codec, multihashCode, digestSize, multihashSize, size }\n }\n\n /**\n * Takes cid in a string representation and creates an instance. If `base`\n * decoder is not provided will use a default from the configuration. It will\n * throw an error if encoding of the CID is not compatible with supplied (or\n * a default decoder).\n */\n static parse <Prefix extends string, Data, Code extends number, Alg extends number, Version extends API.Version>(source: API.ToString<API.Link<Data, Code, Alg, Version>, Prefix>, base?: API.MultibaseDecoder<Prefix>): CID<Data, Code, Alg, Version> {\n const [prefix, bytes] = parseCIDtoBytes(source, base)\n\n const cid = CID.decode(bytes)\n\n if (cid.version === 0 && source[0] !== 'Q') {\n throw Error('Version 0 CID string must not include multibase prefix')\n }\n\n // Cache string representation to avoid computing it on `this.toString()`\n baseCache(cid).set(prefix, source)\n\n return cid\n }\n}\n\nfunction parseCIDtoBytes <Prefix extends string, Data, Code extends number, Alg extends number, Version extends API.Version> (source: API.ToString<API.Link<Data, Code, Alg, Version>, Prefix>, base?: API.MultibaseDecoder<Prefix>): [Prefix, API.ByteView<API.Link<Data, Code, Alg, Version>>] {\n switch (source[0]) {\n // CIDv0 is parsed differently\n case 'Q': {\n const decoder = base ?? base58btc\n return [\n base58btc.prefix as Prefix,\n decoder.decode(`${base58btc.prefix}${source}`)\n ]\n }\n case base58btc.prefix: {\n const decoder = base ?? base58btc\n return [base58btc.prefix as Prefix, decoder.decode(source)]\n }\n case base32.prefix: {\n const decoder = base ?? base32\n return [base32.prefix as Prefix, decoder.decode(source)]\n }\n case base36.prefix: {\n const decoder = base ?? base36\n return [base36.prefix as Prefix, decoder.decode(source)]\n }\n default: {\n if (base == null) {\n throw Error(\n 'To parse non base32, base36 or base58btc encoded CID multibase decoder must be provided'\n )\n }\n return [source[0] as Prefix, base.decode(source)]\n }\n }\n}\n\nfunction toStringV0 (bytes: Uint8Array, cache: Map<string, string>, base: API.MultibaseEncoder<'z'>): string {\n const { prefix } = base\n if (prefix !== base58btc.prefix) {\n throw Error(`Cannot string encode V0 in ${base.name} encoding`)\n }\n\n const cid = cache.get(prefix)\n if (cid == null) {\n const cid = base.encode(bytes).slice(1)\n cache.set(prefix, cid)\n return cid\n } else {\n return cid\n }\n}\n\nfunction toStringV1 <Prefix extends string> (bytes: Uint8Array, cache: Map<string, string>, base: API.MultibaseEncoder<Prefix>): string {\n const { prefix } = base\n const cid = cache.get(prefix)\n if (cid == null) {\n const cid = base.encode(bytes)\n cache.set(prefix, cid)\n return cid\n } else {\n return cid\n }\n}\n\nconst DAG_PB_CODE = 0x70\nconst SHA_256_CODE = 0x12\n\nfunction encodeCID (version: API.Version, code: number, multihash: Uint8Array): Uint8Array {\n const codeOffset = varint.encodingLength(version)\n const hashOffset = codeOffset + varint.encodingLength(code)\n const bytes = new Uint8Array(hashOffset + multihash.byteLength)\n varint.encodeTo(version, bytes, 0)\n varint.encodeTo(code, bytes, codeOffset)\n bytes.set(multihash, hashOffset)\n return bytes\n}\n\nconst cidSymbol = Symbol.for('@ipld/js-cid/CID')\n", "import * as base10 from './bases/base10.ts'\nimport * as base16 from './bases/base16.ts'\nimport * as base2 from './bases/base2.ts'\nimport * as base256emoji from './bases/base256emoji.ts'\nimport * as base32 from './bases/base32.ts'\nimport * as base36 from './bases/base36.ts'\nimport * as base58 from './bases/base58.ts'\nimport * as base64 from './bases/base64.ts'\nimport * as base8 from './bases/base8.ts'\nimport * as identityBase from './bases/identity.ts'\nimport * as json from './codecs/json.ts'\nimport * as raw from './codecs/raw.ts'\nimport * as identity from './hashes/identity.ts'\nimport * as sha2 from './hashes/sha2.ts'\nimport { CID, hasher, digest, varint, bytes } from './index.ts'\n\nexport const bases = { ...identityBase, ...base2, ...base8, ...base10, ...base16, ...base32, ...base36, ...base58, ...base64, ...base256emoji }\nexport const hashes = { ...sha2, ...identity }\nexport const codecs = { raw, json }\n\nexport { CID, hasher, digest, varint, bytes }\n", "/**\n * Returns a `Uint8Array` of the requested size. Referenced memory will\n * be initialized to 0.\n */\nexport function alloc (size: number = 0): Uint8Array<ArrayBuffer> {\n return new Uint8Array(size)\n}\n\n/**\n * Where possible returns a Uint8Array of the requested size that references\n * uninitialized memory. Only use if you are certain you will immediately\n * overwrite every value in the returned `Uint8Array`.\n */\nexport function allocUnsafe (size: number = 0): Uint8Array<ArrayBuffer> {\n return new Uint8Array(size)\n}\n", "import { bases } from 'multiformats/basics'\nimport type { MultibaseCodec } from 'multiformats'\nimport { allocUnsafe } from '#alloc'\n\nfunction createCodec (name: string, prefix: string, encode: (buf: Uint8Array) => string, decode: (str: string) => Uint8Array<ArrayBuffer>): MultibaseCodec<any> {\n return {\n name,\n prefix,\n encoder: {\n name,\n prefix,\n encode\n },\n decoder: {\n decode\n }\n }\n}\n\nconst string = createCodec('utf8', 'u', (buf) => {\n const decoder = new TextDecoder('utf8')\n return 'u' + decoder.decode(buf)\n}, (str) => {\n const encoder = new TextEncoder()\n return encoder.encode(str.substring(1))\n})\n\nconst ascii = createCodec('ascii', 'a', (buf) => {\n let string = 'a'\n\n for (let i = 0; i < buf.length; i++) {\n string += String.fromCharCode(buf[i])\n }\n return string\n}, (str) => {\n str = str.substring(1)\n const buf = allocUnsafe(str.length)\n\n for (let i = 0; i < str.length; i++) {\n buf[i] = str.charCodeAt(i)\n }\n\n return buf\n})\n\nexport type SupportedEncodings = 'utf8' | 'utf-8' | 'hex' | 'latin1' | 'ascii' | 'binary' | keyof typeof bases\n\nconst BASES: Record<SupportedEncodings, MultibaseCodec<any>> = {\n utf8: string,\n 'utf-8': string,\n hex: bases.base16,\n latin1: ascii,\n ascii,\n binary: ascii,\n\n ...bases\n}\n\nexport default BASES\n", "import hashlru from 'hashlru'\nimport { RecordType } from '../index.ts'\nimport { DEFAULT_TTL, toDNSResponse } from './to-dns-response.ts'\nimport type { Answer, DNSResponse } from '../index.ts'\n\ninterface CachedAnswer {\n expires: number\n value: Answer\n}\n\nexport interface AnswerCache {\n get (fqdn: string, types: RecordType[]): DNSResponse | undefined\n add (domain: string, answer: Answer): void\n remove (domain: string, type: ResponseType): void\n clear (): void\n}\n\n/**\n * Time Aware Least Recent Used Cache\n *\n * @see https://arxiv.org/pdf/1801.00390\n */\nclass CachedAnswers {\n private readonly lru: any\n\n constructor (maxSize: number) {\n // @ts-expect-error types are broken - https://github.com/dominictarr/hashlru/pull/24\n this.lru = hashlru(maxSize)\n }\n\n get (fqdn: string, types: RecordType[]): DNSResponse | undefined {\n let foundAllAnswers = true\n const answers: Answer[] = []\n\n for (const type of types) {\n const cached = this.getAnswers(fqdn, type)\n\n if (cached.length === 0) {\n foundAllAnswers = false\n break\n }\n\n answers.push(...cached)\n }\n\n if (foundAllAnswers) {\n return toDNSResponse({ answers })\n }\n }\n\n private getAnswers (domain: string, type: RecordType): Answer[] {\n const key = `${domain.toLowerCase()}-${type}`\n const answers: CachedAnswer[] = this.lru.get(key)\n\n if (answers != null) {\n const cachedAnswers = answers\n .filter((entry) => {\n return entry.expires > Date.now()\n })\n .map(({ expires, value }) => ({\n ...value,\n TTL: Math.round((expires - Date.now()) / 1000),\n type: RecordType[value.type]\n }))\n\n if (cachedAnswers.length === 0) {\n this.lru.remove(key)\n }\n\n // @ts-expect-error hashlru stringifies stored types which turns enums\n // into strings, we convert back into enums above but tsc doesn't know\n return cachedAnswers\n }\n\n return []\n }\n\n add (domain: string, answer: Answer): void {\n const key = `${domain.toLowerCase()}-${answer.type}`\n\n const answers: CachedAnswer[] = this.lru.get(key) ?? []\n answers.push({\n expires: Date.now() + ((answer.TTL ?? DEFAULT_TTL) * 1000),\n value: answer\n })\n\n this.lru.set(key, answers)\n }\n\n remove (domain: string, type: ResponseType): void {\n const key = `${domain.toLowerCase()}-${type}`\n\n this.lru.remove(key)\n }\n\n clear (): void {\n this.lru.clear()\n }\n}\n\n/**\n * Avoid sending multiple queries for the same hostname by caching results\n */\nexport function cache (size: number): AnswerCache {\n return new CachedAnswers(size)\n}\n", "/**\n * @packageDocumentation\n *\n * Query DNS records using `node:dns`, DNS over HTTP and/or DNSJSON over HTTP.\n *\n * A list of publicly accessible servers can be found [here](https://github.com/curl/curl/wiki/DNS-over-HTTPS#publicly-available-servers).\n *\n * @example Using the default resolver\n *\n * ```TypeScript\n * import { dns } from '@multiformats/dns'\n *\n * const resolver = dns()\n *\n * // resolve A records with a 5s timeout\n * const result = await dns.query('google.com', {\n * signal: AbortSignal.timeout(5000)\n * })\n * ```\n *\n * @example Using per-TLD resolvers\n *\n * ```TypeScript\n * import { dns } from '@multiformats/dns'\n * import { dnsJsonOverHttps } from '@multiformats/dns/resolvers'\n *\n * const resolver = dns({\n * resolvers: {\n * // will only be used to resolve `.com` addresses\n * 'com.': dnsJsonOverHttps('https://cloudflare-dns.com/dns-query'),\n *\n * // this can also be an array, resolvers will be shuffled and tried in\n * // series\n * 'net.': [\n * dnsJsonOverHttps('https://dns.google/resolve'),\n * dnsJsonOverHttps('https://dns.pub/dns-query')\n * ],\n *\n * // will only be used to resolve all other addresses\n * '.': dnsJsonOverHttps('https://dnsforge.de/dns-query'),\n * }\n * })\n * ```\n *\n * @example Query for specific record types\n *\n * ```TypeScript\n * import { dns, RecordType } from '@multiformats/dns'\n *\n * const resolver = dns()\n *\n * // resolve only TXT records\n * const result = await dns.query('google.com', {\n * types: [\n * RecordType.TXT\n * ]\n * })\n * ```\n *\n * ## Caching\n *\n * Individual Aanswers are cached so. If you make a request, for which all\n * record types are cached, all values will be pulled from the cache.\n *\n * If any of the record types are not cached, a new request will be resolved as\n * if none of the records were cached, and the cache will be updated to include\n * the new results.\n *\n * @example Ignoring the cache\n *\n * ```TypeScript\n * import { dns, RecordType } from '@multiformats/dns'\n *\n * const resolver = dns()\n *\n * // do not used cached results, always resolve a new query\n * const result = await dns.query('google.com', {\n * cached: false\n * })\n * ```\n */\n\nimport { DNS as DNSClass } from './dns.ts'\nimport type { DNSResolver } from './resolvers/index.ts'\nimport type { ComponentLogger } from '@libp2p/interface'\nimport type { ProgressEvent, ProgressOptions } from 'progress-events'\n\n/**\n * A subset of DNS Record Types\n *\n * @see https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-4.\n */\nexport enum RecordType {\n A = 1,\n CNAME = 5,\n TXT = 16,\n AAAA = 28\n}\n\nexport interface Question {\n /**\n * The record name requested.\n */\n name: string\n\n /**\n * The type of DNS record requested.\n *\n * @see https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-4.\n */\n type: RecordType\n}\n\nexport interface Answer {\n /**\n * The record owner.\n */\n name: string\n\n /**\n * The type of DNS record.\n *\n * @see https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-4\n */\n type: RecordType\n\n /**\n * The number of seconds the answer can be stored in cache before it is\n * considered stale.\n */\n TTL: number\n\n /**\n * The value of the DNS record for the given name and type. The data will be\n * in text for standardized record types and in hex for unknown types.\n */\n data: string\n}\n\nexport interface DNSResponse {\n /**\n * The Response Code of the DNS Query.\n *\n * @see https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6\n */\n Status: number\n\n /**\n * If true, it means the truncated bit was set. This happens when the DNS\n * answer is larger than a single UDP or TCP packet.\n */\n TC: boolean\n\n /**\n * If true, it means the Recursive Desired bit was set.\n */\n RD: boolean\n\n /**\n * If true, it means the Recursion Available bit was set.\n */\n RA: boolean\n\n /**\n * If true, it means that every record in the answer was verified with DNSSEC.\n */\n AD: boolean\n\n /**\n * If true, the client asked to disable DNSSEC validation.\n */\n CD: boolean\n\n /**\n * The records that were requested.\n */\n Question: Question[]\n\n /**\n * Values for the records that were requested.\n */\n Answer: Answer[]\n}\n\n/**\n * The default maximum amount of recursion allowed during a query\n */\nexport const MAX_RECURSIVE_DEPTH = 32\n\nexport interface DNSResolverSorter {\n (a: DNSResolver, b: DNSResolver): -1 | 0 | 1\n}\n\nexport interface QueryOptions extends ProgressOptions<ResolveDnsProgressEvents> {\n signal?: AbortSignal\n\n /**\n * Do not use cached DNS entries\n *\n * @default false\n */\n cached?: boolean\n\n /**\n * The type or types of DNS records to resolve\n *\n * @default [RecordType.A, RecordType.AAAA]\n */\n types?: RecordType | RecordType[]\n\n /**\n * An optional logger\n */\n logger?: ComponentLogger\n}\n\nexport interface DNS {\n query(fqdn: string, options?: QueryOptions): Promise<DNSResponse>\n}\n\nexport type ResolveDnsProgressEvents =\n ProgressEvent<'dns:cache', string> |\n ProgressEvent<'dns:query', string> |\n ProgressEvent<'dns:response', DNSResponse> |\n ProgressEvent<'dns:error', Error>\n\nexport type DNSResolvers = Record<string, DNSResolver | DNSResolver[]>\n\nexport interface DNSInit {\n /**\n * A set of resolvers used to answer DNS queries\n *\n * String keys control which resolvers are used for which TLDs.\n *\n * @example\n *\n * ```TypeScript\n * import { dns } from '@multiformats/dns'\n * import { dnsOverHttps } from '@multiformats/dns'\n *\n * const resolver = dns({\n * resolvers: {\n * // only used for .com domains\n * 'com.': dnsOverHttps('https://example-1.com'),\n *\n * // only used for .net domains, can be an array\n * 'net.': [\n * dnsOverHttps('https://example-2.com'),\n * dnsOverHttps('https://example-3.com'),\n * ],\n *\n * // used for everything else (can be an array)\n * '.': dnsOverHttps('https://example-4.com')\n * }\n * })\n * ```\n */\n resolvers?: DNSResolvers\n\n /**\n * To avoid repeating DNS lookups, successful answers are cached according to\n * their TTL. To avoid exhausting memory, this option controls how many\n * answers to cache.\n *\n * @default 1000\n */\n cacheSize?: number\n\n /**\n * An optional logger\n */\n logger?: ComponentLogger\n\n /**\n * Sort resolvers before invoking them\n *\n * @default random\n */\n sorter?: DNSResolverSorter\n}\n\nexport function dns (init: DNSInit = {}): DNS {\n return new DNSClass(init)\n}\n", "export default class QuickLRU extends Map {\n\t#size = 0;\n\t#cache = new Map();\n\t#oldCache = new Map();\n\t#maxSize;\n\t#maxAge;\n\t#onEviction;\n\n\tconstructor(options = {}) {\n\t\tsuper();\n\n\t\tif (!(options.maxSize && options.maxSize > 0)) {\n\t\t\tthrow new TypeError('`maxSize` must be a number greater than 0');\n\t\t}\n\n\t\tif (typeof options.maxAge === 'number' && options.maxAge === 0) {\n\t\t\tthrow new TypeError('`maxAge` must be a number greater than 0');\n\t\t}\n\n\t\tthis.#maxSize = options.maxSize;\n\t\tthis.#maxAge = options.maxAge || Number.POSITIVE_INFINITY;\n\t\tthis.#onEviction = options.onEviction;\n\t}\n\n\t// For tests.\n\tget __oldCache() {\n\t\treturn this.#oldCache;\n\t}\n\n\t#emitEvictions(cache) {\n\t\tif (typeof this.#onEviction !== 'function') {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const [key, item] of cache) {\n\t\t\tthis.#onEviction(key, item.value);\n\t\t}\n\t}\n\n\t#deleteIfExpired(key, item) {\n\t\tif (typeof item.expiry === 'number' && item.expiry <= Date.now()) {\n\t\t\tif (typeof this.#onEviction === 'function') {\n\t\t\t\tthis.#onEviction(key, item.value);\n\t\t\t}\n\n\t\t\treturn this.delete(key);\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t#getOrDeleteIfExpired(key, item) {\n\t\tconst deleted = this.#deleteIfExpired(key, item);\n\t\tif (deleted === false) {\n\t\t\treturn item.value;\n\t\t}\n\t}\n\n\t#getItemValue(key, item) {\n\t\treturn item.expiry ? this.#getOrDeleteIfExpired(key, item) : item.value;\n\t}\n\n\t#peek(key, cache) {\n\t\tconst item = cache.get(key);\n\t\treturn this.#getItemValue(key, item);\n\t}\n\n\t#set(key, value) {\n\t\tthis.#cache.set(key, value);\n\t\tthis.#size++;\n\n\t\tif (this.#size >= this.#maxSize) {\n\t\t\tthis.#size = 0;\n\t\t\tthis.#emitEvictions(this.#oldCache);\n\t\t\tthis.#oldCache = this.#cache;\n\t\t\tthis.#cache = new Map();\n\t\t}\n\t}\n\n\t#moveToRecent(key, item) {\n\t\tthis.#oldCache.delete(key);\n\t\tthis.#set(key, item);\n\t}\n\n\t* #entriesAscending() {\n\t\tfor (const item of this.#oldCache) {\n\t\t\tconst [key, value] = item;\n\t\t\tif (!this.#cache.has(key)) {\n\t\t\t\tconst deleted = this.#deleteIfExpired(key, value);\n\t\t\t\tif (deleted === false) {\n\t\t\t\t\tyield item;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const item of this.#cache) {\n\t\t\tconst [key, value] = item;\n\t\t\tconst deleted = this.#deleteIfExpired(key, value);\n\t\t\tif (deleted === false) {\n\t\t\t\tyield item;\n\t\t\t}\n\t\t}\n\t}\n\n\tget(key) {\n\t\tif (this.#cache.has(key)) {\n\t\t\tconst item = this.#cache.get(key);\n\t\t\treturn this.#getItemValue(key, item);\n\t\t}\n\n\t\tif (this.#oldCache.has(key)) {\n\t\t\tconst item = this.#oldCache.get(key);\n\t\t\tif (this.#deleteIfExpired(key, item) === false) {\n\t\t\t\tthis.#moveToRecent(key, item);\n\t\t\t\treturn item.value;\n\t\t\t}\n\t\t}\n\t}\n\n\tset(key, value, {maxAge = this.#maxAge} = {}) {\n\t\tconst expiry = typeof maxAge === 'number' && maxAge !== Number.POSITIVE_INFINITY\n\t\t\t? (Date.now() + maxAge)\n\t\t\t: undefined;\n\n\t\tif (this.#cache.has(key)) {\n\t\t\tthis.#cache.set(key, {\n\t\t\t\tvalue,\n\t\t\t\texpiry,\n\t\t\t});\n\t\t} else {\n\t\t\tthis.#set(key, {value, expiry});\n\t\t}\n\n\t\treturn this;\n\t}\n\n\thas(key) {\n\t\tif (this.#cache.has(key)) {\n\t\t\treturn !this.#deleteIfExpired(key, this.#cache.get(key));\n\t\t}\n\n\t\tif (this.#oldCache.has(key)) {\n\t\t\treturn !this.#deleteIfExpired(key, this.#oldCache.get(key));\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tpeek(key) {\n\t\tif (this.#cache.has(key)) {\n\t\t\treturn this.#peek(key, this.#cache);\n\t\t}\n\n\t\tif (this.#oldCache.has(key)) {\n\t\t\treturn this.#peek(key, this.#oldCache);\n\t\t}\n\t}\n\n\texpiresIn(key) {\n\t\tconst item = this.#cache.get(key) ?? this.#oldCache.get(key);\n\t\tif (item) {\n\t\t\treturn item.expiry ? item.expiry - Date.now() : Number.POSITIVE_INFINITY;\n\t\t}\n\t}\n\n\tdelete(key) {\n\t\tconst deleted = this.#cache.delete(key);\n\t\tif (deleted) {\n\t\t\tthis.#size--;\n\t\t}\n\n\t\treturn this.#oldCache.delete(key) || deleted;\n\t}\n\n\tclear() {\n\t\tthis.#cache.clear();\n\t\tthis.#oldCache.clear();\n\t\tthis.#size = 0;\n\t}\n\n\tresize(newSize) {\n\t\tif (!(newSize && newSize > 0)) {\n\t\t\tthrow new TypeError('`maxSize` must be a number greater than 0');\n\t\t}\n\n\t\tconst items = [...this.#entriesAscending()];\n\t\tconst removeCount = items.length - newSize;\n\t\tif (removeCount < 0) {\n\t\t\tthis.#cache = new Map(items);\n\t\t\tthis.#oldCache = new Map();\n\t\t\tthis.#size = items.length;\n\t\t} else {\n\t\t\tif (removeCount > 0) {\n\t\t\t\tthis.#emitEvictions(items.slice(0, removeCount));\n\t\t\t}\n\n\t\t\tthis.#oldCache = new Map(items.slice(removeCount));\n\t\t\tthis.#cache = new Map();\n\t\t\tthis.#size = 0;\n\t\t}\n\n\t\tthis.#maxSize = newSize;\n\t}\n\n\tevict(count = 1) {\n\t\tconst requested = Number(count);\n\t\tif (!requested || requested <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst items = [...this.#entriesAscending()];\n\t\tconst evictCount = Math.trunc(Math.min(requested, Math.max(items.length - 1, 0)));\n\t\tif (evictCount <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#emitEvictions(items.slice(0, evictCount));\n\t\tthis.#oldCache = new Map(items.slice(evictCount));\n\t\tthis.#cache = new Map();\n\t\tthis.#size = 0;\n\t}\n\n\t* keys() {\n\t\tfor (const [key] of this) {\n\t\t\tyield key;\n\t\t}\n\t}\n\n\t* values() {\n\t\tfor (const [, value] of this) {\n\t\t\tyield value;\n\t\t}\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tfor (const item of this.#cache) {\n\t\t\tconst [key, value] = item;\n\t\t\tconst deleted = this.#deleteIfExpired(key, value);\n\t\t\tif (deleted === false) {\n\t\t\t\tyield [key, value.value];\n\t\t\t}\n\t\t}\n\n\t\tfor (const item of this.#oldCache) {\n\t\t\tconst [key, value] = item;\n\t\t\tif (!this.#cache.has(key)) {\n\t\t\t\tconst deleted = this.#deleteIfExpired(key, value);\n\t\t\t\tif (deleted === false) {\n\t\t\t\t\tyield [key, value.value];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t* entriesDescending() {\n\t\tlet items = [...this.#cache];\n\t\tfor (let i = items.length - 1; i >= 0; --i) {\n\t\t\tconst item = items[i];\n\t\t\tconst [key, value] = item;\n\t\t\tconst deleted = this.#deleteIfExpired(key, value);\n\t\t\tif (deleted === false) {\n\t\t\t\tyield [key, value.value];\n\t\t\t}\n\t\t}\n\n\t\titems = [...this.#oldCache];\n\t\tfor (let i = items.length - 1; i >= 0; --i) {\n\t\t\tconst item = items[i];\n\t\t\tconst [key, value] = item;\n\t\t\tif (!this.#cache.has(key)) {\n\t\t\t\tconst deleted = this.#deleteIfExpired(key, value);\n\t\t\t\tif (deleted === false) {\n\t\t\t\t\tyield [key, value.value];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t* entriesAscending() {\n\t\tfor (const [key, value] of this.#entriesAscending()) {\n\t\t\tyield [key, value.value];\n\t\t}\n\t}\n\n\tget size() {\n\t\tif (!this.#size) {\n\t\t\treturn this.#oldCache.size;\n\t\t}\n\n\t\tlet oldCacheSize = 0;\n\t\tfor (const key of this.#oldCache.keys()) {\n\t\t\tif (!this.#cache.has(key)) {\n\t\t\t\toldCacheSize++;\n\t\t\t}\n\t\t}\n\n\t\treturn Math.min(this.#size + oldCacheSize, this.#maxSize);\n\t}\n\n\tget maxSize() {\n\t\treturn this.#maxSize;\n\t}\n\n\tget maxAge() {\n\t\treturn this.#maxAge;\n\t}\n\n\tentries() {\n\t\treturn this.entriesAscending();\n\t}\n\n\tforEach(callbackFunction, thisArgument = this) {\n\t\tfor (const [key, value] of this.entriesAscending()) {\n\t\t\tcallbackFunction.call(thisArgument, value, key, this);\n\t\t}\n\t}\n\n\tget [Symbol.toStringTag]() {\n\t\treturn 'QuickLRU';\n\t}\n\n\ttoString() {\n\t\treturn `QuickLRU(${this.size}/${this.maxSize})`;\n\t}\n\n\t[Symbol.for('nodejs.util.inspect.custom')]() {\n\t\treturn this.toString();\n\t}\n}\n", "export class DNSLinkNotFoundError extends Error {\n static name = 'DNSLinkNotFoundError'\n\n constructor (message = 'DNSLink not found') {\n super(message)\n this.name = 'DNSLinkNotFoundError'\n }\n}\n\nexport class InvalidNamespaceError extends Error {\n static name = 'InvalidNamespaceError'\n\n constructor (message = 'Invalid namespace') {\n super(message)\n this.name = 'InvalidNamespaceError'\n }\n}\n", "import { CID } from 'multiformats/cid'\nimport { InvalidNamespaceError } from '../errors.ts'\nimport type { DNSLinkParser, DNSLinkIPFSResult } from '../index.ts'\nimport type { Answer } from '@multiformats/dns'\n\nexport const ipfs: DNSLinkParser<DNSLinkIPFSResult> = (value: string, answer: Answer): DNSLinkIPFSResult => {\n const [, protocol, cid, ...rest] = value.split('/')\n\n if (protocol !== 'ipfs') {\n throw new InvalidNamespaceError(`Namespace ${protocol} was not \"ipfs\"`)\n }\n\n // if the result is a CID, we've reached the end of the recursion\n return {\n namespace: 'ipfs',\n cid: CID.parse(cid),\n path: rest.length > 0 ? `/${rest.join('/')}` : '',\n answer\n }\n}\n", "import { CID } from 'multiformats/cid'\nimport { InvalidNamespaceError } from '../errors.ts'\nimport type { DNSLinkParser, DNSLinkIPNSResult, DNSLinkDNSLinkResult } from '../index.ts'\nimport type { Answer } from '@multiformats/dns'\n\nexport const ipns: DNSLinkParser<DNSLinkIPNSResult | DNSLinkDNSLinkResult> = (value: string, answer: Answer): DNSLinkIPNSResult | DNSLinkDNSLinkResult => {\n const [, protocol, peerId, ...rest] = value.split('/')\n\n if (protocol !== 'ipns') {\n throw new InvalidNamespaceError(`Namespace ${protocol} was not \"ipns\"`)\n }\n\n try {\n // if the result parses as a PeerId, we've reached the end of the recursion\n return {\n namespace: 'ipns',\n value: CID.parse(peerId).multihash,\n path: rest.length > 0 ? `/${rest.join('/')}` : '',\n answer\n }\n } catch {\n // if the value did not parse as a PeerId, it's probably another DNSLink\n return {\n namespace: 'dnslink',\n value: peerId,\n path: rest.length > 0 ? `/${rest.join('/')}` : '',\n answer\n }\n }\n}\n", "import { MAX_RECURSIVE_DEPTH, RecordType } from '@multiformats/dns'\nimport QuickLRU from 'quick-lru'\nimport { CACHE_MAX_AGE, CACHE_MAX_ANSWERS, CACHE_SIZE } from './constants.ts'\nimport { DNSLinkNotFoundError } from './errors.ts'\nimport { ipfs } from './namespaces/ipfs.ts'\nimport { ipns } from './namespaces/ipns.ts'\nimport type { DNSLink as DNSLinkInterface, ResolveDNSLinkOptions, DNSLinkOptions, DNSLinkComponents, DNSLinkParser, DNSLinkResolveResult } from './index.ts'\nimport type { Logger } from '@libp2p/interface'\nimport type { DNS } from '@multiformats/dns'\n\nexport class DNSLink <Namespaces extends Record<string, DNSLinkParser<DNSLinkResolveResult>>> implements DNSLinkInterface<ReturnType<Namespaces[keyof Namespaces]>> {\n private readonly dns: DNS\n private readonly log: Logger\n private readonly namespaces: Record<string, DNSLinkParser<any>>\n private readonly cache: QuickLRU<string, QuickLRU<number, ReturnType<Namespaces[keyof Namespaces]>>>\n private readonly cacheMaxAnswers: number\n\n constructor (components: DNSLinkComponents, init: DNSLinkOptions<Namespaces> = {}) {\n this.dns = components.dns\n this.log = components.logger.forComponent('helia:dnslink')\n this.namespaces = {\n ipfs,\n ipns,\n ...init.namespaces\n }\n this.cache = new QuickLRU({\n maxSize: init.cacheSize ?? CACHE_SIZE,\n maxAge: init.cacheMaxAge ?? CACHE_MAX_AGE\n })\n this.cacheMaxAnswers = init.cacheMaxAnswers ?? CACHE_MAX_ANSWERS\n }\n\n async resolve (domain: string, options: ResolveDNSLinkOptions = {}): Promise<Array<ReturnType<Namespaces[keyof Namespaces]>>> {\n if (options.nocache !== true) {\n // check the cache if allowed\n const cached = this.cache.get(domain)\n\n if (cached != null) {\n const answers = [...cached.values()]\n\n if (answers.length > 0) {\n return answers\n }\n }\n }\n\n const result = await this.recursiveResolveDomain(domain, options.maxRecursiveDepth ?? MAX_RECURSIVE_DEPTH, options)\n\n // cache answers according to individual TTLs\n const cache = new QuickLRU<number, ReturnType<Namespaces[keyof Namespaces]>>({\n maxSize: this.cacheMaxAnswers\n })\n\n result.forEach((result, index) => {\n cache.set(index, result, {\n maxAge: (result.answer.TTL * 1000)\n })\n })\n\n // find longest answer TTL\n let maxTTL = result.reduce((acc, curr) => {\n const ttl = (curr.answer.TTL * 1000)\n\n if (ttl > acc) {\n return ttl\n }\n\n return acc\n }, 0)\n\n // if the configured max age is less than the longest answer TTL, use that\n // instead\n if (this.cache.maxAge < maxTTL) {\n maxTTL = this.cache.maxAge\n }\n\n this.cache.set(domain, cache, {\n maxAge: maxTTL\n })\n\n return result\n }\n\n async recursiveResolveDomain (domain: string, depth: number, options: ResolveDNSLinkOptions = {}): Promise<Array<ReturnType<Namespaces[keyof Namespaces]>>> {\n if (depth === 0) {\n throw new Error('recursion limit exceeded')\n }\n\n // the DNSLink spec says records MUST be stored on the `_dnslink.` subdomain\n // so start looking for records there, we will fall back to the bare domain\n // if none are found\n if (!domain.startsWith('_dnslink.')) {\n domain = `_dnslink.${domain}`\n }\n\n try {\n return await this.recursiveResolveDnslink(domain, depth, options)\n } catch (err: any) {\n // If the code is not ENOTFOUND or ERR_DNSLINK_NOT_FOUND or ENODATA then throw the error\n if (err.code !== 'ENOTFOUND' && err.code !== 'ENODATA' && err.name !== 'DNSLinkNotFoundError' && err.name !== 'NotFoundError') {\n throw err\n }\n\n if (domain.startsWith('_dnslink.')) {\n // The supplied domain contains a _dnslink component\n // Check the non-_dnslink domain\n domain = domain.replace('_dnslink.', '')\n } else {\n // Check the _dnslink subdomain\n domain = `_dnslink.${domain}`\n }\n\n // If this throws then we propagate the error\n return this.recursiveResolveDnslink(domain, depth, options)\n }\n }\n\n async recursiveResolveDnslink (domain: string, depth: number, options: ResolveDNSLinkOptions = {}): Promise<Array<ReturnType<Namespaces[keyof Namespaces]>>> {\n if (depth === 0) {\n throw new Error('recursion limit exceeded')\n }\n\n this.log('query %s for TXT and CNAME records', domain)\n const txtRecordsResponse = await this.dns.query(domain, {\n ...options,\n types: [\n RecordType.TXT\n ]\n })\n\n // sort the TXT records to ensure deterministic processing\n const txtRecords = (txtRecordsResponse?.Answer ?? [])\n .sort((a, b) => a.data.localeCompare(b.data))\n\n this.log('found %d TXT records for %s', txtRecords.length, domain)\n\n const output: Array<ReturnType<Namespaces[keyof Namespaces]>> = []\n\n for (const answer of txtRecords) {\n try {\n let result = answer.data\n\n // strip leading and trailing \" characters\n if (result.startsWith('\"') && result.endsWith('\"')) {\n result = result.substring(1, result.length - 1)\n }\n\n if (!result.startsWith('dnslink=')) {\n // invalid record?\n continue\n }\n\n this.log('%s TXT %s', answer.name, result)\n\n result = result.replace('dnslink=', '')\n\n // result is now a `/ipfs/<cid>` or `/ipns/<cid>` string\n const [, protocol, domainOrCID] = result.split('/') // e.g. [\"\", \"ipfs\", \"<cid>\"]\n\n if (protocol === 'dnslink') {\n // if the result was another DNSLink domain, try to follow it\n output.push(...await this.recursiveResolveDomain(domainOrCID, depth - 1, options))\n continue\n }\n\n const parser = this.namespaces[protocol]\n\n if (parser == null) {\n this.log('unknown protocol \"%s\" in DNSLink record for domain: %s', protocol, domain)\n continue\n }\n\n const record = parser(result, answer)\n\n if (record.namespace === 'dnslink') {\n // if the result was another DNSLink domain, try to follow it\n output.push(...await this.recursiveResolveDomain(record.value, depth - 1, options))\n continue\n }\n\n output.push(parser(result, answer))\n } catch (err: any) {\n this.log.error('could not parse DNS link record for domain %s, %s - %e', domain, answer.data, err)\n }\n }\n\n if (output.length > 0) {\n return output\n }\n\n // no dnslink records found, try CNAMEs\n this.log('no DNSLink records found for %s, falling back to CNAME', domain)\n\n const cnameRecordsResponse = await this.dns.query(domain, {\n ...options,\n types: [\n RecordType.CNAME\n ]\n })\n\n // sort the CNAME records to ensure deterministic processing\n const cnameRecords = (cnameRecordsResponse?.Answer ?? [])\n .sort((a, b) => a.data.localeCompare(b.data))\n\n this.log('found %d CNAME records for %s', cnameRecords.length, domain)\n\n for (const cname of cnameRecords) {\n try {\n return await this.recursiveResolveDomain(cname.data, depth - 1, options)\n } catch (err: any) {\n this.log.error('domain %s cname %s had no DNSLink records - %e', domain, cname.data, err)\n }\n }\n\n throw new DNSLinkNotFoundError(`No DNSLink records found for domain: ${domain}`)\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["require_hashlru", "__commonJSMin", "exports", "module", "max", "size", "cache", "_cache", "update", "key", "value", "v", "index_exports", "__export", "dnsLink", "base10_exports", "__export", "base10", "empty", "equals", "aa", "bb", "ii", "coerce", "o", "toArrayBufferBackedArray", "fromString", "str", "output", "i", "MAX_ARGUMENTS_LENGTH", "toString", "b", "len", "res", "isByteArrayWithArrayBuffer", "toArrayBufferBackedArray", "base", "ALPHABET", "name", "caseInsensitive", "BASE_MAP", "j", "i", "x", "xc", "xl", "xu", "BASE", "LEADER", "FACTOR", "iFACTOR", "encode", "source", "zeroes", "length", "pbegin", "pend", "size", "b58", "carry", "it1", "it2", "str", "decodeUnsafe", "psz", "b256", "it3", "it4", "vch", "decode", "string", "buffer", "src", "_brrp__multiformats_scope_baseX", "base_x_default", "Encoder", "name", "prefix", "baseEncode", "bytes", "Decoder", "baseDecode", "prefixCodePoint", "text", "decoder", "or", "ComposedDecoder", "decoders", "input", "left", "right", "Codec", "from", "encode", "decode", "baseX", "alphabet", "caseInsensitive", "base_x_default", "coerce", "string", "alphabetIdx", "bitsPerChar", "end", "out", "bits", "buffer", "written", "i", "value", "data", "pad", "mask", "createAlphabetIdx", "lower", "upper", "rfc4648", "base10", "baseX", "base16_exports", "__export", "base16", "base16upper", "base16", "rfc4648", "base16upper", "base2_exports", "__export", "base2", "base2", "rfc4648", "base256emoji_exports", "__export", "base256emoji", "alphabet", "alphabetBytesToChars", "p", "c", "i", "alphabetCharsToBytes", "codePoint", "encode", "data", "decode", "str", "byts", "char", "byt", "base256emoji", "from", "base32_exports", "__export", "base32", "base32hex", "base32hexpad", "base32hexpadupper", "base32hexupper", "base32pad", "base32padupper", "base32upper", "base32z", "base32", "rfc4648", "base32upper", "base32pad", "base32padupper", "base32hex", "base32hexupper", "base32hexpad", "base32hexpadupper", "base32z", "base36_exports", "__export", "base36", "base36upper", "base36", "baseX", "base36upper", "base58_exports", "__export", "base58btc", "base58flickr", "base58btc", "baseX", "base58flickr", "base64_exports", "__export", "base64", "base64pad", "base64url", "base64urlpad", "base64", "rfc4648", "base64pad", "base64url", "base64urlpad", "base8_exports", "__export", "base8", "base8", "rfc4648", "identity_exports", "__export", "identity", "identity", "from", "buf", "toString", "coerce", "str", "fromString", "textEncoder", "textDecoder", "identity_exports", "__export", "identity", "encode_1", "encode", "MSB", "REST", "MSBALL", "INT", "num", "out", "offset", "oldOffset", "decode", "read", "MSB$1", "REST$1", "buf", "res", "shift", "counter", "b", "l", "N1", "N2", "N3", "N4", "N5", "N6", "N7", "N8", "N9", "length", "value", "varint", "_brrp_varint", "varint_default", "decode", "data", "offset", "varint_default", "encodeTo", "int", "target", "encodingLength", "create", "code", "digest", "size", "sizeOffset", "encodingLength", "digestOffset", "bytes", "encodeTo", "Digest", "decode", "multihash", "coerce", "equals", "a", "b", "data", "toArrayBufferBackedArray", "code", "name", "encode", "coerce", "digest", "input", "options", "create", "identity", "sha2_browser_exports", "__export", "sha256", "sha512", "DEFAULT_MIN_DIGEST_LENGTH", "from", "name", "code", "encode", "minDigestLength", "maxDigestLength", "Hasher", "input", "options", "result", "createDigest", "digest", "truncate", "create", "sha", "name", "data", "sha256", "from", "sha512", "format", "link", "base", "bytes", "version", "toStringV0", "baseCache", "base58btc", "toStringV1", "base32", "cache", "baseCache", "cid", "CID", "_CID", "version", "code", "multihash", "bytes", "toArrayBufferBackedArray", "DAG_PB_CODE", "SHA_256_CODE", "digest", "create", "other", "self", "unknown", "equals", "base", "format", "input", "value", "encodeCID", "cidSymbol", "decode", "remainder", "specs", "prefixSize", "multihashBytes", "coerce", "digestBytes", "Digest", "initialBytes", "offset", "next", "i", "length", "codec", "multihashCode", "digestSize", "size", "multihashSize", "source", "prefix", "parseCIDtoBytes", "decoder", "base58btc", "base32", "base36", "toStringV0", "toStringV1", "codeOffset", "encodingLength", "hashOffset", "encodeTo", "bases", "identity_exports", "base2_exports", "base8_exports", "base10_exports", "base16_exports", "base32_exports", "base36_exports", "base58_exports", "base64_exports", "base256emoji_exports", "hashes", "sha2_browser_exports", "allocUnsafe", "size", "createCodec", "name", "prefix", "encode", "decode", "string", "buf", "str", "ascii", "i", "allocUnsafe", "BASES", "bases", "import_hashlru", "RecordType", "MAX_RECURSIVE_DEPTH", "QuickLRU", "#size", "#cache", "#oldCache", "#maxSize", "#maxAge", "#onEviction", "options", "#emitEvictions", "cache", "key", "item", "#deleteIfExpired", "#getOrDeleteIfExpired", "#getItemValue", "#peek", "#set", "value", "#moveToRecent", "#entriesAscending", "maxAge", "expiry", "deleted", "newSize", "items", "removeCount", "count", "requested", "evictCount", "i", "oldCacheSize", "callbackFunction", "thisArgument", "DNSLinkNotFoundError", "message", "InvalidNamespaceError", "ipfs", "value", "answer", "protocol", "cid", "rest", "InvalidNamespaceError", "CID", "ipns", "value", "answer", "protocol", "peerId", "rest", "InvalidNamespaceError", "CID", "DNSLink", "components", "init", "ipfs", "ipns", "QuickLRU", "domain", "options", "cached", "answers", "result", "MAX_RECURSIVE_DEPTH", "cache", "index", "maxTTL", "acc", "curr", "ttl", "depth", "err", "txtRecords", "RecordType", "a", "b", "output", "answer", "protocol", "domainOrCID", "parser", "record", "cnameRecords", "cname", "DNSLinkNotFoundError", "dnsLink", "components", "options", "DNSLink"]
4
+ "sourcesContent": ["module.exports = function (max) {\n\n if (!max) throw Error('hashlru must have a max value, of type number, greater than 0')\n\n var size = 0, cache = Object.create(null), _cache = Object.create(null)\n\n function update (key, value) {\n cache[key] = value\n size ++\n if(size >= max) {\n size = 0\n _cache = cache\n cache = Object.create(null)\n }\n }\n\n return {\n has: function (key) {\n return cache[key] !== undefined || _cache[key] !== undefined\n },\n remove: function (key) {\n if(cache[key] !== undefined)\n cache[key] = undefined\n if(_cache[key] !== undefined)\n _cache[key] = undefined\n },\n get: function (key) {\n var v = cache[key]\n if(v !== undefined) return v\n if((v = _cache[key]) !== undefined) {\n update(key, v)\n return v\n }\n },\n set: function (key, value) {\n if(cache[key] !== undefined) cache[key] = value\n else update(key, value)\n },\n clear: function () {\n cache = Object.create(null)\n _cache = Object.create(null)\n }\n }\n}\n\n\n\n\n\n\n\n", "/**\n * @packageDocumentation\n *\n * [DNSLink](https://dnslink.dev/) operations using a Helia node.\n *\n * @example Using custom DNS over HTTPS resolvers\n *\n * To use custom resolvers, configure Helia's `dns` option:\n *\n * ```TypeScript\n * import { createHelia } from 'helia'\n * import { dnsLink } from '@helia/dnslink'\n * import { dns } from '@multiformats/dns'\n * import { dnsOverHttps } from '@multiformats/dns/resolvers'\n *\n * const node = await createHelia({\n * dns: dns({\n * resolvers: {\n * '.': dnsOverHttps('https://private-dns-server.me/dns-query')\n * }\n * })\n * }).start()\n * const name = dnsLink(node)\n *\n * const result = name.resolve('some-domain-with-dnslink-entry.com')\n * ```\n *\n * @example Resolving a domain with a dnslink entry\n *\n * Calling `resolve` with the `@helia/dnslink` instance:\n *\n * ```TypeScript\n * // resolve a CID from a TXT record in a DNS zone file, using the default\n * // resolver for the current platform eg:\n * // > dig _dnslink.ipfs.tech TXT\n * // ;; ANSWER SECTION:\n * // _dnslink.ipfs.tech. 60 IN CNAME _dnslink.ipfs-tech.on.fleek.co.\n * // _dnslink.ipfs-tech.on.fleek.co. 120 IN TXT \"dnslink=/ipfs/bafybe...\"\n *\n * import { createHelia } from 'helia'\n * import { dnsLink } from '@helia/dnslink'\n *\n * const node = await createHelia().start()\n * const name = dnsLink(node)\n *\n * const [{ answer }] = await name.resolve('blog.ipfs.tech')\n *\n * console.info(answer)\n * // { data: '/ipfs/bafybe...' }\n * ```\n *\n * @example Using DNS-Over-HTTPS\n *\n * This example uses the Mozilla provided RFC 1035 DNS over HTTPS service. This\n * uses binary DNS records so requires extra dependencies to process the\n * response which can increase browser bundle sizes.\n *\n * If this is a concern, use the DNS-JSON-Over-HTTPS resolver instead.\n *\n * ```TypeScript\n * import { createHelia } from 'helia'\n * import { dnsLink } from '@helia/dnslink'\n * import { dns } from '@multiformats/dns'\n * import { dnsOverHttps } from '@multiformats/dns/resolvers'\n *\n * const node = await createHelia({\n * dns: dns({\n * resolvers: {\n * '.': dnsOverHttps('https://mozilla.cloudflare-dns.com/dns-query')\n * }\n * })\n * }).start()\n * const name = dnsLink(node)\n *\n * const result = await name.resolve('blog.ipfs.tech')\n * ```\n *\n * @example Using DNS-JSON-Over-HTTPS\n *\n * DNS-JSON-Over-HTTPS resolvers use the RFC 8427 `application/dns-json` and can\n * result in a smaller browser bundle due to the response being plain JSON.\n *\n * ```TypeScript\n * import { createHelia } from 'helia'\n * import { dnsLink } from '@helia/dnslink'\n * import { dns } from '@multiformats/dns'\n * import { dnsJsonOverHttps } from '@multiformats/dns/resolvers'\n *\n * const node = await createHelia({\n * dns: dns({\n * resolvers: {\n * '.': dnsJsonOverHttps('https://mozilla.cloudflare-dns.com/dns-query')\n * }\n * })\n * }).start()\n * const name = dnsLink(node)\n *\n * const result = await name.resolve('blog.ipfs.tech')\n * ```\n */\n\nimport { DNSLink as DNSLinkClass } from './dnslink.ts'\nimport type { AbortOptions, ComponentLogger } from '@libp2p/interface'\nimport type { Answer, DNS, ResolveDnsProgressEvents as ResolveProgressEvents } from '@multiformats/dns'\nimport type { CID, MultihashDigest } from 'multiformats/cid'\nimport type { ProgressOptions } from 'progress-events'\n\nexport type { ResolveProgressEvents }\n\nexport interface ResolveDNSLinkOptions extends AbortOptions, ProgressOptions<ResolveProgressEvents> {\n /**\n * Do not query the network for the IPNS record\n *\n * @default false\n */\n offline?: boolean\n\n /**\n * Do not use cached DNS entries\n *\n * @default false\n */\n nocache?: boolean\n\n /**\n * When resolving DNSLink records that resolve to other DNSLink records, limit\n * how many times we will recursively resolve them.\n *\n * @default 32\n */\n maxRecursiveDepth?: number\n}\n\nexport interface DNSLinkIPFSResult {\n /**\n * The resolved record\n */\n answer: Answer\n\n /**\n * The IPFS namespace\n */\n namespace: 'ipfs'\n\n /**\n * The resolved value\n */\n cid: CID\n\n /**\n * If the resolved value is an IPFS path, it will be present here\n */\n path: string\n}\n\nexport interface DNSLinkIPNSResult {\n /**\n * The resolved record\n */\n answer: Answer\n\n /**\n * The IPNS namespace\n */\n namespace: 'ipns'\n\n /**\n * The resolved value\n */\n value: MultihashDigest\n\n /**\n * If the resolved value is an IPFS path, it will be present here\n */\n path: string\n}\n\nexport interface DNSLinkDNSLinkResult {\n /**\n * The resolved record\n */\n answer: Answer\n\n /**\n * The IPNS namespace\n */\n namespace: 'dnslink'\n\n /**\n * The resolved value\n */\n value: string\n\n /**\n * If the resolved value is an IPFS path, it will be present here\n */\n path: string\n}\n\nexport interface DNSLinkResolveResult {\n /**\n * The resolved record\n */\n answer: Answer\n\n /**\n * The namespace\n */\n namespace: string\n}\n\nexport interface DNSLinkParser<T extends DNSLinkResolveResult> {\n /**\n * Return a result parsed from a DNSLink value\n */\n (value: string, answer: Answer): T\n}\n\nexport interface DNSLink<DNSLinkResolveResults extends DNSLinkResolveResult = DNSLinkIPFSResult | DNSLinkIPNSResult> {\n /**\n * Resolve a CID from a dns-link style IPNS record\n *\n * @example\n *\n * ```TypeScript\n * import { createHelia } from 'helia'\n * import { dnsLink } from '@helia/dnslink'\n *\n * const helia = await createHelia()\n * const name = dnsLink(helia)\n *\n * const result = await name.resolve('ipfs.io', {\n * signal: AbortSignal.timeout(5_000)\n * })\n *\n * console.info(result) // { answer: ..., value: ... }\n * ```\n */\n resolve(domain: string, options?: ResolveDNSLinkOptions): Promise<Array<DNSLinkResolveResults | DNSLinkIPFSResult | DNSLinkIPNSResult>>\n}\n\nexport interface DNSLinkComponents {\n dns: DNS\n logger: ComponentLogger\n}\n\nexport interface DNSLinkOptions<Namespaces extends Record<string, DNSLinkParser<any>> = Record<string, DNSLinkParser<any>>> {\n /**\n * By default `/ipfs/...`, `/ipns/...` and `/dnslink/...` record values are\n * supported - to support other prefixes pass other value parsers here\n */\n namespaces?: Namespaces\n\n /**\n * How many DNSLink lookups to cache in memory\n *\n * @default 1_000\n */\n cacheSize?: number\n\n /**\n * The maximum number of Answers to cache for each domain\n *\n * @default 10\n */\n cacheMaxAnswers?: number\n\n /**\n * By default the DNS TTL will be used to calculate when a DNSLink lookup\n * should be evicted from the cache, unless one is not available in which case\n * this number of ms will be used.\n *\n * @default 30_000\n */\n cacheMaxAge?: number\n}\n\nexport function dnsLink <R extends DNSLinkResolveResult, T extends Record<string, DNSLinkParser<R>>> (components: DNSLinkComponents, options: DNSLinkOptions<T>): DNSLink<ReturnType<T[keyof T]>>\nexport function dnsLink (components: DNSLinkComponents, options?: DNSLinkOptions): DNSLink\nexport function dnsLink (components: DNSLinkComponents, options: DNSLinkOptions = {}): DNSLink {\n return new DNSLinkClass(components, options)\n}\n", "import { baseX } from './base.ts'\n\nexport const base10 = baseX({\n prefix: '9',\n name: 'base10',\n alphabet: '0123456789'\n})\n", "export const empty = new Uint8Array(0)\n\nexport function toHex (d: Uint8Array): string {\n return d.reduce((hex, byte) => hex + byte.toString(16).padStart(2, '0'), '')\n}\n\nexport function fromHex (hex: string): Uint8Array<ArrayBuffer> {\n const hexes = hex.match(/../g)\n return hexes != null ? new Uint8Array(hexes.map(b => parseInt(b, 16))) : empty\n}\n\nexport function equals (aa: Uint8Array, bb: Uint8Array): boolean {\n if (aa === bb) { return true }\n if (aa.byteLength !== bb.byteLength) {\n return false\n }\n\n for (let ii = 0; ii < aa.byteLength; ii++) {\n if (aa[ii] !== bb[ii]) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * Normalize binary input to a plain `Uint8Array` backed by an `ArrayBuffer`.\n *\n * Returns the input itself when it is already a plain `Uint8Array` over an\n * `ArrayBuffer`, otherwise a fresh view (or, for `SharedArrayBuffer`-backed\n * input, a copy) over the same bytes.\n *\n * Throws if input is not a recognised binary type.\n */\nexport function coerce (o: ArrayBufferView | ArrayBuffer | Uint8Array): Uint8Array<ArrayBuffer> {\n if (o instanceof Uint8Array && o.constructor.name === 'Uint8Array') {\n return toArrayBufferBackedArray(o)\n }\n if (o instanceof ArrayBuffer) {\n return new Uint8Array(o)\n }\n if (ArrayBuffer.isView(o)) {\n return toArrayBufferBackedArray(new Uint8Array(o.buffer, o.byteOffset, o.byteLength))\n }\n throw new Error('Unknown type, must be binary type')\n}\n\nexport function isBinary (o: unknown): o is ArrayBuffer | ArrayBufferView {\n return o instanceof ArrayBuffer || ArrayBuffer.isView(o)\n}\n\n/**\n * Convert the passed string into a byte array, constraining each character\n * value to a single byte\n */\nexport function fromString (str: string): Uint8Array<ArrayBuffer> {\n const output = new Uint8Array(str.length)\n\n for (let i = 0; i < str.length; i++) {\n output[i] = str.charCodeAt(i)\n }\n\n return output\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nconst MAX_ARGUMENTS_LENGTH = 0x1000\n\n/**\n * Convert the passed byte array to a string, interpreting each byte as a single\n * character\n */\nexport function toString (b: Uint8Array): string {\n const len = b.length\n\n if (len <= MAX_ARGUMENTS_LENGTH) {\n // @ts-expect-error cannot ordinarily apply a Uint8Array\n return String.fromCharCode.apply(String, b) // avoid extra subarray()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n let res = ''\n let i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n // @ts-expect-error cannot ordinarily apply a Uint8Array\n b.subarray(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction isByteArrayWithArrayBuffer (b?: Uint8Array): b is Uint8Array<ArrayBuffer> {\n return b?.buffer instanceof ArrayBuffer\n}\n\n/**\n * Ensures `b` is backed by an ArrayBuffer - if not a new Uint8Array will be\n * created and the contents of `b` copied into it.\n */\nexport function toArrayBufferBackedArray (b: Uint8Array): Uint8Array<ArrayBuffer> {\n if (isByteArrayWithArrayBuffer(b)) {\n return b\n }\n\n return b.slice()\n}\n", "/* eslint-disable */\n// base-x encoding / decoding\n// Copyright (c) 2018 base-x contributors\n// Copyright (c) 2014-2018 The Bitcoin Core developers (base58.cpp)\n// Distributed under the MIT software license, see the accompanying\n// file LICENSE or http://www.opensource.org/licenses/mit-license.php.\n/**\n * @param {string} ALPHABET\n * @param {any} name\n * @param {boolean} [caseInsensitive]\n */\nfunction base (ALPHABET, name, caseInsensitive) {\n if (ALPHABET.length >= 255) { throw new TypeError('Alphabet too long') }\n var BASE_MAP = new Uint8Array(256);\n for (var j = 0; j < BASE_MAP.length; j++) {\n BASE_MAP[j] = 255;\n }\n for (var i = 0; i < ALPHABET.length; i++) {\n var x = ALPHABET.charAt(i);\n var xc = x.charCodeAt(0);\n if (BASE_MAP[xc] !== 255) { throw new TypeError(x + ' is ambiguous') }\n BASE_MAP[xc] = i;\n // For case-insensitive codecs, map the opposite case to the same index so\n // differently cased input decodes without errors (multibase spec).\n if (caseInsensitive) {\n var xl = x.toLowerCase().charCodeAt(0);\n var xu = x.toUpperCase().charCodeAt(0);\n if (xl !== xc) { BASE_MAP[xl] = i; }\n if (xu !== xc) { BASE_MAP[xu] = i; }\n }\n }\n var BASE = ALPHABET.length;\n var LEADER = ALPHABET.charAt(0);\n var FACTOR = Math.log(BASE) / Math.log(256); // log(BASE) / log(256), rounded up\n var iFACTOR = Math.log(256) / Math.log(BASE); // log(256) / log(BASE), rounded up\n /**\n * @param {any[] | Iterable<number>} source\n */\n function encode (source) {\n // @ts-ignore\n if (source instanceof Uint8Array) ; else if (ArrayBuffer.isView(source)) {\n source = new Uint8Array(source.buffer, source.byteOffset, source.byteLength);\n } else if (Array.isArray(source)) {\n source = Uint8Array.from(source);\n }\n if (!(source instanceof Uint8Array)) { throw new TypeError('Expected Uint8Array') }\n if (source.length === 0) { return '' }\n // Skip & count leading zeroes.\n var zeroes = 0;\n var length = 0;\n var pbegin = 0;\n var pend = source.length;\n while (pbegin !== pend && source[pbegin] === 0) {\n pbegin++;\n zeroes++;\n }\n // Allocate enough space in big-endian base58 representation.\n var size = ((pend - pbegin) * iFACTOR + 1) >>> 0;\n var b58 = new Uint8Array(size);\n // Process the bytes.\n while (pbegin !== pend) {\n var carry = source[pbegin];\n // Apply \"b58 = b58 * 256 + ch\".\n var i = 0;\n for (var it1 = size - 1; (carry !== 0 || i < length) && (it1 !== -1); it1--, i++) {\n carry += (256 * b58[it1]) >>> 0;\n b58[it1] = (carry % BASE) >>> 0;\n carry = (carry / BASE) >>> 0;\n }\n if (carry !== 0) { throw new Error('Non-zero carry') }\n length = i;\n pbegin++;\n }\n // Skip leading zeroes in base58 result.\n var it2 = size - length;\n while (it2 !== size && b58[it2] === 0) {\n it2++;\n }\n // Translate the result into a string.\n var str = LEADER.repeat(zeroes);\n for (; it2 < size; ++it2) { str += ALPHABET.charAt(b58[it2]); }\n return str\n }\n /**\n * @param {string | string[]} source\n */\n function decodeUnsafe (source) {\n if (typeof source !== 'string') { throw new TypeError('Expected String') }\n if (source.length === 0) { return new Uint8Array() }\n var psz = 0;\n // Skip leading spaces.\n if (source[psz] === ' ') { return }\n // Skip and count leading '1's.\n var zeroes = 0;\n var length = 0;\n while (source[psz] === LEADER) {\n zeroes++;\n psz++;\n }\n // Allocate enough space in big-endian base256 representation.\n var size = (((source.length - psz) * FACTOR) + 1) >>> 0; // log(58) / log(256), rounded up.\n var b256 = new Uint8Array(size);\n // Process the characters.\n while (source[psz]) {\n // Decode character\n var carry = BASE_MAP[source.charCodeAt(psz)];\n // Invalid character\n if (carry === 255) { return }\n var i = 0;\n for (var it3 = size - 1; (carry !== 0 || i < length) && (it3 !== -1); it3--, i++) {\n carry += (BASE * b256[it3]) >>> 0;\n b256[it3] = (carry % 256) >>> 0;\n carry = (carry / 256) >>> 0;\n }\n if (carry !== 0) { throw new Error('Non-zero carry') }\n length = i;\n psz++;\n }\n // Skip trailing spaces.\n if (source[psz] === ' ') { return }\n // Skip leading zeroes in b256.\n var it4 = size - length;\n while (it4 !== size && b256[it4] === 0) {\n it4++;\n }\n var vch = new Uint8Array(zeroes + (size - it4));\n var j = zeroes;\n while (it4 !== size) {\n vch[j++] = b256[it4++];\n }\n return vch\n }\n /**\n * @param {string | string[]} string\n */\n function decode (string) {\n var buffer = decodeUnsafe(string);\n if (buffer) { return buffer }\n throw new Error(`Non-${name} character`)\n }\n return {\n encode: encode,\n decodeUnsafe: decodeUnsafe,\n decode: decode\n }\n}\nvar src = base;\n\nvar _brrp__multiformats_scope_baseX = src;\n\nexport default _brrp__multiformats_scope_baseX;\n", "import { coerce } from '../bytes.ts'\nimport basex from '../vendor/base-x.js'\nimport type { BaseCodec, BaseDecoder, BaseEncoder, CombobaseDecoder, Multibase, MultibaseCodec, MultibaseDecoder, MultibaseEncoder, UnibaseDecoder } from './interface.ts'\n\ninterface EncodeFn { (bytes: Uint8Array): string }\ninterface DecodeFn { (text: string): Uint8Array<ArrayBuffer> }\n\n/**\n * Class represents both BaseEncoder and MultibaseEncoder meaning it\n * can be used to encode to multibase or base encode without multibase\n * prefix.\n */\nclass Encoder<Base extends string, Prefix extends string> implements MultibaseEncoder<Prefix>, BaseEncoder {\n readonly name: Base\n readonly prefix: Prefix\n readonly baseEncode: EncodeFn\n\n constructor (name: Base, prefix: Prefix, baseEncode: EncodeFn) {\n this.name = name\n this.prefix = prefix\n this.baseEncode = baseEncode\n }\n\n encode (bytes: Uint8Array): Multibase<Prefix> {\n if (bytes instanceof Uint8Array) {\n return `${this.prefix}${this.baseEncode(bytes)}`\n } else {\n throw Error('Unknown type, must be binary type')\n }\n }\n}\n\n/**\n * Class represents both BaseDecoder and MultibaseDecoder so it could be used\n * to decode multibases (with matching prefix) or just base decode strings\n * with corresponding base encoding.\n */\nclass Decoder<Base extends string, Prefix extends string> implements MultibaseDecoder<Prefix>, UnibaseDecoder<Prefix>, BaseDecoder {\n readonly name: Base\n readonly prefix: Prefix\n readonly baseDecode: DecodeFn\n private readonly prefixCodePoint: number\n\n constructor (name: Base, prefix: Prefix, baseDecode: DecodeFn) {\n this.name = name\n this.prefix = prefix\n const prefixCodePoint = prefix.codePointAt(0)\n /* c8 ignore next 3 */\n if (prefixCodePoint === undefined) {\n throw new Error('Invalid prefix character')\n }\n this.prefixCodePoint = prefixCodePoint\n this.baseDecode = baseDecode\n }\n\n decode (text: string): Uint8Array<ArrayBuffer> {\n if (typeof text === 'string') {\n if (text.codePointAt(0) !== this.prefixCodePoint) {\n throw Error(`Unable to decode multibase string ${JSON.stringify(text)}, ${this.name} decoder only supports inputs prefixed with ${this.prefix}`)\n }\n return this.baseDecode(text.slice(this.prefix.length))\n } else {\n throw Error('Can only multibase decode strings')\n }\n }\n\n or<OtherPrefix extends string> (decoder: UnibaseDecoder<OtherPrefix> | ComposedDecoder<OtherPrefix>): ComposedDecoder<Prefix | OtherPrefix> {\n return or(this, decoder)\n }\n}\n\ntype Decoders<Prefix extends string> = Record<Prefix, UnibaseDecoder<Prefix>>\n\nclass ComposedDecoder<Prefix extends string> implements MultibaseDecoder<Prefix>, CombobaseDecoder<Prefix> {\n readonly decoders: Decoders<Prefix>\n\n constructor (decoders: Decoders<Prefix>) {\n this.decoders = decoders\n }\n\n or <OtherPrefix extends string> (decoder: UnibaseDecoder<OtherPrefix> | ComposedDecoder<OtherPrefix>): ComposedDecoder<Prefix | OtherPrefix> {\n return or(this, decoder)\n }\n\n decode (input: string): Uint8Array<ArrayBuffer> {\n const prefix = input[0] as Prefix\n const decoder = this.decoders[prefix]\n if (decoder != null) {\n return decoder.decode(input)\n } else {\n throw RangeError(`Unable to decode multibase string ${JSON.stringify(input)}, only inputs prefixed with ${Object.keys(this.decoders)} are supported`)\n }\n }\n}\n\nexport function or <L extends string, R extends string> (left: UnibaseDecoder<L> | CombobaseDecoder<L>, right: UnibaseDecoder<R> | CombobaseDecoder<R>): ComposedDecoder<L | R> {\n return new ComposedDecoder({\n ...(left.decoders ?? { [(left as UnibaseDecoder<L>).prefix]: left }),\n ...(right.decoders ?? { [(right as UnibaseDecoder<R>).prefix]: right })\n } as Decoders<L | R>)\n}\n\nexport class Codec<Base extends string, Prefix extends string> implements MultibaseCodec<Prefix>, MultibaseEncoder<Prefix>, MultibaseDecoder<Prefix>, BaseCodec, BaseEncoder, BaseDecoder {\n readonly name: Base\n readonly prefix: Prefix\n readonly baseEncode: EncodeFn\n readonly baseDecode: DecodeFn\n readonly encoder: Encoder<Base, Prefix>\n readonly decoder: Decoder<Base, Prefix>\n\n constructor (name: Base, prefix: Prefix, baseEncode: EncodeFn, baseDecode: DecodeFn) {\n this.name = name\n this.prefix = prefix\n this.baseEncode = baseEncode\n this.baseDecode = baseDecode\n this.encoder = new Encoder(name, prefix, baseEncode)\n this.decoder = new Decoder(name, prefix, baseDecode)\n }\n\n encode (input: Uint8Array): string {\n return this.encoder.encode(input)\n }\n\n decode (input: string): Uint8Array<ArrayBuffer> {\n return this.decoder.decode(input)\n }\n}\n\nexport function from <Base extends string, Prefix extends string> ({ name, prefix, encode, decode }: { name: Base, prefix: Prefix, encode: EncodeFn, decode: DecodeFn }): Codec<Base, Prefix> {\n return new Codec(name, prefix, encode, decode)\n}\n\nexport function baseX <Base extends string, Prefix extends string> ({ name, prefix, alphabet, caseInsensitive = false }: { name: Base, prefix: Prefix, alphabet: string, caseInsensitive?: boolean }): Codec<Base, Prefix> {\n const { encode, decode } = basex(alphabet, name, caseInsensitive)\n return from({\n prefix,\n name,\n encode,\n decode: (text: string): Uint8Array<ArrayBuffer> => coerce(decode(text))\n })\n}\n\nfunction decode (string: string, alphabetIdx: Record<string, number>, bitsPerChar: number, name: string): Uint8Array<ArrayBuffer> {\n // Count the padding bytes:\n let end = string.length\n while (string[end - 1] === '=') {\n --end\n }\n\n // Allocate the output:\n const out = new Uint8Array((end * bitsPerChar / 8) | 0)\n\n // Parse the data:\n let bits = 0 // Number of bits currently in the buffer\n let buffer = 0 // Bits waiting to be written out, MSB first\n let written = 0 // Next byte to write\n for (let i = 0; i < end; ++i) {\n // Read one character from the string:\n const value = alphabetIdx[string[i]]\n if (value === undefined) {\n throw new SyntaxError(`Non-${name} character`)\n }\n\n // Append the bits to the buffer:\n buffer = (buffer << bitsPerChar) | value\n bits += bitsPerChar\n\n // Write out some bits if the buffer has a byte's worth:\n if (bits >= 8) {\n bits -= 8\n out[written++] = 0xff & (buffer >> bits)\n }\n }\n\n // Verify that we have received just enough bits:\n if (bits >= bitsPerChar || (0xff & (buffer << (8 - bits))) !== 0) {\n throw new SyntaxError('Unexpected end of data')\n }\n\n return out\n}\n\nfunction encode (data: Uint8Array, alphabet: string, bitsPerChar: number): string {\n const pad = alphabet[alphabet.length - 1] === '='\n const mask = (1 << bitsPerChar) - 1\n let out = ''\n\n let bits = 0 // Number of bits currently in the buffer\n let buffer = 0 // Bits waiting to be written out, MSB first\n for (let i = 0; i < data.length; ++i) {\n // Slurp data into the buffer:\n buffer = (buffer << 8) | data[i]\n bits += 8\n\n // Write out as much as we can:\n while (bits > bitsPerChar) {\n bits -= bitsPerChar\n out += alphabet[mask & (buffer >> bits)]\n }\n }\n\n // Partial character:\n if (bits !== 0) {\n out += alphabet[mask & (buffer << (bitsPerChar - bits))]\n }\n\n // Add padding characters until we hit a byte boundary:\n if (pad) {\n while (((out.length * bitsPerChar) & 7) !== 0) {\n out += '='\n }\n }\n\n return out\n}\n\nfunction createAlphabetIdx (alphabet: string, caseInsensitive: boolean): Record<string, number> {\n // Build the character lookup table:\n const alphabetIdx: Record<string, number> = {}\n for (let i = 0; i < alphabet.length; ++i) {\n alphabetIdx[alphabet[i]] = i\n // For case-insensitive codecs, map the opposite case to the same index so\n // differently cased input decodes without errors (multibase spec).\n if (caseInsensitive) {\n const lower = alphabet[i].toLowerCase()\n const upper = alphabet[i].toUpperCase()\n if (lower !== alphabet[i]) {\n alphabetIdx[lower] = i\n }\n if (upper !== alphabet[i]) {\n alphabetIdx[upper] = i\n }\n }\n }\n return alphabetIdx\n}\n\n/**\n * RFC4648 Factory\n */\nexport function rfc4648 <Base extends string, Prefix extends string> ({ name, prefix, bitsPerChar, alphabet, caseInsensitive = false }: { name: Base, prefix: Prefix, bitsPerChar: number, alphabet: string, caseInsensitive?: boolean }): Codec<Base, Prefix> {\n const alphabetIdx = createAlphabetIdx(alphabet, caseInsensitive)\n return from({\n prefix,\n name,\n encode (input: Uint8Array): string {\n return encode(input, alphabet, bitsPerChar)\n },\n decode (input: string): Uint8Array<ArrayBuffer> {\n return decode(input, alphabetIdx, bitsPerChar, name)\n }\n })\n}\n", "import { rfc4648 } from './base.ts'\n\nexport const base16 = rfc4648({\n prefix: 'f',\n name: 'base16',\n alphabet: '0123456789abcdef',\n bitsPerChar: 4,\n caseInsensitive: true\n})\n\nexport const base16upper = rfc4648({\n prefix: 'F',\n name: 'base16upper',\n alphabet: '0123456789ABCDEF',\n bitsPerChar: 4,\n caseInsensitive: true\n})\n", "import { rfc4648 } from './base.ts'\n\nexport const base2 = rfc4648({\n prefix: '0',\n name: 'base2',\n alphabet: '01',\n bitsPerChar: 1\n})\n", "import { from } from './base.ts'\n\nconst alphabet = Array.from('\uD83D\uDE80\uD83E\uDE90\u2604\uD83D\uDEF0\uD83C\uDF0C\uD83C\uDF11\uD83C\uDF12\uD83C\uDF13\uD83C\uDF14\uD83C\uDF15\uD83C\uDF16\uD83C\uDF17\uD83C\uDF18\uD83C\uDF0D\uD83C\uDF0F\uD83C\uDF0E\uD83D\uDC09\u2600\uD83D\uDCBB\uD83D\uDDA5\uD83D\uDCBE\uD83D\uDCBF\uD83D\uDE02\u2764\uD83D\uDE0D\uD83E\uDD23\uD83D\uDE0A\uD83D\uDE4F\uD83D\uDC95\uD83D\uDE2D\uD83D\uDE18\uD83D\uDC4D\uD83D\uDE05\uD83D\uDC4F\uD83D\uDE01\uD83D\uDD25\uD83E\uDD70\uD83D\uDC94\uD83D\uDC96\uD83D\uDC99\uD83D\uDE22\uD83E\uDD14\uD83D\uDE06\uD83D\uDE44\uD83D\uDCAA\uD83D\uDE09\u263A\uD83D\uDC4C\uD83E\uDD17\uD83D\uDC9C\uD83D\uDE14\uD83D\uDE0E\uD83D\uDE07\uD83C\uDF39\uD83E\uDD26\uD83C\uDF89\uD83D\uDC9E\u270C\u2728\uD83E\uDD37\uD83D\uDE31\uD83D\uDE0C\uD83C\uDF38\uD83D\uDE4C\uD83D\uDE0B\uD83D\uDC97\uD83D\uDC9A\uD83D\uDE0F\uD83D\uDC9B\uD83D\uDE42\uD83D\uDC93\uD83E\uDD29\uD83D\uDE04\uD83D\uDE00\uD83D\uDDA4\uD83D\uDE03\uD83D\uDCAF\uD83D\uDE48\uD83D\uDC47\uD83C\uDFB6\uD83D\uDE12\uD83E\uDD2D\u2763\uD83D\uDE1C\uD83D\uDC8B\uD83D\uDC40\uD83D\uDE2A\uD83D\uDE11\uD83D\uDCA5\uD83D\uDE4B\uD83D\uDE1E\uD83D\uDE29\uD83D\uDE21\uD83E\uDD2A\uD83D\uDC4A\uD83E\uDD73\uD83D\uDE25\uD83E\uDD24\uD83D\uDC49\uD83D\uDC83\uD83D\uDE33\u270B\uD83D\uDE1A\uD83D\uDE1D\uD83D\uDE34\uD83C\uDF1F\uD83D\uDE2C\uD83D\uDE43\uD83C\uDF40\uD83C\uDF37\uD83D\uDE3B\uD83D\uDE13\u2B50\u2705\uD83E\uDD7A\uD83C\uDF08\uD83D\uDE08\uD83E\uDD18\uD83D\uDCA6\u2714\uD83D\uDE23\uD83C\uDFC3\uD83D\uDC90\u2639\uD83C\uDF8A\uD83D\uDC98\uD83D\uDE20\u261D\uD83D\uDE15\uD83C\uDF3A\uD83C\uDF82\uD83C\uDF3B\uD83D\uDE10\uD83D\uDD95\uD83D\uDC9D\uD83D\uDE4A\uD83D\uDE39\uD83D\uDDE3\uD83D\uDCAB\uD83D\uDC80\uD83D\uDC51\uD83C\uDFB5\uD83E\uDD1E\uD83D\uDE1B\uD83D\uDD34\uD83D\uDE24\uD83C\uDF3C\uD83D\uDE2B\u26BD\uD83E\uDD19\u2615\uD83C\uDFC6\uD83E\uDD2B\uD83D\uDC48\uD83D\uDE2E\uD83D\uDE46\uD83C\uDF7B\uD83C\uDF43\uD83D\uDC36\uD83D\uDC81\uD83D\uDE32\uD83C\uDF3F\uD83E\uDDE1\uD83C\uDF81\u26A1\uD83C\uDF1E\uD83C\uDF88\u274C\u270A\uD83D\uDC4B\uD83D\uDE30\uD83E\uDD28\uD83D\uDE36\uD83E\uDD1D\uD83D\uDEB6\uD83D\uDCB0\uD83C\uDF53\uD83D\uDCA2\uD83E\uDD1F\uD83D\uDE41\uD83D\uDEA8\uD83D\uDCA8\uD83E\uDD2C\u2708\uD83C\uDF80\uD83C\uDF7A\uD83E\uDD13\uD83D\uDE19\uD83D\uDC9F\uD83C\uDF31\uD83D\uDE16\uD83D\uDC76\uD83E\uDD74\u25B6\u27A1\u2753\uD83D\uDC8E\uD83D\uDCB8\u2B07\uD83D\uDE28\uD83C\uDF1A\uD83E\uDD8B\uD83D\uDE37\uD83D\uDD7A\u26A0\uD83D\uDE45\uD83D\uDE1F\uD83D\uDE35\uD83D\uDC4E\uD83E\uDD32\uD83E\uDD20\uD83E\uDD27\uD83D\uDCCC\uD83D\uDD35\uD83D\uDC85\uD83E\uDDD0\uD83D\uDC3E\uD83C\uDF52\uD83D\uDE17\uD83E\uDD11\uD83C\uDF0A\uD83E\uDD2F\uD83D\uDC37\u260E\uD83D\uDCA7\uD83D\uDE2F\uD83D\uDC86\uD83D\uDC46\uD83C\uDFA4\uD83D\uDE47\uD83C\uDF51\u2744\uD83C\uDF34\uD83D\uDCA3\uD83D\uDC38\uD83D\uDC8C\uD83D\uDCCD\uD83E\uDD40\uD83E\uDD22\uD83D\uDC45\uD83D\uDCA1\uD83D\uDCA9\uD83D\uDC50\uD83D\uDCF8\uD83D\uDC7B\uD83E\uDD10\uD83E\uDD2E\uD83C\uDFBC\uD83E\uDD75\uD83D\uDEA9\uD83C\uDF4E\uD83C\uDF4A\uD83D\uDC7C\uD83D\uDC8D\uD83D\uDCE3\uD83E\uDD42')\nconst alphabetBytesToChars: string[] = (alphabet.reduce<string[]>((p, c, i) => { p[i] = c; return p }, ([])))\nconst alphabetCharsToBytes: number[] = (alphabet.reduce<number[]>((p, c, i) => {\n const codePoint = c.codePointAt(0)\n if (codePoint == null) {\n throw new Error(`Invalid character: ${c}`)\n }\n p[codePoint] = i\n return p\n}, ([])))\n\nfunction encode (data: Uint8Array): string {\n return data.reduce((p, c) => {\n p += alphabetBytesToChars[c]\n return p\n }, '')\n}\n\nfunction decode (str: string): Uint8Array<ArrayBuffer> {\n const byts = []\n for (const char of str) {\n const codePoint = char.codePointAt(0)\n if (codePoint == null) {\n throw new Error(`Invalid character: ${char}`)\n }\n const byt = alphabetCharsToBytes[codePoint]\n if (byt == null) {\n throw new Error(`Non-base256emoji character: ${char}`)\n }\n byts.push(byt)\n }\n return new Uint8Array(byts)\n}\n\nexport const base256emoji = from({\n prefix: '\uD83D\uDE80',\n name: 'base256emoji',\n encode,\n decode\n})\n", "import { rfc4648 } from './base.ts'\n\nexport const base32 = rfc4648({\n prefix: 'b',\n name: 'base32',\n alphabet: 'abcdefghijklmnopqrstuvwxyz234567',\n bitsPerChar: 5,\n caseInsensitive: true\n})\n\nexport const base32upper = rfc4648({\n prefix: 'B',\n name: 'base32upper',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567',\n bitsPerChar: 5,\n caseInsensitive: true\n})\n\nexport const base32pad = rfc4648({\n prefix: 'c',\n name: 'base32pad',\n alphabet: 'abcdefghijklmnopqrstuvwxyz234567=',\n bitsPerChar: 5,\n caseInsensitive: true\n})\n\nexport const base32padupper = rfc4648({\n prefix: 'C',\n name: 'base32padupper',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=',\n bitsPerChar: 5,\n caseInsensitive: true\n})\n\nexport const base32hex = rfc4648({\n prefix: 'v',\n name: 'base32hex',\n alphabet: '0123456789abcdefghijklmnopqrstuv',\n bitsPerChar: 5,\n caseInsensitive: true\n})\n\nexport const base32hexupper = rfc4648({\n prefix: 'V',\n name: 'base32hexupper',\n alphabet: '0123456789ABCDEFGHIJKLMNOPQRSTUV',\n bitsPerChar: 5,\n caseInsensitive: true\n})\n\nexport const base32hexpad = rfc4648({\n prefix: 't',\n name: 'base32hexpad',\n alphabet: '0123456789abcdefghijklmnopqrstuv=',\n bitsPerChar: 5,\n caseInsensitive: true\n})\n\nexport const base32hexpadupper = rfc4648({\n prefix: 'T',\n name: 'base32hexpadupper',\n alphabet: '0123456789ABCDEFGHIJKLMNOPQRSTUV=',\n bitsPerChar: 5,\n caseInsensitive: true\n})\n\nexport const base32z = rfc4648({\n prefix: 'h',\n name: 'base32z',\n alphabet: 'ybndrfg8ejkmcpqxot1uwisza345h769',\n bitsPerChar: 5\n})\n", "import { baseX } from './base.ts'\n\nexport const base36 = baseX({\n prefix: 'k',\n name: 'base36',\n alphabet: '0123456789abcdefghijklmnopqrstuvwxyz',\n caseInsensitive: true\n})\n\nexport const base36upper = baseX({\n prefix: 'K',\n name: 'base36upper',\n alphabet: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n caseInsensitive: true\n})\n", "import { baseX } from './base.ts'\n\nexport const base58btc = baseX({\n name: 'base58btc',\n prefix: 'z',\n alphabet: '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n})\n\nexport const base58flickr = baseX({\n name: 'base58flickr',\n prefix: 'Z',\n alphabet: '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'\n})\n", "import { rfc4648 } from './base.ts'\n\nexport const base64 = rfc4648({\n prefix: 'm',\n name: 'base64',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',\n bitsPerChar: 6\n})\n\nexport const base64pad = rfc4648({\n prefix: 'M',\n name: 'base64pad',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n bitsPerChar: 6\n})\n\nexport const base64url = rfc4648({\n prefix: 'u',\n name: 'base64url',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',\n bitsPerChar: 6\n})\n\nexport const base64urlpad = rfc4648({\n prefix: 'U',\n name: 'base64urlpad',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=',\n bitsPerChar: 6\n})\n", "import { rfc4648 } from './base.ts'\n\nexport const base8 = rfc4648({\n prefix: '7',\n name: 'base8',\n alphabet: '01234567',\n bitsPerChar: 3\n})\n", "import { coerce, fromString, toString } from '../bytes.ts'\nimport { from } from './base.ts'\n\nexport const identity = from({\n prefix: '\\x00',\n name: 'identity',\n encode: (buf) => toString(coerce(buf)),\n decode: (str) => coerce(fromString(str))\n})\n", "import type { ArrayBufferView, ByteView } from './interface.ts'\n\nconst textEncoder = new TextEncoder()\nconst textDecoder = new TextDecoder()\n\nexport const name = 'json'\nexport const code = 0x0200\n\nexport function encode <T> (node: T): ByteView<T, ArrayBuffer> {\n return textEncoder.encode(JSON.stringify(node))\n}\n\nexport function decode <T> (data: ByteView<T> | ArrayBufferView<T>): T {\n return JSON.parse(textDecoder.decode(data))\n}\n", "import { coerce } from '../bytes.ts'\nimport * as Digest from './digest.ts'\nimport type { DigestOptions } from './hasher.ts'\nimport type { SyncMultihashHasher } from './interface.ts'\n\nconst code: 0x0 = 0x0\nconst name = 'identity'\n\nconst encode: (input: Uint8Array) => Uint8Array<ArrayBuffer> = coerce\n\nfunction digest (input: Uint8Array, options?: DigestOptions): Digest.Digest<typeof code, number> {\n if (options?.truncate != null && options.truncate !== input.byteLength) {\n if (options.truncate < 0 || options.truncate > input.byteLength) {\n throw new Error(`Invalid truncate option, must be less than or equal to ${input.byteLength}`)\n }\n\n input = input.subarray(0, options.truncate)\n }\n\n return Digest.create(code, encode(input))\n}\n\nexport const identity: SyncMultihashHasher<0x00> = { code, name, encode, digest }\n", "/* eslint-disable */\nvar encode_1 = encode;\n\nvar MSB = 0x80\n , REST = 0x7F\n , MSBALL = ~REST\n , INT = Math.pow(2, 31);\n\n/**\n * @param {number} num\n * @param {number[]} out\n * @param {number} offset\n */\nfunction encode(num, out, offset) {\n out = out || [];\n offset = offset || 0;\n var oldOffset = offset;\n\n while(num >= INT) {\n out[offset++] = (num & 0xFF) | MSB;\n num /= 128;\n }\n while(num & MSBALL) {\n out[offset++] = (num & 0xFF) | MSB;\n num >>>= 7;\n }\n out[offset] = num | 0;\n \n // @ts-ignore\n encode.bytes = offset - oldOffset + 1;\n \n return out\n}\n\nvar decode = read;\n\nvar MSB$1 = 0x80\n , REST$1 = 0x7F;\n\n/**\n * @param {string | any[]} buf\n * @param {number} offset\n */\nfunction read(buf, offset) {\n var res = 0\n , offset = offset || 0\n , shift = 0\n , counter = offset\n , b\n , l = buf.length;\n\n do {\n if (counter >= l) {\n // @ts-ignore\n read.bytes = 0;\n throw new RangeError('Could not decode varint')\n }\n b = buf[counter++];\n res += shift < 28\n ? (b & REST$1) << shift\n : (b & REST$1) * Math.pow(2, shift);\n shift += 7;\n } while (b >= MSB$1)\n\n // @ts-ignore\n read.bytes = counter - offset;\n\n return res\n}\n\nvar N1 = Math.pow(2, 7);\nvar N2 = Math.pow(2, 14);\nvar N3 = Math.pow(2, 21);\nvar N4 = Math.pow(2, 28);\nvar N5 = Math.pow(2, 35);\nvar N6 = Math.pow(2, 42);\nvar N7 = Math.pow(2, 49);\nvar N8 = Math.pow(2, 56);\nvar N9 = Math.pow(2, 63);\n\nvar length = function (/** @type {number} */ value) {\n return (\n value < N1 ? 1\n : value < N2 ? 2\n : value < N3 ? 3\n : value < N4 ? 4\n : value < N5 ? 5\n : value < N6 ? 6\n : value < N7 ? 7\n : value < N8 ? 8\n : value < N9 ? 9\n : 10\n )\n};\n\nvar varint = {\n encode: encode_1\n , decode: decode\n , encodingLength: length\n};\n\nvar _brrp_varint = varint;\n\nexport default _brrp_varint;\n", "import varint from './vendor/varint.js'\n\nexport function decode (data: Uint8Array, offset = 0): [number, number] {\n const code = varint.decode(data, offset)\n return [code, varint.decode.bytes]\n}\n\nexport function encodeTo <T extends ArrayBufferLike> (int: number, target: Uint8Array<T>, offset = 0): Uint8Array<T> {\n varint.encode(int, target, offset)\n return target\n}\n\nexport function encodingLength (int: number): number {\n return varint.encodingLength(int)\n}\n", "import { coerce, equals as equalBytes, toArrayBufferBackedArray } from '../bytes.ts'\nimport * as varint from '../varint.ts'\nimport type { MultihashDigest } from './interface.ts'\n\n/**\n * Creates a multihash digest.\n */\nexport function create <Code extends number> (code: Code, digest: Uint8Array): Digest<Code, number> {\n const size = digest.byteLength\n const sizeOffset = varint.encodingLength(code)\n const digestOffset = sizeOffset + varint.encodingLength(size)\n\n const bytes = new Uint8Array(digestOffset + size)\n varint.encodeTo(code, bytes, 0)\n varint.encodeTo(size, bytes, sizeOffset)\n bytes.set(digest, digestOffset)\n\n return new Digest(code, size, digest, bytes)\n}\n\n/**\n * Turns bytes representation of multihash digest into an instance.\n */\nexport function decode (multihash: Uint8Array): MultihashDigest {\n const bytes = coerce(multihash)\n const [code, sizeOffset] = varint.decode(bytes)\n const [size, digestOffset] = varint.decode(bytes.subarray(sizeOffset))\n const digest = bytes.subarray(sizeOffset + digestOffset)\n\n if (digest.byteLength !== size) {\n throw new Error('Incorrect length')\n }\n\n return new Digest(code, size, digest, bytes)\n}\n\nexport function equals (a: MultihashDigest, b: unknown): b is MultihashDigest {\n if (a === b) {\n return true\n } else {\n const data = b as { code?: unknown, size?: unknown, bytes?: unknown }\n\n return (\n a.code === data.code &&\n a.size === data.size &&\n data.bytes instanceof Uint8Array &&\n equalBytes(a.bytes, data.bytes)\n )\n }\n}\n\n/**\n * Represents a multihash digest which carries information about the\n * hashing algorithm and an actual hash digest.\n */\nexport class Digest<Code extends number, Size extends number> implements MultihashDigest {\n readonly code: Code\n readonly size: Size\n readonly digest: Uint8Array<ArrayBuffer>\n readonly bytes: Uint8Array<ArrayBuffer>\n\n /**\n * Creates a multihash digest.\n */\n constructor (code: Code, size: Size, digest: Uint8Array, bytes: Uint8Array) {\n this.code = code\n this.size = size\n this.digest = toArrayBufferBackedArray(digest)\n this.bytes = toArrayBufferBackedArray(bytes)\n }\n}\n\n/**\n * Used to check that the passed multihash has the passed code\n */\nexport function hasCode <T extends number> (digest: MultihashDigest, code: T): digest is MultihashDigest<T> {\n return digest.code === code\n}\n", "import { from } from './hasher.ts'\n\nfunction sha (name: AlgorithmIdentifier): (data: Uint8Array<ArrayBuffer>) => Promise<Uint8Array<ArrayBuffer>> {\n return async data => new Uint8Array(await crypto.subtle.digest(name, data))\n}\n\nexport const sha256 = from({\n name: 'sha2-256',\n code: 0x12,\n encode: sha('SHA-256')\n})\n\nexport const sha512 = from({\n name: 'sha2-512',\n code: 0x13,\n encode: sha('SHA-512')\n})\n", "import * as Digest from './digest.ts'\nimport type { MultihashHasher } from './interface.ts'\n\ntype Await<T> = Promise<T> | T\n\nconst DEFAULT_MIN_DIGEST_LENGTH = 20\n\nexport interface HasherInit <Name extends string, Code extends number> {\n name: Name\n code: Code\n encode(input: Uint8Array): Await<Uint8Array<ArrayBuffer>>\n\n /**\n * The minimum length a hash is allowed to be truncated to in bytes\n *\n * @default 20\n */\n minDigestLength?: number\n\n /**\n * The maximum length a hash is allowed to be truncated to in bytes. If not\n * specified it will be inferred from the length of the digest.\n */\n maxDigestLength?: number\n}\n\nexport function from <Name extends string, Code extends number> ({ name, code, encode, minDigestLength, maxDigestLength }: HasherInit<Name, Code>): MultihashHasher<Code> {\n return new Hasher(name, code, encode, minDigestLength, maxDigestLength)\n}\n\nexport interface DigestOptions {\n /**\n * Truncate the returned digest to this number of bytes.\n *\n * This may cause the digest method to throw/reject if the passed value is\n * greater than the digest length or below a threshold under which the risk of\n * hash collisions is significant.\n *\n * The actual value of this threshold can depend on the hashing algorithm in\n * use.\n */\n truncate?: number\n}\n\n/**\n * Hasher represents a hashing algorithm implementation that produces as\n * `MultihashDigest`.\n */\nexport class Hasher<Name extends string, Code extends number> implements MultihashHasher<Code> {\n readonly name: Name\n readonly code: Code\n readonly encode: (input: Uint8Array) => Await<Uint8Array<ArrayBuffer>>\n readonly minDigestLength: number\n readonly maxDigestLength?: number\n\n constructor (name: Name, code: Code, encode: (input: Uint8Array) => Await<Uint8Array<ArrayBuffer>>, minDigestLength?: number, maxDigestLength?: number) {\n this.name = name\n this.code = code\n this.encode = encode\n this.minDigestLength = minDigestLength ?? DEFAULT_MIN_DIGEST_LENGTH\n this.maxDigestLength = maxDigestLength\n }\n\n digest (input: Uint8Array, options?: DigestOptions): Await<Digest.Digest<Code, number>> {\n if (options?.truncate != null) {\n if (options.truncate < this.minDigestLength) {\n throw new Error(`Invalid truncate option, must be greater than or equal to ${this.minDigestLength}`)\n }\n\n if (this.maxDigestLength != null && options.truncate > this.maxDigestLength) {\n throw new Error(`Invalid truncate option, must be less than or equal to ${this.maxDigestLength}`)\n }\n }\n\n if (input instanceof Uint8Array) {\n const result = this.encode(input)\n\n if (result instanceof Uint8Array) {\n return createDigest(result, this.code, options?.truncate)\n }\n\n return result.then(digest => createDigest(digest, this.code, options?.truncate))\n } else {\n throw Error('Unknown type, must be binary type')\n /* c8 ignore next 1 */\n }\n }\n}\n\n/**\n * Create a Digest from the passed uint8array and code, optionally truncating it\n * first.\n */\nfunction createDigest <Code extends number> (digest: Uint8Array, code: Code, truncate?: number): Digest.Digest<Code, number> {\n if (truncate != null && truncate !== digest.byteLength) {\n if (truncate > digest.byteLength) {\n throw new Error(`Invalid truncate option, must be less than or equal to ${digest.byteLength}`)\n }\n\n digest = digest.subarray(0, truncate)\n }\n\n return Digest.create(code, digest)\n}\n", "import { base32 } from './bases/base32.ts'\nimport { base36 } from './bases/base36.ts'\nimport { base58btc } from './bases/base58.ts'\nimport { coerce, toArrayBufferBackedArray } from './bytes.ts'\nimport * as Digest from './hashes/digest.ts'\nimport * as varint from './varint.ts'\nimport type * as API from './link/interface.ts'\n\n// This way TS will also expose all the types from module\nexport * from './link/interface.ts'\n\nexport function format <T extends API.Link<unknown, number, number, API.Version>, Prefix extends string> (link: T, base?: API.MultibaseEncoder<Prefix>): API.ToString<T, Prefix> {\n const { bytes, version } = link\n switch (version) {\n case 0:\n return toStringV0(\n bytes,\n baseCache(link),\n base as API.MultibaseEncoder<'z'> ?? base58btc.encoder\n )\n default:\n return toStringV1(\n bytes,\n baseCache(link),\n (base ?? base32.encoder) as API.MultibaseEncoder<Prefix>\n )\n }\n}\n\nexport function toJSON <Link extends API.UnknownLink> (link: Link): API.LinkJSON<Link> {\n return {\n '/': format(link)\n }\n}\n\nexport function fromJSON <Link extends API.UnknownLink> (json: API.LinkJSON<Link>): CID<unknown, number, number, API.Version> {\n return CID.parse(json['/'])\n}\n\nconst cache = new WeakMap<API.UnknownLink, Map<string, string>>()\n\nfunction baseCache (cid: API.UnknownLink): Map<string, string> {\n const baseCache = cache.get(cid)\n if (baseCache == null) {\n const baseCache = new Map()\n cache.set(cid, baseCache)\n return baseCache\n }\n return baseCache\n}\n\nexport class CID<Data = unknown, Format extends number = number, Alg extends number = number, Version extends API.Version = API.Version> implements API.Link<Data, Format, Alg, Version> {\n readonly code: Format\n readonly version: Version\n readonly multihash: API.MultihashDigest<Alg>\n readonly bytes: Uint8Array<ArrayBuffer>\n readonly '/': Uint8Array<ArrayBuffer>\n\n /**\n * @param version - Version of the CID\n * @param code - Code of the codec content is encoded in, see https://github.com/multiformats/multicodec/blob/master/table.csv\n * @param multihash - (Multi)hash of the of the content.\n */\n constructor (version: Version, code: Format, multihash: API.MultihashDigest<Alg>, bytes: Uint8Array) {\n this.code = code\n this.version = version\n this.multihash = multihash\n this.bytes = toArrayBufferBackedArray(bytes)\n\n // flag to serializers that this is a CID and\n // should be treated specially\n this['/'] = this.bytes\n }\n\n /**\n * Signalling `cid.asCID === cid` has been replaced with `cid['/'] === cid.bytes`\n * please either use `CID.asCID(cid)` or switch to new signalling mechanism\n *\n * @deprecated\n */\n get asCID (): this {\n return this\n }\n\n // ArrayBufferView\n get byteOffset (): number {\n return this.bytes.byteOffset\n }\n\n // ArrayBufferView\n get byteLength (): number {\n return this.bytes.byteLength\n }\n\n toV0 (): CID<Data, API.DAG_PB, API.SHA_256, 0> {\n switch (this.version) {\n case 0: {\n return this as CID<Data, API.DAG_PB, API.SHA_256, 0>\n }\n case 1: {\n const { code, multihash } = this\n\n if (code !== DAG_PB_CODE) {\n throw new Error('Cannot convert a non dag-pb CID to CIDv0')\n }\n\n // sha2-256\n if (multihash.code !== SHA_256_CODE) {\n throw new Error('Cannot convert non sha2-256 multihash CID to CIDv0')\n }\n\n return (\n CID.createV0(\n multihash as API.MultihashDigest<API.SHA_256>\n )\n )\n }\n default: {\n throw Error(\n `Can not convert CID version ${this.version} to version 0. This is a bug please report`\n )\n }\n }\n }\n\n toV1 (): CID<Data, Format, Alg, 1> {\n switch (this.version) {\n case 0: {\n const { code, digest } = this.multihash\n const multihash = Digest.create(code, digest)\n return (\n CID.createV1(this.code, multihash)\n )\n }\n case 1: {\n return this as CID<Data, Format, Alg, 1>\n }\n default: {\n throw Error(\n `Can not convert CID version ${this.version} to version 1. This is a bug please report`\n )\n }\n }\n }\n\n equals (other: unknown): other is CID<Data, Format, Alg, Version> {\n return CID.equals(this, other)\n }\n\n static equals <Data, Format extends number, Alg extends number, Version extends API.Version>(self: API.Link<Data, Format, Alg, Version>, other: unknown): other is CID {\n const unknown = other as { code?: unknown, version?: unknown, multihash?: unknown }\n return (\n unknown != null &&\n self.code === unknown.code &&\n self.version === unknown.version &&\n Digest.equals(self.multihash, unknown.multihash)\n )\n }\n\n toString (base?: API.MultibaseEncoder<string>): string {\n return format(this, base)\n }\n\n toJSON (): API.LinkJSON<this> {\n return { '/': format(this) }\n }\n\n link (): this {\n return this\n }\n\n readonly [Symbol.toStringTag] = 'CID';\n\n // Legacy\n\n [Symbol.for('nodejs.util.inspect.custom')] (): string {\n return `CID(${this.toString()})`\n }\n\n /**\n * Takes any input `value` and returns a `CID` instance if it was\n * a `CID` otherwise returns `null`. If `value` is instanceof `CID`\n * it will return value back. If `value` is not instance of this CID\n * class, but is compatible CID it will return new instance of this\n * `CID` class. Otherwise returns null.\n *\n * This allows two different incompatible versions of CID library to\n * co-exist and interop as long as binary interface is compatible.\n */\n static asCID <Data, Format extends number, Alg extends number, Version extends API.Version, U>(input: API.Link<Data, Format, Alg, Version> | U): CID<Data, Format, Alg, Version> | null {\n if (input == null) {\n return null\n }\n\n const value = input as any\n if (value instanceof CID) {\n // If value is instance of CID then we're all set.\n return value\n } else if ((value['/'] != null && value['/'] === value.bytes) || value.asCID === value) {\n // If value isn't instance of this CID class but `this.asCID === this` or\n // `value['/'] === value.bytes` is true it is CID instance coming from a\n // different implementation (diff version or duplicate). In that case we\n // rebase it to this `CID` implementation so caller is guaranteed to get\n // instance with expected API.\n const { version, code, multihash, bytes } = value\n return new CID(\n version,\n code,\n multihash as API.MultihashDigest<Alg>,\n bytes ?? encodeCID(version, code, multihash.bytes)\n )\n } else if (value[cidSymbol] === true) {\n // If value is a CID from older implementation that used to be tagged via\n // symbol we still rebase it to the this `CID` implementation by\n // delegating that to a constructor.\n const { version, multihash, code } = value\n const digest = Digest.decode(multihash) as API.MultihashDigest<Alg>\n return CID.create(version, code, digest)\n } else {\n // Otherwise value is not a CID (or an incompatible version of it) in\n // which case we return `null`.\n return null\n }\n }\n\n /**\n * @param version - Version of the CID\n * @param code - Code of the codec content is encoded in, see https://github.com/multiformats/multicodec/blob/master/table.csv\n * @param digest - (Multi)hash of the of the content.\n */\n static create <Data, Format extends number, Alg extends number, Version extends API.Version>(version: Version, code: Format, digest: API.MultihashDigest<Alg>): CID<Data, Format, Alg, Version> {\n if (typeof code !== 'number') {\n throw new Error('String codecs are no longer supported')\n }\n\n if (!(digest.bytes instanceof Uint8Array)) {\n throw new Error('Invalid digest')\n }\n\n switch (version) {\n case 0: {\n if (code !== DAG_PB_CODE) {\n throw new Error(\n `Version 0 CID must use dag-pb (code: ${DAG_PB_CODE}) block encoding`\n )\n } else {\n return new CID(version, code, digest, digest.bytes)\n }\n }\n case 1: {\n const bytes = encodeCID(version, code, digest.bytes)\n return new CID(version, code, digest, bytes)\n }\n default: {\n throw new Error('Invalid version')\n }\n }\n }\n\n /**\n * Simplified version of `create` for CIDv0.\n */\n static createV0 <T = unknown>(digest: API.MultihashDigest<typeof SHA_256_CODE>): CID<T, typeof DAG_PB_CODE, typeof SHA_256_CODE, 0> {\n return CID.create(0, DAG_PB_CODE, digest)\n }\n\n /**\n * Simplified version of `create` for CIDv1.\n *\n * @param code - Content encoding format code.\n * @param digest - Multihash of the content.\n */\n static createV1 <Data, Code extends number, Alg extends number>(code: Code, digest: API.MultihashDigest<Alg>): CID<Data, Code, Alg, 1> {\n return CID.create(1, code, digest)\n }\n\n /**\n * Decoded a CID from its binary representation. The byte array must contain\n * only the CID with no additional bytes.\n *\n * An error will be thrown if the bytes provided do not contain a valid\n * binary representation of a CID.\n */\n static decode <Data, Code extends number, Alg extends number, Version extends API.Version>(bytes: API.ByteView<API.Link<Data, Code, Alg, Version>>): CID<Data, Code, Alg, Version> {\n const [cid, remainder] = CID.decodeFirst(bytes)\n if (remainder.length !== 0) {\n throw new Error('Incorrect length')\n }\n return cid\n }\n\n /**\n * Decoded a CID from its binary representation at the beginning of a byte\n * array.\n *\n * Returns an array with the first element containing the CID and the second\n * element containing the remainder of the original byte array. The remainder\n * will be a zero-length byte array if the provided bytes only contained a\n * binary CID representation.\n */\n static decodeFirst <T, C extends number, A extends number, V extends API.Version>(bytes: API.ByteView<API.Link<T, C, A, V>>): [CID<T, C, A, V>, Uint8Array] {\n const specs = CID.inspectBytes(bytes)\n const prefixSize = specs.size - specs.multihashSize\n const multihashBytes = coerce(\n bytes.subarray(prefixSize, prefixSize + specs.multihashSize)\n )\n if (multihashBytes.byteLength !== specs.multihashSize) {\n throw new Error('Incorrect length')\n }\n const digestBytes = multihashBytes.subarray(\n specs.multihashSize - specs.digestSize\n )\n const digest = new Digest.Digest(\n specs.multihashCode,\n specs.digestSize,\n digestBytes,\n multihashBytes\n )\n const cid =\n specs.version === 0\n ? CID.createV0(digest as API.MultihashDigest<API.SHA_256>)\n : CID.createV1(specs.codec, digest)\n return [cid as CID<T, C, A, V>, bytes.subarray(specs.size)]\n }\n\n /**\n * Inspect the initial bytes of a CID to determine its properties.\n *\n * Involves decoding up to 4 varints. Typically this will require only 4 to 6\n * bytes but for larger multicodec code values and larger multihash digest\n * lengths these varints can be quite large. It is recommended that at least\n * 10 bytes be made available in the `initialBytes` argument for a complete\n * inspection.\n */\n static inspectBytes <T, C extends number, A extends number, V extends API.Version>(initialBytes: API.ByteView<API.Link<T, C, A, V>>): { version: V, codec: C, multihashCode: A, digestSize: number, multihashSize: number, size: number } {\n let offset = 0\n const next = (): number => {\n const [i, length] = varint.decode(initialBytes.subarray(offset))\n offset += length\n return i\n }\n\n let version = next() as V\n let codec = DAG_PB_CODE as C\n if (version as number === 18) {\n // CIDv0\n version = 0 as V\n offset = 0\n } else {\n codec = next() as C\n }\n\n if (version !== 0 && version !== 1) {\n throw new RangeError(`Invalid CID version ${version}`)\n }\n\n const prefixSize = offset\n const multihashCode = next() as A // multihash code\n const digestSize = next() // multihash length\n const size = offset + digestSize\n const multihashSize = size - prefixSize\n\n return { version, codec, multihashCode, digestSize, multihashSize, size }\n }\n\n /**\n * Takes cid in a string representation and creates an instance. If `base`\n * decoder is not provided will use a default from the configuration. It will\n * throw an error if encoding of the CID is not compatible with supplied (or\n * a default decoder).\n */\n static parse <Prefix extends string, Data, Code extends number, Alg extends number, Version extends API.Version>(source: API.ToString<API.Link<Data, Code, Alg, Version>, Prefix>, base?: API.MultibaseDecoder<Prefix>): CID<Data, Code, Alg, Version> {\n const [prefix, bytes] = parseCIDtoBytes(source, base)\n\n const cid = CID.decode(bytes)\n\n if (cid.version === 0 && source[0] !== 'Q') {\n throw Error('Version 0 CID string must not include multibase prefix')\n }\n\n // Cache string representation to avoid computing it on `this.toString()`\n baseCache(cid).set(prefix, source)\n\n return cid\n }\n}\n\nfunction parseCIDtoBytes <Prefix extends string, Data, Code extends number, Alg extends number, Version extends API.Version> (source: API.ToString<API.Link<Data, Code, Alg, Version>, Prefix>, base?: API.MultibaseDecoder<Prefix>): [Prefix, API.ByteView<API.Link<Data, Code, Alg, Version>>] {\n switch (source[0]) {\n // CIDv0 is parsed differently\n case 'Q': {\n const decoder = base ?? base58btc\n return [\n base58btc.prefix as Prefix,\n decoder.decode(`${base58btc.prefix}${source}`)\n ]\n }\n case base58btc.prefix: {\n const decoder = base ?? base58btc\n return [base58btc.prefix as Prefix, decoder.decode(source)]\n }\n case base32.prefix: {\n const decoder = base ?? base32\n return [base32.prefix as Prefix, decoder.decode(source)]\n }\n case base36.prefix: {\n const decoder = base ?? base36\n return [base36.prefix as Prefix, decoder.decode(source)]\n }\n default: {\n if (base == null) {\n throw Error(\n 'To parse non base32, base36 or base58btc encoded CID multibase decoder must be provided'\n )\n }\n return [source[0] as Prefix, base.decode(source)]\n }\n }\n}\n\nfunction toStringV0 (bytes: Uint8Array, cache: Map<string, string>, base: API.MultibaseEncoder<'z'>): string {\n const { prefix } = base\n if (prefix !== base58btc.prefix) {\n throw Error(`Cannot string encode V0 in ${base.name} encoding`)\n }\n\n const cid = cache.get(prefix)\n if (cid == null) {\n const cid = base.encode(bytes).slice(1)\n cache.set(prefix, cid)\n return cid\n } else {\n return cid\n }\n}\n\nfunction toStringV1 <Prefix extends string> (bytes: Uint8Array, cache: Map<string, string>, base: API.MultibaseEncoder<Prefix>): string {\n const { prefix } = base\n const cid = cache.get(prefix)\n if (cid == null) {\n const cid = base.encode(bytes)\n cache.set(prefix, cid)\n return cid\n } else {\n return cid\n }\n}\n\nconst DAG_PB_CODE = 0x70\nconst SHA_256_CODE = 0x12\n\nfunction encodeCID (version: API.Version, code: number, multihash: Uint8Array): Uint8Array {\n const codeOffset = varint.encodingLength(version)\n const hashOffset = codeOffset + varint.encodingLength(code)\n const bytes = new Uint8Array(hashOffset + multihash.byteLength)\n varint.encodeTo(version, bytes, 0)\n varint.encodeTo(code, bytes, codeOffset)\n bytes.set(multihash, hashOffset)\n return bytes\n}\n\nconst cidSymbol = Symbol.for('@ipld/js-cid/CID')\n", "import * as base10 from './bases/base10.ts'\nimport * as base16 from './bases/base16.ts'\nimport * as base2 from './bases/base2.ts'\nimport * as base256emoji from './bases/base256emoji.ts'\nimport * as base32 from './bases/base32.ts'\nimport * as base36 from './bases/base36.ts'\nimport * as base58 from './bases/base58.ts'\nimport * as base64 from './bases/base64.ts'\nimport * as base8 from './bases/base8.ts'\nimport * as identityBase from './bases/identity.ts'\nimport * as json from './codecs/json.ts'\nimport * as raw from './codecs/raw.ts'\nimport * as identity from './hashes/identity.ts'\nimport * as sha2 from './hashes/sha2.ts'\nimport { CID, hasher, digest, varint, bytes } from './index.ts'\n\nexport const bases = { ...identityBase, ...base2, ...base8, ...base10, ...base16, ...base32, ...base36, ...base58, ...base64, ...base256emoji }\nexport const hashes = { ...sha2, ...identity }\nexport const codecs = { raw, json }\n\nexport { CID, hasher, digest, varint, bytes }\n", "/**\n * Returns a `Uint8Array` of the requested size. Referenced memory will\n * be initialized to 0.\n */\nexport function alloc (size: number = 0): Uint8Array<ArrayBuffer> {\n return new Uint8Array(size)\n}\n\n/**\n * Where possible returns a Uint8Array of the requested size that references\n * uninitialized memory. Only use if you are certain you will immediately\n * overwrite every value in the returned `Uint8Array`.\n */\nexport function allocUnsafe (size: number = 0): Uint8Array<ArrayBuffer> {\n return new Uint8Array(size)\n}\n", "import { bases } from 'multiformats/basics'\nimport type { MultibaseCodec } from 'multiformats'\nimport { allocUnsafe } from '#alloc'\n\nfunction createCodec (name: string, prefix: string, encode: (buf: Uint8Array) => string, decode: (str: string) => Uint8Array<ArrayBuffer>): MultibaseCodec<any> {\n return {\n name,\n prefix,\n encoder: {\n name,\n prefix,\n encode\n },\n decoder: {\n decode\n }\n }\n}\n\nconst string = createCodec('utf8', 'u', (buf) => {\n const decoder = new TextDecoder('utf8')\n return 'u' + decoder.decode(buf)\n}, (str) => {\n const encoder = new TextEncoder()\n return encoder.encode(str.substring(1))\n})\n\nconst ascii = createCodec('ascii', 'a', (buf) => {\n let string = 'a'\n\n for (let i = 0; i < buf.length; i++) {\n string += String.fromCharCode(buf[i])\n }\n return string\n}, (str) => {\n str = str.substring(1)\n const buf = allocUnsafe(str.length)\n\n for (let i = 0; i < str.length; i++) {\n buf[i] = str.charCodeAt(i)\n }\n\n return buf\n})\n\nexport type SupportedEncodings = 'utf8' | 'utf-8' | 'hex' | 'latin1' | 'ascii' | 'binary' | keyof typeof bases\n\nconst BASES: Record<SupportedEncodings, MultibaseCodec<any>> = {\n utf8: string,\n 'utf-8': string,\n hex: bases.base16,\n latin1: ascii,\n ascii,\n binary: ascii,\n\n ...bases\n}\n\nexport default BASES\n", "import hashlru from 'hashlru'\nimport { RecordType } from '../index.ts'\nimport { DEFAULT_TTL, toDNSResponse } from './to-dns-response.ts'\nimport type { Answer, DNSResponse } from '../index.ts'\n\ninterface CachedAnswer {\n expires: number\n value: Answer\n}\n\nexport interface AnswerCache {\n get (fqdn: string, types: RecordType[]): DNSResponse | undefined\n add (domain: string, answer: Answer): void\n remove (domain: string, type: ResponseType): void\n clear (): void\n}\n\n/**\n * Time Aware Least Recent Used Cache\n *\n * @see https://arxiv.org/pdf/1801.00390\n */\nclass CachedAnswers {\n private readonly lru: any\n\n constructor (maxSize: number) {\n // @ts-expect-error types are broken - https://github.com/dominictarr/hashlru/pull/24\n this.lru = hashlru(maxSize)\n }\n\n get (fqdn: string, types: RecordType[]): DNSResponse | undefined {\n let foundAllAnswers = true\n const answers: Answer[] = []\n\n for (const type of types) {\n const cached = this.getAnswers(fqdn, type)\n\n if (cached.length === 0) {\n foundAllAnswers = false\n break\n }\n\n answers.push(...cached)\n }\n\n if (foundAllAnswers) {\n return toDNSResponse({ answers })\n }\n }\n\n private getAnswers (domain: string, type: RecordType): Answer[] {\n const key = `${domain.toLowerCase()}-${type}`\n const answers: CachedAnswer[] = this.lru.get(key)\n\n if (answers != null) {\n const cachedAnswers = answers\n .filter((entry) => {\n return entry.expires > Date.now()\n })\n .map(({ expires, value }) => ({\n ...value,\n TTL: Math.round((expires - Date.now()) / 1000),\n type: RecordType[value.type]\n }))\n\n if (cachedAnswers.length === 0) {\n this.lru.remove(key)\n }\n\n // @ts-expect-error hashlru stringifies stored types which turns enums\n // into strings, we convert back into enums above but tsc doesn't know\n return cachedAnswers\n }\n\n return []\n }\n\n add (domain: string, answer: Answer): void {\n const key = `${domain.toLowerCase()}-${answer.type}`\n\n const answers: CachedAnswer[] = this.lru.get(key) ?? []\n answers.push({\n expires: Date.now() + ((answer.TTL ?? DEFAULT_TTL) * 1000),\n value: answer\n })\n\n this.lru.set(key, answers)\n }\n\n remove (domain: string, type: ResponseType): void {\n const key = `${domain.toLowerCase()}-${type}`\n\n this.lru.remove(key)\n }\n\n clear (): void {\n this.lru.clear()\n }\n}\n\n/**\n * Avoid sending multiple queries for the same hostname by caching results\n */\nexport function cache (size: number): AnswerCache {\n return new CachedAnswers(size)\n}\n", "/**\n * @packageDocumentation\n *\n * Query DNS records using `node:dns`, DNS over HTTP and/or DNSJSON over HTTP.\n *\n * A list of publicly accessible servers can be found [here](https://github.com/curl/curl/wiki/DNS-over-HTTPS#publicly-available-servers).\n *\n * @example Using the default resolver\n *\n * ```TypeScript\n * import { dns } from '@multiformats/dns'\n *\n * const resolver = dns()\n *\n * // resolve A records with a 5s timeout\n * const result = await dns.query('google.com', {\n * signal: AbortSignal.timeout(5000)\n * })\n * ```\n *\n * @example Using per-TLD resolvers\n *\n * ```TypeScript\n * import { dns } from '@multiformats/dns'\n * import { dnsJsonOverHttps } from '@multiformats/dns/resolvers'\n *\n * const resolver = dns({\n * resolvers: {\n * // will only be used to resolve `.com` addresses\n * 'com.': dnsJsonOverHttps('https://cloudflare-dns.com/dns-query'),\n *\n * // this can also be an array, resolvers will be shuffled and tried in\n * // series\n * 'net.': [\n * dnsJsonOverHttps('https://dns.google/resolve'),\n * dnsJsonOverHttps('https://dns.pub/dns-query')\n * ],\n *\n * // will only be used to resolve all other addresses\n * '.': dnsJsonOverHttps('https://dnsforge.de/dns-query'),\n * }\n * })\n * ```\n *\n * @example Query for specific record types\n *\n * ```TypeScript\n * import { dns, RecordType } from '@multiformats/dns'\n *\n * const resolver = dns()\n *\n * // resolve only TXT records\n * const result = await dns.query('google.com', {\n * types: [\n * RecordType.TXT\n * ]\n * })\n * ```\n *\n * ## Caching\n *\n * Individual Aanswers are cached so. If you make a request, for which all\n * record types are cached, all values will be pulled from the cache.\n *\n * If any of the record types are not cached, a new request will be resolved as\n * if none of the records were cached, and the cache will be updated to include\n * the new results.\n *\n * @example Ignoring the cache\n *\n * ```TypeScript\n * import { dns, RecordType } from '@multiformats/dns'\n *\n * const resolver = dns()\n *\n * // do not used cached results, always resolve a new query\n * const result = await dns.query('google.com', {\n * cached: false\n * })\n * ```\n */\n\nimport { DNS as DNSClass } from './dns.ts'\nimport type { DNSResolver } from './resolvers/index.ts'\nimport type { ComponentLogger } from '@libp2p/interface'\nimport type { ProgressEvent, ProgressOptions } from 'progress-events'\n\n/**\n * A subset of DNS Record Types\n *\n * @see https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-4.\n */\nexport enum RecordType {\n A = 1,\n CNAME = 5,\n TXT = 16,\n AAAA = 28\n}\n\nexport interface Question {\n /**\n * The record name requested.\n */\n name: string\n\n /**\n * The type of DNS record requested.\n *\n * @see https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-4.\n */\n type: RecordType\n}\n\nexport interface Answer {\n /**\n * The record owner.\n */\n name: string\n\n /**\n * The type of DNS record.\n *\n * @see https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-4\n */\n type: RecordType\n\n /**\n * The number of seconds the answer can be stored in cache before it is\n * considered stale.\n */\n TTL: number\n\n /**\n * The value of the DNS record for the given name and type. The data will be\n * in text for standardized record types and in hex for unknown types.\n */\n data: string\n}\n\nexport interface DNSResponse {\n /**\n * The Response Code of the DNS Query.\n *\n * @see https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6\n */\n Status: number\n\n /**\n * If true, it means the truncated bit was set. This happens when the DNS\n * answer is larger than a single UDP or TCP packet.\n */\n TC: boolean\n\n /**\n * If true, it means the Recursive Desired bit was set.\n */\n RD: boolean\n\n /**\n * If true, it means the Recursion Available bit was set.\n */\n RA: boolean\n\n /**\n * If true, it means that every record in the answer was verified with DNSSEC.\n */\n AD: boolean\n\n /**\n * If true, the client asked to disable DNSSEC validation.\n */\n CD: boolean\n\n /**\n * The records that were requested.\n */\n Question: Question[]\n\n /**\n * Values for the records that were requested.\n */\n Answer: Answer[]\n}\n\n/**\n * The default maximum amount of recursion allowed during a query\n */\nexport const MAX_RECURSIVE_DEPTH = 32\n\nexport interface DNSResolverSorter {\n (a: DNSResolver, b: DNSResolver): -1 | 0 | 1\n}\n\nexport interface QueryOptions extends ProgressOptions<ResolveDnsProgressEvents> {\n signal?: AbortSignal\n\n /**\n * Do not use cached DNS entries\n *\n * @default false\n */\n cached?: boolean\n\n /**\n * The type or types of DNS records to resolve\n *\n * @default [RecordType.A, RecordType.AAAA]\n */\n types?: RecordType | RecordType[]\n\n /**\n * An optional logger\n */\n logger?: ComponentLogger\n}\n\nexport interface DNS {\n query(fqdn: string, options?: QueryOptions): Promise<DNSResponse>\n}\n\nexport type ResolveDnsProgressEvents =\n ProgressEvent<'dns:cache', string> |\n ProgressEvent<'dns:query', string> |\n ProgressEvent<'dns:response', DNSResponse> |\n ProgressEvent<'dns:error', Error>\n\nexport type DNSResolvers = Record<string, DNSResolver | DNSResolver[]>\n\nexport interface DNSInit {\n /**\n * A set of resolvers used to answer DNS queries\n *\n * String keys control which resolvers are used for which TLDs.\n *\n * @example\n *\n * ```TypeScript\n * import { dns } from '@multiformats/dns'\n * import { dnsOverHttps } from '@multiformats/dns'\n *\n * const resolver = dns({\n * resolvers: {\n * // only used for .com domains\n * 'com.': dnsOverHttps('https://example-1.com'),\n *\n * // only used for .net domains, can be an array\n * 'net.': [\n * dnsOverHttps('https://example-2.com'),\n * dnsOverHttps('https://example-3.com'),\n * ],\n *\n * // used for everything else (can be an array)\n * '.': dnsOverHttps('https://example-4.com')\n * }\n * })\n * ```\n */\n resolvers?: DNSResolvers\n\n /**\n * To avoid repeating DNS lookups, successful answers are cached according to\n * their TTL. To avoid exhausting memory, this option controls how many\n * answers to cache.\n *\n * @default 1000\n */\n cacheSize?: number\n\n /**\n * An optional logger\n */\n logger?: ComponentLogger\n\n /**\n * Sort resolvers before invoking them\n *\n * @default random\n */\n sorter?: DNSResolverSorter\n}\n\nexport function dns (init: DNSInit = {}): DNS {\n return new DNSClass(init)\n}\n", "export default class QuickLRU extends Map {\n\t#size = 0;\n\t#cache = new Map();\n\t#oldCache = new Map();\n\t#maxSize;\n\t#maxAge;\n\t#onEviction;\n\n\tconstructor(options = {}) {\n\t\tsuper();\n\n\t\tif (!(options.maxSize && options.maxSize > 0)) {\n\t\t\tthrow new TypeError('`maxSize` must be a number greater than 0');\n\t\t}\n\n\t\tif (typeof options.maxAge === 'number' && options.maxAge === 0) {\n\t\t\tthrow new TypeError('`maxAge` must be a number greater than 0');\n\t\t}\n\n\t\tthis.#maxSize = options.maxSize;\n\t\tthis.#maxAge = options.maxAge || Number.POSITIVE_INFINITY;\n\t\tthis.#onEviction = options.onEviction;\n\t}\n\n\t// For tests.\n\tget __oldCache() {\n\t\treturn this.#oldCache;\n\t}\n\n\t#emitEvictions(cache) {\n\t\tif (typeof this.#onEviction !== 'function') {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const [key, item] of cache) {\n\t\t\tthis.#onEviction(key, item.value);\n\t\t}\n\t}\n\n\t#deleteIfExpired(key, item) {\n\t\tif (typeof item.expiry === 'number' && item.expiry <= Date.now()) {\n\t\t\tif (typeof this.#onEviction === 'function') {\n\t\t\t\tthis.#onEviction(key, item.value);\n\t\t\t}\n\n\t\t\treturn this.delete(key);\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t#getOrDeleteIfExpired(key, item) {\n\t\tconst deleted = this.#deleteIfExpired(key, item);\n\t\tif (deleted === false) {\n\t\t\treturn item.value;\n\t\t}\n\t}\n\n\t#getItemValue(key, item) {\n\t\treturn item.expiry ? this.#getOrDeleteIfExpired(key, item) : item.value;\n\t}\n\n\t#peek(key, cache) {\n\t\tconst item = cache.get(key);\n\t\treturn this.#getItemValue(key, item);\n\t}\n\n\t#set(key, value) {\n\t\tthis.#cache.set(key, value);\n\t\tthis.#size++;\n\n\t\tif (this.#size >= this.#maxSize) {\n\t\t\tthis.#size = 0;\n\t\t\tthis.#emitEvictions(this.#oldCache);\n\t\t\tthis.#oldCache = this.#cache;\n\t\t\tthis.#cache = new Map();\n\t\t}\n\t}\n\n\t#moveToRecent(key, item) {\n\t\tthis.#oldCache.delete(key);\n\t\tthis.#set(key, item);\n\t}\n\n\t* #entriesAscending() {\n\t\tfor (const item of this.#oldCache) {\n\t\t\tconst [key, value] = item;\n\t\t\tif (!this.#cache.has(key)) {\n\t\t\t\tconst deleted = this.#deleteIfExpired(key, value);\n\t\t\t\tif (deleted === false) {\n\t\t\t\t\tyield item;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const item of this.#cache) {\n\t\t\tconst [key, value] = item;\n\t\t\tconst deleted = this.#deleteIfExpired(key, value);\n\t\t\tif (deleted === false) {\n\t\t\t\tyield item;\n\t\t\t}\n\t\t}\n\t}\n\n\tget(key) {\n\t\tif (this.#cache.has(key)) {\n\t\t\tconst item = this.#cache.get(key);\n\t\t\treturn this.#getItemValue(key, item);\n\t\t}\n\n\t\tif (this.#oldCache.has(key)) {\n\t\t\tconst item = this.#oldCache.get(key);\n\t\t\tif (this.#deleteIfExpired(key, item) === false) {\n\t\t\t\tthis.#moveToRecent(key, item);\n\t\t\t\treturn item.value;\n\t\t\t}\n\t\t}\n\t}\n\n\tset(key, value, {maxAge = this.#maxAge} = {}) {\n\t\tconst expiry = typeof maxAge === 'number' && maxAge !== Number.POSITIVE_INFINITY\n\t\t\t? (Date.now() + maxAge)\n\t\t\t: undefined;\n\n\t\tif (this.#cache.has(key)) {\n\t\t\tthis.#cache.set(key, {\n\t\t\t\tvalue,\n\t\t\t\texpiry,\n\t\t\t});\n\t\t} else {\n\t\t\tthis.#set(key, {value, expiry});\n\t\t}\n\n\t\treturn this;\n\t}\n\n\thas(key) {\n\t\tif (this.#cache.has(key)) {\n\t\t\treturn !this.#deleteIfExpired(key, this.#cache.get(key));\n\t\t}\n\n\t\tif (this.#oldCache.has(key)) {\n\t\t\treturn !this.#deleteIfExpired(key, this.#oldCache.get(key));\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tpeek(key) {\n\t\tif (this.#cache.has(key)) {\n\t\t\treturn this.#peek(key, this.#cache);\n\t\t}\n\n\t\tif (this.#oldCache.has(key)) {\n\t\t\treturn this.#peek(key, this.#oldCache);\n\t\t}\n\t}\n\n\texpiresIn(key) {\n\t\tconst item = this.#cache.get(key) ?? this.#oldCache.get(key);\n\t\tif (item) {\n\t\t\treturn item.expiry ? item.expiry - Date.now() : Number.POSITIVE_INFINITY;\n\t\t}\n\t}\n\n\tdelete(key) {\n\t\tconst deleted = this.#cache.delete(key);\n\t\tif (deleted) {\n\t\t\tthis.#size--;\n\t\t}\n\n\t\treturn this.#oldCache.delete(key) || deleted;\n\t}\n\n\tclear() {\n\t\tthis.#cache.clear();\n\t\tthis.#oldCache.clear();\n\t\tthis.#size = 0;\n\t}\n\n\tresize(newSize) {\n\t\tif (!(newSize && newSize > 0)) {\n\t\t\tthrow new TypeError('`maxSize` must be a number greater than 0');\n\t\t}\n\n\t\tconst items = [...this.#entriesAscending()];\n\t\tconst removeCount = items.length - newSize;\n\t\tif (removeCount < 0) {\n\t\t\tthis.#cache = new Map(items);\n\t\t\tthis.#oldCache = new Map();\n\t\t\tthis.#size = items.length;\n\t\t} else {\n\t\t\tif (removeCount > 0) {\n\t\t\t\tthis.#emitEvictions(items.slice(0, removeCount));\n\t\t\t}\n\n\t\t\tthis.#oldCache = new Map(items.slice(removeCount));\n\t\t\tthis.#cache = new Map();\n\t\t\tthis.#size = 0;\n\t\t}\n\n\t\tthis.#maxSize = newSize;\n\t}\n\n\tevict(count = 1) {\n\t\tconst requested = Number(count);\n\t\tif (!requested || requested <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst items = [...this.#entriesAscending()];\n\t\tconst evictCount = Math.trunc(Math.min(requested, Math.max(items.length - 1, 0)));\n\t\tif (evictCount <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#emitEvictions(items.slice(0, evictCount));\n\t\tthis.#oldCache = new Map(items.slice(evictCount));\n\t\tthis.#cache = new Map();\n\t\tthis.#size = 0;\n\t}\n\n\t* keys() {\n\t\tfor (const [key] of this) {\n\t\t\tyield key;\n\t\t}\n\t}\n\n\t* values() {\n\t\tfor (const [, value] of this) {\n\t\t\tyield value;\n\t\t}\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tfor (const item of this.#cache) {\n\t\t\tconst [key, value] = item;\n\t\t\tconst deleted = this.#deleteIfExpired(key, value);\n\t\t\tif (deleted === false) {\n\t\t\t\tyield [key, value.value];\n\t\t\t}\n\t\t}\n\n\t\tfor (const item of this.#oldCache) {\n\t\t\tconst [key, value] = item;\n\t\t\tif (!this.#cache.has(key)) {\n\t\t\t\tconst deleted = this.#deleteIfExpired(key, value);\n\t\t\t\tif (deleted === false) {\n\t\t\t\t\tyield [key, value.value];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t* entriesDescending() {\n\t\tlet items = [...this.#cache];\n\t\tfor (let i = items.length - 1; i >= 0; --i) {\n\t\t\tconst item = items[i];\n\t\t\tconst [key, value] = item;\n\t\t\tconst deleted = this.#deleteIfExpired(key, value);\n\t\t\tif (deleted === false) {\n\t\t\t\tyield [key, value.value];\n\t\t\t}\n\t\t}\n\n\t\titems = [...this.#oldCache];\n\t\tfor (let i = items.length - 1; i >= 0; --i) {\n\t\t\tconst item = items[i];\n\t\t\tconst [key, value] = item;\n\t\t\tif (!this.#cache.has(key)) {\n\t\t\t\tconst deleted = this.#deleteIfExpired(key, value);\n\t\t\t\tif (deleted === false) {\n\t\t\t\t\tyield [key, value.value];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t* entriesAscending() {\n\t\tfor (const [key, value] of this.#entriesAscending()) {\n\t\t\tyield [key, value.value];\n\t\t}\n\t}\n\n\tget size() {\n\t\tif (!this.#size) {\n\t\t\treturn this.#oldCache.size;\n\t\t}\n\n\t\tlet oldCacheSize = 0;\n\t\tfor (const key of this.#oldCache.keys()) {\n\t\t\tif (!this.#cache.has(key)) {\n\t\t\t\toldCacheSize++;\n\t\t\t}\n\t\t}\n\n\t\treturn Math.min(this.#size + oldCacheSize, this.#maxSize);\n\t}\n\n\tget maxSize() {\n\t\treturn this.#maxSize;\n\t}\n\n\tget maxAge() {\n\t\treturn this.#maxAge;\n\t}\n\n\tentries() {\n\t\treturn this.entriesAscending();\n\t}\n\n\tforEach(callbackFunction, thisArgument = this) {\n\t\tfor (const [key, value] of this.entriesAscending()) {\n\t\t\tcallbackFunction.call(thisArgument, value, key, this);\n\t\t}\n\t}\n\n\tget [Symbol.toStringTag]() {\n\t\treturn 'QuickLRU';\n\t}\n\n\ttoString() {\n\t\treturn `QuickLRU(${this.size}/${this.maxSize})`;\n\t}\n\n\t[Symbol.for('nodejs.util.inspect.custom')]() {\n\t\treturn this.toString();\n\t}\n}\n", "export class DNSLinkNotFoundError extends Error {\n static name = 'DNSLinkNotFoundError'\n\n constructor (message = 'DNSLink not found') {\n super(message)\n this.name = 'DNSLinkNotFoundError'\n }\n}\n\nexport class InvalidNamespaceError extends Error {\n static name = 'InvalidNamespaceError'\n\n constructor (message = 'Invalid namespace') {\n super(message)\n this.name = 'InvalidNamespaceError'\n }\n}\n", "import { CID } from 'multiformats/cid'\nimport { InvalidNamespaceError } from '../errors.ts'\nimport type { DNSLinkParser, DNSLinkIPFSResult } from '../index.ts'\nimport type { Answer } from '@multiformats/dns'\n\nexport const ipfs: DNSLinkParser<DNSLinkIPFSResult> = (value: string, answer: Answer): DNSLinkIPFSResult => {\n const [, protocol, cid, ...rest] = value.split('/')\n\n if (protocol !== 'ipfs') {\n throw new InvalidNamespaceError(`Namespace ${protocol} was not \"ipfs\"`)\n }\n\n // if the result is a CID, we've reached the end of the recursion\n return {\n namespace: 'ipfs',\n cid: CID.parse(cid),\n path: rest.length > 0 ? `/${rest.join('/')}` : '',\n answer\n }\n}\n", "import { base58btc } from 'multiformats/bases/base58'\nimport { CID } from 'multiformats/cid'\nimport * as Digest from 'multiformats/hashes/digest'\nimport { InvalidNamespaceError } from '../errors.ts'\nimport type { DNSLinkParser, DNSLinkIPNSResult, DNSLinkDNSLinkResult } from '../index.ts'\nimport type { Answer } from '@multiformats/dns'\nimport type { MultihashDigest } from 'multiformats/cid'\n\nexport const ipns: DNSLinkParser<DNSLinkIPNSResult | DNSLinkDNSLinkResult> = (value: string, answer: Answer): DNSLinkIPNSResult | DNSLinkDNSLinkResult => {\n const [, protocol, peerId, ...rest] = value.split('/')\n\n if (protocol !== 'ipns') {\n throw new InvalidNamespaceError(`Namespace ${protocol} was not \"ipns\"`)\n }\n\n try {\n // if the result parses as a base58btc encoded multihash or a CID, we've\n // reached the end of the recursion\n return {\n namespace: 'ipns',\n value: decode(peerId),\n path: rest.length > 0 ? `/${rest.join('/')}` : '',\n answer\n }\n } catch {\n // if the value did not parse as a PeerId, it's probably another DNSLink\n return {\n namespace: 'dnslink',\n value: peerId,\n path: rest.length > 0 ? `/${rest.join('/')}` : '',\n answer\n }\n }\n}\n\n/**\n * Attempt to decode the passed string as a base58btc encoded multihash or a CID\n */\nfunction decode (str: string): MultihashDigest {\n try {\n return Digest.decode(base58btc.baseDecode(str))\n } catch {\n return CID.parse(str).multihash\n }\n}\n", "import { MAX_RECURSIVE_DEPTH, RecordType } from '@multiformats/dns'\nimport QuickLRU from 'quick-lru'\nimport { CACHE_MAX_AGE, CACHE_MAX_ANSWERS, CACHE_SIZE } from './constants.ts'\nimport { DNSLinkNotFoundError } from './errors.ts'\nimport { ipfs } from './namespaces/ipfs.ts'\nimport { ipns } from './namespaces/ipns.ts'\nimport type { DNSLink as DNSLinkInterface, ResolveDNSLinkOptions, DNSLinkOptions, DNSLinkComponents, DNSLinkParser, DNSLinkResolveResult } from './index.ts'\nimport type { Logger } from '@libp2p/interface'\nimport type { DNS } from '@multiformats/dns'\n\nexport class DNSLink <Namespaces extends Record<string, DNSLinkParser<DNSLinkResolveResult>>> implements DNSLinkInterface<ReturnType<Namespaces[keyof Namespaces]>> {\n private readonly dns: DNS\n private readonly log: Logger\n private readonly namespaces: Record<string, DNSLinkParser<any>>\n private readonly cache: QuickLRU<string, QuickLRU<number, ReturnType<Namespaces[keyof Namespaces]>>>\n private readonly cacheMaxAnswers: number\n\n constructor (components: DNSLinkComponents, init: DNSLinkOptions<Namespaces> = {}) {\n this.dns = components.dns\n this.log = components.logger.forComponent('helia:dnslink')\n this.namespaces = {\n ipfs,\n ipns,\n ...init.namespaces\n }\n this.cache = new QuickLRU({\n maxSize: init.cacheSize ?? CACHE_SIZE,\n maxAge: init.cacheMaxAge ?? CACHE_MAX_AGE\n })\n this.cacheMaxAnswers = init.cacheMaxAnswers ?? CACHE_MAX_ANSWERS\n }\n\n async resolve (domain: string, options: ResolveDNSLinkOptions = {}): Promise<Array<ReturnType<Namespaces[keyof Namespaces]>>> {\n if (options.nocache !== true) {\n // check the cache if allowed\n const cached = this.cache.get(domain)\n\n if (cached != null) {\n const answers = [...cached.values()]\n\n if (answers.length > 0) {\n return answers\n }\n }\n }\n\n const result = await this.recursiveResolveDomain(domain, options.maxRecursiveDepth ?? MAX_RECURSIVE_DEPTH, options)\n\n // cache answers according to individual TTLs\n const cache = new QuickLRU<number, ReturnType<Namespaces[keyof Namespaces]>>({\n maxSize: this.cacheMaxAnswers\n })\n\n result.forEach((result, index) => {\n cache.set(index, result, {\n maxAge: (result.answer.TTL * 1000)\n })\n })\n\n // find longest answer TTL\n let maxTTL = result.reduce((acc, curr) => {\n const ttl = (curr.answer.TTL * 1000)\n\n if (ttl > acc) {\n return ttl\n }\n\n return acc\n }, 0)\n\n // if the configured max age is less than the longest answer TTL, use that\n // instead\n if (this.cache.maxAge < maxTTL) {\n maxTTL = this.cache.maxAge\n }\n\n this.cache.set(domain, cache, {\n maxAge: maxTTL\n })\n\n return result\n }\n\n async recursiveResolveDomain (domain: string, depth: number, options: ResolveDNSLinkOptions = {}): Promise<Array<ReturnType<Namespaces[keyof Namespaces]>>> {\n if (depth === 0) {\n throw new Error('recursion limit exceeded')\n }\n\n // the DNSLink spec says records MUST be stored on the `_dnslink.` subdomain\n // so start looking for records there, we will fall back to the bare domain\n // if none are found\n if (!domain.startsWith('_dnslink.')) {\n domain = `_dnslink.${domain}`\n }\n\n try {\n return await this.recursiveResolveDnslink(domain, depth, options)\n } catch (err: any) {\n // If the code is not ENOTFOUND or ERR_DNSLINK_NOT_FOUND or ENODATA then throw the error\n if (err.code !== 'ENOTFOUND' && err.code !== 'ENODATA' && err.name !== 'DNSLinkNotFoundError' && err.name !== 'NotFoundError') {\n throw err\n }\n\n if (domain.startsWith('_dnslink.')) {\n // The supplied domain contains a _dnslink component\n // Check the non-_dnslink domain\n domain = domain.replace('_dnslink.', '')\n } else {\n // Check the _dnslink subdomain\n domain = `_dnslink.${domain}`\n }\n\n // If this throws then we propagate the error\n return this.recursiveResolveDnslink(domain, depth, options)\n }\n }\n\n async recursiveResolveDnslink (domain: string, depth: number, options: ResolveDNSLinkOptions = {}): Promise<Array<ReturnType<Namespaces[keyof Namespaces]>>> {\n if (depth === 0) {\n throw new Error('recursion limit exceeded')\n }\n\n this.log('query %s for TXT and CNAME records', domain)\n const txtRecordsResponse = await this.dns.query(domain, {\n ...options,\n types: [\n RecordType.TXT\n ]\n })\n\n // sort the TXT records to ensure deterministic processing\n const txtRecords = (txtRecordsResponse?.Answer ?? [])\n .sort((a, b) => a.data.localeCompare(b.data))\n\n this.log('found %d TXT records for %s', txtRecords.length, domain)\n\n const output: Array<ReturnType<Namespaces[keyof Namespaces]>> = []\n\n for (const answer of txtRecords) {\n try {\n let result = answer.data\n\n // strip leading and trailing \" characters\n if (result.startsWith('\"') && result.endsWith('\"')) {\n result = result.substring(1, result.length - 1)\n }\n\n if (!result.startsWith('dnslink=')) {\n // invalid record?\n continue\n }\n\n this.log('%s TXT %s', answer.name, result)\n\n result = result.replace('dnslink=', '')\n\n // result is now a `/ipfs/<cid>` or `/ipns/<cid>` string\n const [, protocol, domainOrCID] = result.split('/') // e.g. [\"\", \"ipfs\", \"<cid>\"]\n\n if (protocol === 'dnslink') {\n // if the result was another DNSLink domain, try to follow it\n output.push(...await this.recursiveResolveDomain(domainOrCID, depth - 1, options))\n continue\n }\n\n const parser = this.namespaces[protocol]\n\n if (parser == null) {\n this.log('unknown protocol \"%s\" in DNSLink record for domain: %s', protocol, domain)\n continue\n }\n\n const record = parser(result, answer)\n\n if (record.namespace === 'dnslink') {\n // if the result was another DNSLink domain, try to follow it\n output.push(...await this.recursiveResolveDomain(record.value, depth - 1, options))\n continue\n }\n\n output.push(parser(result, answer))\n } catch (err: any) {\n this.log.error('could not parse DNS link record for domain %s, %s - %e', domain, answer.data, err)\n }\n }\n\n if (output.length > 0) {\n return output\n }\n\n // no dnslink records found, try CNAMEs\n this.log('no DNSLink records found for %s, falling back to CNAME', domain)\n\n const cnameRecordsResponse = await this.dns.query(domain, {\n ...options,\n types: [\n RecordType.CNAME\n ]\n })\n\n // sort the CNAME records to ensure deterministic processing\n const cnameRecords = (cnameRecordsResponse?.Answer ?? [])\n .sort((a, b) => a.data.localeCompare(b.data))\n\n this.log('found %d CNAME records for %s', cnameRecords.length, domain)\n\n for (const cname of cnameRecords) {\n try {\n return await this.recursiveResolveDomain(cname.data, depth - 1, options)\n } catch (err: any) {\n this.log.error('domain %s cname %s had no DNSLink records - %e', domain, cname.data, err)\n }\n }\n\n throw new DNSLinkNotFoundError(`No DNSLink records found for domain: ${domain}`)\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["require_hashlru", "__commonJSMin", "exports", "module", "max", "size", "cache", "_cache", "update", "key", "value", "v", "index_exports", "__export", "dnsLink", "base10_exports", "__export", "base10", "empty", "equals", "aa", "bb", "ii", "coerce", "o", "toArrayBufferBackedArray", "fromString", "str", "output", "i", "MAX_ARGUMENTS_LENGTH", "toString", "b", "len", "res", "isByteArrayWithArrayBuffer", "toArrayBufferBackedArray", "base", "ALPHABET", "name", "caseInsensitive", "BASE_MAP", "j", "i", "x", "xc", "xl", "xu", "BASE", "LEADER", "FACTOR", "iFACTOR", "encode", "source", "zeroes", "length", "pbegin", "pend", "size", "b58", "carry", "it1", "it2", "str", "decodeUnsafe", "psz", "b256", "it3", "it4", "vch", "decode", "string", "buffer", "src", "_brrp__multiformats_scope_baseX", "base_x_default", "Encoder", "name", "prefix", "baseEncode", "bytes", "Decoder", "baseDecode", "prefixCodePoint", "text", "decoder", "or", "ComposedDecoder", "decoders", "input", "left", "right", "Codec", "from", "encode", "decode", "baseX", "alphabet", "caseInsensitive", "base_x_default", "coerce", "string", "alphabetIdx", "bitsPerChar", "end", "out", "bits", "buffer", "written", "i", "value", "data", "pad", "mask", "createAlphabetIdx", "lower", "upper", "rfc4648", "base10", "baseX", "base16_exports", "__export", "base16", "base16upper", "base16", "rfc4648", "base16upper", "base2_exports", "__export", "base2", "base2", "rfc4648", "base256emoji_exports", "__export", "base256emoji", "alphabet", "alphabetBytesToChars", "p", "c", "i", "alphabetCharsToBytes", "codePoint", "encode", "data", "decode", "str", "byts", "char", "byt", "base256emoji", "from", "base32_exports", "__export", "base32", "base32hex", "base32hexpad", "base32hexpadupper", "base32hexupper", "base32pad", "base32padupper", "base32upper", "base32z", "base32", "rfc4648", "base32upper", "base32pad", "base32padupper", "base32hex", "base32hexupper", "base32hexpad", "base32hexpadupper", "base32z", "base36_exports", "__export", "base36", "base36upper", "base36", "baseX", "base36upper", "base58_exports", "__export", "base58btc", "base58flickr", "base58btc", "baseX", "base58flickr", "base64_exports", "__export", "base64", "base64pad", "base64url", "base64urlpad", "base64", "rfc4648", "base64pad", "base64url", "base64urlpad", "base8_exports", "__export", "base8", "base8", "rfc4648", "identity_exports", "__export", "identity", "identity", "from", "buf", "toString", "coerce", "str", "fromString", "textEncoder", "textDecoder", "identity_exports", "__export", "identity", "encode_1", "encode", "MSB", "REST", "MSBALL", "INT", "num", "out", "offset", "oldOffset", "decode", "read", "MSB$1", "REST$1", "buf", "res", "shift", "counter", "b", "l", "N1", "N2", "N3", "N4", "N5", "N6", "N7", "N8", "N9", "length", "value", "varint", "_brrp_varint", "varint_default", "decode", "data", "offset", "varint_default", "encodeTo", "int", "target", "encodingLength", "create", "code", "digest", "size", "sizeOffset", "encodingLength", "digestOffset", "bytes", "encodeTo", "Digest", "decode", "multihash", "coerce", "equals", "a", "b", "data", "toArrayBufferBackedArray", "code", "name", "encode", "coerce", "digest", "input", "options", "create", "identity", "sha2_browser_exports", "__export", "sha256", "sha512", "DEFAULT_MIN_DIGEST_LENGTH", "from", "name", "code", "encode", "minDigestLength", "maxDigestLength", "Hasher", "input", "options", "result", "createDigest", "digest", "truncate", "create", "sha", "name", "data", "sha256", "from", "sha512", "format", "link", "base", "bytes", "version", "toStringV0", "baseCache", "base58btc", "toStringV1", "base32", "cache", "baseCache", "cid", "CID", "_CID", "version", "code", "multihash", "bytes", "toArrayBufferBackedArray", "DAG_PB_CODE", "SHA_256_CODE", "digest", "create", "other", "self", "unknown", "equals", "base", "format", "input", "value", "encodeCID", "cidSymbol", "decode", "remainder", "specs", "prefixSize", "multihashBytes", "coerce", "digestBytes", "Digest", "initialBytes", "offset", "next", "i", "length", "codec", "multihashCode", "digestSize", "size", "multihashSize", "source", "prefix", "parseCIDtoBytes", "decoder", "base58btc", "base32", "base36", "toStringV0", "toStringV1", "codeOffset", "encodingLength", "hashOffset", "encodeTo", "bases", "identity_exports", "base2_exports", "base8_exports", "base10_exports", "base16_exports", "base32_exports", "base36_exports", "base58_exports", "base64_exports", "base256emoji_exports", "hashes", "sha2_browser_exports", "allocUnsafe", "size", "createCodec", "name", "prefix", "encode", "decode", "string", "buf", "str", "ascii", "i", "allocUnsafe", "BASES", "bases", "import_hashlru", "RecordType", "MAX_RECURSIVE_DEPTH", "QuickLRU", "#size", "#cache", "#oldCache", "#maxSize", "#maxAge", "#onEviction", "options", "#emitEvictions", "cache", "key", "item", "#deleteIfExpired", "#getOrDeleteIfExpired", "#getItemValue", "#peek", "#set", "value", "#moveToRecent", "#entriesAscending", "maxAge", "expiry", "deleted", "newSize", "items", "removeCount", "count", "requested", "evictCount", "i", "oldCacheSize", "callbackFunction", "thisArgument", "DNSLinkNotFoundError", "message", "InvalidNamespaceError", "ipfs", "value", "answer", "protocol", "cid", "rest", "InvalidNamespaceError", "CID", "ipns", "value", "answer", "protocol", "peerId", "rest", "InvalidNamespaceError", "decode", "str", "base58btc", "CID", "DNSLink", "components", "init", "ipfs", "ipns", "QuickLRU", "domain", "options", "cached", "answers", "result", "MAX_RECURSIVE_DEPTH", "cache", "index", "maxTTL", "acc", "curr", "ttl", "depth", "err", "txtRecords", "RecordType", "a", "b", "output", "answer", "protocol", "domainOrCID", "parser", "record", "cnameRecords", "cname", "DNSLinkNotFoundError", "dnsLink", "components", "options", "DNSLink"]
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ipns.d.ts","sourceRoot":"","sources":["../../../src/namespaces/ipns.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAGzF,eAAO,MAAM,IAAI,EAAE,aAAa,CAAC,iBAAiB,GAAG,oBAAoB,CAwBxE,CAAA"}
1
+ {"version":3,"file":"ipns.d.ts","sourceRoot":"","sources":["../../../src/namespaces/ipns.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAIzF,eAAO,MAAM,IAAI,EAAE,aAAa,CAAC,iBAAiB,GAAG,oBAAoB,CAyBxE,CAAA"}
@@ -1,4 +1,6 @@
1
+ import { base58btc } from 'multiformats/bases/base58';
1
2
  import { CID } from 'multiformats/cid';
3
+ import * as Digest from 'multiformats/hashes/digest';
2
4
  import { InvalidNamespaceError } from "../errors.js";
3
5
  export const ipns = (value, answer) => {
4
6
  const [, protocol, peerId, ...rest] = value.split('/');
@@ -6,10 +8,11 @@ export const ipns = (value, answer) => {
6
8
  throw new InvalidNamespaceError(`Namespace ${protocol} was not "ipns"`);
7
9
  }
8
10
  try {
9
- // if the result parses as a PeerId, we've reached the end of the recursion
11
+ // if the result parses as a base58btc encoded multihash or a CID, we've
12
+ // reached the end of the recursion
10
13
  return {
11
14
  namespace: 'ipns',
12
- value: CID.parse(peerId).multihash,
15
+ value: decode(peerId),
13
16
  path: rest.length > 0 ? `/${rest.join('/')}` : '',
14
17
  answer
15
18
  };
@@ -24,4 +27,15 @@ export const ipns = (value, answer) => {
24
27
  };
25
28
  }
26
29
  };
30
+ /**
31
+ * Attempt to decode the passed string as a base58btc encoded multihash or a CID
32
+ */
33
+ function decode(str) {
34
+ try {
35
+ return Digest.decode(base58btc.baseDecode(str));
36
+ }
37
+ catch {
38
+ return CID.parse(str).multihash;
39
+ }
40
+ }
27
41
  //# sourceMappingURL=ipns.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ipns.js","sourceRoot":"","sources":["../../../src/namespaces/ipns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAIpD,MAAM,CAAC,MAAM,IAAI,GAA4D,CAAC,KAAa,EAAE,MAAc,EAA4C,EAAE;IACvJ,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAEtD,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,qBAAqB,CAAC,aAAa,QAAQ,iBAAiB,CAAC,CAAA;IACzE,CAAC;IAED,IAAI,CAAC;QACH,2EAA2E;QAC3E,OAAO;YACL,SAAS,EAAE,MAAM;YACjB,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS;YAClC,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YACjD,MAAM;SACP,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;QACxE,OAAO;YACL,SAAS,EAAE,SAAS;YACpB,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YACjD,MAAM;SACP,CAAA;IACH,CAAC;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"ipns.js","sourceRoot":"","sources":["../../../src/namespaces/ipns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,KAAK,MAAM,MAAM,4BAA4B,CAAA;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAKpD,MAAM,CAAC,MAAM,IAAI,GAA4D,CAAC,KAAa,EAAE,MAAc,EAA4C,EAAE;IACvJ,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAEtD,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,qBAAqB,CAAC,aAAa,QAAQ,iBAAiB,CAAC,CAAA;IACzE,CAAC;IAED,IAAI,CAAC;QACH,wEAAwE;QACxE,mCAAmC;QACnC,OAAO;YACL,SAAS,EAAE,MAAM;YACjB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;YACrB,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YACjD,MAAM;SACP,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;QACxE,OAAO;YACL,SAAS,EAAE,SAAS;YACpB,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YACjD,MAAM;SACP,CAAA;IACH,CAAC;AACH,CAAC,CAAA;AAED;;GAEG;AACH,SAAS,MAAM,CAAE,GAAW;IAC1B,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,SAAS,CAAA;IACjC,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@helia/dnslink",
3
- "version": "2.0.1",
3
+ "version": "2.0.2-aea1416d",
4
4
  "description": "DNSLink operations using Helia",
5
5
  "license": "Apache-2.0 OR MIT",
6
6
  "homepage": "https://github.com/ipfs/helia/tree/main/packages/dnslink#readme",
@@ -57,8 +57,6 @@
57
57
  },
58
58
  "devDependencies": {
59
59
  "@libp2p/logger": "^6.2.8",
60
- "@libp2p/peer-id": "^6.0.10",
61
- "@types/dns-packet": "^5.6.5",
62
60
  "aegir": "^48.0.11",
63
61
  "delay": "^7.0.0",
64
62
  "sinon-ts": "^2.0.0"
@@ -1,7 +1,10 @@
1
+ import { base58btc } from 'multiformats/bases/base58'
1
2
  import { CID } from 'multiformats/cid'
3
+ import * as Digest from 'multiformats/hashes/digest'
2
4
  import { InvalidNamespaceError } from '../errors.ts'
3
5
  import type { DNSLinkParser, DNSLinkIPNSResult, DNSLinkDNSLinkResult } from '../index.ts'
4
6
  import type { Answer } from '@multiformats/dns'
7
+ import type { MultihashDigest } from 'multiformats/cid'
5
8
 
6
9
  export const ipns: DNSLinkParser<DNSLinkIPNSResult | DNSLinkDNSLinkResult> = (value: string, answer: Answer): DNSLinkIPNSResult | DNSLinkDNSLinkResult => {
7
10
  const [, protocol, peerId, ...rest] = value.split('/')
@@ -11,10 +14,11 @@ export const ipns: DNSLinkParser<DNSLinkIPNSResult | DNSLinkDNSLinkResult> = (va
11
14
  }
12
15
 
13
16
  try {
14
- // if the result parses as a PeerId, we've reached the end of the recursion
17
+ // if the result parses as a base58btc encoded multihash or a CID, we've
18
+ // reached the end of the recursion
15
19
  return {
16
20
  namespace: 'ipns',
17
- value: CID.parse(peerId).multihash,
21
+ value: decode(peerId),
18
22
  path: rest.length > 0 ? `/${rest.join('/')}` : '',
19
23
  answer
20
24
  }
@@ -28,3 +32,14 @@ export const ipns: DNSLinkParser<DNSLinkIPNSResult | DNSLinkDNSLinkResult> = (va
28
32
  }
29
33
  }
30
34
  }
35
+
36
+ /**
37
+ * Attempt to decode the passed string as a base58btc encoded multihash or a CID
38
+ */
39
+ function decode (str: string): MultihashDigest {
40
+ try {
41
+ return Digest.decode(base58btc.baseDecode(str))
42
+ } catch {
43
+ return CID.parse(str).multihash
44
+ }
45
+ }
@@ -1,22 +0,0 @@
1
- {
2
- "DNSLink": "https://ipfs.github.io/helia/interfaces/_helia_dnslink.DNSLink.html",
3
- ".:DNSLink": "https://ipfs.github.io/helia/interfaces/_helia_dnslink.DNSLink.html",
4
- "DNSLinkComponents": "https://ipfs.github.io/helia/interfaces/_helia_dnslink.DNSLinkComponents.html",
5
- ".:DNSLinkComponents": "https://ipfs.github.io/helia/interfaces/_helia_dnslink.DNSLinkComponents.html",
6
- "DNSLinkDNSLinkResult": "https://ipfs.github.io/helia/interfaces/_helia_dnslink.DNSLinkDNSLinkResult.html",
7
- ".:DNSLinkDNSLinkResult": "https://ipfs.github.io/helia/interfaces/_helia_dnslink.DNSLinkDNSLinkResult.html",
8
- "DNSLinkIPFSResult": "https://ipfs.github.io/helia/interfaces/_helia_dnslink.DNSLinkIPFSResult.html",
9
- ".:DNSLinkIPFSResult": "https://ipfs.github.io/helia/interfaces/_helia_dnslink.DNSLinkIPFSResult.html",
10
- "DNSLinkIPNSResult": "https://ipfs.github.io/helia/interfaces/_helia_dnslink.DNSLinkIPNSResult.html",
11
- ".:DNSLinkIPNSResult": "https://ipfs.github.io/helia/interfaces/_helia_dnslink.DNSLinkIPNSResult.html",
12
- "DNSLinkOptions": "https://ipfs.github.io/helia/interfaces/_helia_dnslink.DNSLinkOptions.html",
13
- ".:DNSLinkOptions": "https://ipfs.github.io/helia/interfaces/_helia_dnslink.DNSLinkOptions.html",
14
- "DNSLinkParser": "https://ipfs.github.io/helia/interfaces/_helia_dnslink.DNSLinkParser.html",
15
- ".:DNSLinkParser": "https://ipfs.github.io/helia/interfaces/_helia_dnslink.DNSLinkParser.html",
16
- "DNSLinkResolveResult": "https://ipfs.github.io/helia/interfaces/_helia_dnslink.DNSLinkResolveResult.html",
17
- ".:DNSLinkResolveResult": "https://ipfs.github.io/helia/interfaces/_helia_dnslink.DNSLinkResolveResult.html",
18
- "ResolveDNSLinkOptions": "https://ipfs.github.io/helia/interfaces/_helia_dnslink.ResolveDNSLinkOptions.html",
19
- ".:ResolveDNSLinkOptions": "https://ipfs.github.io/helia/interfaces/_helia_dnslink.ResolveDNSLinkOptions.html",
20
- "dnsLink": "https://ipfs.github.io/helia/functions/_helia_dnslink.dnsLink.html",
21
- ".:dnsLink": "https://ipfs.github.io/helia/functions/_helia_dnslink.dnsLink.html"
22
- }