import { EventEmitter } from 'events';
import { AxiosError } from 'axios';

interface KeepaliveMessageMetadata extends EventSubMessageMetadata {
    message_type: 'session_keepalive';
}
type KeepaliveMessagePayload = {};
type KeepaliveMessage = EventSubMessage<KeepaliveMessageMetadata, KeepaliveMessagePayload>;

interface AutomodMessageHoldEventV1 {
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    user_id: string;
    user_login: string;
    user_name: string;
    message_id: string;
    message: [
        {
            text: string;
            fragments: [
                {
                    text: string;
                    emote: {
                        id: string;
                        emote_set_id: string;
                    } | null;
                    cheermote: {
                        prefix: string;
                        bits: number;
                        tier: number;
                    } | null;
                }
            ];
        }
    ];
    category: string;
    level: number;
    held_at: string;
}
interface AutomodMessageHoldEventV2 {
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    user_id: string;
    user_login: string;
    user_name: string;
    message_id: string;
    message: [
        {
            text: string;
            fragments: [
                {
                    type: 'text' | 'emote' | 'cheermote';
                    text: string;
                    emote: {
                        id: string;
                        emote_set_id: string;
                    } | null;
                    cheermote: {
                        prefix: string;
                        bits: number;
                        tier: number;
                    } | null;
                }
            ];
        }
    ];
    held_at: string;
    reason: 'automod' | 'blocked_term';
    automod: {
        category: string;
        level: number;
        boundaries: [
            {
                start_pos: number;
                end_pos: number;
            }
        ];
        blocked_term: {
            terms_found: [
                {
                    term_id: string;
                    boundary: {
                        start_pos: number;
                        end_pos: number;
                    };
                    owner_broadcaster_user_id: string;
                    owner_broadcaster_user_login: string;
                    owner_broadcaster_user_name: string;
                }
            ];
        } | null;
    } | null;
}
interface AutomodMessageUpdateEventV1 {
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    user_id: string;
    user_login: string;
    user_name: string;
    moderator_user_id: string;
    moderator_user_login: string;
    moderator_user_name: string;
    message_id: string;
    message: [
        {
            text: string;
            fragments: [
                {
                    text: string;
                    emote: {
                        id: string;
                        emote_set_id: string;
                    } | null;
                    cheermote: {
                        prefix: string;
                        bits: number;
                        tier: number;
                    } | null;
                }
            ];
        }
    ];
    category: string;
    level: number;
    status: 'Approved' | 'Denied' | 'Expired';
    held_at: string;
}
interface AutomodMessageUpdateEventV2 {
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    user_id: string;
    user_login: string;
    user_name: string;
    moderator_user_id: string;
    moderator_user_login: string;
    moderator_user_name: string;
    message_id: string;
    message: [
        {
            text: string;
            fragments: [
                {
                    type: 'text' | 'emote' | 'cheermote';
                    text: string;
                    emote: {
                        id: string;
                        emote_set_id: string;
                    } | null;
                    cheermote: {
                        prefix: string;
                        bits: number;
                        tier: number;
                    } | null;
                }
            ];
        }
    ];
    status: 'Approved' | 'Denied' | 'Expired';
    held_at: string;
    reason: 'automod' | 'blocked_term';
    automod: {
        category: string;
        level: number;
        boundaries: [
            {
                start_pos: number;
                end_pos: number;
            }
        ];
        blocked_term: {
            terms_found: [
                {
                    term_id: string;
                    boundary: {
                        start_pos: number;
                        end_pos: number;
                    };
                    owner_broadcaster_user_id: string;
                    owner_broadcaster_user_login: string;
                    owner_broadcaster_user_name: string;
                }
            ];
        } | null;
    } | null;
}
interface AutomodSettingsUpdateEvent {
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    moderator_user_id: string;
    moderator_user_login: string;
    moderator_user_name: string;
    bullying: number;
    overall_level: number | null;
    disability: number;
    race_ethnicity_or_religion: number;
    misogyny: number;
    sexuality_sex_or_gender: number;
    aggression: number;
    sex_based_terms: number;
    swearing: number;
}
interface AutomodTermsUpdateEvent {
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    moderator_user_id: string;
    moderator_user_login: string;
    moderator_user_name: string;
    action: 'add_permitted' | 'remove_permitted' | 'add_blocked' | 'remove_blocked';
    from_automod: boolean;
    terms: string[];
}
interface ChannelAdBreakBeginEvent {
    duration_seconds: number;
    started_at: string;
    is_automatic: boolean;
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    requester_user_id: string;
    requester_user_login: string;
    requester_user_name: string;
}
interface ChannelBanEvent {
    user_id: string;
    user_login: string;
    user_name: string;
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    moderator_user_id: string;
    moderator_user_login: string;
    moderator_user_name: string;
    reason: string;
    banned_at: string;
    ends_at: string | null;
    is_permanent: boolean;
}
interface ChannelBitsUseEvent {
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    user_id: string;
    user_login: string;
    user_name: string;
    bits: number;
    type: 'cheer' | 'power_up';
    message: [
        {
            text: string;
            type: 'text' | 'cheermote' | 'emote';
            fragments: [
                {
                    text: string;
                    emote: {
                        id: string;
                        emote_set_id: string;
                        owner_id: string;
                        format: string[];
                    } | null;
                    cheermote: {
                        prefix: string;
                        bits: number;
                        tier: number;
                    } | null;
                }
            ];
        }
    ] | null;
    power_up: {
        type: 'message_effect' | 'celebration' | 'gigantify_an_emote';
        emote: {
            id: string;
            name: string;
        };
        message_effect_id: string;
    };
}
interface ChannelChatClearEvent {
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcast_user_login: string;
}
interface ChannelChatClearUserMessagesEvent {
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcast_user_login: string;
    target_user_id: string;
    target_user_login: string;
    target_user_name: string;
}
interface ChannelChatMessageEvent {
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcast_user_login: string;
    chatter_user_id: string;
    chatter_user_name: string;
    chatter_user_login: string;
    message_id: string;
    message: {
        text: string;
        fragments: [
            {
                type: 'text' | 'cheermote' | 'emote' | 'mention';
                text: string;
                cheermote: {
                    prefix: string;
                    bits: number;
                    tier: number;
                } | null;
                emote: {
                    id: string;
                    emote_set_id: string;
                    owner_id: string;
                    format: string[];
                } | null;
                mention: {
                    user_id: string;
                    user_name: string;
                    user_login: string;
                } | null;
            }
        ];
    };
    message_type: 'text' | 'channel_points_highlighted' | 'channel_points_sub_only' | 'user_intro' | 'power_ups_message_effect' | 'power_ups_gigantified_emote';
    badges: [
        {
            set_id: string;
            id: string;
            info: string;
            cheer: {
                bits: number;
            } | null;
        }
    ];
    color: string;
    reply: {
        parent_message_id: string;
        parent_message_body: string;
        parent_user_id: string;
        parent_user_name: string;
        parent_user_login: string;
        thread_message_id: string;
        thread_user_id: string;
        thread_user_name: string;
        thread_user_login: string;
    } | null;
    channel_points_custom_reward_id: string | null;
    source_broadcaster_user_id: string | null;
    source_broadcaster_user_login: string | null;
    source_broadcaster_user_name: string | null;
    source_message_id: string | null;
    source_badges: [
        {
            set_id: string;
            id: string;
            info: string;
        }
    ] | null;
}
interface ChannelChatMessageDeleteEvent {
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcaster_user_login: string;
    target_user_id: string;
    target_user_name: string;
    target_user_login: string;
    message_id: string;
}
interface ChannelChatNotificationEvent {
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcaster_user_login: string;
    chatter_user_id: string | null;
    chatter_user_name: string | null;
    chatter_user_login: string | null;
    chatter_is_anonymous: boolean;
    color: string;
    badges: [
        {
            set_id: string;
            id: string;
            info: string;
        }
    ];
    system_message: string;
    message_id: string;
    message: {
        text: string;
        fragments: [
            {
                type: 'text' | 'cheermote' | 'emote' | 'mention';
                text: string;
                cheermote: {
                    prefix: string;
                    bits: number;
                    tier: number;
                } | null;
                emote: {
                    id: string;
                    emote_set_id: string;
                    owner_id: string;
                    format: string[];
                } | null;
                mention: {
                    user_id: string;
                    user_name: string;
                    user_login: string;
                } | null;
            }
        ];
    };
    notice_type: 'sub' | 'resub' | 'sub_gift' | 'community_sub_gift' | 'gift_paid_upgrade' | 'prime_paid_upgrade' | 'raid' | 'unraid' | 'pay_it_forward' | 'announcement' | 'bits_badge_tier' | 'charity_donation' | 'shared_chat_sub' | 'shared_chat_resub' | 'shared_chat_sub_gift' | 'shared_chat_community_sub_gift' | 'shared_chat_gift_paid_upgrade' | 'shared_chat_prime_paid_upgrade' | 'shared_chat_raid' | 'shared_chat_pay_it_forward' | 'shared_chat_announcement';
    sub: {
        sub_tier: number;
        is_prime: boolean;
        duration_months: number;
    } | null;
    resub: {
        cumulative_months: number;
        duration_months: number;
        streak_months: number;
        sub_tier: number;
        is_prime: boolean;
        is_gift: boolean;
        gifter_is_anonymous: boolean;
        gifter_user_id: string | null;
        gifter_user_name: string | null;
        gifter_user_login: string | null;
    } | null;
    sub_gift: {
        duration_months: number;
        cumulative_total: number | null;
        recipient_user_id: string;
        recipient_user_name: string;
        recipient_user_login: string;
        sub_tier: number;
        community_gift_id: string | null;
    } | null;
    community_sub_gift: {
        id: string;
        total: number;
        sub_tier: number;
        cumulative_total: number | null;
    } | null;
    gift_paid_upgrade: {
        gifter_is_anonymous: boolean;
        gifter_user_id: string | null;
        gifter_user_name: string | null;
        gifter_user_login: string | null;
    } | null;
    prime_paid_upgrade: {
        sub_tier: number;
    } | null;
    pay_it_forward: {
        gifter_is_anonymous: boolean;
        gifter_user_id: string | null;
        gifter_user_name: string | null;
        gifter_user_login: string | null;
    };
    raid: {
        user_id: string;
        user_name: string;
        user_login: string;
        viewer_count: number;
        profile_image_url: string;
    } | null;
    unraid: null;
    announcement: {
        color: string;
    } | null;
    bits_badge_tier: {
        tier: number;
    } | null;
    charity_donation: {
        charity_name: string;
        amount: {
            value: number;
            decimal_place: number;
            currency: string;
        };
    } | null;
    source_broadcaster_user_id: string | null;
    source_broadcaster_user_name: string | null;
    source_broadcaster_user_login: string | null;
    source_message_id: string | null;
    source_badges: [
        {
            set_id: string;
            id: string;
            info: string;
        }
    ] | null;
    shared_chat_sub: {
        sub_tier: number;
        is_prime: boolean;
        duration_months: number;
    } | null;
    shared_chat_resub: {
        cumulative_months: number;
        duration_months: number;
        streak_months: number;
        sub_tier: number;
        is_prime: boolean;
        is_gift: boolean;
        gifter_is_anonymous: boolean;
        gifter_user_id: string;
        gifter_user_name: string;
        gifter_user_login: string;
    } | null;
    shared_chat_sub_gift: {
        duration_months: number;
        cumulative_total: number | null;
        recipient_user_id: string;
        recipient_user_name: string;
        recipient_user_login: string;
        sub_tier: number;
        community_gift_id: string | null;
    } | null;
    shared_chat_community_sub_gift: {
        id: string;
        total: number;
        sub_tier: number;
        cumulative_total: number | null;
    } | null;
    shared_chat_gift_paid_upgrade: {
        gifter_is_anonymous: boolean;
        gifter_user_id: string | null;
        gifter_user_name: string | null;
        gifter_user_login: string | null;
    } | null;
    shared_chat_prime_paid_upgrade: {
        sub_tier: number;
    } | null;
    shared_chat_pay_it_forward: {
        gifter_is_anonymous: boolean;
        gifter_user_id: string | null;
        gifter_user_name: string | null;
        gifter_user_login: string | null;
    } | null;
    shared_chat_raid: {
        user_id: string;
        user_name: string;
        user_login: string;
        viewer_count: number;
        profile_image_url: string;
    } | null;
    shared_chat_announcement: {
        color: string;
    } | null;
}
interface ChannelChatSettingsUpdateEvent {
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    emote_mode: boolean;
    follower_mode: boolean;
    follower_mode_duration_minutes: number;
    slow_mode: boolean;
    slow_mode_wait_time_seconds: number;
    subscriber_mode: boolean;
    unique_chat_mode: boolean;
}
interface ChannelChatUserMessageHoldEvent {
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    user_id: string;
    user_login: string;
    user_name: string;
    message_id: string;
    message: [
        {
            text: string;
            fragments: [
                {
                    text: string;
                    emote: {
                        id: string;
                        emote_set_id: string;
                    } | null;
                    cheermote: {
                        prefix: string;
                        bits: number;
                        tier: number;
                    } | null;
                }
            ];
        }
    ];
}
interface ChannelChatUserMessageUpdateEvent {
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    user_id: string;
    user_login: string;
    user_name: string;
    status: 'approved' | 'denied' | 'invalid';
    message_id: string;
    message: [
        {
            text: string;
            fragments: [
                {
                    text: string;
                    emote: {
                        id: string;
                        emote_set_id: string;
                    } | null;
                    cheermote: {
                        prefix: string;
                        bits: number;
                        tier: number;
                    } | null;
                }
            ];
        }
    ];
}
interface ChannelSubscribeEvent {
    user_id: string;
    user_login: string;
    user_name: string;
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    tier: string;
    is_gift: boolean;
}
interface ChannelCheerEvent {
    is_anonymous: boolean;
    user_id: string | null;
    user_login: string | null;
    user_name: string | null;
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    message: string;
    bits: number;
}
interface ChannelUpdateEvent {
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    title: string;
    language: string;
    category_id: string;
    category_name: string;
    content_classification_labels: string[];
}
interface ChannelUnbanEvent {
    user_id: string;
    user_login: string;
    user_name: string;
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    moderator_user_id: string;
    moderator_user_login: string;
    moderator_user_name: string;
}
interface ChannelUnbanRequestCreateEvent {
    id: string;
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    user_id: string;
    user_login: string;
    user_name: string;
    text: string;
    created_at: string;
}
interface ChannelUnbanRequestResolveEvent {
    id: string;
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    moderator_user_id: string;
    moderator_user_login: string;
    moderator_user_name: string;
    user_id: string;
    user_login: string;
    user_name: string;
    resolution_text: string;
    status: 'approved' | 'canceled' | 'denied';
}
interface ChannelFollowEvent {
    user_id: string;
    user_login: string;
    user_name: string;
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    followed_at: string;
}
interface ChannelRaidEvent {
    from_broadcaster_user_id: string;
    from_broadcaster_user_login: string;
    from_broadcaster_user_name: string;
    to_broadcaster_user_id: string;
    to_broadcaster_user_login: string;
    to_broadcaster_user_name: string;
    viewers: number;
}
interface ChannelModerateEventV1 {
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    source_broadcaster_user_id: string;
    source_broadcaster_user_login: string;
    source_broadcaster_user_name: string;
    moderator_user_id: string;
    moderator_user_login: string;
    moderator_user_name: string;
    action: 'ban' | 'timeout' | 'unban' | 'untimeout' | 'clear' | 'emoteonly' | 'emoteonlyoff' | 'followers' | 'followersoff' | 'uniquechat' | 'uniquechatoff' | 'slow' | 'slowoff' | 'subscribers' | 'subscribersoff' | 'unraid' | 'delete' | 'unvip' | 'vip' | 'raid' | 'add_blocked_term' | 'add_permitted_term' | 'remove_blocked_term' | 'remove_permitted_term' | 'mod' | 'unmod' | 'approve_unban_request' | 'deny_unban_request' | 'shared_chat_ban' | 'shared_chat_timeout' | 'shared_chat_untimeout' | 'shared_chat_unban' | 'shared_chat_delete';
    followers: {
        follow_duration_minutes: number;
    } | null;
    slow: {
        wait_time_seconds: number;
    } | null;
    vip: {
        user_id: string;
        user_login: string;
        user_name: string;
    } | null;
    unvip: {
        user_id: string;
        user_login: string;
        user_name: string;
    } | null;
    mod: {
        user_id: string;
        user_login: string;
        user_name: string;
    } | null;
    unmod: {
        user_id: string;
        user_login: string;
        user_name: string;
    } | null;
    ban: {
        user_id: string;
        user_login: string;
        user_name: string;
    } | null;
    unban: {
        user_id: string;
        user_login: string;
        user_name: string;
    } | null;
    timeout: {
        user_id: string;
        user_login: string;
        user_name: string;
        reason: string;
        expires_at: string;
    } | null;
    untimeout: {
        user_id: string;
        user_login: string;
        user_name: string;
    } | null;
    raid: {
        user_id: string;
        user_login: string;
        user_name: string;
        viewer_count: number;
    } | null;
    unraid: {
        user_id: string;
        user_login: string;
        user_name: string;
    } | null;
    delete: {
        user_id: string;
        user_login: string;
        user_name: string;
        message_id: string;
        message_body: string;
    } | null;
    automod_terms: {
        action: 'add' | 'remove';
        list: 'blocked' | 'permitted';
        terms: string[];
        from_automod: boolean;
    } | null;
    unban_request: {
        is_approved: boolean;
        user_id: string;
        user_login: string;
        user_name: string;
        moderator_message: string;
    } | null;
    shared_chat_ban: {
        user_id: string;
        user_login: string;
        user_name: string;
    } | null;
    shared_chat_unban: {
        user_id: string;
        user_login: string;
        user_name: string;
    } | null;
    shared_chat_timeout: {
        user_id: string;
        user_login: string;
        user_name: string;
        reason: string;
        expires_at: string;
    } | null;
    shared_chat_untimeout: {
        user_id: string;
        user_login: string;
        user_name: string;
    } | null;
    shared_chat_delete: {
        user_id: string;
        user_login: string;
        user_name: string;
        message_id: string;
        message_body: string;
    } | null;
}
interface ChannelModerateEventV2 {
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    source_broadcaster_user_id: string;
    source_broadcaster_user_login: string;
    source_broadcaster_user_name: string;
    moderator_user_id: string;
    moderator_user_login: string;
    moderator_user_name: string;
    action: 'ban' | 'timeout' | 'unban' | 'untimeout' | 'clear' | 'emoteonly' | 'emoteonlyoff' | 'followers' | 'followersoff' | 'uniquechat' | 'uniquechatoff' | 'slow' | 'slowoff' | 'subscribers' | 'subscribersoff' | 'unraid' | 'delete' | 'unvip' | 'vip' | 'raid' | 'add_blocked_term' | 'add_permitted_term' | 'remove_blocked_term' | 'remove_permitted_term' | 'mod' | 'unmod' | 'approve_unban_request' | 'deny_unban_request' | 'warn' | 'shared_chat_ban' | 'shared_chat_timeout' | 'shared_chat_untimeout' | 'shared_chat_unban' | 'shared_chat_delete';
    followers: {
        follow_duration_minutes: number;
    } | null;
    slow: {
        wait_time_seconds: number;
    } | null;
    vip: {
        user_id: string;
        user_login: string;
        user_name: string;
    } | null;
    unvip: {
        user_id: string;
        user_login: string;
        user_name: string;
    } | null;
    mod: {
        user_id: string;
        user_login: string;
        user_name: string;
    } | null;
    unmod: {
        user_id: string;
        user_login: string;
        user_name: string;
    } | null;
    ban: {
        user_id: string;
        user_login: string;
        user_name: string;
    } | null;
    unban: {
        user_id: string;
        user_login: string;
        user_name: string;
    } | null;
    timeout: {
        user_id: string;
        user_login: string;
        user_name: string;
        reason: string;
        expires_at: string;
    } | null;
    untimeout: {
        user_id: string;
        user_login: string;
        user_name: string;
    } | null;
    raid: {
        user_id: string;
        user_login: string;
        user_name: string;
        viewer_count: number;
    } | null;
    unraid: {
        user_id: string;
        user_login: string;
        user_name: string;
    } | null;
    delete: {
        user_id: string;
        user_login: string;
        user_name: string;
        message_id: string;
        message_body: string;
    } | null;
    automod_terms: {
        action: 'add' | 'remove';
        list: 'blocked' | 'permitted';
        terms: string[];
        from_automod: boolean;
    } | null;
    unban_request: {
        is_approved: boolean;
        user_id: string;
        user_login: string;
        user_name: string;
        moderator_message: string;
    } | null;
    warn: {
        user_id: string;
        user_login: string;
        user_name: string;
        reason: string | null;
        chat_rules_cited: string[] | null;
    } | null;
    shared_chat_ban: {
        user_id: string;
        user_login: string;
        user_name: string;
    } | null;
    shared_chat_unban: {
        user_id: string;
        user_login: string;
        user_name: string;
    } | null;
    shared_chat_timeout: {
        user_id: string;
        user_login: string;
        user_name: string;
        reason: string;
        expires_at: string;
    } | null;
    shared_chat_untimeout: {
        user_id: string;
        user_login: string;
        user_name: string;
    } | null;
    shared_chat_delete: {
        user_id: string;
        user_login: string;
        user_name: string;
        message_id: string;
        message_body: string;
    } | null;
}
interface ChannelModeratorAddEvent {
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    user_id: string;
    user_login: string;
    user_name: string;
}
interface ChannelModeratorRemoveEvent {
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    user_id: string;
    user_login: string;
    user_name: string;
}
interface ChannelGuestStarSessionBeginEvent {
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    session_id: string;
    started_at: string;
}
interface ChannelGuestStarSessionEndEvent {
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcaster_user_login: string;
    session_id: string;
    started_at: string;
    ended_at: string;
    host_user_id: string;
    host_user_name: string;
    host_user_login: string;
}
interface ChannelGuestStarGuestUpdateEvent {
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcaster_user_login: string;
    session_id: string;
    moderator_user_id: string | null;
    moderator_user_name: string | null;
    moderator_user_login: string | null;
    guest_user_id: string | null;
    guest_user_name: string | null;
    guest_user_login: string | null;
    slot_id: string | null;
    state: 'invited' | 'accepted' | 'ready' | 'backstage' | 'live' | 'removed';
    host_user_id: string;
    host_user_name: string;
    host_user_login: string;
    host_video_enabled: boolean | null;
    host_audio_enabled: boolean | null;
    host_volume: number | null;
}
interface ChannelGuestStarSettingsUpdateEvent {
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcaster_user_login: string;
    is_moderator_send_live_enabled: boolean;
    slot_count: number;
    is_browser_source_audio_enabled: boolean;
    group_layout: 'tiled' | 'screenshare' | 'horizontal_top' | 'horizontal_bottom' | 'vertical_left' | 'vertical_right';
}
interface ChannelPollBeginEvent {
    id: string;
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcaster_user_login: string;
    title: string;
    choices: [
        {
            id: string;
            title: string;
            bits_votes: number;
            channel_points_votes: number;
            votes: number;
        }
    ];
    bits_voting: {
        is_enabled: boolean;
        amount_per_vote: number;
    };
    channel_points_voting: {
        is_enabled: boolean;
        amount_per_vote: number;
    };
    started_at: string;
    ends_at: string;
}
interface ChannelPollProgressEvent {
    id: string;
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcaster_user_login: string;
    title: string;
    choices: [
        {
            id: string;
            title: string;
            bits_votes: number;
            channel_points_votes: number;
            votes: number;
        }
    ];
    bits_voting: {
        is_enabled: boolean;
        amount_per_vote: number;
    };
    channel_points_voting: {
        is_enabled: boolean;
        amount_per_vote: number;
    };
    started_at: string;
    ends_at: string;
}
interface ChannelPollEndEvent {
    id: string;
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcaster_user_login: string;
    title: string;
    choices: [
        {
            id: string;
            title: string;
            bits_votes: number;
            channel_points_votes: number;
            votes: number;
        }
    ];
    bits_voting: {
        is_enabled: boolean;
        amount_per_vote: number;
    };
    channel_points_voting: {
        is_enabled: boolean;
        amount_per_vote: number;
    };
    status: 'completed' | 'archived' | 'terminated';
    started_at: string;
    ended_at: string;
}
interface ChannelPointsAutomaticRewardRedemptionAddEventV1 {
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcaster_user_login: string;
    user_id: string;
    user_login: string;
    user_name: string;
    id: string;
    reward: {
        type: 'single_message_bypass_sub_mode' | 'send_highlighted_message' | 'random_sub_emote_unlock' | 'chosen_sub_emote_unlock' | 'chosen_modified_sub_emote_unlock' | 'message_effect' | 'gigantify_an_emote' | 'celebration';
        cost: number;
        unlocked_emote: {
            id: string;
            name: string;
        } | null;
    };
    message: {
        text: string;
        emotes: [
            {
                id: string;
                begin: number;
                end: number;
            }
        ];
    };
    user_input: string | null;
    redeemed_at: string;
}
interface ChannelPointsAutomaticRewardRedemptionAddEventV2 {
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcaster_user_login: string;
    user_id: string;
    user_login: string;
    user_name: string;
    id: string;
    reward: {
        type: 'single_message_bypass_sub_mode' | 'send_highlighted_message' | 'random_sub_emote_unlock' | 'chosen_sub_emote_unlock' | 'chosen_modified_sub_emote_unlock';
        channel_points: number;
        emote: {
            id: string;
            name: string;
        } | null;
    };
    message: {
        text: string;
        type: 'text' | 'emote';
        emotes: [
            {
                id: string;
            }
        ] | null;
    } | null;
    redeemed_at: string;
}
interface ChannelPointsCustomRewardAddEvent {
    id: string;
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcaster_user_login: string;
    is_enabled: boolean;
    is_paused: boolean;
    is_in_stock: boolean;
    title: string;
    cost: number;
    prompt: string;
    is_user_input_required: boolean;
    should_redemptions_skip_request_queue: boolean;
    max_per_stream: {
        is_enabled: boolean;
        value: number;
    };
    max_per_user_per_stream: {
        is_enabled: boolean;
        value: number;
    };
    background_color: string;
    image: {
        url_1x: string;
        url_2x: string;
        url_4x: string;
    } | null;
    default_image: {
        url_1x: string;
        url_2x: string;
        url_4x: string;
    };
    global_cooldown: {
        is_enabled: boolean;
        seconds: number;
    };
    cooldown_expires_at: string | null;
    redemptions_redeemed_current_stream: number | null;
}
interface ChannelPointsCustomRewardUpdateEvent {
    id: string;
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcaster_user_login: string;
    is_enabled: boolean;
    is_paused: boolean;
    is_in_stock: boolean;
    title: string;
    cost: number;
    prompt: string;
    is_user_input_required: boolean;
    should_redemptions_skip_request_queue: boolean;
    max_per_stream: {
        is_enabled: boolean;
        value: number;
    };
    max_per_user_per_stream: {
        is_enabled: boolean;
        value: number;
    };
    background_color: string;
    image: {
        url_1x: string;
        url_2x: string;
        url_4x: string;
    } | null;
    default_image: {
        url_1x: string;
        url_2x: string;
        url_4x: string;
    };
    global_cooldown: {
        is_enabled: boolean;
        seconds: number;
    };
    cooldown_expires_at: string | null;
    redemptions_redeemed_current_stream: number | null;
}
interface ChannelPointsCustomRewardRemoveEvent {
    id: string;
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcaster_user_login: string;
    is_enabled: boolean;
    is_paused: boolean;
    is_in_stock: boolean;
    title: string;
    cost: number;
    prompt: string;
    is_user_input_required: boolean;
    should_redemptions_skip_request_queue: boolean;
    max_per_stream: {
        is_enabled: boolean;
        value: number;
    };
    max_per_user_per_stream: {
        is_enabled: boolean;
        value: number;
    };
    background_color: string;
    image: {
        url_1x: string;
        url_2x: string;
        url_4x: string;
    } | null;
    default_image: {
        url_1x: string;
        url_2x: string;
        url_4x: string;
    };
    global_cooldown: {
        is_enabled: boolean;
        seconds: number;
    };
    cooldown_expires_at: string | null;
    redemptions_redeemed_current_stream: number | null;
}
interface ChannelPointsCustomRewardRedemptionAddEvent {
    id: string;
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcaster_user_login: string;
    user_id: string;
    user_login: string;
    user_name: string;
    user_input: string | null;
    status: 'unknown' | 'unfulfilled' | 'fulfilled' | 'canceled';
    reward: {
        id: string;
        title: string;
        cost: number;
        prompt: string;
    };
    redeemed_at: string;
}
interface ChannelPointsCustomRewardRedemptionUpdateEvent {
    id: string;
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcaster_user_login: string;
    user_id: string;
    user_login: string;
    user_name: string;
    user_input: string | null;
    status: 'unknown' | 'unfulfilled' | 'fulfilled' | 'canceled';
    reward: {
        id: string;
        title: string;
        cost: number;
        prompt: string;
    };
    redeemed_at: string;
}
interface ChannelPredictionBeginEvent {
    id: string;
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcaster_user_login: string;
    title: string;
    outcomes: [
        {
            id: string;
            title: string;
            color: 'pink' | 'blue';
            users: number;
            channel_points: number;
            top_predictors: [
                {
                    user_id: string;
                    user_login: string;
                    user_name: string;
                    channel_points_won: number | null;
                    channel_points_used: number;
                }
            ];
        }
    ];
    started_at: string;
    locks_at: string;
}
interface ChannelPredictionProgressEvent {
    id: string;
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcaster_user_login: string;
    title: string;
    outcomes: [
        {
            id: string;
            title: string;
            color: 'pink' | 'blue';
            users: number;
            channel_points: number;
            top_predictors: [
                {
                    user_id: string;
                    user_login: string;
                    user_name: string;
                    channel_points_won: number | null;
                    channel_points_used: number;
                }
            ];
        }
    ];
    started_at: string;
    locks_at: string;
}
interface ChannelPredictionLockEvent {
    id: string;
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcaster_user_login: string;
    title: string;
    outcomes: [
        {
            id: string;
            title: string;
            color: 'pink' | 'blue';
            users: number;
            channel_points: number;
            top_predictors: [
                {
                    user_id: string;
                    user_login: string;
                    user_name: string;
                    channel_points_won: number | null;
                    channel_points_used: number;
                }
            ];
        }
    ];
    started_at: string;
    locked_at: string;
}
interface ChannelPredictionEndEvent {
    id: string;
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcaster_user_login: string;
    title: string;
    winning_outcome_id: string;
    outcomes: [
        {
            id: string;
            title: string;
            color: 'pink' | 'blue';
            users: number;
            channel_points: number;
            top_predictors: [
                {
                    user_id: string;
                    user_login: string;
                    user_name: string;
                    channel_points_won: number | null;
                    channel_points_used: number;
                }
            ];
        }
    ];
    started_at: string;
    locked_at: string;
}
interface ChannelSharedChatSessionBeginEvent {
    session_id: string;
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcaster_user_login: string;
    host_broadcaster_user_id: string;
    host_broadcaster_user_name: string;
    host_broadcaster_user_login: string;
    participants: [
        {
            broadcaster_user_id: string;
            broadcaster_user_name: string;
            broadcaster_user_login: string;
        }
    ];
}
interface ChannelSharedChatSessionUpdateEvent {
    session_id: string;
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcaster_user_login: string;
    host_broadcaster_user_id: string;
    host_broadcaster_user_name: string;
    host_broadcaster_user_login: string;
    participants: [
        {
            broadcaster_user_id: string;
            broadcaster_user_name: string;
            broadcaster_user_login: string;
        }
    ];
}
interface ChannelSharedChatSessionEndEvent {
    session_id: string;
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcaster_user_login: string;
    host_broadcaster_user_id: string;
    host_broadcaster_user_name: string;
    host_broadcaster_user_login: string;
}
interface ChannelSubscriptionEndEvent {
    user_id: string;
    user_login: string;
    user_name: string;
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    tier: string;
    is_gift: boolean;
}
interface ChannelSubscriptionGiftEvent {
    user_id: string;
    user_login: string;
    user_name: string;
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    total: number;
    tier: string;
    cumulative_total: number | null;
    is_anonymous: boolean;
}
interface ChannelSubscriptionMessageEvent {
    user_id: string;
    user_login: string;
    user_name: string;
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    tier: string;
    message: {
        text: string;
        emotes: [
            {
                begin: number;
                end: number;
                id: string;
            }
        ] | null;
    };
    cumulative_total: number;
    streak_months: number | null;
    duration_months: number;
}
interface ChannelSuspiciousUserUpdateEvent {
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcaster_user_login: string;
    moderator_user_id: string;
    moderator_user_name: string;
    moderator_user_login: string;
    user_id: string;
    user_name: string;
    user_login: string;
    low_trust_status: 'none' | 'active_monitoring' | 'restricted';
}
interface ChannelSuspiciousUserMessageEvent {
    broadcaster_user_id: string;
    broadcaster_user_name: string;
    broadcaster_user_login: string;
    user_id: string;
    user_name: string;
    user_login: string;
    low_trust_status: 'none' | 'active_monitoring' | 'restricted';
    shared_ban_channel_ids: string[];
    types: 'manually_added' | 'ban_evader' | 'banned_in_shared_channel';
    ban_evasion_evaluation: 'unknown' | 'possible' | 'likely';
    message: {
        message_id: string;
        text: string;
        fragments: [
            {
                type: 'text' | 'cheermote' | 'emote';
                text: string;
                cheermote: {
                    prefix: string;
                    bits: string;
                    tier: string;
                } | null;
                emote: {
                    id: string;
                    emote_set_id: string;
                } | null;
            }
        ];
    };
}
interface ChannelVIPAddEvent {
    user_id: string;
    user_login: string;
    user_name: string;
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
}
interface ChannelVIPRemoveEvent {
    user_id: string;
    user_login: string;
    user_name: string;
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
}
interface ChannelWarningAcknowledgeEvent {
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    user_id: string;
    user_login: string;
    user_name: string;
}
interface ChannelWarningSendEvent {
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    moderator_user_id: string;
    moderator_user_login: string;
    moderator_user_name: string;
    user_id: string;
    user_login: string;
    user_name: string;
    reason: string | null;
    chat_rules_cited: string[] | null;
}
interface CharityDonationEvent {
    id: string;
    campaign_id: string;
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    user_id: string;
    user_login: string;
    user_name: string;
    charity_name: string;
    charity_description: string;
    charity_logo: string;
    charity_website: string;
    amount: {
        value: number;
        decimal_places: number;
        currency: string;
    };
}
interface CharityCampaignStartEvent {
    id: string;
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    charity_name: string;
    charity_description: string;
    charity_logo: string;
    charity_website: string;
    current_amount: {
        value: number;
        decimal_places: number;
        currency: string;
    };
    target_amount: {
        value: number;
        decimal_places: number;
        currency: string;
    };
    started_at: string;
}
interface CharityCampaignProgressEvent {
    id: string;
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    charity_name: string;
    charity_description: string;
    charity_logo: string;
    charity_website: string;
    current_amount: {
        value: number;
        decimal_places: number;
        currency: string;
    };
    target_amount: {
        value: number;
        decimal_places: number;
        currency: string;
    };
}
interface CharityCampaignStopEvent {
    id: string;
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    charity_name: string;
    charity_description: string;
    charity_logo: string;
    charity_website: string;
    current_amount: {
        value: number;
        decimal_places: number;
        currency: string;
    };
    target_amount: {
        value: number;
        decimal_places: number;
        currency: string;
    };
    stopped_at: string;
}
interface ConduitShardDisabledEvent {
    conduit_id: string;
    shard_id: string;
    status: string;
    transport: string;
    method: string;
    callback: string | null;
    session_id: string | null;
    connected_at: string | null;
    disconnected_at: string | null;
}
interface DropEntitlementGrantEvent {
    id: string;
    data: [
        {
            organization_id: string;
            category_id: string;
            category_name: string;
            campaign_id: string;
            user_id: string;
            user_name: string;
            user_login: string;
            entitlement_id: string;
            benefit_id: string;
            created_at: string;
        }
    ];
}
interface ExtensionBitsTransactionCreateEvent {
    extension_client_id: string;
    id: string;
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    user_id: string;
    user_login: string;
    user_name: string;
    product: {
        name: string;
        bits: number;
        sku: string;
        in_development: boolean;
    };
}
interface GoalsEvent {
    id: string;
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    type: 'follow' | 'subscription' | 'subscription_count' | 'new_subscription' | 'new_subscription_count' | 'new_bit' | 'new_cheerer ';
    description: string;
    current_amount: number;
    target_amount: number;
    started_at: string;
    ended_at: string;
}
interface GoalsEndEvent {
    id: string;
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    type: 'follow' | 'subscription' | 'subscription_count' | 'new_subscription' | 'new_subscription_count' | 'new_bit' | 'new_cheerer ';
    description: string;
    is_achieved: boolean;
    current_amount: number;
    target_amount: number;
    started_at: string;
    ended_at: string;
}
interface HypeTrainBeginEvent {
    id: string;
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    total: number;
    progress: number;
    goal: number;
    top_contributions: [
        {
            user_id: string;
            user_login: string;
            user_name: string;
            type: 'bits' | 'subscription' | 'other';
            total: number;
        }
    ];
    last_contribution: {
        user_id: string;
        user_login: string;
        user_name: string;
        type: 'bits' | 'subscription' | 'other';
        total: number;
    };
    level: number;
    started_at: string;
    expires_at: string;
    is_golden_kappa_train: boolean;
}
interface HypeTrainProgressEvent {
    id: string;
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    level: number;
    total: number;
    progress: number;
    goal: number;
    top_contributions: [
        {
            user_id: string;
            user_login: string;
            user_name: string;
            type: 'bits' | 'subscription' | 'other';
            total: number;
        }
    ];
    last_contribution: {
        user_id: string;
        user_login: string;
        user_name: string;
        type: 'bits' | 'subscription' | 'other';
        total: number;
    };
    started_at: string;
    expires_at: string;
    is_golden_kappa_train: boolean;
}
interface HypeTrainEndEvent {
    id: string;
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    level: number;
    total: number;
    top_contributions: [
        {
            user_id: string;
            user_login: string;
            user_name: string;
            type: 'bits' | 'subscription' | 'other';
            total: number;
        }
    ];
    started_at: string;
    ended_at: string;
    cooldown_ends_at: string;
    is_golden_kappa_train: boolean;
}
interface StreamOnlineEvent {
    id: string;
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    type: 'live' | 'playlist' | 'watch_party' | 'premiere' | 'rerun';
    started_at: string;
}
interface StreamOfflineEvent {
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
}
interface UserAuthorizationGrantEvent {
    client_id: string;
    user_id: string;
    user_login: string;
    user_name: string;
}
interface UserAuthorizationRevokeEvent {
    client_id: string;
    user_id: string;
    user_login: string;
    user_name: string;
}
interface UserUpdateEvent {
    user_id: string;
    user_login: string;
    user_name: string;
    email: string | null;
    email_verified: boolean;
    description: string;
}
interface WhisperReceivedEvent {
    from_user_id: string;
    from_user_name: string;
    from_user_login: string;
    to_user_id: string;
    to_user_name: string;
    to_user_login: string;
    whisper_id: string;
    whisper: {
        text: string;
    };
}
interface ShieldModeBeginEvent {
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    moderator_user_id: string;
    moderator_user_login: string;
    moderator_user_name: string;
    started_at: string;
}
interface ShieldModeEndEvent {
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    moderator_user_id: string;
    moderator_user_login: string;
    moderator_user_name: string;
    ended_at: string;
}
interface ShoutoutCreate {
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    to_broadcaster_user_id: string;
    to_broadcaster_user_login: string;
    to_broadcaster_user_name: string;
    moderator_user_id: string;
    moderator_user_login: string;
    moderator_user_name: string;
    viewer_count: number;
    started_at: string;
    cooldown_ends_at: string;
    target_cooldown_ends_at: string;
}
interface ShoutoutReceived {
    broadcaster_user_id: string;
    broadcaster_user_login: string;
    broadcaster_user_name: string;
    from_broadcaster_user_id: string;
    from_broadcaster_user_login: string;
    from_broadcaster_user_name: string;
    viewer_count: number;
    started_at: string;
}

