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.
@@ -0,0 +1,175 @@
1
+ /** WebSocket gateway client for Fluxer. Handles connection, heartbeat, resume, and reconnection. */
2
+ import { EventEmitter } from 'events';
3
+ import WebSocket from 'ws';
4
+ import { GatewayOpcode } from './types.js';
5
+ const GATEWAY_VERSION = 1;
6
+ const RECONNECT_INITIAL = 1000;
7
+ const RECONNECT_MAX = 45000;
8
+ export class Gateway extends EventEmitter {
9
+ ws = null;
10
+ token;
11
+ intents;
12
+ gatewayUrl;
13
+ heartbeatInterval = null;
14
+ heartbeatAck = true;
15
+ sessionId = null;
16
+ seq = null;
17
+ resumeUrl = null;
18
+ destroying = false;
19
+ reconnectDelay = RECONNECT_INITIAL;
20
+ constructor(options) {
21
+ super();
22
+ this.token = options.token;
23
+ this.intents = options.intents;
24
+ this.gatewayUrl = options.gatewayUrl;
25
+ }
26
+ connect() {
27
+ const url = this.resumeUrl ?? this.gatewayUrl;
28
+ const fullUrl = `${url}?v=${GATEWAY_VERSION}&encoding=json`;
29
+ this.ws = new WebSocket(fullUrl);
30
+ this.ws.on('open', () => this.emit('debug', `Connected to ${url}`));
31
+ this.ws.on('message', (data) => this.onMessage(data));
32
+ this.ws.on('close', (code, reason) => this.onClose(code, reason.toString()));
33
+ this.ws.on('error', (err) => this.emit('error', err));
34
+ }
35
+ destroy() {
36
+ this.destroying = true;
37
+ this.stopHeartbeat();
38
+ this.ws?.close(1000);
39
+ this.ws = null;
40
+ }
41
+ onMessage(raw) {
42
+ const payload = JSON.parse(raw.toString());
43
+ if (payload.s !== null)
44
+ this.seq = payload.s;
45
+ switch (payload.op) {
46
+ case GatewayOpcode.Hello:
47
+ this.startHeartbeat(payload.d.heartbeat_interval);
48
+ if (this.sessionId) {
49
+ this.resume();
50
+ }
51
+ else {
52
+ this.identify();
53
+ }
54
+ break;
55
+ case GatewayOpcode.HeartbeatAck:
56
+ this.heartbeatAck = true;
57
+ break;
58
+ case GatewayOpcode.Heartbeat:
59
+ this.sendHeartbeat();
60
+ break;
61
+ case GatewayOpcode.Dispatch:
62
+ this.handleDispatch(payload.t, payload.d);
63
+ break;
64
+ case GatewayOpcode.Reconnect:
65
+ this.emit('debug', 'Server requested reconnect');
66
+ this.reconnect();
67
+ break;
68
+ case GatewayOpcode.InvalidSession:
69
+ this.emit('debug', `Invalid session (resumable: ${payload.d})`);
70
+ if (payload.d) {
71
+ setTimeout(() => this.resume(), 1000 + Math.random() * 4000);
72
+ }
73
+ else {
74
+ this.sessionId = null;
75
+ this.seq = null;
76
+ this.resumeUrl = null;
77
+ setTimeout(() => this.identify(), 1000 + Math.random() * 4000);
78
+ }
79
+ break;
80
+ }
81
+ }
82
+ handleDispatch(event, data) {
83
+ if (event === 'READY') {
84
+ const ready = data;
85
+ this.sessionId = ready.session_id;
86
+ this.resumeUrl = ready.resume_gateway_url ?? null;
87
+ this.reconnectDelay = RECONNECT_INITIAL;
88
+ }
89
+ if (event === 'RESUMED') {
90
+ this.reconnectDelay = RECONNECT_INITIAL;
91
+ this.emit('debug', 'Session resumed');
92
+ }
93
+ this.emit('dispatch', event, data);
94
+ }
95
+ identify() {
96
+ this.send({
97
+ op: GatewayOpcode.Identify,
98
+ d: {
99
+ token: this.token,
100
+ intents: this.intents,
101
+ properties: {
102
+ os: process.platform,
103
+ browser: 'fluxer-sdk',
104
+ device: 'fluxer-sdk',
105
+ },
106
+ },
107
+ s: null,
108
+ t: null,
109
+ });
110
+ }
111
+ resume() {
112
+ this.send({
113
+ op: GatewayOpcode.Resume,
114
+ d: {
115
+ token: this.token,
116
+ session_id: this.sessionId,
117
+ seq: this.seq,
118
+ },
119
+ s: null,
120
+ t: null,
121
+ });
122
+ }
123
+ send(payload) {
124
+ if (this.ws?.readyState === WebSocket.OPEN) {
125
+ this.ws.send(JSON.stringify(payload));
126
+ }
127
+ }
128
+ sendHeartbeat() {
129
+ this.send({ op: GatewayOpcode.Heartbeat, d: this.seq, s: null, t: null });
130
+ }
131
+ startHeartbeat(interval) {
132
+ this.stopHeartbeat();
133
+ this.heartbeatAck = true;
134
+ // Send first heartbeat with jitter
135
+ setTimeout(() => this.sendHeartbeat(), interval * Math.random());
136
+ this.heartbeatInterval = setInterval(() => {
137
+ if (!this.heartbeatAck) {
138
+ this.emit('debug', 'Heartbeat not acknowledged — reconnecting');
139
+ this.reconnect();
140
+ return;
141
+ }
142
+ this.heartbeatAck = false;
143
+ this.sendHeartbeat();
144
+ }, interval);
145
+ }
146
+ stopHeartbeat() {
147
+ if (this.heartbeatInterval) {
148
+ clearInterval(this.heartbeatInterval);
149
+ this.heartbeatInterval = null;
150
+ }
151
+ }
152
+ onClose(code, reason) {
153
+ this.stopHeartbeat();
154
+ this.emit('debug', `Connection closed: ${code} ${reason}`);
155
+ if (this.destroying)
156
+ return;
157
+ // Non-recoverable close codes
158
+ const fatal = [4004, 4010, 4011, 4012, 4013, 4014];
159
+ if (fatal.includes(code)) {
160
+ this.emit('error', new Error(`Fatal gateway close: ${code} ${reason}`));
161
+ return;
162
+ }
163
+ this.reconnect();
164
+ }
165
+ reconnect() {
166
+ this.stopHeartbeat();
167
+ this.ws?.close(4000);
168
+ this.ws = null;
169
+ const delay = this.reconnectDelay + Math.random() * 1000;
170
+ this.reconnectDelay = Math.min(this.reconnectDelay * 2, RECONNECT_MAX);
171
+ this.emit('debug', `Reconnecting in ${Math.round(delay)}ms`);
172
+ setTimeout(() => this.connect(), delay);
173
+ }
174
+ }
175
+ //# sourceMappingURL=gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export { Client, GatewayIntents, IntentsAll } from './client.js';
2
+ export type { ClientOptions, ClientEvents } from './client.js';
3
+ export { REST, FluxerAPIError, RateLimitError } from './rest.js';
4
+ export type { RESTOptions } from './rest.js';
5
+ export { Gateway } from './gateway.js';
6
+ export type { GatewayOptions } from './gateway.js';
7
+ export { Routes } from './routes.js';
8
+ export * from './types.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACjE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,cAAc,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { Client, GatewayIntents, IntentsAll } from './client.js';
2
+ export { REST, FluxerAPIError, RateLimitError } from './rest.js';
3
+ export { Gateway } from './gateway.js';
4
+ export { Routes } from './routes.js';
5
+ export * from './types.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,cAAc,YAAY,CAAC"}
package/dist/rest.d.ts ADDED
@@ -0,0 +1,43 @@
1
+ /** Lightweight REST client for the Fluxer API. Built on native fetch. */
2
+ export declare class FluxerAPIError extends Error {
3
+ readonly status: number;
4
+ readonly body: unknown;
5
+ readonly method: string;
6
+ readonly path: string;
7
+ constructor(status: number, body: unknown, method: string, path: string);
8
+ }
9
+ export declare class RateLimitError extends Error {
10
+ readonly retryAfter: number;
11
+ readonly method: string;
12
+ readonly path: string;
13
+ constructor(retryAfter: number, method: string, path: string);
14
+ }
15
+ export interface RESTOptions {
16
+ token: string;
17
+ baseUrl?: string;
18
+ maxRetries?: number;
19
+ }
20
+ export declare class REST {
21
+ private token;
22
+ private baseUrl;
23
+ private maxRetries;
24
+ constructor(options: RESTOptions);
25
+ get<T = unknown>(path: string): Promise<T>;
26
+ post<T = unknown>(path: string, options?: {
27
+ body?: unknown;
28
+ files?: Array<{
29
+ name: string;
30
+ data: Buffer | ArrayBuffer;
31
+ filename?: string;
32
+ }>;
33
+ }): Promise<T>;
34
+ patch<T = unknown>(path: string, options?: {
35
+ body?: unknown;
36
+ }): Promise<T>;
37
+ put<T = unknown>(path: string, options?: {
38
+ body?: unknown;
39
+ }): Promise<T>;
40
+ delete<T = unknown>(path: string): Promise<T>;
41
+ private request;
42
+ }
43
+ //# sourceMappingURL=rest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest.d.ts","sourceRoot":"","sources":["../src/rest.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAKzE,qBAAa,cAAe,SAAQ,KAAK;aAErB,MAAM,EAAE,MAAM;aACd,IAAI,EAAE,OAAO;aACb,MAAM,EAAE,MAAM;aACd,IAAI,EAAE,MAAM;gBAHZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM;CAK/B;AAED,qBAAa,cAAe,SAAQ,KAAK;aAErB,UAAU,EAAE,MAAM;aAClB,MAAM,EAAE,MAAM;aACd,IAAI,EAAE,MAAM;gBAFZ,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM;CAK/B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,IAAI;IACf,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,EAAE,WAAW;IAM1B,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAI1C,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IAIzJ,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IAI1E,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IAIxE,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;YAIrC,OAAO;CA4DtB"}
package/dist/rest.js ADDED
@@ -0,0 +1,113 @@
1
+ /** Lightweight REST client for the Fluxer API. Built on native fetch. */
2
+ const API_BASE = 'https://api.fluxer.app/v1';
3
+ const USER_AGENT = 'fluxer.ts (https://github.com/zeroxs/fluxer.ts, 0.1.0)';
4
+ export class FluxerAPIError extends Error {
5
+ status;
6
+ body;
7
+ method;
8
+ path;
9
+ constructor(status, body, method, path) {
10
+ super(`${method} ${path} → ${status}`);
11
+ this.status = status;
12
+ this.body = body;
13
+ this.method = method;
14
+ this.path = path;
15
+ this.name = 'FluxerAPIError';
16
+ }
17
+ }
18
+ export class RateLimitError extends Error {
19
+ retryAfter;
20
+ method;
21
+ path;
22
+ constructor(retryAfter, method, path) {
23
+ super(`Rate limited on ${method} ${path} — retry after ${retryAfter}ms`);
24
+ this.retryAfter = retryAfter;
25
+ this.method = method;
26
+ this.path = path;
27
+ this.name = 'RateLimitError';
28
+ }
29
+ }
30
+ export class REST {
31
+ token;
32
+ baseUrl;
33
+ maxRetries;
34
+ constructor(options) {
35
+ this.token = options.token;
36
+ this.baseUrl = options.baseUrl ?? API_BASE;
37
+ this.maxRetries = options.maxRetries ?? 3;
38
+ }
39
+ async get(path) {
40
+ return this.request('GET', path);
41
+ }
42
+ async post(path, options) {
43
+ return this.request('POST', path, options);
44
+ }
45
+ async patch(path, options) {
46
+ return this.request('PATCH', path, options);
47
+ }
48
+ async put(path, options) {
49
+ return this.request('PUT', path, options);
50
+ }
51
+ async delete(path) {
52
+ return this.request('DELETE', path);
53
+ }
54
+ async request(method, path, options) {
55
+ const url = `${this.baseUrl}${path}`;
56
+ for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
57
+ const headers = {
58
+ 'Authorization': `Bot ${this.token}`,
59
+ 'User-Agent': USER_AGENT,
60
+ };
61
+ let body;
62
+ if (options?.files?.length) {
63
+ // Multipart form data for file uploads
64
+ const form = new FormData();
65
+ if (options.body) {
66
+ form.append('payload_json', JSON.stringify(options.body));
67
+ }
68
+ for (let i = 0; i < options.files.length; i++) {
69
+ const f = options.files[i];
70
+ const blob = new Blob([f.data]);
71
+ form.append(`files[${i}]`, blob, f.filename ?? f.name);
72
+ }
73
+ body = form;
74
+ // Don't set Content-Type — fetch sets it with boundary for FormData
75
+ }
76
+ else if (options?.body) {
77
+ headers['Content-Type'] = 'application/json';
78
+ body = JSON.stringify(options.body);
79
+ }
80
+ const res = await fetch(url, { method, headers, body });
81
+ // Rate limited
82
+ if (res.status === 429) {
83
+ const retryAfter = parseFloat(res.headers.get('retry-after') ?? '1') * 1000;
84
+ if (attempt < this.maxRetries) {
85
+ await sleep(retryAfter + jitter());
86
+ continue;
87
+ }
88
+ throw new RateLimitError(retryAfter, method, path);
89
+ }
90
+ // Server error — retry
91
+ if (res.status >= 500 && attempt < this.maxRetries) {
92
+ await sleep(1000 * (attempt + 1) + jitter());
93
+ continue;
94
+ }
95
+ if (!res.ok) {
96
+ const errBody = await res.json().catch(() => res.text());
97
+ throw new FluxerAPIError(res.status, errBody, method, path);
98
+ }
99
+ // 204 No Content
100
+ if (res.status === 204)
101
+ return undefined;
102
+ return res.json();
103
+ }
104
+ throw new Error(`Max retries exceeded for ${method} ${path}`);
105
+ }
106
+ }
107
+ function sleep(ms) {
108
+ return new Promise(resolve => setTimeout(resolve, ms));
109
+ }
110
+ function jitter() {
111
+ return Math.random() * 500;
112
+ }
113
+ //# sourceMappingURL=rest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest.js","sourceRoot":"","sources":["../src/rest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type { Snowflake } from './types.js';
2
+ /** REST API route builders — all relative to /v1 */
3
+ export declare const Routes: {
4
+ readonly channel: (id: Snowflake) => `/channels/${string}`;
5
+ readonly channelMessages: (id: Snowflake) => `/channels/${string}/messages`;
6
+ readonly channelMessage: (chId: Snowflake, msgId: Snowflake) => `/channels/${string}/messages/${string}`;
7
+ readonly channelMessageAttachment: (chId: Snowflake, msgId: Snowflake, attId: Snowflake) => `/channels/${string}/messages/${string}/attachments/${string}`;
8
+ readonly channelMessageReactions: (chId: Snowflake, msgId: Snowflake) => `/channels/${string}/messages/${string}/reactions`;
9
+ readonly channelMessageReaction: (chId: Snowflake, msgId: Snowflake, emoji: string) => `/channels/${string}/messages/${string}/reactions/${string}`;
10
+ readonly channelPins: (id: Snowflake) => `/channels/${string}/messages/pins`;
11
+ readonly channelPin: (chId: Snowflake, msgId: Snowflake) => `/channels/${string}/pins/${string}`;
12
+ readonly channelBulkDelete: (id: Snowflake) => `/channels/${string}/messages/bulk-delete`;
13
+ readonly channelWebhooks: (id: Snowflake) => `/channels/${string}/webhooks`;
14
+ readonly channelTyping: (id: Snowflake) => `/channels/${string}/typing`;
15
+ readonly channelInvites: (id: Snowflake) => `/channels/${string}/invites`;
16
+ readonly channelPermission: (chId: Snowflake, ovId: Snowflake) => `/channels/${string}/permissions/${string}`;
17
+ readonly guilds: () => "/guilds";
18
+ readonly guild: (id: Snowflake) => `/guilds/${string}`;
19
+ readonly guildChannels: (id: Snowflake) => `/guilds/${string}/channels`;
20
+ readonly guildMembers: (id: Snowflake) => `/guilds/${string}/members`;
21
+ readonly guildMember: (gId: Snowflake, uId: Snowflake) => `/guilds/${string}/members/${string}`;
22
+ readonly guildMemberRole: (gId: Snowflake, uId: Snowflake, rId: Snowflake) => `/guilds/${string}/members/${string}/roles/${string}`;
23
+ readonly guildRoles: (id: Snowflake) => `/guilds/${string}/roles`;
24
+ readonly guildRole: (gId: Snowflake, rId: Snowflake) => `/guilds/${string}/roles/${string}`;
25
+ readonly guildBans: (id: Snowflake) => `/guilds/${string}/bans`;
26
+ readonly guildBan: (gId: Snowflake, uId: Snowflake) => `/guilds/${string}/bans/${string}`;
27
+ readonly guildInvites: (id: Snowflake) => `/guilds/${string}/invites`;
28
+ readonly guildAuditLogs: (id: Snowflake) => `/guilds/${string}/audit-logs`;
29
+ readonly guildEmojis: (id: Snowflake) => `/guilds/${string}/emojis`;
30
+ readonly guildEmoji: (gId: Snowflake, eId: Snowflake) => `/guilds/${string}/emojis/${string}`;
31
+ readonly guildStickers: (id: Snowflake) => `/guilds/${string}/stickers`;
32
+ readonly guildSticker: (gId: Snowflake, sId: Snowflake) => `/guilds/${string}/stickers/${string}`;
33
+ readonly guildWebhooks: (id: Snowflake) => `/guilds/${string}/webhooks`;
34
+ readonly guildVanityUrl: (id: Snowflake) => `/guilds/${string}/vanity-url`;
35
+ readonly invite: (code: string) => `/invites/${string}`;
36
+ readonly webhook: (id: Snowflake) => `/webhooks/${string}`;
37
+ readonly webhookExecute: (id: Snowflake, token: string) => `/webhooks/${string}/${string}`;
38
+ readonly webhookMessage: (id: Snowflake, token: string, msgId: Snowflake) => `/webhooks/${string}/${string}/messages/${string}`;
39
+ readonly user: (id: Snowflake) => `/users/${string}`;
40
+ readonly currentUser: () => "/users/@me";
41
+ readonly currentUserGuilds: () => "/users/@me/guilds";
42
+ readonly leaveGuild: (gId: Snowflake) => `/users/@me/guilds/${string}`;
43
+ readonly userChannels: () => "/users/@me/channels";
44
+ readonly userProfile: (id: Snowflake, guildId?: Snowflake) => string;
45
+ readonly applicationCommands: (appId: Snowflake) => `/applications/${string}/commands`;
46
+ readonly applicationCommand: (appId: Snowflake, cmdId: Snowflake) => `/applications/${string}/commands/${string}`;
47
+ readonly interactionCallback: (intId: Snowflake, token: string) => `/interactions/${string}/${string}/callback`;
48
+ readonly gatewayBot: () => "/gateway/bot";
49
+ readonly instance: () => "/instance";
50
+ };
51
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,oDAAoD;AACpD,eAAO,MAAM,MAAM;2BAEH,SAAS;mCACD,SAAS;oCACR,SAAS,SAAS,SAAS;8CACjB,SAAS,SAAS,SAAS,SAAS,SAAS;6CAC9C,SAAS,SAAS,SAAS;4CAC5B,SAAS,SAAS,SAAS,SAAS,MAAM;+BACvD,SAAS;gCACR,SAAS,SAAS,SAAS;qCACtB,SAAS;mCACX,SAAS;iCACX,SAAS;kCACR,SAAS;uCACJ,SAAS,QAAQ,SAAS;;yBAIxC,SAAS;iCACD,SAAS;gCACV,SAAS;gCACT,SAAS,OAAO,SAAS;oCACrB,SAAS,OAAO,SAAS,OAAO,SAAS;8BAC/C,SAAS;8BACT,SAAS,OAAO,SAAS;6BAC1B,SAAS;6BACT,SAAS,OAAO,SAAS;gCACtB,SAAS;kCACP,SAAS;+BACZ,SAAS;+BACT,SAAS,OAAO,SAAS;iCACvB,SAAS;iCACT,SAAS,OAAO,SAAS;iCACzB,SAAS;kCACR,SAAS;4BAGf,MAAM;2BAGP,SAAS;kCACF,SAAS,SAAS,MAAM;kCACxB,SAAS,SAAS,MAAM,SAAS,SAAS;wBAGpD,SAAS;;;+BAGF,SAAS;;+BAET,SAAS,YAAY,SAAS;0CAGnB,SAAS;yCACV,SAAS,SAAS,SAAS;0CAC1B,SAAS,SAAS,MAAM;;;CAO7C,CAAC"}
package/dist/routes.js ADDED
@@ -0,0 +1,58 @@
1
+ /** REST API route builders — all relative to /v1 */
2
+ export const Routes = {
3
+ // Channels
4
+ channel: (id) => `/channels/${id}`,
5
+ channelMessages: (id) => `/channels/${id}/messages`,
6
+ channelMessage: (chId, msgId) => `/channels/${chId}/messages/${msgId}`,
7
+ channelMessageAttachment: (chId, msgId, attId) => `/channels/${chId}/messages/${msgId}/attachments/${attId}`,
8
+ channelMessageReactions: (chId, msgId) => `/channels/${chId}/messages/${msgId}/reactions`,
9
+ channelMessageReaction: (chId, msgId, emoji) => `/channels/${chId}/messages/${msgId}/reactions/${encodeURIComponent(emoji)}`,
10
+ channelPins: (id) => `/channels/${id}/messages/pins`,
11
+ channelPin: (chId, msgId) => `/channels/${chId}/pins/${msgId}`,
12
+ channelBulkDelete: (id) => `/channels/${id}/messages/bulk-delete`,
13
+ channelWebhooks: (id) => `/channels/${id}/webhooks`,
14
+ channelTyping: (id) => `/channels/${id}/typing`,
15
+ channelInvites: (id) => `/channels/${id}/invites`,
16
+ channelPermission: (chId, ovId) => `/channels/${chId}/permissions/${ovId}`,
17
+ // Guilds
18
+ guilds: () => '/guilds',
19
+ guild: (id) => `/guilds/${id}`,
20
+ guildChannels: (id) => `/guilds/${id}/channels`,
21
+ guildMembers: (id) => `/guilds/${id}/members`,
22
+ guildMember: (gId, uId) => `/guilds/${gId}/members/${uId}`,
23
+ guildMemberRole: (gId, uId, rId) => `/guilds/${gId}/members/${uId}/roles/${rId}`,
24
+ guildRoles: (id) => `/guilds/${id}/roles`,
25
+ guildRole: (gId, rId) => `/guilds/${gId}/roles/${rId}`,
26
+ guildBans: (id) => `/guilds/${id}/bans`,
27
+ guildBan: (gId, uId) => `/guilds/${gId}/bans/${uId}`,
28
+ guildInvites: (id) => `/guilds/${id}/invites`,
29
+ guildAuditLogs: (id) => `/guilds/${id}/audit-logs`,
30
+ guildEmojis: (id) => `/guilds/${id}/emojis`,
31
+ guildEmoji: (gId, eId) => `/guilds/${gId}/emojis/${eId}`,
32
+ guildStickers: (id) => `/guilds/${id}/stickers`,
33
+ guildSticker: (gId, sId) => `/guilds/${gId}/stickers/${sId}`,
34
+ guildWebhooks: (id) => `/guilds/${id}/webhooks`,
35
+ guildVanityUrl: (id) => `/guilds/${id}/vanity-url`,
36
+ // Invites
37
+ invite: (code) => `/invites/${code}`,
38
+ // Webhooks
39
+ webhook: (id) => `/webhooks/${id}`,
40
+ webhookExecute: (id, token) => `/webhooks/${id}/${token}`,
41
+ webhookMessage: (id, token, msgId) => `/webhooks/${id}/${token}/messages/${msgId}`,
42
+ // Users
43
+ user: (id) => `/users/${id}`,
44
+ currentUser: () => '/users/@me',
45
+ currentUserGuilds: () => '/users/@me/guilds',
46
+ leaveGuild: (gId) => `/users/@me/guilds/${gId}`,
47
+ userChannels: () => '/users/@me/channels',
48
+ userProfile: (id, guildId) => `/users/${id}/profile${guildId ? `?guild_id=${guildId}` : ''}`,
49
+ // Applications / Interactions
50
+ applicationCommands: (appId) => `/applications/${appId}/commands`,
51
+ applicationCommand: (appId, cmdId) => `/applications/${appId}/commands/${cmdId}`,
52
+ interactionCallback: (intId, token) => `/interactions/${intId}/${token}/callback`,
53
+ // Gateway
54
+ gatewayBot: () => '/gateway/bot',
55
+ // Instance
56
+ instance: () => '/instance',
57
+ };
58
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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"}