performWalletRequest<T> method
Future<WalletResponse<T> >
performWalletRequest<T>(
- WalletRequest request,
- dynamic tSerializer, {
- AptosProvider? provider,
override
Implementation
@override
Future<WalletResponse<T>> performWalletRequest<T>(
WalletRequest request,
BCSSerializer<T> tSerializer, {
AptosProvider? provider,
}) async {
final Completer<WalletResponse<T>> completer =
Completer<WalletResponse<T>>();
final encodedRequest = request.encodeToBcsUrlBase64();
final url = Uri.parse(_config.baseUrl).replace(
path: 'prompt',
queryParameters: {
'request': encodedRequest,
if (provider != null) 'provider': provider.name,
},
);
final promptWindow = _openPrompt(url);
final timer = Timer.periodic(Duration(milliseconds: 500), (timer) async {
if (promptWindow.closed && !completer.isCompleted) {
completer.complete(WalletResponse(approved: false, value: null));
}
});
final messageSubscription = web.window.onMessage.listen((
web.MessageEvent event,
) {
if (event.origin != _config.baseUrl) {
return;
}
final data = event.data.dartify();
if (data == null) {
return;
}
final promptResponse = PromptMessage.fromJson(data);
if (promptResponse == null) {
return;
}
switch (promptResponse.type) {
case PromptMessage.approvalResponse:
if (!completer.isCompleted) {
completer.complete(
promptResponse.deserializeWalletResponse(tSerializer),
);
}
case PromptMessage.unauthorizedError:
if (!completer.isCompleted) {
completer.completeError(PromptUnauthorizedError());
}
case PromptMessage.pingRequest:
promptWindow.postMessage(
PromptMessage(
type: 'PromptOpenerPingResponse',
serializedValue: null,
).toJson().toJS,
_config.baseUrl.toJS,
);
}
});
return completer.future.whenComplete(() {
timer.cancel();
messageSubscription.cancel();
});
}