@unicitylabs/sphere-sdk 0.2.2 → 0.2.5

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.
@@ -177,7 +177,7 @@ interface TokenStorageProvider<TData = unknown> extends BaseProvider {
177
177
  */
178
178
  deleteToken?(tokenId: string): Promise<void>;
179
179
  }
180
- type StorageEventType = 'storage:saving' | 'storage:saved' | 'storage:loading' | 'storage:loaded' | 'storage:error' | 'sync:started' | 'sync:completed' | 'sync:conflict' | 'sync:error';
180
+ type StorageEventType = 'storage:saving' | 'storage:saved' | 'storage:loading' | 'storage:loaded' | 'storage:error' | 'storage:remote-updated' | 'sync:started' | 'sync:completed' | 'sync:conflict' | 'sync:error';
181
181
  interface StorageEvent {
182
182
  type: StorageEventType;
183
183
  timestamp: number;
@@ -470,6 +470,12 @@ interface TransportProvider extends BaseProvider {
470
470
  * @returns Unsubscribe function
471
471
  */
472
472
  onInstantSplitReceived?(handler: InstantSplitBundleHandler): () => void;
473
+ /**
474
+ * Fetch pending events from transport (one-shot query).
475
+ * Creates a temporary subscription, processes events through normal handlers,
476
+ * and resolves after EOSE (End Of Stored Events).
477
+ */
478
+ fetchPendingEvents?(): Promise<void>;
473
479
  }
474
480
  /**
475
481
  * Payload for sending instant split bundles
@@ -534,7 +540,7 @@ interface IncomingTokenTransfer {
534
540
  payload: TokenTransferPayload;
535
541
  timestamp: number;
536
542
  }
537
- type TokenTransferHandler = (transfer: IncomingTokenTransfer) => void;
543
+ type TokenTransferHandler = (transfer: IncomingTokenTransfer) => void | Promise<void>;
538
544
  interface PaymentRequestPayload {
539
545
  /** Amount requested (in smallest units) */
540
546
  amount: string | bigint;
@@ -552,6 +558,8 @@ interface IncomingPaymentRequest {
552
558
  id: string;
553
559
  /** Transport-specific pubkey of sender */
554
560
  senderTransportPubkey: string;
561
+ /** Sender's nametag (if included in encrypted content) */
562
+ senderNametag?: string;
555
563
  /** Parsed request data */
556
564
  request: {
557
565
  requestId: string;
@@ -675,6 +683,14 @@ type UUIDGenerator = () => string;
675
683
  * WebSocket is injected via factory for cross-platform support
676
684
  */
677
685
 
686
+ /**
687
+ * Minimal key-value storage interface for transport persistence.
688
+ * Used to persist the last processed event timestamp across sessions.
689
+ */
690
+ interface TransportStorageAdapter {
691
+ get(key: string): Promise<string | null>;
692
+ set(key: string, value: string): Promise<void>;
693
+ }
678
694
  interface NostrTransportProviderConfig {
679
695
  /** Nostr relay URLs */
680
696
  relays?: string[];
@@ -692,6 +708,8 @@ interface NostrTransportProviderConfig {
692
708
  createWebSocket: WebSocketFactory;
693
709
  /** UUID generator (optional, defaults to crypto.randomUUID) */
694
710
  generateUUID?: UUIDGenerator;
711
+ /** Optional storage adapter for persisting subscription timestamps */
712
+ storage?: TransportStorageAdapter;
695
713
  }
696
714
  declare class NostrTransportProvider implements TransportProvider {
697
715
  readonly id = "nostr";
@@ -699,11 +717,15 @@ declare class NostrTransportProvider implements TransportProvider {
699
717
  readonly type: "p2p";
700
718
  readonly description = "P2P messaging via Nostr protocol";
701
719
  private config;
720
+ private storage;
721
+ /** In-memory max event timestamp to avoid read-before-write races in updateLastEventTimestamp. */
722
+ private lastEventTs;
702
723
  private identity;
703
724
  private keyManager;
704
725
  private status;
705
726
  private nostrClient;
706
727
  private mainSubscriptionId;
728
+ private processedEventIds;
707
729
  private messageHandlers;
708
730
  private transferHandlers;
709
731
  private paymentRequestHandlers;
@@ -800,6 +822,12 @@ declare class NostrTransportProvider implements TransportProvider {
800
822
  publishBroadcast(content: string, tags?: string[]): Promise<string>;
801
823
  onEvent(callback: TransportEventCallback): () => void;
802
824
  private handleEvent;
825
+ /**
826
+ * Save the max event timestamp to storage (fire-and-forget, no await needed by caller).
827
+ * Uses in-memory `lastEventTs` to avoid read-before-write race conditions
828
+ * when multiple events arrive in quick succession.
829
+ */
830
+ private updateLastEventTimestamp;
803
831
  private handleDirectMessage;
804
832
  private handleGiftWrap;
805
833
  private handleTokenTransfer;
@@ -809,6 +837,7 @@ declare class NostrTransportProvider implements TransportProvider {
809
837
  private createEvent;
810
838
  private createEncryptedEvent;
811
839
  private publishEvent;
840
+ fetchPendingEvents(): Promise<void>;
812
841
  private queryEvents;
813
842
  private walletSubscriptionId;
814
843
  private chatSubscriptionId;
@@ -1301,6 +1330,42 @@ interface BaseProviders {
1301
1330
  price?: PriceProvider;
1302
1331
  }
1303
1332
 
1333
+ /** IPFS storage provider configuration */
1334
+ interface IpfsStorageConfig {
1335
+ /** Gateway URLs for HTTP API (defaults to Unicity dedicated nodes) */
1336
+ gateways?: string[];
1337
+ /** Content fetch timeout in ms (default: 15000) */
1338
+ fetchTimeoutMs?: number;
1339
+ /** IPNS resolution timeout in ms (default: 10000) */
1340
+ resolveTimeoutMs?: number;
1341
+ /** IPNS publish timeout in ms (default: 30000) */
1342
+ publishTimeoutMs?: number;
1343
+ /** Gateway connectivity test timeout in ms (default: 5000) */
1344
+ connectivityTimeoutMs?: number;
1345
+ /** IPNS record lifetime in ms (default: 99 years) */
1346
+ ipnsLifetimeMs?: number;
1347
+ /** IPNS cache TTL in ms (default: 60000) */
1348
+ ipnsCacheTtlMs?: number;
1349
+ /** Circuit breaker failure threshold (default: 3) */
1350
+ circuitBreakerThreshold?: number;
1351
+ /** Circuit breaker cooldown in ms (default: 60000) */
1352
+ circuitBreakerCooldownMs?: number;
1353
+ /** Known-fresh window in ms (default: 30000) */
1354
+ knownFreshWindowMs?: number;
1355
+ /** Enable debug logging (default: false) */
1356
+ debug?: boolean;
1357
+ /** WebSocket factory for IPNS push subscriptions (cross-platform) */
1358
+ createWebSocket?: WebSocketFactory;
1359
+ /** Override WebSocket URL (auto-derived from gateways if omitted) */
1360
+ wsUrl?: string;
1361
+ /** Fallback polling interval in ms when WS unavailable (default: 90000) */
1362
+ fallbackPollIntervalMs?: number;
1363
+ /** Debounce for push-triggered sync in ms (default: 500) */
1364
+ syncDebounceMs?: number;
1365
+ /** Debounce interval for background flush in ms (default: 2000) */
1366
+ flushDebounceMs?: number;
1367
+ }
1368
+
1304
1369
  /**
1305
1370
  * Node.js Implementation
1306
1371
  * Providers for CLI/Node.js usage
@@ -1321,6 +1386,18 @@ type NodeOracleConfig = BaseOracleConfig & NodeOracleExtensions;
1321
1386
  * Same as base
1322
1387
  */
1323
1388
  type NodeL1Config = L1Config;
1389
+ /** Node.js IPFS sync configuration */
1390
+ interface NodeIpfsSyncConfig {
1391
+ /** Enable IPFS sync (default: false) */
1392
+ enabled?: boolean;
1393
+ /** IPFS storage provider configuration */
1394
+ config?: IpfsStorageConfig;
1395
+ }
1396
+ /** Node.js token sync configuration */
1397
+ interface NodeTokenSyncConfig {
1398
+ /** IPFS sync backend */
1399
+ ipfs?: NodeIpfsSyncConfig;
1400
+ }
1324
1401
  interface NodeProvidersConfig {
1325
1402
  /** Network preset: mainnet, testnet, or dev */
1326
1403
  network?: NetworkType;
@@ -1336,6 +1413,8 @@ interface NodeProvidersConfig {
1336
1413
  l1?: NodeL1Config;
1337
1414
  /** Price provider configuration (optional — enables fiat value display) */
1338
1415
  price?: BasePriceConfig;
1416
+ /** Token sync backends configuration */
1417
+ tokenSync?: NodeTokenSyncConfig;
1339
1418
  }
1340
1419
  interface NodeProviders {
1341
1420
  storage: StorageProvider;
@@ -1346,6 +1425,8 @@ interface NodeProviders {
1346
1425
  l1?: L1Config;
1347
1426
  /** Price provider (optional — enables fiat value display) */
1348
1427
  price?: PriceProvider;
1428
+ /** IPFS token storage provider (when tokenSync.ipfs.enabled is true) */
1429
+ ipfsTokenStorage?: TokenStorageProvider<TxfStorageDataBase>;
1349
1430
  }
1350
1431
  /**
1351
1432
  * Create all Node.js providers with default configuration
@@ -1385,4 +1466,4 @@ interface NodeProviders {
1385
1466
  */
1386
1467
  declare function createNodeProviders(config?: NodeProvidersConfig): NodeProviders;
1387
1468
 
1388
- export { type BaseOracleConfig, type BaseProviders, type BaseTransportConfig, FileStorageProvider, type FileStorageProviderConfig, type FileTokenStorageConfig, FileTokenStorageProvider, type IWebSocket, type L1Config, type NodeL1Config, type NodeOracleConfig, type NodeProviders, type NodeProvidersConfig, type NodeTransportConfig, NodeTrustBaseLoader, NostrTransportProvider, type NostrTransportProviderConfig, type TrustBaseLoader$1 as TrustBaseLoader, UnicityAggregatorProvider, type UnicityAggregatorProviderConfig, UnicityOracleProvider, type UnicityOracleProviderConfig, type WebSocketFactory, createFileStorageProvider, createFileTokenStorageProvider, createNodeProviders, createNodeTrustBaseLoader, createNodeWebSocketFactory, createNostrTransportProvider, createUnicityAggregatorProvider, createUnicityOracleProvider };
1469
+ export { type BaseOracleConfig, type BaseProviders, type BaseTransportConfig, FileStorageProvider, type FileStorageProviderConfig, type FileTokenStorageConfig, FileTokenStorageProvider, type IWebSocket, type L1Config, type NodeIpfsSyncConfig, type NodeL1Config, type NodeOracleConfig, type NodeProviders, type NodeProvidersConfig, type NodeTokenSyncConfig, type NodeTransportConfig, NodeTrustBaseLoader, NostrTransportProvider, type NostrTransportProviderConfig, type TrustBaseLoader$1 as TrustBaseLoader, UnicityAggregatorProvider, type UnicityAggregatorProviderConfig, UnicityOracleProvider, type UnicityOracleProviderConfig, type WebSocketFactory, createFileStorageProvider, createFileTokenStorageProvider, createNodeProviders, createNodeTrustBaseLoader, createNodeWebSocketFactory, createNostrTransportProvider, createUnicityAggregatorProvider, createUnicityOracleProvider };
@@ -177,7 +177,7 @@ interface TokenStorageProvider<TData = unknown> extends BaseProvider {
177
177
  */
178
178
  deleteToken?(tokenId: string): Promise<void>;
179
179
  }
180
- type StorageEventType = 'storage:saving' | 'storage:saved' | 'storage:loading' | 'storage:loaded' | 'storage:error' | 'sync:started' | 'sync:completed' | 'sync:conflict' | 'sync:error';
180
+ type StorageEventType = 'storage:saving' | 'storage:saved' | 'storage:loading' | 'storage:loaded' | 'storage:error' | 'storage:remote-updated' | 'sync:started' | 'sync:completed' | 'sync:conflict' | 'sync:error';
181
181
  interface StorageEvent {
182
182
  type: StorageEventType;
183
183
  timestamp: number;
@@ -470,6 +470,12 @@ interface TransportProvider extends BaseProvider {
470
470
  * @returns Unsubscribe function
471
471
  */
472
472
  onInstantSplitReceived?(handler: InstantSplitBundleHandler): () => void;
473
+ /**
474
+ * Fetch pending events from transport (one-shot query).
475
+ * Creates a temporary subscription, processes events through normal handlers,
476
+ * and resolves after EOSE (End Of Stored Events).
477
+ */
478
+ fetchPendingEvents?(): Promise<void>;
473
479
  }
474
480
  /**
475
481
  * Payload for sending instant split bundles
@@ -534,7 +540,7 @@ interface IncomingTokenTransfer {
534
540
  payload: TokenTransferPayload;
535
541
  timestamp: number;
536
542
  }
537
- type TokenTransferHandler = (transfer: IncomingTokenTransfer) => void;
543
+ type TokenTransferHandler = (transfer: IncomingTokenTransfer) => void | Promise<void>;
538
544
  interface PaymentRequestPayload {
539
545
  /** Amount requested (in smallest units) */
540
546
  amount: string | bigint;
@@ -552,6 +558,8 @@ interface IncomingPaymentRequest {
552
558
  id: string;
553
559
  /** Transport-specific pubkey of sender */
554
560
  senderTransportPubkey: string;
561
+ /** Sender's nametag (if included in encrypted content) */
562
+ senderNametag?: string;
555
563
  /** Parsed request data */
556
564
  request: {
557
565
  requestId: string;
@@ -675,6 +683,14 @@ type UUIDGenerator = () => string;
675
683
  * WebSocket is injected via factory for cross-platform support
676
684
  */
677
685
 
686
+ /**
687
+ * Minimal key-value storage interface for transport persistence.
688
+ * Used to persist the last processed event timestamp across sessions.
689
+ */
690
+ interface TransportStorageAdapter {
691
+ get(key: string): Promise<string | null>;
692
+ set(key: string, value: string): Promise<void>;
693
+ }
678
694
  interface NostrTransportProviderConfig {
679
695
  /** Nostr relay URLs */
680
696
  relays?: string[];
@@ -692,6 +708,8 @@ interface NostrTransportProviderConfig {
692
708
  createWebSocket: WebSocketFactory;
693
709
  /** UUID generator (optional, defaults to crypto.randomUUID) */
694
710
  generateUUID?: UUIDGenerator;
711
+ /** Optional storage adapter for persisting subscription timestamps */
712
+ storage?: TransportStorageAdapter;
695
713
  }
696
714
  declare class NostrTransportProvider implements TransportProvider {
697
715
  readonly id = "nostr";
@@ -699,11 +717,15 @@ declare class NostrTransportProvider implements TransportProvider {
699
717
  readonly type: "p2p";
700
718
  readonly description = "P2P messaging via Nostr protocol";
701
719
  private config;
720
+ private storage;
721
+ /** In-memory max event timestamp to avoid read-before-write races in updateLastEventTimestamp. */
722
+ private lastEventTs;
702
723
  private identity;
703
724
  private keyManager;
704
725
  private status;
705
726
  private nostrClient;
706
727
  private mainSubscriptionId;
728
+ private processedEventIds;
707
729
  private messageHandlers;
708
730
  private transferHandlers;
709
731
  private paymentRequestHandlers;
@@ -800,6 +822,12 @@ declare class NostrTransportProvider implements TransportProvider {
800
822
  publishBroadcast(content: string, tags?: string[]): Promise<string>;
801
823
  onEvent(callback: TransportEventCallback): () => void;
802
824
  private handleEvent;
825
+ /**
826
+ * Save the max event timestamp to storage (fire-and-forget, no await needed by caller).
827
+ * Uses in-memory `lastEventTs` to avoid read-before-write race conditions
828
+ * when multiple events arrive in quick succession.
829
+ */
830
+ private updateLastEventTimestamp;
803
831
  private handleDirectMessage;
804
832
  private handleGiftWrap;
805
833
  private handleTokenTransfer;
@@ -809,6 +837,7 @@ declare class NostrTransportProvider implements TransportProvider {
809
837
  private createEvent;
810
838
  private createEncryptedEvent;
811
839
  private publishEvent;
840
+ fetchPendingEvents(): Promise<void>;
812
841
  private queryEvents;
813
842
  private walletSubscriptionId;
814
843
  private chatSubscriptionId;
@@ -1301,6 +1330,42 @@ interface BaseProviders {
1301
1330
  price?: PriceProvider;
1302
1331
  }
1303
1332
 
1333
+ /** IPFS storage provider configuration */
1334
+ interface IpfsStorageConfig {
1335
+ /** Gateway URLs for HTTP API (defaults to Unicity dedicated nodes) */
1336
+ gateways?: string[];
1337
+ /** Content fetch timeout in ms (default: 15000) */
1338
+ fetchTimeoutMs?: number;
1339
+ /** IPNS resolution timeout in ms (default: 10000) */
1340
+ resolveTimeoutMs?: number;
1341
+ /** IPNS publish timeout in ms (default: 30000) */
1342
+ publishTimeoutMs?: number;
1343
+ /** Gateway connectivity test timeout in ms (default: 5000) */
1344
+ connectivityTimeoutMs?: number;
1345
+ /** IPNS record lifetime in ms (default: 99 years) */
1346
+ ipnsLifetimeMs?: number;
1347
+ /** IPNS cache TTL in ms (default: 60000) */
1348
+ ipnsCacheTtlMs?: number;
1349
+ /** Circuit breaker failure threshold (default: 3) */
1350
+ circuitBreakerThreshold?: number;
1351
+ /** Circuit breaker cooldown in ms (default: 60000) */
1352
+ circuitBreakerCooldownMs?: number;
1353
+ /** Known-fresh window in ms (default: 30000) */
1354
+ knownFreshWindowMs?: number;
1355
+ /** Enable debug logging (default: false) */
1356
+ debug?: boolean;
1357
+ /** WebSocket factory for IPNS push subscriptions (cross-platform) */
1358
+ createWebSocket?: WebSocketFactory;
1359
+ /** Override WebSocket URL (auto-derived from gateways if omitted) */
1360
+ wsUrl?: string;
1361
+ /** Fallback polling interval in ms when WS unavailable (default: 90000) */
1362
+ fallbackPollIntervalMs?: number;
1363
+ /** Debounce for push-triggered sync in ms (default: 500) */
1364
+ syncDebounceMs?: number;
1365
+ /** Debounce interval for background flush in ms (default: 2000) */
1366
+ flushDebounceMs?: number;
1367
+ }
1368
+
1304
1369
  /**
1305
1370
  * Node.js Implementation
1306
1371
  * Providers for CLI/Node.js usage
@@ -1321,6 +1386,18 @@ type NodeOracleConfig = BaseOracleConfig & NodeOracleExtensions;
1321
1386
  * Same as base
1322
1387
  */
1323
1388
  type NodeL1Config = L1Config;
1389
+ /** Node.js IPFS sync configuration */
1390
+ interface NodeIpfsSyncConfig {
1391
+ /** Enable IPFS sync (default: false) */
1392
+ enabled?: boolean;
1393
+ /** IPFS storage provider configuration */
1394
+ config?: IpfsStorageConfig;
1395
+ }
1396
+ /** Node.js token sync configuration */
1397
+ interface NodeTokenSyncConfig {
1398
+ /** IPFS sync backend */
1399
+ ipfs?: NodeIpfsSyncConfig;
1400
+ }
1324
1401
  interface NodeProvidersConfig {
1325
1402
  /** Network preset: mainnet, testnet, or dev */
1326
1403
  network?: NetworkType;
@@ -1336,6 +1413,8 @@ interface NodeProvidersConfig {
1336
1413
  l1?: NodeL1Config;
1337
1414
  /** Price provider configuration (optional — enables fiat value display) */
1338
1415
  price?: BasePriceConfig;
1416
+ /** Token sync backends configuration */
1417
+ tokenSync?: NodeTokenSyncConfig;
1339
1418
  }
1340
1419
  interface NodeProviders {
1341
1420
  storage: StorageProvider;
@@ -1346,6 +1425,8 @@ interface NodeProviders {
1346
1425
  l1?: L1Config;
1347
1426
  /** Price provider (optional — enables fiat value display) */
1348
1427
  price?: PriceProvider;
1428
+ /** IPFS token storage provider (when tokenSync.ipfs.enabled is true) */
1429
+ ipfsTokenStorage?: TokenStorageProvider<TxfStorageDataBase>;
1349
1430
  }
1350
1431
  /**
1351
1432
  * Create all Node.js providers with default configuration
@@ -1385,4 +1466,4 @@ interface NodeProviders {
1385
1466
  */
1386
1467
  declare function createNodeProviders(config?: NodeProvidersConfig): NodeProviders;
1387
1468
 
1388
- export { type BaseOracleConfig, type BaseProviders, type BaseTransportConfig, FileStorageProvider, type FileStorageProviderConfig, type FileTokenStorageConfig, FileTokenStorageProvider, type IWebSocket, type L1Config, type NodeL1Config, type NodeOracleConfig, type NodeProviders, type NodeProvidersConfig, type NodeTransportConfig, NodeTrustBaseLoader, NostrTransportProvider, type NostrTransportProviderConfig, type TrustBaseLoader$1 as TrustBaseLoader, UnicityAggregatorProvider, type UnicityAggregatorProviderConfig, UnicityOracleProvider, type UnicityOracleProviderConfig, type WebSocketFactory, createFileStorageProvider, createFileTokenStorageProvider, createNodeProviders, createNodeTrustBaseLoader, createNodeWebSocketFactory, createNostrTransportProvider, createUnicityAggregatorProvider, createUnicityOracleProvider };
1469
+ export { type BaseOracleConfig, type BaseProviders, type BaseTransportConfig, FileStorageProvider, type FileStorageProviderConfig, type FileTokenStorageConfig, FileTokenStorageProvider, type IWebSocket, type L1Config, type NodeIpfsSyncConfig, type NodeL1Config, type NodeOracleConfig, type NodeProviders, type NodeProvidersConfig, type NodeTokenSyncConfig, type NodeTransportConfig, NodeTrustBaseLoader, NostrTransportProvider, type NostrTransportProviderConfig, type TrustBaseLoader$1 as TrustBaseLoader, UnicityAggregatorProvider, type UnicityAggregatorProviderConfig, UnicityOracleProvider, type UnicityOracleProviderConfig, type WebSocketFactory, createFileStorageProvider, createFileTokenStorageProvider, createNodeProviders, createNodeTrustBaseLoader, createNodeWebSocketFactory, createNostrTransportProvider, createUnicityAggregatorProvider, createUnicityOracleProvider };