@candypoets/nipworker 0.0.77 → 0.83.0

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.
Files changed (102) hide show
  1. package/dist/NarrowTypes.js +1 -0
  2. package/dist/NarrowTypes.js.map +1 -0
  3. package/dist/cache/index.d.ts +4 -4
  4. package/dist/cache/index.d.ts.map +1 -1
  5. package/dist/cache/index.js +2 -2
  6. package/dist/cache/index.js.map +1 -1
  7. package/dist/cache/pkg/cache.d.ts +10 -9
  8. package/dist/cache/pkg/cache_bg.wasm.d.ts +9 -8
  9. package/dist/connections/index.d.ts +8 -5
  10. package/dist/connections/index.d.ts.map +1 -1
  11. package/dist/connections/index.js +2 -2
  12. package/dist/connections/index.js.map +1 -1
  13. package/dist/connections/pkg/connections.d.ts +10 -10
  14. package/dist/connections/pkg/connections_bg.wasm.d.ts +8 -8
  15. package/dist/crypto/index.d.ts +6 -4
  16. package/dist/crypto/index.d.ts.map +1 -1
  17. package/dist/crypto/index.js +2 -2
  18. package/dist/crypto/index.js.map +1 -1
  19. package/dist/crypto/pkg/crypto.d.ts +114 -86
  20. package/dist/crypto/pkg/crypto_bg.wasm.d.ts +11 -8
  21. package/dist/generated/message.d.ts +91 -0
  22. package/dist/generated/message.d.ts.map +1 -0
  23. package/dist/generated/nostr/fb/image-data.d.ts +6 -2
  24. package/dist/generated/nostr/fb/image-data.d.ts.map +1 -1
  25. package/dist/generated/nostr/fb/kind0parsed.d.ts +100 -0
  26. package/dist/generated/nostr/fb/kind0parsed.d.ts.map +1 -0
  27. package/dist/generated/nostr/fb/kind10002parsed.d.ts +25 -0
  28. package/dist/generated/nostr/fb/kind10002parsed.d.ts.map +1 -0
  29. package/dist/generated/nostr/fb/kind10019parsed.d.ts +38 -0
  30. package/dist/generated/nostr/fb/kind10019parsed.d.ts.map +1 -0
  31. package/dist/generated/nostr/fb/kind17375parsed.d.ts +38 -0
  32. package/dist/generated/nostr/fb/kind17375parsed.d.ts.map +1 -0
  33. package/dist/generated/nostr/fb/kind17parsed.d.ts +42 -0
  34. package/dist/generated/nostr/fb/kind17parsed.d.ts.map +1 -0
  35. package/dist/generated/nostr/fb/kind1parsed.d.ts +50 -0
  36. package/dist/generated/nostr/fb/kind1parsed.d.ts.map +1 -0
  37. package/dist/generated/nostr/fb/kind30023-parsed.d.ts +6 -2
  38. package/dist/generated/nostr/fb/kind30023-parsed.d.ts.map +1 -1
  39. package/dist/generated/nostr/fb/kind30023parsed.d.ts +58 -0
  40. package/dist/generated/nostr/fb/kind30023parsed.d.ts.map +1 -0
  41. package/dist/generated/nostr/fb/kind3parsed.d.ts +25 -0
  42. package/dist/generated/nostr/fb/kind3parsed.d.ts.map +1 -0
  43. package/dist/generated/nostr/fb/kind4parsed.d.ts +39 -0
  44. package/dist/generated/nostr/fb/kind4parsed.d.ts.map +1 -0
  45. package/dist/generated/nostr/fb/kind6parsed.d.ts +22 -0
  46. package/dist/generated/nostr/fb/kind6parsed.d.ts.map +1 -0
  47. package/dist/generated/nostr/fb/kind7374parsed.d.ts +31 -0
  48. package/dist/generated/nostr/fb/kind7374parsed.d.ts.map +1 -0
  49. package/dist/generated/nostr/fb/kind7375parsed.d.ts +41 -0
  50. package/dist/generated/nostr/fb/kind7375parsed.d.ts.map +1 -0
  51. package/dist/generated/nostr/fb/kind7376parsed.d.ts +58 -0
  52. package/dist/generated/nostr/fb/kind7376parsed.d.ts.map +1 -0
  53. package/dist/generated/nostr/fb/kind7parsed.d.ts +42 -0
  54. package/dist/generated/nostr/fb/kind7parsed.d.ts.map +1 -0
  55. package/dist/generated/nostr/fb/kind9321parsed.d.ts +64 -0
  56. package/dist/generated/nostr/fb/kind9321parsed.d.ts.map +1 -0
  57. package/dist/generated/nostr/fb/kind9735parsed.d.ts +64 -0
  58. package/dist/generated/nostr/fb/kind9735parsed.d.ts.map +1 -0
  59. package/dist/generated/nostr/fb/p2pkwitness.d.ts +27 -0
  60. package/dist/generated/nostr/fb/p2pkwitness.d.ts.map +1 -0
  61. package/dist/hooks.d.ts +5 -0
  62. package/dist/hooks.d.ts.map +1 -1
  63. package/dist/hooks.js +1 -1
  64. package/dist/hooks.js.map +1 -1
  65. package/dist/index.d.ts +17 -6
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +1 -1
  68. package/dist/index2.js +1 -1
  69. package/dist/index2.js.map +1 -1
  70. package/dist/lib/ArrayBufferReader.d.ts +73 -0
  71. package/dist/lib/ArrayBufferReader.d.ts.map +1 -0
  72. package/dist/lib/ByteString.d.ts.map +1 -1
  73. package/dist/parser/index.d.ts +8 -6
  74. package/dist/parser/index.d.ts.map +1 -1
  75. package/dist/parser/index.js +2 -2
  76. package/dist/parser/index.js.map +1 -1
  77. package/dist/parser/pkg/rust_worker.d.ts +1 -1
  78. package/dist/utils.js +4 -4
  79. package/dist/utils.js.map +1 -1
  80. package/package.json +4 -2
  81. package/dist/generated/nostr/fb/kind39089-parsed.d.ts +0 -43
  82. package/dist/generated/nostr/fb/kind39089-parsed.d.ts.map +0 -1
  83. package/dist/generated/nostr/fb/set-pub-key.d.ts +0 -24
  84. package/dist/generated/nostr/fb/set-pub-key.d.ts.map +0 -1
  85. package/dist/lib/SharedBuffer.d.ts +0 -62
  86. package/dist/lib/SharedBuffer.d.ts.map +0 -1
  87. package/dist/ring-buffer.js +0 -1
  88. package/dist/ring-buffer.js.map +0 -1
  89. package/dist/ws/connection.d.ts +0 -37
  90. package/dist/ws/connection.d.ts.map +0 -1
  91. package/dist/ws/index.d.ts +0 -2
  92. package/dist/ws/index.d.ts.map +0 -1
  93. package/dist/ws/index.js +0 -1
  94. package/dist/ws/index.js.map +0 -1
  95. package/dist/ws/registry.d.ts +0 -31
  96. package/dist/ws/registry.d.ts.map +0 -1
  97. package/dist/ws/ring-buffer.d.ts +0 -34
  98. package/dist/ws/ring-buffer.d.ts.map +0 -1
  99. package/dist/ws/runtime.d.ts +0 -23
  100. package/dist/ws/runtime.d.ts.map +0 -1
  101. package/dist/ws/types.d.ts +0 -55
  102. package/dist/ws/types.d.ts.map +0 -1
@@ -6,7 +6,7 @@ export class NostrClient {
6
6
  get_public_key(): Promise<void>;
7
7
  handle_message(message_obj: any): Promise<void>;
8
8
  close_subscription(subscription_id: string): Promise<void>;
9
- constructor(db_ring: SharedArrayBuffer, cache_request: SharedArrayBuffer, cache_response: SharedArrayBuffer, crypto_request: SharedArrayBuffer, crypto_response: SharedArrayBuffer, ws_response: SharedArrayBuffer);
9
+ constructor(from_connections: MessagePort, to_cache: MessagePort, from_cache: MessagePort, to_crypto: MessagePort, from_crypto: MessagePort, to_main: MessagePort);
10
10
  }
11
11
 
12
12
  export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module;