type Condition<T extends Record<string, string | number | boolean>> = T;
type ConditionBroadcasterUserId = Condition<{
    broadcaster_user_id: string;
}>;
type ConditionBroadcasterModeratorUserId = Condition<{
    broadcaster_user_id: string;
    moderator_user_id: string;
}>;
type ConditionBroadcasterUserIdUserId = Condition<{
    broadcaster_user_id: string;
    user_id: string;
}>;
type ConditionBroadcasterRewardId = Condition<{
    broadcaster_user_id: string;
    reward_id?: string;
}>;
type ConditionOrganizationId = Condition<{
    organization_id: string;
}>;
type ConditionOrganizationCategoryExtensionClientId = Condition<{
    organization_id: string;
    category_id: string;
    extension_client_id: string;
}>;
type ConditionClientId = Condition<{
    client_id: string;
}>;
type ConditionUserId = Condition<{
    user_id: string;
}>;
interface SubscriptionDetailsMap {
    'automod.message.hold:1': {
        type: 'automod.message.hold';
        version: '1';
        condition: ConditionBroadcasterModeratorUserId;
        event: AutomodMessageHoldEventV1;
    };
    'automod.message.hold:2': {
        type: 'automod.message.hold';
        version: '2';
        condition: ConditionBroadcasterModeratorUserId;
        event: AutomodMessageHoldEventV2;
    };
    'automod.message.update:1': {
        type: 'automod.message.update';
        version: '1';
        condition: ConditionBroadcasterModeratorUserId;
        event: AutomodMessageUpdateEventV1;
    };
    'automod.message.update:2': {
        type: 'automod.message.update';
        version: '2';
        condition: ConditionBroadcasterModeratorUserId;
        event: AutomodMessageUpdateEventV2;
    };
    'automod.settings.update:1': {
        type: 'automod.settings.update';
        version: '1';
        condition: ConditionBroadcasterModeratorUserId;
        event: AutomodSettingsUpdateEvent;
    };
    'automod.terms.update:1': {
        type: 'automod.terms.update';
        version: '1';
        condition: ConditionBroadcasterModeratorUserId;
        event: AutomodTermsUpdateEvent;
    };
    'channel.bits.use:1': {
        type: 'channel.bits.use';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: ChannelBitsUseEvent;
    };
    'channel.update:2': {
        type: 'channel.update';
        version: '2';
        condition: ConditionBroadcasterUserId;
        event: ChannelUpdateEvent;
    };
    'channel.follow:2': {
        type: 'channel.follow';
        version: '2';
        condition: ConditionBroadcasterModeratorUserId;
        event: ChannelFollowEvent;
    };
    'channel.ad_break.begin:1': {
        type: 'channel.ad_break.begin';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: ChannelAdBreakBeginEvent;
    };
    'channel.chat.clear:1': {
        type: 'channel.chat.clear';
        version: '1';
        condition: ConditionBroadcasterUserIdUserId;
        event: ChannelChatClearEvent;
    };
    'channel.chat.clear_user_messages:1': {
        type: 'channel.chat.clear_user_messages';
        version: '1';
        condition: ConditionBroadcasterUserIdUserId;
        event: ChannelChatClearUserMessagesEvent;
    };
    'channel.chat.message:1': {
        type: 'channel.chat.message';
        version: '1';
        condition: ConditionBroadcasterUserIdUserId;
        event: ChannelChatMessageEvent;
    };
    'channel.chat.message_delete:1': {
        type: 'channel.chat.message_delete';
        version: '1';
        condition: ConditionBroadcasterUserIdUserId;
        event: ChannelChatMessageDeleteEvent;
    };
    'channel.chat.notification:1': {
        type: 'channel.chat.notification';
        version: '1';
        condition: ConditionBroadcasterUserIdUserId;
        event: ChannelChatNotificationEvent;
    };
    'channel.chat_settings.update:1': {
        type: 'channel.chat_settings.update';
        version: '1';
        condition: ConditionBroadcasterUserIdUserId;
        event: ChannelChatSettingsUpdateEvent;
    };
    'channel.chat.user_message_hold:1': {
        type: 'channel.chat.user_message_hold';
        version: '1';
        condition: ConditionBroadcasterUserIdUserId;
        event: ChannelChatUserMessageHoldEvent;
    };
    'channel.chat.user_message_update:1': {
        type: 'channel.chat.user_message_update';
        version: '1';
        condition: ConditionBroadcasterUserIdUserId;
        event: ChannelChatUserMessageUpdateEvent;
    };
    'channel.shared_chat.begin:1': {
        type: 'channel.shared_chat.begin';
        version: '1';
        condition: ConditionBroadcasterUserIdUserId;
        event: ChannelSharedChatSessionBeginEvent;
    };
    'channel.shared_chat.update:1': {
        type: 'channel.shared_chat.update';
        version: '1';
        condition: ConditionBroadcasterUserIdUserId;
        event: ChannelSharedChatSessionUpdateEvent;
    };
    'channel.shared_chat.end:1': {
        type: 'channel.shared_chat.end';
        version: '1';
        condition: ConditionBroadcasterUserIdUserId;
        event: ChannelSharedChatSessionEndEvent;
    };
    'channel.subscribe:1': {
        type: 'channel.subscribe';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: ChannelSubscribeEvent;
    };
    'channel.subscription.end:1': {
        type: 'channel.subscription.end';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: ChannelSubscriptionEndEvent;
    };
    'channel.subscription.gift:1': {
        type: 'channel.subscription.gift';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: ChannelSubscriptionGiftEvent;
    };
    'channel.subscription.message:1': {
        type: 'channel.subscription.message';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: ChannelSubscriptionMessageEvent;
    };
    'channel.cheer:1': {
        type: 'channel.cheer';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: ChannelCheerEvent;
    };
    'channel.raid:1': {
        type: 'channel.raid';
        version: '1';
        condition: Condition<{
            to_broadcaster_user_id: string;
        } | {
            from_broadcaster_user_id: string;
        }>;
        event: ChannelRaidEvent;
    };
    'channel.ban:1': {
        type: 'channel.ban';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: ChannelBanEvent;
    };
    'channel.unban:1': {
        type: 'channel.unban';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: ChannelUnbanEvent;
    };
    'channel.unban_request.create:1': {
        type: 'channel.unban_request.create';
        version: '1';
        condition: ConditionBroadcasterModeratorUserId;
        event: ChannelUnbanRequestCreateEvent;
    };
    'channel.unban_request.resolve:1': {
        type: 'channel.unban_request.resolve';
        version: '1';
        condition: ConditionBroadcasterModeratorUserId;
        event: ChannelUnbanRequestResolveEvent;
    };
    'channel.moderate:1': {
        type: 'channel.moderate';
        version: '1';
        condition: ConditionBroadcasterModeratorUserId;
        event: ChannelModerateEventV1;
    };
    'channel.moderate:2': {
        type: 'channel.moderate';
        version: '2';
        condition: ConditionBroadcasterModeratorUserId;
        event: ChannelModerateEventV2;
    };
    'channel.moderator.add:1': {
        type: 'channel.moderator.add';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: ChannelModeratorAddEvent;
    };
    'channel.moderator.remove:1': {
        type: 'channel.moderator.remove';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: ChannelModeratorRemoveEvent;
    };
    'channel.guest_star_session.begin:beta': {
        type: 'channel.guest_star_session.begin';
        version: 'beta';
        condition: ConditionBroadcasterModeratorUserId;
        event: ChannelGuestStarSessionBeginEvent;
    };
    'channel.guest_star_session.end:beta': {
        type: 'channel.guest_star_session.end';
        version: 'beta';
        condition: ConditionBroadcasterModeratorUserId;
        event: ChannelGuestStarSessionEndEvent;
    };
    'channel.guest_star_guest.update:beta': {
        type: 'channel.guest_star_guest.update';
        version: 'beta';
        condition: ConditionBroadcasterModeratorUserId;
        event: ChannelGuestStarSettingsUpdateEvent;
    };
    'channel.guest_star_settings.update:beta': {
        type: 'channel.guest_star_settings.update';
        version: 'beta';
        condition: ConditionBroadcasterModeratorUserId;
        event: ChannelGuestStarSettingsUpdateEvent;
    };
    'channel.channel_points_automatic_reward_redemption.add:1': {
        type: 'channel.channel_points_automatic_reward_redemption.add';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: ChannelPointsAutomaticRewardRedemptionAddEventV1;
    };
    'channel.channel_points_automatic_reward_redemption.add:2': {
        type: 'channel.channel_points_automatic_reward_redemption.add';
        version: '2';
        condition: ConditionBroadcasterUserId;
        event: ChannelPointsAutomaticRewardRedemptionAddEventV2;
    };
    'channel.channel_points_custom_reward.add:1': {
        type: 'channel.channel_points_custom_reward.add';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: ChannelPointsCustomRewardAddEvent;
    };
    'channel.channel_points_custom_reward.update:1': {
        type: 'channel.channel_points_custom_reward.update';
        version: '1';
        condition: ConditionBroadcasterRewardId;
        event: ChannelPointsCustomRewardUpdateEvent;
    };
    'channel.channel_points_custom_reward.remove:1': {
        type: 'channel.channel_points_custom_reward.remove';
        version: '1';
        condition: ConditionBroadcasterRewardId;
        event: ChannelPointsCustomRewardRemoveEvent;
    };
    'channel.channel_points_custom_reward_redemption.add:1': {
        type: 'channel.channel_points_custom_reward_redemption.add';
        version: '1';
        condition: ConditionBroadcasterRewardId;
        event: ChannelPointsCustomRewardRedemptionAddEvent;
    };
    'channel.channel_points_custom_reward_redemption.update:1': {
        type: 'channel.channel_points_custom_reward_redemption.update';
        version: '1';
        condition: ConditionBroadcasterRewardId;
        event: ChannelPointsCustomRewardRedemptionUpdateEvent;
    };
    'channel.poll.begin:1': {
        type: 'channel.poll.begin';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: ChannelPollBeginEvent;
    };
    'channel.poll.progress:1': {
        type: 'channel.poll.progress';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: ChannelPollProgressEvent;
    };
    'channel.poll.end:1': {
        type: 'channel.poll.end';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: ChannelPollEndEvent;
    };
    'channel.prediction.begin:1': {
        type: 'channel.prediction.begin';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: ChannelPredictionBeginEvent;
    };
    'channel.prediction.progress:1': {
        type: 'channel.prediction.progress';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: ChannelPredictionProgressEvent;
    };
    'channel.prediction.lock:1': {
        type: 'channel.prediction.lock';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: ChannelPredictionLockEvent;
    };
    'channel.prediction.end:1': {
        type: 'channel.prediction.end';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: ChannelPredictionEndEvent;
    };
    'channel.suspicious_user.message:1': {
        type: 'channel.suspicious_user.message';
        version: '1';
        condition: ConditionBroadcasterModeratorUserId;
        event: ChannelSuspiciousUserMessageEvent;
    };
    'channel.suspicious_user.update:1': {
        type: 'channel.suspicious_user.update';
        version: '1';
        condition: ConditionBroadcasterModeratorUserId;
        event: ChannelSuspiciousUserUpdateEvent;
    };
    'channel.vip.add:1': {
        type: 'channel.vip.add';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: ChannelVIPAddEvent;
    };
    'channel.vip.remove:1': {
        type: 'channel.vip.remove';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: ChannelVIPRemoveEvent;
    };
    'channel.warning.acknowledge:1': {
        type: 'channel.warning.acknowledge';
        version: '1';
        condition: ConditionBroadcasterModeratorUserId;
        event: ChannelWarningAcknowledgeEvent;
    };
    'channel.warning.send:1': {
        type: 'channel.warning.send';
        version: '1';
        condition: ConditionBroadcasterModeratorUserId;
        event: ChannelWarningSendEvent;
    };
    'channel.charity_campaign.donate:1': {
        type: 'channel.charity_campaign.donate';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: CharityDonationEvent;
    };
    'channel.charity_campaign.start:1': {
        type: 'channel.charity_campaign.start';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: CharityCampaignStartEvent;
    };
    'channel.charity_campaign.progress:1': {
        type: 'channel.charity_campaign.progress';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: CharityCampaignProgressEvent;
    };
    'channel.charity_campaign.stop:1': {
        type: 'channel.charity_campaign.stop';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: CharityCampaignStopEvent;
    };
    'conduit.shard.disabled:1': {
        type: 'conduit.shard.disabled';
        version: '1';
        condition: ConditionClientId;
        event: ConduitShardDisabledEvent;
    };
    'drop.entitlement.grant:1': {
        type: 'drop.entitlement.grant';
        version: '1';
        condition: ConditionOrganizationId | ConditionOrganizationCategoryExtensionClientId;
        event: DropEntitlementGrantEvent;
    };
    'extension.bits_transaction.create:1': {
        type: 'extension.bits_transaction.create';
        version: '1';
        condition: ConditionClientId;
        event: ExtensionBitsTransactionCreateEvent;
    };
    'channel.goal.begin:1': {
        type: 'channel.goal.begin';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: GoalsEvent;
    };
    'channel.goal.progress:1': {
        type: 'channel.goal.progress';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: GoalsEvent;
    };
    'channel.goal.end:1': {
        type: 'channel.goal.end';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: GoalsEndEvent;
    };
    'channel.hype_train.begin:1': {
        type: 'channel.hype_train.begin';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: HypeTrainBeginEvent;
    };
    'channel.hype_train.progress:1': {
        type: 'channel.hype_train.progress';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: HypeTrainProgressEvent;
    };
    'channel.hype_train.end:1': {
        type: 'channel.hype_train.end';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: HypeTrainEndEvent;
    };
    'channel.shield_mode.begin:1': {
        type: 'channel.shield_mode.begin';
        version: '1';
        condition: ConditionBroadcasterModeratorUserId;
        event: ShieldModeBeginEvent;
    };
    'channel.shield_mode.end:1': {
        type: 'channel.shield_mode.end';
        version: '1';
        condition: ConditionBroadcasterModeratorUserId;
        event: ShieldModeEndEvent;
    };
    'channel.shoutout.create:1': {
        type: 'channel.shoutout.create';
        version: '1';
        condition: ConditionBroadcasterModeratorUserId;
        event: ShoutoutCreate;
    };
    'channel.shoutout.receive:1': {
        type: 'channel.shoutout.receive';
        version: '1';
        condition: ConditionBroadcasterModeratorUserId;
        event: ShoutoutReceived;
    };
    'stream.online:1': {
        type: 'stream.online';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: StreamOnlineEvent;
    };
    'stream.offline:1': {
        type: 'stream.offline';
        version: '1';
        condition: ConditionBroadcasterUserId;
        event: StreamOfflineEvent;
    };
    'user.authorization.grant:1': {
        type: 'user.authorization.grant';
        version: '1';
        condition: ConditionClientId;
        event: UserAuthorizationGrantEvent;
    };
    'user.authorization.revoke:1': {
        type: 'user.authorization.revoke';
        version: '1';
        condition: ConditionClientId;
        event: UserAuthorizationRevokeEvent;
    };
    'user.update:1': {
        type: 'user.update';
        version: '1';
        condition: ConditionUserId;
        event: UserUpdateEvent;
    };
    'user.whisper.message:1': {
        type: 'user.whisper.message';
        version: '1';
        condition: ConditionUserId;
        event: WhisperReceivedEvent;
    };
}
type SubscriptionTypeVersionKey = keyof SubscriptionDetailsMap;
type GetSubscriptionDetails<TKey extends SubscriptionTypeVersionKey> = SubscriptionDetailsMap[TKey];
type SpecificSubscriptionRequest<TKey extends SubscriptionTypeVersionKey> = SubscriptionRequest<GetSubscriptionDetails<TKey>['type'], GetSubscriptionDetails<TKey>['version'], GetSubscriptionDetails<TKey>['condition']>;
type AnySubscriptionRequest = {
    [K in SubscriptionTypeVersionKey]: {
        type: SubscriptionDetailsMap[K]['type'];
        version: SubscriptionDetailsMap[K]['version'];
        condition: SubscriptionDetailsMap[K]['condition'];
    };
}[SubscriptionTypeVersionKey];

