yukimu 2.0.8 → 3.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.
- package/dist/BitrateOptimizer.d.ts +52 -0
- package/dist/BitrateOptimizer.d.ts.map +1 -0
- package/dist/BitrateOptimizer.js +115 -0
- package/dist/BitrateOptimizer.js.map +1 -0
- package/dist/ConnectionPool.d.ts +84 -0
- package/dist/ConnectionPool.d.ts.map +1 -0
- package/dist/ConnectionPool.js +203 -0
- package/dist/ConnectionPool.js.map +1 -0
- package/dist/Constants.d.ts +47 -0
- package/dist/Constants.d.ts.map +1 -0
- package/dist/Constants.js +170 -0
- package/dist/Constants.js.map +1 -0
- package/dist/Logger.d.ts +22 -0
- package/dist/Logger.d.ts.map +1 -0
- package/dist/Logger.js +74 -0
- package/dist/Logger.js.map +1 -0
- package/dist/Node.d.ts +61 -0
- package/dist/Node.d.ts.map +1 -0
- package/dist/Node.js +446 -0
- package/dist/Node.js.map +1 -0
- package/dist/Player.d.ts +143 -0
- package/dist/Player.d.ts.map +1 -0
- package/dist/Player.js +574 -0
- package/dist/Player.js.map +1 -0
- package/dist/Plugin.d.ts +25 -0
- package/dist/Plugin.d.ts.map +1 -0
- package/dist/Plugin.js +15 -0
- package/dist/Plugin.js.map +1 -0
- package/dist/Queue.d.ts +89 -0
- package/dist/Queue.d.ts.map +1 -0
- package/dist/Queue.js +188 -0
- package/dist/Queue.js.map +1 -0
- package/dist/Resolver.d.ts +68 -0
- package/dist/Resolver.d.ts.map +1 -0
- package/dist/Resolver.js +361 -0
- package/dist/Resolver.js.map +1 -0
- package/dist/Rest.d.ts +46 -0
- package/dist/Rest.d.ts.map +1 -0
- package/dist/Rest.js +247 -0
- package/dist/Rest.js.map +1 -0
- package/dist/TrackCache.d.ts +41 -0
- package/dist/TrackCache.d.ts.map +1 -0
- package/dist/TrackCache.js +144 -0
- package/dist/TrackCache.js.map +1 -0
- package/dist/WsQueue.d.ts +41 -0
- package/dist/WsQueue.d.ts.map +1 -0
- package/dist/WsQueue.js +116 -0
- package/dist/WsQueue.js.map +1 -0
- package/dist/Yukimu.d.ts +84 -0
- package/dist/Yukimu.d.ts.map +1 -0
- package/dist/Yukimu.js +290 -0
- package/dist/Yukimu.js.map +1 -0
- package/dist/connector/Connector.d.ts +34 -0
- package/dist/connector/Connector.d.ts.map +1 -0
- package/dist/connector/Connector.js +39 -0
- package/dist/connector/Connector.js.map +1 -0
- package/dist/connector/DiscordJS.d.ts +27 -0
- package/dist/connector/DiscordJS.d.ts.map +1 -0
- package/dist/connector/DiscordJS.js +69 -0
- package/dist/connector/DiscordJS.js.map +1 -0
- package/dist/connector/Eris.d.ts +19 -0
- package/dist/connector/Eris.d.ts.map +1 -0
- package/dist/connector/Eris.js +62 -0
- package/dist/connector/Eris.js.map +1 -0
- package/dist/connector/Oceanic.d.ts +19 -0
- package/dist/connector/Oceanic.d.ts.map +1 -0
- package/dist/connector/Oceanic.js +60 -0
- package/dist/connector/Oceanic.js.map +1 -0
- package/dist/errors/YukimuError.d.ts +51 -0
- package/dist/errors/YukimuError.d.ts.map +1 -0
- package/dist/errors/YukimuError.js +105 -0
- package/dist/errors/YukimuError.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +70 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/AutoResume.d.ts +25 -0
- package/dist/plugins/AutoResume.d.ts.map +1 -0
- package/dist/plugins/AutoResume.js +132 -0
- package/dist/plugins/AutoResume.js.map +1 -0
- package/dist/plugins/AutoplayPlugin.d.ts +35 -0
- package/dist/plugins/AutoplayPlugin.d.ts.map +1 -0
- package/dist/plugins/AutoplayPlugin.js +111 -0
- package/dist/plugins/AutoplayPlugin.js.map +1 -0
- package/dist/plugins/InactivityPlugin.d.ts +30 -0
- package/dist/plugins/InactivityPlugin.d.ts.map +1 -0
- package/dist/plugins/InactivityPlugin.js +86 -0
- package/dist/plugins/InactivityPlugin.js.map +1 -0
- package/dist/plugins/PlayerMoved.d.ts +29 -0
- package/dist/plugins/PlayerMoved.d.ts.map +1 -0
- package/dist/plugins/PlayerMoved.js +75 -0
- package/dist/plugins/PlayerMoved.js.map +1 -0
- package/dist/types.d.ts +309 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/package.json +4 -4
package/dist/Resolver.js
ADDED
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** Yukimu v2.0.0 — Track Resolver with Retry, Caching & Fallback */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.Resolver = void 0;
|
|
5
|
+
const Constants_1 = require("./Constants");
|
|
6
|
+
/** Maximum time (ms) a single resolve() call is allowed to take before aborting */
|
|
7
|
+
const SEARCH_TIMEOUT = 8_000;
|
|
8
|
+
/** Maximum time (ms) for Spotify playlist/album batch resolution */
|
|
9
|
+
const SPOTIFY_BATCH_TIMEOUT = 30_000;
|
|
10
|
+
/** Number of Spotify tracks to resolve concurrently */
|
|
11
|
+
const SPOTIFY_CONCURRENCY = 5;
|
|
12
|
+
/**
|
|
13
|
+
* Resolves search queries and URLs into playable tracks.
|
|
14
|
+
*
|
|
15
|
+
* Improvements from v1:
|
|
16
|
+
* - Accepts optional `node` parameter (loads on the correct node for a player)
|
|
17
|
+
* - Search retry with fallback sources
|
|
18
|
+
* - Search result caching
|
|
19
|
+
* - Spotify playlist/album resolution
|
|
20
|
+
* - Spotify token refresh with retry and timeout
|
|
21
|
+
* - Rate limit handling for Spotify API
|
|
22
|
+
*/
|
|
23
|
+
class Resolver {
|
|
24
|
+
manager;
|
|
25
|
+
spotifyToken = null;
|
|
26
|
+
spotifyExpiry = 0;
|
|
27
|
+
spotifyRefreshing = false;
|
|
28
|
+
constructor(manager) {
|
|
29
|
+
this.manager = manager;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Resolve a query (URL or search term) into tracks.
|
|
33
|
+
*
|
|
34
|
+
* @param query - A URL or search query string
|
|
35
|
+
* @param source - The search source to use (ignored for URLs)
|
|
36
|
+
* @param requester - Optional requester metadata to attach to tracks
|
|
37
|
+
* @param node - Optional specific node to use for loading
|
|
38
|
+
*/
|
|
39
|
+
async resolve(query, source, requester, node) {
|
|
40
|
+
const isUrl = /^https?:\/\//.test(query);
|
|
41
|
+
const prefix = Constants_1.SOURCE_PREFIXES[source];
|
|
42
|
+
const identifier = isUrl ? query : `${prefix ?? "ytsearch"}:${query}`;
|
|
43
|
+
// Check search cache first
|
|
44
|
+
const cached = this.manager.trackCache.getSearch(identifier);
|
|
45
|
+
if (cached) {
|
|
46
|
+
this.manager.logger.debug(`Search cache hit for: ${identifier.slice(0, 80)}`);
|
|
47
|
+
// Clone and attach requester
|
|
48
|
+
const result = { ...cached, tracks: [...cached.tracks] };
|
|
49
|
+
if (requester)
|
|
50
|
+
this.attachRequester(result.tracks, requester);
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
// Wrap the entire search in a timeout to prevent indefinite blocking
|
|
54
|
+
const result = await this.resolveWithTimeout(identifier, node, isUrl, query, source, requester);
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Internal resolve with an overall timeout and node failover.
|
|
59
|
+
* If the primary node fails or times out, tries a different connected node.
|
|
60
|
+
*/
|
|
61
|
+
async resolveWithTimeout(identifier, node, isUrl, query, source, requester) {
|
|
62
|
+
const targetNode = node ?? this.getLoadNode();
|
|
63
|
+
// Race the search against a timeout
|
|
64
|
+
const searchPromise = this.tryLoadWithRetries(targetNode, identifier);
|
|
65
|
+
let result = await this.raceTimeout(searchPromise, SEARCH_TIMEOUT);
|
|
66
|
+
// If primary node failed or timed out, try failover to a different node
|
|
67
|
+
if (!result || result.loadType === "error") {
|
|
68
|
+
const fallbackNode = this.getFallbackNode(targetNode);
|
|
69
|
+
if (fallbackNode) {
|
|
70
|
+
this.manager.logger.debug(`Failing over search from "${targetNode.options.name}" to "${fallbackNode.options.name}" for: ${identifier.slice(0, 80)}`);
|
|
71
|
+
const fallbackPromise = this.tryLoadWithRetries(fallbackNode, identifier);
|
|
72
|
+
const fallbackResult = await this.raceTimeout(fallbackPromise, SEARCH_TIMEOUT);
|
|
73
|
+
if (fallbackResult && fallbackResult.loadType !== "error") {
|
|
74
|
+
result = fallbackResult;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (!result) {
|
|
79
|
+
this.manager.logger.warn(`All loadTracks attempts failed for: ${identifier.slice(0, 80)}`);
|
|
80
|
+
return { loadType: "error", tracks: [], exception: { severity: "common", cause: "Search timed out", message: "Search timed out on all available nodes" } };
|
|
81
|
+
}
|
|
82
|
+
if (!result.tracks)
|
|
83
|
+
result.tracks = [];
|
|
84
|
+
// Attach requester
|
|
85
|
+
if (requester && result.tracks.length > 0) {
|
|
86
|
+
this.attachRequester(result.tracks, requester);
|
|
87
|
+
}
|
|
88
|
+
// Spotify fallback — if LavaSrc is not installed, try to resolve via metadata
|
|
89
|
+
// Only attempt if the original query was a Spotify URL (prevents recursive loops)
|
|
90
|
+
if ((result.loadType === "error" || result.loadType === "empty") && isUrl && /spotify\.com/.test(query)) {
|
|
91
|
+
const spotifyFallback = await this.raceTimeout(this.trySpotifyFallback(query, source, requester), SPOTIFY_BATCH_TIMEOUT);
|
|
92
|
+
if (spotifyFallback)
|
|
93
|
+
return spotifyFallback;
|
|
94
|
+
}
|
|
95
|
+
// Cache successful results
|
|
96
|
+
if (result.tracks.length > 0) {
|
|
97
|
+
this.manager.trackCache.setSearch(identifier, result);
|
|
98
|
+
// Also cache individual tracks
|
|
99
|
+
for (const track of result.tracks) {
|
|
100
|
+
if (track?.encoded) {
|
|
101
|
+
this.manager.trackCache.set(track.encoded, track);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Try loading tracks with retries on a specific node.
|
|
109
|
+
* Separated so we can run this against different nodes for failover.
|
|
110
|
+
*/
|
|
111
|
+
async tryLoadWithRetries(targetNode, identifier) {
|
|
112
|
+
let result = null;
|
|
113
|
+
let lastError = null;
|
|
114
|
+
for (let attempt = 0; attempt <= Constants_1.DEFAULTS.MAX_SEARCH_RETRIES; attempt++) {
|
|
115
|
+
try {
|
|
116
|
+
result = await targetNode.loadTracks(identifier);
|
|
117
|
+
if (result && result.loadType !== "error")
|
|
118
|
+
break;
|
|
119
|
+
lastError = result?.exception;
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
lastError = err;
|
|
123
|
+
this.manager.logger.debug(`loadTracks attempt ${attempt + 1} failed on "${targetNode.options.name}" for "${identifier.slice(0, 80)}": ${err}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (!result && lastError) {
|
|
127
|
+
return { loadType: "error", tracks: [], exception: { severity: "common", cause: String(lastError), message: String(lastError) } };
|
|
128
|
+
}
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Race a promise against a timeout. Returns null if the timeout fires first.
|
|
133
|
+
*/
|
|
134
|
+
raceTimeout(promise, timeoutMs) {
|
|
135
|
+
return Promise.race([
|
|
136
|
+
promise.catch(() => null),
|
|
137
|
+
new Promise((resolve) => {
|
|
138
|
+
const timer = setTimeout(() => resolve(null), timeoutMs);
|
|
139
|
+
// Don't keep the process alive for this timer
|
|
140
|
+
if (timer.unref)
|
|
141
|
+
timer.unref();
|
|
142
|
+
}),
|
|
143
|
+
]);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Detect the source platform from a URL.
|
|
147
|
+
*/
|
|
148
|
+
detectSource(url) {
|
|
149
|
+
for (const [source, patterns] of Object.entries(Constants_1.URL_PATTERNS)) {
|
|
150
|
+
if (patterns.some((p) => p.test(url)))
|
|
151
|
+
return source;
|
|
152
|
+
}
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
// ─── Spotify Fallback ─────────────────────────────────────────────────
|
|
156
|
+
async trySpotifyFallback(query, _source, requester) {
|
|
157
|
+
// Single track
|
|
158
|
+
const trackMatch = query.match(/spotify\.com\/track\/([a-zA-Z0-9]+)/);
|
|
159
|
+
if (trackMatch?.[1]) {
|
|
160
|
+
const meta = await this.resolveSpotifyMeta(trackMatch[1]);
|
|
161
|
+
if (meta) {
|
|
162
|
+
return this.resolve(`${meta.title} ${meta.artist}`, "youtube", requester);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Playlist
|
|
166
|
+
const playlistMatch = query.match(/spotify\.com\/playlist\/([a-zA-Z0-9]+)/);
|
|
167
|
+
if (playlistMatch?.[1]) {
|
|
168
|
+
const tracks = await this.resolveSpotifyPlaylist(playlistMatch[1]);
|
|
169
|
+
if (tracks.length > 0) {
|
|
170
|
+
// Resolve first 50 tracks via YouTube search — in concurrent batches to avoid hanging
|
|
171
|
+
const resolved = await this.resolveSpotifyBatch(tracks.slice(0, 50), requester);
|
|
172
|
+
if (resolved.length > 0) {
|
|
173
|
+
return { loadType: "playlist", tracks: resolved, playlistInfo: { name: "Spotify Playlist", selectedTrack: 0 } };
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Album
|
|
178
|
+
const albumMatch = query.match(/spotify\.com\/album\/([a-zA-Z0-9]+)/);
|
|
179
|
+
if (albumMatch?.[1]) {
|
|
180
|
+
const tracks = await this.resolveSpotifyAlbum(albumMatch[1]);
|
|
181
|
+
if (tracks.length > 0) {
|
|
182
|
+
const resolved = await this.resolveSpotifyBatch(tracks.slice(0, 50), requester);
|
|
183
|
+
if (resolved.length > 0) {
|
|
184
|
+
return { loadType: "playlist", tracks: resolved, playlistInfo: { name: "Spotify Album", selectedTrack: 0 } };
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
// ─── Spotify API ──────────────────────────────────────────────────────
|
|
191
|
+
async getSpotifyToken() {
|
|
192
|
+
const opts = this.manager.options.spotify;
|
|
193
|
+
if (!opts)
|
|
194
|
+
return null;
|
|
195
|
+
// Return cached token if still valid
|
|
196
|
+
if (this.spotifyToken && Date.now() < this.spotifyExpiry) {
|
|
197
|
+
return this.spotifyToken;
|
|
198
|
+
}
|
|
199
|
+
// Prevent concurrent refresh
|
|
200
|
+
if (this.spotifyRefreshing) {
|
|
201
|
+
await this.sleep(1000);
|
|
202
|
+
return this.spotifyToken;
|
|
203
|
+
}
|
|
204
|
+
this.spotifyRefreshing = true;
|
|
205
|
+
try {
|
|
206
|
+
const controller = new AbortController();
|
|
207
|
+
const timeout = setTimeout(() => controller.abort(), 10_000);
|
|
208
|
+
const res = await fetch("https://accounts.spotify.com/api/token", {
|
|
209
|
+
method: "POST",
|
|
210
|
+
headers: {
|
|
211
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
212
|
+
Authorization: `Basic ${Buffer.from(`${opts.clientId}:${opts.clientSecret}`).toString("base64")}`,
|
|
213
|
+
},
|
|
214
|
+
body: "grant_type=client_credentials",
|
|
215
|
+
signal: controller.signal,
|
|
216
|
+
});
|
|
217
|
+
clearTimeout(timeout);
|
|
218
|
+
if (!res.ok) {
|
|
219
|
+
this.manager.logger.warn(`Spotify token request failed: ${res.status}`);
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
const data = (await res.json());
|
|
223
|
+
this.spotifyToken = data.access_token;
|
|
224
|
+
this.spotifyExpiry = Date.now() + data.expires_in * 1000 - Constants_1.DEFAULTS.SPOTIFY_TOKEN_REFRESH_BUFFER;
|
|
225
|
+
return this.spotifyToken;
|
|
226
|
+
}
|
|
227
|
+
catch (err) {
|
|
228
|
+
this.manager.logger.warn(`Spotify token refresh failed: ${err}`);
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
finally {
|
|
232
|
+
this.spotifyRefreshing = false;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
async resolveSpotifyMeta(trackId) {
|
|
236
|
+
const token = await this.getSpotifyToken();
|
|
237
|
+
if (!token)
|
|
238
|
+
return null;
|
|
239
|
+
try {
|
|
240
|
+
const controller = new AbortController();
|
|
241
|
+
const timeout = setTimeout(() => controller.abort(), 10_000);
|
|
242
|
+
const res = await fetch(`https://api.spotify.com/v1/tracks/${encodeURIComponent(trackId)}`, {
|
|
243
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
244
|
+
signal: controller.signal,
|
|
245
|
+
});
|
|
246
|
+
clearTimeout(timeout);
|
|
247
|
+
if (!res.ok)
|
|
248
|
+
return null;
|
|
249
|
+
const data = (await res.json());
|
|
250
|
+
return {
|
|
251
|
+
title: data.name,
|
|
252
|
+
artist: data.artists?.[0]?.name ?? "Unknown",
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
async resolveSpotifyPlaylist(playlistId) {
|
|
260
|
+
const token = await this.getSpotifyToken();
|
|
261
|
+
if (!token)
|
|
262
|
+
return [];
|
|
263
|
+
try {
|
|
264
|
+
const controller = new AbortController();
|
|
265
|
+
const timeout = setTimeout(() => controller.abort(), 15_000);
|
|
266
|
+
const res = await fetch(`https://api.spotify.com/v1/playlists/${encodeURIComponent(playlistId)}/tracks?limit=50`, {
|
|
267
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
268
|
+
signal: controller.signal,
|
|
269
|
+
});
|
|
270
|
+
clearTimeout(timeout);
|
|
271
|
+
if (!res.ok)
|
|
272
|
+
return [];
|
|
273
|
+
const data = (await res.json());
|
|
274
|
+
return data.items
|
|
275
|
+
.filter((item) => item.track)
|
|
276
|
+
.map((item) => ({
|
|
277
|
+
title: item.track.name,
|
|
278
|
+
artist: item.track.artists?.[0]?.name ?? "Unknown",
|
|
279
|
+
}));
|
|
280
|
+
}
|
|
281
|
+
catch {
|
|
282
|
+
return [];
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
async resolveSpotifyAlbum(albumId) {
|
|
286
|
+
const token = await this.getSpotifyToken();
|
|
287
|
+
if (!token)
|
|
288
|
+
return [];
|
|
289
|
+
try {
|
|
290
|
+
const controller = new AbortController();
|
|
291
|
+
const timeout = setTimeout(() => controller.abort(), 15_000);
|
|
292
|
+
const res = await fetch(`https://api.spotify.com/v1/albums/${encodeURIComponent(albumId)}/tracks?limit=50`, {
|
|
293
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
294
|
+
signal: controller.signal,
|
|
295
|
+
});
|
|
296
|
+
clearTimeout(timeout);
|
|
297
|
+
if (!res.ok)
|
|
298
|
+
return [];
|
|
299
|
+
const data = (await res.json());
|
|
300
|
+
return data.items.map((item) => ({
|
|
301
|
+
title: item.name,
|
|
302
|
+
artist: item.artists?.[0]?.name ?? "Unknown",
|
|
303
|
+
}));
|
|
304
|
+
}
|
|
305
|
+
catch {
|
|
306
|
+
return [];
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
// ─── Helpers ──────────────────────────────────────────────────────────
|
|
310
|
+
/**
|
|
311
|
+
* Resolve a batch of Spotify track metadata concurrently with a concurrency
|
|
312
|
+
* limit. Prevents the sequential N × 15s timeout that caused player freezes.
|
|
313
|
+
*/
|
|
314
|
+
async resolveSpotifyBatch(metas, requester) {
|
|
315
|
+
const resolved = [];
|
|
316
|
+
// Process in batches of SPOTIFY_CONCURRENCY
|
|
317
|
+
for (let i = 0; i < metas.length; i += SPOTIFY_CONCURRENCY) {
|
|
318
|
+
const batch = metas.slice(i, i + SPOTIFY_CONCURRENCY);
|
|
319
|
+
const promises = batch.map(async (meta) => {
|
|
320
|
+
try {
|
|
321
|
+
const result = await this.resolve(`${meta.title} ${meta.artist}`, "youtube", requester);
|
|
322
|
+
return result.tracks[0] ?? null;
|
|
323
|
+
}
|
|
324
|
+
catch {
|
|
325
|
+
return null;
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
const results = await Promise.allSettled(promises);
|
|
329
|
+
for (const r of results) {
|
|
330
|
+
if (r.status === "fulfilled" && r.value) {
|
|
331
|
+
resolved.push(r.value);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
return resolved;
|
|
336
|
+
}
|
|
337
|
+
getLoadNode() {
|
|
338
|
+
return this.manager.getBestNode();
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Get a fallback node that is different from the given node.
|
|
342
|
+
* Used when the primary node fails or times out during search.
|
|
343
|
+
*/
|
|
344
|
+
getFallbackNode(exclude) {
|
|
345
|
+
const connected = [...this.manager.nodes.values()].filter((n) => n.connected && n !== exclude);
|
|
346
|
+
if (connected.length === 0)
|
|
347
|
+
return null;
|
|
348
|
+
// Pick the one with lowest penalties
|
|
349
|
+
return connected.sort((a, b) => a.calculatePenalties() - b.calculatePenalties())[0] ?? null;
|
|
350
|
+
}
|
|
351
|
+
attachRequester(tracks, requester) {
|
|
352
|
+
for (const t of tracks) {
|
|
353
|
+
t["requester"] = requester;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
sleep(ms) {
|
|
357
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
exports.Resolver = Resolver;
|
|
361
|
+
//# sourceMappingURL=Resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Resolver.js","sourceRoot":"","sources":["../src/Resolver.ts"],"names":[],"mappings":"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"}
|
package/dist/Rest.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/** Yukimu v2.0.0 — REST Client with Retry, Rate Limiting & Circuit Breaker */
|
|
2
|
+
import type { Node } from "./Node";
|
|
3
|
+
import type { SearchResult, Track, NodeStats, NodeInfo } from "./types";
|
|
4
|
+
/**
|
|
5
|
+
* REST client for communicating with a Lavalink node's HTTP API.
|
|
6
|
+
*
|
|
7
|
+
* Improvements from v1:
|
|
8
|
+
* - Automatic retry with exponential backoff for 429/5xx errors
|
|
9
|
+
* - Rate limit tracking (respects Retry-After headers)
|
|
10
|
+
* - Request timeout with proper AbortController cleanup
|
|
11
|
+
* - Uses VERSION constant for Client-Name header
|
|
12
|
+
* - Fixed v4.2+ data normalization bug (single track vs array)
|
|
13
|
+
* - Per-path rate limit awareness
|
|
14
|
+
* - Circuit breaker: after N consecutive failures, stop sending requests temporarily
|
|
15
|
+
*/
|
|
16
|
+
export declare class Rest {
|
|
17
|
+
private readonly node;
|
|
18
|
+
private rateLimit;
|
|
19
|
+
private consecutiveFailures;
|
|
20
|
+
private circuitOpenUntil;
|
|
21
|
+
private static readonly MAX_CONSECUTIVE_FAILURES;
|
|
22
|
+
private static readonly CIRCUIT_OPEN_DURATION;
|
|
23
|
+
constructor(node: Node);
|
|
24
|
+
get baseUrl(): string;
|
|
25
|
+
get prefix(): string;
|
|
26
|
+
get headers(): Record<string, string>;
|
|
27
|
+
request<T = unknown>(method: string, path: string, body?: unknown, retries?: number, timeoutMs?: number): Promise<T>;
|
|
28
|
+
loadTracks(identifier: string): Promise<SearchResult>;
|
|
29
|
+
decodeTrack(encoded: string): Promise<Track>;
|
|
30
|
+
decodeTracks(encoded: string[]): Promise<Track[]>;
|
|
31
|
+
getInfo(): Promise<NodeInfo>;
|
|
32
|
+
getStats(): Promise<NodeStats>;
|
|
33
|
+
updatePlayer(guildId: string, body: unknown, noReplace?: boolean): Promise<unknown>;
|
|
34
|
+
destroyPlayer(guildId: string): Promise<void>;
|
|
35
|
+
updateSession(body: {
|
|
36
|
+
resuming?: boolean;
|
|
37
|
+
timeout?: number;
|
|
38
|
+
}): Promise<unknown>;
|
|
39
|
+
private normalizeV4;
|
|
40
|
+
private normalizeV3;
|
|
41
|
+
private updateRateLimit;
|
|
42
|
+
private parseRetryAfter;
|
|
43
|
+
private getRetryDelay;
|
|
44
|
+
private sleep;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=Rest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Rest.d.ts","sourceRoot":"","sources":["../src/Rest.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAI9E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAY,MAAM,SAAS,CAAC;AASlF;;;;;;;;;;;GAWG;AACH,qBAAa,IAAI;IACf,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAO;IAC5B,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,gBAAgB,CAAK;IAE7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAK;IACrD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAU;gBAE3C,IAAI,EAAE,IAAI;IAItB,IAAI,OAAO,IAAI,MAAM,CAGpB;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQpC;IAIY,OAAO,CAAC,CAAC,GAAG,OAAO,EAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,GAAE,MAAkC,EAC3C,SAAS,GAAE,MAA8B,GACxC,OAAO,CAAC,CAAC,CAAC;IA4GA,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAarD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAI5C,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAIjD,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC;IAI5B,QAAQ,IAAI,OAAO,CAAC,SAAS,CAAC;IAI9B,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAOjF,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7C,aAAa,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAO5F,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,WAAW;IAyCnB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,KAAK;CAGd"}
|