yukimu 1.0.0 → 1.2.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 (114) hide show
  1. package/.cache/replit/env/latest +88 -0
  2. package/.cache/replit/env/latest.json +1 -0
  3. package/.cache/replit/modules/python-3.11.res +1 -0
  4. package/.cache/replit/nix/dotreplitenv.json +1 -1
  5. package/.cache/replit/toolchain.json +1 -1
  6. package/.local/state/workflow-logs/KRgHXizaECjWI5nWtS7Dj/configure_your_app.packager.installForAll.0 +1 -0
  7. package/.local/state/workflow-logs/KRgHXizaECjWI5nWtS7Dj/configure_your_app.shell.exec.1 +1 -0
  8. package/.local/state/workflow-logs/jVavLOnv1MqxUvxhMmqER/configure_your_app.packager.installForAll.0 +1 -0
  9. package/.local/state/workflow-logs/jVavLOnv1MqxUvxhMmqER/configure_your_app.shell.exec.1 +1 -0
  10. package/.replit +4 -1
  11. package/.upm/store.json +1 -1
  12. package/dist/ConnectionPool.d.ts +34 -0
  13. package/dist/ConnectionPool.d.ts.map +1 -0
  14. package/dist/ConnectionPool.js +124 -0
  15. package/dist/ConnectionPool.js.map +1 -0
  16. package/dist/Constants.d.ts +66 -0
  17. package/dist/Constants.d.ts.map +1 -0
  18. package/dist/Constants.js +101 -0
  19. package/dist/Constants.js.map +1 -0
  20. package/dist/Node.d.ts +26 -10
  21. package/dist/Node.d.ts.map +1 -1
  22. package/dist/Node.js +203 -81
  23. package/dist/Node.js.map +1 -1
  24. package/dist/Player.d.ts +30 -29
  25. package/dist/Player.d.ts.map +1 -1
  26. package/dist/Player.js +178 -97
  27. package/dist/Player.js.map +1 -1
  28. package/dist/Plugin.d.ts +21 -0
  29. package/dist/Plugin.d.ts.map +1 -0
  30. package/dist/Plugin.js +19 -0
  31. package/dist/Plugin.js.map +1 -0
  32. package/dist/Queue.d.ts +10 -16
  33. package/dist/Queue.d.ts.map +1 -1
  34. package/dist/Queue.js +39 -32
  35. package/dist/Queue.js.map +1 -1
  36. package/dist/Resolver.d.ts +4 -21
  37. package/dist/Resolver.d.ts.map +1 -1
  38. package/dist/Resolver.js +28 -66
  39. package/dist/Resolver.js.map +1 -1
  40. package/dist/Rest.d.ts +24 -0
  41. package/dist/Rest.d.ts.map +1 -0
  42. package/dist/Rest.js +104 -0
  43. package/dist/Rest.js.map +1 -0
  44. package/dist/TrackCache.d.ts +21 -0
  45. package/dist/TrackCache.d.ts.map +1 -0
  46. package/dist/TrackCache.js +57 -0
  47. package/dist/TrackCache.js.map +1 -0
  48. package/dist/WsQueue.d.ts +20 -0
  49. package/dist/WsQueue.d.ts.map +1 -0
  50. package/dist/WsQueue.js +74 -0
  51. package/dist/WsQueue.js.map +1 -0
  52. package/dist/Yukimu.d.ts +33 -32
  53. package/dist/Yukimu.d.ts.map +1 -1
  54. package/dist/Yukimu.js +133 -65
  55. package/dist/Yukimu.js.map +1 -1
  56. package/dist/connector/Connector.d.ts +8 -0
  57. package/dist/connector/Connector.d.ts.map +1 -0
  58. package/dist/connector/Connector.js +11 -0
  59. package/dist/connector/Connector.js.map +1 -0
  60. package/dist/connector/DiscordJS.d.ts +25 -0
  61. package/dist/connector/DiscordJS.d.ts.map +1 -0
  62. package/dist/connector/DiscordJS.js +27 -0
  63. package/dist/connector/DiscordJS.js.map +1 -0
  64. package/dist/connector/Eris.d.ts +23 -0
  65. package/dist/connector/Eris.d.ts.map +1 -0
  66. package/dist/connector/Eris.js +30 -0
  67. package/dist/connector/Eris.js.map +1 -0
  68. package/dist/connector/Oceanic.d.ts +20 -0
  69. package/dist/connector/Oceanic.d.ts.map +1 -0
  70. package/dist/connector/Oceanic.js +27 -0
  71. package/dist/connector/Oceanic.js.map +1 -0
  72. package/dist/errors/YukimuError.d.ts +15 -0
  73. package/dist/errors/YukimuError.d.ts.map +1 -0
  74. package/dist/errors/YukimuError.js +35 -0
  75. package/dist/errors/YukimuError.js.map +1 -0
  76. package/dist/index.d.ts +14 -1
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +34 -2
  79. package/dist/index.js.map +1 -1
  80. package/dist/plugins/AutoResume.d.ts +21 -0
  81. package/dist/plugins/AutoResume.d.ts.map +1 -0
  82. package/dist/plugins/AutoResume.js +52 -0
  83. package/dist/plugins/AutoResume.js.map +1 -0
  84. package/dist/plugins/PlayerMoved.d.ts +7 -0
  85. package/dist/plugins/PlayerMoved.d.ts.map +1 -0
  86. package/dist/plugins/PlayerMoved.js +30 -0
  87. package/dist/plugins/PlayerMoved.js.map +1 -0
  88. package/dist/types.d.ts +92 -38
  89. package/dist/types.d.ts.map +1 -1
  90. package/dist/types.js +0 -12
  91. package/dist/types.js.map +1 -1
  92. package/package.json +1 -1
  93. package/src/ConnectionPool.ts +131 -0
  94. package/src/Constants.ts +101 -0
  95. package/src/Node.ts +157 -174
  96. package/src/Player.ts +200 -108
  97. package/src/Plugin.ts +23 -0
  98. package/src/Queue.ts +43 -34
  99. package/src/Resolver.ts +29 -77
  100. package/src/Rest.ts +121 -0
  101. package/src/TrackCache.ts +69 -0
  102. package/src/WsQueue.ts +78 -0
  103. package/src/Yukimu.ts +156 -85
  104. package/src/connector/Connector.ts +13 -0
  105. package/src/connector/DiscordJS.ts +33 -0
  106. package/src/connector/Eris.ts +35 -0
  107. package/src/connector/Oceanic.ts +32 -0
  108. package/src/errors/YukimuError.ts +33 -0
  109. package/src/index.ts +41 -1
  110. package/src/plugins/AutoResume.ts +61 -0
  111. package/src/plugins/PlayerMoved.ts +26 -0
  112. package/src/types.ts +50 -83
  113. package/tsconfig.json +4 -2
  114. package/README.md +0 -152
