nostr-wot-sdk 0.5.3 → 0.6.2

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/CHANGELOG.md CHANGED
@@ -5,6 +5,50 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.6.2] - 2026-02-22
9
+
10
+ ### Fixed
11
+
12
+ - **CI build failure** — Added `esbuild-plugin-solid` to `devDependencies` so it's available in CI environments
13
+
14
+ ## [0.6.1] - 2026-02-22
15
+
16
+ ### Changed
17
+
18
+ - **Default oracle URL** changed from `nostr-wot.com` to `wot-oracle.mappingbitcoin.com`
19
+ - **Oracle URL validation** now accepts both HTTP and HTTPS URLs
20
+
21
+ ### Fixed
22
+
23
+ - **SolidJS primitives** - Added `{ defer: false }` to `createEffect` calls in `createWoT`, `createIsInWoT`, `createTrustScore`, and `createBatchWoT` to ensure effects run immediately on mount
24
+ - **SolidJS build** - Added `esbuild-plugin-solid` to tsup config for proper JSX compilation
25
+
26
+ ## [0.6.0] - 2026-02-22
27
+
28
+ ### Added
29
+
30
+ - **SolidJS integration** (`nostr-wot-sdk/solid`) - First-class SolidJS support with reactive primitives
31
+ - `WoTProvider` - Context provider with automatic extension detection
32
+ - `createWoT(pubkey)` - Get distance, score, and details for a pubkey
33
+ - `createIsInWoT(pubkey)` - Check if pubkey is in your WoT (boolean)
34
+ - `createTrustScore(pubkey)` - Get trust score only
35
+ - `createBatchWoT(pubkeys)` - Check multiple pubkeys efficiently
36
+ - `useExtension()` - Get extension connection state
37
+ - `useWoTInstance()` - Get raw WoT instance for advanced usage
38
+ - `solid-js` as optional peer dependency (`>=1.0.0`)
39
+ - SolidJS build target in tsup config
40
+
41
+ ### Changed
42
+
43
+ - Updated package description to mention React and SolidJS support
44
+ - Updated README with SolidJS documentation and examples
45
+
46
+ ## [0.5.3] - 2025-02-05
47
+
48
+ ### Fixed
49
+
50
+ - **Improved extension detection with retry mechanism** - Extensions inject content scripts asynchronously after page load, so the SDK now polls for up to 1.5 seconds (15 attempts at 100ms intervals) to reliably detect the extension in both React and core contexts
51
+
8
52
  ## [0.5.2] - 2025-02-05
9
53
 
10
54
  ### Added
