Skip to content

Commit

Permalink
.org fallback, no internet connection error on core start
Browse files Browse the repository at this point in the history
  • Loading branch information
Sterling Long committed Aug 8, 2023
1 parent b7ee212 commit d7e94bf
Show file tree
Hide file tree
Showing 12 changed files with 252 additions and 78 deletions.
25 changes: 21 additions & 4 deletions lib/apis/core/core.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import 'package:walletconnect_flutter_v2/apis/core/relay_client/message_tracker.
import 'package:walletconnect_flutter_v2/apis/core/relay_client/relay_client.dart';
import 'package:walletconnect_flutter_v2/apis/core/relay_client/websocket/http_client.dart';
import 'package:walletconnect_flutter_v2/apis/core/relay_client/websocket/i_http_client.dart';
import 'package:walletconnect_flutter_v2/apis/core/relay_client/websocket/i_websocket_handler.dart';
import 'package:walletconnect_flutter_v2/apis/core/store/generic_store.dart';
import 'package:walletconnect_flutter_v2/apis/core/store/i_store.dart';
import 'package:walletconnect_flutter_v2/apis/core/relay_client/i_relay_client.dart';
Expand All @@ -29,8 +30,9 @@ class Core implements ICore {
@override
String get version => '2';

String _relayUrl = WalletConnectConstants.DEFAULT_RELAY_URL;
@override
final String relayUrl;
String get relayUrl => _relayUrl;

@override
final String projectId;
Expand Down Expand Up @@ -67,12 +69,13 @@ class Core implements ICore {
late IStore<Map<String, dynamic>> storage;

Core({
this.relayUrl = WalletConnectConstants.DEFAULT_RELAY_URL,
relayUrl = WalletConnectConstants.DEFAULT_RELAY_URL,
required this.projectId,
this.pushUrl = WalletConnectConstants.DEFAULT_PUSH_URL,
bool memoryStore = false,
Level logLevel = Level.info,
IHttpClient httpClient = const HttpWrapper(),
IWebSocketHandler? webSocketHandler,
}) {
Logger.level = logLevel;
storage = SharedPrefsStores(
Expand All @@ -87,6 +90,7 @@ class Core implements ICore {
fromJson: (dynamic value) => value as String,
),
);

relayClient = RelayClient(
core: this,
messageTracker: MessageTracker(
Expand All @@ -103,8 +107,9 @@ class Core implements ICore {
version: StoreVersions.VERSION_TOPIC_MAP,
fromJson: (dynamic value) => value as String,
),
httpClient: httpClient,
socketHandler: webSocketHandler,
);

expirer = Expirer(
storage: storage,
context: StoreVersions.CONTEXT_EXPIRER,
Expand Down Expand Up @@ -147,7 +152,19 @@ class Core implements ICore {
Future<void> start() async {
await storage.init();
await crypto.init();
await relayClient.init();

// If the relay URL is the default, try both it and the backup (.org)
if (relayUrl == WalletConnectConstants.DEFAULT_RELAY_URL) {
_relayUrl = relayUrl;
try {
await relayClient.init();
} catch (e) {
await relayClient.init();
}
} else {
await relayClient.init();
}

await expirer.init();
// await history.init();
await pairing.init();
Expand Down
41 changes: 22 additions & 19 deletions lib/apis/core/relay_client/relay_client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import 'package:walletconnect_flutter_v2/apis/core/relay_client/i_message_tracke
import 'package:walletconnect_flutter_v2/apis/core/relay_client/i_relay_client.dart';
import 'package:walletconnect_flutter_v2/apis/core/relay_client/json_rpc_2/src/parameters.dart';
import 'package:walletconnect_flutter_v2/apis/core/relay_client/json_rpc_2/src/peer.dart';
import 'package:walletconnect_flutter_v2/apis/core/relay_client/websocket/i_http_client.dart';
import 'package:walletconnect_flutter_v2/apis/core/relay_client/websocket/i_websocket_handler.dart';
import 'package:walletconnect_flutter_v2/apis/core/relay_client/relay_client_models.dart';
import 'package:walletconnect_flutter_v2/apis/core/relay_client/websocket/websocket_handler.dart';
Expand Down Expand Up @@ -62,15 +61,15 @@ class RelayClient implements IRelayClient {
bool _handledClose = false;

// late WebSocketChannel socket;
IWebSocketHandler? socket;
// IWebSocketHandler? socket;
Peer? jsonRPC;

/// Stores all the subs that haven't been completed
Map<String, Future<dynamic>> pendingSubscriptions = {};

IMessageTracker messageTracker;
IGenericStore<String> topicMap;
IHttpClient httpClient;
final IWebSocketHandler socketHandler;

ICore core;

Expand All @@ -81,10 +80,9 @@ class RelayClient implements IRelayClient {
required this.core,
required this.messageTracker,
required this.topicMap,
required this.httpClient,
IWebSocketHandler? socketHandler,
this.heartbeatPeriod = 5,
relayUrl = WalletConnectConstants.RELAYER_DEFAULT_PROTOCOL,
});
}) : socketHandler = socketHandler ?? WebSocketHandler();

@override
Future<void> init() async {
Expand Down Expand Up @@ -196,8 +194,7 @@ class RelayClient implements IRelayClient {

await jsonRPC?.close();
jsonRPC = null;
await socket?.close();
socket = null;
await socketHandler.close();
_heartbeatTimer?.cancel();
_heartbeatTimer = null;

Expand Down Expand Up @@ -225,21 +222,24 @@ class RelayClient implements IRelayClient {
jsonRPC = null;
}

if (socket != null) {
await socket!.close();
socket = null;
}
// if (socket != null) {
// await socket!.close();
// socket = null;
// }

socket = WebSocketHandler(
url: url,
httpClient: httpClient,
);
// socket = WebSocketHandler(
// url: url,
// httpClient: httpClient,
// );

core.logger.v('Initializing WebSocket with $url');
await socket!.init();
await socketHandler.setup(
url: url,
);
await socketHandler.connect();

jsonRPC = Peer(
socket!.channel!,
socketHandler.channel!,
);

jsonRPC!.registerMethod(
Expand Down Expand Up @@ -268,7 +268,10 @@ class RelayClient implements IRelayClient {
_handledClose = false;
jsonRPC!.done.then(
(value) {
_handleRelayClose(socket?.closeCode, socket?.closeReason);
_handleRelayClose(
socketHandler.closeCode,
socketHandler.closeReason,
);
},
);

Expand Down
14 changes: 9 additions & 5 deletions lib/apis/core/relay_client/websocket/i_websocket_handler.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,20 @@ import 'dart:async';
import 'package:stream_channel/stream_channel.dart';

abstract class IWebSocketHandler {
abstract final String url;

Future<void> init();
String? get url;

int? get closeCode;
String? get closeReason;

StreamChannel<String>? get channel;

Future<void> close();

Future<void> get ready;

Future<void> setup({
required String url,
});

Future<void> connect();

Future<void> close();
}
55 changes: 33 additions & 22 deletions lib/apis/core/relay_client/websocket/websocket_handler.dart
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import 'dart:async';

import 'package:stream_channel/stream_channel.dart';
import 'package:walletconnect_flutter_v2/apis/core/relay_client/websocket/i_http_client.dart';
import 'package:walletconnect_flutter_v2/apis/core/relay_client/websocket/i_websocket_handler.dart';
import 'package:walletconnect_flutter_v2/apis/models/basic_models.dart';
import 'package:web_socket_channel/web_socket_channel.dart';

class WebSocketHandler implements IWebSocketHandler {
String? _url;
@override
final String url;
final IHttpClient httpClient;
String? get url => _url;

WebSocketChannel? _socket;

Expand All @@ -24,31 +24,32 @@ class WebSocketHandler implements IWebSocketHandler {
@override
Future<void> get ready => _socket!.ready;

WebSocketHandler({
required this.url,
required this.httpClient,
});
// const WebSocketHandler();

@override
Future<void> init() async {
await _connect();
}
Future<void> setup({
required String url,
}) async {
_url = url;

@override
Future<void> close() async {
try {
await _socket?.sink.close();
} catch (_) {}
_socket = null;
await close();
}

Future<void> _connect() async {
@override
Future<void> connect() async {
// print('connecting');
_socket = WebSocketChannel.connect(
Uri.parse(
'$url&useOnCloseEvent=true',
),
);
try {
_socket = WebSocketChannel.connect(
Uri.parse(
'$url&useOnCloseEvent=true',
),
);
} catch (e) {
throw WalletConnectError(
code: -1,
message: 'No internet connection: ${e.toString()}',
);
}

_channel = _socket!.cast<String>();

Expand All @@ -72,6 +73,16 @@ class WebSocketHandler implements IWebSocketHandler {
// }
}

@override
Future<void> close() async {
try {
if (_socket != null) {
await _socket?.sink.close();
}
} catch (_) {}
_socket = null;
}

@override
String toString() {
return 'WebSocketHandler{url: $url, _socket: $_socket, _channel: $_channel}';
Expand Down
2 changes: 1 addition & 1 deletion lib/apis/models/json_rpc_error.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ part 'json_rpc_error.freezed.dart';
class JsonRpcError with _$JsonRpcError {
@JsonSerializable(includeIfNull: false)
const factory JsonRpcError({
required int code,
int? code,
String? message,
}) = _JsonRpcError;

Expand Down
28 changes: 14 additions & 14 deletions lib/apis/models/json_rpc_error.freezed.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ JsonRpcError _$JsonRpcErrorFromJson(Map<String, dynamic> json) {

/// @nodoc
mixin _$JsonRpcError {
int get code => throw _privateConstructorUsedError;
int? get code => throw _privateConstructorUsedError;
String? get message => throw _privateConstructorUsedError;

Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
Expand All @@ -35,7 +35,7 @@ abstract class $JsonRpcErrorCopyWith<$Res> {
JsonRpcError value, $Res Function(JsonRpcError) then) =
_$JsonRpcErrorCopyWithImpl<$Res, JsonRpcError>;
@useResult
$Res call({int code, String? message});
$Res call({int? code, String? message});
}

/// @nodoc
Expand All @@ -51,14 +51,14 @@ class _$JsonRpcErrorCopyWithImpl<$Res, $Val extends JsonRpcError>
@pragma('vm:prefer-inline')
@override
$Res call({
Object? code = null,
Object? code = freezed,
Object? message = freezed,
}) {
return _then(_value.copyWith(
code: null == code
code: freezed == code
? _value.code
: code // ignore: cast_nullable_to_non_nullable
as int,
as int?,
message: freezed == message
? _value.message
: message // ignore: cast_nullable_to_non_nullable
Expand All @@ -75,7 +75,7 @@ abstract class _$$_JsonRpcErrorCopyWith<$Res>
__$$_JsonRpcErrorCopyWithImpl<$Res>;
@override
@useResult
$Res call({int code, String? message});
$Res call({int? code, String? message});
}

/// @nodoc
Expand All @@ -89,14 +89,14 @@ class __$$_JsonRpcErrorCopyWithImpl<$Res>
@pragma('vm:prefer-inline')
@override
$Res call({
Object? code = null,
Object? code = freezed,
Object? message = freezed,
}) {
return _then(_$_JsonRpcError(
code: null == code
code: freezed == code
? _value.code
: code // ignore: cast_nullable_to_non_nullable
as int,
as int?,
message: freezed == message
? _value.message
: message // ignore: cast_nullable_to_non_nullable
Expand All @@ -109,13 +109,13 @@ class __$$_JsonRpcErrorCopyWithImpl<$Res>
@JsonSerializable(includeIfNull: false)
class _$_JsonRpcError implements _JsonRpcError {
const _$_JsonRpcError({required this.code, this.message});
const _$_JsonRpcError({this.code, this.message});

factory _$_JsonRpcError.fromJson(Map<String, dynamic> json) =>
_$$_JsonRpcErrorFromJson(json);

@override
final int code;
final int? code;
@override
final String? message;

Expand Down Expand Up @@ -152,14 +152,14 @@ class _$_JsonRpcError implements _JsonRpcError {
}

abstract class _JsonRpcError implements JsonRpcError {
const factory _JsonRpcError(
{required final int code, final String? message}) = _$_JsonRpcError;
const factory _JsonRpcError({final int? code, final String? message}) =
_$_JsonRpcError;

factory _JsonRpcError.fromJson(Map<String, dynamic> json) =
_$_JsonRpcError.fromJson;

@override
int get code;
int? get code;
@override
String? get message;
@override
Expand Down
Loading

0 comments on commit d7e94bf

Please sign in to comment.