@playlive/realtime-pipeline
    Preparing search index...

    Interface TiltifyTickMessageData

    interface TiltifyTickMessageData {
        auctionHouses: AuctionHouse[] | undefined;
        authoritative?: TiltifyAuthoritativeSlice[];
        campaigns: TiltifyCampaign[] | undefined;
        causes: TiltifyCause[] | undefined;
        donationTrains: Record<string, DonationTrain[]>;
        donorSpotlights: Record<string, ComputedSpotlight>;
        donorSpotlightSettings: Record<string, DonorSpotlightSettings>;
        fundraisingEvents: TiltifyFundraisingEvent[] | undefined;
        fundraisingEventSupportingCampaigns:
            | Record<string, TiltifyCampaign[]>
            | undefined;
        leaderboards: Record<string, TiltifyLeaderboardEntry[]> | undefined;
        milestones: Record<string, TiltifyMilestone[]> | undefined;
        polls: Record<string, TiltifyPoll[]> | undefined;
        rewards: Record<string, TiltifyReward[]> | undefined;
        scheduleTransition?: ScheduleTransitionPayload;
        subathonTimers: Record<string, SubathonTimer[]>;
        targets: Record<string, TiltifyTarget[]> | undefined;
        teamCampaigns: TiltifyTeamCampaign[] | undefined;
    }
    Index
    auctionHouses: AuctionHouse[] | undefined
    authoritative?: TiltifyAuthoritativeSlice[]

    Slice keys in this tick whose per-campaign arrays are the complete current list for every campaign key they contain.

    Consumers replace those slots wholesale instead of merging by row id, so a row deleted upstream actually disappears from the overlay. Slices not named here (and every tick from a server that predates this field) keep the legacy additive merge.

    Tick slices were historically merged by row id, because the pipeline's producers caught upstream errors and returned [] — indistinguishable from "this campaign really has no rewards". A wholesale replace would therefore have blanked overlays on any transient Tiltify blip. The cost was that deletion had no wire representation at all: overlays kept rendering rewards, milestones and targets that had been removed upstream until they reloaded.

    The producers now omit a campaign key entirely when its fetch failed (see fetchCampaignSlice in packages/api/websocket/src/tiltify/slice-fetch-result.ts in playlive-unified-data-pipeline), so "absent" means "unknown" and "present" means "complete" — which is exactly the guarantee wholesale replacement needs.

    A slice whose rows exceed the API Gateway 128 KB frame limit is split across several ticks. Only the first chunk is marked authoritative; the rest merge on top of it. That makes the frames order-dependent, which is safe over a single WebSocket connection (the producer awaits each send in turn). If frames ever did land out of order the overlay would show a short slice until the next tick corrected it — degraded, then self-healing, never corrupt.

    Older clients ignore this field and keep merging — safe to roll out ahead of, or behind, the pipeline-side emitter.

    campaigns: TiltifyCampaign[] | undefined
    causes: TiltifyCause[] | undefined
    donationTrains: Record<string, DonationTrain[]>
    donorSpotlights: Record<string, ComputedSpotlight>
    donorSpotlightSettings: Record<string, DonorSpotlightSettings>
    fundraisingEvents: TiltifyFundraisingEvent[] | undefined
    fundraisingEventSupportingCampaigns:
        | Record<string, TiltifyCampaign[]>
        | undefined
    leaderboards: Record<string, TiltifyLeaderboardEntry[]> | undefined
    milestones: Record<string, TiltifyMilestone[]> | undefined
    polls: Record<string, TiltifyPoll[]> | undefined
    rewards: Record<string, TiltifyReward[]> | undefined
    scheduleTransition?: ScheduleTransitionPayload

    Server-emitted schedule-block boundary crossing for a single (connection, campaign) pair. Present ONLY when the pipeline observed the campaign's current block change since the last tick — steady-state ticks omit this field.

    Emitted by the pipeline-side tick loop (packages/api/websocket/src/shared/schedule-transitions.ts in playlive-unified-data-pipeline) with a tickType of "schedule-transition". Overlays that want to react (invalidate a REST cache, cross-fade a segment banner, etc.) should read store.lastScheduleTransitions[campaignID] or subscribe via useOnScheduleTransition from @playlive/react-pipeline.

    subathonTimers: Record<string, SubathonTimer[]>
    targets: Record<string, TiltifyTarget[]> | undefined
    teamCampaigns: TiltifyTeamCampaign[] | undefined