@wolfstar/plugin-gateway 0.14.0 → 0.15.0-next-20261017094307

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/dist/esm/index.js CHANGED
@@ -16189,6 +16189,19 @@ var Typing = class extends Structure {
16189
16189
  //#endregion
16190
16190
  //#region src/util/events.ts
16191
16191
  /**
16192
+ * The {@link GatewayOnlyEventName} events, for telling them from {@link DispatchEventName} ones at runtime.
16193
+ */
16194
+ const gatewayOnlyEvents = /* @__PURE__ */ new Set([
16195
+ "dispatch",
16196
+ "shardReady",
16197
+ "clientReady",
16198
+ "shardResume",
16199
+ "shardClose",
16200
+ "shardError",
16201
+ "cacheError",
16202
+ "cacheSweep"
16203
+ ]);
16204
+ /**
16192
16205
  * The name of every event a {@link GatewayClient} emits, mirroring the keys of {@link GatewayEventMap}, like
16193
16206
  * `@wolfstar/http-framework`'s own `Events`.
16194
16207
  *
@@ -17975,6 +17988,7 @@ var GatewayClient = class extends Client {
17975
17988
  */
17976
17989
  clientReadyTimestamp = null;
17977
17990
  #queue = new DispatchQueue();
17991
+ #dispatchForwarders = 0;
17978
17992
  #caches = /* @__PURE__ */ new Map();
17979
17993
  #cacheConstructor;
17980
17994
  #cacheOptions;
@@ -18351,6 +18365,29 @@ var GatewayClient = class extends Client {
18351
18365
  return emitAndWait(this, event, args);
18352
18366
  }
18353
18367
  /**
18368
+ * Whether the dispatches of this client are forwarded to workers, which replay them on their own listeners, see
18369
+ * `forwardGatewayDispatches` from `@wolfstar/plugin-broker`. Listeners registered with
18370
+ * {@link RegisterAsDispatchListener} stay idle on a client that does.
18371
+ */
18372
+ get forwardsDispatches() {
18373
+ return this.#dispatchForwarders > 0;
18374
+ }
18375
+ /**
18376
+ * Marks this client as forwarding its dispatches, until the returned function is called. Called by
18377
+ * `forwardGatewayDispatches`, it counts, so the client keeps forwarding while any forwarder is left.
18378
+ *
18379
+ * @returns A function to undo the mark, which does nothing when called again.
18380
+ */
18381
+ markDispatchesForwarded() {
18382
+ this.#dispatchForwarders++;
18383
+ let marked = true;
18384
+ return () => {
18385
+ if (!marked) return;
18386
+ marked = false;
18387
+ this.#dispatchForwarders--;
18388
+ };
18389
+ }
18390
+ /**
18354
18391
  * The dispatch types {@link GatewayClient.replayDispatch} turns into events.
18355
18392
  */
18356
18393
  get replayDispatchTypes() {
@@ -18790,6 +18827,55 @@ function RegisterAsGatewayListener(event, options = {}) {
18790
18827
  };
18791
18828
  };
18792
18829
  }
