send method

  1. @override
Future<CrossmintJsonMap> send(
  1. CrossmintJsonMap request
)
override

Implementation

@override
Future<CrossmintJsonMap> send(CrossmintJsonMap request) async {
  if (!_state.isConnected) {
    throw StateError('Hidden signer bridge is not connected.');
  }
  final HiddenSignerBridgePort? port = _port;
  if (port == null) {
    throw StateError('No webview port is attached to the hidden bridge.');
  }

  final String requestId = 'req-${_nextRequestId++}';
  final Completer<CrossmintJsonMap> completer = Completer<CrossmintJsonMap>();
  _pendingRequests[requestId] = completer;
  if (_config.requestTimeout > Duration.zero) {
    _requestTimers[requestId] = Timer(_config.requestTimeout, () {
      final Completer<CrossmintJsonMap>? pending = _pendingRequests.remove(
        requestId,
      );
      _requestTimers.remove(requestId);
      if (pending == null || pending.isCompleted) {
        return;
      }
      final TimeoutException error = TimeoutException(
        'Hidden signer request $requestId timed out after '
        '${_config.requestTimeout.inMilliseconds}ms.',
      );
      pending.completeError(error);
      _updateState(HiddenSignerBridgePhase.error, lastError: error);
    });
  }

  final CrossmintJsonMap envelope = <String, Object?>{
    'requestId': requestId,
    ...request,
  };
  try {
    await port.runJavaScript(
      _config.dispatchScriptBuilder(jsonEncode(envelope)),
    );
    return await completer.future;
  } catch (error) {
    _pendingRequests.remove(requestId);
    _requestTimers.remove(requestId)?.cancel();
    if (_state.phase == HiddenSignerBridgePhase.ready) {
      _updateState(HiddenSignerBridgePhase.error, lastError: error);
    }
    rethrow;
  }
}