interface NotificationMessageMetadata extends EventSubMessageMetadata {
    message_type: 'notification';
    subscription_type: string;
    subscription_version: string;
}
interface NotificationMessagePayload<TCondition extends Record<string, any> = Record<string, any>, TEvent extends Record<string, any> = Record<string, any>> {
    subscription: EventSubSubscriptionData<TCondition>;
    event: TEvent;
}
declare class NotificationMessage implements EventSubMessage<NotificationMessageMetadata, NotificationMessagePayload> {
    readonly metadata: NotificationMessageMetadata;
    readonly payload: NotificationMessagePayload;
    constructor(rawMessage: any);
    isAutomodMessageHoldV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['automod.message.hold:1']['condition'], SubscriptionDetailsMap['automod.message.hold:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'automod.message.hold';
            subscription_version: '1';
        };
    };
    isAutomodMessageHoldV2(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['automod.message.hold:2']['condition'], SubscriptionDetailsMap['automod.message.hold:2']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'automod.message.hold';
            subscription_version: '2';
        };
    };
    isAutomodMessageUpdateV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['automod.message.update:1']['condition'], SubscriptionDetailsMap['automod.message.update:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'automod.message.update';
            subscription_version: '1';
        };
    };
    isAutomodMessageUpdateV2(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['automod.message.update:2']['condition'], SubscriptionDetailsMap['automod.message.update:2']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'automod.message.update';
            subscription_version: '2';
        };
    };
    isAutomodSettingsUpdateV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['automod.settings.update:1']['condition'], SubscriptionDetailsMap['automod.settings.update:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'automod.settings.update';
            subscription_version: '1';
        };
    };
    isAutomodTermsUpdateV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['automod.terms.update:1']['condition'], SubscriptionDetailsMap['automod.terms.update:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'automod.terms.update';
            subscription_version: '1';
        };
    };
    isChannelBitsUseV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.bits.use:1']['condition'], SubscriptionDetailsMap['channel.bits.use:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.bits.use';
            subscription_version: '1';
        };
    };
    isChannelUpdateV2(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.update:2']['condition'], SubscriptionDetailsMap['channel.update:2']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.update';
            subscription_version: '2';
        };
    };
    isChannelFollowV2(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.follow:2']['condition'], SubscriptionDetailsMap['channel.follow:2']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.follow';
            subscription_version: '2';
        };
    };
    isChannelAdBreakBeginV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.ad_break.begin:1']['condition'], SubscriptionDetailsMap['channel.ad_break.begin:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.ad_break.begin';
            subscription_version: '1';
        };
    };
    isChannelChatClearV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.chat.clear:1']['condition'], SubscriptionDetailsMap['channel.chat.clear:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.chat.clear';
            subscription_version: '1';
        };
    };
    isChannelChatClearUserMessagesV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.chat.clear_user_messages:1']['condition'], SubscriptionDetailsMap['channel.chat.clear_user_messages:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.chat.clear_user_messages';
            subscription_version: '1';
        };
    };
    isChannelChatMessageV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.chat.message:1']['condition'], SubscriptionDetailsMap['channel.chat.message:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.chat.message';
            subscription_version: '1';
        };
    };
    isChannelChatMessageDeleteV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.chat.message_delete:1']['condition'], SubscriptionDetailsMap['channel.chat.message_delete:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.chat.message_delete';
            subscription_version: '1';
        };
    };
    isChannelChatNotificationV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.chat.notification:1']['condition'], SubscriptionDetailsMap['channel.chat.notification:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.chat.notification';
            subscription_version: '1';
        };
    };
    isChannelChatSettingsUpdateV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.chat_settings.update:1']['condition'], SubscriptionDetailsMap['channel.chat_settings.update:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.chat_settings.update';
            subscription_version: '1';
        };
    };
    isChannelChatUserMessageHoldV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.chat.user_message_hold:1']['condition'], SubscriptionDetailsMap['channel.chat.user_message_hold:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.chat.user_message_hold';
            subscription_version: '1';
        };
    };
    isChannelChatUserMessageUpdateV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.chat.user_message_update:1']['condition'], SubscriptionDetailsMap['channel.chat.user_message_update:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.chat.user_message_update';
            subscription_version: '1';
        };
    };
    isChannelSharedChatBeginV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.shared_chat.begin:1']['condition'], SubscriptionDetailsMap['channel.shared_chat.begin:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.shared_chat.begin';
            subscription_version: '1';
        };
    };
    isChannelSharedChatUpdateV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.shared_chat.update:1']['condition'], SubscriptionDetailsMap['channel.shared_chat.update:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.shared_chat.update';
            subscription_version: '1';
        };
    };
    isChannelSharedChatEndV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.shared_chat.end:1']['condition'], SubscriptionDetailsMap['channel.shared_chat.end:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.shared_chat.end';
            subscription_version: '1';
        };
    };
    isChannelSubscribeV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.subscribe:1']['condition'], SubscriptionDetailsMap['channel.subscribe:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.subscribe';
            subscription_version: '1';
        };
    };
    isChannelSubscriptionEndV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.subscription.end:1']['condition'], SubscriptionDetailsMap['channel.subscription.end:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.subscription.end';
            subscription_version: '1';
        };
    };
    isChannelSubscriptionGiftV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.subscription.gift:1']['condition'], SubscriptionDetailsMap['channel.subscription.gift:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.subscription.gift';
            subscription_version: '1';
        };
    };
    isChannelSubscriptionMessageV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.subscription.message:1']['condition'], SubscriptionDetailsMap['channel.subscription.message:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.subscription.message';
            subscription_version: '1';
        };
    };
    isChannelCheerV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.cheer:1']['condition'], SubscriptionDetailsMap['channel.cheer:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.cheer';
            subscription_version: '1';
        };
    };
    isChannelRaidV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.raid:1']['condition'], SubscriptionDetailsMap['channel.raid:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.raid';
            subscription_version: '1';
        };
    };
    isChannelBanV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.ban:1']['condition'], SubscriptionDetailsMap['channel.ban:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.ban';
            subscription_version: '1';
        };
    };
    isChannelUnbanV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.unban:1']['condition'], SubscriptionDetailsMap['channel.unban:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.unban';
            subscription_version: '1';
        };
    };
    isChannelUnbanRequestCreateV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.unban_request.create:1']['condition'], SubscriptionDetailsMap['channel.unban_request.create:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.unban_request.create';
            subscription_version: '1';
        };
    };
    isChannelUnbanRequestResolveV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.unban_request.resolve:1']['condition'], SubscriptionDetailsMap['channel.unban_request.resolve:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.unban_request.resolve';
            subscription_version: '1';
        };
    };
    isChannelModerateV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.moderate:1']['condition'], SubscriptionDetailsMap['channel.moderate:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.moderate';
            subscription_version: '1';
        };
    };
    isChannelModerateV2(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.moderate:2']['condition'], SubscriptionDetailsMap['channel.moderate:2']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.moderate';
            subscription_version: '2';
        };
    };
    isChannelModeratorAddV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.moderator.add:1']['condition'], SubscriptionDetailsMap['channel.moderator.add:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.moderator.add';
            subscription_version: '1';
        };
    };
    isChannelModeratorRemoveV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.moderator.remove:1']['condition'], SubscriptionDetailsMap['channel.moderator.remove:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.moderator.remove';
            subscription_version: '1';
        };
    };
    isChannelGuestStarSessionBeginBeta(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.guest_star_session.begin:beta']['condition'], SubscriptionDetailsMap['channel.guest_star_session.begin:beta']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.guest_star_session.begin';
            subscription_version: 'beta';
        };
    };
    isChannelGuestStarSessionEndBeta(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.guest_star_session.end:beta']['condition'], SubscriptionDetailsMap['channel.guest_star_session.end:beta']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.guest_star_session.end';
            subscription_version: 'beta';
        };
    };
    isChannelGuestStarGuestUpdateBeta(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.guest_star_guest.update:beta']['condition'], SubscriptionDetailsMap['channel.guest_star_guest.update:beta']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.guest_star_guest.update';
            subscription_version: 'beta';
        };
    };
    isChannelGuestStarSettingsUpdateBeta(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.guest_star_settings.update:beta']['condition'], SubscriptionDetailsMap['channel.guest_star_settings.update:beta']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.guest_star_settings.update';
            subscription_version: 'beta';
        };
    };
    isChannelChannelPointsAutomaticRewardRedemptionAddV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.channel_points_automatic_reward_redemption.add:1']['condition'], SubscriptionDetailsMap['channel.channel_points_automatic_reward_redemption.add:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.channel_points_automatic_reward_redemption.add';
            subscription_version: '1';
        };
    };
    isChannelChannelPointsAutomaticRewardRedemptionAddV2(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.channel_points_automatic_reward_redemption.add:2']['condition'], SubscriptionDetailsMap['channel.channel_points_automatic_reward_redemption.add:2']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.channel_points_automatic_reward_redemption.add';
            subscription_version: '2';
        };
    };
    isChannelChannelPointsCustomRewardAddV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.channel_points_custom_reward.add:1']['condition'], SubscriptionDetailsMap['channel.channel_points_custom_reward.add:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.channel_points_custom_reward.add';
            subscription_version: '1';
        };
    };
    isChannelChannelPointsCustomRewardUpdateV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.channel_points_custom_reward.update:1']['condition'], SubscriptionDetailsMap['channel.channel_points_custom_reward.update:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.channel_points_custom_reward.update';
            subscription_version: '1';
        };
    };
    isChannelChannelPointsCustomRewardRemoveV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.channel_points_custom_reward.remove:1']['condition'], SubscriptionDetailsMap['channel.channel_points_custom_reward.remove:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.channel_points_custom_reward.remove';
            subscription_version: '1';
        };
    };
    isChannelChannelPointsCustomRewardRedemptionAddV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.channel_points_custom_reward_redemption.add:1']['condition'], SubscriptionDetailsMap['channel.channel_points_custom_reward_redemption.add:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.channel_points_custom_reward_redemption.add';
            subscription_version: '1';
        };
    };
    isChannelChannelPointsCustomRewardRedemptionUpdateV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.channel_points_custom_reward_redemption.update:1']['condition'], SubscriptionDetailsMap['channel.channel_points_custom_reward_redemption.update:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.channel_points_custom_reward_redemption.update';
            subscription_version: '1';
        };
    };
    isChannelPollBeginV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.poll.begin:1']['condition'], SubscriptionDetailsMap['channel.poll.begin:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.poll.begin';
            subscription_version: '1';
        };
    };
    isChannelPollProgressV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.poll.progress:1']['condition'], SubscriptionDetailsMap['channel.poll.progress:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.poll.progress';
            subscription_version: '1';
        };
    };
    isChannelPollEndV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.poll.end:1']['condition'], SubscriptionDetailsMap['channel.poll.end:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.poll.end';
            subscription_version: '1';
        };
    };
    isChannelPredictionBeginV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.prediction.begin:1']['condition'], SubscriptionDetailsMap['channel.prediction.begin:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.prediction.begin';
            subscription_version: '1';
        };
    };
    isChannelPredictionProgressV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.prediction.progress:1']['condition'], SubscriptionDetailsMap['channel.prediction.progress:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.prediction.progress';
            subscription_version: '1';
        };
    };
    isChannelPredictionLockV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.prediction.lock:1']['condition'], SubscriptionDetailsMap['channel.prediction.lock:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.prediction.lock';
            subscription_version: '1';
        };
    };
    isChannelPredictionEndV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.prediction.end:1']['condition'], SubscriptionDetailsMap['channel.prediction.end:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.prediction.end';
            subscription_version: '1';
        };
    };
    isChannelSuspiciousUserMessageV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.suspicious_user.message:1']['condition'], SubscriptionDetailsMap['channel.suspicious_user.message:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.suspicious_user.message';
            subscription_version: '1';
        };
    };
    isChannelSuspiciousUserUpdateV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.suspicious_user.update:1']['condition'], SubscriptionDetailsMap['channel.suspicious_user.update:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.suspicious_user.update';
            subscription_version: '1';
        };
    };
    isChannelVipAddV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.vip.add:1']['condition'], SubscriptionDetailsMap['channel.vip.add:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.vip.add';
            subscription_version: '1';
        };
    };
    isChannelVipRemoveV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.vip.remove:1']['condition'], SubscriptionDetailsMap['channel.vip.remove:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.vip.remove';
            subscription_version: '1';
        };
    };
    isChannelWarningAcknowledgeV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.warning.acknowledge:1']['condition'], SubscriptionDetailsMap['channel.warning.acknowledge:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.warning.acknowledge';
            subscription_version: '1';
        };
    };
    isChannelWarningSendV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.warning.send:1']['condition'], SubscriptionDetailsMap['channel.warning.send:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.warning.send';
            subscription_version: '1';
        };
    };
    isChannelCharityCampaignDonateV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.charity_campaign.donate:1']['condition'], SubscriptionDetailsMap['channel.charity_campaign.donate:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.charity_campaign.donate';
            subscription_version: '1';
        };
    };
    isChannelCharityCampaignStartV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.charity_campaign.start:1']['condition'], SubscriptionDetailsMap['channel.charity_campaign.start:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.charity_campaign.start';
            subscription_version: '1';
        };
    };
    isChannelCharityCampaignProgressV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.charity_campaign.progress:1']['condition'], SubscriptionDetailsMap['channel.charity_campaign.progress:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.charity_campaign.progress';
            subscription_version: '1';
        };
    };
    isChannelCharityCampaignStopV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.charity_campaign.stop:1']['condition'], SubscriptionDetailsMap['channel.charity_campaign.stop:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.charity_campaign.stop';
            subscription_version: '1';
        };
    };
    isConduitShardDisabledV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['conduit.shard.disabled:1']['condition'], SubscriptionDetailsMap['conduit.shard.disabled:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'conduit.shard.disabled';
            subscription_version: '1';
        };
    };
    isDropEntitlementGrantV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['drop.entitlement.grant:1']['condition'], SubscriptionDetailsMap['drop.entitlement.grant:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'drop.entitlement.grant';
            subscription_version: '1';
        };
    };
    isExtensionBitsTransactionCreateV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['extension.bits_transaction.create:1']['condition'], SubscriptionDetailsMap['extension.bits_transaction.create:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'extension.bits_transaction.create';
            subscription_version: '1';
        };
    };
    isChannelGoalBeginV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.goal.begin:1']['condition'], SubscriptionDetailsMap['channel.goal.begin:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.goal.begin';
            subscription_version: '1';
        };
    };
    isChannelGoalProgressV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.goal.progress:1']['condition'], SubscriptionDetailsMap['channel.goal.progress:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.goal.progress';
            subscription_version: '1';
        };
    };
    isChannelGoalEndV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.goal.end:1']['condition'], SubscriptionDetailsMap['channel.goal.end:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.goal.end';
            subscription_version: '1';
        };
    };
    isChannelHypeTrainBeginV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.hype_train.begin:1']['condition'], SubscriptionDetailsMap['channel.hype_train.begin:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.hype_train.begin';
            subscription_version: '1';
        };
    };
    isChannelHypeTrainProgressV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.hype_train.progress:1']['condition'], SubscriptionDetailsMap['channel.hype_train.progress:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.hype_train.progress';
            subscription_version: '1';
        };
    };
    isChannelHypeTrainEndV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.hype_train.end:1']['condition'], SubscriptionDetailsMap['channel.hype_train.end:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.hype_train.end';
            subscription_version: '1';
        };
    };
    isChannelShieldModeBeginV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.shield_mode.begin:1']['condition'], SubscriptionDetailsMap['channel.shield_mode.begin:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.shield_mode.begin';
            subscription_version: '1';
        };
    };
    isChannelShieldModeEndV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.shield_mode.end:1']['condition'], SubscriptionDetailsMap['channel.shield_mode.end:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.shield_mode.end';
            subscription_version: '1';
        };
    };
    isChannelShoutoutCreateV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.shoutout.create:1']['condition'], SubscriptionDetailsMap['channel.shoutout.create:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.shoutout.create';
            subscription_version: '1';
        };
    };
    isChannelShoutoutReceiveV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['channel.shoutout.receive:1']['condition'], SubscriptionDetailsMap['channel.shoutout.receive:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'channel.shoutout.receive';
            subscription_version: '1';
        };
    };
    isStreamOnlineV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['stream.online:1']['condition'], SubscriptionDetailsMap['stream.online:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'stream.online';
            subscription_version: '1';
        };
    };
    isStreamOfflineV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['stream.offline:1']['condition'], SubscriptionDetailsMap['stream.offline:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'stream.offline';
            subscription_version: '1';
        };
    };
    isUserAuthorizationGrantV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['user.authorization.grant:1']['condition'], SubscriptionDetailsMap['user.authorization.grant:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'user.authorization.grant';
            subscription_version: '1';
        };
    };
    isUserAuthorizationRevokeV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['user.authorization.revoke:1']['condition'], SubscriptionDetailsMap['user.authorization.revoke:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'user.authorization.revoke';
            subscription_version: '1';
        };
    };
    isUserUpdateV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['user.update:1']['condition'], SubscriptionDetailsMap['user.update:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'user.update';
            subscription_version: '1';
        };
    };
    isUserWhisperMessageV1(): this is NotificationMessage & {
        payload: NotificationMessagePayload<SubscriptionDetailsMap['user.whisper.message:1']['condition'], SubscriptionDetailsMap['user.whisper.message:1']['event']>;
        metadata: NotificationMessageMetadata & {
            subscription_type: 'user.whisper.message';
            subscription_version: '1';
        };
    };
}

