djs-selfbot-v13 3.1.8 → 3.7.1

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.
Files changed (364) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +48 -37
  3. package/package.json +44 -26
  4. package/src/WebSocket.js +39 -39
  5. package/src/client/BaseClient.js +86 -86
  6. package/src/client/Client.js +934 -765
  7. package/src/client/WebhookClient.js +61 -61
  8. package/src/client/actions/Action.js +116 -120
  9. package/src/client/actions/ActionsManager.js +80 -78
  10. package/src/client/actions/ApplicationCommandPermissionsUpdate.js +34 -34
  11. package/src/client/actions/AutoModerationActionExecution.js +27 -27
  12. package/src/client/actions/AutoModerationRuleCreate.js +28 -28
  13. package/src/client/actions/AutoModerationRuleDelete.js +32 -32
  14. package/src/client/actions/AutoModerationRuleUpdate.js +30 -30
  15. package/src/client/actions/ChannelCreate.js +23 -23
  16. package/src/client/actions/ChannelDelete.js +39 -39
  17. package/src/client/actions/ChannelUpdate.js +43 -43
  18. package/src/client/actions/GuildAuditLogEntryCreate.js +29 -29
  19. package/src/client/actions/GuildBanAdd.js +20 -20
  20. package/src/client/actions/GuildBanRemove.js +25 -25
  21. package/src/client/actions/GuildChannelsPositionUpdate.js +21 -21
  22. package/src/client/actions/GuildDelete.js +65 -65
  23. package/src/client/actions/GuildEmojiCreate.js +20 -20
  24. package/src/client/actions/GuildEmojiDelete.js +21 -21
  25. package/src/client/actions/GuildEmojiUpdate.js +20 -20
  26. package/src/client/actions/GuildEmojisUpdate.js +34 -34
  27. package/src/client/actions/GuildIntegrationsUpdate.js +19 -19
  28. package/src/client/actions/GuildMemberRemove.js +33 -33
  29. package/src/client/actions/GuildMemberUpdate.js +44 -44
  30. package/src/client/actions/GuildRoleCreate.js +25 -25
  31. package/src/client/actions/GuildRoleDelete.js +31 -31
  32. package/src/client/actions/GuildRoleUpdate.js +39 -39
  33. package/src/client/actions/GuildRolesPositionUpdate.js +21 -21
  34. package/src/client/actions/GuildScheduledEventCreate.js +27 -27
  35. package/src/client/actions/GuildScheduledEventDelete.js +31 -31
  36. package/src/client/actions/GuildScheduledEventUpdate.js +30 -30
  37. package/src/client/actions/GuildScheduledEventUserAdd.js +32 -32
  38. package/src/client/actions/GuildScheduledEventUserRemove.js +32 -32
  39. package/src/client/actions/GuildStickerCreate.js +20 -20
  40. package/src/client/actions/GuildStickerDelete.js +21 -21
  41. package/src/client/actions/GuildStickerUpdate.js +20 -20
  42. package/src/client/actions/GuildStickersUpdate.js +34 -34
  43. package/src/client/actions/GuildUpdate.js +33 -33
  44. package/src/client/actions/InviteCreate.js +28 -28
  45. package/src/client/actions/InviteDelete.js +30 -30
  46. package/src/client/actions/MessageCreate.js +50 -46
  47. package/src/client/actions/MessageDelete.js +32 -32
  48. package/src/client/actions/MessageDeleteBulk.js +46 -46
  49. package/src/client/actions/MessagePollVoteAdd.js +33 -0
  50. package/src/client/actions/MessagePollVoteRemove.js +33 -0
  51. package/src/client/actions/MessageReactionAdd.js +68 -56
  52. package/src/client/actions/MessageReactionRemove.js +50 -45
  53. package/src/client/actions/MessageReactionRemoveAll.js +33 -33
  54. package/src/client/actions/MessageReactionRemoveEmoji.js +28 -28
  55. package/src/client/actions/MessageUpdate.js +26 -26
  56. package/src/client/actions/PresenceUpdate.js +50 -46
  57. package/src/client/actions/StageInstanceCreate.js +28 -28
  58. package/src/client/actions/StageInstanceDelete.js +33 -33
  59. package/src/client/actions/StageInstanceUpdate.js +30 -30
  60. package/src/client/actions/ThreadCreate.js +24 -24
  61. package/src/client/actions/ThreadDelete.js +32 -32
  62. package/src/client/actions/ThreadListSync.js +59 -59
  63. package/src/client/actions/ThreadMemberUpdate.js +30 -30
  64. package/src/client/actions/ThreadMembersUpdate.js +34 -34
  65. package/src/client/actions/TypingStart.js +29 -29
  66. package/src/client/actions/UserUpdate.js +35 -35
  67. package/src/client/actions/VoiceStateUpdate.js +50 -57
  68. package/src/client/actions/WebhooksUpdate.js +20 -20
  69. package/src/client/voice/ClientVoiceManager.js +151 -51
  70. package/src/client/voice/VoiceConnection.js +1249 -0
  71. package/src/client/voice/dispatcher/AnnexBDispatcher.js +120 -0
  72. package/src/client/voice/dispatcher/AudioDispatcher.js +145 -0
  73. package/src/client/voice/dispatcher/BaseDispatcher.js +459 -0
  74. package/src/client/voice/dispatcher/VPxDispatcher.js +54 -0
  75. package/src/client/voice/dispatcher/VideoDispatcher.js +68 -0
  76. package/src/client/voice/networking/VoiceUDPClient.js +173 -0
  77. package/src/client/voice/networking/VoiceWebSocket.js +286 -0
  78. package/src/client/voice/player/MediaPlayer.js +321 -0
  79. package/src/client/voice/player/processing/AnnexBNalSplitter.js +244 -0
  80. package/src/client/voice/player/processing/IvfSplitter.js +106 -0
  81. package/src/client/voice/player/processing/PCMInsertSilence.js +37 -0
  82. package/src/client/voice/receiver/PacketHandler.js +260 -0
  83. package/src/client/voice/receiver/Receiver.js +96 -0
  84. package/src/client/voice/receiver/Recorder.js +173 -0
  85. package/src/client/voice/util/Function.js +116 -0
  86. package/src/client/voice/util/PlayInterface.js +122 -0
  87. package/src/client/voice/util/Secretbox.js +64 -0
  88. package/src/client/voice/util/Silence.js +16 -0
  89. package/src/client/voice/util/Socket.js +62 -0
  90. package/src/client/voice/util/VolumeInterface.js +104 -0
  91. package/src/client/websocket/WebSocketManager.js +392 -392
  92. package/src/client/websocket/WebSocketShard.js +907 -906
  93. package/src/client/websocket/handlers/APPLICATION_COMMAND_CREATE.js +18 -18
  94. package/src/client/websocket/handlers/APPLICATION_COMMAND_DELETE.js +20 -20
  95. package/src/client/websocket/handlers/APPLICATION_COMMAND_PERMISSIONS_UPDATE.js +5 -5
  96. package/src/client/websocket/handlers/APPLICATION_COMMAND_UPDATE.js +20 -20
  97. package/src/client/websocket/handlers/AUTO_MODERATION_ACTION_EXECUTION.js +5 -5
  98. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_CREATE.js +5 -5
  99. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_DELETE.js +5 -5
  100. package/src/client/websocket/handlers/AUTO_MODERATION_RULE_UPDATE.js +5 -5
  101. package/src/client/websocket/handlers/CALL_CREATE.js +14 -14
  102. package/src/client/websocket/handlers/CALL_DELETE.js +11 -11
  103. package/src/client/websocket/handlers/CALL_UPDATE.js +11 -11
  104. package/src/client/websocket/handlers/CHANNEL_CREATE.js +5 -5
  105. package/src/client/websocket/handlers/CHANNEL_DELETE.js +5 -5
  106. package/src/client/websocket/handlers/CHANNEL_PINS_UPDATE.js +22 -22
  107. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_ADD.js +19 -19
  108. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_REMOVE.js +16 -16
  109. package/src/client/websocket/handlers/CHANNEL_UPDATE.js +16 -16
  110. package/src/client/websocket/handlers/GUILD_AUDIT_LOG_ENTRY_CREATE.js +5 -5
  111. package/src/client/websocket/handlers/GUILD_BAN_ADD.js +5 -5
  112. package/src/client/websocket/handlers/GUILD_BAN_REMOVE.js +5 -5
  113. package/src/client/websocket/handlers/GUILD_CREATE.js +52 -53
  114. package/src/client/websocket/handlers/GUILD_DELETE.js +5 -5
  115. package/src/client/websocket/handlers/GUILD_EMOJIS_UPDATE.js +5 -5
  116. package/src/client/websocket/handlers/GUILD_INTEGRATIONS_UPDATE.js +5 -5
  117. package/src/client/websocket/handlers/GUILD_MEMBERS_CHUNK.js +39 -39
  118. package/src/client/websocket/handlers/GUILD_MEMBER_ADD.js +20 -20
  119. package/src/client/websocket/handlers/GUILD_MEMBER_REMOVE.js +5 -5
  120. package/src/client/websocket/handlers/GUILD_MEMBER_UPDATE.js +5 -5
  121. package/src/client/websocket/handlers/GUILD_ROLE_CREATE.js +5 -5
  122. package/src/client/websocket/handlers/GUILD_ROLE_DELETE.js +5 -5
  123. package/src/client/websocket/handlers/GUILD_ROLE_UPDATE.js +5 -5
  124. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_CREATE.js +5 -5
  125. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_DELETE.js +5 -5
  126. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_UPDATE.js +5 -5
  127. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_ADD.js +5 -5
  128. package/src/client/websocket/handlers/GUILD_SCHEDULED_EVENT_USER_REMOVE.js +5 -5
  129. package/src/client/websocket/handlers/GUILD_STICKERS_UPDATE.js +5 -5
  130. package/src/client/websocket/handlers/GUILD_UPDATE.js +5 -5
  131. package/src/client/websocket/handlers/INTERACTION_MODAL_CREATE.js +12 -12
  132. package/src/client/websocket/handlers/INVITE_CREATE.js +5 -5
  133. package/src/client/websocket/handlers/INVITE_DELETE.js +5 -5
  134. package/src/client/websocket/handlers/MESSAGE_CREATE.js +5 -5
  135. package/src/client/websocket/handlers/MESSAGE_DELETE.js +5 -5
  136. package/src/client/websocket/handlers/MESSAGE_DELETE_BULK.js +5 -5
  137. package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_ADD.js +5 -0
  138. package/src/client/websocket/handlers/MESSAGE_POLL_VOTE_REMOVE.js +5 -0
  139. package/src/client/websocket/handlers/MESSAGE_REACTION_ADD.js +5 -5
  140. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE.js +5 -5
  141. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_ALL.js +5 -5
  142. package/src/client/websocket/handlers/MESSAGE_REACTION_REMOVE_EMOJI.js +5 -5
  143. package/src/client/websocket/handlers/MESSAGE_UPDATE.js +16 -16
  144. package/src/client/websocket/handlers/PRESENCE_UPDATE.js +5 -5
  145. package/src/client/websocket/handlers/READY.js +121 -80
  146. package/src/client/websocket/handlers/RELATIONSHIP_ADD.js +19 -19
  147. package/src/client/websocket/handlers/RELATIONSHIP_REMOVE.js +17 -17
  148. package/src/client/websocket/handlers/RELATIONSHIP_UPDATE.js +41 -41
  149. package/src/client/websocket/handlers/RESUMED.js +14 -14
  150. package/src/client/websocket/handlers/STAGE_INSTANCE_CREATE.js +5 -5
  151. package/src/client/websocket/handlers/STAGE_INSTANCE_DELETE.js +5 -5
  152. package/src/client/websocket/handlers/STAGE_INSTANCE_UPDATE.js +5 -5
  153. package/src/client/websocket/handlers/THREAD_CREATE.js +5 -5
  154. package/src/client/websocket/handlers/THREAD_DELETE.js +5 -5
  155. package/src/client/websocket/handlers/THREAD_LIST_SYNC.js +5 -5
  156. package/src/client/websocket/handlers/THREAD_MEMBERS_UPDATE.js +5 -5
  157. package/src/client/websocket/handlers/THREAD_MEMBER_UPDATE.js +5 -5
  158. package/src/client/websocket/handlers/THREAD_UPDATE.js +16 -16
  159. package/src/client/websocket/handlers/TYPING_START.js +5 -5
  160. package/src/client/websocket/handlers/USER_GUILD_SETTINGS_UPDATE.js +6 -6
  161. package/src/client/websocket/handlers/USER_NOTE_UPDATE.js +5 -5
  162. package/src/client/websocket/handlers/USER_REQUIRED_ACTION_UPDATE.js +78 -78
  163. package/src/client/websocket/handlers/USER_SETTINGS_UPDATE.js +5 -5
  164. package/src/client/websocket/handlers/USER_UPDATE.js +5 -5
  165. package/src/client/websocket/handlers/VOICE_CHANNEL_EFFECT_SEND.js +16 -0
  166. package/src/client/websocket/handlers/VOICE_CHANNEL_STATUS_UPDATE.js +12 -12
  167. package/src/client/websocket/handlers/VOICE_SERVER_UPDATE.js +6 -6
  168. package/src/client/websocket/handlers/VOICE_STATE_UPDATE.js +5 -5
  169. package/src/client/websocket/handlers/WEBHOOKS_UPDATE.js +5 -5
  170. package/src/client/websocket/handlers/index.js +84 -81
  171. package/src/errors/DJSError.js +61 -61
  172. package/src/errors/Messages.js +217 -182
  173. package/src/errors/index.js +4 -4
  174. package/src/index.js +172 -158
  175. package/src/managers/ApplicationCommandManager.js +264 -264
  176. package/src/managers/ApplicationCommandPermissionsManager.js +417 -417
  177. package/src/managers/AutoModerationRuleManager.js +296 -296
  178. package/src/managers/BaseGuildEmojiManager.js +80 -80
  179. package/src/managers/BaseManager.js +19 -19
  180. package/src/managers/BillingManager.js +66 -66
  181. package/src/managers/CachedManager.js +71 -71
  182. package/src/managers/ChannelManager.js +148 -138
  183. package/src/managers/ClientUserSettingManager.js +372 -372
  184. package/src/managers/DataManager.js +61 -61
  185. package/src/managers/GuildBanManager.js +250 -204
  186. package/src/managers/GuildChannelManager.js +488 -504
  187. package/src/managers/GuildEmojiManager.js +171 -171
  188. package/src/managers/GuildEmojiRoleManager.js +118 -118
  189. package/src/managers/GuildForumThreadManager.js +108 -108
  190. package/src/managers/GuildInviteManager.js +213 -213
  191. package/src/managers/GuildManager.js +338 -304
  192. package/src/managers/GuildMemberManager.js +599 -593
  193. package/src/managers/GuildMemberRoleManager.js +195 -191
  194. package/src/managers/GuildScheduledEventManager.js +314 -296
  195. package/src/managers/GuildSettingManager.js +155 -155
  196. package/src/managers/GuildStickerManager.js +179 -179
  197. package/src/managers/GuildTextThreadManager.js +98 -98
  198. package/src/managers/InteractionManager.js +39 -39
  199. package/src/managers/MessageManager.js +423 -391
  200. package/src/managers/PermissionOverwriteManager.js +164 -166
  201. package/src/managers/PresenceManager.js +71 -58
  202. package/src/managers/ReactionManager.js +67 -67
  203. package/src/managers/ReactionUserManager.js +73 -71
  204. package/src/managers/RelationshipManager.js +278 -265
  205. package/src/managers/RoleManager.js +448 -352
  206. package/src/managers/SessionManager.js +66 -0
  207. package/src/managers/StageInstanceManager.js +162 -162
  208. package/src/managers/ThreadManager.js +175 -174
  209. package/src/managers/ThreadMemberManager.js +186 -186
  210. package/src/managers/UserManager.js +136 -146
  211. package/src/managers/UserNoteManager.js +53 -53
  212. package/src/managers/VoiceStateManager.js +59 -37
  213. package/src/rest/APIRequest.js +154 -154
  214. package/src/rest/APIRouter.js +53 -53
  215. package/src/rest/DiscordAPIError.js +119 -104
  216. package/src/rest/HTTPError.js +62 -62
  217. package/src/rest/RESTManager.js +67 -62
  218. package/src/rest/RateLimitError.js +55 -55
  219. package/src/rest/RequestHandler.js +466 -444
  220. package/src/sharding/Shard.js +444 -443
  221. package/src/sharding/ShardClientUtil.js +279 -275
  222. package/src/sharding/ShardingManager.js +319 -318
  223. package/src/structures/AnonymousGuild.js +98 -98
  224. package/src/structures/ApplicationCommand.js +593 -593
  225. package/src/structures/ApplicationRoleConnectionMetadata.js +48 -48
  226. package/src/structures/AutoModerationActionExecution.js +89 -89
  227. package/src/structures/AutoModerationRule.js +294 -294
  228. package/src/structures/AutocompleteInteraction.js +107 -107
  229. package/src/structures/Base.js +43 -43
  230. package/src/structures/BaseCommandInteraction.js +211 -211
  231. package/src/structures/BaseGuild.js +116 -116
  232. package/src/structures/BaseGuildEmoji.js +56 -56
  233. package/src/structures/BaseGuildTextChannel.js +191 -191
  234. package/src/structures/BaseGuildVoiceChannel.js +241 -241
  235. package/src/structures/BaseMessageComponent.js +181 -114
  236. package/src/structures/ButtonInteraction.js +11 -11
  237. package/src/structures/CallState.js +63 -63
  238. package/src/structures/CategoryChannel.js +85 -85
  239. package/src/structures/Channel.js +284 -270
  240. package/src/structures/ClientPresence.js +77 -88
  241. package/src/structures/ClientUser.js +479 -450
  242. package/src/structures/CommandInteraction.js +41 -41
  243. package/src/structures/CommandInteractionOptionResolver.js +276 -276
  244. package/src/structures/ContainerComponent.js +68 -0
  245. package/src/structures/ContextMenuInteraction.js +65 -65
  246. package/src/structures/DMChannel.js +219 -217
  247. package/src/structures/DirectoryChannel.js +20 -20
  248. package/src/structures/Emoji.js +148 -148
  249. package/src/structures/FileComponent.js +49 -0
  250. package/src/structures/ForumChannel.js +31 -261
  251. package/src/structures/GroupDMChannel.js +394 -387
  252. package/src/structures/Guild.js +1643 -1608
  253. package/src/structures/GuildAuditLogs.js +746 -729
  254. package/src/structures/GuildBan.js +59 -59
  255. package/src/structures/GuildBoost.js +108 -108
  256. package/src/structures/GuildChannel.js +470 -468
  257. package/src/structures/GuildEmoji.js +161 -161
  258. package/src/structures/GuildMember.js +636 -568
  259. package/src/structures/GuildPreview.js +191 -191
  260. package/src/structures/GuildPreviewEmoji.js +27 -27
  261. package/src/structures/GuildScheduledEvent.js +536 -441
  262. package/src/structures/GuildTemplate.js +236 -236
  263. package/src/structures/Integration.js +188 -188
  264. package/src/structures/IntegrationApplication.js +96 -96
  265. package/src/structures/Interaction.js +290 -290
  266. package/src/structures/InteractionCollector.js +248 -248
  267. package/src/structures/InteractionWebhook.js +43 -43
  268. package/src/structures/Invite.js +358 -358
  269. package/src/structures/InviteGuild.js +23 -23
  270. package/src/structures/InviteStageInstance.js +86 -86
  271. package/src/structures/MediaChannel.js +11 -0
  272. package/src/structures/MediaGalleryComponent.js +41 -0
  273. package/src/structures/MediaGalleryItem.js +47 -0
  274. package/src/structures/Message.js +1252 -1236
  275. package/src/structures/MessageActionRow.js +105 -103
  276. package/src/structures/MessageAttachment.js +216 -204
  277. package/src/structures/MessageButton.js +166 -165
  278. package/src/structures/MessageCollector.js +146 -146
  279. package/src/structures/MessageComponentInteraction.js +120 -120
  280. package/src/structures/MessageContextMenuInteraction.js +20 -20
  281. package/src/structures/MessageEmbed.js +596 -586
  282. package/src/structures/MessageMentions.js +273 -273
  283. package/src/structures/MessagePayload.js +354 -316
  284. package/src/structures/MessageReaction.js +181 -171
  285. package/src/structures/MessageSelectMenu.js +141 -140
  286. package/src/structures/Modal.js +161 -174
  287. package/src/structures/ModalSubmitFieldsResolver.js +53 -53
  288. package/src/structures/ModalSubmitInteraction.js +119 -119
  289. package/src/structures/NewsChannel.js +32 -32
  290. package/src/structures/OAuth2Guild.js +28 -28
  291. package/src/structures/PermissionOverwrites.js +198 -196
  292. package/src/structures/Poll.js +108 -0
  293. package/src/structures/PollAnswer.js +88 -0
  294. package/src/structures/Presence.js +1105 -443
  295. package/src/structures/ReactionCollector.js +229 -229
  296. package/src/structures/ReactionEmoji.js +31 -31
  297. package/src/structures/Role.js +590 -531
  298. package/src/structures/SectionComponent.js +48 -0
  299. package/src/structures/SelectMenuInteraction.js +21 -21
  300. package/src/structures/SeparatorComponent.js +48 -0
  301. package/src/structures/Session.js +81 -0
  302. package/src/structures/StageChannel.js +104 -104
  303. package/src/structures/StageInstance.js +208 -208
  304. package/src/structures/Sticker.js +310 -310
  305. package/src/structures/StickerPack.js +95 -95
  306. package/src/structures/StoreChannel.js +56 -56
  307. package/src/structures/Team.js +118 -118
  308. package/src/structures/TeamMember.js +80 -71
  309. package/src/structures/TextChannel.js +33 -33
  310. package/src/structures/TextDisplayComponent.js +40 -0
  311. package/src/structures/TextInputComponent.js +132 -131
  312. package/src/structures/ThreadChannel.js +605 -607
  313. package/src/structures/ThreadMember.js +105 -105
  314. package/src/structures/ThreadOnlyChannel.js +249 -0
  315. package/src/structures/ThumbnailComponent.js +57 -0
  316. package/src/structures/Typing.js +74 -74
  317. package/src/structures/UnfurledMediaItem.js +29 -0
  318. package/src/structures/User.js +640 -509
  319. package/src/structures/UserContextMenuInteraction.js +29 -29
  320. package/src/structures/VoiceChannel.js +110 -110
  321. package/src/structures/VoiceChannelEffect.js +69 -0
  322. package/src/structures/VoiceRegion.js +53 -53
  323. package/src/structures/VoiceState.js +354 -341
  324. package/src/structures/WebEmbed.js +373 -373
  325. package/src/structures/Webhook.js +478 -467
  326. package/src/structures/WelcomeChannel.js +60 -60
  327. package/src/structures/WelcomeScreen.js +48 -48
  328. package/src/structures/Widget.js +87 -87
  329. package/src/structures/WidgetMember.js +99 -99
  330. package/src/structures/interfaces/Application.js +825 -313
  331. package/src/structures/interfaces/Collector.js +300 -300
  332. package/src/structures/interfaces/InteractionResponses.js +313 -313
  333. package/src/structures/interfaces/TextBasedChannel.js +759 -721
  334. package/src/util/APITypes.js +59 -0
  335. package/src/util/ActivityFlags.js +44 -44
  336. package/src/util/ApplicationFlags.js +76 -76
  337. package/src/util/AttachmentFlags.js +38 -38
  338. package/src/util/BitField.js +170 -170
  339. package/src/util/ChannelFlags.js +45 -45
  340. package/src/util/Constants.js +1914 -1760
  341. package/src/util/DataResolver.js +146 -145
  342. package/src/util/Formatters.js +228 -228
  343. package/src/util/GuildMemberFlags.js +43 -43
  344. package/src/util/Intents.js +74 -74
  345. package/src/util/InviteFlags.js +34 -29
  346. package/src/util/LimitedCollection.js +131 -131
  347. package/src/util/MessageFlags.js +63 -54
  348. package/src/util/Options.js +358 -342
  349. package/src/util/Permissions.js +202 -192
  350. package/src/util/PremiumUsageFlags.js +31 -31
  351. package/src/util/PurchasedFlags.js +33 -33
  352. package/src/util/RemoteAuth.js +382 -379
  353. package/src/util/RoleFlags.js +37 -37
  354. package/src/util/SnowflakeUtil.js +92 -92
  355. package/src/util/Speaking.js +33 -0
  356. package/src/util/Sweepers.js +466 -466
  357. package/src/util/SystemChannelFlags.js +55 -55
  358. package/src/util/ThreadMemberFlags.js +30 -30
  359. package/src/util/UserFlags.js +104 -104
  360. package/src/util/Util.js +1048 -803
  361. package/typings/enums.d.ts +439 -291
  362. package/typings/index.d.ts +8247 -7390
  363. package/typings/rawDataTypes.d.ts +403 -342
  364. package/src/structures/RichPresence.js +0 -702