18830
+ /**
18831
+ * Like {@link RegisterAsGatewayListener}, for an event that comes from a dispatch, but the listener only runs on one
18832
+ * process: the workers replaying the dispatches while the gateway client forwards them (see `forwardGatewayDispatches`
18833
+ * from `@wolfstar/plugin-broker`), the gateway client itself otherwise. A bot loading the same pieces on both
18834
+ * processes therefore handles each dispatch once, without reading its environment to tell which process it is on.
18835
+ *
18836
+ * @remarks
18837
+ * The decision is made on every emit, so it does not matter whether the forwarding starts before or after the
18838
+ * listener is loaded, and stopping it brings the listener back. A `once` listener is not spent while it idles.
18839
+ *
18840
+ * The events only the gateway client emits (`clientReady`, `shardReady`, `shardResume`, `shardClose`, `shardError`,
18841
+ * `dispatch`, `cacheError`, `cacheSweep`) are never replayed on a worker: they are rejected by the types, and the
18842
+ * decorator throws for them. Use {@link RegisterAsGatewayListener} for those.
18843
+ *
18844
+ * Only the dispatches that are forwarded reach the workers: with `forwardGatewayDispatches`'s `events` set, a listener
18845
+ * of an event built from another dispatch runs nowhere. A `guildDelete` that `READY` emits for the guilds it no longer
18846
+ * lists is not forwarded either (wolfstar-project/plugins#243), so a listener on the workers misses it. Delivery to the
18847
+ * workers is at-least-once, so the listener should be idempotent.
18848
+ *
18849
+ * @example
18850
+ * ```typescript
18851
+ * import { EventGatewayListener, RegisterAsDispatchListener, type Message } from '@wolfstar/plugin-gateway';
18852
+ *
18853
+ * @RegisterAsDispatchListener('messageCreate')
18854
+ * export class LogMessagesListener extends EventGatewayListener<'messageCreate'> {
18855
+ * public override run(message: Message) {
18856
+ * console.log(`${message.author.username}: ${message.content}`);
18857
+ * }
18858
+ * }
18859
+ * ```
18860
+ *
18861
+ * @param event The dispatch event to listen to.
18862
+ * @param options The additional listener options.
18863
+ * @throws {TypeError} When the event is one only the gateway client emits.
18864
+ */
18865
+ function RegisterAsDispatchListener(event, options = {}) {
18866
+ if (gatewayOnlyEvents.has(event)) throw new TypeError(`The "${event}" event is only emitted by the gateway client, and never reaches a worker: use RegisterAsGatewayListener.`);
18867
+ const register = RegisterAsGatewayListener(event, options);
18868
+ return function decorate(target) {
18869
+ const base = register(target);
18870
+ return class extends base {
18871
+ constructor(...args) {
18872
+ super(...args);
18873
+ const listener = this._listener;
18874
+ this._listener = (...listenerArgs) => this.emitter.forwardsDispatches ? void 0 : listener(...listenerArgs);
18875
+ }
18876
+ };
18877
+ };
18878
+ }
18793
18879
 
18794
18880
  //#endregion
18795
18881
  //#region src/util/limits.ts
@@ -18835,5 +18921,5 @@ const DefaultSweeperSettings = Object.freeze({
18835
18921
  });
18836
18922
 
18837
18923
  //#endregion