interface ReconnectMessageMetadata extends EventSubMessageMetadata {
    message_type: 'session_reconnect';
}
interface ReconnectMessagePayload {
    session: EventSubSessionData;
}
type ReconnectMessage = EventSubMessage<ReconnectMessageMetadata, ReconnectMessagePayload>;

type RevocationStatus = 'user_removed' | 'authorization_revoked' | 'version_removed' | 'chat_user_banned' | string;
interface RevocationMessageMetadata extends EventSubMessageMetadata {
    message_type: 'revocation';
    subscription_type: string;
    subscription_version: string;
}
interface RevocationMessagePayload<TCondition extends Record<string, any> = Record<string, any>> {
    subscription: EventSubSubscriptionData<TCondition> & {
        status: RevocationStatus;
    };
}
type RevocationMessage = EventSubMessage<RevocationMessageMetadata, RevocationMessagePayload<any>>;

interface WelcomeMessageMetadata extends EventSubMessageMetadata {
    message_type: 'session_welcome';
}
interface WelcomeMessagePayload {
    session: EventSubSessionData;
}
type WelcomeMessage = EventSubMessage<WelcomeMessageMetadata, WelcomeMessagePayload>;

type TwitchEventSubMessage = WelcomeMessage | KeepaliveMessage | NotificationMessage | ReconnectMessage | RevocationMessage;
interface EventSubMessageMetadata {
    message_id: string;
    message_type: string;
    message_timestamp: string;
    subscription_type?: string;
    subscription_version?: string;
}
interface EventSubTransport {
    method: 'websocket' | 'webhook' | 'conduit';
    session_id?: string;
    connected_at?: string;
    disconnected_at?: string;
    callback?: string;
    conduit_id?: string;
}
interface EventSubSubscriptionData<TCondition extends Record<string, any> = Record<string, any>> {
    id: string;
    status: string;
    type: string;
    version: string;
    cost: number;
    condition: TCondition;
    transport: EventSubTransport;
    created_at: string;
}
interface EventSubSessionData {
    id: string;
    status: 'connected' | 'reconnecting';
    connected_at: string;
    keepalive_timeout_seconds: number | null;
    reconnect_url: string | null;
}
interface EventSubMessage<TMetadata extends EventSubMessageMetadata, TPayload extends Record<string, any> | {}> {
    metadata: TMetadata;
    payload: TPayload;
}
interface EventSubClientConfig {
    clientId: string;
    token: string;
    keepaliveTimeoutSeconds?: number;
    apiBaseUrl?: string;
    websocketUrl?: string;
    reconnectBackoff?: {
        initialDelay?: number;
        maxDelay?: number;
        multiplier?: number;
        maxRetries?: number;
    };
    skipKeepaliveValidation?: boolean;
}
interface SubscriptionRequest<TType extends string, TVersion extends string, TCondition extends Record<string, any>> {
    type: TType;
    version: TVersion;
    condition: TCondition;
}
interface CreateSubscriptionSuccessResponse {
    data: EventSubSubscriptionData<any>[];
    total: number;
    total_cost: number;
    max_total_cost: number;
}
interface TwitchApiErrorResponse {
    error: string;
    status: number;
    message: string;
}
interface GetSubscriptionsSuccessResponse extends CreateSubscriptionSuccessResponse {
    pagination: {
        cursor?: string;
    };
}

