performWalletRequest<T> method

  1. @override
Future<WalletResponse<T>> performWalletRequest<T>(
  1. WalletRequest request,
  2. dynamic tSerializer, {
  3. 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();
  });
}