lunibee 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/dist/builders/attachment.d.ts +5 -1
- package/dist/builders/commands.d.ts +131 -45
- package/dist/builders/components.d.ts +164 -45
- package/dist/builders/embed.d.ts +5 -1
- package/dist/builders/index.d.ts +9 -4
- package/dist/builders/index.js +197 -105
- package/dist/builders/index.js.map +8 -8
- package/dist/core/events.d.ts +28 -12
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.js +183 -56
- package/dist/core/index.js.map +13 -13
- package/dist/core/permissions.d.ts +6 -2
- package/dist/index.d.ts +5 -4
- package/dist/index.js +413 -168
- package/dist/index.js.map +17 -17
- package/dist/managers/index.d.ts +5 -1
- package/dist/managers/index.js +30 -14
- package/dist/managers/index.js.map +9 -9
- package/dist/managers/message.d.ts +7 -3
- package/dist/rest/index.js +2 -2
- package/dist/rest/index.js.map +1 -1
- package/dist/sharding/index.js +3 -2
- package/dist/sharding/index.js.map +4 -4
- package/dist/structures/index.d.ts +9 -3
- package/dist/structures/index.js +126 -28
- package/dist/structures/index.js.map +9 -9
- package/dist/structures/interactions.d.ts +85 -11
- package/dist/structures/resources.d.ts +11 -1
- package/dist/types/gateway.d.ts +14 -0
- package/dist/types/index.d.ts +179 -16
- package/dist/types/index.js +37 -10
- package/dist/types/index.js.map +4 -4
- package/dist/ws/index.js +2 -1
- package/dist/ws/index.js.map +4 -4
- package/package.json +14 -14
package/dist/types/index.js.map
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../packages/types/src/gateway.ts", "../../packages/types/src/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"// ─── Gateway Intents ─────────────────────────────────────────────────────────\n\n/** Gateway intent bit flags supported by Discord (PascalCase). */\nexport const GatewayIntentBits = {\n Guilds: 1 << 0,\n GuildMembers: 1 << 1,\n GuildModeration: 1 << 2,\n GuildExpressions: 1 << 3,\n GuildIntegrations: 1 << 4,\n GuildWebhooks: 1 << 5,\n GuildInvites: 1 << 6,\n GuildVoiceStates: 1 << 7,\n GuildPresences: 1 << 8,\n GuildMessages: 1 << 9,\n GuildMessageReactions: 1 << 10,\n GuildMessageTyping: 1 << 11,\n DirectMessages: 1 << 12,\n DirectMessageReactions: 1 << 13,\n DirectMessageTyping: 1 << 14,\n MessageContent: 1 << 15,\n GuildScheduledEvents: 1 << 16,\n AutoModerationConfiguration: 1 << 20,\n AutoModerationExecution: 1 << 21,\n GuildMessagePolls: 1 << 24,\n DirectMessagePolls: 1 << 25,\n} as const;\n\n/** Idiomatic camelCase Gateway intent bit flags supported by Discord. */\nexport const IntentBits = {\n guild: 1 << 0,\n guilds: 1 << 0,\n guildMembers: 1 << 1,\n guildModeration: 1 << 2,\n guildBans: 1 << 2,\n guildExpressions: 1 << 3,\n guildEmojis: 1 << 3,\n guildEmojisAndStickers: 1 << 3,\n guildIntegrations: 1 << 4,\n guildWebhooks: 1 << 5,\n guildInvites: 1 << 6,\n guildVoiceStates: 1 << 7,\n guildPresences: 1 << 8,\n guildMessages: 1 << 9,\n guildMessage: 1 << 9,\n guildMessageReactions: 1 << 10,\n guildMessageTyping: 1 << 11,\n directMessages: 1 << 12,\n directMessageReactions: 1 << 13,\n directMessageTyping: 1 << 14,\n messageContent: 1 << 15,\n guildScheduledEvents: 1 << 16,\n autoModerationConfiguration: 1 << 20,\n autoModerationExecution: 1 << 21,\n guildMessagePolls: 1 << 24,\n directMessagePolls: 1 << 25,\n} as const;\n\n/** Alias for IntentBits. */\nexport const Intents = IntentBits;\n\n/** Gateway intent resolvable value (single bitfield, enum key, or array of bitfields/strings). */\nexport type GatewayIntentResolvable =\n | number\n | keyof typeof GatewayIntentBits\n | keyof typeof IntentBits\n | (\n | number\n | keyof typeof GatewayIntentBits\n | keyof typeof IntentBits\n | string\n )[]\n | { readonly bitfield: number };\n\n/** Resolves any GatewayIntentResolvable into a raw bitfield integer. */\nexport function resolveGatewayIntents(\n intents: GatewayIntentResolvable,\n): number {\n if (typeof intents === \"number\") return intents;\n if (intents && typeof intents === \"object\" && !Array.isArray(intents))\n return intents.bitfield;\n if (Array.isArray(intents)) {\n return intents.reduce<number>((acc, intent) => {\n return acc | resolveGatewayIntents(intent as any);\n }, 0);\n }\n if (typeof intents === \"string\") {\n if (intents in GatewayIntentBits)\n return (GatewayIntentBits as Record<string, number>)[intents]!;\n if (intents in IntentBits)\n return (IntentBits as Record<string, number>)[intents]!;\n const lower = intents.charAt(0).toLowerCase() + intents.slice(1);\n if (lower in IntentBits)\n return (IntentBits as Record<string, number>)[lower]!;\n const num = Number(intents);\n if (!Number.isNaN(num)) return num;\n }\n return 0;\n}\n\n/**\n * Discord.js-familiar intent bitfield.\n * @example new IntentsBitField([IntentsBitField.Flags.Guilds, \"GuildMessages\"])\n */\nexport class IntentsBitField {\n /** Intent flag values by name. */\n public static readonly Flags = GatewayIntentBits;\n /** Raw intent bitfield. */\n public bitfield: number;\n\n public constructor(bits: GatewayIntentResolvable = 0) {\n this.bitfield = resolveGatewayIntents(bits);\n }\n\n /** Whether every given intent is set. */\n public has(bits: GatewayIntentResolvable): boolean {\n const resolved = resolveGatewayIntents(bits);\n return (this.bitfield & resolved) === resolved;\n }\n\n /** Whether any given intent is set. */\n public any(bits: GatewayIntentResolvable): boolean {\n return (this.bitfield & resolveGatewayIntents(bits)) !== 0;\n }\n\n /** Adds intents in place. @returns This bitfield. */\n public add(...bits: GatewayIntentResolvable[]): this {\n for (const bit of bits) this.bitfield |= resolveGatewayIntents(bit);\n return this;\n }\n\n /** Removes intents in place. @returns This bitfield. */\n public remove(...bits: GatewayIntentResolvable[]): this {\n for (const bit of bits) this.bitfield &= ~resolveGatewayIntents(bit);\n return this;\n }\n\n /** Names of the set intents. */\n public toArray(): (keyof typeof GatewayIntentBits)[] {\n return (\n Object.keys(GatewayIntentBits) as (keyof typeof GatewayIntentBits)[]\n ).filter((name) => this.has(GatewayIntentBits[name]));\n }\n\n /** Whether this equals another bitfield. */\n public equals(bits: GatewayIntentResolvable): boolean {\n return this.bitfield === resolveGatewayIntents(bits);\n }\n\n public valueOf(): number {\n return this.bitfield;\n }\n\n public toJSON(): number {\n return this.bitfield;\n }\n}\n\n// ─── Gateway Config ───────────────────────────────────────────────────────────\n\n/** Gateway connection properties (OS, browser, device). */\nexport interface GatewayProperties {\n os?: string;\n browser?: string;\n device?: string;\n [key: string]: unknown;\n}\n/** Gateway presence activity. */\nexport interface GatewayPresenceActivity {\n name: string;\n type?: number;\n url?: string;\n state?: string;\n}\n/** Gateway presence data. */\nexport interface GatewayPresence {\n status?: \"online\" | \"dnd\" | \"idle\" | \"invisible\" | \"offline\";\n activities?: GatewayPresenceActivity[];\n afk?: boolean;\n since?: number | null;\n}\n/** Client configuration. */\nexport interface ClientOptions {\n token: string;\n intents: GatewayIntentResolvable;\n gateway?: GatewayOptions;\n rest?: RESTOptions;\n /** Opt-in bounded per-channel message cache. Messages are not cached by default. */\n messageCache?: { maxSize?: number; ttl?: number };\n /**\n * Which resources the client keeps from Gateway events. Everything is\n * cached by default; large bots can turn off what they do not read.\n * Events are still emitted either way.\n */\n cache?: {\n users?: boolean;\n members?: boolean;\n roles?: boolean;\n emojis?: boolean;\n };\n}\n/** Gateway connection configuration. */\nexport interface GatewayOptions {\n intents?: GatewayIntentResolvable;\n reconnect?: boolean;\n maxReconnectAttempts?: number;\n reconnectBaseDelay?: number;\n reconnectMaxDelay?: number;\n shardId?: number;\n shardCount?: number;\n properties?: GatewayProperties;\n presence?: GatewayPresence;\n}\n\n/** REST request configuration. */\nexport interface RESTOptions {\n timeout?: number;\n retries?: number;\n baseURL?: string;\n}\n",
|
|
6
|
-
"/** Discord API snowflake identifier. */\nexport type Snowflake = string;\n\nexport * from \"./gateway.js\";\nexport * from \"./gateway-events.js\";\n\n// ─── Core Discord Objects ─────────────────────────────────────────────────────\n\n/** Discord user object. */\nexport interface UserData {\n id: Snowflake;\n username: string;\n discriminator?: string;\n global_name?: string | null;\n avatar?: string | null;\n bot?: boolean;\n system?: boolean;\n public_flags?: number;\n}\n/** Current authenticated bot user. */\nexport type ClientUser = UserData;\n/** Discord Gateway payload envelope. */\nexport interface GatewayPayload<T = unknown> {\n op: number;\n d: T | null;\n s: number | null;\n t: string | null;\n}\n/** Generic Discord API error payload. */\nexport interface APIError {\n code?: number;\n message?: string;\n errors?: Record<string, unknown>;\n}\n\n// ─── Discord Flags & Enums ────────────────────────────────────────────────────\n\n/** Discord message flags. */\nexport const MessageFlags = {\n Crossposted: 1,\n IsCrosspost: 2,\n SuppressEmbeds: 4,\n SourceMessageDeleted: 8,\n Urgent: 16,\n HasThread: 32,\n Ephemeral: 64,\n Loading: 128,\n IsComponentsV2: 32768,\n} as const;\n/** One {@link MessageFlags} value, usable as a type. */\nexport type MessageFlags = (typeof MessageFlags)[keyof typeof MessageFlags];\n\n/** Discord channel types. */\nexport const ChannelType = {\n GuildText: 0,\n DM: 1,\n GuildVoice: 2,\n GroupDM: 3,\n GuildCategory: 4,\n GuildAnnouncement: 5,\n AnnouncementThread: 10,\n PublicThread: 11,\n PrivateThread: 12,\n GuildStageVoice: 13,\n GuildDirectory: 14,\n GuildForum: 15,\n GuildMedia: 16,\n} as const;\n\n/** Discord component types. */\nexport const ComponentType = {\n ActionRow: 1,\n Button: 2,\n StringSelect: 3,\n TextInput: 4,\n UserSelect: 5,\n RoleSelect: 6,\n MentionableSelect: 7,\n ChannelSelect: 8,\n Section: 9,\n TextDisplay: 10,\n Thumbnail: 11,\n MediaGallery: 12,\n File: 13,\n Separator: 14,\n ContentInventoryEntry: 16,\n Container: 17,\n} as const;\n/** One {@link ComponentType} value, usable as a type. */\nexport type ComponentType = (typeof ComponentType)[keyof typeof ComponentType];\n\n/** Discord button style types. */\nexport const ButtonStyle = {\n Primary: 1,\n Secondary: 2,\n Success: 3,\n Danger: 4,\n Link: 5,\n Premium: 6,\n} as const;\n/** One {@link ButtonStyle} value, usable as a type: `style: ButtonStyle`. */\nexport type ButtonStyle = (typeof ButtonStyle)[keyof typeof ButtonStyle];\n\n/** Discord text input style types. */\nexport const TextInputStyle = {\n Short: 1,\n Paragraph: 2,\n} as const;\n/** One {@link TextInputStyle} value, usable as a type. */\nexport type TextInputStyle =\n (typeof TextInputStyle)[keyof typeof TextInputStyle];\n\n/** Discord interaction response types. */\nexport const InteractionResponseType = {\n Pong: 1,\n ChannelMessage: 4,\n DeferredChannelMessage: 5,\n DeferredMessageUpdate: 6,\n MessageUpdate: 7,\n Autocomplete: 8,\n Modal: 9,\n} as const;\n\n/** Discord sticker format types. */\nexport const StickerFormatType = {\n PNG: 1,\n APNG: 2,\n Lottie: 3,\n GIF: 4,\n} as const;\n\n/** Discord sticker types. */\nexport const StickerType = {\n Standard: 1,\n Guild: 2,\n} as const;\n\n/** Discord verification levels. */\nexport const VerificationLevel = {\n None: 0,\n Low: 1,\n Medium: 2,\n High: 3,\n VeryHigh: 4,\n} as const;\n\n/** Discord premium tiers. */\nexport const PremiumTier = {\n None: 0,\n Tier1: 1,\n Tier2: 2,\n Tier3: 3,\n} as const;\n\n// ─── Embeds ───────────────────────────────────────────────────────────────────\n\n/** Raw Discord embed footer object. */\nexport interface APIEmbedFooter {\n text: string;\n icon_url?: string;\n proxy_icon_url?: string;\n}\n/** Raw Discord embed image/thumbnail/video object. */\nexport interface APIEmbedMedia {\n url: string;\n proxy_url?: string;\n height?: number;\n width?: number;\n}\n/** Raw Discord embed provider object. */\nexport interface APIEmbedProvider {\n name?: string;\n url?: string;\n}\n/** Raw Discord embed author object. */\nexport interface APIEmbedAuthor {\n name: string;\n url?: string;\n icon_url?: string;\n proxy_icon_url?: string;\n}\n/** Raw Discord embed field object. */\nexport interface APIEmbedField {\n name: string;\n value: string;\n inline?: boolean;\n}\n/** Raw Discord embed object. */\nexport interface APIEmbed {\n title?: string;\n type?: string;\n description?: string;\n url?: string;\n timestamp?: string;\n color?: number;\n footer?: APIEmbedFooter;\n image?: APIEmbedMedia;\n thumbnail?: APIEmbedMedia;\n video?: APIEmbedMedia;\n provider?: APIEmbedProvider;\n author?: APIEmbedAuthor;\n fields?: APIEmbedField[];\n}\n\n// ─── Message Components ───────────────────────────────────────────────────────\n\n/** Raw Discord select menu option. */\nexport interface APISelectMenuOption {\n label: string;\n value: string;\n description?: string;\n emoji?: APIPartialEmoji;\n default?: boolean;\n}\n/** Raw Discord emoji (partial, as used in components). */\nexport interface APIPartialEmoji {\n id?: Snowflake | null;\n name?: string | null;\n animated?: boolean;\n}\n/** Raw Discord button component. */\nexport interface APIButtonComponent {\n type: 2;\n style: number;\n label?: string;\n emoji?: APIPartialEmoji;\n custom_id?: string;\n url?: string;\n sku_id?: string;\n disabled?: boolean;\n}\n/** Raw Discord select menu component. */\nexport interface APISelectMenuComponent {\n type: 3 | 5 | 6 | 7 | 8;\n custom_id: string;\n options?: APISelectMenuOption[];\n channel_types?: number[];\n placeholder?: string;\n min_values?: number;\n max_values?: number;\n disabled?: boolean;\n}\n/** Raw Discord text input component. */\nexport interface APITextInputComponent {\n type: 4;\n custom_id: string;\n style: number;\n label: string;\n min_length?: number;\n max_length?: number;\n required?: boolean;\n value?: string;\n placeholder?: string;\n}\n/** Union of all raw message component types. */\nexport type APIMessageActionRowComponent =\n APIButtonComponent | APISelectMenuComponent | APITextInputComponent;\n/** Raw Discord action row component. */\nexport interface APIActionRowComponent {\n type: 1;\n id?: number;\n components: APIMessageActionRowComponent[];\n}\n/** Union including action rows and V2 components. */\nexport type APIMessageComponent =\n APIActionRowComponent | { type: Exclude<number, 1>; [key: string]: any };\n\n// ─── Attachments ─────────────────────────────────────────────────────────────\n\n/** Raw Discord attachment object. */\nexport interface APIAttachment {\n id: Snowflake;\n filename: string;\n description?: string | null;\n content_type?: string;\n size: number;\n url: string;\n proxy_url: string;\n height?: number | null;\n width?: number | null;\n ephemeral?: boolean;\n duration_secs?: number;\n waveform?: string;\n flags?: number;\n}\n\n// ─── Stickers ────────────────────────────────────────────────────────────────\n\n/** Compact sticker item as included in messages. */\nexport interface APIStickerItem {\n id: Snowflake;\n name: string;\n format_type: number;\n}\n/** Full Discord sticker object. */\nexport interface APISticker {\n id: Snowflake;\n pack_id?: Snowflake;\n name: string;\n description?: string | null;\n tags?: string;\n type: number;\n format_type: number;\n available?: boolean;\n guild_id?: Snowflake;\n user?: UserData;\n sort_value?: number;\n}\n\n// ─── Messages ────────────────────────────────────────────────────────────────\n\n/** Raw Discord message reference. */\nexport interface APIMessageReference {\n type?: number;\n message_id?: Snowflake;\n channel_id?: Snowflake;\n guild_id?: Snowflake;\n fail_if_not_exists?: boolean;\n}\n/** Raw Discord message reaction. */\nexport interface APIMessageReaction {\n count: number;\n count_details?: Record<string, number>;\n me?: boolean;\n me_burst?: boolean;\n emoji: APIPartialEmoji;\n burst_colors?: string[];\n}\n/** Raw Discord message object. */\nexport interface APIMessage {\n id: Snowflake;\n channel_id: Snowflake;\n author: UserData;\n content: string;\n timestamp?: string;\n edited_timestamp?: string | null;\n tts?: boolean;\n mention_everyone?: boolean;\n mentions?: UserData[];\n mention_roles?: Snowflake[];\n mention_channels?: Array<Record<string, unknown>>;\n attachments?: APIAttachment[];\n embeds?: APIEmbed[];\n reactions?: APIMessageReaction[];\n nonce?: string | number | null;\n pinned?: boolean;\n webhook_id?: Snowflake;\n type?: number;\n activity?: Record<string, unknown>;\n application?: Record<string, unknown>;\n application_id?: Snowflake;\n message_reference?: APIMessageReference;\n flags?: number;\n referenced_message?: APIMessage | null;\n interaction_metadata?: Record<string, unknown>;\n thread?: Record<string, unknown>;\n components?: APIMessageComponent[];\n sticker_items?: APIStickerItem[];\n stickers?: APISticker[];\n position?: number;\n role_subscription_data?: Record<string, unknown>;\n purchase_notification?: Record<string, unknown>;\n poll?: Record<string, unknown>;\n guild_id?: Snowflake;\n /** The author's guild member, on guild messages from the Gateway (without `user`; the author is the user). */\n member?: Omit<APIGuildMember, \"user\"> & { user?: UserData };\n}\n\n// ─── Channels ────────────────────────────────────────────────────────────────\n\n/** Raw Discord channel object. */\nexport interface APIChannel {\n id: Snowflake;\n type: number;\n guild_id?: Snowflake;\n position?: number;\n permission_overwrites?: APIOverwrite[];\n name?: string | null;\n topic?: string | null;\n nsfw?: boolean;\n last_message_id?: Snowflake | null;\n bitrate?: number;\n user_limit?: number;\n rate_limit_per_user?: number;\n recipients?: UserData[];\n icon?: string | null;\n owner_id?: Snowflake;\n application_id?: Snowflake;\n parent_id?: Snowflake | null;\n last_pin_timestamp?: string | null;\n rtc_region?: string | null;\n video_quality_mode?: number;\n message_count?: number;\n member_count?: number;\n thread_metadata?: APIThreadMetadata;\n default_auto_archive_duration?: number;\n flags?: number;\n total_message_sent?: number;\n available_tags?: APIForumTag[];\n default_reaction_emoji?: APIPartialEmoji | null;\n default_thread_rate_limit_per_user?: number;\n default_sort_order?: number | null;\n default_forum_layout?: number;\n}\n\n/** Raw Discord thread metadata. */\nexport interface APIThreadMetadata {\n archived: boolean;\n auto_archive_duration: number;\n archive_timestamp: string;\n locked: boolean;\n invitable?: boolean;\n create_timestamp?: string | null;\n}\n\n/** Raw Discord forum tag. */\nexport interface APIForumTag {\n id: Snowflake;\n name: string;\n moderated: boolean;\n emoji_id?: Snowflake | null;\n emoji_name?: string | null;\n}\n\n/** Raw Discord thread member. */\nexport interface APIThreadMember {\n id?: Snowflake;\n user_id?: Snowflake;\n join_timestamp: string;\n flags: number;\n member?: APIGuildMember;\n}\n\n// ─── Roles ────────────────────────────────────────────────────────────────────\n\n/** Raw Discord role object. */\nexport interface APIRole {\n id: Snowflake;\n name: string;\n color: number;\n hoist: boolean;\n icon?: string | null;\n unicode_emoji?: string | null;\n position: number;\n permissions: string;\n managed: boolean;\n mentionable: boolean;\n tags?: Record<string, unknown>;\n flags?: number;\n}\n\n// ─── Emoji ────────────────────────────────────────────────────────────────────\n\n/** Raw Discord emoji object. */\nexport interface APIEmoji {\n id: Snowflake | null;\n name: string | null;\n roles?: Snowflake[];\n user?: UserData;\n require_colons?: boolean;\n managed?: boolean;\n animated?: boolean;\n available?: boolean;\n}\n\n// ─── Guilds ───────────────────────────────────────────────────────────────────\n\n/** Raw Discord guild object. */\nexport interface APIGuild {\n id: Snowflake;\n name: string;\n icon?: string | null;\n icon_hash?: string | null;\n splash?: string | null;\n discovery_splash?: string | null;\n owner?: boolean;\n owner_id?: Snowflake;\n permissions?: string;\n afk_channel_id?: Snowflake | null;\n afk_timeout?: number;\n widget_enabled?: boolean;\n widget_channel_id?: Snowflake | null;\n verification_level?: number;\n default_message_notifications?: number;\n explicit_content_filter?: number;\n roles?: APIRole[];\n emojis?: APIEmoji[];\n stickers?: APISticker[];\n features?: string[];\n mfa_level?: number;\n application_id?: Snowflake | null;\n system_channel_id?: Snowflake | null;\n system_channel_flags?: number;\n rules_channel_id?: Snowflake | null;\n max_presences?: number | null;\n max_members?: number;\n vanity_url_code?: string | null;\n description?: string | null;\n banner?: string | null;\n premium_tier?: number;\n premium_subscription_count?: number;\n preferred_locale?: string;\n public_updates_channel_id?: Snowflake | null;\n max_video_channel_users?: number;\n approximate_member_count?: number;\n approximate_presence_count?: number;\n nsfw_level?: number;\n safety_alerts_channel_id?: Snowflake | null;\n member_count?: number;\n}\n\n// ─── Welcome Screen ───────────────────────────────────────────────────────────\n\nexport interface APIWelcomeScreenChannel {\n channel_id: Snowflake;\n description: string;\n emoji_id: Snowflake | null;\n emoji_name: string | null;\n}\n\nexport interface APIGuildWelcomeScreen {\n description: string | null;\n welcome_channels: APIWelcomeScreenChannel[];\n}\n\n// ─── Guild Onboarding ─────────────────────────────────────────────────────────\n\nexport interface APIOnboardingPromptOption {\n id: Snowflake;\n channel_ids: Snowflake[];\n role_ids: Snowflake[];\n emoji?: APIPartialEmoji;\n title: string;\n description: string | null;\n}\n\nexport interface APIOnboardingPrompt {\n id: Snowflake;\n type: number;\n options: APIOnboardingPromptOption[];\n title: string;\n single_select: boolean;\n required: boolean;\n in_onboarding: boolean;\n}\n\nexport interface APIGuildOnboarding {\n guild_id: Snowflake;\n prompts: APIOnboardingPrompt[];\n default_channel_ids: Snowflake[];\n enabled: boolean;\n mode: number;\n}\n\n/** Raw Discord guild member object. */\nexport interface APIGuildMember {\n user: UserData;\n nick?: string | null;\n avatar?: string | null;\n roles: Snowflake[];\n joined_at: string;\n premium_since?: string | null;\n deaf?: boolean;\n mute?: boolean;\n flags?: number;\n pending?: boolean;\n permissions?: string;\n communication_disabled_until?: string | null;\n guild_id?: Snowflake;\n}\n\n// ─── Voice ────────────────────────────────────────────────────────────────────\n\n/** Raw Discord voice state object. */\nexport interface APIVoiceState {\n guild_id?: Snowflake;\n channel_id?: Snowflake | null;\n user_id: Snowflake;\n member?: APIGuildMember;\n session_id: string;\n deaf: boolean;\n mute: boolean;\n self_deaf: boolean;\n self_mute: boolean;\n self_stream?: boolean;\n self_video: boolean;\n suppress: boolean;\n request_to_speak_timestamp?: string | null;\n}\n\n/** Raw Discord voice server update event. */\nexport interface APIVoiceServerUpdate {\n token: string;\n guild_id: Snowflake;\n endpoint?: string | null;\n}\n\n// ─── Presence ────────────────────────────────────────────────────────────────\n\n/** Raw Discord activity object. */\nexport interface APIActivity {\n name: string;\n type: number;\n url?: string | null;\n created_at: number;\n state?: string | null;\n details?: string | null;\n emoji?: APIPartialEmoji | null;\n}\n\n/** Raw Discord presence update event. */\nexport interface APIPresenceUpdate {\n user: { id: Snowflake } & Partial<UserData>;\n guild_id: Snowflake;\n status: string;\n activities: APIActivity[];\n client_status: { desktop?: string; mobile?: string; web?: string };\n}\n\n// ─── Typing ───────────────────────────────────────────────────────────────────\n\n/** Raw Discord typing start event. */\nexport interface APITypingStart {\n channel_id: Snowflake;\n guild_id?: Snowflake;\n user_id: Snowflake;\n timestamp: number;\n member?: APIGuildMember;\n}\n\n// ─── Guilds ──────────────────────────────────────────────────────────────────\n\n/** Raw Discord guild preview. */\nexport interface APIGuildPreview {\n id: Snowflake;\n name: string;\n icon: string | null;\n splash: string | null;\n discovery_splash: string | null;\n emojis: unknown[];\n features: string[];\n approximate_member_count: number;\n approximate_presence_count: number;\n description: string | null;\n stickers: unknown[];\n}\n\n// ─── Invites ─────────────────────────────────────────────────────────────────\n\n/** Raw Discord invite. */\nexport interface APIInvite {\n code: string;\n guild?: Partial<APIGuild>;\n channel: Partial<APIChannel>;\n inviter?: UserData;\n target_type?: number;\n target_user?: UserData;\n approximate_presence_count?: number;\n approximate_member_count?: number;\n}\n\n/** Raw Discord invite create event. */\nexport interface APIInviteCreate {\n channel_id: Snowflake;\n code: string;\n created_at: string;\n guild_id?: Snowflake;\n inviter?: UserData;\n max_age: number;\n max_uses: number;\n target_type?: number;\n target_user?: UserData;\n temporary: boolean;\n uses: number;\n}\n\n/** Raw Discord invite delete event. */\nexport interface APIInviteDelete {\n channel_id: Snowflake;\n guild_id?: Snowflake;\n code: string;\n}\n\n// ─── Webhooks ────────────────────────────────────────────────────────────────\n\n/** Raw Discord webhooks update event. */\nexport interface APIWebhooksUpdate {\n guild_id: Snowflake;\n channel_id: Snowflake;\n}\n\n/** Raw Discord webhook object. */\nexport interface APIWebhook {\n id: Snowflake;\n type: number;\n guild_id?: Snowflake | null;\n channel_id?: Snowflake | null;\n user?: UserData;\n name?: string | null;\n avatar?: string | null;\n token?: string;\n application_id?: Snowflake | null;\n url?: string;\n}\n\n// ─── AutoMod ─────────────────────────────────────────────────────────────────\n\n/** Raw Discord AutoMod action. */\nexport interface APIAutoModerationAction {\n type: number;\n metadata?: {\n channel_id?: Snowflake;\n duration_seconds?: number;\n custom_message?: string;\n };\n}\n\n// ─── Audit Logs ──────────────────────────────────────────────────────────────\n\n/** Raw Discord audit log change object. */\nexport interface APIAuditLogChange {\n new_value?: unknown;\n old_value?: unknown;\n key: string;\n}\n\n/** Raw Discord audit log entry options object. */\nexport interface APIAuditLogOptions {\n app_id?: Snowflake;\n auto_moderation_rule_name?: string;\n auto_moderation_rule_trigger_type?: string;\n channel_id?: Snowflake;\n count?: string;\n delete_member_days?: string;\n id?: Snowflake;\n members_removed?: string;\n message_id?: Snowflake;\n role_name?: string;\n type?: string;\n integration_type?: string;\n}\n\n/** Raw Discord audit log entry object. */\nexport interface APIAuditLogEntry {\n target_id: string | null;\n changes?: APIAuditLogChange[];\n user_id: Snowflake | null;\n id: Snowflake;\n action_type: number;\n options?: APIAuditLogOptions;\n reason?: string;\n}\n\n/** Raw Discord audit log object. */\nexport interface APIAuditLog {\n audit_log_entries: APIAuditLogEntry[];\n guild_scheduled_events: APIGuildScheduledEvent[];\n integrations: Array<Record<string, unknown>>;\n threads: APIChannel[];\n users: UserData[];\n webhooks: APIWebhook[];\n application_commands: APIApplicationCommand[];\n auto_moderation_rules: APIAutoModerationRule[];\n}\n\n/** Raw Discord AutoMod rule object. */\nexport interface APIAutoModerationRule {\n id: Snowflake;\n guild_id: Snowflake;\n name: string;\n creator_id: Snowflake;\n event_type: number;\n trigger_type: number;\n trigger_metadata: Record<string, unknown>;\n actions: APIAutoModerationAction[];\n enabled: boolean;\n exempt_roles: Snowflake[];\n exempt_channels: Snowflake[];\n}\n\n/** Raw Discord AutoMod action execution event. */\nexport interface APIAutoModerationActionExecution {\n guild_id: Snowflake;\n action: APIAutoModerationAction;\n rule_id: Snowflake;\n rule_trigger_type: number;\n user_id: Snowflake;\n channel_id?: Snowflake;\n message_id?: Snowflake;\n alert_system_message_id?: Snowflake;\n content: string;\n matched_keyword?: string | null;\n matched_content?: string | null;\n}\n\n// ─── Scheduled Events ─────────────────────────────────────────────────────────\n\n/** Raw Discord guild scheduled event entity metadata. */\nexport interface APIGuildScheduledEventEntityMetadata {\n location?: string;\n}\n\n/** Raw Discord guild scheduled event object. */\nexport interface APIGuildScheduledEvent {\n id: Snowflake;\n guild_id: Snowflake;\n channel_id?: Snowflake | null;\n creator_id?: Snowflake | null;\n name: string;\n description?: string | null;\n scheduled_start_time: string;\n scheduled_end_time?: string | null;\n privacy_level: number;\n status: number;\n entity_type: number;\n entity_id?: Snowflake | null;\n entity_metadata?: APIGuildScheduledEventEntityMetadata | null;\n creator?: UserData;\n user_count?: number;\n image?: string | null;\n}\n\n// ─── Stage Instances ─────────────────────────────────────────────────────────\n\n/** Raw Discord stage instance object. */\nexport interface APIStageInstance {\n id: Snowflake;\n guild_id: Snowflake;\n channel_id: Snowflake;\n topic: string;\n privacy_level: number;\n discoverable_disabled?: boolean;\n guild_scheduled_event_id?: Snowflake | null;\n}\n\n// ─── Application Commands ─────────────────────────────────────────────────────\n\n/** Discord application command option types. */\nexport const ApplicationCommandOptionType = {\n SubCommand: 1,\n SubCommandGroup: 2,\n String: 3,\n Integer: 4,\n Boolean: 5,\n User: 6,\n Channel: 7,\n Role: 8,\n Mentionable: 9,\n Number: 10,\n Attachment: 11,\n} as const;\n\n/** Discord application command types. */\nexport const ApplicationCommandType = {\n ChatInput: 1,\n User: 2,\n Message: 3,\n} as const;\n\n/** Raw Discord application command option. */\nexport interface APIApplicationCommandOption {\n type: number;\n name: string;\n description: string;\n required?: boolean;\n choices?: Array<{ name: string; value: string | number }>;\n options?: APIApplicationCommandOption[];\n min_value?: number;\n max_value?: number;\n min_length?: number;\n max_length?: number;\n autocomplete?: boolean;\n channel_types?: number[];\n}\n\n/** Raw Discord application command object (from API). */\nexport interface APIApplicationCommand {\n id: Snowflake;\n type?: number;\n application_id: Snowflake;\n guild_id?: Snowflake;\n name: string;\n description: string;\n options?: APIApplicationCommandOption[];\n default_member_permissions?: string | null;\n dm_permission?: boolean;\n nsfw?: boolean;\n version: Snowflake;\n}\n\n/** Data for creating/overwriting an application command. */\nexport interface ApplicationCommandData {\n name: string;\n description: string;\n type?: number;\n options?: APIApplicationCommandOption[];\n default_member_permissions?: string | null;\n dm_permission?: boolean;\n nsfw?: boolean;\n}\n\n/** A channel permission overwrite for a role (type 0) or member (type 1). */\nexport interface APIOverwrite {\n id: Snowflake;\n type: 0 | 1;\n /** Allowed permission bits as a decimal string. */\n allow: string;\n /** Denied permission bits as a decimal string. */\n deny: string;\n}\n\n// ─── Soundboard & Monetization ───────────────────────────────────────────────\n/** Raw Discord soundboard sound. */\nexport interface APISoundboardSound {\n sound_id: string;\n name: string;\n volume: number;\n emoji_id: string | null;\n emoji_name: string | null;\n guild_id?: string;\n available: boolean;\n user?: UserData;\n}\n\n/** Raw Discord SKU. */\nexport interface APISKU {\n id: string;\n type: number;\n application_id: string;\n name: string;\n slug: string;\n flags: number;\n}\n\n/** Raw Discord entitlement. */\nexport interface APIEntitlement {\n id: string;\n sku_id: string;\n application_id: string;\n user_id?: string;\n guild_id?: string;\n type: number;\n deleted: boolean;\n starts_at?: string | null;\n ends_at?: string | null;\n consumed?: boolean;\n}\n\n/** Raw Discord subscription. */\nexport interface APISubscription {\n id: string;\n user_id: string;\n sku_ids: string[];\n entitlement_ids: string[];\n current_period_start: string;\n current_period_end: string;\n status: number;\n canceled_at: string | null;\n country?: string;\n}\n"
|
|
5
|
+
"// ─── Gateway Intents ─────────────────────────────────────────────────────────\n\n/** Gateway intent bit flags supported by Discord (PascalCase). */\nexport const GatewayIntentBits = {\n Guilds: 1 << 0,\n GuildMembers: 1 << 1,\n GuildModeration: 1 << 2,\n GuildExpressions: 1 << 3,\n GuildIntegrations: 1 << 4,\n GuildWebhooks: 1 << 5,\n GuildInvites: 1 << 6,\n GuildVoiceStates: 1 << 7,\n GuildPresences: 1 << 8,\n GuildMessages: 1 << 9,\n GuildMessageReactions: 1 << 10,\n GuildMessageTyping: 1 << 11,\n DirectMessages: 1 << 12,\n DirectMessageReactions: 1 << 13,\n DirectMessageTyping: 1 << 14,\n MessageContent: 1 << 15,\n GuildScheduledEvents: 1 << 16,\n AutoModerationConfiguration: 1 << 20,\n AutoModerationExecution: 1 << 21,\n GuildMessagePolls: 1 << 24,\n DirectMessagePolls: 1 << 25,\n} as const;\n\n/** Idiomatic camelCase Gateway intent bit flags supported by Discord. */\nexport const IntentBits = {\n guild: 1 << 0,\n guilds: 1 << 0,\n guildMembers: 1 << 1,\n guildModeration: 1 << 2,\n guildBans: 1 << 2,\n guildExpressions: 1 << 3,\n guildEmojis: 1 << 3,\n guildEmojisAndStickers: 1 << 3,\n guildIntegrations: 1 << 4,\n guildWebhooks: 1 << 5,\n guildInvites: 1 << 6,\n guildVoiceStates: 1 << 7,\n guildPresences: 1 << 8,\n guildMessages: 1 << 9,\n guildMessage: 1 << 9,\n guildMessageReactions: 1 << 10,\n guildMessageTyping: 1 << 11,\n directMessages: 1 << 12,\n directMessageReactions: 1 << 13,\n directMessageTyping: 1 << 14,\n messageContent: 1 << 15,\n guildScheduledEvents: 1 << 16,\n autoModerationConfiguration: 1 << 20,\n autoModerationExecution: 1 << 21,\n guildMessagePolls: 1 << 24,\n directMessagePolls: 1 << 25,\n} as const;\n\n/** Alias for IntentBits. */\nexport const Intents = IntentBits;\n\n/** Gateway intent resolvable value (single bitfield, enum key, or array of bitfields/strings). */\nexport type GatewayIntentResolvable =\n | number\n | keyof typeof GatewayIntentBits\n | keyof typeof IntentBits\n | (\n | number\n | keyof typeof GatewayIntentBits\n | keyof typeof IntentBits\n | string\n )[]\n | { readonly bitfield: number };\n\n/** Resolves any GatewayIntentResolvable into a raw bitfield integer. */\nexport function resolveGatewayIntents(\n intents: GatewayIntentResolvable,\n): number {\n if (typeof intents === \"number\") return intents;\n if (intents && typeof intents === \"object\" && !Array.isArray(intents))\n return intents.bitfield;\n if (Array.isArray(intents)) {\n return intents.reduce<number>((acc, intent) => {\n return acc | resolveGatewayIntents(intent as any);\n }, 0);\n }\n if (typeof intents === \"string\") {\n if (intents in GatewayIntentBits)\n return (GatewayIntentBits as Record<string, number>)[intents]!;\n if (intents in IntentBits)\n return (IntentBits as Record<string, number>)[intents]!;\n const lower = intents.charAt(0).toLowerCase() + intents.slice(1);\n if (lower in IntentBits)\n return (IntentBits as Record<string, number>)[lower]!;\n const num = Number(intents);\n if (!Number.isNaN(num)) return num;\n }\n return 0;\n}\n\n/**\n * Discord.js-familiar intent bitfield.\n * @example new IntentsBitField([IntentsBitField.Flags.Guilds, \"GuildMessages\"])\n */\nexport class IntentsBitField {\n /** Intent flag values by name. */\n public static readonly Flags = GatewayIntentBits;\n /** Raw intent bitfield. */\n public bitfield: number;\n\n public constructor(bits: GatewayIntentResolvable = 0) {\n this.bitfield = resolveGatewayIntents(bits);\n }\n\n /** Whether every given intent is set. */\n public has(bits: GatewayIntentResolvable): boolean {\n const resolved = resolveGatewayIntents(bits);\n return (this.bitfield & resolved) === resolved;\n }\n\n /** Whether any given intent is set. */\n public any(bits: GatewayIntentResolvable): boolean {\n return (this.bitfield & resolveGatewayIntents(bits)) !== 0;\n }\n\n /** Adds intents in place. @returns This bitfield. */\n public add(...bits: GatewayIntentResolvable[]): this {\n for (const bit of bits) this.bitfield |= resolveGatewayIntents(bit);\n return this;\n }\n\n /** Removes intents in place. @returns This bitfield. */\n public remove(...bits: GatewayIntentResolvable[]): this {\n for (const bit of bits) this.bitfield &= ~resolveGatewayIntents(bit);\n return this;\n }\n\n /** Names of the set intents. */\n public toArray(): (keyof typeof GatewayIntentBits)[] {\n return (\n Object.keys(GatewayIntentBits) as (keyof typeof GatewayIntentBits)[]\n ).filter((name) => this.has(GatewayIntentBits[name]));\n }\n\n /** Whether this equals another bitfield. */\n public equals(bits: GatewayIntentResolvable): boolean {\n return this.bitfield === resolveGatewayIntents(bits);\n }\n\n public valueOf(): number {\n return this.bitfield;\n }\n\n public toJSON(): number {\n return this.bitfield;\n }\n}\n\n// ─── Gateway Config ───────────────────────────────────────────────────────────\n\n/** Gateway connection properties (OS, browser, device). */\nexport interface GatewayProperties {\n os?: string;\n browser?: string;\n device?: string;\n [key: string]: unknown;\n}\n/** Gateway presence activity. */\nexport interface GatewayPresenceActivity {\n name: string;\n type?: number;\n url?: string;\n state?: string;\n}\n/** Gateway presence data. */\nexport interface GatewayPresence {\n status?: \"online\" | \"dnd\" | \"idle\" | \"invisible\" | \"offline\";\n activities?: GatewayPresenceActivity[];\n afk?: boolean;\n since?: number | null;\n}\n/** Client configuration. */\nexport interface ClientOptions {\n token: string;\n intents: GatewayIntentResolvable;\n gateway?: GatewayOptions;\n rest?: RESTOptions;\n /** Opt-in bounded per-channel message cache. Messages are not cached by default. */\n messageCache?: { maxSize?: number; ttl?: number };\n /**\n * Which resources the client keeps from Gateway events. Everything is\n * cached by default; large bots can turn off what they do not read.\n * Events are still emitted either way.\n */\n cache?: {\n users?: boolean;\n members?: boolean;\n roles?: boolean;\n emojis?: boolean;\n };\n /**\n * Default `allowed_mentions` for every message the client sends (channel\n * send/edit, replies, interaction replies, edits and follow-ups), e.g.\n * `{ parse: [] }` so nothing pings unless a message says so. A message's\n * own `allowed_mentions` always wins.\n */\n allowedMentions?: AllowedMentions;\n}\n/** Discord's `allowed_mentions` object. */\nexport interface AllowedMentions {\n parse?: (\"users\" | \"roles\" | \"everyone\")[];\n users?: string[];\n roles?: string[];\n replied_user?: boolean;\n}\n/** Gateway connection configuration. */\nexport interface GatewayOptions {\n intents?: GatewayIntentResolvable;\n reconnect?: boolean;\n maxReconnectAttempts?: number;\n reconnectBaseDelay?: number;\n reconnectMaxDelay?: number;\n shardId?: number;\n shardCount?: number;\n properties?: GatewayProperties;\n presence?: GatewayPresence;\n}\n\n/** REST request configuration. */\nexport interface RESTOptions {\n timeout?: number;\n retries?: number;\n baseURL?: string;\n}\n",
|
|
6
|
+
"/** Discord API snowflake identifier. */\nexport type Snowflake = string;\n\nexport * from \"./gateway.js\";\nexport * from \"./gateway-events.js\";\n\n// ─── Core Discord Objects ─────────────────────────────────────────────────────\n\n/** Discord user object. */\nexport interface UserData {\n id: Snowflake;\n username: string;\n discriminator?: string;\n global_name?: string | null;\n avatar?: string | null;\n bot?: boolean;\n system?: boolean;\n public_flags?: number;\n}\n/** Current authenticated bot user. */\nexport type ClientUser = UserData;\n/** Discord Gateway payload envelope. */\nexport interface GatewayPayload<T = unknown> {\n op: number;\n d: T | null;\n s: number | null;\n t: string | null;\n}\n/** Generic Discord API error payload. */\nexport interface APIError {\n code?: number;\n message?: string;\n errors?: Record<string, unknown>;\n}\n\n// ─── Discord Flags & Enums ────────────────────────────────────────────────────\n\n/** Discord message flags. */\nexport const MessageFlags = {\n Crossposted: 1,\n IsCrosspost: 2,\n SuppressEmbeds: 4,\n SourceMessageDeleted: 8,\n Urgent: 16,\n HasThread: 32,\n Ephemeral: 64,\n Loading: 128,\n IsComponentsV2: 32768,\n} as const;\n/** One {@link MessageFlags} value, usable as a type. */\nexport type MessageFlags = (typeof MessageFlags)[keyof typeof MessageFlags];\n\n/** Discord channel types. */\nexport const ChannelEnum = {\n GuildText: 0,\n DM: 1,\n GuildVoice: 2,\n GroupDM: 3,\n GuildCategory: 4,\n GuildAnnouncement: 5,\n AnnouncementThread: 10,\n PublicThread: 11,\n PrivateThread: 12,\n GuildStageVoice: 13,\n GuildDirectory: 14,\n GuildForum: 15,\n GuildMedia: 16,\n} as const;\n/** One {@link ChannelEnum} value, usable as a type. */\nexport type ChannelEnum = (typeof ChannelEnum)[keyof typeof ChannelEnum];\n\n/** Discord component types. */\nexport const ComponentEnum = {\n ActionRow: 1,\n Button: 2,\n StringSelect: 3,\n TextInput: 4,\n UserSelect: 5,\n RoleSelect: 6,\n MentionableSelect: 7,\n ChannelSelect: 8,\n Section: 9,\n TextDisplay: 10,\n Thumbnail: 11,\n MediaGallery: 12,\n File: 13,\n Separator: 14,\n ContentInventoryEntry: 16,\n Container: 17,\n} as const;\n/** One {@link ComponentEnum} value, usable as a type. */\nexport type ComponentEnum = (typeof ComponentEnum)[keyof typeof ComponentEnum];\n\n/** Discord button style types. */\nexport const ButtonType = {\n Primary: 1,\n Secondary: 2,\n Success: 3,\n Danger: 4,\n Link: 5,\n Premium: 6,\n} as const;\n/** One {@link ButtonType} value, usable as a type: `style: ButtonType`. */\nexport type ButtonType = (typeof ButtonType)[keyof typeof ButtonType];\n\n/** Discord text input style types. */\nexport const TextInputType = {\n Short: 1,\n Paragraph: 2,\n} as const;\n/** One {@link TextInputType} value, usable as a type. */\nexport type TextInputType = (typeof TextInputType)[keyof typeof TextInputType];\n\n/** Discord interaction response types. */\nexport const InteractionResponseEnum = {\n Pong: 1,\n ChannelMessage: 4,\n DeferredChannelMessage: 5,\n DeferredMessageUpdate: 6,\n MessageUpdate: 7,\n Autocomplete: 8,\n Modal: 9,\n} as const;\n/** One {@link InteractionResponseEnum} value, usable as a type. */\nexport type InteractionResponseEnum =\n (typeof InteractionResponseEnum)[keyof typeof InteractionResponseEnum];\n\n/** Discord sticker format types. */\nexport const StickerFormatEnum = {\n PNG: 1,\n APNG: 2,\n Lottie: 3,\n GIF: 4,\n} as const;\n/** One {@link StickerFormatEnum} value, usable as a type. */\nexport type StickerFormatEnum =\n (typeof StickerFormatEnum)[keyof typeof StickerFormatEnum];\n\n/** Discord sticker types. */\nexport const StickerEnum = {\n Standard: 1,\n Guild: 2,\n} as const;\n/** One {@link StickerEnum} value, usable as a type. */\nexport type StickerEnum = (typeof StickerEnum)[keyof typeof StickerEnum];\n\n/** Discord verification levels. */\nexport const VerificationLevel = {\n None: 0,\n Low: 1,\n Medium: 2,\n High: 3,\n VeryHigh: 4,\n} as const;\n\n/** Discord premium tiers. */\nexport const PremiumTier = {\n None: 0,\n Tier1: 1,\n Tier2: 2,\n Tier3: 3,\n} as const;\n\n// ─── Embeds ───────────────────────────────────────────────────────────────────\n\n/** Raw Discord embed footer object. */\nexport interface APIEmbedFooter {\n text: string;\n icon_url?: string;\n proxy_icon_url?: string;\n}\n/** Raw Discord embed image/thumbnail/video object. */\nexport interface APIEmbedMedia {\n url: string;\n proxy_url?: string;\n height?: number;\n width?: number;\n}\n/** Raw Discord embed provider object. */\nexport interface APIEmbedProvider {\n name?: string;\n url?: string;\n}\n/** Raw Discord embed author object. */\nexport interface APIEmbedAuthor {\n name: string;\n url?: string;\n icon_url?: string;\n proxy_icon_url?: string;\n}\n/** Raw Discord embed field object. */\nexport interface APIEmbedField {\n name: string;\n value: string;\n inline?: boolean;\n}\n/** Raw Discord embed object. */\nexport interface APIEmbed {\n title?: string;\n type?: string;\n description?: string;\n url?: string;\n timestamp?: string;\n color?: number;\n footer?: APIEmbedFooter;\n image?: APIEmbedMedia;\n thumbnail?: APIEmbedMedia;\n video?: APIEmbedMedia;\n provider?: APIEmbedProvider;\n author?: APIEmbedAuthor;\n fields?: APIEmbedField[];\n}\n\n// ─── Message Components ───────────────────────────────────────────────────────\n\n/** Raw Discord select menu option. */\nexport interface APISelectMenuOption {\n label: string;\n value: string;\n description?: string;\n emoji?: APIPartialEmoji;\n default?: boolean;\n}\n/** Raw Discord emoji (partial, as used in components). */\nexport interface APIPartialEmoji {\n id?: Snowflake | null;\n name?: string | null;\n animated?: boolean;\n}\n/** Raw Discord button component. */\nexport interface APIButtonComponent {\n type: 2;\n style: number;\n label?: string;\n emoji?: APIPartialEmoji;\n custom_id?: string;\n url?: string;\n sku_id?: string;\n disabled?: boolean;\n}\n/** Raw Discord select menu component. */\nexport interface APISelectMenuComponent {\n type: 3 | 5 | 6 | 7 | 8;\n custom_id: string;\n options?: APISelectMenuOption[];\n channel_types?: number[];\n placeholder?: string;\n min_values?: number;\n max_values?: number;\n disabled?: boolean;\n}\n/** Raw Discord text input component. */\nexport interface APITextInputComponent {\n type: 4;\n custom_id: string;\n style: number;\n label: string;\n min_length?: number;\n max_length?: number;\n required?: boolean;\n value?: string;\n placeholder?: string;\n}\n/** Union of all raw message component types. */\nexport type APIMessageActionRowComponent =\n APIButtonComponent | APISelectMenuComponent | APITextInputComponent;\n/** Raw Discord action row component. */\nexport interface APIActionRowComponent {\n type: 1;\n id?: number;\n components: APIMessageActionRowComponent[];\n}\n/** Union including action rows and V2 components. */\nexport type APIMessageComponent =\n APIActionRowComponent | { type: Exclude<number, 1>; [key: string]: any };\n\n// ─── Attachments ─────────────────────────────────────────────────────────────\n\n/** Raw Discord attachment object. */\nexport interface APIAttachment {\n id: Snowflake;\n filename: string;\n description?: string | null;\n content_type?: string;\n size: number;\n url: string;\n proxy_url: string;\n height?: number | null;\n width?: number | null;\n ephemeral?: boolean;\n duration_secs?: number;\n waveform?: string;\n flags?: number;\n}\n\n// ─── Stickers ────────────────────────────────────────────────────────────────\n\n/** Compact sticker item as included in messages. */\nexport interface APIStickerItem {\n id: Snowflake;\n name: string;\n format_type: number;\n}\n/** Full Discord sticker object. */\nexport interface APISticker {\n id: Snowflake;\n pack_id?: Snowflake;\n name: string;\n description?: string | null;\n tags?: string;\n type: number;\n format_type: number;\n available?: boolean;\n guild_id?: Snowflake;\n user?: UserData;\n sort_value?: number;\n}\n\n// ─── Messages ────────────────────────────────────────────────────────────────\n\n/** Raw Discord message reference. */\nexport interface APIMessageReference {\n type?: number;\n message_id?: Snowflake;\n channel_id?: Snowflake;\n guild_id?: Snowflake;\n fail_if_not_exists?: boolean;\n}\n/** Raw Discord message reaction. */\nexport interface APIMessageReaction {\n count: number;\n count_details?: Record<string, number>;\n me?: boolean;\n me_burst?: boolean;\n emoji: APIPartialEmoji;\n burst_colors?: string[];\n}\n/** Raw Discord poll object. */\nexport interface APIPoll {\n question: { text?: string; emoji?: APIPartialEmoji };\n answers: Array<{\n answer_id: number;\n poll_media: { text?: string; emoji?: APIPartialEmoji };\n }>;\n expiry: string | null;\n allow_multiselect: boolean;\n layout_type: number;\n results?: {\n is_finalized: boolean;\n answer_counts: Array<{ id: number; count: number; me_voted: boolean }>;\n };\n}\n/** A forwarded message's snapshot of the original. */\nexport interface APIMessageSnapshot {\n message: Partial<\n Pick<\n APIMessage,\n | \"type\"\n | \"content\"\n | \"embeds\"\n | \"attachments\"\n | \"timestamp\"\n | \"edited_timestamp\"\n | \"flags\"\n | \"mentions\"\n | \"mention_roles\"\n | \"sticker_items\"\n | \"components\"\n >\n >;\n}\n/** Raw Discord message object. */\nexport interface APIMessage {\n id: Snowflake;\n channel_id: Snowflake;\n author: UserData;\n content: string;\n timestamp?: string;\n edited_timestamp?: string | null;\n tts?: boolean;\n mention_everyone?: boolean;\n mentions?: UserData[];\n mention_roles?: Snowflake[];\n mention_channels?: Array<Record<string, unknown>>;\n attachments?: APIAttachment[];\n embeds?: APIEmbed[];\n reactions?: APIMessageReaction[];\n nonce?: string | number | null;\n pinned?: boolean;\n webhook_id?: Snowflake;\n type?: number;\n activity?: Record<string, unknown>;\n application?: Record<string, unknown>;\n application_id?: Snowflake;\n message_reference?: APIMessageReference;\n flags?: number;\n referenced_message?: APIMessage | null;\n interaction_metadata?: Record<string, unknown>;\n thread?: Record<string, unknown>;\n components?: APIMessageComponent[];\n sticker_items?: APIStickerItem[];\n stickers?: APISticker[];\n position?: number;\n role_subscription_data?: Record<string, unknown>;\n purchase_notification?: Record<string, unknown>;\n poll?: APIPoll;\n /** Forwarded messages: a partial copy of the original (content, embeds, attachments, …). */\n message_snapshots?: APIMessageSnapshot[];\n guild_id?: Snowflake;\n /** The author's guild member, on guild messages from the Gateway (without `user`; the author is the user). */\n member?: Omit<APIGuildMember, \"user\"> & { user?: UserData };\n}\n\n// ─── Channels ────────────────────────────────────────────────────────────────\n\n/** Raw Discord channel object. */\nexport interface APIChannel {\n id: Snowflake;\n type: number;\n guild_id?: Snowflake;\n position?: number;\n permission_overwrites?: APIOverwrite[];\n name?: string | null;\n topic?: string | null;\n nsfw?: boolean;\n last_message_id?: Snowflake | null;\n bitrate?: number;\n user_limit?: number;\n rate_limit_per_user?: number;\n recipients?: UserData[];\n icon?: string | null;\n owner_id?: Snowflake;\n application_id?: Snowflake;\n parent_id?: Snowflake | null;\n last_pin_timestamp?: string | null;\n rtc_region?: string | null;\n video_quality_mode?: number;\n message_count?: number;\n member_count?: number;\n thread_metadata?: APIThreadMetadata;\n default_auto_archive_duration?: number;\n flags?: number;\n total_message_sent?: number;\n available_tags?: APIForumTag[];\n default_reaction_emoji?: APIPartialEmoji | null;\n default_thread_rate_limit_per_user?: number;\n default_sort_order?: number | null;\n default_forum_layout?: number;\n}\n\n/** Raw Discord thread metadata. */\nexport interface APIThreadMetadata {\n archived: boolean;\n auto_archive_duration: number;\n archive_timestamp: string;\n locked: boolean;\n invitable?: boolean;\n create_timestamp?: string | null;\n}\n\n/** Raw Discord forum tag. */\nexport interface APIForumTag {\n id: Snowflake;\n name: string;\n moderated: boolean;\n emoji_id?: Snowflake | null;\n emoji_name?: string | null;\n}\n\n/** Raw Discord thread member. */\nexport interface APIThreadMember {\n id?: Snowflake;\n user_id?: Snowflake;\n join_timestamp: string;\n flags: number;\n member?: APIGuildMember;\n}\n\n// ─── Roles ────────────────────────────────────────────────────────────────────\n\n/** Raw Discord role object. */\nexport interface APIRole {\n id: Snowflake;\n name: string;\n color: number;\n hoist: boolean;\n icon?: string | null;\n unicode_emoji?: string | null;\n position: number;\n permissions: string;\n managed: boolean;\n mentionable: boolean;\n tags?: Record<string, unknown>;\n flags?: number;\n}\n\n// ─── Emoji ────────────────────────────────────────────────────────────────────\n\n/** Raw Discord emoji object. */\nexport interface APIEmoji {\n id: Snowflake | null;\n name: string | null;\n roles?: Snowflake[];\n user?: UserData;\n require_colons?: boolean;\n managed?: boolean;\n animated?: boolean;\n available?: boolean;\n}\n\n// ─── Guilds ───────────────────────────────────────────────────────────────────\n\n/** Raw Discord guild object. */\nexport interface APIGuild {\n id: Snowflake;\n name: string;\n icon?: string | null;\n icon_hash?: string | null;\n splash?: string | null;\n discovery_splash?: string | null;\n owner?: boolean;\n owner_id?: Snowflake;\n permissions?: string;\n afk_channel_id?: Snowflake | null;\n afk_timeout?: number;\n widget_enabled?: boolean;\n widget_channel_id?: Snowflake | null;\n verification_level?: number;\n default_message_notifications?: number;\n explicit_content_filter?: number;\n roles?: APIRole[];\n emojis?: APIEmoji[];\n stickers?: APISticker[];\n features?: string[];\n mfa_level?: number;\n application_id?: Snowflake | null;\n system_channel_id?: Snowflake | null;\n system_channel_flags?: number;\n rules_channel_id?: Snowflake | null;\n max_presences?: number | null;\n max_members?: number;\n vanity_url_code?: string | null;\n description?: string | null;\n banner?: string | null;\n premium_tier?: number;\n premium_subscription_count?: number;\n preferred_locale?: string;\n public_updates_channel_id?: Snowflake | null;\n max_video_channel_users?: number;\n approximate_member_count?: number;\n approximate_presence_count?: number;\n nsfw_level?: number;\n safety_alerts_channel_id?: Snowflake | null;\n member_count?: number;\n}\n\n// ─── Welcome Screen ───────────────────────────────────────────────────────────\n\nexport interface APIWelcomeScreenChannel {\n channel_id: Snowflake;\n description: string;\n emoji_id: Snowflake | null;\n emoji_name: string | null;\n}\n\nexport interface APIGuildWelcomeScreen {\n description: string | null;\n welcome_channels: APIWelcomeScreenChannel[];\n}\n\n// ─── Guild Onboarding ─────────────────────────────────────────────────────────\n\nexport interface APIOnboardingPromptOption {\n id: Snowflake;\n channel_ids: Snowflake[];\n role_ids: Snowflake[];\n emoji?: APIPartialEmoji;\n title: string;\n description: string | null;\n}\n\nexport interface APIOnboardingPrompt {\n id: Snowflake;\n type: number;\n options: APIOnboardingPromptOption[];\n title: string;\n single_select: boolean;\n required: boolean;\n in_onboarding: boolean;\n}\n\nexport interface APIGuildOnboarding {\n guild_id: Snowflake;\n prompts: APIOnboardingPrompt[];\n default_channel_ids: Snowflake[];\n enabled: boolean;\n mode: number;\n}\n\n/** Raw Discord guild member object. */\nexport interface APIGuildMember {\n user: UserData;\n nick?: string | null;\n avatar?: string | null;\n roles: Snowflake[];\n joined_at: string;\n premium_since?: string | null;\n deaf?: boolean;\n mute?: boolean;\n flags?: number;\n pending?: boolean;\n permissions?: string;\n communication_disabled_until?: string | null;\n guild_id?: Snowflake;\n}\n\n// ─── Voice ────────────────────────────────────────────────────────────────────\n\n/** Raw Discord voice state object. */\nexport interface APIVoiceState {\n guild_id?: Snowflake;\n channel_id?: Snowflake | null;\n user_id: Snowflake;\n member?: APIGuildMember;\n session_id: string;\n deaf: boolean;\n mute: boolean;\n self_deaf: boolean;\n self_mute: boolean;\n self_stream?: boolean;\n self_video: boolean;\n suppress: boolean;\n request_to_speak_timestamp?: string | null;\n}\n\n/** Raw Discord voice server update event. */\nexport interface APIVoiceServerUpdate {\n token: string;\n guild_id: Snowflake;\n endpoint?: string | null;\n}\n\n// ─── Presence ────────────────────────────────────────────────────────────────\n\n/** Raw Discord activity object. */\n/** Discord activity types, for presences (`setPresence({ activities: [{ name, type: ActivityEnum.Watching }] })`). */\nexport const ActivityEnum = {\n Playing: 0,\n Streaming: 1,\n Listening: 2,\n Watching: 3,\n Custom: 4,\n Competing: 5,\n} as const;\n/** One {@link ActivityEnum} value, usable as a type. */\nexport type ActivityEnum = (typeof ActivityEnum)[keyof typeof ActivityEnum];\n\nexport interface APIActivity {\n name: string;\n type: number;\n url?: string | null;\n created_at: number;\n state?: string | null;\n details?: string | null;\n emoji?: APIPartialEmoji | null;\n}\n\n/** Raw Discord presence update event. */\nexport interface APIPresenceUpdate {\n user: { id: Snowflake } & Partial<UserData>;\n guild_id: Snowflake;\n status: string;\n activities: APIActivity[];\n client_status: { desktop?: string; mobile?: string; web?: string };\n}\n\n// ─── Typing ───────────────────────────────────────────────────────────────────\n\n/** Raw Discord typing start event. */\nexport interface APITypingStart {\n channel_id: Snowflake;\n guild_id?: Snowflake;\n user_id: Snowflake;\n timestamp: number;\n member?: APIGuildMember;\n}\n\n// ─── Guilds ──────────────────────────────────────────────────────────────────\n\n/** Raw Discord guild preview. */\nexport interface APIGuildPreview {\n id: Snowflake;\n name: string;\n icon: string | null;\n splash: string | null;\n discovery_splash: string | null;\n emojis: unknown[];\n features: string[];\n approximate_member_count: number;\n approximate_presence_count: number;\n description: string | null;\n stickers: unknown[];\n}\n\n// ─── Invites ─────────────────────────────────────────────────────────────────\n\n/** Raw Discord invite. */\nexport interface APIInvite {\n code: string;\n guild?: Partial<APIGuild>;\n channel: Partial<APIChannel>;\n inviter?: UserData;\n target_type?: number;\n target_user?: UserData;\n approximate_presence_count?: number;\n approximate_member_count?: number;\n}\n\n/** Raw Discord invite create event. */\nexport interface APIInviteCreate {\n channel_id: Snowflake;\n code: string;\n created_at: string;\n guild_id?: Snowflake;\n inviter?: UserData;\n max_age: number;\n max_uses: number;\n target_type?: number;\n target_user?: UserData;\n temporary: boolean;\n uses: number;\n}\n\n/** Raw Discord invite delete event. */\nexport interface APIInviteDelete {\n channel_id: Snowflake;\n guild_id?: Snowflake;\n code: string;\n}\n\n// ─── Webhooks ────────────────────────────────────────────────────────────────\n\n/** Raw Discord webhooks update event. */\nexport interface APIWebhooksUpdate {\n guild_id: Snowflake;\n channel_id: Snowflake;\n}\n\n/** Raw Discord webhook object. */\nexport interface APIWebhook {\n id: Snowflake;\n type: number;\n guild_id?: Snowflake | null;\n channel_id?: Snowflake | null;\n user?: UserData;\n name?: string | null;\n avatar?: string | null;\n token?: string;\n application_id?: Snowflake | null;\n url?: string;\n}\n\n// ─── AutoMod ─────────────────────────────────────────────────────────────────\n\n/** Raw Discord AutoMod action. */\nexport interface APIAutoModerationAction {\n type: number;\n metadata?: {\n channel_id?: Snowflake;\n duration_seconds?: number;\n custom_message?: string;\n };\n}\n\n// ─── Audit Logs ──────────────────────────────────────────────────────────────\n\n/** Raw Discord audit log change object. */\nexport interface APIAuditLogChange {\n new_value?: unknown;\n old_value?: unknown;\n key: string;\n}\n\n/** Raw Discord audit log entry options object. */\nexport interface APIAuditLogOptions {\n app_id?: Snowflake;\n auto_moderation_rule_name?: string;\n auto_moderation_rule_trigger_type?: string;\n channel_id?: Snowflake;\n count?: string;\n delete_member_days?: string;\n id?: Snowflake;\n members_removed?: string;\n message_id?: Snowflake;\n role_name?: string;\n type?: string;\n integration_type?: string;\n}\n\n/** Raw Discord audit log entry object. */\nexport interface APIAuditLogEntry {\n target_id: string | null;\n changes?: APIAuditLogChange[];\n user_id: Snowflake | null;\n id: Snowflake;\n action_type: number;\n options?: APIAuditLogOptions;\n reason?: string;\n}\n\n/** Raw Discord audit log object. */\nexport interface APIAuditLog {\n audit_log_entries: APIAuditLogEntry[];\n guild_scheduled_events: APIGuildScheduledEvent[];\n integrations: Array<Record<string, unknown>>;\n threads: APIChannel[];\n users: UserData[];\n webhooks: APIWebhook[];\n application_commands: APIApplicationCommand[];\n auto_moderation_rules: APIAutoModerationRule[];\n}\n\n/** Raw Discord AutoMod rule object. */\nexport interface APIAutoModerationRule {\n id: Snowflake;\n guild_id: Snowflake;\n name: string;\n creator_id: Snowflake;\n event_type: number;\n trigger_type: number;\n trigger_metadata: Record<string, unknown>;\n actions: APIAutoModerationAction[];\n enabled: boolean;\n exempt_roles: Snowflake[];\n exempt_channels: Snowflake[];\n}\n\n/** Raw Discord AutoMod action execution event. */\nexport interface APIAutoModerationActionExecution {\n guild_id: Snowflake;\n action: APIAutoModerationAction;\n rule_id: Snowflake;\n rule_trigger_type: number;\n user_id: Snowflake;\n channel_id?: Snowflake;\n message_id?: Snowflake;\n alert_system_message_id?: Snowflake;\n content: string;\n matched_keyword?: string | null;\n matched_content?: string | null;\n}\n\n// ─── Scheduled Events ─────────────────────────────────────────────────────────\n\n/** Raw Discord guild scheduled event entity metadata. */\nexport interface APIGuildScheduledEventEntityMetadata {\n location?: string;\n}\n\n/** Raw Discord guild scheduled event object. */\nexport interface APIGuildScheduledEvent {\n id: Snowflake;\n guild_id: Snowflake;\n channel_id?: Snowflake | null;\n creator_id?: Snowflake | null;\n name: string;\n description?: string | null;\n scheduled_start_time: string;\n scheduled_end_time?: string | null;\n privacy_level: number;\n status: number;\n entity_type: number;\n entity_id?: Snowflake | null;\n entity_metadata?: APIGuildScheduledEventEntityMetadata | null;\n creator?: UserData;\n user_count?: number;\n image?: string | null;\n}\n\n// ─── Stage Instances ─────────────────────────────────────────────────────────\n\n/** Raw Discord stage instance object. */\nexport interface APIStageInstance {\n id: Snowflake;\n guild_id: Snowflake;\n channel_id: Snowflake;\n topic: string;\n privacy_level: number;\n discoverable_disabled?: boolean;\n guild_scheduled_event_id?: Snowflake | null;\n}\n\n// ─── Application Commands ─────────────────────────────────────────────────────\n\n/** Discord application command option types. */\nexport const ApplicationCommandOptionEnum = {\n SubCommand: 1,\n SubCommandGroup: 2,\n String: 3,\n Integer: 4,\n Boolean: 5,\n User: 6,\n Channel: 7,\n Role: 8,\n Mentionable: 9,\n Number: 10,\n Attachment: 11,\n} as const;\n/** One {@link ApplicationCommandOptionEnum} value, usable as a type. */\nexport type ApplicationCommandOptionEnum =\n (typeof ApplicationCommandOptionEnum)[keyof typeof ApplicationCommandOptionEnum];\n\n/** Discord application command types. */\nexport const ApplicationCommandEnum = {\n ChatInput: 1,\n User: 2,\n Message: 3,\n} as const;\n/** One {@link ApplicationCommandEnum} value, usable as a type. */\nexport type ApplicationCommandEnum =\n (typeof ApplicationCommandEnum)[keyof typeof ApplicationCommandEnum];\n\n/** Raw Discord application command option. */\nexport interface APIApplicationCommandOption {\n type: number;\n name: string;\n description: string;\n required?: boolean;\n choices?: Array<{ name: string; value: string | number }>;\n options?: APIApplicationCommandOption[];\n min_value?: number;\n max_value?: number;\n min_length?: number;\n max_length?: number;\n autocomplete?: boolean;\n channel_types?: number[];\n}\n\n/** Raw Discord application command object (from API). */\nexport interface APIApplicationCommand {\n id: Snowflake;\n type?: number;\n application_id: Snowflake;\n guild_id?: Snowflake;\n name: string;\n description: string;\n options?: APIApplicationCommandOption[];\n default_member_permissions?: string | null;\n dm_permission?: boolean;\n nsfw?: boolean;\n version: Snowflake;\n}\n\n/** Data for creating/overwriting an application command. */\nexport interface ApplicationCommandData {\n name: string;\n description: string;\n type?: number;\n options?: APIApplicationCommandOption[];\n default_member_permissions?: string | null;\n dm_permission?: boolean;\n nsfw?: boolean;\n}\n\n/** A channel permission overwrite for a role (type 0) or member (type 1). */\nexport interface APIOverwrite {\n id: Snowflake;\n type: 0 | 1;\n /** Allowed permission bits as a decimal string. */\n allow: string;\n /** Denied permission bits as a decimal string. */\n deny: string;\n}\n\n// ─── Soundboard & Monetization ───────────────────────────────────────────────\n/** Raw Discord soundboard sound. */\nexport interface APISoundboardSound {\n sound_id: string;\n name: string;\n volume: number;\n emoji_id: string | null;\n emoji_name: string | null;\n guild_id?: string;\n available: boolean;\n user?: UserData;\n}\n\n/** Raw Discord SKU. */\nexport interface APISKU {\n id: string;\n type: number;\n application_id: string;\n name: string;\n slug: string;\n flags: number;\n}\n\n/** Raw Discord entitlement. */\nexport interface APIEntitlement {\n id: string;\n sku_id: string;\n application_id: string;\n user_id?: string;\n guild_id?: string;\n type: number;\n deleted: boolean;\n starts_at?: string | null;\n ends_at?: string | null;\n consumed?: boolean;\n}\n\n/** Raw Discord subscription. */\nexport interface APISubscription {\n id: string;\n user_id: string;\n sku_ids: string[];\n entitlement_ids: string[];\n current_period_start: string;\n current_period_end: string;\n status: number;\n canceled_at: string | null;\n country?: string;\n}\n\n// ─── Deprecated names (0.2.2) ────────────────────────────────────────────────\n// Kept so existing bots keep working; removed in 2.0. `…Style` became `…Type`\n// and `…Type` became `…Enum`.\n\n/** @deprecated Use {@link ButtonType}. Removed in 2.0. */\nexport const ButtonStyle = ButtonType;\n/** @deprecated Use {@link ButtonType}. Removed in 2.0. */\nexport type ButtonStyle = ButtonType;\n/** @deprecated Use {@link TextInputType}. Removed in 2.0. */\nexport const TextInputStyle = TextInputType;\n/** @deprecated Use {@link TextInputType}. Removed in 2.0. */\nexport type TextInputStyle = TextInputType;\n/** @deprecated Use {@link ChannelEnum}. Removed in 2.0. */\nexport const ChannelType = ChannelEnum;\n/** @deprecated Use {@link ChannelEnum}. Removed in 2.0. */\nexport type ChannelType = ChannelEnum;\n/** @deprecated Use {@link ComponentEnum}. Removed in 2.0. */\nexport const ComponentType = ComponentEnum;\n/** @deprecated Use {@link ComponentEnum}. Removed in 2.0. */\nexport type ComponentType = ComponentEnum;\n/** @deprecated Use {@link InteractionResponseEnum}. Removed in 2.0. */\nexport const InteractionResponseType = InteractionResponseEnum;\n/** @deprecated Use {@link InteractionResponseEnum}. Removed in 2.0. */\nexport type InteractionResponseType = InteractionResponseEnum;\n/** @deprecated Use {@link ApplicationCommandEnum}. Removed in 2.0. */\nexport const ApplicationCommandType = ApplicationCommandEnum;\n/** @deprecated Use {@link ApplicationCommandEnum}. Removed in 2.0. */\nexport type ApplicationCommandType = ApplicationCommandEnum;\n/** @deprecated Use {@link ApplicationCommandOptionEnum}. Removed in 2.0. */\nexport const ApplicationCommandOptionType = ApplicationCommandOptionEnum;\n/** @deprecated Use {@link ApplicationCommandOptionEnum}. Removed in 2.0. */\nexport type ApplicationCommandOptionType = ApplicationCommandOptionEnum;\n/** @deprecated Use {@link StickerEnum}. Removed in 2.0. */\nexport const StickerType = StickerEnum;\n/** @deprecated Use {@link StickerEnum}. Removed in 2.0. */\nexport type StickerType = StickerEnum;\n/** @deprecated Use {@link StickerFormatEnum}. Removed in 2.0. */\nexport const StickerFormatType = StickerFormatEnum;\n/** @deprecated Use {@link StickerFormatEnum}. Removed in 2.0. */\nexport type StickerFormatType = StickerFormatEnum;\n"
|
|
7
7
|
],
|
|
8
|
-
"mappings": "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
|
|
9
|
-
"debugId": "
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "40CBDDAEDFA8DAF664756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|
package/dist/ws/index.js
CHANGED
|
@@ -1021,6 +1021,7 @@ class Gateway {
|
|
|
1021
1021
|
#message(raw, token) {
|
|
1022
1022
|
if (!this.#session.owns(token))
|
|
1023
1023
|
return;
|
|
1024
|
+
this.#heartbeat.receivedMessage();
|
|
1024
1025
|
const { sequence, action } = classifyFrame(raw);
|
|
1025
1026
|
if (sequence !== null)
|
|
1026
1027
|
this.#session.recordSequence(sequence, token);
|
|
@@ -1192,4 +1193,4 @@ export {
|
|
|
1192
1193
|
resumePayload
|
|
1193
1194
|
};
|
|
1194
1195
|
|
|
1195
|
-
//# debugId=
|
|
1196
|
+
//# debugId=0B3294008B8C43CB64756E2164756E21
|
package/dist/ws/index.js.map
CHANGED
|
@@ -10,12 +10,12 @@
|
|
|
10
10
|
"/**\n * The WebSocket a Gateway connection runs on.\n *\n * Owns socket construction, listener wiring, sending, closing, and replacement.\n * It is infrastructure, not Discord semantics: it never inspects an opcode, a\n * session, or a heartbeat. Frames go out as text and come back as text.\n */\nimport { createDecoder, type GatewayDecoder } from \"./decoder.js\";\n\n/** Creates the underlying socket. Injected to support alternative runtimes. */\nexport type SocketFactory = (url: string) => WebSocket;\n\n/** Callbacks a transport reports to its owner. */\nexport interface TransportHandlers {\n /** The socket opened and is ready to send. */\n onOpen: () => void;\n /** A complete frame arrived, already decompressed. */\n onFrame: (raw: string) => void;\n /** The socket closed. */\n onClose: (code: number, reason: string) => void;\n /** A socket or decoding failure. Not a close on its own. */\n onError: (error: Error) => void;\n}\n\n/** Outcome of opening a connection. */\nexport type ConnectResult = { ok: true } | { ok: false; error: Error };\n\n/** Configuration for {@link WebSocketTransport}. */\nexport interface TransportOptions {\n /** Handlers for this transport's lifetime. */\n handlers: TransportHandlers;\n /** Frame decoder. Defaults to plain text, or zlib-stream when compressing. */\n decoder?: GatewayDecoder;\n /** Whether the connection negotiates `zlib-stream` compression. */\n compress?: boolean;\n /** Socket constructor. Defaults to the ambient `WebSocket`. */\n createSocket?: SocketFactory;\n}\n\n/** WebSocket states. Compared numerically so a stub needs no static constants. */\nconst CONNECTING = 0;\nconst OPEN = 1;\n\n/**\n * A replaceable WebSocket connection.\n *\n * **Generations.** Each {@link connect} takes a generation, and every event is\n * checked against the current one. A socket that has been replaced still holds\n * its listeners and can still fire — especially a frame that finishes\n * decompressing after the swap — and every such event is dropped. The owner\n * therefore never has to ask \"is this still my socket?\".\n */\nexport class WebSocketTransport {\n readonly #handlers: TransportHandlers;\n readonly #decoder: GatewayDecoder;\n readonly #createSocket: SocketFactory;\n readonly #compress: boolean;\n #socket?: WebSocket;\n #generation = 0;\n /** Serialises decoding so stateful decoders never see interleaved chunks. */\n #queue: Promise<void> = Promise.resolve();\n\n public constructor(options: TransportOptions) {\n this.#handlers = options.handlers;\n this.#compress = options.compress ?? false;\n this.#decoder = options.decoder ?? createDecoder(options.compress);\n this.#createSocket =\n options.createSocket ?? ((url: string) => new WebSocket(url));\n }\n\n /** Whether a socket is open and able to send. */\n public get connected(): boolean {\n return this.#socket?.readyState === OPEN;\n }\n\n /** Whether a socket is connecting or open, and therefore still in play. */\n public get live(): boolean {\n return this.#socket !== undefined && this.#socket.readyState <= OPEN;\n }\n\n /** Current connection generation; increments on every {@link connect}. */\n public get generation(): number {\n return this.#generation;\n }\n\n /**\n * Opens a connection, replacing any existing one.\n *\n * A construction failure is returned rather than reported through\n * `onError`: the caller is mid-`connect` and must decide what the failure\n * means for the attempt it is running.\n */\n public connect(url: string): ConnectResult {\n // Never leave a predecessor behind: an orphan keeps its listeners and\n // would go on feeding this transport's owner.\n this.#discard(1000, \"Superseded by a new connection\");\n const generation = ++this.#generation;\n // A replaced connection's decoder state is meaningless to the new one.\n this.#decoder.reset();\n this.#queue = Promise.resolve();\n\n let socket: WebSocket;\n try {\n socket = this.#createSocket(url);\n } catch (error) {\n return { ok: false, error: this.#asError(error) };\n }\n if (this.#compress) {\n try {\n (socket as { binaryType?: string }).binaryType = \"arraybuffer\";\n } catch {\n // Runtimes that pin binaryType are handled by the decoder.\n }\n }\n this.#socket = socket;\n\n socket.addEventListener(\"open\", () => {\n if (!this.#owns(generation)) return;\n this.#handlers.onOpen();\n });\n socket.addEventListener(\"message\", (event) => {\n if (!this.#owns(generation)) return;\n // A decoder that answers synchronously is delivered synchronously:\n // an uncompressed frame must not become a microtask, because\n // dispatch timing is observable to consumers.\n let decoded: string[] | Promise<string[]>;\n try {\n decoded = this.#decoder.push(event.data);\n } catch (error) {\n this.#handlers.onError(this.#asError(error));\n return;\n }\n if (!(decoded instanceof Promise)) {\n for (const frame of decoded) this.#handlers.onFrame(frame);\n return;\n }\n // A stateful decoder must never see interleaved chunks, and the\n // generation is re-checked once the chunk is actually decoded: the\n // socket may have been replaced while this frame was in flight.\n this.#queue = this.#queue\n .then(async () => {\n const frames = await decoded;\n if (!this.#owns(generation)) return;\n for (const frame of frames) this.#handlers.onFrame(frame);\n })\n .catch((error) => {\n if (!this.#owns(generation)) return;\n this.#handlers.onError(this.#asError(error));\n });\n });\n socket.addEventListener(\"close\", (event) => {\n if (!this.#owns(generation)) return;\n this.#socket = undefined;\n // A closed socket owns nothing further. Retiring its generation\n // here is what makes every later event from it — a late frame, a\n // second close, an error — stale by construction, including a\n // frame that was still decompressing when the socket went away.\n this.#generation++;\n this.#decoder.reset();\n this.#handlers.onClose(event.code, event.reason ?? \"\");\n });\n socket.addEventListener(\"error\", () => {\n if (!this.#owns(generation)) return;\n this.#handlers.onError(new Error(\"Gateway WebSocket error\"));\n });\n return { ok: true };\n }\n\n /**\n * Writes a frame.\n * @returns Whether it reached the socket.\n */\n public send(data: string): boolean {\n if (!this.connected) return false;\n try {\n this.#socket!.send(data);\n return true;\n } catch (error) {\n this.#handlers.onError(this.#asError(error));\n return false;\n }\n }\n\n /** Closes the current socket, if any. Its `close` event still fires. */\n public close(code = 1000, reason = \"\"): void {\n const socket = this.#socket;\n if (!socket) return;\n try {\n socket.close(code, reason);\n } catch (error) {\n this.#handlers.onError(this.#asError(error));\n }\n }\n\n /**\n * Abandons the current socket without reporting its close.\n *\n * Used for a deliberate shutdown, where the owner has already decided the\n * connection is over and must not be woken by the resulting close event.\n */\n public destroy(code = 1000, reason = \"\"): void {\n this.#discard(code, reason);\n this.#decoder.reset();\n }\n\n /** Whether `generation` still owns this transport. */\n #owns(generation: number): boolean {\n return generation === this.#generation;\n }\n\n /** Detaches and closes the current socket without emitting its close. */\n #discard(code: number, reason: string): void {\n const socket = this.#socket;\n if (!socket) return;\n // Bumping the generation first makes every event this socket may still\n // fire — including a close caused by the call below — a stale event.\n this.#generation++;\n this.#socket = undefined;\n try {\n socket.close(code, reason);\n } catch (error) {\n this.#handlers.onError(this.#asError(error));\n }\n }\n\n #asError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n }\n}\n",
|
|
11
11
|
"/** Discord Gateway opcodes. */\nexport const GatewayOpcodes = {\n Dispatch: 0,\n Heartbeat: 1,\n Identify: 2,\n PresenceUpdate: 3,\n VoiceStateUpdate: 4,\n Resume: 6,\n Reconnect: 7,\n RequestGuildMembers: 8,\n InvalidSession: 9,\n Hello: 10,\n HeartbeatAck: 11,\n} as const;\n",
|
|
12
12
|
"/**\n * Discord Gateway protocol: what a payload *means*.\n *\n * Pure translation from a received frame to an action, plus construction of\n * the payloads Lunibee sends. It performs nothing: no socket, no timers, no\n * session mutation, no event emission, no sending. The caller decides what to\n * do with an action, which is what lets the whole protocol be tested without a\n * connection.\n */\nimport type { GatewayPayload, GatewayPresence } from \"@lunibee/types\";\nimport { GatewayOpcodes } from \"./opcodes.js\";\nimport type { ResumeInfo } from \"./session.js\";\n\n/** Why a frame could not be understood. */\nexport type ProtocolViolation =\n /** The frame was not valid JSON. */\n | \"invalid-json\"\n /** The frame decoded to something other than a payload object. */\n | \"invalid-payload\"\n /** `HELLO` carried no usable heartbeat interval. */\n | \"invalid-hello\";\n\n/** What a received frame means. */\nexport type GatewayAction =\n /** `op 10`: begin heartbeating and hand shake. */\n | { type: \"hello\"; heartbeatInterval: number }\n /** `op 0`: an event. `event` is null only if Discord omitted `t`. */\n | { type: \"dispatch\"; event: string | null; data: unknown }\n /** `op 1`: Discord asks for a heartbeat now. */\n | { type: \"heartbeat\" }\n /** `op 11`: the last heartbeat was acknowledged. */\n | { type: \"heartbeat-ack\"; data: unknown }\n /** `op 7`: Discord asks the client to reconnect. */\n | { type: \"reconnect\" }\n /** `op 9`: the session is gone. `resumable` decides RESUME vs IDENTIFY. */\n | { type: \"invalid-session\"; resumable: boolean }\n /**\n * An opcode this version does not handle.\n *\n * Ignored rather than treated as an error: Discord adds opcodes, and a\n * client that fails on an unfamiliar one breaks itself on every addition.\n */\n | { type: \"unknown\"; opcode: number }\n /** The frame was malformed. Never silently swallowed. */\n | {\n type: \"invalid\";\n violation: ProtocolViolation;\n message: string;\n cause?: unknown;\n };\n\n/** A classified frame: its sequence, if any, and what it means. */\nexport interface ProtocolResult {\n /**\n * Sequence carried by the frame, or null when it carried none.\n *\n * Reported for every payload type, not just dispatches: recording it is\n * the caller's decision, and the caller records before acting so a RESUME\n * cannot be built from a sequence that was never seen.\n */\n sequence: number | null;\n /** What the frame means. */\n action: GatewayAction;\n}\n\n/**\n * Classifies one received frame.\n *\n * @param raw The frame text, already decompressed by the transport.\n */\nexport function classifyFrame(raw: string): ProtocolResult {\n let payload: GatewayPayload;\n try {\n payload = JSON.parse(raw) as GatewayPayload;\n } catch (error) {\n return {\n sequence: null,\n action: {\n type: \"invalid\",\n violation: \"invalid-json\",\n message: \"Gateway returned invalid JSON\",\n cause: error,\n },\n };\n }\n return classifyPayload(payload);\n}\n\n/** Classifies an already-parsed payload. */\nexport function classifyPayload(payload: unknown): ProtocolResult {\n if (\n payload === null ||\n typeof payload !== \"object\" ||\n typeof (payload as GatewayPayload).op !== \"number\"\n )\n return {\n sequence: null,\n action: {\n type: \"invalid\",\n violation: \"invalid-payload\",\n message: \"Gateway returned an invalid payload\",\n },\n };\n\n const frame = payload as GatewayPayload;\n const sequence = typeof frame.s === \"number\" ? frame.s : null;\n\n switch (frame.op) {\n case GatewayOpcodes.Dispatch:\n return {\n sequence,\n action: {\n type: \"dispatch\",\n event: typeof frame.t === \"string\" ? frame.t : null,\n data: frame.d,\n },\n };\n case GatewayOpcodes.Hello: {\n const interval = (frame.d as { heartbeat_interval?: unknown })\n ?.heartbeat_interval;\n if (\n typeof interval !== \"number\" ||\n !Number.isFinite(interval) ||\n interval <= 0\n )\n return {\n sequence,\n action: {\n type: \"invalid\",\n violation: \"invalid-hello\",\n message:\n \"Gateway HELLO payload contains an invalid heartbeat interval\",\n },\n };\n return {\n sequence,\n action: { type: \"hello\", heartbeatInterval: interval },\n };\n }\n case GatewayOpcodes.Heartbeat:\n return { sequence, action: { type: \"heartbeat\" } };\n case GatewayOpcodes.HeartbeatAck:\n return {\n sequence,\n action: { type: \"heartbeat-ack\", data: frame.d },\n };\n case GatewayOpcodes.Reconnect:\n return { sequence, action: { type: \"reconnect\" } };\n case GatewayOpcodes.InvalidSession:\n // `d` is a boolean: true means the session may still be resumed.\n // Anything else is treated as non-resumable, which is the safe\n // reading — a wrongly-attempted RESUME costs another round trip.\n return {\n sequence,\n action: {\n type: \"invalid-session\",\n resumable: frame.d === true,\n },\n };\n default:\n return { sequence, action: { type: \"unknown\", opcode: frame.op } };\n }\n}\n\n/** Identification properties sent with IDENTIFY. */\nexport interface IdentifyProperties {\n os?: string;\n browser?: string;\n device?: string;\n [key: string]: unknown;\n}\n\n/** Everything IDENTIFY needs. */\nexport interface IdentifyOptions {\n token: string;\n intents: number;\n shardId: number;\n shardCount: number;\n properties?: IdentifyProperties;\n presence?: GatewayPresence;\n}\n\n/** Builds an IDENTIFY payload. */\nexport function identifyPayload(options: IdentifyOptions): GatewayPayload {\n const props = options.properties ?? {};\n const os = props.os ?? \"Android\";\n const browser = props.browser ?? \"Discord Android\";\n const device = props.device ?? \"Discord Android\";\n return {\n op: GatewayOpcodes.Identify,\n d: {\n token: options.token,\n intents: options.intents,\n properties: {\n os,\n browser,\n device,\n // Discord accepted `$`-prefixed property names historically and\n // still does; both spellings are sent so the payload works\n // against either expectation.\n $os: os,\n $browser: browser,\n $device: device,\n ...props,\n },\n presence: {\n since: options.presence?.since ?? null,\n activities: options.presence?.activities ?? [],\n status: options.presence?.status ?? \"online\",\n afk: Boolean(options.presence?.afk),\n },\n shard: [options.shardId, options.shardCount],\n },\n s: null,\n t: null,\n };\n}\n\n/** Builds a RESUME payload from the session's resume material. */\nexport function resumePayload(\n token: string,\n resume: ResumeInfo,\n): GatewayPayload {\n return {\n op: GatewayOpcodes.Resume,\n d: {\n token,\n session_id: resume.sessionId,\n seq: resume.sequence,\n },\n s: null,\n t: null,\n };\n}\n\n/** Builds a heartbeat payload carrying the last sequence seen. */\nexport function heartbeatPayload(sequence: number | null): GatewayPayload {\n return { op: GatewayOpcodes.Heartbeat, d: sequence, s: null, t: null };\n}\n",
|
|
13
|
-
"// ─── Gateway Intents ─────────────────────────────────────────────────────────\n\n/** Gateway intent bit flags supported by Discord (PascalCase). */\nexport const GatewayIntentBits = {\n Guilds: 1 << 0,\n GuildMembers: 1 << 1,\n GuildModeration: 1 << 2,\n GuildExpressions: 1 << 3,\n GuildIntegrations: 1 << 4,\n GuildWebhooks: 1 << 5,\n GuildInvites: 1 << 6,\n GuildVoiceStates: 1 << 7,\n GuildPresences: 1 << 8,\n GuildMessages: 1 << 9,\n GuildMessageReactions: 1 << 10,\n GuildMessageTyping: 1 << 11,\n DirectMessages: 1 << 12,\n DirectMessageReactions: 1 << 13,\n DirectMessageTyping: 1 << 14,\n MessageContent: 1 << 15,\n GuildScheduledEvents: 1 << 16,\n AutoModerationConfiguration: 1 << 20,\n AutoModerationExecution: 1 << 21,\n GuildMessagePolls: 1 << 24,\n DirectMessagePolls: 1 << 25,\n} as const;\n\n/** Idiomatic camelCase Gateway intent bit flags supported by Discord. */\nexport const IntentBits = {\n guild: 1 << 0,\n guilds: 1 << 0,\n guildMembers: 1 << 1,\n guildModeration: 1 << 2,\n guildBans: 1 << 2,\n guildExpressions: 1 << 3,\n guildEmojis: 1 << 3,\n guildEmojisAndStickers: 1 << 3,\n guildIntegrations: 1 << 4,\n guildWebhooks: 1 << 5,\n guildInvites: 1 << 6,\n guildVoiceStates: 1 << 7,\n guildPresences: 1 << 8,\n guildMessages: 1 << 9,\n guildMessage: 1 << 9,\n guildMessageReactions: 1 << 10,\n guildMessageTyping: 1 << 11,\n directMessages: 1 << 12,\n directMessageReactions: 1 << 13,\n directMessageTyping: 1 << 14,\n messageContent: 1 << 15,\n guildScheduledEvents: 1 << 16,\n autoModerationConfiguration: 1 << 20,\n autoModerationExecution: 1 << 21,\n guildMessagePolls: 1 << 24,\n directMessagePolls: 1 << 25,\n} as const;\n\n/** Alias for IntentBits. */\nexport const Intents = IntentBits;\n\n/** Gateway intent resolvable value (single bitfield, enum key, or array of bitfields/strings). */\nexport type GatewayIntentResolvable =\n | number\n | keyof typeof GatewayIntentBits\n | keyof typeof IntentBits\n | (\n | number\n | keyof typeof GatewayIntentBits\n | keyof typeof IntentBits\n | string\n )[]\n | { readonly bitfield: number };\n\n/** Resolves any GatewayIntentResolvable into a raw bitfield integer. */\nexport function resolveGatewayIntents(\n intents: GatewayIntentResolvable,\n): number {\n if (typeof intents === \"number\") return intents;\n if (intents && typeof intents === \"object\" && !Array.isArray(intents))\n return intents.bitfield;\n if (Array.isArray(intents)) {\n return intents.reduce<number>((acc, intent) => {\n return acc | resolveGatewayIntents(intent as any);\n }, 0);\n }\n if (typeof intents === \"string\") {\n if (intents in GatewayIntentBits)\n return (GatewayIntentBits as Record<string, number>)[intents]!;\n if (intents in IntentBits)\n return (IntentBits as Record<string, number>)[intents]!;\n const lower = intents.charAt(0).toLowerCase() + intents.slice(1);\n if (lower in IntentBits)\n return (IntentBits as Record<string, number>)[lower]!;\n const num = Number(intents);\n if (!Number.isNaN(num)) return num;\n }\n return 0;\n}\n\n/**\n * Discord.js-familiar intent bitfield.\n * @example new IntentsBitField([IntentsBitField.Flags.Guilds, \"GuildMessages\"])\n */\nexport class IntentsBitField {\n /** Intent flag values by name. */\n public static readonly Flags = GatewayIntentBits;\n /** Raw intent bitfield. */\n public bitfield: number;\n\n public constructor(bits: GatewayIntentResolvable = 0) {\n this.bitfield = resolveGatewayIntents(bits);\n }\n\n /** Whether every given intent is set. */\n public has(bits: GatewayIntentResolvable): boolean {\n const resolved = resolveGatewayIntents(bits);\n return (this.bitfield & resolved) === resolved;\n }\n\n /** Whether any given intent is set. */\n public any(bits: GatewayIntentResolvable): boolean {\n return (this.bitfield & resolveGatewayIntents(bits)) !== 0;\n }\n\n /** Adds intents in place. @returns This bitfield. */\n public add(...bits: GatewayIntentResolvable[]): this {\n for (const bit of bits) this.bitfield |= resolveGatewayIntents(bit);\n return this;\n }\n\n /** Removes intents in place. @returns This bitfield. */\n public remove(...bits: GatewayIntentResolvable[]): this {\n for (const bit of bits) this.bitfield &= ~resolveGatewayIntents(bit);\n return this;\n }\n\n /** Names of the set intents. */\n public toArray(): (keyof typeof GatewayIntentBits)[] {\n return (\n Object.keys(GatewayIntentBits) as (keyof typeof GatewayIntentBits)[]\n ).filter((name) => this.has(GatewayIntentBits[name]));\n }\n\n /** Whether this equals another bitfield. */\n public equals(bits: GatewayIntentResolvable): boolean {\n return this.bitfield === resolveGatewayIntents(bits);\n }\n\n public valueOf(): number {\n return this.bitfield;\n }\n\n public toJSON(): number {\n return this.bitfield;\n }\n}\n\n// ─── Gateway Config ───────────────────────────────────────────────────────────\n\n/** Gateway connection properties (OS, browser, device). */\nexport interface GatewayProperties {\n os?: string;\n browser?: string;\n device?: string;\n [key: string]: unknown;\n}\n/** Gateway presence activity. */\nexport interface GatewayPresenceActivity {\n name: string;\n type?: number;\n url?: string;\n state?: string;\n}\n/** Gateway presence data. */\nexport interface GatewayPresence {\n status?: \"online\" | \"dnd\" | \"idle\" | \"invisible\" | \"offline\";\n activities?: GatewayPresenceActivity[];\n afk?: boolean;\n since?: number | null;\n}\n/** Client configuration. */\nexport interface ClientOptions {\n token: string;\n intents: GatewayIntentResolvable;\n gateway?: GatewayOptions;\n rest?: RESTOptions;\n /** Opt-in bounded per-channel message cache. Messages are not cached by default. */\n messageCache?: { maxSize?: number; ttl?: number };\n /**\n * Which resources the client keeps from Gateway events. Everything is\n * cached by default; large bots can turn off what they do not read.\n * Events are still emitted either way.\n */\n cache?: {\n users?: boolean;\n members?: boolean;\n roles?: boolean;\n emojis?: boolean;\n };\n}\n/** Gateway connection configuration. */\nexport interface GatewayOptions {\n intents?: GatewayIntentResolvable;\n reconnect?: boolean;\n maxReconnectAttempts?: number;\n reconnectBaseDelay?: number;\n reconnectMaxDelay?: number;\n shardId?: number;\n shardCount?: number;\n properties?: GatewayProperties;\n presence?: GatewayPresence;\n}\n\n/** REST request configuration. */\nexport interface RESTOptions {\n timeout?: number;\n retries?: number;\n baseURL?: string;\n}\n",
|
|
13
|
+
"// ─── Gateway Intents ─────────────────────────────────────────────────────────\n\n/** Gateway intent bit flags supported by Discord (PascalCase). */\nexport const GatewayIntentBits = {\n Guilds: 1 << 0,\n GuildMembers: 1 << 1,\n GuildModeration: 1 << 2,\n GuildExpressions: 1 << 3,\n GuildIntegrations: 1 << 4,\n GuildWebhooks: 1 << 5,\n GuildInvites: 1 << 6,\n GuildVoiceStates: 1 << 7,\n GuildPresences: 1 << 8,\n GuildMessages: 1 << 9,\n GuildMessageReactions: 1 << 10,\n GuildMessageTyping: 1 << 11,\n DirectMessages: 1 << 12,\n DirectMessageReactions: 1 << 13,\n DirectMessageTyping: 1 << 14,\n MessageContent: 1 << 15,\n GuildScheduledEvents: 1 << 16,\n AutoModerationConfiguration: 1 << 20,\n AutoModerationExecution: 1 << 21,\n GuildMessagePolls: 1 << 24,\n DirectMessagePolls: 1 << 25,\n} as const;\n\n/** Idiomatic camelCase Gateway intent bit flags supported by Discord. */\nexport const IntentBits = {\n guild: 1 << 0,\n guilds: 1 << 0,\n guildMembers: 1 << 1,\n guildModeration: 1 << 2,\n guildBans: 1 << 2,\n guildExpressions: 1 << 3,\n guildEmojis: 1 << 3,\n guildEmojisAndStickers: 1 << 3,\n guildIntegrations: 1 << 4,\n guildWebhooks: 1 << 5,\n guildInvites: 1 << 6,\n guildVoiceStates: 1 << 7,\n guildPresences: 1 << 8,\n guildMessages: 1 << 9,\n guildMessage: 1 << 9,\n guildMessageReactions: 1 << 10,\n guildMessageTyping: 1 << 11,\n directMessages: 1 << 12,\n directMessageReactions: 1 << 13,\n directMessageTyping: 1 << 14,\n messageContent: 1 << 15,\n guildScheduledEvents: 1 << 16,\n autoModerationConfiguration: 1 << 20,\n autoModerationExecution: 1 << 21,\n guildMessagePolls: 1 << 24,\n directMessagePolls: 1 << 25,\n} as const;\n\n/** Alias for IntentBits. */\nexport const Intents = IntentBits;\n\n/** Gateway intent resolvable value (single bitfield, enum key, or array of bitfields/strings). */\nexport type GatewayIntentResolvable =\n | number\n | keyof typeof GatewayIntentBits\n | keyof typeof IntentBits\n | (\n | number\n | keyof typeof GatewayIntentBits\n | keyof typeof IntentBits\n | string\n )[]\n | { readonly bitfield: number };\n\n/** Resolves any GatewayIntentResolvable into a raw bitfield integer. */\nexport function resolveGatewayIntents(\n intents: GatewayIntentResolvable,\n): number {\n if (typeof intents === \"number\") return intents;\n if (intents && typeof intents === \"object\" && !Array.isArray(intents))\n return intents.bitfield;\n if (Array.isArray(intents)) {\n return intents.reduce<number>((acc, intent) => {\n return acc | resolveGatewayIntents(intent as any);\n }, 0);\n }\n if (typeof intents === \"string\") {\n if (intents in GatewayIntentBits)\n return (GatewayIntentBits as Record<string, number>)[intents]!;\n if (intents in IntentBits)\n return (IntentBits as Record<string, number>)[intents]!;\n const lower = intents.charAt(0).toLowerCase() + intents.slice(1);\n if (lower in IntentBits)\n return (IntentBits as Record<string, number>)[lower]!;\n const num = Number(intents);\n if (!Number.isNaN(num)) return num;\n }\n return 0;\n}\n\n/**\n * Discord.js-familiar intent bitfield.\n * @example new IntentsBitField([IntentsBitField.Flags.Guilds, \"GuildMessages\"])\n */\nexport class IntentsBitField {\n /** Intent flag values by name. */\n public static readonly Flags = GatewayIntentBits;\n /** Raw intent bitfield. */\n public bitfield: number;\n\n public constructor(bits: GatewayIntentResolvable = 0) {\n this.bitfield = resolveGatewayIntents(bits);\n }\n\n /** Whether every given intent is set. */\n public has(bits: GatewayIntentResolvable): boolean {\n const resolved = resolveGatewayIntents(bits);\n return (this.bitfield & resolved) === resolved;\n }\n\n /** Whether any given intent is set. */\n public any(bits: GatewayIntentResolvable): boolean {\n return (this.bitfield & resolveGatewayIntents(bits)) !== 0;\n }\n\n /** Adds intents in place. @returns This bitfield. */\n public add(...bits: GatewayIntentResolvable[]): this {\n for (const bit of bits) this.bitfield |= resolveGatewayIntents(bit);\n return this;\n }\n\n /** Removes intents in place. @returns This bitfield. */\n public remove(...bits: GatewayIntentResolvable[]): this {\n for (const bit of bits) this.bitfield &= ~resolveGatewayIntents(bit);\n return this;\n }\n\n /** Names of the set intents. */\n public toArray(): (keyof typeof GatewayIntentBits)[] {\n return (\n Object.keys(GatewayIntentBits) as (keyof typeof GatewayIntentBits)[]\n ).filter((name) => this.has(GatewayIntentBits[name]));\n }\n\n /** Whether this equals another bitfield. */\n public equals(bits: GatewayIntentResolvable): boolean {\n return this.bitfield === resolveGatewayIntents(bits);\n }\n\n public valueOf(): number {\n return this.bitfield;\n }\n\n public toJSON(): number {\n return this.bitfield;\n }\n}\n\n// ─── Gateway Config ───────────────────────────────────────────────────────────\n\n/** Gateway connection properties (OS, browser, device). */\nexport interface GatewayProperties {\n os?: string;\n browser?: string;\n device?: string;\n [key: string]: unknown;\n}\n/** Gateway presence activity. */\nexport interface GatewayPresenceActivity {\n name: string;\n type?: number;\n url?: string;\n state?: string;\n}\n/** Gateway presence data. */\nexport interface GatewayPresence {\n status?: \"online\" | \"dnd\" | \"idle\" | \"invisible\" | \"offline\";\n activities?: GatewayPresenceActivity[];\n afk?: boolean;\n since?: number | null;\n}\n/** Client configuration. */\nexport interface ClientOptions {\n token: string;\n intents: GatewayIntentResolvable;\n gateway?: GatewayOptions;\n rest?: RESTOptions;\n /** Opt-in bounded per-channel message cache. Messages are not cached by default. */\n messageCache?: { maxSize?: number; ttl?: number };\n /**\n * Which resources the client keeps from Gateway events. Everything is\n * cached by default; large bots can turn off what they do not read.\n * Events are still emitted either way.\n */\n cache?: {\n users?: boolean;\n members?: boolean;\n roles?: boolean;\n emojis?: boolean;\n };\n /**\n * Default `allowed_mentions` for every message the client sends (channel\n * send/edit, replies, interaction replies, edits and follow-ups), e.g.\n * `{ parse: [] }` so nothing pings unless a message says so. A message's\n * own `allowed_mentions` always wins.\n */\n allowedMentions?: AllowedMentions;\n}\n/** Discord's `allowed_mentions` object. */\nexport interface AllowedMentions {\n parse?: (\"users\" | \"roles\" | \"everyone\")[];\n users?: string[];\n roles?: string[];\n replied_user?: boolean;\n}\n/** Gateway connection configuration. */\nexport interface GatewayOptions {\n intents?: GatewayIntentResolvable;\n reconnect?: boolean;\n maxReconnectAttempts?: number;\n reconnectBaseDelay?: number;\n reconnectMaxDelay?: number;\n shardId?: number;\n shardCount?: number;\n properties?: GatewayProperties;\n presence?: GatewayPresence;\n}\n\n/** REST request configuration. */\nexport interface RESTOptions {\n timeout?: number;\n retries?: number;\n baseURL?: string;\n}\n",
|
|
14
14
|
"/** Gateway connection lifecycle states. */\nexport enum GatewayState {\n /** Initial connection state. */ Connect = \"CONNECT\",\n /** Gateway HELLO received state. */ Hello = \"HELLO\",\n /** IDENTIFY operation in progress. */ Identify = \"IDENTIFY\",\n /** RESUME operation in progress. */ Resume = \"RESUME\",\n /** Gateway READY state. */ Ready = \"READY\",\n /** Gateway dispatch processing state. */ Dispatch = \"DISPATCH\",\n /** Heartbeat processing state. */ Heartbeat = \"HEARTBEAT\",\n /** Reconnect in progress. */ Reconnect = \"RECONNECT\",\n /** Gateway is permanently closed. */ Closed = \"CLOSED\",\n}\n/**\n * Discord.js-familiar alias for {@link GatewayState}.\n *\n * Discord.js exposes connection status via a `Status` enum. Lunibee's canonical\n * name is {@link GatewayState}; this is an additive alias so `discord.js` users\n * find the expected name. Note the *values* remain Lunibee's string states\n * (e.g. `\"READY\"`), not Discord.js's numeric `Status` members — an intentional\n * divergence documented in the compatibility matrix.\n */\nexport { GatewayState as Status };\n/** Gateway protocol error. */\nexport class GatewayError extends Error {\n /** Gateway close/error code. */ public readonly code?: number;\n /** Creates a Gateway error. @param message Error message. @param code Optional Gateway code. @param options Optional error metadata. */ public constructor(\n message: string,\n code?: number,\n options?: ErrorOptions,\n ) {\n super(message, options);\n this.name = \"GatewayError\";\n this.code = code;\n }\n}\n",
|
|
15
15
|
"/**\n * Sliding-window budget for outgoing Gateway payloads.\n *\n * Discord allows 120 sends per 60 seconds. Application traffic is capped at\n * 115 so the remaining headroom is reserved for privileged sends (heartbeats),\n * which are still recorded so the true total stays under Discord's limit.\n */\nexport class SendBudget {\n readonly #timestamps: number[] = [];\n readonly #limit: number;\n readonly #windowMs: number;\n\n public constructor(limit = 115, windowMs = 60_000) {\n this.#limit = limit;\n this.#windowMs = windowMs;\n }\n\n /** Sends recorded within the current window. */\n public get used(): number {\n return this.#timestamps.length;\n }\n\n /** Whether a send may go out now. Privileged sends always may. */\n public allows(privileged: boolean, now = Date.now()): boolean {\n while (\n this.#timestamps.length &&\n now - this.#timestamps[0]! >= this.#windowMs\n )\n this.#timestamps.shift();\n return privileged || this.#timestamps.length < this.#limit;\n }\n\n /** Records a send that went out. */\n public record(now = Date.now()): void {\n this.#timestamps.push(now);\n }\n}\n",
|
|
16
|
-
"import { GatewaySession } from \"./session.js\";\nimport { GatewayHeartbeat, type HeartbeatTimeout } from \"./heartbeat.js\";\nimport { GatewayCloseCodes } from \"./close-codes.js\";\nimport { GatewayReconnect, type CloseAction } from \"./reconnect.js\";\nimport { WebSocketTransport, type SocketFactory } from \"./transport.js\";\nimport { GatewayOpcodes } from \"./opcodes.js\";\nimport {\n classifyFrame,\n identifyPayload,\n resumePayload,\n heartbeatPayload,\n type GatewayAction,\n} from \"./protocol.js\";\nimport {\n resolveGatewayIntents,\n type GatewayPayload,\n type GatewayProperties,\n type GatewayPresence,\n type GatewayIntentResolvable,\n} from \"@lunibee/types\";\n\nexport {\n classifyFrame,\n classifyPayload,\n identifyPayload,\n resumePayload,\n heartbeatPayload,\n type GatewayAction,\n type ProtocolResult,\n type ProtocolViolation,\n type IdentifyOptions,\n type IdentifyProperties,\n} from \"./protocol.js\";\n\nexport {\n WebSocketTransport,\n type TransportHandlers,\n type TransportOptions,\n type SocketFactory,\n} from \"./transport.js\";\n\nexport {\n createDecoder,\n PlainTextDecoder,\n ZlibStreamDecoder,\n type GatewayDecoder,\n} from \"./decoder.js\";\n\nexport {\n GatewayReconnect,\n classifyCloseCode,\n FATAL_CLOSE_CODES,\n IDENTIFY_CLOSE_CODES,\n type CloseAction,\n type ReconnectOptions,\n type ScheduleResult,\n type ScheduleRefusal,\n} from \"./reconnect.js\";\n\nexport {\n GatewayHeartbeat,\n type HeartbeatOptions,\n type HeartbeatTimeout,\n} from \"./heartbeat.js\";\n\nexport {\n GatewaySession,\n type ResumeInfo,\n type HandshakeIntent,\n type InvalidationReason,\n} from \"./session.js\";\n\nexport { GatewayOpcodes } from \"./opcodes.js\";\n\nexport { GatewayCloseCodes } from \"./close-codes.js\";\n\nexport { GatewayState, Status, GatewayError } from \"./state.js\";\nimport { GatewayState, GatewayError } from \"./state.js\";\nimport { SendBudget } from \"./send-budget.js\";\n/** Gateway connection configuration. */\nexport interface GatewayOptions {\n /** Authentication token. */ token: string;\n /** Gateway intent bitfield or resolvable. */ intents: GatewayIntentResolvable;\n /** Shard identifier. */ shardId?: number;\n /** Total shard count. */ shardCount?: number;\n /** Whether automatic reconnect is enabled. */ reconnect?: boolean;\n /** Maximum reconnect attempts. */ maxReconnectAttempts?: number;\n /** Initial reconnect delay. */ reconnectBaseDelay?: number;\n /** Maximum reconnect delay. */ reconnectMaxDelay?: number;\n /** Heartbeat acknowledgement timeout. */ heartbeatAckTimeout?: number;\n /** Zombie connection timeout. */ zombieTimeout?: number;\n /** Identification properties. */ properties?: GatewayProperties;\n /** Presence data. */ presence?: GatewayPresence;\n /**\n * Whether to enable zlib-stream transport compression.\n * Decoded with a persistent `node:zlib` inflate stream, matching\n * Discord's zlib-wrapped stream framing (`Z_SYNC_FLUSH` boundaries).\n * When enabled, appends `&compress=zlib-stream` to the Gateway URL.\n */\n compress?: boolean;\n /**\n * Constructs the underlying socket. Defaults to the ambient `WebSocket`.\n * Injected to run the Gateway on an alternative transport, or on a stub.\n */\n createSocket?: SocketFactory;\n}\n/** Discord's main Gateway endpoint, used when no resume host is known. */\n/**\n * Close code for connections Lunibee means to RESUME. Discord invalidates the\n * session when a client closes with 1000 or 1001, so a reconnect that should\n * keep its session must close with anything else.\n */\nconst RESUMABLE_CLOSE_CODE = 4900;\nconst DEFAULT_GATEWAY_URL = \"wss://gateway.discord.gg/?v=10&encoding=json\";\n\n/** Gateway event listener. */\ntype GatewayListener = (data: unknown) => unknown;\n/** Manages a Discord Gateway connection. */\nexport class Gateway {\n /** Current Gateway lifecycle state. */\n public state: GatewayState = GatewayState.Connect;\n #options: Required<\n Omit<\n GatewayOptions,\n \"properties\" | \"presence\" | \"compress\" | \"createSocket\" | \"intents\"\n >\n > & {\n /** Resolved intent bitfield, never the resolvable form. */\n intents: number;\n properties?: GatewayProperties;\n presence?: GatewayPresence;\n compress?: boolean;\n };\n /**\n * The socket this connection runs on.\n *\n * The Gateway never touches a `WebSocket` directly: construction, listener\n * wiring, replacement and decoding all belong to the transport.\n */\n readonly #transport: WebSocketTransport;\n /**\n * Session identity and the IDENTIFY-vs-RESUME decision.\n *\n * The Gateway holds no session fields of its own: every read and write goes\n * through the session, which rejects mutations from a superseded socket.\n */\n readonly #session = new GatewaySession();\n /** Token of the socket this Gateway currently owns. */\n #token = 0;\n /**\n * Heartbeat, acknowledgement deadline and staleness watch.\n *\n * The Gateway holds no heartbeat timers of its own; it supplies the socket\n * and decides what to close when liveness fails.\n */\n readonly #heartbeat: GatewayHeartbeat;\n #closed = false;\n /**\n * Close classification, backoff, scheduling, and the coordination that\n * keeps at most one logical connection attempt in flight.\n */\n readonly #reconnect: GatewayReconnect;\n readonly #listeners = new Map<string, Set<GatewayListener>>();\n /** Application send budget under Discord's 120-per-60s limit. */\n readonly #sendBudget = new SendBudget();\n public ping: number = -1;\n /** Creates a Gateway connection manager. @param options Gateway configuration. @throws {TypeError|RangeError} If configuration is invalid. */\n public constructor(options: GatewayOptions) {\n if (!options.token?.trim())\n throw new TypeError(\"A Gateway token is required.\");\n const resolvedIntents = resolveGatewayIntents(options.intents);\n if (!Number.isInteger(resolvedIntents) || resolvedIntents < 0)\n throw new TypeError(\n \"Gateway intents must be a non-negative integer.\",\n );\n this.#options = {\n shardId: 0,\n shardCount: 1,\n reconnect: true,\n maxReconnectAttempts: Infinity,\n reconnectBaseDelay: 1000,\n reconnectMaxDelay: 30000,\n heartbeatAckTimeout: 10000,\n zombieTimeout: 30000,\n properties: {\n os: \"Android\",\n browser: \"Discord Android\",\n device: \"Discord Android\",\n },\n presence: {\n status: \"online\",\n activities: [],\n afk: false,\n since: null,\n },\n ...options,\n // Store the *resolved* bitfield, not the resolvable the caller\n // passed. IDENTIFY must carry a number: sending the array or\n // string form verbatim makes Discord answer 4013 (invalid\n // intents), which is a fatal close — so the documented array form\n // would never connect.\n intents: resolvedIntents,\n };\n if (\n this.#options.shardId < 0 ||\n this.#options.shardId >= this.#options.shardCount\n )\n throw new RangeError(\n \"Gateway shardId must be within the configured shard count.\",\n );\n if (this.#options.zombieTimeout <= this.#options.heartbeatAckTimeout)\n throw new RangeError(\n \"Gateway zombieTimeout must be greater than heartbeatAckTimeout\",\n );\n this.#transport = new WebSocketTransport({\n compress: this.#options.compress,\n createSocket: options.createSocket,\n handlers: {\n onOpen: () => this.#onOpen(),\n onFrame: (raw) => this.#message(raw, this.#token),\n onClose: (code) => this.#close(code, this.#token),\n // Transport failures reach consumers as GatewayError, the\n // type every other Gateway error path already uses.\n onError: (error) =>\n this.#emitError(\n error instanceof GatewayError\n ? error\n : new GatewayError(error.message, undefined, {\n cause: error,\n }),\n ),\n },\n });\n this.#reconnect = new GatewayReconnect({\n enabled: this.#options.reconnect,\n maxAttempts: this.#options.maxReconnectAttempts,\n baseDelay: this.#options.reconnectBaseDelay,\n maxDelay: this.#options.reconnectMaxDelay,\n });\n this.#heartbeat = new GatewayHeartbeat({\n ackTimeout: this.#options.heartbeatAckTimeout,\n zombieTimeout: this.#options.zombieTimeout,\n // Heartbeats are privileged: application traffic must never starve\n // the one payload that keeps the connection alive.\n send: (sequence) =>\n this.#dispatch(heartbeatPayload(sequence), true),\n sequence: () => this.#session.sequence,\n isConnected: () => !this.#closed && this.#transport.connected,\n onTimeout: (timeout) => this.#onHeartbeatTimeout(timeout),\n onError: (error) => this.#emitError(error),\n });\n }\n\n /**\n * Closes a connection that failed a liveness check.\n *\n * The heartbeat decides *that* the connection is dead; the Gateway decides\n * what to do about it, because only the Gateway owns the socket.\n */\n #onHeartbeatTimeout(timeout: HeartbeatTimeout): void {\n if (timeout.type === \"zombie\") {\n this.#emit(\"zombie\", {\n silentFor: timeout.silentFor,\n timeout: timeout.deadline,\n });\n this.#emitError(\n new GatewayError(\n `Gateway connection appears stale after ${timeout.silentFor}ms without traffic.`,\n ),\n );\n } else {\n this.#emitError(\n new GatewayError(\n `Gateway heartbeat acknowledgement timed out after ${timeout.elapsedMs}ms.`,\n ),\n );\n }\n this.#transport.close(\n RESUMABLE_CLOSE_CODE,\n timeout.type === \"zombie\"\n ? \"Zombie Gateway connection\"\n : \"Heartbeat timeout\",\n );\n }\n\n /** Opens the Gateway connection. @param url Gateway WebSocket URL. @returns Promise fulfilled when the socket opens. @throws {GatewayError} If permanently closed or unable to connect. */\n public connect(url = DEFAULT_GATEWAY_URL): Promise<void> {\n if (this.state === GatewayState.Closed)\n throw new GatewayError(\"Gateway has been permanently closed.\");\n // At most one logical connection attempt is active: concurrent callers\n // join the in-flight attempt rather than opening competing sockets.\n const inFlight = this.#reconnect.attemptPromise;\n if (inFlight) return inFlight;\n // Connecting an already-live Gateway must be a no-op. Opening a second\n // socket leaves the first one unmanaged but still dispatching, which\n // interleaves two sequence streams (corrupting a later RESUME) and\n // sends a second IDENTIFY on the same session.\n if (this.#transport.live) return Promise.resolve();\n // A manual connect supersedes a scheduled reconnect; leaving the timer\n // armed would open a second socket once it fires.\n this.#reconnect.cancel();\n this.#closed = false;\n this.#setState(GatewayState.Connect);\n // Append compression parameter if enabled\n const connectURL = this.#options.compress\n ? url.includes(\"compress=\")\n ? url\n : `${url}&compress=zlib-stream`\n : url;\n return this.#reconnect.attempt(() => this.#open(connectURL));\n }\n /** Permanently closes the Gateway connection. */\n public close(): void {\n this.#closed = true;\n this.#clearTimers();\n this.#settleConnect(\n new GatewayError(\"Gateway connection closed before socket open.\"),\n );\n // Abandon rather than close-and-listen: the Gateway has already decided\n // the connection is over and must not be woken by its close event.\n this.#transport.destroy(1000, \"Client closed connection\");\n this.#setState(GatewayState.Closed);\n }\n /** Registers a Gateway event listener. @param event Event name. @param listener Event callback. @returns This Gateway. */\n /** Emits an event to all registered listeners. @param event Event name. @param data Event payload. */\n public emit(event: string, data?: unknown): void {\n this.#emit(event, data);\n }\n public on(event: string, listener: GatewayListener): this {\n if (!event || typeof listener !== \"function\")\n throw new TypeError(\"Gateway event and listener are required.\");\n let listeners = this.#listeners.get(event);\n if (!listeners) this.#listeners.set(event, (listeners = new Set()));\n listeners.add(listener);\n return this;\n }\n /** Removes a Gateway event listener. @param event Event name. @param listener Event callback. @returns This Gateway. */\n public off(event: string, listener: GatewayListener): this {\n this.#listeners.get(event)?.delete(listener);\n return this;\n }\n /** Sends a Gateway payload. @param payload Gateway payload. @returns Whether it was sent. */\n public send(payload: GatewayPayload): boolean {\n if (!payload || !Number.isInteger(payload.op))\n throw new TypeError(\n \"Gateway payload must contain an integer opcode.\",\n );\n return this.#dispatch(payload, false);\n }\n /**\n * Writes a payload to the socket. Heartbeats pass `privileged` so they are\n * never starved by application traffic: the 115 budget sits below\n * Discord's real 120/60s limit precisely to leave room for them, so\n * spending that headroom on heartbeats is what it is reserved for. They\n * are still recorded, keeping the true total under Discord's limit.\n */\n #dispatch(payload: GatewayPayload, privileged: boolean): boolean {\n if (!this.#transport.connected) return false;\n const now = Date.now();\n if (!this.#sendBudget.allows(privileged, now)) {\n this.#emitError(\n new GatewayError(\"Gateway send rate budget exhausted.\"),\n );\n return false;\n }\n if (!this.#transport.send(JSON.stringify(payload))) return false;\n this.#sendBudget.record(now);\n return true;\n }\n /** Sends a presence update. @param data Presence payload. @returns Whether it was sent. */\n public setPresence(data: GatewayPresence): boolean {\n this.#options.presence = { ...this.#options.presence, ...data };\n const payload = {\n since: this.#options.presence.since ?? null,\n activities: this.#options.presence.activities ?? [],\n status: this.#options.presence.status ?? \"online\",\n afk: Boolean(this.#options.presence.afk),\n };\n return this.send({\n op: GatewayOpcodes.PresenceUpdate,\n d: payload,\n s: null,\n t: null,\n });\n }\n /** Sends a voice state update. @param data Voice state payload. @returns Whether it was sent. */\n public setVoiceState(data: Record<string, unknown>): boolean {\n return this.send({\n op: GatewayOpcodes.VoiceStateUpdate,\n d: data,\n s: null,\n t: null,\n });\n }\n /** Requests guild members. @param data Guild member request payload. @returns Whether it was sent. */\n public requestGuildMembers(data: Record<string, unknown>): boolean {\n return this.send({\n op: GatewayOpcodes.RequestGuildMembers,\n d: data,\n s: null,\n t: null,\n });\n }\n /**\n * Starts one connection attempt.\n *\n * Ownership of the session moves to this attempt before the socket exists,\n * so a frame from the socket being replaced can never be mistaken for one\n * belonging to this connection.\n */\n #open(url: string): void {\n if (this.#closed) return;\n this.#token = this.#session.beginConnection();\n const result = this.#transport.connect(url);\n if (result.ok) return;\n // The socket could not be constructed. The caller's attempt fails with\n // the underlying reason, so a thrown GatewayError keeps its message.\n const failure = this.#normalizeError(result.error);\n this.#emitError(failure);\n if (this.#options.reconnect) {\n this.#setState(GatewayState.Reconnect);\n this.#scheduleReconnect();\n } else {\n this.#settleConnect(failure);\n }\n }\n #onOpen(): void {\n // Watch for silence from the moment the socket opens: a connection\n // that never reaches HELLO must still be detected as dead.\n this.#heartbeat.watch();\n this.#emit(\"open\", undefined);\n this.#settleConnect();\n }\n #message(raw: string, token: number): void {\n // The transport already drops frames from a replaced socket; this\n // second check keeps the session authoritative about who may mutate it.\n if (!this.#session.owns(token)) return;\n const { sequence, action } = classifyFrame(raw);\n // Record before acting: a RESUME must never be built from a sequence\n // the connection has not actually observed. The session ignores a\n // sequence from a superseded connection.\n if (sequence !== null) this.#session.recordSequence(sequence, token);\n this.#apply(action, token);\n }\n /**\n * Performs what the protocol says a frame meant.\n *\n * Every branch is an operation the protocol layer deliberately cannot do\n * for itself: closing a socket, mutating the session, running timers,\n * emitting events.\n */\n #apply(action: GatewayAction, token: number): void {\n switch (action.type) {\n case \"dispatch\":\n this.#setState(GatewayState.Dispatch);\n this.#handleDispatch(action.event, action.data, token);\n return;\n case \"hello\":\n this.#handleHello(action.heartbeatInterval);\n return;\n case \"heartbeat\":\n this.#setState(GatewayState.Heartbeat);\n this.#heartbeat.sendHeartbeat();\n return;\n case \"heartbeat-ack\":\n this.#heartbeat.acknowledge();\n this.ping = this.#heartbeat.latency;\n this.#emit(\"heartbeatAck\", action.data);\n return;\n case \"reconnect\":\n this.#transport.close(\n RESUMABLE_CLOSE_CODE,\n \"Server requested reconnect\",\n );\n return;\n case \"invalid-session\": {\n // A resumable invalidation keeps the session; a non-resumable\n // one destroys it, so the next connection must IDENTIFY.\n if (!action.resumable)\n this.#session.invalidate(token, \"invalid-session\");\n this.#emit(\"invalidSession\", action.resumable);\n this.#transport.close(\n action.resumable ? GatewayCloseCodes.UnknownError : 1000,\n action.resumable\n ? \"Invalid session (resumable)\"\n : \"Invalid session\",\n );\n return;\n }\n case \"invalid\":\n this.#emitError(\n new GatewayError(\n action.message,\n undefined,\n action.cause === undefined\n ? undefined\n : { cause: action.cause },\n ),\n );\n this.#transport.close(\n 1002,\n action.violation === \"invalid-json\"\n ? \"Invalid JSON\"\n : action.violation === \"invalid-hello\"\n ? \"Invalid heartbeat interval\"\n : \"Invalid payload\",\n );\n return;\n case \"unknown\":\n // Forward compatibility: Discord may add opcodes, and an\n // unfamiliar one is not a failure.\n return;\n }\n }\n #handleDispatch(event: string | null, data: unknown, token: number): void {\n if (event === \"READY\") {\n if (!this.#session.activate(data, token)) {\n // Either the payload lacked session information or this socket\n // no longer owns the session; only the former is an error.\n if (this.#session.owns(token))\n this.#emitError(\n new GatewayError(\n \"Gateway READY payload is missing session information\",\n ),\n );\n return;\n }\n this.#reconnect.reset();\n this.#setState(GatewayState.Ready);\n this.#emit(\"ready\", data);\n } else if (event === \"RESUMED\") {\n // A successful RESUME ends the reconnect cycle just like READY:\n // reset the backoff counter so a later disconnect starts from the\n // base delay, mark the connection READY, and surface a Discord.js-\n // familiar `resumed` event.\n this.#reconnect.reset();\n this.#setState(GatewayState.Ready);\n this.#emit(\"resumed\", data);\n }\n this.#emit(\"RAW\", { event: event ?? \"UNKNOWN\", data });\n if (this.#closed) return;\n this.#emit(event ?? \"dispatch\", data);\n }\n #handleHello(interval: number): void {\n this.#setState(\n this.#session.canResume ? GatewayState.Resume : GatewayState.Hello,\n );\n this.#heartbeat.start(interval);\n this.#identifyOrResume();\n }\n #identifyOrResume(): void {\n const intent = this.#session.handshake();\n // IDENTIFY/RESUME are privileged for the same reason heartbeats are:\n // dropping one leaves the shard connected but never READY, recoverable\n // only via the zombie timeout. Application traffic must never starve\n // the handshake out of the send budget.\n if (intent.type === \"resume\") {\n this.#setState(GatewayState.Resume);\n this.#dispatch(resumePayload(this.#options.token, intent), true);\n return;\n }\n this.#setState(GatewayState.Identify);\n this.#dispatch(\n identifyPayload({\n token: this.#options.token,\n intents: this.#options.intents,\n shardId: this.#options.shardId,\n shardCount: this.#options.shardCount,\n properties: this.#options.properties,\n presence: this.#options.presence,\n }),\n true,\n );\n }\n #close(code: number, token: number): void {\n this.#clearTimers();\n const action: CloseAction = this.#reconnect.classifyClose(\n code,\n this.#session.canResume,\n );\n this.#emit(\"close\", { code, action });\n if (this.#closed || !this.#reconnect.enabled || action === \"stop\") {\n // A fatal close is terminal: the condition behind 4004/4013/4014\n // cannot fix itself, so the Gateway settles as CLOSED rather than\n // sitting in CONNECT looking like it is about to try again (WS-003).\n if (action === \"stop\") this.#closed = true;\n this.#setState(\n this.#closed ? GatewayState.Closed : GatewayState.Connect,\n );\n if (this.#reconnect.connecting)\n this.#reconnect.settle(\n new GatewayError(\n `Gateway closed before READY (code ${code}).`,\n code,\n ),\n );\n return;\n }\n if (action === \"identify\")\n // Fresh IDENTIFY: drop the session AND its resume host so the\n // reconnect targets the main Gateway, not a stale resume URL.\n this.#session.invalidate(token, \"session-timeout\");\n this.#setState(GatewayState.Reconnect);\n this.#scheduleReconnect();\n }\n #scheduleReconnect(): void {\n if (this.#closed) return;\n const result = this.#reconnect.schedule(() =>\n this.#open(this.#session.connectURL(DEFAULT_GATEWAY_URL)),\n );\n if (result.scheduled || result.reason !== \"exhausted\") return;\n this.#reconnect.settle(\n new GatewayError(\"Gateway reconnect attempts exhausted.\"),\n );\n this.#setState(GatewayState.Connect);\n }\n #settleConnect(error?: GatewayError): void {\n this.#reconnect.settle(error);\n }\n #clearTimers(): void {\n this.#reconnect.cancel();\n this.#heartbeat.stop();\n }\n #normalizeError(error: unknown): GatewayError {\n return error instanceof GatewayError\n ? error\n : new GatewayError(\"Gateway connection failed.\", undefined, {\n cause: error,\n });\n }\n #emitError(error: unknown): void {\n this.#emit(\n \"error\",\n error instanceof Error ? error : new GatewayError(String(error)),\n );\n }\n #emit(event: string, data: unknown): void {\n for (const listener of this.#listeners.get(event) ?? []) {\n try {\n const result = listener(data);\n if (\n result &&\n typeof (result as PromiseLike<unknown>).then === \"function\"\n )\n void Promise.resolve(result).catch((error) => {\n if (event !== \"error\") this.#emitError(error);\n });\n } catch (error) {\n if (event !== \"error\") this.#emitError(error);\n }\n }\n }\n /** Changes the Gateway lifecycle state. @param next Next lifecycle state. */\n #setState(next: GatewayState): void {\n if (this.state === next) return;\n const previous = this.state;\n this.state = next;\n this.#emit(\"stateChange\", { previous, next });\n }\n}\n"
|
|
16
|
+
"import { GatewaySession } from \"./session.js\";\nimport { GatewayHeartbeat, type HeartbeatTimeout } from \"./heartbeat.js\";\nimport { GatewayCloseCodes } from \"./close-codes.js\";\nimport { GatewayReconnect, type CloseAction } from \"./reconnect.js\";\nimport { WebSocketTransport, type SocketFactory } from \"./transport.js\";\nimport { GatewayOpcodes } from \"./opcodes.js\";\nimport {\n classifyFrame,\n identifyPayload,\n resumePayload,\n heartbeatPayload,\n type GatewayAction,\n} from \"./protocol.js\";\nimport {\n resolveGatewayIntents,\n type GatewayPayload,\n type GatewayProperties,\n type GatewayPresence,\n type GatewayIntentResolvable,\n} from \"@lunibee/types\";\n\nexport {\n classifyFrame,\n classifyPayload,\n identifyPayload,\n resumePayload,\n heartbeatPayload,\n type GatewayAction,\n type ProtocolResult,\n type ProtocolViolation,\n type IdentifyOptions,\n type IdentifyProperties,\n} from \"./protocol.js\";\n\nexport {\n WebSocketTransport,\n type TransportHandlers,\n type TransportOptions,\n type SocketFactory,\n} from \"./transport.js\";\n\nexport {\n createDecoder,\n PlainTextDecoder,\n ZlibStreamDecoder,\n type GatewayDecoder,\n} from \"./decoder.js\";\n\nexport {\n GatewayReconnect,\n classifyCloseCode,\n FATAL_CLOSE_CODES,\n IDENTIFY_CLOSE_CODES,\n type CloseAction,\n type ReconnectOptions,\n type ScheduleResult,\n type ScheduleRefusal,\n} from \"./reconnect.js\";\n\nexport {\n GatewayHeartbeat,\n type HeartbeatOptions,\n type HeartbeatTimeout,\n} from \"./heartbeat.js\";\n\nexport {\n GatewaySession,\n type ResumeInfo,\n type HandshakeIntent,\n type InvalidationReason,\n} from \"./session.js\";\n\nexport { GatewayOpcodes } from \"./opcodes.js\";\n\nexport { GatewayCloseCodes } from \"./close-codes.js\";\n\nexport { GatewayState, Status, GatewayError } from \"./state.js\";\nimport { GatewayState, GatewayError } from \"./state.js\";\nimport { SendBudget } from \"./send-budget.js\";\n/** Gateway connection configuration. */\nexport interface GatewayOptions {\n /** Authentication token. */ token: string;\n /** Gateway intent bitfield or resolvable. */ intents: GatewayIntentResolvable;\n /** Shard identifier. */ shardId?: number;\n /** Total shard count. */ shardCount?: number;\n /** Whether automatic reconnect is enabled. */ reconnect?: boolean;\n /** Maximum reconnect attempts. */ maxReconnectAttempts?: number;\n /** Initial reconnect delay. */ reconnectBaseDelay?: number;\n /** Maximum reconnect delay. */ reconnectMaxDelay?: number;\n /** Heartbeat acknowledgement timeout. */ heartbeatAckTimeout?: number;\n /** Zombie connection timeout. */ zombieTimeout?: number;\n /** Identification properties. */ properties?: GatewayProperties;\n /** Presence data. */ presence?: GatewayPresence;\n /**\n * Whether to enable zlib-stream transport compression.\n * Decoded with a persistent `node:zlib` inflate stream, matching\n * Discord's zlib-wrapped stream framing (`Z_SYNC_FLUSH` boundaries).\n * When enabled, appends `&compress=zlib-stream` to the Gateway URL.\n */\n compress?: boolean;\n /**\n * Constructs the underlying socket. Defaults to the ambient `WebSocket`.\n * Injected to run the Gateway on an alternative transport, or on a stub.\n */\n createSocket?: SocketFactory;\n}\n/** Discord's main Gateway endpoint, used when no resume host is known. */\n/**\n * Close code for connections Lunibee means to RESUME. Discord invalidates the\n * session when a client closes with 1000 or 1001, so a reconnect that should\n * keep its session must close with anything else.\n */\nconst RESUMABLE_CLOSE_CODE = 4900;\nconst DEFAULT_GATEWAY_URL = \"wss://gateway.discord.gg/?v=10&encoding=json\";\n\n/** Gateway event listener. */\ntype GatewayListener = (data: unknown) => unknown;\n/** Manages a Discord Gateway connection. */\nexport class Gateway {\n /** Current Gateway lifecycle state. */\n public state: GatewayState = GatewayState.Connect;\n #options: Required<\n Omit<\n GatewayOptions,\n \"properties\" | \"presence\" | \"compress\" | \"createSocket\" | \"intents\"\n >\n > & {\n /** Resolved intent bitfield, never the resolvable form. */\n intents: number;\n properties?: GatewayProperties;\n presence?: GatewayPresence;\n compress?: boolean;\n };\n /**\n * The socket this connection runs on.\n *\n * The Gateway never touches a `WebSocket` directly: construction, listener\n * wiring, replacement and decoding all belong to the transport.\n */\n readonly #transport: WebSocketTransport;\n /**\n * Session identity and the IDENTIFY-vs-RESUME decision.\n *\n * The Gateway holds no session fields of its own: every read and write goes\n * through the session, which rejects mutations from a superseded socket.\n */\n readonly #session = new GatewaySession();\n /** Token of the socket this Gateway currently owns. */\n #token = 0;\n /**\n * Heartbeat, acknowledgement deadline and staleness watch.\n *\n * The Gateway holds no heartbeat timers of its own; it supplies the socket\n * and decides what to close when liveness fails.\n */\n readonly #heartbeat: GatewayHeartbeat;\n #closed = false;\n /**\n * Close classification, backoff, scheduling, and the coordination that\n * keeps at most one logical connection attempt in flight.\n */\n readonly #reconnect: GatewayReconnect;\n readonly #listeners = new Map<string, Set<GatewayListener>>();\n /** Application send budget under Discord's 120-per-60s limit. */\n readonly #sendBudget = new SendBudget();\n public ping: number = -1;\n /** Creates a Gateway connection manager. @param options Gateway configuration. @throws {TypeError|RangeError} If configuration is invalid. */\n public constructor(options: GatewayOptions) {\n if (!options.token?.trim())\n throw new TypeError(\"A Gateway token is required.\");\n const resolvedIntents = resolveGatewayIntents(options.intents);\n if (!Number.isInteger(resolvedIntents) || resolvedIntents < 0)\n throw new TypeError(\n \"Gateway intents must be a non-negative integer.\",\n );\n this.#options = {\n shardId: 0,\n shardCount: 1,\n reconnect: true,\n maxReconnectAttempts: Infinity,\n reconnectBaseDelay: 1000,\n reconnectMaxDelay: 30000,\n heartbeatAckTimeout: 10000,\n zombieTimeout: 30000,\n properties: {\n os: \"Android\",\n browser: \"Discord Android\",\n device: \"Discord Android\",\n },\n presence: {\n status: \"online\",\n activities: [],\n afk: false,\n since: null,\n },\n ...options,\n // Store the *resolved* bitfield, not the resolvable the caller\n // passed. IDENTIFY must carry a number: sending the array or\n // string form verbatim makes Discord answer 4013 (invalid\n // intents), which is a fatal close — so the documented array form\n // would never connect.\n intents: resolvedIntents,\n };\n if (\n this.#options.shardId < 0 ||\n this.#options.shardId >= this.#options.shardCount\n )\n throw new RangeError(\n \"Gateway shardId must be within the configured shard count.\",\n );\n if (this.#options.zombieTimeout <= this.#options.heartbeatAckTimeout)\n throw new RangeError(\n \"Gateway zombieTimeout must be greater than heartbeatAckTimeout\",\n );\n this.#transport = new WebSocketTransport({\n compress: this.#options.compress,\n createSocket: options.createSocket,\n handlers: {\n onOpen: () => this.#onOpen(),\n onFrame: (raw) => this.#message(raw, this.#token),\n onClose: (code) => this.#close(code, this.#token),\n // Transport failures reach consumers as GatewayError, the\n // type every other Gateway error path already uses.\n onError: (error) =>\n this.#emitError(\n error instanceof GatewayError\n ? error\n : new GatewayError(error.message, undefined, {\n cause: error,\n }),\n ),\n },\n });\n this.#reconnect = new GatewayReconnect({\n enabled: this.#options.reconnect,\n maxAttempts: this.#options.maxReconnectAttempts,\n baseDelay: this.#options.reconnectBaseDelay,\n maxDelay: this.#options.reconnectMaxDelay,\n });\n this.#heartbeat = new GatewayHeartbeat({\n ackTimeout: this.#options.heartbeatAckTimeout,\n zombieTimeout: this.#options.zombieTimeout,\n // Heartbeats are privileged: application traffic must never starve\n // the one payload that keeps the connection alive.\n send: (sequence) =>\n this.#dispatch(heartbeatPayload(sequence), true),\n sequence: () => this.#session.sequence,\n isConnected: () => !this.#closed && this.#transport.connected,\n onTimeout: (timeout) => this.#onHeartbeatTimeout(timeout),\n onError: (error) => this.#emitError(error),\n });\n }\n\n /**\n * Closes a connection that failed a liveness check.\n *\n * The heartbeat decides *that* the connection is dead; the Gateway decides\n * what to do about it, because only the Gateway owns the socket.\n */\n #onHeartbeatTimeout(timeout: HeartbeatTimeout): void {\n if (timeout.type === \"zombie\") {\n this.#emit(\"zombie\", {\n silentFor: timeout.silentFor,\n timeout: timeout.deadline,\n });\n this.#emitError(\n new GatewayError(\n `Gateway connection appears stale after ${timeout.silentFor}ms without traffic.`,\n ),\n );\n } else {\n this.#emitError(\n new GatewayError(\n `Gateway heartbeat acknowledgement timed out after ${timeout.elapsedMs}ms.`,\n ),\n );\n }\n this.#transport.close(\n RESUMABLE_CLOSE_CODE,\n timeout.type === \"zombie\"\n ? \"Zombie Gateway connection\"\n : \"Heartbeat timeout\",\n );\n }\n\n /** Opens the Gateway connection. @param url Gateway WebSocket URL. @returns Promise fulfilled when the socket opens. @throws {GatewayError} If permanently closed or unable to connect. */\n public connect(url = DEFAULT_GATEWAY_URL): Promise<void> {\n if (this.state === GatewayState.Closed)\n throw new GatewayError(\"Gateway has been permanently closed.\");\n // At most one logical connection attempt is active: concurrent callers\n // join the in-flight attempt rather than opening competing sockets.\n const inFlight = this.#reconnect.attemptPromise;\n if (inFlight) return inFlight;\n // Connecting an already-live Gateway must be a no-op. Opening a second\n // socket leaves the first one unmanaged but still dispatching, which\n // interleaves two sequence streams (corrupting a later RESUME) and\n // sends a second IDENTIFY on the same session.\n if (this.#transport.live) return Promise.resolve();\n // A manual connect supersedes a scheduled reconnect; leaving the timer\n // armed would open a second socket once it fires.\n this.#reconnect.cancel();\n this.#closed = false;\n this.#setState(GatewayState.Connect);\n // Append compression parameter if enabled\n const connectURL = this.#options.compress\n ? url.includes(\"compress=\")\n ? url\n : `${url}&compress=zlib-stream`\n : url;\n return this.#reconnect.attempt(() => this.#open(connectURL));\n }\n /** Permanently closes the Gateway connection. */\n public close(): void {\n this.#closed = true;\n this.#clearTimers();\n this.#settleConnect(\n new GatewayError(\"Gateway connection closed before socket open.\"),\n );\n // Abandon rather than close-and-listen: the Gateway has already decided\n // the connection is over and must not be woken by its close event.\n this.#transport.destroy(1000, \"Client closed connection\");\n this.#setState(GatewayState.Closed);\n }\n /** Registers a Gateway event listener. @param event Event name. @param listener Event callback. @returns This Gateway. */\n /** Emits an event to all registered listeners. @param event Event name. @param data Event payload. */\n public emit(event: string, data?: unknown): void {\n this.#emit(event, data);\n }\n public on(event: string, listener: GatewayListener): this {\n if (!event || typeof listener !== \"function\")\n throw new TypeError(\"Gateway event and listener are required.\");\n let listeners = this.#listeners.get(event);\n if (!listeners) this.#listeners.set(event, (listeners = new Set()));\n listeners.add(listener);\n return this;\n }\n /** Removes a Gateway event listener. @param event Event name. @param listener Event callback. @returns This Gateway. */\n public off(event: string, listener: GatewayListener): this {\n this.#listeners.get(event)?.delete(listener);\n return this;\n }\n /** Sends a Gateway payload. @param payload Gateway payload. @returns Whether it was sent. */\n public send(payload: GatewayPayload): boolean {\n if (!payload || !Number.isInteger(payload.op))\n throw new TypeError(\n \"Gateway payload must contain an integer opcode.\",\n );\n return this.#dispatch(payload, false);\n }\n /**\n * Writes a payload to the socket. Heartbeats pass `privileged` so they are\n * never starved by application traffic: the 115 budget sits below\n * Discord's real 120/60s limit precisely to leave room for them, so\n * spending that headroom on heartbeats is what it is reserved for. They\n * are still recorded, keeping the true total under Discord's limit.\n */\n #dispatch(payload: GatewayPayload, privileged: boolean): boolean {\n if (!this.#transport.connected) return false;\n const now = Date.now();\n if (!this.#sendBudget.allows(privileged, now)) {\n this.#emitError(\n new GatewayError(\"Gateway send rate budget exhausted.\"),\n );\n return false;\n }\n if (!this.#transport.send(JSON.stringify(payload))) return false;\n this.#sendBudget.record(now);\n return true;\n }\n /** Sends a presence update. @param data Presence payload. @returns Whether it was sent. */\n public setPresence(data: GatewayPresence): boolean {\n this.#options.presence = { ...this.#options.presence, ...data };\n const payload = {\n since: this.#options.presence.since ?? null,\n activities: this.#options.presence.activities ?? [],\n status: this.#options.presence.status ?? \"online\",\n afk: Boolean(this.#options.presence.afk),\n };\n return this.send({\n op: GatewayOpcodes.PresenceUpdate,\n d: payload,\n s: null,\n t: null,\n });\n }\n /** Sends a voice state update. @param data Voice state payload. @returns Whether it was sent. */\n public setVoiceState(data: Record<string, unknown>): boolean {\n return this.send({\n op: GatewayOpcodes.VoiceStateUpdate,\n d: data,\n s: null,\n t: null,\n });\n }\n /** Requests guild members. @param data Guild member request payload. @returns Whether it was sent. */\n public requestGuildMembers(data: Record<string, unknown>): boolean {\n return this.send({\n op: GatewayOpcodes.RequestGuildMembers,\n d: data,\n s: null,\n t: null,\n });\n }\n /**\n * Starts one connection attempt.\n *\n * Ownership of the session moves to this attempt before the socket exists,\n * so a frame from the socket being replaced can never be mistaken for one\n * belonging to this connection.\n */\n #open(url: string): void {\n if (this.#closed) return;\n this.#token = this.#session.beginConnection();\n const result = this.#transport.connect(url);\n if (result.ok) return;\n // The socket could not be constructed. The caller's attempt fails with\n // the underlying reason, so a thrown GatewayError keeps its message.\n const failure = this.#normalizeError(result.error);\n this.#emitError(failure);\n if (this.#options.reconnect) {\n this.#setState(GatewayState.Reconnect);\n this.#scheduleReconnect();\n } else {\n this.#settleConnect(failure);\n }\n }\n #onOpen(): void {\n // Watch for silence from the moment the socket opens: a connection\n // that never reaches HELLO must still be detected as dead.\n this.#heartbeat.watch();\n this.#emit(\"open\", undefined);\n this.#settleConnect();\n }\n #message(raw: string, token: number): void {\n // The transport already drops frames from a replaced socket; this\n // second check keeps the session authoritative about who may mutate it.\n if (!this.#session.owns(token)) return;\n // Any frame from the current socket proves it is alive. Without this the\n // silence clock only moved on open, so every healthy connection was\n // declared a zombie once the staleness deadline passed.\n this.#heartbeat.receivedMessage();\n const { sequence, action } = classifyFrame(raw);\n // Record before acting: a RESUME must never be built from a sequence\n // the connection has not actually observed. The session ignores a\n // sequence from a superseded connection.\n if (sequence !== null) this.#session.recordSequence(sequence, token);\n this.#apply(action, token);\n }\n /**\n * Performs what the protocol says a frame meant.\n *\n * Every branch is an operation the protocol layer deliberately cannot do\n * for itself: closing a socket, mutating the session, running timers,\n * emitting events.\n */\n #apply(action: GatewayAction, token: number): void {\n switch (action.type) {\n case \"dispatch\":\n this.#setState(GatewayState.Dispatch);\n this.#handleDispatch(action.event, action.data, token);\n return;\n case \"hello\":\n this.#handleHello(action.heartbeatInterval);\n return;\n case \"heartbeat\":\n this.#setState(GatewayState.Heartbeat);\n this.#heartbeat.sendHeartbeat();\n return;\n case \"heartbeat-ack\":\n this.#heartbeat.acknowledge();\n this.ping = this.#heartbeat.latency;\n this.#emit(\"heartbeatAck\", action.data);\n return;\n case \"reconnect\":\n this.#transport.close(\n RESUMABLE_CLOSE_CODE,\n \"Server requested reconnect\",\n );\n return;\n case \"invalid-session\": {\n // A resumable invalidation keeps the session; a non-resumable\n // one destroys it, so the next connection must IDENTIFY.\n if (!action.resumable)\n this.#session.invalidate(token, \"invalid-session\");\n this.#emit(\"invalidSession\", action.resumable);\n this.#transport.close(\n action.resumable ? GatewayCloseCodes.UnknownError : 1000,\n action.resumable\n ? \"Invalid session (resumable)\"\n : \"Invalid session\",\n );\n return;\n }\n case \"invalid\":\n this.#emitError(\n new GatewayError(\n action.message,\n undefined,\n action.cause === undefined\n ? undefined\n : { cause: action.cause },\n ),\n );\n this.#transport.close(\n 1002,\n action.violation === \"invalid-json\"\n ? \"Invalid JSON\"\n : action.violation === \"invalid-hello\"\n ? \"Invalid heartbeat interval\"\n : \"Invalid payload\",\n );\n return;\n case \"unknown\":\n // Forward compatibility: Discord may add opcodes, and an\n // unfamiliar one is not a failure.\n return;\n }\n }\n #handleDispatch(event: string | null, data: unknown, token: number): void {\n if (event === \"READY\") {\n if (!this.#session.activate(data, token)) {\n // Either the payload lacked session information or this socket\n // no longer owns the session; only the former is an error.\n if (this.#session.owns(token))\n this.#emitError(\n new GatewayError(\n \"Gateway READY payload is missing session information\",\n ),\n );\n return;\n }\n this.#reconnect.reset();\n this.#setState(GatewayState.Ready);\n this.#emit(\"ready\", data);\n } else if (event === \"RESUMED\") {\n // A successful RESUME ends the reconnect cycle just like READY:\n // reset the backoff counter so a later disconnect starts from the\n // base delay, mark the connection READY, and surface a Discord.js-\n // familiar `resumed` event.\n this.#reconnect.reset();\n this.#setState(GatewayState.Ready);\n this.#emit(\"resumed\", data);\n }\n this.#emit(\"RAW\", { event: event ?? \"UNKNOWN\", data });\n if (this.#closed) return;\n this.#emit(event ?? \"dispatch\", data);\n }\n #handleHello(interval: number): void {\n this.#setState(\n this.#session.canResume ? GatewayState.Resume : GatewayState.Hello,\n );\n this.#heartbeat.start(interval);\n this.#identifyOrResume();\n }\n #identifyOrResume(): void {\n const intent = this.#session.handshake();\n // IDENTIFY/RESUME are privileged for the same reason heartbeats are:\n // dropping one leaves the shard connected but never READY, recoverable\n // only via the zombie timeout. Application traffic must never starve\n // the handshake out of the send budget.\n if (intent.type === \"resume\") {\n this.#setState(GatewayState.Resume);\n this.#dispatch(resumePayload(this.#options.token, intent), true);\n return;\n }\n this.#setState(GatewayState.Identify);\n this.#dispatch(\n identifyPayload({\n token: this.#options.token,\n intents: this.#options.intents,\n shardId: this.#options.shardId,\n shardCount: this.#options.shardCount,\n properties: this.#options.properties,\n presence: this.#options.presence,\n }),\n true,\n );\n }\n #close(code: number, token: number): void {\n this.#clearTimers();\n const action: CloseAction = this.#reconnect.classifyClose(\n code,\n this.#session.canResume,\n );\n this.#emit(\"close\", { code, action });\n if (this.#closed || !this.#reconnect.enabled || action === \"stop\") {\n // A fatal close is terminal: the condition behind 4004/4013/4014\n // cannot fix itself, so the Gateway settles as CLOSED rather than\n // sitting in CONNECT looking like it is about to try again (WS-003).\n if (action === \"stop\") this.#closed = true;\n this.#setState(\n this.#closed ? GatewayState.Closed : GatewayState.Connect,\n );\n if (this.#reconnect.connecting)\n this.#reconnect.settle(\n new GatewayError(\n `Gateway closed before READY (code ${code}).`,\n code,\n ),\n );\n return;\n }\n if (action === \"identify\")\n // Fresh IDENTIFY: drop the session AND its resume host so the\n // reconnect targets the main Gateway, not a stale resume URL.\n this.#session.invalidate(token, \"session-timeout\");\n this.#setState(GatewayState.Reconnect);\n this.#scheduleReconnect();\n }\n #scheduleReconnect(): void {\n if (this.#closed) return;\n const result = this.#reconnect.schedule(() =>\n this.#open(this.#session.connectURL(DEFAULT_GATEWAY_URL)),\n );\n if (result.scheduled || result.reason !== \"exhausted\") return;\n this.#reconnect.settle(\n new GatewayError(\"Gateway reconnect attempts exhausted.\"),\n );\n this.#setState(GatewayState.Connect);\n }\n #settleConnect(error?: GatewayError): void {\n this.#reconnect.settle(error);\n }\n #clearTimers(): void {\n this.#reconnect.cancel();\n this.#heartbeat.stop();\n }\n #normalizeError(error: unknown): GatewayError {\n return error instanceof GatewayError\n ? error\n : new GatewayError(\"Gateway connection failed.\", undefined, {\n cause: error,\n });\n }\n #emitError(error: unknown): void {\n this.#emit(\n \"error\",\n error instanceof Error ? error : new GatewayError(String(error)),\n );\n }\n #emit(event: string, data: unknown): void {\n for (const listener of this.#listeners.get(event) ?? []) {\n try {\n const result = listener(data);\n if (\n result &&\n typeof (result as PromiseLike<unknown>).then === \"function\"\n )\n void Promise.resolve(result).catch((error) => {\n if (event !== \"error\") this.#emitError(error);\n });\n } catch (error) {\n if (event !== \"error\") this.#emitError(error);\n }\n }\n }\n /** Changes the Gateway lifecycle state. @param next Next lifecycle state. */\n #setState(next: GatewayState): void {\n if (this.state === next) return;\n const previous = this.state;\n this.state = next;\n this.#emit(\"stateChange\", { previous, next });\n }\n}\n"
|
|
17
17
|
],
|
|
18
|
-
"mappings": "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",
|
|
19
|
-
"debugId": "
|
|
18
|
+
"mappings": "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",
|
|
19
|
+
"debugId": "0B3294008B8C43CB64756E2164756E21",
|
|
20
20
|
"names": []
|
|
21
21
|
}
|