fluxer.ts 0.1.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 ADDED
@@ -0,0 +1,169 @@
1
+ # fluxer.ts
2
+
3
+ Lightweight, TypeScript-first SDK for building [Fluxer](https://fluxer.gg) bots.
4
+
5
+ - **Small** — single package, one dependency (`ws`), ~22KB compiled
6
+ - **TypeScript-first** — full type definitions, no `any`
7
+ - **Simple API** — connect, listen, send — no unnecessary abstractions
8
+ - **Built for Fluxer** — handles Fluxer-specific gateway behavior (guild `properties`, v1 gateway protocol)
9
+
10
+ ## Install
11
+
12
+ ```bash
13
+ npm install fluxer.ts
14
+ ```
15
+
16
+ ## Quick Start
17
+
18
+ ```typescript
19
+ import { Client, GatewayIntents } from 'fluxer.ts';
20
+
21
+ const client = new Client({
22
+ intents: GatewayIntents.Guilds | GatewayIntents.GuildMessages | GatewayIntents.MessageContent,
23
+ });
24
+
25
+ client.on('ready', (user, guilds) => {
26
+ console.log(`Connected as ${user.username} in ${guilds.length} guilds`);
27
+ });
28
+
29
+ client.on('messageCreate', async (message) => {
30
+ if (message.author.bot) return;
31
+
32
+ if (message.content === '!ping') {
33
+ await client.sendMessage(message.channel_id, 'Pong!');
34
+ }
35
+ });
36
+
37
+ client.login('your-bot-token');
38
+ ```
39
+
40
+ ## Features
41
+
42
+ ### Messages
43
+
44
+ ```typescript
45
+ // Send a message
46
+ await client.sendMessage(channelId, 'Hello!');
47
+
48
+ // Send with embeds
49
+ await client.sendMessage(channelId, {
50
+ content: 'Check this out',
51
+ embeds: [{ title: 'My Embed', description: 'Content here', color: 0x7c6fff }],
52
+ });
53
+
54
+ // Reply to a message
55
+ await client.replyTo(message, 'Got it!');
56
+
57
+ // Edit a message
58
+ await client.editMessage(channelId, messageId, 'Updated content');
59
+
60
+ // Delete a message
61
+ await client.deleteMessage(channelId, messageId);
62
+
63
+ // React
64
+ await client.react(channelId, messageId, '👍');
65
+
66
+ // Typing indicator
67
+ await client.sendTyping(channelId);
68
+ ```
69
+
70
+ ### Guilds
71
+
72
+ ```typescript
73
+ // Access cached guilds (populated on connect)
74
+ for (const [id, guild] of client.guilds) {
75
+ console.log(guild.name);
76
+ }
77
+
78
+ // Fetch members
79
+ const members = await client.fetchMembers(guildId);
80
+
81
+ // Fetch roles
82
+ const roles = await client.fetchRoles(guildId);
83
+
84
+ // Set bot nickname
85
+ await client.setNickname(guildId, 'Cool Bot');
86
+ ```
87
+
88
+ ### Interactions (Slash Commands)
89
+
90
+ ```typescript
91
+ import { InteractionCallbackType } from 'fluxer.ts';
92
+
93
+ // Register commands
94
+ await client.registerCommands(applicationId, [
95
+ { name: 'ping', description: 'Pong!' },
96
+ ]);
97
+
98
+ // Handle interactions
99
+ client.on('interactionCreate', async (interaction) => {
100
+ if (interaction.data?.name === 'ping') {
101
+ await client.respondToInteraction(
102
+ interaction.id,
103
+ interaction.token,
104
+ InteractionCallbackType.ChannelMessageWithSource,
105
+ { content: 'Pong!' },
106
+ );
107
+ }
108
+ });
109
+ ```
110
+
111
+ ### Events
112
+
113
+ ```typescript
114
+ client.on('ready', (user, guilds) => { });
115
+ client.on('messageCreate', (message) => { });
116
+ client.on('messageUpdate', (message) => { });
117
+ client.on('messageDelete', ({ id, channel_id }) => { });
118
+ client.on('interactionCreate', (interaction) => { });
119
+ client.on('guildCreate', (guild) => { });
120
+ client.on('guildDelete', ({ id }) => { });
121
+ client.on('guildMemberAdd', (member) => { });
122
+ client.on('guildMemberRemove', ({ guild_id, user }) => { });
123
+ client.on('channelCreate', (channel) => { });
124
+ client.on('channelUpdate', (channel) => { });
125
+ client.on('channelDelete', (channel) => { });
126
+ client.on('messageReactionAdd', (data) => { });
127
+ client.on('messageReactionRemove', (data) => { });
128
+ client.on('typingStart', (data) => { });
129
+ client.on('error', (error) => { });
130
+ client.on('debug', (message) => { });
131
+ ```
132
+
133
+ ### REST API (Direct)
134
+
135
+ ```typescript
136
+ import { REST, Routes } from 'fluxer.ts';
137
+
138
+ const rest = new REST({ token: 'your-token' });
139
+
140
+ // Any endpoint
141
+ const user = await rest.get(Routes.currentUser());
142
+ const channels = await rest.get(Routes.guildChannels(guildId));
143
+ ```
144
+
145
+ ### Gateway Intents
146
+
147
+ ```typescript
148
+ import { GatewayIntents, IntentsAll } from 'fluxer.ts';
149
+
150
+ // Specific intents
151
+ const intents = GatewayIntents.Guilds | GatewayIntents.GuildMessages | GatewayIntents.MessageContent;
152
+
153
+ // All intents
154
+ const client = new Client({ intents: IntentsAll });
155
+ ```
156
+
157
+ ## How it differs from @fluxerjs/core
158
+
159
+ | | fluxer.ts | @fluxerjs/core |
160
+ |---|---|---|
161
+ | Size | ~22KB | ~809KB |
162
+ | Packages | 1 | 7 (monorepo) |
163
+ | Dependencies | 1 (ws) | 6 |
164
+ | TypeScript | Source + declarations | Declarations only |
165
+ | Fluxer-specific | Yes (properties, v1 gateway) | Discord.js port |
166
+
167
+ ## License
168
+
169
+ MIT
@@ -0,0 +1,154 @@
1
+ /** High-level Fluxer client — ties REST and Gateway together with a clean event API. */
2
+ import { EventEmitter } from 'events';
3
+ import { REST } from './rest.js';
4
+ import type { Snowflake, User, Guild, GuildMember, Channel, Message, Interaction, MessageSendOptions, Embed, Role, InteractionCallbackType } from './types.js';
5
+ export declare const GatewayIntents: {
6
+ readonly Guilds: number;
7
+ readonly GuildMembers: number;
8
+ readonly GuildModeration: number;
9
+ readonly GuildEmojisAndStickers: number;
10
+ readonly GuildIntegrations: number;
11
+ readonly GuildWebhooks: number;
12
+ readonly GuildInvites: number;
13
+ readonly GuildVoiceStates: number;
14
+ readonly GuildPresences: number;
15
+ readonly GuildMessages: number;
16
+ readonly GuildMessageReactions: number;
17
+ readonly GuildMessageTyping: number;
18
+ readonly DirectMessages: number;
19
+ readonly DirectMessageReactions: number;
20
+ readonly DirectMessageTyping: number;
21
+ readonly MessageContent: number;
22
+ readonly GuildScheduledEvents: number;
23
+ };
24
+ /** All non-privileged intents */
25
+ export declare const IntentsAll: number;
26
+ export interface ClientEvents {
27
+ ready: [user: User, guilds: Guild[]];
28
+ messageCreate: [message: Message];
29
+ messageUpdate: [message: Partial<Message> & {
30
+ id: Snowflake;
31
+ channel_id: Snowflake;
32
+ }];
33
+ messageDelete: [data: {
34
+ id: Snowflake;
35
+ channel_id: Snowflake;
36
+ guild_id?: Snowflake;
37
+ }];
38
+ interactionCreate: [interaction: Interaction];
39
+ guildCreate: [guild: Guild];
40
+ guildUpdate: [guild: Guild];
41
+ guildDelete: [data: {
42
+ id: Snowflake;
43
+ }];
44
+ guildMemberAdd: [member: GuildMember & {
45
+ guild_id: Snowflake;
46
+ }];
47
+ guildMemberUpdate: [member: Partial<GuildMember> & {
48
+ guild_id: Snowflake;
49
+ user: User;
50
+ }];
51
+ guildMemberRemove: [data: {
52
+ guild_id: Snowflake;
53
+ user: User;
54
+ }];
55
+ channelCreate: [channel: Channel];
56
+ channelUpdate: [channel: Channel];
57
+ channelDelete: [channel: Channel];
58
+ messageReactionAdd: [data: {
59
+ user_id: Snowflake;
60
+ channel_id: Snowflake;
61
+ message_id: Snowflake;
62
+ guild_id?: Snowflake;
63
+ emoji: {
64
+ id: Snowflake | null;
65
+ name: string;
66
+ };
67
+ }];
68
+ messageReactionRemove: [data: {
69
+ user_id: Snowflake;
70
+ channel_id: Snowflake;
71
+ message_id: Snowflake;
72
+ guild_id?: Snowflake;
73
+ emoji: {
74
+ id: Snowflake | null;
75
+ name: string;
76
+ };
77
+ }];
78
+ typingStart: [data: {
79
+ channel_id: Snowflake;
80
+ guild_id?: Snowflake;
81
+ user_id: Snowflake;
82
+ timestamp: number;
83
+ }];
84
+ presenceUpdate: [data: unknown];
85
+ error: [error: Error];
86
+ debug: [message: string];
87
+ }
88
+ export interface ClientOptions {
89
+ /** Gateway intents bitmask. Use GatewayIntents or IntentsAll. */
90
+ intents?: number;
91
+ /** Base URL for REST API. Default: https://api.fluxer.gg/v1 */
92
+ apiBase?: string;
93
+ }
94
+ export declare class Client extends EventEmitter {
95
+ private options;
96
+ rest: REST;
97
+ user: User;
98
+ guilds: Map<string, Guild>;
99
+ channels: Map<string, Channel>;
100
+ private gateway;
101
+ private intents;
102
+ private token;
103
+ private pendingGuilds;
104
+ private readyEmitted;
105
+ constructor(options?: ClientOptions);
106
+ /** Connect to the gateway and start receiving events. */
107
+ login(token: string): Promise<void>;
108
+ /** Disconnect from the gateway. */
109
+ destroy(): void;
110
+ private handleEvent;
111
+ /** Send a message to a channel. */
112
+ sendMessage(channelId: Snowflake, content: string | MessageSendOptions): Promise<Message>;
113
+ /** Reply to a message (shows as reply in client). */
114
+ replyTo(message: Message, content: string | MessageSendOptions): Promise<Message>;
115
+ /** Edit a message. */
116
+ editMessage(channelId: Snowflake, messageId: Snowflake, content: string | {
117
+ content?: string;
118
+ embeds?: Embed[];
119
+ }): Promise<Message>;
120
+ /** Delete a message. */
121
+ deleteMessage(channelId: Snowflake, messageId: Snowflake): Promise<void>;
122
+ /** Send typing indicator. */
123
+ sendTyping(channelId: Snowflake): Promise<void>;
124
+ /** React to a message. */
125
+ react(channelId: Snowflake, messageId: Snowflake, emoji: string): Promise<void>;
126
+ /** Fetch guild members. */
127
+ fetchMembers(guildId: Snowflake, limit?: number): Promise<GuildMember[]>;
128
+ /** Fetch guild roles. */
129
+ fetchRoles(guildId: Snowflake): Promise<Role[]>;
130
+ /** Fetch channel messages. */
131
+ fetchMessages(channelId: Snowflake, options?: {
132
+ limit?: number;
133
+ before?: Snowflake;
134
+ after?: Snowflake;
135
+ }): Promise<Message[]>;
136
+ /** Respond to an interaction. */
137
+ respondToInteraction(interactionId: Snowflake, token: string, type: InteractionCallbackType, data?: {
138
+ content?: string;
139
+ embeds?: Embed[];
140
+ flags?: number;
141
+ components?: unknown[];
142
+ }): Promise<void>;
143
+ /** Register global application commands. */
144
+ registerCommands(applicationId: Snowflake, commands: unknown[]): Promise<void>;
145
+ /** Set bot nickname in a guild. */
146
+ setNickname(guildId: Snowflake, nickname: string | null): Promise<void>;
147
+ on<K extends keyof ClientEvents>(event: K, listener: (...args: ClientEvents[K]) => void): this;
148
+ on(event: string, listener: (...args: unknown[]) => void): this;
149
+ once<K extends keyof ClientEvents>(event: K, listener: (...args: ClientEvents[K]) => void): this;
150
+ once(event: string, listener: (...args: unknown[]) => void): this;
151
+ emit<K extends keyof ClientEvents>(event: K, ...args: ClientEvents[K]): boolean;
152
+ emit(event: string, ...args: unknown[]): boolean;
153
+ }
154
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js ADDED
@@ -0,0 +1,260 @@
1
+ /** High-level Fluxer client — ties REST and Gateway together with a clean event API. */
2
+ import { EventEmitter } from 'events';
3
+ import { REST } from './rest.js';
4
+ import { Gateway } from './gateway.js';
5
+ import { Routes } from './routes.js';
6
+ // ─── Helpers ────────────────────────────────────────────────────
7
+ /** Fluxer nests guild info in a `properties` sub-object. Normalize to flat Guild. */
8
+ function normalizeGuild(data) {
9
+ const props = (data.properties ?? data);
10
+ return {
11
+ id: (data.id ?? props.id),
12
+ name: (props.name ?? 'Unknown'),
13
+ icon: (props.icon ?? null),
14
+ banner: (props.banner ?? null),
15
+ owner_id: (props.owner_id ?? ''),
16
+ system_channel_id: (props.system_channel_id ?? null),
17
+ rules_channel_id: (props.rules_channel_id ?? null),
18
+ afk_channel_id: (props.afk_channel_id ?? null),
19
+ afk_timeout: (props.afk_timeout ?? 0),
20
+ features: (props.features ?? []),
21
+ verification_level: (props.verification_level ?? 0),
22
+ mfa_level: (props.mfa_level ?? 0),
23
+ nsfw_level: (props.nsfw_level ?? 0),
24
+ permissions: (props.permissions ?? null),
25
+ };
26
+ }
27
+ // ─── Gateway Intents ────────────────────────────────────────────
28
+ export const GatewayIntents = {
29
+ Guilds: 1 << 0,
30
+ GuildMembers: 1 << 1,
31
+ GuildModeration: 1 << 2,
32
+ GuildEmojisAndStickers: 1 << 3,
33
+ GuildIntegrations: 1 << 4,
34
+ GuildWebhooks: 1 << 5,
35
+ GuildInvites: 1 << 6,
36
+ GuildVoiceStates: 1 << 7,
37
+ GuildPresences: 1 << 8,
38
+ GuildMessages: 1 << 9,
39
+ GuildMessageReactions: 1 << 10,
40
+ GuildMessageTyping: 1 << 11,
41
+ DirectMessages: 1 << 12,
42
+ DirectMessageReactions: 1 << 13,
43
+ DirectMessageTyping: 1 << 14,
44
+ MessageContent: 1 << 15,
45
+ GuildScheduledEvents: 1 << 16,
46
+ };
47
+ /** All non-privileged intents */
48
+ export const IntentsAll = Object.values(GatewayIntents).reduce((a, b) => a | b, 0);
49
+ // ─── Client ─────────────────────────────────────────────────────
50
+ export class Client extends EventEmitter {
51
+ options;
52
+ rest;
53
+ user;
54
+ guilds = new Map();
55
+ channels = new Map();
56
+ gateway = null;
57
+ intents;
58
+ token = '';
59
+ pendingGuilds = null;
60
+ readyEmitted = false;
61
+ constructor(options = {}) {
62
+ super();
63
+ this.options = options;
64
+ this.intents = options.intents ?? IntentsAll;
65
+ this.rest = new REST({ token: '', baseUrl: options.apiBase });
66
+ }
67
+ /** Connect to the gateway and start receiving events. */
68
+ async login(token) {
69
+ this.token = token;
70
+ this.rest = new REST({ token, baseUrl: this.options.apiBase });
71
+ // Get gateway URL
72
+ const gatewayInfo = await this.rest.get(Routes.gatewayBot());
73
+ const gatewayUrl = gatewayInfo.url;
74
+ this.gateway = new Gateway({ token, intents: this.intents, gatewayUrl });
75
+ this.gateway.on('dispatch', (event, data) => this.handleEvent(event, data));
76
+ this.gateway.on('error', (err) => this.emit('error', err));
77
+ this.gateway.on('debug', (msg) => this.emit('debug', msg));
78
+ this.gateway.connect();
79
+ }
80
+ /** Disconnect from the gateway. */
81
+ destroy() {
82
+ this.gateway?.destroy();
83
+ }
84
+ // ─── Event Handling ─────────────────────────────────────────
85
+ handleEvent(event, data) {
86
+ const d = data;
87
+ switch (event) {
88
+ case 'READY': {
89
+ const ready = d;
90
+ this.user = ready.user;
91
+ // Fluxer sends READY with guild stubs, then GUILD_CREATE for each.
92
+ // Wait briefly for GUILD_CREATE events before emitting ready.
93
+ // Fluxer sends empty guilds array in READY, guilds come via GUILD_CREATE.
94
+ // Wait for GUILD_CREATE events before emitting ready.
95
+ this.pendingGuilds = new Set();
96
+ this.readyEmitted = false;
97
+ // Emit ready after a short delay to collect GUILD_CREATE events
98
+ setTimeout(() => {
99
+ if (!this.readyEmitted) {
100
+ this.readyEmitted = true;
101
+ this.pendingGuilds = null;
102
+ this.emit('ready', this.user, [...this.guilds.values()]);
103
+ }
104
+ }, 2000);
105
+ break;
106
+ }
107
+ case 'MESSAGE_CREATE':
108
+ this.emit('messageCreate', d);
109
+ break;
110
+ case 'MESSAGE_UPDATE':
111
+ this.emit('messageUpdate', d);
112
+ break;
113
+ case 'MESSAGE_DELETE':
114
+ this.emit('messageDelete', d);
115
+ break;
116
+ case 'INTERACTION_CREATE':
117
+ this.emit('interactionCreate', d);
118
+ break;
119
+ case 'GUILD_CREATE': {
120
+ const guild = normalizeGuild(d);
121
+ this.guilds.set(guild.id, guild);
122
+ // Cache channels from guild payload
123
+ const channels = d.channels;
124
+ if (channels)
125
+ for (const ch of channels)
126
+ this.channels.set(ch.id, ch);
127
+ // During initial load, don't emit guildCreate — ready will fire with all guilds
128
+ if (!this.readyEmitted)
129
+ break;
130
+ this.emit('guildCreate', guild);
131
+ break;
132
+ }
133
+ case 'GUILD_UPDATE': {
134
+ const guild = normalizeGuild(d);
135
+ this.guilds.set(guild.id, guild);
136
+ this.emit('guildUpdate', guild);
137
+ break;
138
+ }
139
+ case 'GUILD_DELETE':
140
+ this.guilds.delete(d.id);
141
+ this.emit('guildDelete', d);
142
+ break;
143
+ case 'GUILD_MEMBER_ADD':
144
+ this.emit('guildMemberAdd', d);
145
+ break;
146
+ case 'GUILD_MEMBER_UPDATE':
147
+ this.emit('guildMemberUpdate', d);
148
+ break;
149
+ case 'GUILD_MEMBER_REMOVE':
150
+ this.emit('guildMemberRemove', d);
151
+ break;
152
+ case 'CHANNEL_CREATE': {
153
+ const ch = d;
154
+ this.channels.set(ch.id, ch);
155
+ this.emit('channelCreate', ch);
156
+ break;
157
+ }
158
+ case 'CHANNEL_UPDATE': {
159
+ const ch = d;
160
+ this.channels.set(ch.id, ch);
161
+ this.emit('channelUpdate', ch);
162
+ break;
163
+ }
164
+ case 'CHANNEL_DELETE': {
165
+ const ch = d;
166
+ this.channels.delete(ch.id);
167
+ this.emit('channelDelete', ch);
168
+ break;
169
+ }
170
+ case 'MESSAGE_REACTION_ADD':
171
+ this.emit('messageReactionAdd', d);
172
+ break;
173
+ case 'MESSAGE_REACTION_REMOVE':
174
+ this.emit('messageReactionRemove', d);
175
+ break;
176
+ case 'TYPING_START':
177
+ this.emit('typingStart', d);
178
+ break;
179
+ case 'PRESENCE_UPDATE':
180
+ this.emit('presenceUpdate', d);
181
+ break;
182
+ }
183
+ }
184
+ // ─── Convenience Methods ──────────────────────────────────────
185
+ /** Send a message to a channel. */
186
+ async sendMessage(channelId, content) {
187
+ const body = typeof content === 'string' ? { content } : content;
188
+ const files = typeof content === 'object' ? content.files : undefined;
189
+ return this.rest.post(Routes.channelMessages(channelId), { body, files });
190
+ }
191
+ /** Reply to a message (shows as reply in client). */
192
+ async replyTo(message, content) {
193
+ const body = typeof content === 'string' ? { content } : { ...content };
194
+ body.message_reference = {
195
+ channel_id: message.channel_id,
196
+ message_id: message.id,
197
+ guild_id: message.guild_id,
198
+ };
199
+ return this.rest.post(Routes.channelMessages(message.channel_id), { body });
200
+ }
201
+ /** Edit a message. */
202
+ async editMessage(channelId, messageId, content) {
203
+ const body = typeof content === 'string' ? { content } : content;
204
+ return this.rest.patch(Routes.channelMessage(channelId, messageId), { body });
205
+ }
206
+ /** Delete a message. */
207
+ async deleteMessage(channelId, messageId) {
208
+ await this.rest.delete(Routes.channelMessage(channelId, messageId));
209
+ }
210
+ /** Send typing indicator. */
211
+ async sendTyping(channelId) {
212
+ await this.rest.post(Routes.channelTyping(channelId));
213
+ }
214
+ /** React to a message. */
215
+ async react(channelId, messageId, emoji) {
216
+ await this.rest.put(`${Routes.channelMessageReaction(channelId, messageId, emoji)}/@me`);
217
+ }
218
+ /** Fetch guild members. */
219
+ async fetchMembers(guildId, limit = 100) {
220
+ return this.rest.get(`${Routes.guildMembers(guildId)}?limit=${limit}`);
221
+ }
222
+ /** Fetch guild roles. */
223
+ async fetchRoles(guildId) {
224
+ return this.rest.get(Routes.guildRoles(guildId));
225
+ }
226
+ /** Fetch channel messages. */
227
+ async fetchMessages(channelId, options) {
228
+ const params = new URLSearchParams();
229
+ if (options?.limit)
230
+ params.set('limit', String(options.limit));
231
+ if (options?.before)
232
+ params.set('before', options.before);
233
+ if (options?.after)
234
+ params.set('after', options.after);
235
+ const qs = params.toString();
236
+ return this.rest.get(`${Routes.channelMessages(channelId)}${qs ? `?${qs}` : ''}`);
237
+ }
238
+ /** Respond to an interaction. */
239
+ async respondToInteraction(interactionId, token, type, data) {
240
+ await this.rest.post(Routes.interactionCallback(interactionId, token), { body: { type, data } });
241
+ }
242
+ /** Register global application commands. */
243
+ async registerCommands(applicationId, commands) {
244
+ await this.rest.put(Routes.applicationCommands(applicationId), { body: commands });
245
+ }
246
+ /** Set bot nickname in a guild. */
247
+ async setNickname(guildId, nickname) {
248
+ await this.rest.patch(Routes.guildMember(guildId, '@me'), { body: { nick: nickname } });
249
+ }
250
+ on(event, listener) {
251
+ return super.on(event, listener);
252
+ }
253
+ once(event, listener) {
254
+ return super.once(event, listener);
255
+ }
256
+ emit(event, ...args) {
257
+ return super.emit(event, ...args);
258
+ }
259
+ }
260
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /** WebSocket gateway client for Fluxer. Handles connection, heartbeat, resume, and reconnection. */
2
+ import { EventEmitter } from 'events';
3
+ export interface GatewayOptions {
4
+ token: string;
5
+ intents: number;
6
+ gatewayUrl: string;
7
+ }
8
+ export declare class Gateway extends EventEmitter {
9
+ private ws;
10
+ private token;
11
+ private intents;
12
+ private gatewayUrl;
13
+ private heartbeatInterval;
14
+ private heartbeatAck;
15
+ private sessionId;
16
+ private seq;
17
+ private resumeUrl;
18
+ private destroying;
19
+ private reconnectDelay;
20
+ constructor(options: GatewayOptions);
21
+ connect(): void;
22
+ destroy(): void;
23
+ private onMessage;
24
+ private handleDispatch;
25
+ private identify;
26
+ private resume;
27
+ private send;
28
+ private sendHeartbeat;
29
+ private startHeartbeat;
30
+ private stopHeartbeat;
31
+ private onClose;
32
+ private reconnect;
33
+ }
34
+ //# sourceMappingURL=gateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"AAAA,oGAAoG;AAEpG,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAQtC,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,OAAQ,SAAQ,YAAY;IACvC,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAS;IAE3B,OAAO,CAAC,iBAAiB,CAA+C;IACxE,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,GAAG,CAAuB;IAClC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAqB;gBAE/B,OAAO,EAAE,cAAc;IAOnC,OAAO,IAAI,IAAI;IAWf,OAAO,IAAI,IAAI;IAOf,OAAO,CAAC,SAAS;IA8CjB,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,QAAQ;IAiBhB,OAAO,CAAC,MAAM;IAad,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,OAAO;IAgBf,OAAO,CAAC,SAAS;CAWlB"}