connect method

Future<NwcConnection> connect(
  1. String uri, {
  2. bool doGetInfoMethod = false,
  3. bool useETagForEachRequest = false,
  4. bool ignoreCapabilitiesCheck = false,
  5. dynamic onError(
    1. String?
    )?,
  6. Duration? timeout,
})

Connects to a given nostr+walletconnect:// uri, checking for 13194 event info, and optionally doing a get_info request (default false). It subscribes for notifications

Implementation

Future<NwcConnection> connect(String uri,
    {bool doGetInfoMethod = false,
    bool useETagForEachRequest = false,
    bool ignoreCapabilitiesCheck = false,
    Function(String?)? onError,
    Duration? timeout}) async {
  var parsedUri = NostrWalletConnectUri.parseConnectionUri(uri);
  var relay = Uri.decodeFull(parsedUri.relay);
  var filter =
      Filter(kinds: [NwcKind.INFO.value], authors: [parsedUri.walletPubkey]);

  Completer<NwcConnection> completer = Completer();

  List<Nip01Event> infoEvent = await _requests
      .query(
          name: "nwc-info",
          explicitRelays: [relay],
          filters: [filter],
          timeout: timeout ?? Duration(seconds: 5),
          timeoutCallback: () {
            onError?.call("timeout");
          },
          cacheRead: false,
          cacheWrite: false)
      .future;
  if (infoEvent.isNotEmpty) {
    Nip01Event event = infoEvent.first;
    if (event.kind == NwcKind.INFO.value && event.content != "") {
      final connection = NwcConnection(parsedUri);
      connection.useETagForEachRequest = useETagForEachRequest;
      connection.ignoreCapabilitiesCheck = ignoreCapabilitiesCheck;

      connection.permissions = event.content.split(" ").toSet();

      if (connection.permissions.length == 1) {
        connection.permissions =
            connection.permissions.first.split(",").toSet();
      }

      List<String> versionTags = event.getTags('v');
      if (versionTags.isNotEmpty) {
        connection.supportedVersions = versionTags.first.split(" ");
      }

      await _subscribeToNotificationsAndResponses(connection);

      if (doGetInfoMethod && ignoreCapabilitiesCheck ||
          connection.permissions.contains(NwcMethod.GET_INFO.name)) {
        try {
          await getInfo(connection, timeout: timeout).then((info) {
            connection.info = info;
          });
        } catch (e) {
          onError?.call("timeout get_info");
        }
      }
      Logger.log.i("NWC ${connection.uri} connected");
      _connections.add(connection);
      completer.complete(connection);
    }
  } else {
    onError?.call("not found");
    completer.complete(NwcConnection(parsedUri));
  }
  return completer.future;
}