interface EventSubClientEvents {
    connect: (session: EventSubSessionData) => void;
    disconnect: (data: {
        code: number;
        reason: string;
    }) => void;
    error: (error: Error | AxiosError<TwitchApiErrorResponse>) => void;
    rawMessage: (message: TwitchEventSubMessage) => void;
    welcome: (message: WelcomeMessage) => void;
    keepalive: (message: KeepaliveMessage) => void;
    reconnect: (message: ReconnectMessage) => void;
    revocation: (message: RevocationMessage) => void;
    notification: (message: NotificationMessage) => void;
}
declare interface EventSubClient {
    on<K extends keyof EventSubClientEvents>(event: K, listener: EventSubClientEvents[K]): this;
    once<K extends keyof EventSubClientEvents>(event: K, listener: EventSubClientEvents[K]): this;
    emit<K extends keyof EventSubClientEvents>(event: K, ...args: Parameters<EventSubClientEvents[K]>): boolean;
    off<K extends keyof EventSubClientEvents>(event: K, listener: EventSubClientEvents[K]): this;
    removeAllListeners<K extends keyof EventSubClientEvents>(event?: K): this;
}
declare class EventSubClient extends EventEmitter {
    private readonly apiClient;
    private readonly wsHandler;
    private readonly clientId;
    private readonly token;
    /**
     * Creates an instance of the EventSubClient.
     * @param clientId Your Twitch application's Client ID.
     * @param token A User Access Token with the required scopes for your subscriptions.
     * @param options Optional configuration for the client.
     */
    constructor(options: EventSubClientConfig);
    /**
     * Initiates the WebSocket connection to the Twitch EventSub server.
     * Listens for the 'connect' event to confirm connection.
     */
    connect(): void;
    /**
     * Closes the WebSocket connection gracefully.
     */
    disconnect(): void;
    /**
     * Checks if the WebSocket connection is currently established and received a Welcome message.
     * @returns True if connected, false otherwise.
     */
    isConnected(): boolean;
    /**
     * Gets the current WebSocket Session ID. Returns null if not connected.
     * @returns The Session ID string or null.
     */
    getSessionId(): string | null;
    /**
     * Subscribes to one or more EventSub topics.
     * Requires the client to be connected (must have received the Welcome message).
     *
     * @example
     * // Subscribe to channel follows for broadcaster '12345' (moderator/user '67890' has authorized)
     * client.subscribe({
     * type: 'channel.follow',
     * version: '2',
     * condition: { broadcaster_user_id: '12345', moderator_user_id: '67890' }
     * });
     *
     * // Subscribe to multiple events
     * client.subscribe([
     * { type: 'stream.online', version: '1', condition: { broadcaster_user_id: '12345' } },
     * { type: 'stream.offline', version: '1', condition: { broadcaster_user_id: '12345' } }
     * ]);
     *
     * @param requests A single subscription request object or an array of them.
     * @returns A Promise that resolves with the Twitch API response(s) on success.
     * @throws {AxiosError} Rejects with the API error on failure. Emits 'error' event.
     */
    subscribe(this: EventSubClient, requests: AnySubscriptionRequest | AnySubscriptionRequest[]): Promise<CreateSubscriptionSuccessResponse[]>;
    private _doSubscribe;
    /**
     * Unsubscribes from one or more EventSub topics using their subscription IDs.
     *
     * @param ids A single subscription ID string or an array of IDs.
     * @returns A Promise that resolves when all deletion requests are successfully sent (204 No Content).
     * @throws {AxiosError} Rejects with the first API error encountered on failure. Emits 'error' event.
     */
    unsubscribe(ids: string | string[]): Promise<void>;
    /**
     * Fetches the list of current EventSub subscriptions created by this client's credentials.
     * Handles pagination automatically to retrieve all subscriptions.
     *
     * @param filter Optional filter object (e.g., { status: 'enabled' } or { type: 'stream.online' }). Filters are mutually exclusive.
     * @returns A Promise resolving with an array of all matching subscription data objects.
     * @throws {AxiosError} Rejects with the API error on failure. Emits 'error' event.
     */
    getAllSubscriptions(filter?: {
        status: string;
    } | {
        type: string;
    } | {
        user_id: string;
    }): Promise<EventSubSubscriptionData<any>[]>;
    /**
     * Fetches a single page of EventSub subscriptions created by this client's credentials.
     *
     * @param filter Optional filter object (e.g., { status: 'enabled' } or { type: 'stream.online' }). Filters are mutually exclusive.
     * @param after Optional pagination cursor from a previous response.
     * @returns A Promise resolving with the API response containing a page of subscriptions and pagination info.
     * @throws {AxiosError} Rejects with the API error on failure. Emits 'error' event.
     */
    getSubscriptionsPage(filter?: {
        status: string;
    } | {
        type: string;
    } | {
        user_id: string;
    }, after?: string): Promise<GetSubscriptionsSuccessResponse>;
}

