From e51ef5efcea1509e08c8db04a2f8b11f8c7f1fbe Mon Sep 17 00:00:00 2001 From: Natalie Bridgers Date: Fri, 16 Oct 2026 20:49:30 -0500 Subject: [PATCH] Bound late teleport delivery after relay reconnects --- pkg/atproto/sync.go | 6 +++++- pkg/atproto/teleport_test.go | 13 +++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/pkg/atproto/sync.go b/pkg/atproto/sync.go index cb3474583..ac84541a5 100644 --- a/pkg/atproto/sync.go +++ b/pkg/atproto/sync.go @@ -647,6 +647,10 @@ func (atsync *ATProtoSynchronizer) handleCreateUpdate(ctx context.Context, userD if err != nil { return fmt.Errorf("failed to create teleport: %w", err) } + // Relay reconnects can replay history; only tolerate brief delivery delays. + if startsAt.Before(now.Add(-30 * time.Second)) { + return nil + } teleportMessage := map[string]any{ "$type": rec.RecordTypeID(), "uri": aturi.String(), @@ -660,7 +664,7 @@ func (atsync *ATProtoSynchronizer) handleCreateUpdate(ctx context.Context, userD if rec.Livestream != nil { teleportMessage["livestream"] = rec.Livestream } - // Only backfilled history is suppressed. Relay lag can make live events late. + // Backfills restore pending countdowns; live events may be slightly late. if !isFirstSync || startsAt.After(now) { atsync.Bus.Publish(userDID, teleportMessage) } diff --git a/pkg/atproto/teleport_test.go b/pkg/atproto/teleport_test.go index 98574d688..f4da83961 100644 --- a/pkg/atproto/teleport_test.go +++ b/pkg/atproto/teleport_test.go @@ -102,6 +102,19 @@ func TestTeleportArrivalNotFromBackfill(t *testing.T) { require.NoError(t, err) require.NotNil(t, stored, "the record is still indexed; only the announcement is live-only") + // A relay reconnect also replays history, without the backfill flag. + replayed := time.Now().Add(-5 * time.Minute).UTC().Format(time.RFC3339) + index("3lteleportreplay0", replayed, false) + select { + case <-sourceCh: + t.Fatal("an old relay event must not redirect current viewers") + case <-time.After(250 * time.Millisecond): + } + require.Equal(t, 0, countArrivals(), "an old relay event must not announce an arrival") + stored, err = mod.GetTeleportByURI("at://" + traveller + "/place.stream.live.teleport/3lteleportreplay0") + require.NoError(t, err) + require.NotNil(t, stored, "replayed history is still indexed") + // A late live event must still redirect source viewers and announce its arrival. late := time.Now().Add(-15 * time.Second).UTC().Format(time.RFC3339) index("3lteleportnew0", late, false) -- knotmirror 0.0.1