Initialization constructor

Initialization({
  1. required NdkConfig ndkConfig,
  2. required GlobalState globalState,
})

NdkConfig is user defined GlobalState global state object that schuld stay in memory

Implementation

Initialization({
  required NdkConfig ndkConfig,
  required GlobalState globalState,
}) : _globalState = globalState,
     _ndkConfig = ndkConfig {
  // Configure global WebSocket User-Agent on dart:io platforms
  configureDefaultUserAgent(ndkConfig.userAgent);

  accounts = Accounts(_ndkConfig.eventSignerFactory);

  switch (_ndkConfig.engine) {
    case NdkEngine.RELAY_SETS:
      relayManager = RelayManager(
        globalState: _globalState,
        accounts: accounts,
        nostrTransportFactory: _webSocketNostrTransportFactory,
        bootstrapRelays: _ndkConfig.bootstrapRelays,
        eagerAuth: _ndkConfig.eagerAuth,
        authCallbackTimeout: _ndkConfig.authCallbackTimeout,
      );

      engine = RelaySetsEngine(
        cacheManager: _ndkConfig.cache,
        globalState: _globalState,
        relayManager: relayManager,
        bootstrapRelays: _ndkConfig.bootstrapRelays,
      );
      break;
    case NdkEngine.JIT:
      relayManager = RelayManager<JitEngineRelayConnectivityData>(
        globalState: _globalState,
        accounts: accounts,
        nostrTransportFactory: _webSocketNostrTransportFactory,
        bootstrapRelays: _ndkConfig.bootstrapRelays,
        engineAdditionalDataFactory: JitEngineRelayConnectivityDataFactory(),
        eagerAuth: _ndkConfig.eagerAuth,
        authCallbackTimeout: _ndkConfig.authCallbackTimeout,
      );

      engine = JitEngine(
        cache: _ndkConfig.cache,
        ignoreRelays: _ndkConfig.ignoreRelays,
        relayManagerLight: relayManager,
        globalState: _globalState,
        bootstrapRelays: _ndkConfig.bootstrapRelays,
      );
      break;
  }

  /// repositories
  final Nip05Repository nip05repository = Nip05HttpRepositoryImpl(
    httpDS: _httpRequestDS,
  );

  final BlossomRepository blossomRepository = BlossomRepositoryImpl(
    client: _httpRequestDS,
    fileIO: createFileIO(),
  );

  final CashuRepo cashuRepo = CashuRepoImpl(client: _httpRequestDS);

  ///   use cases
  cacheWrite = CacheWrite(_ndkConfig.cache);
  cacheRead = CacheRead(_ndkConfig.cache);
  decryptedEventPayloads = DecryptedEventPayloads(
    cacheManager: _ndkConfig.cache,
  );

  requests = Requests(
    defaultQueryTimeout: _ndkConfig.defaultQueryTimeout,
    globalState: _globalState,
    cacheRead: cacheRead,
    cacheWrite: cacheWrite,
    networkEngine: engine,
    relayManager: relayManager,
    eventVerifier: _ndkConfig.eventVerifier,
    eventOutFilters: _ndkConfig.eventOutFilters,
  );

  final broadcastSender = BroadcastSender(
    globalState: _globalState,
    networkEngine: engine,
    cacheManager: _ndkConfig.cache,
    accounts: accounts,
    considerDonePercent: _ndkConfig.defaultBroadcastConsiderDonePercent,
    timeout: _ndkConfig.defaultBroadcastTimeout,
    saveToCache: _ndkConfig.defaultBroadcastSaveToCache,
  );
  pendingBroadcastDelivery = PendingBroadcastDelivery(
    cacheManager: _ndkConfig.cache,
    broadcastSender: broadcastSender,
    accounts: accounts,
  );
  broadcast = Broadcast(
    broadcastSender: broadcastSender,
    accounts: accounts,
    cacheManager: _ndkConfig.cache,
    pendingDelivery: pendingBroadcastDelivery,
  );
  _relayConnectivitySubscription = relayManager.relayConnectivityChanges
      .listen(_handleRelayConnectivityUpdate);
  pendingBroadcastDelivery.startPeriodicRetry(
    connectedRelayUrls: () =>
        relayManager.connectedRelays.map((relay) => relay.url),
    reconnectRelay: (relayUrl) => relayManager.reconnectRelay(
      relayUrl,
      connectionSource: ConnectionSource.explicit,
      force: true,
    ),
    retryInterval: _ndkConfig.pendingDeliveryRetryInterval,
  );

  // Initialize nwc and cashu before walletsOperationsRepo since they are dependencies
  nwc = Nwc(
    requests: requests,
    broadcast: broadcast,
    eventSignerFactory: _ndkConfig.eventSignerFactory,
  );

  if (_ndkConfig.walletsRepo == null) {
    // auto detect if the provided cache manager has wallets capabilities.
    if (_ndkConfig.cache is WalletsRepo) {
      _ndkConfig.walletsRepo = _ndkConfig.cache as WalletsRepo;
    } else {
      _ndkConfig.walletsRepo = StubWalletsRepo();
    }
  }

  cashu = Cashu(
    cashuRepo: cashuRepo,
    walletsRepo: _ndkConfig.walletsRepo!,
    cacheManager: _ndkConfig.cache,
    cashuUserSeedphrase: _ndkConfig.cashuUserSeedphrase,
    cashuKeyDerivation: DartCashuKeyDerivation(),
  );

  // Create wallet providers
  final cashuProvider = CashuWalletProvider(cashu);
  final nwcProvider = NwcWalletProvider(nwc);

  bunkers = Bunkers(
    broadcast: broadcast,
    requests: requests,
    eventSignerFactory: _ndkConfig.eventSignerFactory,
  );

  follows = Follows(
    requests: requests,
    cacheManager: _ndkConfig.cache,
    broadcast: broadcast,
    accounts: accounts,
  );

  metadatas = Metadatas(
    requests: requests,
    cacheManager: _ndkConfig.cache,
    broadcast: broadcast,
    accounts: accounts,
  );

  userRelayLists = UserRelayLists(
    requests: requests,
    cacheManager: _ndkConfig.cache,
    broadcast: broadcast,
    accounts: accounts,
  );

  lists = Lists(
    requests: requests,
    cacheManager: _ndkConfig.cache,
    broadcast: broadcast,
    accounts: accounts,
    eventSignerFactory: _ndkConfig.eventSignerFactory,
    decryptedEventPayloads: decryptedEventPayloads,
  );

  relaySets = RelaySets(
    cacheManager: _ndkConfig.cache,
    userRelayLists: userRelayLists,
    relayManager: relayManager,
    blockedRelays: _globalState.blockedRelays,
  );

  nip05 = Nip05Usecase(
    database: _ndkConfig.cache,
    nip05Repository: nip05repository,
  );

  final LnurlTransport lnurlTransport = LnurlTransportHttpImpl(
    _httpRequestDS,
  );

  lnurl = Lnurl(transport: lnurlTransport);

  // Create LNURL wallet provider after lnurl is initialized
  final lnurlProvider = LnurlWalletProvider(lnurl);

  zaps = Zaps(requests: requests, nwc: nwc, lnurl: lnurl);

  blossomUserServerList = BlossomUserServerList(
    requests: requests,
    broadcast: broadcast,
    accounts: accounts,
  );

  blossom = Blossom(
    blossomRepository: blossomRepository,
    accounts: accounts,
    blossomUserServerList: blossomUserServerList,
    eventSignerFactory: _ndkConfig.eventSignerFactory,
  );

  files = Files(blossom: blossom);

  search = Search(cacheManager: _ndkConfig.cache, requests: requests);

  fetchedRanges = FetchedRanges(cacheManager: _ndkConfig.cache);

  // Connect fetchedRanges to requests for automatic range recording (if enabled)
  if (_ndkConfig.fetchedRangesEnabled) {
    requests.fetchedRanges = fetchedRanges;
  }

  giftWrap = GiftWrap(
    accounts: accounts,
    eventVerifier: _ndkConfig.eventVerifier,
    eventSignerFactory: _ndkConfig.eventSignerFactory,
    decryptedEventPayloads: decryptedEventPayloads,
  );
  dms = Dms(
    accounts: accounts,
    requests: requests,
    broadcast: broadcast,
    giftWrap: giftWrap,
    userRelayLists: userRelayLists,
    cacheManager: _ndkConfig.cache,
  );

  connectivity = Connectivy(relayManager);

  wallets = Wallets(
    providers: [cashuProvider, nwcProvider, lnurlProvider],
    repository: _ndkConfig.walletsRepo!,
  );
  proofOfWork = ProofOfWork();

  nip77 = Nip77(
    globalState: _globalState,
    relayManager: relayManager,
    cacheManager: _ndkConfig.cache,
  );

  // Wire up NIP-77 handlers
  relayManager.onNegMsg = nip77.processNegMsg;
  relayManager.onNegErr = nip77.processNegErr;

  trustedAssertions = TrustedAssertions(
    requests: requests,
    defaultProviders: _ndkConfig.defaultTrustedProviders,
  );

  if (_ndkConfig.cacheEvictionEnabled) {
    cacheEvictionScheduler = CacheEvictionScheduler(
      cacheManager: _ndkConfig.cache,
      policy: _ndkConfig.cacheEvictionPolicy,
      startupDelay: _ndkConfig.cacheEvictionStartupDelay,
      interval: _ndkConfig.cacheEvictionInterval,
      runOnStartup: _ndkConfig.runCacheEvictionOnStartup,
    )..start();
  }

  /// set the user configured log level
  Logger.setLogLevel(_ndkConfig.logLevel);
}