export { type AnySubscriptionRequest, type AutomodMessageHoldEventV1, type AutomodMessageHoldEventV2, type AutomodMessageUpdateEventV1, type AutomodMessageUpdateEventV2, type AutomodSettingsUpdateEvent, type AutomodTermsUpdateEvent, type ChannelAdBreakBeginEvent, type ChannelBanEvent, type ChannelBitsUseEvent, type ChannelChatClearEvent, type ChannelChatClearUserMessagesEvent, type ChannelChatMessageDeleteEvent, type ChannelChatMessageEvent, type ChannelChatNotificationEvent, type ChannelChatSettingsUpdateEvent, type ChannelChatUserMessageHoldEvent, type ChannelChatUserMessageUpdateEvent, type ChannelCheerEvent, type ChannelFollowEvent, type ChannelGuestStarGuestUpdateEvent, type ChannelGuestStarSessionBeginEvent, type ChannelGuestStarSessionEndEvent, type ChannelGuestStarSettingsUpdateEvent, type ChannelModerateEventV1, type ChannelModerateEventV2, type ChannelModeratorAddEvent, type ChannelModeratorRemoveEvent, type ChannelPointsAutomaticRewardRedemptionAddEventV1, type ChannelPointsAutomaticRewardRedemptionAddEventV2, type ChannelPointsCustomRewardAddEvent, type ChannelPointsCustomRewardRedemptionAddEvent, type ChannelPointsCustomRewardRedemptionUpdateEvent, type ChannelPointsCustomRewardRemoveEvent, type ChannelPointsCustomRewardUpdateEvent, type ChannelPollBeginEvent, type ChannelPollEndEvent, type ChannelPollProgressEvent, type ChannelPredictionBeginEvent, type ChannelPredictionEndEvent, type ChannelPredictionLockEvent, type ChannelPredictionProgressEvent, type ChannelRaidEvent, type ChannelSharedChatSessionBeginEvent, type ChannelSharedChatSessionEndEvent, type ChannelSharedChatSessionUpdateEvent, type ChannelSubscribeEvent, type ChannelSubscriptionEndEvent, type ChannelSubscriptionGiftEvent, type ChannelSubscriptionMessageEvent, type ChannelSuspiciousUserMessageEvent, type ChannelSuspiciousUserUpdateEvent, type ChannelUnbanEvent, type ChannelUnbanRequestCreateEvent, type ChannelUnbanRequestResolveEvent, type ChannelUpdateEvent, type ChannelVIPAddEvent, type ChannelVIPRemoveEvent, type ChannelWarningAcknowledgeEvent, type ChannelWarningSendEvent, type CharityCampaignProgressEvent, type CharityCampaignStartEvent, type CharityCampaignStopEvent, type CharityDonationEvent, type ConduitShardDisabledEvent, type CreateSubscriptionSuccessResponse, type DropEntitlementGrantEvent, EventSubClient, type EventSubClientConfig, type EventSubMessage, type EventSubMessageMetadata, type EventSubSessionData, type EventSubSubscriptionData, type EventSubTransport, type ExtensionBitsTransactionCreateEvent, type GetSubscriptionsSuccessResponse, type GoalsEndEvent, type GoalsEvent, type HypeTrainBeginEvent, type HypeTrainEndEvent, type HypeTrainProgressEvent, type KeepaliveMessage, type KeepaliveMessageMetadata, type KeepaliveMessagePayload, NotificationMessage, type NotificationMessageMetadata, type NotificationMessagePayload, type ReconnectMessage, type ReconnectMessageMetadata, type ReconnectMessagePayload, type RevocationMessage, type RevocationMessageMetadata, type RevocationMessagePayload, type RevocationStatus, type ShieldModeBeginEvent, type ShieldModeEndEvent, type ShoutoutCreate, type ShoutoutReceived, type SpecificSubscriptionRequest, type StreamOfflineEvent, type StreamOnlineEvent, type SubscriptionDetailsMap, type SubscriptionRequest, type SubscriptionTypeVersionKey, type TwitchApiErrorResponse, type TwitchEventSubMessage, type UserAuthorizationGrantEvent, type UserAuthorizationRevokeEvent, type UserUpdateEvent, type WelcomeMessage, type WelcomeMessageMetadata, type WelcomeMessagePayload, type WhisperReceivedEvent, EventSubClient as default };