@@ -226,6 +270,10 @@ function Profile({ pubkey }) {
226
270
  - TypeScript support with full type definitions
227
271
  - Error classes: `WoTError`, `NetworkError`, `NotFoundError`, `TimeoutError`, `ValidationError`
228
272
 
273
+ [0.6.2]: https://github.com/nostr-wot/nostr-wot-sdk/compare/v0.6.1...v0.6.2
274
+ [0.6.1]: https://github.com/nostr-wot/nostr-wot-sdk/compare/v0.6.0...v0.6.1
275
+ [0.6.0]: https://github.com/nostr-wot/nostr-wot-sdk/compare/v0.5.3...v0.6.0
276
+ [0.5.3]: https://github.com/nostr-wot/nostr-wot-sdk/compare/v0.5.2...v0.5.3
229
277
  [0.5.2]: https://github.com/nostr-wot/nostr-wot-sdk/compare/v0.5.1...v0.5.2
230
278
  [0.5.1]: https://github.com/nostr-wot/nostr-wot-sdk/compare/v0.5.0...v0.5.1
231
279
  [0.5.0]: https://github.com/nostr-wot/nostr-wot-sdk/compare/v0.4.2...v0.5.0
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # nostr-wot-sdk
2
2
 
3
- JavaScript/TypeScript SDK for querying Nostr Web of Trust.
3
+ JavaScript/TypeScript SDK for querying Nostr Web of Trust. Includes first-class React and SolidJS support.
4
4
 
5
5
  ## Install
6
6
  ```bash
@@ -366,6 +366,83 @@ const {
366
366
  } = useExtension();
367
367
  ```
368
368
 
369
+ ### SolidJS
370
+
371
+ The SDK also provides SolidJS support with reactive primitives and automatic extension detection. Wrap your app with `WoTProvider` and use `create*` primitives for fine-grained reactivity.
372
+
373
+ ```javascript
374
+ import { WoTProvider, useExtension, createWoT } from 'nostr-wot-sdk/solid';
375
+
376
+ // Wrap your app - automatically detects extension
377
+ function App() {
378
+ return (
379
+ <WoTProvider>
380
+ <YourApp />
381
+ </WoTProvider>
382
+ );
383
+ }
384
+
385
+ // Check extension status anywhere
386
+ function ExtensionStatus() {
387
+ const ext = useExtension();
388
+
389
+ return (
390
+ <Show when={!ext.isChecking()} fallback={<span>Checking...</span>}>
391
+ <Show when={ext.isConnected()} fallback={<span>Extension not available</span>}>
392
+ <span>Extension connected!</span>
393
+ </Show>
394
+ </Show>
395
+ );
396
+ }
397
+
398
+ // Use WoT data in components
399
+ function Profile(props: { pubkey: string }) {
400
+ const wot = createWoT(() => props.pubkey);
401
+
402
+ return (
403
+ <Show when={!wot.loading()} fallback={<Spinner />}>
404
+ <Show when={wot.distance() !== null} fallback={<span>Not in your network</span>}>
405
+ <span>{wot.distance()} hops away (score: {wot.score().toFixed(2)})</span>
406
+ </Show>
407
+ </Show>
408
+ );
409
+ }
410
+ ```
411
+
412
+ #### Provider Options
413
+
414
+ ```javascript
415
+ // With fallback for when extension is not available
416
+ <WoTProvider options={{
417
+ fallback: { myPubkey: 'abc123...' }
418
+ }}>
419
+ ```
420
+
421
+ #### Available Primitives
422
+
423
+ | Primitive | Description |
424
+ |-----------|-------------|
425
+ | `createWoT(pubkey)` | Get distance, score, and details for a pubkey |
426
+ | `createIsInWoT(pubkey)` | Check if pubkey is in your WoT (boolean) |
427
+ | `createTrustScore(pubkey)` | Get trust score only |
428
+ | `createBatchWoT(pubkeys[])` | Check multiple pubkeys efficiently |
429
+ | `useExtension()` | Get extension connection state |
430
+ | `useWoTInstance()` | Get raw WoT instance for advanced usage |
431
+
432
+ #### Extension State
433
+
434
+ The `useExtension()` function provides extension status:
435
+
436
+ ```javascript
437
+ const ext = useExtension();
438
+
439
+ ext.state() // 'checking' | 'connected' | 'not-available'
440
+ ext.isConnected() // Extension is connected and ready
441
+ ext.isChecking() // Currently checking
442
+ ext.isChecked() // Check complete
443
+ ext.refresh() // Function to re-check extension availability
444
+ ```
445
+
369
446
  ## TypeScript
370
447
 
371
448
  Full type definitions included:
package/dist/index.cjs CHANGED
@@ -46,7 +46,7 @@ var ValidationError = class extends WoTError {
46
46
  };
47
47
 
48
48
  // src/utils.ts
49
- var DEFAULT_ORACLE = "https://nostr-wot.com";
49
+ var DEFAULT_ORACLE = "https://wot-oracle.mappingbitcoin.com";
50
50
  var DEFAULT_MAX_HOPS = 3;
51
51
  var DEFAULT_TIMEOUT = 5e3;
52
52
  function isValidPubkey(pubkey) {
@@ -55,7 +55,7 @@ function isValidPubkey(pubkey) {
55
55
  function isValidOracleUrl(url) {
56
56
  try {
57
57
  const parsed = new URL(url);
58
- return parsed.protocol === "https:";
58
+ return parsed.protocol === "https:" || parsed.protocol === "http:";
59
59
  } catch (e) {
60
60
  return false;
61
61
  }
package/dist/index.d.cts CHANGED
@@ -30,7 +30,7 @@ interface ScoringConfig {
30
30
  interface WoTFallbackOptions {
31
31
  /**
32
32
  * Oracle API URL
33
- * @default 'https://nostr-wot.com'
33
+ * @default 'https://wot-oracle.mappingbitcoin.com'
34
34
  */
35
35
  oracle?: string;
36
36
  /**
@@ -54,7 +54,7 @@ interface WoTFallbackOptions {
54
54
  interface WoTOptions {
55
55
  /**
56
56
  * Oracle API URL (used when extension is not available)
57
- * @default 'https://nostr-wot.com'
57
+ * @default 'https://wot-oracle.mappingbitcoin.com'
58
58
  */
59
59
  oracle?: string;
60
60
  /**
@@ -594,7 +594,7 @@ declare class ValidationError extends WoTError {
594
594
  /**
595
595
  * Default oracle URL
596
596
  */
597
- declare const DEFAULT_ORACLE = "https://nostr-wot.com";
597
+ declare const DEFAULT_ORACLE = "https://wot-oracle.mappingbitcoin.com";
598
598
  /**
599
599
  * Default max hops for WoT queries
600
600
  */
@@ -608,7 +608,7 @@ declare const DEFAULT_TIMEOUT = 5000;
608
608
  */
609
609
  declare function isValidPubkey(pubkey: string): boolean;
610
610
  /**
611
- * Validates an oracle URL (must be HTTPS)
611
+ * Validates an oracle URL (HTTP or HTTPS)
612
612
  */
613
613
  declare function isValidOracleUrl(url: string): boolean;
614
614
  /**
package/dist/index.d.ts CHANGED
@@ -30,7 +30,7 @@ interface ScoringConfig {
30
30
  interface WoTFallbackOptions {
31
31
  /**
32
32
  * Oracle API URL
33
- * @default 'https://nostr-wot.com'
33
+ * @default 'https://wot-oracle.mappingbitcoin.com'
34
34
  */
35
35
  oracle?: string;
36
36
  /**
@@ -54,7 +54,7 @@ interface WoTFallbackOptions {
54
54
  interface WoTOptions {
55
55
  /**
56
56
  * Oracle API URL (used when extension is not available)
57
- * @default 'https://nostr-wot.com'
57
+ * @default 'https://wot-oracle.mappingbitcoin.com'
58
58
  */
59
59
  oracle?: string;
60
60
  /**
@@ -594,7 +594,7 @@ declare class ValidationError extends WoTError {
594
594
  /**
595
595
  * Default oracle URL
596
596
  */
597
- declare const DEFAULT_ORACLE = "https://nostr-wot.com";
597
+ declare const DEFAULT_ORACLE = "https://wot-oracle.mappingbitcoin.com";
598
598
  /**
599
599
  * Default max hops for WoT queries
600
600
  */
@@ -608,7 +608,7 @@ declare const DEFAULT_TIMEOUT = 5000;
608
608
  */
609
609
  declare function isValidPubkey(pubkey: string): boolean;
610
610
  /**
611
- * Validates an oracle URL (must be HTTPS)
611
+ * Validates an oracle URL (HTTP or HTTPS)
612
612
  */
613
613
  declare function isValidOracleUrl(url: string): boolean;
614
614
  /**
package/dist/index.js CHANGED
@@ -44,7 +44,7 @@ var ValidationError = class extends WoTError {
44
44
  };
45
45
 
46
46
  // src/utils.ts
47
- var DEFAULT_ORACLE = "https://nostr-wot.com";
47
+ var DEFAULT_ORACLE = "https://wot-oracle.mappingbitcoin.com";
48
48
  var DEFAULT_MAX_HOPS = 3;
49
49
  var DEFAULT_TIMEOUT = 5e3;
50
50
  function isValidPubkey(pubkey) {
@@ -53,7 +53,7 @@ function isValidPubkey(pubkey) {
53
53
  function isValidOracleUrl(url) {
54
54
  try {
55
55
  const parsed = new URL(url);
56
- return parsed.protocol === "https:";
56
+ return parsed.protocol === "https:" || parsed.protocol === "http:";
57
57
  } catch (e) {
58
58
  return false;
59
59
  }
@@ -51,7 +51,7 @@ var ValidationError = class extends WoTError {
51
51
  };
52
52
 
53
53
  // src/utils.ts
54
- var DEFAULT_ORACLE = "https://nostr-wot.com";
54
+ var DEFAULT_ORACLE = "https://wot-oracle.mappingbitcoin.com";
55
55
  var DEFAULT_MAX_HOPS = 3;
56
56
  var DEFAULT_TIMEOUT = 5e3;
57
57
  function isValidPubkey(pubkey) {
@@ -60,7 +60,7 @@ function isValidPubkey(pubkey) {
60
60
  function isValidOracleUrl(url) {
61
61
  try {
62
62
  const parsed = new URL(url);
63
- return parsed.protocol === "https:";
63
+ return parsed.protocol === "https:" || parsed.protocol === "http:";
64
64
  } catch (e) {
65
65
  return false;
66
66
  }
@@ -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":"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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"]}
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://wot-oracle.mappingbitcoin.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 (HTTP or HTTPS)\n */\nexport function isValidOracleUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n return parsed.protocol === 'https:' || parsed.protocol === 'http:';\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"]}