recoverSession method

Future<GotrueSessionResponse> recoverSession(
  1. String jsonStr
)

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()));
  }
}