connect method
Implementation
@override
Future connect() async {
if (_closed) {
return;
}
lockCryptoProvider();
DsTimer.timerCancel(initWebsocket);
var headers = {'Content-Type': 'application/json'};
var connUrl = '$_conn?dsId=${Uri.encodeComponent(dsId)}';
if (home != null) {
connUrl += '&home=$home';
}
if (tokenHash != null) {
connUrl = '$connUrl$tokenHash';
}
var connUri = Uri.parse(connUrl);
logger.info(formatLogMessage('Connecting to $_conn'));
try {
var handshakePayload = jsonEncode({
'publicKey': privateKey.publicKey.qBase64,
'isRequester': requester != null,
'isResponder': responder != null,
'formats': formats,
'version': DSA_VERSION,
'enableWebSocketCompression': true,
if (linkData != null) 'linkData': linkData,
});
http.Response response = await http
.post(connUri, headers: headers, body: handshakePayload)
.timeout(Duration(minutes: 1));
if (response.statusCode == 301 || response.statusCode == 302) {
var newUrl = response.headers['location'];
if (newUrl != null) {
response = await http.post(
Uri.parse(newUrl),
headers: headers,
body: handshakePayload,
);
} else {
logger.finest(
formatLogMessage('Handshake Response: ${response.statusCode}'),
);
}
}
if (response.statusCode != 200) {
logger.warning(
'Handshake failed with status code: ${response.statusCode}',
);
return;
}
var serverConfig = jsonDecode(response.body);
logger.finest(formatLogMessage('Handshake Response: $serverConfig'));
salt = serverConfig['salt'];
String? tempKey = serverConfig['tempKey'];
if (tempKey == null) {
_nonce = const DummyECDH();
} else {
_nonce = await privateKey.getSecret(tempKey);
}
enableAck = serverConfig.containsKey('version');
remotePath = serverConfig['path'];
if (serverConfig['wsUri'] is String) {
_wsUpdateUri =
'${connUri.resolve(serverConfig['wsUri'])}?dsId=${Uri.encodeComponent(dsId)}'
.replaceFirst('http', 'ws');
if (home != null) {
_wsUpdateUri = '$_wsUpdateUri&home=$home';
}
}
if (serverConfig['format'] is String) {
format = serverConfig['format'];
}
await initWebsocket(false);
} catch (e, stackTrace) {
logger.warning('Client socket crashed: $e\n$stackTrace');
connDelay();
}
}