nostr-wot-sdk 0.4.1 → 0.4.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,15 @@ 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.4.2] - 2025-02-05
9
+
10
+ ### Fixed
11
+
12
+ - **Extension disconnection issue** - SDK now always gets fresh reference from `window.nostr.wot`
13
+ - Previously, the SDK cached the extension reference and never refreshed it
14
+ - When extension reloaded (updates, service worker restarts), the cached reference became stale
15
+ - Now the SDK checks `window.nostr.wot` on every call to handle extension reloads gracefully
16
+
8
17
  ## [0.4.1] - 2025-02-05
9
18
 
10
19
  ### Changed
@@ -171,6 +180,7 @@ function Profile({ pubkey }) {
171
180
  - TypeScript support with full type definitions
172
181
  - Error classes: `WoTError`, `NetworkError`, `NotFoundError`, `TimeoutError`, `ValidationError`
173
182
 
183
+ [0.4.2]: https://github.com/nostr-wot/nostr-wot-sdk/compare/v0.4.1...v0.4.2
174
184
  [0.4.1]: https://github.com/nostr-wot/nostr-wot-sdk/compare/v0.4.0...v0.4.1
175
185
  [0.4.0]: https://github.com/nostr-wot/nostr-wot-sdk/compare/v0.3.2...v0.4.0
176
186
  [0.3.2]: https://github.com/nostr-wot/nostr-wot-sdk/compare/v0.3.1...v0.3.2
package/dist/index.cjs CHANGED
@@ -336,30 +336,42 @@ var WoT = class {
336
336
  /**
337
337
  * Checks if browser extension is available and returns it
338
338
  * Uses event-based connection flow for reliable detection
339
+ * Always returns fresh reference from window.nostr.wot to handle extension reloads
339
340
  */
340
341
  async getExtension() {
341
- var _a, _b;
342
- if (this.extensionChecked) return this.extension;
343
- this.extensionChecked = true;
342
+ var _a, _b, _c;
344
343
  if (typeof window === "undefined") return null;
345
344
  const win = window;
346
345
  if ((_a = win.nostr) == null ? void 0 : _a.wot) {
347
346
  this.extension = win.nostr.wot;
348
- } else {
349
- const result = await checkAndConnect({
350
- checkTimeout: 100,
351
- connectTimeout: 5e3,
352
- autoConnect: true
353
- });
354
- if (result.state === "connected" && result.extension) {
355
- this.extension = result.extension;
347
+ this.extensionChecked = true;
348
+ if (!this.extensionPubkey) {
349
+ try {
350
+ this.extensionPubkey = await this.extension.getMyPubkey();
351
+ } catch (e) {
352
+ if ((_b = win.nostr) == null ? void 0 : _b.getPublicKey) {
353
+ try {
354
+ this.extensionPubkey = await win.nostr.getPublicKey();
355
+ } catch (e2) {
356
+ }
357
+ }
358
+ }
356
359
  }
360
+ return this.extension;
357
361
  }
358
- if (this.extension) {
362
+ if (this.extensionChecked) return this.extension;
363
+ this.extensionChecked = true;
364
+ const result = await checkAndConnect({
365
+ checkTimeout: 100,
366
+ connectTimeout: 5e3,
367
+ autoConnect: true
368
+ });
369
+ if (result.state === "connected" && result.extension) {
370
+ this.extension = result.extension;
359
371
  try {
360
372
  this.extensionPubkey = await this.extension.getMyPubkey();
361
373
  } catch (e) {
362
- if ((_b = win.nostr) == null ? void 0 : _b.getPublicKey) {
374
+ if ((_c = win.nostr) == null ? void 0 : _c.getPublicKey) {
363
375
  try {
364
376
  this.extensionPubkey = await win.nostr.getPublicKey();
365
377
  } catch (e2) {
package/dist/index.d.cts CHANGED
@@ -371,6 +371,7 @@ declare class WoT {
371
371
  /**
372
372
  * Checks if browser extension is available and returns it
373
373
  * Uses event-based connection flow for reliable detection
374
+ * Always returns fresh reference from window.nostr.wot to handle extension reloads
374
375
  */
375
376
  private getExtension;
376
377
  /**
package/dist/index.d.ts CHANGED
@@ -371,6 +371,7 @@ declare class WoT {
371
371
  /**
372
372
  * Checks if browser extension is available and returns it
373
373
  * Uses event-based connection flow for reliable detection
374
+ * Always returns fresh reference from window.nostr.wot to handle extension reloads
374
375
  */
375
376
  private getExtension;
376
377
  /**
package/dist/index.js CHANGED
@@ -334,30 +334,42 @@ var WoT = class {
334
334
  /**
335
335
  * Checks if browser extension is available and returns it
336
336
  * Uses event-based connection flow for reliable detection
337
+ * Always returns fresh reference from window.nostr.wot to handle extension reloads
337
338
  */
338
339
  async getExtension() {
339
- var _a, _b;
340
- if (this.extensionChecked) return this.extension;
341
- this.extensionChecked = true;
340
+ var _a, _b, _c;
342
341
  if (typeof window === "undefined") return null;
343
342
  const win = window;
344
343
  if ((_a = win.nostr) == null ? void 0 : _a.wot) {
345
344
  this.extension = win.nostr.wot;
346
- } else {
347
- const result = await checkAndConnect({
348
- checkTimeout: 100,
349
- connectTimeout: 5e3,
350
- autoConnect: true
351
- });
352
- if (result.state === "connected" && result.extension) {
353
- this.extension = result.extension;
345
+ this.extensionChecked = true;
346
+ if (!this.extensionPubkey) {
347
+ try {
348
+ this.extensionPubkey = await this.extension.getMyPubkey();
349
+ } catch (e) {
350
+ if ((_b = win.nostr) == null ? void 0 : _b.getPublicKey) {
351
+ try {
352
+ this.extensionPubkey = await win.nostr.getPublicKey();
353
+ } catch (e2) {
354
+ }
355
+ }
356
+ }
354
357
  }
358
+ return this.extension;
355
359
  }
356
- if (this.extension) {
360
+ if (this.extensionChecked) return this.extension;
361
+ this.extensionChecked = true;
362
+ const result = await checkAndConnect({
363
+ checkTimeout: 100,
364
+ connectTimeout: 5e3,
365
+ autoConnect: true
366
+ });
367
+ if (result.state === "connected" && result.extension) {
368
+ this.extension = result.extension;
357
369
  try {
358
370
  this.extensionPubkey = await this.extension.getMyPubkey();
359
371
  } catch (e) {
360
- if ((_b = win.nostr) == null ? void 0 : _b.getPublicKey) {
372
+ if ((_c = win.nostr) == null ? void 0 : _c.getPublicKey) {
361
373
  try {
362
374
  this.extensionPubkey = await win.nostr.getPublicKey();
363
375
  } catch (e2) {
@@ -328,30 +328,42 @@ var WoT = class {
328
328
  /**
329
329
  * Checks if browser extension is available and returns it
330
330
  * Uses event-based connection flow for reliable detection
331
+ * Always returns fresh reference from window.nostr.wot to handle extension reloads
331
332
  */
332
333
  async getExtension() {
333
- var _a, _b;
334
- if (this.extensionChecked) return this.extension;
335
- this.extensionChecked = true;
334
+ var _a, _b, _c;
336
335
  if (typeof window === "undefined") return null;
337
336
  const win = window;
338
337
  if ((_a = win.nostr) == null ? void 0 : _a.wot) {
339
338
  this.extension = win.nostr.wot;
340
- } else {
341
- const result = await checkAndConnect({
342
- checkTimeout: 100,
343
- connectTimeout: 5e3,
344
- autoConnect: true
345
- });
346
- if (result.state === "connected" && result.extension) {
347
- this.extension = result.extension;
339
+ this.extensionChecked = true;
340
+ if (!this.extensionPubkey) {
341
+ try {
342
+ this.extensionPubkey = await this.extension.getMyPubkey();
343
+ } catch (e) {
344
+ if ((_b = win.nostr) == null ? void 0 : _b.getPublicKey) {
345
+ try {
346
+ this.extensionPubkey = await win.nostr.getPublicKey();
347
+ } catch (e2) {
348
+ }
349
+ }
350
+ }
348
351
  }
352
+ return this.extension;
349
353
  }
350
- if (this.extension) {
354
+ if (this.extensionChecked) return this.extension;
355
+ this.extensionChecked = true;
356
+ const result = await checkAndConnect({
357
+ checkTimeout: 100,
358
+ connectTimeout: 5e3,
359
+ autoConnect: true
360
+ });
361
+ if (result.state === "connected" && result.extension) {
362
+ this.extension = result.extension;
351
363
  try {
352
364
  this.extensionPubkey = await this.extension.getMyPubkey();
353
365
  } catch (e) {
354
- if ((_b = win.nostr) == null ? void 0 : _b.getPublicKey) {
366
+ if ((_c = win.nostr) == null ? void 0 : _c.getPublicKey) {
355
367
  try {
356
368
  this.extensionPubkey = await win.nostr.getPublicKey();
357
369
  } catch (e2) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/errors.ts","../../src/utils.ts","../../src/extension.ts","../../src/wot.ts","../../src/react/context.tsx","../../src/react/hooks.ts"],"names":["_a","e","maxHops","results","createContext","useState","useMemo","useCallback","useEffect","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","/**\n * Extension connection module\n * Handles the event-based communication flow with the nostr-wot browser extension\n */\n\nimport type { NostrWoTExtension, NostrWindow } from './types';\n\n/**\n * Extension connection state\n */\nexport type ExtensionConnectionState =\n | 'idle'\n | 'checking'\n | 'connecting'\n | 'connected'\n | 'not-installed'\n | 'error';\n\n/**\n * Extension connection result\n */\nexport interface ExtensionConnectionResult {\n state: ExtensionConnectionState;\n extension: NostrWoTExtension | null;\n error?: string;\n}\n\n/**\n * Extension connection options\n */\nexport interface ExtensionConnectionOptions {\n /**\n * Timeout for extension check (ms)\n * @default 100\n */\n checkTimeout?: number;\n /**\n * Timeout for connection (ms)\n * @default 5000\n */\n connectTimeout?: number;\n /**\n * Auto-connect after checking\n * @default true\n */\n autoConnect?: boolean;\n}\n\n/**\n * Check if the nostr-wot extension is installed\n * Uses the nostr-wot-check / nostr-wot-present event handshake\n */\nexport function checkExtension(timeout = 100): Promise<boolean> {\n return new Promise((resolve) => {\n // Not in browser\n if (typeof window === 'undefined') {\n resolve(false);\n return;\n }\n\n // Already injected?\n const win = window as NostrWindow;\n if (win.nostr?.wot) {\n resolve(true);\n return;\n }\n\n const handler = () => {\n window.removeEventListener('nostr-wot-present', handler);\n clearTimeout(timer);\n resolve(true);\n };\n\n window.addEventListener('nostr-wot-present', handler);\n\n // Timeout if no response\n const timer = setTimeout(() => {\n window.removeEventListener('nostr-wot-present', handler);\n resolve(false);\n }, timeout);\n\n // Request check\n window.dispatchEvent(new CustomEvent('nostr-wot-check'));\n });\n}\n\n/**\n * Connect to the nostr-wot extension\n * Uses the nostr-wot-connect / nostr-wot-ready event handshake\n */\nexport function connectExtension(timeout = 5000): Promise<NostrWoTExtension> {\n return new Promise((resolve, reject) => {\n // Not in browser\n if (typeof window === 'undefined') {\n reject(new Error('Not in browser environment'));\n return;\n }\n\n const win = window as NostrWindow;\n\n // Already available?\n if (win.nostr?.wot) {\n resolve(win.nostr.wot);\n return;\n }\n\n let timer: ReturnType<typeof setTimeout>;\n\n const onReady = () => {\n cleanup();\n const ext = (window as NostrWindow).nostr?.wot;\n if (ext) {\n resolve(ext);\n } else {\n reject(new Error('Extension ready event fired but API not found'));\n }\n };\n\n const onError = (e: Event) => {\n cleanup();\n const detail = (e as CustomEvent).detail;\n reject(new Error(detail?.error || 'Connection failed'));\n };\n\n const cleanup = () => {\n clearTimeout(timer);\n window.removeEventListener('nostr-wot-ready', onReady);\n window.removeEventListener('nostr-wot-error', onError);\n };\n\n window.addEventListener('nostr-wot-ready', onReady);\n window.addEventListener('nostr-wot-error', onError);\n\n // Request connection\n window.dispatchEvent(new CustomEvent('nostr-wot-connect'));\n\n // Timeout\n timer = setTimeout(() => {\n cleanup();\n reject(new Error('Connection timeout'));\n }, timeout);\n });\n}\n\n/**\n * Check and connect to the extension in one call\n */\nexport async function checkAndConnect(\n options: ExtensionConnectionOptions = {}\n): Promise<ExtensionConnectionResult> {\n const { checkTimeout = 100, connectTimeout = 5000, autoConnect = true } = options;\n\n // Not in browser\n if (typeof window === 'undefined') {\n return { state: 'not-installed', extension: null };\n }\n\n // Check if already available\n const win = window as NostrWindow;\n if (win.nostr?.wot) {\n return { state: 'connected', extension: win.nostr.wot };\n }\n\n // Check if extension is installed\n const isInstalled = await checkExtension(checkTimeout);\n\n if (!isInstalled) {\n return { state: 'not-installed', extension: null };\n }\n\n if (!autoConnect) {\n return { state: 'idle', extension: null };\n }\n\n // Connect\n try {\n const extension = await connectExtension(connectTimeout);\n return { state: 'connected', extension };\n } catch (error) {\n return {\n state: 'error',\n extension: null,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n\n/**\n * Extension connector class for managing connection state\n */\nexport class ExtensionConnector {\n private state: ExtensionConnectionState = 'idle';\n private extension: NostrWoTExtension | null = null;\n private error: string | undefined;\n private connectionPromise: Promise<ExtensionConnectionResult> | null = null;\n private listeners: Set<(result: ExtensionConnectionResult) => void> = new Set();\n\n constructor(private options: ExtensionConnectionOptions = {}) {}\n\n /**\n * Get current state\n */\n getState(): ExtensionConnectionState {\n return this.state;\n }\n\n /**\n * Get current extension instance\n */\n getExtension(): NostrWoTExtension | null {\n return this.extension;\n }\n\n /**\n * Get current error\n */\n getError(): string | undefined {\n return this.error;\n }\n\n /**\n * Get current result\n */\n getResult(): ExtensionConnectionResult {\n return {\n state: this.state,\n extension: this.extension,\n error: this.error,\n };\n }\n\n /**\n * Subscribe to state changes\n */\n subscribe(listener: (result: ExtensionConnectionResult) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private notify() {\n const result = this.getResult();\n for (const listener of this.listeners) {\n listener(result);\n }\n }\n\n private setState(\n state: ExtensionConnectionState,\n extension: NostrWoTExtension | null = null,\n error?: string\n ) {\n this.state = state;\n this.extension = extension;\n this.error = error;\n this.notify();\n }\n\n /**\n * Connect to the extension\n * Returns existing promise if already connecting\n */\n async connect(): Promise<ExtensionConnectionResult> {\n // Already connected\n if (this.state === 'connected' && this.extension) {\n return this.getResult();\n }\n\n // Already connecting, return existing promise\n if (this.connectionPromise) {\n return this.connectionPromise;\n }\n\n this.connectionPromise = this.doConnect();\n const result = await this.connectionPromise;\n this.connectionPromise = null;\n return result;\n }\n\n private async doConnect(): Promise<ExtensionConnectionResult> {\n const { checkTimeout = 100, connectTimeout = 5000 } = this.options;\n\n // Not in browser\n if (typeof window === 'undefined') {\n this.setState('not-installed');\n return this.getResult();\n }\n\n // Check if already available\n const win = window as NostrWindow;\n if (win.nostr?.wot) {\n this.setState('connected', win.nostr.wot);\n return this.getResult();\n }\n\n // Check phase\n this.setState('checking');\n const isInstalled = await checkExtension(checkTimeout);\n\n if (!isInstalled) {\n this.setState('not-installed');\n return this.getResult();\n }\n\n // Connect phase\n this.setState('connecting');\n try {\n const extension = await connectExtension(connectTimeout);\n this.setState('connected', extension);\n } catch (error) {\n this.setState(\n 'error',\n null,\n error instanceof Error ? error.message : 'Unknown error'\n );\n }\n\n return this.getResult();\n }\n\n /**\n * Reset state and disconnect\n */\n reset() {\n this.state = 'idle';\n this.extension = null;\n this.error = undefined;\n this.connectionPromise = null;\n this.notify();\n }\n}\n\n/**\n * Singleton connector instance for convenience\n */\nlet defaultConnector: ExtensionConnector | null = null;\n\n/**\n * Get the default extension connector\n */\nexport function getDefaultConnector(\n options?: ExtensionConnectionOptions\n): ExtensionConnector {\n if (!defaultConnector) {\n defaultConnector = new ExtensionConnector(options);\n }\n return defaultConnector;\n}\n\n/**\n * Reset the default connector (useful for testing)\n */\nexport function resetDefaultConnector() {\n if (defaultConnector) {\n defaultConnector.reset();\n defaultConnector = null;\n }\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 GraphStats,\n} from './types';\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';\nimport { checkAndConnect } from './extension';\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 extension: NostrWoTExtension | null = null;\n private extensionChecked = false;\n private extensionPubkey: string | null = null;\n\n constructor(options: WoTOptions = {}) {\n this.fallbackOptions = options.fallback ?? null;\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 * Uses event-based connection flow for reliable detection\n */\n private async getExtension(): Promise<NostrWoTExtension | null> {\n if (this.extensionChecked) return this.extension;\n\n this.extensionChecked = true;\n\n // Check if running in browser\n if (typeof window === 'undefined') return null;\n\n // First check if already injected\n const win = window as NostrWindow;\n if (win.nostr?.wot) {\n this.extension = win.nostr.wot;\n } else {\n // Use event-based connection flow\n const result = await checkAndConnect({\n checkTimeout: 100,\n connectTimeout: 5000,\n autoConnect: true,\n });\n\n if (result.state === 'connected' && result.extension) {\n this.extension = result.extension;\n }\n }\n\n // Get pubkey from extension if connected\n if (this.extension) {\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 /**\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 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 } from '../types';\nimport {\n ExtensionConnector,\n type ExtensionConnectionState,\n type ExtensionConnectionOptions,\n} from '../extension';\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 connecting\n */\n isConnecting: boolean;\n /**\n * Whether extension check is complete (installed or not)\n */\n isChecked: boolean;\n /**\n * Whether extension is installed (may still be connecting)\n */\n isInstalled: boolean;\n /**\n * Error message if connection failed\n */\n error?: string;\n /**\n * Manually trigger a connection attempt\n */\n connect: () => Promise<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 * The provider will automatically detect and connect to the browser extension.\n */\n options?: Partial<WoTOptions>;\n /**\n * Extension connection options\n */\n extensionOptions?: ExtensionConnectionOptions;\n /**\n * Children to render\n */\n children: ReactNode;\n}\n\n/**\n * WoT provider component\n *\n * Provides WoT instance to all children components.\n * Automatically handles extension detection and connection.\n *\n * @example\n * ```tsx\n * import { WoTProvider } from 'nostr-wot-sdk/react';\n *\n * // Basic usage - automatically connects to extension\n * function App() {\n * return (\n * <WoTProvider>\n * <YourApp />\n * </WoTProvider>\n * );\n * }\n *\n * // With fallback for when extension is not installed\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 extensionOptions = {},\n children,\n}: WoTProviderProps) {\n const [extensionState, setExtensionState] = useState<ExtensionConnectionState>('idle');\n const [extensionError, setExtensionError] = useState<string | undefined>();\n const [isReady, setIsReady] = useState(false);\n\n // Create connector instance\n const connector = useMemo(\n () => new ExtensionConnector(extensionOptions),\n [extensionOptions.checkTimeout, extensionOptions.connectTimeout]\n );\n\n // Connect function for manual reconnection\n const connect = useCallback(async () => {\n const result = await connector.connect();\n setExtensionState(result.state);\n setExtensionError(result.error);\n }, [connector]);\n\n // Auto-connect on mount\n useEffect(() => {\n // Subscribe to state changes\n const unsubscribe = connector.subscribe((result) => {\n setExtensionState(result.state);\n setExtensionError(result.error);\n });\n\n // Start connection\n connector.connect().then(() => {\n setIsReady(true);\n });\n\n return () => {\n unsubscribe();\n };\n }, [connector]);\n\n // Create WoT instance\n const wot = useMemo(() => {\n // Wait for connection check to complete\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 isConnecting = extensionState === 'checking' || extensionState === 'connecting';\n const isChecked = extensionState !== 'idle' && extensionState !== 'checking';\n const isInstalled = extensionState !== 'not-installed' && extensionState !== 'idle';\n\n return {\n state: extensionState,\n isConnected,\n isConnecting,\n isChecked,\n isInstalled,\n error: extensionError,\n connect,\n };\n }, [extensionState, extensionError, connect]);\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, isConnecting, isInstalled, error } = useExtension();\n *\n * if (isConnecting) return <span>Connecting...</span>;\n * if (!isInstalled) return <span>Extension not installed</span>;\n * if (error) return <span>Error: {error}</span>;\n * if (isConnected) return <span>Connected!</span>;\n *\n * return null;\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/extension.ts","../../src/wot.ts","../../src/react/context.tsx","../../src/react/hooks.ts"],"names":["_a","e","maxHops","results","createContext","useState","useMemo","useCallback","useEffect","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","/**\n * Extension connection module\n * Handles the event-based communication flow with the nostr-wot browser extension\n */\n\nimport type { NostrWoTExtension, NostrWindow } from './types';\n\n/**\n * Extension connection state\n */\nexport type ExtensionConnectionState =\n | 'idle'\n | 'checking'\n | 'connecting'\n | 'connected'\n | 'not-installed'\n | 'error';\n\n/**\n * Extension connection result\n */\nexport interface ExtensionConnectionResult {\n state: ExtensionConnectionState;\n extension: NostrWoTExtension | null;\n error?: string;\n}\n\n/**\n * Extension connection options\n */\nexport interface ExtensionConnectionOptions {\n /**\n * Timeout for extension check (ms)\n * @default 100\n */\n checkTimeout?: number;\n /**\n * Timeout for connection (ms)\n * @default 5000\n */\n connectTimeout?: number;\n /**\n * Auto-connect after checking\n * @default true\n */\n autoConnect?: boolean;\n}\n\n/**\n * Check if the nostr-wot extension is installed\n * Uses the nostr-wot-check / nostr-wot-present event handshake\n */\nexport function checkExtension(timeout = 100): Promise<boolean> {\n return new Promise((resolve) => {\n // Not in browser\n if (typeof window === 'undefined') {\n resolve(false);\n return;\n }\n\n // Already injected?\n const win = window as NostrWindow;\n if (win.nostr?.wot) {\n resolve(true);\n return;\n }\n\n const handler = () => {\n window.removeEventListener('nostr-wot-present', handler);\n clearTimeout(timer);\n resolve(true);\n };\n\n window.addEventListener('nostr-wot-present', handler);\n\n // Timeout if no response\n const timer = setTimeout(() => {\n window.removeEventListener('nostr-wot-present', handler);\n resolve(false);\n }, timeout);\n\n // Request check\n window.dispatchEvent(new CustomEvent('nostr-wot-check'));\n });\n}\n\n/**\n * Connect to the nostr-wot extension\n * Uses the nostr-wot-connect / nostr-wot-ready event handshake\n */\nexport function connectExtension(timeout = 5000): Promise<NostrWoTExtension> {\n return new Promise((resolve, reject) => {\n // Not in browser\n if (typeof window === 'undefined') {\n reject(new Error('Not in browser environment'));\n return;\n }\n\n const win = window as NostrWindow;\n\n // Already available?\n if (win.nostr?.wot) {\n resolve(win.nostr.wot);\n return;\n }\n\n let timer: ReturnType<typeof setTimeout>;\n\n const onReady = () => {\n cleanup();\n const ext = (window as NostrWindow).nostr?.wot;\n if (ext) {\n resolve(ext);\n } else {\n reject(new Error('Extension ready event fired but API not found'));\n }\n };\n\n const onError = (e: Event) => {\n cleanup();\n const detail = (e as CustomEvent).detail;\n reject(new Error(detail?.error || 'Connection failed'));\n };\n\n const cleanup = () => {\n clearTimeout(timer);\n window.removeEventListener('nostr-wot-ready', onReady);\n window.removeEventListener('nostr-wot-error', onError);\n };\n\n window.addEventListener('nostr-wot-ready', onReady);\n window.addEventListener('nostr-wot-error', onError);\n\n // Request connection\n window.dispatchEvent(new CustomEvent('nostr-wot-connect'));\n\n // Timeout\n timer = setTimeout(() => {\n cleanup();\n reject(new Error('Connection timeout'));\n }, timeout);\n });\n}\n\n/**\n * Check and connect to the extension in one call\n */\nexport async function checkAndConnect(\n options: ExtensionConnectionOptions = {}\n): Promise<ExtensionConnectionResult> {\n const { checkTimeout = 100, connectTimeout = 5000, autoConnect = true } = options;\n\n // Not in browser\n if (typeof window === 'undefined') {\n return { state: 'not-installed', extension: null };\n }\n\n // Check if already available\n const win = window as NostrWindow;\n if (win.nostr?.wot) {\n return { state: 'connected', extension: win.nostr.wot };\n }\n\n // Check if extension is installed\n const isInstalled = await checkExtension(checkTimeout);\n\n if (!isInstalled) {\n return { state: 'not-installed', extension: null };\n }\n\n if (!autoConnect) {\n return { state: 'idle', extension: null };\n }\n\n // Connect\n try {\n const extension = await connectExtension(connectTimeout);\n return { state: 'connected', extension };\n } catch (error) {\n return {\n state: 'error',\n extension: null,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n\n/**\n * Extension connector class for managing connection state\n */\nexport class ExtensionConnector {\n private state: ExtensionConnectionState = 'idle';\n private extension: NostrWoTExtension | null = null;\n private error: string | undefined;\n private connectionPromise: Promise<ExtensionConnectionResult> | null = null;\n private listeners: Set<(result: ExtensionConnectionResult) => void> = new Set();\n\n constructor(private options: ExtensionConnectionOptions = {}) {}\n\n /**\n * Get current state\n */\n getState(): ExtensionConnectionState {\n return this.state;\n }\n\n /**\n * Get current extension instance\n */\n getExtension(): NostrWoTExtension | null {\n return this.extension;\n }\n\n /**\n * Get current error\n */\n getError(): string | undefined {\n return this.error;\n }\n\n /**\n * Get current result\n */\n getResult(): ExtensionConnectionResult {\n return {\n state: this.state,\n extension: this.extension,\n error: this.error,\n };\n }\n\n /**\n * Subscribe to state changes\n */\n subscribe(listener: (result: ExtensionConnectionResult) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private notify() {\n const result = this.getResult();\n for (const listener of this.listeners) {\n listener(result);\n }\n }\n\n private setState(\n state: ExtensionConnectionState,\n extension: NostrWoTExtension | null = null,\n error?: string\n ) {\n this.state = state;\n this.extension = extension;\n this.error = error;\n this.notify();\n }\n\n /**\n * Connect to the extension\n * Returns existing promise if already connecting\n */\n async connect(): Promise<ExtensionConnectionResult> {\n // Already connected\n if (this.state === 'connected' && this.extension) {\n return this.getResult();\n }\n\n // Already connecting, return existing promise\n if (this.connectionPromise) {\n return this.connectionPromise;\n }\n\n this.connectionPromise = this.doConnect();\n const result = await this.connectionPromise;\n this.connectionPromise = null;\n return result;\n }\n\n private async doConnect(): Promise<ExtensionConnectionResult> {\n const { checkTimeout = 100, connectTimeout = 5000 } = this.options;\n\n // Not in browser\n if (typeof window === 'undefined') {\n this.setState('not-installed');\n return this.getResult();\n }\n\n // Check if already available\n const win = window as NostrWindow;\n if (win.nostr?.wot) {\n this.setState('connected', win.nostr.wot);\n return this.getResult();\n }\n\n // Check phase\n this.setState('checking');\n const isInstalled = await checkExtension(checkTimeout);\n\n if (!isInstalled) {\n this.setState('not-installed');\n return this.getResult();\n }\n\n // Connect phase\n this.setState('connecting');\n try {\n const extension = await connectExtension(connectTimeout);\n this.setState('connected', extension);\n } catch (error) {\n this.setState(\n 'error',\n null,\n error instanceof Error ? error.message : 'Unknown error'\n );\n }\n\n return this.getResult();\n }\n\n /**\n * Reset state and disconnect\n */\n reset() {\n this.state = 'idle';\n this.extension = null;\n this.error = undefined;\n this.connectionPromise = null;\n this.notify();\n }\n}\n\n/**\n * Singleton connector instance for convenience\n */\nlet defaultConnector: ExtensionConnector | null = null;\n\n/**\n * Get the default extension connector\n */\nexport function getDefaultConnector(\n options?: ExtensionConnectionOptions\n): ExtensionConnector {\n if (!defaultConnector) {\n defaultConnector = new ExtensionConnector(options);\n }\n return defaultConnector;\n}\n\n/**\n * Reset the default connector (useful for testing)\n */\nexport function resetDefaultConnector() {\n if (defaultConnector) {\n defaultConnector.reset();\n defaultConnector = null;\n }\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 GraphStats,\n} from './types';\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';\nimport { checkAndConnect } from './extension';\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 extension: NostrWoTExtension | null = null;\n private extensionChecked = false;\n private extensionPubkey: string | null = null;\n\n constructor(options: WoTOptions = {}) {\n this.fallbackOptions = options.fallback ?? null;\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 * Uses event-based connection flow for reliable detection\n * Always returns fresh reference from window.nostr.wot 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 // Always check for fresh reference (extension may have reloaded)\n if (win.nostr?.wot) {\n this.extension = win.nostr.wot;\n this.extensionChecked = true;\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 // If we already checked and extension wasn't available, don't retry\n // (avoids repeated connection attempts on every call)\n if (this.extensionChecked) return this.extension;\n\n this.extensionChecked = true;\n\n // Use event-based connection flow for initial connection\n const result = await checkAndConnect({\n checkTimeout: 100,\n connectTimeout: 5000,\n autoConnect: true,\n });\n\n if (result.state === 'connected' && result.extension) {\n this.extension = result.extension;\n\n // Get pubkey from extension\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 /**\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 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 } from '../types';\nimport {\n ExtensionConnector,\n type ExtensionConnectionState,\n type ExtensionConnectionOptions,\n} from '../extension';\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 connecting\n */\n isConnecting: boolean;\n /**\n * Whether extension check is complete (installed or not)\n */\n isChecked: boolean;\n /**\n * Whether extension is installed (may still be connecting)\n */\n isInstalled: boolean;\n /**\n * Error message if connection failed\n */\n error?: string;\n /**\n * Manually trigger a connection attempt\n */\n connect: () => Promise<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 * The provider will automatically detect and connect to the browser extension.\n */\n options?: Partial<WoTOptions>;\n /**\n * Extension connection options\n */\n extensionOptions?: ExtensionConnectionOptions;\n /**\n * Children to render\n */\n children: ReactNode;\n}\n\n/**\n * WoT provider component\n *\n * Provides WoT instance to all children components.\n * Automatically handles extension detection and connection.\n *\n * @example\n * ```tsx\n * import { WoTProvider } from 'nostr-wot-sdk/react';\n *\n * // Basic usage - automatically connects to extension\n * function App() {\n * return (\n * <WoTProvider>\n * <YourApp />\n * </WoTProvider>\n * );\n * }\n *\n * // With fallback for when extension is not installed\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 extensionOptions = {},\n children,\n}: WoTProviderProps) {\n const [extensionState, setExtensionState] = useState<ExtensionConnectionState>('idle');\n const [extensionError, setExtensionError] = useState<string | undefined>();\n const [isReady, setIsReady] = useState(false);\n\n // Create connector instance\n const connector = useMemo(\n () => new ExtensionConnector(extensionOptions),\n [extensionOptions.checkTimeout, extensionOptions.connectTimeout]\n );\n\n // Connect function for manual reconnection\n const connect = useCallback(async () => {\n const result = await connector.connect();\n setExtensionState(result.state);\n setExtensionError(result.error);\n }, [connector]);\n\n // Auto-connect on mount\n useEffect(() => {\n // Subscribe to state changes\n const unsubscribe = connector.subscribe((result) => {\n setExtensionState(result.state);\n setExtensionError(result.error);\n });\n\n // Start connection\n connector.connect().then(() => {\n setIsReady(true);\n });\n\n return () => {\n unsubscribe();\n };\n }, [connector]);\n\n // Create WoT instance\n const wot = useMemo(() => {\n // Wait for connection check to complete\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 isConnecting = extensionState === 'checking' || extensionState === 'connecting';\n const isChecked = extensionState !== 'idle' && extensionState !== 'checking';\n const isInstalled = extensionState !== 'not-installed' && extensionState !== 'idle';\n\n return {\n state: extensionState,\n isConnected,\n isConnecting,\n isChecked,\n isInstalled,\n error: extensionError,\n connect,\n };\n }, [extensionState, extensionError, connect]);\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, isConnecting, isInstalled, error } = useExtension();\n *\n * if (isConnecting) return <span>Connecting...</span>;\n * if (!isInstalled) return <span>Extension not installed</span>;\n * if (error) return <span>Error: {error}</span>;\n * if (isConnected) return <span>Connected!</span>;\n *\n * return null;\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"]}
@@ -234,6 +234,7 @@ declare class WoT {
234
234
  /**
235
235
  * Checks if browser extension is available and returns it
236
236
  * Uses event-based connection flow for reliable detection
237
+ * Always returns fresh reference from window.nostr.wot to handle extension reloads
237
238
  */
238
239
  private getExtension;
239
240
  /**
@@ -234,6 +234,7 @@ declare class WoT {
234
234
  /**
235
235
  * Checks if browser extension is available and returns it
236
236
  * Uses event-based connection flow for reliable detection
237
+ * Always returns fresh reference from window.nostr.wot to handle extension reloads
237
238
  */
238
239
  private getExtension;
239
240
  /**
@@ -326,30 +326,42 @@ var WoT = class {
326
326
  /**
327
327
  * Checks if browser extension is available and returns it
328
328
  * Uses event-based connection flow for reliable detection
329
+ * Always returns fresh reference from window.nostr.wot to handle extension reloads
329
330
  */
330
331
  async getExtension() {
331
- var _a, _b;
332
- if (this.extensionChecked) return this.extension;
333
- this.extensionChecked = true;
332
+ var _a, _b, _c;
334
333
  if (typeof window === "undefined") return null;
335
334
  const win = window;
336
335
  if ((_a = win.nostr) == null ? void 0 : _a.wot) {
337
336
  this.extension = win.nostr.wot;
338
- } else {
339
- const result = await checkAndConnect({
340
- checkTimeout: 100,
341
- connectTimeout: 5e3,
342
- autoConnect: true
343
- });
344
- if (result.state === "connected" && result.extension) {
345
- this.extension = result.extension;
337
+ this.extensionChecked = true;
338
+ if (!this.extensionPubkey) {
339
+ try {
340
+ this.extensionPubkey = await this.extension.getMyPubkey();
341
+ } catch (e) {
342
+ if ((_b = win.nostr) == null ? void 0 : _b.getPublicKey) {
343
+ try {
344
+ this.extensionPubkey = await win.nostr.getPublicKey();
345
+ } catch (e2) {
346
+ }
347
+ }
348
+ }
346
349
  }
350
+ return this.extension;
347
351
  }
348
- if (this.extension) {
352
+ if (this.extensionChecked) return this.extension;
353
+ this.extensionChecked = true;
354
+ const result = await checkAndConnect({
355
+ checkTimeout: 100,
356
+ connectTimeout: 5e3,
357
+ autoConnect: true
358
+ });
359
+ if (result.state === "connected" && result.extension) {
360
+ this.extension = result.extension;
349
361
  try {
350
362
  this.extensionPubkey = await this.extension.getMyPubkey();
351
363
  } catch (e) {
352
- if ((_b = win.nostr) == null ? void 0 : _b.getPublicKey) {
364
+ if ((_c = win.nostr) == null ? void 0 : _c.getPublicKey) {
353
365
  try {
354
366
  this.extensionPubkey = await win.nostr.getPublicKey();
355
367
  } catch (e2) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/errors.ts","../../src/utils.ts","../../src/extension.ts","../../src/wot.ts","../../src/react/context.tsx","../../src/react/hooks.ts"],"names":["_a","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","/**\n * Extension connection module\n * Handles the event-based communication flow with the nostr-wot browser extension\n */\n\nimport type { NostrWoTExtension, NostrWindow } from './types';\n\n/**\n * Extension connection state\n */\nexport type ExtensionConnectionState =\n | 'idle'\n | 'checking'\n | 'connecting'\n | 'connected'\n | 'not-installed'\n | 'error';\n\n/**\n * Extension connection result\n */\nexport interface ExtensionConnectionResult {\n state: ExtensionConnectionState;\n extension: NostrWoTExtension | null;\n error?: string;\n}\n\n/**\n * Extension connection options\n */\nexport interface ExtensionConnectionOptions {\n /**\n * Timeout for extension check (ms)\n * @default 100\n */\n checkTimeout?: number;\n /**\n * Timeout for connection (ms)\n * @default 5000\n */\n connectTimeout?: number;\n /**\n * Auto-connect after checking\n * @default true\n */\n autoConnect?: boolean;\n}\n\n/**\n * Check if the nostr-wot extension is installed\n * Uses the nostr-wot-check / nostr-wot-present event handshake\n */\nexport function checkExtension(timeout = 100): Promise<boolean> {\n return new Promise((resolve) => {\n // Not in browser\n if (typeof window === 'undefined') {\n resolve(false);\n return;\n }\n\n // Already injected?\n const win = window as NostrWindow;\n if (win.nostr?.wot) {\n resolve(true);\n return;\n }\n\n const handler = () => {\n window.removeEventListener('nostr-wot-present', handler);\n clearTimeout(timer);\n resolve(true);\n };\n\n window.addEventListener('nostr-wot-present', handler);\n\n // Timeout if no response\n const timer = setTimeout(() => {\n window.removeEventListener('nostr-wot-present', handler);\n resolve(false);\n }, timeout);\n\n // Request check\n window.dispatchEvent(new CustomEvent('nostr-wot-check'));\n });\n}\n\n/**\n * Connect to the nostr-wot extension\n * Uses the nostr-wot-connect / nostr-wot-ready event handshake\n */\nexport function connectExtension(timeout = 5000): Promise<NostrWoTExtension> {\n return new Promise((resolve, reject) => {\n // Not in browser\n if (typeof window === 'undefined') {\n reject(new Error('Not in browser environment'));\n return;\n }\n\n const win = window as NostrWindow;\n\n // Already available?\n if (win.nostr?.wot) {\n resolve(win.nostr.wot);\n return;\n }\n\n let timer: ReturnType<typeof setTimeout>;\n\n const onReady = () => {\n cleanup();\n const ext = (window as NostrWindow).nostr?.wot;\n if (ext) {\n resolve(ext);\n } else {\n reject(new Error('Extension ready event fired but API not found'));\n }\n };\n\n const onError = (e: Event) => {\n cleanup();\n const detail = (e as CustomEvent).detail;\n reject(new Error(detail?.error || 'Connection failed'));\n };\n\n const cleanup = () => {\n clearTimeout(timer);\n window.removeEventListener('nostr-wot-ready', onReady);\n window.removeEventListener('nostr-wot-error', onError);\n };\n\n window.addEventListener('nostr-wot-ready', onReady);\n window.addEventListener('nostr-wot-error', onError);\n\n // Request connection\n window.dispatchEvent(new CustomEvent('nostr-wot-connect'));\n\n // Timeout\n timer = setTimeout(() => {\n cleanup();\n reject(new Error('Connection timeout'));\n }, timeout);\n });\n}\n\n/**\n * Check and connect to the extension in one call\n */\nexport async function checkAndConnect(\n options: ExtensionConnectionOptions = {}\n): Promise<ExtensionConnectionResult> {\n const { checkTimeout = 100, connectTimeout = 5000, autoConnect = true } = options;\n\n // Not in browser\n if (typeof window === 'undefined') {\n return { state: 'not-installed', extension: null };\n }\n\n // Check if already available\n const win = window as NostrWindow;\n if (win.nostr?.wot) {\n return { state: 'connected', extension: win.nostr.wot };\n }\n\n // Check if extension is installed\n const isInstalled = await checkExtension(checkTimeout);\n\n if (!isInstalled) {\n return { state: 'not-installed', extension: null };\n }\n\n if (!autoConnect) {\n return { state: 'idle', extension: null };\n }\n\n // Connect\n try {\n const extension = await connectExtension(connectTimeout);\n return { state: 'connected', extension };\n } catch (error) {\n return {\n state: 'error',\n extension: null,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n\n/**\n * Extension connector class for managing connection state\n */\nexport class ExtensionConnector {\n private state: ExtensionConnectionState = 'idle';\n private extension: NostrWoTExtension | null = null;\n private error: string | undefined;\n private connectionPromise: Promise<ExtensionConnectionResult> | null = null;\n private listeners: Set<(result: ExtensionConnectionResult) => void> = new Set();\n\n constructor(private options: ExtensionConnectionOptions = {}) {}\n\n /**\n * Get current state\n */\n getState(): ExtensionConnectionState {\n return this.state;\n }\n\n /**\n * Get current extension instance\n */\n getExtension(): NostrWoTExtension | null {\n return this.extension;\n }\n\n /**\n * Get current error\n */\n getError(): string | undefined {\n return this.error;\n }\n\n /**\n * Get current result\n */\n getResult(): ExtensionConnectionResult {\n return {\n state: this.state,\n extension: this.extension,\n error: this.error,\n };\n }\n\n /**\n * Subscribe to state changes\n */\n subscribe(listener: (result: ExtensionConnectionResult) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private notify() {\n const result = this.getResult();\n for (const listener of this.listeners) {\n listener(result);\n }\n }\n\n private setState(\n state: ExtensionConnectionState,\n extension: NostrWoTExtension | null = null,\n error?: string\n ) {\n this.state = state;\n this.extension = extension;\n this.error = error;\n this.notify();\n }\n\n /**\n * Connect to the extension\n * Returns existing promise if already connecting\n */\n async connect(): Promise<ExtensionConnectionResult> {\n // Already connected\n if (this.state === 'connected' && this.extension) {\n return this.getResult();\n }\n\n // Already connecting, return existing promise\n if (this.connectionPromise) {\n return this.connectionPromise;\n }\n\n this.connectionPromise = this.doConnect();\n const result = await this.connectionPromise;\n this.connectionPromise = null;\n return result;\n }\n\n private async doConnect(): Promise<ExtensionConnectionResult> {\n const { checkTimeout = 100, connectTimeout = 5000 } = this.options;\n\n // Not in browser\n if (typeof window === 'undefined') {\n this.setState('not-installed');\n return this.getResult();\n }\n\n // Check if already available\n const win = window as NostrWindow;\n if (win.nostr?.wot) {\n this.setState('connected', win.nostr.wot);\n return this.getResult();\n }\n\n // Check phase\n this.setState('checking');\n const isInstalled = await checkExtension(checkTimeout);\n\n if (!isInstalled) {\n this.setState('not-installed');\n return this.getResult();\n }\n\n // Connect phase\n this.setState('connecting');\n try {\n const extension = await connectExtension(connectTimeout);\n this.setState('connected', extension);\n } catch (error) {\n this.setState(\n 'error',\n null,\n error instanceof Error ? error.message : 'Unknown error'\n );\n }\n\n return this.getResult();\n }\n\n /**\n * Reset state and disconnect\n */\n reset() {\n this.state = 'idle';\n this.extension = null;\n this.error = undefined;\n this.connectionPromise = null;\n this.notify();\n }\n}\n\n/**\n * Singleton connector instance for convenience\n */\nlet defaultConnector: ExtensionConnector | null = null;\n\n/**\n * Get the default extension connector\n */\nexport function getDefaultConnector(\n options?: ExtensionConnectionOptions\n): ExtensionConnector {\n if (!defaultConnector) {\n defaultConnector = new ExtensionConnector(options);\n }\n return defaultConnector;\n}\n\n/**\n * Reset the default connector (useful for testing)\n */\nexport function resetDefaultConnector() {\n if (defaultConnector) {\n defaultConnector.reset();\n defaultConnector = null;\n }\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 GraphStats,\n} from './types';\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';\nimport { checkAndConnect } from './extension';\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 extension: NostrWoTExtension | null = null;\n private extensionChecked = false;\n private extensionPubkey: string | null = null;\n\n constructor(options: WoTOptions = {}) {\n this.fallbackOptions = options.fallback ?? null;\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 * Uses event-based connection flow for reliable detection\n */\n private async getExtension(): Promise<NostrWoTExtension | null> {\n if (this.extensionChecked) return this.extension;\n\n this.extensionChecked = true;\n\n // Check if running in browser\n if (typeof window === 'undefined') return null;\n\n // First check if already injected\n const win = window as NostrWindow;\n if (win.nostr?.wot) {\n this.extension = win.nostr.wot;\n } else {\n // Use event-based connection flow\n const result = await checkAndConnect({\n checkTimeout: 100,\n connectTimeout: 5000,\n autoConnect: true,\n });\n\n if (result.state === 'connected' && result.extension) {\n this.extension = result.extension;\n }\n }\n\n // Get pubkey from extension if connected\n if (this.extension) {\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 /**\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 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 } from '../types';\nimport {\n ExtensionConnector,\n type ExtensionConnectionState,\n type ExtensionConnectionOptions,\n} from '../extension';\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 connecting\n */\n isConnecting: boolean;\n /**\n * Whether extension check is complete (installed or not)\n */\n isChecked: boolean;\n /**\n * Whether extension is installed (may still be connecting)\n */\n isInstalled: boolean;\n /**\n * Error message if connection failed\n */\n error?: string;\n /**\n * Manually trigger a connection attempt\n */\n connect: () => Promise<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 * The provider will automatically detect and connect to the browser extension.\n */\n options?: Partial<WoTOptions>;\n /**\n * Extension connection options\n */\n extensionOptions?: ExtensionConnectionOptions;\n /**\n * Children to render\n */\n children: ReactNode;\n}\n\n/**\n * WoT provider component\n *\n * Provides WoT instance to all children components.\n * Automatically handles extension detection and connection.\n *\n * @example\n * ```tsx\n * import { WoTProvider } from 'nostr-wot-sdk/react';\n *\n * // Basic usage - automatically connects to extension\n * function App() {\n * return (\n * <WoTProvider>\n * <YourApp />\n * </WoTProvider>\n * );\n * }\n *\n * // With fallback for when extension is not installed\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 extensionOptions = {},\n children,\n}: WoTProviderProps) {\n const [extensionState, setExtensionState] = useState<ExtensionConnectionState>('idle');\n const [extensionError, setExtensionError] = useState<string | undefined>();\n const [isReady, setIsReady] = useState(false);\n\n // Create connector instance\n const connector = useMemo(\n () => new ExtensionConnector(extensionOptions),\n [extensionOptions.checkTimeout, extensionOptions.connectTimeout]\n );\n\n // Connect function for manual reconnection\n const connect = useCallback(async () => {\n const result = await connector.connect();\n setExtensionState(result.state);\n setExtensionError(result.error);\n }, [connector]);\n\n // Auto-connect on mount\n useEffect(() => {\n // Subscribe to state changes\n const unsubscribe = connector.subscribe((result) => {\n setExtensionState(result.state);\n setExtensionError(result.error);\n });\n\n // Start connection\n connector.connect().then(() => {\n setIsReady(true);\n });\n\n return () => {\n unsubscribe();\n };\n }, [connector]);\n\n // Create WoT instance\n const wot = useMemo(() => {\n // Wait for connection check to complete\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 isConnecting = extensionState === 'checking' || extensionState === 'connecting';\n const isChecked = extensionState !== 'idle' && extensionState !== 'checking';\n const isInstalled = extensionState !== 'not-installed' && extensionState !== 'idle';\n\n return {\n state: extensionState,\n isConnected,\n isConnecting,\n isChecked,\n isInstalled,\n error: extensionError,\n connect,\n };\n }, [extensionState, extensionError, connect]);\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, isConnecting, isInstalled, error } = useExtension();\n *\n * if (isConnecting) return <span>Connecting...</span>;\n * if (!isInstalled) return <span>Extension not installed</span>;\n * if (error) return <span>Error: {error}</span>;\n * if (isConnected) return <span>Connected!</span>;\n *\n * return null;\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/extension.ts","../../src/wot.ts","../../src/react/context.tsx","../../src/react/hooks.ts"],"names":["_a","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","/**\n * Extension connection module\n * Handles the event-based communication flow with the nostr-wot browser extension\n */\n\nimport type { NostrWoTExtension, NostrWindow } from './types';\n\n/**\n * Extension connection state\n */\nexport type ExtensionConnectionState =\n | 'idle'\n | 'checking'\n | 'connecting'\n | 'connected'\n | 'not-installed'\n | 'error';\n\n/**\n * Extension connection result\n */\nexport interface ExtensionConnectionResult {\n state: ExtensionConnectionState;\n extension: NostrWoTExtension | null;\n error?: string;\n}\n\n/**\n * Extension connection options\n */\nexport interface ExtensionConnectionOptions {\n /**\n * Timeout for extension check (ms)\n * @default 100\n */\n checkTimeout?: number;\n /**\n * Timeout for connection (ms)\n * @default 5000\n */\n connectTimeout?: number;\n /**\n * Auto-connect after checking\n * @default true\n */\n autoConnect?: boolean;\n}\n\n/**\n * Check if the nostr-wot extension is installed\n * Uses the nostr-wot-check / nostr-wot-present event handshake\n */\nexport function checkExtension(timeout = 100): Promise<boolean> {\n return new Promise((resolve) => {\n // Not in browser\n if (typeof window === 'undefined') {\n resolve(false);\n return;\n }\n\n // Already injected?\n const win = window as NostrWindow;\n if (win.nostr?.wot) {\n resolve(true);\n return;\n }\n\n const handler = () => {\n window.removeEventListener('nostr-wot-present', handler);\n clearTimeout(timer);\n resolve(true);\n };\n\n window.addEventListener('nostr-wot-present', handler);\n\n // Timeout if no response\n const timer = setTimeout(() => {\n window.removeEventListener('nostr-wot-present', handler);\n resolve(false);\n }, timeout);\n\n // Request check\n window.dispatchEvent(new CustomEvent('nostr-wot-check'));\n });\n}\n\n/**\n * Connect to the nostr-wot extension\n * Uses the nostr-wot-connect / nostr-wot-ready event handshake\n */\nexport function connectExtension(timeout = 5000): Promise<NostrWoTExtension> {\n return new Promise((resolve, reject) => {\n // Not in browser\n if (typeof window === 'undefined') {\n reject(new Error('Not in browser environment'));\n return;\n }\n\n const win = window as NostrWindow;\n\n // Already available?\n if (win.nostr?.wot) {\n resolve(win.nostr.wot);\n return;\n }\n\n let timer: ReturnType<typeof setTimeout>;\n\n const onReady = () => {\n cleanup();\n const ext = (window as NostrWindow).nostr?.wot;\n if (ext) {\n resolve(ext);\n } else {\n reject(new Error('Extension ready event fired but API not found'));\n }\n };\n\n const onError = (e: Event) => {\n cleanup();\n const detail = (e as CustomEvent).detail;\n reject(new Error(detail?.error || 'Connection failed'));\n };\n\n const cleanup = () => {\n clearTimeout(timer);\n window.removeEventListener('nostr-wot-ready', onReady);\n window.removeEventListener('nostr-wot-error', onError);\n };\n\n window.addEventListener('nostr-wot-ready', onReady);\n window.addEventListener('nostr-wot-error', onError);\n\n // Request connection\n window.dispatchEvent(new CustomEvent('nostr-wot-connect'));\n\n // Timeout\n timer = setTimeout(() => {\n cleanup();\n reject(new Error('Connection timeout'));\n }, timeout);\n });\n}\n\n/**\n * Check and connect to the extension in one call\n */\nexport async function checkAndConnect(\n options: ExtensionConnectionOptions = {}\n): Promise<ExtensionConnectionResult> {\n const { checkTimeout = 100, connectTimeout = 5000, autoConnect = true } = options;\n\n // Not in browser\n if (typeof window === 'undefined') {\n return { state: 'not-installed', extension: null };\n }\n\n // Check if already available\n const win = window as NostrWindow;\n if (win.nostr?.wot) {\n return { state: 'connected', extension: win.nostr.wot };\n }\n\n // Check if extension is installed\n const isInstalled = await checkExtension(checkTimeout);\n\n if (!isInstalled) {\n return { state: 'not-installed', extension: null };\n }\n\n if (!autoConnect) {\n return { state: 'idle', extension: null };\n }\n\n // Connect\n try {\n const extension = await connectExtension(connectTimeout);\n return { state: 'connected', extension };\n } catch (error) {\n return {\n state: 'error',\n extension: null,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n\n/**\n * Extension connector class for managing connection state\n */\nexport class ExtensionConnector {\n private state: ExtensionConnectionState = 'idle';\n private extension: NostrWoTExtension | null = null;\n private error: string | undefined;\n private connectionPromise: Promise<ExtensionConnectionResult> | null = null;\n private listeners: Set<(result: ExtensionConnectionResult) => void> = new Set();\n\n constructor(private options: ExtensionConnectionOptions = {}) {}\n\n /**\n * Get current state\n */\n getState(): ExtensionConnectionState {\n return this.state;\n }\n\n /**\n * Get current extension instance\n */\n getExtension(): NostrWoTExtension | null {\n return this.extension;\n }\n\n /**\n * Get current error\n */\n getError(): string | undefined {\n return this.error;\n }\n\n /**\n * Get current result\n */\n getResult(): ExtensionConnectionResult {\n return {\n state: this.state,\n extension: this.extension,\n error: this.error,\n };\n }\n\n /**\n * Subscribe to state changes\n */\n subscribe(listener: (result: ExtensionConnectionResult) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private notify() {\n const result = this.getResult();\n for (const listener of this.listeners) {\n listener(result);\n }\n }\n\n private setState(\n state: ExtensionConnectionState,\n extension: NostrWoTExtension | null = null,\n error?: string\n ) {\n this.state = state;\n this.extension = extension;\n this.error = error;\n this.notify();\n }\n\n /**\n * Connect to the extension\n * Returns existing promise if already connecting\n */\n async connect(): Promise<ExtensionConnectionResult> {\n // Already connected\n if (this.state === 'connected' && this.extension) {\n return this.getResult();\n }\n\n // Already connecting, return existing promise\n if (this.connectionPromise) {\n return this.connectionPromise;\n }\n\n this.connectionPromise = this.doConnect();\n const result = await this.connectionPromise;\n this.connectionPromise = null;\n return result;\n }\n\n private async doConnect(): Promise<ExtensionConnectionResult> {\n const { checkTimeout = 100, connectTimeout = 5000 } = this.options;\n\n // Not in browser\n if (typeof window === 'undefined') {\n this.setState('not-installed');\n return this.getResult();\n }\n\n // Check if already available\n const win = window as NostrWindow;\n if (win.nostr?.wot) {\n this.setState('connected', win.nostr.wot);\n return this.getResult();\n }\n\n // Check phase\n this.setState('checking');\n const isInstalled = await checkExtension(checkTimeout);\n\n if (!isInstalled) {\n this.setState('not-installed');\n return this.getResult();\n }\n\n // Connect phase\n this.setState('connecting');\n try {\n const extension = await connectExtension(connectTimeout);\n this.setState('connected', extension);\n } catch (error) {\n this.setState(\n 'error',\n null,\n error instanceof Error ? error.message : 'Unknown error'\n );\n }\n\n return this.getResult();\n }\n\n /**\n * Reset state and disconnect\n */\n reset() {\n this.state = 'idle';\n this.extension = null;\n this.error = undefined;\n this.connectionPromise = null;\n this.notify();\n }\n}\n\n/**\n * Singleton connector instance for convenience\n */\nlet defaultConnector: ExtensionConnector | null = null;\n\n/**\n * Get the default extension connector\n */\nexport function getDefaultConnector(\n options?: ExtensionConnectionOptions\n): ExtensionConnector {\n if (!defaultConnector) {\n defaultConnector = new ExtensionConnector(options);\n }\n return defaultConnector;\n}\n\n/**\n * Reset the default connector (useful for testing)\n */\nexport function resetDefaultConnector() {\n if (defaultConnector) {\n defaultConnector.reset();\n defaultConnector = null;\n }\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 GraphStats,\n} from './types';\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';\nimport { checkAndConnect } from './extension';\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 extension: NostrWoTExtension | null = null;\n private extensionChecked = false;\n private extensionPubkey: string | null = null;\n\n constructor(options: WoTOptions = {}) {\n this.fallbackOptions = options.fallback ?? null;\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 * Uses event-based connection flow for reliable detection\n * Always returns fresh reference from window.nostr.wot 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 // Always check for fresh reference (extension may have reloaded)\n if (win.nostr?.wot) {\n this.extension = win.nostr.wot;\n this.extensionChecked = true;\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 // If we already checked and extension wasn't available, don't retry\n // (avoids repeated connection attempts on every call)\n if (this.extensionChecked) return this.extension;\n\n this.extensionChecked = true;\n\n // Use event-based connection flow for initial connection\n const result = await checkAndConnect({\n checkTimeout: 100,\n connectTimeout: 5000,\n autoConnect: true,\n });\n\n if (result.state === 'connected' && result.extension) {\n this.extension = result.extension;\n\n // Get pubkey from extension\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 /**\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 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 } from '../types';\nimport {\n ExtensionConnector,\n type ExtensionConnectionState,\n type ExtensionConnectionOptions,\n} from '../extension';\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 connecting\n */\n isConnecting: boolean;\n /**\n * Whether extension check is complete (installed or not)\n */\n isChecked: boolean;\n /**\n * Whether extension is installed (may still be connecting)\n */\n isInstalled: boolean;\n /**\n * Error message if connection failed\n */\n error?: string;\n /**\n * Manually trigger a connection attempt\n */\n connect: () => Promise<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 * The provider will automatically detect and connect to the browser extension.\n */\n options?: Partial<WoTOptions>;\n /**\n * Extension connection options\n */\n extensionOptions?: ExtensionConnectionOptions;\n /**\n * Children to render\n */\n children: ReactNode;\n}\n\n/**\n * WoT provider component\n *\n * Provides WoT instance to all children components.\n * Automatically handles extension detection and connection.\n *\n * @example\n * ```tsx\n * import { WoTProvider } from 'nostr-wot-sdk/react';\n *\n * // Basic usage - automatically connects to extension\n * function App() {\n * return (\n * <WoTProvider>\n * <YourApp />\n * </WoTProvider>\n * );\n * }\n *\n * // With fallback for when extension is not installed\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 extensionOptions = {},\n children,\n}: WoTProviderProps) {\n const [extensionState, setExtensionState] = useState<ExtensionConnectionState>('idle');\n const [extensionError, setExtensionError] = useState<string | undefined>();\n const [isReady, setIsReady] = useState(false);\n\n // Create connector instance\n const connector = useMemo(\n () => new ExtensionConnector(extensionOptions),\n [extensionOptions.checkTimeout, extensionOptions.connectTimeout]\n );\n\n // Connect function for manual reconnection\n const connect = useCallback(async () => {\n const result = await connector.connect();\n setExtensionState(result.state);\n setExtensionError(result.error);\n }, [connector]);\n\n // Auto-connect on mount\n useEffect(() => {\n // Subscribe to state changes\n const unsubscribe = connector.subscribe((result) => {\n setExtensionState(result.state);\n setExtensionError(result.error);\n });\n\n // Start connection\n connector.connect().then(() => {\n setIsReady(true);\n });\n\n return () => {\n unsubscribe();\n };\n }, [connector]);\n\n // Create WoT instance\n const wot = useMemo(() => {\n // Wait for connection check to complete\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 isConnecting = extensionState === 'checking' || extensionState === 'connecting';\n const isChecked = extensionState !== 'idle' && extensionState !== 'checking';\n const isInstalled = extensionState !== 'not-installed' && extensionState !== 'idle';\n\n return {\n state: extensionState,\n isConnected,\n isConnecting,\n isChecked,\n isInstalled,\n error: extensionError,\n connect,\n };\n }, [extensionState, extensionError, connect]);\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, isConnecting, isInstalled, error } = useExtension();\n *\n * if (isConnecting) return <span>Connecting...</span>;\n * if (!isInstalled) return <span>Extension not installed</span>;\n * if (error) return <span>Error: {error}</span>;\n * if (isConnected) return <span>Connected!</span>;\n *\n * return null;\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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nostr-wot-sdk",
3
- "version": "0.4.1",
3
+ "version": "0.4.2",
4
4
  "description": "JavaScript/TypeScript SDK for querying Nostr Web of Trust",
5
5
  "author": "Leon Acosta <leon@nostr-wot.com>",
6
6
  "license": "MIT",