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