connect method
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;
}