18838
- export { Action, ActionRow, ActionsManager, Activity, ActivityFlagsBitField, AnnouncementChannel, AnnouncementThreadChannel, AnonymousGuild, Application, ApplicationFlagsBitField, AppliedTagsMixin, Attachment, AttachmentBuilder, AttachmentFlagsBitField, AutoModerationActionExecution, AutoModerationRule, AutoModerationRuleManager, BaseChannel, BaseChannelMixin, BaseInvite, BaseManager, BitField, CachedManager, CategoryChannel, CategoryChannelChildManager, Channel, ChannelFlagsBitField, ChannelManager, ChannelMessageManager, ChannelOwnerMixin, ChannelParentMixin, ChannelPermissionMixin, ChannelSelectMenuComponent, ChannelSlowmodeMixin, ChannelThreadManager, ChannelThreadsMixin, ChannelTopicMixin, ChannelWebhooksMixin, CheckboxComponent, CheckboxGroupComponent, ClientApplication, ClientUser, CollectionCache, Colors, Component, ComponentMixin, ContainerComponent, DMChannel, DMChannelMixin, DataManager, DefaultSweeperSettings, DispatchAction, DispatchHandlers, DispatchQueue, DispatchStateCodecs, DispatchTimeoutError, Embed, Emoji, EntityStoreCache, EventGatewayListener, FileComponent, FileUploadComponent, ForumChannel, GatewayClient, GatewayError, GatewayErrorCodes, GatewayErrorMessages, GatewayEvents, GatewayRangeError, GatewaySessionStoreError, GatewayTypeError, GroupDMChannel, GroupDMInvite, GroupDMMixin, Guild, GuildAuditLogsEntry, GuildBan, GuildBanManager, GuildChannelFields, GuildChannelInfoTimeoutError, GuildChannelManager, GuildChannelMixin, GuildEmoji, GuildEmojiManager, GuildEmojiRoleManager, GuildIntegrationManager, GuildInvite, GuildInviteManager, GuildManager, GuildMember, GuildMemberFlagsBitField, GuildMemberManager, GuildMemberRoleManager, GuildMembersRateLimitError, GuildMembersTimeoutError, GuildOnboarding, GuildOnboardingPrompt, GuildOnboardingPromptOption, GuildPreview, GuildScheduledEvent, GuildScheduledEventManager, GuildSoundboardSoundManager, GuildSoundboardSoundsTimeoutError, GuildStickerManager, GuildTemplate, GuildTemplateManager, GuildTemplatesPattern, Integration, IntentsBitField, InteractiveButtonComponent, InviteGuild, InvitesPattern, LabelComponent, LinkButtonComponent, MediaChannel, MediaGalleryComponent, MediaGalleryItem, MentionableSelectMenuComponent, Message, MessageFlagsBitField, MessageManager, MessageMentions, MessagePayload, MessageReaction, Mixin, MultiDispatchAction, MultiDispatchHandlers, NullCache, NumberFlagsBitField, Partials, PermissionOverwriteManager, PermissionOverwrites, PermissionsBitField, Poll, PollAnswer, PollAnswerVoterManager, PremiumButtonComponent, Presence, PresenceManager, PrivateThreadChannel, PublicThreadChannel, RadioGroupComponent, ReactionEmoji, ReactionManager, ReactionUserManager, RegisterAsGatewayListener, RichPresenceAssets, Role, RoleFlagsBitField, RoleManager, RoleSelectMenuComponent, SectionComponent, SeparatorComponent, SoundboardSound, StageChannel, StageInstance, StageInstanceManager, Sticker, StickerPack, StringSelectMenuComponent, Structure, StructureMixin, SweepableEntityNames, Sweepers, SystemChannelFlagsBitField, Team, TeamMember, TextChannel, TextChannelMixin, TextDisplayComponent, TextGuildChannelMixin, TextInputComponent, ThreadChannelMemberManager, ThreadChannelMixin, ThreadManager, ThreadMember, ThreadMemberManager, ThreadOnlyChannelMixin, ThumbnailComponent, Typing, UnfurledMediaItem, User, UserFlagsBitField, UserManager, UserSelectMenuComponent, VoiceChannel, VoiceChannelMixin, VoiceState, VoiceStateManager, Webhook, WebhookManager, WebhookMixin, WelcomeScreen, Widget, WidgetMember, basename, bindClient, cacheWithLimits, cleanCodeBlockContent, cleanContent, compareRolePositions, computeCachedPermissionsIn, computeCachedTargetPermissions, computeChannelPermissions, computeGuildPermissions, computePermissionsIn, computePositions, computeTargetPermissions, createChannel, createComponent, createInvite, discordSort, dispatchPartition, fillGuildId, findComponentByCustomId, findName, flatten, getGatewayClient, getSortableGroupTypes, initStructure, isDeepEqual, isThreadChannelType, kClient, kClone, kData, kPatch, kPatchRelations, kRelations, lazyRelation, makeError, makePlainError, moveElementInArray, parseEmoji, parseWebhookURL, requireGuild, requireMe, resolveBase64, resolveCode, resolveColor, resolveFile, resolveGuildEmoji, resolveGuildTemplateCode, resolveId, resolveImage, resolveImageOption, resolveInviteCode, resolveOverwriteOptions, resolvePartialEmoji, resolveSKUId, sameOverwrites, snakeCase, snowflakeTimestamp, toAPIOverwrite, toChannelBody, toSnakeCase, transformAPIAuditLogChange, transformAPIAutoModerationAction, transformAPIAutoModerationRuleTriggerMetadata, transformAPIAvatarDecorationData, transformAPIChannelMention, transformAPIEmbedAsset, transformAPIEmbedAuthor, transformAPIEmbedFooter, transformAPIGuildDefaultReaction, transformAPIGuildForumTag, transformAPIGuildScheduledEventEntityMetadata, transformAPIGuildScheduledEventRecurrenceRule, transformAPIIncidentsData, transformAPIMessageActivity, transformAPIMessageCall, transformAPIMessageInteractionMetadata, transformAPIMessageReference, transformAPIMessageSharedClientTheme, transformAPIRoleSubscriptionData, transformAPIRoleTags, transformAPIUserPrimaryGuild, transformAutoModerationAction, transformAutoModerationRuleTriggerMetadata, transformCollectibles, transformGuildDefaultReaction, transformGuildForumTag, transformGuildScheduledEventRecurrenceRule, transformResolved, verifyString, withGuildId };
18924
+ export { Action, ActionRow, ActionsManager, Activity, ActivityFlagsBitField, AnnouncementChannel, AnnouncementThreadChannel, AnonymousGuild, Application, ApplicationFlagsBitField, AppliedTagsMixin, Attachment, AttachmentBuilder, AttachmentFlagsBitField, AutoModerationActionExecution, AutoModerationRule, AutoModerationRuleManager, BaseChannel, BaseChannelMixin, BaseInvite, BaseManager, BitField, CachedManager, CategoryChannel, CategoryChannelChildManager, Channel, ChannelFlagsBitField, ChannelManager, ChannelMessageManager, ChannelOwnerMixin, ChannelParentMixin, ChannelPermissionMixin, ChannelSelectMenuComponent, ChannelSlowmodeMixin, ChannelThreadManager, ChannelThreadsMixin, ChannelTopicMixin, ChannelWebhooksMixin, CheckboxComponent, CheckboxGroupComponent, ClientApplication, ClientUser, CollectionCache, Colors, Component, ComponentMixin, ContainerComponent, DMChannel, DMChannelMixin, DataManager, DefaultSweeperSettings, DispatchAction, DispatchHandlers, DispatchQueue, DispatchStateCodecs, DispatchTimeoutError, Embed, Emoji, EntityStoreCache, EventGatewayListener, FileComponent, FileUploadComponent, ForumChannel, GatewayClient, GatewayError, GatewayErrorCodes, GatewayErrorMessages, GatewayEvents, GatewayRangeError, GatewaySessionStoreError, GatewayTypeError, GroupDMChannel, GroupDMInvite, GroupDMMixin, Guild, GuildAuditLogsEntry, GuildBan, GuildBanManager, GuildChannelFields, GuildChannelInfoTimeoutError, GuildChannelManager, GuildChannelMixin, GuildEmoji, GuildEmojiManager, GuildEmojiRoleManager, GuildIntegrationManager, GuildInvite, GuildInviteManager, GuildManager, GuildMember, GuildMemberFlagsBitField, GuildMemberManager, GuildMemberRoleManager, GuildMembersRateLimitError, GuildMembersTimeoutError, GuildOnboarding, GuildOnboardingPrompt, GuildOnboardingPromptOption, GuildPreview, GuildScheduledEvent, GuildScheduledEventManager, GuildSoundboardSoundManager, GuildSoundboardSoundsTimeoutError, GuildStickerManager, GuildTemplate, GuildTemplateManager, GuildTemplatesPattern, Integration, IntentsBitField, InteractiveButtonComponent, InviteGuild, InvitesPattern, LabelComponent, LinkButtonComponent, MediaChannel, MediaGalleryComponent, MediaGalleryItem, MentionableSelectMenuComponent, Message, MessageFlagsBitField, MessageManager, MessageMentions, MessagePayload, MessageReaction, Mixin, MultiDispatchAction, MultiDispatchHandlers, NullCache, NumberFlagsBitField, Partials, PermissionOverwriteManager, PermissionOverwrites, PermissionsBitField, Poll, PollAnswer, PollAnswerVoterManager, PremiumButtonComponent, Presence, PresenceManager, PrivateThreadChannel, PublicThreadChannel, RadioGroupComponent, ReactionEmoji, ReactionManager, ReactionUserManager, RegisterAsDispatchListener, RegisterAsGatewayListener, RichPresenceAssets, Role, RoleFlagsBitField, RoleManager, RoleSelectMenuComponent, SectionComponent, SeparatorComponent, SoundboardSound, StageChannel, StageInstance, StageInstanceManager, Sticker, StickerPack, StringSelectMenuComponent, Structure, StructureMixin, SweepableEntityNames, Sweepers, SystemChannelFlagsBitField, Team, TeamMember, TextChannel, TextChannelMixin, TextDisplayComponent, TextGuildChannelMixin, TextInputComponent, ThreadChannelMemberManager, ThreadChannelMixin, ThreadManager, ThreadMember, ThreadMemberManager, ThreadOnlyChannelMixin, ThumbnailComponent, Typing, UnfurledMediaItem, User, UserFlagsBitField, UserManager, UserSelectMenuComponent, VoiceChannel, VoiceChannelMixin, VoiceState, VoiceStateManager, Webhook, WebhookManager, WebhookMixin, WelcomeScreen, Widget, WidgetMember, basename, bindClient, cacheWithLimits, cleanCodeBlockContent, cleanContent, compareRolePositions, computeCachedPermissionsIn, computeCachedTargetPermissions, computeChannelPermissions, computeGuildPermissions, computePermissionsIn, computePositions, computeTargetPermissions, createChannel, createComponent, createInvite, discordSort, dispatchPartition, fillGuildId, findComponentByCustomId, findName, flatten, gatewayOnlyEvents, getGatewayClient, getSortableGroupTypes, initStructure, isDeepEqual, isThreadChannelType, kClient, kClone, kData, kPatch, kPatchRelations, kRelations, lazyRelation, makeError, makePlainError, moveElementInArray, parseEmoji, parseWebhookURL, requireGuild, requireMe, resolveBase64, resolveCode, resolveColor, resolveFile, resolveGuildEmoji, resolveGuildTemplateCode, resolveId, resolveImage, resolveImageOption, resolveInviteCode, resolveOverwriteOptions, resolvePartialEmoji, resolveSKUId, sameOverwrites, snakeCase, snowflakeTimestamp, toAPIOverwrite, toChannelBody, toSnakeCase, transformAPIAuditLogChange, transformAPIAutoModerationAction, transformAPIAutoModerationRuleTriggerMetadata, transformAPIAvatarDecorationData, transformAPIChannelMention, transformAPIEmbedAsset, transformAPIEmbedAuthor, transformAPIEmbedFooter, transformAPIGuildDefaultReaction, transformAPIGuildForumTag, transformAPIGuildScheduledEventEntityMetadata, transformAPIGuildScheduledEventRecurrenceRule, transformAPIIncidentsData, transformAPIMessageActivity, transformAPIMessageCall, transformAPIMessageInteractionMetadata, transformAPIMessageReference, transformAPIMessageSharedClientTheme, transformAPIRoleSubscriptionData, transformAPIRoleTags, transformAPIUserPrimaryGuild, transformAutoModerationAction, transformAutoModerationRuleTriggerMetadata, transformCollectibles, transformGuildDefaultReaction, transformGuildForumTag, transformGuildScheduledEventRecurrenceRule, transformResolved, verifyString, withGuildId };
18839
18925
  //# sourceMappingURL=index.js.map