package/dist/utils.js CHANGED
@@ -1,4 +1,4 @@
1
- import{nip19 as W,generateSecretKey as V,getPublicKey as $}from"nostr-tools";import{M as v,u as E,E as J,C as X,B as Y,V as nn,P as a,a as f,b as o,c as w,d as P,e as S,I as N,f as B,g as H,h as en,i as tn,H as an,L as sn,N as rn,m as dn}from"./index2.js";import{ByteBuffer as on}from"flatbuffers";function R(n){return n.type()!==v.ConnectionStatus?null:E(n.contentType(),n.content.bind(n))}const un=R;function G(n){return n.type()!==v.Eoce?null:n.content(new J)??null}const cn=G;function _(n){return n.type()!==v.CountResponse?null:n.content(new X)??null}const ln=_;function j(n){return n.type()!==v.BufferFull?null:n.content(new Y)??null}const pn=j;function z(n){return n.type()!==v.ValidProofs?null:n.content(new nn)??null}const fn=z;function L(n){return n.type()!==v.ParsedNostrEvent?null:E(n.contentType(),n.content.bind(n))}const yn=L,Z=n=>n.type()!==v.NostrEvent?null:E(n.contentType(),n.content.bind(n)),gn=Z;function y(n,t){if(!n)return null;const s=L(n);return!s||s?.parsedType?.()!==t?null:f(t,s.parsed.bind(s))}function hn(n){return y(n,a.Kind0Parsed)}function Kn(n){return!n||n?.parsedType?.()!==a.Kind0Parsed?null:f(a.Kind0Parsed,n.parsed.bind(n))}function Pn(n){return y(n,a.Kind1Parsed)}function bn(n){return n?.parsedType?.()!==a.Kind1Parsed?null:f(a.Kind1Parsed,n.parsed.bind(n))}function wn(n){return y(n,a.Kind3Parsed)}function mn(n){return n?.parsedType?.()!==a.Kind3Parsed?null:f(a.Kind3Parsed,n.parsed.bind(n))}function vn(n){return y(n,a.Kind4Parsed)}function Dn(n){return n?.parsedType?.()!==a.Kind4Parsed?null:f(a.Kind4Parsed,n.parsed.bind(n))}function Sn(n){return y(n,a.Kind6Parsed)}function Tn(n){return n?.parsedType?.()!==a.Kind6Parsed?null:f(a.Kind6Parsed,n.parsed.bind(n))}function xn(n){return y(n,a.Kind7Parsed)}function Cn(n){return n?.parsedType?.()!==a.Kind7Parsed?null:f(a.Kind7Parsed,n.parsed.bind(n))}function kn(n){return y(n,a.Kind17Parsed)}function Mn(n){return n?.parsedType?.()!==a.Kind17Parsed?null:f(a.Kind17Parsed,n.parsed.bind(n))}function An(n){return y(n,a.Kind10002Parsed)}function In(n){return n?.parsedType?.()!==a.Kind10002Parsed?null:f(a.Kind10002Parsed,n.parsed.bind(n))}function En(n){return y(n,a.Kind10019Parsed)}function Nn(n){return n?.parsedType?.()!==a.Kind10019Parsed?null:f(a.Kind10019Parsed,n.parsed.bind(n))}function Bn(n){return y(n,a.Kind17375Parsed)}function Rn(n){return n?.parsedType?.()!==a.Kind17375Parsed?null:f(a.Kind17375Parsed,n.parsed.bind(n))}function Ln(n){return y(n,a.Kind7374Parsed)}function Vn(n){return n?.parsedType?.()!==a.Kind7374Parsed?null:f(a.Kind7374Parsed,n.parsed.bind(n))}function $n(n){return y(n,a.Kind7375Parsed)}function Hn(n){return n?.parsedType?.()!==a.Kind7375Parsed?null:f(a.Kind7375Parsed,n.parsed.bind(n))}function Gn(n){return y(n,a.Kind7376Parsed)}function _n(n){return n?.parsedType?.()!==a.Kind7376Parsed?null:f(a.Kind7376Parsed,n.parsed.bind(n))}function jn(n){return y(n,a.Kind9321Parsed)}function zn(n){return n?.parsedType?.()!==a.Kind9321Parsed?null:f(a.Kind9321Parsed,n.parsed.bind(n))}function Zn(n){return y(n,a.Kind9735Parsed)}function Fn(n){return n?.parsedType?.()!==a.Kind9735Parsed?null:f(a.Kind9735Parsed,n.parsed.bind(n))}function On(n){return y(n,a.ListParsed)}function Un(n){return n?.parsedType?.()!==a.ListParsed?null:f(a.ListParsed,n.parsed.bind(n))}function Qn(n){return n.dataType()!==o.CodeData?null:w(o.CodeData,n.data.bind(n))}function qn(n){return n.dataType()!==o.HashtagData?null:w(o.HashtagData,n.data.bind(n))}function Wn(n){return n.dataType()!==o.CashuData?null:w(o.CashuData,n.data.bind(n))}function Jn(n){return n.dataType()!==o.ImageData?null:w(o.ImageData,n.data.bind(n))}function Xn(n){return n.dataType()!==o.VideoData?null:w(o.VideoData,n.data.bind(n))}function Yn(n){return n.dataType()!==o.MediaGroupData?null:w(o.MediaGroupData,n.data.bind(n))}function ne(n){return n.dataType()!==o.NostrData?null:w(o.NostrData,n.data.bind(n))}function ee(n){return n.dataType()!==o.LinkPreviewData?null:w(o.LinkPreviewData,n.data.bind(n))}class te{constructor(){this.knownRelays=new Map,this.incomingCount=0,this.resolvedCount=0}handleMessage(t){const s=R(t);if(!s)return;const r=s.relayUrl()?.fnv1aHash();r&&!this.knownRelays.has(r)&&(this.incomingCount++,this.knownRelays.set(r,s)),this.isResolved(s)&&this.resolvedCount++}isResolved(t){return t.status()?.toString()==="EOSE"}get totalIncoming(){return this.incomingCount}get totalResolved(){return this.resolvedCount}get resolutionRate(){return this.incomingCount===0?0:this.resolvedCount/this.incomingCount}}on.prototype.__stringByteString=function(n){n+=this.readInt32(n);const t=this.readInt32(n),s=n+4,r=this.bytes().subarray(s,s+t);return new O(r)};const F=new TextDecoder("utf-8"),ae=(()=>{const n=new Array(256);for(let t=0;t<256;t++)n[t]=t.toString(16).padStart(2,"0");return n})();class O{constructor(t){this.view=t}bytes(){return this.view}fnv1aHash(){let t=2166136261;const s=this.view;for(let r=0;r<s.length;r++)t^=s[r],t=Math.imul(t,16777619);return t>>>0}toHex(){const t=this.view;let s="";for(let r=0;r<t.length;r++)s+=ae[t[r]];return s}utf8String(){const t=this.view;let s=0;for(let r=0;r<t.length;r++)s|=t[r];if(!(s&128)){let r="";for(let p=0;p<t.length;p+=32768)r+=String.fromCharCode.apply(null,t.subarray(p,p+32768));return r}if(t.buffer instanceof SharedArrayBuffer){const r=new Uint8Array(t);return F.decode(r)}return F.decode(t)}toString(){return this.utf8String()}equals(t){const s=this.view,r=t.view;if(s.length!==r.length)return!1;for(let p=0;p<s.length;p++)if(s[p]!==r[p])return!1;return!0}}const d=new TextEncoder;async function se(n){const t=[],s=e=>new P(d.encode("text"),d.encode(e),o.NONE,null),r=e=>new P(d.encode("image"),d.encode(e),o.ImageData,new N(d.encode(e),null)),p=e=>new P(d.encode("video"),d.encode(e),o.VideoData,new B(d.encode(e),null)),m=(e,i)=>{const u=e.indexOf(`
2
- `);let h=null,c=e;if(u!==-1){const K=e.slice(0,u).trim(),k=e.slice(u+1);K&&/^[a-zA-Z0-9+#\.\-_]+$/.test(K)&&(h=K,c=k)}return new P(d.encode("code"),d.encode(i),o.CodeData,new en(d.encode(h||""),d.encode(c)))},b=e=>new P(d.encode("cashu"),d.encode(e),o.CashuData,new tn(d.encode(e))),T=e=>new P(d.encode("hashtag"),d.encode(`#${e}`),o.HashtagData,new an(d.encode(e))),x=e=>new P(d.encode("link"),d.encode(e),o.LinkPreviewData,new sn(d.encode(e),null,null,null)),U=(e,i)=>{try{const u=W.decode(e),h=u.type;let c=null,K=[],k=null,I=BigInt(0);const l=u.data;switch(h){case"npub":c=l;break;case"nprofile":c=l.pubkey,K=Array.isArray(l.relays)?l.relays:[];break;case"note":c=l;break;case"nevent":c=l.id,K=Array.isArray(l.relays)?l.relays:[],k=typeof l.author=="string"?l.author:null,typeof l.kind=="number"&&(I=BigInt(l.kind));break;case"naddr":c=`${l.kind}:${l.pubkey}:${l.identifier}`,K=Array.isArray(l.relays)?l.relays:[],typeof l.kind=="number"&&(I=BigInt(l.kind)),k=typeof l.pubkey=="string"?l.pubkey:null;break}return c||(c=e),new P(d.encode(h),d.encode(i),o.NostrData,new rn(d.encode(c),d.encode(e),K,d.encode(k||""),I))}catch{return s(i)}},Q=[{type:"code",regex:/```([\s\S]*?)```/g,processMatch:e=>m(e[1]||"",e[0])},{type:"cashu",regex:/(cashuA[A-Za-z0-9_-]+)/g,processMatch:e=>b(e[0])},{type:"hashtag",regex:/(?<![^\s"'(])(#[a-zA-Z0-9_]+)(?![a-zA-Z0-9_])/g,processMatch:e=>T(e[0].substring(1))},{type:"image",regex:/(https?:\/\/\S+\.(?:jpg|jpeg|png|gif|webp|svg|ico)(?:\?\S*)?)/gi,processMatch:e=>r(e[0])},{type:"video",regex:/(https?:\/\/\S+\.(?:mp4|mov|avi|mkv|webm|m4v)(?:\?\S*)?)/gi,processMatch:e=>p(e[0])},{type:"nostr",regex:/nostr:([a-z0-9]+)/gi,processMatch:e=>{const i=e[1];return U(i||"",e[0])}},{type:"link",regex:/(https?:\/\/\S+)(?![\)])/gi,processMatch:async e=>x(e[0])}],A=[];for(const e of Q){let i;for(e.regex.lastIndex=0;(i=e.regex.exec(n))!==null;){const u=i.index,h=u+i[0].length,c=await e.processMatch(i);A.push({start:u,end:h,block:c})}}A.sort((e,i)=>e.start-i.start);const M=[];for(const e of A)M.some(i=>e.start>=i.start&&e.start<i.end||e.end>i.start&&e.end<=i.end||e.start<=i.start&&e.end>=i.end)||M.push(e);M.sort((e,i)=>e.start-i.start);let C=0;for(const{start:e,end:i,block:u}of M)e>C&&t.push(s(n.substring(C,e))),t.push(u),C=i;C<n.length&&t.push(s(n.substring(C)));const D=[];let g=[];const q=e=>/^\s+$/.test(e);for(let e=0;e<t.length;e++){const i=t[e];if(i?.type?.toString()==="image"||i?.type?.toString()==="video"){g.push(i);continue}if(!(i?.type?.toString()==="text"&&typeof i?.text?.toString()=="string"&&q(i.text?.toString())&&g.length>0&&e+1<t.length&&(t[e+1]?.type?.toString()==="image"||t[e+1]?.type?.toString()==="video"))){if(g.length>0){if(g.length>1){const u=g.map(c=>{if(c.dataType===o.ImageData){const K=c.data;return new S(new N(d.encode(K.url??c.text),null),null)}else if(c.dataType===o.VideoData){const K=c.data;return new S(null,new B(d.encode(K.url??c.text),null))}return new S(null,null)}),h=g.map(c=>String(c.text??"")).join(`
3
- `);D.push(new P(d.encode("mediaGrid"),d.encode(h),o.MediaGroupData,new H(u)))}else D.push(g[0]);g=[]}D.push(i)}}if(g.length>0)if(g.length>1){const e=g.map(u=>{if(u.dataType===o.ImageData){const h=u.data;return new S(new N(d.encode(h.url??u.text),null),null)}else if(u.dataType===o.VideoData){const h=u.data;return new S(null,new B(d.encode(h.url??u.text),null))}return new S(null,null)}),i=g.map(u=>String(u.text??"")).join(`
4
- `);D.push(new P(d.encode("mediaGrid"),d.encode(i),o.MediaGroupData,new H(e)))}else D.push(g[0]);return D}function re(n,t){const s=n[`${String(t)}Length`]();return{[Symbol.iterator](){let r=0;return{next(){for(;r<s;){const p=n[t](r);if(r++,p!=null)return{value:p,done:!1}}return{value:void 0,done:!0}}}}}}function ie(n,t){if(!n)return[];const s=n[`${String(t)}Length`]?.bind(n);if(!s)return[];const r=s(),p=[];for(let m=0;m<r;m++){const b=n[t](m);b!=null&&p.push(b)}return p}async function de(n,t){const s=V(),r=$(s),p=Array.from(s).map(x=>x.toString(16).padStart(2,"0")).join(""),m=$(V()),b=new URLSearchParams;for(const x of t)b.append("relay",x);b.set("secret",m),b.set("name",n);const T=`nostrconnect://${r}?${b.toString()}`;return console.log("connect url:",T),dn.setNip46QR(T,p),T}export{O as ByteString,te as ConnectionTracker,pn as asBufferFull,Wn as asCashuData,Qn as asCodeData,un as asConnectionStatus,ln as asCountResponse,cn as asEoce,qn as asHashtagData,Jn as asImageData,Kn as asKind0,bn as asKind1,In as asKind10002,Nn as asKind10019,Mn as asKind17,Rn as asKind17375,mn as asKind3,Dn as asKind4,Tn as asKind6,Cn as asKind7,Vn as asKind7374,Hn as asKind7375,_n as asKind7376,zn as asKind9321,Fn as asKind9735,ee as asLinkPreview,Yn as asMediaGroupData,Un as asNip51,ne as asNostrData,gn as asNostrEvent,yn as asParsedEvent,fn as asValidProofs,Xn as asVideoData,de as connectWithQRCode,ie as fbArray,re as fbIterable,j as isBufferFull,R as isConnectionStatus,_ as isCountResponse,G as isEoce,hn as isKind0,Pn as isKind1,An as isKind10002,En as isKind10019,kn as isKind17,Bn as isKind17375,wn as isKind3,vn as isKind4,Sn as isKind6,xn as isKind7,Ln as isKind7374,$n as isKind7375,Gn as isKind7376,jn as isKind9321,Zn as isKind9735,On as isNip51,Z as isNostrEvent,L as isParsedEvent,z as isValidProofs,se as parseContent};
1
+ import{nip19 as V,generateSecretKey as I,getPublicKey as R}from"nostr-tools";import{C as f,a as u,M as v,I as M,V as A,b as E,c as H,d as L,H as _,L as z,N as G,m as j}from"./index2.js";import{i as N}from"./NarrowTypes.js";import{g as Z,W as O,U as F,a as U,e as Q,c as q,V as J,X as W,p as X,r as Y,D as ee,F as se,B as te,H as ae,t as ne,v as re,x as oe,z as ie,J as ce,L as de,N as le,P as ue,R as ge,$ as pe,Z as he,T as fe,_ as ye,n as we,l as me,j as ve,Y as Se,f as Ke,d as be,b as xe,o as ke,q as Ce,C as De,E as Me,A as Ae,G as Ie,s as Re,u as Ee,w as Ne,y as $e,I as Be,K as Pe,M as Te,O as Ve,Q as He,S as Le,m as _e,k as ze,h as Ge}from"./NarrowTypes.js";import{ByteBuffer as je}from"flatbuffers";class Ze{constructor(){this.knownRelays=new Map,this.incomingCount=0,this.resolvedCount=0}handleMessage(s){const r=N(s);if(!r)return;const n=r.relayUrl()?.fnv1aHash();n&&!this.knownRelays.has(n)&&(this.incomingCount++,this.knownRelays.set(n,r)),this.isResolved(r)&&this.resolvedCount++}isResolved(s){return s.status()?.toString()==="EOSE"}get totalIncoming(){return this.incomingCount}get totalResolved(){return this.resolvedCount}get resolutionRate(){return this.incomingCount===0?0:this.resolvedCount/this.incomingCount}}je.prototype.__stringByteString=function(o){o+=this.readInt32(o);const s=this.readInt32(o),r=o+4,n=this.bytes().subarray(r,r+s);return new $(n)};const Oe=new TextDecoder("utf-8"),Fe=(()=>{const o=new Array(256);for(let s=0;s<256;s++)o[s]=s.toString(16).padStart(2,"0");return o})();class ${constructor(s){this.view=s}bytes(){return this.view}fnv1aHash(){let s=2166136261;const r=this.view;for(let n=0;n<r.length;n++)s^=r[n],s=Math.imul(s,16777619);return s>>>0}toHex(){const s=this.view;let r="";for(let n=0;n<s.length;n++)r+=Fe[s[n]];return r}utf8String(){const s=this.view;let r=0;for(let n=0;n<s.length;n++)r|=s[n];if(!(r&128)){let n="";for(let l=0;l<s.length;l+=32768)n+=String.fromCharCode.apply(null,s.subarray(l,l+32768));return n}return Oe.decode(s)}toString(){return this.utf8String()}equals(s){const r=this.view,n=s.view;if(r.length!==n.length)return!1;for(let l=0;l<r.length;l++)if(r[l]!==n[l])return!1;return!0}}const a=new TextEncoder;async function Ue(o){const s=[],r=e=>new f(a.encode("text"),a.encode(e),u.NONE,null),n=e=>new f(a.encode("image"),a.encode(e),u.ImageData,new M(a.encode(e),null)),l=e=>new f(a.encode("video"),a.encode(e),u.VideoData,new A(a.encode(e),null)),w=(e,t)=>{const i=e.indexOf(`
2
+ `);let p=null,c=e;if(i!==-1){const h=e.slice(0,i).trim(),x=e.slice(i+1);h&&/^[a-zA-Z0-9+#\.\-_]+$/.test(h)&&(p=h,c=x)}return new f(a.encode("code"),a.encode(t),u.CodeData,new H(a.encode(p||""),a.encode(c)))},y=e=>new f(a.encode("cashu"),a.encode(e),u.CashuData,new L(a.encode(e))),S=e=>new f(a.encode("hashtag"),a.encode(`#${e}`),u.HashtagData,new _(a.encode(e))),K=e=>new f(a.encode("link"),a.encode(e),u.LinkPreviewData,new z(a.encode(e),null,null,null)),B=(e,t)=>{try{const i=V.decode(e),p=i.type;let c=null,h=[],x=null,D=BigInt(0);const d=i.data;switch(p){case"npub":c=d;break;case"nprofile":c=d.pubkey,h=Array.isArray(d.relays)?d.relays:[];break;case"note":c=d;break;case"nevent":c=d.id,h=Array.isArray(d.relays)?d.relays:[],x=typeof d.author=="string"?d.author:null,typeof d.kind=="number"&&(D=BigInt(d.kind));break;case"naddr":c=`${d.kind}:${d.pubkey}:${d.identifier}`,h=Array.isArray(d.relays)?d.relays:[],typeof d.kind=="number"&&(D=BigInt(d.kind)),x=typeof d.pubkey=="string"?d.pubkey:null;break}return c||(c=e),new f(a.encode(p),a.encode(t),u.NostrData,new G(a.encode(c),a.encode(e),h,a.encode(x||""),D))}catch{return r(t)}},P=[{type:"code",regex:/```([\s\S]*?)```/g,processMatch:e=>w(e[1]||"",e[0])},{type:"cashu",regex:/(cashuA[A-Za-z0-9_-]+)/g,processMatch:e=>y(e[0])},{type:"hashtag",regex:/(?<![^\s"'(])(#[a-zA-Z0-9_]+)(?![a-zA-Z0-9_])/g,processMatch:e=>S(e[0].substring(1))},{type:"image",regex:/(https?:\/\/\S+\.(?:jpg|jpeg|png|gif|webp|svg|ico)(?:\?\S*)?)/gi,processMatch:e=>n(e[0])},{type:"video",regex:/(https?:\/\/\S+\.(?:mp4|mov|avi|mkv|webm|m4v)(?:\?\S*)?)/gi,processMatch:e=>l(e[0])},{type:"nostr",regex:/nostr:([a-z0-9]+)/gi,processMatch:e=>{const t=e[1];return B(t||"",e[0])}},{type:"link",regex:/(https?:\/\/\S+)(?![\)])/gi,processMatch:async e=>K(e[0])}],C=[];for(const e of P){let t;for(e.regex.lastIndex=0;(t=e.regex.exec(o))!==null;){const i=t.index,p=i+t[0].length,c=await e.processMatch(t);C.push({start:i,end:p,block:c})}}C.sort((e,t)=>e.start-t.start);const k=[];for(const e of C)k.some(t=>e.start>=t.start&&e.start<t.end||e.end>t.start&&e.end<=t.end||e.start<=t.start&&e.end>=t.end)||k.push(e);k.sort((e,t)=>e.start-t.start);let b=0;for(const{start:e,end:t,block:i}of k)e>b&&s.push(r(o.substring(b,e))),s.push(i),b=t;b<o.length&&s.push(r(o.substring(b)));const m=[];let g=[];const T=e=>/^\s+$/.test(e);for(let e=0;e<s.length;e++){const t=s[e];if(t?.type?.toString()==="image"||t?.type?.toString()==="video"){g.push(t);continue}if(!(t?.type?.toString()==="text"&&typeof t?.text?.toString()=="string"&&T(t.text?.toString())&&g.length>0&&e+1<s.length&&(s[e+1]?.type?.toString()==="image"||s[e+1]?.type?.toString()==="video"))){if(g.length>0){if(g.length>1){const i=g.map(c=>{if(c.dataType===u.ImageData){const h=c.data;return new v(new M(a.encode(h.url??c.text),null),null)}else if(c.dataType===u.VideoData){const h=c.data;return new v(null,new A(a.encode(h.url??c.text),null))}return new v(null,null)}),p=g.map(c=>String(c.text??"")).join(`
3
+ `);m.push(new f(a.encode("mediaGrid"),a.encode(p),u.MediaGroupData,new E(i)))}else m.push(g[0]);g=[]}m.push(t)}}if(g.length>0)if(g.length>1){const e=g.map(i=>{if(i.dataType===u.ImageData){const p=i.data;return new v(new M(a.encode(p.url??i.text),null),null)}else if(i.dataType===u.VideoData){const p=i.data;return new v(null,new A(a.encode(p.url??i.text),null))}return new v(null,null)}),t=g.map(i=>String(i.text??"")).join(`
4
+ `);m.push(new f(a.encode("mediaGrid"),a.encode(t),u.MediaGroupData,new E(e)))}else m.push(g[0]);return m}function Qe(o,s){const r=o[`${String(s)}Length`]();return{[Symbol.iterator](){let n=0;return{next(){for(;n<r;){const l=o[s](n);if(n++,l!=null)return{value:l,done:!1}}return{value:void 0,done:!0}}}}}}function qe(o,s){if(!o)return[];const r=o[`${String(s)}Length`]?.bind(o);if(!r)return[];const n=r(),l=[];for(let w=0;w<n;w++){const y=o[s](w);y!=null&&l.push(y)}return l}async function Je(o,s){const r=I(),n=R(r),l=Array.from(r).map(K=>K.toString(16).padStart(2,"0")).join(""),w=R(I()),y=new URLSearchParams;for(const K of s)y.append("relay",K);y.set("secret",w),y.set("name",o);const S=`nostrconnect://${n}?${y.toString()}`;return console.log("connect url:",S),j.setNip46QR(S,l),S}export{$ as ByteString,Ze as ConnectionTracker,Z as asBufferFull,O as asCashuData,F as asCodeData,U as asConnectionStatus,Q as asCountResponse,q as asEoce,J as asHashtagData,W as asImageData,X as asKind0,Y as asKind1,ee as asKind10002,se as asKind10019,te as asKind17,ae as asKind17375,ne as asKind3,re as asKind4,oe as asKind6,ie as asKind7,ce as asKind7374,de as asKind7375,le as asKind7376,ue as asKind9321,ge as asKind9735,pe as asLinkPreview,he as asMediaGroupData,fe as asNip51,ye as asNostrData,we as asNostrEvent,me as asParsedEvent,ve as asValidProofs,Se as asVideoData,Je as connectWithQRCode,qe as fbArray,Qe as fbIterable,Ke as isBufferFull,N as isConnectionStatus,be as isCountResponse,xe as isEoce,ke as isKind0,Ce as isKind1,De as isKind10002,Me as isKind10019,Ae as isKind17,Ie as isKind17375,Re as isKind3,Ee as isKind4,Ne as isKind6,$e as isKind7,Be as isKind7374,Pe as isKind7375,Te as isKind7376,Ve as isKind9321,He as isKind9735,Le as isNip51,_e as isNostrEvent,ze as isParsedEvent,Ge as isValidProofs,Ue as parseContent};
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../src/lib/NarrowTypes.ts","../src/lib/ConnectionTracker.ts","../src/lib/ByteString.ts","../src/lib/ParseContent.ts","../src/utils.ts"],"sourcesContent":["import {\n\tWorkerMessage,\n\tMessageType,\n\tConnectionStatus,\n\tEoce,\n\tCountResponse,\n\tBufferFull,\n\tValidProofs,\n\tParsedEvent,\n\tKind0Parsed,\n\tKind1Parsed,\n\tKind3Parsed,\n\tKind4Parsed,\n\tKind6Parsed,\n\tKind7Parsed,\n\tKind17Parsed,\n\tKind10002Parsed,\n\tKind10019Parsed,\n\tKind17375Parsed,\n\tKind7374Parsed,\n\tKind7375Parsed,\n\tKind7376Parsed,\n\tKind9321Parsed,\n\tKind9735Parsed,\n\tContentBlock,\n\tLinkPreviewData,\n\tContentData,\n\tCashuData,\n\tHashtagData,\n\tCodeData,\n\tMediaGroupData,\n\tNostrData,\n\tVideoData,\n\tNostrEvent,\n\tListParsed\n} from 'src/generated/nostr/fb';\nimport { unionToContentData } from 'src/generated/nostr/fb/content-data';\nimport { unionToMessage } from 'src/generated/nostr/fb/message';\nimport { unionToParsedData, ParsedData } from 'src/generated/nostr/fb/parsed-data';\n\n// ---- Top-level Message helpers ----\nexport function isConnectionStatus(msg: WorkerMessage): ConnectionStatus | null {\n\tif (msg.type() !== MessageType.ConnectionStatus) return null;\n\treturn unionToMessage(msg.contentType(), msg.content.bind(msg)) as ConnectionStatus;\n}\n\nexport const asConnectionStatus = isConnectionStatus;\n\nexport function isEoce(msg: WorkerMessage): Eoce | null {\n\tif (msg.type() !== MessageType.Eoce) return null;\n\treturn msg.content(new Eoce()) ?? null;\n}\n\nexport const asEoce = isEoce;\n\nexport function isCountResponse(msg: WorkerMessage): CountResponse | null {\n\tif (msg.type() !== MessageType.CountResponse) return null;\n\treturn msg.content(new CountResponse()) ?? null;\n}\n\nexport const asCountResponse = isCountResponse;\n\nexport function isBufferFull(msg: WorkerMessage): BufferFull | null {\n\tif (msg.type() !== MessageType.BufferFull) return null;\n\treturn msg.content(new BufferFull()) ?? null;\n}\n\nexport const asBufferFull = isBufferFull;\n\nexport function isValidProofs(msg: WorkerMessage): ValidProofs | null {\n\tif (msg.type() !== MessageType.ValidProofs) return null;\n\treturn msg.content(new ValidProofs()) ?? null;\n}\n\nexport const asValidProofs = isValidProofs;\n\n// ---- Generic ParsedEvent --------\nexport function isParsedEvent(msg: WorkerMessage): ParsedEvent | null {\n\tif (msg.type() !== MessageType.ParsedNostrEvent) return null;\n\treturn unionToMessage(msg.contentType(), msg.content.bind(msg)) as ParsedEvent;\n}\n\nexport const asParsedEvent = isParsedEvent;\n\nexport const isNostrEvent = (msg: WorkerMessage): NostrEvent | null => {\n\tif (msg.type() !== MessageType.NostrEvent) return null;\n\treturn unionToMessage(msg.contentType(), msg.content.bind(msg)) as NostrEvent;\n};\n\nexport const asNostrEvent = isNostrEvent;\n\n// ---- ParsedData Kind helpers ----\nfunction parsedKind<T>(msg: WorkerMessage, kind: ParsedData): T | null {\n\tif (!msg) return null;\n\tconst ev = isParsedEvent(msg);\n\tif (!ev) return null;\n\tif (ev?.parsedType?.() !== kind) return null;\n\treturn unionToParsedData(kind, ev.parsed.bind(ev)) as T;\n}\n\nexport function isKind0(msg: WorkerMessage): Kind0Parsed | null {\n\treturn parsedKind<Kind0Parsed>(msg, ParsedData.Kind0Parsed);\n}\nexport function asKind0(ev: ParsedEvent): Kind0Parsed | null {\n\tif (!ev) return null;\n\tif (ev?.parsedType?.() !== ParsedData.Kind0Parsed) return null;\n\treturn unionToParsedData(ParsedData.Kind0Parsed, ev.parsed.bind(ev)) as Kind0Parsed;\n}\nexport function isKind1(msg: WorkerMessage): Kind1Parsed | null {\n\treturn parsedKind<Kind1Parsed>(msg, ParsedData.Kind1Parsed);\n}\nexport function asKind1(ev: ParsedEvent): Kind1Parsed | null {\n\tif (ev?.parsedType?.() !== ParsedData.Kind1Parsed) return null;\n\treturn unionToParsedData(ParsedData.Kind1Parsed, ev.parsed.bind(ev)) as Kind1Parsed;\n}\nexport function isKind3(msg: WorkerMessage): Kind3Parsed | null {\n\treturn parsedKind<Kind3Parsed>(msg, ParsedData.Kind3Parsed);\n}\nexport function asKind3(ev: ParsedEvent): Kind3Parsed | null {\n\tif (ev?.parsedType?.() !== ParsedData.Kind3Parsed) return null;\n\treturn unionToParsedData(ParsedData.Kind3Parsed, ev.parsed.bind(ev)) as Kind3Parsed;\n}\nexport function isKind4(msg: WorkerMessage): Kind4Parsed | null {\n\treturn parsedKind<Kind4Parsed>(msg, ParsedData.Kind4Parsed);\n}\nexport function asKind4(ev: ParsedEvent): Kind4Parsed | null {\n\tif (ev?.parsedType?.() !== ParsedData.Kind4Parsed) return null;\n\treturn unionToParsedData(ParsedData.Kind4Parsed, ev.parsed.bind(ev)) as Kind4Parsed;\n}\nexport function isKind6(msg: WorkerMessage): Kind6Parsed | null {\n\treturn parsedKind<Kind6Parsed>(msg, ParsedData.Kind6Parsed);\n}\nexport function asKind6(ev: ParsedEvent): Kind6Parsed | null {\n\tif (ev?.parsedType?.() !== ParsedData.Kind6Parsed) return null;\n\treturn unionToParsedData(ParsedData.Kind6Parsed, ev.parsed.bind(ev)) as Kind6Parsed;\n}\nexport function isKind7(msg: WorkerMessage): Kind7Parsed | null {\n\treturn parsedKind<Kind7Parsed>(msg, ParsedData.Kind7Parsed);\n}\nexport function asKind7(ev: ParsedEvent): Kind7Parsed | null {\n\tif (ev?.parsedType?.() !== ParsedData.Kind7Parsed) return null;\n\treturn unionToParsedData(ParsedData.Kind7Parsed, ev.parsed.bind(ev)) as Kind7Parsed;\n}\nexport function isKind17(msg: WorkerMessage): Kind17Parsed | null {\n\treturn parsedKind<Kind17Parsed>(msg, ParsedData.Kind17Parsed);\n}\nexport function asKind17(ev: ParsedEvent): Kind17Parsed | null {\n\tif (ev?.parsedType?.() !== ParsedData.Kind17Parsed) return null;\n\treturn unionToParsedData(ParsedData.Kind17Parsed, ev.parsed.bind(ev)) as Kind17Parsed;\n}\nexport function isKind10002(msg: WorkerMessage): Kind10002Parsed | null {\n\treturn parsedKind<Kind10002Parsed>(msg, ParsedData.Kind10002Parsed);\n}\nexport function asKind10002(ev: ParsedEvent): Kind10002Parsed | null {\n\tif (ev?.parsedType?.() !== ParsedData.Kind10002Parsed) return null;\n\treturn unionToParsedData(ParsedData.Kind10002Parsed, ev.parsed.bind(ev)) as Kind10002Parsed;\n}\n\nexport function isKind10019(msg: WorkerMessage): Kind10019Parsed | null {\n\treturn parsedKind<Kind10019Parsed>(msg, ParsedData.Kind10019Parsed);\n}\nexport function asKind10019(ev: ParsedEvent): Kind10019Parsed | null {\n\tif (ev?.parsedType?.() !== ParsedData.Kind10019Parsed) return null;\n\treturn unionToParsedData(ParsedData.Kind10019Parsed, ev.parsed.bind(ev)) as Kind10019Parsed;\n}\n\nexport function isKind17375(msg: WorkerMessage): Kind17375Parsed | null {\n\treturn parsedKind<Kind17375Parsed>(msg, ParsedData.Kind17375Parsed);\n}\nexport function asKind17375(ev: ParsedEvent): Kind17375Parsed | null {\n\tif (ev?.parsedType?.() !== ParsedData.Kind17375Parsed) return null;\n\treturn unionToParsedData(ParsedData.Kind17375Parsed, ev.parsed.bind(ev)) as Kind17375Parsed;\n}\n\nexport function isKind7374(msg: WorkerMessage): Kind7374Parsed | null {\n\treturn parsedKind<Kind7374Parsed>(msg, ParsedData.Kind7374Parsed);\n}\nexport function asKind7374(ev: ParsedEvent): Kind7374Parsed | null {\n\tif (ev?.parsedType?.() !== ParsedData.Kind7374Parsed) return null;\n\treturn unionToParsedData(ParsedData.Kind7374Parsed, ev.parsed.bind(ev)) as Kind7374Parsed;\n}\n\nexport function isKind7375(msg: WorkerMessage): Kind7375Parsed | null {\n\treturn parsedKind<Kind7375Parsed>(msg, ParsedData.Kind7375Parsed);\n}\nexport function asKind7375(ev: ParsedEvent): Kind7375Parsed | null {\n\tif (ev?.parsedType?.() !== ParsedData.Kind7375Parsed) return null;\n\treturn unionToParsedData(ParsedData.Kind7375Parsed, ev.parsed.bind(ev)) as Kind7375Parsed;\n}\n\nexport function isKind7376(msg: WorkerMessage): Kind7376Parsed | null {\n\treturn parsedKind<Kind7376Parsed>(msg, ParsedData.Kind7376Parsed);\n}\nexport function asKind7376(ev: ParsedEvent): Kind7376Parsed | null {\n\tif (ev?.parsedType?.() !== ParsedData.Kind7376Parsed) return null;\n\treturn unionToParsedData(ParsedData.Kind7376Parsed, ev.parsed.bind(ev)) as Kind7376Parsed;\n}\n\nexport function isKind9321(msg: WorkerMessage): Kind9321Parsed | null {\n\treturn parsedKind<Kind9321Parsed>(msg, ParsedData.Kind9321Parsed);\n}\nexport function asKind9321(ev: ParsedEvent): Kind9321Parsed | null {\n\tif (ev?.parsedType?.() !== ParsedData.Kind9321Parsed) return null;\n\treturn unionToParsedData(ParsedData.Kind9321Parsed, ev.parsed.bind(ev)) as Kind9321Parsed;\n}\n\nexport function isKind9735(msg: WorkerMessage): Kind9735Parsed | null {\n\treturn parsedKind<Kind9735Parsed>(msg, ParsedData.Kind9735Parsed);\n}\nexport function asKind9735(ev: ParsedEvent): Kind9735Parsed | null {\n\tif (ev?.parsedType?.() !== ParsedData.Kind9735Parsed) return null;\n\treturn unionToParsedData(ParsedData.Kind9735Parsed, ev.parsed.bind(ev)) as Kind9735Parsed;\n}\n\nexport function isNip51(msg: WorkerMessage): ListParsed | null {\n\treturn parsedKind<ListParsed>(msg, ParsedData.ListParsed);\n}\n\nexport function asNip51(ev: ParsedEvent): ListParsed | null {\n\tif (ev?.parsedType?.() !== ParsedData.ListParsed) return null;\n\treturn unionToParsedData(ParsedData.ListParsed, ev.parsed.bind(ev)) as ListParsed;\n}\n\nexport function asCodeData(block: ContentBlock): CodeData | null {\n\tif (block.dataType() !== ContentData.CodeData) return null;\n\treturn unionToContentData(ContentData.CodeData, block.data.bind(block)) as CodeData;\n}\n\nexport function asHashtagData(block: ContentBlock): HashtagData | null {\n\tif (block.dataType() !== ContentData.HashtagData) return null;\n\treturn unionToContentData(ContentData.HashtagData, block.data.bind(block)) as HashtagData;\n}\n\nexport function asCashuData(block: ContentBlock): CashuData | null {\n\tif (block.dataType() !== ContentData.CashuData) return null;\n\treturn unionToContentData(ContentData.CashuData, block.data.bind(block)) as CashuData;\n}\n\nexport function asImageData(block: ContentBlock): ImageData | null {\n\tif (block.dataType() !== ContentData.ImageData) return null;\n\treturn unionToContentData(ContentData.ImageData, block.data.bind(block)) as unknown as ImageData;\n}\n\nexport function asVideoData(block: ContentBlock): VideoData | null {\n\tif (block.dataType() !== ContentData.VideoData) return null;\n\treturn unionToContentData(ContentData.VideoData, block.data.bind(block)) as VideoData;\n}\n\nexport function asMediaGroupData(block: ContentBlock): MediaGroupData | null {\n\tif (block.dataType() !== ContentData.MediaGroupData) return null;\n\treturn unionToContentData(ContentData.MediaGroupData, block.data.bind(block)) as MediaGroupData;\n}\n\nexport function asNostrData(block: ContentBlock): NostrData | null {\n\tif (block.dataType() !== ContentData.NostrData) return null;\n\treturn unionToContentData(ContentData.NostrData, block.data.bind(block)) as NostrData;\n}\n\nexport function asLinkPreview(block: ContentBlock): LinkPreviewData | null {\n\tif (block.dataType() !== ContentData.LinkPreviewData) return null;\n\treturn unionToContentData(ContentData.LinkPreviewData, block.data.bind(block)) as LinkPreviewData;\n}\n","import { ConnectionStatus, WorkerMessage } from \"src/generated/nostr/fb\";\nimport { isConnectionStatus } from \"./NarrowTypes\";\n\nexport class ConnectionTracker {\n private knownRelays: Map<number, ConnectionStatus> = new Map();\n private incomingCount = 0;\n private resolvedCount = 0;\n\n /**\n * Feed a new message into the tracker\n */\n handleMessage(msg: WorkerMessage) {\n const status = isConnectionStatus(msg);\n if (!status) return; // not a connection status, ignore\n\n const id = status.relayUrl()?.fnv1aHash()\n if(id && !this.knownRelays.has(id)) {\n this.incomingCount++;\n this.knownRelays.set(id, status);\n }\n if (this.isResolved(status)) {\n this.resolvedCount++;\n }\n }\n\n /**\n * Define what counts as a \"resolved\" connection.\n * Adjust based on your real ConnectionStatus enum/shape.\n */\n private isResolved(status: ConnectionStatus): boolean {\n return status.status()?.toString() === \"EOSE\";\n }\n\n /** Total connection attempts processed */\n get totalIncoming(): number {\n return this.incomingCount;\n }\n\n /** How many actually resolved */\n get totalResolved(): number {\n return this.resolvedCount;\n }\n\n /** Quick ratio (0...1) of resolved vs incoming */\n get resolutionRate(): number {\n return this.incomingCount === 0 ? 0 : this.resolvedCount / this.incomingCount;\n }\n}\n","import { ByteBuffer } from 'flatbuffers';\n\n(ByteBuffer.prototype as any).__stringByteString = function (offset: number): ByteString {\n\t// Follow indirect: add the relative offset stored at this location\n\toffset += this.readInt32(offset);\n\n\t// Now at the start of the string object → first 4 bytes = length\n\tconst length = this.readInt32(offset);\n\tconst start = offset + 4;\n\n\t// Slice out exactly [start, start+length]\n\tconst slice = this.bytes().subarray(start, start + length);\n\n\treturn new ByteString(slice);\n};\n\n// Shared decoder for all instances (cheap, stateless for non-streaming use)\nconst UTF8_DECODER = new TextDecoder('utf-8');\n\n// Hex lookup table to speed up toHex()\nconst HEX_TABLE: string[] = (() => {\n\tconst t = new Array(256);\n\tfor (let i = 0; i < 256; i++) t[i] = i.toString(16).padStart(2, '0');\n\treturn t;\n})();\n\n// lib/ByteString.ts\nexport class ByteString {\n\tprivate readonly view: Uint8Array;\n\n\tconstructor(view: Uint8Array) {\n\t\tthis.view = view;\n\t}\n\n\t/**\n\t * Access underlying bytes\n\t */\n\tbytes(): Uint8Array {\n\t\treturn this.view;\n\t}\n\n\t/**\n\t * Fast numeric discriminant (FNV-1a hash).\n\t * Not cryptographically secure, but great for Map/Set keys.\n\t */\n\tfnv1aHash(): number {\n\t\tlet h = 2166136261 >>> 0;\n\t\tconst v = this.view;\n\t\tfor (let i = 0; i < v.length; i++) {\n\t\t\th ^= v[i];\n\t\t\th = Math.imul(h, 16777619);\n\t\t}\n\t\treturn h >>> 0;\n\t}\n\n\t/**\n\t * Return a stable hex string representation.\n\t */\n\ttoHex(): string {\n\t\tconst v = this.view;\n\t\tlet out = '';\n\t\tfor (let i = 0; i < v.length; i++) out += HEX_TABLE[v[i]];\n\t\treturn out;\n\t}\n\n\t/**\n\t * Decode as UTF-8 string.\n\t * If backed by SharedArrayBuffer, makes a safe copy.\n\t * No caching to allow proper GC of event data.\n\t */\n\tutf8String(): string {\n\t\tconst v = this.view;\n\n\t\t// ASCII fast path (quick OR-scan for any high bit)\n\t\tlet acc = 0;\n\t\tfor (let i = 0; i < v.length; i++) acc |= v[i];\n\t\tif ((acc & 0x80) === 0) {\n\t\t\t// All ASCII → decode via String.fromCharCode in chunks\n\t\t\tlet s = '';\n\t\t\tconst CHUNK = 0x8000; // 32k is safe for apply()\n\t\t\tfor (let i = 0; i < v.length; i += CHUNK) {\n\t\t\t\ts += String.fromCharCode.apply(null, v.subarray(i, i + CHUNK) as unknown as number[]);\n\t\t\t}\n\t\t\treturn s;\n\t\t}\n\n\t\t// Non-ASCII: decode directly\n\t\t// For SAB: make a safe copy first\n\t\tconst buf = v.buffer;\n\t\tif (buf instanceof SharedArrayBuffer) {\n\t\t\tconst safeCopy = new Uint8Array(v);\n\t\t\treturn UTF8_DECODER.decode(safeCopy);\n\t\t}\n\n\t\treturn UTF8_DECODER.decode(v);\n\t}\n\n\t/**\n\t * For debugging/logging\n\t */\n\ttoString(): string {\n\t\treturn this.utf8String();\n\t}\n\n\t/**\n\t * Equality check by bytes\n\t */\n\tequals(other: ByteString): boolean {\n\t\tconst a = this.view,\n\t\t\tb = other.view;\n\t\tif (a.length !== b.length) return false;\n\t\tfor (let i = 0; i < a.length; i++) {\n\t\t\tif (a[i] !== b[i]) return false;\n\t\t}\n\t\treturn true;\n\t}\n}\n","import { nip19 } from 'nostr-tools';\n\nimport { ContentBlockT } from 'src/generated/nostr/fb/content-block';\nimport { ContentData } from 'src/generated/nostr/fb/content-data';\nimport { CodeDataT } from 'src/generated/nostr/fb/code-data';\nimport { CashuDataT } from 'src/generated/nostr/fb/cashu-data';\nimport { HashtagDataT } from 'src/generated/nostr/fb/hashtag-data';\nimport { ImageDataT } from 'src/generated/nostr/fb/image-data';\nimport { VideoDataT } from 'src/generated/nostr/fb/video-data';\nimport { MediaGroupDataT } from 'src/generated/nostr/fb/media-group-data';\nimport { MediaItemT } from 'src/generated/nostr/fb/media-item';\nimport { LinkPreviewDataT } from 'src/generated/nostr/fb/link-preview-data';\nimport { NostrDataT } from 'src/generated/nostr/fb/nostr-data';\n\ntype MatchProcessor = (match: RegExpExecArray) => ContentBlockT | Promise<ContentBlockT>;\n\nconst textEncoder = new TextEncoder();\n\nexport async function parseContent(content: string): Promise<ContentBlockT[]> {\n\tconst blocks: ContentBlockT[] = [];\n\n\t// Helpers\n\tconst textBlock = (text: string): ContentBlockT =>\n\t\tnew ContentBlockT(textEncoder.encode('text'), textEncoder.encode(text), ContentData.NONE, null);\n\n\tconst imageBlock = (url: string): ContentBlockT =>\n\t\tnew ContentBlockT(\n\t\t\ttextEncoder.encode('image'),\n\t\t\ttextEncoder.encode(url),\n\t\t\tContentData.ImageData,\n\t\t\tnew ImageDataT(textEncoder.encode(url), null)\n\t\t);\n\n\tconst videoBlock = (url: string): ContentBlockT =>\n\t\tnew ContentBlockT(\n\t\t\ttextEncoder.encode('video'),\n\t\t\ttextEncoder.encode(url),\n\t\t\tContentData.VideoData,\n\t\t\tnew VideoDataT(textEncoder.encode(url), null)\n\t\t);\n\n\tconst codeBlock = (raw: string, full: string): ContentBlockT => {\n\t\t// Try to extract optional language from first line of fenced code\n\t\t// Supports patterns like ```lang\\ncode\\n```\n\t\tconst nl = raw.indexOf('\\n');\n\t\tlet language: string | null = null;\n\t\tlet code = raw;\n\t\tif (nl !== -1) {\n\t\t\tconst firstLine = raw.slice(0, nl).trim();\n\t\t\tconst rest = raw.slice(nl + 1);\n\t\t\tif (firstLine && /^[a-zA-Z0-9+#\\.\\-_]+$/.test(firstLine)) {\n\t\t\t\tlanguage = firstLine;\n\t\t\t\tcode = rest;\n\t\t\t}\n\t\t}\n\n\t\treturn new ContentBlockT(\n\t\t\ttextEncoder.encode('code'),\n\t\t\ttextEncoder.encode(full),\n\t\t\tContentData.CodeData,\n\t\t\tnew CodeDataT(textEncoder.encode(language || ''), textEncoder.encode(code))\n\t\t);\n\t};\n\n\tconst cashuBlock = (token: string): ContentBlockT =>\n\t\tnew ContentBlockT(\n\t\t\ttextEncoder.encode('cashu'),\n\t\t\ttextEncoder.encode(token),\n\t\t\tContentData.CashuData,\n\t\t\tnew CashuDataT(textEncoder.encode(token))\n\t\t);\n\n\tconst hashtagBlock = (tag: string): ContentBlockT =>\n\t\tnew ContentBlockT(\n\t\t\ttextEncoder.encode('hashtag'),\n\t\t\ttextEncoder.encode(`#${tag}`),\n\t\t\tContentData.HashtagData,\n\t\t\tnew HashtagDataT(textEncoder.encode(tag))\n\t\t);\n\n\tconst linkBlock = (url: string): ContentBlockT =>\n\t\tnew ContentBlockT(\n\t\t\ttextEncoder.encode('link'),\n\t\t\ttextEncoder.encode(url),\n\t\t\tContentData.LinkPreviewData,\n\t\t\tnew LinkPreviewDataT(textEncoder.encode(url), null, null, null)\n\t\t);\n\n\tconst nostrBlock = (bech32: string, fullText: string): ContentBlockT => {\n\t\ttry {\n\t\t\tconst decoded = nip19.decode(bech32);\n\t\t\tconst type = decoded.type as 'npub' | 'nprofile' | 'note' | 'nevent' | 'naddr';\n\n\t\t\tlet id: string | null = null;\n\t\t\tlet relays: string[] = [];\n\t\t\tlet author: string | null = null;\n\t\t\tlet kind: bigint = BigInt(0);\n\n\t\t\tconst d = decoded.data as any;\n\n\t\t\tswitch (type) {\n\t\t\t\tcase 'npub':\n\t\t\t\t\t// data: hex pubkey\n\t\t\t\t\tid = d as string;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'nprofile':\n\t\t\t\t\t// data: { pubkey, relays? }\n\t\t\t\t\tid = d.pubkey;\n\t\t\t\t\trelays = Array.isArray(d.relays) ? d.relays : [];\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'note':\n\t\t\t\t\t// data: hex event id\n\t\t\t\t\tid = d as string;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'nevent':\n\t\t\t\t\t// data: { id, relays?, author?, kind? }\n\t\t\t\t\tid = d.id;\n\t\t\t\t\trelays = Array.isArray(d.relays) ? d.relays : [];\n\t\t\t\t\tauthor = typeof d.author === 'string' ? d.author : null;\n\t\t\t\t\tif (typeof d.kind === 'number') kind = BigInt(d.kind);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'naddr':\n\t\t\t\t\t// data: { identifier, pubkey, kind, relays? }\n\t\t\t\t\t// Build a stable id\n\t\t\t\t\tid = `${d.kind}:${d.pubkey}:${d.identifier}`;\n\t\t\t\t\trelays = Array.isArray(d.relays) ? d.relays : [];\n\t\t\t\t\tif (typeof d.kind === 'number') kind = BigInt(d.kind);\n\t\t\t\t\tauthor = typeof d.pubkey === 'string' ? d.pubkey : null;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Ensure required fields for NostrDataT: id and entity are required\n\t\t\tif (!id) {\n\t\t\t\tid = bech32;\n\t\t\t}\n\n\t\t\treturn new ContentBlockT(\n\t\t\t\ttextEncoder.encode(type),\n\t\t\t\ttextEncoder.encode(fullText),\n\t\t\t\tContentData.NostrData,\n\t\t\t\tnew NostrDataT(\n\t\t\t\t\ttextEncoder.encode(id),\n\t\t\t\t\ttextEncoder.encode(bech32),\n\t\t\t\t\trelays,\n\t\t\t\t\ttextEncoder.encode(author || ''),\n\t\t\t\t\tkind\n\t\t\t\t)\n\t\t\t);\n\t\t} catch {\n\t\t\t// Fallback to plain text block when decode fails\n\t\t\treturn textBlock(fullText);\n\t\t}\n\t};\n\n\t// Define all the patterns we want to match\n\tconst patterns: Array<{\n\t\ttype: string;\n\t\tregex: RegExp;\n\t\tprocessMatch: MatchProcessor;\n\t}> = [\n\t\t{\n\t\t\ttype: 'code',\n\t\t\tregex: /```([\\s\\S]*?)```/g,\n\t\t\tprocessMatch: (match) => codeBlock(match[1] || '', match[0])\n\t\t},\n\t\t{\n\t\t\ttype: 'cashu',\n\t\t\tregex: /(cashuA[A-Za-z0-9_-]+)/g,\n\t\t\tprocessMatch: (match) => cashuBlock(match[0])\n\t\t},\n\t\t{\n\t\t\ttype: 'hashtag',\n\t\t\t// Match hashtags that are not part of a URL\n\t\t\tregex: /(?<![^\\s\"'(])(#[a-zA-Z0-9_]+)(?![a-zA-Z0-9_])/g,\n\t\t\tprocessMatch: (match) => hashtagBlock(match[0].substring(1))\n\t\t},\n\t\t{\n\t\t\ttype: 'image',\n\t\t\tregex: /(https?:\\/\\/\\S+\\.(?:jpg|jpeg|png|gif|webp|svg|ico)(?:\\?\\S*)?)/gi,\n\t\t\tprocessMatch: (match) => imageBlock(match[0])\n\t\t},\n\t\t{\n\t\t\ttype: 'video',\n\t\t\tregex: /(https?:\\/\\/\\S+\\.(?:mp4|mov|avi|mkv|webm|m4v)(?:\\?\\S*)?)/gi,\n\t\t\tprocessMatch: (match) => videoBlock(match[0])\n\t\t},\n\t\t{\n\t\t\ttype: 'nostr',\n\t\t\tregex: /nostr:([a-z0-9]+)/gi,\n\t\t\tprocessMatch: (match) => {\n\t\t\t\tconst bech32 = match[1];\n\t\t\t\treturn nostrBlock(bech32 || '', match[0]);\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\ttype: 'link',\n\t\t\tregex: /(https?:\\/\\/\\S+)(?![\\)])/gi,\n\t\t\tprocessMatch: async (match) => linkBlock(match[0])\n\t\t}\n\t];\n\n\t// Find all matches with their positions\n\tconst allMatches: Array<{\n\t\tstart: number;\n\t\tend: number;\n\t\tblock: ContentBlockT;\n\t}> = [];\n\n\t// First, find all matches for all patterns\n\tfor (const pattern of patterns) {\n\t\tlet match: RegExpExecArray | null;\n\t\tpattern.regex.lastIndex = 0;\n\n\t\twhile ((match = pattern.regex.exec(content)) !== null) {\n\t\t\tconst start = match.index;\n\t\t\tconst end = start + match[0].length;\n\t\t\tconst block = await pattern.processMatch(match);\n\n\t\t\tallMatches.push({ start, end, block });\n\t\t}\n\t}\n\n\t// Sort matches by start position\n\tallMatches.sort((a, b) => a.start - b.start);\n\n\t// Remove overlapping matches (prioritize earlier patterns in the array)\n\tconst filteredMatches: typeof allMatches = [];\n\n\tfor (const match of allMatches) {\n\t\tconst overlaps = filteredMatches.some(\n\t\t\t(existing) =>\n\t\t\t\t(match.start >= existing.start && match.start < existing.end) ||\n\t\t\t\t(match.end > existing.start && match.end <= existing.end) ||\n\t\t\t\t(match.start <= existing.start && match.end >= existing.end)\n\t\t);\n\n\t\tif (!overlaps) {\n\t\t\tfilteredMatches.push(match);\n\t\t}\n\t}\n\n\t// Re-sort filtered matches\n\tfilteredMatches.sort((a, b) => a.start - b.start);\n\n\t// Build the final result, including text between matches\n\tlet lastIndex = 0;\n\n\tfor (const { start, end, block } of filteredMatches) {\n\t\t// Add text before this match\n\t\tif (start > lastIndex) {\n\t\t\tblocks.push(textBlock(content.substring(lastIndex, start)));\n\t\t}\n\n\t\t// Add the match\n\t\tblocks.push(block);\n\n\t\tlastIndex = end;\n\t}\n\n\t// Add any remaining text after the last match\n\tif (lastIndex < content.length) {\n\t\tblocks.push(textBlock(content.substring(lastIndex)));\n\t}\n\n\t// Post-processing: group consecutive media into grids\n\tconst processedBlocks: ContentBlockT[] = [];\n\tlet mediaGroup: ContentBlockT[] = [];\n\n\tconst isWhitespace = (s: string) => /^\\s+$/.test(s);\n\n\tfor (let i = 0; i < blocks.length; i++) {\n\t\tconst block = blocks[i];\n\n\t\t// If this is an image or video\n\t\tif (block?.type?.toString() === 'image' || block?.type?.toString() === 'video') {\n\t\t\tmediaGroup.push(block);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If this is whitespace or newlines between media, check what follows\n\t\tif (\n\t\t\tblock?.type?.toString() === 'text' &&\n\t\t\ttypeof block?.text?.toString() === 'string' &&\n\t\t\tisWhitespace(block.text?.toString())\n\t\t) {\n\t\t\tif (\n\t\t\t\tmediaGroup.length > 0 &&\n\t\t\t\ti + 1 < blocks.length &&\n\t\t\t\t(blocks[i + 1]?.type?.toString() === 'image' || blocks[i + 1]?.type?.toString() === 'video')\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// If we have collected media and the current block breaks the sequence\n\t\tif (mediaGroup.length > 0) {\n\t\t\t// Add media group if it contains more than one item\n\t\t\tif (mediaGroup.length > 1) {\n\t\t\t\tconst items: MediaItemT[] = mediaGroup.map((m) => {\n\t\t\t\t\tif (m.dataType === ContentData.ImageData) {\n\t\t\t\t\t\tconst d = m.data as ImageDataT;\n\t\t\t\t\t\treturn new MediaItemT(\n\t\t\t\t\t\t\tnew ImageDataT(textEncoder.encode(d.url ?? (m.text as string)), null),\n\t\t\t\t\t\t\tnull\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (m.dataType === ContentData.VideoData) {\n\t\t\t\t\t\tconst d = m.data as VideoDataT;\n\t\t\t\t\t\treturn new MediaItemT(\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\tnew VideoDataT(textEncoder.encode(d.url ?? (m.text as string)), null)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\t// Fallback — shouldn't occur because we only collect image/video\n\t\t\t\t\treturn new MediaItemT(null, null);\n\t\t\t\t});\n\n\t\t\t\tconst text = mediaGroup.map((m) => String(m.text ?? '')).join('\\n');\n\t\t\t\tprocessedBlocks.push(\n\t\t\t\t\tnew ContentBlockT(\n\t\t\t\t\t\ttextEncoder.encode('mediaGrid'),\n\t\t\t\t\t\ttextEncoder.encode(text),\n\t\t\t\t\t\tContentData.MediaGroupData,\n\t\t\t\t\t\tnew MediaGroupDataT(items)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// Just add the single media item\n\t\t\t\tprocessedBlocks.push(mediaGroup[0]);\n\t\t\t}\n\t\t\tmediaGroup = [];\n\t\t}\n\n\t\t// Add the current non-media block\n\t\tprocessedBlocks.push(block);\n\t}\n\n\t// Don't forget any remaining media\n\tif (mediaGroup.length > 0) {\n\t\tif (mediaGroup.length > 1) {\n\t\t\tconst items: MediaItemT[] = mediaGroup.map((m) => {\n\t\t\t\tif (m.dataType === ContentData.ImageData) {\n\t\t\t\t\tconst d = m.data as ImageDataT;\n\t\t\t\t\treturn new MediaItemT(\n\t\t\t\t\t\tnew ImageDataT(textEncoder.encode(d.url ?? (m.text as string)), null),\n\t\t\t\t\t\tnull\n\t\t\t\t\t);\n\t\t\t\t} else if (m.dataType === ContentData.VideoData) {\n\t\t\t\t\tconst d = m.data as VideoDataT;\n\t\t\t\t\treturn new MediaItemT(\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tnew VideoDataT(textEncoder.encode(d.url ?? (m.text as string)), null)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn new MediaItemT(null, null);\n\t\t\t});\n\n\t\t\tconst text = mediaGroup.map((m) => String(m.text ?? '')).join('\\n');\n\t\t\tprocessedBlocks.push(\n\t\t\t\tnew ContentBlockT(\n\t\t\t\t\ttextEncoder.encode('mediaGrid'),\n\t\t\t\t\ttextEncoder.encode(text),\n\t\t\t\t\tContentData.MediaGroupData,\n\t\t\t\t\tnew MediaGroupDataT(items)\n\t\t\t\t)\n\t\t\t);\n\t\t} else {\n\t\t\tprocessedBlocks.push(mediaGroup[0]);\n\t\t}\n\t}\n\n\treturn processedBlocks;\n}\n","import { generateSecretKey, getPublicKey } from 'nostr-tools';\nimport { manager } from '.';\n\nexport { ConnectionTracker } from './lib/ConnectionTracker';\nexport { ByteString } from './lib/ByteString';\n\nexport * from './lib/NarrowTypes';\nexport * from './lib/ParseContent';\n\n/**\n * Extracts keys from T where the value is a `function(i: number): any`\n */\ntype FlatBufferKeys<T> = {\n\t[K in keyof T]: T[K] extends (i: number) => any ? K : never;\n}[keyof T];\n\n/**\n * Non-nullable version: Filters out null results\n */\nexport function fbIterable<T, K extends FlatBufferKeys<T>>(\n\tobj: T,\n\tfieldName: K\n): Iterable<NonNullable<ReturnType<Extract<T[K], (i: number) => any>>>> {\n\tconst length = (obj as any)[`${String(fieldName)}Length`]();\n\treturn {\n\t\t[Symbol.iterator](): Iterator<NonNullable<ReturnType<Extract<T[K], (i: number) => any>>>> {\n\t\t\tlet i = 0;\n\t\t\treturn {\n\t\t\t\tnext(): IteratorResult<NonNullable<ReturnType<Extract<T[K], (i: number) => any>>>> {\n\t\t\t\t\twhile (i < length) {\n\t\t\t\t\t\tconst value = (obj as any)[fieldName](i);\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tif (value != null) {\n\t\t\t\t\t\t\treturn { value, done: false };\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// if null → skip this index\n\t\t\t\t\t}\n\t\t\t\t\treturn { value: undefined as any, done: true };\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t};\n}\n\n/**\n * Eager array version (non-null)\n */\nexport function fbArray<T, K extends FlatBufferKeys<T>>(\n\tobj: T,\n\tfieldName: K\n): Array<NonNullable<ReturnType<Extract<T[K], (i: number) => any>>>> {\n\tif (!obj) return [];\n\tconst lengthGetter = (obj as any)[`${String(fieldName)}Length`]?.bind(obj);\n\tif (!lengthGetter) return [];\n\tconst length = lengthGetter();\n\n\tconst result: Array<NonNullable<ReturnType<Extract<T[K], (i: number) => any>>>> = [];\n\tfor (let i = 0; i < length; i++) {\n\t\tconst v = (obj as any)[fieldName](i);\n\t\tif (v != null) result.push(v);\n\t}\n\treturn result;\n}\n\n// In your frontend application\nexport async function connectWithQRCode(appName: string, relays: string[]) {\n\t// Generate a client keypair\n\tconst clientKeys = generateSecretKey();\n\tconst clientPubkey = getPublicKey(clientKeys);\n\tconst clientSecretHex = Array.from(clientKeys)\n\t\t.map((b) => b.toString(16).padStart(2, '0'))\n\t\t.join('');\n\n\t// Generate a random secret\n\tconst secret = getPublicKey(generateSecretKey());\n\n\tconst params = new URLSearchParams();\n\n\tfor (const relay of relays) {\n\t\tparams.append('relay', relay);\n\t}\n\n\tparams.set('secret', secret);\n\tparams.set('name', appName);\n\n\tconst nostrconnectUrl = `nostrconnect://${clientPubkey}?${params.toString()}`;\n\n\tconsole.log('connect url:', nostrconnectUrl);\n\n\t// Set up the NIP-46 signer with the client's pubkey and relays\n\t// Note: We don't know the remote signer's pubkey yet - that's what we're discovering\n\tmanager.setNip46QR(nostrconnectUrl, clientSecretHex);\n\n\treturn nostrconnectUrl;\n}\n"],"names":["isConnectionStatus","msg","MessageType","unionToMessage","asConnectionStatus","isEoce","Eoce","asEoce","isCountResponse","CountResponse","asCountResponse","isBufferFull","BufferFull","asBufferFull","isValidProofs","ValidProofs","asValidProofs","isParsedEvent","asParsedEvent","isNostrEvent","asNostrEvent","parsedKind","kind","ev","unionToParsedData","isKind0","ParsedData","asKind0","isKind1","asKind1","isKind3","asKind3","isKind4","asKind4","isKind6","asKind6","isKind7","asKind7","isKind17","asKind17","isKind10002","asKind10002","isKind10019","asKind10019","isKind17375","asKind17375","isKind7374","asKind7374","isKind7375","asKind7375","isKind7376","asKind7376","isKind9321","asKind9321","isKind9735","asKind9735","isNip51","asNip51","asCodeData","block","ContentData","unionToContentData","asHashtagData","asCashuData","asImageData","asVideoData","asMediaGroupData","asNostrData","asLinkPreview","ConnectionTracker","status","id","ByteBuffer","offset","length","start","slice","ByteString","UTF8_DECODER","HEX_TABLE","t","i","view","h","v","out","acc","s","safeCopy","other","b","textEncoder","parseContent","content","blocks","textBlock","text","ContentBlockT","imageBlock","url","ImageDataT","videoBlock","VideoDataT","codeBlock","raw","full","nl","language","code","firstLine","rest","CodeDataT","cashuBlock","token","CashuDataT","hashtagBlock","tag","HashtagDataT","linkBlock","LinkPreviewDataT","nostrBlock","bech32","fullText","decoded","nip19","type","relays","author","d","NostrDataT","patterns","match","allMatches","pattern","end","a","filteredMatches","existing","lastIndex","processedBlocks","mediaGroup","isWhitespace","items","m","MediaItemT","MediaGroupDataT","fbIterable","obj","fieldName","value","fbArray","lengthGetter","result","connectWithQRCode","appName","clientKeys","generateSecretKey","clientPubkey","getPublicKey","clientSecretHex","secret","params","relay","nostrconnectUrl","manager"],"mappings":";;;AAyCO,SAASA,EAAmBC,GAA6C;AAC/E,SAAIA,EAAI,KAAA,MAAWC,EAAY,mBAAyB,OACjDC,EAAeF,EAAI,YAAA,GAAeA,EAAI,QAAQ,KAAKA,CAAG,CAAC;AAC/D;AAEO,MAAMG,KAAqBJ;AAE3B,SAASK,GAAOJ,GAAiC;AACvD,SAAIA,EAAI,KAAA,MAAWC,EAAY,OAAa,OACrCD,EAAI,QAAQ,IAAIK,EAAA,CAAM,KAAK;AACnC;AAEO,MAAMC,KAASF;AAEf,SAASG,GAAgBP,GAA0C;AACzE,SAAIA,EAAI,KAAA,MAAWC,EAAY,gBAAsB,OAC9CD,EAAI,QAAQ,IAAIQ,EAAA,CAAe,KAAK;AAC5C;AAEO,MAAMC,KAAkBF;AAExB,SAASG,GAAaV,GAAuC;AACnE,SAAIA,EAAI,KAAA,MAAWC,EAAY,aAAmB,OAC3CD,EAAI,QAAQ,IAAIW,EAAA,CAAY,KAAK;AACzC;AAEO,MAAMC,KAAeF;AAErB,SAASG,GAAcb,GAAwC;AACrE,SAAIA,EAAI,KAAA,MAAWC,EAAY,cAAoB,OAC5CD,EAAI,QAAQ,IAAIc,EAAA,CAAa,KAAK;AAC1C;AAEO,MAAMC,KAAgBF;AAGtB,SAASG,EAAchB,GAAwC;AACrE,SAAIA,EAAI,KAAA,MAAWC,EAAY,mBAAyB,OACjDC,EAAeF,EAAI,YAAA,GAAeA,EAAI,QAAQ,KAAKA,CAAG,CAAC;AAC/D;AAEO,MAAMiB,KAAgBD,GAEhBE,KAAe,CAAClB,MACxBA,EAAI,KAAA,MAAWC,EAAY,aAAmB,OAC3CC,EAAeF,EAAI,YAAA,GAAeA,EAAI,QAAQ,KAAKA,CAAG,CAAC,GAGlDmB,KAAeD;AAG5B,SAASE,EAAcpB,GAAoBqB,GAA4B;AACtE,MAAI,CAACrB,EAAK,QAAO;AACjB,QAAMsB,IAAKN,EAAchB,CAAG;AAE5B,SADI,CAACsB,KACDA,GAAI,mBAAmBD,IAAa,OACjCE,EAAkBF,GAAMC,EAAG,OAAO,KAAKA,CAAE,CAAC;AAClD;AAEO,SAASE,GAAQxB,GAAwC;AAC/D,SAAOoB,EAAwBpB,GAAKyB,EAAW,WAAW;AAC3D;AACO,SAASC,GAAQJ,GAAqC;AAE5D,SADI,CAACA,KACDA,GAAI,aAAA,MAAmBG,EAAW,cAAoB,OACnDF,EAAkBE,EAAW,aAAaH,EAAG,OAAO,KAAKA,CAAE,CAAC;AACpE;AACO,SAASK,GAAQ3B,GAAwC;AAC/D,SAAOoB,EAAwBpB,GAAKyB,EAAW,WAAW;AAC3D;AACO,SAASG,GAAQN,GAAqC;AAC5D,SAAIA,GAAI,aAAA,MAAmBG,EAAW,cAAoB,OACnDF,EAAkBE,EAAW,aAAaH,EAAG,OAAO,KAAKA,CAAE,CAAC;AACpE;AACO,SAASO,GAAQ7B,GAAwC;AAC/D,SAAOoB,EAAwBpB,GAAKyB,EAAW,WAAW;AAC3D;AACO,SAASK,GAAQR,GAAqC;AAC5D,SAAIA,GAAI,aAAA,MAAmBG,EAAW,cAAoB,OACnDF,EAAkBE,EAAW,aAAaH,EAAG,OAAO,KAAKA,CAAE,CAAC;AACpE;AACO,SAASS,GAAQ/B,GAAwC;AAC/D,SAAOoB,EAAwBpB,GAAKyB,EAAW,WAAW;AAC3D;AACO,SAASO,GAAQV,GAAqC;AAC5D,SAAIA,GAAI,aAAA,MAAmBG,EAAW,cAAoB,OACnDF,EAAkBE,EAAW,aAAaH,EAAG,OAAO,KAAKA,CAAE,CAAC;AACpE;AACO,SAASW,GAAQjC,GAAwC;AAC/D,SAAOoB,EAAwBpB,GAAKyB,EAAW,WAAW;AAC3D;AACO,SAASS,GAAQZ,GAAqC;AAC5D,SAAIA,GAAI,aAAA,MAAmBG,EAAW,cAAoB,OACnDF,EAAkBE,EAAW,aAAaH,EAAG,OAAO,KAAKA,CAAE,CAAC;AACpE;AACO,SAASa,GAAQnC,GAAwC;AAC/D,SAAOoB,EAAwBpB,GAAKyB,EAAW,WAAW;AAC3D;AACO,SAASW,GAAQd,GAAqC;AAC5D,SAAIA,GAAI,aAAA,MAAmBG,EAAW,cAAoB,OACnDF,EAAkBE,EAAW,aAAaH,EAAG,OAAO,KAAKA,CAAE,CAAC;AACpE;AACO,SAASe,GAASrC,GAAyC;AACjE,SAAOoB,EAAyBpB,GAAKyB,EAAW,YAAY;AAC7D;AACO,SAASa,GAAShB,GAAsC;AAC9D,SAAIA,GAAI,aAAA,MAAmBG,EAAW,eAAqB,OACpDF,EAAkBE,EAAW,cAAcH,EAAG,OAAO,KAAKA,CAAE,CAAC;AACrE;AACO,SAASiB,GAAYvC,GAA4C;AACvE,SAAOoB,EAA4BpB,GAAKyB,EAAW,eAAe;AACnE;AACO,SAASe,GAAYlB,GAAyC;AACpE,SAAIA,GAAI,aAAA,MAAmBG,EAAW,kBAAwB,OACvDF,EAAkBE,EAAW,iBAAiBH,EAAG,OAAO,KAAKA,CAAE,CAAC;AACxE;AAEO,SAASmB,GAAYzC,GAA4C;AACvE,SAAOoB,EAA4BpB,GAAKyB,EAAW,eAAe;AACnE;AACO,SAASiB,GAAYpB,GAAyC;AACpE,SAAIA,GAAI,aAAA,MAAmBG,EAAW,kBAAwB,OACvDF,EAAkBE,EAAW,iBAAiBH,EAAG,OAAO,KAAKA,CAAE,CAAC;AACxE;AAEO,SAASqB,GAAY3C,GAA4C;AACvE,SAAOoB,EAA4BpB,GAAKyB,EAAW,eAAe;AACnE;AACO,SAASmB,GAAYtB,GAAyC;AACpE,SAAIA,GAAI,aAAA,MAAmBG,EAAW,kBAAwB,OACvDF,EAAkBE,EAAW,iBAAiBH,EAAG,OAAO,KAAKA,CAAE,CAAC;AACxE;AAEO,SAASuB,GAAW7C,GAA2C;AACrE,SAAOoB,EAA2BpB,GAAKyB,EAAW,cAAc;AACjE;AACO,SAASqB,GAAWxB,GAAwC;AAClE,SAAIA,GAAI,aAAA,MAAmBG,EAAW,iBAAuB,OACtDF,EAAkBE,EAAW,gBAAgBH,EAAG,OAAO,KAAKA,CAAE,CAAC;AACvE;AAEO,SAASyB,GAAW/C,GAA2C;AACrE,SAAOoB,EAA2BpB,GAAKyB,EAAW,cAAc;AACjE;AACO,SAASuB,GAAW1B,GAAwC;AAClE,SAAIA,GAAI,aAAA,MAAmBG,EAAW,iBAAuB,OACtDF,EAAkBE,EAAW,gBAAgBH,EAAG,OAAO,KAAKA,CAAE,CAAC;AACvE;AAEO,SAAS2B,GAAWjD,GAA2C;AACrE,SAAOoB,EAA2BpB,GAAKyB,EAAW,cAAc;AACjE;AACO,SAASyB,GAAW5B,GAAwC;AAClE,SAAIA,GAAI,aAAA,MAAmBG,EAAW,iBAAuB,OACtDF,EAAkBE,EAAW,gBAAgBH,EAAG,OAAO,KAAKA,CAAE,CAAC;AACvE;AAEO,SAAS6B,GAAWnD,GAA2C;AACrE,SAAOoB,EAA2BpB,GAAKyB,EAAW,cAAc;AACjE;AACO,SAAS2B,GAAW9B,GAAwC;AAClE,SAAIA,GAAI,aAAA,MAAmBG,EAAW,iBAAuB,OACtDF,EAAkBE,EAAW,gBAAgBH,EAAG,OAAO,KAAKA,CAAE,CAAC;AACvE;AAEO,SAAS+B,GAAWrD,GAA2C;AACrE,SAAOoB,EAA2BpB,GAAKyB,EAAW,cAAc;AACjE;AACO,SAAS6B,GAAWhC,GAAwC;AAClE,SAAIA,GAAI,aAAA,MAAmBG,EAAW,iBAAuB,OACtDF,EAAkBE,EAAW,gBAAgBH,EAAG,OAAO,KAAKA,CAAE,CAAC;AACvE;AAEO,SAASiC,GAAQvD,GAAuC;AAC9D,SAAOoB,EAAuBpB,GAAKyB,EAAW,UAAU;AACzD;AAEO,SAAS+B,GAAQlC,GAAoC;AAC3D,SAAIA,GAAI,aAAA,MAAmBG,EAAW,aAAmB,OAClDF,EAAkBE,EAAW,YAAYH,EAAG,OAAO,KAAKA,CAAE,CAAC;AACnE;AAEO,SAASmC,GAAWC,GAAsC;AAChE,SAAIA,EAAM,SAAA,MAAeC,EAAY,WAAiB,OAC/CC,EAAmBD,EAAY,UAAUD,EAAM,KAAK,KAAKA,CAAK,CAAC;AACvE;AAEO,SAASG,GAAcH,GAAyC;AACtE,SAAIA,EAAM,SAAA,MAAeC,EAAY,cAAoB,OAClDC,EAAmBD,EAAY,aAAaD,EAAM,KAAK,KAAKA,CAAK,CAAC;AAC1E;AAEO,SAASI,GAAYJ,GAAuC;AAClE,SAAIA,EAAM,SAAA,MAAeC,EAAY,YAAkB,OAChDC,EAAmBD,EAAY,WAAWD,EAAM,KAAK,KAAKA,CAAK,CAAC;AACxE;AAEO,SAASK,GAAYL,GAAuC;AAClE,SAAIA,EAAM,SAAA,MAAeC,EAAY,YAAkB,OAChDC,EAAmBD,EAAY,WAAWD,EAAM,KAAK,KAAKA,CAAK,CAAC;AACxE;AAEO,SAASM,GAAYN,GAAuC;AAClE,SAAIA,EAAM,SAAA,MAAeC,EAAY,YAAkB,OAChDC,EAAmBD,EAAY,WAAWD,EAAM,KAAK,KAAKA,CAAK,CAAC;AACxE;AAEO,SAASO,GAAiBP,GAA4C;AAC5E,SAAIA,EAAM,SAAA,MAAeC,EAAY,iBAAuB,OACrDC,EAAmBD,EAAY,gBAAgBD,EAAM,KAAK,KAAKA,CAAK,CAAC;AAC7E;AAEO,SAASQ,GAAYR,GAAuC;AAClE,SAAIA,EAAM,SAAA,MAAeC,EAAY,YAAkB,OAChDC,EAAmBD,EAAY,WAAWD,EAAM,KAAK,KAAKA,CAAK,CAAC;AACxE;AAEO,SAASS,GAAcT,GAA6C;AAC1E,SAAIA,EAAM,SAAA,MAAeC,EAAY,kBAAwB,OACtDC,EAAmBD,EAAY,iBAAiBD,EAAM,KAAK,KAAKA,CAAK,CAAC;AAC9E;AClQO,MAAMU,GAAkB;AAAA,EAAxB,cAAA;AACL,SAAQ,kCAAiD,IAAA,GACzD,KAAQ,gBAAgB,GACxB,KAAQ,gBAAgB;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAKxB,cAAcpE,GAAoB;AAChC,UAAMqE,IAAStE,EAAmBC,CAAG;AACrC,QAAI,CAACqE,EAAQ;AAEb,UAAMC,IAAKD,EAAO,SAAA,GAAY,UAAA;AAC9B,IAAGC,KAAM,CAAC,KAAK,YAAY,IAAIA,CAAE,MAC/B,KAAK,iBACN,KAAK,YAAY,IAAIA,GAAID,CAAM,IAE5B,KAAK,WAAWA,CAAM,KACxB,KAAK;AAAA,EAET;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,WAAWA,GAAmC;AACpD,WAAOA,EAAO,UAAU,SAAA,MAAe;AAAA,EACzC;AAAA;AAAA,EAGA,IAAI,gBAAwB;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,gBAAwB;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,iBAAyB;AAC3B,WAAO,KAAK,kBAAkB,IAAI,IAAI,KAAK,gBAAgB,KAAK;AAAA,EAClE;AACF;AC7CCE,GAAW,UAAkB,qBAAqB,SAAUC,GAA4B;AAExF,EAAAA,KAAU,KAAK,UAAUA,CAAM;AAG/B,QAAMC,IAAS,KAAK,UAAUD,CAAM,GAC9BE,IAAQF,IAAS,GAGjBG,IAAQ,KAAK,MAAA,EAAQ,SAASD,GAAOA,IAAQD,CAAM;AAEzD,SAAO,IAAIG,GAAWD,CAAK;AAC5B;AAGA,MAAME,IAAe,IAAI,YAAY,OAAO,GAGtCC,MAAuB,MAAM;AAClC,QAAMC,IAAI,IAAI,MAAM,GAAG;AACvB,WAASC,IAAI,GAAGA,IAAI,KAAKA,IAAK,CAAAD,EAAEC,CAAC,IAAIA,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AACnE,SAAOD;AACR,GAAA;AAGO,MAAMH,GAAW;AAAA,EAGvB,YAAYK,GAAkB;AAC7B,SAAK,OAAOA;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAKA,QAAoB;AACnB,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAoB;AACnB,QAAIC,IAAI;AACR,UAAMC,IAAI,KAAK;AACf,aAASH,IAAI,GAAGA,IAAIG,EAAE,QAAQH;AAC7B,MAAAE,KAAKC,EAAEH,CAAC,GACRE,IAAI,KAAK,KAAKA,GAAG,QAAQ;AAE1B,WAAOA,MAAM;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,QAAgB;AACf,UAAMC,IAAI,KAAK;AACf,QAAIC,IAAM;AACV,aAASJ,IAAI,GAAGA,IAAIG,EAAE,QAAQH,IAAK,CAAAI,KAAON,GAAUK,EAAEH,CAAC,CAAC;AACxD,WAAOI;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAqB;AACpB,UAAMD,IAAI,KAAK;AAGf,QAAIE,IAAM;AACV,aAASL,IAAI,GAAGA,IAAIG,EAAE,QAAQH,IAAK,CAAAK,KAAOF,EAAEH,CAAC;AAC7C,QAAK,EAAAK,IAAM,MAAa;AAEvB,UAAIC,IAAI;AAER,eAASN,IAAI,GAAGA,IAAIG,EAAE,QAAQH,KAAK;AAClC,QAAAM,KAAK,OAAO,aAAa,MAAM,MAAMH,EAAE,SAASH,GAAGA,IAAI,KAAK,CAAwB;AAErF,aAAOM;AAAA,IACR;AAKA,QADYH,EAAE,kBACK,mBAAmB;AACrC,YAAMI,IAAW,IAAI,WAAWJ,CAAC;AACjC,aAAON,EAAa,OAAOU,CAAQ;AAAA,IACpC;AAEA,WAAOV,EAAa,OAAOM,CAAC;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAmB;AAClB,WAAO,KAAK,WAAA;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAKA,OAAOK,GAA4B;AAClC,UAAM,IAAI,KAAK,MACdC,IAAID,EAAM;AACX,QAAI,EAAE,WAAWC,EAAE,OAAQ,QAAO;AAClC,aAAST,IAAI,GAAGA,IAAI,EAAE,QAAQA;AAC7B,UAAI,EAAEA,CAAC,MAAMS,EAAET,CAAC,EAAG,QAAO;AAE3B,WAAO;AAAA,EACR;AACD;ACpGA,MAAMU,IAAc,IAAI,YAAA;AAExB,eAAsBC,GAAaC,GAA2C;AAC7E,QAAMC,IAA0B,CAAA,GAG1BC,IAAY,CAACC,MAClB,IAAIC,EAAcN,EAAY,OAAO,MAAM,GAAGA,EAAY,OAAOK,CAAI,GAAGpC,EAAY,MAAM,IAAI,GAEzFsC,IAAa,CAACC,MACnB,IAAIF;AAAA,IACHN,EAAY,OAAO,OAAO;AAAA,IAC1BA,EAAY,OAAOQ,CAAG;AAAA,IACtBvC,EAAY;AAAA,IACZ,IAAIwC,EAAWT,EAAY,OAAOQ,CAAG,GAAG,IAAI;AAAA,EAAA,GAGxCE,IAAa,CAACF,MACnB,IAAIF;AAAA,IACHN,EAAY,OAAO,OAAO;AAAA,IAC1BA,EAAY,OAAOQ,CAAG;AAAA,IACtBvC,EAAY;AAAA,IACZ,IAAI0C,EAAWX,EAAY,OAAOQ,CAAG,GAAG,IAAI;AAAA,EAAA,GAGxCI,IAAY,CAACC,GAAaC,MAAgC;AAG/D,UAAMC,IAAKF,EAAI,QAAQ;AAAA,CAAI;AAC3B,QAAIG,IAA0B,MAC1BC,IAAOJ;AACX,QAAIE,MAAO,IAAI;AACd,YAAMG,IAAYL,EAAI,MAAM,GAAGE,CAAE,EAAE,KAAA,GAC7BI,IAAON,EAAI,MAAME,IAAK,CAAC;AAC7B,MAAIG,KAAa,wBAAwB,KAAKA,CAAS,MACtDF,IAAWE,GACXD,IAAOE;AAAA,IAET;AAEA,WAAO,IAAIb;AAAA,MACVN,EAAY,OAAO,MAAM;AAAA,MACzBA,EAAY,OAAOc,CAAI;AAAA,MACvB7C,EAAY;AAAA,MACZ,IAAImD,EAAUpB,EAAY,OAAOgB,KAAY,EAAE,GAAGhB,EAAY,OAAOiB,CAAI,CAAC;AAAA,IAAA;AAAA,EAE5E,GAEMI,IAAa,CAACC,MACnB,IAAIhB;AAAA,IACHN,EAAY,OAAO,OAAO;AAAA,IAC1BA,EAAY,OAAOsB,CAAK;AAAA,IACxBrD,EAAY;AAAA,IACZ,IAAIsD,EAAWvB,EAAY,OAAOsB,CAAK,CAAC;AAAA,EAAA,GAGpCE,IAAe,CAACC,MACrB,IAAInB;AAAA,IACHN,EAAY,OAAO,SAAS;AAAA,IAC5BA,EAAY,OAAO,IAAIyB,CAAG,EAAE;AAAA,IAC5BxD,EAAY;AAAA,IACZ,IAAIyD,EAAa1B,EAAY,OAAOyB,CAAG,CAAC;AAAA,EAAA,GAGpCE,IAAY,CAACnB,MAClB,IAAIF;AAAA,IACHN,EAAY,OAAO,MAAM;AAAA,IACzBA,EAAY,OAAOQ,CAAG;AAAA,IACtBvC,EAAY;AAAA,IACZ,IAAI2D,EAAiB5B,EAAY,OAAOQ,CAAG,GAAG,MAAM,MAAM,IAAI;AAAA,EAAA,GAG1DqB,IAAa,CAACC,GAAgBC,MAAoC;AACvE,QAAI;AACH,YAAMC,IAAUC,EAAM,OAAOH,CAAM,GAC7BI,IAAOF,EAAQ;AAErB,UAAIpD,IAAoB,MACpBuD,IAAmB,CAAA,GACnBC,IAAwB,MACxBzG,IAAe,OAAO,CAAC;AAE3B,YAAM0G,IAAIL,EAAQ;AAElB,cAAQE,GAAA;AAAA,QACP,KAAK;AAEJ,UAAAtD,IAAKyD;AACL;AAAA,QACD,KAAK;AAEJ,UAAAzD,IAAKyD,EAAE,QACPF,IAAS,MAAM,QAAQE,EAAE,MAAM,IAAIA,EAAE,SAAS,CAAA;AAC9C;AAAA,QACD,KAAK;AAEJ,UAAAzD,IAAKyD;AACL;AAAA,QACD,KAAK;AAEJ,UAAAzD,IAAKyD,EAAE,IACPF,IAAS,MAAM,QAAQE,EAAE,MAAM,IAAIA,EAAE,SAAS,CAAA,GAC9CD,IAAS,OAAOC,EAAE,UAAW,WAAWA,EAAE,SAAS,MAC/C,OAAOA,EAAE,QAAS,aAAU1G,IAAO,OAAO0G,EAAE,IAAI;AACpD;AAAA,QACD,KAAK;AAGJ,UAAAzD,IAAK,GAAGyD,EAAE,IAAI,IAAIA,EAAE,MAAM,IAAIA,EAAE,UAAU,IAC1CF,IAAS,MAAM,QAAQE,EAAE,MAAM,IAAIA,EAAE,SAAS,CAAA,GAC1C,OAAOA,EAAE,QAAS,aAAU1G,IAAO,OAAO0G,EAAE,IAAI,IACpDD,IAAS,OAAOC,EAAE,UAAW,WAAWA,EAAE,SAAS;AACnD;AAAA,MAAA;AAIF,aAAKzD,MACJA,IAAKkD,IAGC,IAAIxB;AAAA,QACVN,EAAY,OAAOkC,CAAI;AAAA,QACvBlC,EAAY,OAAO+B,CAAQ;AAAA,QAC3B9D,EAAY;AAAA,QACZ,IAAIqE;AAAA,UACHtC,EAAY,OAAOpB,CAAE;AAAA,UACrBoB,EAAY,OAAO8B,CAAM;AAAA,UACzBK;AAAA,UACAnC,EAAY,OAAOoC,KAAU,EAAE;AAAA,UAC/BzG;AAAA,QAAA;AAAA,MACD;AAAA,IAEF,QAAQ;AAEP,aAAOyE,EAAU2B,CAAQ;AAAA,IAC1B;AAAA,EACD,GAGMQ,IAID;AAAA,IACJ;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,cAAc,CAACC,MAAU5B,EAAU4B,EAAM,CAAC,KAAK,IAAIA,EAAM,CAAC,CAAC;AAAA,IAAA;AAAA,IAE5D;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,cAAc,CAACA,MAAUnB,EAAWmB,EAAM,CAAC,CAAC;AAAA,IAAA;AAAA,IAE7C;AAAA,MACC,MAAM;AAAA;AAAA,MAEN,OAAO;AAAA,MACP,cAAc,CAACA,MAAUhB,EAAagB,EAAM,CAAC,EAAE,UAAU,CAAC,CAAC;AAAA,IAAA;AAAA,IAE5D;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,cAAc,CAACA,MAAUjC,EAAWiC,EAAM,CAAC,CAAC;AAAA,IAAA;AAAA,IAE7C;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,cAAc,CAACA,MAAU9B,EAAW8B,EAAM,CAAC,CAAC;AAAA,IAAA;AAAA,IAE7C;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,cAAc,CAACA,MAAU;AACxB,cAAMV,IAASU,EAAM,CAAC;AACtB,eAAOX,EAAWC,KAAU,IAAIU,EAAM,CAAC,CAAC;AAAA,MACzC;AAAA,IAAA;AAAA,IAED;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,cAAc,OAAOA,MAAUb,EAAUa,EAAM,CAAC,CAAC;AAAA,IAAA;AAAA,EAClD,GAIKC,IAID,CAAA;AAGL,aAAWC,KAAWH,GAAU;AAC/B,QAAIC;AAGJ,SAFAE,EAAQ,MAAM,YAAY,IAElBF,IAAQE,EAAQ,MAAM,KAAKxC,CAAO,OAAO,QAAM;AACtD,YAAMlB,IAAQwD,EAAM,OACdG,IAAM3D,IAAQwD,EAAM,CAAC,EAAE,QACvBxE,IAAQ,MAAM0E,EAAQ,aAAaF,CAAK;AAE9C,MAAAC,EAAW,KAAK,EAAE,OAAAzD,GAAO,KAAA2D,GAAK,OAAA3E,GAAO;AAAA,IACtC;AAAA,EACD;AAGA,EAAAyE,EAAW,KAAK,CAACG,GAAG7C,MAAM6C,EAAE,QAAQ7C,EAAE,KAAK;AAG3C,QAAM8C,IAAqC,CAAA;AAE3C,aAAWL,KAASC;AAQnB,IAPiBI,EAAgB;AAAA,MAChC,CAACC,MACCN,EAAM,SAASM,EAAS,SAASN,EAAM,QAAQM,EAAS,OACxDN,EAAM,MAAMM,EAAS,SAASN,EAAM,OAAOM,EAAS,OACpDN,EAAM,SAASM,EAAS,SAASN,EAAM,OAAOM,EAAS;AAAA,IAAA,KAIzDD,EAAgB,KAAKL,CAAK;AAK5B,EAAAK,EAAgB,KAAK,CAACD,GAAG7C,MAAM6C,EAAE,QAAQ7C,EAAE,KAAK;AAGhD,MAAIgD,IAAY;AAEhB,aAAW,EAAE,OAAA/D,GAAO,KAAA2D,GAAK,OAAA3E,EAAA,KAAW6E;AAEnC,IAAI7D,IAAQ+D,KACX5C,EAAO,KAAKC,EAAUF,EAAQ,UAAU6C,GAAW/D,CAAK,CAAC,CAAC,GAI3DmB,EAAO,KAAKnC,CAAK,GAEjB+E,IAAYJ;AAIb,EAAII,IAAY7C,EAAQ,UACvBC,EAAO,KAAKC,EAAUF,EAAQ,UAAU6C,CAAS,CAAC,CAAC;AAIpD,QAAMC,IAAmC,CAAA;AACzC,MAAIC,IAA8B,CAAA;AAElC,QAAMC,IAAe,CAACtD,MAAc,QAAQ,KAAKA,CAAC;AAElD,WAASN,IAAI,GAAGA,IAAIa,EAAO,QAAQb,KAAK;AACvC,UAAMtB,IAAQmC,EAAOb,CAAC;AAGtB,QAAItB,GAAO,MAAM,eAAe,WAAWA,GAAO,MAAM,SAAA,MAAe,SAAS;AAC/E,MAAAiF,EAAW,KAAKjF,CAAK;AACrB;AAAA,IACD;AAGA,QACC,EAAAA,GAAO,MAAM,SAAA,MAAe,UAC5B,OAAOA,GAAO,MAAM,SAAA,KAAe,YACnCkF,EAAalF,EAAM,MAAM,SAAA,CAAU,KAGlCiF,EAAW,SAAS,KACpB3D,IAAI,IAAIa,EAAO,WACdA,EAAOb,IAAI,CAAC,GAAG,MAAM,SAAA,MAAe,WAAWa,EAAOb,IAAI,CAAC,GAAG,MAAM,eAAe,WAOtF;AAAA,UAAI2D,EAAW,SAAS,GAAG;AAE1B,YAAIA,EAAW,SAAS,GAAG;AAC1B,gBAAME,IAAsBF,EAAW,IAAI,CAACG,MAAM;AACjD,gBAAIA,EAAE,aAAanF,EAAY,WAAW;AACzC,oBAAMoE,IAAIe,EAAE;AACZ,qBAAO,IAAIC;AAAA,gBACV,IAAI5C,EAAWT,EAAY,OAAOqC,EAAE,OAAQe,EAAE,IAAe,GAAG,IAAI;AAAA,gBACpE;AAAA,cAAA;AAAA,YAEF,WAAWA,EAAE,aAAanF,EAAY,WAAW;AAChD,oBAAMoE,IAAIe,EAAE;AACZ,qBAAO,IAAIC;AAAA,gBACV;AAAA,gBACA,IAAI1C,EAAWX,EAAY,OAAOqC,EAAE,OAAQe,EAAE,IAAe,GAAG,IAAI;AAAA,cAAA;AAAA,YAEtE;AAEA,mBAAO,IAAIC,EAAW,MAAM,IAAI;AAAA,UACjC,CAAC,GAEKhD,IAAO4C,EAAW,IAAI,CAACG,MAAM,OAAOA,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK;AAAA,CAAI;AAClE,UAAAJ,EAAgB;AAAA,YACf,IAAI1C;AAAA,cACHN,EAAY,OAAO,WAAW;AAAA,cAC9BA,EAAY,OAAOK,CAAI;AAAA,cACvBpC,EAAY;AAAA,cACZ,IAAIqF,EAAgBH,CAAK;AAAA,YAAA;AAAA,UAC1B;AAAA,QAEF;AAEC,UAAAH,EAAgB,KAAKC,EAAW,CAAC,CAAC;AAEnC,QAAAA,IAAa,CAAA;AAAA,MACd;AAGA,MAAAD,EAAgB,KAAKhF,CAAK;AAAA;AAAA,EAC3B;AAGA,MAAIiF,EAAW,SAAS;AACvB,QAAIA,EAAW,SAAS,GAAG;AAC1B,YAAME,IAAsBF,EAAW,IAAI,CAACG,MAAM;AACjD,YAAIA,EAAE,aAAanF,EAAY,WAAW;AACzC,gBAAMoE,IAAIe,EAAE;AACZ,iBAAO,IAAIC;AAAA,YACV,IAAI5C,EAAWT,EAAY,OAAOqC,EAAE,OAAQe,EAAE,IAAe,GAAG,IAAI;AAAA,YACpE;AAAA,UAAA;AAAA,QAEF,WAAWA,EAAE,aAAanF,EAAY,WAAW;AAChD,gBAAMoE,IAAIe,EAAE;AACZ,iBAAO,IAAIC;AAAA,YACV;AAAA,YACA,IAAI1C,EAAWX,EAAY,OAAOqC,EAAE,OAAQe,EAAE,IAAe,GAAG,IAAI;AAAA,UAAA;AAAA,QAEtE;AACA,eAAO,IAAIC,EAAW,MAAM,IAAI;AAAA,MACjC,CAAC,GAEKhD,IAAO4C,EAAW,IAAI,CAACG,MAAM,OAAOA,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK;AAAA,CAAI;AAClE,MAAAJ,EAAgB;AAAA,QACf,IAAI1C;AAAA,UACHN,EAAY,OAAO,WAAW;AAAA,UAC9BA,EAAY,OAAOK,CAAI;AAAA,UACvBpC,EAAY;AAAA,UACZ,IAAIqF,EAAgBH,CAAK;AAAA,QAAA;AAAA,MAC1B;AAAA,IAEF;AACC,MAAAH,EAAgB,KAAKC,EAAW,CAAC,CAAC;AAIpC,SAAOD;AACR;AChWO,SAASO,GACfC,GACAC,GACuE;AACvE,QAAM1E,IAAUyE,EAAY,GAAG,OAAOC,CAAS,CAAC,QAAQ,EAAA;AACxD,SAAO;AAAA,IACN,CAAC,OAAO,QAAQ,IAA0E;AACzF,UAAInE,IAAI;AACR,aAAO;AAAA,QACN,OAAmF;AAClF,iBAAOA,IAAIP,KAAQ;AAClB,kBAAM2E,IAASF,EAAYC,CAAS,EAAEnE,CAAC;AAEvC,gBADAA,KACIoE,KAAS;AACZ,qBAAO,EAAE,OAAAA,GAAO,MAAM,GAAA;AAAA,UAGxB;AACA,iBAAO,EAAE,OAAO,QAAkB,MAAM,GAAA;AAAA,QACzC;AAAA,MAAA;AAAA,IAEF;AAAA,EAAA;AAEF;AAKO,SAASC,GACfH,GACAC,GACoE;AACpE,MAAI,CAACD,EAAK,QAAO,CAAA;AACjB,QAAMI,IAAgBJ,EAAY,GAAG,OAAOC,CAAS,CAAC,QAAQ,GAAG,KAAKD,CAAG;AACzE,MAAI,CAACI,EAAc,QAAO,CAAA;AAC1B,QAAM7E,IAAS6E,EAAA,GAETC,IAA4E,CAAA;AAClF,WAASvE,IAAI,GAAGA,IAAIP,GAAQO,KAAK;AAChC,UAAMG,IAAK+D,EAAYC,CAAS,EAAEnE,CAAC;AACnC,IAAIG,KAAK,QAAMoE,EAAO,KAAKpE,CAAC;AAAA,EAC7B;AACA,SAAOoE;AACR;AAGA,eAAsBC,GAAkBC,GAAiB5B,GAAkB;AAE1E,QAAM6B,IAAaC,EAAA,GACbC,IAAeC,EAAaH,CAAU,GACtCI,IAAkB,MAAM,KAAKJ,CAAU,EAC3C,IAAI,CAACjE,MAAMA,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAC1C,KAAK,EAAE,GAGHsE,IAASF,EAAaF,GAAmB,GAEzCK,IAAS,IAAI,gBAAA;AAEnB,aAAWC,KAASpC;AACnB,IAAAmC,EAAO,OAAO,SAASC,CAAK;AAG7B,EAAAD,EAAO,IAAI,UAAUD,CAAM,GAC3BC,EAAO,IAAI,QAAQP,CAAO;AAE1B,QAAMS,IAAkB,kBAAkBN,CAAY,IAAII,EAAO,UAAU;AAE3E,iBAAQ,IAAI,gBAAgBE,CAAe,GAI3CC,GAAQ,WAAWD,GAAiBJ,CAAe,GAE5CI;AACR;"}
1
+ {"version":3,"file":"utils.js","sources":["../src/lib/ConnectionTracker.ts","../src/lib/ByteString.ts","../src/lib/ParseContent.ts","../src/utils.ts"],"sourcesContent":["import { ConnectionStatus, WorkerMessage } from \"src/generated/nostr/fb\";\nimport { isConnectionStatus } from \"./NarrowTypes\";\n\nexport class ConnectionTracker {\n private knownRelays: Map<number, ConnectionStatus> = new Map();\n private incomingCount = 0;\n private resolvedCount = 0;\n\n /**\n * Feed a new message into the tracker\n */\n handleMessage(msg: WorkerMessage) {\n const status = isConnectionStatus(msg);\n if (!status) return; // not a connection status, ignore\n\n const id = status.relayUrl()?.fnv1aHash()\n if(id && !this.knownRelays.has(id)) {\n this.incomingCount++;\n this.knownRelays.set(id, status);\n }\n if (this.isResolved(status)) {\n this.resolvedCount++;\n }\n }\n\n /**\n * Define what counts as a \"resolved\" connection.\n * Adjust based on your real ConnectionStatus enum/shape.\n */\n private isResolved(status: ConnectionStatus): boolean {\n return status.status()?.toString() === \"EOSE\";\n }\n\n /** Total connection attempts processed */\n get totalIncoming(): number {\n return this.incomingCount;\n }\n\n /** How many actually resolved */\n get totalResolved(): number {\n return this.resolvedCount;\n }\n\n /** Quick ratio (0...1) of resolved vs incoming */\n get resolutionRate(): number {\n return this.incomingCount === 0 ? 0 : this.resolvedCount / this.incomingCount;\n }\n}\n","import { ByteBuffer } from 'flatbuffers';\n\n(ByteBuffer.prototype as any).__stringByteString = function (offset: number): ByteString {\n\t// Follow indirect: add the relative offset stored at this location\n\toffset += this.readInt32(offset);\n\n\t// Now at the start of the string object → first 4 bytes = length\n\tconst length = this.readInt32(offset);\n\tconst start = offset + 4;\n\n\t// Slice out exactly [start, start+length]\n\tconst slice = this.bytes().subarray(start, start + length);\n\n\treturn new ByteString(slice);\n};\n\n// Shared decoder for all instances (cheap, stateless for non-streaming use)\nconst UTF8_DECODER = new TextDecoder('utf-8');\n\n// Hex lookup table to speed up toHex()\nconst HEX_TABLE: string[] = (() => {\n\tconst t = new Array(256);\n\tfor (let i = 0; i < 256; i++) t[i] = i.toString(16).padStart(2, '0');\n\treturn t;\n})();\n\n// lib/ByteString.ts\nexport class ByteString {\n\tprivate readonly view: Uint8Array;\n\n\tconstructor(view: Uint8Array) {\n\t\tthis.view = view;\n\t}\n\n\t/**\n\t * Access underlying bytes\n\t */\n\tbytes(): Uint8Array {\n\t\treturn this.view;\n\t}\n\n\t/**\n\t * Fast numeric discriminant (FNV-1a hash).\n\t * Not cryptographically secure, but great for Map/Set keys.\n\t */\n\tfnv1aHash(): number {\n\t\tlet h = 2166136261 >>> 0;\n\t\tconst v = this.view;\n\t\tfor (let i = 0; i < v.length; i++) {\n\t\t\th ^= v[i];\n\t\t\th = Math.imul(h, 16777619);\n\t\t}\n\t\treturn h >>> 0;\n\t}\n\n\t/**\n\t * Return a stable hex string representation.\n\t */\n\ttoHex(): string {\n\t\tconst v = this.view;\n\t\tlet out = '';\n\t\tfor (let i = 0; i < v.length; i++) out += HEX_TABLE[v[i]];\n\t\treturn out;\n\t}\n\n\t/**\n\t * Decode as UTF-8 string.\n\t * If backed by SharedArrayBuffer, makes a safe copy.\n\t * No caching to allow proper GC of event data.\n\t */\n\tutf8String(): string {\n\t\tconst v = this.view;\n\n\t\t// ASCII fast path (quick OR-scan for any high bit)\n\t\tlet acc = 0;\n\t\tfor (let i = 0; i < v.length; i++) acc |= v[i];\n\t\tif ((acc & 0x80) === 0) {\n\t\t\t// All ASCII → decode via String.fromCharCode in chunks\n\t\t\tlet s = '';\n\t\t\tconst CHUNK = 0x8000; // 32k is safe for apply()\n\t\t\tfor (let i = 0; i < v.length; i += CHUNK) {\n\t\t\t\ts += String.fromCharCode.apply(null, v.subarray(i, i + CHUNK) as unknown as number[]);\n\t\t\t}\n\t\t\treturn s;\n\t\t}\n\n\t\treturn UTF8_DECODER.decode(v);\n\t}\n\n\t/**\n\t * For debugging/logging\n\t */\n\ttoString(): string {\n\t\treturn this.utf8String();\n\t}\n\n\t/**\n\t * Equality check by bytes\n\t */\n\tequals(other: ByteString): boolean {\n\t\tconst a = this.view,\n\t\t\tb = other.view;\n\t\tif (a.length !== b.length) return false;\n\t\tfor (let i = 0; i < a.length; i++) {\n\t\t\tif (a[i] !== b[i]) return false;\n\t\t}\n\t\treturn true;\n\t}\n}\n","import { nip19 } from 'nostr-tools';\n\nimport { ContentBlockT } from 'src/generated/nostr/fb/content-block';\nimport { ContentData } from 'src/generated/nostr/fb/content-data';\nimport { CodeDataT } from 'src/generated/nostr/fb/code-data';\nimport { CashuDataT } from 'src/generated/nostr/fb/cashu-data';\nimport { HashtagDataT } from 'src/generated/nostr/fb/hashtag-data';\nimport { ImageDataT } from 'src/generated/nostr/fb/image-data';\nimport { VideoDataT } from 'src/generated/nostr/fb/video-data';\nimport { MediaGroupDataT } from 'src/generated/nostr/fb/media-group-data';\nimport { MediaItemT } from 'src/generated/nostr/fb/media-item';\nimport { LinkPreviewDataT } from 'src/generated/nostr/fb/link-preview-data';\nimport { NostrDataT } from 'src/generated/nostr/fb/nostr-data';\n\ntype MatchProcessor = (match: RegExpExecArray) => ContentBlockT | Promise<ContentBlockT>;\n\nconst textEncoder = new TextEncoder();\n\nexport async function parseContent(content: string): Promise<ContentBlockT[]> {\n\tconst blocks: ContentBlockT[] = [];\n\n\t// Helpers\n\tconst textBlock = (text: string): ContentBlockT =>\n\t\tnew ContentBlockT(textEncoder.encode('text'), textEncoder.encode(text), ContentData.NONE, null);\n\n\tconst imageBlock = (url: string): ContentBlockT =>\n\t\tnew ContentBlockT(\n\t\t\ttextEncoder.encode('image'),\n\t\t\ttextEncoder.encode(url),\n\t\t\tContentData.ImageData,\n\t\t\tnew ImageDataT(textEncoder.encode(url), null)\n\t\t);\n\n\tconst videoBlock = (url: string): ContentBlockT =>\n\t\tnew ContentBlockT(\n\t\t\ttextEncoder.encode('video'),\n\t\t\ttextEncoder.encode(url),\n\t\t\tContentData.VideoData,\n\t\t\tnew VideoDataT(textEncoder.encode(url), null)\n\t\t);\n\n\tconst codeBlock = (raw: string, full: string): ContentBlockT => {\n\t\t// Try to extract optional language from first line of fenced code\n\t\t// Supports patterns like ```lang\\ncode\\n```\n\t\tconst nl = raw.indexOf('\\n');\n\t\tlet language: string | null = null;\n\t\tlet code = raw;\n\t\tif (nl !== -1) {\n\t\t\tconst firstLine = raw.slice(0, nl).trim();\n\t\t\tconst rest = raw.slice(nl + 1);\n\t\t\tif (firstLine && /^[a-zA-Z0-9+#\\.\\-_]+$/.test(firstLine)) {\n\t\t\t\tlanguage = firstLine;\n\t\t\t\tcode = rest;\n\t\t\t}\n\t\t}\n\n\t\treturn new ContentBlockT(\n\t\t\ttextEncoder.encode('code'),\n\t\t\ttextEncoder.encode(full),\n\t\t\tContentData.CodeData,\n\t\t\tnew CodeDataT(textEncoder.encode(language || ''), textEncoder.encode(code))\n\t\t);\n\t};\n\n\tconst cashuBlock = (token: string): ContentBlockT =>\n\t\tnew ContentBlockT(\n\t\t\ttextEncoder.encode('cashu'),\n\t\t\ttextEncoder.encode(token),\n\t\t\tContentData.CashuData,\n\t\t\tnew CashuDataT(textEncoder.encode(token))\n\t\t);\n\n\tconst hashtagBlock = (tag: string): ContentBlockT =>\n\t\tnew ContentBlockT(\n\t\t\ttextEncoder.encode('hashtag'),\n\t\t\ttextEncoder.encode(`#${tag}`),\n\t\t\tContentData.HashtagData,\n\t\t\tnew HashtagDataT(textEncoder.encode(tag))\n\t\t);\n\n\tconst linkBlock = (url: string): ContentBlockT =>\n\t\tnew ContentBlockT(\n\t\t\ttextEncoder.encode('link'),\n\t\t\ttextEncoder.encode(url),\n\t\t\tContentData.LinkPreviewData,\n\t\t\tnew LinkPreviewDataT(textEncoder.encode(url), null, null, null)\n\t\t);\n\n\tconst nostrBlock = (bech32: string, fullText: string): ContentBlockT => {\n\t\ttry {\n\t\t\tconst decoded = nip19.decode(bech32);\n\t\t\tconst type = decoded.type as 'npub' | 'nprofile' | 'note' | 'nevent' | 'naddr';\n\n\t\t\tlet id: string | null = null;\n\t\t\tlet relays: string[] = [];\n\t\t\tlet author: string | null = null;\n\t\t\tlet kind: bigint = BigInt(0);\n\n\t\t\tconst d = decoded.data as any;\n\n\t\t\tswitch (type) {\n\t\t\t\tcase 'npub':\n\t\t\t\t\t// data: hex pubkey\n\t\t\t\t\tid = d as string;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'nprofile':\n\t\t\t\t\t// data: { pubkey, relays? }\n\t\t\t\t\tid = d.pubkey;\n\t\t\t\t\trelays = Array.isArray(d.relays) ? d.relays : [];\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'note':\n\t\t\t\t\t// data: hex event id\n\t\t\t\t\tid = d as string;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'nevent':\n\t\t\t\t\t// data: { id, relays?, author?, kind? }\n\t\t\t\t\tid = d.id;\n\t\t\t\t\trelays = Array.isArray(d.relays) ? d.relays : [];\n\t\t\t\t\tauthor = typeof d.author === 'string' ? d.author : null;\n\t\t\t\t\tif (typeof d.kind === 'number') kind = BigInt(d.kind);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'naddr':\n\t\t\t\t\t// data: { identifier, pubkey, kind, relays? }\n\t\t\t\t\t// Build a stable id\n\t\t\t\t\tid = `${d.kind}:${d.pubkey}:${d.identifier}`;\n\t\t\t\t\trelays = Array.isArray(d.relays) ? d.relays : [];\n\t\t\t\t\tif (typeof d.kind === 'number') kind = BigInt(d.kind);\n\t\t\t\t\tauthor = typeof d.pubkey === 'string' ? d.pubkey : null;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Ensure required fields for NostrDataT: id and entity are required\n\t\t\tif (!id) {\n\t\t\t\tid = bech32;\n\t\t\t}\n\n\t\t\treturn new ContentBlockT(\n\t\t\t\ttextEncoder.encode(type),\n\t\t\t\ttextEncoder.encode(fullText),\n\t\t\t\tContentData.NostrData,\n\t\t\t\tnew NostrDataT(\n\t\t\t\t\ttextEncoder.encode(id),\n\t\t\t\t\ttextEncoder.encode(bech32),\n\t\t\t\t\trelays,\n\t\t\t\t\ttextEncoder.encode(author || ''),\n\t\t\t\t\tkind\n\t\t\t\t)\n\t\t\t);\n\t\t} catch {\n\t\t\t// Fallback to plain text block when decode fails\n\t\t\treturn textBlock(fullText);\n\t\t}\n\t};\n\n\t// Define all the patterns we want to match\n\tconst patterns: Array<{\n\t\ttype: string;\n\t\tregex: RegExp;\n\t\tprocessMatch: MatchProcessor;\n\t}> = [\n\t\t{\n\t\t\ttype: 'code',\n\t\t\tregex: /```([\\s\\S]*?)```/g,\n\t\t\tprocessMatch: (match) => codeBlock(match[1] || '', match[0])\n\t\t},\n\t\t{\n\t\t\ttype: 'cashu',\n\t\t\tregex: /(cashuA[A-Za-z0-9_-]+)/g,\n\t\t\tprocessMatch: (match) => cashuBlock(match[0])\n\t\t},\n\t\t{\n\t\t\ttype: 'hashtag',\n\t\t\t// Match hashtags that are not part of a URL\n\t\t\tregex: /(?<![^\\s\"'(])(#[a-zA-Z0-9_]+)(?![a-zA-Z0-9_])/g,\n\t\t\tprocessMatch: (match) => hashtagBlock(match[0].substring(1))\n\t\t},\n\t\t{\n\t\t\ttype: 'image',\n\t\t\tregex: /(https?:\\/\\/\\S+\\.(?:jpg|jpeg|png|gif|webp|svg|ico)(?:\\?\\S*)?)/gi,\n\t\t\tprocessMatch: (match) => imageBlock(match[0])\n\t\t},\n\t\t{\n\t\t\ttype: 'video',\n\t\t\tregex: /(https?:\\/\\/\\S+\\.(?:mp4|mov|avi|mkv|webm|m4v)(?:\\?\\S*)?)/gi,\n\t\t\tprocessMatch: (match) => videoBlock(match[0])\n\t\t},\n\t\t{\n\t\t\ttype: 'nostr',\n\t\t\tregex: /nostr:([a-z0-9]+)/gi,\n\t\t\tprocessMatch: (match) => {\n\t\t\t\tconst bech32 = match[1];\n\t\t\t\treturn nostrBlock(bech32 || '', match[0]);\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\ttype: 'link',\n\t\t\tregex: /(https?:\\/\\/\\S+)(?![\\)])/gi,\n\t\t\tprocessMatch: async (match) => linkBlock(match[0])\n\t\t}\n\t];\n\n\t// Find all matches with their positions\n\tconst allMatches: Array<{\n\t\tstart: number;\n\t\tend: number;\n\t\tblock: ContentBlockT;\n\t}> = [];\n\n\t// First, find all matches for all patterns\n\tfor (const pattern of patterns) {\n\t\tlet match: RegExpExecArray | null;\n\t\tpattern.regex.lastIndex = 0;\n\n\t\twhile ((match = pattern.regex.exec(content)) !== null) {\n\t\t\tconst start = match.index;\n\t\t\tconst end = start + match[0].length;\n\t\t\tconst block = await pattern.processMatch(match);\n\n\t\t\tallMatches.push({ start, end, block });\n\t\t}\n\t}\n\n\t// Sort matches by start position\n\tallMatches.sort((a, b) => a.start - b.start);\n\n\t// Remove overlapping matches (prioritize earlier patterns in the array)\n\tconst filteredMatches: typeof allMatches = [];\n\n\tfor (const match of allMatches) {\n\t\tconst overlaps = filteredMatches.some(\n\t\t\t(existing) =>\n\t\t\t\t(match.start >= existing.start && match.start < existing.end) ||\n\t\t\t\t(match.end > existing.start && match.end <= existing.end) ||\n\t\t\t\t(match.start <= existing.start && match.end >= existing.end)\n\t\t);\n\n\t\tif (!overlaps) {\n\t\t\tfilteredMatches.push(match);\n\t\t}\n\t}\n\n\t// Re-sort filtered matches\n\tfilteredMatches.sort((a, b) => a.start - b.start);\n\n\t// Build the final result, including text between matches\n\tlet lastIndex = 0;\n\n\tfor (const { start, end, block } of filteredMatches) {\n\t\t// Add text before this match\n\t\tif (start > lastIndex) {\n\t\t\tblocks.push(textBlock(content.substring(lastIndex, start)));\n\t\t}\n\n\t\t// Add the match\n\t\tblocks.push(block);\n\n\t\tlastIndex = end;\n\t}\n\n\t// Add any remaining text after the last match\n\tif (lastIndex < content.length) {\n\t\tblocks.push(textBlock(content.substring(lastIndex)));\n\t}\n\n\t// Post-processing: group consecutive media into grids\n\tconst processedBlocks: ContentBlockT[] = [];\n\tlet mediaGroup: ContentBlockT[] = [];\n\n\tconst isWhitespace = (s: string) => /^\\s+$/.test(s);\n\n\tfor (let i = 0; i < blocks.length; i++) {\n\t\tconst block = blocks[i];\n\n\t\t// If this is an image or video\n\t\tif (block?.type?.toString() === 'image' || block?.type?.toString() === 'video') {\n\t\t\tmediaGroup.push(block);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If this is whitespace or newlines between media, check what follows\n\t\tif (\n\t\t\tblock?.type?.toString() === 'text' &&\n\t\t\ttypeof block?.text?.toString() === 'string' &&\n\t\t\tisWhitespace(block.text?.toString())\n\t\t) {\n\t\t\tif (\n\t\t\t\tmediaGroup.length > 0 &&\n\t\t\t\ti + 1 < blocks.length &&\n\t\t\t\t(blocks[i + 1]?.type?.toString() === 'image' || blocks[i + 1]?.type?.toString() === 'video')\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// If we have collected media and the current block breaks the sequence\n\t\tif (mediaGroup.length > 0) {\n\t\t\t// Add media group if it contains more than one item\n\t\t\tif (mediaGroup.length > 1) {\n\t\t\t\tconst items: MediaItemT[] = mediaGroup.map((m) => {\n\t\t\t\t\tif (m.dataType === ContentData.ImageData) {\n\t\t\t\t\t\tconst d = m.data as ImageDataT;\n\t\t\t\t\t\treturn new MediaItemT(\n\t\t\t\t\t\t\tnew ImageDataT(textEncoder.encode(d.url ?? (m.text as string)), null),\n\t\t\t\t\t\t\tnull\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (m.dataType === ContentData.VideoData) {\n\t\t\t\t\t\tconst d = m.data as VideoDataT;\n\t\t\t\t\t\treturn new MediaItemT(\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\tnew VideoDataT(textEncoder.encode(d.url ?? (m.text as string)), null)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\t// Fallback — shouldn't occur because we only collect image/video\n\t\t\t\t\treturn new MediaItemT(null, null);\n\t\t\t\t});\n\n\t\t\t\tconst text = mediaGroup.map((m) => String(m.text ?? '')).join('\\n');\n\t\t\t\tprocessedBlocks.push(\n\t\t\t\t\tnew ContentBlockT(\n\t\t\t\t\t\ttextEncoder.encode('mediaGrid'),\n\t\t\t\t\t\ttextEncoder.encode(text),\n\t\t\t\t\t\tContentData.MediaGroupData,\n\t\t\t\t\t\tnew MediaGroupDataT(items)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// Just add the single media item\n\t\t\t\tprocessedBlocks.push(mediaGroup[0]);\n\t\t\t}\n\t\t\tmediaGroup = [];\n\t\t}\n\n\t\t// Add the current non-media block\n\t\tprocessedBlocks.push(block);\n\t}\n\n\t// Don't forget any remaining media\n\tif (mediaGroup.length > 0) {\n\t\tif (mediaGroup.length > 1) {\n\t\t\tconst items: MediaItemT[] = mediaGroup.map((m) => {\n\t\t\t\tif (m.dataType === ContentData.ImageData) {\n\t\t\t\t\tconst d = m.data as ImageDataT;\n\t\t\t\t\treturn new MediaItemT(\n\t\t\t\t\t\tnew ImageDataT(textEncoder.encode(d.url ?? (m.text as string)), null),\n\t\t\t\t\t\tnull\n\t\t\t\t\t);\n\t\t\t\t} else if (m.dataType === ContentData.VideoData) {\n\t\t\t\t\tconst d = m.data as VideoDataT;\n\t\t\t\t\treturn new MediaItemT(\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tnew VideoDataT(textEncoder.encode(d.url ?? (m.text as string)), null)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn new MediaItemT(null, null);\n\t\t\t});\n\n\t\t\tconst text = mediaGroup.map((m) => String(m.text ?? '')).join('\\n');\n\t\t\tprocessedBlocks.push(\n\t\t\t\tnew ContentBlockT(\n\t\t\t\t\ttextEncoder.encode('mediaGrid'),\n\t\t\t\t\ttextEncoder.encode(text),\n\t\t\t\t\tContentData.MediaGroupData,\n\t\t\t\t\tnew MediaGroupDataT(items)\n\t\t\t\t)\n\t\t\t);\n\t\t} else {\n\t\t\tprocessedBlocks.push(mediaGroup[0]);\n\t\t}\n\t}\n\n\treturn processedBlocks;\n}\n","import { generateSecretKey, getPublicKey } from 'nostr-tools';\nimport { manager } from '.';\n\nexport { ConnectionTracker } from './lib/ConnectionTracker';\nexport { ByteString } from './lib/ByteString';\n\nexport * from './lib/NarrowTypes';\nexport * from './lib/ParseContent';\n\n/**\n * Extracts keys from T where the value is a `function(i: number): any`\n */\ntype FlatBufferKeys<T> = {\n\t[K in keyof T]: T[K] extends (i: number) => any ? K : never;\n}[keyof T];\n\n/**\n * Non-nullable version: Filters out null results\n */\nexport function fbIterable<T, K extends FlatBufferKeys<T>>(\n\tobj: T,\n\tfieldName: K\n): Iterable<NonNullable<ReturnType<Extract<T[K], (i: number) => any>>>> {\n\tconst length = (obj as any)[`${String(fieldName)}Length`]();\n\treturn {\n\t\t[Symbol.iterator](): Iterator<NonNullable<ReturnType<Extract<T[K], (i: number) => any>>>> {\n\t\t\tlet i = 0;\n\t\t\treturn {\n\t\t\t\tnext(): IteratorResult<NonNullable<ReturnType<Extract<T[K], (i: number) => any>>>> {\n\t\t\t\t\twhile (i < length) {\n\t\t\t\t\t\tconst value = (obj as any)[fieldName](i);\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tif (value != null) {\n\t\t\t\t\t\t\treturn { value, done: false };\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// if null → skip this index\n\t\t\t\t\t}\n\t\t\t\t\treturn { value: undefined as any, done: true };\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t};\n}\n\n/**\n * Eager array version (non-null)\n */\nexport function fbArray<T, K extends FlatBufferKeys<T>>(\n\tobj: T,\n\tfieldName: K\n): Array<NonNullable<ReturnType<Extract<T[K], (i: number) => any>>>> {\n\tif (!obj) return [];\n\tconst lengthGetter = (obj as any)[`${String(fieldName)}Length`]?.bind(obj);\n\tif (!lengthGetter) return [];\n\tconst length = lengthGetter();\n\n\tconst result: Array<NonNullable<ReturnType<Extract<T[K], (i: number) => any>>>> = [];\n\tfor (let i = 0; i < length; i++) {\n\t\tconst v = (obj as any)[fieldName](i);\n\t\tif (v != null) result.push(v);\n\t}\n\treturn result;\n}\n\n// In your frontend application\nexport async function connectWithQRCode(appName: string, relays: string[]) {\n\t// Generate a client keypair\n\tconst clientKeys = generateSecretKey();\n\tconst clientPubkey = getPublicKey(clientKeys);\n\tconst clientSecretHex = Array.from(clientKeys)\n\t\t.map((b) => b.toString(16).padStart(2, '0'))\n\t\t.join('');\n\n\t// Generate a random secret\n\tconst secret = getPublicKey(generateSecretKey());\n\n\tconst params = new URLSearchParams();\n\n\tfor (const relay of relays) {\n\t\tparams.append('relay', relay);\n\t}\n\n\tparams.set('secret', secret);\n\tparams.set('name', appName);\n\n\tconst nostrconnectUrl = `nostrconnect://${clientPubkey}?${params.toString()}`;\n\n\tconsole.log('connect url:', nostrconnectUrl);\n\n\t// Set up the NIP-46 signer with the client's pubkey and relays\n\t// Note: We don't know the remote signer's pubkey yet - that's what we're discovering\n\tmanager.setNip46QR(nostrconnectUrl, clientSecretHex);\n\n\treturn nostrconnectUrl;\n}\n"],"names":["ConnectionTracker","msg","status","isConnectionStatus","id","ByteBuffer","offset","length","start","slice","ByteString","UTF8_DECODER","HEX_TABLE","t","i","view","h","v","out","acc","other","b","textEncoder","parseContent","content","blocks","textBlock","text","ContentBlockT","ContentData","imageBlock","url","ImageDataT","videoBlock","VideoDataT","codeBlock","raw","full","nl","language","code","firstLine","rest","CodeDataT","cashuBlock","token","CashuDataT","hashtagBlock","tag","HashtagDataT","linkBlock","LinkPreviewDataT","nostrBlock","bech32","fullText","decoded","nip19","type","relays","author","kind","d","NostrDataT","patterns","match","allMatches","pattern","end","block","a","filteredMatches","existing","lastIndex","processedBlocks","mediaGroup","isWhitespace","s","items","m","MediaItemT","MediaGroupDataT","fbIterable","obj","fieldName","value","fbArray","lengthGetter","result","connectWithQRCode","appName","clientKeys","generateSecretKey","clientPubkey","getPublicKey","clientSecretHex","secret","params","relay","nostrconnectUrl","manager"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@candypoets/nipworker",
3
- "version": "0.0.77",
3
+ "version": "0.83.0",
4
4
  "description": "Nostr client library with worker-based architecture using Rust WASM",
5
5
  "type": "module",
6
6
  "module": "./dist/index.js",
@@ -24,7 +24,8 @@
24
24
  "README.md"
25
25
  ],
26
26
  "scripts": {
27
- "build": "npm run build:connections && npm run build:cache && npm run build:parser && npm run build:crypto && vite build",
27
+ "build": "npm-run-all --parallel build:connections build:cache build:parser build:crypto && vite build",
28
+ "build:crates": "npm-run-all --parallel build:connections build:cache build:parser build:crypto",
28
29
  "build:connections": "wasm-pack build ./src/connections --release --target web",
29
30
  "build:cache": "wasm-pack build ./src/cache --release --target web",
30
31
  "build:parser": "wasm-pack build ./src/parser --release --target web",
@@ -59,6 +60,7 @@
59
60
  },
60
61
  "devDependencies": {
61
62
  "@types/node": "^20.19.17",
63
+ "npm-run-all": "^4.1.5",
62
64
  "prettier": "^3.6.2",
63
65
  "typescript": "^5.0.0",
64
66
  "vite": "^5.0.0",
@@ -1,43 +0,0 @@
1
- import { ByteString } from '../../../lib/ByteString';
2
-
3
- import * as flatbuffers from 'flatbuffers';
4
- export declare class Kind39089Parsed implements flatbuffers.IUnpackableObject<Kind39089ParsedT> {
5
- bb: flatbuffers.ByteBuffer | null;
6
- bb_pos: number;
7
- __init(i: number, bb: flatbuffers.ByteBuffer): Kind39089Parsed;
8
- static getRootAsKind39089Parsed(bb: flatbuffers.ByteBuffer, obj?: Kind39089Parsed): Kind39089Parsed;
9
- static getSizePrefixedRootAsKind39089Parsed(bb: flatbuffers.ByteBuffer, obj?: Kind39089Parsed): Kind39089Parsed;
10
- listIdentifier(): ByteString | null;
11
- listIdentifier(optionalEncoding: flatbuffers.Encoding): ByteString | Uint8Array | null;
12
- people(index: number): ByteString;
13
- people(index: number, optionalEncoding: flatbuffers.Encoding): ByteString | Uint8Array;
14
- peopleLength(): number;
15
- title(): ByteString | null;
16
- title(optionalEncoding: flatbuffers.Encoding): ByteString | Uint8Array | null;
17
- description(): ByteString | null;
18
- description(optionalEncoding: flatbuffers.Encoding): ByteString | Uint8Array | null;
19
- image(): ByteString | null;
20
- image(optionalEncoding: flatbuffers.Encoding): ByteString | Uint8Array | null;
21
- static startKind39089Parsed(builder: flatbuffers.Builder): void;
22
- static addListIdentifier(builder: flatbuffers.Builder, listIdentifierOffset: flatbuffers.Offset): void;
23
- static addPeople(builder: flatbuffers.Builder, peopleOffset: flatbuffers.Offset): void;
24
- static createPeopleVector(builder: flatbuffers.Builder, data: flatbuffers.Offset[]): flatbuffers.Offset;
25
- static startPeopleVector(builder: flatbuffers.Builder, numElems: number): void;
26
- static addTitle(builder: flatbuffers.Builder, titleOffset: flatbuffers.Offset): void;
27
- static addDescription(builder: flatbuffers.Builder, descriptionOffset: flatbuffers.Offset): void;
28
- static addImage(builder: flatbuffers.Builder, imageOffset: flatbuffers.Offset): void;
29
- static endKind39089Parsed(builder: flatbuffers.Builder): flatbuffers.Offset;
30
- static createKind39089Parsed(builder: flatbuffers.Builder, listIdentifierOffset: flatbuffers.Offset, peopleOffset: flatbuffers.Offset, titleOffset: flatbuffers.Offset, descriptionOffset: flatbuffers.Offset, imageOffset: flatbuffers.Offset): flatbuffers.Offset;
31
- unpack(): Kind39089ParsedT;
32
- unpackTo(_o: Kind39089ParsedT): void;
33
- }
34
- export declare class Kind39089ParsedT implements flatbuffers.IGeneratedObject {
35
- listIdentifier: ByteString | Uint8Array | null;
36
- people: (string)[];
37
- title: ByteString | Uint8Array | null;
38
- description: ByteString | Uint8Array | null;
39
- image: ByteString | Uint8Array | null;
40
- constructor(listIdentifier?: ByteString | Uint8Array | null, people?: (string)[], title?: ByteString | Uint8Array | null, description?: ByteString | Uint8Array | null, image?: ByteString | Uint8Array | null);
41
- pack(builder: flatbuffers.Builder): flatbuffers.Offset;
42
- }
43
- //# sourceMappingURL=kind39089-parsed.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"kind39089-parsed.d.ts","sourceRoot":"","sources":["../../../../src/generated/nostr/fb/kind39089-parsed.ts"],"names":[],"mappings":"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"}
@@ -1,24 +0,0 @@
1
- import { ByteString } from '../../../lib/ByteString';
2
-
3
- import * as flatbuffers from 'flatbuffers';
4
- export declare class SetPubKey implements flatbuffers.IUnpackableObject<SetPubKeyT> {
5
- bb: flatbuffers.ByteBuffer | null;
6
- bb_pos: number;
7
- __init(i: number, bb: flatbuffers.ByteBuffer): SetPubKey;
8
- static getRootAsSetPubKey(bb: flatbuffers.ByteBuffer, obj?: SetPubKey): SetPubKey;
9
- static getSizePrefixedRootAsSetPubKey(bb: flatbuffers.ByteBuffer, obj?: SetPubKey): SetPubKey;
10
- pubkey(): ByteString | null;
11
- pubkey(optionalEncoding: flatbuffers.Encoding): ByteString | Uint8Array | null;
12
- static startSetPubKey(builder: flatbuffers.Builder): void;
13
- static addPubkey(builder: flatbuffers.Builder, pubkeyOffset: flatbuffers.Offset): void;
14
- static endSetPubKey(builder: flatbuffers.Builder): flatbuffers.Offset;
15
- static createSetPubKey(builder: flatbuffers.Builder, pubkeyOffset: flatbuffers.Offset): flatbuffers.Offset;
16
- unpack(): SetPubKeyT;
17
- unpackTo(_o: SetPubKeyT): void;
18
- }
19
- export declare class SetPubKeyT implements flatbuffers.IGeneratedObject {
20
- pubkey: ByteString | Uint8Array | null;
21
- constructor(pubkey?: ByteString | Uint8Array | null);
22
- pack(builder: flatbuffers.Builder): flatbuffers.Offset;
23
- }
24
- //# sourceMappingURL=set-pub-key.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"set-pub-key.d.ts","sourceRoot":"","sources":["../../../../src/generated/nostr/fb/set-pub-key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAKhD,OAAO,KAAK,WAAW,MAAM,aAAa,CAAC;AAI3C,qBAAa,SAAU,YAAW,WAAW,CAAC,iBAAiB,CAAC,UAAU,CAAC;IACzE,EAAE,EAAE,WAAW,CAAC,UAAU,GAAC,IAAI,CAAQ;IACvC,MAAM,SAAK;IACX,MAAM,CAAC,CAAC,EAAC,MAAM,EAAE,EAAE,EAAC,WAAW,CAAC,UAAU,GAAE,SAAS;IAMvD,MAAM,CAAC,kBAAkB,CAAC,EAAE,EAAC,WAAW,CAAC,UAAU,EAAE,GAAG,CAAC,EAAC,SAAS,GAAE,SAAS;IAI9E,MAAM,CAAC,8BAA8B,CAAC,EAAE,EAAC,WAAW,CAAC,UAAU,EAAE,GAAG,CAAC,EAAC,SAAS,GAAE,SAAS;IAK1F,MAAM,IAAI,UAAU,GAAC,IAAI;IACzB,MAAM,CAAC,gBAAgB,EAAC,WAAW,CAAC,QAAQ,GAAG,UAAU,GAAC,UAAU,GAAC,IAAI;IAMzE,MAAM,CAAC,cAAc,CAAC,OAAO,EAAC,WAAW,CAAC,OAAO;IAIjD,MAAM,CAAC,SAAS,CAAC,OAAO,EAAC,WAAW,CAAC,OAAO,EAAE,YAAY,EAAC,WAAW,CAAC,MAAM;IAI7E,MAAM,CAAC,YAAY,CAAC,OAAO,EAAC,WAAW,CAAC,OAAO,GAAE,WAAW,CAAC,MAAM;IAMnE,MAAM,CAAC,eAAe,CAAC,OAAO,EAAC,WAAW,CAAC,OAAO,EAAE,YAAY,EAAC,WAAW,CAAC,MAAM,GAAE,WAAW,CAAC,MAAM;IAMvG,MAAM,IAAI,UAAU;IAOpB,QAAQ,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI;CAG7B;AAED,qBAAa,UAAW,YAAW,WAAW,CAAC,gBAAgB;IAEtD,MAAM,EAAE,UAAU,GAAC,UAAU,GAAC,IAAI;gBAAlC,MAAM,GAAE,UAAU,GAAC,UAAU,GAAC,IAAW;IAIlD,IAAI,CAAC,OAAO,EAAC,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,MAAM;CAOpD"}
@@ -1,62 +0,0 @@
1
- import { WorkerMessage } from '../generated/nostr/fb';
2
-
3
- /**
4
- * Utility library for reading from SharedArrayBuffer with 4-byte header approach
5
- * Header format: [0-3]: Write position (4 bytes, little endian)
6
- * Data format: [4+]: [4-byte length][msgpack event][4-byte length][msgpack event]...
7
- */
8
- export declare class SharedBufferReader {
9
- /**
10
- * Initialize a buffer for writing - sets the write position header to 4
11
- * @param buffer The SharedArrayBuffer to initialize
12
- */
13
- static initializeBuffer(buffer: SharedArrayBuffer): void;
14
- /**
15
- * Write a message to the SharedArrayBuffer
16
- * @param buffer The SharedArrayBuffer to write to
17
- * @param data The data to write (already encoded as Uint8Array)
18
- * @returns True if written successfully, false if buffer is full
19
- */
20
- static writeMessage(buffer: SharedArrayBuffer, data: Uint8Array): boolean;
21
- /**
22
- * Read new messages from SharedArrayBuffer since last read position
23
- * @param buffer The SharedArrayBuffer to read from
24
- * @param lastReadPosition Last position read (default: 0, meaning read from beginning)
25
- * @returns Object containing new messages and updated read position
26
- */
27
- static readMessages(buffer: SharedArrayBuffer, lastReadPosition?: number): {
28
- messages: WorkerMessage[];
29
- newReadPosition: number;
30
- hasNewData: boolean;
31
- };
32
- /**
33
- * Read all messages from SharedArrayBuffer from the beginning (ignores lastReadPosition)
34
- * @param buffer The SharedArrayBuffer to read from
35
- * @returns Object containing all messages in the buffer
36
- */
37
- static readAllMessages(buffer: SharedArrayBuffer): {
38
- messages: WorkerMessage[];
39
- totalMessages: number;
40
- };
41
- /**
42
- * Get current write position from buffer header
43
- * @param buffer The SharedArrayBuffer to read from
44
- * @returns Current write position
45
- */
46
- static getCurrentWritePosition(buffer: SharedArrayBuffer): number;
47
- /**
48
- * Check if buffer has new data since last read
49
- * @param buffer The SharedArrayBuffer to check
50
- * @param lastReadPosition Last position read
51
- * @returns True if there's new data to read
52
- */
53
- static hasNewData(buffer: SharedArrayBuffer, lastReadPosition: number): boolean;
54
- /**
55
- * Calculate recommended buffer size based on request limits
56
- * @param totalEventLimit Total expected events across all requests
57
- * @param bytesPerEvent Estimated bytes per event (default: 3072)
58
- * @returns Recommended buffer size in bytes
59
- */
60
- static calculateBufferSize(totalEventLimit?: number, bytesPerEvent?: number): number;
61
- }
62
- //# sourceMappingURL=SharedBuffer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SharedBuffer.d.ts","sourceRoot":"","sources":["../../src/lib/SharedBuffer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD;;;;GAIG;AACH,qBAAa,kBAAkB;IAC9B;;;OAGG;IACH,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAMxD;;;;;OAKG;IACH,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO;IA2BzE;;;;;OAKG;IACH,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,EAAE,gBAAgB,GAAE,MAAU;;;;;IA6D3E;;;;OAIG;IACH,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,iBAAiB,GAAG;QAClD,QAAQ,EAAE,aAAa,EAAE,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC;KACtB;IAQD;;;;OAIG;IACH,MAAM,CAAC,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM;IAKjE;;;;;OAKG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO;IAO/E;;;;;OAKG;IACH,MAAM,CAAC,mBAAmB,CAAC,eAAe,GAAE,MAAY,EAAE,aAAa,GAAE,MAAa,GAAG,MAAM;CAM/F"}
@@ -1 +0,0 @@
1
- class y{constructor(t){this.dataStart=32,this.dropped=0,this.sab=t,this.dataView=new DataView(t),this.capacity=this.dataView.getUint32(0,!0)}getHead(){return this.dataView.getUint32(4,!0)%this.capacity}setHead(t){this.dataView.setUint32(4,t%this.capacity,!0)}getTail(){return this.dataView.getUint32(8,!0)%this.capacity}setTail(t){this.dataView.setUint32(8,t%this.capacity,!0)}getSeq(){return this.dataView.getUint32(12,!0)}setSeq(t){this.dataView.setUint32(12,t,!0)}getFreeSpace(){const t=this.getHead(),a=this.getTail(),s=(t-a+this.capacity)%this.capacity;return this.capacity-s}getDropped(){return this.dropped}hasRecords(){return this.getHead()!==this.getTail()}readNext(){const t=this.read();return t?{payload:t}:null}write(t){const a=t.byteLength,s=8+a,r=4+s+4;let e=0;for(;this.getFreeSpace()<r;){if(!this.skipRecord())return this.dropped+=e+1,-1;e++}const h=this.getSeq()+1;this.setSeq(h);let i=this.getHead();return this.dataView.setUint32(this.dataStart+i,s,!0),i=(i+4)%this.capacity,this.dataView.setUint16(this.dataStart+i,0,!0),i=(i+2)%this.capacity,this.dataView.setUint16(this.dataStart+i,0,!0),i=(i+2)%this.capacity,this.dataView.setUint32(this.dataStart+i,h,!0),i=(i+4)%this.capacity,this.copyBytes(i,t,0,a),i=(i+a)%this.capacity,this.dataView.setUint32(this.dataStart+i,s,!0),i=(i+4)%this.capacity,this.setHead(i),this.dropped+=e,h}read(){let t=this.getTail();if(t===this.getHead())return null;const a=this.dataView.getUint32(this.dataStart+t,!0);if(a===0)return null;const s=(t+4+a)%this.capacity;if(this.dataView.getUint32(this.dataStart+s,!0)!==a)return null;const r=new Uint8Array(a);this.copyFromRing((t+4)%this.capacity,r,0,a);const e=r.subarray(8),h=4+a+4;return this.setTail((this.getTail()+h)%this.capacity),e}skipRecord(){let t=this.getTail();if(t===this.getHead())return!1;const a=this.dataView.getUint32(this.dataStart+t,!0);if(a===0)return!1;const s=(t+4+a)%this.capacity;if(this.dataView.getUint32(this.dataStart+s,!0)!==a)return!1;const r=4+a+4;return this.setTail((this.getTail()+r)%this.capacity),!0}copyBytes(t,a,s,r){let e=r,h=s,i=t;for(;e>0;){const n=this.capacity-i%this.capacity,c=Math.min(e,n),d=this.dataStart+i%this.capacity,p=a.subarray(h,h+c);new Uint8Array(this.sab,d,c).set(p),e-=c,h+=c,i+=c}}copyFromRing(t,a,s,r){let e=r,h=s,i=t;for(;e>0;){const n=this.capacity-i%this.capacity,c=Math.min(e,n),d=this.dataStart+i%this.capacity,p=new Uint8Array(this.sab,d,c);a.set(p,h),e-=c,h+=c,i+=c}}}export{y as B};
@@ -1 +0,0 @@
1
- {"version":3,"file":"ring-buffer.js","sources":["../src/ws/ring-buffer.ts"],"sourcesContent":["export class ByteRingBuffer {\n\tprivate readonly sab: SharedArrayBuffer;\n\tprivate readonly dataView: DataView;\n\tprivate readonly dataStart: number = 32;\n\tprivate readonly capacity: number;\n\tprivate dropped: number = 0;\n\n\tconstructor(buffer: SharedArrayBuffer) {\n\t\tthis.sab = buffer;\n\t\tthis.dataView = new DataView(buffer);\n\t\tthis.capacity = this.dataView.getUint32(0, true); // little-endian\n\n\t\t// Read initial state (assume Rust sets capacity, head=0, tail=0, seq=0)\n\t\t// We don't reset here; assume initialized\n\t}\n\n\tprivate getHead(): number {\n\t\treturn this.dataView.getUint32(4, true) % this.capacity;\n\t}\n\n\tprivate setHead(value: number): void {\n\t\tthis.dataView.setUint32(4, value % this.capacity, true);\n\t}\n\n\tprivate getTail(): number {\n\t\treturn this.dataView.getUint32(8, true) % this.capacity;\n\t}\n\n\tprivate setTail(value: number): void {\n\t\tthis.dataView.setUint32(8, value % this.capacity, true);\n\t}\n\n\tprivate getSeq(): number {\n\t\treturn this.dataView.getUint32(12, true);\n\t}\n\n\tprivate setSeq(value: number): void {\n\t\tthis.dataView.setUint32(12, value, true);\n\t}\n\n\tgetFreeSpace(): number {\n\t\tconst head = this.getHead();\n\t\tconst tail = this.getTail();\n\t\tconst used = (head - tail + this.capacity) % this.capacity;\n\t\treturn this.capacity - used;\n\t}\n\n\tgetDropped(): number {\n\t\treturn this.dropped;\n\t}\n\n\thasRecords(): boolean {\n\t\treturn this.getHead() !== this.getTail();\n\t}\n\n\treadNext(): { payload: Uint8Array } | null {\n\t\tconst p = this.read();\n\t\treturn p ? { payload: p } : null;\n\t}\n\n\t/**\n\t * Writes a payload to the ring buffer, overwriting old records if necessary.\n\t * Returns the sequence number if successful, -1 if dropped (couldn't make space).\n\t */\n\twrite(payload: Uint8Array): number {\n\t\tconst N = payload.byteLength;\n\t\tconst len = 8 + N; // type(2) + pad(2) + seq(4) + payload(N)\n\t\tconst totalSize = 4 + len + 4; // len + variable + trailer\n\n\t\t// Make space by skipping records\n\t\tlet droppedThisWrite = 0;\n\t\twhile (this.getFreeSpace() < totalSize) {\n\t\t\tif (!this.skipRecord()) {\n\t\t\t\t// Can't skip more (uncommitted record), drop this write\n\t\t\t\tthis.dropped += droppedThisWrite + 1;\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tdroppedThisWrite++;\n\t\t}\n\n\t\t// Enough space, write\n\t\tconst mySeq = this.getSeq() + 1;\n\t\tthis.setSeq(mySeq);\n\n\t\tlet writePos = this.getHead();\n\n\t\t// Write len\n\t\tthis.dataView.setUint32(this.dataStart + writePos, len, true);\n\t\twritePos = (writePos + 4) % this.capacity;\n\n\t\t// Write type (0)\n\t\tthis.dataView.setUint16(this.dataStart + writePos, 0, true);\n\t\twritePos = (writePos + 2) % this.capacity;\n\n\t\t// Write pad (0)\n\t\tthis.dataView.setUint16(this.dataStart + writePos, 0, true);\n\t\twritePos = (writePos + 2) % this.capacity;\n\n\t\t// Write seq\n\t\tthis.dataView.setUint32(this.dataStart + writePos, mySeq, true);\n\t\twritePos = (writePos + 4) % this.capacity;\n\n\t\t// Write payload (possibly wrapped)\n\t\tthis.copyBytes(writePos, payload, 0, N);\n\t\twritePos = (writePos + N) % this.capacity;\n\n\t\t// Write trailer (len)\n\t\tthis.dataView.setUint32(this.dataStart + writePos, len, true);\n\t\twritePos = (writePos + 4) % this.capacity;\n\n\t\t// Advance head\n\t\tthis.setHead(writePos);\n\n\t\tthis.dropped += droppedThisWrite;\n\t\treturn mySeq;\n\t}\n\n\t/**\n\t * Reads the next committed payload or null if none ready.\n\t * Advances tail on success.\n\t */\n\tread(): Uint8Array | null {\n\t\tlet readPos = this.getTail();\n\t\tif (readPos === this.getHead()) return null; // empty\n\n\t\tconst len = this.dataView.getUint32(this.dataStart + readPos, true);\n\t\tif (len === 0) return null;\n\n\t\tconst trailerPos = (readPos + 4 + len) % this.capacity;\n\t\tconst trailer = this.dataView.getUint32(this.dataStart + trailerPos, true);\n\n\t\tif (trailer !== len) return null; // not committed\n\n\t\t// Read variable part (len bytes from readPos + 4)\n\t\tconst variable = new Uint8Array(len);\n\t\tthis.copyFromRing((readPos + 4) % this.capacity, variable, 0, len);\n\n\t\t// Extract payload (skip type+pad+seq = 8 bytes)\n\t\tconst payload = variable.subarray(8);\n\n\t\t// Advance tail\n\t\tconst advance = 4 + len + 4; // len field + variable + trailer\n\t\tthis.setTail((this.getTail() + advance) % this.capacity);\n\n\t\treturn payload;\n\t}\n\n\tprivate skipRecord(): boolean {\n\t\tlet readPos = this.getTail();\n\t\tif (readPos === this.getHead()) return false; // empty\n\n\t\tconst len = this.dataView.getUint32(this.dataStart + readPos, true);\n\t\tif (len === 0) return false;\n\n\t\tconst trailerPos = (readPos + 4 + len) % this.capacity;\n\t\tconst trailer = this.dataView.getUint32(this.dataStart + trailerPos, true);\n\n\t\tif (trailer !== len) return false; // not committed\n\n\t\t// Skip by advancing tail\n\t\tconst advance = 4 + len + 4;\n\t\tthis.setTail((this.getTail() + advance) % this.capacity);\n\t\treturn true;\n\t}\n\n\tprivate copyBytes(\n\t\ttargetPos: number,\n\t\tsource: Uint8Array,\n\t\tsourceOffset: number,\n\t\tlength: number\n\t): void {\n\t\tlet remaining = length;\n\t\tlet srcOffset = sourceOffset;\n\t\tlet tgt = targetPos;\n\n\t\twhile (remaining > 0) {\n\t\t\tconst spaceToEnd = this.capacity - (tgt % this.capacity);\n\t\t\tconst chunkSize = Math.min(remaining, spaceToEnd);\n\t\t\tconst tgtAbs = this.dataStart + (tgt % this.capacity);\n\t\t\tconst srcChunk = source.subarray(srcOffset, srcOffset + chunkSize);\n\t\t\tnew Uint8Array(this.sab, tgtAbs, chunkSize).set(srcChunk);\n\t\t\tremaining -= chunkSize;\n\t\t\tsrcOffset += chunkSize;\n\t\t\ttgt += chunkSize;\n\t\t}\n\t}\n\n\tprivate copyFromRing(\n\t\tsourcePos: number,\n\t\ttarget: Uint8Array,\n\t\ttargetOffset: number,\n\t\tlength: number\n\t): void {\n\t\tlet remaining = length;\n\t\tlet tgtOffset = targetOffset;\n\t\tlet src = sourcePos;\n\n\t\twhile (remaining > 0) {\n\t\t\tconst spaceToEnd = this.capacity - (src % this.capacity);\n\t\t\tconst chunkSize = Math.min(remaining, spaceToEnd);\n\t\t\tconst srcAbs = this.dataStart + (src % this.capacity);\n\t\t\tconst srcChunk = new Uint8Array(this.sab, srcAbs, chunkSize);\n\t\t\ttarget.set(srcChunk, tgtOffset);\n\t\t\tremaining -= chunkSize;\n\t\t\ttgtOffset += chunkSize;\n\t\t\tsrc += chunkSize;\n\t\t}\n\t}\n}\n"],"names":["ByteRingBuffer","buffer","value","head","tail","used","p","payload","N","len","totalSize","droppedThisWrite","mySeq","writePos","readPos","trailerPos","variable","advance","targetPos","source","sourceOffset","length","remaining","srcOffset","tgt","spaceToEnd","chunkSize","tgtAbs","srcChunk","sourcePos","target","targetOffset","tgtOffset","src","srcAbs"],"mappings":"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"}
@@ -1,37 +0,0 @@
1
- import { ConnectionStatus, RelayConfig, RelayStats } from './types';
2
-
3
- export type MessageHandler = (url: string, subId: string | null, // present for EVENT/EOSE/CLOSED
4
- rawText: string) => void;
5
- export declare class RelayConnection {
6
- private wantReconnect;
7
- private url;
8
- private config;
9
- private status;
10
- private ws;
11
- private reconnectTimer;
12
- private abortController;
13
- private attempts;
14
- private givenUp;
15
- private lastActivity;
16
- private stats;
17
- private readyWaiters;
18
- messageHandler: MessageHandler | null;
19
- constructor(url: string, config?: Partial<RelayConfig>);
20
- getUrl(): string;
21
- getStatus(): ConnectionStatus;
22
- getStats(): RelayStats;
23
- getLastActivity(): number;
24
- hasGivenUp(): boolean;
25
- setMessageHandler(handler: MessageHandler): void;
26
- connect(): void;
27
- sendMessage(frame: string): Promise<void>;
28
- waitForReady(timeoutMs?: number): Promise<void>;
29
- close(): Promise<void>;
30
- shouldCloseDueToInactivity(): boolean;
31
- private resolveReady;
32
- private removeReadyResolver;
33
- private closeWebSocket;
34
- private scheduleReconnect;
35
- private extractSubId;
36
- }
37
- //# sourceMappingURL=connection.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/ws/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGpE,MAAM,MAAM,cAAc,GAAG,CAC5B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,gCAAgC;AACtD,OAAO,EAAE,MAAM,KACX,IAAI,CAAC;AAEV,qBAAa,eAAe;IAC3B,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,MAAM,CAA6C;IAC3D,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,eAAe,CAAgC;IAEvD,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,KAAK,CAMX;IACF,OAAO,CAAC,YAAY,CAAoC;IACjD,cAAc,EAAE,cAAc,GAAG,IAAI,CAAQ;gBAExC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM;IAiB1D,MAAM,IAAI,MAAM;IAGhB,SAAS,IAAI,gBAAgB;IAG7B,QAAQ,IAAI,UAAU;IAGtB,eAAe,IAAI,MAAM;IAGzB,UAAU,IAAI,OAAO;IAIrB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAKhD,OAAO,IAAI,IAAI;IAgHT,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzC,YAAY,CAAC,SAAS,GAAE,MAA8C,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBtF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAY5B,0BAA0B,IAAI,OAAO;IAMrC,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,iBAAiB;IA4BzB,OAAO,CAAC,YAAY;CA4CpB"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ws/index.ts"],"names":[],"mappings":""}
package/dist/ws/index.js DELETED
@@ -1 +0,0 @@
1
- import{B as A}from"../ring-buffer.js";var l=(n=>(n.Idle="idle",n.Connecting="connecting",n.Ready="ready",n.Closing="closing",n.Closed="closed",n.Error="error",n))(l||{});class D{constructor(t,e={}){this.wantReconnect=!0,this.status=l.Closed,this.ws=null,this.reconnectTimer=null,this.abortController=null,this.attempts=0,this.givenUp=!1,this.lastActivity=Date.now(),this.stats={dropped:0,sent:0,received:0,reconnects:0,lastActivity:Date.now()},this.readyWaiters=[],this.messageHandler=null,this.url=t,this.config={connectTimeoutMs:5e3,writeTimeoutMs:1e4,retry:{baseMs:300,maxMs:1e4,multiplier:1.6,jitter:.1},maxReconnectAttempts:2,idleTimeoutMs:3e5,...e}}getUrl(){return this.url}getStatus(){return this.status}getStats(){return{...this.stats,reconnects:this.attempts,lastActivity:this.lastActivity}}getLastActivity(){return this.lastActivity}hasGivenUp(){return this.givenUp}setMessageHandler(t){this.messageHandler=t}connect(){if(this.givenUp||this.status===l.Connecting||this.status===l.Ready)return;this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.status=l.Connecting,this.abortController=new AbortController;const t=this.abortController.signal;try{this.ws=new WebSocket(this.url),this.ws.binaryType="arraybuffer";const e=()=>{this.ws&&(this.ws.onopen=null,this.ws.onclose=null,this.ws.onerror=null,this.ws.onmessage=null)},s=()=>{clearTimeout(a),this.status=l.Ready,this.attempts=0,this.givenUp=!1,this.lastActivity=Date.now(),this.stats.lastActivity=this.lastActivity,this.resolveReady(!0)},i=h=>{clearTimeout(a),e(),this.status=l.Closed,this.resolveReady(!1),h.code!==1e3&&this.scheduleReconnect()},o=h=>{clearTimeout(a),e(),this.status=l.Closed,this.resolveReady(!1),this.scheduleReconnect()},r=h=>{if(this.lastActivity=Date.now(),this.stats.lastActivity=this.lastActivity,this.stats.received++,typeof h.data=="string"){const w=h.data,f=this.extractSubId(w);this.messageHandler&&this.messageHandler(this.url,f,w)}};this.ws.onopen=s,this.ws.onclose=i,this.ws.onerror=o,this.ws.onmessage=r;const a=setTimeout(()=>{if(this.status===l.Connecting){e();try{this.ws?.close()}catch{}this.status=l.Closed,this.resolveReady(!1),this.scheduleReconnect()}},this.config.connectTimeoutMs),c=()=>{clearTimeout(a),e();try{this.ws?.close()}catch{}this.status=l.Closed,this.resolveReady(!1),this.wantReconnect&&this.scheduleReconnect()};t.addEventListener("abort",c)}catch{this.status=l.Closed,this.resolveReady(!1),this.scheduleReconnect()}}async sendMessage(t){if(this.status!==l.Ready||!this.ws)throw new Error("Connection not ready");this.ws.send(t),this.stats.sent++,this.lastActivity=Date.now(),this.stats.lastActivity=this.lastActivity}async waitForReady(t=this.config.connectTimeoutMs??5e3){if(this.status!==l.Ready)return new Promise((e,s)=>{const i=setTimeout(()=>{this.removeReadyResolver(o),s(new Error("Timeout waiting for ready"))},t),o=r=>{clearTimeout(i),r?e():s(new Error("Connection closed"))};this.readyWaiters.push(o)})}async close(){this.wantReconnect=!1,this.abortController&&this.abortController.abort(),this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.closeWebSocket(),this.status=l.Closed,this.resolveReady(!1)}shouldCloseDueToInactivity(){return Date.now()-this.lastActivity>(this.config.idleTimeoutMs??3e5)}resolveReady(t){if(this.readyWaiters.length===0)return;const e=this.readyWaiters.slice();this.readyWaiters.length=0;for(const s of e)try{s(t)}catch{}}removeReadyResolver(t){const e=this.readyWaiters.indexOf(t);e>=0&&this.readyWaiters.splice(e,1)}closeWebSocket(){if(this.ws){try{this.ws.close(1e3,"Normal closure")}catch{}this.ws=null}}scheduleReconnect(){if(!this.wantReconnect||this.status!==l.Closed||!this.config.retry?.baseMs)return;const t=this.config.maxReconnectAttempts??2;if(t>0&&this.attempts>=t){this.givenUp=!0;return}const e=this.config.retry.baseMs,s=this.config.retry.maxMs??1e4,i=this.config.retry.multiplier??1.6,o=this.config.retry.jitter??.1,r=Math.min(e*Math.pow(i,this.attempts),s)*(1+(Math.random()-.5)*o*2);this.reconnectTimer=setTimeout(()=>{this.attempts++,this.stats.reconnects=this.attempts,this.connect()},r)}extractSubId(t){let e=0;const s=t.length;for(;e<s&&t.charCodeAt(e)<=32;)e++;if(e>=s||t[e]!=="[")return null;for(e++;e<s&&t.charCodeAt(e)<=32;)e++;if(e>=s)return null;if(t[e]==='"'){for(e++;e<s&&t[e]!=='"';)e++;if(e>=s)return null;e++}else for(;e<s&&t[e]!==","&&t[e]!=="]";)e++;for(;e<s&&t[e]!==",";)e++;if(e>=s||t[e]!==",")return null;for(e++;e<s&&t.charCodeAt(e)<=32;)e++;if(e>=s)return null;if(t[e]==='"'){e++;const i=e;for(;e<s&&t[e]!=='"';)e++;return e>s?null:t.slice(i,e)}return null}}class U{constructor(t){this.connections=new Map,this.disabledRelays=new Set,this.nextAllowed=new Map,this.subCounts=new Map,this.cooldownMs=6e4,this.config={maxReconnectAttempts:2,...t}}now(){return Date.now()}detectKind(t){const e=t.match(/^\s*\[\s*"([^"]+)"/);if(!e)return"OTHER";const s=e[1].toUpperCase();return s==="REQ"?"REQ":s==="CLOSE"?"CLOSE":"OTHER"}getCount(t){return this.subCounts.get(t)??0}setCount(t,e){this.subCounts.set(t,Math.max(0,e))}bumpCount(t,e){const s=Math.max(0,this.getCount(t)+e);return this.subCounts.set(t,s),s}giveUpOrCooldown(t,e){e?.hasGivenUp()?(this.disabledRelays.has(t)||console.warn(`[registry] disabling relay ${t}: max attempts reached`),this.disabledRelays.add(t),this.nextAllowed.set(t,this.now()+this.cooldownMs)):this.nextAllowed.set(t,this.now()+Math.min(this.cooldownMs,1e4))}isCoolingDown(t){const e=this.nextAllowed.get(t)??0;return this.now()<e}async ensureConnection(t){if(t.includes("proxy"))throw new Error("Bad relay url");if(this.disabledRelays.has(t))throw new Error(`Relay disabled: ${t}`);if(this.isCoolingDown(t))throw new Error(`Relay ${t} cooling down until ${new Date(this.nextAllowed.get(t)).toISOString()}`);let e=this.connections.get(t);if(e?e.getStatus()!==l.Ready&&e.connect():(e=new D(t,this.config),this.connections.set(t,e),e.connect()),e.getStatus()!==l.Ready)try{await e.waitForReady(this.config.connectTimeoutMs??5e3)}catch(s){throw this.giveUpOrCooldown(t,e),s}if(e.getStatus()!==l.Ready)throw this.giveUpOrCooldown(t,e),new Error(`Relay ${t} not ready`);return e}async sendFrame(t,e){if(this.disabledRelays.has(t)||this.isCoolingDown(t))return;const s=this.detectKind(e),i=await this.ensureConnection(t);try{await i.sendMessage(e)}catch(o){throw this.giveUpOrCooldown(t,i),await this.disconnect(t),o}s==="REQ"?this.bumpCount(t,1):s==="CLOSE"&&this.bumpCount(t,-1)===0&&(console.log("disconnecting",t),await this.disconnect(t))}async sendAllFramesToRelay(t,e){for(const s of e)await this.sendFrame(t,s)}async sendToRelays(t,e,s=5,i=5){const o=t.filter(d=>!this.disabledRelays.has(d)&&!this.isCoolingDown(d)),r=Math.min(s,o.length);if(r===0)return;let a=0,c=0,h=0,w;const f=new Promise(d=>{w=d}),E=()=>c>=r||a>=o.length&&h===0?(w(),!0):!1,v=()=>{for(;h<i&&a<o.length&&c<r;){const d=o[a++];h++,this.sendAllFramesToRelay(d,e).then(()=>{c++}).catch(()=>{}).finally(()=>{h--,E()||v()})}};v(),await f}async disconnect(t){const e=this.connections.get(t);e&&(await e.close(),this.connections.delete(t)),this.subCounts.delete(t)}async disconnectAll(){for(const[t]of this.connections)await this.disconnect(t)}enableRelay(t){this.disabledRelays.delete(t),this.nextAllowed.delete(t)}isRelayDisabled(t){return this.disabledRelays.has(t)}getActiveReqCount(t){return this.getCount(t)}getConnectionStatus(t){const e=this.connections.get(t);return e?e.getStatus():void 0}getAllStatuses(){return new Map(Array.from(this.connections.entries()).map(([t,e])=>[t,e.getStatus()]))}}const b=new TextEncoder,T=new Map;function O(n){const t=T.get(n);if(t)return t;const e=b.encode(n);return T.set(n,e),e}function W(n,t,e){const s=O(t),i=b.encode(e),o=2+s.length+4+i.length,r=new Uint8Array(o),a=new DataView(r.buffer,r.byteOffset,r.byteLength);let c=0;a.setUint16(c,s.length,!1),c+=2,r.set(s,c),c+=s.length,a.setUint32(c,i.length,!1),c+=4,r.set(i,c),n.write(r)}function H(n){let t=0,e=n.length;for(;t<e&&n.charCodeAt(t)<=32;)t++;if(t>=e||n[t]!=="[")return null;for(t++;t<e&&n.charCodeAt(t)<=32;)t++;if(t>=e)return null;if(n[t]==='"'){for(t++;t<e&&n[t]!=='"';)t++;if(t>=e)return null;t++}else for(;t<e&&n[t]!==","&&n[t]!=="]";)t++;for(;t<e&&n[t]!==",";)t++;if(t>=e||n[t]!==",")return null;for(t++;t<e&&n.charCodeAt(t)<=32;)t++;if(t>=e)return null;if(n[t]==='"'){t++;const s=t;for(;t<e&&n[t]!=='"';)t++;return t>e?null:n.slice(s,t)}return null}let m=[],C=[],g=null;const M=new Map,L=new TextDecoder;function F(n){const t=n.includes("_")?n.split("_")[1]??"":n;let e=0;for(let s=0;s<t.length;s++)e=(e<<5)-e+t.charCodeAt(s);return Math.abs(e)%C.length}function I(n){let t=M.get(n);return t||(t=C[F(n)],M.set(n,t),t)}let S=0,u=10;const R=10,x=100;let y=null;function p(){y=setTimeout($,u)}function $(){let n=0;const t=m.length;if(t===0)return u=Math.min(u*2,x),p();let e;do{e=!1;for(let s=0;s<t;s++){const i=(S+s)%t,o=m[i].read();if(!o)continue;e=!0,n++;const r=L.decode(o);let a;try{a=JSON.parse(r)}catch{continue}!Array.isArray(a.relays)||!Array.isArray(a.frames)||(g?.sendToRelays(a.relays,a.frames).catch(console.error),S=(i+1)%t)}}while(e);u=n>0?R:Math.min(u*2,x),p()}self.addEventListener("message",n=>{const t=n.data;if(!t||t.type==="init"){m=t.payload.inRings.map(i=>new A(i)),C=t.payload.outRings.map(i=>new A(i)),g=new U(t.payload.relayConfig||{});const e=(i,o,r)=>{const a=o??H(r);a&&W(I(a),i,r)},s=g.ensureConnection.bind(g);g.ensureConnection=async i=>{const o=await s(i);return o.messageHandler||o.setMessageHandler(e),o},u=R,y!==null&&clearTimeout(y);return}if(t?.type==="wake"){u=R,y!==null&&(clearTimeout(y),y=null),p();return}});