refresh method

Future<bool> refresh()

Rotates the refresh token (POST /auth/refresh); false when the session is gone (→ sign in again).

Implementation

Future<bool> refresh() => _refreshing ??= () async {
  try {
    final t = await tokenStore.read(_key);
    final rt = t?.refreshToken;
    if (rt == null) return false;
    try {
      final s = await _api.json(
        CloudOperations.refreshSession,
        CloudSession.fromJson,
        body: {'refreshToken': rt},
        authenticated: false,
      );
      final exp = clock.now().add(Duration(seconds: s.expiresIn));
      await tokenStore.write(
        _key,
        StoredTokens(
          accessToken: s.accessToken,
          refreshToken: s.refreshToken ?? rt,
          expiresAt: exp,
        ),
      );
      _set(
        AccountSession(
          accessToken: s.accessToken,
          expiresAt: exp,
          account: _session?.account,
        ),
      );
      return true;
    } on UnauthorizedException {
      await tokenStore.delete(_key);
      _set(null);
      return false;
    }
  } finally {
    _refreshing = null;
  }
}();