@@ -1,443 +1,444 @@
1
- 'use strict';
2
-
3
- const EventEmitter = require('node:events');
4
- const path = require('node:path');
5
- const process = require('node:process');
6
- const { setTimeout } = require('node:timers');
7
- const { setTimeout: sleep } = require('node:timers/promises');
8
- const { Error } = require('../errors');
9
- const Util = require('../util/Util');
10
- let childProcess = null;
11
- let Worker = null;
12
-
13
- /**
14
- * A self-contained shard created by the {@link ShardingManager}. Each one has a {@link ChildProcess} that contains
15
- * an instance of the bot and its {@link Client}. When its child process/worker exits for any reason, the shard will
16
- * spawn a new one to replace it as necessary.
17
- * @extends {EventEmitter}
18
- */
19
- class Shard extends EventEmitter {
20
- constructor(manager, id) {
21
- super();
22
-
23
- if (manager.mode === 'process') childProcess = require('node:child_process');
24
- else if (manager.mode === 'worker') Worker = require('node:worker_threads').Worker;
25
-
26
- /**
27
- * Manager that created the shard
28
- * @type {ShardingManager}
29
- */
30
- this.manager = manager;
31
-
32
- /**
33
- * The shard's id in the manager
34
- * @type {number}
35
- */
36
- this.id = id;
37
-
38
- /**
39
- * Arguments for the shard's process (only when {@link ShardingManager#mode} is `process`)
40
- * @type {string[]}
41
- */
42
- this.args = manager.shardArgs ?? [];
43
-
44
- /**
45
- * Arguments for the shard's process executable (only when {@link ShardingManager#mode} is `process`)
46
- * @type {string[]}
47
- */
48
- this.execArgv = manager.execArgv;
49
-
50
- /**
51
- * Environment variables for the shard's process, or workerData for the shard's worker
52
- * @type {Object}
53
- */
54
- this.env = Object.assign({}, process.env, {
55
- SHARDING_MANAGER: true,
56
- SHARDS: this.id,
57
- SHARD_COUNT: this.manager.totalShards,
58
- DISCORD_TOKEN: this.manager.token,
59
- });
60
-
61
- /**
62
- * Whether the shard's {@link Client} is ready
63
- * @type {boolean}
64
- */
65
- this.ready = false;
66
-
67
- /**
68
- * Process of the shard (if {@link ShardingManager#mode} is `process`)
69
- * @type {?ChildProcess}
70
- */
71
- this.process = null;
72
-
73
- /**
74
- * Worker of the shard (if {@link ShardingManager#mode} is `worker`)
75
- * @type {?Worker}
76
- */
77
- this.worker = null;
78
-
79
- /**
80
- * Ongoing promises for calls to {@link Shard#eval}, mapped by the `script` they were called with
81
- * @type {Map<string, Promise>}
82
- * @private
83
- */
84
- this._evals = new Map();
85
-
86
- /**
87
- * Ongoing promises for calls to {@link Shard#fetchClientValue}, mapped by the `prop` they were called with
88
- * @type {Map<string, Promise>}
89
- * @private
90
- */
91
- this._fetches = new Map();
92
-
93
- /**
94
- * Listener function for the {@link ChildProcess}' `exit` event
95
- * @type {Function}
96
- * @private
97
- */
98
- this._exitListener = null;
99
- }
100
-
101
- /**
102
- * Forks a child process or creates a worker thread for the shard.
103
- * <warn>You should not need to call this manually.</warn>
104
- * @param {number} [timeout=30000] The amount in milliseconds to wait until the {@link Client} has become ready
105
- * before resolving (`-1` or `Infinity` for no wait)
106
- * @returns {Promise<ChildProcess>}
107
- */
108
- spawn(timeout = 30_000) {
109
- if (this.process) throw new Error('SHARDING_PROCESS_EXISTS', this.id);
110
- if (this.worker) throw new Error('SHARDING_WORKER_EXISTS', this.id);
111
-
112
- this._exitListener = this._handleExit.bind(this, undefined, timeout);
113
-
114
- if (this.manager.mode === 'process') {
115
- this.process = childProcess
116
- .fork(path.resolve(this.manager.file), this.args, {
117
- env: this.env,
118
- execArgv: this.execArgv,
119
- })
120
- .on('message', this._handleMessage.bind(this))
121
- .on('exit', this._exitListener);
122
- } else if (this.manager.mode === 'worker') {
123
- this.worker = new Worker(path.resolve(this.manager.file), { workerData: this.env })
124
- .on('message', this._handleMessage.bind(this))
125
- .on('exit', this._exitListener);
126
- }
127
-
128
- this._evals.clear();
129
- this._fetches.clear();
130
-
131
- const child = this.process ?? this.worker;
132
-
133
- /**
134
- * Emitted upon the creation of the shard's child process/worker.
135
- * @event Shard#spawn
136
- * @param {ChildProcess|Worker} process Child process/worker that was created
137
- */
138
- this.emit('spawn', child);
139
-
140
- if (timeout === -1 || timeout === Infinity) return Promise.resolve(child);
141
- return new Promise((resolve, reject) => {
142
- const cleanup = () => {
143
- clearTimeout(spawnTimeoutTimer);
144
- this.off('ready', onReady);
145
- this.off('disconnect', onDisconnect);
146
- this.off('death', onDeath);
147
- };
148
-
149
- const onReady = () => {
150
- cleanup();
151
- resolve(child);
152
- };
153
-
154
- const onDisconnect = () => {
155
- cleanup();
156
- reject(new Error('SHARDING_READY_DISCONNECTED', this.id));
157
- };
158
-
159
- const onDeath = () => {
160
- cleanup();
161
- reject(new Error('SHARDING_READY_DIED', this.id));
162
- };
163
-
164
- const onTimeout = () => {
165
- cleanup();
166
- reject(new Error('SHARDING_READY_TIMEOUT', this.id));
167
- };
168
-
169
- const spawnTimeoutTimer = setTimeout(onTimeout, timeout);
170
- this.once('ready', onReady);
171
- this.once('disconnect', onDisconnect);
172
- this.once('death', onDeath);
173
- });
174
- }
175
-
176
- /**
177
- * Immediately kills the shard's process/worker and does not restart it.
178
- */
179
- kill() {
180
- if (this.process) {
181
- this.process.removeListener('exit', this._exitListener);
182
- this.process.kill();
183
- } else {
184
- this.worker.removeListener('exit', this._exitListener);
185
- this.worker.terminate();
186
- }
187
-
188
- this._handleExit(false);
189
- }
190
-
191
- /**
192
- * Options used to respawn a shard.
193
- * @typedef {Object} ShardRespawnOptions
194
- * @property {number} [delay=500] How long to wait between killing the process/worker and
195
- * restarting it (in milliseconds)
196
- * @property {number} [timeout=30000] The amount in milliseconds to wait until the {@link Client}
197
- * has become ready before resolving (`-1` or `Infinity` for no wait)
198
- */
199
-
200
- /**
201
- * Kills and restarts the shard's process/worker.
202
- * @param {ShardRespawnOptions} [options] Options for respawning the shard
203
- * @returns {Promise<ChildProcess>}
204
- */
205
- async respawn({ delay = 500, timeout = 30_000 } = {}) {
206
- this.kill();
207
- if (delay > 0) await sleep(delay);
208
- return this.spawn(timeout);
209
- }
210
-
211
- /**
212
- * Sends a message to the shard's process/worker.
213
- * @param {*} message Message to send to the shard
214
- * @returns {Promise<Shard>}
215
- */
216
- send(message) {
217
- return new Promise((resolve, reject) => {
218
- if (this.process) {
219
- this.process.send(message, err => {
220
- if (err) reject(err);
221
- else resolve(this);
222
- });
223
- } else {
224
- this.worker.postMessage(message);
225
- resolve(this);
226
- }
227
- });
228
- }
229
-
230
- /**
231
- * Fetches a client property value of the shard.
232
- * @param {string} prop Name of the client property to get, using periods for nesting
233
- * @returns {Promise<*>}
234
- * @example
235
- * shard.fetchClientValue('guilds.cache.size')
236
- * .then(count => console.log(`${count} guilds in shard ${shard.id}`))
237
- * .catch(console.error);
238
- */
239
- fetchClientValue(prop) {
240
- // Shard is dead (maybe respawning), don't cache anything and error immediately
241
- if (!this.process && !this.worker) return Promise.reject(new Error('SHARDING_NO_CHILD_EXISTS', this.id));
242
-
243
- // Cached promise from previous call
244
- if (this._fetches.has(prop)) return this._fetches.get(prop);
245
-
246
- const promise = new Promise((resolve, reject) => {
247
- const child = this.process ?? this.worker;
248
-
249
- const listener = message => {
250
- if (message?._fetchProp !== prop) return;
251
- child.removeListener('message', listener);
252
- this.decrementMaxListeners(child);
253
- this._fetches.delete(prop);
254
- if (!message._error) resolve(message._result);
255
- else reject(Util.makeError(message._error));
256
- };
257
-
258
- this.incrementMaxListeners(child);
259
- child.on('message', listener);
260
-
261
- this.send({ _fetchProp: prop }).catch(err => {
262
- child.removeListener('message', listener);
263
- this.decrementMaxListeners(child);
264
- this._fetches.delete(prop);
265
- reject(err);
266
- });
267
- });
268
-
269
- this._fetches.set(prop, promise);
270
- return promise;
271
- }
272
-
273
- /**
274
- * Evaluates a script or function on the shard, in the context of the {@link Client}.
275
- * @param {string|Function} script JavaScript to run on the shard
276
- * @param {*} [context] The context for the eval
277
- * @returns {Promise<*>} Result of the script execution
278
- */
279
- eval(script, context) {
280
- // Stringify the script if it's a Function
281
- const _eval = typeof script === 'function' ? `(${script})(this, ${JSON.stringify(context)})` : script;
282
-
283
- // Shard is dead (maybe respawning), don't cache anything and error immediately
284
- if (!this.process && !this.worker) return Promise.reject(new Error('SHARDING_NO_CHILD_EXISTS', this.id));
285
-
286
- // Cached promise from previous call
287
- if (this._evals.has(_eval)) return this._evals.get(_eval);
288
-
289
- const promise = new Promise((resolve, reject) => {
290
- const child = this.process ?? this.worker;
291
-
292
- const listener = message => {
293
- if (message?._eval !== _eval) return;
294
- child.removeListener('message', listener);
295
- this.decrementMaxListeners(child);
296
- this._evals.delete(_eval);
297
- if (!message._error) resolve(message._result);
298
- else reject(Util.makeError(message._error));
299
- };
300
-
301
- this.incrementMaxListeners(child);
302
- child.on('message', listener);
303
-
304
- this.send({ _eval }).catch(err => {
305
- child.removeListener('message', listener);
306
- this.decrementMaxListeners(child);
307
- this._evals.delete(_eval);
308
- reject(err);
309
- });
310
- });
311
-
312
- this._evals.set(_eval, promise);
313
- return promise;
314
- }
315
-
316
- /**
317
- * Handles a message received from the child process/worker.
318
- * @param {*} message Message received
319
- * @private
320
- */
321
- _handleMessage(message) {
322
- if (message) {
323
- // Shard is ready
324
- if (message._ready) {
325
- this.ready = true;
326
- /**
327
- * Emitted upon the shard's {@link Client#event:shardReady} event.
328
- * @event Shard#ready
329
- */
330
- this.emit('ready');
331
- return;
332
- }
333
-
334
- // Shard has disconnected
335
- if (message._disconnect) {
336
- this.ready = false;
337
- /**
338
- * Emitted upon the shard's {@link Client#event:shardDisconnect} event.
339
- * @event Shard#disconnect
340
- */
341
- this.emit('disconnect');
342
- return;
343
- }
344
-
345
- // Shard is attempting to reconnect
346
- if (message._reconnecting) {
347
- this.ready = false;
348
- /**
349
- * Emitted upon the shard's {@link Client#event:shardReconnecting} event.
350
- * @event Shard#reconnecting
351
- */
352
- this.emit('reconnecting');
353
- return;
354
- }
355
-
356
- // Shard is requesting a property fetch
357
- if (message._sFetchProp) {
358
- const resp = { _sFetchProp: message._sFetchProp, _sFetchPropShard: message._sFetchPropShard };
359
- this.manager.fetchClientValues(message._sFetchProp, message._sFetchPropShard).then(
360
- results => this.send({ ...resp, _result: results }),
361
- err => this.send({ ...resp, _error: Util.makePlainError(err) }),
362
- );
363
- return;
364
- }
365
-
366
- // Shard is requesting an eval broadcast
367
- if (message._sEval) {
368
- const resp = { _sEval: message._sEval, _sEvalShard: message._sEvalShard };
369
- this.manager._performOnShards('eval', [message._sEval], message._sEvalShard).then(
370
- results => this.send({ ...resp, _result: results }),
371
- err => this.send({ ...resp, _error: Util.makePlainError(err) }),
372
- );
373
- return;
374
- }
375
-
376
- // Shard is requesting a respawn of all shards
377
- if (message._sRespawnAll) {
378
- const { shardDelay, respawnDelay, timeout } = message._sRespawnAll;
379
- this.manager.respawnAll({ shardDelay, respawnDelay, timeout }).catch(() => {
380
- // Do nothing
381
- });
382
- return;
383
- }
384
- }
385
-
386
- /**
387
- * Emitted upon receiving a message from the child process/worker.
388
- * @event Shard#message
389
- * @param {*} message Message that was received
390
- */
391
- this.emit('message', message);
392
- }
393
-
394
- /**
395
- * Handles the shard's process/worker exiting.
396
- * @param {boolean} [respawn=this.manager.respawn] Whether to spawn the shard again
397
- * @param {number} [timeout] The amount in milliseconds to wait until the {@link Client}
398
- * has become ready (`-1` or `Infinity` for no wait)
399
- * @private
400
- */
401
- _handleExit(respawn = this.manager.respawn, timeout) {
402
- /**
403
- * Emitted upon the shard's child process/worker exiting.
404
- * @event Shard#death
405
- * @param {ChildProcess|Worker} process Child process/worker that exited
406
- */
407
- this.emit('death', this.process ?? this.worker);
408
-
409
- this.ready = false;
410
- this.process = null;
411
- this.worker = null;
412
- this._evals.clear();
413
- this._fetches.clear();
414
-
415
- if (respawn) this.spawn(timeout).catch(err => this.emit('error', err));
416
- }
417
-
418
- /**
419
- * Increments max listeners by one for a given emitter, if they are not zero.
420
- * @param {EventEmitter|process} emitter The emitter that emits the events.
421
- * @private
422
- */
423
- incrementMaxListeners(emitter) {
424
- const maxListeners = emitter.getMaxListeners();
425
- if (maxListeners !== 0) {
426
- emitter.setMaxListeners(maxListeners + 1);
427
- }
428
- }
429
-
430
- /**
431
- * Decrements max listeners by one for a given emitter, if they are not zero.
432
- * @param {EventEmitter|process} emitter The emitter that emits the events.
433
- * @private
434
- */
435
- decrementMaxListeners(emitter) {
436
- const maxListeners = emitter.getMaxListeners();
437
- if (maxListeners !== 0) {
438
- emitter.setMaxListeners(maxListeners - 1);
439
- }
440
- }
441
- }
442
-
443
- module.exports = Shard;
1
+ 'use strict';
2
+
3
+ const EventEmitter = require('node:events');
4
+ const path = require('node:path');
5
+ const process = require('node:process');
6
+ const { setTimeout } = require('node:timers');
7
+ const { setTimeout: sleep } = require('node:timers/promises');
8
+ const { Error } = require('../errors');
9
+ const Util = require('../util/Util');
10
+ let childProcess = null;
11
+ let Worker = null;
12
+
13
+ /**
14
+ * A self-contained shard created by the {@link ShardingManager}. Each one has a {@link ChildProcess} that contains
15
+ * an instance of the bot and its {@link Client}. When its child process/worker exits for any reason, the shard will
16
+ * spawn a new one to replace it as necessary.
17
+ * @extends {EventEmitter}
18
+ * @deprecated
19
+ */
20
+ class Shard extends EventEmitter {
21
+ constructor(manager, id) {
22
+ super();
23
+
24
+ if (manager.mode === 'process') childProcess = require('node:child_process');
25
+ else if (manager.mode === 'worker') Worker = require('node:worker_threads').Worker;
26
+
27
+ /**
28
+ * Manager that created the shard
29
+ * @type {ShardingManager}
30
+ */
31
+ this.manager = manager;
32
+
33
+ /**
34
+ * The shard's id in the manager
35
+ * @type {number}
36
+ */
37
+ this.id = id;
38
+
39
+ /**
40
+ * Arguments for the shard's process (only when {@link ShardingManager#mode} is `process`)
41
+ * @type {string[]}
42
+ */
43
+ this.args = manager.shardArgs ?? [];
44
+
45
+ /**
46
+ * Arguments for the shard's process executable (only when {@link ShardingManager#mode} is `process`)
47
+ * @type {string[]}
48
+ */
49
+ this.execArgv = manager.execArgv;
50
+
51
+ /**
52
+ * Environment variables for the shard's process, or workerData for the shard's worker
53
+ * @type {Object}
54
+ */
55
+ this.env = Object.assign({}, process.env, {
56
+ SHARDING_MANAGER: true,
57
+ SHARDS: this.id,
58
+ SHARD_COUNT: this.manager.totalShards,
59
+ DISCORD_TOKEN: this.manager.token,
60
+ });
61
+
62
+ /**
63
+ * Whether the shard's {@link Client} is ready
64
+ * @type {boolean}
65
+ */
66
+ this.ready = false;
67
+
68
+ /**
69
+ * Process of the shard (if {@link ShardingManager#mode} is `process`)
70
+ * @type {?ChildProcess}
71
+ */
72
+ this.process = null;
73
+
74
+ /**
75
+ * Worker of the shard (if {@link ShardingManager#mode} is `worker`)
76
+ * @type {?Worker}
77
+ */
78
+ this.worker = null;
79
+
80
+ /**
81
+ * Ongoing promises for calls to {@link Shard#eval}, mapped by the `script` they were called with
82
+ * @type {Map<string, Promise>}
83
+ * @private
84
+ */
85
+ this._evals = new Map();
86
+
87
+ /**
88
+ * Ongoing promises for calls to {@link Shard#fetchClientValue}, mapped by the `prop` they were called with
89
+ * @type {Map<string, Promise>}
90
+ * @private
91
+ */
92
+ this._fetches = new Map();
93
+
94
+ /**
95
+ * Listener function for the {@link ChildProcess}' `exit` event
96
+ * @type {Function}
97
+ * @private
98
+ */
99
+ this._exitListener = null;
100
+ }
101
+
102
+ /**
103
+ * Forks a child process or creates a worker thread for the shard.
104
+ * <warn>You should not need to call this manually.</warn>
105
+ * @param {number} [timeout=30000] The amount in milliseconds to wait until the {@link Client} has become ready
106
+ * before resolving (`-1` or `Infinity` for no wait)
107
+ * @returns {Promise<ChildProcess>}
108
+ */
109
+ spawn(timeout = 30_000) {
110
+ if (this.process) throw new Error('SHARDING_PROCESS_EXISTS', this.id);
111
+ if (this.worker) throw new Error('SHARDING_WORKER_EXISTS', this.id);
112
+
113
+ this._exitListener = this._handleExit.bind(this, undefined, timeout);
114
+
115
+ if (this.manager.mode === 'process') {
116
+ this.process = childProcess
117
+ .fork(path.resolve(this.manager.file), this.args, {
118
+ env: this.env,
119
+ execArgv: this.execArgv,
120
+ })
121
+ .on('message', this._handleMessage.bind(this))
122
+ .on('exit', this._exitListener);
123
+ } else if (this.manager.mode === 'worker') {
124
+ this.worker = new Worker(path.resolve(this.manager.file), { workerData: this.env })
125
+ .on('message', this._handleMessage.bind(this))
126
+ .on('exit', this._exitListener);
127
+ }
128
+
129
+ this._evals.clear();
130
+ this._fetches.clear();
131
+
132
+ const child = this.process ?? this.worker;
133
+
134
+ /**
135
+ * Emitted upon the creation of the shard's child process/worker.
136
+ * @event Shard#spawn
137
+ * @param {ChildProcess|Worker} process Child process/worker that was created
138
+ */
139
+ this.emit('spawn', child);
140
+
141
+ if (timeout === -1 || timeout === Infinity) return Promise.resolve(child);
142
+ return new Promise((resolve, reject) => {
143
+ const cleanup = () => {
144
+ clearTimeout(spawnTimeoutTimer);
145
+ this.off('ready', onReady);
146
+ this.off('disconnect', onDisconnect);
147
+ this.off('death', onDeath);
148
+ };
149
+
150
+ const onReady = () => {
151
+ cleanup();
152
+ resolve(child);
153
+ };
154
+
155
+ const onDisconnect = () => {
156
+ cleanup();
157
+ reject(new Error('SHARDING_READY_DISCONNECTED', this.id));
158
+ };
159
+
160
+ const onDeath = () => {
161
+ cleanup();
162
+ reject(new Error('SHARDING_READY_DIED', this.id));
163
+ };
164
+
165
+ const onTimeout = () => {
166
+ cleanup();
167
+ reject(new Error('SHARDING_READY_TIMEOUT', this.id));
168
+ };
169
+
170
+ const spawnTimeoutTimer = setTimeout(onTimeout, timeout);
171
+ this.once('ready', onReady);
172
+ this.once('disconnect', onDisconnect);
173
+ this.once('death', onDeath);
174
+ });
175
+ }
176
+
177
+ /**
178
+ * Immediately kills the shard's process/worker and does not restart it.
179
+ */
180
+ kill() {
181
+ if (this.process) {
182
+ this.process.removeListener('exit', this._exitListener);
183
+ this.process.kill();
184
+ } else {
185
+ this.worker.removeListener('exit', this._exitListener);
186
+ this.worker.terminate();
187
+ }
188
+
189
+ this._handleExit(false);
190
+ }
191
+
192
+ /**
193
+ * Options used to respawn a shard.
194
+ * @typedef {Object} ShardRespawnOptions
195
+ * @property {number} [delay=500] How long to wait between killing the process/worker and
196
+ * restarting it (in milliseconds)
197
+ * @property {number} [timeout=30000] The amount in milliseconds to wait until the {@link Client}
198
+ * has become ready before resolving (`-1` or `Infinity` for no wait)
199
+ */
200
+
201
+ /**
202
+ * Kills and restarts the shard's process/worker.
203
+ * @param {ShardRespawnOptions} [options] Options for respawning the shard
204
+ * @returns {Promise<ChildProcess>}
205
+ */
206
+ async respawn({ delay = 500, timeout = 30_000 } = {}) {
207
+ this.kill();
208
+ if (delay > 0) await sleep(delay);
209
+ return this.spawn(timeout);
210
+ }
211
+
212
+ /**
213
+ * Sends a message to the shard's process/worker.
214
+ * @param {*} message Message to send to the shard
215
+ * @returns {Promise<Shard>}
216
+ */
217
+ send(message) {
218
+ return new Promise((resolve, reject) => {
219
+ if (this.process) {
220
+ this.process.send(message, err => {
221
+ if (err) reject(err);
222
+ else resolve(this);
223
+ });
224
+ } else {
225
+ this.worker.postMessage(message);
226
+ resolve(this);
227
+ }
228
+ });
229
+ }
230
+
231
+ /**
232
+ * Fetches a client property value of the shard.
233
+ * @param {string} prop Name of the client property to get, using periods for nesting
234
+ * @returns {Promise<*>}
235
+ * @example
236
+ * shard.fetchClientValue('guilds.cache.size')
237
+ * .then(count => console.log(`${count} guilds in shard ${shard.id}`))
238
+ * .catch(console.error);
239
+ */
240
+ async fetchClientValue(prop) {
241
+ // Shard is dead (maybe respawning), don't cache anything and error immediately
242
+ if (!this.process && !this.worker) throw new Error('SHARDING_NO_CHILD_EXISTS', this.id);
243
+
244
+ // Cached promise from previous call
245
+ if (this._fetches.has(prop)) return this._fetches.get(prop);
246
+
247
+ const promise = new Promise((resolve, reject) => {
248
+ const child = this.process ?? this.worker;
249
+
250
+ const listener = message => {
251
+ if (message?._fetchProp !== prop) return;
252
+ child.removeListener('message', listener);
253
+ this.decrementMaxListeners(child);
254
+ this._fetches.delete(prop);
255
+ if (!message._error) resolve(message._result);
256
+ else reject(Util.makeError(message._error));
257
+ };
258
+
259
+ this.incrementMaxListeners(child);
260
+ child.on('message', listener);
261
+
262
+ this.send({ _fetchProp: prop }).catch(err => {
263
+ child.removeListener('message', listener);
264
+ this.decrementMaxListeners(child);
265
+ this._fetches.delete(prop);
266
+ reject(err);
267
+ });
268
+ });
269
+
270
+ this._fetches.set(prop, promise);
271
+ return promise;
272
+ }
273
+
274
+ /**
275
+ * Evaluates a script or function on the shard, in the context of the {@link Client}.
276
+ * @param {string|Function} script JavaScript to run on the shard
277
+ * @param {*} [context] The context for the eval
278
+ * @returns {Promise<*>} Result of the script execution
279
+ */
280
+ async eval(script, context) {
281
+ // Stringify the script if it's a Function
282
+ const _eval = typeof script === 'function' ? `(${script})(this, ${JSON.stringify(context)})` : script;
283
+
284
+ // Shard is dead (maybe respawning), don't cache anything and error immediately
285
+ if (!this.process && !this.worker) throw new Error('SHARDING_NO_CHILD_EXISTS', this.id);
286
+
287
+ // Cached promise from previous call
288
+ if (this._evals.has(_eval)) return this._evals.get(_eval);
289
+
290
+ const promise = new Promise((resolve, reject) => {
291
+ const child = this.process ?? this.worker;
292
+
293
+ const listener = message => {
294
+ if (message?._eval !== _eval) return;
295
+ child.removeListener('message', listener);
296
+ this.decrementMaxListeners(child);
297
+ this._evals.delete(_eval);
298
+ if (!message._error) resolve(message._result);
299
+ else reject(Util.makeError(message._error));
300
+ };
301
+
302
+ this.incrementMaxListeners(child);
303
+ child.on('message', listener);
304
+
305
+ this.send({ _eval }).catch(err => {
306
+ child.removeListener('message', listener);
307
+ this.decrementMaxListeners(child);
308
+ this._evals.delete(_eval);
309
+ reject(err);
310
+ });
311
+ });
312
+
313
+ this._evals.set(_eval, promise);
314
+ return promise;
315
+ }
316
+
317
+ /**
318
+ * Handles a message received from the child process/worker.
319
+ * @param {*} message Message received
320
+ * @private
321
+ */
322
+ _handleMessage(message) {
323
+ if (message) {
324
+ // Shard is ready
325
+ if (message._ready) {
326
+ this.ready = true;
327
+ /**
328
+ * Emitted upon the shard's {@link Client#event:shardReady} event.
329
+ * @event Shard#ready
330
+ */
331
+ this.emit('ready');
332
+ return;
333
+ }
334
+
335
+ // Shard has disconnected
336
+ if (message._disconnect) {
337
+ this.ready = false;
338
+ /**
339
+ * Emitted upon the shard's {@link Client#event:shardDisconnect} event.
340
+ * @event Shard#disconnect
341
+ */
342
+ this.emit('disconnect');
343
+ return;
344
+ }
345
+
346
+ // Shard is attempting to reconnect
347
+ if (message._reconnecting) {
348
+ this.ready = false;
349
+ /**
350
+ * Emitted upon the shard's {@link Client#event:shardReconnecting} event.
351
+ * @event Shard#reconnecting
352
+ */
353
+ this.emit('reconnecting');
354
+ return;
355
+ }
356
+
357
+ // Shard is requesting a property fetch
358
+ if (message._sFetchProp) {
359
+ const resp = { _sFetchProp: message._sFetchProp, _sFetchPropShard: message._sFetchPropShard };
360
+ this.manager.fetchClientValues(message._sFetchProp, message._sFetchPropShard).then(
361
+ results => this.send({ ...resp, _result: results }),
362
+ err => this.send({ ...resp, _error: Util.makePlainError(err) }),
363
+ );
364
+ return;
365
+ }
366
+
367
+ // Shard is requesting an eval broadcast
368
+ if (message._sEval) {
369
+ const resp = { _sEval: message._sEval, _sEvalShard: message._sEvalShard };
370
+ this.manager._performOnShards('eval', [message._sEval], message._sEvalShard).then(
371
+ results => this.send({ ...resp, _result: results }),
372
+ err => this.send({ ...resp, _error: Util.makePlainError(err) }),
373
+ );
374
+ return;
375
+ }
376
+
377
+ // Shard is requesting a respawn of all shards
378
+ if (message._sRespawnAll) {
379
+ const { shardDelay, respawnDelay, timeout } = message._sRespawnAll;
380
+ this.manager.respawnAll({ shardDelay, respawnDelay, timeout }).catch(() => {
381
+ // Do nothing
382
+ });
383
+ return;
384
+ }
385
+ }
386
+
387
+ /**
388
+ * Emitted upon receiving a message from the child process/worker.
389
+ * @event Shard#message
390
+ * @param {*} message Message that was received
391
+ */
392
+ this.emit('message', message);
393
+ }
394
+
395
+ /**
396
+ * Handles the shard's process/worker exiting.
397
+ * @param {boolean} [respawn=this.manager.respawn] Whether to spawn the shard again
398
+ * @param {number} [timeout] The amount in milliseconds to wait until the {@link Client}
399
+ * has become ready (`-1` or `Infinity` for no wait)
400
+ * @private
401
+ */
402
+ _handleExit(respawn = this.manager.respawn, timeout) {
403
+ /**
404
+ * Emitted upon the shard's child process/worker exiting.
405
+ * @event Shard#death
406
+ * @param {ChildProcess|Worker} process Child process/worker that exited
407
+ */
408
+ this.emit('death', this.process ?? this.worker);
409
+
410
+ this.ready = false;
411
+ this.process = null;
412
+ this.worker = null;
413
+ this._evals.clear();
414
+ this._fetches.clear();
415
+
416
+ if (respawn) this.spawn(timeout).catch(err => this.emit('error', err));
417
+ }
418
+
419
+ /**
420
+ * Increments max listeners by one for a given emitter, if they are not zero.
421
+ * @param {EventEmitter|process} emitter The emitter that emits the events.
422
+ * @private
423
+ */
424
+ incrementMaxListeners(emitter) {
425
+ const maxListeners = emitter.getMaxListeners();
426
+ if (maxListeners !== 0) {
427
+ emitter.setMaxListeners(maxListeners + 1);
428
+ }
429
+ }
430
+
431
+ /**
432
+ * Decrements max listeners by one for a given emitter, if they are not zero.
433
+ * @param {EventEmitter|process} emitter The emitter that emits the events.
434
+ * @private
435
+ */
436
+ decrementMaxListeners(emitter) {
437
+ const maxListeners = emitter.getMaxListeners();
438
+ if (maxListeners !== 0) {
439
+ emitter.setMaxListeners(maxListeners - 1);
440
+ }
441
+ }
442
+ }
443
+
444
+ module.exports = Shard;