nostr-wot-sdk 0.5.2 → 0.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/react/index.cjs +25 -3
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.js +25 -3
- package/dist/react/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
package/dist/index.js
CHANGED
package/dist/react/index.cjs
CHANGED
|
@@ -91,7 +91,7 @@ function chunk(array, size) {
|
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
// src/wot.ts
|
|
94
|
-
var DEFAULT_EXTENSION_ID = "";
|
|
94
|
+
var DEFAULT_EXTENSION_ID = "gfmefgdkmjpjinecjchlangpamhclhdo";
|
|
95
95
|
var WoT = class {
|
|
96
96
|
constructor(options = {}) {
|
|
97
97
|
this.extension = null;
|
|
@@ -629,8 +629,30 @@ function WoTProvider({
|
|
|
629
629
|
setIsReady(true);
|
|
630
630
|
}, []);
|
|
631
631
|
react.useEffect(() => {
|
|
632
|
-
|
|
633
|
-
|
|
632
|
+
if (checkExtensionAvailable()) {
|
|
633
|
+
setExtensionState("connected");
|
|
634
|
+
setIsReady(true);
|
|
635
|
+
return;
|
|
636
|
+
}
|
|
637
|
+
let attempts = 0;
|
|
638
|
+
const maxAttempts = 15;
|
|
639
|
+
const intervalMs = 100;
|
|
640
|
+
const intervalId = setInterval(() => {
|
|
641
|
+
attempts++;
|
|
642
|
+
if (checkExtensionAvailable()) {
|
|
643
|
+
setExtensionState("connected");
|
|
644
|
+
setIsReady(true);
|
|
645
|
+
clearInterval(intervalId);
|
|
646
|
+
return;
|
|
647
|
+
}
|
|
648
|
+
if (attempts >= maxAttempts) {
|
|
649
|
+
setExtensionState("not-available");
|
|
650
|
+
setIsReady(true);
|
|
651
|
+
clearInterval(intervalId);
|
|
652
|
+
}
|
|
653
|
+
}, intervalMs);
|
|
654
|
+
return () => clearInterval(intervalId);
|
|
655
|
+
}, []);
|
|
634
656
|
const wot = react.useMemo(() => {
|
|
635
657
|
if (!isReady) {
|
|
636
658
|
return null;
|
package/dist/react/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/errors.ts","../../src/utils.ts","../../src/wot.ts","../../src/react/context.tsx","../../src/react/hooks.ts"],"names":["e","maxHops","results","createContext","useState","useCallback","useEffect","useMemo","jsx","useContext","useRef"],"mappings":";;;;;;;;AAGO,IAAM,QAAA,GAAN,cAAuB,KAAA,CAAM;AAAA,EAClC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AAEZ,IAAA,IAAI,MAAM,iBAAA,EAAmB;AAC3B,MAAA,KAAA,CAAM,iBAAA,CAAkB,IAAA,EAAM,IAAA,CAAK,WAAW,CAAA;AAAA,IAChD;AAEA,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AACF,CAAA;AAKO,IAAM,YAAA,GAAN,cAA2B,QAAA,CAAS;AAAA,EAIzC,WAAA,CAAY,OAAA,EAAiB,UAAA,EAAqB,GAAA,EAAc;AAC9D,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AACZ,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AACF,CAAA;AAKO,IAAM,aAAA,GAAN,cAA4B,QAAA,CAAS;AAAA,EAG1C,WAAA,CAAY,QAAgB,OAAA,EAAkB;AAC5C,IAAA,KAAA,CAAM,OAAA,IAAW,CAAA,2BAAA,EAA8B,MAAM,CAAA,CAAE,CAAA;AACvD,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AACF,CAAA;AAKO,IAAM,YAAA,GAAN,cAA2B,QAAA,CAAS;AAAA,EAGzC,WAAA,CAAY,SAAiB,OAAA,EAAkB;AAC7C,IAAA,KAAA,CAAM,OAAA,IAAW,CAAA,wBAAA,EAA2B,OAAO,CAAA,EAAA,CAAI,CAAA;AACvD,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AACF,CAAA;AAKO,IAAM,eAAA,GAAN,cAA8B,QAAA,CAAS;AAAA,EAG5C,WAAA,CAAY,SAAiB,KAAA,EAAgB;AAC3C,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AACF,CAAA;;;ACrEO,IAAM,cAAA,GAAiB,uBAAA;AAKvB,IAAM,gBAAA,GAAmB,CAAA;AAKzB,IAAM,eAAA,GAAkB,GAAA;AAKxB,SAAS,cAAc,MAAA,EAAyB;AACrD,EAAA,OAAO,iBAAA,CAAkB,KAAK,MAAM,CAAA;AACtC;AAKO,SAAS,iBAAiB,GAAA,EAAsB;AACrD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,OAAO,OAAO,QAAA,KAAa,QAAA;AAAA,EAC7B,CAAA,CAAA,OAAQ,CAAA,EAAA;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAKO,IAAM,cAAA,GAAiB,GAAA;AAKvB,SAAS,gBAAgB,MAAA,EAAwB;AACtD,EAAA,OAAO,OAAO,WAAA,EAAY;AAC5B;AAKA,eAAsB,gBAAA,CACpB,GAAA,EACA,OAAA,GAA8C,EAAC,EAC5B;AACnB,EAAA,MAAM,EAAE,OAAA,GAAU,eAAA,EAAiB,GAAG,cAAa,GAAI,OAAA;AAEvD,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,OAAO,CAAA;AAE9D,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,MAAM,GAAA,EAAK;AAAA,MACtB,GAAG,YAAA;AAAA,MACH,QAAQ,UAAA,CAAW;AAAA,KACpB,CAAA;AAAA,EACH,CAAA,SAAE;AACA,IAAA,YAAA,CAAa,SAAS,CAAA;AAAA,EACxB;AACF;AAYO,SAAS,KAAA,CAAS,OAAY,IAAA,EAAqB;AACxD,EAAA,MAAM,SAAgB,EAAC;AACvB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,IAAA,EAAM;AAC3C,IAAA,MAAA,CAAO,KAAK,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,MAAA;AACT;;;ACjEA,IAAM,oBAAA,GAAuB,EAAA;AA2BtB,IAAM,MAAN,MAAU;AAAA,EAUf,WAAA,CAAY,OAAA,GAAsB,EAAC,EAAG;AAHtC,IAAA,IAAA,CAAQ,SAAA,GAAsC,IAAA;AAC9C,IAAA,IAAA,CAAQ,eAAA,GAAiC,IAAA;AAtD3C,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAyDI,IAAA,IAAA,CAAK,eAAA,GAAA,CAAkB,EAAA,GAAA,OAAA,CAAQ,QAAA,KAAR,IAAA,GAAA,EAAA,GAAoB,IAAA;AAC3C,IAAA,IAAA,CAAK,WAAA,GAAA,CAAc,EAAA,GAAA,OAAA,CAAQ,WAAA,KAAR,IAAA,GAAA,EAAA,GAAuB,oBAAA;AAG1C,IAAA,IAAI,OAAA,CAAQ,QAAA,IAAY,aAAA,CAAc,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACvD,MAAA,IAAA,CAAK,cAAA,GAAiB,eAAA,CAAgB,OAAA,CAAQ,QAAQ,CAAA;AAAA,IACxD,CAAA,MAAA,IAAA,CAAW,EAAA,GAAA,IAAA,CAAK,eAAA,KAAL,IAAA,GAAA,MAAA,GAAA,EAAA,CAAsB,QAAA,EAAU;AACzC,MAAA,IAAA,CAAK,cAAA,GAAiB,eAAA,CAAgB,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AAAA,IACrE,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IACxB;AAEA,IAAA,MAAM,SAAA,GAAA,CAAY,mBAAQ,MAAA,KAAR,IAAA,GAAA,EAAA,GAAA,CAAkB,UAAK,eAAA,KAAL,IAAA,GAAA,MAAA,GAAA,EAAA,CAAsB,WAAxC,IAAA,GAAA,EAAA,GAAkD,cAAA;AACpE,IAAA,IAAI,CAAC,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAChC,MAAA,MAAM,IAAI,eAAA,CAAgB,kCAAA,EAAoC,QAAQ,CAAA;AAAA,IACxE;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAA,CAAU,mBAAQ,OAAA,KAAR,IAAA,GAAA,EAAA,GAAA,CAAmB,UAAK,eAAA,KAAL,IAAA,GAAA,MAAA,GAAA,EAAA,CAAsB,YAAzC,IAAA,GAAA,EAAA,GAAoD,gBAAA;AACnE,IAAA,IAAA,CAAK,OAAA,GAAA,CAAU,mBAAQ,OAAA,KAAR,IAAA,GAAA,EAAA,GAAA,CAAmB,UAAK,eAAA,KAAL,IAAA,GAAA,MAAA,GAAA,EAAA,CAAsB,YAAzC,IAAA,GAAA,EAAA,GAAoD,eAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,YAAA,GAAkD;AAnFlE,IAAA,IAAA,EAAA,EAAA,EAAA;AAqFI,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,IAAA;AAE1C,IAAA,MAAM,GAAA,GAAM,MAAA;AAGZ,IAAA,IAAA,CAAI,EAAA,GAAA,GAAA,CAAI,KAAA,KAAJ,IAAA,GAAA,MAAA,GAAA,EAAA,CAAW,GAAA,EAAK;AAClB,MAAA,IAAA,CAAK,SAAA,GAAY,IAAI,KAAA,CAAM,GAAA;AAG3B,MAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACzB,QAAA,IAAI;AACF,UAAA,IAAA,CAAK,eAAA,GAAkB,MAAM,IAAA,CAAK,SAAA,CAAU,WAAA,EAAY;AAAA,QAC1D,CAAA,CAAA,OAAQ,CAAA,EAAA;AAEN,UAAA,IAAA,CAAI,EAAA,GAAA,GAAA,CAAI,KAAA,KAAJ,IAAA,GAAA,MAAA,GAAA,EAAA,CAAW,YAAA,EAAc;AAC3B,YAAA,IAAI;AACF,cAAA,IAAA,CAAK,eAAA,GAAkB,MAAM,GAAA,CAAI,KAAA,CAAM,YAAA,EAAa;AAAA,YACtD,SAAQA,EAAAA,EAAA;AAAA,YAER;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,OAAO,IAAA,CAAK,SAAA;AAAA,IACd;AAGA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBAAA,GAAsC;AAElD,IAAA,MAAM,KAAK,YAAA,EAAa;AAGxB,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,OAAO,IAAA,CAAK,eAAA;AAAA,IACd;AAGA,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,OAAO,IAAA,CAAK,cAAA;AAAA,IACd;AAEA,IAAA,MAAM,IAAI,eAAA;AAAA,MACR,6FAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,UAAA,CACZ,QAAA,EACA,OAAA,GAAwB,EAAC,EACb;AAlJhB,IAAA,IAAA,EAAA;AAmJI,IAAA,MAAM,OAAA,GAAA,CAAU,EAAA,GAAA,OAAA,CAAQ,OAAA,KAAR,IAAA,GAAA,EAAA,GAAmB,IAAA,CAAK,OAAA;AACxC,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,MAAM,OAAO,QAAQ,CAAA,CAAA;AAEzC,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,iBAAiB,GAAA,EAAK;AAAA,QACrC,OAAA;AAAA,QACA,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB;AAAA;AAClB,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,QAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC/B,UAAA,MAAM,IAAI,aAAa,OAAO,CAAA;AAAA,QAChC;AACA,QAAA,MAAM,IAAI,YAAA,CAAa,KAAA,CAAM,OAAA,EAAS,QAAW,GAAG,CAAA;AAAA,MACtD;AACA,MAAA,MAAM,IAAI,YAAA,CAAa,uBAAA,EAAyB,MAAA,EAAW,GAAG,CAAA;AAAA,IAChE;AAEA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,QAAA,MAAM,IAAI,aAAA,CAAc,EAAA,EAAI,CAAA,oBAAA,EAAuB,QAAQ,CAAA,CAAE,CAAA;AAAA,MAC/D;AACA,MAAA,MAAM,IAAI,YAAA;AAAA,QACR,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,SAAS,UAAU,CAAA,CAAA;AAAA,QAC/C,QAAA,CAAS,MAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAQ,MAAM,SAAS,IAAA,EAAK;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA,CAAe,QAAgB,SAAA,EAA2B;AAChE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,eAAA,CAAgB,CAAA,EAAG,SAAS,gBAAgB,SAAS,CAAA;AAAA,IACjE;AACA,IAAA,IAAI,CAAC,aAAA,CAAc,MAAM,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,GAAG,SAAS,CAAA,wCAAA,CAAA;AAAA,QACZ;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,gBAAgB,MAAM,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAA,CACJ,MAAA,EACA,OAAA,EACwB;AA/M5B,IAAA,IAAA,EAAA;AAgNI,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,QAAQ,CAAA;AAG7D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,YAAA,EAAa;AACpC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAO,GAAA,CAAI,YAAY,gBAAgB,CAAA;AAAA,IACzC;AAGA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,kBAAA,EAAmB;AAC/C,IAAA,MAAM,OAAA,GAAA,CAAU,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,OAAA,KAAT,IAAA,GAAA,EAAA,GAAoB,IAAA,CAAK,OAAA;AAMzC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA;AAAA,QACxB,CAAA,UAAA,EAAa,QAAQ,CAAA,CAAA,EAAI,gBAAgB,YAAY,OAAO,CAAA,CAAA;AAAA,QAC5D;AAAA,OACF;AACA,MAAA,OAAO,MAAA,CAAO,QAAA;AAAA,IAChB,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,aAAA,EAAe;AAClC,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,SAAA,CAAU,MAAA,EAAgB,OAAA,EAA0C;AApP5E,IAAA,IAAA,EAAA,EAAA,EAAA;AAqPI,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,QAAQ,CAAA;AAG7D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,YAAA,EAAa;AACpC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAMC,QAAAA,GAAAA,CAAU,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,OAAA,KAAT,IAAA,GAAA,EAAA,GAAoB,IAAA,CAAK,OAAA;AACzC,MAAA,OAAO,GAAA,CAAI,SAAA,CAAU,gBAAA,EAAkBA,QAAO,CAAA;AAAA,IAChD;AAGA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAAY,kBAAkB,OAAO,CAAA;AACjE,IAAA,MAAM,OAAA,GAAA,CAAU,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,OAAA,KAAT,IAAA,GAAA,EAAA,GAAoB,IAAA,CAAK,OAAA;AAEzC,IAAA,OAAO,QAAA,KAAa,QAAQ,QAAA,IAAY,OAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAc,MAAA,EAAiC;AACnD,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,QAAQ,CAAA;AAG7D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,YAAA,EAAa;AACpC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,CAAI,aAAA,CAAc,gBAAgB,CAAA;AACtD,MAAA,OAAO,KAAA,IAAA,IAAA,GAAA,KAAA,GAAS,CAAA;AAAA,IAClB;AAGA,IAAA,OAAO,CAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,kBAAA,CACJ,IAAA,EACA,EAAA,EACA,OAAA,EACwB;AAnS5B,IAAA,IAAA,EAAA;AAoSI,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,MAAM,CAAA;AACvD,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,cAAA,CAAe,EAAA,EAAI,IAAI,CAAA;AAGjD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,YAAA,EAAa;AACpC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAO,GAAA,CAAI,kBAAA,CAAmB,cAAA,EAAgB,YAAY,CAAA;AAAA,IAC5D;AAGA,IAAA,MAAM,OAAA,GAAA,CAAU,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,OAAA,KAAT,IAAA,GAAA,EAAA,GAAoB,IAAA,CAAK,OAAA;AAMzC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA;AAAA,QACxB,CAAA,UAAA,EAAa,cAAc,CAAA,CAAA,EAAI,YAAY,YAAY,OAAO,CAAA,CAAA;AAAA,QAC9D;AAAA,OACF;AACA,MAAA,OAAO,MAAA,CAAO,QAAA;AAAA,IAChB,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,aAAA,EAAe;AAClC,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,UAAA,CACJ,OAAA,EACA,OAAA,EACmC;AA3UvC,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA4UI,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,IAAK,OAAA,CAAQ,WAAW,CAAA,EAAG;AACnD,MAAA,MAAM,IAAI,eAAA,CAAgB,mCAAA,EAAqC,SAAS,CAAA;AAAA,IAC1E;AACA,IAAA,IAAI,OAAA,CAAQ,SAAS,cAAA,EAAgB;AACnC,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,yCAAyC,cAAc,CAAA,CAAA;AAAA,QACvD;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,oBAAoB,OAAA,CAAQ,GAAA;AAAA,MAAI,CAAC,GAAG,CAAA,KACxC,IAAA,CAAK,eAAe,CAAA,EAAG,CAAA,QAAA,EAAW,CAAC,CAAA,CAAA,CAAG;AAAA,KACxC;AAEA,IAAA,MAAM,OAAA,GAAA,CAAU,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,OAAA,KAAT,IAAA,GAAA,EAAA,GAAoB,IAAA,CAAK,OAAA;AAGzC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,YAAA,EAAa;AACpC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAMC,QAAAA,uBAAc,GAAA,EAAyB;AAG7C,MAAA,MAAM,CAAC,SAAA,EAAW,MAAM,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,QAC5C,GAAA,CAAI,iBAAiB,iBAAiB,CAAA;AAAA,QACtC,GAAA,CAAI,mBAAmB,iBAAiB;AAAA,OACzC,CAAA;AAED,MAAA,KAAA,MAAW,UAAU,iBAAA,EAAmB;AACtC,QAAA,MAAM,QAAA,GAAA,CAAW,EAAA,GAAA,SAAA,CAAU,MAAM,CAAA,KAAhB,IAAA,GAAA,EAAA,GAAqB,IAAA;AACtC,QAAA,MAAM,KAAA,GAAA,CAAQ,EAAA,GAAA,MAAA,CAAO,MAAM,CAAA,KAAb,IAAA,GAAA,EAAA,GAAkB,CAAA;AAEhC,QAAAA,QAAAA,CAAQ,IAAI,MAAA,EAAQ;AAAA,UAClB,MAAA;AAAA,UACA,QAAA;AAAA,UACA,KAAA;AAAA,UACA,KAAA,EAAO,QAAA,KAAa,IAAA,IAAQ,QAAA,IAAY;AAAA,SACzC,CAAA;AAAA,MACH;AAEA,MAAA,OAAOA,QAAAA;AAAA,IACT;AAGA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,kBAAA,EAAmB;AAC/C,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAyB;AAG7C,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,iBAAA,EAAmB,EAAE,CAAA;AAE3C,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAU3B,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA;AAAA,UAC1B,CAAA,OAAA,EAAU,QAAQ,CAAA,SAAA,EAAY,KAAA,CAAM,KAAK,GAAG,CAAC,YAAY,OAAO,CAAA,CAAA;AAAA,UAChE;AAAA,SACF;AAEA,QAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,OAAA,EAAS;AACnC,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,KAAa,IAAA,IAAQ,KAAK,QAAA,IAAY,OAAA;AAEzD,UAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,MAAA,EAAQ;AAAA,YACvB,QAAQ,IAAA,CAAK,MAAA;AAAA,YACb,UAAU,IAAA,CAAK,QAAA;AAAA,YACf,KAAA,EAAO,CAAA;AAAA;AAAA,YACP;AAAA,WACD,CAAA;AAAA,QACH;AAAA,MACF,SAAS,KAAA,EAAO;AAEd,QAAA,KAAA,MAAW,UAAU,KAAA,EAAO;AAC1B,UAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG;AACxB,YAAA,OAAA,CAAQ,IAAI,MAAA,EAAQ;AAAA,cAClB,MAAA;AAAA,cACA,QAAA,EAAU,IAAA;AAAA,cACV,KAAA,EAAO,CAAA;AAAA,cACP,KAAA,EAAO;AAAA,aACR,CAAA;AAAA,UACH;AAAA,QACF;AAGA,QAAA,IAAI,EAAE,iBAAiB,YAAA,CAAA,EAAe;AACpC,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,UAAA,CACJ,MAAA,EACA,OAAA,EACgC;AA1bpC,IAAA,IAAA,EAAA;AA2bI,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,QAAQ,CAAA;AAG7D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,YAAA,EAAa;AACpC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAO,GAAA,CAAI,WAAW,gBAAgB,CAAA;AAAA,IACxC;AAGA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,kBAAA,EAAmB;AAC/C,IAAA,MAAM,OAAA,GAAA,CAAU,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,OAAA,KAAT,IAAA,GAAA,EAAA,GAAoB,IAAA,CAAK,OAAA;AASzC,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA;AAAA,QAC1B,CAAA,SAAA,EAAY,QAAQ,CAAA,CAAA,EAAI,gBAAgB,YAAY,OAAO,CAAA,CAAA;AAAA,QAC3D;AAAA,OACF;AAEA,MAAA,OAAO,EAAE,GAAG,QAAA,EAAU,KAAA,EAAO,CAAA,EAAE;AAAA,IACjC,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,aAAA,EAAe;AAClC,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAA,GAA+B;AACnC,IAAA,OAAO,KAAK,kBAAA,EAAmB;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAoB;AAClB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,GAAqC;AACzC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,YAAA,EAAa;AACpC,IAAA,OAAO,GAAA,KAAQ,IAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,kBAAA,GAAyD;AAzfjE,IAAA,IAAA,EAAA;AA2fI,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,OAAO,aAAA;AAAA,IACT;AAGA,IAAA,IAAA,CAAK,EAAA,GAAA,MAAA,CAAuB,KAAA,KAAvB,IAAA,GAAA,MAAA,GAAA,EAAA,CAA8B,GAAA,EAAK;AACtC,MAAA,OAAO,WAAA;AAAA,IACT;AAGA,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,MAAM,KAAA;AAAA,UACrB,CAAA,mBAAA,EAAsB,KAAK,WAAW,CAAA,YAAA,CAAA;AAAA,UACtC,EAAE,QAAQ,MAAA;AAAO,SACnB;AACA,QAAA,IAAI,SAAS,EAAA,EAAI;AACf,UAAA,OAAO,aAAA;AAAA,QACT;AAAA,MACF,CAAA,CAAA,OAAQ,CAAA,EAAA;AAAA,MAER;AAAA,IACF;AAEA,IAAA,OAAO,aAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,kBAAA,GAAsD;AAC1D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,YAAA,EAAa;AACpC,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,IAAA,OAAO,IAAI,SAAA,EAAU;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,YAAA,GAAgD;AACpD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,YAAA,EAAa;AACpC,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,IAAA,OAAO,IAAI,YAAA,EAAa;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,WAAA,CACJ,OAAA,EACA,OAAA,EACmB;AA3jBvB,IAAA,IAAA,EAAA;AA4jBI,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,IAAK,OAAA,CAAQ,WAAW,CAAA,EAAG;AACnD,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,iBAAA,GAAoB,OAAA,CACvB,MAAA,CAAO,CAAC,OAAO,aAAA,CAAc,EAAE,CAAC,CAAA,CAChC,GAAA,CAAI,CAAC,EAAA,KAAO,eAAA,CAAgB,EAAE,CAAC,CAAA;AAElC,IAAA,MAAM,OAAA,GAAA,CAAU,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,OAAA,KAAT,IAAA,GAAA,EAAA,GAAoB,IAAA,CAAK,OAAA;AAGzC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,YAAA,EAAa;AACpC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAO,GAAA,CAAI,WAAA,CAAY,iBAAA,EAAmB,OAAO,CAAA;AAAA,IACnD;AAGA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,mBAAmB,OAAO,CAAA;AAChE,IAAA,OAAO,KAAA,CAAM,KAAK,OAAA,CAAQ,OAAA,EAAS,CAAA,CAChC,MAAA,CAAO,CAAC,GAAG,MAAM,CAAA,KAAM,MAAA,CAAO,KAAK,CAAA,CACnC,GAAA,CAAI,CAAC,CAAC,MAAM,MAAM,MAAM,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,WAAW,MAAA,EAAoC;AACnD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,YAAA,EAAa;AACpC,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAElB,IAAA,MAAM,mBAAmB,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,QAAQ,CAAA,GAAI,MAAA;AAC1E,IAAA,OAAO,GAAA,CAAI,WAAW,gBAAgB,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,iBAAiB,MAAA,EAAmC;AACxD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,YAAA,EAAa;AACpC,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAElB,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,QAAQ,CAAA;AAC7D,IAAA,OAAO,GAAA,CAAI,iBAAiB,gBAAgB,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,QAAA,GAAuC;AAC3C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,YAAA,EAAa;AACpC,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,QAAQ,MAAA,EAA0C;AACtD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,YAAA,EAAa;AACpC,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,QAAQ,CAAA;AAC7D,IAAA,OAAO,GAAA,CAAI,QAAQ,gBAAgB,CAAA;AAAA,EACrC;AAAA,EAgCA,MAAM,gBAAA,CACJ,OAAA,EACA,OAAA,GAA0C,KAAA,EACiD;AAC3F,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,IAAK,OAAA,CAAQ,WAAW,CAAA,EAAG;AACnD,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,oBAAoB,OAAA,CAAQ,GAAA;AAAA,MAAI,CAAC,GAAG,CAAA,KACxC,IAAA,CAAK,eAAe,CAAA,EAAG,CAAA,QAAA,EAAW,CAAC,CAAA,CAAA,CAAG;AAAA,KACxC;AAGA,IAAA,MAAM,IAAA,GACJ,OAAO,OAAA,KAAY,SAAA,GACf,EAAE,YAAA,EAAc,OAAA,EAAQ,GACxB,OAAA,IAAW,EAAC;AAElB,IAAA,MAAM,EAAE,YAAA,EAAc,aAAA,EAAc,GAAI,IAAA;AAGxC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,YAAA,EAAa;AACpC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAO,GAAA,CAAI,gBAAA,CAAiB,iBAAA,EAAmB,IAAI,CAAA;AAAA,IACrD;AAGA,IAAA,IAAI,gBAAgB,aAAA,EAAe;AACjC,MAAA,MAAMA,WAAmF,EAAC;AAC1F,MAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,QACZ,iBAAA,CAAkB,GAAA,CAAI,OAAO,MAAA,KAAW;AACtC,UAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AAC5C,UAAA,IAAI,CAAC,OAAA,EAAS;AACZ,YAAAA,QAAAA,CAAQ,MAAM,CAAA,GAAI,IAAA;AAClB,YAAA;AAAA,UACF;AACA,UAAA,MAAM,MAAA,GAA2D,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK;AACtF,UAAA,IAAI,YAAA,EAAc,MAAA,CAAO,KAAA,GAAQ,OAAA,CAAQ,KAAA;AACzC,UAAA,IAAI,aAAA,EAAe,MAAA,CAAO,KAAA,GAAQ,OAAA,CAAQ,KAAA;AAC1C,UAAAA,QAAAA,CAAQ,MAAM,CAAA,GAAI,MAAA;AAAA,QACpB,CAAC;AAAA,OACH;AACA,MAAA,OAAOA,QAAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAyC,EAAC;AAChD,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,iBAAA,CAAkB,GAAA,CAAI,OAAO,MAAA,KAAW;AACtC,QAAA,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAM,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,MACjD,CAAC;AAAA,KACH;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,mBACJ,OAAA,EACwC;AACxC,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,IAAK,OAAA,CAAQ,WAAW,CAAA,EAAG;AACnD,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,oBAAoB,OAAA,CAAQ,GAAA;AAAA,MAAI,CAAC,GAAG,CAAA,KACxC,IAAA,CAAK,eAAe,CAAA,EAAG,CAAA,QAAA,EAAW,CAAC,CAAA,CAAA,CAAG;AAAA,KACxC;AAGA,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,YAAA,EAAa;AACpC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAO,GAAA,CAAI,mBAAmB,iBAAiB,CAAA;AAAA,IACjD;AAGA,IAAA,MAAM,UAAyC,EAAC;AAChD,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,iBAAA,CAAkB,GAAA,CAAI,OAAO,MAAA,KAAW;AACtC,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA;AAC7C,QAAA,OAAA,CAAQ,MAAM,CAAA,GAAI,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,IAAA;AAAA,MACxC,CAAC;AAAA,KACH;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AACF;ACxsBA,IAAM,UAAA,GAAaC,oBAAsC,IAAI,CAAA;AAmB7D,SAAS,uBAAA,GAAmC;AA7E5C,EAAA,IAAA,EAAA;AA8EE,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAC1C,EAAA,OAAO,CAAC,EAAA,CAAE,EAAA,GAAA,MAAA,CAAuB,KAAA,KAAvB,IAAA,GAAA,MAAA,GAAA,EAAA,CAA8B,GAAA,CAAA;AAC1C;AAiCO,SAAS,WAAA,CAAY;AAAA,EAC1B,UAAU,EAAC;AAAA,EACX;AACF,CAAA,EAAqB;AApHrB,EAAA,IAAA,EAAA,EAAA,EAAA;AAqHE,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIC,eAAmC,UAAU,CAAA;AACzF,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,KAAK,CAAA;AAG5C,EAAA,MAAM,cAAA,GAAiBC,kBAAY,MAAM;AACvC,IAAA,MAAM,YAAY,uBAAA,EAAwB;AAC1C,IAAA,iBAAA,CAAkB,SAAA,GAAY,cAAc,eAAe,CAAA;AAC3D,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,cAAA,EAAe;AAAA,EACjB,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAGnB,EAAA,MAAM,GAAA,GAAMC,cAAQ,MAAM;AACxB,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,OAAO,IAAI,IAAI,OAAO,CAAA;AAAA,IACxB,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,+CAA+C,KAAK,CAAA;AAClE,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG;AAAA,IACD,OAAA;AAAA,IACA,OAAA,CAAQ,MAAA;AAAA,IACR,OAAA,CAAQ,QAAA;AAAA,IACR,OAAA,CAAQ,OAAA;AAAA,IACR,OAAA,CAAQ,OAAA;AAAA,IAAA,CACR,EAAA,GAAA,OAAA,CAAQ,aAAR,IAAA,GAAA,MAAA,GAAA,EAAA,CAAkB,QAAA;AAAA,IAAA,CAClB,EAAA,GAAA,OAAA,CAAQ,aAAR,IAAA,GAAA,MAAA,GAAA,EAAA,CAAkB;AAAA,GACnB,CAAA;AAGD,EAAA,MAAM,SAAA,GAAYA,cAAwB,MAAM;AAC9C,IAAA,MAAM,cAAc,cAAA,KAAmB,WAAA;AACvC,IAAA,MAAM,aAAa,cAAA,KAAmB,UAAA;AACtC,IAAA,MAAM,YAAY,cAAA,KAAmB,UAAA;AAErC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,cAAA;AAAA,MACP,WAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA,EAAS;AAAA,KACX;AAAA,EACF,CAAA,EAAG,CAAC,cAAA,EAAgB,cAAc,CAAC,CAAA;AAEnC,EAAA,MAAM,KAAA,GAAQA,aAAA;AAAA,IACZ,OAAO;AAAA,MACL,GAAA;AAAA,MACA,OAAA,EAAS,WAAW,GAAA,KAAQ,IAAA;AAAA,MAC5B;AAAA,KACF,CAAA;AAAA,IACA,CAAC,GAAA,EAAK,OAAA,EAAS,SAAS;AAAA,GAC1B;AAEA,EAAA,uBAAOC,cAAA,CAAC,UAAA,CAAW,QAAA,EAAX,EAAoB,OAAe,QAAA,EAAS,CAAA;AACtD;AAQO,SAAS,aAAA,GAAiC;AAC/C,EAAA,MAAM,OAAA,GAAUC,iBAAW,UAAU,CAAA;AAErC,EAAA,IAAI,YAAY,IAAA,EAAM;AACpB,IAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,EACnE;AAEA,EAAA,OAAO,OAAA;AACT;AAOO,SAAS,cAAA,GAA6B;AAC3C,EAAA,MAAM,EAAE,GAAA,EAAI,GAAI,aAAA,EAAc;AAC9B,EAAA,OAAO,GAAA;AACT;AAkBO,SAAS,YAAA,GAA+B;AAC7C,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,aAAA,EAAc;AACpC,EAAA,OAAO,SAAA;AACT;AC5JO,SAAS,MAAA,CAAO,QAAgB,OAAA,EAAuC;AAtE9E,EAAA,IAAA,EAAA;AAuEE,EAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAQ,GAAI,aAAA,EAAc;AACvC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIL,eAAwB,IAAI,CAAA;AAC5D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAS,CAAC,CAAA;AACpC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAgC,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,UAAA,GAAaM,aAAO,CAAC,CAAA;AAE3B,EAAA,MAAM,IAAA,GAAA,CAAO,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,IAAA,KAAT,IAAA,GAAA,EAAA,GAAiB,KAAA;AAE9B,EAAA,MAAM,SAAA,GAAYL,kBAAY,YAAY;AACxC,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,MAAA,IAAU,IAAA,EAAM;AAC3B,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,EAAE,UAAA,CAAW,OAAA;AAC7B,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,CAAC,UAAA,EAAY,WAAA,EAAa,aAAa,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,QACjE,GAAA,CAAI,WAAA,CAAY,MAAA,EAAQ,OAAO,CAAA;AAAA,QAC/B,GAAA,CAAI,cAAc,MAAM,CAAA;AAAA,QACxB,GAAA,CAAI,UAAA,CAAW,MAAA,EAAQ,OAAO;AAAA,OAC/B,CAAA;AAGD,MAAA,IAAI,OAAA,KAAY,WAAW,OAAA,EAAS;AAClC,QAAA,WAAA,CAAY,UAAU,CAAA;AACtB,QAAA,QAAA,CAAS,WAAW,CAAA;AACpB,QAAA,UAAA,CAAW,aAAa,CAAA;AACxB,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,OAAA,KAAY,WAAW,OAAA,EAAS;AAClC,QAAA,QAAA,CAAS,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,eAAe,CAAC,CAAA;AAChE,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,MAAA,EAAQ,MAAM,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,OAAA,EAAS,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,OAAO,CAAC,CAAA;AAE1D,EAAAC,gBAAU,MAAM;AACd,IAAA,IAAI,OAAA,IAAW,CAAC,IAAA,EAAM;AACpB,MAAA,SAAA,EAAU;AAAA,IACZ;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,SAAA,EAAW,IAAI,CAAC,CAAA;AAE7B,EAAA,MAAM,OAAA,GAAUD,kBAAY,MAAM;AAChC,IAAA,SAAA,EAAU;AAAA,EACZ,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;AA0CO,SAAS,UAAA,CACd,QACA,OAAA,EACkB;AAhLpB,EAAA,IAAA,EAAA;AAiLE,EAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAQ,GAAI,aAAA,EAAc;AACvC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAID,eAAS,KAAK,CAAA;AACxC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,UAAA,GAAaM,aAAO,CAAC,CAAA;AAE3B,EAAA,MAAM,IAAA,GAAA,CAAO,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,IAAA,KAAT,IAAA,GAAA,EAAA,GAAiB,KAAA;AAE9B,EAAA,MAAM,SAAA,GAAYL,kBAAY,YAAY;AACxC,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,MAAA,IAAU,IAAA,EAAM;AAC3B,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,EAAE,UAAA,CAAW,OAAA;AAC7B,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,SAAA,CAAU,QAAQ,OAAO,CAAA;AAElD,MAAA,IAAI,OAAA,KAAY,WAAW,OAAA,EAAS;AAClC,QAAA,QAAA,CAAS,MAAM,CAAA;AACf,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,OAAA,KAAY,WAAW,OAAA,EAAS;AAClC,QAAA,QAAA,CAAS,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,eAAe,CAAC,CAAA;AAChE,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,MAAA,EAAQ,MAAM,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,OAAA,EAAS,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,OAAO,CAAC,CAAA;AAE1D,EAAAC,gBAAU,MAAM;AACd,IAAA,IAAI,OAAA,IAAW,CAAC,IAAA,EAAM;AACpB,MAAA,SAAA,EAAU;AAAA,IACZ;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,SAAA,EAAW,IAAI,CAAC,CAAA;AAE7B,EAAA,MAAM,OAAA,GAAUD,kBAAY,MAAM;AAChC,IAAA,SAAA,EAAU;AAAA,EACZ,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;AA0CO,SAAS,aAAA,CACd,QACA,OAAA,EACqB;AA/QvB,EAAA,IAAA,EAAA;AAgRE,EAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAQ,GAAI,aAAA,EAAc;AACvC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAID,eAAS,CAAC,CAAA;AACpC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,UAAA,GAAaM,aAAO,CAAC,CAAA;AAE3B,EAAA,MAAM,IAAA,GAAA,CAAO,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,IAAA,KAAT,IAAA,GAAA,EAAA,GAAiB,KAAA;AAE9B,EAAA,MAAM,SAAA,GAAYL,kBAAY,YAAY;AACxC,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,MAAA,IAAU,IAAA,EAAM;AAC3B,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,EAAE,UAAA,CAAW,OAAA;AAC7B,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,aAAA,CAAc,MAAM,CAAA;AAE7C,MAAA,IAAI,OAAA,KAAY,WAAW,OAAA,EAAS;AAClC,QAAA,QAAA,CAAS,MAAM,CAAA;AACf,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,OAAA,KAAY,WAAW,OAAA,EAAS;AAClC,QAAA,QAAA,CAAS,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,eAAe,CAAC,CAAA;AAChE,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,MAAA,EAAQ,IAAI,CAAC,CAAA;AAEtB,EAAAC,gBAAU,MAAM;AACd,IAAA,IAAI,OAAA,IAAW,CAAC,IAAA,EAAM;AACpB,MAAA,SAAA,EAAU;AAAA,IACZ;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,SAAA,EAAW,IAAI,CAAC,CAAA;AAE7B,EAAA,MAAM,OAAA,GAAUD,kBAAY,MAAM;AAChC,IAAA,SAAA,EAAU;AAAA,EACZ,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;AA0DO,SAAS,WAAA,CACd,SACA,OAAA,EACmB;AA9XrB,EAAA,IAAA,EAAA;AA+XE,EAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAQ,GAAI,aAAA,EAAc;AACvC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAID,cAAAA;AAAA,wBACxB,GAAA;AAAI,GACV;AACA,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,UAAA,GAAaM,aAAO,CAAC,CAAA;AAE3B,EAAA,MAAM,IAAA,GAAA,CAAO,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,IAAA,KAAT,IAAA,GAAA,EAAA,GAAiB,KAAA;AAC9B,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AAEnC,EAAA,MAAM,SAAA,GAAYL,kBAAY,YAAY;AACxC,IAAA,IAAI,CAAC,GAAA,IAAO,OAAA,CAAQ,MAAA,KAAW,KAAK,IAAA,EAAM;AACxC,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,EAAE,UAAA,CAAW,OAAA;AAC7B,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe,MAAM,GAAA,CAAI,UAAA,CAAW,SAAS,OAAO,CAAA;AAE1D,MAAA,IAAI,OAAA,KAAY,WAAW,OAAA,EAAS;AAClC,QAAA,MAAM,MAAA,uBAAa,GAAA,EAGjB;AACF,QAAA,KAAA,MAAW,CAAC,EAAA,EAAI,MAAM,CAAA,IAAK,YAAA,EAAc;AACvC,UAAA,MAAA,CAAO,IAAI,EAAA,EAAI;AAAA,YACb,UAAU,MAAA,CAAO,QAAA;AAAA,YACjB,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,OAAO,MAAA,CAAO;AAAA,WACf,CAAA;AAAA,QACH;AACA,QAAA,UAAA,CAAW,MAAM,CAAA;AACjB,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,OAAA,KAAY,WAAW,OAAA,EAAS;AAClC,QAAA,QAAA,CAAS,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,eAAe,CAAC,CAAA;AAChE,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,UAAA,EAAY,MAAM,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,OAAA,EAAS,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,OAAO,CAAC,CAAA;AAE9D,EAAAC,gBAAU,MAAM;AACd,IAAA,IAAI,OAAA,IAAW,CAAC,IAAA,EAAM;AACpB,MAAA,SAAA,EAAU;AAAA,IACZ;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,SAAA,EAAW,IAAI,CAAC,CAAA;AAE7B,EAAA,MAAM,OAAA,GAAUD,kBAAY,MAAM;AAChC,IAAA,SAAA,EAAU;AAAA,EACZ,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF","file":"index.cjs","sourcesContent":["/**\n * Base error class for WoT SDK errors\n */\nexport class WoTError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'WoTError';\n // Maintains proper stack trace for where error was thrown (V8 engines)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n // Fix prototype chain for instanceof checks\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when a network request fails\n */\nexport class NetworkError extends WoTError {\n public readonly statusCode?: number;\n public readonly url?: string;\n\n constructor(message: string, statusCode?: number, url?: string) {\n super(message);\n this.name = 'NetworkError';\n this.statusCode = statusCode;\n this.url = url;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when a pubkey is not found in the graph\n */\nexport class NotFoundError extends WoTError {\n public readonly pubkey: string;\n\n constructor(pubkey: string, message?: string) {\n super(message || `Pubkey not found in graph: ${pubkey}`);\n this.name = 'NotFoundError';\n this.pubkey = pubkey;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when a request times out\n */\nexport class TimeoutError extends WoTError {\n public readonly timeout: number;\n\n constructor(timeout: number, message?: string) {\n super(message || `Request timed out after ${timeout}ms`);\n this.name = 'TimeoutError';\n this.timeout = timeout;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when validation fails\n */\nexport class ValidationError extends WoTError {\n public readonly field?: string;\n\n constructor(message: string, field?: string) {\n super(message);\n this.name = 'ValidationError';\n this.field = field;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","/**\n * Default oracle URL\n */\nexport const DEFAULT_ORACLE = 'https://nostr-wot.com';\n\n/**\n * Default max hops for WoT queries\n */\nexport const DEFAULT_MAX_HOPS = 3;\n\n/**\n * Default timeout in milliseconds\n */\nexport const DEFAULT_TIMEOUT = 5000;\n\n/**\n * Validates a hex pubkey\n */\nexport function isValidPubkey(pubkey: string): boolean {\n return /^[0-9a-f]{64}$/i.test(pubkey);\n}\n\n/**\n * Validates an oracle URL (must be HTTPS)\n */\nexport function isValidOracleUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n return parsed.protocol === 'https:';\n } catch {\n return false;\n }\n}\n\n/**\n * Maximum allowed batch size for array inputs\n */\nexport const MAX_BATCH_SIZE = 10000;\n\n/**\n * Normalizes a pubkey to lowercase hex\n */\nexport function normalizePubkey(pubkey: string): string {\n return pubkey.toLowerCase();\n}\n\n/**\n * Creates a fetch request with timeout\n */\nexport async function fetchWithTimeout(\n url: string,\n options: RequestInit & { timeout?: number } = {}\n): Promise<Response> {\n const { timeout = DEFAULT_TIMEOUT, ...fetchOptions } = options;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n return await fetch(url, {\n ...fetchOptions,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\n/**\n * Delays execution for specified milliseconds\n */\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Chunks an array into smaller arrays\n */\nexport function chunk<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n}\n\n/**\n * Creates a deferred promise\n */\nexport interface Deferred<T> {\n promise: Promise<T>;\n resolve: (value: T | PromiseLike<T>) => void;\n reject: (reason?: unknown) => void;\n}\n\nexport function createDeferred<T>(): Deferred<T> {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason?: unknown) => void;\n\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return { promise, resolve, reject };\n}\n","import type {\n WoTOptions,\n WoTFallbackOptions,\n QueryOptions,\n DistanceResult,\n DistanceBatchOptions,\n BatchResult,\n NostrWindow,\n NostrWoTExtension,\n ExtensionConfig,\n ExtensionStatus,\n ExtensionConnectionStatus,\n GraphStats,\n} from './types';\n\n/**\n * Default Chrome Web Store extension ID\n * Update after publishing to Chrome Web Store\n */\nconst DEFAULT_EXTENSION_ID = '';\nimport {\n NetworkError,\n NotFoundError,\n TimeoutError,\n ValidationError,\n} from './errors';\nimport {\n DEFAULT_ORACLE,\n DEFAULT_MAX_HOPS,\n DEFAULT_TIMEOUT,\n MAX_BATCH_SIZE,\n isValidPubkey,\n isValidOracleUrl,\n normalizePubkey,\n fetchWithTimeout,\n chunk,\n} from './utils';\n\n/**\n * WoT (Web of Trust) SDK for querying Nostr trust relationships\n *\n * The SDK always tries to use the browser extension when available.\n * The extension syncs and caches the follow graph locally, providing\n * the best performance and privacy. When the extension is not available,\n * it falls back to the oracle API.\n */\nexport class WoT {\n private readonly oracle: string;\n private readonly fallbackPubkey: string | null;\n private readonly maxHops: number;\n private readonly timeout: number;\n private readonly fallbackOptions: WoTFallbackOptions | null;\n private readonly extensionId: string;\n private extension: NostrWoTExtension | null = null;\n private extensionPubkey: string | null = null;\n\n constructor(options: WoTOptions = {}) {\n this.fallbackOptions = options.fallback ?? null;\n this.extensionId = options.extensionId ?? DEFAULT_EXTENSION_ID;\n\n // Use provided pubkey or fallback pubkey for oracle fallback\n if (options.myPubkey && isValidPubkey(options.myPubkey)) {\n this.fallbackPubkey = normalizePubkey(options.myPubkey);\n } else if (this.fallbackOptions?.myPubkey) {\n this.fallbackPubkey = normalizePubkey(this.fallbackOptions.myPubkey);\n } else {\n this.fallbackPubkey = null;\n }\n\n const oracleUrl = options.oracle ?? this.fallbackOptions?.oracle ?? DEFAULT_ORACLE;\n if (!isValidOracleUrl(oracleUrl)) {\n throw new ValidationError('oracle must be a valid HTTPS URL', 'oracle');\n }\n this.oracle = oracleUrl;\n this.maxHops = options.maxHops ?? this.fallbackOptions?.maxHops ?? DEFAULT_MAX_HOPS;\n this.timeout = options.timeout ?? this.fallbackOptions?.timeout ?? DEFAULT_TIMEOUT;\n }\n\n /**\n * Checks if browser extension is available and returns it\n * Simply checks window.nostr.wot - extension auto-injects when enabled\n * Always returns fresh reference to handle extension reloads\n */\n private async getExtension(): Promise<NostrWoTExtension | null> {\n // Check if running in browser\n if (typeof window === 'undefined') return null;\n\n const win = window as NostrWindow;\n\n // Check if extension API is available (auto-injected by extension)\n if (win.nostr?.wot) {\n this.extension = win.nostr.wot;\n\n // Get pubkey if not already fetched\n if (!this.extensionPubkey) {\n try {\n this.extensionPubkey = await this.extension.getMyPubkey();\n } catch {\n // Fall back to NIP-07 window.nostr.getPublicKey()\n if (win.nostr?.getPublicKey) {\n try {\n this.extensionPubkey = await win.nostr.getPublicKey();\n } catch {\n // Ignore - will use fallback pubkey\n }\n }\n }\n }\n\n return this.extension;\n }\n\n // Extension not available - will fall back to oracle\n this.extension = null;\n return null;\n }\n\n /**\n * Gets the effective pubkey (from extension or fallback)\n */\n private async getEffectivePubkey(): Promise<string> {\n // Try to get extension first\n await this.getExtension();\n\n // Use extension pubkey if available\n if (this.extensionPubkey) {\n return this.extensionPubkey;\n }\n\n // Fall back to provided pubkey\n if (this.fallbackPubkey) {\n return this.fallbackPubkey;\n }\n\n throw new ValidationError(\n 'No pubkey available. Either install the WoT extension or provide myPubkey/fallback options.',\n 'myPubkey'\n );\n }\n\n /**\n * Makes an API request to the oracle\n */\n private async apiRequest<T>(\n endpoint: string,\n options: QueryOptions = {}\n ): Promise<T> {\n const timeout = options.timeout ?? this.timeout;\n const url = `${this.oracle}/api${endpoint}`;\n\n let response: Response;\n try {\n response = await fetchWithTimeout(url, {\n timeout,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n } catch (error) {\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new TimeoutError(timeout);\n }\n throw new NetworkError(error.message, undefined, url);\n }\n throw new NetworkError('Unknown network error', undefined, url);\n }\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new NotFoundError('', `Resource not found: ${endpoint}`);\n }\n throw new NetworkError(\n `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n url\n );\n }\n\n return (await response.json()) as T;\n }\n\n /**\n * Validates a pubkey parameter\n */\n private validatePubkey(pubkey: string, paramName: string): string {\n if (!pubkey) {\n throw new ValidationError(`${paramName} is required`, paramName);\n }\n if (!isValidPubkey(pubkey)) {\n throw new ValidationError(\n `${paramName} must be a valid 64-character hex string`,\n paramName\n );\n }\n return normalizePubkey(pubkey);\n }\n\n /**\n * Get shortest path length to target pubkey\n * @param target - Target pubkey (hex)\n * @param options - Query options\n * @returns Number of hops or null if not reachable\n */\n async getDistance(\n target: string,\n options?: QueryOptions\n ): Promise<number | null> {\n const normalizedTarget = this.validatePubkey(target, 'target');\n\n // Check extension first - extension always takes priority\n const ext = await this.getExtension();\n if (ext) {\n return ext.getDistance(normalizedTarget);\n }\n\n // Fall back to oracle\n const myPubkey = await this.getEffectivePubkey();\n const maxHops = options?.maxHops ?? this.maxHops;\n\n interface DistanceResponse {\n distance: number | null;\n }\n\n try {\n const result = await this.apiRequest<DistanceResponse>(\n `/distance/${myPubkey}/${normalizedTarget}?maxHops=${maxHops}`,\n options\n );\n return result.distance;\n } catch (error) {\n if (error instanceof NotFoundError) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Check if target is within your Web of Trust\n * @param target - Target pubkey (hex)\n * @param options - Query options\n * @returns true if target is within maxHops\n */\n async isInMyWoT(target: string, options?: QueryOptions): Promise<boolean> {\n const normalizedTarget = this.validatePubkey(target, 'target');\n\n // Check extension first - extension always takes priority\n const ext = await this.getExtension();\n if (ext) {\n const maxHops = options?.maxHops ?? this.maxHops;\n return ext.isInMyWoT(normalizedTarget, maxHops);\n }\n\n // Fall back to oracle\n const distance = await this.getDistance(normalizedTarget, options);\n const maxHops = options?.maxHops ?? this.maxHops;\n\n return distance !== null && distance <= maxHops;\n }\n\n /**\n * Get computed trust score from extension\n * @param target - Target pubkey (hex)\n * @returns Trust score between 0 and 1, or 0 if not connected or extension unavailable\n */\n async getTrustScore(target: string): Promise<number> {\n const normalizedTarget = this.validatePubkey(target, 'target');\n\n // Trust scores come from extension only\n const ext = await this.getExtension();\n if (ext) {\n const score = await ext.getTrustScore(normalizedTarget);\n return score ?? 0;\n }\n\n // No extension - cannot calculate trust score\n return 0;\n }\n\n /**\n * Get distance between any two pubkeys\n * @param from - Source pubkey (hex)\n * @param to - Target pubkey (hex)\n * @param options - Query options\n * @returns Number of hops or null if not reachable\n */\n async getDistanceBetween(\n from: string,\n to: string,\n options?: QueryOptions\n ): Promise<number | null> {\n const normalizedFrom = this.validatePubkey(from, 'from');\n const normalizedTo = this.validatePubkey(to, 'to');\n\n // Check extension first - extension always takes priority\n const ext = await this.getExtension();\n if (ext) {\n return ext.getDistanceBetween(normalizedFrom, normalizedTo);\n }\n\n // Fall back to oracle\n const maxHops = options?.maxHops ?? this.maxHops;\n\n interface DistanceResponse {\n distance: number | null;\n }\n\n try {\n const result = await this.apiRequest<DistanceResponse>(\n `/distance/${normalizedFrom}/${normalizedTo}?maxHops=${maxHops}`,\n options\n );\n return result.distance;\n } catch (error) {\n if (error instanceof NotFoundError) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Check multiple pubkeys efficiently\n * @param targets - Array of target pubkeys (hex)\n * @param options - Query options\n * @returns Map of pubkey to result\n */\n async batchCheck(\n targets: string[],\n options?: QueryOptions\n ): Promise<Map<string, BatchResult>> {\n if (!Array.isArray(targets) || targets.length === 0) {\n throw new ValidationError('targets must be a non-empty array', 'targets');\n }\n if (targets.length > MAX_BATCH_SIZE) {\n throw new ValidationError(\n `targets array exceeds maximum size of ${MAX_BATCH_SIZE}`,\n 'targets'\n );\n }\n\n const normalizedTargets = targets.map((t, i) =>\n this.validatePubkey(t, `targets[${i}]`)\n );\n\n const maxHops = options?.maxHops ?? this.maxHops;\n\n // Check extension first - extension always takes priority\n const ext = await this.getExtension();\n if (ext) {\n const results = new Map<string, BatchResult>();\n\n // Use extension's batch APIs for efficiency\n const [distances, scores] = await Promise.all([\n ext.getDistanceBatch(normalizedTargets),\n ext.getTrustScoreBatch(normalizedTargets),\n ]);\n\n for (const pubkey of normalizedTargets) {\n const distance = distances[pubkey] ?? null;\n const score = scores[pubkey] ?? 0;\n\n results.set(pubkey, {\n pubkey,\n distance,\n score,\n inWoT: distance !== null && distance <= maxHops,\n });\n }\n\n return results;\n }\n\n // Fall back to oracle batch API\n const myPubkey = await this.getEffectivePubkey();\n const results = new Map<string, BatchResult>();\n\n // Process in batches of 50 to avoid URL length limits\n const batches = chunk(normalizedTargets, 50);\n\n for (const batch of batches) {\n interface BatchResponse {\n results: Array<{\n pubkey: string;\n distance: number | null;\n paths?: number;\n mutual?: boolean;\n }>;\n }\n\n try {\n const response = await this.apiRequest<BatchResponse>(\n `/batch/${myPubkey}?targets=${batch.join(',')}&maxHops=${maxHops}`,\n options\n );\n\n for (const item of response.results) {\n const inWoT = item.distance !== null && item.distance <= maxHops;\n\n results.set(item.pubkey, {\n pubkey: item.pubkey,\n distance: item.distance,\n score: 0, // Trust scores only available via extension\n inWoT,\n });\n }\n } catch (error) {\n // If batch fails, fill with null results\n for (const pubkey of batch) {\n if (!results.has(pubkey)) {\n results.set(pubkey, {\n pubkey,\n distance: null,\n score: 0,\n inWoT: false,\n });\n }\n }\n\n // Re-throw if not a transient error\n if (!(error instanceof NetworkError)) {\n throw error;\n }\n }\n }\n\n return results;\n }\n\n /**\n * Get distance and path count details\n * @param target - Target pubkey (hex)\n * @param options - Query options\n * @returns Distance result or null if not reachable\n *\n * Note: Extension returns `{ hops, paths }`. Oracle may return\n * additional fields like `bridges` and `mutual`.\n */\n async getDetails(\n target: string,\n options?: QueryOptions\n ): Promise<DistanceResult | null> {\n const normalizedTarget = this.validatePubkey(target, 'target');\n\n // Check extension first - extension always takes priority\n const ext = await this.getExtension();\n if (ext) {\n return ext.getDetails(normalizedTarget);\n }\n\n // Fall back to oracle\n const myPubkey = await this.getEffectivePubkey();\n const maxHops = options?.maxHops ?? this.maxHops;\n\n interface DetailsResponse {\n hops: number;\n paths: number;\n bridges?: string[];\n mutual?: boolean;\n }\n\n try {\n const response = await this.apiRequest<DetailsResponse>(\n `/details/${myPubkey}/${normalizedTarget}?maxHops=${maxHops}`,\n options\n );\n // Oracle doesn't return score, so default to 0\n return { ...response, score: 0 };\n } catch (error) {\n if (error instanceof NotFoundError) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Get the current pubkey (from extension or fallback)\n * Returns the extension's pubkey when available.\n */\n async getMyPubkey(): Promise<string> {\n return this.getEffectivePubkey();\n }\n\n /**\n * Get the current oracle URL\n */\n getOracle(): string {\n return this.oracle;\n }\n\n /**\n * Check if extension is available and being used\n */\n async isUsingExtension(): Promise<boolean> {\n const ext = await this.getExtension();\n return ext !== null;\n }\n\n /**\n * Get detailed extension connection status\n * Can detect if extension is installed but not enabled for this domain\n * @returns Connection status: 'connected' | 'not-enabled' | 'unavailable' | 'not-browser'\n */\n async getExtensionStatus(): Promise<ExtensionConnectionStatus> {\n // Not in browser\n if (typeof window === 'undefined') {\n return 'not-browser';\n }\n\n // Already connected\n if ((window as NostrWindow).nostr?.wot) {\n return 'connected';\n }\n\n // Try to detect if extension is installed via web_accessible_resources\n if (this.extensionId) {\n try {\n const response = await fetch(\n `chrome-extension://${this.extensionId}/detect.json`,\n { method: 'HEAD' }\n );\n if (response.ok) {\n return 'not-enabled'; // Installed but not enabled for this domain\n }\n } catch {\n // Fetch failed - not installed or not accessible\n }\n }\n\n return 'unavailable';\n }\n\n /**\n * Get extension configuration (only available when using extension)\n * @returns Extension config or null if not using extension\n */\n async getExtensionConfig(): Promise<ExtensionConfig | null> {\n const ext = await this.getExtension();\n if (!ext) return null;\n\n return ext.getConfig();\n }\n\n // ============================================\n // Extension-only methods (require extension)\n // ============================================\n\n /**\n * Check if the extension is configured and ready\n * @returns Status object with configuration state, or null if not using extension\n */\n async isConfigured(): Promise<ExtensionStatus | null> {\n const ext = await this.getExtension();\n if (!ext) return null;\n\n return ext.isConfigured();\n }\n\n /**\n * Filter a list of pubkeys to only those within the Web of Trust\n * @param pubkeys - Array of pubkeys to filter\n * @param options - Query options (maxHops)\n * @returns Filtered array of pubkeys within WoT\n *\n * Note: Extension-only. Falls back to batchCheck when extension unavailable.\n */\n async filterByWoT(\n pubkeys: string[],\n options?: QueryOptions\n ): Promise<string[]> {\n if (!Array.isArray(pubkeys) || pubkeys.length === 0) {\n return [];\n }\n\n const normalizedPubkeys = pubkeys\n .filter((pk) => isValidPubkey(pk))\n .map((pk) => normalizePubkey(pk));\n\n const maxHops = options?.maxHops ?? this.maxHops;\n\n // Check extension first - extension has native filterByWoT\n const ext = await this.getExtension();\n if (ext) {\n return ext.filterByWoT(normalizedPubkeys, maxHops);\n }\n\n // Fall back to batchCheck\n const results = await this.batchCheck(normalizedPubkeys, options);\n return Array.from(results.entries())\n .filter(([, result]) => result.inWoT)\n .map(([pubkey]) => pubkey);\n }\n\n /**\n * Get the follow list for a pubkey\n * @param pubkey - Optional, defaults to user's pubkey\n * @returns Array of followed pubkeys\n *\n * Note: Extension-only. Returns empty array if extension unavailable.\n */\n async getFollows(pubkey?: string): Promise<string[]> {\n const ext = await this.getExtension();\n if (!ext) return [];\n\n const normalizedPubkey = pubkey ? this.validatePubkey(pubkey, 'pubkey') : undefined;\n return ext.getFollows(normalizedPubkey);\n }\n\n /**\n * Get mutual follows between the user and a target\n * @param pubkey - Target pubkey\n * @returns Array of common followed pubkeys\n *\n * Note: Extension-only. Returns empty array if extension unavailable.\n */\n async getCommonFollows(pubkey: string): Promise<string[]> {\n const ext = await this.getExtension();\n if (!ext) return [];\n\n const normalizedPubkey = this.validatePubkey(pubkey, 'pubkey');\n return ext.getCommonFollows(normalizedPubkey);\n }\n\n /**\n * Get graph statistics\n * @returns Stats object with node/edge counts and sync info\n *\n * Note: Extension-only. Returns null if extension unavailable.\n */\n async getStats(): Promise<GraphStats | null> {\n const ext = await this.getExtension();\n if (!ext) return null;\n\n return ext.getStats();\n }\n\n /**\n * Get an actual path from the user to the target\n * @param target - Target pubkey\n * @returns Array of pubkeys [user, ..., target], or null if not connected\n *\n * Note: Extension-only. Returns null if extension unavailable.\n */\n async getPath(target: string): Promise<string[] | null> {\n const ext = await this.getExtension();\n if (!ext) return null;\n\n const normalizedTarget = this.validatePubkey(target, 'target');\n return ext.getPath(normalizedTarget);\n }\n\n /**\n * Get distances for multiple pubkeys in a single call\n * @param targets - Array of target pubkeys\n * @param options - Options object or boolean for backwards compatibility\n * - `{ includePaths: true }` - Include path counts\n * - `{ includeScores: true }` - Include trust scores\n * - `{ includePaths: true, includeScores: true }` - Include both\n * - `true` (legacy) - Same as `{ includePaths: true }`\n * @returns Record of pubkey to result based on options\n */\n async getDistanceBatch(\n targets: string[],\n options?: false | undefined\n ): Promise<Record<string, number | null>>;\n async getDistanceBatch(\n targets: string[],\n options: true | { includePaths: true; includeScores?: false }\n ): Promise<Record<string, { hops: number; paths: number } | null>>;\n async getDistanceBatch(\n targets: string[],\n options: { includePaths?: false; includeScores: true }\n ): Promise<Record<string, { hops: number; score: number } | null>>;\n async getDistanceBatch(\n targets: string[],\n options: { includePaths: true; includeScores: true }\n ): Promise<Record<string, { hops: number; paths: number; score: number } | null>>;\n async getDistanceBatch(\n targets: string[],\n options?: boolean | DistanceBatchOptions\n ): Promise<Record<string, number | { hops: number; paths?: number; score?: number } | null>>;\n async getDistanceBatch(\n targets: string[],\n options: boolean | DistanceBatchOptions = false\n ): Promise<Record<string, number | { hops: number; paths?: number; score?: number } | null>> {\n if (!Array.isArray(targets) || targets.length === 0) {\n return {};\n }\n\n const normalizedTargets = targets.map((t, i) =>\n this.validatePubkey(t, `targets[${i}]`)\n );\n\n // Normalize options: boolean `true` means { includePaths: true }\n const opts: DistanceBatchOptions =\n typeof options === 'boolean'\n ? { includePaths: options }\n : options || {};\n\n const { includePaths, includeScores } = opts;\n\n // Check extension first\n const ext = await this.getExtension();\n if (ext) {\n return ext.getDistanceBatch(normalizedTargets, opts);\n }\n\n // Fall back to individual queries\n if (includePaths || includeScores) {\n const results: Record<string, { hops: number; paths?: number; score?: number } | null> = {};\n await Promise.all(\n normalizedTargets.map(async (pubkey) => {\n const details = await this.getDetails(pubkey);\n if (!details) {\n results[pubkey] = null;\n return;\n }\n const result: { hops: number; paths?: number; score?: number } = { hops: details.hops };\n if (includePaths) result.paths = details.paths;\n if (includeScores) result.score = details.score;\n results[pubkey] = result;\n })\n );\n return results;\n }\n\n const results: Record<string, number | null> = {};\n await Promise.all(\n normalizedTargets.map(async (pubkey) => {\n results[pubkey] = await this.getDistance(pubkey);\n })\n );\n return results;\n }\n\n /**\n * Get trust scores for multiple pubkeys in a single call\n * @param targets - Array of target pubkeys\n * @returns Record of pubkey to trust score (null if not connected)\n */\n async getTrustScoreBatch(\n targets: string[]\n ): Promise<Record<string, number | null>> {\n if (!Array.isArray(targets) || targets.length === 0) {\n return {};\n }\n\n const normalizedTargets = targets.map((t, i) =>\n this.validatePubkey(t, `targets[${i}]`)\n );\n\n // Check extension first\n const ext = await this.getExtension();\n if (ext) {\n return ext.getTrustScoreBatch(normalizedTargets);\n }\n\n // Fall back to individual queries\n const results: Record<string, number | null> = {};\n await Promise.all(\n normalizedTargets.map(async (pubkey) => {\n const score = await this.getTrustScore(pubkey);\n results[pubkey] = score > 0 ? score : null;\n })\n );\n\n return results;\n }\n}\n","import {\n createContext,\n useContext,\n useState,\n useEffect,\n useMemo,\n useCallback,\n type ReactNode,\n} from 'react';\nimport { WoT } from '../wot';\nimport type { WoTOptions, NostrWindow } from '../types';\n\n/**\n * Extension connection state\n */\nexport type ExtensionConnectionState =\n | 'checking'\n | 'connected'\n | 'not-available';\n\n/**\n * Extension status exposed to consumers\n */\nexport interface ExtensionState {\n /**\n * Current connection state\n */\n state: ExtensionConnectionState;\n /**\n * Whether extension is connected and ready\n */\n isConnected: boolean;\n /**\n * Whether extension is currently checking\n */\n isChecking: boolean;\n /**\n * Whether check is complete\n */\n isChecked: boolean;\n /**\n * Manually trigger a check\n */\n refresh: () => void;\n}\n\n/**\n * WoT context value\n */\ninterface WoTContextValue {\n wot: WoT | null;\n isReady: boolean;\n extension: ExtensionState;\n}\n\n/**\n * WoT context\n */\nconst WoTContext = createContext<WoTContextValue | null>(null);\n\n/**\n * WoT provider props\n */\nexport interface WoTProviderProps {\n /**\n * WoT configuration options\n */\n options?: Partial<WoTOptions>;\n /**\n * Children to render\n */\n children: ReactNode;\n}\n\n/**\n * Check if extension is available\n */\nfunction checkExtensionAvailable(): boolean {\n if (typeof window === 'undefined') return false;\n return !!(window as NostrWindow).nostr?.wot;\n}\n\n/**\n * WoT provider component\n *\n * Provides WoT instance to all children components.\n * Automatically detects extension availability.\n *\n * @example\n * ```tsx\n * import { WoTProvider } from 'nostr-wot-sdk/react';\n *\n * // Basic usage - automatically detects extension\n * function App() {\n * return (\n * <WoTProvider>\n * <YourApp />\n * </WoTProvider>\n * );\n * }\n *\n * // With fallback for when extension is not available\n * function App() {\n * return (\n * <WoTProvider options={{\n * fallback: { myPubkey: 'abc123...' }\n * }}>\n * <YourApp />\n * </WoTProvider>\n * );\n * }\n * ```\n */\nexport function WoTProvider({\n options = {},\n children,\n}: WoTProviderProps) {\n const [extensionState, setExtensionState] = useState<ExtensionConnectionState>('checking');\n const [isReady, setIsReady] = useState(false);\n\n // Check extension availability\n const checkExtension = useCallback(() => {\n const available = checkExtensionAvailable();\n setExtensionState(available ? 'connected' : 'not-available');\n setIsReady(true);\n }, []);\n\n // Check on mount\n useEffect(() => {\n checkExtension();\n }, [checkExtension]);\n\n // Create WoT instance\n const wot = useMemo(() => {\n if (!isReady) {\n return null;\n }\n\n try {\n return new WoT(options);\n } catch (error) {\n console.error('WoTProvider: Failed to create WoT instance:', error);\n return null;\n }\n }, [\n isReady,\n options.oracle,\n options.myPubkey,\n options.maxHops,\n options.timeout,\n options.fallback?.myPubkey,\n options.fallback?.oracle,\n ]);\n\n // Extension state for consumers\n const extension = useMemo<ExtensionState>(() => {\n const isConnected = extensionState === 'connected';\n const isChecking = extensionState === 'checking';\n const isChecked = extensionState !== 'checking';\n\n return {\n state: extensionState,\n isConnected,\n isChecking,\n isChecked,\n refresh: checkExtension,\n };\n }, [extensionState, checkExtension]);\n\n const value = useMemo<WoTContextValue>(\n () => ({\n wot,\n isReady: isReady && wot !== null,\n extension,\n }),\n [wot, isReady, extension]\n );\n\n return <WoTContext.Provider value={value}>{children}</WoTContext.Provider>;\n}\n\n/**\n * Hook to access WoT context\n *\n * @returns WoT context value\n * @throws If used outside of WoTProvider\n */\nexport function useWoTContext(): WoTContextValue {\n const context = useContext(WoTContext);\n\n if (context === null) {\n throw new Error('useWoTContext must be used within a WoTProvider');\n }\n\n return context;\n}\n\n/**\n * Hook to access WoT instance directly\n *\n * @returns WoT instance or null if not ready\n */\nexport function useWoTInstance(): WoT | null {\n const { wot } = useWoTContext();\n return wot;\n}\n\n/**\n * Hook to access extension state\n *\n * @returns Extension state and status\n *\n * @example\n * ```tsx\n * function ExtensionStatus() {\n * const { isConnected, isChecking } = useExtension();\n *\n * if (isChecking) return <span>Checking...</span>;\n * if (isConnected) return <span>Extension connected!</span>;\n * return <span>Extension not available</span>;\n * }\n * ```\n */\nexport function useExtension(): ExtensionState {\n const { extension } = useWoTContext();\n return extension;\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useWoTContext } from './context';\nimport type { DistanceResult, QueryOptions } from '../types';\n\n/**\n * Result from useWoT hook\n */\nexport interface UseWoTResult {\n /**\n * Distance in hops to target, null if not in WoT\n */\n distance: number | null;\n /**\n * Trust score (0-1)\n */\n score: number;\n /**\n * Whether data is currently loading\n */\n loading: boolean;\n /**\n * Error if query failed\n */\n error: Error | null;\n /**\n * Full details (hops, paths, bridges, mutual)\n */\n details: DistanceResult | null;\n /**\n * Refetch data\n */\n refetch: () => void;\n}\n\n/**\n * Options for useWoT hook\n */\nexport interface UseWoTOptions extends QueryOptions {\n /**\n * Skip the query (useful for conditional fetching)\n */\n skip?: boolean;\n}\n\n/**\n * Hook to get WoT data for a pubkey\n *\n * @param pubkey - Target pubkey\n * @param options - Query options\n * @returns WoT data and loading state\n *\n * @example\n * ```tsx\n * function Profile({ pubkey }) {\n * const { distance, score, loading } = useWoT(pubkey);\n *\n * if (loading) return <Spinner />;\n *\n * return (\n * <div>\n * {distance !== null ? (\n * <span>{distance} hops away (score: {score.toFixed(2)})</span>\n * ) : (\n * <span>Not in your network</span>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useWoT(pubkey: string, options?: UseWoTOptions): UseWoTResult {\n const { wot, isReady } = useWoTContext();\n const [distance, setDistance] = useState<number | null>(null);\n const [score, setScore] = useState(0);\n const [details, setDetails] = useState<DistanceResult | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const fetchIdRef = useRef(0);\n\n const skip = options?.skip ?? false;\n\n const fetchData = useCallback(async () => {\n if (!wot || !pubkey || skip) {\n setLoading(false);\n return;\n }\n\n const fetchId = ++fetchIdRef.current;\n setLoading(true);\n setError(null);\n\n try {\n const [distResult, scoreResult, detailsResult] = await Promise.all([\n wot.getDistance(pubkey, options),\n wot.getTrustScore(pubkey),\n wot.getDetails(pubkey, options),\n ]);\n\n // Only update if this is still the latest request\n if (fetchId === fetchIdRef.current) {\n setDistance(distResult);\n setScore(scoreResult);\n setDetails(detailsResult);\n setLoading(false);\n }\n } catch (err) {\n if (fetchId === fetchIdRef.current) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n setLoading(false);\n }\n }\n }, [wot, pubkey, skip, options?.maxHops, options?.timeout]);\n\n useEffect(() => {\n if (isReady && !skip) {\n fetchData();\n }\n }, [isReady, fetchData, skip]);\n\n const refetch = useCallback(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n distance,\n score,\n loading,\n error,\n details,\n refetch,\n };\n}\n\n/**\n * Result from useIsInWoT hook\n */\nexport interface UseIsInWoTResult {\n /**\n * Whether target is in WoT\n */\n inWoT: boolean;\n /**\n * Whether data is currently loading\n */\n loading: boolean;\n /**\n * Error if query failed\n */\n error: Error | null;\n /**\n * Refetch data\n */\n refetch: () => void;\n}\n\n/**\n * Hook to check if a pubkey is in your WoT\n *\n * @param pubkey - Target pubkey\n * @param options - Query options\n * @returns Whether target is in WoT\n *\n * @example\n * ```tsx\n * function TrustBadge({ pubkey }) {\n * const { inWoT, loading } = useIsInWoT(pubkey, { maxHops: 2 });\n *\n * if (loading) return null;\n *\n * return inWoT ? <span>Trusted</span> : null;\n * }\n * ```\n */\nexport function useIsInWoT(\n pubkey: string,\n options?: UseWoTOptions\n): UseIsInWoTResult {\n const { wot, isReady } = useWoTContext();\n const [inWoT, setInWoT] = useState(false);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const fetchIdRef = useRef(0);\n\n const skip = options?.skip ?? false;\n\n const fetchData = useCallback(async () => {\n if (!wot || !pubkey || skip) {\n setLoading(false);\n return;\n }\n\n const fetchId = ++fetchIdRef.current;\n setLoading(true);\n setError(null);\n\n try {\n const result = await wot.isInMyWoT(pubkey, options);\n\n if (fetchId === fetchIdRef.current) {\n setInWoT(result);\n setLoading(false);\n }\n } catch (err) {\n if (fetchId === fetchIdRef.current) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n setLoading(false);\n }\n }\n }, [wot, pubkey, skip, options?.maxHops, options?.timeout]);\n\n useEffect(() => {\n if (isReady && !skip) {\n fetchData();\n }\n }, [isReady, fetchData, skip]);\n\n const refetch = useCallback(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n inWoT,\n loading,\n error,\n refetch,\n };\n}\n\n/**\n * Result from useTrustScore hook\n */\nexport interface UseTrustScoreResult {\n /**\n * Trust score (0-1)\n */\n score: number;\n /**\n * Whether data is currently loading\n */\n loading: boolean;\n /**\n * Error if query failed\n */\n error: Error | null;\n /**\n * Refetch data\n */\n refetch: () => void;\n}\n\n/**\n * Hook to get trust score for a pubkey\n *\n * @param pubkey - Target pubkey\n * @param options - Query options\n * @returns Trust score\n *\n * @example\n * ```tsx\n * function TrustMeter({ pubkey }) {\n * const { score, loading } = useTrustScore(pubkey);\n *\n * if (loading) return <Spinner />;\n *\n * return <ProgressBar value={score} />;\n * }\n * ```\n */\nexport function useTrustScore(\n pubkey: string,\n options?: UseWoTOptions\n): UseTrustScoreResult {\n const { wot, isReady } = useWoTContext();\n const [score, setScore] = useState(0);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const fetchIdRef = useRef(0);\n\n const skip = options?.skip ?? false;\n\n const fetchData = useCallback(async () => {\n if (!wot || !pubkey || skip) {\n setLoading(false);\n return;\n }\n\n const fetchId = ++fetchIdRef.current;\n setLoading(true);\n setError(null);\n\n try {\n const result = await wot.getTrustScore(pubkey);\n\n if (fetchId === fetchIdRef.current) {\n setScore(result);\n setLoading(false);\n }\n } catch (err) {\n if (fetchId === fetchIdRef.current) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n setLoading(false);\n }\n }\n }, [wot, pubkey, skip]);\n\n useEffect(() => {\n if (isReady && !skip) {\n fetchData();\n }\n }, [isReady, fetchData, skip]);\n\n const refetch = useCallback(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n score,\n loading,\n error,\n refetch,\n };\n}\n\n/**\n * Result from useBatchWoT hook\n */\nexport interface UseBatchWoTResult {\n /**\n * Map of pubkey to result\n */\n results: Map<\n string,\n {\n distance: number | null;\n score: number;\n inWoT: boolean;\n }\n >;\n /**\n * Whether data is currently loading\n */\n loading: boolean;\n /**\n * Error if query failed\n */\n error: Error | null;\n /**\n * Refetch data\n */\n refetch: () => void;\n}\n\n/**\n * Hook to batch check multiple pubkeys\n *\n * @param pubkeys - Array of target pubkeys\n * @param options - Query options\n * @returns Map of results\n *\n * @example\n * ```tsx\n * function UserList({ pubkeys }) {\n * const { results, loading } = useBatchWoT(pubkeys);\n *\n * return (\n * <ul>\n * {pubkeys.map(pk => {\n * const data = results.get(pk);\n * return (\n * <li key={pk}>\n * {data?.inWoT ? 'Trusted' : 'Unknown'}\n * </li>\n * );\n * })}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useBatchWoT(\n pubkeys: string[],\n options?: UseWoTOptions\n): UseBatchWoTResult {\n const { wot, isReady } = useWoTContext();\n const [results, setResults] = useState<UseBatchWoTResult['results']>(\n new Map()\n );\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const fetchIdRef = useRef(0);\n\n const skip = options?.skip ?? false;\n const pubkeysKey = pubkeys.join(',');\n\n const fetchData = useCallback(async () => {\n if (!wot || pubkeys.length === 0 || skip) {\n setLoading(false);\n return;\n }\n\n const fetchId = ++fetchIdRef.current;\n setLoading(true);\n setError(null);\n\n try {\n const batchResults = await wot.batchCheck(pubkeys, options);\n\n if (fetchId === fetchIdRef.current) {\n const mapped = new Map<\n string,\n { distance: number | null; score: number; inWoT: boolean }\n >();\n for (const [pk, result] of batchResults) {\n mapped.set(pk, {\n distance: result.distance,\n score: result.score,\n inWoT: result.inWoT,\n });\n }\n setResults(mapped);\n setLoading(false);\n }\n } catch (err) {\n if (fetchId === fetchIdRef.current) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n setLoading(false);\n }\n }\n }, [wot, pubkeysKey, skip, options?.maxHops, options?.timeout]);\n\n useEffect(() => {\n if (isReady && !skip) {\n fetchData();\n }\n }, [isReady, fetchData, skip]);\n\n const refetch = useCallback(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n results,\n loading,\n error,\n refetch,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/errors.ts","../../src/utils.ts","../../src/wot.ts","../../src/react/context.tsx","../../src/react/hooks.ts"],"names":["e","maxHops","results","createContext","useState","useCallback","useEffect","useMemo","jsx","useContext","useRef"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Base error class for WoT SDK errors\n */\nexport class WoTError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'WoTError';\n // Maintains proper stack trace for where error was thrown (V8 engines)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n // Fix prototype chain for instanceof checks\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when a network request fails\n */\nexport class NetworkError extends WoTError {\n public readonly statusCode?: number;\n public readonly url?: string;\n\n constructor(message: string, statusCode?: number, url?: string) {\n super(message);\n this.name = 'NetworkError';\n this.statusCode = statusCode;\n this.url = url;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when a pubkey is not found in the graph\n */\nexport class NotFoundError extends WoTError {\n public readonly pubkey: string;\n\n constructor(pubkey: string, message?: string) {\n super(message || `Pubkey not found in graph: ${pubkey}`);\n this.name = 'NotFoundError';\n this.pubkey = pubkey;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when a request times out\n */\nexport class TimeoutError extends WoTError {\n public readonly timeout: number;\n\n constructor(timeout: number, message?: string) {\n super(message || `Request timed out after ${timeout}ms`);\n this.name = 'TimeoutError';\n this.timeout = timeout;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when validation fails\n */\nexport class ValidationError extends WoTError {\n public readonly field?: string;\n\n constructor(message: string, field?: string) {\n super(message);\n this.name = 'ValidationError';\n this.field = field;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","/**\n * Default oracle URL\n */\nexport const DEFAULT_ORACLE = 'https://nostr-wot.com';\n\n/**\n * Default max hops for WoT queries\n */\nexport const DEFAULT_MAX_HOPS = 3;\n\n/**\n * Default timeout in milliseconds\n */\nexport const DEFAULT_TIMEOUT = 5000;\n\n/**\n * Validates a hex pubkey\n */\nexport function isValidPubkey(pubkey: string): boolean {\n return /^[0-9a-f]{64}$/i.test(pubkey);\n}\n\n/**\n * Validates an oracle URL (must be HTTPS)\n */\nexport function isValidOracleUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n return parsed.protocol === 'https:';\n } catch {\n return false;\n }\n}\n\n/**\n * Maximum allowed batch size for array inputs\n */\nexport const MAX_BATCH_SIZE = 10000;\n\n/**\n * Normalizes a pubkey to lowercase hex\n */\nexport function normalizePubkey(pubkey: string): string {\n return pubkey.toLowerCase();\n}\n\n/**\n * Creates a fetch request with timeout\n */\nexport async function fetchWithTimeout(\n url: string,\n options: RequestInit & { timeout?: number } = {}\n): Promise<Response> {\n const { timeout = DEFAULT_TIMEOUT, ...fetchOptions } = options;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n return await fetch(url, {\n ...fetchOptions,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\n/**\n * Delays execution for specified milliseconds\n */\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Chunks an array into smaller arrays\n */\nexport function chunk<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n}\n\n/**\n * Creates a deferred promise\n */\nexport interface Deferred<T> {\n promise: Promise<T>;\n resolve: (value: T | PromiseLike<T>) => void;\n reject: (reason?: unknown) => void;\n}\n\nexport function createDeferred<T>(): Deferred<T> {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason?: unknown) => void;\n\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return { promise, resolve, reject };\n}\n","import type {\n WoTOptions,\n WoTFallbackOptions,\n QueryOptions,\n DistanceResult,\n DistanceBatchOptions,\n BatchResult,\n NostrWindow,\n NostrWoTExtension,\n ExtensionConfig,\n ExtensionStatus,\n ExtensionConnectionStatus,\n GraphStats,\n} from './types';\n\n/**\n * Default Chrome Web Store extension ID\n */\nconst DEFAULT_EXTENSION_ID = 'gfmefgdkmjpjinecjchlangpamhclhdo';\nimport {\n NetworkError,\n NotFoundError,\n TimeoutError,\n ValidationError,\n} from './errors';\nimport {\n DEFAULT_ORACLE,\n DEFAULT_MAX_HOPS,\n DEFAULT_TIMEOUT,\n MAX_BATCH_SIZE,\n isValidPubkey,\n isValidOracleUrl,\n normalizePubkey,\n fetchWithTimeout,\n chunk,\n} from './utils';\n\n/**\n * WoT (Web of Trust) SDK for querying Nostr trust relationships\n *\n * The SDK always tries to use the browser extension when available.\n * The extension syncs and caches the follow graph locally, providing\n * the best performance and privacy. When the extension is not available,\n * it falls back to the oracle API.\n */\nexport class WoT {\n private readonly oracle: string;\n private readonly fallbackPubkey: string | null;\n private readonly maxHops: number;\n private readonly timeout: number;\n private readonly fallbackOptions: WoTFallbackOptions | null;\n private readonly extensionId: string;\n private extension: NostrWoTExtension | null = null;\n private extensionPubkey: string | null = null;\n\n constructor(options: WoTOptions = {}) {\n this.fallbackOptions = options.fallback ?? null;\n this.extensionId = options.extensionId ?? DEFAULT_EXTENSION_ID;\n\n // Use provided pubkey or fallback pubkey for oracle fallback\n if (options.myPubkey && isValidPubkey(options.myPubkey)) {\n this.fallbackPubkey = normalizePubkey(options.myPubkey);\n } else if (this.fallbackOptions?.myPubkey) {\n this.fallbackPubkey = normalizePubkey(this.fallbackOptions.myPubkey);\n } else {\n this.fallbackPubkey = null;\n }\n\n const oracleUrl = options.oracle ?? this.fallbackOptions?.oracle ?? DEFAULT_ORACLE;\n if (!isValidOracleUrl(oracleUrl)) {\n throw new ValidationError('oracle must be a valid HTTPS URL', 'oracle');\n }\n this.oracle = oracleUrl;\n this.maxHops = options.maxHops ?? this.fallbackOptions?.maxHops ?? DEFAULT_MAX_HOPS;\n this.timeout = options.timeout ?? this.fallbackOptions?.timeout ?? DEFAULT_TIMEOUT;\n }\n\n /**\n * Checks if browser extension is available and returns it\n * Simply checks window.nostr.wot - extension auto-injects when enabled\n * Always returns fresh reference to handle extension reloads\n */\n private async getExtension(): Promise<NostrWoTExtension | null> {\n // Check if running in browser\n if (typeof window === 'undefined') return null;\n\n const win = window as NostrWindow;\n\n // Check if extension API is available (auto-injected by extension)\n if (win.nostr?.wot) {\n this.extension = win.nostr.wot;\n\n // Get pubkey if not already fetched\n if (!this.extensionPubkey) {\n try {\n this.extensionPubkey = await this.extension.getMyPubkey();\n } catch {\n // Fall back to NIP-07 window.nostr.getPublicKey()\n if (win.nostr?.getPublicKey) {\n try {\n this.extensionPubkey = await win.nostr.getPublicKey();\n } catch {\n // Ignore - will use fallback pubkey\n }\n }\n }\n }\n\n return this.extension;\n }\n\n // Extension not available - will fall back to oracle\n this.extension = null;\n return null;\n }\n\n /**\n * Gets the effective pubkey (from extension or fallback)\n */\n private async getEffectivePubkey(): Promise<string> {\n // Try to get extension first\n await this.getExtension();\n\n // Use extension pubkey if available\n if (this.extensionPubkey) {\n return this.extensionPubkey;\n }\n\n // Fall back to provided pubkey\n if (this.fallbackPubkey) {\n return this.fallbackPubkey;\n }\n\n throw new ValidationError(\n 'No pubkey available. Either install the WoT extension or provide myPubkey/fallback options.',\n 'myPubkey'\n );\n }\n\n /**\n * Makes an API request to the oracle\n */\n private async apiRequest<T>(\n endpoint: string,\n options: QueryOptions = {}\n ): Promise<T> {\n const timeout = options.timeout ?? this.timeout;\n const url = `${this.oracle}/api${endpoint}`;\n\n let response: Response;\n try {\n response = await fetchWithTimeout(url, {\n timeout,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n } catch (error) {\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new TimeoutError(timeout);\n }\n throw new NetworkError(error.message, undefined, url);\n }\n throw new NetworkError('Unknown network error', undefined, url);\n }\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new NotFoundError('', `Resource not found: ${endpoint}`);\n }\n throw new NetworkError(\n `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n url\n );\n }\n\n return (await response.json()) as T;\n }\n\n /**\n * Validates a pubkey parameter\n */\n private validatePubkey(pubkey: string, paramName: string): string {\n if (!pubkey) {\n throw new ValidationError(`${paramName} is required`, paramName);\n }\n if (!isValidPubkey(pubkey)) {\n throw new ValidationError(\n `${paramName} must be a valid 64-character hex string`,\n paramName\n );\n }\n return normalizePubkey(pubkey);\n }\n\n /**\n * Get shortest path length to target pubkey\n * @param target - Target pubkey (hex)\n * @param options - Query options\n * @returns Number of hops or null if not reachable\n */\n async getDistance(\n target: string,\n options?: QueryOptions\n ): Promise<number | null> {\n const normalizedTarget = this.validatePubkey(target, 'target');\n\n // Check extension first - extension always takes priority\n const ext = await this.getExtension();\n if (ext) {\n return ext.getDistance(normalizedTarget);\n }\n\n // Fall back to oracle\n const myPubkey = await this.getEffectivePubkey();\n const maxHops = options?.maxHops ?? this.maxHops;\n\n interface DistanceResponse {\n distance: number | null;\n }\n\n try {\n const result = await this.apiRequest<DistanceResponse>(\n `/distance/${myPubkey}/${normalizedTarget}?maxHops=${maxHops}`,\n options\n );\n return result.distance;\n } catch (error) {\n if (error instanceof NotFoundError) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Check if target is within your Web of Trust\n * @param target - Target pubkey (hex)\n * @param options - Query options\n * @returns true if target is within maxHops\n */\n async isInMyWoT(target: string, options?: QueryOptions): Promise<boolean> {\n const normalizedTarget = this.validatePubkey(target, 'target');\n\n // Check extension first - extension always takes priority\n const ext = await this.getExtension();\n if (ext) {\n const maxHops = options?.maxHops ?? this.maxHops;\n return ext.isInMyWoT(normalizedTarget, maxHops);\n }\n\n // Fall back to oracle\n const distance = await this.getDistance(normalizedTarget, options);\n const maxHops = options?.maxHops ?? this.maxHops;\n\n return distance !== null && distance <= maxHops;\n }\n\n /**\n * Get computed trust score from extension\n * @param target - Target pubkey (hex)\n * @returns Trust score between 0 and 1, or 0 if not connected or extension unavailable\n */\n async getTrustScore(target: string): Promise<number> {\n const normalizedTarget = this.validatePubkey(target, 'target');\n\n // Trust scores come from extension only\n const ext = await this.getExtension();\n if (ext) {\n const score = await ext.getTrustScore(normalizedTarget);\n return score ?? 0;\n }\n\n // No extension - cannot calculate trust score\n return 0;\n }\n\n /**\n * Get distance between any two pubkeys\n * @param from - Source pubkey (hex)\n * @param to - Target pubkey (hex)\n * @param options - Query options\n * @returns Number of hops or null if not reachable\n */\n async getDistanceBetween(\n from: string,\n to: string,\n options?: QueryOptions\n ): Promise<number | null> {\n const normalizedFrom = this.validatePubkey(from, 'from');\n const normalizedTo = this.validatePubkey(to, 'to');\n\n // Check extension first - extension always takes priority\n const ext = await this.getExtension();\n if (ext) {\n return ext.getDistanceBetween(normalizedFrom, normalizedTo);\n }\n\n // Fall back to oracle\n const maxHops = options?.maxHops ?? this.maxHops;\n\n interface DistanceResponse {\n distance: number | null;\n }\n\n try {\n const result = await this.apiRequest<DistanceResponse>(\n `/distance/${normalizedFrom}/${normalizedTo}?maxHops=${maxHops}`,\n options\n );\n return result.distance;\n } catch (error) {\n if (error instanceof NotFoundError) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Check multiple pubkeys efficiently\n * @param targets - Array of target pubkeys (hex)\n * @param options - Query options\n * @returns Map of pubkey to result\n */\n async batchCheck(\n targets: string[],\n options?: QueryOptions\n ): Promise<Map<string, BatchResult>> {\n if (!Array.isArray(targets) || targets.length === 0) {\n throw new ValidationError('targets must be a non-empty array', 'targets');\n }\n if (targets.length > MAX_BATCH_SIZE) {\n throw new ValidationError(\n `targets array exceeds maximum size of ${MAX_BATCH_SIZE}`,\n 'targets'\n );\n }\n\n const normalizedTargets = targets.map((t, i) =>\n this.validatePubkey(t, `targets[${i}]`)\n );\n\n const maxHops = options?.maxHops ?? this.maxHops;\n\n // Check extension first - extension always takes priority\n const ext = await this.getExtension();\n if (ext) {\n const results = new Map<string, BatchResult>();\n\n // Use extension's batch APIs for efficiency\n const [distances, scores] = await Promise.all([\n ext.getDistanceBatch(normalizedTargets),\n ext.getTrustScoreBatch(normalizedTargets),\n ]);\n\n for (const pubkey of normalizedTargets) {\n const distance = distances[pubkey] ?? null;\n const score = scores[pubkey] ?? 0;\n\n results.set(pubkey, {\n pubkey,\n distance,\n score,\n inWoT: distance !== null && distance <= maxHops,\n });\n }\n\n return results;\n }\n\n // Fall back to oracle batch API\n const myPubkey = await this.getEffectivePubkey();\n const results = new Map<string, BatchResult>();\n\n // Process in batches of 50 to avoid URL length limits\n const batches = chunk(normalizedTargets, 50);\n\n for (const batch of batches) {\n interface BatchResponse {\n results: Array<{\n pubkey: string;\n distance: number | null;\n paths?: number;\n mutual?: boolean;\n }>;\n }\n\n try {\n const response = await this.apiRequest<BatchResponse>(\n `/batch/${myPubkey}?targets=${batch.join(',')}&maxHops=${maxHops}`,\n options\n );\n\n for (const item of response.results) {\n const inWoT = item.distance !== null && item.distance <= maxHops;\n\n results.set(item.pubkey, {\n pubkey: item.pubkey,\n distance: item.distance,\n score: 0, // Trust scores only available via extension\n inWoT,\n });\n }\n } catch (error) {\n // If batch fails, fill with null results\n for (const pubkey of batch) {\n if (!results.has(pubkey)) {\n results.set(pubkey, {\n pubkey,\n distance: null,\n score: 0,\n inWoT: false,\n });\n }\n }\n\n // Re-throw if not a transient error\n if (!(error instanceof NetworkError)) {\n throw error;\n }\n }\n }\n\n return results;\n }\n\n /**\n * Get distance and path count details\n * @param target - Target pubkey (hex)\n * @param options - Query options\n * @returns Distance result or null if not reachable\n *\n * Note: Extension returns `{ hops, paths }`. Oracle may return\n * additional fields like `bridges` and `mutual`.\n */\n async getDetails(\n target: string,\n options?: QueryOptions\n ): Promise<DistanceResult | null> {\n const normalizedTarget = this.validatePubkey(target, 'target');\n\n // Check extension first - extension always takes priority\n const ext = await this.getExtension();\n if (ext) {\n return ext.getDetails(normalizedTarget);\n }\n\n // Fall back to oracle\n const myPubkey = await this.getEffectivePubkey();\n const maxHops = options?.maxHops ?? this.maxHops;\n\n interface DetailsResponse {\n hops: number;\n paths: number;\n bridges?: string[];\n mutual?: boolean;\n }\n\n try {\n const response = await this.apiRequest<DetailsResponse>(\n `/details/${myPubkey}/${normalizedTarget}?maxHops=${maxHops}`,\n options\n );\n // Oracle doesn't return score, so default to 0\n return { ...response, score: 0 };\n } catch (error) {\n if (error instanceof NotFoundError) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Get the current pubkey (from extension or fallback)\n * Returns the extension's pubkey when available.\n */\n async getMyPubkey(): Promise<string> {\n return this.getEffectivePubkey();\n }\n\n /**\n * Get the current oracle URL\n */\n getOracle(): string {\n return this.oracle;\n }\n\n /**\n * Check if extension is available and being used\n */\n async isUsingExtension(): Promise<boolean> {\n const ext = await this.getExtension();\n return ext !== null;\n }\n\n /**\n * Get detailed extension connection status\n * Can detect if extension is installed but not enabled for this domain\n * @returns Connection status: 'connected' | 'not-enabled' | 'unavailable' | 'not-browser'\n */\n async getExtensionStatus(): Promise<ExtensionConnectionStatus> {\n // Not in browser\n if (typeof window === 'undefined') {\n return 'not-browser';\n }\n\n // Already connected\n if ((window as NostrWindow).nostr?.wot) {\n return 'connected';\n }\n\n // Try to detect if extension is installed via web_accessible_resources\n if (this.extensionId) {\n try {\n const response = await fetch(\n `chrome-extension://${this.extensionId}/detect.json`,\n { method: 'HEAD' }\n );\n if (response.ok) {\n return 'not-enabled'; // Installed but not enabled for this domain\n }\n } catch {\n // Fetch failed - not installed or not accessible\n }\n }\n\n return 'unavailable';\n }\n\n /**\n * Get extension configuration (only available when using extension)\n * @returns Extension config or null if not using extension\n */\n async getExtensionConfig(): Promise<ExtensionConfig | null> {\n const ext = await this.getExtension();\n if (!ext) return null;\n\n return ext.getConfig();\n }\n\n // ============================================\n // Extension-only methods (require extension)\n // ============================================\n\n /**\n * Check if the extension is configured and ready\n * @returns Status object with configuration state, or null if not using extension\n */\n async isConfigured(): Promise<ExtensionStatus | null> {\n const ext = await this.getExtension();\n if (!ext) return null;\n\n return ext.isConfigured();\n }\n\n /**\n * Filter a list of pubkeys to only those within the Web of Trust\n * @param pubkeys - Array of pubkeys to filter\n * @param options - Query options (maxHops)\n * @returns Filtered array of pubkeys within WoT\n *\n * Note: Extension-only. Falls back to batchCheck when extension unavailable.\n */\n async filterByWoT(\n pubkeys: string[],\n options?: QueryOptions\n ): Promise<string[]> {\n if (!Array.isArray(pubkeys) || pubkeys.length === 0) {\n return [];\n }\n\n const normalizedPubkeys = pubkeys\n .filter((pk) => isValidPubkey(pk))\n .map((pk) => normalizePubkey(pk));\n\n const maxHops = options?.maxHops ?? this.maxHops;\n\n // Check extension first - extension has native filterByWoT\n const ext = await this.getExtension();\n if (ext) {\n return ext.filterByWoT(normalizedPubkeys, maxHops);\n }\n\n // Fall back to batchCheck\n const results = await this.batchCheck(normalizedPubkeys, options);\n return Array.from(results.entries())\n .filter(([, result]) => result.inWoT)\n .map(([pubkey]) => pubkey);\n }\n\n /**\n * Get the follow list for a pubkey\n * @param pubkey - Optional, defaults to user's pubkey\n * @returns Array of followed pubkeys\n *\n * Note: Extension-only. Returns empty array if extension unavailable.\n */\n async getFollows(pubkey?: string): Promise<string[]> {\n const ext = await this.getExtension();\n if (!ext) return [];\n\n const normalizedPubkey = pubkey ? this.validatePubkey(pubkey, 'pubkey') : undefined;\n return ext.getFollows(normalizedPubkey);\n }\n\n /**\n * Get mutual follows between the user and a target\n * @param pubkey - Target pubkey\n * @returns Array of common followed pubkeys\n *\n * Note: Extension-only. Returns empty array if extension unavailable.\n */\n async getCommonFollows(pubkey: string): Promise<string[]> {\n const ext = await this.getExtension();\n if (!ext) return [];\n\n const normalizedPubkey = this.validatePubkey(pubkey, 'pubkey');\n return ext.getCommonFollows(normalizedPubkey);\n }\n\n /**\n * Get graph statistics\n * @returns Stats object with node/edge counts and sync info\n *\n * Note: Extension-only. Returns null if extension unavailable.\n */\n async getStats(): Promise<GraphStats | null> {\n const ext = await this.getExtension();\n if (!ext) return null;\n\n return ext.getStats();\n }\n\n /**\n * Get an actual path from the user to the target\n * @param target - Target pubkey\n * @returns Array of pubkeys [user, ..., target], or null if not connected\n *\n * Note: Extension-only. Returns null if extension unavailable.\n */\n async getPath(target: string): Promise<string[] | null> {\n const ext = await this.getExtension();\n if (!ext) return null;\n\n const normalizedTarget = this.validatePubkey(target, 'target');\n return ext.getPath(normalizedTarget);\n }\n\n /**\n * Get distances for multiple pubkeys in a single call\n * @param targets - Array of target pubkeys\n * @param options - Options object or boolean for backwards compatibility\n * - `{ includePaths: true }` - Include path counts\n * - `{ includeScores: true }` - Include trust scores\n * - `{ includePaths: true, includeScores: true }` - Include both\n * - `true` (legacy) - Same as `{ includePaths: true }`\n * @returns Record of pubkey to result based on options\n */\n async getDistanceBatch(\n targets: string[],\n options?: false | undefined\n ): Promise<Record<string, number | null>>;\n async getDistanceBatch(\n targets: string[],\n options: true | { includePaths: true; includeScores?: false }\n ): Promise<Record<string, { hops: number; paths: number } | null>>;\n async getDistanceBatch(\n targets: string[],\n options: { includePaths?: false; includeScores: true }\n ): Promise<Record<string, { hops: number; score: number } | null>>;\n async getDistanceBatch(\n targets: string[],\n options: { includePaths: true; includeScores: true }\n ): Promise<Record<string, { hops: number; paths: number; score: number } | null>>;\n async getDistanceBatch(\n targets: string[],\n options?: boolean | DistanceBatchOptions\n ): Promise<Record<string, number | { hops: number; paths?: number; score?: number } | null>>;\n async getDistanceBatch(\n targets: string[],\n options: boolean | DistanceBatchOptions = false\n ): Promise<Record<string, number | { hops: number; paths?: number; score?: number } | null>> {\n if (!Array.isArray(targets) || targets.length === 0) {\n return {};\n }\n\n const normalizedTargets = targets.map((t, i) =>\n this.validatePubkey(t, `targets[${i}]`)\n );\n\n // Normalize options: boolean `true` means { includePaths: true }\n const opts: DistanceBatchOptions =\n typeof options === 'boolean'\n ? { includePaths: options }\n : options || {};\n\n const { includePaths, includeScores } = opts;\n\n // Check extension first\n const ext = await this.getExtension();\n if (ext) {\n return ext.getDistanceBatch(normalizedTargets, opts);\n }\n\n // Fall back to individual queries\n if (includePaths || includeScores) {\n const results: Record<string, { hops: number; paths?: number; score?: number } | null> = {};\n await Promise.all(\n normalizedTargets.map(async (pubkey) => {\n const details = await this.getDetails(pubkey);\n if (!details) {\n results[pubkey] = null;\n return;\n }\n const result: { hops: number; paths?: number; score?: number } = { hops: details.hops };\n if (includePaths) result.paths = details.paths;\n if (includeScores) result.score = details.score;\n results[pubkey] = result;\n })\n );\n return results;\n }\n\n const results: Record<string, number | null> = {};\n await Promise.all(\n normalizedTargets.map(async (pubkey) => {\n results[pubkey] = await this.getDistance(pubkey);\n })\n );\n return results;\n }\n\n /**\n * Get trust scores for multiple pubkeys in a single call\n * @param targets - Array of target pubkeys\n * @returns Record of pubkey to trust score (null if not connected)\n */\n async getTrustScoreBatch(\n targets: string[]\n ): Promise<Record<string, number | null>> {\n if (!Array.isArray(targets) || targets.length === 0) {\n return {};\n }\n\n const normalizedTargets = targets.map((t, i) =>\n this.validatePubkey(t, `targets[${i}]`)\n );\n\n // Check extension first\n const ext = await this.getExtension();\n if (ext) {\n return ext.getTrustScoreBatch(normalizedTargets);\n }\n\n // Fall back to individual queries\n const results: Record<string, number | null> = {};\n await Promise.all(\n normalizedTargets.map(async (pubkey) => {\n const score = await this.getTrustScore(pubkey);\n results[pubkey] = score > 0 ? score : null;\n })\n );\n\n return results;\n }\n}\n","import {\n createContext,\n useContext,\n useState,\n useEffect,\n useMemo,\n useCallback,\n type ReactNode,\n} from 'react';\nimport { WoT } from '../wot';\nimport type { WoTOptions, NostrWindow } from '../types';\n\n/**\n * Extension connection state\n */\nexport type ExtensionConnectionState =\n | 'checking'\n | 'connected'\n | 'not-available';\n\n/**\n * Extension status exposed to consumers\n */\nexport interface ExtensionState {\n /**\n * Current connection state\n */\n state: ExtensionConnectionState;\n /**\n * Whether extension is connected and ready\n */\n isConnected: boolean;\n /**\n * Whether extension is currently checking\n */\n isChecking: boolean;\n /**\n * Whether check is complete\n */\n isChecked: boolean;\n /**\n * Manually trigger a check\n */\n refresh: () => void;\n}\n\n/**\n * WoT context value\n */\ninterface WoTContextValue {\n wot: WoT | null;\n isReady: boolean;\n extension: ExtensionState;\n}\n\n/**\n * WoT context\n */\nconst WoTContext = createContext<WoTContextValue | null>(null);\n\n/**\n * WoT provider props\n */\nexport interface WoTProviderProps {\n /**\n * WoT configuration options\n */\n options?: Partial<WoTOptions>;\n /**\n * Children to render\n */\n children: ReactNode;\n}\n\n/**\n * Check if extension is available\n */\nfunction checkExtensionAvailable(): boolean {\n if (typeof window === 'undefined') return false;\n return !!(window as NostrWindow).nostr?.wot;\n}\n\n/**\n * WoT provider component\n *\n * Provides WoT instance to all children components.\n * Automatically detects extension availability.\n *\n * @example\n * ```tsx\n * import { WoTProvider } from 'nostr-wot-sdk/react';\n *\n * // Basic usage - automatically detects extension\n * function App() {\n * return (\n * <WoTProvider>\n * <YourApp />\n * </WoTProvider>\n * );\n * }\n *\n * // With fallback for when extension is not available\n * function App() {\n * return (\n * <WoTProvider options={{\n * fallback: { myPubkey: 'abc123...' }\n * }}>\n * <YourApp />\n * </WoTProvider>\n * );\n * }\n * ```\n */\nexport function WoTProvider({\n options = {},\n children,\n}: WoTProviderProps) {\n const [extensionState, setExtensionState] = useState<ExtensionConnectionState>('checking');\n const [isReady, setIsReady] = useState(false);\n\n // Check extension availability (manual refresh)\n const checkExtension = useCallback(() => {\n const available = checkExtensionAvailable();\n setExtensionState(available ? 'connected' : 'not-available');\n setIsReady(true);\n }, []);\n\n // Check on mount with retry mechanism\n // Extensions inject their content scripts asynchronously after page load,\n // so we need to poll for a short period to detect them reliably\n useEffect(() => {\n // Check immediately\n if (checkExtensionAvailable()) {\n setExtensionState('connected');\n setIsReady(true);\n return;\n }\n\n // Retry several times - extensions may inject after page load\n let attempts = 0;\n const maxAttempts = 15;\n const intervalMs = 100; // Check every 100ms for 1.5 seconds total\n\n const intervalId = setInterval(() => {\n attempts++;\n\n if (checkExtensionAvailable()) {\n setExtensionState('connected');\n setIsReady(true);\n clearInterval(intervalId);\n return;\n }\n\n if (attempts >= maxAttempts) {\n setExtensionState('not-available');\n setIsReady(true);\n clearInterval(intervalId);\n }\n }, intervalMs);\n\n return () => clearInterval(intervalId);\n }, []);\n\n // Create WoT instance\n const wot = useMemo(() => {\n if (!isReady) {\n return null;\n }\n\n try {\n return new WoT(options);\n } catch (error) {\n console.error('WoTProvider: Failed to create WoT instance:', error);\n return null;\n }\n }, [\n isReady,\n options.oracle,\n options.myPubkey,\n options.maxHops,\n options.timeout,\n options.fallback?.myPubkey,\n options.fallback?.oracle,\n ]);\n\n // Extension state for consumers\n const extension = useMemo<ExtensionState>(() => {\n const isConnected = extensionState === 'connected';\n const isChecking = extensionState === 'checking';\n const isChecked = extensionState !== 'checking';\n\n return {\n state: extensionState,\n isConnected,\n isChecking,\n isChecked,\n refresh: checkExtension,\n };\n }, [extensionState, checkExtension]);\n\n const value = useMemo<WoTContextValue>(\n () => ({\n wot,\n isReady: isReady && wot !== null,\n extension,\n }),\n [wot, isReady, extension]\n );\n\n return <WoTContext.Provider value={value}>{children}</WoTContext.Provider>;\n}\n\n/**\n * Hook to access WoT context\n *\n * @returns WoT context value\n * @throws If used outside of WoTProvider\n */\nexport function useWoTContext(): WoTContextValue {\n const context = useContext(WoTContext);\n\n if (context === null) {\n throw new Error('useWoTContext must be used within a WoTProvider');\n }\n\n return context;\n}\n\n/**\n * Hook to access WoT instance directly\n *\n * @returns WoT instance or null if not ready\n */\nexport function useWoTInstance(): WoT | null {\n const { wot } = useWoTContext();\n return wot;\n}\n\n/**\n * Hook to access extension state\n *\n * @returns Extension state and status\n *\n * @example\n * ```tsx\n * function ExtensionStatus() {\n * const { isConnected, isChecking } = useExtension();\n *\n * if (isChecking) return <span>Checking...</span>;\n * if (isConnected) return <span>Extension connected!</span>;\n * return <span>Extension not available</span>;\n * }\n * ```\n */\nexport function useExtension(): ExtensionState {\n const { extension } = useWoTContext();\n return extension;\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useWoTContext } from './context';\nimport type { DistanceResult, QueryOptions } from '../types';\n\n/**\n * Result from useWoT hook\n */\nexport interface UseWoTResult {\n /**\n * Distance in hops to target, null if not in WoT\n */\n distance: number | null;\n /**\n * Trust score (0-1)\n */\n score: number;\n /**\n * Whether data is currently loading\n */\n loading: boolean;\n /**\n * Error if query failed\n */\n error: Error | null;\n /**\n * Full details (hops, paths, bridges, mutual)\n */\n details: DistanceResult | null;\n /**\n * Refetch data\n */\n refetch: () => void;\n}\n\n/**\n * Options for useWoT hook\n */\nexport interface UseWoTOptions extends QueryOptions {\n /**\n * Skip the query (useful for conditional fetching)\n */\n skip?: boolean;\n}\n\n/**\n * Hook to get WoT data for a pubkey\n *\n * @param pubkey - Target pubkey\n * @param options - Query options\n * @returns WoT data and loading state\n *\n * @example\n * ```tsx\n * function Profile({ pubkey }) {\n * const { distance, score, loading } = useWoT(pubkey);\n *\n * if (loading) return <Spinner />;\n *\n * return (\n * <div>\n * {distance !== null ? (\n * <span>{distance} hops away (score: {score.toFixed(2)})</span>\n * ) : (\n * <span>Not in your network</span>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useWoT(pubkey: string, options?: UseWoTOptions): UseWoTResult {\n const { wot, isReady } = useWoTContext();\n const [distance, setDistance] = useState<number | null>(null);\n const [score, setScore] = useState(0);\n const [details, setDetails] = useState<DistanceResult | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const fetchIdRef = useRef(0);\n\n const skip = options?.skip ?? false;\n\n const fetchData = useCallback(async () => {\n if (!wot || !pubkey || skip) {\n setLoading(false);\n return;\n }\n\n const fetchId = ++fetchIdRef.current;\n setLoading(true);\n setError(null);\n\n try {\n const [distResult, scoreResult, detailsResult] = await Promise.all([\n wot.getDistance(pubkey, options),\n wot.getTrustScore(pubkey),\n wot.getDetails(pubkey, options),\n ]);\n\n // Only update if this is still the latest request\n if (fetchId === fetchIdRef.current) {\n setDistance(distResult);\n setScore(scoreResult);\n setDetails(detailsResult);\n setLoading(false);\n }\n } catch (err) {\n if (fetchId === fetchIdRef.current) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n setLoading(false);\n }\n }\n }, [wot, pubkey, skip, options?.maxHops, options?.timeout]);\n\n useEffect(() => {\n if (isReady && !skip) {\n fetchData();\n }\n }, [isReady, fetchData, skip]);\n\n const refetch = useCallback(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n distance,\n score,\n loading,\n error,\n details,\n refetch,\n };\n}\n\n/**\n * Result from useIsInWoT hook\n */\nexport interface UseIsInWoTResult {\n /**\n * Whether target is in WoT\n */\n inWoT: boolean;\n /**\n * Whether data is currently loading\n */\n loading: boolean;\n /**\n * Error if query failed\n */\n error: Error | null;\n /**\n * Refetch data\n */\n refetch: () => void;\n}\n\n/**\n * Hook to check if a pubkey is in your WoT\n *\n * @param pubkey - Target pubkey\n * @param options - Query options\n * @returns Whether target is in WoT\n *\n * @example\n * ```tsx\n * function TrustBadge({ pubkey }) {\n * const { inWoT, loading } = useIsInWoT(pubkey, { maxHops: 2 });\n *\n * if (loading) return null;\n *\n * return inWoT ? <span>Trusted</span> : null;\n * }\n * ```\n */\nexport function useIsInWoT(\n pubkey: string,\n options?: UseWoTOptions\n): UseIsInWoTResult {\n const { wot, isReady } = useWoTContext();\n const [inWoT, setInWoT] = useState(false);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const fetchIdRef = useRef(0);\n\n const skip = options?.skip ?? false;\n\n const fetchData = useCallback(async () => {\n if (!wot || !pubkey || skip) {\n setLoading(false);\n return;\n }\n\n const fetchId = ++fetchIdRef.current;\n setLoading(true);\n setError(null);\n\n try {\n const result = await wot.isInMyWoT(pubkey, options);\n\n if (fetchId === fetchIdRef.current) {\n setInWoT(result);\n setLoading(false);\n }\n } catch (err) {\n if (fetchId === fetchIdRef.current) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n setLoading(false);\n }\n }\n }, [wot, pubkey, skip, options?.maxHops, options?.timeout]);\n\n useEffect(() => {\n if (isReady && !skip) {\n fetchData();\n }\n }, [isReady, fetchData, skip]);\n\n const refetch = useCallback(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n inWoT,\n loading,\n error,\n refetch,\n };\n}\n\n/**\n * Result from useTrustScore hook\n */\nexport interface UseTrustScoreResult {\n /**\n * Trust score (0-1)\n */\n score: number;\n /**\n * Whether data is currently loading\n */\n loading: boolean;\n /**\n * Error if query failed\n */\n error: Error | null;\n /**\n * Refetch data\n */\n refetch: () => void;\n}\n\n/**\n * Hook to get trust score for a pubkey\n *\n * @param pubkey - Target pubkey\n * @param options - Query options\n * @returns Trust score\n *\n * @example\n * ```tsx\n * function TrustMeter({ pubkey }) {\n * const { score, loading } = useTrustScore(pubkey);\n *\n * if (loading) return <Spinner />;\n *\n * return <ProgressBar value={score} />;\n * }\n * ```\n */\nexport function useTrustScore(\n pubkey: string,\n options?: UseWoTOptions\n): UseTrustScoreResult {\n const { wot, isReady } = useWoTContext();\n const [score, setScore] = useState(0);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const fetchIdRef = useRef(0);\n\n const skip = options?.skip ?? false;\n\n const fetchData = useCallback(async () => {\n if (!wot || !pubkey || skip) {\n setLoading(false);\n return;\n }\n\n const fetchId = ++fetchIdRef.current;\n setLoading(true);\n setError(null);\n\n try {\n const result = await wot.getTrustScore(pubkey);\n\n if (fetchId === fetchIdRef.current) {\n setScore(result);\n setLoading(false);\n }\n } catch (err) {\n if (fetchId === fetchIdRef.current) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n setLoading(false);\n }\n }\n }, [wot, pubkey, skip]);\n\n useEffect(() => {\n if (isReady && !skip) {\n fetchData();\n }\n }, [isReady, fetchData, skip]);\n\n const refetch = useCallback(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n score,\n loading,\n error,\n refetch,\n };\n}\n\n/**\n * Result from useBatchWoT hook\n */\nexport interface UseBatchWoTResult {\n /**\n * Map of pubkey to result\n */\n results: Map<\n string,\n {\n distance: number | null;\n score: number;\n inWoT: boolean;\n }\n >;\n /**\n * Whether data is currently loading\n */\n loading: boolean;\n /**\n * Error if query failed\n */\n error: Error | null;\n /**\n * Refetch data\n */\n refetch: () => void;\n}\n\n/**\n * Hook to batch check multiple pubkeys\n *\n * @param pubkeys - Array of target pubkeys\n * @param options - Query options\n * @returns Map of results\n *\n * @example\n * ```tsx\n * function UserList({ pubkeys }) {\n * const { results, loading } = useBatchWoT(pubkeys);\n *\n * return (\n * <ul>\n * {pubkeys.map(pk => {\n * const data = results.get(pk);\n * return (\n * <li key={pk}>\n * {data?.inWoT ? 'Trusted' : 'Unknown'}\n * </li>\n * );\n * })}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useBatchWoT(\n pubkeys: string[],\n options?: UseWoTOptions\n): UseBatchWoTResult {\n const { wot, isReady } = useWoTContext();\n const [results, setResults] = useState<UseBatchWoTResult['results']>(\n new Map()\n );\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const fetchIdRef = useRef(0);\n\n const skip = options?.skip ?? false;\n const pubkeysKey = pubkeys.join(',');\n\n const fetchData = useCallback(async () => {\n if (!wot || pubkeys.length === 0 || skip) {\n setLoading(false);\n return;\n }\n\n const fetchId = ++fetchIdRef.current;\n setLoading(true);\n setError(null);\n\n try {\n const batchResults = await wot.batchCheck(pubkeys, options);\n\n if (fetchId === fetchIdRef.current) {\n const mapped = new Map<\n string,\n { distance: number | null; score: number; inWoT: boolean }\n >();\n for (const [pk, result] of batchResults) {\n mapped.set(pk, {\n distance: result.distance,\n score: result.score,\n inWoT: result.inWoT,\n });\n }\n setResults(mapped);\n setLoading(false);\n }\n } catch (err) {\n if (fetchId === fetchIdRef.current) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n setLoading(false);\n }\n }\n }, [wot, pubkeysKey, skip, options?.maxHops, options?.timeout]);\n\n useEffect(() => {\n if (isReady && !skip) {\n fetchData();\n }\n }, [isReady, fetchData, skip]);\n\n const refetch = useCallback(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n results,\n loading,\n error,\n refetch,\n };\n}\n"]}
|
package/dist/react/index.js
CHANGED
|
@@ -89,7 +89,7 @@ function chunk(array, size) {
|
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
// src/wot.ts
|
|
92
|
-
var DEFAULT_EXTENSION_ID = "";
|
|
92
|
+
var DEFAULT_EXTENSION_ID = "gfmefgdkmjpjinecjchlangpamhclhdo";
|
|
93
93
|
var WoT = class {
|
|
94
94
|
constructor(options = {}) {
|
|
95
95
|
this.extension = null;
|
|
@@ -627,8 +627,30 @@ function WoTProvider({
|
|
|
627
627
|
setIsReady(true);
|
|
628
628
|
}, []);
|
|
629
629
|
useEffect(() => {
|
|
630
|
-
|
|
631
|
-
|
|
630
|
+
if (checkExtensionAvailable()) {
|
|
631
|
+
setExtensionState("connected");
|
|
632
|
+
setIsReady(true);
|
|
633
|
+
return;
|
|
634
|
+
}
|
|
635
|
+
let attempts = 0;
|
|
636
|
+
const maxAttempts = 15;
|
|
637
|
+
const intervalMs = 100;
|
|
638
|
+
const intervalId = setInterval(() => {
|
|
639
|
+
attempts++;
|
|
640
|
+
if (checkExtensionAvailable()) {
|
|
641
|
+
setExtensionState("connected");
|
|
642
|
+
setIsReady(true);
|
|
643
|
+
clearInterval(intervalId);
|
|
644
|
+
return;
|
|
645
|
+
}
|
|
646
|
+
if (attempts >= maxAttempts) {
|
|
647
|
+
setExtensionState("not-available");
|
|
648
|
+
setIsReady(true);
|
|
649
|
+
clearInterval(intervalId);
|
|
650
|
+
}
|
|
651
|
+
}, intervalMs);
|
|
652
|
+
return () => clearInterval(intervalId);
|
|
653
|
+
}, []);
|
|
632
654
|
const wot = useMemo(() => {
|
|
633
655
|
if (!isReady) {
|
|
634
656
|
return null;
|
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/errors.ts","../../src/utils.ts","../../src/wot.ts","../../src/react/context.tsx","../../src/react/hooks.ts"],"names":["e","maxHops","results","useState","useCallback","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Base error class for WoT SDK errors\n */\nexport class WoTError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'WoTError';\n // Maintains proper stack trace for where error was thrown (V8 engines)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n // Fix prototype chain for instanceof checks\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when a network request fails\n */\nexport class NetworkError extends WoTError {\n public readonly statusCode?: number;\n public readonly url?: string;\n\n constructor(message: string, statusCode?: number, url?: string) {\n super(message);\n this.name = 'NetworkError';\n this.statusCode = statusCode;\n this.url = url;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when a pubkey is not found in the graph\n */\nexport class NotFoundError extends WoTError {\n public readonly pubkey: string;\n\n constructor(pubkey: string, message?: string) {\n super(message || `Pubkey not found in graph: ${pubkey}`);\n this.name = 'NotFoundError';\n this.pubkey = pubkey;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when a request times out\n */\nexport class TimeoutError extends WoTError {\n public readonly timeout: number;\n\n constructor(timeout: number, message?: string) {\n super(message || `Request timed out after ${timeout}ms`);\n this.name = 'TimeoutError';\n this.timeout = timeout;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when validation fails\n */\nexport class ValidationError extends WoTError {\n public readonly field?: string;\n\n constructor(message: string, field?: string) {\n super(message);\n this.name = 'ValidationError';\n this.field = field;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","/**\n * Default oracle URL\n */\nexport const DEFAULT_ORACLE = 'https://nostr-wot.com';\n\n/**\n * Default max hops for WoT queries\n */\nexport const DEFAULT_MAX_HOPS = 3;\n\n/**\n * Default timeout in milliseconds\n */\nexport const DEFAULT_TIMEOUT = 5000;\n\n/**\n * Validates a hex pubkey\n */\nexport function isValidPubkey(pubkey: string): boolean {\n return /^[0-9a-f]{64}$/i.test(pubkey);\n}\n\n/**\n * Validates an oracle URL (must be HTTPS)\n */\nexport function isValidOracleUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n return parsed.protocol === 'https:';\n } catch {\n return false;\n }\n}\n\n/**\n * Maximum allowed batch size for array inputs\n */\nexport const MAX_BATCH_SIZE = 10000;\n\n/**\n * Normalizes a pubkey to lowercase hex\n */\nexport function normalizePubkey(pubkey: string): string {\n return pubkey.toLowerCase();\n}\n\n/**\n * Creates a fetch request with timeout\n */\nexport async function fetchWithTimeout(\n url: string,\n options: RequestInit & { timeout?: number } = {}\n): Promise<Response> {\n const { timeout = DEFAULT_TIMEOUT, ...fetchOptions } = options;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n return await fetch(url, {\n ...fetchOptions,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\n/**\n * Delays execution for specified milliseconds\n */\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Chunks an array into smaller arrays\n */\nexport function chunk<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n}\n\n/**\n * Creates a deferred promise\n */\nexport interface Deferred<T> {\n promise: Promise<T>;\n resolve: (value: T | PromiseLike<T>) => void;\n reject: (reason?: unknown) => void;\n}\n\nexport function createDeferred<T>(): Deferred<T> {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason?: unknown) => void;\n\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return { promise, resolve, reject };\n}\n","import type {\n WoTOptions,\n WoTFallbackOptions,\n QueryOptions,\n DistanceResult,\n DistanceBatchOptions,\n BatchResult,\n NostrWindow,\n NostrWoTExtension,\n ExtensionConfig,\n ExtensionStatus,\n ExtensionConnectionStatus,\n GraphStats,\n} from './types';\n\n/**\n * Default Chrome Web Store extension ID\n * Update after publishing to Chrome Web Store\n */\nconst DEFAULT_EXTENSION_ID = '';\nimport {\n NetworkError,\n NotFoundError,\n TimeoutError,\n ValidationError,\n} from './errors';\nimport {\n DEFAULT_ORACLE,\n DEFAULT_MAX_HOPS,\n DEFAULT_TIMEOUT,\n MAX_BATCH_SIZE,\n isValidPubkey,\n isValidOracleUrl,\n normalizePubkey,\n fetchWithTimeout,\n chunk,\n} from './utils';\n\n/**\n * WoT (Web of Trust) SDK for querying Nostr trust relationships\n *\n * The SDK always tries to use the browser extension when available.\n * The extension syncs and caches the follow graph locally, providing\n * the best performance and privacy. When the extension is not available,\n * it falls back to the oracle API.\n */\nexport class WoT {\n private readonly oracle: string;\n private readonly fallbackPubkey: string | null;\n private readonly maxHops: number;\n private readonly timeout: number;\n private readonly fallbackOptions: WoTFallbackOptions | null;\n private readonly extensionId: string;\n private extension: NostrWoTExtension | null = null;\n private extensionPubkey: string | null = null;\n\n constructor(options: WoTOptions = {}) {\n this.fallbackOptions = options.fallback ?? null;\n this.extensionId = options.extensionId ?? DEFAULT_EXTENSION_ID;\n\n // Use provided pubkey or fallback pubkey for oracle fallback\n if (options.myPubkey && isValidPubkey(options.myPubkey)) {\n this.fallbackPubkey = normalizePubkey(options.myPubkey);\n } else if (this.fallbackOptions?.myPubkey) {\n this.fallbackPubkey = normalizePubkey(this.fallbackOptions.myPubkey);\n } else {\n this.fallbackPubkey = null;\n }\n\n const oracleUrl = options.oracle ?? this.fallbackOptions?.oracle ?? DEFAULT_ORACLE;\n if (!isValidOracleUrl(oracleUrl)) {\n throw new ValidationError('oracle must be a valid HTTPS URL', 'oracle');\n }\n this.oracle = oracleUrl;\n this.maxHops = options.maxHops ?? this.fallbackOptions?.maxHops ?? DEFAULT_MAX_HOPS;\n this.timeout = options.timeout ?? this.fallbackOptions?.timeout ?? DEFAULT_TIMEOUT;\n }\n\n /**\n * Checks if browser extension is available and returns it\n * Simply checks window.nostr.wot - extension auto-injects when enabled\n * Always returns fresh reference to handle extension reloads\n */\n private async getExtension(): Promise<NostrWoTExtension | null> {\n // Check if running in browser\n if (typeof window === 'undefined') return null;\n\n const win = window as NostrWindow;\n\n // Check if extension API is available (auto-injected by extension)\n if (win.nostr?.wot) {\n this.extension = win.nostr.wot;\n\n // Get pubkey if not already fetched\n if (!this.extensionPubkey) {\n try {\n this.extensionPubkey = await this.extension.getMyPubkey();\n } catch {\n // Fall back to NIP-07 window.nostr.getPublicKey()\n if (win.nostr?.getPublicKey) {\n try {\n this.extensionPubkey = await win.nostr.getPublicKey();\n } catch {\n // Ignore - will use fallback pubkey\n }\n }\n }\n }\n\n return this.extension;\n }\n\n // Extension not available - will fall back to oracle\n this.extension = null;\n return null;\n }\n\n /**\n * Gets the effective pubkey (from extension or fallback)\n */\n private async getEffectivePubkey(): Promise<string> {\n // Try to get extension first\n await this.getExtension();\n\n // Use extension pubkey if available\n if (this.extensionPubkey) {\n return this.extensionPubkey;\n }\n\n // Fall back to provided pubkey\n if (this.fallbackPubkey) {\n return this.fallbackPubkey;\n }\n\n throw new ValidationError(\n 'No pubkey available. Either install the WoT extension or provide myPubkey/fallback options.',\n 'myPubkey'\n );\n }\n\n /**\n * Makes an API request to the oracle\n */\n private async apiRequest<T>(\n endpoint: string,\n options: QueryOptions = {}\n ): Promise<T> {\n const timeout = options.timeout ?? this.timeout;\n const url = `${this.oracle}/api${endpoint}`;\n\n let response: Response;\n try {\n response = await fetchWithTimeout(url, {\n timeout,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n } catch (error) {\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new TimeoutError(timeout);\n }\n throw new NetworkError(error.message, undefined, url);\n }\n throw new NetworkError('Unknown network error', undefined, url);\n }\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new NotFoundError('', `Resource not found: ${endpoint}`);\n }\n throw new NetworkError(\n `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n url\n );\n }\n\n return (await response.json()) as T;\n }\n\n /**\n * Validates a pubkey parameter\n */\n private validatePubkey(pubkey: string, paramName: string): string {\n if (!pubkey) {\n throw new ValidationError(`${paramName} is required`, paramName);\n }\n if (!isValidPubkey(pubkey)) {\n throw new ValidationError(\n `${paramName} must be a valid 64-character hex string`,\n paramName\n );\n }\n return normalizePubkey(pubkey);\n }\n\n /**\n * Get shortest path length to target pubkey\n * @param target - Target pubkey (hex)\n * @param options - Query options\n * @returns Number of hops or null if not reachable\n */\n async getDistance(\n target: string,\n options?: QueryOptions\n ): Promise<number | null> {\n const normalizedTarget = this.validatePubkey(target, 'target');\n\n // Check extension first - extension always takes priority\n const ext = await this.getExtension();\n if (ext) {\n return ext.getDistance(normalizedTarget);\n }\n\n // Fall back to oracle\n const myPubkey = await this.getEffectivePubkey();\n const maxHops = options?.maxHops ?? this.maxHops;\n\n interface DistanceResponse {\n distance: number | null;\n }\n\n try {\n const result = await this.apiRequest<DistanceResponse>(\n `/distance/${myPubkey}/${normalizedTarget}?maxHops=${maxHops}`,\n options\n );\n return result.distance;\n } catch (error) {\n if (error instanceof NotFoundError) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Check if target is within your Web of Trust\n * @param target - Target pubkey (hex)\n * @param options - Query options\n * @returns true if target is within maxHops\n */\n async isInMyWoT(target: string, options?: QueryOptions): Promise<boolean> {\n const normalizedTarget = this.validatePubkey(target, 'target');\n\n // Check extension first - extension always takes priority\n const ext = await this.getExtension();\n if (ext) {\n const maxHops = options?.maxHops ?? this.maxHops;\n return ext.isInMyWoT(normalizedTarget, maxHops);\n }\n\n // Fall back to oracle\n const distance = await this.getDistance(normalizedTarget, options);\n const maxHops = options?.maxHops ?? this.maxHops;\n\n return distance !== null && distance <= maxHops;\n }\n\n /**\n * Get computed trust score from extension\n * @param target - Target pubkey (hex)\n * @returns Trust score between 0 and 1, or 0 if not connected or extension unavailable\n */\n async getTrustScore(target: string): Promise<number> {\n const normalizedTarget = this.validatePubkey(target, 'target');\n\n // Trust scores come from extension only\n const ext = await this.getExtension();\n if (ext) {\n const score = await ext.getTrustScore(normalizedTarget);\n return score ?? 0;\n }\n\n // No extension - cannot calculate trust score\n return 0;\n }\n\n /**\n * Get distance between any two pubkeys\n * @param from - Source pubkey (hex)\n * @param to - Target pubkey (hex)\n * @param options - Query options\n * @returns Number of hops or null if not reachable\n */\n async getDistanceBetween(\n from: string,\n to: string,\n options?: QueryOptions\n ): Promise<number | null> {\n const normalizedFrom = this.validatePubkey(from, 'from');\n const normalizedTo = this.validatePubkey(to, 'to');\n\n // Check extension first - extension always takes priority\n const ext = await this.getExtension();\n if (ext) {\n return ext.getDistanceBetween(normalizedFrom, normalizedTo);\n }\n\n // Fall back to oracle\n const maxHops = options?.maxHops ?? this.maxHops;\n\n interface DistanceResponse {\n distance: number | null;\n }\n\n try {\n const result = await this.apiRequest<DistanceResponse>(\n `/distance/${normalizedFrom}/${normalizedTo}?maxHops=${maxHops}`,\n options\n );\n return result.distance;\n } catch (error) {\n if (error instanceof NotFoundError) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Check multiple pubkeys efficiently\n * @param targets - Array of target pubkeys (hex)\n * @param options - Query options\n * @returns Map of pubkey to result\n */\n async batchCheck(\n targets: string[],\n options?: QueryOptions\n ): Promise<Map<string, BatchResult>> {\n if (!Array.isArray(targets) || targets.length === 0) {\n throw new ValidationError('targets must be a non-empty array', 'targets');\n }\n if (targets.length > MAX_BATCH_SIZE) {\n throw new ValidationError(\n `targets array exceeds maximum size of ${MAX_BATCH_SIZE}`,\n 'targets'\n );\n }\n\n const normalizedTargets = targets.map((t, i) =>\n this.validatePubkey(t, `targets[${i}]`)\n );\n\n const maxHops = options?.maxHops ?? this.maxHops;\n\n // Check extension first - extension always takes priority\n const ext = await this.getExtension();\n if (ext) {\n const results = new Map<string, BatchResult>();\n\n // Use extension's batch APIs for efficiency\n const [distances, scores] = await Promise.all([\n ext.getDistanceBatch(normalizedTargets),\n ext.getTrustScoreBatch(normalizedTargets),\n ]);\n\n for (const pubkey of normalizedTargets) {\n const distance = distances[pubkey] ?? null;\n const score = scores[pubkey] ?? 0;\n\n results.set(pubkey, {\n pubkey,\n distance,\n score,\n inWoT: distance !== null && distance <= maxHops,\n });\n }\n\n return results;\n }\n\n // Fall back to oracle batch API\n const myPubkey = await this.getEffectivePubkey();\n const results = new Map<string, BatchResult>();\n\n // Process in batches of 50 to avoid URL length limits\n const batches = chunk(normalizedTargets, 50);\n\n for (const batch of batches) {\n interface BatchResponse {\n results: Array<{\n pubkey: string;\n distance: number | null;\n paths?: number;\n mutual?: boolean;\n }>;\n }\n\n try {\n const response = await this.apiRequest<BatchResponse>(\n `/batch/${myPubkey}?targets=${batch.join(',')}&maxHops=${maxHops}`,\n options\n );\n\n for (const item of response.results) {\n const inWoT = item.distance !== null && item.distance <= maxHops;\n\n results.set(item.pubkey, {\n pubkey: item.pubkey,\n distance: item.distance,\n score: 0, // Trust scores only available via extension\n inWoT,\n });\n }\n } catch (error) {\n // If batch fails, fill with null results\n for (const pubkey of batch) {\n if (!results.has(pubkey)) {\n results.set(pubkey, {\n pubkey,\n distance: null,\n score: 0,\n inWoT: false,\n });\n }\n }\n\n // Re-throw if not a transient error\n if (!(error instanceof NetworkError)) {\n throw error;\n }\n }\n }\n\n return results;\n }\n\n /**\n * Get distance and path count details\n * @param target - Target pubkey (hex)\n * @param options - Query options\n * @returns Distance result or null if not reachable\n *\n * Note: Extension returns `{ hops, paths }`. Oracle may return\n * additional fields like `bridges` and `mutual`.\n */\n async getDetails(\n target: string,\n options?: QueryOptions\n ): Promise<DistanceResult | null> {\n const normalizedTarget = this.validatePubkey(target, 'target');\n\n // Check extension first - extension always takes priority\n const ext = await this.getExtension();\n if (ext) {\n return ext.getDetails(normalizedTarget);\n }\n\n // Fall back to oracle\n const myPubkey = await this.getEffectivePubkey();\n const maxHops = options?.maxHops ?? this.maxHops;\n\n interface DetailsResponse {\n hops: number;\n paths: number;\n bridges?: string[];\n mutual?: boolean;\n }\n\n try {\n const response = await this.apiRequest<DetailsResponse>(\n `/details/${myPubkey}/${normalizedTarget}?maxHops=${maxHops}`,\n options\n );\n // Oracle doesn't return score, so default to 0\n return { ...response, score: 0 };\n } catch (error) {\n if (error instanceof NotFoundError) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Get the current pubkey (from extension or fallback)\n * Returns the extension's pubkey when available.\n */\n async getMyPubkey(): Promise<string> {\n return this.getEffectivePubkey();\n }\n\n /**\n * Get the current oracle URL\n */\n getOracle(): string {\n return this.oracle;\n }\n\n /**\n * Check if extension is available and being used\n */\n async isUsingExtension(): Promise<boolean> {\n const ext = await this.getExtension();\n return ext !== null;\n }\n\n /**\n * Get detailed extension connection status\n * Can detect if extension is installed but not enabled for this domain\n * @returns Connection status: 'connected' | 'not-enabled' | 'unavailable' | 'not-browser'\n */\n async getExtensionStatus(): Promise<ExtensionConnectionStatus> {\n // Not in browser\n if (typeof window === 'undefined') {\n return 'not-browser';\n }\n\n // Already connected\n if ((window as NostrWindow).nostr?.wot) {\n return 'connected';\n }\n\n // Try to detect if extension is installed via web_accessible_resources\n if (this.extensionId) {\n try {\n const response = await fetch(\n `chrome-extension://${this.extensionId}/detect.json`,\n { method: 'HEAD' }\n );\n if (response.ok) {\n return 'not-enabled'; // Installed but not enabled for this domain\n }\n } catch {\n // Fetch failed - not installed or not accessible\n }\n }\n\n return 'unavailable';\n }\n\n /**\n * Get extension configuration (only available when using extension)\n * @returns Extension config or null if not using extension\n */\n async getExtensionConfig(): Promise<ExtensionConfig | null> {\n const ext = await this.getExtension();\n if (!ext) return null;\n\n return ext.getConfig();\n }\n\n // ============================================\n // Extension-only methods (require extension)\n // ============================================\n\n /**\n * Check if the extension is configured and ready\n * @returns Status object with configuration state, or null if not using extension\n */\n async isConfigured(): Promise<ExtensionStatus | null> {\n const ext = await this.getExtension();\n if (!ext) return null;\n\n return ext.isConfigured();\n }\n\n /**\n * Filter a list of pubkeys to only those within the Web of Trust\n * @param pubkeys - Array of pubkeys to filter\n * @param options - Query options (maxHops)\n * @returns Filtered array of pubkeys within WoT\n *\n * Note: Extension-only. Falls back to batchCheck when extension unavailable.\n */\n async filterByWoT(\n pubkeys: string[],\n options?: QueryOptions\n ): Promise<string[]> {\n if (!Array.isArray(pubkeys) || pubkeys.length === 0) {\n return [];\n }\n\n const normalizedPubkeys = pubkeys\n .filter((pk) => isValidPubkey(pk))\n .map((pk) => normalizePubkey(pk));\n\n const maxHops = options?.maxHops ?? this.maxHops;\n\n // Check extension first - extension has native filterByWoT\n const ext = await this.getExtension();\n if (ext) {\n return ext.filterByWoT(normalizedPubkeys, maxHops);\n }\n\n // Fall back to batchCheck\n const results = await this.batchCheck(normalizedPubkeys, options);\n return Array.from(results.entries())\n .filter(([, result]) => result.inWoT)\n .map(([pubkey]) => pubkey);\n }\n\n /**\n * Get the follow list for a pubkey\n * @param pubkey - Optional, defaults to user's pubkey\n * @returns Array of followed pubkeys\n *\n * Note: Extension-only. Returns empty array if extension unavailable.\n */\n async getFollows(pubkey?: string): Promise<string[]> {\n const ext = await this.getExtension();\n if (!ext) return [];\n\n const normalizedPubkey = pubkey ? this.validatePubkey(pubkey, 'pubkey') : undefined;\n return ext.getFollows(normalizedPubkey);\n }\n\n /**\n * Get mutual follows between the user and a target\n * @param pubkey - Target pubkey\n * @returns Array of common followed pubkeys\n *\n * Note: Extension-only. Returns empty array if extension unavailable.\n */\n async getCommonFollows(pubkey: string): Promise<string[]> {\n const ext = await this.getExtension();\n if (!ext) return [];\n\n const normalizedPubkey = this.validatePubkey(pubkey, 'pubkey');\n return ext.getCommonFollows(normalizedPubkey);\n }\n\n /**\n * Get graph statistics\n * @returns Stats object with node/edge counts and sync info\n *\n * Note: Extension-only. Returns null if extension unavailable.\n */\n async getStats(): Promise<GraphStats | null> {\n const ext = await this.getExtension();\n if (!ext) return null;\n\n return ext.getStats();\n }\n\n /**\n * Get an actual path from the user to the target\n * @param target - Target pubkey\n * @returns Array of pubkeys [user, ..., target], or null if not connected\n *\n * Note: Extension-only. Returns null if extension unavailable.\n */\n async getPath(target: string): Promise<string[] | null> {\n const ext = await this.getExtension();\n if (!ext) return null;\n\n const normalizedTarget = this.validatePubkey(target, 'target');\n return ext.getPath(normalizedTarget);\n }\n\n /**\n * Get distances for multiple pubkeys in a single call\n * @param targets - Array of target pubkeys\n * @param options - Options object or boolean for backwards compatibility\n * - `{ includePaths: true }` - Include path counts\n * - `{ includeScores: true }` - Include trust scores\n * - `{ includePaths: true, includeScores: true }` - Include both\n * - `true` (legacy) - Same as `{ includePaths: true }`\n * @returns Record of pubkey to result based on options\n */\n async getDistanceBatch(\n targets: string[],\n options?: false | undefined\n ): Promise<Record<string, number | null>>;\n async getDistanceBatch(\n targets: string[],\n options: true | { includePaths: true; includeScores?: false }\n ): Promise<Record<string, { hops: number; paths: number } | null>>;\n async getDistanceBatch(\n targets: string[],\n options: { includePaths?: false; includeScores: true }\n ): Promise<Record<string, { hops: number; score: number } | null>>;\n async getDistanceBatch(\n targets: string[],\n options: { includePaths: true; includeScores: true }\n ): Promise<Record<string, { hops: number; paths: number; score: number } | null>>;\n async getDistanceBatch(\n targets: string[],\n options?: boolean | DistanceBatchOptions\n ): Promise<Record<string, number | { hops: number; paths?: number; score?: number } | null>>;\n async getDistanceBatch(\n targets: string[],\n options: boolean | DistanceBatchOptions = false\n ): Promise<Record<string, number | { hops: number; paths?: number; score?: number } | null>> {\n if (!Array.isArray(targets) || targets.length === 0) {\n return {};\n }\n\n const normalizedTargets = targets.map((t, i) =>\n this.validatePubkey(t, `targets[${i}]`)\n );\n\n // Normalize options: boolean `true` means { includePaths: true }\n const opts: DistanceBatchOptions =\n typeof options === 'boolean'\n ? { includePaths: options }\n : options || {};\n\n const { includePaths, includeScores } = opts;\n\n // Check extension first\n const ext = await this.getExtension();\n if (ext) {\n return ext.getDistanceBatch(normalizedTargets, opts);\n }\n\n // Fall back to individual queries\n if (includePaths || includeScores) {\n const results: Record<string, { hops: number; paths?: number; score?: number } | null> = {};\n await Promise.all(\n normalizedTargets.map(async (pubkey) => {\n const details = await this.getDetails(pubkey);\n if (!details) {\n results[pubkey] = null;\n return;\n }\n const result: { hops: number; paths?: number; score?: number } = { hops: details.hops };\n if (includePaths) result.paths = details.paths;\n if (includeScores) result.score = details.score;\n results[pubkey] = result;\n })\n );\n return results;\n }\n\n const results: Record<string, number | null> = {};\n await Promise.all(\n normalizedTargets.map(async (pubkey) => {\n results[pubkey] = await this.getDistance(pubkey);\n })\n );\n return results;\n }\n\n /**\n * Get trust scores for multiple pubkeys in a single call\n * @param targets - Array of target pubkeys\n * @returns Record of pubkey to trust score (null if not connected)\n */\n async getTrustScoreBatch(\n targets: string[]\n ): Promise<Record<string, number | null>> {\n if (!Array.isArray(targets) || targets.length === 0) {\n return {};\n }\n\n const normalizedTargets = targets.map((t, i) =>\n this.validatePubkey(t, `targets[${i}]`)\n );\n\n // Check extension first\n const ext = await this.getExtension();\n if (ext) {\n return ext.getTrustScoreBatch(normalizedTargets);\n }\n\n // Fall back to individual queries\n const results: Record<string, number | null> = {};\n await Promise.all(\n normalizedTargets.map(async (pubkey) => {\n const score = await this.getTrustScore(pubkey);\n results[pubkey] = score > 0 ? score : null;\n })\n );\n\n return results;\n }\n}\n","import {\n createContext,\n useContext,\n useState,\n useEffect,\n useMemo,\n useCallback,\n type ReactNode,\n} from 'react';\nimport { WoT } from '../wot';\nimport type { WoTOptions, NostrWindow } from '../types';\n\n/**\n * Extension connection state\n */\nexport type ExtensionConnectionState =\n | 'checking'\n | 'connected'\n | 'not-available';\n\n/**\n * Extension status exposed to consumers\n */\nexport interface ExtensionState {\n /**\n * Current connection state\n */\n state: ExtensionConnectionState;\n /**\n * Whether extension is connected and ready\n */\n isConnected: boolean;\n /**\n * Whether extension is currently checking\n */\n isChecking: boolean;\n /**\n * Whether check is complete\n */\n isChecked: boolean;\n /**\n * Manually trigger a check\n */\n refresh: () => void;\n}\n\n/**\n * WoT context value\n */\ninterface WoTContextValue {\n wot: WoT | null;\n isReady: boolean;\n extension: ExtensionState;\n}\n\n/**\n * WoT context\n */\nconst WoTContext = createContext<WoTContextValue | null>(null);\n\n/**\n * WoT provider props\n */\nexport interface WoTProviderProps {\n /**\n * WoT configuration options\n */\n options?: Partial<WoTOptions>;\n /**\n * Children to render\n */\n children: ReactNode;\n}\n\n/**\n * Check if extension is available\n */\nfunction checkExtensionAvailable(): boolean {\n if (typeof window === 'undefined') return false;\n return !!(window as NostrWindow).nostr?.wot;\n}\n\n/**\n * WoT provider component\n *\n * Provides WoT instance to all children components.\n * Automatically detects extension availability.\n *\n * @example\n * ```tsx\n * import { WoTProvider } from 'nostr-wot-sdk/react';\n *\n * // Basic usage - automatically detects extension\n * function App() {\n * return (\n * <WoTProvider>\n * <YourApp />\n * </WoTProvider>\n * );\n * }\n *\n * // With fallback for when extension is not available\n * function App() {\n * return (\n * <WoTProvider options={{\n * fallback: { myPubkey: 'abc123...' }\n * }}>\n * <YourApp />\n * </WoTProvider>\n * );\n * }\n * ```\n */\nexport function WoTProvider({\n options = {},\n children,\n}: WoTProviderProps) {\n const [extensionState, setExtensionState] = useState<ExtensionConnectionState>('checking');\n const [isReady, setIsReady] = useState(false);\n\n // Check extension availability\n const checkExtension = useCallback(() => {\n const available = checkExtensionAvailable();\n setExtensionState(available ? 'connected' : 'not-available');\n setIsReady(true);\n }, []);\n\n // Check on mount\n useEffect(() => {\n checkExtension();\n }, [checkExtension]);\n\n // Create WoT instance\n const wot = useMemo(() => {\n if (!isReady) {\n return null;\n }\n\n try {\n return new WoT(options);\n } catch (error) {\n console.error('WoTProvider: Failed to create WoT instance:', error);\n return null;\n }\n }, [\n isReady,\n options.oracle,\n options.myPubkey,\n options.maxHops,\n options.timeout,\n options.fallback?.myPubkey,\n options.fallback?.oracle,\n ]);\n\n // Extension state for consumers\n const extension = useMemo<ExtensionState>(() => {\n const isConnected = extensionState === 'connected';\n const isChecking = extensionState === 'checking';\n const isChecked = extensionState !== 'checking';\n\n return {\n state: extensionState,\n isConnected,\n isChecking,\n isChecked,\n refresh: checkExtension,\n };\n }, [extensionState, checkExtension]);\n\n const value = useMemo<WoTContextValue>(\n () => ({\n wot,\n isReady: isReady && wot !== null,\n extension,\n }),\n [wot, isReady, extension]\n );\n\n return <WoTContext.Provider value={value}>{children}</WoTContext.Provider>;\n}\n\n/**\n * Hook to access WoT context\n *\n * @returns WoT context value\n * @throws If used outside of WoTProvider\n */\nexport function useWoTContext(): WoTContextValue {\n const context = useContext(WoTContext);\n\n if (context === null) {\n throw new Error('useWoTContext must be used within a WoTProvider');\n }\n\n return context;\n}\n\n/**\n * Hook to access WoT instance directly\n *\n * @returns WoT instance or null if not ready\n */\nexport function useWoTInstance(): WoT | null {\n const { wot } = useWoTContext();\n return wot;\n}\n\n/**\n * Hook to access extension state\n *\n * @returns Extension state and status\n *\n * @example\n * ```tsx\n * function ExtensionStatus() {\n * const { isConnected, isChecking } = useExtension();\n *\n * if (isChecking) return <span>Checking...</span>;\n * if (isConnected) return <span>Extension connected!</span>;\n * return <span>Extension not available</span>;\n * }\n * ```\n */\nexport function useExtension(): ExtensionState {\n const { extension } = useWoTContext();\n return extension;\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useWoTContext } from './context';\nimport type { DistanceResult, QueryOptions } from '../types';\n\n/**\n * Result from useWoT hook\n */\nexport interface UseWoTResult {\n /**\n * Distance in hops to target, null if not in WoT\n */\n distance: number | null;\n /**\n * Trust score (0-1)\n */\n score: number;\n /**\n * Whether data is currently loading\n */\n loading: boolean;\n /**\n * Error if query failed\n */\n error: Error | null;\n /**\n * Full details (hops, paths, bridges, mutual)\n */\n details: DistanceResult | null;\n /**\n * Refetch data\n */\n refetch: () => void;\n}\n\n/**\n * Options for useWoT hook\n */\nexport interface UseWoTOptions extends QueryOptions {\n /**\n * Skip the query (useful for conditional fetching)\n */\n skip?: boolean;\n}\n\n/**\n * Hook to get WoT data for a pubkey\n *\n * @param pubkey - Target pubkey\n * @param options - Query options\n * @returns WoT data and loading state\n *\n * @example\n * ```tsx\n * function Profile({ pubkey }) {\n * const { distance, score, loading } = useWoT(pubkey);\n *\n * if (loading) return <Spinner />;\n *\n * return (\n * <div>\n * {distance !== null ? (\n * <span>{distance} hops away (score: {score.toFixed(2)})</span>\n * ) : (\n * <span>Not in your network</span>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useWoT(pubkey: string, options?: UseWoTOptions): UseWoTResult {\n const { wot, isReady } = useWoTContext();\n const [distance, setDistance] = useState<number | null>(null);\n const [score, setScore] = useState(0);\n const [details, setDetails] = useState<DistanceResult | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const fetchIdRef = useRef(0);\n\n const skip = options?.skip ?? false;\n\n const fetchData = useCallback(async () => {\n if (!wot || !pubkey || skip) {\n setLoading(false);\n return;\n }\n\n const fetchId = ++fetchIdRef.current;\n setLoading(true);\n setError(null);\n\n try {\n const [distResult, scoreResult, detailsResult] = await Promise.all([\n wot.getDistance(pubkey, options),\n wot.getTrustScore(pubkey),\n wot.getDetails(pubkey, options),\n ]);\n\n // Only update if this is still the latest request\n if (fetchId === fetchIdRef.current) {\n setDistance(distResult);\n setScore(scoreResult);\n setDetails(detailsResult);\n setLoading(false);\n }\n } catch (err) {\n if (fetchId === fetchIdRef.current) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n setLoading(false);\n }\n }\n }, [wot, pubkey, skip, options?.maxHops, options?.timeout]);\n\n useEffect(() => {\n if (isReady && !skip) {\n fetchData();\n }\n }, [isReady, fetchData, skip]);\n\n const refetch = useCallback(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n distance,\n score,\n loading,\n error,\n details,\n refetch,\n };\n}\n\n/**\n * Result from useIsInWoT hook\n */\nexport interface UseIsInWoTResult {\n /**\n * Whether target is in WoT\n */\n inWoT: boolean;\n /**\n * Whether data is currently loading\n */\n loading: boolean;\n /**\n * Error if query failed\n */\n error: Error | null;\n /**\n * Refetch data\n */\n refetch: () => void;\n}\n\n/**\n * Hook to check if a pubkey is in your WoT\n *\n * @param pubkey - Target pubkey\n * @param options - Query options\n * @returns Whether target is in WoT\n *\n * @example\n * ```tsx\n * function TrustBadge({ pubkey }) {\n * const { inWoT, loading } = useIsInWoT(pubkey, { maxHops: 2 });\n *\n * if (loading) return null;\n *\n * return inWoT ? <span>Trusted</span> : null;\n * }\n * ```\n */\nexport function useIsInWoT(\n pubkey: string,\n options?: UseWoTOptions\n): UseIsInWoTResult {\n const { wot, isReady } = useWoTContext();\n const [inWoT, setInWoT] = useState(false);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const fetchIdRef = useRef(0);\n\n const skip = options?.skip ?? false;\n\n const fetchData = useCallback(async () => {\n if (!wot || !pubkey || skip) {\n setLoading(false);\n return;\n }\n\n const fetchId = ++fetchIdRef.current;\n setLoading(true);\n setError(null);\n\n try {\n const result = await wot.isInMyWoT(pubkey, options);\n\n if (fetchId === fetchIdRef.current) {\n setInWoT(result);\n setLoading(false);\n }\n } catch (err) {\n if (fetchId === fetchIdRef.current) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n setLoading(false);\n }\n }\n }, [wot, pubkey, skip, options?.maxHops, options?.timeout]);\n\n useEffect(() => {\n if (isReady && !skip) {\n fetchData();\n }\n }, [isReady, fetchData, skip]);\n\n const refetch = useCallback(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n inWoT,\n loading,\n error,\n refetch,\n };\n}\n\n/**\n * Result from useTrustScore hook\n */\nexport interface UseTrustScoreResult {\n /**\n * Trust score (0-1)\n */\n score: number;\n /**\n * Whether data is currently loading\n */\n loading: boolean;\n /**\n * Error if query failed\n */\n error: Error | null;\n /**\n * Refetch data\n */\n refetch: () => void;\n}\n\n/**\n * Hook to get trust score for a pubkey\n *\n * @param pubkey - Target pubkey\n * @param options - Query options\n * @returns Trust score\n *\n * @example\n * ```tsx\n * function TrustMeter({ pubkey }) {\n * const { score, loading } = useTrustScore(pubkey);\n *\n * if (loading) return <Spinner />;\n *\n * return <ProgressBar value={score} />;\n * }\n * ```\n */\nexport function useTrustScore(\n pubkey: string,\n options?: UseWoTOptions\n): UseTrustScoreResult {\n const { wot, isReady } = useWoTContext();\n const [score, setScore] = useState(0);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const fetchIdRef = useRef(0);\n\n const skip = options?.skip ?? false;\n\n const fetchData = useCallback(async () => {\n if (!wot || !pubkey || skip) {\n setLoading(false);\n return;\n }\n\n const fetchId = ++fetchIdRef.current;\n setLoading(true);\n setError(null);\n\n try {\n const result = await wot.getTrustScore(pubkey);\n\n if (fetchId === fetchIdRef.current) {\n setScore(result);\n setLoading(false);\n }\n } catch (err) {\n if (fetchId === fetchIdRef.current) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n setLoading(false);\n }\n }\n }, [wot, pubkey, skip]);\n\n useEffect(() => {\n if (isReady && !skip) {\n fetchData();\n }\n }, [isReady, fetchData, skip]);\n\n const refetch = useCallback(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n score,\n loading,\n error,\n refetch,\n };\n}\n\n/**\n * Result from useBatchWoT hook\n */\nexport interface UseBatchWoTResult {\n /**\n * Map of pubkey to result\n */\n results: Map<\n string,\n {\n distance: number | null;\n score: number;\n inWoT: boolean;\n }\n >;\n /**\n * Whether data is currently loading\n */\n loading: boolean;\n /**\n * Error if query failed\n */\n error: Error | null;\n /**\n * Refetch data\n */\n refetch: () => void;\n}\n\n/**\n * Hook to batch check multiple pubkeys\n *\n * @param pubkeys - Array of target pubkeys\n * @param options - Query options\n * @returns Map of results\n *\n * @example\n * ```tsx\n * function UserList({ pubkeys }) {\n * const { results, loading } = useBatchWoT(pubkeys);\n *\n * return (\n * <ul>\n * {pubkeys.map(pk => {\n * const data = results.get(pk);\n * return (\n * <li key={pk}>\n * {data?.inWoT ? 'Trusted' : 'Unknown'}\n * </li>\n * );\n * })}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useBatchWoT(\n pubkeys: string[],\n options?: UseWoTOptions\n): UseBatchWoTResult {\n const { wot, isReady } = useWoTContext();\n const [results, setResults] = useState<UseBatchWoTResult['results']>(\n new Map()\n );\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const fetchIdRef = useRef(0);\n\n const skip = options?.skip ?? false;\n const pubkeysKey = pubkeys.join(',');\n\n const fetchData = useCallback(async () => {\n if (!wot || pubkeys.length === 0 || skip) {\n setLoading(false);\n return;\n }\n\n const fetchId = ++fetchIdRef.current;\n setLoading(true);\n setError(null);\n\n try {\n const batchResults = await wot.batchCheck(pubkeys, options);\n\n if (fetchId === fetchIdRef.current) {\n const mapped = new Map<\n string,\n { distance: number | null; score: number; inWoT: boolean }\n >();\n for (const [pk, result] of batchResults) {\n mapped.set(pk, {\n distance: result.distance,\n score: result.score,\n inWoT: result.inWoT,\n });\n }\n setResults(mapped);\n setLoading(false);\n }\n } catch (err) {\n if (fetchId === fetchIdRef.current) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n setLoading(false);\n }\n }\n }, [wot, pubkeysKey, skip, options?.maxHops, options?.timeout]);\n\n useEffect(() => {\n if (isReady && !skip) {\n fetchData();\n }\n }, [isReady, fetchData, skip]);\n\n const refetch = useCallback(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n results,\n loading,\n error,\n refetch,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/errors.ts","../../src/utils.ts","../../src/wot.ts","../../src/react/context.tsx","../../src/react/hooks.ts"],"names":["e","maxHops","results","useState","useCallback","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Base error class for WoT SDK errors\n */\nexport class WoTError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'WoTError';\n // Maintains proper stack trace for where error was thrown (V8 engines)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n // Fix prototype chain for instanceof checks\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when a network request fails\n */\nexport class NetworkError extends WoTError {\n public readonly statusCode?: number;\n public readonly url?: string;\n\n constructor(message: string, statusCode?: number, url?: string) {\n super(message);\n this.name = 'NetworkError';\n this.statusCode = statusCode;\n this.url = url;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when a pubkey is not found in the graph\n */\nexport class NotFoundError extends WoTError {\n public readonly pubkey: string;\n\n constructor(pubkey: string, message?: string) {\n super(message || `Pubkey not found in graph: ${pubkey}`);\n this.name = 'NotFoundError';\n this.pubkey = pubkey;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when a request times out\n */\nexport class TimeoutError extends WoTError {\n public readonly timeout: number;\n\n constructor(timeout: number, message?: string) {\n super(message || `Request timed out after ${timeout}ms`);\n this.name = 'TimeoutError';\n this.timeout = timeout;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when validation fails\n */\nexport class ValidationError extends WoTError {\n public readonly field?: string;\n\n constructor(message: string, field?: string) {\n super(message);\n this.name = 'ValidationError';\n this.field = field;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","/**\n * Default oracle URL\n */\nexport const DEFAULT_ORACLE = 'https://nostr-wot.com';\n\n/**\n * Default max hops for WoT queries\n */\nexport const DEFAULT_MAX_HOPS = 3;\n\n/**\n * Default timeout in milliseconds\n */\nexport const DEFAULT_TIMEOUT = 5000;\n\n/**\n * Validates a hex pubkey\n */\nexport function isValidPubkey(pubkey: string): boolean {\n return /^[0-9a-f]{64}$/i.test(pubkey);\n}\n\n/**\n * Validates an oracle URL (must be HTTPS)\n */\nexport function isValidOracleUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n return parsed.protocol === 'https:';\n } catch {\n return false;\n }\n}\n\n/**\n * Maximum allowed batch size for array inputs\n */\nexport const MAX_BATCH_SIZE = 10000;\n\n/**\n * Normalizes a pubkey to lowercase hex\n */\nexport function normalizePubkey(pubkey: string): string {\n return pubkey.toLowerCase();\n}\n\n/**\n * Creates a fetch request with timeout\n */\nexport async function fetchWithTimeout(\n url: string,\n options: RequestInit & { timeout?: number } = {}\n): Promise<Response> {\n const { timeout = DEFAULT_TIMEOUT, ...fetchOptions } = options;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n return await fetch(url, {\n ...fetchOptions,\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\n/**\n * Delays execution for specified milliseconds\n */\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Chunks an array into smaller arrays\n */\nexport function chunk<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n}\n\n/**\n * Creates a deferred promise\n */\nexport interface Deferred<T> {\n promise: Promise<T>;\n resolve: (value: T | PromiseLike<T>) => void;\n reject: (reason?: unknown) => void;\n}\n\nexport function createDeferred<T>(): Deferred<T> {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason?: unknown) => void;\n\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return { promise, resolve, reject };\n}\n","import type {\n WoTOptions,\n WoTFallbackOptions,\n QueryOptions,\n DistanceResult,\n DistanceBatchOptions,\n BatchResult,\n NostrWindow,\n NostrWoTExtension,\n ExtensionConfig,\n ExtensionStatus,\n ExtensionConnectionStatus,\n GraphStats,\n} from './types';\n\n/**\n * Default Chrome Web Store extension ID\n */\nconst DEFAULT_EXTENSION_ID = 'gfmefgdkmjpjinecjchlangpamhclhdo';\nimport {\n NetworkError,\n NotFoundError,\n TimeoutError,\n ValidationError,\n} from './errors';\nimport {\n DEFAULT_ORACLE,\n DEFAULT_MAX_HOPS,\n DEFAULT_TIMEOUT,\n MAX_BATCH_SIZE,\n isValidPubkey,\n isValidOracleUrl,\n normalizePubkey,\n fetchWithTimeout,\n chunk,\n} from './utils';\n\n/**\n * WoT (Web of Trust) SDK for querying Nostr trust relationships\n *\n * The SDK always tries to use the browser extension when available.\n * The extension syncs and caches the follow graph locally, providing\n * the best performance and privacy. When the extension is not available,\n * it falls back to the oracle API.\n */\nexport class WoT {\n private readonly oracle: string;\n private readonly fallbackPubkey: string | null;\n private readonly maxHops: number;\n private readonly timeout: number;\n private readonly fallbackOptions: WoTFallbackOptions | null;\n private readonly extensionId: string;\n private extension: NostrWoTExtension | null = null;\n private extensionPubkey: string | null = null;\n\n constructor(options: WoTOptions = {}) {\n this.fallbackOptions = options.fallback ?? null;\n this.extensionId = options.extensionId ?? DEFAULT_EXTENSION_ID;\n\n // Use provided pubkey or fallback pubkey for oracle fallback\n if (options.myPubkey && isValidPubkey(options.myPubkey)) {\n this.fallbackPubkey = normalizePubkey(options.myPubkey);\n } else if (this.fallbackOptions?.myPubkey) {\n this.fallbackPubkey = normalizePubkey(this.fallbackOptions.myPubkey);\n } else {\n this.fallbackPubkey = null;\n }\n\n const oracleUrl = options.oracle ?? this.fallbackOptions?.oracle ?? DEFAULT_ORACLE;\n if (!isValidOracleUrl(oracleUrl)) {\n throw new ValidationError('oracle must be a valid HTTPS URL', 'oracle');\n }\n this.oracle = oracleUrl;\n this.maxHops = options.maxHops ?? this.fallbackOptions?.maxHops ?? DEFAULT_MAX_HOPS;\n this.timeout = options.timeout ?? this.fallbackOptions?.timeout ?? DEFAULT_TIMEOUT;\n }\n\n /**\n * Checks if browser extension is available and returns it\n * Simply checks window.nostr.wot - extension auto-injects when enabled\n * Always returns fresh reference to handle extension reloads\n */\n private async getExtension(): Promise<NostrWoTExtension | null> {\n // Check if running in browser\n if (typeof window === 'undefined') return null;\n\n const win = window as NostrWindow;\n\n // Check if extension API is available (auto-injected by extension)\n if (win.nostr?.wot) {\n this.extension = win.nostr.wot;\n\n // Get pubkey if not already fetched\n if (!this.extensionPubkey) {\n try {\n this.extensionPubkey = await this.extension.getMyPubkey();\n } catch {\n // Fall back to NIP-07 window.nostr.getPublicKey()\n if (win.nostr?.getPublicKey) {\n try {\n this.extensionPubkey = await win.nostr.getPublicKey();\n } catch {\n // Ignore - will use fallback pubkey\n }\n }\n }\n }\n\n return this.extension;\n }\n\n // Extension not available - will fall back to oracle\n this.extension = null;\n return null;\n }\n\n /**\n * Gets the effective pubkey (from extension or fallback)\n */\n private async getEffectivePubkey(): Promise<string> {\n // Try to get extension first\n await this.getExtension();\n\n // Use extension pubkey if available\n if (this.extensionPubkey) {\n return this.extensionPubkey;\n }\n\n // Fall back to provided pubkey\n if (this.fallbackPubkey) {\n return this.fallbackPubkey;\n }\n\n throw new ValidationError(\n 'No pubkey available. Either install the WoT extension or provide myPubkey/fallback options.',\n 'myPubkey'\n );\n }\n\n /**\n * Makes an API request to the oracle\n */\n private async apiRequest<T>(\n endpoint: string,\n options: QueryOptions = {}\n ): Promise<T> {\n const timeout = options.timeout ?? this.timeout;\n const url = `${this.oracle}/api${endpoint}`;\n\n let response: Response;\n try {\n response = await fetchWithTimeout(url, {\n timeout,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n } catch (error) {\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new TimeoutError(timeout);\n }\n throw new NetworkError(error.message, undefined, url);\n }\n throw new NetworkError('Unknown network error', undefined, url);\n }\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new NotFoundError('', `Resource not found: ${endpoint}`);\n }\n throw new NetworkError(\n `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n url\n );\n }\n\n return (await response.json()) as T;\n }\n\n /**\n * Validates a pubkey parameter\n */\n private validatePubkey(pubkey: string, paramName: string): string {\n if (!pubkey) {\n throw new ValidationError(`${paramName} is required`, paramName);\n }\n if (!isValidPubkey(pubkey)) {\n throw new ValidationError(\n `${paramName} must be a valid 64-character hex string`,\n paramName\n );\n }\n return normalizePubkey(pubkey);\n }\n\n /**\n * Get shortest path length to target pubkey\n * @param target - Target pubkey (hex)\n * @param options - Query options\n * @returns Number of hops or null if not reachable\n */\n async getDistance(\n target: string,\n options?: QueryOptions\n ): Promise<number | null> {\n const normalizedTarget = this.validatePubkey(target, 'target');\n\n // Check extension first - extension always takes priority\n const ext = await this.getExtension();\n if (ext) {\n return ext.getDistance(normalizedTarget);\n }\n\n // Fall back to oracle\n const myPubkey = await this.getEffectivePubkey();\n const maxHops = options?.maxHops ?? this.maxHops;\n\n interface DistanceResponse {\n distance: number | null;\n }\n\n try {\n const result = await this.apiRequest<DistanceResponse>(\n `/distance/${myPubkey}/${normalizedTarget}?maxHops=${maxHops}`,\n options\n );\n return result.distance;\n } catch (error) {\n if (error instanceof NotFoundError) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Check if target is within your Web of Trust\n * @param target - Target pubkey (hex)\n * @param options - Query options\n * @returns true if target is within maxHops\n */\n async isInMyWoT(target: string, options?: QueryOptions): Promise<boolean> {\n const normalizedTarget = this.validatePubkey(target, 'target');\n\n // Check extension first - extension always takes priority\n const ext = await this.getExtension();\n if (ext) {\n const maxHops = options?.maxHops ?? this.maxHops;\n return ext.isInMyWoT(normalizedTarget, maxHops);\n }\n\n // Fall back to oracle\n const distance = await this.getDistance(normalizedTarget, options);\n const maxHops = options?.maxHops ?? this.maxHops;\n\n return distance !== null && distance <= maxHops;\n }\n\n /**\n * Get computed trust score from extension\n * @param target - Target pubkey (hex)\n * @returns Trust score between 0 and 1, or 0 if not connected or extension unavailable\n */\n async getTrustScore(target: string): Promise<number> {\n const normalizedTarget = this.validatePubkey(target, 'target');\n\n // Trust scores come from extension only\n const ext = await this.getExtension();\n if (ext) {\n const score = await ext.getTrustScore(normalizedTarget);\n return score ?? 0;\n }\n\n // No extension - cannot calculate trust score\n return 0;\n }\n\n /**\n * Get distance between any two pubkeys\n * @param from - Source pubkey (hex)\n * @param to - Target pubkey (hex)\n * @param options - Query options\n * @returns Number of hops or null if not reachable\n */\n async getDistanceBetween(\n from: string,\n to: string,\n options?: QueryOptions\n ): Promise<number | null> {\n const normalizedFrom = this.validatePubkey(from, 'from');\n const normalizedTo = this.validatePubkey(to, 'to');\n\n // Check extension first - extension always takes priority\n const ext = await this.getExtension();\n if (ext) {\n return ext.getDistanceBetween(normalizedFrom, normalizedTo);\n }\n\n // Fall back to oracle\n const maxHops = options?.maxHops ?? this.maxHops;\n\n interface DistanceResponse {\n distance: number | null;\n }\n\n try {\n const result = await this.apiRequest<DistanceResponse>(\n `/distance/${normalizedFrom}/${normalizedTo}?maxHops=${maxHops}`,\n options\n );\n return result.distance;\n } catch (error) {\n if (error instanceof NotFoundError) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Check multiple pubkeys efficiently\n * @param targets - Array of target pubkeys (hex)\n * @param options - Query options\n * @returns Map of pubkey to result\n */\n async batchCheck(\n targets: string[],\n options?: QueryOptions\n ): Promise<Map<string, BatchResult>> {\n if (!Array.isArray(targets) || targets.length === 0) {\n throw new ValidationError('targets must be a non-empty array', 'targets');\n }\n if (targets.length > MAX_BATCH_SIZE) {\n throw new ValidationError(\n `targets array exceeds maximum size of ${MAX_BATCH_SIZE}`,\n 'targets'\n );\n }\n\n const normalizedTargets = targets.map((t, i) =>\n this.validatePubkey(t, `targets[${i}]`)\n );\n\n const maxHops = options?.maxHops ?? this.maxHops;\n\n // Check extension first - extension always takes priority\n const ext = await this.getExtension();\n if (ext) {\n const results = new Map<string, BatchResult>();\n\n // Use extension's batch APIs for efficiency\n const [distances, scores] = await Promise.all([\n ext.getDistanceBatch(normalizedTargets),\n ext.getTrustScoreBatch(normalizedTargets),\n ]);\n\n for (const pubkey of normalizedTargets) {\n const distance = distances[pubkey] ?? null;\n const score = scores[pubkey] ?? 0;\n\n results.set(pubkey, {\n pubkey,\n distance,\n score,\n inWoT: distance !== null && distance <= maxHops,\n });\n }\n\n return results;\n }\n\n // Fall back to oracle batch API\n const myPubkey = await this.getEffectivePubkey();\n const results = new Map<string, BatchResult>();\n\n // Process in batches of 50 to avoid URL length limits\n const batches = chunk(normalizedTargets, 50);\n\n for (const batch of batches) {\n interface BatchResponse {\n results: Array<{\n pubkey: string;\n distance: number | null;\n paths?: number;\n mutual?: boolean;\n }>;\n }\n\n try {\n const response = await this.apiRequest<BatchResponse>(\n `/batch/${myPubkey}?targets=${batch.join(',')}&maxHops=${maxHops}`,\n options\n );\n\n for (const item of response.results) {\n const inWoT = item.distance !== null && item.distance <= maxHops;\n\n results.set(item.pubkey, {\n pubkey: item.pubkey,\n distance: item.distance,\n score: 0, // Trust scores only available via extension\n inWoT,\n });\n }\n } catch (error) {\n // If batch fails, fill with null results\n for (const pubkey of batch) {\n if (!results.has(pubkey)) {\n results.set(pubkey, {\n pubkey,\n distance: null,\n score: 0,\n inWoT: false,\n });\n }\n }\n\n // Re-throw if not a transient error\n if (!(error instanceof NetworkError)) {\n throw error;\n }\n }\n }\n\n return results;\n }\n\n /**\n * Get distance and path count details\n * @param target - Target pubkey (hex)\n * @param options - Query options\n * @returns Distance result or null if not reachable\n *\n * Note: Extension returns `{ hops, paths }`. Oracle may return\n * additional fields like `bridges` and `mutual`.\n */\n async getDetails(\n target: string,\n options?: QueryOptions\n ): Promise<DistanceResult | null> {\n const normalizedTarget = this.validatePubkey(target, 'target');\n\n // Check extension first - extension always takes priority\n const ext = await this.getExtension();\n if (ext) {\n return ext.getDetails(normalizedTarget);\n }\n\n // Fall back to oracle\n const myPubkey = await this.getEffectivePubkey();\n const maxHops = options?.maxHops ?? this.maxHops;\n\n interface DetailsResponse {\n hops: number;\n paths: number;\n bridges?: string[];\n mutual?: boolean;\n }\n\n try {\n const response = await this.apiRequest<DetailsResponse>(\n `/details/${myPubkey}/${normalizedTarget}?maxHops=${maxHops}`,\n options\n );\n // Oracle doesn't return score, so default to 0\n return { ...response, score: 0 };\n } catch (error) {\n if (error instanceof NotFoundError) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Get the current pubkey (from extension or fallback)\n * Returns the extension's pubkey when available.\n */\n async getMyPubkey(): Promise<string> {\n return this.getEffectivePubkey();\n }\n\n /**\n * Get the current oracle URL\n */\n getOracle(): string {\n return this.oracle;\n }\n\n /**\n * Check if extension is available and being used\n */\n async isUsingExtension(): Promise<boolean> {\n const ext = await this.getExtension();\n return ext !== null;\n }\n\n /**\n * Get detailed extension connection status\n * Can detect if extension is installed but not enabled for this domain\n * @returns Connection status: 'connected' | 'not-enabled' | 'unavailable' | 'not-browser'\n */\n async getExtensionStatus(): Promise<ExtensionConnectionStatus> {\n // Not in browser\n if (typeof window === 'undefined') {\n return 'not-browser';\n }\n\n // Already connected\n if ((window as NostrWindow).nostr?.wot) {\n return 'connected';\n }\n\n // Try to detect if extension is installed via web_accessible_resources\n if (this.extensionId) {\n try {\n const response = await fetch(\n `chrome-extension://${this.extensionId}/detect.json`,\n { method: 'HEAD' }\n );\n if (response.ok) {\n return 'not-enabled'; // Installed but not enabled for this domain\n }\n } catch {\n // Fetch failed - not installed or not accessible\n }\n }\n\n return 'unavailable';\n }\n\n /**\n * Get extension configuration (only available when using extension)\n * @returns Extension config or null if not using extension\n */\n async getExtensionConfig(): Promise<ExtensionConfig | null> {\n const ext = await this.getExtension();\n if (!ext) return null;\n\n return ext.getConfig();\n }\n\n // ============================================\n // Extension-only methods (require extension)\n // ============================================\n\n /**\n * Check if the extension is configured and ready\n * @returns Status object with configuration state, or null if not using extension\n */\n async isConfigured(): Promise<ExtensionStatus | null> {\n const ext = await this.getExtension();\n if (!ext) return null;\n\n return ext.isConfigured();\n }\n\n /**\n * Filter a list of pubkeys to only those within the Web of Trust\n * @param pubkeys - Array of pubkeys to filter\n * @param options - Query options (maxHops)\n * @returns Filtered array of pubkeys within WoT\n *\n * Note: Extension-only. Falls back to batchCheck when extension unavailable.\n */\n async filterByWoT(\n pubkeys: string[],\n options?: QueryOptions\n ): Promise<string[]> {\n if (!Array.isArray(pubkeys) || pubkeys.length === 0) {\n return [];\n }\n\n const normalizedPubkeys = pubkeys\n .filter((pk) => isValidPubkey(pk))\n .map((pk) => normalizePubkey(pk));\n\n const maxHops = options?.maxHops ?? this.maxHops;\n\n // Check extension first - extension has native filterByWoT\n const ext = await this.getExtension();\n if (ext) {\n return ext.filterByWoT(normalizedPubkeys, maxHops);\n }\n\n // Fall back to batchCheck\n const results = await this.batchCheck(normalizedPubkeys, options);\n return Array.from(results.entries())\n .filter(([, result]) => result.inWoT)\n .map(([pubkey]) => pubkey);\n }\n\n /**\n * Get the follow list for a pubkey\n * @param pubkey - Optional, defaults to user's pubkey\n * @returns Array of followed pubkeys\n *\n * Note: Extension-only. Returns empty array if extension unavailable.\n */\n async getFollows(pubkey?: string): Promise<string[]> {\n const ext = await this.getExtension();\n if (!ext) return [];\n\n const normalizedPubkey = pubkey ? this.validatePubkey(pubkey, 'pubkey') : undefined;\n return ext.getFollows(normalizedPubkey);\n }\n\n /**\n * Get mutual follows between the user and a target\n * @param pubkey - Target pubkey\n * @returns Array of common followed pubkeys\n *\n * Note: Extension-only. Returns empty array if extension unavailable.\n */\n async getCommonFollows(pubkey: string): Promise<string[]> {\n const ext = await this.getExtension();\n if (!ext) return [];\n\n const normalizedPubkey = this.validatePubkey(pubkey, 'pubkey');\n return ext.getCommonFollows(normalizedPubkey);\n }\n\n /**\n * Get graph statistics\n * @returns Stats object with node/edge counts and sync info\n *\n * Note: Extension-only. Returns null if extension unavailable.\n */\n async getStats(): Promise<GraphStats | null> {\n const ext = await this.getExtension();\n if (!ext) return null;\n\n return ext.getStats();\n }\n\n /**\n * Get an actual path from the user to the target\n * @param target - Target pubkey\n * @returns Array of pubkeys [user, ..., target], or null if not connected\n *\n * Note: Extension-only. Returns null if extension unavailable.\n */\n async getPath(target: string): Promise<string[] | null> {\n const ext = await this.getExtension();\n if (!ext) return null;\n\n const normalizedTarget = this.validatePubkey(target, 'target');\n return ext.getPath(normalizedTarget);\n }\n\n /**\n * Get distances for multiple pubkeys in a single call\n * @param targets - Array of target pubkeys\n * @param options - Options object or boolean for backwards compatibility\n * - `{ includePaths: true }` - Include path counts\n * - `{ includeScores: true }` - Include trust scores\n * - `{ includePaths: true, includeScores: true }` - Include both\n * - `true` (legacy) - Same as `{ includePaths: true }`\n * @returns Record of pubkey to result based on options\n */\n async getDistanceBatch(\n targets: string[],\n options?: false | undefined\n ): Promise<Record<string, number | null>>;\n async getDistanceBatch(\n targets: string[],\n options: true | { includePaths: true; includeScores?: false }\n ): Promise<Record<string, { hops: number; paths: number } | null>>;\n async getDistanceBatch(\n targets: string[],\n options: { includePaths?: false; includeScores: true }\n ): Promise<Record<string, { hops: number; score: number } | null>>;\n async getDistanceBatch(\n targets: string[],\n options: { includePaths: true; includeScores: true }\n ): Promise<Record<string, { hops: number; paths: number; score: number } | null>>;\n async getDistanceBatch(\n targets: string[],\n options?: boolean | DistanceBatchOptions\n ): Promise<Record<string, number | { hops: number; paths?: number; score?: number } | null>>;\n async getDistanceBatch(\n targets: string[],\n options: boolean | DistanceBatchOptions = false\n ): Promise<Record<string, number | { hops: number; paths?: number; score?: number } | null>> {\n if (!Array.isArray(targets) || targets.length === 0) {\n return {};\n }\n\n const normalizedTargets = targets.map((t, i) =>\n this.validatePubkey(t, `targets[${i}]`)\n );\n\n // Normalize options: boolean `true` means { includePaths: true }\n const opts: DistanceBatchOptions =\n typeof options === 'boolean'\n ? { includePaths: options }\n : options || {};\n\n const { includePaths, includeScores } = opts;\n\n // Check extension first\n const ext = await this.getExtension();\n if (ext) {\n return ext.getDistanceBatch(normalizedTargets, opts);\n }\n\n // Fall back to individual queries\n if (includePaths || includeScores) {\n const results: Record<string, { hops: number; paths?: number; score?: number } | null> = {};\n await Promise.all(\n normalizedTargets.map(async (pubkey) => {\n const details = await this.getDetails(pubkey);\n if (!details) {\n results[pubkey] = null;\n return;\n }\n const result: { hops: number; paths?: number; score?: number } = { hops: details.hops };\n if (includePaths) result.paths = details.paths;\n if (includeScores) result.score = details.score;\n results[pubkey] = result;\n })\n );\n return results;\n }\n\n const results: Record<string, number | null> = {};\n await Promise.all(\n normalizedTargets.map(async (pubkey) => {\n results[pubkey] = await this.getDistance(pubkey);\n })\n );\n return results;\n }\n\n /**\n * Get trust scores for multiple pubkeys in a single call\n * @param targets - Array of target pubkeys\n * @returns Record of pubkey to trust score (null if not connected)\n */\n async getTrustScoreBatch(\n targets: string[]\n ): Promise<Record<string, number | null>> {\n if (!Array.isArray(targets) || targets.length === 0) {\n return {};\n }\n\n const normalizedTargets = targets.map((t, i) =>\n this.validatePubkey(t, `targets[${i}]`)\n );\n\n // Check extension first\n const ext = await this.getExtension();\n if (ext) {\n return ext.getTrustScoreBatch(normalizedTargets);\n }\n\n // Fall back to individual queries\n const results: Record<string, number | null> = {};\n await Promise.all(\n normalizedTargets.map(async (pubkey) => {\n const score = await this.getTrustScore(pubkey);\n results[pubkey] = score > 0 ? score : null;\n })\n );\n\n return results;\n }\n}\n","import {\n createContext,\n useContext,\n useState,\n useEffect,\n useMemo,\n useCallback,\n type ReactNode,\n} from 'react';\nimport { WoT } from '../wot';\nimport type { WoTOptions, NostrWindow } from '../types';\n\n/**\n * Extension connection state\n */\nexport type ExtensionConnectionState =\n | 'checking'\n | 'connected'\n | 'not-available';\n\n/**\n * Extension status exposed to consumers\n */\nexport interface ExtensionState {\n /**\n * Current connection state\n */\n state: ExtensionConnectionState;\n /**\n * Whether extension is connected and ready\n */\n isConnected: boolean;\n /**\n * Whether extension is currently checking\n */\n isChecking: boolean;\n /**\n * Whether check is complete\n */\n isChecked: boolean;\n /**\n * Manually trigger a check\n */\n refresh: () => void;\n}\n\n/**\n * WoT context value\n */\ninterface WoTContextValue {\n wot: WoT | null;\n isReady: boolean;\n extension: ExtensionState;\n}\n\n/**\n * WoT context\n */\nconst WoTContext = createContext<WoTContextValue | null>(null);\n\n/**\n * WoT provider props\n */\nexport interface WoTProviderProps {\n /**\n * WoT configuration options\n */\n options?: Partial<WoTOptions>;\n /**\n * Children to render\n */\n children: ReactNode;\n}\n\n/**\n * Check if extension is available\n */\nfunction checkExtensionAvailable(): boolean {\n if (typeof window === 'undefined') return false;\n return !!(window as NostrWindow).nostr?.wot;\n}\n\n/**\n * WoT provider component\n *\n * Provides WoT instance to all children components.\n * Automatically detects extension availability.\n *\n * @example\n * ```tsx\n * import { WoTProvider } from 'nostr-wot-sdk/react';\n *\n * // Basic usage - automatically detects extension\n * function App() {\n * return (\n * <WoTProvider>\n * <YourApp />\n * </WoTProvider>\n * );\n * }\n *\n * // With fallback for when extension is not available\n * function App() {\n * return (\n * <WoTProvider options={{\n * fallback: { myPubkey: 'abc123...' }\n * }}>\n * <YourApp />\n * </WoTProvider>\n * );\n * }\n * ```\n */\nexport function WoTProvider({\n options = {},\n children,\n}: WoTProviderProps) {\n const [extensionState, setExtensionState] = useState<ExtensionConnectionState>('checking');\n const [isReady, setIsReady] = useState(false);\n\n // Check extension availability (manual refresh)\n const checkExtension = useCallback(() => {\n const available = checkExtensionAvailable();\n setExtensionState(available ? 'connected' : 'not-available');\n setIsReady(true);\n }, []);\n\n // Check on mount with retry mechanism\n // Extensions inject their content scripts asynchronously after page load,\n // so we need to poll for a short period to detect them reliably\n useEffect(() => {\n // Check immediately\n if (checkExtensionAvailable()) {\n setExtensionState('connected');\n setIsReady(true);\n return;\n }\n\n // Retry several times - extensions may inject after page load\n let attempts = 0;\n const maxAttempts = 15;\n const intervalMs = 100; // Check every 100ms for 1.5 seconds total\n\n const intervalId = setInterval(() => {\n attempts++;\n\n if (checkExtensionAvailable()) {\n setExtensionState('connected');\n setIsReady(true);\n clearInterval(intervalId);\n return;\n }\n\n if (attempts >= maxAttempts) {\n setExtensionState('not-available');\n setIsReady(true);\n clearInterval(intervalId);\n }\n }, intervalMs);\n\n return () => clearInterval(intervalId);\n }, []);\n\n // Create WoT instance\n const wot = useMemo(() => {\n if (!isReady) {\n return null;\n }\n\n try {\n return new WoT(options);\n } catch (error) {\n console.error('WoTProvider: Failed to create WoT instance:', error);\n return null;\n }\n }, [\n isReady,\n options.oracle,\n options.myPubkey,\n options.maxHops,\n options.timeout,\n options.fallback?.myPubkey,\n options.fallback?.oracle,\n ]);\n\n // Extension state for consumers\n const extension = useMemo<ExtensionState>(() => {\n const isConnected = extensionState === 'connected';\n const isChecking = extensionState === 'checking';\n const isChecked = extensionState !== 'checking';\n\n return {\n state: extensionState,\n isConnected,\n isChecking,\n isChecked,\n refresh: checkExtension,\n };\n }, [extensionState, checkExtension]);\n\n const value = useMemo<WoTContextValue>(\n () => ({\n wot,\n isReady: isReady && wot !== null,\n extension,\n }),\n [wot, isReady, extension]\n );\n\n return <WoTContext.Provider value={value}>{children}</WoTContext.Provider>;\n}\n\n/**\n * Hook to access WoT context\n *\n * @returns WoT context value\n * @throws If used outside of WoTProvider\n */\nexport function useWoTContext(): WoTContextValue {\n const context = useContext(WoTContext);\n\n if (context === null) {\n throw new Error('useWoTContext must be used within a WoTProvider');\n }\n\n return context;\n}\n\n/**\n * Hook to access WoT instance directly\n *\n * @returns WoT instance or null if not ready\n */\nexport function useWoTInstance(): WoT | null {\n const { wot } = useWoTContext();\n return wot;\n}\n\n/**\n * Hook to access extension state\n *\n * @returns Extension state and status\n *\n * @example\n * ```tsx\n * function ExtensionStatus() {\n * const { isConnected, isChecking } = useExtension();\n *\n * if (isChecking) return <span>Checking...</span>;\n * if (isConnected) return <span>Extension connected!</span>;\n * return <span>Extension not available</span>;\n * }\n * ```\n */\nexport function useExtension(): ExtensionState {\n const { extension } = useWoTContext();\n return extension;\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useWoTContext } from './context';\nimport type { DistanceResult, QueryOptions } from '../types';\n\n/**\n * Result from useWoT hook\n */\nexport interface UseWoTResult {\n /**\n * Distance in hops to target, null if not in WoT\n */\n distance: number | null;\n /**\n * Trust score (0-1)\n */\n score: number;\n /**\n * Whether data is currently loading\n */\n loading: boolean;\n /**\n * Error if query failed\n */\n error: Error | null;\n /**\n * Full details (hops, paths, bridges, mutual)\n */\n details: DistanceResult | null;\n /**\n * Refetch data\n */\n refetch: () => void;\n}\n\n/**\n * Options for useWoT hook\n */\nexport interface UseWoTOptions extends QueryOptions {\n /**\n * Skip the query (useful for conditional fetching)\n */\n skip?: boolean;\n}\n\n/**\n * Hook to get WoT data for a pubkey\n *\n * @param pubkey - Target pubkey\n * @param options - Query options\n * @returns WoT data and loading state\n *\n * @example\n * ```tsx\n * function Profile({ pubkey }) {\n * const { distance, score, loading } = useWoT(pubkey);\n *\n * if (loading) return <Spinner />;\n *\n * return (\n * <div>\n * {distance !== null ? (\n * <span>{distance} hops away (score: {score.toFixed(2)})</span>\n * ) : (\n * <span>Not in your network</span>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useWoT(pubkey: string, options?: UseWoTOptions): UseWoTResult {\n const { wot, isReady } = useWoTContext();\n const [distance, setDistance] = useState<number | null>(null);\n const [score, setScore] = useState(0);\n const [details, setDetails] = useState<DistanceResult | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const fetchIdRef = useRef(0);\n\n const skip = options?.skip ?? false;\n\n const fetchData = useCallback(async () => {\n if (!wot || !pubkey || skip) {\n setLoading(false);\n return;\n }\n\n const fetchId = ++fetchIdRef.current;\n setLoading(true);\n setError(null);\n\n try {\n const [distResult, scoreResult, detailsResult] = await Promise.all([\n wot.getDistance(pubkey, options),\n wot.getTrustScore(pubkey),\n wot.getDetails(pubkey, options),\n ]);\n\n // Only update if this is still the latest request\n if (fetchId === fetchIdRef.current) {\n setDistance(distResult);\n setScore(scoreResult);\n setDetails(detailsResult);\n setLoading(false);\n }\n } catch (err) {\n if (fetchId === fetchIdRef.current) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n setLoading(false);\n }\n }\n }, [wot, pubkey, skip, options?.maxHops, options?.timeout]);\n\n useEffect(() => {\n if (isReady && !skip) {\n fetchData();\n }\n }, [isReady, fetchData, skip]);\n\n const refetch = useCallback(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n distance,\n score,\n loading,\n error,\n details,\n refetch,\n };\n}\n\n/**\n * Result from useIsInWoT hook\n */\nexport interface UseIsInWoTResult {\n /**\n * Whether target is in WoT\n */\n inWoT: boolean;\n /**\n * Whether data is currently loading\n */\n loading: boolean;\n /**\n * Error if query failed\n */\n error: Error | null;\n /**\n * Refetch data\n */\n refetch: () => void;\n}\n\n/**\n * Hook to check if a pubkey is in your WoT\n *\n * @param pubkey - Target pubkey\n * @param options - Query options\n * @returns Whether target is in WoT\n *\n * @example\n * ```tsx\n * function TrustBadge({ pubkey }) {\n * const { inWoT, loading } = useIsInWoT(pubkey, { maxHops: 2 });\n *\n * if (loading) return null;\n *\n * return inWoT ? <span>Trusted</span> : null;\n * }\n * ```\n */\nexport function useIsInWoT(\n pubkey: string,\n options?: UseWoTOptions\n): UseIsInWoTResult {\n const { wot, isReady } = useWoTContext();\n const [inWoT, setInWoT] = useState(false);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const fetchIdRef = useRef(0);\n\n const skip = options?.skip ?? false;\n\n const fetchData = useCallback(async () => {\n if (!wot || !pubkey || skip) {\n setLoading(false);\n return;\n }\n\n const fetchId = ++fetchIdRef.current;\n setLoading(true);\n setError(null);\n\n try {\n const result = await wot.isInMyWoT(pubkey, options);\n\n if (fetchId === fetchIdRef.current) {\n setInWoT(result);\n setLoading(false);\n }\n } catch (err) {\n if (fetchId === fetchIdRef.current) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n setLoading(false);\n }\n }\n }, [wot, pubkey, skip, options?.maxHops, options?.timeout]);\n\n useEffect(() => {\n if (isReady && !skip) {\n fetchData();\n }\n }, [isReady, fetchData, skip]);\n\n const refetch = useCallback(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n inWoT,\n loading,\n error,\n refetch,\n };\n}\n\n/**\n * Result from useTrustScore hook\n */\nexport interface UseTrustScoreResult {\n /**\n * Trust score (0-1)\n */\n score: number;\n /**\n * Whether data is currently loading\n */\n loading: boolean;\n /**\n * Error if query failed\n */\n error: Error | null;\n /**\n * Refetch data\n */\n refetch: () => void;\n}\n\n/**\n * Hook to get trust score for a pubkey\n *\n * @param pubkey - Target pubkey\n * @param options - Query options\n * @returns Trust score\n *\n * @example\n * ```tsx\n * function TrustMeter({ pubkey }) {\n * const { score, loading } = useTrustScore(pubkey);\n *\n * if (loading) return <Spinner />;\n *\n * return <ProgressBar value={score} />;\n * }\n * ```\n */\nexport function useTrustScore(\n pubkey: string,\n options?: UseWoTOptions\n): UseTrustScoreResult {\n const { wot, isReady } = useWoTContext();\n const [score, setScore] = useState(0);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const fetchIdRef = useRef(0);\n\n const skip = options?.skip ?? false;\n\n const fetchData = useCallback(async () => {\n if (!wot || !pubkey || skip) {\n setLoading(false);\n return;\n }\n\n const fetchId = ++fetchIdRef.current;\n setLoading(true);\n setError(null);\n\n try {\n const result = await wot.getTrustScore(pubkey);\n\n if (fetchId === fetchIdRef.current) {\n setScore(result);\n setLoading(false);\n }\n } catch (err) {\n if (fetchId === fetchIdRef.current) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n setLoading(false);\n }\n }\n }, [wot, pubkey, skip]);\n\n useEffect(() => {\n if (isReady && !skip) {\n fetchData();\n }\n }, [isReady, fetchData, skip]);\n\n const refetch = useCallback(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n score,\n loading,\n error,\n refetch,\n };\n}\n\n/**\n * Result from useBatchWoT hook\n */\nexport interface UseBatchWoTResult {\n /**\n * Map of pubkey to result\n */\n results: Map<\n string,\n {\n distance: number | null;\n score: number;\n inWoT: boolean;\n }\n >;\n /**\n * Whether data is currently loading\n */\n loading: boolean;\n /**\n * Error if query failed\n */\n error: Error | null;\n /**\n * Refetch data\n */\n refetch: () => void;\n}\n\n/**\n * Hook to batch check multiple pubkeys\n *\n * @param pubkeys - Array of target pubkeys\n * @param options - Query options\n * @returns Map of results\n *\n * @example\n * ```tsx\n * function UserList({ pubkeys }) {\n * const { results, loading } = useBatchWoT(pubkeys);\n *\n * return (\n * <ul>\n * {pubkeys.map(pk => {\n * const data = results.get(pk);\n * return (\n * <li key={pk}>\n * {data?.inWoT ? 'Trusted' : 'Unknown'}\n * </li>\n * );\n * })}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useBatchWoT(\n pubkeys: string[],\n options?: UseWoTOptions\n): UseBatchWoTResult {\n const { wot, isReady } = useWoTContext();\n const [results, setResults] = useState<UseBatchWoTResult['results']>(\n new Map()\n );\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const fetchIdRef = useRef(0);\n\n const skip = options?.skip ?? false;\n const pubkeysKey = pubkeys.join(',');\n\n const fetchData = useCallback(async () => {\n if (!wot || pubkeys.length === 0 || skip) {\n setLoading(false);\n return;\n }\n\n const fetchId = ++fetchIdRef.current;\n setLoading(true);\n setError(null);\n\n try {\n const batchResults = await wot.batchCheck(pubkeys, options);\n\n if (fetchId === fetchIdRef.current) {\n const mapped = new Map<\n string,\n { distance: number | null; score: number; inWoT: boolean }\n >();\n for (const [pk, result] of batchResults) {\n mapped.set(pk, {\n distance: result.distance,\n score: result.score,\n inWoT: result.inWoT,\n });\n }\n setResults(mapped);\n setLoading(false);\n }\n } catch (err) {\n if (fetchId === fetchIdRef.current) {\n setError(err instanceof Error ? err : new Error('Unknown error'));\n setLoading(false);\n }\n }\n }, [wot, pubkeysKey, skip, options?.maxHops, options?.timeout]);\n\n useEffect(() => {\n if (isReady && !skip) {\n fetchData();\n }\n }, [isReady, fetchData, skip]);\n\n const refetch = useCallback(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n results,\n loading,\n error,\n refetch,\n };\n}\n"]}
|