recoverSession method
Recover session from persisted session json string. Persisted session json has the format { currentSession, expiresAt }
currentSession: session json object, expiresAt: timestamp in seconds
Implementation
Future<GotrueSessionResponse> recoverSession(String jsonStr) async {
try {
final refreshCompleter = Completer<GotrueSessionResponse>();
final persistedData = json.decode(jsonStr) as Map<String, dynamic>;
final currentSession =
persistedData['currentSession'] as Map<String, dynamic>?;
final expiresAt = persistedData['expiresAt'] as int?;
if (currentSession == null) {
return GotrueSessionResponse(
error: GotrueError('Missing currentSession.'),
);
}
if (expiresAt == null) {
return GotrueSessionResponse(error: GotrueError('Missing expiresAt.'));
}
final session = Session.fromJson(currentSession);
if (session.user == null) {
return GotrueSessionResponse(
error: GotrueError('Current session is missing data.'),
);
}
final timeNow = (DateTime.now().millisecondsSinceEpoch / 1000).round();
if (expiresAt < (timeNow - Constants.expiryMargin.inSeconds)) {
if (autoRefreshToken && session.refreshToken != null) {
return _callRefreshToken(
refreshCompleter,
refreshToken: session.refreshToken,
accessToken: session.accessToken,
);
} else {
return GotrueSessionResponse(error: GotrueError('Session expired.'));
}
} else {
_saveSession(session);
_notifyAllSubscribers(AuthChangeEvent.signedIn);
return GotrueSessionResponse(data: session);
}
} catch (e) {
return GotrueSessionResponse(error: GotrueError(e.toString()));
}
}