@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/README.md +33 -0
- package/dist/esm/index.d.ts +62 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +87 -1
- package/dist/esm/index.js.map +1 -1
- package/package.json +1 -1
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
|