package/dist/Queue.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Queue.js","sourceRoot":"","sources":["../src/Queue.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Queue.js","sourceRoot":"","sources":["../src/Queue.ts"],"names":[],"mappings":"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"}
@@ -1,30 +1,13 @@
1
- import { SearchResult, SearchSource } from "./types";
2
1
  import type { Yukimu } from "./Yukimu";
2
+ import type { SearchResult, SearchSource } from "./types";
3
3
  export declare class Resolver {
4
4
  private manager;
5
5
  private spotifyToken;
6
6
  private spotifyExpiry;
7
7
  constructor(manager: Yukimu);
8
- /**
9
- * Resolve a query or URL to Lavalink tracks
10
- */
11
- resolve(query: string, source: SearchSource): Promise<SearchResult>;
12
- /**
13
- * Detect what platform a URL belongs to
14
- */
8
+ resolve(query: string, source: SearchSource, requester?: unknown): Promise<SearchResult>;
15
9
  detectSource(url: string): SearchSource | null;
16
- /**
17
- * Get Spotify API token (for resolving Spotify metadata without LavaSrc)
18
- * Only needed if you're NOT using the LavaSrc Lavalink plugin
19
- */
20
- getSpotifyToken(): Promise<string | null>;
21
- /**
22
- * Resolve a Spotify URL to track metadata (title + artist for YouTube fallback search)
23
- * Used when LavaSrc plugin is NOT installed
24
- */
25
- resolveSpotifyFallback(url: string): Promise<{
26
- title: string;
27
- artist: string;
28
- } | null>;
10
+ private getSpotifyToken;
11
+ private resolveSpotifyMeta;
29
12
  }
30
13
  //# sourceMappingURL=Resolver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Resolver.d.ts","sourceRoot":"","sources":["../src/Resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAkC,MAAM,SAAS,CAAC;AACrF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAgCvC,qBAAa,QAAQ;IACnB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,aAAa,CAAa;gBAEtB,OAAO,EAAE,MAAM;IAI3B;;OAEG;IACU,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAgBhF;;OAEG;IACI,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IASrD;;;OAGG;IACU,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAyBtD;;;OAGG;IACU,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAoBpG"}
