shardwire 1.2.0 → 1.3.0
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 +101 -42
- package/dist/index.d.mts +20 -6
- package/dist/index.d.ts +20 -6
- package/dist/index.js +70 -19
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +70 -19
- package/dist/index.mjs.map +1 -1
- package/package.json +82 -75
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/discord/catalog.ts","../src/discord/runtime/adapter.ts","../src/discord/runtime/discordjs-adapter.ts","../src/utils/logger.ts","../src/utils/cache.ts","../src/discord/runtime/serializers.ts","../src/bridge/transport/server.ts","../src/utils/id.ts","../src/bridge/subscriptions.ts","../src/bridge/transport/security.ts","../src/bridge/transport/protocol.ts","../src/utils/semaphore.ts","../src/bridge/validation.ts","../src/bot/index.ts","../src/discord/types.ts","../src/bridge/transport/socket.ts","../src/utils/backoff.ts","../src/app/index.ts"],"sourcesContent":["import { GatewayIntentBits } from \"discord.js\";\nimport type { BotActionName, BotEventName, BotIntentName } from \"./types\";\n\nexport const BOT_EVENT_NAMES = [\n \"ready\",\n \"interactionCreate\",\n \"messageCreate\",\n \"messageUpdate\",\n \"messageDelete\",\n \"messageReactionAdd\",\n \"messageReactionRemove\",\n \"guildCreate\",\n \"guildDelete\",\n \"guildMemberAdd\",\n \"guildMemberRemove\",\n \"guildMemberUpdate\",\n \"threadCreate\",\n \"threadUpdate\",\n \"threadDelete\",\n] as const satisfies readonly BotEventName[];\n\nexport const BOT_ACTION_NAMES = [\n \"sendMessage\",\n \"editMessage\",\n \"deleteMessage\",\n \"replyToInteraction\",\n \"deferInteraction\",\n \"deferUpdateInteraction\",\n \"followUpInteraction\",\n \"editInteractionReply\",\n \"deleteInteractionReply\",\n \"updateInteraction\",\n \"showModal\",\n \"fetchMessage\",\n \"fetchMember\",\n \"banMember\",\n \"kickMember\",\n \"addMemberRole\",\n \"removeMemberRole\",\n \"addMessageReaction\",\n \"removeOwnMessageReaction\",\n] as const satisfies readonly BotActionName[];\n\nconst DISCORD_GATEWAY_INTENT_ENTRIES = Object.entries(GatewayIntentBits).filter(\n (entry): entry is [BotIntentName, number] => typeof entry[1] === \"number\",\n);\n\nexport const BOT_INTENT_BITS: Record<BotIntentName, number> = Object.fromEntries(\n DISCORD_GATEWAY_INTENT_ENTRIES,\n) as Record<BotIntentName, number>;\n\nconst EVENT_REQUIRED_INTENTS: Record<BotEventName, readonly BotIntentName[]> = {\n ready: [],\n interactionCreate: [],\n messageCreate: [\"GuildMessages\"],\n messageUpdate: [\"GuildMessages\"],\n messageDelete: [\"GuildMessages\"],\n messageReactionAdd: [\"GuildMessageReactions\"],\n messageReactionRemove: [\"GuildMessageReactions\"],\n guildCreate: [\"Guilds\"],\n guildDelete: [\"Guilds\"],\n guildMemberAdd: [\"GuildMembers\"],\n guildMemberRemove: [\"GuildMembers\"],\n guildMemberUpdate: [\"GuildMembers\"],\n threadCreate: [\"Guilds\"],\n threadUpdate: [\"Guilds\"],\n threadDelete: [\"Guilds\"],\n};\n\nexport function getAvailableEvents(intents: readonly BotIntentName[]): BotEventName[] {\n const enabled = new Set(intents);\n return BOT_EVENT_NAMES.filter((eventName) => EVENT_REQUIRED_INTENTS[eventName].every((intent) => enabled.has(intent)));\n}\n","import type {\n BotActionName,\n BotActionPayloadMap,\n BotActionResultDataMap,\n BotEventName,\n BotEventPayloadMap,\n BotIntentName,\n ShardwireLogger,\n Unsubscribe,\n} from \"../types\";\n\nexport interface DiscordRuntimeOptions {\n token: string;\n intents: readonly BotIntentName[];\n logger?: ShardwireLogger;\n}\n\nexport interface DiscordRuntimeAdapter {\n ready(): Promise<void>;\n close(): Promise<void>;\n isReady(): boolean;\n on<K extends BotEventName>(name: K, handler: (payload: BotEventPayloadMap[K]) => void): Unsubscribe;\n executeAction<K extends BotActionName>(\n name: K,\n payload: BotActionPayloadMap[K],\n ): Promise<BotActionResultDataMap[K]>;\n}\n\nexport class ActionExecutionError extends Error {\n constructor(\n public readonly code:\n | \"FORBIDDEN\"\n | \"NOT_FOUND\"\n | \"INVALID_REQUEST\"\n | \"INTERNAL_ERROR\"\n | \"SERVICE_UNAVAILABLE\",\n message: string,\n public readonly details?: unknown,\n ) {\n super(message);\n this.name = \"ActionExecutionError\";\n }\n}\n","import type { Snowflake } from \"discord-api-types/v10\";\nimport {\n Client,\n DiscordAPIError,\n Events,\n type Guild,\n type GuildMember,\n type Interaction,\n type Message,\n type MessageReaction,\n MessageFlags,\n type PartialMessageReaction,\n type PartialUser,\n type PartialMessage,\n type PartialGuildMember,\n type MessageComponentInteraction,\n type ThreadChannel,\n type User,\n} from \"discord.js\";\nimport { BOT_INTENT_BITS } from \"../catalog\";\nimport type {\n BotActionName,\n BotActionPayloadMap,\n BotActionResultDataMap,\n BotEventName,\n BotEventPayloadMap,\n BridgeMessageInput,\n EventEnvelopeBase,\n Unsubscribe,\n} from \"../types\";\nimport { withLogger } from \"../../utils/logger\";\nimport { DedupeCache } from \"../../utils/cache\";\nimport { ActionExecutionError, type DiscordRuntimeAdapter, type DiscordRuntimeOptions } from \"./adapter\";\nimport {\n serializeDeletedMessage,\n serializeGuild,\n serializeGuildMember,\n serializeInteraction,\n serializeMessageReaction,\n serializeMessage,\n serializeThread,\n serializeUser,\n} from \"./serializers\";\n\ntype ReplyCapableInteraction = Interaction & {\n replied: boolean;\n deferred: boolean;\n reply(options: unknown): Promise<unknown>;\n deferReply(options?: unknown): Promise<unknown>;\n followUp(options: unknown): Promise<unknown>;\n editReply(options: unknown): Promise<unknown>;\n deleteReply(): Promise<unknown>;\n};\n\ninterface SendCapableChannel {\n send(options: Record<string, unknown>): Promise<Message>;\n}\n\ninterface MessageManageableChannel extends SendCapableChannel {\n messages: {\n fetch(messageId: Snowflake): Promise<Message | PartialMessage>;\n };\n}\n\nconst INTERACTION_CACHE_TTL_MS = 15 * 60 * 1000;\nconst DISCORD_FORBIDDEN_CODES = new Set<number>([50001, 50013]);\nconst DISCORD_NOT_FOUND_CODES = new Set<number>([10003, 10004, 10007, 10008, 10011, 10062]);\nconst DISCORD_INVALID_REQUEST_CODES = new Set<number>([50035]);\n\nfunction isSendCapableChannel(channel: unknown): channel is SendCapableChannel {\n return Boolean(channel && typeof (channel as { send?: unknown }).send === \"function\");\n}\n\nfunction isMessageManageableChannel(channel: unknown): channel is MessageManageableChannel {\n if (!isSendCapableChannel(channel)) {\n return false;\n }\n const messages = (channel as { messages?: { fetch?: unknown } }).messages;\n return Boolean(messages && typeof messages.fetch === \"function\");\n}\n\nfunction toSendOptions(input: BridgeMessageInput): Record<string, unknown> {\n return {\n ...(input.content !== undefined ? { content: input.content } : {}),\n ...(input.embeds !== undefined ? { embeds: input.embeds } : {}),\n ...(input.allowedMentions !== undefined ? { allowedMentions: input.allowedMentions } : {}),\n ...(input.components !== undefined ? { components: input.components } : {}),\n ...(input.flags !== undefined ? { flags: input.flags } : {}),\n ...(input.stickerIds !== undefined ? { stickers: input.stickerIds } : {}),\n };\n}\n\nfunction extractDiscordErrorDetails(error: unknown): { status?: number; code?: number; message?: string } {\n if (error instanceof DiscordAPIError) {\n return {\n ...(typeof error.status === \"number\" ? { status: error.status } : {}),\n ...(typeof error.code === \"number\" ? { code: error.code } : {}),\n message: error.message,\n };\n }\n if (error && typeof error === \"object\") {\n const candidate = error as { status?: unknown; code?: unknown; message?: unknown };\n return {\n ...(typeof candidate.status === \"number\" ? { status: candidate.status } : {}),\n ...(typeof candidate.code === \"number\" ? { code: candidate.code } : {}),\n ...(typeof candidate.message === \"string\" ? { message: candidate.message } : {}),\n };\n }\n return {};\n}\n\nexport function mapDiscordErrorToActionExecutionError(error: unknown): ActionExecutionError | null {\n const details = extractDiscordErrorDetails(error);\n const message = details.message ?? (error instanceof Error ? error.message : \"Discord action failed.\");\n\n const detailPayload = {\n ...(typeof details.status === \"number\" ? { discordStatus: details.status } : {}),\n ...(typeof details.code === \"number\" ? { discordCode: details.code } : {}),\n };\n\n if (\n details.status === 403 ||\n (details.code !== undefined && DISCORD_FORBIDDEN_CODES.has(details.code))\n ) {\n return new ActionExecutionError(\"FORBIDDEN\", message, detailPayload);\n }\n if (\n details.status === 404 ||\n (details.code !== undefined && DISCORD_NOT_FOUND_CODES.has(details.code))\n ) {\n return new ActionExecutionError(\"NOT_FOUND\", message, detailPayload);\n }\n if (\n details.status === 400 ||\n (details.code !== undefined && DISCORD_INVALID_REQUEST_CODES.has(details.code))\n ) {\n return new ActionExecutionError(\"INVALID_REQUEST\", message, detailPayload);\n }\n if (details.status === 429) {\n return new ActionExecutionError(\"SERVICE_UNAVAILABLE\", message, {\n discordStatus: 429,\n retryable: true,\n ...(details.code !== undefined ? { discordCode: details.code } : {}),\n });\n }\n return null;\n}\n\nexport class DiscordJsRuntimeAdapter implements DiscordRuntimeAdapter {\n private readonly client: Client;\n private readonly logger;\n private readonly interactionCache = new DedupeCache<Interaction>(INTERACTION_CACHE_TTL_MS);\n private readonly actionHandlers: {\n [K in BotActionName]: (payload: BotActionPayloadMap[K]) => Promise<BotActionResultDataMap[K]>;\n };\n private readyPromise: Promise<void> | null = null;\n private hasReady = false;\n\n constructor(private readonly options: DiscordRuntimeOptions) {\n const intentBits = options.intents.map((intent) => BOT_INTENT_BITS[intent]);\n this.logger = withLogger(options.logger);\n this.client = new Client({\n intents: intentBits,\n });\n this.client.once(Events.ClientReady, () => {\n this.hasReady = true;\n });\n this.actionHandlers = {\n sendMessage: (payload) => this.sendMessage(payload),\n editMessage: (payload) => this.editMessage(payload),\n deleteMessage: (payload) => this.deleteMessage(payload),\n replyToInteraction: (payload) => this.replyToInteraction(payload),\n deferInteraction: (payload) => this.deferInteraction(payload),\n deferUpdateInteraction: (payload) => this.deferUpdateInteraction(payload),\n followUpInteraction: (payload) => this.followUpInteraction(payload),\n editInteractionReply: (payload) => this.editInteractionReply(payload),\n deleteInteractionReply: (payload) => this.deleteInteractionReply(payload),\n updateInteraction: (payload) => this.updateInteraction(payload),\n showModal: (payload) => this.showModal(payload),\n fetchMessage: (payload) => this.fetchMessage(payload),\n fetchMember: (payload) => this.fetchMember(payload),\n banMember: (payload) => this.banMember(payload),\n kickMember: (payload) => this.kickMember(payload),\n addMemberRole: (payload) => this.addMemberRole(payload),\n removeMemberRole: (payload) => this.removeMemberRole(payload),\n addMessageReaction: (payload) => this.addMessageReaction(payload),\n removeOwnMessageReaction: (payload) => this.removeOwnMessageReaction(payload),\n };\n }\n\n private shardEnvelope(): Pick<EventEnvelopeBase, \"shardId\"> {\n const shardId = this.client.shard?.ids?.[0];\n return shardId !== undefined ? { shardId } : {};\n }\n\n isReady(): boolean {\n return this.hasReady && this.client.isReady();\n }\n\n ready(): Promise<void> {\n if (this.readyPromise) {\n return this.readyPromise;\n }\n if (this.isReady()) {\n return Promise.resolve();\n }\n this.readyPromise = new Promise<void>((resolve, reject) => {\n const onReady = () => {\n cleanup();\n this.hasReady = true;\n resolve();\n };\n const onError = (error: unknown) => {\n cleanup();\n reject(error instanceof Error ? error : new Error(String(error)));\n };\n const cleanup = () => {\n this.client.off(Events.ClientReady, onReady);\n this.client.off(\"error\", onError);\n };\n\n this.client.once(Events.ClientReady, onReady);\n this.client.once(\"error\", onError);\n void this.client.login(this.options.token).catch((error: unknown) => {\n cleanup();\n reject(error instanceof Error ? error : new Error(String(error)));\n });\n });\n return this.readyPromise;\n }\n\n async close(): Promise<void> {\n this.client.removeAllListeners();\n await this.client.destroy();\n this.readyPromise = null;\n this.hasReady = false;\n }\n\n on<K extends BotEventName>(name: K, handler: (payload: BotEventPayloadMap[K]) => void): Unsubscribe {\n switch (name) {\n case \"ready\": {\n const listener = () => {\n if (!this.client.user) {\n return;\n }\n handler({\n receivedAt: Date.now(),\n ...this.shardEnvelope(),\n user: serializeUser(this.client.user),\n } as BotEventPayloadMap[K]);\n };\n this.client.on(Events.ClientReady, listener);\n if (this.client.isReady() && this.client.user) {\n listener();\n }\n return () => {\n this.client.off(Events.ClientReady, listener);\n };\n }\n case \"interactionCreate\": {\n const listener = (interaction: Interaction) => {\n this.interactionCache.set(interaction.id, interaction);\n handler({\n receivedAt: Date.now(),\n ...this.shardEnvelope(),\n interaction: serializeInteraction(interaction),\n } as BotEventPayloadMap[K]);\n };\n this.client.on(Events.InteractionCreate, listener);\n return () => {\n this.client.off(Events.InteractionCreate, listener);\n };\n }\n case \"messageCreate\": {\n const listener = (message: Message) => {\n handler({\n receivedAt: Date.now(),\n ...this.shardEnvelope(),\n message: serializeMessage(message),\n } as BotEventPayloadMap[K]);\n };\n this.client.on(Events.MessageCreate, listener);\n return () => {\n this.client.off(Events.MessageCreate, listener);\n };\n }\n case \"messageUpdate\": {\n const listener = (oldMessage: Message | PartialMessage, newMessage: Message | PartialMessage) => {\n handler({\n receivedAt: Date.now(),\n ...this.shardEnvelope(),\n oldMessage: serializeMessage(oldMessage),\n message: serializeMessage(newMessage),\n } as BotEventPayloadMap[K]);\n };\n this.client.on(Events.MessageUpdate, listener);\n return () => {\n this.client.off(Events.MessageUpdate, listener);\n };\n }\n case \"messageDelete\": {\n const listener = (message: Message | PartialMessage) => {\n handler({\n receivedAt: Date.now(),\n ...this.shardEnvelope(),\n message: serializeDeletedMessage(message),\n } as BotEventPayloadMap[K]);\n };\n this.client.on(Events.MessageDelete, listener);\n return () => {\n this.client.off(Events.MessageDelete, listener);\n };\n }\n case \"messageReactionAdd\": {\n const listener = (reaction: MessageReaction | PartialMessageReaction, user: User | PartialUser) => {\n handler({\n receivedAt: Date.now(),\n ...this.shardEnvelope(),\n reaction: serializeMessageReaction(reaction, user),\n } as BotEventPayloadMap[K]);\n };\n this.client.on(Events.MessageReactionAdd, listener);\n return () => {\n this.client.off(Events.MessageReactionAdd, listener);\n };\n }\n case \"messageReactionRemove\": {\n const listener = (reaction: MessageReaction | PartialMessageReaction, user: User | PartialUser) => {\n handler({\n receivedAt: Date.now(),\n ...this.shardEnvelope(),\n reaction: serializeMessageReaction(reaction, user),\n } as BotEventPayloadMap[K]);\n };\n this.client.on(Events.MessageReactionRemove, listener);\n return () => {\n this.client.off(Events.MessageReactionRemove, listener);\n };\n }\n case \"guildMemberAdd\": {\n const listener = (member: GuildMember) => {\n handler({\n receivedAt: Date.now(),\n ...this.shardEnvelope(),\n member: serializeGuildMember(member),\n } as BotEventPayloadMap[K]);\n };\n this.client.on(Events.GuildMemberAdd, listener);\n return () => {\n this.client.off(Events.GuildMemberAdd, listener);\n };\n }\n case \"guildMemberRemove\": {\n const listener = (member: GuildMember | PartialGuildMember) => {\n handler({\n receivedAt: Date.now(),\n ...this.shardEnvelope(),\n member: serializeGuildMember(member),\n } as BotEventPayloadMap[K]);\n };\n this.client.on(Events.GuildMemberRemove, listener);\n return () => {\n this.client.off(Events.GuildMemberRemove, listener);\n };\n }\n case \"guildMemberUpdate\": {\n const listener = (oldMember: GuildMember | PartialGuildMember, newMember: GuildMember) => {\n handler({\n receivedAt: Date.now(),\n ...this.shardEnvelope(),\n oldMember: serializeGuildMember(oldMember),\n member: serializeGuildMember(newMember),\n } as BotEventPayloadMap[K]);\n };\n this.client.on(Events.GuildMemberUpdate, listener);\n return () => {\n this.client.off(Events.GuildMemberUpdate, listener);\n };\n }\n case \"guildCreate\": {\n const listener = (guild: Guild) => {\n handler({\n receivedAt: Date.now(),\n ...this.shardEnvelope(),\n guild: serializeGuild(guild),\n } as BotEventPayloadMap[K]);\n };\n this.client.on(Events.GuildCreate, listener);\n return () => {\n this.client.off(Events.GuildCreate, listener);\n };\n }\n case \"guildDelete\": {\n const listener = (guild: Guild) => {\n handler({\n receivedAt: Date.now(),\n ...this.shardEnvelope(),\n guild: {\n id: guild.id,\n name: guild.name ?? \"Unknown\",\n icon: guild.icon,\n ...(guild.ownerId ? { ownerId: guild.ownerId } : {}),\n },\n } as BotEventPayloadMap[K]);\n };\n this.client.on(Events.GuildDelete, listener);\n return () => {\n this.client.off(Events.GuildDelete, listener);\n };\n }\n case \"threadCreate\": {\n const listener = (thread: ThreadChannel) => {\n handler({\n receivedAt: Date.now(),\n ...this.shardEnvelope(),\n thread: serializeThread(thread),\n } as BotEventPayloadMap[K]);\n };\n this.client.on(Events.ThreadCreate, listener);\n return () => {\n this.client.off(Events.ThreadCreate, listener);\n };\n }\n case \"threadUpdate\": {\n const listener = (oldThread: ThreadChannel, newThread: ThreadChannel) => {\n handler({\n receivedAt: Date.now(),\n ...this.shardEnvelope(),\n oldThread: serializeThread(oldThread),\n thread: serializeThread(newThread),\n } as BotEventPayloadMap[K]);\n };\n this.client.on(Events.ThreadUpdate, listener);\n return () => {\n this.client.off(Events.ThreadUpdate, listener);\n };\n }\n case \"threadDelete\": {\n const listener = (thread: ThreadChannel) => {\n handler({\n receivedAt: Date.now(),\n ...this.shardEnvelope(),\n thread: serializeThread(thread),\n } as BotEventPayloadMap[K]);\n };\n this.client.on(Events.ThreadDelete, listener);\n return () => {\n this.client.off(Events.ThreadDelete, listener);\n };\n }\n default:\n return () => undefined;\n }\n }\n\n async executeAction<K extends BotActionName>(\n name: K,\n payload: BotActionPayloadMap[K],\n ): Promise<BotActionResultDataMap[K]> {\n await this.ready();\n const handler = this.actionHandlers[name];\n try {\n return await handler(payload);\n } catch (error) {\n if (error instanceof ActionExecutionError) {\n throw error;\n }\n const mappedError = mapDiscordErrorToActionExecutionError(error);\n if (mappedError) {\n throw mappedError;\n }\n this.logger.error(\"Discord action execution failed.\", { action: name, error: String(error) });\n throw new ActionExecutionError(\"INTERNAL_ERROR\", error instanceof Error ? error.message : \"Discord action failed.\");\n }\n }\n\n private async fetchSendableChannel(channelId: Snowflake): Promise<SendCapableChannel> {\n const channel = await this.client.channels.fetch(channelId);\n if (!isSendCapableChannel(channel)) {\n throw new ActionExecutionError(\"NOT_FOUND\", `Channel \"${channelId}\" cannot send messages.`);\n }\n return channel;\n }\n\n private async fetchMessageChannel(channelId: Snowflake): Promise<MessageManageableChannel> {\n const channel = await this.client.channels.fetch(channelId);\n if (!isMessageManageableChannel(channel)) {\n throw new ActionExecutionError(\"NOT_FOUND\", `Channel \"${channelId}\" does not support message operations.`);\n }\n return channel;\n }\n\n private getInteraction(interactionId: Snowflake): Interaction {\n const interaction = this.interactionCache.get(interactionId);\n if (!interaction) {\n throw new ActionExecutionError(\"NOT_FOUND\", `Interaction \"${interactionId}\" is no longer available.`);\n }\n return interaction;\n }\n\n private getReplyCapableInteraction(interactionId: Snowflake): ReplyCapableInteraction {\n const interaction = this.getInteraction(interactionId);\n if (!isReplyCapableInteraction(interaction)) {\n throw new ActionExecutionError(\n \"INVALID_REQUEST\",\n `Interaction \"${interactionId}\" does not support reply-style acknowledgements.`,\n );\n }\n return interaction;\n }\n\n private getMessageComponentInteraction(interactionId: Snowflake): MessageComponentInteraction {\n const interaction = this.getInteraction(interactionId);\n if (!interaction.isMessageComponent()) {\n throw new ActionExecutionError(\n \"INVALID_REQUEST\",\n `Interaction \"${interactionId}\" is not a message component interaction.`,\n );\n }\n return interaction;\n }\n\n private async sendMessage(payload: BotActionPayloadMap[\"sendMessage\"]) {\n const channel = await this.fetchSendableChannel(payload.channelId);\n const message = await channel.send(toSendOptions(payload));\n return serializeMessage(message);\n }\n\n private async editMessage(payload: BotActionPayloadMap[\"editMessage\"]) {\n const channel = await this.fetchMessageChannel(payload.channelId);\n const message = await channel.messages.fetch(payload.messageId);\n const edited = await message.edit(toSendOptions(payload));\n return serializeMessage(edited);\n }\n\n private async deleteMessage(payload: BotActionPayloadMap[\"deleteMessage\"]) {\n const channel = await this.fetchMessageChannel(payload.channelId);\n const message = await channel.messages.fetch(payload.messageId);\n await message.delete();\n return {\n deleted: true,\n channelId: payload.channelId,\n messageId: payload.messageId,\n } as const;\n }\n\n private async replyToInteraction(payload: BotActionPayloadMap[\"replyToInteraction\"]) {\n const interaction = this.getReplyCapableInteraction(payload.interactionId);\n if (interaction.replied || interaction.deferred) {\n throw new ActionExecutionError(\"INVALID_REQUEST\", `Interaction \"${payload.interactionId}\" has already been acknowledged.`);\n }\n const reply = await interaction.reply({\n ...toSendOptions(payload),\n fetchReply: true,\n ...(payload.ephemeral ? { flags: MessageFlags.Ephemeral } : {}),\n });\n return serializeMessage(reply as Message);\n }\n\n private async deferInteraction(payload: BotActionPayloadMap[\"deferInteraction\"]) {\n const interaction = this.getReplyCapableInteraction(payload.interactionId);\n if (interaction.replied) {\n throw new ActionExecutionError(\"INVALID_REQUEST\", `Interaction \"${payload.interactionId}\" has already been replied to.`);\n }\n if (!interaction.deferred) {\n await interaction.deferReply({\n ...(payload.ephemeral ? { flags: MessageFlags.Ephemeral } : {}),\n });\n }\n return {\n deferred: true,\n interactionId: payload.interactionId,\n } as const;\n }\n\n private async deferUpdateInteraction(payload: BotActionPayloadMap[\"deferUpdateInteraction\"]) {\n const interaction = this.getMessageComponentInteraction(payload.interactionId);\n await interaction.deferUpdate();\n return {\n deferred: true,\n interactionId: payload.interactionId,\n } as const;\n }\n\n private async followUpInteraction(payload: BotActionPayloadMap[\"followUpInteraction\"]) {\n const interaction = this.getReplyCapableInteraction(payload.interactionId);\n if (!interaction.replied && !interaction.deferred) {\n throw new ActionExecutionError(\"INVALID_REQUEST\", `Interaction \"${payload.interactionId}\" has not been acknowledged yet.`);\n }\n const followUp = await interaction.followUp({\n ...toSendOptions(payload),\n ...(payload.ephemeral ? { flags: MessageFlags.Ephemeral } : {}),\n });\n return serializeMessage(followUp as Message);\n }\n\n private async editInteractionReply(payload: BotActionPayloadMap[\"editInteractionReply\"]) {\n const interaction = this.getReplyCapableInteraction(payload.interactionId);\n const updated = await interaction.editReply({\n ...toSendOptions(payload),\n fetchReply: true,\n });\n return serializeMessage(updated as Message);\n }\n\n private async deleteInteractionReply(payload: BotActionPayloadMap[\"deleteInteractionReply\"]) {\n const interaction = this.getReplyCapableInteraction(payload.interactionId);\n await interaction.deleteReply();\n return {\n deleted: true,\n interactionId: payload.interactionId,\n } as const;\n }\n\n private async updateInteraction(payload: BotActionPayloadMap[\"updateInteraction\"]) {\n const interaction = this.getMessageComponentInteraction(payload.interactionId);\n const updated = await interaction.update({\n ...toSendOptions(payload),\n fetchReply: true,\n });\n return serializeMessage(updated);\n }\n\n private async showModal(payload: BotActionPayloadMap[\"showModal\"]) {\n const interaction = this.getMessageComponentInteraction(payload.interactionId);\n await interaction.showModal({\n title: payload.title,\n customId: payload.customId,\n components: payload.components,\n } as never);\n return {\n shown: true,\n interactionId: payload.interactionId,\n } as const;\n }\n\n private async fetchMessage(payload: BotActionPayloadMap[\"fetchMessage\"]) {\n const channel = await this.fetchMessageChannel(payload.channelId);\n const message = await channel.messages.fetch(payload.messageId);\n return serializeMessage(message);\n }\n\n private async fetchMember(payload: BotActionPayloadMap[\"fetchMember\"]) {\n const guild = await this.client.guilds.fetch(payload.guildId);\n const member = await guild.members.fetch(payload.userId);\n return serializeGuildMember(member);\n }\n\n private async banMember(payload: BotActionPayloadMap[\"banMember\"]) {\n const guild = await this.client.guilds.fetch(payload.guildId);\n await guild.members.ban(payload.userId, {\n ...(payload.reason ? { reason: payload.reason } : {}),\n ...(payload.deleteMessageSeconds !== undefined ? { deleteMessageSeconds: payload.deleteMessageSeconds } : {}),\n });\n return {\n guildId: payload.guildId,\n userId: payload.userId,\n };\n }\n\n private async kickMember(payload: BotActionPayloadMap[\"kickMember\"]) {\n const guild = await this.client.guilds.fetch(payload.guildId);\n const member = await guild.members.fetch(payload.userId);\n await member.kick(payload.reason);\n return {\n guildId: payload.guildId,\n userId: payload.userId,\n };\n }\n\n private async addMemberRole(payload: BotActionPayloadMap[\"addMemberRole\"]) {\n const guild = await this.client.guilds.fetch(payload.guildId);\n const member = await guild.members.fetch(payload.userId);\n await member.roles.add(payload.roleId, payload.reason);\n const refreshed = await member.fetch();\n return serializeGuildMember(refreshed);\n }\n\n private async removeMemberRole(payload: BotActionPayloadMap[\"removeMemberRole\"]) {\n const guild = await this.client.guilds.fetch(payload.guildId);\n const member = await guild.members.fetch(payload.userId);\n await member.roles.remove(payload.roleId, payload.reason);\n const refreshed = await member.fetch();\n return serializeGuildMember(refreshed);\n }\n\n private async addMessageReaction(payload: BotActionPayloadMap[\"addMessageReaction\"]) {\n const channel = await this.fetchMessageChannel(payload.channelId);\n const message = await channel.messages.fetch(payload.messageId);\n await message.react(payload.emoji);\n return {\n messageId: payload.messageId,\n channelId: payload.channelId,\n emoji: payload.emoji,\n } as const;\n }\n\n private async removeOwnMessageReaction(payload: BotActionPayloadMap[\"removeOwnMessageReaction\"]) {\n const channel = await this.fetchMessageChannel(payload.channelId);\n const message = await channel.messages.fetch(payload.messageId);\n const ownUserId = this.client.user?.id;\n if (!ownUserId) {\n throw new ActionExecutionError(\"INTERNAL_ERROR\", \"Bot user is not available.\");\n }\n\n const reaction = [...message.reactions.cache.values()].find((candidate) => {\n return (\n candidate.emoji.identifier === payload.emoji ||\n candidate.emoji.name === payload.emoji ||\n candidate.emoji.toString() === payload.emoji\n );\n });\n if (!reaction) {\n throw new ActionExecutionError(\"NOT_FOUND\", `Reaction \"${payload.emoji}\" was not found on message \"${payload.messageId}\".`);\n }\n\n await reaction.users.remove(ownUserId);\n return {\n messageId: payload.messageId,\n channelId: payload.channelId,\n emoji: payload.emoji,\n } as const;\n }\n}\n\nexport function createDiscordJsRuntimeAdapter(options: DiscordRuntimeOptions): DiscordRuntimeAdapter {\n return new DiscordJsRuntimeAdapter(options);\n}\n\nfunction isReplyCapableInteraction(interaction: Interaction): interaction is ReplyCapableInteraction {\n return (\n interaction.isRepliable() &&\n typeof (interaction as { reply?: unknown }).reply === \"function\" &&\n typeof (interaction as { deferReply?: unknown }).deferReply === \"function\" &&\n typeof (interaction as { followUp?: unknown }).followUp === \"function\" &&\n typeof (interaction as { editReply?: unknown }).editReply === \"function\" &&\n typeof (interaction as { deleteReply?: unknown }).deleteReply === \"function\"\n );\n}\n","import type { ShardwireLogger } from \"../discord/types\";\n\nexport function withLogger(logger?: ShardwireLogger): Required<ShardwireLogger> {\n return {\n debug: logger?.debug ?? (() => undefined),\n info: logger?.info ?? (() => undefined),\n warn: logger?.warn ?? (() => undefined),\n error: logger?.error ?? (() => undefined),\n };\n}\n","export class DedupeCache<T> {\n private readonly cache = new Map<string, { value: T; expiresAt: number }>();\n\n constructor(private readonly ttlMs: number) {}\n\n get(key: string): T | undefined {\n const entry = this.cache.get(key);\n if (!entry) {\n return undefined;\n }\n if (entry.expiresAt <= Date.now()) {\n this.cache.delete(key);\n return undefined;\n }\n return entry.value;\n }\n\n set(key: string, value: T): void {\n this.cache.set(key, { value, expiresAt: Date.now() + this.ttlMs });\n }\n}\n","import type { APIEmbed } from \"discord-api-types/v10\";\nimport type {\n AnySelectMenuInteraction,\n ChatInputCommandInteraction,\n Guild,\n GuildMember,\n Interaction,\n Message,\n MessageReaction,\n ModalSubmitInteraction,\n PartialGuildMember,\n PartialMessage,\n PartialMessageReaction,\n PartialUser,\n ThreadChannel,\n User,\n} from \"discord.js\";\nimport type {\n BridgeDeletedMessage,\n BridgeGuild,\n BridgeGuildMember,\n BridgeInteraction,\n BridgeMessage,\n BridgeMessageReaction,\n BridgeReactionEmoji,\n BridgeThread,\n BridgeUser,\n} from \"../types\";\n\nfunction serializeEmbeds(message: Message | PartialMessage): APIEmbed[] {\n return message.embeds.map((embed) => embed.toJSON());\n}\n\nexport function serializeUser(user: User | PartialUser): BridgeUser {\n return {\n id: user.id,\n username: user.username ?? \"unknown\",\n discriminator: user.discriminator ?? \"0\",\n ...(user.globalName !== undefined ? { globalName: user.globalName } : {}),\n avatarUrl: user.displayAvatarURL() || null,\n bot: user.bot ?? false,\n system: user.system ?? false,\n };\n}\n\nexport function serializeGuildMember(member: GuildMember | PartialGuildMember): BridgeGuildMember {\n return {\n id: member.id,\n guildId: member.guild.id,\n ...(\"user\" in member && member.user ? { user: serializeUser(member.user) } : {}),\n ...(\"displayName\" in member && typeof member.displayName === \"string\" ? { displayName: member.displayName } : {}),\n ...(\"nickname\" in member ? { nickname: member.nickname ?? null } : {}),\n roles: \"roles\" in member && \"cache\" in member.roles ? [...member.roles.cache.keys()] : [],\n ...(\"joinedAt\" in member ? { joinedAt: member.joinedAt?.toISOString() ?? null } : {}),\n ...(\"premiumSince\" in member ? { premiumSince: member.premiumSince?.toISOString() ?? null } : {}),\n ...(\"pending\" in member && typeof member.pending === \"boolean\" ? { pending: member.pending } : {}),\n ...(\n \"communicationDisabledUntil\" in member\n ? { communicationDisabledUntil: member.communicationDisabledUntil?.toISOString() ?? null }\n : {}\n ),\n };\n}\n\nexport function serializeMessage(message: Message | PartialMessage): BridgeMessage {\n const reference = message.reference\n ? {\n ...(message.reference.messageId ? { messageId: message.reference.messageId } : {}),\n ...(message.reference.channelId ? { channelId: message.reference.channelId } : {}),\n ...(message.reference.guildId ? { guildId: message.reference.guildId } : {}),\n }\n : undefined;\n\n const components =\n \"components\" in message && message.components && message.components.length > 0\n ? message.components.map((row) => row.toJSON())\n : undefined;\n\n return {\n id: message.id,\n channelId: message.channelId,\n ...(message.guildId ? { guildId: message.guildId } : {}),\n ...(\"author\" in message && message.author ? { author: serializeUser(message.author) } : {}),\n ...(\"member\" in message && message.member ? { member: serializeGuildMember(message.member) } : {}),\n ...(\"content\" in message && typeof message.content === \"string\" ? { content: message.content } : {}),\n ...(\"createdAt\" in message ? { createdAt: message.createdAt.toISOString() } : {}),\n ...(\"editedAt\" in message ? { editedAt: message.editedAt ? message.editedAt.toISOString() : null } : {}),\n attachments:\n \"attachments\" in message\n ? [...message.attachments.values()].map((attachment) => ({\n id: attachment.id,\n name: attachment.name,\n url: attachment.url,\n ...(attachment.contentType !== undefined ? { contentType: attachment.contentType } : {}),\n size: attachment.size,\n }))\n : [],\n embeds: serializeEmbeds(message),\n ...(components ? { components } : {}),\n ...(reference ? { reference } : {}),\n } as BridgeMessage;\n}\n\nexport function serializeGuild(guild: Guild): BridgeGuild {\n return {\n id: guild.id,\n name: guild.name,\n ...(guild.icon !== null && guild.icon !== undefined ? { icon: guild.icon } : { icon: null }),\n ownerId: guild.ownerId,\n };\n}\n\nexport function serializeThread(thread: ThreadChannel): BridgeThread {\n return {\n id: thread.id,\n guildId: thread.guildId,\n parentId: thread.parentId,\n name: thread.name,\n type: thread.type,\n ...(typeof thread.archived === \"boolean\" ? { archived: thread.archived } : {}),\n ...(typeof thread.locked === \"boolean\" ? { locked: thread.locked } : {}),\n };\n}\n\nexport function serializeDeletedMessage(message: Message | PartialMessage): BridgeDeletedMessage {\n return {\n id: message.id,\n channelId: message.channelId,\n ...(message.guildId ? { guildId: message.guildId } : {}),\n deletedAt: new Date().toISOString(),\n };\n}\n\nfunction serializeReactionEmoji(reaction: MessageReaction | PartialMessageReaction): BridgeReactionEmoji {\n return {\n ...(reaction.emoji.id ? { id: reaction.emoji.id } : {}),\n ...(reaction.emoji.name !== undefined ? { name: reaction.emoji.name } : {}),\n ...(typeof reaction.emoji.animated === \"boolean\" ? { animated: reaction.emoji.animated } : {}),\n };\n}\n\nexport function serializeMessageReaction(\n reaction: MessageReaction | PartialMessageReaction,\n user?: User | PartialUser,\n): BridgeMessageReaction {\n return {\n messageId: reaction.message.id,\n channelId: reaction.message.channelId,\n ...(reaction.message.guildId ? { guildId: reaction.message.guildId } : {}),\n ...(user ? { user: serializeUser(user) } : {}),\n emoji: serializeReactionEmoji(reaction),\n };\n}\n\nfunction serializeChatInputOptions(interaction: ChatInputCommandInteraction): Record<string, unknown> {\n const options: Record<string, unknown> = {};\n for (const option of interaction.options.data) {\n if (option.options && option.options.length > 0) {\n options[option.name] = option.options.map((child) => child.value);\n continue;\n }\n options[option.name] = option.value ?? null;\n }\n return options;\n}\n\nfunction serializeSelectMenu(interaction: AnySelectMenuInteraction): Pick<BridgeInteraction, \"customId\" | \"values\"> {\n return {\n customId: interaction.customId,\n values: [...interaction.values],\n };\n}\n\nfunction serializeModalFields(interaction: ModalSubmitInteraction): Record<string, string> {\n const fields: Record<string, string> = {};\n for (const field of interaction.fields.fields.values()) {\n if (\"value\" in field && typeof field.value === \"string\") {\n fields[field.customId] = field.value;\n continue;\n }\n if (\"values\" in field && Array.isArray(field.values)) {\n fields[field.customId] = field.values.join(\",\");\n }\n }\n return fields;\n}\n\nfunction serializeInteractionMessage(interaction: Interaction): BridgeMessage | undefined {\n if (\"message\" in interaction && interaction.message) {\n return serializeMessage(interaction.message);\n }\n return undefined;\n}\n\nexport function serializeInteraction(interaction: Interaction): BridgeInteraction {\n const base: BridgeInteraction = {\n id: interaction.id,\n applicationId: interaction.applicationId,\n kind: \"unknown\",\n ...(interaction.guildId ? { guildId: interaction.guildId } : {}),\n ...(interaction.channelId ? { channelId: interaction.channelId } : {}),\n user: serializeUser(interaction.user),\n ...(interaction.member && \"guild\" in interaction.member ? { member: serializeGuildMember(interaction.member) } : {}),\n };\n\n if (interaction.isChatInputCommand()) {\n return {\n ...base,\n kind: \"chatInput\",\n commandName: interaction.commandName,\n options: serializeChatInputOptions(interaction),\n };\n }\n if (interaction.isContextMenuCommand()) {\n return {\n ...base,\n kind: \"contextMenu\",\n commandName: interaction.commandName,\n };\n }\n if (interaction.isButton()) {\n const message = serializeInteractionMessage(interaction);\n return {\n ...base,\n kind: \"button\",\n customId: interaction.customId,\n ...(message ? { message } : {}),\n };\n }\n if (interaction.isStringSelectMenu()) {\n const message = serializeInteractionMessage(interaction);\n return {\n ...base,\n kind: \"stringSelect\",\n ...serializeSelectMenu(interaction),\n ...(message ? { message } : {}),\n };\n }\n if (interaction.isUserSelectMenu()) {\n const message = serializeInteractionMessage(interaction);\n return {\n ...base,\n kind: \"userSelect\",\n ...serializeSelectMenu(interaction),\n ...(message ? { message } : {}),\n };\n }\n if (interaction.isRoleSelectMenu()) {\n const message = serializeInteractionMessage(interaction);\n return {\n ...base,\n kind: \"roleSelect\",\n ...serializeSelectMenu(interaction),\n ...(message ? { message } : {}),\n };\n }\n if (interaction.isMentionableSelectMenu()) {\n const message = serializeInteractionMessage(interaction);\n return {\n ...base,\n kind: \"mentionableSelect\",\n ...serializeSelectMenu(interaction),\n ...(message ? { message } : {}),\n };\n }\n if (interaction.isChannelSelectMenu()) {\n const message = serializeInteractionMessage(interaction);\n return {\n ...base,\n kind: \"channelSelect\",\n ...serializeSelectMenu(interaction),\n ...(message ? { message } : {}),\n };\n }\n if (interaction.isModalSubmit()) {\n return {\n ...base,\n kind: \"modalSubmit\",\n customId: interaction.customId,\n fields: serializeModalFields(interaction),\n };\n }\n return base;\n}\n","import type { IncomingMessage } from \"node:http\";\nimport { WebSocketServer, type WebSocket } from \"ws\";\nimport type {\n ActionResult,\n BotActionName,\n BotBridgeOptions,\n BotEventName,\n BotEventPayloadMap,\n BridgeCapabilities,\n EventSubscription,\n ShardwireLogger,\n} from \"../../discord/types\";\nimport { withLogger } from \"../../utils/logger\";\nimport { createConnectionId } from \"../../utils/id\";\nimport { matchesEventSubscription, serializeEventSubscription } from \"../subscriptions\";\nimport { isSecretValid } from \"./security\";\nimport type { NormalizedSecretConfig } from \"../validation\";\nimport {\n makeEnvelope,\n parseEnvelope,\n stringifyEnvelope,\n type ActionRequestPayload,\n type AuthHelloPayload,\n type WireEnvelope,\n} from \"./protocol\";\nimport { AsyncSemaphore } from \"../../utils/semaphore\";\n\nconst CLOSE_AUTH_REQUIRED = 4001;\nconst CLOSE_AUTH_FAILED = 4003;\nconst CLOSE_INVALID_PAYLOAD = 4004;\nconst CLOSE_SERVER_FULL = 4029;\nconst CLOSE_AUTH_RATE_LIMITED = 4031;\n\ninterface AuthSuccess {\n ok: true;\n secret: NormalizedSecretConfig;\n capabilities: BridgeCapabilities;\n}\n\ninterface AuthFailure {\n ok: false;\n reason: \"unknown_secret_id\" | \"invalid_secret\" | \"ambiguous_secret\";\n}\n\ninterface BridgeConnectionState {\n id: string;\n socket: WebSocket;\n authenticated: boolean;\n lastHeartbeatAt: number;\n remoteAddress?: string;\n appName?: string;\n secret?: NormalizedSecretConfig;\n capabilities?: BridgeCapabilities;\n subscriptions: Map<string, EventSubscription>;\n}\n\ninterface BridgeTransportServerConfig {\n options: BotBridgeOptions;\n logger?: ShardwireLogger;\n authenticate: (payload: AuthHelloPayload) => AuthSuccess | AuthFailure;\n onActionRequest: (\n connection: { id: string; appName?: string; secret: NormalizedSecretConfig; capabilities: BridgeCapabilities },\n actionName: BotActionName,\n payload: unknown,\n requestId: string,\n ) => Promise<ActionResult<unknown>>;\n}\n\nexport class BridgeTransportServer {\n private readonly wss: WebSocketServer;\n private readonly logger: Required<ShardwireLogger>;\n private readonly heartbeatMs: number;\n private readonly authTimeoutMs = 5000;\n private readonly interval: NodeJS.Timeout;\n private readonly connections = new Map<WebSocket, BridgeConnectionState>();\n private readonly stickyEvents = new Map<BotEventName, BotEventPayloadMap[BotEventName]>();\n private readonly actionSemaphore: AsyncSemaphore;\n private readonly idempotencyCache = new Map<string, { result: ActionResult<unknown>; expires: number }>();\n private readonly idempotencyTtlMs = 120_000;\n private readonly authBuckets = new Map<string, { count: number; resetAt: number }>();\n\n constructor(private readonly config: BridgeTransportServerConfig) {\n this.logger = withLogger(config.logger);\n this.heartbeatMs = config.options.server.heartbeatMs ?? 30000;\n const maxConcurrent = config.options.server.maxConcurrentActions ?? 32;\n const queueTimeout = config.options.server.actionQueueTimeoutMs ?? 5000;\n this.actionSemaphore = new AsyncSemaphore(maxConcurrent, queueTimeout);\n\n this.wss = new WebSocketServer({\n host: config.options.server.host,\n port: config.options.server.port,\n path: config.options.server.path ?? \"/shardwire\",\n maxPayload: config.options.server.maxPayloadBytes ?? 65536,\n });\n\n this.wss.on(\"connection\", (socket, request) => this.handleConnection(socket, request));\n this.wss.on(\"error\", (error) => this.logger.error(\"Bridge transport server error.\", { error: String(error) }));\n this.interval = setInterval(() => {\n this.checkHeartbeats();\n }, this.heartbeatMs);\n }\n\n connectionCount(): number {\n let count = 0;\n for (const state of this.connections.values()) {\n if (state.authenticated) {\n count += 1;\n }\n }\n return count;\n }\n\n setStickyEvent<K extends BotEventName>(name: K, payload: BotEventPayloadMap[K]): void {\n this.stickyEvents.set(name, payload);\n }\n\n publishEvent<K extends BotEventName>(name: K, payload: BotEventPayloadMap[K]): void {\n const envelope = stringifyEnvelope(makeEnvelope(\"discord.event\", { name, data: payload }));\n for (const state of this.connections.values()) {\n if (!state.authenticated) {\n continue;\n }\n const shouldReceive = [...state.subscriptions.values()].some((subscription) => {\n return subscription.name === name && matchesEventSubscription(subscription, payload);\n });\n if (!shouldReceive) {\n continue;\n }\n this.safeSend(state.socket, envelope);\n }\n }\n\n async close(): Promise<void> {\n clearInterval(this.interval);\n for (const state of this.connections.values()) {\n state.socket.close();\n }\n this.connections.clear();\n await new Promise<void>((resolve, reject) => {\n this.wss.close((error) => {\n if (error) {\n reject(error);\n return;\n }\n resolve();\n });\n });\n }\n\n private handleConnection(socket: WebSocket, request?: IncomingMessage): void {\n const remoteAddress = request?.socket?.remoteAddress ?? \"unknown\";\n const state: BridgeConnectionState = {\n id: createConnectionId(),\n socket,\n authenticated: false,\n lastHeartbeatAt: Date.now(),\n remoteAddress,\n subscriptions: new Map(),\n };\n this.connections.set(socket, state);\n\n const authTimer = setTimeout(() => {\n if (!state.authenticated) {\n socket.close(CLOSE_AUTH_REQUIRED, \"Authentication required.\");\n }\n }, this.authTimeoutMs);\n\n socket.on(\"message\", (raw) => {\n const serialized =\n typeof raw === \"string\" ? raw : Buffer.isBuffer(raw) ? raw.toString(\"utf8\") : undefined;\n if (!serialized) {\n socket.close(CLOSE_INVALID_PAYLOAD, \"Invalid payload.\");\n return;\n }\n let envelope: WireEnvelope;\n try {\n envelope = parseEnvelope(serialized);\n } catch (error) {\n this.logger.warn(\"Invalid transport envelope from app.\", { error: String(error) });\n socket.close(CLOSE_INVALID_PAYLOAD, \"Invalid payload.\");\n return;\n }\n void this.handleMessage(state, envelope).catch((error: unknown) => {\n this.logger.warn(\"Failed to handle transport message.\", { error: String(error) });\n socket.close(CLOSE_INVALID_PAYLOAD, \"Invalid payload.\");\n });\n });\n\n socket.on(\"close\", () => {\n clearTimeout(authTimer);\n this.connections.delete(socket);\n });\n\n socket.on(\"error\", (error) => {\n this.logger.warn(\"Transport socket error.\", { connectionId: state.id, error: String(error) });\n });\n }\n\n private async handleMessage(state: BridgeConnectionState, envelope: WireEnvelope): Promise<void> {\n if (envelope.type === \"ping\") {\n state.lastHeartbeatAt = Date.now();\n this.safeSend(state.socket, stringifyEnvelope(makeEnvelope(\"pong\", {})));\n return;\n }\n if (envelope.type === \"pong\") {\n state.lastHeartbeatAt = Date.now();\n return;\n }\n\n if (!state.authenticated) {\n if (envelope.type !== \"auth.hello\") {\n state.socket.close(CLOSE_AUTH_REQUIRED, \"Authentication required.\");\n return;\n }\n if (this.isAuthRateLimited(state.remoteAddress ?? \"unknown\")) {\n this.logger.warn(\"Bridge auth rate limited.\", { connectionId: state.id, remoteAddress: state.remoteAddress });\n this.safeSend(\n state.socket,\n stringifyEnvelope(\n makeEnvelope(\"auth.error\", {\n code: \"UNAUTHORIZED\",\n reason: \"invalid_secret\",\n message: \"Too many authentication attempts. Try again later.\",\n }),\n ),\n );\n state.socket.close(CLOSE_AUTH_RATE_LIMITED, \"Rate limited.\");\n return;\n }\n const authResult = this.config.authenticate(envelope.payload as AuthHelloPayload);\n if (!authResult.ok) {\n const message =\n authResult.reason === \"ambiguous_secret\"\n ? \"Authentication failed: secret matches multiple configured scopes. Supply secretId or use unique secret values.\"\n : \"Authentication failed.\";\n this.safeSend(\n state.socket,\n stringifyEnvelope(\n makeEnvelope(\"auth.error\", {\n code: \"UNAUTHORIZED\",\n reason: authResult.reason,\n message,\n }),\n ),\n );\n state.socket.close(CLOSE_AUTH_FAILED, \"Invalid secret.\");\n return;\n }\n\n const maxConnections = this.config.options.server.maxConnections;\n if (maxConnections !== undefined && this.connectionCount() >= maxConnections) {\n this.logger.warn(\"Bridge connection rejected: server full.\", {\n connectionId: state.id,\n maxConnections,\n });\n this.safeSend(\n state.socket,\n stringifyEnvelope(\n makeEnvelope(\"auth.error\", {\n code: \"UNAUTHORIZED\",\n reason: \"invalid_secret\",\n message: \"Server is at maximum connection capacity.\",\n }),\n ),\n );\n state.socket.close(CLOSE_SERVER_FULL, \"Server full.\");\n return;\n }\n\n state.authenticated = true;\n state.lastHeartbeatAt = Date.now();\n state.secret = authResult.secret;\n state.capabilities = authResult.capabilities;\n const payload = envelope.payload as AuthHelloPayload;\n if (payload.appName) {\n state.appName = payload.appName;\n }\n this.safeSend(\n state.socket,\n stringifyEnvelope(\n makeEnvelope(\"auth.ok\", {\n connectionId: state.id,\n capabilities: authResult.capabilities,\n }),\n ),\n );\n return;\n }\n\n if (!state.secret || !state.capabilities) {\n state.socket.close(CLOSE_AUTH_FAILED, \"Invalid state.\");\n return;\n }\n\n switch (envelope.type) {\n case \"subscribe\": {\n const rawSubscriptions = (envelope.payload as { subscriptions?: unknown }).subscriptions;\n if (!Array.isArray(rawSubscriptions)) {\n return;\n }\n const allowedEvents = new Set(state.capabilities.events);\n for (const rawSubscription of rawSubscriptions as EventSubscription[]) {\n if (!rawSubscription || typeof rawSubscription !== \"object\" || typeof rawSubscription.name !== \"string\") {\n continue;\n }\n const typedEvent = rawSubscription.name;\n if (!allowedEvents.has(typedEvent)) {\n continue;\n }\n const signature = serializeEventSubscription(rawSubscription);\n state.subscriptions.set(signature, rawSubscription);\n const stickyPayload = this.stickyEvents.get(typedEvent);\n if (stickyPayload && matchesEventSubscription(rawSubscription, stickyPayload)) {\n this.safeSend(\n state.socket,\n stringifyEnvelope(makeEnvelope(\"discord.event\", { name: typedEvent, data: stickyPayload })),\n );\n }\n }\n return;\n }\n case \"unsubscribe\": {\n const rawSubscriptions = (envelope.payload as { subscriptions?: unknown }).subscriptions;\n if (!Array.isArray(rawSubscriptions)) {\n return;\n }\n for (const rawSubscription of rawSubscriptions as EventSubscription[]) {\n if (!rawSubscription || typeof rawSubscription !== \"object\" || typeof rawSubscription.name !== \"string\") {\n continue;\n }\n state.subscriptions.delete(serializeEventSubscription(rawSubscription));\n }\n return;\n }\n case \"action.request\": {\n const requestId = envelope.requestId;\n const payload = envelope.payload as ActionRequestPayload;\n if (!requestId || !payload || typeof payload.name !== \"string\") {\n return;\n }\n const activeSecret = state.secret;\n const activeCapabilities = state.capabilities;\n if (!activeSecret || !activeCapabilities) {\n state.socket.close(CLOSE_AUTH_FAILED, \"Invalid state.\");\n return;\n }\n const idempotencyRaw = payload.idempotencyKey;\n const idempotencyKey =\n typeof idempotencyRaw === \"string\" && idempotencyRaw.length > 0 && idempotencyRaw.length <= 256\n ? idempotencyRaw\n : undefined;\n const idempotencyCacheKey = idempotencyKey ? `${state.id}:${idempotencyKey}` : undefined;\n if (idempotencyCacheKey) {\n this.pruneIdempotencyCache(Date.now());\n const cached = this.idempotencyCache.get(idempotencyCacheKey);\n if (cached && cached.expires > Date.now()) {\n const replay: ActionResult<unknown> = cached.result.ok\n ? { ok: true, requestId, ts: Date.now(), data: cached.result.data }\n : { ok: false, requestId, ts: Date.now(), error: cached.result.error };\n this.logger.info(\"Bridge action idempotent replay.\", {\n connectionId: state.id,\n requestId,\n action: payload.name,\n });\n this.safeSend(\n state.socket,\n stringifyEnvelope(\n makeEnvelope(replay.ok ? \"action.result\" : \"action.error\", replay, { requestId }),\n ),\n );\n return;\n }\n }\n\n const started = Date.now();\n let result: ActionResult<unknown>;\n try {\n result = await this.actionSemaphore.run(() =>\n this.config.onActionRequest(\n {\n id: state.id,\n ...(state.appName ? { appName: state.appName } : {}),\n secret: activeSecret,\n capabilities: activeCapabilities,\n },\n payload.name,\n payload.data,\n requestId,\n ),\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Action queue saturated.\";\n result = {\n ok: false,\n requestId,\n ts: Date.now(),\n error: {\n code: \"SERVICE_UNAVAILABLE\",\n message,\n details: { retryable: true, reason: \"action_queue\" },\n },\n };\n }\n\n if (idempotencyCacheKey) {\n this.idempotencyCache.set(idempotencyCacheKey, {\n result,\n expires: Date.now() + this.idempotencyTtlMs,\n });\n }\n\n this.logger.info(\"Bridge action completed.\", {\n connectionId: state.id,\n requestId,\n action: payload.name,\n durationMs: Date.now() - started,\n ok: result.ok,\n appName: state.appName,\n });\n\n this.safeSend(\n state.socket,\n stringifyEnvelope(makeEnvelope(result.ok ? \"action.result\" : \"action.error\", result, { requestId })),\n );\n return;\n }\n default:\n return;\n }\n }\n\n private checkHeartbeats(): void {\n const now = Date.now();\n const threshold = this.heartbeatMs * 2;\n\n for (const state of this.connections.values()) {\n if (!state.authenticated) {\n continue;\n }\n\n if (now - state.lastHeartbeatAt > threshold) {\n state.socket.terminate();\n this.connections.delete(state.socket);\n continue;\n }\n\n this.safeSend(state.socket, stringifyEnvelope(makeEnvelope(\"ping\", {})));\n }\n }\n\n private safeSend(socket: WebSocket, payload: string): void {\n if (socket.readyState === 1) {\n socket.send(payload);\n }\n }\n\n private isAuthRateLimited(remoteAddress: string): boolean {\n const windowMs = 60_000;\n const limit = 40;\n const now = Date.now();\n let bucket = this.authBuckets.get(remoteAddress);\n if (!bucket || now > bucket.resetAt) {\n bucket = { count: 0, resetAt: now + windowMs };\n this.authBuckets.set(remoteAddress, bucket);\n }\n bucket.count += 1;\n return bucket.count > limit;\n }\n\n private pruneIdempotencyCache(now: number): void {\n if (this.idempotencyCache.size < 200) {\n return;\n }\n for (const [key, entry] of this.idempotencyCache.entries()) {\n if (entry.expires <= now) {\n this.idempotencyCache.delete(key);\n }\n }\n }\n}\n\nexport function authenticateSecret(\n payload: AuthHelloPayload,\n secrets: readonly NormalizedSecretConfig[],\n resolver: (secret: NormalizedSecretConfig) => BridgeCapabilities,\n): AuthSuccess | AuthFailure {\n if (!payload.secret) {\n return { ok: false, reason: \"invalid_secret\" };\n }\n\n let matchedSecret: NormalizedSecretConfig | undefined;\n if (payload.secretId) {\n matchedSecret = secrets.find((secret) => secret.id === payload.secretId);\n if (!matchedSecret) {\n return { ok: false, reason: \"unknown_secret_id\" };\n }\n if (!isSecretValid(payload.secret, matchedSecret.value)) {\n return { ok: false, reason: \"invalid_secret\" };\n }\n } else {\n const matches = secrets.filter((secret) => isSecretValid(payload.secret, secret.value));\n if (matches.length === 0) {\n return { ok: false, reason: \"invalid_secret\" };\n }\n if (matches.length > 1) {\n return { ok: false, reason: \"ambiguous_secret\" };\n }\n matchedSecret = matches[0];\n }\n if (!matchedSecret) {\n return { ok: false, reason: \"invalid_secret\" };\n }\n\n return {\n ok: true,\n secret: matchedSecret,\n capabilities: resolver(matchedSecret),\n };\n}\n","import { randomUUID } from \"node:crypto\";\n\nexport function createRequestId(): string {\n return randomUUID();\n}\n\nexport function createConnectionId(): string {\n return randomUUID();\n}\n","import type {\n BotEventName,\n BotEventPayloadMap,\n BridgeInteractionKind,\n EventSubscription,\n EventSubscriptionFilter,\n} from \"../discord/types\";\n\ninterface NormalizedEventSubscriptionFilter {\n guildId?: string[];\n channelId?: string[];\n userId?: string[];\n commandName?: string[];\n customId?: string[];\n interactionKind?: BridgeInteractionKind[];\n}\n\nexport interface NormalizedEventSubscription<K extends BotEventName = BotEventName> {\n name: K;\n filter?: NormalizedEventSubscriptionFilter;\n}\n\nfunction normalizeStringList(value: string | readonly string[] | undefined): string[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n const rawValues = Array.isArray(value) ? value : [value];\n const normalized = [...new Set(rawValues.filter((entry) => typeof entry === \"string\" && entry.length > 0))].sort();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction normalizeKindList(\n value: BridgeInteractionKind | readonly BridgeInteractionKind[] | undefined,\n): BridgeInteractionKind[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n const rawValues = Array.isArray(value) ? value : [value];\n const normalized = [...new Set(rawValues.filter((entry): entry is BridgeInteractionKind => typeof entry === \"string\"))].sort();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nexport function normalizeEventSubscriptionFilter(\n filter?: EventSubscriptionFilter,\n): NormalizedEventSubscriptionFilter | undefined {\n if (!filter) {\n return undefined;\n }\n const normalized: NormalizedEventSubscriptionFilter = {};\n const guildIds = normalizeStringList(filter.guildId);\n const channelIds = normalizeStringList(filter.channelId);\n const userIds = normalizeStringList(filter.userId);\n const commandNames = normalizeStringList(filter.commandName);\n const customIds = normalizeStringList(filter.customId);\n const interactionKinds = normalizeKindList(filter.interactionKind);\n\n if (guildIds) {\n normalized.guildId = guildIds;\n }\n if (channelIds) {\n normalized.channelId = channelIds;\n }\n if (userIds) {\n normalized.userId = userIds;\n }\n if (commandNames) {\n normalized.commandName = commandNames;\n }\n if (customIds) {\n normalized.customId = customIds;\n }\n if (interactionKinds) {\n normalized.interactionKind = interactionKinds;\n }\n\n return Object.keys(normalized).length > 0 ? normalized : undefined;\n}\n\nexport function normalizeEventSubscription<K extends BotEventName>(\n subscription: EventSubscription<K>,\n): NormalizedEventSubscription<K> {\n const normalizedFilter = normalizeEventSubscriptionFilter(subscription.filter);\n return {\n name: subscription.name,\n ...(normalizedFilter ? { filter: normalizedFilter } : {}),\n };\n}\n\nexport function serializeEventSubscription(subscription: EventSubscription): string {\n return JSON.stringify(normalizeEventSubscription(subscription));\n}\n\nfunction matchesField(value: string | undefined, allowed: string[] | undefined): boolean {\n if (!allowed) {\n return true;\n }\n if (!value) {\n return false;\n }\n return allowed.includes(value);\n}\n\nfunction matchesKind(value: BridgeInteractionKind | undefined, allowed: BridgeInteractionKind[] | undefined): boolean {\n if (!allowed) {\n return true;\n }\n if (!value) {\n return false;\n }\n return allowed.includes(value);\n}\n\nfunction eventMetadata(name: BotEventName, payload: unknown): {\n guildId?: string;\n channelId?: string;\n userId?: string;\n commandName?: string;\n customId?: string;\n interactionKind?: BridgeInteractionKind;\n} {\n switch (name) {\n case \"ready\":\n return {};\n case \"interactionCreate\": {\n const interactionPayload = payload as BotEventPayloadMap[\"interactionCreate\"];\n const ix = interactionPayload.interaction;\n return {\n ...(ix.guildId ? { guildId: ix.guildId } : {}),\n ...(ix.channelId ? { channelId: ix.channelId } : {}),\n userId: ix.user.id,\n ...(ix.commandName ? { commandName: ix.commandName } : {}),\n ...(ix.customId ? { customId: ix.customId } : {}),\n interactionKind: ix.kind,\n };\n }\n case \"messageCreate\": {\n const messagePayload = payload as BotEventPayloadMap[\"messageCreate\"];\n return {\n ...(messagePayload.message.guildId ? { guildId: messagePayload.message.guildId } : {}),\n channelId: messagePayload.message.channelId,\n ...(messagePayload.message.author ? { userId: messagePayload.message.author.id } : {}),\n };\n }\n case \"messageUpdate\": {\n const messagePayload = payload as BotEventPayloadMap[\"messageUpdate\"];\n return {\n ...(messagePayload.message.guildId ? { guildId: messagePayload.message.guildId } : {}),\n channelId: messagePayload.message.channelId,\n ...(messagePayload.message.author ? { userId: messagePayload.message.author.id } : {}),\n };\n }\n case \"messageDelete\": {\n const messagePayload = payload as BotEventPayloadMap[\"messageDelete\"];\n return {\n ...(messagePayload.message.guildId ? { guildId: messagePayload.message.guildId } : {}),\n channelId: messagePayload.message.channelId,\n };\n }\n case \"messageReactionAdd\": {\n const reactionPayload = payload as BotEventPayloadMap[\"messageReactionAdd\"];\n return {\n ...(reactionPayload.reaction.guildId ? { guildId: reactionPayload.reaction.guildId } : {}),\n channelId: reactionPayload.reaction.channelId,\n ...(reactionPayload.reaction.user ? { userId: reactionPayload.reaction.user.id } : {}),\n };\n }\n case \"messageReactionRemove\": {\n const reactionPayload = payload as BotEventPayloadMap[\"messageReactionRemove\"];\n return {\n ...(reactionPayload.reaction.guildId ? { guildId: reactionPayload.reaction.guildId } : {}),\n channelId: reactionPayload.reaction.channelId,\n ...(reactionPayload.reaction.user ? { userId: reactionPayload.reaction.user.id } : {}),\n };\n }\n case \"guildMemberAdd\": {\n const memberPayload = payload as BotEventPayloadMap[\"guildMemberAdd\"];\n return {\n guildId: memberPayload.member.guildId,\n userId: memberPayload.member.id,\n };\n }\n case \"guildMemberRemove\": {\n const memberPayload = payload as BotEventPayloadMap[\"guildMemberRemove\"];\n return {\n guildId: memberPayload.member.guildId,\n userId: memberPayload.member.id,\n };\n }\n case \"guildMemberUpdate\": {\n const memberPayload = payload as BotEventPayloadMap[\"guildMemberUpdate\"];\n return {\n guildId: memberPayload.member.guildId,\n userId: memberPayload.member.id,\n };\n }\n case \"guildCreate\":\n case \"guildDelete\": {\n const guildPayload = payload as BotEventPayloadMap[\"guildCreate\"];\n return {\n guildId: guildPayload.guild.id,\n };\n }\n case \"threadCreate\":\n case \"threadUpdate\":\n case \"threadDelete\": {\n const threadPayload = payload as BotEventPayloadMap[\"threadCreate\"];\n return {\n guildId: threadPayload.thread.guildId,\n ...(threadPayload.thread.parentId\n ? { channelId: threadPayload.thread.parentId }\n : { channelId: threadPayload.thread.id }),\n };\n }\n default:\n return {};\n }\n}\n\nexport function matchesEventSubscription(subscription: EventSubscription, payload: unknown): boolean {\n const normalized = normalizeEventSubscription(subscription);\n if (!normalized.filter) {\n return true;\n }\n\n const metadata = eventMetadata(normalized.name, payload);\n return (\n matchesField(metadata.guildId, normalized.filter.guildId) &&\n matchesField(metadata.channelId, normalized.filter.channelId) &&\n matchesField(metadata.userId, normalized.filter.userId) &&\n matchesField(metadata.commandName, normalized.filter.commandName) &&\n matchesField(metadata.customId, normalized.filter.customId) &&\n matchesKind(metadata.interactionKind, normalized.filter.interactionKind)\n );\n}\n","import { timingSafeEqual } from \"node:crypto\";\n\nexport function isSecretValid(provided: string, expected: string): boolean {\n const providedBuffer = Buffer.from(provided);\n const expectedBuffer = Buffer.from(expected);\n\n if (providedBuffer.length !== expectedBuffer.length) {\n return false;\n }\n\n return timingSafeEqual(providedBuffer, expectedBuffer);\n}\n","import type {\n ActionResult,\n BotActionName,\n BridgeCapabilities,\n EventSubscription,\n BotEventPayloadMap,\n} from \"../../discord/types\";\n\nexport const PROTOCOL_VERSION = 2 as const;\n\nexport type WireType =\n | \"auth.hello\"\n | \"auth.ok\"\n | \"auth.error\"\n | \"subscribe\"\n | \"unsubscribe\"\n | \"discord.event\"\n | \"action.request\"\n | \"action.result\"\n | \"action.error\"\n | \"ping\"\n | \"pong\";\n\nexport interface WireEnvelope<TType extends WireType = WireType, TPayload = unknown> {\n v: typeof PROTOCOL_VERSION;\n type: TType;\n ts: number;\n requestId?: string;\n payload: TPayload;\n}\n\nexport interface AuthHelloPayload {\n secret: string;\n secretId?: string;\n appName?: string;\n}\n\nexport interface AuthOkPayload {\n connectionId: string;\n capabilities: BridgeCapabilities;\n}\n\nexport interface AuthErrorPayload {\n code: \"UNAUTHORIZED\";\n reason: \"unknown_secret_id\" | \"invalid_secret\" | \"ambiguous_secret\";\n message: string;\n}\n\nexport interface SubscribePayload {\n subscriptions: EventSubscription[];\n}\n\nexport interface UnsubscribePayload {\n subscriptions: EventSubscription[];\n}\n\nexport interface DiscordEventPayload<TName extends keyof BotEventPayloadMap = keyof BotEventPayloadMap> {\n name: TName;\n data: BotEventPayloadMap[TName];\n}\n\nexport interface ActionRequestPayload {\n name: BotActionName;\n data: unknown;\n /** When set, duplicate keys on the same connection within ~2 minutes return the first result (best-effort). */\n idempotencyKey?: string;\n}\n\nexport type ActionResponsePayload = ActionResult<unknown>;\n\nexport function makeEnvelope<TType extends WireType, TPayload>(\n type: TType,\n payload: TPayload,\n extras?: { requestId?: string },\n): WireEnvelope<TType, TPayload> {\n return {\n v: PROTOCOL_VERSION,\n type,\n ts: Date.now(),\n ...(extras?.requestId ? { requestId: extras.requestId } : {}),\n payload,\n };\n}\n\nexport function parseEnvelope(raw: string): WireEnvelope {\n const parsed = JSON.parse(raw) as WireEnvelope;\n if (!parsed || parsed.v !== PROTOCOL_VERSION || typeof parsed.type !== \"string\") {\n throw new Error(\"Invalid bridge envelope.\");\n }\n return parsed;\n}\n\nexport function stringifyEnvelope(envelope: WireEnvelope): string {\n return JSON.stringify(envelope);\n}\n","interface Waiter {\n resolve: (release: () => void) => void;\n reject: (error: Error) => void;\n timeout: NodeJS.Timeout;\n}\n\n/**\n * Simple async semaphore for limiting concurrent async work (e.g. Discord API calls).\n */\nexport class AsyncSemaphore {\n private active = 0;\n private readonly waiters: Waiter[] = [];\n\n constructor(\n private readonly max: number,\n private readonly acquireTimeoutMs: number,\n ) {}\n\n async run<T>(fn: () => Promise<T>): Promise<T> {\n const release = await this.acquire();\n try {\n return await fn();\n } finally {\n release();\n }\n }\n\n private acquire(): Promise<() => void> {\n if (this.active < this.max) {\n this.active += 1;\n return Promise.resolve(() => this.release());\n }\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n const index = this.waiters.findIndex((entry) => entry.timeout === timeout);\n if (index >= 0) {\n this.waiters.splice(index, 1);\n }\n reject(new Error(\"ACTION_QUEUE_TIMEOUT\"));\n }, this.acquireTimeoutMs);\n this.waiters.push({\n resolve: (release) => {\n clearTimeout(timeout);\n resolve(release);\n },\n reject,\n timeout,\n });\n });\n }\n\n private release(): void {\n this.active -= 1;\n const next = this.waiters.shift();\n if (next) {\n clearTimeout(next.timeout);\n this.active += 1;\n next.resolve(() => this.release());\n }\n }\n}\n","import type {\n AppBridgeOptions,\n BotActionName,\n BotBridgeOptions,\n BotBridgeSecret,\n BotEventName,\n BotIntentName,\n BridgeCapabilities,\n} from \"../discord/types\";\nimport { BOT_ACTION_NAMES, BOT_EVENT_NAMES, getAvailableEvents } from \"../discord/catalog\";\n\ninterface NormalizedSecretScope {\n events: \"*\" | Set<BotEventName>;\n actions: \"*\" | Set<BotActionName>;\n}\n\nexport interface NormalizedSecretConfig {\n id: string;\n value: string;\n scope: NormalizedSecretScope;\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nfunction assertPositiveNumber(name: string, value: unknown): void {\n if (typeof value !== \"number\" || Number.isNaN(value) || value <= 0) {\n throw new Error(`${name} must be a positive number.`);\n }\n}\n\nfunction normalizeScopeList<T extends string>(\n value: \"*\" | readonly T[] | undefined,\n known: readonly T[],\n label: string,\n): \"*\" | Set<T> {\n if (value === undefined || value === \"*\") {\n return \"*\";\n }\n if (!Array.isArray(value)) {\n throw new Error(`${label} must be \"*\" or an array.`);\n }\n const knownSet = new Set(known);\n const entries = new Set<T>();\n for (const rawItem of value as readonly unknown[]) {\n if (typeof rawItem !== \"string\") {\n throw new Error(`${label} contains a non-string value.`);\n }\n const item = rawItem as T;\n if (!knownSet.has(item)) {\n throw new Error(`${label} contains unsupported value \"${String(item)}\".`);\n }\n entries.add(item);\n }\n return entries;\n}\n\nfunction normalizeSecretEntry(secret: BotBridgeSecret, index: number): NormalizedSecretConfig {\n const defaultId = `s${index}`;\n if (typeof secret === \"string\") {\n if (!isNonEmptyString(secret)) {\n throw new Error(`server.secrets[${index}] must be a non-empty string.`);\n }\n return {\n id: defaultId,\n value: secret,\n scope: {\n events: \"*\",\n actions: \"*\",\n },\n };\n }\n\n const scoped = secret;\n if (!isNonEmptyString(scoped.value)) {\n throw new Error(`server.secrets[${index}].value must be a non-empty string.`);\n }\n if (scoped.id !== undefined && !isNonEmptyString(scoped.id)) {\n throw new Error(`server.secrets[${index}].id must be a non-empty string when provided.`);\n }\n\n return {\n id: scoped.id ?? defaultId,\n value: scoped.value,\n scope: {\n events: normalizeScopeList(scoped.allow?.events, BOT_EVENT_NAMES, `server.secrets[${index}].allow.events`),\n actions: normalizeScopeList(\n scoped.allow?.actions,\n BOT_ACTION_NAMES,\n `server.secrets[${index}].allow.actions`,\n ),\n },\n };\n}\n\nexport function assertBotBridgeOptions(options: BotBridgeOptions): void {\n if (!isNonEmptyString(options.token)) {\n throw new Error(\"Bot bridge requires `token`.\");\n }\n if (!Array.isArray(options.intents) || options.intents.length === 0) {\n throw new Error(\"Bot bridge requires at least one intent.\");\n }\n assertPositiveNumber(\"server.port\", options.server.port);\n if (options.server.heartbeatMs !== undefined) {\n assertPositiveNumber(\"server.heartbeatMs\", options.server.heartbeatMs);\n }\n if (options.server.maxPayloadBytes !== undefined) {\n assertPositiveNumber(\"server.maxPayloadBytes\", options.server.maxPayloadBytes);\n }\n if (options.server.maxConnections !== undefined) {\n assertPositiveNumber(\"server.maxConnections\", options.server.maxConnections);\n }\n if (options.server.maxConcurrentActions !== undefined) {\n assertPositiveNumber(\"server.maxConcurrentActions\", options.server.maxConcurrentActions);\n }\n if (options.server.actionQueueTimeoutMs !== undefined) {\n assertPositiveNumber(\"server.actionQueueTimeoutMs\", options.server.actionQueueTimeoutMs);\n }\n if (!Array.isArray(options.server.secrets) || options.server.secrets.length === 0) {\n throw new Error(\"server.secrets must contain at least one secret.\");\n }\n const ids = new Set<string>();\n const values = new Set<string>();\n options.server.secrets.forEach((secret: BotBridgeSecret, index) => {\n const normalized = normalizeSecretEntry(secret, index);\n if (ids.has(normalized.id)) {\n throw new Error(`server.secrets contains duplicate secret id \"${normalized.id}\".`);\n }\n if (values.has(normalized.value)) {\n throw new Error(`server.secrets contains duplicate secret value at index ${index}.`);\n }\n ids.add(normalized.id);\n values.add(normalized.value);\n });\n}\n\nexport function normalizeSecrets(options: BotBridgeOptions): NormalizedSecretConfig[] {\n return options.server.secrets.map((secret, index) => normalizeSecretEntry(secret, index));\n}\n\nexport function assertAppBridgeOptions(options: AppBridgeOptions): void {\n if (!isNonEmptyString(options.url)) {\n throw new Error(\"App bridge requires `url`.\");\n }\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(options.url);\n } catch {\n throw new Error(\"App bridge option `url` must be a valid URL.\");\n }\n if (parsedUrl.protocol !== \"ws:\" && parsedUrl.protocol !== \"wss:\") {\n throw new Error(\"App bridge option `url` must use `ws://` or `wss://`.\");\n }\n const isLoopbackHost =\n parsedUrl.hostname === \"localhost\" || parsedUrl.hostname === \"127.0.0.1\" || parsedUrl.hostname === \"::1\";\n if (parsedUrl.protocol === \"ws:\" && !isLoopbackHost) {\n throw new Error(\"Non-loopback app bridge URLs must use `wss://`.\");\n }\n if (!isNonEmptyString(options.secret)) {\n throw new Error(\"App bridge requires `secret`.\");\n }\n if (options.secretId !== undefined && !isNonEmptyString(options.secretId)) {\n throw new Error(\"App bridge option `secretId` must be a non-empty string.\");\n }\n if (options.appName !== undefined && !isNonEmptyString(options.appName)) {\n throw new Error(\"App bridge option `appName` must be a non-empty string.\");\n }\n if (options.requestTimeoutMs !== undefined) {\n assertPositiveNumber(\"requestTimeoutMs\", options.requestTimeoutMs);\n }\n if (options.reconnect?.initialDelayMs !== undefined) {\n assertPositiveNumber(\"reconnect.initialDelayMs\", options.reconnect.initialDelayMs);\n }\n if (options.reconnect?.maxDelayMs !== undefined) {\n assertPositiveNumber(\"reconnect.maxDelayMs\", options.reconnect.maxDelayMs);\n }\n}\n\nexport function resolveCapabilitiesForSecret(\n intents: readonly BotIntentName[],\n secret: NormalizedSecretConfig,\n): BridgeCapabilities {\n const availableEvents = getAvailableEvents(intents);\n const events =\n secret.scope.events === \"*\"\n ? [...availableEvents]\n : availableEvents.filter((eventName) => {\n return secret.scope.events !== \"*\" && secret.scope.events.has(eventName);\n });\n const actions =\n secret.scope.actions === \"*\"\n ? [...BOT_ACTION_NAMES]\n : BOT_ACTION_NAMES.filter((action) => {\n return secret.scope.actions !== \"*\" && secret.scope.actions.has(action);\n });\n\n return {\n events: [...events],\n actions: [...actions],\n };\n}\n","import type {\n ActionFailure,\n BotActionPayloadMap,\n BotBridge,\n BotBridgeOptions,\n ReadyEventPayload,\n} from \"../discord/types\";\nimport { getAvailableEvents } from \"../discord/catalog\";\nimport { ActionExecutionError, type DiscordRuntimeAdapter } from \"../discord/runtime/adapter\";\nimport { createDiscordJsRuntimeAdapter } from \"../discord/runtime/discordjs-adapter\";\nimport { BridgeTransportServer, authenticateSecret } from \"../bridge/transport/server\";\nimport {\n assertBotBridgeOptions,\n normalizeSecrets,\n resolveCapabilitiesForSecret,\n} from \"../bridge/validation\";\n\nexport function createBotBridge(options: BotBridgeOptions): BotBridge {\n const runtime = createDiscordJsRuntimeAdapter({\n token: options.token,\n intents: options.intents,\n ...(options.logger ? { logger: options.logger } : {}),\n });\n return createBotBridgeWithRuntime(options, runtime);\n}\n\nexport function createBotBridgeWithRuntime(options: BotBridgeOptions, runtime: DiscordRuntimeAdapter): BotBridge {\n assertBotBridgeOptions(options);\n const secrets = normalizeSecrets(options);\n const availableEvents = getAvailableEvents(options.intents);\n const server = new BridgeTransportServer({\n options,\n ...(options.logger ? { logger: options.logger } : {}),\n authenticate: (payload) =>\n authenticateSecret(payload, secrets, (secret) => resolveCapabilitiesForSecret(options.intents, secret)),\n onActionRequest: async (connection, actionName, payload, requestId) => {\n if (!connection.capabilities.actions.includes(actionName)) {\n return {\n ok: false,\n requestId,\n ts: Date.now(),\n error: {\n code: \"FORBIDDEN\",\n message: `Action \"${actionName}\" is not allowed for this app.`,\n },\n } satisfies ActionFailure;\n }\n\n try {\n const result = await runtime.executeAction(actionName, payload as BotActionPayloadMap[typeof actionName]);\n return {\n ok: true,\n requestId,\n ts: Date.now(),\n data: result,\n };\n } catch (error) {\n if (error instanceof ActionExecutionError) {\n return {\n ok: false,\n requestId,\n ts: Date.now(),\n error: {\n code: error.code,\n message: error.message,\n ...(error.details !== undefined ? { details: error.details } : {}),\n },\n } satisfies ActionFailure;\n }\n return {\n ok: false,\n requestId,\n ts: Date.now(),\n error: {\n code: \"INTERNAL_ERROR\",\n message: error instanceof Error ? error.message : \"Unknown action failure.\",\n },\n } satisfies ActionFailure;\n }\n },\n });\n\n const unsubscribers = availableEvents.map((eventName) =>\n runtime.on(eventName, (payload) => {\n if (eventName === \"ready\") {\n server.setStickyEvent(\"ready\", payload as ReadyEventPayload);\n }\n server.publishEvent(eventName, payload);\n }),\n );\n\n return {\n async ready() {\n await runtime.ready();\n },\n async close() {\n for (const unsubscribe of unsubscribers) {\n unsubscribe();\n }\n await Promise.all([server.close(), runtime.close()]);\n },\n status() {\n return {\n ready: runtime.isReady(),\n connectionCount: server.connectionCount(),\n };\n },\n };\n}\n","import type {\n APIActionRowComponent,\n APIAllowedMentions,\n APIComponentInMessageActionRow,\n APIEmbed,\n APITextInputComponent,\n Snowflake,\n} from \"discord-api-types/v10\";\nimport type { GatewayIntentBits } from \"discord.js\";\n\nexport type Unsubscribe = () => void;\n\nexport interface ShardwireLogger {\n debug?: (message: string, meta?: Record<string, unknown>) => void;\n info?: (message: string, meta?: Record<string, unknown>) => void;\n warn?: (message: string, meta?: Record<string, unknown>) => void;\n error?: (message: string, meta?: Record<string, unknown>) => void;\n}\n\nexport type BotIntentName = keyof typeof GatewayIntentBits;\n\nexport interface BridgeUser {\n id: Snowflake;\n username: string;\n discriminator: string;\n globalName?: string | null;\n avatarUrl?: string | null;\n bot: boolean;\n system: boolean;\n}\n\nexport interface BridgeAttachment {\n id: Snowflake;\n name: string;\n url: string;\n contentType?: string | null;\n size: number;\n}\n\nexport interface BridgeMessageReference {\n messageId?: Snowflake;\n channelId?: Snowflake;\n guildId?: Snowflake;\n}\n\nexport interface BridgeGuildMember {\n id: Snowflake;\n guildId: Snowflake;\n user?: BridgeUser;\n displayName?: string;\n nickname?: string | null;\n roles: Snowflake[];\n joinedAt?: string | null;\n premiumSince?: string | null;\n pending?: boolean;\n communicationDisabledUntil?: string | null;\n}\n\n/** Normalized guild snapshot for `guildCreate` / `guildDelete` events. */\nexport interface BridgeGuild {\n id: Snowflake;\n name: string;\n icon?: string | null;\n ownerId?: Snowflake;\n}\n\n/** Normalized thread channel snapshot for thread lifecycle events. */\nexport interface BridgeThread {\n id: Snowflake;\n guildId: Snowflake;\n parentId: Snowflake | null;\n name: string;\n type: number;\n archived?: boolean;\n locked?: boolean;\n}\n\nexport interface BridgeMessage {\n id: Snowflake;\n channelId: Snowflake;\n guildId?: Snowflake;\n author?: BridgeUser;\n member?: BridgeGuildMember;\n content?: string;\n createdAt?: string;\n editedAt?: string | null;\n attachments: BridgeAttachment[];\n embeds: APIEmbed[];\n /** Message component rows (JSON-serializable API shape). */\n components?: APIActionRowComponent<APIComponentInMessageActionRow>[];\n reference?: BridgeMessageReference;\n}\n\nexport interface BridgeDeletedMessage {\n id: Snowflake;\n channelId: Snowflake;\n guildId?: Snowflake;\n deletedAt: string;\n}\n\nexport interface BridgeReactionEmoji {\n id?: Snowflake;\n name?: string | null;\n animated?: boolean;\n}\n\nexport interface BridgeMessageReaction {\n messageId: Snowflake;\n channelId: Snowflake;\n guildId?: Snowflake;\n user?: BridgeUser;\n emoji: BridgeReactionEmoji;\n}\n\nexport type BridgeInteractionKind =\n | \"chatInput\"\n | \"contextMenu\"\n | \"button\"\n | \"stringSelect\"\n | \"userSelect\"\n | \"roleSelect\"\n | \"mentionableSelect\"\n | \"channelSelect\"\n | \"modalSubmit\"\n | \"unknown\";\n\nexport interface BridgeInteraction {\n id: Snowflake;\n applicationId: Snowflake;\n kind: BridgeInteractionKind;\n guildId?: Snowflake;\n channelId?: Snowflake;\n user: BridgeUser;\n member?: BridgeGuildMember;\n commandName?: string;\n customId?: string;\n options?: Record<string, unknown>;\n values?: string[];\n fields?: Record<string, string>;\n message?: BridgeMessage;\n}\n\nexport interface EventEnvelopeBase {\n receivedAt: number;\n /** Populated when the bot runs under `ShardingManager` (multi-shard). */\n shardId?: number;\n}\n\nexport interface ReadyEventPayload extends EventEnvelopeBase {\n user: BridgeUser;\n}\n\nexport interface InteractionCreateEventPayload extends EventEnvelopeBase {\n interaction: BridgeInteraction;\n}\n\nexport interface MessageCreateEventPayload extends EventEnvelopeBase {\n message: BridgeMessage;\n}\n\nexport interface MessageUpdateEventPayload extends EventEnvelopeBase {\n oldMessage?: BridgeMessage;\n message: BridgeMessage;\n}\n\nexport interface MessageDeleteEventPayload extends EventEnvelopeBase {\n message: BridgeDeletedMessage;\n}\n\nexport interface GuildMemberAddEventPayload extends EventEnvelopeBase {\n member: BridgeGuildMember;\n}\n\nexport interface GuildMemberRemoveEventPayload extends EventEnvelopeBase {\n member: BridgeGuildMember;\n}\n\nexport interface GuildMemberUpdateEventPayload extends EventEnvelopeBase {\n oldMember?: BridgeGuildMember;\n member: BridgeGuildMember;\n}\n\nexport interface GuildCreateEventPayload extends EventEnvelopeBase {\n guild: BridgeGuild;\n}\n\nexport interface GuildDeleteEventPayload extends EventEnvelopeBase {\n guild: BridgeGuild;\n}\n\nexport interface ThreadCreateEventPayload extends EventEnvelopeBase {\n thread: BridgeThread;\n}\n\nexport interface ThreadUpdateEventPayload extends EventEnvelopeBase {\n oldThread?: BridgeThread;\n thread: BridgeThread;\n}\n\nexport interface ThreadDeleteEventPayload extends EventEnvelopeBase {\n thread: BridgeThread;\n}\n\nexport interface MessageReactionAddEventPayload extends EventEnvelopeBase {\n reaction: BridgeMessageReaction;\n}\n\nexport interface MessageReactionRemoveEventPayload extends EventEnvelopeBase {\n reaction: BridgeMessageReaction;\n}\n\nexport interface BotEventPayloadMap {\n ready: ReadyEventPayload;\n interactionCreate: InteractionCreateEventPayload;\n messageCreate: MessageCreateEventPayload;\n messageUpdate: MessageUpdateEventPayload;\n messageDelete: MessageDeleteEventPayload;\n messageReactionAdd: MessageReactionAddEventPayload;\n messageReactionRemove: MessageReactionRemoveEventPayload;\n guildCreate: GuildCreateEventPayload;\n guildDelete: GuildDeleteEventPayload;\n guildMemberAdd: GuildMemberAddEventPayload;\n guildMemberRemove: GuildMemberRemoveEventPayload;\n guildMemberUpdate: GuildMemberUpdateEventPayload;\n threadCreate: ThreadCreateEventPayload;\n threadUpdate: ThreadUpdateEventPayload;\n threadDelete: ThreadDeleteEventPayload;\n}\n\nexport type BotEventName = keyof BotEventPayloadMap;\n\nexport interface BridgeMessageInput {\n content?: string;\n embeds?: APIEmbed[];\n allowedMentions?: APIAllowedMentions;\n components?: APIActionRowComponent<APIComponentInMessageActionRow>[];\n /** Bitfield compatible with `MessageFlags` from discord.js / Discord API. */\n flags?: number;\n stickerIds?: Snowflake[];\n}\n\nexport interface SendMessageActionPayload extends BridgeMessageInput {\n channelId: Snowflake;\n}\n\nexport interface EditMessageActionPayload extends BridgeMessageInput {\n channelId: Snowflake;\n messageId: Snowflake;\n}\n\nexport interface DeleteMessageActionPayload {\n channelId: Snowflake;\n messageId: Snowflake;\n}\n\nexport interface ReplyToInteractionActionPayload extends BridgeMessageInput {\n interactionId: Snowflake;\n ephemeral?: boolean;\n}\n\nexport interface DeferInteractionActionPayload {\n interactionId: Snowflake;\n ephemeral?: boolean;\n}\n\nexport interface FollowUpInteractionActionPayload extends BridgeMessageInput {\n interactionId: Snowflake;\n ephemeral?: boolean;\n}\n\nexport interface DeferUpdateInteractionActionPayload {\n interactionId: Snowflake;\n}\n\nexport interface EditInteractionReplyActionPayload extends BridgeMessageInput {\n interactionId: Snowflake;\n}\n\nexport interface DeleteInteractionReplyActionPayload {\n interactionId: Snowflake;\n}\n\nexport interface UpdateInteractionActionPayload extends BridgeMessageInput {\n interactionId: Snowflake;\n}\n\nexport interface ShowModalActionPayload {\n interactionId: Snowflake;\n title: string;\n customId: string;\n components: APIActionRowComponent<APITextInputComponent>[];\n}\n\nexport interface FetchMessageActionPayload {\n channelId: Snowflake;\n messageId: Snowflake;\n}\n\nexport interface FetchMemberActionPayload {\n guildId: Snowflake;\n userId: Snowflake;\n}\n\nexport interface BanMemberActionPayload {\n guildId: Snowflake;\n userId: Snowflake;\n reason?: string;\n deleteMessageSeconds?: number;\n}\n\nexport interface KickMemberActionPayload {\n guildId: Snowflake;\n userId: Snowflake;\n reason?: string;\n}\n\nexport interface AddMemberRoleActionPayload {\n guildId: Snowflake;\n userId: Snowflake;\n roleId: Snowflake;\n reason?: string;\n}\n\nexport interface RemoveMemberRoleActionPayload {\n guildId: Snowflake;\n userId: Snowflake;\n roleId: Snowflake;\n reason?: string;\n}\n\nexport interface AddMessageReactionActionPayload {\n channelId: Snowflake;\n messageId: Snowflake;\n emoji: string;\n}\n\nexport interface RemoveOwnMessageReactionActionPayload {\n channelId: Snowflake;\n messageId: Snowflake;\n emoji: string;\n}\n\nexport interface BotActionPayloadMap {\n sendMessage: SendMessageActionPayload;\n editMessage: EditMessageActionPayload;\n deleteMessage: DeleteMessageActionPayload;\n replyToInteraction: ReplyToInteractionActionPayload;\n deferInteraction: DeferInteractionActionPayload;\n deferUpdateInteraction: DeferUpdateInteractionActionPayload;\n followUpInteraction: FollowUpInteractionActionPayload;\n editInteractionReply: EditInteractionReplyActionPayload;\n deleteInteractionReply: DeleteInteractionReplyActionPayload;\n updateInteraction: UpdateInteractionActionPayload;\n showModal: ShowModalActionPayload;\n fetchMessage: FetchMessageActionPayload;\n fetchMember: FetchMemberActionPayload;\n banMember: BanMemberActionPayload;\n kickMember: KickMemberActionPayload;\n addMemberRole: AddMemberRoleActionPayload;\n removeMemberRole: RemoveMemberRoleActionPayload;\n addMessageReaction: AddMessageReactionActionPayload;\n removeOwnMessageReaction: RemoveOwnMessageReactionActionPayload;\n}\n\nexport interface DeleteMessageActionResult {\n deleted: true;\n channelId: Snowflake;\n messageId: Snowflake;\n}\n\nexport interface DeferInteractionActionResult {\n deferred: true;\n interactionId: Snowflake;\n}\n\nexport interface DeferUpdateInteractionActionResult {\n deferred: true;\n interactionId: Snowflake;\n}\n\nexport interface DeleteInteractionReplyActionResult {\n deleted: true;\n interactionId: Snowflake;\n}\n\nexport interface ShowModalActionResult {\n shown: true;\n interactionId: Snowflake;\n}\n\nexport interface MemberModerationActionResult {\n guildId: Snowflake;\n userId: Snowflake;\n}\n\nexport interface MessageReactionActionResult {\n messageId: Snowflake;\n channelId: Snowflake;\n emoji: string;\n}\n\nexport interface BotActionResultDataMap {\n sendMessage: BridgeMessage;\n editMessage: BridgeMessage;\n deleteMessage: DeleteMessageActionResult;\n replyToInteraction: BridgeMessage;\n deferInteraction: DeferInteractionActionResult;\n deferUpdateInteraction: DeferUpdateInteractionActionResult;\n followUpInteraction: BridgeMessage;\n editInteractionReply: BridgeMessage;\n deleteInteractionReply: DeleteInteractionReplyActionResult;\n updateInteraction: BridgeMessage;\n showModal: ShowModalActionResult;\n fetchMessage: BridgeMessage;\n fetchMember: BridgeGuildMember;\n banMember: MemberModerationActionResult;\n kickMember: MemberModerationActionResult;\n addMemberRole: BridgeGuildMember;\n removeMemberRole: BridgeGuildMember;\n addMessageReaction: MessageReactionActionResult;\n removeOwnMessageReaction: MessageReactionActionResult;\n}\n\nexport type BotActionName = keyof BotActionPayloadMap;\n\nexport interface BridgeCapabilities {\n events: BotEventName[];\n actions: BotActionName[];\n}\n\nexport interface EventSubscriptionFilter {\n guildId?: Snowflake | readonly Snowflake[];\n channelId?: Snowflake | readonly Snowflake[];\n userId?: Snowflake | readonly Snowflake[];\n commandName?: string | readonly string[];\n /** Matches `BridgeInteraction.customId` when present (components, modals). */\n customId?: string | readonly string[];\n /** Matches `BridgeInteraction.kind`. */\n interactionKind?: BridgeInteractionKind | readonly BridgeInteractionKind[];\n}\n\nexport interface EventSubscription<K extends BotEventName = BotEventName> {\n name: K;\n filter?: EventSubscriptionFilter;\n}\n\nexport interface SecretPermissions {\n events?: \"*\" | readonly BotEventName[];\n actions?: \"*\" | readonly BotActionName[];\n}\n\nexport interface ScopedSecretConfig {\n id?: string;\n value: string;\n allow?: SecretPermissions;\n}\n\nexport type BotBridgeSecret = string | ScopedSecretConfig;\n\n/** Structured Discord / transport context for failed actions (machine-readable). */\nexport interface ActionErrorDetails {\n discordStatus?: number;\n discordCode?: number;\n /** When true, callers may retry with backoff (e.g. rate limits). */\n retryable?: boolean;\n [key: string]: unknown;\n}\n\nexport interface BotBridgeOptions {\n token: string;\n intents: readonly BotIntentName[];\n server: {\n port: number;\n host?: string;\n path?: string;\n heartbeatMs?: number;\n maxPayloadBytes?: number;\n secrets: readonly BotBridgeSecret[];\n /** Reject new TCP connections when authenticated client count reaches this cap (default: unlimited). */\n maxConnections?: number;\n /** Max concurrent action executions per bot process (default: 32). */\n maxConcurrentActions?: number;\n /** When the queue is full, fail fast with `SERVICE_UNAVAILABLE` (default: 5000). */\n actionQueueTimeoutMs?: number;\n };\n logger?: ShardwireLogger;\n}\n\nexport interface AppBridgeMetricsHooks {\n onActionComplete?: (meta: {\n name: BotActionName;\n requestId: string;\n durationMs: number;\n ok: boolean;\n errorCode?: string;\n }) => void;\n}\n\nexport interface AppBridgeOptions {\n url: string;\n secret: string;\n secretId?: string;\n appName?: string;\n reconnect?: {\n enabled?: boolean;\n initialDelayMs?: number;\n maxDelayMs?: number;\n jitter?: boolean;\n };\n requestTimeoutMs?: number;\n logger?: ShardwireLogger;\n metrics?: AppBridgeMetricsHooks;\n}\n\nexport interface ActionError {\n code:\n | \"UNAUTHORIZED\"\n | \"TIMEOUT\"\n | \"DISCONNECTED\"\n | \"FORBIDDEN\"\n | \"NOT_FOUND\"\n | \"INVALID_REQUEST\"\n | \"INTERNAL_ERROR\"\n | \"SERVICE_UNAVAILABLE\";\n message: string;\n details?: ActionErrorDetails | unknown;\n}\n\nexport interface ActionSuccess<T> {\n ok: true;\n requestId: string;\n ts: number;\n data: T;\n}\n\nexport interface ActionFailure {\n ok: false;\n requestId: string;\n ts: number;\n error: ActionError;\n}\n\nexport type ActionResult<T> = ActionSuccess<T> | ActionFailure;\n\nexport class BridgeCapabilityError extends Error {\n constructor(\n public readonly kind: \"event\" | \"action\",\n public readonly name: string,\n message?: string,\n ) {\n super(message ?? `Capability \"${name}\" is not available for ${kind}.`);\n this.name = \"BridgeCapabilityError\";\n }\n}\n\nexport type EventHandler<K extends BotEventName> = (payload: BotEventPayloadMap[K]) => void;\n\nexport type AppBridgeActionInvokeOptions = {\n timeoutMs?: number;\n requestId?: string;\n /** When set, duplicate keys within TTL return the first result (best-effort idempotency). */\n idempotencyKey?: string;\n};\n\nexport type AppBridgeActions = {\n [K in BotActionName]: (\n payload: BotActionPayloadMap[K],\n options?: AppBridgeActionInvokeOptions,\n ) => Promise<ActionResult<BotActionResultDataMap[K]>>;\n};\n\nexport interface BotBridge {\n ready(): Promise<void>;\n close(): Promise<void>;\n status(): { ready: boolean; connectionCount: number };\n}\n\nexport interface AppBridge {\n actions: AppBridgeActions;\n ready(): Promise<void>;\n close(): Promise<void>;\n connected(): boolean;\n connectionId(): string | null;\n capabilities(): BridgeCapabilities;\n on<K extends BotEventName>(name: K, handler: EventHandler<K>, filter?: EventSubscriptionFilter): Unsubscribe;\n off<K extends BotEventName>(name: K, handler: EventHandler<K>): void;\n}\n","import { WebSocket } from \"ws\";\n\nexport interface WebSocketLike {\n readyState: number;\n send(data: string): void;\n close(code?: number, reason?: string): void;\n on(event: \"open\", listener: () => void): void;\n on(event: \"message\", listener: (data: unknown) => void): void;\n on(event: \"close\", listener: () => void): void;\n on(event: \"error\", listener: (error: unknown) => void): void;\n once(event: \"close\", listener: () => void): void;\n}\n\nexport function createNodeWebSocket(url: string): WebSocketLike {\n return new WebSocket(url) as unknown as WebSocketLike;\n}\n","export interface BackoffConfig {\n initialDelayMs: number;\n maxDelayMs: number;\n jitter: boolean;\n}\n\nexport function getBackoffDelay(attempt: number, config: BackoffConfig): number {\n const base = Math.min(config.maxDelayMs, config.initialDelayMs * 2 ** attempt);\n if (!config.jitter) {\n return base;\n }\n const spread = Math.floor(base * 0.2);\n const min = Math.max(0, base - spread);\n const max = base + spread;\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n","import type {\n ActionFailure,\n ActionResult,\n AppBridge,\n AppBridgeActions,\n AppBridgeActionInvokeOptions,\n AppBridgeOptions,\n BotActionName,\n BotActionPayloadMap,\n BotActionResultDataMap,\n BotEventName,\n BridgeCapabilities,\n EventSubscription,\n EventSubscriptionFilter,\n EventHandler,\n} from \"../discord/types\";\nimport { BridgeCapabilityError } from \"../discord/types\";\nimport { matchesEventSubscription, serializeEventSubscription } from \"../bridge/subscriptions\";\nimport { createNodeWebSocket, type WebSocketLike } from \"../bridge/transport/socket\";\nimport {\n makeEnvelope,\n parseEnvelope,\n stringifyEnvelope,\n type ActionResponsePayload,\n type AuthErrorPayload,\n type AuthOkPayload,\n} from \"../bridge/transport/protocol\";\nimport { assertAppBridgeOptions } from \"../bridge/validation\";\nimport { createRequestId } from \"../utils/id\";\nimport { getBackoffDelay } from \"../utils/backoff\";\nimport { withLogger } from \"../utils/logger\";\n\ninterface PendingRequest {\n resolve: (value: ActionResult<unknown>) => void;\n reject: (error: AppRequestError) => void;\n timer: NodeJS.Timeout;\n}\n\nclass AppRequestError extends Error {\n constructor(\n public readonly code: \"TIMEOUT\" | \"DISCONNECTED\" | \"UNAUTHORIZED\",\n message: string,\n ) {\n super(message);\n this.name = \"AppRequestError\";\n }\n}\n\ninterface HandlerSubscriptionEntry {\n handler: EventHandler<BotEventName>;\n subscription: EventSubscription;\n signature: string;\n}\n\nconst DEFAULT_REQUEST_TIMEOUT_MS = 10000;\n\nexport function connectBotBridge(options: AppBridgeOptions): AppBridge {\n assertAppBridgeOptions(options);\n\n const logger = withLogger(options.logger);\n const metrics = options.metrics;\n const reconnectEnabled = options.reconnect?.enabled ?? true;\n const initialDelayMs = options.reconnect?.initialDelayMs ?? 500;\n const maxDelayMs = options.reconnect?.maxDelayMs ?? 10000;\n const jitter = options.reconnect?.jitter ?? true;\n const requestTimeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n\n let socket: WebSocketLike | null = null;\n let isClosed = false;\n let isAuthed = false;\n let currentConnectionId: string | null = null;\n let currentCapabilities: BridgeCapabilities = { events: [], actions: [] };\n let reconnectAttempts = 0;\n let reconnectTimer: NodeJS.Timeout | null = null;\n let connectPromise: Promise<void> | null = null;\n let connectResolve: (() => void) | null = null;\n let connectReject: ((error: Error) => void) | null = null;\n let authTimeoutTimer: NodeJS.Timeout | null = null;\n let capabilityError: BridgeCapabilityError | null = null;\n\n const pendingRequests = new Map<string, PendingRequest>();\n const eventHandlers = new Map<BotEventName, Set<HandlerSubscriptionEntry>>();\n const subscribedEntries = new Map<string, EventSubscription>();\n\n function clearAuthTimeout(): void {\n if (authTimeoutTimer) {\n clearTimeout(authTimeoutTimer);\n authTimeoutTimer = null;\n }\n }\n\n function resolveConnect(): void {\n clearAuthTimeout();\n connectResolve?.();\n connectResolve = null;\n connectReject = null;\n connectPromise = null;\n }\n\n function rejectConnect(message: string): void {\n clearAuthTimeout();\n if (connectReject) {\n connectReject(new Error(message));\n }\n connectResolve = null;\n connectReject = null;\n connectPromise = null;\n }\n\n function sendRaw(data: string): void {\n if (!socket || socket.readyState !== 1) {\n throw new Error(\"App bridge is not connected.\");\n }\n socket.send(data);\n }\n\n function rejectAllPending(\n code: \"TIMEOUT\" | \"DISCONNECTED\" | \"UNAUTHORIZED\",\n reason: string,\n ): void {\n for (const [requestId, pending] of pendingRequests.entries()) {\n clearTimeout(pending.timer);\n pending.reject(new AppRequestError(code, reason));\n pendingRequests.delete(requestId);\n }\n }\n\n function scheduleReconnect(): void {\n if (isClosed || !reconnectEnabled || reconnectTimer) {\n return;\n }\n const delay = getBackoffDelay(reconnectAttempts, { initialDelayMs, maxDelayMs, jitter });\n reconnectAttempts += 1;\n reconnectTimer = setTimeout(() => {\n reconnectTimer = null;\n void connect().catch((error) => {\n logger.warn(\"Reconnect attempt failed.\", { error: String(error) });\n });\n }, delay);\n }\n\n function evaluateSubscriptions(): Map<string, EventSubscription> {\n const desiredSubscriptions = new Map<string, EventSubscription>();\n if (!isAuthed && currentCapabilities.events.length === 0) {\n capabilityError = null;\n for (const handlers of eventHandlers.values()) {\n for (const entry of handlers) {\n desiredSubscriptions.set(entry.signature, entry.subscription);\n }\n }\n return desiredSubscriptions;\n }\n\n const allowedEvents = new Set(currentCapabilities.events);\n const invalidEvents = [...eventHandlers.keys()].filter((eventName) => !allowedEvents.has(eventName));\n const firstInvalid = invalidEvents[0];\n capabilityError =\n firstInvalid !== undefined\n ? new BridgeCapabilityError(\"event\", firstInvalid, `Event \"${firstInvalid}\" is not available for this app.`)\n : null;\n\n for (const [eventName, handlers] of eventHandlers.entries()) {\n if (!allowedEvents.has(eventName)) {\n continue;\n }\n for (const entry of handlers) {\n desiredSubscriptions.set(entry.signature, entry.subscription);\n }\n }\n return desiredSubscriptions;\n }\n\n function syncSubscriptions(): void {\n if (!isAuthed || !socket || socket.readyState !== 1) {\n return;\n }\n\n const desiredSubscriptions = evaluateSubscriptions();\n\n const toSubscribe = [...desiredSubscriptions.entries()]\n .filter(([signature]) => !subscribedEntries.has(signature))\n .map(([, subscription]) => subscription);\n if (toSubscribe.length > 0) {\n sendRaw(stringifyEnvelope(makeEnvelope(\"subscribe\", { subscriptions: toSubscribe })));\n for (const subscription of toSubscribe) {\n subscribedEntries.set(serializeEventSubscription(subscription), subscription);\n }\n }\n\n const toUnsubscribe = [...subscribedEntries.entries()]\n .filter(([signature]) => !desiredSubscriptions.has(signature))\n .map(([, subscription]) => subscription);\n if (toUnsubscribe.length > 0) {\n sendRaw(stringifyEnvelope(makeEnvelope(\"unsubscribe\", { subscriptions: toUnsubscribe })));\n for (const subscription of toUnsubscribe) {\n subscribedEntries.delete(serializeEventSubscription(subscription));\n }\n }\n }\n\n function handleEvent(name: BotEventName, payload: unknown): void {\n const handlers = eventHandlers.get(name);\n if (!handlers || handlers.size === 0) {\n return;\n }\n for (const entry of handlers) {\n try {\n if (!matchesEventSubscription(entry.subscription, payload)) {\n continue;\n }\n entry.handler(payload as never);\n } catch (error) {\n logger.warn(\"App event handler threw an error.\", { event: name, error: String(error) });\n }\n }\n }\n\n async function connect(): Promise<void> {\n if (isClosed) {\n return;\n }\n if (socket && socket.readyState === 1 && isAuthed) {\n return;\n }\n if (connectPromise) {\n return connectPromise;\n }\n\n connectPromise = new Promise<void>((resolve, reject) => {\n connectResolve = resolve;\n connectReject = reject;\n });\n\n socket = createNodeWebSocket(options.url);\n\n socket.on(\"open\", () => {\n reconnectAttempts = 0;\n isAuthed = false;\n subscribedEntries.clear();\n currentConnectionId = null;\n currentCapabilities = { events: [], actions: [] };\n capabilityError = null;\n\n sendRaw(\n stringifyEnvelope(\n makeEnvelope(\"auth.hello\", {\n secret: options.secret,\n ...(options.secretId ? { secretId: options.secretId } : {}),\n ...(options.appName ? { appName: options.appName } : {}),\n }),\n ),\n );\n authTimeoutTimer = setTimeout(() => {\n if (!isAuthed) {\n rejectConnect(\"App bridge authentication timed out.\");\n socket?.close();\n }\n }, requestTimeoutMs);\n });\n\n socket.on(\"message\", (raw) => {\n try {\n const serialized = typeof raw === \"string\" ? raw : String(raw);\n const envelope = parseEnvelope(serialized);\n switch (envelope.type) {\n case \"auth.ok\": {\n const payload = envelope.payload as AuthOkPayload;\n isAuthed = true;\n currentConnectionId = payload.connectionId;\n currentCapabilities = payload.capabilities;\n syncSubscriptions();\n resolveConnect();\n break;\n }\n case \"auth.error\": {\n const payload = envelope.payload as AuthErrorPayload;\n rejectConnect(payload.message);\n rejectAllPending(\"UNAUTHORIZED\", payload.message);\n socket?.close();\n break;\n }\n case \"action.result\":\n case \"action.error\": {\n const requestId = envelope.requestId;\n if (!requestId) {\n return;\n }\n const pending = pendingRequests.get(requestId);\n if (!pending) {\n return;\n }\n clearTimeout(pending.timer);\n pending.resolve(envelope.payload as ActionResponsePayload);\n pendingRequests.delete(requestId);\n break;\n }\n case \"discord.event\": {\n const payload = envelope.payload as { name: BotEventName; data: unknown };\n handleEvent(payload.name, payload.data);\n break;\n }\n case \"ping\":\n sendRaw(stringifyEnvelope(makeEnvelope(\"pong\", {})));\n break;\n default:\n break;\n }\n } catch (error) {\n logger.warn(\"Failed to parse app bridge message.\", { error: String(error) });\n }\n });\n\n socket.on(\"close\", () => {\n rejectConnect(\"App bridge connection closed.\");\n isAuthed = false;\n currentConnectionId = null;\n currentCapabilities = { events: [], actions: [] };\n subscribedEntries.clear();\n rejectAllPending(\"DISCONNECTED\", \"App bridge connection closed before action completed.\");\n if (!isClosed) {\n scheduleReconnect();\n }\n });\n\n socket.on(\"error\", (error) => {\n logger.warn(\"App bridge socket error.\", { error: String(error) });\n });\n\n return connectPromise;\n }\n\n async function invokeAction<K extends BotActionName>(\n name: K,\n payload: BotActionPayloadMap[K],\n sendOptions?: AppBridgeActionInvokeOptions,\n ): Promise<ActionResult<BotActionResultDataMap[K]>> {\n try {\n await connect();\n } catch (error) {\n return {\n ok: false,\n requestId: sendOptions?.requestId ?? \"unknown\",\n ts: Date.now(),\n error: {\n code: \"UNAUTHORIZED\",\n message: error instanceof Error ? error.message : \"Failed to authenticate.\",\n },\n } satisfies ActionFailure;\n }\n\n if (!currentCapabilities.actions.includes(name)) {\n return {\n ok: false,\n requestId: sendOptions?.requestId ?? \"unknown\",\n ts: Date.now(),\n error: {\n code: \"FORBIDDEN\",\n message: `Action \"${name}\" is not available for this app.`,\n },\n } satisfies ActionFailure;\n }\n\n if (!socket || socket.readyState !== 1 || !isAuthed) {\n return {\n ok: false,\n requestId: sendOptions?.requestId ?? \"unknown\",\n ts: Date.now(),\n error: {\n code: \"DISCONNECTED\",\n message: \"Not connected to the bot bridge.\",\n },\n } satisfies ActionFailure;\n }\n\n const requestId = sendOptions?.requestId ?? createRequestId();\n const timeoutMs = sendOptions?.timeoutMs ?? requestTimeoutMs;\n const started = Date.now();\n const promise = new Promise<ActionResult<unknown>>((resolve, reject) => {\n const timer = setTimeout(() => {\n pendingRequests.delete(requestId);\n reject(new AppRequestError(\"TIMEOUT\", `Action \"${name}\" timed out after ${timeoutMs}ms.`));\n }, timeoutMs);\n\n pendingRequests.set(requestId, {\n resolve,\n reject: (error) => reject(error),\n timer,\n });\n });\n\n sendRaw(\n stringifyEnvelope(\n makeEnvelope(\n \"action.request\",\n {\n name,\n data: payload,\n ...(sendOptions?.idempotencyKey ? { idempotencyKey: sendOptions.idempotencyKey } : {}),\n },\n { requestId },\n ),\n ),\n );\n\n try {\n const result = (await promise) as ActionResult<BotActionResultDataMap[K]>;\n metrics?.onActionComplete?.({\n name,\n requestId,\n durationMs: Date.now() - started,\n ok: result.ok,\n ...(!result.ok ? { errorCode: result.error.code } : {}),\n });\n return result;\n } catch (error) {\n const code =\n error instanceof AppRequestError\n ? error.code\n : !socket || socket.readyState !== 1\n ? \"DISCONNECTED\"\n : \"TIMEOUT\";\n metrics?.onActionComplete?.({\n name,\n requestId,\n durationMs: Date.now() - started,\n ok: false,\n errorCode: code,\n });\n return {\n ok: false,\n requestId,\n ts: Date.now(),\n error: {\n code,\n message: error instanceof Error ? error.message : \"Action request failed.\",\n },\n } satisfies ActionFailure;\n }\n }\n\n const actions: AppBridgeActions = {\n sendMessage: (payload, sendOptions) => invokeAction(\"sendMessage\", payload, sendOptions),\n editMessage: (payload, sendOptions) => invokeAction(\"editMessage\", payload, sendOptions),\n deleteMessage: (payload, sendOptions) => invokeAction(\"deleteMessage\", payload, sendOptions),\n replyToInteraction: (payload, sendOptions) => invokeAction(\"replyToInteraction\", payload, sendOptions),\n deferInteraction: (payload, sendOptions) => invokeAction(\"deferInteraction\", payload, sendOptions),\n deferUpdateInteraction: (payload, sendOptions) => invokeAction(\"deferUpdateInteraction\", payload, sendOptions),\n followUpInteraction: (payload, sendOptions) => invokeAction(\"followUpInteraction\", payload, sendOptions),\n editInteractionReply: (payload, sendOptions) => invokeAction(\"editInteractionReply\", payload, sendOptions),\n deleteInteractionReply: (payload, sendOptions) => invokeAction(\"deleteInteractionReply\", payload, sendOptions),\n updateInteraction: (payload, sendOptions) => invokeAction(\"updateInteraction\", payload, sendOptions),\n showModal: (payload, sendOptions) => invokeAction(\"showModal\", payload, sendOptions),\n fetchMessage: (payload, sendOptions) => invokeAction(\"fetchMessage\", payload, sendOptions),\n fetchMember: (payload, sendOptions) => invokeAction(\"fetchMember\", payload, sendOptions),\n banMember: (payload, sendOptions) => invokeAction(\"banMember\", payload, sendOptions),\n kickMember: (payload, sendOptions) => invokeAction(\"kickMember\", payload, sendOptions),\n addMemberRole: (payload, sendOptions) => invokeAction(\"addMemberRole\", payload, sendOptions),\n removeMemberRole: (payload, sendOptions) => invokeAction(\"removeMemberRole\", payload, sendOptions),\n addMessageReaction: (payload, sendOptions) => invokeAction(\"addMessageReaction\", payload, sendOptions),\n removeOwnMessageReaction: (payload, sendOptions) => invokeAction(\"removeOwnMessageReaction\", payload, sendOptions),\n };\n\n return {\n actions,\n async ready() {\n await connect();\n if (capabilityError) {\n throw capabilityError;\n }\n },\n async close() {\n isClosed = true;\n isAuthed = false;\n currentConnectionId = null;\n currentCapabilities = { events: [], actions: [] };\n capabilityError = null;\n subscribedEntries.clear();\n rejectConnect(\"App bridge has been closed.\");\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n rejectAllPending(\"DISCONNECTED\", \"App bridge has been closed.\");\n if (!socket) {\n return;\n }\n await new Promise<void>((resolve) => {\n const current = socket;\n if (!current) {\n resolve();\n return;\n }\n current.once(\"close\", () => resolve());\n current.close();\n });\n socket = null;\n },\n connected() {\n return Boolean(socket && socket.readyState === 1 && isAuthed);\n },\n connectionId() {\n return currentConnectionId;\n },\n capabilities() {\n return {\n events: [...currentCapabilities.events],\n actions: [...currentCapabilities.actions],\n };\n },\n on(name, handler, filter?: EventSubscriptionFilter) {\n if (currentCapabilities.events.length > 0 && !currentCapabilities.events.includes(name)) {\n throw new BridgeCapabilityError(\"event\", name, `Event \"${name}\" is not available for this app.`);\n }\n const casted = handler as EventHandler<BotEventName>;\n const subscription: EventSubscription = filter ? { name, filter } : { name };\n const entry: HandlerSubscriptionEntry = {\n handler: casted,\n subscription,\n signature: serializeEventSubscription(subscription),\n };\n const existing = eventHandlers.get(name);\n if (existing) {\n existing.add(entry);\n } else {\n eventHandlers.set(name, new Set<HandlerSubscriptionEntry>([entry]));\n }\n if (this.connected()) {\n syncSubscriptions();\n }\n return () => {\n const handlers = eventHandlers.get(name);\n if (!handlers) {\n return;\n }\n handlers.delete(entry);\n if (handlers.size === 0) {\n eventHandlers.delete(name);\n }\n if (this.connected()) {\n syncSubscriptions();\n }\n };\n },\n off(name, handler) {\n const handlers = eventHandlers.get(name);\n if (!handlers) {\n return;\n }\n for (const entry of [...handlers]) {\n if (entry.handler === (handler as EventHandler<BotEventName>)) {\n handlers.delete(entry);\n }\n }\n if (handlers.size === 0) {\n eventHandlers.delete(name);\n }\n if (this.connected()) {\n syncSubscriptions();\n }\n },\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/discord/catalog.ts","../src/discord/runtime/adapter.ts","../src/discord/runtime/discordjs-adapter.ts","../src/utils/logger.ts","../src/utils/cache.ts","../src/discord/runtime/serializers.ts","../src/bridge/transport/server.ts","../src/utils/id.ts","../src/bridge/subscriptions.ts","../src/bridge/transport/security.ts","../src/bridge/transport/protocol.ts","../src/utils/semaphore.ts","../src/bridge/validation.ts","../src/bot/index.ts","../src/discord/types.ts","../src/bridge/transport/socket.ts","../src/utils/backoff.ts","../src/app/index.ts"],"sourcesContent":["import { GatewayIntentBits } from 'discord.js';\nimport type { BotActionName, BotEventName, BotIntentName } from './types';\n\nexport const BOT_EVENT_NAMES = [\n\t'ready',\n\t'interactionCreate',\n\t'messageCreate',\n\t'messageUpdate',\n\t'messageDelete',\n\t'messageReactionAdd',\n\t'messageReactionRemove',\n\t'guildCreate',\n\t'guildDelete',\n\t'guildMemberAdd',\n\t'guildMemberRemove',\n\t'guildMemberUpdate',\n\t'threadCreate',\n\t'threadUpdate',\n\t'threadDelete',\n] as const satisfies readonly BotEventName[];\n\nexport const BOT_ACTION_NAMES = [\n\t'sendMessage',\n\t'editMessage',\n\t'deleteMessage',\n\t'replyToInteraction',\n\t'deferInteraction',\n\t'deferUpdateInteraction',\n\t'followUpInteraction',\n\t'editInteractionReply',\n\t'deleteInteractionReply',\n\t'updateInteraction',\n\t'showModal',\n\t'fetchMessage',\n\t'fetchMember',\n\t'banMember',\n\t'kickMember',\n\t'addMemberRole',\n\t'removeMemberRole',\n\t'addMessageReaction',\n\t'removeOwnMessageReaction',\n] as const satisfies readonly BotActionName[];\n\nconst DISCORD_GATEWAY_INTENT_ENTRIES = Object.entries(GatewayIntentBits).filter(\n\t(entry): entry is [BotIntentName, number] => typeof entry[1] === 'number',\n);\n\nexport const BOT_INTENT_BITS: Record<BotIntentName, number> = Object.fromEntries(\n\tDISCORD_GATEWAY_INTENT_ENTRIES,\n) as Record<BotIntentName, number>;\n\nconst EVENT_REQUIRED_INTENTS: Record<BotEventName, readonly BotIntentName[]> = {\n\tready: [],\n\tinteractionCreate: [],\n\tmessageCreate: ['GuildMessages'],\n\tmessageUpdate: ['GuildMessages'],\n\tmessageDelete: ['GuildMessages'],\n\tmessageReactionAdd: ['GuildMessageReactions'],\n\tmessageReactionRemove: ['GuildMessageReactions'],\n\tguildCreate: ['Guilds'],\n\tguildDelete: ['Guilds'],\n\tguildMemberAdd: ['GuildMembers'],\n\tguildMemberRemove: ['GuildMembers'],\n\tguildMemberUpdate: ['GuildMembers'],\n\tthreadCreate: ['Guilds'],\n\tthreadUpdate: ['Guilds'],\n\tthreadDelete: ['Guilds'],\n};\n\nexport function getAvailableEvents(intents: readonly BotIntentName[]): BotEventName[] {\n\tconst enabled = new Set(intents);\n\treturn BOT_EVENT_NAMES.filter((eventName) =>\n\t\tEVENT_REQUIRED_INTENTS[eventName].every((intent) => enabled.has(intent)),\n\t);\n}\n","import type {\n\tBotActionName,\n\tBotActionPayloadMap,\n\tBotActionResultDataMap,\n\tBotEventName,\n\tBotEventPayloadMap,\n\tBotIntentName,\n\tShardwireLogger,\n\tUnsubscribe,\n} from '../types';\n\nexport interface DiscordRuntimeOptions {\n\ttoken: string;\n\tintents: readonly BotIntentName[];\n\tlogger?: ShardwireLogger;\n}\n\nexport interface DiscordRuntimeAdapter {\n\tready(): Promise<void>;\n\tclose(): Promise<void>;\n\tisReady(): boolean;\n\ton<K extends BotEventName>(name: K, handler: (payload: BotEventPayloadMap[K]) => void): Unsubscribe;\n\texecuteAction<K extends BotActionName>(name: K, payload: BotActionPayloadMap[K]): Promise<BotActionResultDataMap[K]>;\n}\n\nexport class ActionExecutionError extends Error {\n\tconstructor(\n\t\tpublic readonly code: 'FORBIDDEN' | 'NOT_FOUND' | 'INVALID_REQUEST' | 'INTERNAL_ERROR' | 'SERVICE_UNAVAILABLE',\n\t\tmessage: string,\n\t\tpublic readonly details?: unknown,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = 'ActionExecutionError';\n\t}\n}\n","import type { Snowflake } from 'discord-api-types/v10';\nimport {\n\tClient,\n\tDiscordAPIError,\n\tEvents,\n\ttype Guild,\n\ttype GuildMember,\n\ttype Interaction,\n\ttype Message,\n\ttype MessageReaction,\n\tMessageFlags,\n\ttype PartialMessageReaction,\n\ttype PartialUser,\n\ttype PartialMessage,\n\ttype PartialGuildMember,\n\ttype MessageComponentInteraction,\n\ttype ThreadChannel,\n\ttype User,\n} from 'discord.js';\nimport { BOT_INTENT_BITS } from '../catalog';\nimport type {\n\tBotActionName,\n\tBotActionPayloadMap,\n\tBotActionResultDataMap,\n\tBotEventName,\n\tBotEventPayloadMap,\n\tBridgeMessageInput,\n\tEventEnvelopeBase,\n\tUnsubscribe,\n} from '../types';\nimport { withLogger } from '../../utils/logger';\nimport { DedupeCache } from '../../utils/cache';\nimport { ActionExecutionError, type DiscordRuntimeAdapter, type DiscordRuntimeOptions } from './adapter';\nimport {\n\tserializeDeletedMessage,\n\tserializeGuild,\n\tserializeGuildMember,\n\tserializeInteraction,\n\tserializeMessageReaction,\n\tserializeMessage,\n\tserializeThread,\n\tserializeUser,\n} from './serializers';\n\ntype ReplyCapableInteraction = Interaction & {\n\treplied: boolean;\n\tdeferred: boolean;\n\treply(options: unknown): Promise<unknown>;\n\tdeferReply(options?: unknown): Promise<unknown>;\n\tfollowUp(options: unknown): Promise<unknown>;\n\teditReply(options: unknown): Promise<unknown>;\n\tdeleteReply(): Promise<unknown>;\n};\n\ninterface SendCapableChannel {\n\tsend(options: Record<string, unknown>): Promise<Message>;\n}\n\ninterface MessageManageableChannel extends SendCapableChannel {\n\tmessages: {\n\t\tfetch(messageId: Snowflake): Promise<Message | PartialMessage>;\n\t};\n}\n\nconst INTERACTION_CACHE_TTL_MS = 15 * 60 * 1000;\nconst DISCORD_FORBIDDEN_CODES = new Set<number>([50001, 50013]);\nconst DISCORD_NOT_FOUND_CODES = new Set<number>([10003, 10004, 10007, 10008, 10011, 10062]);\nconst DISCORD_INVALID_REQUEST_CODES = new Set<number>([50035]);\n\nfunction isSendCapableChannel(channel: unknown): channel is SendCapableChannel {\n\treturn Boolean(channel && typeof (channel as { send?: unknown }).send === 'function');\n}\n\nfunction isMessageManageableChannel(channel: unknown): channel is MessageManageableChannel {\n\tif (!isSendCapableChannel(channel)) {\n\t\treturn false;\n\t}\n\tconst messages = (channel as { messages?: { fetch?: unknown } }).messages;\n\treturn Boolean(messages && typeof messages.fetch === 'function');\n}\n\nfunction toSendOptions(input: BridgeMessageInput): Record<string, unknown> {\n\treturn {\n\t\t...(input.content !== undefined ? { content: input.content } : {}),\n\t\t...(input.embeds !== undefined ? { embeds: input.embeds } : {}),\n\t\t...(input.allowedMentions !== undefined ? { allowedMentions: input.allowedMentions } : {}),\n\t\t...(input.components !== undefined ? { components: input.components } : {}),\n\t\t...(input.flags !== undefined ? { flags: input.flags } : {}),\n\t\t...(input.stickerIds !== undefined ? { stickers: input.stickerIds } : {}),\n\t};\n}\n\nfunction extractDiscordErrorDetails(error: unknown): { status?: number; code?: number; message?: string } {\n\tif (error instanceof DiscordAPIError) {\n\t\treturn {\n\t\t\t...(typeof error.status === 'number' ? { status: error.status } : {}),\n\t\t\t...(typeof error.code === 'number' ? { code: error.code } : {}),\n\t\t\tmessage: error.message,\n\t\t};\n\t}\n\tif (error && typeof error === 'object') {\n\t\tconst candidate = error as { status?: unknown; code?: unknown; message?: unknown };\n\t\treturn {\n\t\t\t...(typeof candidate.status === 'number' ? { status: candidate.status } : {}),\n\t\t\t...(typeof candidate.code === 'number' ? { code: candidate.code } : {}),\n\t\t\t...(typeof candidate.message === 'string' ? { message: candidate.message } : {}),\n\t\t};\n\t}\n\treturn {};\n}\n\nexport function mapDiscordErrorToActionExecutionError(error: unknown): ActionExecutionError | null {\n\tconst details = extractDiscordErrorDetails(error);\n\tconst message = details.message ?? (error instanceof Error ? error.message : 'Discord action failed.');\n\n\tconst detailPayload = {\n\t\t...(typeof details.status === 'number' ? { discordStatus: details.status } : {}),\n\t\t...(typeof details.code === 'number' ? { discordCode: details.code } : {}),\n\t};\n\n\tif (details.status === 403 || (details.code !== undefined && DISCORD_FORBIDDEN_CODES.has(details.code))) {\n\t\treturn new ActionExecutionError('FORBIDDEN', message, detailPayload);\n\t}\n\tif (details.status === 404 || (details.code !== undefined && DISCORD_NOT_FOUND_CODES.has(details.code))) {\n\t\treturn new ActionExecutionError('NOT_FOUND', message, detailPayload);\n\t}\n\tif (details.status === 400 || (details.code !== undefined && DISCORD_INVALID_REQUEST_CODES.has(details.code))) {\n\t\treturn new ActionExecutionError('INVALID_REQUEST', message, detailPayload);\n\t}\n\tif (details.status === 429) {\n\t\tlet retryAfterMs: number | undefined;\n\t\tif (error instanceof DiscordAPIError) {\n\t\t\tconst raw = error.rawError as { retry_after?: unknown } | undefined;\n\t\t\tconst retryAfter = raw?.retry_after;\n\t\t\tif (typeof retryAfter === 'number' && Number.isFinite(retryAfter)) {\n\t\t\t\tretryAfterMs = Math.max(0, Math.ceil(retryAfter * 1000));\n\t\t\t}\n\t\t}\n\t\treturn new ActionExecutionError('SERVICE_UNAVAILABLE', message, {\n\t\t\tdiscordStatus: 429,\n\t\t\tretryable: true,\n\t\t\t...(details.code !== undefined ? { discordCode: details.code } : {}),\n\t\t\t...(retryAfterMs !== undefined ? { retryAfterMs } : {}),\n\t\t});\n\t}\n\treturn null;\n}\n\nexport class DiscordJsRuntimeAdapter implements DiscordRuntimeAdapter {\n\tprivate readonly client: Client;\n\tprivate readonly logger;\n\tprivate readonly interactionCache = new DedupeCache<Interaction>(INTERACTION_CACHE_TTL_MS);\n\tprivate readonly actionHandlers: {\n\t\t[K in BotActionName]: (payload: BotActionPayloadMap[K]) => Promise<BotActionResultDataMap[K]>;\n\t};\n\tprivate readyPromise: Promise<void> | null = null;\n\tprivate hasReady = false;\n\n\tconstructor(private readonly options: DiscordRuntimeOptions) {\n\t\tconst intentBits = options.intents.map((intent) => BOT_INTENT_BITS[intent]);\n\t\tthis.logger = withLogger(options.logger);\n\t\tthis.client = new Client({\n\t\t\tintents: intentBits,\n\t\t});\n\t\tthis.client.once(Events.ClientReady, () => {\n\t\t\tthis.hasReady = true;\n\t\t});\n\t\tthis.actionHandlers = {\n\t\t\tsendMessage: (payload) => this.sendMessage(payload),\n\t\t\teditMessage: (payload) => this.editMessage(payload),\n\t\t\tdeleteMessage: (payload) => this.deleteMessage(payload),\n\t\t\treplyToInteraction: (payload) => this.replyToInteraction(payload),\n\t\t\tdeferInteraction: (payload) => this.deferInteraction(payload),\n\t\t\tdeferUpdateInteraction: (payload) => this.deferUpdateInteraction(payload),\n\t\t\tfollowUpInteraction: (payload) => this.followUpInteraction(payload),\n\t\t\teditInteractionReply: (payload) => this.editInteractionReply(payload),\n\t\t\tdeleteInteractionReply: (payload) => this.deleteInteractionReply(payload),\n\t\t\tupdateInteraction: (payload) => this.updateInteraction(payload),\n\t\t\tshowModal: (payload) => this.showModal(payload),\n\t\t\tfetchMessage: (payload) => this.fetchMessage(payload),\n\t\t\tfetchMember: (payload) => this.fetchMember(payload),\n\t\t\tbanMember: (payload) => this.banMember(payload),\n\t\t\tkickMember: (payload) => this.kickMember(payload),\n\t\t\taddMemberRole: (payload) => this.addMemberRole(payload),\n\t\t\tremoveMemberRole: (payload) => this.removeMemberRole(payload),\n\t\t\taddMessageReaction: (payload) => this.addMessageReaction(payload),\n\t\t\tremoveOwnMessageReaction: (payload) => this.removeOwnMessageReaction(payload),\n\t\t};\n\t}\n\n\tprivate shardEnvelope(): Pick<EventEnvelopeBase, 'shardId'> {\n\t\tconst shardId = this.client.shard?.ids?.[0];\n\t\treturn shardId !== undefined ? { shardId } : {};\n\t}\n\n\tisReady(): boolean {\n\t\treturn this.hasReady && this.client.isReady();\n\t}\n\n\tready(): Promise<void> {\n\t\tif (this.readyPromise) {\n\t\t\treturn this.readyPromise;\n\t\t}\n\t\tif (this.isReady()) {\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\tthis.readyPromise = new Promise<void>((resolve, reject) => {\n\t\t\tconst onReady = () => {\n\t\t\t\tcleanup();\n\t\t\t\tthis.hasReady = true;\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\tconst onError = (error: unknown) => {\n\t\t\t\tcleanup();\n\t\t\t\treject(error instanceof Error ? error : new Error(String(error)));\n\t\t\t};\n\t\t\tconst cleanup = () => {\n\t\t\t\tthis.client.off(Events.ClientReady, onReady);\n\t\t\t\tthis.client.off('error', onError);\n\t\t\t};\n\n\t\t\tthis.client.once(Events.ClientReady, onReady);\n\t\t\tthis.client.once('error', onError);\n\t\t\tvoid this.client.login(this.options.token).catch((error: unknown) => {\n\t\t\t\tcleanup();\n\t\t\t\treject(error instanceof Error ? error : new Error(String(error)));\n\t\t\t});\n\t\t});\n\t\treturn this.readyPromise;\n\t}\n\n\tasync close(): Promise<void> {\n\t\tthis.client.removeAllListeners();\n\t\tawait this.client.destroy();\n\t\tthis.readyPromise = null;\n\t\tthis.hasReady = false;\n\t}\n\n\ton<K extends BotEventName>(name: K, handler: (payload: BotEventPayloadMap[K]) => void): Unsubscribe {\n\t\tswitch (name) {\n\t\t\tcase 'ready': {\n\t\t\t\tconst listener = () => {\n\t\t\t\t\tif (!this.client.user) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\thandler({\n\t\t\t\t\t\treceivedAt: Date.now(),\n\t\t\t\t\t\t...this.shardEnvelope(),\n\t\t\t\t\t\tuser: serializeUser(this.client.user),\n\t\t\t\t\t} as BotEventPayloadMap[K]);\n\t\t\t\t};\n\t\t\t\tthis.client.on(Events.ClientReady, listener);\n\t\t\t\tif (this.client.isReady() && this.client.user) {\n\t\t\t\t\tlistener();\n\t\t\t\t}\n\t\t\t\treturn () => {\n\t\t\t\t\tthis.client.off(Events.ClientReady, listener);\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase 'interactionCreate': {\n\t\t\t\tconst listener = (interaction: Interaction) => {\n\t\t\t\t\tthis.interactionCache.set(interaction.id, interaction);\n\t\t\t\t\thandler({\n\t\t\t\t\t\treceivedAt: Date.now(),\n\t\t\t\t\t\t...this.shardEnvelope(),\n\t\t\t\t\t\tinteraction: serializeInteraction(interaction),\n\t\t\t\t\t} as BotEventPayloadMap[K]);\n\t\t\t\t};\n\t\t\t\tthis.client.on(Events.InteractionCreate, listener);\n\t\t\t\treturn () => {\n\t\t\t\t\tthis.client.off(Events.InteractionCreate, listener);\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase 'messageCreate': {\n\t\t\t\tconst listener = (message: Message) => {\n\t\t\t\t\thandler({\n\t\t\t\t\t\treceivedAt: Date.now(),\n\t\t\t\t\t\t...this.shardEnvelope(),\n\t\t\t\t\t\tmessage: serializeMessage(message),\n\t\t\t\t\t} as BotEventPayloadMap[K]);\n\t\t\t\t};\n\t\t\t\tthis.client.on(Events.MessageCreate, listener);\n\t\t\t\treturn () => {\n\t\t\t\t\tthis.client.off(Events.MessageCreate, listener);\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase 'messageUpdate': {\n\t\t\t\tconst listener = (oldMessage: Message | PartialMessage, newMessage: Message | PartialMessage) => {\n\t\t\t\t\thandler({\n\t\t\t\t\t\treceivedAt: Date.now(),\n\t\t\t\t\t\t...this.shardEnvelope(),\n\t\t\t\t\t\toldMessage: serializeMessage(oldMessage),\n\t\t\t\t\t\tmessage: serializeMessage(newMessage),\n\t\t\t\t\t} as BotEventPayloadMap[K]);\n\t\t\t\t};\n\t\t\t\tthis.client.on(Events.MessageUpdate, listener);\n\t\t\t\treturn () => {\n\t\t\t\t\tthis.client.off(Events.MessageUpdate, listener);\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase 'messageDelete': {\n\t\t\t\tconst listener = (message: Message | PartialMessage) => {\n\t\t\t\t\thandler({\n\t\t\t\t\t\treceivedAt: Date.now(),\n\t\t\t\t\t\t...this.shardEnvelope(),\n\t\t\t\t\t\tmessage: serializeDeletedMessage(message),\n\t\t\t\t\t} as BotEventPayloadMap[K]);\n\t\t\t\t};\n\t\t\t\tthis.client.on(Events.MessageDelete, listener);\n\t\t\t\treturn () => {\n\t\t\t\t\tthis.client.off(Events.MessageDelete, listener);\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase 'messageReactionAdd': {\n\t\t\t\tconst listener = (reaction: MessageReaction | PartialMessageReaction, user: User | PartialUser) => {\n\t\t\t\t\thandler({\n\t\t\t\t\t\treceivedAt: Date.now(),\n\t\t\t\t\t\t...this.shardEnvelope(),\n\t\t\t\t\t\treaction: serializeMessageReaction(reaction, user),\n\t\t\t\t\t} as BotEventPayloadMap[K]);\n\t\t\t\t};\n\t\t\t\tthis.client.on(Events.MessageReactionAdd, listener);\n\t\t\t\treturn () => {\n\t\t\t\t\tthis.client.off(Events.MessageReactionAdd, listener);\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase 'messageReactionRemove': {\n\t\t\t\tconst listener = (reaction: MessageReaction | PartialMessageReaction, user: User | PartialUser) => {\n\t\t\t\t\thandler({\n\t\t\t\t\t\treceivedAt: Date.now(),\n\t\t\t\t\t\t...this.shardEnvelope(),\n\t\t\t\t\t\treaction: serializeMessageReaction(reaction, user),\n\t\t\t\t\t} as BotEventPayloadMap[K]);\n\t\t\t\t};\n\t\t\t\tthis.client.on(Events.MessageReactionRemove, listener);\n\t\t\t\treturn () => {\n\t\t\t\t\tthis.client.off(Events.MessageReactionRemove, listener);\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase 'guildMemberAdd': {\n\t\t\t\tconst listener = (member: GuildMember) => {\n\t\t\t\t\thandler({\n\t\t\t\t\t\treceivedAt: Date.now(),\n\t\t\t\t\t\t...this.shardEnvelope(),\n\t\t\t\t\t\tmember: serializeGuildMember(member),\n\t\t\t\t\t} as BotEventPayloadMap[K]);\n\t\t\t\t};\n\t\t\t\tthis.client.on(Events.GuildMemberAdd, listener);\n\t\t\t\treturn () => {\n\t\t\t\t\tthis.client.off(Events.GuildMemberAdd, listener);\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase 'guildMemberRemove': {\n\t\t\t\tconst listener = (member: GuildMember | PartialGuildMember) => {\n\t\t\t\t\thandler({\n\t\t\t\t\t\treceivedAt: Date.now(),\n\t\t\t\t\t\t...this.shardEnvelope(),\n\t\t\t\t\t\tmember: serializeGuildMember(member),\n\t\t\t\t\t} as BotEventPayloadMap[K]);\n\t\t\t\t};\n\t\t\t\tthis.client.on(Events.GuildMemberRemove, listener);\n\t\t\t\treturn () => {\n\t\t\t\t\tthis.client.off(Events.GuildMemberRemove, listener);\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase 'guildMemberUpdate': {\n\t\t\t\tconst listener = (oldMember: GuildMember | PartialGuildMember, newMember: GuildMember) => {\n\t\t\t\t\thandler({\n\t\t\t\t\t\treceivedAt: Date.now(),\n\t\t\t\t\t\t...this.shardEnvelope(),\n\t\t\t\t\t\toldMember: serializeGuildMember(oldMember),\n\t\t\t\t\t\tmember: serializeGuildMember(newMember),\n\t\t\t\t\t} as BotEventPayloadMap[K]);\n\t\t\t\t};\n\t\t\t\tthis.client.on(Events.GuildMemberUpdate, listener);\n\t\t\t\treturn () => {\n\t\t\t\t\tthis.client.off(Events.GuildMemberUpdate, listener);\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase 'guildCreate': {\n\t\t\t\tconst listener = (guild: Guild) => {\n\t\t\t\t\thandler({\n\t\t\t\t\t\treceivedAt: Date.now(),\n\t\t\t\t\t\t...this.shardEnvelope(),\n\t\t\t\t\t\tguild: serializeGuild(guild),\n\t\t\t\t\t} as BotEventPayloadMap[K]);\n\t\t\t\t};\n\t\t\t\tthis.client.on(Events.GuildCreate, listener);\n\t\t\t\treturn () => {\n\t\t\t\t\tthis.client.off(Events.GuildCreate, listener);\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase 'guildDelete': {\n\t\t\t\tconst listener = (guild: Guild) => {\n\t\t\t\t\thandler({\n\t\t\t\t\t\treceivedAt: Date.now(),\n\t\t\t\t\t\t...this.shardEnvelope(),\n\t\t\t\t\t\tguild: {\n\t\t\t\t\t\t\tid: guild.id,\n\t\t\t\t\t\t\tname: guild.name ?? 'Unknown',\n\t\t\t\t\t\t\ticon: guild.icon,\n\t\t\t\t\t\t\t...(guild.ownerId ? { ownerId: guild.ownerId } : {}),\n\t\t\t\t\t\t},\n\t\t\t\t\t} as BotEventPayloadMap[K]);\n\t\t\t\t};\n\t\t\t\tthis.client.on(Events.GuildDelete, listener);\n\t\t\t\treturn () => {\n\t\t\t\t\tthis.client.off(Events.GuildDelete, listener);\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase 'threadCreate': {\n\t\t\t\tconst listener = (thread: ThreadChannel) => {\n\t\t\t\t\thandler({\n\t\t\t\t\t\treceivedAt: Date.now(),\n\t\t\t\t\t\t...this.shardEnvelope(),\n\t\t\t\t\t\tthread: serializeThread(thread),\n\t\t\t\t\t} as BotEventPayloadMap[K]);\n\t\t\t\t};\n\t\t\t\tthis.client.on(Events.ThreadCreate, listener);\n\t\t\t\treturn () => {\n\t\t\t\t\tthis.client.off(Events.ThreadCreate, listener);\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase 'threadUpdate': {\n\t\t\t\tconst listener = (oldThread: ThreadChannel, newThread: ThreadChannel) => {\n\t\t\t\t\thandler({\n\t\t\t\t\t\treceivedAt: Date.now(),\n\t\t\t\t\t\t...this.shardEnvelope(),\n\t\t\t\t\t\toldThread: serializeThread(oldThread),\n\t\t\t\t\t\tthread: serializeThread(newThread),\n\t\t\t\t\t} as BotEventPayloadMap[K]);\n\t\t\t\t};\n\t\t\t\tthis.client.on(Events.ThreadUpdate, listener);\n\t\t\t\treturn () => {\n\t\t\t\t\tthis.client.off(Events.ThreadUpdate, listener);\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase 'threadDelete': {\n\t\t\t\tconst listener = (thread: ThreadChannel) => {\n\t\t\t\t\thandler({\n\t\t\t\t\t\treceivedAt: Date.now(),\n\t\t\t\t\t\t...this.shardEnvelope(),\n\t\t\t\t\t\tthread: serializeThread(thread),\n\t\t\t\t\t} as BotEventPayloadMap[K]);\n\t\t\t\t};\n\t\t\t\tthis.client.on(Events.ThreadDelete, listener);\n\t\t\t\treturn () => {\n\t\t\t\t\tthis.client.off(Events.ThreadDelete, listener);\n\t\t\t\t};\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn () => undefined;\n\t\t}\n\t}\n\n\tasync executeAction<K extends BotActionName>(\n\t\tname: K,\n\t\tpayload: BotActionPayloadMap[K],\n\t): Promise<BotActionResultDataMap[K]> {\n\t\tawait this.ready();\n\t\tconst handler = this.actionHandlers[name];\n\t\ttry {\n\t\t\treturn await handler(payload);\n\t\t} catch (error) {\n\t\t\tif (error instanceof ActionExecutionError) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tconst mappedError = mapDiscordErrorToActionExecutionError(error);\n\t\t\tif (mappedError) {\n\t\t\t\tthrow mappedError;\n\t\t\t}\n\t\t\tthis.logger.error('Discord action execution failed.', { action: name, error: String(error) });\n\t\t\tthrow new ActionExecutionError(\n\t\t\t\t'INTERNAL_ERROR',\n\t\t\t\terror instanceof Error ? error.message : 'Discord action failed.',\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate async fetchSendableChannel(channelId: Snowflake): Promise<SendCapableChannel> {\n\t\tconst channel = await this.client.channels.fetch(channelId);\n\t\tif (!isSendCapableChannel(channel)) {\n\t\t\tthrow new ActionExecutionError('NOT_FOUND', `Channel \"${channelId}\" cannot send messages.`);\n\t\t}\n\t\treturn channel;\n\t}\n\n\tprivate async fetchMessageChannel(channelId: Snowflake): Promise<MessageManageableChannel> {\n\t\tconst channel = await this.client.channels.fetch(channelId);\n\t\tif (!isMessageManageableChannel(channel)) {\n\t\t\tthrow new ActionExecutionError('NOT_FOUND', `Channel \"${channelId}\" does not support message operations.`);\n\t\t}\n\t\treturn channel;\n\t}\n\n\tprivate getInteraction(interactionId: Snowflake): Interaction {\n\t\tconst interaction = this.interactionCache.get(interactionId);\n\t\tif (!interaction) {\n\t\t\tthrow new ActionExecutionError('NOT_FOUND', `Interaction \"${interactionId}\" is no longer available.`);\n\t\t}\n\t\treturn interaction;\n\t}\n\n\tprivate getReplyCapableInteraction(interactionId: Snowflake): ReplyCapableInteraction {\n\t\tconst interaction = this.getInteraction(interactionId);\n\t\tif (!isReplyCapableInteraction(interaction)) {\n\t\t\tthrow new ActionExecutionError(\n\t\t\t\t'INVALID_REQUEST',\n\t\t\t\t`Interaction \"${interactionId}\" does not support reply-style acknowledgements.`,\n\t\t\t);\n\t\t}\n\t\treturn interaction;\n\t}\n\n\tprivate getMessageComponentInteraction(interactionId: Snowflake): MessageComponentInteraction {\n\t\tconst interaction = this.getInteraction(interactionId);\n\t\tif (!interaction.isMessageComponent()) {\n\t\t\tthrow new ActionExecutionError(\n\t\t\t\t'INVALID_REQUEST',\n\t\t\t\t`Interaction \"${interactionId}\" is not a message component interaction.`,\n\t\t\t);\n\t\t}\n\t\treturn interaction;\n\t}\n\n\tprivate async sendMessage(payload: BotActionPayloadMap['sendMessage']) {\n\t\tconst channel = await this.fetchSendableChannel(payload.channelId);\n\t\tconst message = await channel.send(toSendOptions(payload));\n\t\treturn serializeMessage(message);\n\t}\n\n\tprivate async editMessage(payload: BotActionPayloadMap['editMessage']) {\n\t\tconst channel = await this.fetchMessageChannel(payload.channelId);\n\t\tconst message = await channel.messages.fetch(payload.messageId);\n\t\tconst edited = await message.edit(toSendOptions(payload));\n\t\treturn serializeMessage(edited);\n\t}\n\n\tprivate async deleteMessage(payload: BotActionPayloadMap['deleteMessage']) {\n\t\tconst channel = await this.fetchMessageChannel(payload.channelId);\n\t\tconst message = await channel.messages.fetch(payload.messageId);\n\t\tawait message.delete();\n\t\treturn {\n\t\t\tdeleted: true,\n\t\t\tchannelId: payload.channelId,\n\t\t\tmessageId: payload.messageId,\n\t\t} as const;\n\t}\n\n\tprivate async replyToInteraction(payload: BotActionPayloadMap['replyToInteraction']) {\n\t\tconst interaction = this.getReplyCapableInteraction(payload.interactionId);\n\t\tif (interaction.replied || interaction.deferred) {\n\t\t\tthrow new ActionExecutionError(\n\t\t\t\t'INVALID_REQUEST',\n\t\t\t\t`Interaction \"${payload.interactionId}\" has already been acknowledged.`,\n\t\t\t);\n\t\t}\n\t\tconst reply = await interaction.reply({\n\t\t\t...toSendOptions(payload),\n\t\t\tfetchReply: true,\n\t\t\t...(payload.ephemeral ? { flags: MessageFlags.Ephemeral } : {}),\n\t\t});\n\t\treturn serializeMessage(reply as Message);\n\t}\n\n\tprivate async deferInteraction(payload: BotActionPayloadMap['deferInteraction']) {\n\t\tconst interaction = this.getReplyCapableInteraction(payload.interactionId);\n\t\tif (interaction.replied) {\n\t\t\tthrow new ActionExecutionError(\n\t\t\t\t'INVALID_REQUEST',\n\t\t\t\t`Interaction \"${payload.interactionId}\" has already been replied to.`,\n\t\t\t);\n\t\t}\n\t\tif (!interaction.deferred) {\n\t\t\tawait interaction.deferReply({\n\t\t\t\t...(payload.ephemeral ? { flags: MessageFlags.Ephemeral } : {}),\n\t\t\t});\n\t\t}\n\t\treturn {\n\t\t\tdeferred: true,\n\t\t\tinteractionId: payload.interactionId,\n\t\t} as const;\n\t}\n\n\tprivate async deferUpdateInteraction(payload: BotActionPayloadMap['deferUpdateInteraction']) {\n\t\tconst interaction = this.getMessageComponentInteraction(payload.interactionId);\n\t\tawait interaction.deferUpdate();\n\t\treturn {\n\t\t\tdeferred: true,\n\t\t\tinteractionId: payload.interactionId,\n\t\t} as const;\n\t}\n\n\tprivate async followUpInteraction(payload: BotActionPayloadMap['followUpInteraction']) {\n\t\tconst interaction = this.getReplyCapableInteraction(payload.interactionId);\n\t\tif (!interaction.replied && !interaction.deferred) {\n\t\t\tthrow new ActionExecutionError(\n\t\t\t\t'INVALID_REQUEST',\n\t\t\t\t`Interaction \"${payload.interactionId}\" has not been acknowledged yet.`,\n\t\t\t);\n\t\t}\n\t\tconst followUp = await interaction.followUp({\n\t\t\t...toSendOptions(payload),\n\t\t\t...(payload.ephemeral ? { flags: MessageFlags.Ephemeral } : {}),\n\t\t});\n\t\treturn serializeMessage(followUp as Message);\n\t}\n\n\tprivate async editInteractionReply(payload: BotActionPayloadMap['editInteractionReply']) {\n\t\tconst interaction = this.getReplyCapableInteraction(payload.interactionId);\n\t\tconst updated = await interaction.editReply({\n\t\t\t...toSendOptions(payload),\n\t\t\tfetchReply: true,\n\t\t});\n\t\treturn serializeMessage(updated as Message);\n\t}\n\n\tprivate async deleteInteractionReply(payload: BotActionPayloadMap['deleteInteractionReply']) {\n\t\tconst interaction = this.getReplyCapableInteraction(payload.interactionId);\n\t\tawait interaction.deleteReply();\n\t\treturn {\n\t\t\tdeleted: true,\n\t\t\tinteractionId: payload.interactionId,\n\t\t} as const;\n\t}\n\n\tprivate async updateInteraction(payload: BotActionPayloadMap['updateInteraction']) {\n\t\tconst interaction = this.getMessageComponentInteraction(payload.interactionId);\n\t\tconst updated = await interaction.update({\n\t\t\t...toSendOptions(payload),\n\t\t\tfetchReply: true,\n\t\t});\n\t\treturn serializeMessage(updated);\n\t}\n\n\tprivate async showModal(payload: BotActionPayloadMap['showModal']) {\n\t\tconst interaction = this.getMessageComponentInteraction(payload.interactionId);\n\t\tawait interaction.showModal({\n\t\t\ttitle: payload.title,\n\t\t\tcustomId: payload.customId,\n\t\t\tcomponents: payload.components,\n\t\t} as never);\n\t\treturn {\n\t\t\tshown: true,\n\t\t\tinteractionId: payload.interactionId,\n\t\t} as const;\n\t}\n\n\tprivate async fetchMessage(payload: BotActionPayloadMap['fetchMessage']) {\n\t\tconst channel = await this.fetchMessageChannel(payload.channelId);\n\t\tconst message = await channel.messages.fetch(payload.messageId);\n\t\treturn serializeMessage(message);\n\t}\n\n\tprivate async fetchMember(payload: BotActionPayloadMap['fetchMember']) {\n\t\tconst guild = await this.client.guilds.fetch(payload.guildId);\n\t\tconst member = await guild.members.fetch(payload.userId);\n\t\treturn serializeGuildMember(member);\n\t}\n\n\tprivate async banMember(payload: BotActionPayloadMap['banMember']) {\n\t\tconst guild = await this.client.guilds.fetch(payload.guildId);\n\t\tawait guild.members.ban(payload.userId, {\n\t\t\t...(payload.reason ? { reason: payload.reason } : {}),\n\t\t\t...(payload.deleteMessageSeconds !== undefined ? { deleteMessageSeconds: payload.deleteMessageSeconds } : {}),\n\t\t});\n\t\treturn {\n\t\t\tguildId: payload.guildId,\n\t\t\tuserId: payload.userId,\n\t\t};\n\t}\n\n\tprivate async kickMember(payload: BotActionPayloadMap['kickMember']) {\n\t\tconst guild = await this.client.guilds.fetch(payload.guildId);\n\t\tconst member = await guild.members.fetch(payload.userId);\n\t\tawait member.kick(payload.reason);\n\t\treturn {\n\t\t\tguildId: payload.guildId,\n\t\t\tuserId: payload.userId,\n\t\t};\n\t}\n\n\tprivate async addMemberRole(payload: BotActionPayloadMap['addMemberRole']) {\n\t\tconst guild = await this.client.guilds.fetch(payload.guildId);\n\t\tconst member = await guild.members.fetch(payload.userId);\n\t\tawait member.roles.add(payload.roleId, payload.reason);\n\t\tconst refreshed = await member.fetch();\n\t\treturn serializeGuildMember(refreshed);\n\t}\n\n\tprivate async removeMemberRole(payload: BotActionPayloadMap['removeMemberRole']) {\n\t\tconst guild = await this.client.guilds.fetch(payload.guildId);\n\t\tconst member = await guild.members.fetch(payload.userId);\n\t\tawait member.roles.remove(payload.roleId, payload.reason);\n\t\tconst refreshed = await member.fetch();\n\t\treturn serializeGuildMember(refreshed);\n\t}\n\n\tprivate async addMessageReaction(payload: BotActionPayloadMap['addMessageReaction']) {\n\t\tconst channel = await this.fetchMessageChannel(payload.channelId);\n\t\tconst message = await channel.messages.fetch(payload.messageId);\n\t\tawait message.react(payload.emoji);\n\t\treturn {\n\t\t\tmessageId: payload.messageId,\n\t\t\tchannelId: payload.channelId,\n\t\t\temoji: payload.emoji,\n\t\t} as const;\n\t}\n\n\tprivate async removeOwnMessageReaction(payload: BotActionPayloadMap['removeOwnMessageReaction']) {\n\t\tconst channel = await this.fetchMessageChannel(payload.channelId);\n\t\tconst message = await channel.messages.fetch(payload.messageId);\n\t\tconst ownUserId = this.client.user?.id;\n\t\tif (!ownUserId) {\n\t\t\tthrow new ActionExecutionError('INTERNAL_ERROR', 'Bot user is not available.');\n\t\t}\n\n\t\tconst reaction = [...message.reactions.cache.values()].find((candidate) => {\n\t\t\treturn (\n\t\t\t\tcandidate.emoji.identifier === payload.emoji ||\n\t\t\t\tcandidate.emoji.name === payload.emoji ||\n\t\t\t\tcandidate.emoji.toString() === payload.emoji\n\t\t\t);\n\t\t});\n\t\tif (!reaction) {\n\t\t\tthrow new ActionExecutionError(\n\t\t\t\t'NOT_FOUND',\n\t\t\t\t`Reaction \"${payload.emoji}\" was not found on message \"${payload.messageId}\".`,\n\t\t\t);\n\t\t}\n\n\t\tawait reaction.users.remove(ownUserId);\n\t\treturn {\n\t\t\tmessageId: payload.messageId,\n\t\t\tchannelId: payload.channelId,\n\t\t\temoji: payload.emoji,\n\t\t} as const;\n\t}\n}\n\nexport function createDiscordJsRuntimeAdapter(options: DiscordRuntimeOptions): DiscordRuntimeAdapter {\n\treturn new DiscordJsRuntimeAdapter(options);\n}\n\nfunction isReplyCapableInteraction(interaction: Interaction): interaction is ReplyCapableInteraction {\n\treturn (\n\t\tinteraction.isRepliable() &&\n\t\ttypeof (interaction as { reply?: unknown }).reply === 'function' &&\n\t\ttypeof (interaction as { deferReply?: unknown }).deferReply === 'function' &&\n\t\ttypeof (interaction as { followUp?: unknown }).followUp === 'function' &&\n\t\ttypeof (interaction as { editReply?: unknown }).editReply === 'function' &&\n\t\ttypeof (interaction as { deleteReply?: unknown }).deleteReply === 'function'\n\t);\n}\n","import type { ShardwireLogger } from '../discord/types';\n\nexport function withLogger(logger?: ShardwireLogger): Required<ShardwireLogger> {\n\treturn {\n\t\tdebug: logger?.debug ?? (() => undefined),\n\t\tinfo: logger?.info ?? (() => undefined),\n\t\twarn: logger?.warn ?? (() => undefined),\n\t\terror: logger?.error ?? (() => undefined),\n\t};\n}\n","export class DedupeCache<T> {\n\tprivate readonly cache = new Map<string, { value: T; expiresAt: number }>();\n\n\tconstructor(private readonly ttlMs: number) {}\n\n\tget(key: string): T | undefined {\n\t\tconst entry = this.cache.get(key);\n\t\tif (!entry) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (entry.expiresAt <= Date.now()) {\n\t\t\tthis.cache.delete(key);\n\t\t\treturn undefined;\n\t\t}\n\t\treturn entry.value;\n\t}\n\n\tset(key: string, value: T): void {\n\t\tthis.cache.set(key, { value, expiresAt: Date.now() + this.ttlMs });\n\t}\n}\n","import type { APIEmbed } from 'discord-api-types/v10';\nimport type {\n\tAnySelectMenuInteraction,\n\tChatInputCommandInteraction,\n\tGuild,\n\tGuildMember,\n\tInteraction,\n\tMessage,\n\tMessageReaction,\n\tModalSubmitInteraction,\n\tPartialGuildMember,\n\tPartialMessage,\n\tPartialMessageReaction,\n\tPartialUser,\n\tThreadChannel,\n\tUser,\n} from 'discord.js';\nimport type {\n\tBridgeDeletedMessage,\n\tBridgeGuild,\n\tBridgeGuildMember,\n\tBridgeInteraction,\n\tBridgeMessage,\n\tBridgeMessageReaction,\n\tBridgeReactionEmoji,\n\tBridgeThread,\n\tBridgeUser,\n} from '../types';\n\nfunction serializeEmbeds(message: Message | PartialMessage): APIEmbed[] {\n\treturn message.embeds.map((embed) => embed.toJSON());\n}\n\nexport function serializeUser(user: User | PartialUser): BridgeUser {\n\treturn {\n\t\tid: user.id,\n\t\tusername: user.username ?? 'unknown',\n\t\tdiscriminator: user.discriminator ?? '0',\n\t\t...(user.globalName !== undefined ? { globalName: user.globalName } : {}),\n\t\tavatarUrl: user.displayAvatarURL() || null,\n\t\tbot: user.bot ?? false,\n\t\tsystem: user.system ?? false,\n\t};\n}\n\nexport function serializeGuildMember(member: GuildMember | PartialGuildMember): BridgeGuildMember {\n\treturn {\n\t\tid: member.id,\n\t\tguildId: member.guild.id,\n\t\t...('user' in member && member.user ? { user: serializeUser(member.user) } : {}),\n\t\t...('displayName' in member && typeof member.displayName === 'string' ? { displayName: member.displayName } : {}),\n\t\t...('nickname' in member ? { nickname: member.nickname ?? null } : {}),\n\t\troles: 'roles' in member && 'cache' in member.roles ? [...member.roles.cache.keys()] : [],\n\t\t...('joinedAt' in member ? { joinedAt: member.joinedAt?.toISOString() ?? null } : {}),\n\t\t...('premiumSince' in member ? { premiumSince: member.premiumSince?.toISOString() ?? null } : {}),\n\t\t...('pending' in member && typeof member.pending === 'boolean' ? { pending: member.pending } : {}),\n\t\t...('communicationDisabledUntil' in member\n\t\t\t? { communicationDisabledUntil: member.communicationDisabledUntil?.toISOString() ?? null }\n\t\t\t: {}),\n\t};\n}\n\nexport function serializeMessage(message: Message | PartialMessage): BridgeMessage {\n\tconst reference = message.reference\n\t\t? {\n\t\t\t\t...(message.reference.messageId ? { messageId: message.reference.messageId } : {}),\n\t\t\t\t...(message.reference.channelId ? { channelId: message.reference.channelId } : {}),\n\t\t\t\t...(message.reference.guildId ? { guildId: message.reference.guildId } : {}),\n\t\t\t}\n\t\t: undefined;\n\n\tconst components =\n\t\t'components' in message && message.components && message.components.length > 0\n\t\t\t? message.components.map((row) => row.toJSON())\n\t\t\t: undefined;\n\n\treturn {\n\t\tid: message.id,\n\t\tchannelId: message.channelId,\n\t\t...(message.guildId ? { guildId: message.guildId } : {}),\n\t\t...('author' in message && message.author ? { author: serializeUser(message.author) } : {}),\n\t\t...('member' in message && message.member ? { member: serializeGuildMember(message.member) } : {}),\n\t\t...('content' in message && typeof message.content === 'string' ? { content: message.content } : {}),\n\t\t...('createdAt' in message ? { createdAt: message.createdAt.toISOString() } : {}),\n\t\t...('editedAt' in message ? { editedAt: message.editedAt ? message.editedAt.toISOString() : null } : {}),\n\t\tattachments:\n\t\t\t'attachments' in message\n\t\t\t\t? [...message.attachments.values()].map((attachment) => ({\n\t\t\t\t\t\tid: attachment.id,\n\t\t\t\t\t\tname: attachment.name,\n\t\t\t\t\t\turl: attachment.url,\n\t\t\t\t\t\t...(attachment.contentType !== undefined ? { contentType: attachment.contentType } : {}),\n\t\t\t\t\t\tsize: attachment.size,\n\t\t\t\t\t}))\n\t\t\t\t: [],\n\t\tembeds: serializeEmbeds(message),\n\t\t...(components ? { components } : {}),\n\t\t...(reference ? { reference } : {}),\n\t} as BridgeMessage;\n}\n\nexport function serializeGuild(guild: Guild): BridgeGuild {\n\treturn {\n\t\tid: guild.id,\n\t\tname: guild.name,\n\t\t...(guild.icon !== null && guild.icon !== undefined ? { icon: guild.icon } : { icon: null }),\n\t\townerId: guild.ownerId,\n\t};\n}\n\nexport function serializeThread(thread: ThreadChannel): BridgeThread {\n\treturn {\n\t\tid: thread.id,\n\t\tguildId: thread.guildId,\n\t\tparentId: thread.parentId,\n\t\tname: thread.name,\n\t\ttype: thread.type,\n\t\t...(typeof thread.archived === 'boolean' ? { archived: thread.archived } : {}),\n\t\t...(typeof thread.locked === 'boolean' ? { locked: thread.locked } : {}),\n\t};\n}\n\nexport function serializeDeletedMessage(message: Message | PartialMessage): BridgeDeletedMessage {\n\treturn {\n\t\tid: message.id,\n\t\tchannelId: message.channelId,\n\t\t...(message.guildId ? { guildId: message.guildId } : {}),\n\t\tdeletedAt: new Date().toISOString(),\n\t};\n}\n\nfunction serializeReactionEmoji(reaction: MessageReaction | PartialMessageReaction): BridgeReactionEmoji {\n\treturn {\n\t\t...(reaction.emoji.id ? { id: reaction.emoji.id } : {}),\n\t\t...(reaction.emoji.name !== undefined ? { name: reaction.emoji.name } : {}),\n\t\t...(typeof reaction.emoji.animated === 'boolean' ? { animated: reaction.emoji.animated } : {}),\n\t};\n}\n\nexport function serializeMessageReaction(\n\treaction: MessageReaction | PartialMessageReaction,\n\tuser?: User | PartialUser,\n): BridgeMessageReaction {\n\treturn {\n\t\tmessageId: reaction.message.id,\n\t\tchannelId: reaction.message.channelId,\n\t\t...(reaction.message.guildId ? { guildId: reaction.message.guildId } : {}),\n\t\t...(user ? { user: serializeUser(user) } : {}),\n\t\temoji: serializeReactionEmoji(reaction),\n\t};\n}\n\nfunction serializeChatInputOptions(interaction: ChatInputCommandInteraction): Record<string, unknown> {\n\tconst options: Record<string, unknown> = {};\n\tfor (const option of interaction.options.data) {\n\t\tif (option.options && option.options.length > 0) {\n\t\t\toptions[option.name] = option.options.map((child) => child.value);\n\t\t\tcontinue;\n\t\t}\n\t\toptions[option.name] = option.value ?? null;\n\t}\n\treturn options;\n}\n\nfunction serializeSelectMenu(interaction: AnySelectMenuInteraction): Pick<BridgeInteraction, 'customId' | 'values'> {\n\treturn {\n\t\tcustomId: interaction.customId,\n\t\tvalues: [...interaction.values],\n\t};\n}\n\nfunction serializeModalFields(interaction: ModalSubmitInteraction): Record<string, string> {\n\tconst fields: Record<string, string> = {};\n\tfor (const field of interaction.fields.fields.values()) {\n\t\tif ('value' in field && typeof field.value === 'string') {\n\t\t\tfields[field.customId] = field.value;\n\t\t\tcontinue;\n\t\t}\n\t\tif ('values' in field && Array.isArray(field.values)) {\n\t\t\tfields[field.customId] = field.values.join(',');\n\t\t}\n\t}\n\treturn fields;\n}\n\nfunction serializeInteractionMessage(interaction: Interaction): BridgeMessage | undefined {\n\tif ('message' in interaction && interaction.message) {\n\t\treturn serializeMessage(interaction.message);\n\t}\n\treturn undefined;\n}\n\nexport function serializeInteraction(interaction: Interaction): BridgeInteraction {\n\tconst base: BridgeInteraction = {\n\t\tid: interaction.id,\n\t\tapplicationId: interaction.applicationId,\n\t\tkind: 'unknown',\n\t\t...(interaction.guildId ? { guildId: interaction.guildId } : {}),\n\t\t...(interaction.channelId ? { channelId: interaction.channelId } : {}),\n\t\tuser: serializeUser(interaction.user),\n\t\t...(interaction.member && 'guild' in interaction.member\n\t\t\t? { member: serializeGuildMember(interaction.member) }\n\t\t\t: {}),\n\t};\n\n\tif (interaction.isChatInputCommand()) {\n\t\treturn {\n\t\t\t...base,\n\t\t\tkind: 'chatInput',\n\t\t\tcommandName: interaction.commandName,\n\t\t\toptions: serializeChatInputOptions(interaction),\n\t\t};\n\t}\n\tif (interaction.isContextMenuCommand()) {\n\t\treturn {\n\t\t\t...base,\n\t\t\tkind: 'contextMenu',\n\t\t\tcommandName: interaction.commandName,\n\t\t};\n\t}\n\tif (interaction.isButton()) {\n\t\tconst message = serializeInteractionMessage(interaction);\n\t\treturn {\n\t\t\t...base,\n\t\t\tkind: 'button',\n\t\t\tcustomId: interaction.customId,\n\t\t\t...(message ? { message } : {}),\n\t\t};\n\t}\n\tif (interaction.isStringSelectMenu()) {\n\t\tconst message = serializeInteractionMessage(interaction);\n\t\treturn {\n\t\t\t...base,\n\t\t\tkind: 'stringSelect',\n\t\t\t...serializeSelectMenu(interaction),\n\t\t\t...(message ? { message } : {}),\n\t\t};\n\t}\n\tif (interaction.isUserSelectMenu()) {\n\t\tconst message = serializeInteractionMessage(interaction);\n\t\treturn {\n\t\t\t...base,\n\t\t\tkind: 'userSelect',\n\t\t\t...serializeSelectMenu(interaction),\n\t\t\t...(message ? { message } : {}),\n\t\t};\n\t}\n\tif (interaction.isRoleSelectMenu()) {\n\t\tconst message = serializeInteractionMessage(interaction);\n\t\treturn {\n\t\t\t...base,\n\t\t\tkind: 'roleSelect',\n\t\t\t...serializeSelectMenu(interaction),\n\t\t\t...(message ? { message } : {}),\n\t\t};\n\t}\n\tif (interaction.isMentionableSelectMenu()) {\n\t\tconst message = serializeInteractionMessage(interaction);\n\t\treturn {\n\t\t\t...base,\n\t\t\tkind: 'mentionableSelect',\n\t\t\t...serializeSelectMenu(interaction),\n\t\t\t...(message ? { message } : {}),\n\t\t};\n\t}\n\tif (interaction.isChannelSelectMenu()) {\n\t\tconst message = serializeInteractionMessage(interaction);\n\t\treturn {\n\t\t\t...base,\n\t\t\tkind: 'channelSelect',\n\t\t\t...serializeSelectMenu(interaction),\n\t\t\t...(message ? { message } : {}),\n\t\t};\n\t}\n\tif (interaction.isModalSubmit()) {\n\t\treturn {\n\t\t\t...base,\n\t\t\tkind: 'modalSubmit',\n\t\t\tcustomId: interaction.customId,\n\t\t\tfields: serializeModalFields(interaction),\n\t\t};\n\t}\n\treturn base;\n}\n","import type { IncomingMessage } from 'node:http';\nimport { WebSocketServer, type WebSocket } from 'ws';\nimport type {\n\tActionResult,\n\tBotActionName,\n\tBotBridgeOptions,\n\tBotEventName,\n\tBotEventPayloadMap,\n\tBridgeCapabilities,\n\tEventSubscription,\n\tShardwireLogger,\n} from '../../discord/types';\nimport { withLogger } from '../../utils/logger';\nimport { createConnectionId } from '../../utils/id';\nimport { matchesEventSubscription, serializeEventSubscription } from '../subscriptions';\nimport { isSecretValid } from './security';\nimport type { NormalizedSecretConfig } from '../validation';\nimport {\n\tmakeEnvelope,\n\tparseEnvelope,\n\tstringifyEnvelope,\n\ttype ActionRequestPayload,\n\ttype AuthHelloPayload,\n\ttype WireEnvelope,\n} from './protocol';\nimport { AsyncSemaphore } from '../../utils/semaphore';\n\nconst CLOSE_AUTH_REQUIRED = 4001;\nconst CLOSE_AUTH_FAILED = 4003;\nconst CLOSE_INVALID_PAYLOAD = 4004;\nconst CLOSE_SERVER_FULL = 4029;\nconst CLOSE_AUTH_RATE_LIMITED = 4031;\n\ninterface AuthSuccess {\n\tok: true;\n\tsecret: NormalizedSecretConfig;\n\tcapabilities: BridgeCapabilities;\n}\n\ninterface AuthFailure {\n\tok: false;\n\treason: 'unknown_secret_id' | 'invalid_secret' | 'ambiguous_secret';\n}\n\ninterface BridgeConnectionState {\n\tid: string;\n\tsocket: WebSocket;\n\tauthenticated: boolean;\n\tlastHeartbeatAt: number;\n\tremoteAddress?: string;\n\tappName?: string;\n\tsecret?: NormalizedSecretConfig;\n\tcapabilities?: BridgeCapabilities;\n\tsubscriptions: Map<string, EventSubscription>;\n}\n\ninterface BridgeTransportServerConfig {\n\toptions: BotBridgeOptions;\n\tlogger?: ShardwireLogger;\n\tauthenticate: (payload: AuthHelloPayload) => AuthSuccess | AuthFailure;\n\tonActionRequest: (\n\t\tconnection: { id: string; appName?: string; secret: NormalizedSecretConfig; capabilities: BridgeCapabilities },\n\t\tactionName: BotActionName,\n\t\tpayload: unknown,\n\t\trequestId: string,\n\t) => Promise<ActionResult<unknown>>;\n}\n\nexport class BridgeTransportServer {\n\tprivate readonly wss: WebSocketServer;\n\tprivate readonly logger: Required<ShardwireLogger>;\n\tprivate readonly heartbeatMs: number;\n\tprivate readonly authTimeoutMs = 5000;\n\tprivate readonly interval: NodeJS.Timeout;\n\tprivate readonly connections = new Map<WebSocket, BridgeConnectionState>();\n\tprivate readonly stickyEvents = new Map<BotEventName, BotEventPayloadMap[BotEventName]>();\n\tprivate readonly actionSemaphore: AsyncSemaphore;\n\tprivate readonly idempotencyCache = new Map<string, { result: ActionResult<unknown>; expires: number }>();\n\tprivate readonly idempotencyTtlMs: number;\n\tprivate readonly idempotencyScope: 'connection' | 'secret';\n\tprivate readonly authBuckets = new Map<string, { count: number; resetAt: number }>();\n\n\tconstructor(private readonly config: BridgeTransportServerConfig) {\n\t\tthis.logger = withLogger(config.logger);\n\t\tthis.heartbeatMs = config.options.server.heartbeatMs ?? 30000;\n\t\tconst maxConcurrent = config.options.server.maxConcurrentActions ?? 32;\n\t\tconst queueTimeout = config.options.server.actionQueueTimeoutMs ?? 5000;\n\t\tthis.actionSemaphore = new AsyncSemaphore(maxConcurrent, queueTimeout);\n\t\tthis.idempotencyTtlMs = config.options.server.idempotencyTtlMs ?? 120_000;\n\t\tthis.idempotencyScope = config.options.server.idempotencyScope ?? 'connection';\n\n\t\tthis.wss = new WebSocketServer({\n\t\t\thost: config.options.server.host,\n\t\t\tport: config.options.server.port,\n\t\t\tpath: config.options.server.path ?? '/shardwire',\n\t\t\tmaxPayload: config.options.server.maxPayloadBytes ?? 65536,\n\t\t});\n\n\t\tthis.wss.on('connection', (socket, request) => this.handleConnection(socket, request));\n\t\tthis.wss.on('error', (error) => this.logger.error('Bridge transport server error.', { error: String(error) }));\n\t\tthis.interval = setInterval(() => {\n\t\t\tthis.checkHeartbeats();\n\t\t}, this.heartbeatMs);\n\t}\n\n\tconnectionCount(): number {\n\t\tlet count = 0;\n\t\tfor (const state of this.connections.values()) {\n\t\t\tif (state.authenticated) {\n\t\t\t\tcount += 1;\n\t\t\t}\n\t\t}\n\t\treturn count;\n\t}\n\n\tsetStickyEvent<K extends BotEventName>(name: K, payload: BotEventPayloadMap[K]): void {\n\t\tthis.stickyEvents.set(name, payload);\n\t}\n\n\tpublishEvent<K extends BotEventName>(name: K, payload: BotEventPayloadMap[K]): void {\n\t\tconst envelope = stringifyEnvelope(makeEnvelope('discord.event', { name, data: payload }));\n\t\tfor (const state of this.connections.values()) {\n\t\t\tif (!state.authenticated) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst shouldReceive = [...state.subscriptions.values()].some((subscription) => {\n\t\t\t\treturn subscription.name === name && matchesEventSubscription(subscription, payload);\n\t\t\t});\n\t\t\tif (!shouldReceive) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.safeSend(state.socket, envelope);\n\t\t}\n\t}\n\n\tasync close(): Promise<void> {\n\t\tclearInterval(this.interval);\n\t\tfor (const state of this.connections.values()) {\n\t\t\tstate.socket.close();\n\t\t}\n\t\tthis.connections.clear();\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tthis.wss.close((error) => {\n\t\t\t\tif (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate handleConnection(socket: WebSocket, request?: IncomingMessage): void {\n\t\tconst remoteAddress = request?.socket?.remoteAddress ?? 'unknown';\n\t\tconst state: BridgeConnectionState = {\n\t\t\tid: createConnectionId(),\n\t\t\tsocket,\n\t\t\tauthenticated: false,\n\t\t\tlastHeartbeatAt: Date.now(),\n\t\t\tremoteAddress,\n\t\t\tsubscriptions: new Map(),\n\t\t};\n\t\tthis.connections.set(socket, state);\n\n\t\tconst authTimer = setTimeout(() => {\n\t\t\tif (!state.authenticated) {\n\t\t\t\tsocket.close(CLOSE_AUTH_REQUIRED, 'Authentication required.');\n\t\t\t}\n\t\t}, this.authTimeoutMs);\n\n\t\tsocket.on('message', (raw) => {\n\t\t\tconst serialized = typeof raw === 'string' ? raw : Buffer.isBuffer(raw) ? raw.toString('utf8') : undefined;\n\t\t\tif (!serialized) {\n\t\t\t\tsocket.close(CLOSE_INVALID_PAYLOAD, 'Invalid payload.');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet envelope: WireEnvelope;\n\t\t\ttry {\n\t\t\t\tenvelope = parseEnvelope(serialized);\n\t\t\t} catch (error) {\n\t\t\t\tthis.logger.warn('Invalid transport envelope from app.', { error: String(error) });\n\t\t\t\tsocket.close(CLOSE_INVALID_PAYLOAD, 'Invalid payload.');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvoid this.handleMessage(state, envelope).catch((error: unknown) => {\n\t\t\t\tthis.logger.warn('Failed to handle transport message.', { error: String(error) });\n\t\t\t\tsocket.close(CLOSE_INVALID_PAYLOAD, 'Invalid payload.');\n\t\t\t});\n\t\t});\n\n\t\tsocket.on('close', () => {\n\t\t\tclearTimeout(authTimer);\n\t\t\tthis.connections.delete(socket);\n\t\t});\n\n\t\tsocket.on('error', (error) => {\n\t\t\tthis.logger.warn('Transport socket error.', { connectionId: state.id, error: String(error) });\n\t\t});\n\t}\n\n\tprivate async handleMessage(state: BridgeConnectionState, envelope: WireEnvelope): Promise<void> {\n\t\tif (envelope.type === 'ping') {\n\t\t\tstate.lastHeartbeatAt = Date.now();\n\t\t\tthis.safeSend(state.socket, stringifyEnvelope(makeEnvelope('pong', {})));\n\t\t\treturn;\n\t\t}\n\t\tif (envelope.type === 'pong') {\n\t\t\tstate.lastHeartbeatAt = Date.now();\n\t\t\treturn;\n\t\t}\n\n\t\tif (!state.authenticated) {\n\t\t\tif (envelope.type !== 'auth.hello') {\n\t\t\t\tstate.socket.close(CLOSE_AUTH_REQUIRED, 'Authentication required.');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.isAuthRateLimited(state.remoteAddress ?? 'unknown')) {\n\t\t\t\tthis.logger.warn('Bridge auth rate limited.', { connectionId: state.id, remoteAddress: state.remoteAddress });\n\t\t\t\tthis.safeSend(\n\t\t\t\t\tstate.socket,\n\t\t\t\t\tstringifyEnvelope(\n\t\t\t\t\t\tmakeEnvelope('auth.error', {\n\t\t\t\t\t\t\tcode: 'UNAUTHORIZED',\n\t\t\t\t\t\t\treason: 'invalid_secret',\n\t\t\t\t\t\t\tmessage: 'Too many authentication attempts. Try again later.',\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tstate.socket.close(CLOSE_AUTH_RATE_LIMITED, 'Rate limited.');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst authResult = this.config.authenticate(envelope.payload as AuthHelloPayload);\n\t\t\tif (!authResult.ok) {\n\t\t\t\tconst message =\n\t\t\t\t\tauthResult.reason === 'ambiguous_secret'\n\t\t\t\t\t\t? 'Authentication failed: secret matches multiple configured scopes. Supply secretId or use unique secret values.'\n\t\t\t\t\t\t: 'Authentication failed.';\n\t\t\t\tthis.safeSend(\n\t\t\t\t\tstate.socket,\n\t\t\t\t\tstringifyEnvelope(\n\t\t\t\t\t\tmakeEnvelope('auth.error', {\n\t\t\t\t\t\t\tcode: 'UNAUTHORIZED',\n\t\t\t\t\t\t\treason: authResult.reason,\n\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tstate.socket.close(CLOSE_AUTH_FAILED, 'Invalid secret.');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst maxConnections = this.config.options.server.maxConnections;\n\t\t\tif (maxConnections !== undefined && this.connectionCount() >= maxConnections) {\n\t\t\t\tthis.logger.warn('Bridge connection rejected: server full.', {\n\t\t\t\t\tconnectionId: state.id,\n\t\t\t\t\tmaxConnections,\n\t\t\t\t});\n\t\t\t\tthis.safeSend(\n\t\t\t\t\tstate.socket,\n\t\t\t\t\tstringifyEnvelope(\n\t\t\t\t\t\tmakeEnvelope('auth.error', {\n\t\t\t\t\t\t\tcode: 'UNAUTHORIZED',\n\t\t\t\t\t\t\treason: 'invalid_secret',\n\t\t\t\t\t\t\tmessage: 'Server is at maximum connection capacity.',\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tstate.socket.close(CLOSE_SERVER_FULL, 'Server full.');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tstate.authenticated = true;\n\t\t\tstate.lastHeartbeatAt = Date.now();\n\t\t\tstate.secret = authResult.secret;\n\t\t\tstate.capabilities = authResult.capabilities;\n\t\t\tconst payload = envelope.payload as AuthHelloPayload;\n\t\t\tif (payload.appName) {\n\t\t\t\tstate.appName = payload.appName;\n\t\t\t}\n\t\t\tthis.safeSend(\n\t\t\t\tstate.socket,\n\t\t\t\tstringifyEnvelope(\n\t\t\t\t\tmakeEnvelope('auth.ok', {\n\t\t\t\t\t\tconnectionId: state.id,\n\t\t\t\t\t\tcapabilities: authResult.capabilities,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!state.secret || !state.capabilities) {\n\t\t\tstate.socket.close(CLOSE_AUTH_FAILED, 'Invalid state.');\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (envelope.type) {\n\t\t\tcase 'subscribe': {\n\t\t\t\tconst rawSubscriptions = (envelope.payload as { subscriptions?: unknown }).subscriptions;\n\t\t\t\tif (!Array.isArray(rawSubscriptions)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst allowedEvents = new Set(state.capabilities.events);\n\t\t\t\tfor (const rawSubscription of rawSubscriptions as EventSubscription[]) {\n\t\t\t\t\tif (!rawSubscription || typeof rawSubscription !== 'object' || typeof rawSubscription.name !== 'string') {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst typedEvent = rawSubscription.name;\n\t\t\t\t\tif (!allowedEvents.has(typedEvent)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst signature = serializeEventSubscription(rawSubscription);\n\t\t\t\t\tstate.subscriptions.set(signature, rawSubscription);\n\t\t\t\t\tconst stickyPayload = this.stickyEvents.get(typedEvent);\n\t\t\t\t\tif (stickyPayload && matchesEventSubscription(rawSubscription, stickyPayload)) {\n\t\t\t\t\t\tthis.safeSend(\n\t\t\t\t\t\t\tstate.socket,\n\t\t\t\t\t\t\tstringifyEnvelope(makeEnvelope('discord.event', { name: typedEvent, data: stickyPayload })),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'unsubscribe': {\n\t\t\t\tconst rawSubscriptions = (envelope.payload as { subscriptions?: unknown }).subscriptions;\n\t\t\t\tif (!Array.isArray(rawSubscriptions)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tfor (const rawSubscription of rawSubscriptions as EventSubscription[]) {\n\t\t\t\t\tif (!rawSubscription || typeof rawSubscription !== 'object' || typeof rawSubscription.name !== 'string') {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tstate.subscriptions.delete(serializeEventSubscription(rawSubscription));\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase 'action.request': {\n\t\t\t\tconst requestId = envelope.requestId;\n\t\t\t\tconst payload = envelope.payload as ActionRequestPayload;\n\t\t\t\tif (!requestId || !payload || typeof payload.name !== 'string') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst activeSecret = state.secret;\n\t\t\t\tconst activeCapabilities = state.capabilities;\n\t\t\t\tif (!activeSecret || !activeCapabilities) {\n\t\t\t\t\tstate.socket.close(CLOSE_AUTH_FAILED, 'Invalid state.');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst idempotencyRaw = payload.idempotencyKey;\n\t\t\t\tconst idempotencyKey =\n\t\t\t\t\ttypeof idempotencyRaw === 'string' && idempotencyRaw.length > 0 && idempotencyRaw.length <= 256\n\t\t\t\t\t\t? idempotencyRaw\n\t\t\t\t\t\t: undefined;\n\t\t\t\tconst idempotencyCacheKey = idempotencyKey\n\t\t\t\t\t? this.idempotencyScope === 'secret' && activeSecret\n\t\t\t\t\t\t? `secret:${activeSecret.id}:${idempotencyKey}`\n\t\t\t\t\t\t: `conn:${state.id}:${idempotencyKey}`\n\t\t\t\t\t: undefined;\n\t\t\t\tif (idempotencyCacheKey) {\n\t\t\t\t\tthis.pruneIdempotencyCache(Date.now());\n\t\t\t\t\tconst cached = this.idempotencyCache.get(idempotencyCacheKey);\n\t\t\t\t\tif (cached && cached.expires > Date.now()) {\n\t\t\t\t\t\tconst replay: ActionResult<unknown> = cached.result.ok\n\t\t\t\t\t\t\t? { ok: true, requestId, ts: Date.now(), data: cached.result.data }\n\t\t\t\t\t\t\t: { ok: false, requestId, ts: Date.now(), error: cached.result.error };\n\t\t\t\t\t\tthis.logger.info('Bridge action idempotent replay.', {\n\t\t\t\t\t\t\tconnectionId: state.id,\n\t\t\t\t\t\t\trequestId,\n\t\t\t\t\t\t\taction: payload.name,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis.safeSend(\n\t\t\t\t\t\t\tstate.socket,\n\t\t\t\t\t\t\tstringifyEnvelope(makeEnvelope(replay.ok ? 'action.result' : 'action.error', replay, { requestId })),\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst started = Date.now();\n\t\t\t\tlet result: ActionResult<unknown>;\n\t\t\t\ttry {\n\t\t\t\t\tresult = await this.actionSemaphore.run(() =>\n\t\t\t\t\t\tthis.config.onActionRequest(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: state.id,\n\t\t\t\t\t\t\t\t...(state.appName ? { appName: state.appName } : {}),\n\t\t\t\t\t\t\t\tsecret: activeSecret,\n\t\t\t\t\t\t\t\tcapabilities: activeCapabilities,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tpayload.name,\n\t\t\t\t\t\t\tpayload.data,\n\t\t\t\t\t\t\trequestId,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst message = error instanceof Error ? error.message : 'Action queue saturated.';\n\t\t\t\t\tresult = {\n\t\t\t\t\t\tok: false,\n\t\t\t\t\t\trequestId,\n\t\t\t\t\t\tts: Date.now(),\n\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\tcode: 'SERVICE_UNAVAILABLE',\n\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\tdetails: { retryable: true, reason: 'action_queue' },\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (idempotencyCacheKey) {\n\t\t\t\t\tthis.idempotencyCache.set(idempotencyCacheKey, {\n\t\t\t\t\t\tresult,\n\t\t\t\t\t\texpires: Date.now() + this.idempotencyTtlMs,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis.logger.info('Bridge action completed.', {\n\t\t\t\t\tconnectionId: state.id,\n\t\t\t\t\trequestId,\n\t\t\t\t\taction: payload.name,\n\t\t\t\t\tdurationMs: Date.now() - started,\n\t\t\t\t\tok: result.ok,\n\t\t\t\t\tappName: state.appName,\n\t\t\t\t});\n\n\t\t\t\tthis.safeSend(\n\t\t\t\t\tstate.socket,\n\t\t\t\t\tstringifyEnvelope(makeEnvelope(result.ok ? 'action.result' : 'action.error', result, { requestId })),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\tprivate checkHeartbeats(): void {\n\t\tconst now = Date.now();\n\t\tconst threshold = this.heartbeatMs * 2;\n\n\t\tfor (const state of this.connections.values()) {\n\t\t\tif (!state.authenticated) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (now - state.lastHeartbeatAt > threshold) {\n\t\t\t\tstate.socket.terminate();\n\t\t\t\tthis.connections.delete(state.socket);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.safeSend(state.socket, stringifyEnvelope(makeEnvelope('ping', {})));\n\t\t}\n\t}\n\n\tprivate safeSend(socket: WebSocket, payload: string): void {\n\t\tif (socket.readyState === 1) {\n\t\t\tsocket.send(payload);\n\t\t}\n\t}\n\n\tprivate isAuthRateLimited(remoteAddress: string): boolean {\n\t\tconst windowMs = 60_000;\n\t\tconst limit = 40;\n\t\tconst now = Date.now();\n\t\tlet bucket = this.authBuckets.get(remoteAddress);\n\t\tif (!bucket || now > bucket.resetAt) {\n\t\t\tbucket = { count: 0, resetAt: now + windowMs };\n\t\t\tthis.authBuckets.set(remoteAddress, bucket);\n\t\t}\n\t\tbucket.count += 1;\n\t\treturn bucket.count > limit;\n\t}\n\n\tprivate pruneIdempotencyCache(now: number): void {\n\t\tif (this.idempotencyCache.size < 200) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const [key, entry] of this.idempotencyCache.entries()) {\n\t\t\tif (entry.expires <= now) {\n\t\t\t\tthis.idempotencyCache.delete(key);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function authenticateSecret(\n\tpayload: AuthHelloPayload,\n\tsecrets: readonly NormalizedSecretConfig[],\n\tresolver: (secret: NormalizedSecretConfig) => BridgeCapabilities,\n): AuthSuccess | AuthFailure {\n\tif (!payload.secret) {\n\t\treturn { ok: false, reason: 'invalid_secret' };\n\t}\n\n\tlet matchedSecret: NormalizedSecretConfig | undefined;\n\tif (payload.secretId) {\n\t\tmatchedSecret = secrets.find((secret) => secret.id === payload.secretId);\n\t\tif (!matchedSecret) {\n\t\t\treturn { ok: false, reason: 'unknown_secret_id' };\n\t\t}\n\t\tif (!isSecretValid(payload.secret, matchedSecret.value)) {\n\t\t\treturn { ok: false, reason: 'invalid_secret' };\n\t\t}\n\t} else {\n\t\tconst matches = secrets.filter((secret) => isSecretValid(payload.secret, secret.value));\n\t\tif (matches.length === 0) {\n\t\t\treturn { ok: false, reason: 'invalid_secret' };\n\t\t}\n\t\tif (matches.length > 1) {\n\t\t\treturn { ok: false, reason: 'ambiguous_secret' };\n\t\t}\n\t\tmatchedSecret = matches[0];\n\t}\n\tif (!matchedSecret) {\n\t\treturn { ok: false, reason: 'invalid_secret' };\n\t}\n\n\treturn {\n\t\tok: true,\n\t\tsecret: matchedSecret,\n\t\tcapabilities: resolver(matchedSecret),\n\t};\n}\n","import { randomUUID } from 'node:crypto';\n\nexport function createRequestId(): string {\n\treturn randomUUID();\n}\n\nexport function createConnectionId(): string {\n\treturn randomUUID();\n}\n","import type {\n\tBotEventName,\n\tBotEventPayloadMap,\n\tBridgeInteractionKind,\n\tEventSubscription,\n\tEventSubscriptionFilter,\n} from '../discord/types';\n\ninterface NormalizedEventSubscriptionFilter {\n\tguildId?: string[];\n\tchannelId?: string[];\n\tuserId?: string[];\n\tcommandName?: string[];\n\tcustomId?: string[];\n\tinteractionKind?: BridgeInteractionKind[];\n}\n\nexport interface NormalizedEventSubscription<K extends BotEventName = BotEventName> {\n\tname: K;\n\tfilter?: NormalizedEventSubscriptionFilter;\n}\n\nfunction normalizeStringList(value: string | readonly string[] | undefined): string[] | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\tconst rawValues = Array.isArray(value) ? value : [value];\n\tconst normalized = [...new Set(rawValues.filter((entry) => typeof entry === 'string' && entry.length > 0))].sort();\n\treturn normalized.length > 0 ? normalized : undefined;\n}\n\nfunction normalizeKindList(\n\tvalue: BridgeInteractionKind | readonly BridgeInteractionKind[] | undefined,\n): BridgeInteractionKind[] | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\tconst rawValues = Array.isArray(value) ? value : [value];\n\tconst normalized = [\n\t\t...new Set(rawValues.filter((entry): entry is BridgeInteractionKind => typeof entry === 'string')),\n\t].sort();\n\treturn normalized.length > 0 ? normalized : undefined;\n}\n\nexport function normalizeEventSubscriptionFilter(\n\tfilter?: EventSubscriptionFilter,\n): NormalizedEventSubscriptionFilter | undefined {\n\tif (!filter) {\n\t\treturn undefined;\n\t}\n\tconst normalized: NormalizedEventSubscriptionFilter = {};\n\tconst guildIds = normalizeStringList(filter.guildId);\n\tconst channelIds = normalizeStringList(filter.channelId);\n\tconst userIds = normalizeStringList(filter.userId);\n\tconst commandNames = normalizeStringList(filter.commandName);\n\tconst customIds = normalizeStringList(filter.customId);\n\tconst interactionKinds = normalizeKindList(filter.interactionKind);\n\n\tif (guildIds) {\n\t\tnormalized.guildId = guildIds;\n\t}\n\tif (channelIds) {\n\t\tnormalized.channelId = channelIds;\n\t}\n\tif (userIds) {\n\t\tnormalized.userId = userIds;\n\t}\n\tif (commandNames) {\n\t\tnormalized.commandName = commandNames;\n\t}\n\tif (customIds) {\n\t\tnormalized.customId = customIds;\n\t}\n\tif (interactionKinds) {\n\t\tnormalized.interactionKind = interactionKinds;\n\t}\n\n\treturn Object.keys(normalized).length > 0 ? normalized : undefined;\n}\n\nexport function normalizeEventSubscription<K extends BotEventName>(\n\tsubscription: EventSubscription<K>,\n): NormalizedEventSubscription<K> {\n\tconst normalizedFilter = normalizeEventSubscriptionFilter(subscription.filter);\n\treturn {\n\t\tname: subscription.name,\n\t\t...(normalizedFilter ? { filter: normalizedFilter } : {}),\n\t};\n}\n\nexport function serializeEventSubscription(subscription: EventSubscription): string {\n\treturn JSON.stringify(normalizeEventSubscription(subscription));\n}\n\nfunction matchesField(value: string | undefined, allowed: string[] | undefined): boolean {\n\tif (!allowed) {\n\t\treturn true;\n\t}\n\tif (!value) {\n\t\treturn false;\n\t}\n\treturn allowed.includes(value);\n}\n\nfunction matchesKind(value: BridgeInteractionKind | undefined, allowed: BridgeInteractionKind[] | undefined): boolean {\n\tif (!allowed) {\n\t\treturn true;\n\t}\n\tif (!value) {\n\t\treturn false;\n\t}\n\treturn allowed.includes(value);\n}\n\nfunction eventMetadata(\n\tname: BotEventName,\n\tpayload: unknown,\n): {\n\tguildId?: string;\n\tchannelId?: string;\n\tuserId?: string;\n\tcommandName?: string;\n\tcustomId?: string;\n\tinteractionKind?: BridgeInteractionKind;\n} {\n\tswitch (name) {\n\t\tcase 'ready':\n\t\t\treturn {};\n\t\tcase 'interactionCreate': {\n\t\t\tconst interactionPayload = payload as BotEventPayloadMap['interactionCreate'];\n\t\t\tconst ix = interactionPayload.interaction;\n\t\t\treturn {\n\t\t\t\t...(ix.guildId ? { guildId: ix.guildId } : {}),\n\t\t\t\t...(ix.channelId ? { channelId: ix.channelId } : {}),\n\t\t\t\tuserId: ix.user.id,\n\t\t\t\t...(ix.commandName ? { commandName: ix.commandName } : {}),\n\t\t\t\t...(ix.customId ? { customId: ix.customId } : {}),\n\t\t\t\tinteractionKind: ix.kind,\n\t\t\t};\n\t\t}\n\t\tcase 'messageCreate': {\n\t\t\tconst messagePayload = payload as BotEventPayloadMap['messageCreate'];\n\t\t\treturn {\n\t\t\t\t...(messagePayload.message.guildId ? { guildId: messagePayload.message.guildId } : {}),\n\t\t\t\tchannelId: messagePayload.message.channelId,\n\t\t\t\t...(messagePayload.message.author ? { userId: messagePayload.message.author.id } : {}),\n\t\t\t};\n\t\t}\n\t\tcase 'messageUpdate': {\n\t\t\tconst messagePayload = payload as BotEventPayloadMap['messageUpdate'];\n\t\t\treturn {\n\t\t\t\t...(messagePayload.message.guildId ? { guildId: messagePayload.message.guildId } : {}),\n\t\t\t\tchannelId: messagePayload.message.channelId,\n\t\t\t\t...(messagePayload.message.author ? { userId: messagePayload.message.author.id } : {}),\n\t\t\t};\n\t\t}\n\t\tcase 'messageDelete': {\n\t\t\tconst messagePayload = payload as BotEventPayloadMap['messageDelete'];\n\t\t\treturn {\n\t\t\t\t...(messagePayload.message.guildId ? { guildId: messagePayload.message.guildId } : {}),\n\t\t\t\tchannelId: messagePayload.message.channelId,\n\t\t\t};\n\t\t}\n\t\tcase 'messageReactionAdd': {\n\t\t\tconst reactionPayload = payload as BotEventPayloadMap['messageReactionAdd'];\n\t\t\treturn {\n\t\t\t\t...(reactionPayload.reaction.guildId ? { guildId: reactionPayload.reaction.guildId } : {}),\n\t\t\t\tchannelId: reactionPayload.reaction.channelId,\n\t\t\t\t...(reactionPayload.reaction.user ? { userId: reactionPayload.reaction.user.id } : {}),\n\t\t\t};\n\t\t}\n\t\tcase 'messageReactionRemove': {\n\t\t\tconst reactionPayload = payload as BotEventPayloadMap['messageReactionRemove'];\n\t\t\treturn {\n\t\t\t\t...(reactionPayload.reaction.guildId ? { guildId: reactionPayload.reaction.guildId } : {}),\n\t\t\t\tchannelId: reactionPayload.reaction.channelId,\n\t\t\t\t...(reactionPayload.reaction.user ? { userId: reactionPayload.reaction.user.id } : {}),\n\t\t\t};\n\t\t}\n\t\tcase 'guildMemberAdd': {\n\t\t\tconst memberPayload = payload as BotEventPayloadMap['guildMemberAdd'];\n\t\t\treturn {\n\t\t\t\tguildId: memberPayload.member.guildId,\n\t\t\t\tuserId: memberPayload.member.id,\n\t\t\t};\n\t\t}\n\t\tcase 'guildMemberRemove': {\n\t\t\tconst memberPayload = payload as BotEventPayloadMap['guildMemberRemove'];\n\t\t\treturn {\n\t\t\t\tguildId: memberPayload.member.guildId,\n\t\t\t\tuserId: memberPayload.member.id,\n\t\t\t};\n\t\t}\n\t\tcase 'guildMemberUpdate': {\n\t\t\tconst memberPayload = payload as BotEventPayloadMap['guildMemberUpdate'];\n\t\t\treturn {\n\t\t\t\tguildId: memberPayload.member.guildId,\n\t\t\t\tuserId: memberPayload.member.id,\n\t\t\t};\n\t\t}\n\t\tcase 'guildCreate':\n\t\tcase 'guildDelete': {\n\t\t\tconst guildPayload = payload as BotEventPayloadMap['guildCreate'];\n\t\t\treturn {\n\t\t\t\tguildId: guildPayload.guild.id,\n\t\t\t};\n\t\t}\n\t\tcase 'threadCreate':\n\t\tcase 'threadUpdate':\n\t\tcase 'threadDelete': {\n\t\t\tconst threadPayload = payload as BotEventPayloadMap['threadCreate'];\n\t\t\treturn {\n\t\t\t\tguildId: threadPayload.thread.guildId,\n\t\t\t\t...(threadPayload.thread.parentId\n\t\t\t\t\t? { channelId: threadPayload.thread.parentId }\n\t\t\t\t\t: { channelId: threadPayload.thread.id }),\n\t\t\t};\n\t\t}\n\t\tdefault:\n\t\t\treturn {};\n\t}\n}\n\nexport function matchesEventSubscription(subscription: EventSubscription, payload: unknown): boolean {\n\tconst normalized = normalizeEventSubscription(subscription);\n\tif (!normalized.filter) {\n\t\treturn true;\n\t}\n\n\tconst metadata = eventMetadata(normalized.name, payload);\n\treturn (\n\t\tmatchesField(metadata.guildId, normalized.filter.guildId) &&\n\t\tmatchesField(metadata.channelId, normalized.filter.channelId) &&\n\t\tmatchesField(metadata.userId, normalized.filter.userId) &&\n\t\tmatchesField(metadata.commandName, normalized.filter.commandName) &&\n\t\tmatchesField(metadata.customId, normalized.filter.customId) &&\n\t\tmatchesKind(metadata.interactionKind, normalized.filter.interactionKind)\n\t);\n}\n","import { timingSafeEqual } from 'node:crypto';\n\nexport function isSecretValid(provided: string, expected: string): boolean {\n\tconst providedBuffer = Buffer.from(provided);\n\tconst expectedBuffer = Buffer.from(expected);\n\n\tif (providedBuffer.length !== expectedBuffer.length) {\n\t\treturn false;\n\t}\n\n\treturn timingSafeEqual(providedBuffer, expectedBuffer);\n}\n","import type {\n\tActionResult,\n\tBotActionName,\n\tBridgeCapabilities,\n\tEventSubscription,\n\tBotEventPayloadMap,\n} from '../../discord/types';\n\nexport const PROTOCOL_VERSION = 2 as const;\n\nexport type WireType =\n\t| 'auth.hello'\n\t| 'auth.ok'\n\t| 'auth.error'\n\t| 'subscribe'\n\t| 'unsubscribe'\n\t| 'discord.event'\n\t| 'action.request'\n\t| 'action.result'\n\t| 'action.error'\n\t| 'ping'\n\t| 'pong';\n\nexport interface WireEnvelope<TType extends WireType = WireType, TPayload = unknown> {\n\tv: typeof PROTOCOL_VERSION;\n\ttype: TType;\n\tts: number;\n\trequestId?: string;\n\tpayload: TPayload;\n}\n\nexport interface AuthHelloPayload {\n\tsecret: string;\n\tsecretId?: string;\n\tappName?: string;\n}\n\nexport interface AuthOkPayload {\n\tconnectionId: string;\n\tcapabilities: BridgeCapabilities;\n}\n\nexport interface AuthErrorPayload {\n\tcode: 'UNAUTHORIZED';\n\treason: 'unknown_secret_id' | 'invalid_secret' | 'ambiguous_secret';\n\tmessage: string;\n}\n\nexport interface SubscribePayload {\n\tsubscriptions: EventSubscription[];\n}\n\nexport interface UnsubscribePayload {\n\tsubscriptions: EventSubscription[];\n}\n\nexport interface DiscordEventPayload<TName extends keyof BotEventPayloadMap = keyof BotEventPayloadMap> {\n\tname: TName;\n\tdata: BotEventPayloadMap[TName];\n}\n\nexport interface ActionRequestPayload {\n\tname: BotActionName;\n\tdata: unknown;\n\t/**\n\t * When set, duplicate keys return the first result within the server TTL (best-effort).\n\t * Scope defaults to the WebSocket connection; configure `server.idempotencyScope: \"secret\"` for cross-connection dedupe.\n\t */\n\tidempotencyKey?: string;\n}\n\nexport type ActionResponsePayload = ActionResult<unknown>;\n\nexport function makeEnvelope<TType extends WireType, TPayload>(\n\ttype: TType,\n\tpayload: TPayload,\n\textras?: { requestId?: string },\n): WireEnvelope<TType, TPayload> {\n\treturn {\n\t\tv: PROTOCOL_VERSION,\n\t\ttype,\n\t\tts: Date.now(),\n\t\t...(extras?.requestId ? { requestId: extras.requestId } : {}),\n\t\tpayload,\n\t};\n}\n\nexport function parseEnvelope(raw: string): WireEnvelope {\n\tconst parsed = JSON.parse(raw) as WireEnvelope;\n\tif (!parsed || parsed.v !== PROTOCOL_VERSION || typeof parsed.type !== 'string') {\n\t\tthrow new Error('Invalid bridge envelope.');\n\t}\n\treturn parsed;\n}\n\nexport function stringifyEnvelope(envelope: WireEnvelope): string {\n\treturn JSON.stringify(envelope);\n}\n","interface Waiter {\n\tresolve: (release: () => void) => void;\n\treject: (error: Error) => void;\n\ttimeout: NodeJS.Timeout;\n}\n\n/**\n * Simple async semaphore for limiting concurrent async work (e.g. Discord API calls).\n */\nexport class AsyncSemaphore {\n\tprivate active = 0;\n\tprivate readonly waiters: Waiter[] = [];\n\n\tconstructor(\n\t\tprivate readonly max: number,\n\t\tprivate readonly acquireTimeoutMs: number,\n\t) {}\n\n\tasync run<T>(fn: () => Promise<T>): Promise<T> {\n\t\tconst release = await this.acquire();\n\t\ttry {\n\t\t\treturn await fn();\n\t\t} finally {\n\t\t\trelease();\n\t\t}\n\t}\n\n\tprivate acquire(): Promise<() => void> {\n\t\tif (this.active < this.max) {\n\t\t\tthis.active += 1;\n\t\t\treturn Promise.resolve(() => this.release());\n\t\t}\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tconst index = this.waiters.findIndex((entry) => entry.timeout === timeout);\n\t\t\t\tif (index >= 0) {\n\t\t\t\t\tthis.waiters.splice(index, 1);\n\t\t\t\t}\n\t\t\t\treject(new Error('ACTION_QUEUE_TIMEOUT'));\n\t\t\t}, this.acquireTimeoutMs);\n\t\t\tthis.waiters.push({\n\t\t\t\tresolve: (release) => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tresolve(release);\n\t\t\t\t},\n\t\t\t\treject,\n\t\t\t\ttimeout,\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate release(): void {\n\t\tthis.active -= 1;\n\t\tconst next = this.waiters.shift();\n\t\tif (next) {\n\t\t\tclearTimeout(next.timeout);\n\t\t\tthis.active += 1;\n\t\t\tnext.resolve(() => this.release());\n\t\t}\n\t}\n}\n","import type {\n\tAppBridgeOptions,\n\tBotActionName,\n\tBotBridgeOptions,\n\tBotBridgeSecret,\n\tBotEventName,\n\tBotIntentName,\n\tBridgeCapabilities,\n} from '../discord/types';\nimport { BOT_ACTION_NAMES, BOT_EVENT_NAMES, getAvailableEvents } from '../discord/catalog';\n\ninterface NormalizedSecretScope {\n\tevents: '*' | Set<BotEventName>;\n\tactions: '*' | Set<BotActionName>;\n}\n\nexport interface NormalizedSecretConfig {\n\tid: string;\n\tvalue: string;\n\tscope: NormalizedSecretScope;\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n\treturn typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction assertPositiveNumber(name: string, value: unknown): void {\n\tif (typeof value !== 'number' || Number.isNaN(value) || value <= 0) {\n\t\tthrow new Error(`${name} must be a positive number.`);\n\t}\n}\n\nfunction normalizeScopeList<T extends string>(\n\tvalue: '*' | readonly T[] | undefined,\n\tknown: readonly T[],\n\tlabel: string,\n): '*' | Set<T> {\n\tif (value === undefined || value === '*') {\n\t\treturn '*';\n\t}\n\tif (!Array.isArray(value)) {\n\t\tthrow new Error(`${label} must be \"*\" or an array.`);\n\t}\n\tconst knownSet = new Set(known);\n\tconst entries = new Set<T>();\n\tfor (const rawItem of value as readonly unknown[]) {\n\t\tif (typeof rawItem !== 'string') {\n\t\t\tthrow new Error(`${label} contains a non-string value.`);\n\t\t}\n\t\tconst item = rawItem as T;\n\t\tif (!knownSet.has(item)) {\n\t\t\tthrow new Error(`${label} contains unsupported value \"${String(item)}\".`);\n\t\t}\n\t\tentries.add(item);\n\t}\n\treturn entries;\n}\n\nfunction normalizeSecretEntry(secret: BotBridgeSecret, index: number): NormalizedSecretConfig {\n\tconst defaultId = `s${index}`;\n\tif (typeof secret === 'string') {\n\t\tif (!isNonEmptyString(secret)) {\n\t\t\tthrow new Error(`server.secrets[${index}] must be a non-empty string.`);\n\t\t}\n\t\treturn {\n\t\t\tid: defaultId,\n\t\t\tvalue: secret,\n\t\t\tscope: {\n\t\t\t\tevents: '*',\n\t\t\t\tactions: '*',\n\t\t\t},\n\t\t};\n\t}\n\n\tconst scoped = secret;\n\tif (!isNonEmptyString(scoped.value)) {\n\t\tthrow new Error(`server.secrets[${index}].value must be a non-empty string.`);\n\t}\n\tif (scoped.id !== undefined && !isNonEmptyString(scoped.id)) {\n\t\tthrow new Error(`server.secrets[${index}].id must be a non-empty string when provided.`);\n\t}\n\n\treturn {\n\t\tid: scoped.id ?? defaultId,\n\t\tvalue: scoped.value,\n\t\tscope: {\n\t\t\tevents: normalizeScopeList(scoped.allow?.events, BOT_EVENT_NAMES, `server.secrets[${index}].allow.events`),\n\t\t\tactions: normalizeScopeList(scoped.allow?.actions, BOT_ACTION_NAMES, `server.secrets[${index}].allow.actions`),\n\t\t},\n\t};\n}\n\nexport function assertBotBridgeOptions(options: BotBridgeOptions): void {\n\tif (!isNonEmptyString(options.token)) {\n\t\tthrow new Error('Bot bridge requires `token`.');\n\t}\n\tif (!Array.isArray(options.intents) || options.intents.length === 0) {\n\t\tthrow new Error('Bot bridge requires at least one intent.');\n\t}\n\tassertPositiveNumber('server.port', options.server.port);\n\tif (options.server.heartbeatMs !== undefined) {\n\t\tassertPositiveNumber('server.heartbeatMs', options.server.heartbeatMs);\n\t}\n\tif (options.server.maxPayloadBytes !== undefined) {\n\t\tassertPositiveNumber('server.maxPayloadBytes', options.server.maxPayloadBytes);\n\t}\n\tif (options.server.maxConnections !== undefined) {\n\t\tassertPositiveNumber('server.maxConnections', options.server.maxConnections);\n\t}\n\tif (options.server.maxConcurrentActions !== undefined) {\n\t\tassertPositiveNumber('server.maxConcurrentActions', options.server.maxConcurrentActions);\n\t}\n\tif (options.server.actionQueueTimeoutMs !== undefined) {\n\t\tassertPositiveNumber('server.actionQueueTimeoutMs', options.server.actionQueueTimeoutMs);\n\t}\n\tif (options.server.idempotencyScope !== undefined) {\n\t\tif (options.server.idempotencyScope !== 'connection' && options.server.idempotencyScope !== 'secret') {\n\t\t\tthrow new Error('server.idempotencyScope must be \"connection\" or \"secret\".');\n\t\t}\n\t}\n\tif (options.server.idempotencyTtlMs !== undefined) {\n\t\tassertPositiveNumber('server.idempotencyTtlMs', options.server.idempotencyTtlMs);\n\t}\n\tif (!Array.isArray(options.server.secrets) || options.server.secrets.length === 0) {\n\t\tthrow new Error('server.secrets must contain at least one secret.');\n\t}\n\tconst ids = new Set<string>();\n\tconst values = new Set<string>();\n\toptions.server.secrets.forEach((secret: BotBridgeSecret, index) => {\n\t\tconst normalized = normalizeSecretEntry(secret, index);\n\t\tif (ids.has(normalized.id)) {\n\t\t\tthrow new Error(`server.secrets contains duplicate secret id \"${normalized.id}\".`);\n\t\t}\n\t\tif (values.has(normalized.value)) {\n\t\t\tthrow new Error(`server.secrets contains duplicate secret value at index ${index}.`);\n\t\t}\n\t\tids.add(normalized.id);\n\t\tvalues.add(normalized.value);\n\t});\n}\n\nexport function normalizeSecrets(options: BotBridgeOptions): NormalizedSecretConfig[] {\n\treturn options.server.secrets.map((secret, index) => normalizeSecretEntry(secret, index));\n}\n\nexport function assertAppBridgeOptions(options: AppBridgeOptions): void {\n\tif (!isNonEmptyString(options.url)) {\n\t\tthrow new Error('App bridge requires `url`.');\n\t}\n\tlet parsedUrl: URL;\n\ttry {\n\t\tparsedUrl = new URL(options.url);\n\t} catch {\n\t\tthrow new Error('App bridge option `url` must be a valid URL.');\n\t}\n\tif (parsedUrl.protocol !== 'ws:' && parsedUrl.protocol !== 'wss:') {\n\t\tthrow new Error('App bridge option `url` must use `ws://` or `wss://`.');\n\t}\n\tconst isLoopbackHost =\n\t\tparsedUrl.hostname === 'localhost' || parsedUrl.hostname === '127.0.0.1' || parsedUrl.hostname === '::1';\n\tif (parsedUrl.protocol === 'ws:' && !isLoopbackHost) {\n\t\tthrow new Error('Non-loopback app bridge URLs must use `wss://`.');\n\t}\n\tif (!isNonEmptyString(options.secret)) {\n\t\tthrow new Error('App bridge requires `secret`.');\n\t}\n\tif (options.secretId !== undefined && !isNonEmptyString(options.secretId)) {\n\t\tthrow new Error('App bridge option `secretId` must be a non-empty string.');\n\t}\n\tif (options.appName !== undefined && !isNonEmptyString(options.appName)) {\n\t\tthrow new Error('App bridge option `appName` must be a non-empty string.');\n\t}\n\tif (options.requestTimeoutMs !== undefined) {\n\t\tassertPositiveNumber('requestTimeoutMs', options.requestTimeoutMs);\n\t}\n\tif (options.reconnect?.initialDelayMs !== undefined) {\n\t\tassertPositiveNumber('reconnect.initialDelayMs', options.reconnect.initialDelayMs);\n\t}\n\tif (options.reconnect?.maxDelayMs !== undefined) {\n\t\tassertPositiveNumber('reconnect.maxDelayMs', options.reconnect.maxDelayMs);\n\t}\n}\n\nexport function resolveCapabilitiesForSecret(\n\tintents: readonly BotIntentName[],\n\tsecret: NormalizedSecretConfig,\n): BridgeCapabilities {\n\tconst availableEvents = getAvailableEvents(intents);\n\tconst events =\n\t\tsecret.scope.events === '*'\n\t\t\t? [...availableEvents]\n\t\t\t: availableEvents.filter((eventName) => {\n\t\t\t\t\treturn secret.scope.events !== '*' && secret.scope.events.has(eventName);\n\t\t\t\t});\n\tconst actions =\n\t\tsecret.scope.actions === '*'\n\t\t\t? [...BOT_ACTION_NAMES]\n\t\t\t: BOT_ACTION_NAMES.filter((action) => {\n\t\t\t\t\treturn secret.scope.actions !== '*' && secret.scope.actions.has(action);\n\t\t\t\t});\n\n\treturn {\n\t\tevents: [...events],\n\t\tactions: [...actions],\n\t};\n}\n","import type {\n\tActionFailure,\n\tBotActionPayloadMap,\n\tBotBridge,\n\tBotBridgeOptions,\n\tReadyEventPayload,\n} from '../discord/types';\nimport { getAvailableEvents } from '../discord/catalog';\nimport { ActionExecutionError, type DiscordRuntimeAdapter } from '../discord/runtime/adapter';\nimport { createDiscordJsRuntimeAdapter } from '../discord/runtime/discordjs-adapter';\nimport { BridgeTransportServer, authenticateSecret } from '../bridge/transport/server';\nimport { assertBotBridgeOptions, normalizeSecrets, resolveCapabilitiesForSecret } from '../bridge/validation';\n\nexport function createBotBridge(options: BotBridgeOptions): BotBridge {\n\tconst runtime = createDiscordJsRuntimeAdapter({\n\t\ttoken: options.token,\n\t\tintents: options.intents,\n\t\t...(options.logger ? { logger: options.logger } : {}),\n\t});\n\treturn createBotBridgeWithRuntime(options, runtime);\n}\n\nexport function createBotBridgeWithRuntime(options: BotBridgeOptions, runtime: DiscordRuntimeAdapter): BotBridge {\n\tassertBotBridgeOptions(options);\n\tconst secrets = normalizeSecrets(options);\n\tconst availableEvents = getAvailableEvents(options.intents);\n\tconst server = new BridgeTransportServer({\n\t\toptions,\n\t\t...(options.logger ? { logger: options.logger } : {}),\n\t\tauthenticate: (payload) =>\n\t\t\tauthenticateSecret(payload, secrets, (secret) => resolveCapabilitiesForSecret(options.intents, secret)),\n\t\tonActionRequest: async (connection, actionName, payload, requestId) => {\n\t\t\tif (!connection.capabilities.actions.includes(actionName)) {\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\trequestId,\n\t\t\t\t\tts: Date.now(),\n\t\t\t\t\terror: {\n\t\t\t\t\t\tcode: 'FORBIDDEN',\n\t\t\t\t\t\tmessage: `Action \"${actionName}\" is not allowed for this app.`,\n\t\t\t\t\t},\n\t\t\t\t} satisfies ActionFailure;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst result = await runtime.executeAction(actionName, payload as BotActionPayloadMap[typeof actionName]);\n\t\t\t\treturn {\n\t\t\t\t\tok: true,\n\t\t\t\t\trequestId,\n\t\t\t\t\tts: Date.now(),\n\t\t\t\t\tdata: result,\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof ActionExecutionError) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tok: false,\n\t\t\t\t\t\trequestId,\n\t\t\t\t\t\tts: Date.now(),\n\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\tcode: error.code,\n\t\t\t\t\t\t\tmessage: error.message,\n\t\t\t\t\t\t\t...(error.details !== undefined ? { details: error.details } : {}),\n\t\t\t\t\t\t},\n\t\t\t\t\t} satisfies ActionFailure;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\trequestId,\n\t\t\t\t\tts: Date.now(),\n\t\t\t\t\terror: {\n\t\t\t\t\t\tcode: 'INTERNAL_ERROR',\n\t\t\t\t\t\tmessage: error instanceof Error ? error.message : 'Unknown action failure.',\n\t\t\t\t\t},\n\t\t\t\t} satisfies ActionFailure;\n\t\t\t}\n\t\t},\n\t});\n\n\tconst unsubscribers = availableEvents.map((eventName) =>\n\t\truntime.on(eventName, (payload) => {\n\t\t\tif (eventName === 'ready') {\n\t\t\t\tserver.setStickyEvent('ready', payload as ReadyEventPayload);\n\t\t\t}\n\t\t\tserver.publishEvent(eventName, payload);\n\t\t}),\n\t);\n\n\treturn {\n\t\tasync ready() {\n\t\t\tawait runtime.ready();\n\t\t},\n\t\tasync close() {\n\t\t\tfor (const unsubscribe of unsubscribers) {\n\t\t\t\tunsubscribe();\n\t\t\t}\n\t\t\tawait Promise.all([server.close(), runtime.close()]);\n\t\t},\n\t\tstatus() {\n\t\t\treturn {\n\t\t\t\tready: runtime.isReady(),\n\t\t\t\tconnectionCount: server.connectionCount(),\n\t\t\t};\n\t\t},\n\t};\n}\n","import type {\n\tAPIActionRowComponent,\n\tAPIAllowedMentions,\n\tAPIComponentInMessageActionRow,\n\tAPIEmbed,\n\tAPITextInputComponent,\n\tSnowflake,\n} from 'discord-api-types/v10';\nimport type { GatewayIntentBits } from 'discord.js';\n\nexport type Unsubscribe = () => void;\n\nexport interface ShardwireLogger {\n\tdebug?: (message: string, meta?: Record<string, unknown>) => void;\n\tinfo?: (message: string, meta?: Record<string, unknown>) => void;\n\twarn?: (message: string, meta?: Record<string, unknown>) => void;\n\terror?: (message: string, meta?: Record<string, unknown>) => void;\n}\n\nexport type BotIntentName = keyof typeof GatewayIntentBits;\n\nexport interface BridgeUser {\n\tid: Snowflake;\n\tusername: string;\n\tdiscriminator: string;\n\tglobalName?: string | null;\n\tavatarUrl?: string | null;\n\tbot: boolean;\n\tsystem: boolean;\n}\n\nexport interface BridgeAttachment {\n\tid: Snowflake;\n\tname: string;\n\turl: string;\n\tcontentType?: string | null;\n\tsize: number;\n}\n\nexport interface BridgeMessageReference {\n\tmessageId?: Snowflake;\n\tchannelId?: Snowflake;\n\tguildId?: Snowflake;\n}\n\nexport interface BridgeGuildMember {\n\tid: Snowflake;\n\tguildId: Snowflake;\n\tuser?: BridgeUser;\n\tdisplayName?: string;\n\tnickname?: string | null;\n\troles: Snowflake[];\n\tjoinedAt?: string | null;\n\tpremiumSince?: string | null;\n\tpending?: boolean;\n\tcommunicationDisabledUntil?: string | null;\n}\n\n/** Normalized guild snapshot for `guildCreate` / `guildDelete` events. */\nexport interface BridgeGuild {\n\tid: Snowflake;\n\tname: string;\n\ticon?: string | null;\n\townerId?: Snowflake;\n}\n\n/** Normalized thread channel snapshot for thread lifecycle events. */\nexport interface BridgeThread {\n\tid: Snowflake;\n\tguildId: Snowflake;\n\tparentId: Snowflake | null;\n\tname: string;\n\ttype: number;\n\tarchived?: boolean;\n\tlocked?: boolean;\n}\n\nexport interface BridgeMessage {\n\tid: Snowflake;\n\tchannelId: Snowflake;\n\tguildId?: Snowflake;\n\tauthor?: BridgeUser;\n\tmember?: BridgeGuildMember;\n\tcontent?: string;\n\tcreatedAt?: string;\n\teditedAt?: string | null;\n\tattachments: BridgeAttachment[];\n\tembeds: APIEmbed[];\n\t/** Message component rows (JSON-serializable API shape). */\n\tcomponents?: APIActionRowComponent<APIComponentInMessageActionRow>[];\n\treference?: BridgeMessageReference;\n}\n\nexport interface BridgeDeletedMessage {\n\tid: Snowflake;\n\tchannelId: Snowflake;\n\tguildId?: Snowflake;\n\tdeletedAt: string;\n}\n\nexport interface BridgeReactionEmoji {\n\tid?: Snowflake;\n\tname?: string | null;\n\tanimated?: boolean;\n}\n\nexport interface BridgeMessageReaction {\n\tmessageId: Snowflake;\n\tchannelId: Snowflake;\n\tguildId?: Snowflake;\n\tuser?: BridgeUser;\n\temoji: BridgeReactionEmoji;\n}\n\nexport type BridgeInteractionKind =\n\t| 'chatInput'\n\t| 'contextMenu'\n\t| 'button'\n\t| 'stringSelect'\n\t| 'userSelect'\n\t| 'roleSelect'\n\t| 'mentionableSelect'\n\t| 'channelSelect'\n\t| 'modalSubmit'\n\t| 'unknown';\n\nexport interface BridgeInteraction {\n\tid: Snowflake;\n\tapplicationId: Snowflake;\n\tkind: BridgeInteractionKind;\n\tguildId?: Snowflake;\n\tchannelId?: Snowflake;\n\tuser: BridgeUser;\n\tmember?: BridgeGuildMember;\n\tcommandName?: string;\n\tcustomId?: string;\n\toptions?: Record<string, unknown>;\n\tvalues?: string[];\n\tfields?: Record<string, string>;\n\tmessage?: BridgeMessage;\n}\n\nexport interface EventEnvelopeBase {\n\treceivedAt: number;\n\t/** Populated when the bot runs under `ShardingManager` (multi-shard). */\n\tshardId?: number;\n}\n\nexport interface ReadyEventPayload extends EventEnvelopeBase {\n\tuser: BridgeUser;\n}\n\nexport interface InteractionCreateEventPayload extends EventEnvelopeBase {\n\tinteraction: BridgeInteraction;\n}\n\nexport interface MessageCreateEventPayload extends EventEnvelopeBase {\n\tmessage: BridgeMessage;\n}\n\nexport interface MessageUpdateEventPayload extends EventEnvelopeBase {\n\toldMessage?: BridgeMessage;\n\tmessage: BridgeMessage;\n}\n\nexport interface MessageDeleteEventPayload extends EventEnvelopeBase {\n\tmessage: BridgeDeletedMessage;\n}\n\nexport interface GuildMemberAddEventPayload extends EventEnvelopeBase {\n\tmember: BridgeGuildMember;\n}\n\nexport interface GuildMemberRemoveEventPayload extends EventEnvelopeBase {\n\tmember: BridgeGuildMember;\n}\n\nexport interface GuildMemberUpdateEventPayload extends EventEnvelopeBase {\n\toldMember?: BridgeGuildMember;\n\tmember: BridgeGuildMember;\n}\n\nexport interface GuildCreateEventPayload extends EventEnvelopeBase {\n\tguild: BridgeGuild;\n}\n\nexport interface GuildDeleteEventPayload extends EventEnvelopeBase {\n\tguild: BridgeGuild;\n}\n\nexport interface ThreadCreateEventPayload extends EventEnvelopeBase {\n\tthread: BridgeThread;\n}\n\nexport interface ThreadUpdateEventPayload extends EventEnvelopeBase {\n\toldThread?: BridgeThread;\n\tthread: BridgeThread;\n}\n\nexport interface ThreadDeleteEventPayload extends EventEnvelopeBase {\n\tthread: BridgeThread;\n}\n\nexport interface MessageReactionAddEventPayload extends EventEnvelopeBase {\n\treaction: BridgeMessageReaction;\n}\n\nexport interface MessageReactionRemoveEventPayload extends EventEnvelopeBase {\n\treaction: BridgeMessageReaction;\n}\n\nexport interface BotEventPayloadMap {\n\tready: ReadyEventPayload;\n\tinteractionCreate: InteractionCreateEventPayload;\n\tmessageCreate: MessageCreateEventPayload;\n\tmessageUpdate: MessageUpdateEventPayload;\n\tmessageDelete: MessageDeleteEventPayload;\n\tmessageReactionAdd: MessageReactionAddEventPayload;\n\tmessageReactionRemove: MessageReactionRemoveEventPayload;\n\tguildCreate: GuildCreateEventPayload;\n\tguildDelete: GuildDeleteEventPayload;\n\tguildMemberAdd: GuildMemberAddEventPayload;\n\tguildMemberRemove: GuildMemberRemoveEventPayload;\n\tguildMemberUpdate: GuildMemberUpdateEventPayload;\n\tthreadCreate: ThreadCreateEventPayload;\n\tthreadUpdate: ThreadUpdateEventPayload;\n\tthreadDelete: ThreadDeleteEventPayload;\n}\n\nexport type BotEventName = keyof BotEventPayloadMap;\n\nexport interface BridgeMessageInput {\n\tcontent?: string;\n\tembeds?: APIEmbed[];\n\tallowedMentions?: APIAllowedMentions;\n\tcomponents?: APIActionRowComponent<APIComponentInMessageActionRow>[];\n\t/** Bitfield compatible with `MessageFlags` from discord.js / Discord API. */\n\tflags?: number;\n\tstickerIds?: Snowflake[];\n}\n\nexport interface SendMessageActionPayload extends BridgeMessageInput {\n\tchannelId: Snowflake;\n}\n\nexport interface EditMessageActionPayload extends BridgeMessageInput {\n\tchannelId: Snowflake;\n\tmessageId: Snowflake;\n}\n\nexport interface DeleteMessageActionPayload {\n\tchannelId: Snowflake;\n\tmessageId: Snowflake;\n}\n\nexport interface ReplyToInteractionActionPayload extends BridgeMessageInput {\n\tinteractionId: Snowflake;\n\tephemeral?: boolean;\n}\n\nexport interface DeferInteractionActionPayload {\n\tinteractionId: Snowflake;\n\tephemeral?: boolean;\n}\n\nexport interface FollowUpInteractionActionPayload extends BridgeMessageInput {\n\tinteractionId: Snowflake;\n\tephemeral?: boolean;\n}\n\nexport interface DeferUpdateInteractionActionPayload {\n\tinteractionId: Snowflake;\n}\n\nexport interface EditInteractionReplyActionPayload extends BridgeMessageInput {\n\tinteractionId: Snowflake;\n}\n\nexport interface DeleteInteractionReplyActionPayload {\n\tinteractionId: Snowflake;\n}\n\nexport interface UpdateInteractionActionPayload extends BridgeMessageInput {\n\tinteractionId: Snowflake;\n}\n\nexport interface ShowModalActionPayload {\n\tinteractionId: Snowflake;\n\ttitle: string;\n\tcustomId: string;\n\tcomponents: APIActionRowComponent<APITextInputComponent>[];\n}\n\nexport interface FetchMessageActionPayload {\n\tchannelId: Snowflake;\n\tmessageId: Snowflake;\n}\n\nexport interface FetchMemberActionPayload {\n\tguildId: Snowflake;\n\tuserId: Snowflake;\n}\n\nexport interface BanMemberActionPayload {\n\tguildId: Snowflake;\n\tuserId: Snowflake;\n\treason?: string;\n\tdeleteMessageSeconds?: number;\n}\n\nexport interface KickMemberActionPayload {\n\tguildId: Snowflake;\n\tuserId: Snowflake;\n\treason?: string;\n}\n\nexport interface AddMemberRoleActionPayload {\n\tguildId: Snowflake;\n\tuserId: Snowflake;\n\troleId: Snowflake;\n\treason?: string;\n}\n\nexport interface RemoveMemberRoleActionPayload {\n\tguildId: Snowflake;\n\tuserId: Snowflake;\n\troleId: Snowflake;\n\treason?: string;\n}\n\nexport interface AddMessageReactionActionPayload {\n\tchannelId: Snowflake;\n\tmessageId: Snowflake;\n\temoji: string;\n}\n\nexport interface RemoveOwnMessageReactionActionPayload {\n\tchannelId: Snowflake;\n\tmessageId: Snowflake;\n\temoji: string;\n}\n\nexport interface BotActionPayloadMap {\n\tsendMessage: SendMessageActionPayload;\n\teditMessage: EditMessageActionPayload;\n\tdeleteMessage: DeleteMessageActionPayload;\n\treplyToInteraction: ReplyToInteractionActionPayload;\n\tdeferInteraction: DeferInteractionActionPayload;\n\tdeferUpdateInteraction: DeferUpdateInteractionActionPayload;\n\tfollowUpInteraction: FollowUpInteractionActionPayload;\n\teditInteractionReply: EditInteractionReplyActionPayload;\n\tdeleteInteractionReply: DeleteInteractionReplyActionPayload;\n\tupdateInteraction: UpdateInteractionActionPayload;\n\tshowModal: ShowModalActionPayload;\n\tfetchMessage: FetchMessageActionPayload;\n\tfetchMember: FetchMemberActionPayload;\n\tbanMember: BanMemberActionPayload;\n\tkickMember: KickMemberActionPayload;\n\taddMemberRole: AddMemberRoleActionPayload;\n\tremoveMemberRole: RemoveMemberRoleActionPayload;\n\taddMessageReaction: AddMessageReactionActionPayload;\n\tremoveOwnMessageReaction: RemoveOwnMessageReactionActionPayload;\n}\n\nexport interface DeleteMessageActionResult {\n\tdeleted: true;\n\tchannelId: Snowflake;\n\tmessageId: Snowflake;\n}\n\nexport interface DeferInteractionActionResult {\n\tdeferred: true;\n\tinteractionId: Snowflake;\n}\n\nexport interface DeferUpdateInteractionActionResult {\n\tdeferred: true;\n\tinteractionId: Snowflake;\n}\n\nexport interface DeleteInteractionReplyActionResult {\n\tdeleted: true;\n\tinteractionId: Snowflake;\n}\n\nexport interface ShowModalActionResult {\n\tshown: true;\n\tinteractionId: Snowflake;\n}\n\nexport interface MemberModerationActionResult {\n\tguildId: Snowflake;\n\tuserId: Snowflake;\n}\n\nexport interface MessageReactionActionResult {\n\tmessageId: Snowflake;\n\tchannelId: Snowflake;\n\temoji: string;\n}\n\nexport interface BotActionResultDataMap {\n\tsendMessage: BridgeMessage;\n\teditMessage: BridgeMessage;\n\tdeleteMessage: DeleteMessageActionResult;\n\treplyToInteraction: BridgeMessage;\n\tdeferInteraction: DeferInteractionActionResult;\n\tdeferUpdateInteraction: DeferUpdateInteractionActionResult;\n\tfollowUpInteraction: BridgeMessage;\n\teditInteractionReply: BridgeMessage;\n\tdeleteInteractionReply: DeleteInteractionReplyActionResult;\n\tupdateInteraction: BridgeMessage;\n\tshowModal: ShowModalActionResult;\n\tfetchMessage: BridgeMessage;\n\tfetchMember: BridgeGuildMember;\n\tbanMember: MemberModerationActionResult;\n\tkickMember: MemberModerationActionResult;\n\taddMemberRole: BridgeGuildMember;\n\tremoveMemberRole: BridgeGuildMember;\n\taddMessageReaction: MessageReactionActionResult;\n\tremoveOwnMessageReaction: MessageReactionActionResult;\n}\n\nexport type BotActionName = keyof BotActionPayloadMap;\n\nexport interface BridgeCapabilities {\n\tevents: BotEventName[];\n\tactions: BotActionName[];\n}\n\nexport interface EventSubscriptionFilter {\n\tguildId?: Snowflake | readonly Snowflake[];\n\tchannelId?: Snowflake | readonly Snowflake[];\n\tuserId?: Snowflake | readonly Snowflake[];\n\tcommandName?: string | readonly string[];\n\t/** Matches `BridgeInteraction.customId` when present (components, modals). */\n\tcustomId?: string | readonly string[];\n\t/** Matches `BridgeInteraction.kind`. */\n\tinteractionKind?: BridgeInteractionKind | readonly BridgeInteractionKind[];\n}\n\nexport interface EventSubscription<K extends BotEventName = BotEventName> {\n\tname: K;\n\tfilter?: EventSubscriptionFilter;\n}\n\nexport interface SecretPermissions {\n\tevents?: '*' | readonly BotEventName[];\n\tactions?: '*' | readonly BotActionName[];\n}\n\nexport interface ScopedSecretConfig {\n\tid?: string;\n\tvalue: string;\n\tallow?: SecretPermissions;\n}\n\nexport type BotBridgeSecret = string | ScopedSecretConfig;\n\n/** Structured Discord / transport context for failed actions (machine-readable). */\nexport interface ActionErrorDetails {\n\tdiscordStatus?: number;\n\tdiscordCode?: number;\n\t/** When true, callers may retry with backoff (e.g. rate limits). */\n\tretryable?: boolean;\n\t/** Suggested wait derived from Discord `retry_after` (milliseconds), when available. */\n\tretryAfterMs?: number;\n\t[key: string]: unknown;\n}\n\nexport interface BotBridgeOptions {\n\ttoken: string;\n\tintents: readonly BotIntentName[];\n\tserver: {\n\t\tport: number;\n\t\thost?: string;\n\t\tpath?: string;\n\t\theartbeatMs?: number;\n\t\tmaxPayloadBytes?: number;\n\t\tsecrets: readonly BotBridgeSecret[];\n\t\t/** Reject new TCP connections when authenticated client count reaches this cap (default: unlimited). */\n\t\tmaxConnections?: number;\n\t\t/** Max concurrent action executions per bot process (default: 32). */\n\t\tmaxConcurrentActions?: number;\n\t\t/** When the queue is full, fail fast with `SERVICE_UNAVAILABLE` (default: 5000). */\n\t\tactionQueueTimeoutMs?: number;\n\t\t/**\n\t\t * Where `idempotencyKey` deduplication is scoped (default: `connection`).\n\t\t * - `connection`: same WebSocket connection only (reconnect uses a new scope).\n\t\t * - `secret`: same configured secret id across connections (useful for retries after reconnect).\n\t\t */\n\t\tidempotencyScope?: 'connection' | 'secret';\n\t\t/** TTL for idempotency cache entries in ms (default: 120000). */\n\t\tidempotencyTtlMs?: number;\n\t};\n\tlogger?: ShardwireLogger;\n}\n\nexport interface AppBridgeMetricsHooks {\n\tonActionComplete?: (meta: {\n\t\tname: BotActionName;\n\t\trequestId: string;\n\t\tdurationMs: number;\n\t\tok: boolean;\n\t\terrorCode?: string;\n\t\t/** Present when Discord returned HTTP 429 or similar retryable signals. */\n\t\tretryAfterMs?: number;\n\t\tdiscordStatus?: number;\n\t\tdiscordCode?: number;\n\t}) => void;\n}\n\nexport interface AppBridgeOptions {\n\turl: string;\n\tsecret: string;\n\tsecretId?: string;\n\tappName?: string;\n\treconnect?: {\n\t\tenabled?: boolean;\n\t\tinitialDelayMs?: number;\n\t\tmaxDelayMs?: number;\n\t\tjitter?: boolean;\n\t};\n\trequestTimeoutMs?: number;\n\tlogger?: ShardwireLogger;\n\tmetrics?: AppBridgeMetricsHooks;\n}\n\nexport interface ActionError {\n\tcode:\n\t\t| 'UNAUTHORIZED'\n\t\t| 'TIMEOUT'\n\t\t| 'DISCONNECTED'\n\t\t| 'FORBIDDEN'\n\t\t| 'NOT_FOUND'\n\t\t| 'INVALID_REQUEST'\n\t\t| 'INTERNAL_ERROR'\n\t\t| 'SERVICE_UNAVAILABLE';\n\tmessage: string;\n\tdetails?: ActionErrorDetails | unknown;\n}\n\nexport interface ActionSuccess<T> {\n\tok: true;\n\trequestId: string;\n\tts: number;\n\tdata: T;\n}\n\nexport interface ActionFailure {\n\tok: false;\n\trequestId: string;\n\tts: number;\n\terror: ActionError;\n}\n\nexport type ActionResult<T> = ActionSuccess<T> | ActionFailure;\n\nexport class BridgeCapabilityError extends Error {\n\tconstructor(\n\t\tpublic readonly kind: 'event' | 'action',\n\t\tpublic readonly name: string,\n\t\tmessage?: string,\n\t) {\n\t\tsuper(message ?? `Capability \"${name}\" is not available for ${kind}.`);\n\t\tthis.name = 'BridgeCapabilityError';\n\t}\n}\n\nexport type EventHandler<K extends BotEventName> = (payload: BotEventPayloadMap[K]) => void;\n\nexport type AppBridgeActionInvokeOptions = {\n\ttimeoutMs?: number;\n\trequestId?: string;\n\t/** When set, duplicate keys within TTL return the first result (best-effort idempotency). */\n\tidempotencyKey?: string;\n};\n\nexport type AppBridgeActions = {\n\t[K in BotActionName]: (\n\t\tpayload: BotActionPayloadMap[K],\n\t\toptions?: AppBridgeActionInvokeOptions,\n\t) => Promise<ActionResult<BotActionResultDataMap[K]>>;\n};\n\nexport interface BotBridge {\n\tready(): Promise<void>;\n\tclose(): Promise<void>;\n\tstatus(): { ready: boolean; connectionCount: number };\n}\n\nexport interface AppBridge {\n\tactions: AppBridgeActions;\n\tready(): Promise<void>;\n\tclose(): Promise<void>;\n\tconnected(): boolean;\n\tconnectionId(): string | null;\n\tcapabilities(): BridgeCapabilities;\n\ton<K extends BotEventName>(name: K, handler: EventHandler<K>, filter?: EventSubscriptionFilter): Unsubscribe;\n\toff<K extends BotEventName>(name: K, handler: EventHandler<K>): void;\n}\n","import { WebSocket } from 'ws';\n\nexport interface WebSocketLike {\n\treadyState: number;\n\tsend(data: string): void;\n\tclose(code?: number, reason?: string): void;\n\ton(event: 'open', listener: () => void): void;\n\ton(event: 'message', listener: (data: unknown) => void): void;\n\ton(event: 'close', listener: () => void): void;\n\ton(event: 'error', listener: (error: unknown) => void): void;\n\tonce(event: 'close', listener: () => void): void;\n}\n\nexport function createNodeWebSocket(url: string): WebSocketLike {\n\treturn new WebSocket(url) as unknown as WebSocketLike;\n}\n","export interface BackoffConfig {\n\tinitialDelayMs: number;\n\tmaxDelayMs: number;\n\tjitter: boolean;\n}\n\nexport function getBackoffDelay(attempt: number, config: BackoffConfig): number {\n\tconst base = Math.min(config.maxDelayMs, config.initialDelayMs * 2 ** attempt);\n\tif (!config.jitter) {\n\t\treturn base;\n\t}\n\tconst spread = Math.floor(base * 0.2);\n\tconst min = Math.max(0, base - spread);\n\tconst max = base + spread;\n\treturn Math.floor(Math.random() * (max - min + 1)) + min;\n}\n","import type {\n\tActionError,\n\tActionFailure,\n\tActionResult,\n\tAppBridge,\n\tAppBridgeActions,\n\tAppBridgeActionInvokeOptions,\n\tAppBridgeOptions,\n\tBotActionName,\n\tBotActionPayloadMap,\n\tBotActionResultDataMap,\n\tBotEventName,\n\tBridgeCapabilities,\n\tEventSubscription,\n\tEventSubscriptionFilter,\n\tEventHandler,\n} from '../discord/types';\nimport { BridgeCapabilityError } from '../discord/types';\nimport { matchesEventSubscription, serializeEventSubscription } from '../bridge/subscriptions';\nimport { createNodeWebSocket, type WebSocketLike } from '../bridge/transport/socket';\nimport {\n\tmakeEnvelope,\n\tparseEnvelope,\n\tstringifyEnvelope,\n\ttype ActionResponsePayload,\n\ttype AuthErrorPayload,\n\ttype AuthOkPayload,\n} from '../bridge/transport/protocol';\nimport { assertAppBridgeOptions } from '../bridge/validation';\nimport { createRequestId } from '../utils/id';\nimport { getBackoffDelay } from '../utils/backoff';\nimport { withLogger } from '../utils/logger';\n\ninterface PendingRequest {\n\tresolve: (value: ActionResult<unknown>) => void;\n\treject: (error: AppRequestError) => void;\n\ttimer: NodeJS.Timeout;\n}\n\nclass AppRequestError extends Error {\n\tconstructor(\n\t\tpublic readonly code: 'TIMEOUT' | 'DISCONNECTED' | 'UNAUTHORIZED',\n\t\tmessage: string,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = 'AppRequestError';\n\t}\n}\n\ninterface HandlerSubscriptionEntry {\n\thandler: EventHandler<BotEventName>;\n\tsubscription: EventSubscription;\n\tsignature: string;\n}\n\nconst DEFAULT_REQUEST_TIMEOUT_MS = 10000;\n\nfunction metricsExtrasFromActionError(error: ActionError): {\n\tretryAfterMs?: number;\n\tdiscordStatus?: number;\n\tdiscordCode?: number;\n} {\n\tconst details = error.details;\n\tif (!details || typeof details !== 'object' || Array.isArray(details)) {\n\t\treturn {};\n\t}\n\tconst obj = details as Record<string, unknown>;\n\tconst extras: { retryAfterMs?: number; discordStatus?: number; discordCode?: number } = {};\n\tif (typeof obj.retryAfterMs === 'number' && Number.isFinite(obj.retryAfterMs)) {\n\t\textras.retryAfterMs = obj.retryAfterMs;\n\t}\n\tif (typeof obj.discordStatus === 'number' && Number.isFinite(obj.discordStatus)) {\n\t\textras.discordStatus = obj.discordStatus;\n\t}\n\tif (typeof obj.discordCode === 'number' && Number.isFinite(obj.discordCode)) {\n\t\textras.discordCode = obj.discordCode;\n\t}\n\treturn extras;\n}\n\nexport function connectBotBridge(options: AppBridgeOptions): AppBridge {\n\tassertAppBridgeOptions(options);\n\n\tconst logger = withLogger(options.logger);\n\tconst metrics = options.metrics;\n\tconst reconnectEnabled = options.reconnect?.enabled ?? true;\n\tconst initialDelayMs = options.reconnect?.initialDelayMs ?? 500;\n\tconst maxDelayMs = options.reconnect?.maxDelayMs ?? 10000;\n\tconst jitter = options.reconnect?.jitter ?? true;\n\tconst requestTimeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n\n\tlet socket: WebSocketLike | null = null;\n\tlet isClosed = false;\n\tlet isAuthed = false;\n\tlet currentConnectionId: string | null = null;\n\tlet currentCapabilities: BridgeCapabilities = { events: [], actions: [] };\n\tlet reconnectAttempts = 0;\n\tlet reconnectTimer: NodeJS.Timeout | null = null;\n\tlet connectPromise: Promise<void> | null = null;\n\tlet connectResolve: (() => void) | null = null;\n\tlet connectReject: ((error: Error) => void) | null = null;\n\tlet authTimeoutTimer: NodeJS.Timeout | null = null;\n\tlet capabilityError: BridgeCapabilityError | null = null;\n\n\tconst pendingRequests = new Map<string, PendingRequest>();\n\tconst eventHandlers = new Map<BotEventName, Set<HandlerSubscriptionEntry>>();\n\tconst subscribedEntries = new Map<string, EventSubscription>();\n\n\tfunction clearAuthTimeout(): void {\n\t\tif (authTimeoutTimer) {\n\t\t\tclearTimeout(authTimeoutTimer);\n\t\t\tauthTimeoutTimer = null;\n\t\t}\n\t}\n\n\tfunction resolveConnect(): void {\n\t\tclearAuthTimeout();\n\t\tconnectResolve?.();\n\t\tconnectResolve = null;\n\t\tconnectReject = null;\n\t\tconnectPromise = null;\n\t}\n\n\tfunction rejectConnect(message: string): void {\n\t\tclearAuthTimeout();\n\t\tif (connectReject) {\n\t\t\tconnectReject(new Error(message));\n\t\t}\n\t\tconnectResolve = null;\n\t\tconnectReject = null;\n\t\tconnectPromise = null;\n\t}\n\n\tfunction sendRaw(data: string): void {\n\t\tif (!socket || socket.readyState !== 1) {\n\t\t\tthrow new Error('App bridge is not connected.');\n\t\t}\n\t\tsocket.send(data);\n\t}\n\n\tfunction rejectAllPending(code: 'TIMEOUT' | 'DISCONNECTED' | 'UNAUTHORIZED', reason: string): void {\n\t\tfor (const [requestId, pending] of pendingRequests.entries()) {\n\t\t\tclearTimeout(pending.timer);\n\t\t\tpending.reject(new AppRequestError(code, reason));\n\t\t\tpendingRequests.delete(requestId);\n\t\t}\n\t}\n\n\tfunction scheduleReconnect(): void {\n\t\tif (isClosed || !reconnectEnabled || reconnectTimer) {\n\t\t\treturn;\n\t\t}\n\t\tconst delay = getBackoffDelay(reconnectAttempts, { initialDelayMs, maxDelayMs, jitter });\n\t\treconnectAttempts += 1;\n\t\treconnectTimer = setTimeout(() => {\n\t\t\treconnectTimer = null;\n\t\t\tvoid connect().catch((error) => {\n\t\t\t\tlogger.warn('Reconnect attempt failed.', { error: String(error) });\n\t\t\t});\n\t\t}, delay);\n\t}\n\n\tfunction evaluateSubscriptions(): Map<string, EventSubscription> {\n\t\tconst desiredSubscriptions = new Map<string, EventSubscription>();\n\t\tif (!isAuthed && currentCapabilities.events.length === 0) {\n\t\t\tcapabilityError = null;\n\t\t\tfor (const handlers of eventHandlers.values()) {\n\t\t\t\tfor (const entry of handlers) {\n\t\t\t\t\tdesiredSubscriptions.set(entry.signature, entry.subscription);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn desiredSubscriptions;\n\t\t}\n\n\t\tconst allowedEvents = new Set(currentCapabilities.events);\n\t\tconst invalidEvents = [...eventHandlers.keys()].filter((eventName) => !allowedEvents.has(eventName));\n\t\tconst firstInvalid = invalidEvents[0];\n\t\tcapabilityError =\n\t\t\tfirstInvalid !== undefined\n\t\t\t\t? new BridgeCapabilityError('event', firstInvalid, `Event \"${firstInvalid}\" is not available for this app.`)\n\t\t\t\t: null;\n\n\t\tfor (const [eventName, handlers] of eventHandlers.entries()) {\n\t\t\tif (!allowedEvents.has(eventName)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (const entry of handlers) {\n\t\t\t\tdesiredSubscriptions.set(entry.signature, entry.subscription);\n\t\t\t}\n\t\t}\n\t\treturn desiredSubscriptions;\n\t}\n\n\tfunction syncSubscriptions(): void {\n\t\tif (!isAuthed || !socket || socket.readyState !== 1) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst desiredSubscriptions = evaluateSubscriptions();\n\n\t\tconst toSubscribe = [...desiredSubscriptions.entries()]\n\t\t\t.filter(([signature]) => !subscribedEntries.has(signature))\n\t\t\t.map(([, subscription]) => subscription);\n\t\tif (toSubscribe.length > 0) {\n\t\t\tsendRaw(stringifyEnvelope(makeEnvelope('subscribe', { subscriptions: toSubscribe })));\n\t\t\tfor (const subscription of toSubscribe) {\n\t\t\t\tsubscribedEntries.set(serializeEventSubscription(subscription), subscription);\n\t\t\t}\n\t\t}\n\n\t\tconst toUnsubscribe = [...subscribedEntries.entries()]\n\t\t\t.filter(([signature]) => !desiredSubscriptions.has(signature))\n\t\t\t.map(([, subscription]) => subscription);\n\t\tif (toUnsubscribe.length > 0) {\n\t\t\tsendRaw(stringifyEnvelope(makeEnvelope('unsubscribe', { subscriptions: toUnsubscribe })));\n\t\t\tfor (const subscription of toUnsubscribe) {\n\t\t\t\tsubscribedEntries.delete(serializeEventSubscription(subscription));\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction handleEvent(name: BotEventName, payload: unknown): void {\n\t\tconst handlers = eventHandlers.get(name);\n\t\tif (!handlers || handlers.size === 0) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const entry of handlers) {\n\t\t\ttry {\n\t\t\t\tif (!matchesEventSubscription(entry.subscription, payload)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tentry.handler(payload as never);\n\t\t\t} catch (error) {\n\t\t\t\tlogger.warn('App event handler threw an error.', { event: name, error: String(error) });\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function connect(): Promise<void> {\n\t\tif (isClosed) {\n\t\t\treturn;\n\t\t}\n\t\tif (socket && socket.readyState === 1 && isAuthed) {\n\t\t\treturn;\n\t\t}\n\t\tif (connectPromise) {\n\t\t\treturn connectPromise;\n\t\t}\n\n\t\tconnectPromise = new Promise<void>((resolve, reject) => {\n\t\t\tconnectResolve = resolve;\n\t\t\tconnectReject = reject;\n\t\t});\n\n\t\tsocket = createNodeWebSocket(options.url);\n\n\t\tsocket.on('open', () => {\n\t\t\treconnectAttempts = 0;\n\t\t\tisAuthed = false;\n\t\t\tsubscribedEntries.clear();\n\t\t\tcurrentConnectionId = null;\n\t\t\tcurrentCapabilities = { events: [], actions: [] };\n\t\t\tcapabilityError = null;\n\n\t\t\tsendRaw(\n\t\t\t\tstringifyEnvelope(\n\t\t\t\t\tmakeEnvelope('auth.hello', {\n\t\t\t\t\t\tsecret: options.secret,\n\t\t\t\t\t\t...(options.secretId ? { secretId: options.secretId } : {}),\n\t\t\t\t\t\t...(options.appName ? { appName: options.appName } : {}),\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t);\n\t\t\tauthTimeoutTimer = setTimeout(() => {\n\t\t\t\tif (!isAuthed) {\n\t\t\t\t\trejectConnect('App bridge authentication timed out.');\n\t\t\t\t\tsocket?.close();\n\t\t\t\t}\n\t\t\t}, requestTimeoutMs);\n\t\t});\n\n\t\tsocket.on('message', (raw) => {\n\t\t\ttry {\n\t\t\t\tconst serialized = typeof raw === 'string' ? raw : String(raw);\n\t\t\t\tconst envelope = parseEnvelope(serialized);\n\t\t\t\tswitch (envelope.type) {\n\t\t\t\t\tcase 'auth.ok': {\n\t\t\t\t\t\tconst payload = envelope.payload as AuthOkPayload;\n\t\t\t\t\t\tisAuthed = true;\n\t\t\t\t\t\tcurrentConnectionId = payload.connectionId;\n\t\t\t\t\t\tcurrentCapabilities = payload.capabilities;\n\t\t\t\t\t\tsyncSubscriptions();\n\t\t\t\t\t\tresolveConnect();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'auth.error': {\n\t\t\t\t\t\tconst payload = envelope.payload as AuthErrorPayload;\n\t\t\t\t\t\trejectConnect(payload.message);\n\t\t\t\t\t\trejectAllPending('UNAUTHORIZED', payload.message);\n\t\t\t\t\t\tsocket?.close();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'action.result':\n\t\t\t\t\tcase 'action.error': {\n\t\t\t\t\t\tconst requestId = envelope.requestId;\n\t\t\t\t\t\tif (!requestId) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst pending = pendingRequests.get(requestId);\n\t\t\t\t\t\tif (!pending) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tclearTimeout(pending.timer);\n\t\t\t\t\t\tpending.resolve(envelope.payload as ActionResponsePayload);\n\t\t\t\t\t\tpendingRequests.delete(requestId);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'discord.event': {\n\t\t\t\t\t\tconst payload = envelope.payload as { name: BotEventName; data: unknown };\n\t\t\t\t\t\thandleEvent(payload.name, payload.data);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'ping':\n\t\t\t\t\t\tsendRaw(stringifyEnvelope(makeEnvelope('pong', {})));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tlogger.warn('Failed to parse app bridge message.', { error: String(error) });\n\t\t\t}\n\t\t});\n\n\t\tsocket.on('close', () => {\n\t\t\trejectConnect('App bridge connection closed.');\n\t\t\tisAuthed = false;\n\t\t\tcurrentConnectionId = null;\n\t\t\tcurrentCapabilities = { events: [], actions: [] };\n\t\t\tsubscribedEntries.clear();\n\t\t\trejectAllPending('DISCONNECTED', 'App bridge connection closed before action completed.');\n\t\t\tif (!isClosed) {\n\t\t\t\tscheduleReconnect();\n\t\t\t}\n\t\t});\n\n\t\tsocket.on('error', (error) => {\n\t\t\tlogger.warn('App bridge socket error.', { error: String(error) });\n\t\t});\n\n\t\treturn connectPromise;\n\t}\n\n\tasync function invokeAction<K extends BotActionName>(\n\t\tname: K,\n\t\tpayload: BotActionPayloadMap[K],\n\t\tsendOptions?: AppBridgeActionInvokeOptions,\n\t): Promise<ActionResult<BotActionResultDataMap[K]>> {\n\t\ttry {\n\t\t\tawait connect();\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\trequestId: sendOptions?.requestId ?? 'unknown',\n\t\t\t\tts: Date.now(),\n\t\t\t\terror: {\n\t\t\t\t\tcode: 'UNAUTHORIZED',\n\t\t\t\t\tmessage: error instanceof Error ? error.message : 'Failed to authenticate.',\n\t\t\t\t},\n\t\t\t} satisfies ActionFailure;\n\t\t}\n\n\t\tif (!currentCapabilities.actions.includes(name)) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\trequestId: sendOptions?.requestId ?? 'unknown',\n\t\t\t\tts: Date.now(),\n\t\t\t\terror: {\n\t\t\t\t\tcode: 'FORBIDDEN',\n\t\t\t\t\tmessage: `Action \"${name}\" is not available for this app.`,\n\t\t\t\t},\n\t\t\t} satisfies ActionFailure;\n\t\t}\n\n\t\tif (!socket || socket.readyState !== 1 || !isAuthed) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\trequestId: sendOptions?.requestId ?? 'unknown',\n\t\t\t\tts: Date.now(),\n\t\t\t\terror: {\n\t\t\t\t\tcode: 'DISCONNECTED',\n\t\t\t\t\tmessage: 'Not connected to the bot bridge.',\n\t\t\t\t},\n\t\t\t} satisfies ActionFailure;\n\t\t}\n\n\t\tconst requestId = sendOptions?.requestId ?? createRequestId();\n\t\tconst timeoutMs = sendOptions?.timeoutMs ?? requestTimeoutMs;\n\t\tconst started = Date.now();\n\t\tconst promise = new Promise<ActionResult<unknown>>((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tpendingRequests.delete(requestId);\n\t\t\t\treject(new AppRequestError('TIMEOUT', `Action \"${name}\" timed out after ${timeoutMs}ms.`));\n\t\t\t}, timeoutMs);\n\n\t\t\tpendingRequests.set(requestId, {\n\t\t\t\tresolve,\n\t\t\t\treject: (error) => reject(error),\n\t\t\t\ttimer,\n\t\t\t});\n\t\t});\n\n\t\tsendRaw(\n\t\t\tstringifyEnvelope(\n\t\t\t\tmakeEnvelope(\n\t\t\t\t\t'action.request',\n\t\t\t\t\t{\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tdata: payload,\n\t\t\t\t\t\t...(sendOptions?.idempotencyKey ? { idempotencyKey: sendOptions.idempotencyKey } : {}),\n\t\t\t\t\t},\n\t\t\t\t\t{ requestId },\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\n\t\ttry {\n\t\t\tconst result = (await promise) as ActionResult<BotActionResultDataMap[K]>;\n\t\t\tmetrics?.onActionComplete?.({\n\t\t\t\tname,\n\t\t\t\trequestId,\n\t\t\t\tdurationMs: Date.now() - started,\n\t\t\t\tok: result.ok,\n\t\t\t\t...(!result.ok ? { errorCode: result.error.code, ...metricsExtrasFromActionError(result.error) } : {}),\n\t\t\t});\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tconst code =\n\t\t\t\terror instanceof AppRequestError ? error.code : !socket || socket.readyState !== 1 ? 'DISCONNECTED' : 'TIMEOUT';\n\t\t\tmetrics?.onActionComplete?.({\n\t\t\t\tname,\n\t\t\t\trequestId,\n\t\t\t\tdurationMs: Date.now() - started,\n\t\t\t\tok: false,\n\t\t\t\terrorCode: code,\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\trequestId,\n\t\t\t\tts: Date.now(),\n\t\t\t\terror: {\n\t\t\t\t\tcode,\n\t\t\t\t\tmessage: error instanceof Error ? error.message : 'Action request failed.',\n\t\t\t\t},\n\t\t\t} satisfies ActionFailure;\n\t\t}\n\t}\n\n\tconst actions: AppBridgeActions = {\n\t\tsendMessage: (payload, sendOptions) => invokeAction('sendMessage', payload, sendOptions),\n\t\teditMessage: (payload, sendOptions) => invokeAction('editMessage', payload, sendOptions),\n\t\tdeleteMessage: (payload, sendOptions) => invokeAction('deleteMessage', payload, sendOptions),\n\t\treplyToInteraction: (payload, sendOptions) => invokeAction('replyToInteraction', payload, sendOptions),\n\t\tdeferInteraction: (payload, sendOptions) => invokeAction('deferInteraction', payload, sendOptions),\n\t\tdeferUpdateInteraction: (payload, sendOptions) => invokeAction('deferUpdateInteraction', payload, sendOptions),\n\t\tfollowUpInteraction: (payload, sendOptions) => invokeAction('followUpInteraction', payload, sendOptions),\n\t\teditInteractionReply: (payload, sendOptions) => invokeAction('editInteractionReply', payload, sendOptions),\n\t\tdeleteInteractionReply: (payload, sendOptions) => invokeAction('deleteInteractionReply', payload, sendOptions),\n\t\tupdateInteraction: (payload, sendOptions) => invokeAction('updateInteraction', payload, sendOptions),\n\t\tshowModal: (payload, sendOptions) => invokeAction('showModal', payload, sendOptions),\n\t\tfetchMessage: (payload, sendOptions) => invokeAction('fetchMessage', payload, sendOptions),\n\t\tfetchMember: (payload, sendOptions) => invokeAction('fetchMember', payload, sendOptions),\n\t\tbanMember: (payload, sendOptions) => invokeAction('banMember', payload, sendOptions),\n\t\tkickMember: (payload, sendOptions) => invokeAction('kickMember', payload, sendOptions),\n\t\taddMemberRole: (payload, sendOptions) => invokeAction('addMemberRole', payload, sendOptions),\n\t\tremoveMemberRole: (payload, sendOptions) => invokeAction('removeMemberRole', payload, sendOptions),\n\t\taddMessageReaction: (payload, sendOptions) => invokeAction('addMessageReaction', payload, sendOptions),\n\t\tremoveOwnMessageReaction: (payload, sendOptions) => invokeAction('removeOwnMessageReaction', payload, sendOptions),\n\t};\n\n\treturn {\n\t\tactions,\n\t\tasync ready() {\n\t\t\tawait connect();\n\t\t\tif (capabilityError) {\n\t\t\t\tthrow capabilityError;\n\t\t\t}\n\t\t},\n\t\tasync close() {\n\t\t\tisClosed = true;\n\t\t\tisAuthed = false;\n\t\t\tcurrentConnectionId = null;\n\t\t\tcurrentCapabilities = { events: [], actions: [] };\n\t\t\tcapabilityError = null;\n\t\t\tsubscribedEntries.clear();\n\t\t\trejectConnect('App bridge has been closed.');\n\t\t\tif (reconnectTimer) {\n\t\t\t\tclearTimeout(reconnectTimer);\n\t\t\t\treconnectTimer = null;\n\t\t\t}\n\t\t\trejectAllPending('DISCONNECTED', 'App bridge has been closed.');\n\t\t\tif (!socket) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tconst current = socket;\n\t\t\t\tif (!current) {\n\t\t\t\t\tresolve();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcurrent.once('close', () => resolve());\n\t\t\t\tcurrent.close();\n\t\t\t});\n\t\t\tsocket = null;\n\t\t},\n\t\tconnected() {\n\t\t\treturn Boolean(socket && socket.readyState === 1 && isAuthed);\n\t\t},\n\t\tconnectionId() {\n\t\t\treturn currentConnectionId;\n\t\t},\n\t\tcapabilities() {\n\t\t\treturn {\n\t\t\t\tevents: [...currentCapabilities.events],\n\t\t\t\tactions: [...currentCapabilities.actions],\n\t\t\t};\n\t\t},\n\t\ton(name, handler, filter?: EventSubscriptionFilter) {\n\t\t\tif (currentCapabilities.events.length > 0 && !currentCapabilities.events.includes(name)) {\n\t\t\t\tthrow new BridgeCapabilityError('event', name, `Event \"${name}\" is not available for this app.`);\n\t\t\t}\n\t\t\tconst casted = handler as EventHandler<BotEventName>;\n\t\t\tconst subscription: EventSubscription = filter ? { name, filter } : { name };\n\t\t\tconst entry: HandlerSubscriptionEntry = {\n\t\t\t\thandler: casted,\n\t\t\t\tsubscription,\n\t\t\t\tsignature: serializeEventSubscription(subscription),\n\t\t\t};\n\t\t\tconst existing = eventHandlers.get(name);\n\t\t\tif (existing) {\n\t\t\t\texisting.add(entry);\n\t\t\t} else {\n\t\t\t\teventHandlers.set(name, new Set<HandlerSubscriptionEntry>([entry]));\n\t\t\t}\n\t\t\tif (this.connected()) {\n\t\t\t\tsyncSubscriptions();\n\t\t\t}\n\t\t\treturn () => {\n\t\t\t\tconst handlers = eventHandlers.get(name);\n\t\t\t\tif (!handlers) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\thandlers.delete(entry);\n\t\t\t\tif (handlers.size === 0) {\n\t\t\t\t\teventHandlers.delete(name);\n\t\t\t\t}\n\t\t\t\tif (this.connected()) {\n\t\t\t\t\tsyncSubscriptions();\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t\toff(name, handler) {\n\t\t\tconst handlers = eventHandlers.get(name);\n\t\t\tif (!handlers) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfor (const entry of [...handlers]) {\n\t\t\t\tif (entry.handler === (handler as EventHandler<BotEventName>)) {\n\t\t\t\t\thandlers.delete(entry);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (handlers.size === 0) {\n\t\t\t\teventHandlers.delete(name);\n\t\t\t}\n\t\t\tif (this.connected()) {\n\t\t\t\tsyncSubscriptions();\n\t\t\t}\n\t\t},\n\t};\n}\n"],"mappings":"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","names":[]}
|