@stella_project/stellalib 1.0.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.
Files changed (64) hide show
  1. package/LICENSE +213 -0
  2. package/README.md +285 -0
  3. package/THIRD-PARTY-NOTICES.md +84 -0
  4. package/dist/Structures/Filters.d.ts +140 -0
  5. package/dist/Structures/Filters.d.ts.map +1 -0
  6. package/dist/Structures/Filters.js +315 -0
  7. package/dist/Structures/Filters.js.map +1 -0
  8. package/dist/Structures/LRUCache.d.ts +36 -0
  9. package/dist/Structures/LRUCache.d.ts.map +1 -0
  10. package/dist/Structures/LRUCache.js +94 -0
  11. package/dist/Structures/LRUCache.js.map +1 -0
  12. package/dist/Structures/Manager.d.ts +146 -0
  13. package/dist/Structures/Manager.d.ts.map +1 -0
  14. package/dist/Structures/Manager.js +503 -0
  15. package/dist/Structures/Manager.js.map +1 -0
  16. package/dist/Structures/Node.d.ts +118 -0
  17. package/dist/Structures/Node.d.ts.map +1 -0
  18. package/dist/Structures/Node.js +927 -0
  19. package/dist/Structures/Node.js.map +1 -0
  20. package/dist/Structures/Player.d.ts +193 -0
  21. package/dist/Structures/Player.d.ts.map +1 -0
  22. package/dist/Structures/Player.js +598 -0
  23. package/dist/Structures/Player.js.map +1 -0
  24. package/dist/Structures/Queue.d.ts +48 -0
  25. package/dist/Structures/Queue.d.ts.map +1 -0
  26. package/dist/Structures/Queue.js +114 -0
  27. package/dist/Structures/Queue.js.map +1 -0
  28. package/dist/Structures/Rest.d.ts +105 -0
  29. package/dist/Structures/Rest.d.ts.map +1 -0
  30. package/dist/Structures/Rest.js +343 -0
  31. package/dist/Structures/Rest.js.map +1 -0
  32. package/dist/Structures/SessionStore.d.ts +42 -0
  33. package/dist/Structures/SessionStore.d.ts.map +1 -0
  34. package/dist/Structures/SessionStore.js +94 -0
  35. package/dist/Structures/SessionStore.js.map +1 -0
  36. package/dist/Structures/Types.d.ts +450 -0
  37. package/dist/Structures/Types.d.ts.map +1 -0
  38. package/dist/Structures/Types.js +13 -0
  39. package/dist/Structures/Types.js.map +1 -0
  40. package/dist/Structures/Utils.d.ts +61 -0
  41. package/dist/Structures/Utils.d.ts.map +1 -0
  42. package/dist/Structures/Utils.js +204 -0
  43. package/dist/Structures/Utils.js.map +1 -0
  44. package/dist/Utils/FiltersEqualizers.d.ts +20 -0
  45. package/dist/Utils/FiltersEqualizers.d.ts.map +1 -0
  46. package/dist/Utils/FiltersEqualizers.js +96 -0
  47. package/dist/Utils/FiltersEqualizers.js.map +1 -0
  48. package/dist/Utils/ManagerCheck.d.ts +9 -0
  49. package/dist/Utils/ManagerCheck.d.ts.map +1 -0
  50. package/dist/Utils/ManagerCheck.js +45 -0
  51. package/dist/Utils/ManagerCheck.js.map +1 -0
  52. package/dist/Utils/NodeCheck.d.ts +9 -0
  53. package/dist/Utils/NodeCheck.d.ts.map +1 -0
  54. package/dist/Utils/NodeCheck.js +31 -0
  55. package/dist/Utils/NodeCheck.js.map +1 -0
  56. package/dist/Utils/PlayerCheck.d.ts +9 -0
  57. package/dist/Utils/PlayerCheck.d.ts.map +1 -0
  58. package/dist/Utils/PlayerCheck.js +23 -0
  59. package/dist/Utils/PlayerCheck.js.map +1 -0
  60. package/dist/index.d.ts +12 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +28 -0
  63. package/dist/index.js.map +1 -0
  64. package/package.json +64 -0
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StellaQueue = void 0;
4
+ const Utils_1 = require("./Utils");
5
+ /**
6
+ * The player's queue. The `current` property is the currently playing track,
7
+ * think of the rest as the upcoming tracks.
8
+ */
9
+ class StellaQueue extends Array {
10
+ /** The total duration of the queue including the current track. */
11
+ get duration() {
12
+ const current = this.current?.duration ?? 0;
13
+ return this.reduce((acc, cur) => acc + (cur.duration || 0), current);
14
+ }
15
+ /** The total size of tracks in the queue including the current track. */
16
+ get totalSize() {
17
+ return this.length + (this.current ? 1 : 0);
18
+ }
19
+ /** The size of tracks in the queue (excluding current). */
20
+ get size() {
21
+ return this.length;
22
+ }
23
+ /** The current track. */
24
+ current = null;
25
+ /** The previous track. */
26
+ previous = null;
27
+ /**
28
+ * Adds a track to the queue.
29
+ * @param track The track or array of tracks to add.
30
+ * @param offset Optional position to insert at.
31
+ */
32
+ add(track, offset) {
33
+ if (!Utils_1.TrackUtils.validate(track))
34
+ throw new RangeError('Track must be a "Track" or "Track[]".');
35
+ if (!this.current) {
36
+ if (Array.isArray(track)) {
37
+ this.current = track.shift() || null;
38
+ this.push(...track);
39
+ }
40
+ else {
41
+ this.current = track;
42
+ }
43
+ }
44
+ else {
45
+ if (typeof offset !== "undefined" && typeof offset === "number") {
46
+ if (isNaN(offset))
47
+ throw new RangeError("Offset must be a number.");
48
+ if (offset < 0 || offset > this.length)
49
+ throw new RangeError(`Offset must be between 0 and ${this.length}.`);
50
+ if (Array.isArray(track)) {
51
+ this.splice(offset, 0, ...track);
52
+ }
53
+ else {
54
+ this.splice(offset, 0, track);
55
+ }
56
+ }
57
+ else {
58
+ if (Array.isArray(track)) {
59
+ this.push(...track);
60
+ }
61
+ else {
62
+ this.push(track);
63
+ }
64
+ }
65
+ }
66
+ }
67
+ remove(startOrPosition = 0, end) {
68
+ if (typeof end !== "undefined") {
69
+ if (isNaN(Number(startOrPosition)) || isNaN(Number(end)))
70
+ throw new RangeError('Missing "start" or "end" parameter.');
71
+ if (startOrPosition >= end || startOrPosition >= this.length)
72
+ throw new RangeError("Invalid start or end values.");
73
+ return this.splice(startOrPosition, end - startOrPosition);
74
+ }
75
+ return this.splice(startOrPosition, 1);
76
+ }
77
+ /** Clears the queue. */
78
+ clear() {
79
+ this.splice(0);
80
+ }
81
+ /** Shuffles the queue using the Fisher-Yates algorithm. */
82
+ shuffle() {
83
+ for (let i = this.length - 1; i > 0; i--) {
84
+ const j = Math.floor(Math.random() * (i + 1));
85
+ [this[i], this[j]] = [this[j], this[i]];
86
+ }
87
+ }
88
+ /**
89
+ * Shuffles the queue but distributes tracks evenly by requester,
90
+ * so no single user dominates the upcoming tracks.
91
+ */
92
+ equalizedShuffle() {
93
+ const userTracks = new Map();
94
+ this.forEach((track) => {
95
+ const user = track.requester;
96
+ if (!userTracks.has(user))
97
+ userTracks.set(user, []);
98
+ userTracks.get(user).push(track);
99
+ });
100
+ const shuffledQueue = [];
101
+ const totalLength = this.length;
102
+ while (shuffledQueue.length < totalLength) {
103
+ userTracks.forEach((tracks) => {
104
+ const track = tracks.shift();
105
+ if (track)
106
+ shuffledQueue.push(track);
107
+ });
108
+ }
109
+ this.clear();
110
+ this.add(shuffledQueue);
111
+ }
112
+ }
113
+ exports.StellaQueue = StellaQueue;
114
+ //# sourceMappingURL=Queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Queue.js","sourceRoot":"","sources":["../../src/Structures/Queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * @license
3
+ * StellaLib — Copyright (c) 2026 AntonyZ, x2sadddDM, SynX, Astel (OSL-3.0)
4
+ * Derived from LithiumX — Copyright (c) 2025 Anantix Network (MIT)
5
+ * See LICENSE and THIRD-PARTY-NOTICES.md for full license details.
6
+ */
7
+ import type { RestPlayOptions, LavalinkResponse, LavalinkInfo, LavalinkVersion } from "./Types";
8
+ /**
9
+ * Handles the requests sent to the Lavalink REST API.
10
+ * Automatically adapts to Lavalink v3 and v4 protocols.
11
+ */
12
+ declare class StellaRest {
13
+ /** The Node that this Rest instance is connected to. */
14
+ private node;
15
+ /** The ID of the current session (v4) or resume key (v3). */
16
+ private sessionId;
17
+ /** The password for the Node. */
18
+ private readonly password;
19
+ /** The base URL for REST requests. */
20
+ private readonly baseUrl;
21
+ /** Request timeout in ms. */
22
+ private readonly timeout;
23
+ /** In-flight request deduplication for GET requests. */
24
+ private readonly inflightGets;
25
+ /** Total number of requests made. */
26
+ requestCount: number;
27
+ /** Total number of failed requests. */
28
+ failedCount: number;
29
+ /** Detected Lavalink version for protocol adaptation. */
30
+ private version;
31
+ constructor(node: any);
32
+ /** Sets the Lavalink version for protocol adaptation. */
33
+ setVersion(v: LavalinkVersion): void;
34
+ /** Gets the detected Lavalink version. */
35
+ getVersion(): LavalinkVersion;
36
+ /**
37
+ * Sets the session ID.
38
+ * @returns The session ID.
39
+ */
40
+ setSessionId(sessionId: string): string;
41
+ /**
42
+ * Load tracks — normalizes v3 response to v4 format automatically.
43
+ * @param identifier The search query or URL identifier.
44
+ */
45
+ loadTracks(identifier: string): Promise<LavalinkResponse>;
46
+ /** Normalize v3 loadtracks response to v4 LavalinkResponse format. */
47
+ private normalizeV3LoadResponse;
48
+ /**
49
+ * Fetch Lavalink server info.
50
+ * v3: GET /version (returns minimal info), v4: GET /v4/info.
51
+ */
52
+ getInfo(): Promise<LavalinkInfo>;
53
+ /** Decode tracks — version-aware endpoint. */
54
+ decodeTracks(tracks: string[]): Promise<unknown>;
55
+ /**
56
+ * Configure session resume.
57
+ * v3: sends configureResuming WS op, v4: REST PATCH /v4/sessions/{id}.
58
+ */
59
+ configureResume(timeout: number): Promise<void>;
60
+ /**
61
+ * Get all players on this node.
62
+ * v3: not supported (returns empty array), v4: REST GET.
63
+ */
64
+ getAllPlayers(): Promise<unknown>;
65
+ /**
66
+ * Get a single player's state.
67
+ * v3: not supported (returns null), v4: REST GET.
68
+ */
69
+ getPlayer(guildId: string): Promise<unknown>;
70
+ /**
71
+ * Update player state.
72
+ * v3: translates to WebSocket ops, v4: REST PATCH.
73
+ */
74
+ updatePlayer(options: RestPlayOptions): Promise<unknown>;
75
+ /**
76
+ * v3 player updates via WebSocket ops.
77
+ * Decomposes the v4-style data into individual v3 WS ops.
78
+ */
79
+ private updatePlayerV3;
80
+ /**
81
+ * Destroy a player.
82
+ * v3: WS destroy op, v4: REST DELETE.
83
+ */
84
+ destroyPlayer(guildId: string): Promise<unknown>;
85
+ /**
86
+ * Core request method with:
87
+ * - AbortController timeout
88
+ * - Automatic retry on 429 (rate limit) with Retry-After
89
+ * - Proper error wrapping
90
+ */
91
+ private request;
92
+ /**
93
+ * Sends a GET request with deduplication.
94
+ * If an identical GET is already in-flight, returns the same promise.
95
+ */
96
+ get(endpoint: string): Promise<unknown>;
97
+ /** Sends a PATCH request. */
98
+ patch(endpoint: string, body: unknown): Promise<unknown>;
99
+ /** Sends a POST request. */
100
+ post(endpoint: string, body: unknown): Promise<unknown>;
101
+ /** Sends a DELETE request. */
102
+ delete(endpoint: string): Promise<unknown>;
103
+ }
104
+ export { StellaRest };
105
+ //# sourceMappingURL=Rest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Rest.d.ts","sourceRoot":"","sources":["../../src/Structures/Rest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,eAAe,EAAU,gBAAgB,EAAE,YAAY,EAAuB,eAAe,EAAE,MAAM,SAAS,CAAC;AAK7H;;;GAGG;AACH,cAAM,UAAU;IACf,wDAAwD;IACxD,OAAO,CAAC,IAAI,CAAM;IAClB,6DAA6D;IAC7D,OAAO,CAAC,SAAS,CAAS;IAC1B,iCAAiC;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,sCAAsC;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,6BAA6B;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,wDAAwD;IACxD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuC;IACpE,qCAAqC;IAC9B,YAAY,SAAK;IACxB,uCAAuC;IAChC,WAAW,SAAK;IACvB,yDAAyD;IACzD,OAAO,CAAC,OAAO,CAAsB;gBAEzB,IAAI,EAAE,GAAG;IAQrB,yDAAyD;IAClD,UAAU,CAAC,CAAC,EAAE,eAAe,GAAG,IAAI;IAI3C,0CAA0C;IACnC,UAAU,IAAI,eAAe;IAIpC;;;OAGG;IACI,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAO9C;;;OAGG;IACU,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAMtE,sEAAsE;IACtE,OAAO,CAAC,uBAAuB;IAuC/B;;;OAGG;IACU,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC;IAsB7C,8CAA8C;IACjC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAK7D;;;OAGG;IACU,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe5D;;;OAGG;IACU,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAK9C;;;OAGG;IACU,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKzD;;;OAGG;IACU,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IASrE;;;OAGG;IACH,OAAO,CAAC,cAAc;IA2DtB;;;OAGG;IACU,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU7D;;;;;OAKG;YACW,OAAO;IA8ErB;;;OAGG;IACU,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYpD,6BAA6B;IAChB,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAIrE,4BAA4B;IACf,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAIpE,8BAA8B;IACjB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAGvD;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,343 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StellaRest = void 0;
4
+ /** Maximum number of retries for rate-limited (429) requests. */
5
+ const MAX_RATE_LIMIT_RETRIES = 3;
6
+ /**
7
+ * Handles the requests sent to the Lavalink REST API.
8
+ * Automatically adapts to Lavalink v3 and v4 protocols.
9
+ */
10
+ class StellaRest {
11
+ /** The Node that this Rest instance is connected to. */
12
+ node;
13
+ /** The ID of the current session (v4) or resume key (v3). */
14
+ sessionId;
15
+ /** The password for the Node. */
16
+ password;
17
+ /** The base URL for REST requests. */
18
+ baseUrl;
19
+ /** Request timeout in ms. */
20
+ timeout;
21
+ /** In-flight request deduplication for GET requests. */
22
+ inflightGets = new Map();
23
+ /** Total number of requests made. */
24
+ requestCount = 0;
25
+ /** Total number of failed requests. */
26
+ failedCount = 0;
27
+ /** Detected Lavalink version for protocol adaptation. */
28
+ version = 4;
29
+ constructor(node) {
30
+ this.node = node;
31
+ this.sessionId = node.sessionId;
32
+ this.password = node.options.password;
33
+ this.baseUrl = `http${node.options.secure ? "s" : ""}://${node.options.host}:${node.options.port}`;
34
+ this.timeout = node.options.requestTimeout ?? 15000;
35
+ }
36
+ /** Sets the Lavalink version for protocol adaptation. */
37
+ setVersion(v) {
38
+ this.version = v;
39
+ }
40
+ /** Gets the detected Lavalink version. */
41
+ getVersion() {
42
+ return this.version;
43
+ }
44
+ /**
45
+ * Sets the session ID.
46
+ * @returns The session ID.
47
+ */
48
+ setSessionId(sessionId) {
49
+ this.sessionId = sessionId;
50
+ return this.sessionId;
51
+ }
52
+ // ── Version-aware high-level methods ────────────────────────────────
53
+ /**
54
+ * Load tracks — normalizes v3 response to v4 format automatically.
55
+ * @param identifier The search query or URL identifier.
56
+ */
57
+ async loadTracks(identifier) {
58
+ const prefix = this.version === 3 ? "" : "/v4";
59
+ const raw = await this.get(`${prefix}/loadtracks?identifier=${encodeURIComponent(identifier)}`);
60
+ return this.version === 3 ? this.normalizeV3LoadResponse(raw) : raw;
61
+ }
62
+ /** Normalize v3 loadtracks response to v4 LavalinkResponse format. */
63
+ normalizeV3LoadResponse(raw) {
64
+ const V3_TYPE_MAP = {
65
+ TRACK_LOADED: "track",
66
+ PLAYLIST_LOADED: "playlist",
67
+ SEARCH_RESULT: "search",
68
+ NO_MATCHES: "empty",
69
+ LOAD_FAILED: "error",
70
+ };
71
+ const loadType = V3_TYPE_MAP[raw.loadType] ?? "empty";
72
+ const normTrack = (t) => ({
73
+ encoded: t.track ?? t.encoded ?? "",
74
+ info: t.info ?? {},
75
+ pluginInfo: t.pluginInfo ?? {},
76
+ });
77
+ let data;
78
+ switch (loadType) {
79
+ case "track":
80
+ data = raw.tracks?.length ? normTrack(raw.tracks[0]) : { encoded: "", info: {}, pluginInfo: {} };
81
+ break;
82
+ case "search":
83
+ data = (raw.tracks ?? []).map(normTrack);
84
+ break;
85
+ case "playlist":
86
+ data = {
87
+ info: { name: raw.playlistInfo?.name ?? "Unknown" },
88
+ pluginInfo: {},
89
+ tracks: (raw.tracks ?? []).map(normTrack),
90
+ };
91
+ break;
92
+ default:
93
+ data = (raw.tracks ?? []).map(normTrack);
94
+ }
95
+ return { loadType, data };
96
+ }
97
+ /**
98
+ * Fetch Lavalink server info.
99
+ * v3: GET /version (returns minimal info), v4: GET /v4/info.
100
+ */
101
+ async getInfo() {
102
+ if (this.version === 3) {
103
+ const url = `${this.baseUrl}/version`;
104
+ const res = await fetch(url, {
105
+ headers: { Authorization: this.password },
106
+ signal: AbortSignal.timeout(this.timeout),
107
+ });
108
+ const text = (await res.text()).trim();
109
+ return {
110
+ version: { semver: text, major: 3, minor: 0, patch: 0, preRelease: "" },
111
+ buildTime: 0,
112
+ git: { branch: "", commit: "", commitTime: 0 },
113
+ jvm: "",
114
+ lavaplayer: "",
115
+ sourceManagers: [],
116
+ filters: [],
117
+ plugins: [],
118
+ };
119
+ }
120
+ return (await this.get("/v4/info"));
121
+ }
122
+ /** Decode tracks — version-aware endpoint. */
123
+ async decodeTracks(tracks) {
124
+ const prefix = this.version === 3 ? "" : "/v4";
125
+ return await this.post(`${prefix}/decodetracks`, tracks);
126
+ }
127
+ /**
128
+ * Configure session resume.
129
+ * v3: sends configureResuming WS op, v4: REST PATCH /v4/sessions/{id}.
130
+ */
131
+ async configureResume(timeout) {
132
+ if (this.version === 3) {
133
+ this.node.sendWs({
134
+ op: "configureResuming",
135
+ key: this.sessionId,
136
+ timeout,
137
+ });
138
+ }
139
+ else {
140
+ await this.patch(`/v4/sessions/${this.sessionId}`, {
141
+ resuming: true,
142
+ timeout,
143
+ });
144
+ }
145
+ }
146
+ /**
147
+ * Get all players on this node.
148
+ * v3: not supported (returns empty array), v4: REST GET.
149
+ */
150
+ async getAllPlayers() {
151
+ if (this.version === 3)
152
+ return [];
153
+ return await this.get(`/v4/sessions/${this.sessionId}/players`);
154
+ }
155
+ /**
156
+ * Get a single player's state.
157
+ * v3: not supported (returns null), v4: REST GET.
158
+ */
159
+ async getPlayer(guildId) {
160
+ if (this.version === 3)
161
+ return null;
162
+ return await this.get(`/v4/sessions/${this.sessionId}/players/${guildId}`);
163
+ }
164
+ /**
165
+ * Update player state.
166
+ * v3: translates to WebSocket ops, v4: REST PATCH.
167
+ */
168
+ async updatePlayer(options) {
169
+ if (this.version === 3)
170
+ return this.updatePlayerV3(options);
171
+ const noReplace = options.data?.noReplace ?? false;
172
+ return await this.patch(`/v4/sessions/${this.sessionId}/players/${options.guildId}?noReplace=${noReplace}`, options.data);
173
+ }
174
+ /**
175
+ * v3 player updates via WebSocket ops.
176
+ * Decomposes the v4-style data into individual v3 WS ops.
177
+ */
178
+ updatePlayerV3(options) {
179
+ const { guildId, data } = options;
180
+ if (!data)
181
+ return {};
182
+ // Voice update → voiceUpdate op
183
+ if (data.voice) {
184
+ this.node.sendWs({
185
+ op: "voiceUpdate",
186
+ guildId,
187
+ sessionId: data.voice.sessionId,
188
+ event: {
189
+ token: data.voice.token,
190
+ guild_id: guildId,
191
+ endpoint: data.voice.endpoint,
192
+ },
193
+ });
194
+ }
195
+ // Play or Stop
196
+ if (data.encodedTrack !== undefined) {
197
+ if (data.encodedTrack === null) {
198
+ this.node.sendWs({ op: "stop", guildId });
199
+ }
200
+ else {
201
+ const playOp = {
202
+ op: "play",
203
+ guildId,
204
+ track: data.encodedTrack,
205
+ noReplace: data.noReplace ?? false,
206
+ };
207
+ if (data.startTime !== undefined)
208
+ playOp.startTime = data.startTime;
209
+ if (data.endTime !== undefined)
210
+ playOp.endTime = data.endTime;
211
+ if (data.position !== undefined)
212
+ playOp.startTime = data.position;
213
+ this.node.sendWs(playOp);
214
+ }
215
+ }
216
+ // Pause
217
+ if (data.paused !== undefined) {
218
+ this.node.sendWs({ op: "pause", guildId, pause: data.paused });
219
+ }
220
+ // Seek (only if not changing track)
221
+ if (data.position !== undefined && data.encodedTrack === undefined) {
222
+ this.node.sendWs({ op: "seek", guildId, position: data.position });
223
+ }
224
+ // Volume
225
+ if (data.volume !== undefined) {
226
+ this.node.sendWs({ op: "volume", guildId, volume: data.volume });
227
+ }
228
+ // Filters
229
+ if (data.filters) {
230
+ this.node.sendWs({ op: "filters", guildId, ...data.filters });
231
+ }
232
+ return {};
233
+ }
234
+ /**
235
+ * Destroy a player.
236
+ * v3: WS destroy op, v4: REST DELETE.
237
+ */
238
+ async destroyPlayer(guildId) {
239
+ if (this.version === 3) {
240
+ this.node.sendWs({ op: "destroy", guildId });
241
+ return {};
242
+ }
243
+ return await this.delete(`/v4/sessions/${this.sessionId}/players/${guildId}`);
244
+ }
245
+ // ── Core HTTP methods ───────────────────────────────────────────────
246
+ /**
247
+ * Core request method with:
248
+ * - AbortController timeout
249
+ * - Automatic retry on 429 (rate limit) with Retry-After
250
+ * - Proper error wrapping
251
+ */
252
+ async request(method, endpoint, body, retryCount = 0) {
253
+ const url = `${this.baseUrl}${endpoint}`;
254
+ this.requestCount++;
255
+ this.node.manager.emit("Debug", `[REST] ${method} ${url}${retryCount > 0 ? ` (retry ${retryCount})` : ""}`);
256
+ const controller = new AbortController();
257
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
258
+ const config = {
259
+ method,
260
+ headers: {
261
+ "Content-Type": "application/json",
262
+ Authorization: this.password,
263
+ },
264
+ body: body ? JSON.stringify(body) : null,
265
+ signal: controller.signal,
266
+ };
267
+ try {
268
+ const response = await fetch(url, config);
269
+ clearTimeout(timeoutId);
270
+ // Handle rate limiting with automatic retry
271
+ if (response.status === 429 && retryCount < MAX_RATE_LIMIT_RETRIES) {
272
+ const retryAfter = response.headers.get("Retry-After");
273
+ const delay = retryAfter ? parseInt(retryAfter, 10) * 1000 : 1000 * (retryCount + 1);
274
+ this.node.manager.emit("Debug", `[REST] Rate limited on ${method} ${endpoint}, retrying in ${delay}ms`);
275
+ await new Promise((resolve) => setTimeout(resolve, delay));
276
+ return this.request(method, endpoint, body, retryCount + 1);
277
+ }
278
+ const contentType = response.headers.get("content-type");
279
+ if (!response.ok) {
280
+ this.failedCount++;
281
+ let errorBody = "";
282
+ try {
283
+ errorBody = await response.text();
284
+ }
285
+ catch { /* ignore */ }
286
+ const error = new Error(`REST ${method} ${endpoint} returned ${response.status}: ${errorBody}`);
287
+ this.node.manager.emit("NodeError", this.node, error);
288
+ throw error;
289
+ }
290
+ if (!contentType || !contentType.includes("application/json")) {
291
+ return response.status >= 200 && response.status < 300 ? {} : null;
292
+ }
293
+ const text = await response.text();
294
+ if (!text || text.trim() === "")
295
+ return {};
296
+ return JSON.parse(text);
297
+ }
298
+ catch (error) {
299
+ clearTimeout(timeoutId);
300
+ // Handle abort (timeout)
301
+ if (error.name === "AbortError") {
302
+ this.failedCount++;
303
+ const wrapped = new Error(`REST ${method} ${endpoint} timed out after ${this.timeout}ms`);
304
+ this.node.manager.emit("NodeError", this.node, wrapped);
305
+ throw wrapped;
306
+ }
307
+ if (error.message?.startsWith("REST "))
308
+ throw error;
309
+ this.failedCount++;
310
+ const wrapped = new Error(`REST ${method} ${endpoint} failed: ${error.message}`);
311
+ this.node.manager.emit("NodeError", this.node, wrapped);
312
+ throw wrapped;
313
+ }
314
+ }
315
+ /**
316
+ * Sends a GET request with deduplication.
317
+ * If an identical GET is already in-flight, returns the same promise.
318
+ */
319
+ async get(endpoint) {
320
+ const existing = this.inflightGets.get(endpoint);
321
+ if (existing)
322
+ return existing;
323
+ const promise = this.request("GET", endpoint).finally(() => {
324
+ this.inflightGets.delete(endpoint);
325
+ });
326
+ this.inflightGets.set(endpoint, promise);
327
+ return promise;
328
+ }
329
+ /** Sends a PATCH request. */
330
+ async patch(endpoint, body) {
331
+ return await this.request("PATCH", endpoint, body);
332
+ }
333
+ /** Sends a POST request. */
334
+ async post(endpoint, body) {
335
+ return await this.request("POST", endpoint, body);
336
+ }
337
+ /** Sends a DELETE request. */
338
+ async delete(endpoint) {
339
+ return await this.request("DELETE", endpoint);
340
+ }
341
+ }
342
+ exports.StellaRest = StellaRest;
343
+ //# sourceMappingURL=Rest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Rest.js","sourceRoot":"","sources":["../../src/Structures/Rest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @license
3
+ * StellaLib — Copyright (c) 2026 AntonyZ, x2sadddDM, SynX, Astel (OSL-3.0)
4
+ * See LICENSE and THIRD-PARTY-NOTICES.md for full license details.
5
+ */
6
+ import type { SessionStore } from "./Types";
7
+ /**
8
+ * File-based session store that persists Lavalink session IDs to disk.
9
+ * This allows session resume after bot restarts — players keep playing seamlessly.
10
+ *
11
+ * Usage:
12
+ * ```ts
13
+ * const manager = new StellaManager({
14
+ * sessionStore: new FileSessionStore("./sessions.json"),
15
+ * // ...
16
+ * });
17
+ * ```
18
+ */
19
+ export declare class FileSessionStore implements SessionStore {
20
+ private readonly filePath;
21
+ private readonly flushInterval;
22
+ private data;
23
+ private dirty;
24
+ private writeTimer;
25
+ /**
26
+ * @param filePath Path to the JSON file for storing sessions.
27
+ * @param flushInterval How often to write to disk in ms (default: 1000). Set to 0 for immediate writes.
28
+ */
29
+ constructor(filePath: string, flushInterval?: number);
30
+ /** Load sessions from disk. */
31
+ private load;
32
+ /** Schedule a write to disk (debounced). */
33
+ private scheduleFlush;
34
+ /** Write sessions to disk immediately. */
35
+ flush(): void;
36
+ get(nodeId: string): string | null;
37
+ set(nodeId: string, sessionId: string): void;
38
+ delete(nodeId: string): void;
39
+ /** Flush and clean up timers. Call on shutdown. */
40
+ destroy(): void;
41
+ }
42
+ //# sourceMappingURL=SessionStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionStore.d.ts","sourceRoot":"","sources":["../../src/Structures/SessionStore.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI5C;;;;;;;;;;;GAWG;AACH,qBAAa,gBAAiB,YAAW,YAAY;IAUnD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAV/B,OAAO,CAAC,IAAI,CAA8B;IAC1C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAA8C;IAEhE;;;OAGG;gBAEe,QAAQ,EAAE,MAAM,EAChB,aAAa,SAAO;IAKtC,+BAA+B;IAC/B,OAAO,CAAC,IAAI;IAWZ,4CAA4C;IAC5C,OAAO,CAAC,aAAa;IAarB,0CAA0C;IACnC,KAAK,IAAI,IAAI;IAWb,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIlC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAK5C,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKnC,mDAAmD;IAC5C,OAAO,IAAI,IAAI;CAOtB"}