1
+ {"version":3,"file":"Resolver.d.ts","sourceRoot":"","sources":["../src/Resolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAS,MAAM,SAAS,CAAC;AAEjE,qBAAa,QAAQ;IACnB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,aAAa,CAAa;gBAEtB,OAAO,EAAE,MAAM;IAId,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC;IA2B9F,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;YAOvC,eAAe;YAoBf,kBAAkB;CAWjC"}
package/dist/Resolver.js CHANGED
@@ -1,71 +1,44 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Resolver = void 0;
4
- const types_1 = require("./types");
5
- // ─── URL Patterns ─────────────────────────────────────────────────────────────
6
- const URL_PATTERNS = {
7
- youtube: [
8
- /^https?:\/\/(www\.)?(youtube\.com|youtu\.be)\/.+/,
9
- /^https?:\/\/music\.youtube\.com\/.+/,
10
- ],
11
- spotify: [
12
- /^https?:\/\/open\.spotify\.com\/(track|album|playlist|artist)\/.+/,
13
- ],
14
- soundcloud: [
15
- /^https?:\/\/(www\.)?soundcloud\.com\/.+/,
16
- ],
17
- deezer: [
18
- /^https?:\/\/(www\.)?deezer\.com\/(track|album|playlist)\/.+/,
19
- ],
20
- applemusic: [
21
- /^https?:\/\/music\.apple\.com\/.+/,
22
- ],
23
- tidal: [
24
- /^https?:\/\/(www\.)?tidal\.com\/(browse\/)?(track|album|playlist)\/.+/,
25
- ],
26
- jiosaavn: [
27
- /^https?:\/\/(www\.)?jiosaavn\.com\/.+/,
28
- ],
29
- yandexmusic: [
30
- /^https?:\/\/music\.yandex\.(ru|com)\/.+/,
31
- ],
32
- };
4
+ const Constants_1 = require("./Constants");
33
5
  class Resolver {
34
6
  constructor(manager) {
35
7
  this.spotifyToken = null;
36
8
  this.spotifyExpiry = 0;
37
9
  this.manager = manager;
38
10
  }
39
- /**
40
- * Resolve a query or URL to Lavalink tracks
41
- */
42
- async resolve(query, source) {
11
+ async resolve(query, source, requester) {
43
12
  const node = this.manager.getBestNode();
44
- // Check if query is a direct URL
45
- const detectedSource = this.detectSource(query);
46
- if (detectedSource) {
47
- // It's a URL — pass directly to Lavalink (LavaSrc handles platform resolution)
48
- return node.loadTracks(query);
13
+ const isUrl = /^https?:\/\//.test(query);
14
+ const identifier = isUrl ? query : `${Constants_1.SOURCE_PREFIXES[source] ?? "ytsearch"}:${query}`;
15
+ const result = await node.loadTracks(identifier);
16
+ // Attach requester
17
+ if (requester)
18
+ result.tracks.forEach(t => { t.requester = requester; });
19
+ // Spotify fallback — if LavaSrc not installed
20
+ if ((result.loadType === "error" || result.loadType === "empty") && isUrl) {
21
+ const spotifyMatch = query.match(/spotify\.com\/track\/([a-zA-Z0-9]+)/);
22
+ if (spotifyMatch) {
23
+ const meta = await this.resolveSpotifyMeta(spotifyMatch[1]);
24
+ if (meta)
25
+ return this.resolve(`${meta.title} ${meta.artist}`, "youtube", requester);
26
+ }
27
+ }
28
+ // Cache all returned tracks
29
+ for (const track of result.tracks) {
30
+ if (track.encoded)
31
+ this.manager.trackCache.set(track.encoded, track);
49
32
  }
50
- // It's a search query — use source prefix
51
- const prefix = types_1.SourcePrefixes[source];
52
- return node.loadTracks(`${prefix}:${query}`);
33
+ return result;
53
34
  }
54
- /**
55
- * Detect what platform a URL belongs to
56
- */
57
35
  detectSource(url) {
58
- for (const [source, patterns] of Object.entries(URL_PATTERNS)) {
59
- if (patterns.some(p => p.test(url))) {
36
+ for (const [source, patterns] of Object.entries(Constants_1.URL_PATTERNS)) {
37
+ if (patterns.some(p => p.test(url)))
60
38
  return source;
61
- }
62
39
  }
63
40
  return null;
64
41
  }
65
- /**
66
- * Get Spotify API token (for resolving Spotify metadata without LavaSrc)
67
- * Only needed if you're NOT using the LavaSrc Lavalink plugin
68
- */
69
42
  async getSpotifyToken() {
70
43
  const opts = this.manager.options.spotify;
71
44
  if (!opts)
@@ -86,31 +59,20 @@ class Resolver {
86
59
  this.spotifyExpiry = Date.now() + data.expires_in * 1000 - 5000;
87
60
  return this.spotifyToken;
88
61
  }
89
- catch (err) {
90
- console.error("[Yukimu] Failed to fetch Spotify token:", err);
62
+ catch {
91
63
  return null;
92
64
  }
93
65
  }
94
- /**
95
- * Resolve a Spotify URL to track metadata (title + artist for YouTube fallback search)
96
- * Used when LavaSrc plugin is NOT installed
97
- */
98
- async resolveSpotifyFallback(url) {
66
+ async resolveSpotifyMeta(trackId) {
99
67
  const token = await this.getSpotifyToken();
100
68
  if (!token)
101
69
  return null;
102
- const match = url.match(/spotify\.com\/track\/([a-zA-Z0-9]+)/);
103
- if (!match)
104
- return null;
105
70
  try {
106
- const res = await fetch(`https://api.spotify.com/v1/tracks/${match[1]}`, {
71
+ const res = await fetch(`https://api.spotify.com/v1/tracks/${trackId}`, {
107
72
  headers: { Authorization: `Bearer ${token}` },
108
73
  });
109
74
  const data = await res.json();
110
- return {
111
- title: data.name,
112
- artist: data.artists[0]?.name ?? "Unknown",
113
- };
75
+ return { title: data.name, artist: data.artists[0]?.name ?? "Unknown" };
114
76
  }
115
77
  catch {
116
78
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"Resolver.js","sourceRoot":"","sources":["../src/Resolver.ts"],"names":[],"mappings":"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"}
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,24 @@
1
+ import type { Node } from "./Node";
2
+ import type { SearchResult, Track, NodeStats, NodeInfo } from "./types";
3
+ export declare class Rest {
4
+ private node;
5
+ constructor(node: Node);
6
+ get baseUrl(): string;
7
+ get prefix(): string;
8
+ get headers(): Record<string, string>;
9
+ request<T = unknown>(method: string, path: string, body?: unknown): Promise<T>;
10
+ loadTracks(identifier: string): Promise<SearchResult>;
11
+ decodeTrack(encoded: string): Promise<Track>;
12
+ decodeTracks(encoded: string[]): Promise<Track[]>;
13
+ getInfo(): Promise<NodeInfo>;
14
+ getStats(): Promise<NodeStats>;
15
+ getVersion(): Promise<string>;
16
+ updatePlayer(guildId: string, body: unknown, noReplace?: boolean): Promise<unknown>;
17
+ destroyPlayer(guildId: string): Promise<void>;
18
+ updateSession(body: {
19
+ resuming?: boolean;
20
+ timeout?: number;
21
+ }): Promise<unknown>;
22
+ private normalizeV3;
23
+ }
24
+ //# sourceMappingURL=Rest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Rest.d.ts","sourceRoot":"","sources":["../src/Rest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAIxE,qBAAa,IAAI;IACf,OAAO,CAAC,IAAI,CAAO;gBAEP,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;IAEY,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IA6B9E,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAKrD,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,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAK7B,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;IAK5F,OAAO,CAAC,WAAW;CAcpB"}
package/dist/Rest.js ADDED
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Rest = void 0;
4
+ const YukimuError_1 = require("./errors/YukimuError");
5
+ const TIMEOUT_MS = 15000;
6
+ class Rest {
7
+ constructor(node) {
8
+ this.node = node;
9
+ }
10
+ get baseUrl() {
11
+ const protocol = this.node.options.secure ? "https" : "http";
12
+ return `${protocol}://${this.node.options.host}:${this.node.options.port}`;
13
+ }
14
+ get prefix() {
15
+ return this.node.version === 4 ? "/v4" : "";
16
+ }
17
+ get headers() {
18
+ return {
19
+ Authorization: this.node.options.password,
20
+ "User-Id": this.node.manager.options.clientId,
21
+ "Client-Name": "Yukimu/1.2.0",
22
+ "Content-Type": "application/json",
23
+ ...(this.node.version === 3 ? { "Num-Shards": "1" } : {}),
24
+ };
25
+ }
26
+ async request(method, path, body) {
27
+ const url = `${this.baseUrl}${this.prefix}${path}`;
28
+ const controller = new AbortController();
29
+ const timeout = setTimeout(() => controller.abort(), TIMEOUT_MS);
30
+ try {
31
+ const res = await globalThis.fetch(url, {
32
+ method,
33
+ headers: this.headers,
34
+ body: body ? JSON.stringify(body) : undefined,
35
+ signal: controller.signal,
36
+ });
37
+ clearTimeout(timeout);
38
+ if (!res.ok) {
39
+ const text = await res.text().catch(() => "Unknown error");
40
+ throw new YukimuError_1.RestError(`REST ${res.status} on ${method} ${path}: ${text}`, res.status, path);
41
+ }
42
+ if (res.status === 204)
43
+ return undefined;
44
+ return res.json();
45
+ }
46
+ catch (err) {
47
+ clearTimeout(timeout);
48
+ if (err.name === "AbortError")
49
+ throw new YukimuError_1.RestError(`REST timeout on ${method} ${path}`, 408, path);
50
+ throw err;
51
+ }
52
+ }
53
+ async loadTracks(identifier) {
54
+ const raw = await this.request("GET", `/loadtracks?identifier=${encodeURIComponent(identifier)}`);
55
+ return this.node.version === 3 ? this.normalizeV3(raw) : raw;
56
+ }
57
+ async decodeTrack(encoded) {
58
+ return this.request("GET", `/decodetrack?encodedTrack=${encodeURIComponent(encoded)}`);
59
+ }
60
+ async decodeTracks(encoded) {
61
+ return this.request("POST", `/decodetracks`, encoded);
62
+ }
63
+ async getInfo() {
64
+ return this.request("GET", "/info");
65
+ }
66
+ async getStats() {
67
+ return this.request("GET", "/stats");
68
+ }
69
+ async getVersion() {
70
+ const res = await globalThis.fetch(`${this.baseUrl}/version`, { headers: this.headers });
71
+ return res.text();
72
+ }
73
+ async updatePlayer(guildId, body, noReplace = false) {
74
+ const path = this.node.version === 4
75
+ ? `/sessions/${this.node.sessionId}/players/${guildId}?noReplace=${noReplace}`
76
+ : `/players/${guildId}`;
77
+ return this.request("PATCH", path, body);
78
+ }
79
+ async destroyPlayer(guildId) {
80
+ const path = this.node.version === 4
81
+ ? `/sessions/${this.node.sessionId}/players/${guildId}`
82
+ : `/players/${guildId}`;
83
+ await this.request("DELETE", path);
84
+ }
85
+ async updateSession(body) {
86
+ if (this.node.version !== 4)
87
+ return;
88
+ return this.request("PATCH", `/sessions/${this.node.sessionId}`, body);
89
+ }
90
+ normalizeV3(raw) {
91
+ const loadType = (raw.loadType ?? "").toLowerCase();
92
+ const norm = (tracks) => (tracks ?? []).map((t) => ({ encoded: t.track ?? t.encoded, info: t.info, pluginInfo: t.pluginInfo ?? {} }));
93
+ switch (loadType) {
94
+ case "track_loaded": return { loadType: "track", tracks: norm(raw.tracks) };
95
+ case "playlist_loaded": return { loadType: "playlist", tracks: norm(raw.tracks), playlistInfo: raw.playlistInfo };
96
+ case "search_result": return { loadType: "search", tracks: norm(raw.tracks) };
97
+ case "no_matches": return { loadType: "empty", tracks: [] };
98
+ case "load_failed": return { loadType: "error", tracks: [], exception: raw.exception };
99
+ default: return { loadType: "empty", tracks: [] };
100
+ }
101
+ }
102
+ }
103
+ exports.Rest = Rest;
104
+ //# 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,21 @@
1
+ import type { Track } from "./types";
2
+ /**
3
+ * Track Decode Cache
4
+ * Caches decoded tracks to avoid repeated Lavalink decode calls.
5
+ * TTL-based expiry — default 1 hour.
6
+ */
7
+ export declare class TrackCache {
8
+ private cache;
9
+ private readonly ttl;
10
+ private sweepInterval;
11
+ constructor(ttlMs?: number);
12
+ set(encoded: string, track: Track): void;
13
+ get(encoded: string): Track | null;
14
+ has(encoded: string): boolean;
15
+ delete(encoded: string): void;
16
+ clear(): void;
17
+ private sweep;
18
+ destroy(): void;
19
+ get size(): number;
20
+ }
21
+ //# sourceMappingURL=TrackCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TrackCache.d.ts","sourceRoot":"","sources":["../src/TrackCache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAOrC;;;;GAIG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,aAAa,CAAiC;gBAE1C,KAAK,GAAE,MAAgB;IAO5B,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAOxC,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI;IAUlC,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI7B,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI7B,KAAK,IAAI,IAAI;IAIpB,OAAO,CAAC,KAAK;IAON,OAAO,IAAI,IAAI;IAKtB,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TrackCache = void 0;
4
+ /**
5
+ * Track Decode Cache
6
+ * Caches decoded tracks to avoid repeated Lavalink decode calls.
7
+ * TTL-based expiry — default 1 hour.
8
+ */
9
+ class TrackCache {
10
+ constructor(ttlMs = 3600000 /* 1 hour */) {
11
+ this.cache = new Map();
12
+ this.ttl = ttlMs;
13
+ // Sweep expired entries every 10 minutes
14
+ this.sweepInterval = setInterval(() => this.sweep(), 600000);
15
+ }
16
+ set(encoded, track) {
17
+ this.cache.set(encoded, {
18
+ track,
19
+ expiresAt: Date.now() + this.ttl,
20
+ });
21
+ }
22
+ get(encoded) {
23
+ const entry = this.cache.get(encoded);
24
+ if (!entry)
25
+ return null;
26
+ if (Date.now() > entry.expiresAt) {
27
+ this.cache.delete(encoded);
28
+ return null;
29
+ }
30
+ return entry.track;
31
+ }
32
+ has(encoded) {
33
+ return this.get(encoded) !== null;
34
+ }
35
+ delete(encoded) {
36
+ this.cache.delete(encoded);
37
+ }
38
+ clear() {
39
+ this.cache.clear();
40
+ }
41
+ sweep() {
42
+ const now = Date.now();
43
+ for (const [key, entry] of this.cache) {
44
+ if (now > entry.expiresAt)
45
+ this.cache.delete(key);
46
+ }
47
+ }
48
+ destroy() {
49
+ clearInterval(this.sweepInterval);
50
+ this.cache.clear();
51
+ }
52
+ get size() {
53
+ return this.cache.size;
54
+ }
55
+ }
56
+ exports.TrackCache = TrackCache;
57
+ //# sourceMappingURL=TrackCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TrackCache.js","sourceRoot":"","sources":["../src/TrackCache.ts"],"names":[],"mappings":";;;AAOA;;;;GAIG;AACH,MAAa,UAAU;IAKrB,YAAY,QAAgB,OAAO,CAAC,YAAY;QAJxC,UAAK,GAA4B,IAAI,GAAG,EAAE,CAAC;QAKjD,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;QAEjB,yCAAyC;QACzC,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;IAC/D,CAAC;IAEM,GAAG,CAAC,OAAe,EAAE,KAAY;QACtC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE;YACtB,KAAK;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG;SACjC,CAAC,CAAC;IACL,CAAC;IAEM,GAAG,CAAC,OAAe;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAEM,GAAG,CAAC,OAAe;QACxB,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IACpC,CAAC;IAEM,MAAM,CAAC,OAAe;QAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAEO,KAAK;QACX,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACtC,IAAI,GAAG,GAAG,KAAK,CAAC,SAAS;gBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAEM,OAAO;QACZ,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;CACF;AAxDD,gCAwDC"}
@@ -0,0 +1,20 @@
1
+ import type WebSocket from "ws";
2
+ /**
3
+ * WebSocket Message Queue
4
+ * Queues outgoing WS messages and flushes them on reconnect.
5
+ * Prevents message loss when node briefly disconnects.
6
+ */
7
+ export declare class WsQueue {
8
+ private queue;
9
+ private flushing;
10
+ private ws;
11
+ setSocket(ws: WebSocket | null): void;
12
+ /** Send immediately if connected, else queue */
13
+ send(data: Record<string, unknown>): Promise<void>;
14
+ /** Flush all queued messages after reconnect */
15
+ flush(): void;
16
+ /** Drop all queued messages (on intentional destroy) */
17
+ clear(): void;
18
+ get size(): number;
19
+ }
20
+ //# sourceMappingURL=WsQueue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WsQueue.d.ts","sourceRoot":"","sources":["../src/WsQueue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,IAAI,CAAC;AAQhC;;;;GAIG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,EAAE,CAA0B;IAE7B,SAAS,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI;IAO5C,gDAAgD;IACzC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBzD,gDAAgD;IACzC,KAAK,IAAI,IAAI;IAuBpB,wDAAwD;IACjD,KAAK,IAAI,IAAI;IAOpB,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WsQueue = void 0;
4
+ /**
5
+ * WebSocket Message Queue
6
+ * Queues outgoing WS messages and flushes them on reconnect.
7
+ * Prevents message loss when node briefly disconnects.
8
+ */
9
+ class WsQueue {
10
+ constructor() {
11
+ this.queue = [];
12
+ this.flushing = false;
13
+ this.ws = null;
14
+ }
15
+ setSocket(ws) {
16
+ this.ws = ws;
17
+ if (ws) {
18
+ ws.on("open", () => this.flush());
19
+ }
20
+ }
21
+ /** Send immediately if connected, else queue */
22
+ send(data) {
23
+ return new Promise((resolve, reject) => {
24
+ const serialized = JSON.stringify(data);
25
+ if (this.ws?.readyState === 1 /* OPEN */) {
26
+ this.ws.send(serialized, (err) => {
27
+ if (err)
28
+ reject(err);
29
+ else
30
+ resolve();
31
+ });
32
+ }
33
+ else {
34
+ // Queue for later when reconnected
35
+ this.queue.push({ data: serialized, resolve, reject });
36
+ }
37
+ });
38
+ }
39
+ /** Flush all queued messages after reconnect */
40
+ flush() {
41
+ if (this.flushing || !this.ws)
42
+ return;
43
+ this.flushing = true;
44
+ const toSend = [...this.queue];
45
+ this.queue = [];
46
+ for (const msg of toSend) {
47
+ if (this.ws.readyState !== 1 /* OPEN */) {
48
+ // Re-queue if disconnected again
49
+ this.queue.unshift(msg);
50
+ this.flushing = false;
51
+ return;
52
+ }
53
+ this.ws.send(msg.data, (err) => {
54
+ if (err)
55
+ msg.reject(err);
56
+ else
57
+ msg.resolve();
58
+ });
59
+ }
60
+ this.flushing = false;
61
+ }
62
+ /** Drop all queued messages (on intentional destroy) */
63
+ clear() {
64
+ for (const msg of this.queue) {
65
+ msg.reject(new Error("WsQueue cleared — node destroyed"));
66
+ }
67
+ this.queue = [];
68
+ }
69
+ get size() {
70
+ return this.queue.length;
71
+ }
72
+ }
73
+ exports.WsQueue = WsQueue;
74
+ //# sourceMappingURL=WsQueue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WsQueue.js","sourceRoot":"","sources":["../src/WsQueue.ts"],"names":[],"mappings":";;;AAQA;;;;GAIG;AACH,MAAa,OAAO;IAApB;QACU,UAAK,GAAoB,EAAE,CAAC;QAC5B,aAAQ,GAAG,KAAK,CAAC;QACjB,OAAE,GAAqB,IAAI,CAAC;IA6DtC,CAAC;IA3DQ,SAAS,CAAC,EAAoB;QACnC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,EAAE,EAAE,CAAC;YACP,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,gDAAgD;IACzC,IAAI,CAAC,IAA6B;QACvC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAExC,IAAI,IAAI,CAAC,EAAE,EAAE,UAAU,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC;gBACzC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE;oBAC/B,IAAI,GAAG;wBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;wBAChB,OAAO,EAAE,CAAC;gBACjB,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,mCAAmC;gBACnC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YACzD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,gDAAgD;IACzC,KAAK;QACV,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO;QACtC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAEhB,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC;gBACxC,iCAAiC;gBACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACxB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;gBACtB,OAAO;YACT,CAAC;YACD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC7B,IAAI,GAAG;oBAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;;oBACpB,GAAG,CAAC,OAAO,EAAE,CAAC;YACrB,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,wDAAwD;IACjD,KAAK;QACV,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC7B,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;CACF;AAhED,0BAgEC"}
package/dist/Yukimu.d.ts CHANGED
@@ -2,58 +2,59 @@ import { EventEmitter } from "events";
2
2
  import { Node } from "./Node";
3
3
  import { Player } from "./Player";
4
4
  import { Resolver } from "./Resolver";
5
- import { YukimuOptions, PlayerOptions, YukimuEvents, SearchSource, SearchResult } from "./types";
6
- /**
7
- * Yukimu - A powerful Lavalink v4 wrapper for Discord bots
8
- * Supports: YouTube, YouTube Music, Spotify, Deezer, Apple Music,
9
- * JioSaavn, Tidal, SoundCloud, Yandex Music
10
- */
5
+ import { ConnectionPool } from "./ConnectionPool";
6
+ import { TrackCache } from "./TrackCache";
7
+ import type { Plugin } from "./Plugin";
8
+ import type { Connector } from "./connector/Connector";
9
+ import type { YukimuOptions, NodeOptions, PlayerOptions, YukimuEvents, SearchSource, SearchResult } from "./types";
11
10
  export declare class Yukimu extends EventEmitter {
12
11
  readonly options: YukimuOptions;
13
12
  readonly nodes: Map<string, Node>;
14
13
  readonly players: Map<string, Player>;
14
+ readonly connector: Connector;
15
15
  readonly resolver: Resolver;
16
- /** Send function — you must set this to send voice payloads to Discord */
17
- sendPayload: (guildId: string, payload: unknown) => void;
18
- constructor(options: YukimuOptions);
19
- /** Add a new Lavalink node */
20
- addNode(options: import("./types").NodeOptions): Node;
21
- /** Remove a node by name */
16
+ readonly pool: ConnectionPool;
17
+ readonly trackCache: TrackCache;
18
+ private readonly plugins;
19
+ nodeResolver?: (nodes: Map<string, Node>) => Node | undefined;
20
+ constructor(options: YukimuOptions, connector: Connector, nodes: NodeOptions[], plugins?: Plugin[]);
21
+ use(plugin: Plugin): this;
22
+ unuse(name: string): this;
23
+ getPlugin<T extends Plugin>(name: string): T | undefined;
24
+ addNode(options: NodeOptions): Node;
22
25
  removeNode(name: string): void;
23
- /** Get the best available node (least load) */
26
+ getNode(name?: string): Node;
24
27
  getBestNode(): Node;
25
- /** Create a new player for a guild */
26
28
  createPlayer(options: PlayerOptions): Player;
27
- /** Get an existing player */
28
- getPlayer(guildId: string): Player | undefined;
29
- /** Destroy a player */
30
- destroyPlayer(guildId: string): void;
31
- /**
32
- * Search for tracks across any supported source
33
- * @param query - Search query or direct URL
34
- * @param source - Where to search (youtube, spotify, deezer, etc.)
35
- */
36
- search(query: string, source?: SearchSource): Promise<SearchResult>;
37
- /**
38
- * Handle Discord voice state updates — call this in your bot's
39
- * voiceStateUpdate event handler
40
- */
29
+ getPlayer(guildId: string): Player | null;
30
+ destroyPlayer(guildId: string): Promise<void>;
31
+ search(query: string, options?: {
32
+ source?: SearchSource;
33
+ requester?: unknown;
34
+ }): Promise<SearchResult>;
41
35
  handleVoiceStateUpdate(data: {
42
36
  guild_id?: string;
43
37
  user_id: string;
44
38
  session_id: string;
45
39
  channel_id?: string | null;
46
40
  }): void;
47
- /**
48
- * Handle Discord voice server updates — call this in your bot's
49
- * voiceServerUpdate event handler
50
- */
51
41
  handleVoiceServerUpdate(data: {
52
42
  guild_id: string;
53
43
  token: string;
54
44
  endpoint?: string | null;
55
45
  }): void;
46
+ detectSource(url: string): SearchSource | null;
47
+ getStats(): {
48
+ nodes: number;
49
+ connectedNodes: number;
50
+ players: number;
51
+ playingPlayers: number;
52
+ cachedTracks: number;
53
+ };
54
+ destroy(): void;
56
55
  on<K extends keyof YukimuEvents>(event: K, listener: (...args: YukimuEvents[K]) => void): this;
56
+ once<K extends keyof YukimuEvents>(event: K, listener: (...args: YukimuEvents[K]) => void): this;
57
+ off<K extends keyof YukimuEvents>(event: K, listener: (...args: YukimuEvents[K]) => void): this;
57
58
  emit<K extends keyof YukimuEvents>(event: K, ...args: YukimuEvents[K]): boolean;
58
59
  }
59
60
  //# sourceMappingURL=Yukimu.d.ts.map