From 7fa08bc4b706ba6042d79b6ccf9b512f12d47c66 Mon Sep 17 00:00:00 2001 From: oppiliappan Date: Fri, 10 Apr 2026 06:24:38 +0100 Subject: [PATCH] appview/oauth: refresh sessions in bsky post updater makes the homepage more "live". Signed-off-by: oppiliappan --- appview/oauth/handler.go | 8 ++++---- appview/state/state.go | 27 +++++++++++++++++++-------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/appview/oauth/handler.go b/appview/oauth/handler.go index a3346128..8601ade9 100644 --- a/appview/oauth/handler.go +++ b/appview/oauth/handler.go @@ -476,7 +476,7 @@ func CreateAppPasswordSession(res *idresolver.Resolver, appPassword, did string, return &session, nil } -func (s *AppPasswordSession) refreshSession() error { +func (s *AppPasswordSession) RefreshSession() error { refreshURL := s.PdsEndpoint + "/xrpc/com.atproto.server.refreshSession" req, err := http.NewRequestWithContext(context.Background(), "POST", refreshURL, nil) if err != nil { @@ -520,14 +520,14 @@ func (s *AppPasswordSession) refreshSession() error { return nil } -func (s *AppPasswordSession) isValid() bool { +func (s *AppPasswordSession) IsValid() bool { return time.Now().Before(s.ExpiresAt) } func (s *AppPasswordSession) putRecord(record any, collection string) error { - if !s.isValid() { + if !s.IsValid() { s.Logger.Debug("access token expired, refreshing session") - if err := s.refreshSession(); err != nil { + if err := s.RefreshSession(); err != nil { return fmt.Errorf("failed to refresh session: %w", err) } s.Logger.Debug("session refreshed") diff --git a/appview/state/state.go b/appview/state/state.go index 1cdd4311..c6983fda 100644 --- a/appview/state/state.go +++ b/appview/state/state.go @@ -705,20 +705,31 @@ func fetchBskyPosts(ctx context.Context, res *idresolver.Resolver, config *confi return } - client := xrpc.Client{ - Auth: &xrpc.AuthInfo{ - AccessJwt: session.AccessJwt, - Did: session.Did, - }, - Host: session.PdsEndpoint, - } - l := log.SubLogger(logger, "bluesky") ticker := time.NewTicker(config.Bluesky.UpdateInterval) defer ticker.Stop() for { + // refresh session if necessary + if !session.IsValid() { + l.Debug("access token expired, refreshing session") + if err := session.RefreshSession(); err != nil { + l.Error("failed to refresh session, stopping bluesky updater", "err", err) + return + } + l.Debug("session refreshed") + } + + // make client + client := xrpc.Client{ + Auth: &xrpc.AuthInfo{ + AccessJwt: session.AccessJwt, + Did: session.Did, + }, + Host: session.PdsEndpoint, + } + posts, _, err := bsky.FetchPosts(ctx, &client, 20, "") if err != nil { l.Error("failed to fetch bluesky posts", "err", err) -- 2.51.2