magmastream 2.9.1-dev.3 → 2.9.1-dev.4

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/index.d.ts CHANGED
@@ -3499,6 +3499,9 @@ declare abstract class Structure {
3499
3499
  */
3500
3500
  static get<K extends keyof Extendable>(name: K): Extendable[K];
3501
3501
  }
3502
+ declare abstract class JSONUtils {
3503
+ static safe<T>(obj: T, space?: number): string;
3504
+ }
3502
3505
 
3503
3506
  /**
3504
3507
  * Discord.js wrapper for Magmastream.
@@ -3572,5 +3575,5 @@ declare class SeyfertManager extends Manager {
3572
3575
  resolveUser(user: PortableUser | string): Promise<User$3 | PortableUser>;
3573
3576
  }
3574
3577
 
3575
- export { AutoPlayPlatform, AutoPlayUtils, AvailableFilters, DetritusManager, DiscordJSManager, ErisManager, Filters, JsonQueue, LoadTypes, Manager, ManagerEventTypes, MemoryQueue, Node, OceanicManager, Player, PlayerStateEventTypes, PlayerUtils, Plugin, RedisQueue, Rest, SearchPlatform, SeverityTypes, SeyfertManager, SponsorBlockSegment, StateStorageType, StateTypes, Structure, TrackEndReasonTypes, TrackPartial, TrackSourceTypes, TrackUtils, UseNodeOptions };
3578
+ export { AutoPlayPlatform, AutoPlayUtils, AvailableFilters, DetritusManager, DiscordJSManager, ErisManager, Filters, JSONUtils, JsonQueue, LoadTypes, Manager, ManagerEventTypes, MemoryQueue, Node, OceanicManager, Player, PlayerStateEventTypes, PlayerUtils, Plugin, RedisQueue, Rest, SearchPlatform, SeverityTypes, SeyfertManager, SponsorBlockSegment, StateStorageType, StateTypes, Structure, TrackEndReasonTypes, TrackPartial, TrackSourceTypes, TrackUtils, UseNodeOptions };
3576
3579
  export type { AlbumSearchResult, ArtistSearchResult, CPUStats, DiscordPacket, DistortionOptions, EndSpeakingEventVoiceReceiver, EndSpeakingEventVoiceReceiverData, EqualizerBand, ErrorOrEmptySearchResult, Exception, Extendable, FrameStats, IQueue, JsonConfig, KaraokeOptions, LavaPlayer, LavalinkInfo, LavalinkResponse, LoadType, Lyrics, LyricsEvent, LyricsEventType, LyricsFoundEvent, LyricsLine, LyricsLineEvent, LyricsNotFoundEvent, ManagerEvents, ManagerInitOptions, ManagerOptions, MemoryStats, NodeLinkGetLyrics, NodeLinkGetLyricsEmpty, NodeLinkGetLyricsError, NodeLinkGetLyricsMultiple, NodeLinkGetLyricsSingle, NodeMessage, NodeOptions, NodeStats, PlayOptions, PlayerEvent, PlayerEventType, PlayerEvents, PlayerOptions, PlayerStateUpdateEvent, PlayerUpdateVoiceState, PlaylistData, PlaylistInfoData, PlaylistRawData, PlaylistSearchResult, PodcastSearchResult, PortableUser, RedisConfig, RestPlayOptions, ReverbOptions, RotationOptions, SearchQuery, SearchResult, SearchSearchResult, Severity, ShortSearchResult, ShowSearchResult, Sizes, SponsorBlockChapterStarted, SponsorBlockChaptersLoaded, SponsorBlockSegmentEventType, SponsorBlockSegmentEvents, SponsorBlockSegmentSkipped, SponsorBlockSegmentsLoaded, StartSpeakingEventVoiceReceiver, StartSpeakingEventVoiceReceiverData, StateStorageOptions, StationSearchResult, TimescaleOptions, Track, TrackData, TrackDataInfo, TrackEndEvent, TrackEndReason, TrackExceptionEvent, TrackPluginInfo, TrackSearchResult, TrackSourceName, TrackStartEvent, TrackStuckEvent, UseNodeOption, VibratoOptions, VoicePacket, VoiceReceiverEvent, VoiceServer, VoiceServerUpdate, VoiceState, WebSocketClosedEvent };
@@ -5,6 +5,7 @@ const tslib_1 = require("tslib");
5
5
  const Enums_1 = require("../structures/Enums");
6
6
  const path_1 = tslib_1.__importDefault(require("path"));
7
7
  const fs_1 = require("fs");
8
+ const Utils_1 = require("../structures/Utils");
8
9
  /**
9
10
  * The player's queue, the `current` property is the currently playing track, think of the rest as the up-coming tracks.
10
11
  */
@@ -437,7 +438,7 @@ class JsonQueue {
437
438
  */
438
439
  async writeJSON(filePath, data) {
439
440
  await this.ensureDir();
440
- await fs_1.promises.writeFile(filePath, JSON.stringify(data, null, 2), "utf-8");
441
+ await fs_1.promises.writeFile(filePath, Utils_1.JSONUtils.safe(data, 2), "utf-8");
441
442
  }
442
443
  }
443
444
  exports.JsonQueue = JsonQueue;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MemoryQueue = void 0;
4
4
  const Enums_1 = require("../structures/Enums");
5
+ const Utils_1 = require("../structures/Utils");
5
6
  /**
6
7
  * The player's queue, the `current` property is the currently playing track, think of the rest as the up-coming tracks.
7
8
  */
@@ -36,7 +37,7 @@ class MemoryQueue extends Array {
36
37
  const isArray = Array.isArray(track);
37
38
  const tracks = isArray ? [...track] : [track];
38
39
  // Get the track info as a string
39
- const trackInfo = isArray ? tracks.map((t) => JSON.stringify(t, null, 2)).join(", ") : JSON.stringify(track, null, 2);
40
+ const trackInfo = isArray ? tracks.map((t) => Utils_1.JSONUtils.safe(t, 2)).join(", ") : Utils_1.JSONUtils.safe(track, 2);
40
41
  // Emit a debug message
41
42
  this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[QUEUE] Added ${tracks.length} track(s) to queue: ${trackInfo}`);
42
43
  const oldPlayer = this.manager.players.get(this.guildId) ? { ...this.manager.players.get(this.guildId) } : null;
@@ -262,7 +263,7 @@ class MemoryQueue extends Array {
262
263
  }
263
264
  // Single item removal when no end specified
264
265
  const removedTrack = this.splice(startOrPosition, 1);
265
- this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[QUEUE] Removed 1 track from player: ${this.guildId} from position ${startOrPosition}: ${JSON.stringify(removedTrack[0], null, 2)}`);
266
+ this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[QUEUE] Removed 1 track from player: ${this.guildId} from position ${startOrPosition}: ${Utils_1.JSONUtils.safe(removedTrack[0], 2)}`);
266
267
  // Ensure removedTrack is an array for consistency
267
268
  const tracksToEmit = removedTrack.length > 0 ? removedTrack : [];
268
269
  this.manager.emit(Enums_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this.manager.players.get(this.guildId), {
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RedisQueue = void 0;
4
4
  const Enums_1 = require("../structures/Enums");
5
+ const Utils_1 = require("../structures/Utils");
5
6
  /**
6
7
  * The player's queue, the `current` property is the currently playing track, think of the rest as the up-coming tracks.
7
8
  */
@@ -441,7 +442,7 @@ class RedisQueue {
441
442
  * Helper to serialize/deserialize Track
442
443
  */
443
444
  serialize(track) {
444
- return JSON.stringify(track);
445
+ return Utils_1.JSONUtils.safe(track, 2);
445
446
  }
446
447
  }
447
448
  exports.RedisQueue = RedisQueue;
@@ -241,7 +241,7 @@ class Manager extends events_1.EventEmitter {
241
241
  const summary = "tracks" in result
242
242
  ? result.tracks.map((t) => Object.fromEntries(Object.entries(t).filter(([key]) => key !== "requester")))
243
243
  : [];
244
- this.emit(Enums_1.ManagerEventTypes.Debug, `[MANAGER] Result search for ${_query.query}: ${JSON.stringify(summary, null, 2)}`);
244
+ this.emit(Enums_1.ManagerEventTypes.Debug, `[MANAGER] Result search for ${_query.query}: ${Utils_1.JSONUtils.safe(summary, 2)}`);
245
245
  return result;
246
246
  }
247
247
  catch (err) {
@@ -266,7 +266,7 @@ class Manager extends events_1.EventEmitter {
266
266
  return this.players.get(options.guildId);
267
267
  }
268
268
  // Create a new player with the given options
269
- this.emit(Enums_1.ManagerEventTypes.Debug, `[MANAGER] Creating new player with options: ${JSON.stringify(options)}`);
269
+ this.emit(Enums_1.ManagerEventTypes.Debug, `[MANAGER] Creating new player with options: ${Utils_1.JSONUtils.safe(options, 2)}`);
270
270
  return new (Utils_1.Structure.get("Player"))(options);
271
271
  }
272
272
  /**
@@ -297,7 +297,7 @@ class Manager extends events_1.EventEmitter {
297
297
  // Set the node in the manager's collection
298
298
  this.nodes.set(key, node);
299
299
  // Emit a debug event for node creation
300
- this.emit(Enums_1.ManagerEventTypes.Debug, `[MANAGER] Creating new node with options: ${JSON.stringify(options)}`);
300
+ this.emit(Enums_1.ManagerEventTypes.Debug, `[MANAGER] Creating new node with options: ${Utils_1.JSONUtils.safe(options, 2)}`);
301
301
  // Return the created node
302
302
  return node;
303
303
  }
@@ -341,7 +341,7 @@ class Manager extends events_1.EventEmitter {
341
341
  const player = this.getPlayer(update.guild_id);
342
342
  if (!player)
343
343
  return;
344
- this.emit(Enums_1.ManagerEventTypes.Debug, `[MANAGER] Updating voice state: ${JSON.stringify(update)}`);
344
+ this.emit(Enums_1.ManagerEventTypes.Debug, `[MANAGER] Updating voice state: ${Utils_1.JSONUtils.safe(update, 2)}`);
345
345
  if ("token" in update) {
346
346
  return await this.handleVoiceServerUpdate(player, update);
347
347
  }
@@ -357,12 +357,12 @@ class Manager extends events_1.EventEmitter {
357
357
  * @throws Will throw an error if no nodes are available or if the API request fails.
358
358
  */
359
359
  async decodeTracks(tracks) {
360
- this.emit(Enums_1.ManagerEventTypes.Debug, `[MANAGER] Decoding tracks: ${JSON.stringify(tracks)}`);
360
+ this.emit(Enums_1.ManagerEventTypes.Debug, `[MANAGER] Decoding tracks: ${Utils_1.JSONUtils.safe(tracks, 2)}`);
361
361
  return new Promise(async (resolve, reject) => {
362
362
  const node = this.nodes.first();
363
363
  if (!node)
364
364
  throw new Error("No available nodes.");
365
- const res = (await node.rest.post("/v4/decodetracks", JSON.stringify(tracks)).catch((err) => reject(err)));
365
+ const res = (await node.rest.post("/v4/decodetracks", Utils_1.JSONUtils.safe(tracks, 2)).catch((err) => reject(err)));
366
366
  if (!res) {
367
367
  return reject(new Error("No data returned from query."));
368
368
  }
@@ -398,7 +398,7 @@ class Manager extends events_1.EventEmitter {
398
398
  }
399
399
  const serializedPlayer = await Utils_1.PlayerUtils.serializePlayer(player);
400
400
  await promises_1.default.mkdir(path_1.default.dirname(playerStateFilePath), { recursive: true });
401
- await promises_1.default.writeFile(playerStateFilePath, JSON.stringify(serializedPlayer, null, 2), "utf-8");
401
+ await promises_1.default.writeFile(playerStateFilePath, Utils_1.JSONUtils.safe(serializedPlayer, 2), "utf-8");
402
402
  this.emit(Enums_1.ManagerEventTypes.Debug, `[MANAGER] Player state saved: ${guildId}`);
403
403
  }
404
404
  catch (error) {
@@ -418,7 +418,7 @@ class Manager extends events_1.EventEmitter {
418
418
  const redisKey = `${this.options.stateStorage.redisConfig.prefix?.endsWith(":")
419
419
  ? this.options.stateStorage.redisConfig.prefix
420
420
  : this.options.stateStorage.redisConfig.prefix ?? "magmastream:"}playerstore:${guildId}`;
421
- await this.redis.set(redisKey, JSON.stringify(serializedPlayer));
421
+ await this.redis.set(redisKey, Utils_1.JSONUtils.safe(serializedPlayer, 2));
422
422
  this.emit(Enums_1.ManagerEventTypes.Debug, `[MANAGER] Player state saved to Redis: ${guildId}`);
423
423
  }
424
424
  catch (error) {
@@ -488,7 +488,7 @@ class Manager extends events_1.EventEmitter {
488
488
  volume: lavaPlayer.volume || state.options.volume,
489
489
  nodeIdentifier: nodeId,
490
490
  };
491
- this.emit(Enums_1.ManagerEventTypes.Debug, `[MANAGER] Recreating player: ${state.guildId} from saved file: ${JSON.stringify(state.options)}`);
491
+ this.emit(Enums_1.ManagerEventTypes.Debug, `[MANAGER] Recreating player: ${state.guildId} from saved file: ${Utils_1.JSONUtils.safe(state.options, 2)}`);
492
492
  const player = this.create(playerOptions);
493
493
  await player.node.rest.updatePlayer({
494
494
  guildId: state.options.guildId,
@@ -128,7 +128,7 @@ class Node {
128
128
  createSessionIdsFile() {
129
129
  if (!fs_1.default.existsSync(this.sessionIdsFilePath)) {
130
130
  this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[NODE] Creating sessionId file at: ${this.sessionIdsFilePath}`);
131
- fs_1.default.writeFileSync(this.sessionIdsFilePath, JSON.stringify({}), "utf-8");
131
+ fs_1.default.writeFileSync(this.sessionIdsFilePath, Utils_1.JSONUtils.safe({}), "utf-8");
132
132
  }
133
133
  }
134
134
  /**
@@ -178,7 +178,7 @@ class Node {
178
178
  }
179
179
  else {
180
180
  this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[NODE] No sessionIds found in Redis — creating new key.`);
181
- await this.manager.redis.set(key, JSON.stringify({}));
181
+ await this.manager.redis.set(key, Utils_1.JSONUtils.safe({}));
182
182
  this.sessionIdsMap = new Map();
183
183
  }
184
184
  break;
@@ -219,7 +219,7 @@ class Node {
219
219
  }
220
220
  fileData[compositeKey] = this.sessionId;
221
221
  const tmpPath = `${filePath}.tmp`;
222
- fs_1.default.writeFileSync(tmpPath, JSON.stringify(fileData, null, 2), "utf-8");
222
+ fs_1.default.writeFileSync(tmpPath, Utils_1.JSONUtils.safe(fileData, 2), "utf-8");
223
223
  fs_1.default.renameSync(tmpPath, filePath);
224
224
  this.sessionIdsMap = new Map(Object.entries(fileData));
225
225
  updated = true;
@@ -259,7 +259,7 @@ class Node {
259
259
  }
260
260
  sessionIds[compositeKey] = this.sessionId;
261
261
  this.sessionIdsMap = new Map(Object.entries(sessionIds));
262
- await this.manager.redis.set(key, JSON.stringify(sessionIds));
262
+ await this.manager.redis.set(key, Utils_1.JSONUtils.safe(sessionIds));
263
263
  break;
264
264
  }
265
265
  }
@@ -307,7 +307,7 @@ class Node {
307
307
  identifier: this.options.identifier,
308
308
  },
309
309
  };
310
- this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[NODE] Connecting ${JSON.stringify(debugInfo)}`);
310
+ this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[NODE] Connecting ${Utils_1.JSONUtils.safe(debugInfo, 2)}`);
311
311
  }
312
312
  /**
313
313
  * Destroys the node and cleans up associated resources.
@@ -329,7 +329,7 @@ class Node {
329
329
  sessionId: this.sessionId,
330
330
  playerCount: this.manager.players.filter((p) => p.node == this).size,
331
331
  };
332
- this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[NODE] Destroying node: ${JSON.stringify(debugInfo)}`);
332
+ this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[NODE] Destroying node: ${Utils_1.JSONUtils.safe(debugInfo, 2)}`);
333
333
  // Automove all players connected to that node
334
334
  const players = this.manager.players.filter((p) => p.node == this);
335
335
  if (players.size) {
@@ -368,7 +368,7 @@ class Node {
368
368
  maxRetryAttempts: this.options.maxRetryAttempts,
369
369
  retryDelayMs: this.options.retryDelayMs,
370
370
  };
371
- this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[NODE] Reconnecting node: ${JSON.stringify(debugInfo)}`);
371
+ this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[NODE] Reconnecting node: ${Utils_1.JSONUtils.safe(debugInfo, 2)}`);
372
372
  this.reconnectTimeout = setTimeout(async () => {
373
373
  if (this.reconnectAttempts >= this.options.maxRetryAttempts) {
374
374
  const error = new Error(`Unable to connect after ${this.options.maxRetryAttempts} attempts.`);
@@ -405,7 +405,7 @@ class Node {
405
405
  identifier: this.options.identifier,
406
406
  connected: this.connected,
407
407
  };
408
- this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[NODE] Connected node: ${JSON.stringify(debugInfo)}`);
408
+ this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[NODE] Connected node: ${Utils_1.JSONUtils.safe(debugInfo, 2)}`);
409
409
  this.manager.emit(Enums_1.ManagerEventTypes.NodeConnect, this);
410
410
  const playersOnBackupNode = this.manager.players.filter((p) => p.node.options.isBackup);
411
411
  if (playersOnBackupNode.size) {
@@ -432,7 +432,7 @@ class Node {
432
432
  reason,
433
433
  };
434
434
  this.manager.emit(Enums_1.ManagerEventTypes.NodeDisconnect, this, { code, reason });
435
- this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[NODE] Disconnected node: ${JSON.stringify(debugInfo)}`);
435
+ this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[NODE] Disconnected node: ${Utils_1.JSONUtils.safe(debugInfo, 2)}`);
436
436
  if (this.manager.useableNode) {
437
437
  const players = this.manager.players.filter((p) => p.node.options.identifier == this.options.identifier);
438
438
  if (players.size) {
@@ -464,7 +464,7 @@ class Node {
464
464
  identifier: this.options.identifier,
465
465
  error: error.message,
466
466
  };
467
- this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[NODE] Error on node: ${JSON.stringify(debugInfo)}`);
467
+ this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[NODE] Error on node: ${Utils_1.JSONUtils.safe(debugInfo, 2)}`);
468
468
  this.manager.emit(Enums_1.ManagerEventTypes.NodeError, this, error);
469
469
  }
470
470
  /**
@@ -504,11 +504,11 @@ class Node {
504
504
  if (player && player.node.options.identifier !== this.options.identifier) {
505
505
  return;
506
506
  }
507
- this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[NODE] Node message: ${JSON.stringify(payload)}`);
507
+ this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[NODE] Node message: ${Utils_1.JSONUtils.safe(payload, 2)}`);
508
508
  await this.handleEvent(payload);
509
509
  break;
510
510
  case "ready":
511
- this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[NODE] Node message: ${JSON.stringify(payload)}`);
511
+ this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[NODE] Node message: ${Utils_1.JSONUtils.safe(payload, 2)}`);
512
512
  this.rest.setSessionId(payload.sessionId);
513
513
  this.sessionId = payload.sessionId;
514
514
  await this.updateSessionId();
@@ -934,7 +934,7 @@ class Node {
934
934
  */
935
935
  socketClosed(player, payload) {
936
936
  this.manager.emit(Enums_1.ManagerEventTypes.SocketClosed, player, payload);
937
- this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[NODE] Websocket closed for player: ${player.guildId} with payload: ${JSON.stringify(payload)}`);
937
+ this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[NODE] Websocket closed for player: ${player.guildId} with payload: ${Utils_1.JSONUtils.safe(payload, 2)}`);
938
938
  }
939
939
  /**
940
940
  * Emitted when the segments for a track are loaded.
@@ -1045,7 +1045,7 @@ class Node {
1045
1045
  throw new RangeError("No Segments provided. Did you mean to use 'deleteSponsorBlock'?");
1046
1046
  if (segments.some((v) => !validSponsorBlocks.includes(v.toLowerCase())))
1047
1047
  throw new SyntaxError(`You provided a sponsorblock which isn't valid, valid ones are: ${validSponsorBlocks.map((v) => `'${v}'`).join(", ")}`);
1048
- await this.rest.put(`/v4/sessions/${this.sessionId}/players/${player.guildId}/sponsorblock/categories`, JSON.stringify(segments.map((v) => v.toLowerCase())));
1048
+ await this.rest.put(`/v4/sessions/${this.sessionId}/players/${player.guildId}/sponsorblock/categories`, Utils_1.JSONUtils.safe(segments.map((v) => v.toLowerCase()), 2));
1049
1049
  return;
1050
1050
  }
1051
1051
  /**
@@ -903,7 +903,7 @@ class Player {
903
903
  queueSize: clonedPlayer.queue.size,
904
904
  },
905
905
  };
906
- this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[PLAYER] Transferred player to a new server: ${JSON.stringify(debugInfo)}.`);
906
+ this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[PLAYER] Transferred player to a new server: ${Utils_1.JSONUtils.safe(debugInfo, 2)}.`);
907
907
  // Return the cloned player
908
908
  return clonedPlayer;
909
909
  }
@@ -1032,7 +1032,7 @@ class Player {
1032
1032
  const packet = JSON.parse(payload);
1033
1033
  if (!packet?.op)
1034
1034
  return;
1035
- this.manager.emit(Enums_1.ManagerEventTypes.Debug, `VoiceReceiver recieved a payload: ${JSON.stringify(payload)}`);
1035
+ this.manager.emit(Enums_1.ManagerEventTypes.Debug, `VoiceReceiver recieved a payload: ${Utils_1.JSONUtils.safe(payload, 2)}`);
1036
1036
  switch (packet.type) {
1037
1037
  case "startSpeakingEvent": {
1038
1038
  this.manager.emit(Enums_1.ManagerEventTypes.VoiceReceiverStartSpeaking, this, packet.data);
@@ -1047,7 +1047,7 @@ class Player {
1047
1047
  break;
1048
1048
  }
1049
1049
  default: {
1050
- this.manager.emit(Enums_1.ManagerEventTypes.Debug, `VoiceReceiver recieved an unknown payload: ${JSON.stringify(payload)}`);
1050
+ this.manager.emit(Enums_1.ManagerEventTypes.Debug, `VoiceReceiver recieved an unknown payload: ${Utils_1.JSONUtils.safe(payload, 2)}`);
1051
1051
  break;
1052
1052
  }
1053
1053
  }
@@ -4,6 +4,7 @@ exports.Rest = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const axios_1 = tslib_1.__importDefault(require("axios"));
6
6
  const Enums_1 = require("./Enums");
7
+ const Utils_1 = require("./Utils");
7
8
  /** Handles the requests sent to the Lavalink REST API. */
8
9
  class Rest {
9
10
  /** The Node that this Rest instance is connected to. */
@@ -44,7 +45,7 @@ class Rest {
44
45
  // Send a GET request to the Lavalink Node to retrieve all the players.
45
46
  const result = await this.get(`/v4/sessions/${this.sessionId}/players`);
46
47
  // Log the result of the request.
47
- this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[REST] Getting all players on node: ${this.node.options.identifier} : ${JSON.stringify(result)}`);
48
+ this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[REST] Getting all players on node: ${this.node.options.identifier} : ${Utils_1.JSONUtils.safe(result, 2)}`);
48
49
  // Return the result of the request.
49
50
  return result;
50
51
  }
@@ -55,7 +56,7 @@ class Rest {
55
56
  */
56
57
  async updatePlayer(options) {
57
58
  // Log the request.
58
- this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[REST] Updating player: ${options.guildId}: ${JSON.stringify(options)}`);
59
+ this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[REST] Updating player: ${options.guildId}: ${Utils_1.JSONUtils.safe(options, 2)}`);
59
60
  // Send the PATCH request.
60
61
  return await this.patch(`/v4/sessions/${this.sessionId}/players/${options.guildId}?noReplace=false`, options.data);
61
62
  }
@@ -92,7 +93,7 @@ class Rest {
92
93
  * @returns {Promise<unknown>} The response data of the request.
93
94
  */
94
95
  async request(method, endpoint, body) {
95
- this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[REST] ${method} api call for endpoint: ${endpoint} with data: ${JSON.stringify(body)}`);
96
+ this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[REST] ${method} api call for endpoint: ${endpoint} with data: ${Utils_1.JSONUtils.safe(body, 2)}`);
96
97
  const config = {
97
98
  method,
98
99
  url: this.url + endpoint,
@@ -1,12 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Structure = exports.PlayerUtils = exports.AutoPlayUtils = exports.TrackUtils = void 0;
3
+ exports.JSONUtils = exports.Structure = exports.PlayerUtils = exports.AutoPlayUtils = exports.TrackUtils = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  /* eslint-disable @typescript-eslint/no-require-imports */
6
6
  const axios_1 = tslib_1.__importDefault(require("axios"));
7
7
  const jsdom_1 = require("jsdom");
8
8
  const Enums_1 = require("./Enums");
9
9
  const path_1 = tslib_1.__importDefault(require("path"));
10
+ const safe_stable_stringify_1 = tslib_1.__importDefault(require("safe-stable-stringify"));
10
11
  // import playwright from "playwright";
11
12
  /** @hidden */
12
13
  const SIZES = ["0", "1", "2", "3", "default", "mqdefault", "hqdefault", "maxresdefault"];
@@ -601,61 +602,52 @@ class PlayerUtils {
601
602
  * @returns The serialized Player instance
602
603
  */
603
604
  static async serializePlayer(player) {
604
- const seen = new WeakSet();
605
- // Fetch async queue data once before serializing
606
605
  const current = await player.queue.getCurrent();
607
606
  const tracks = Array.isArray(await player.queue.getTracks()) ? await player.queue.getTracks() : [];
608
607
  const previous = Array.isArray(await player.queue.getPrevious()) ? await player.queue.getPrevious() : [];
609
- /**
610
- * Recursively serializes an object, avoiding circular references.
611
- * @param obj The object to serialize
612
- * @returns The serialized object
613
- */
614
- const serialize = (obj) => {
615
- if (obj && typeof obj === "object") {
616
- if (seen.has(obj))
608
+ const seen = new WeakSet();
609
+ // The replacer function
610
+ const replacer = (key, value) => {
611
+ if (value && typeof value === "object") {
612
+ if (seen.has(value))
617
613
  return;
618
- seen.add(obj);
614
+ seen.add(value);
619
615
  }
620
- return obj;
621
- };
622
- return JSON.parse(JSON.stringify(player, (key, value) => {
623
- if (key === "manager") {
616
+ if (key === "manager")
624
617
  return null;
625
- }
626
618
  if (key === "filters") {
627
619
  if (!value || typeof value !== "object")
628
620
  return null;
621
+ const filters = value;
629
622
  return {
630
- distortion: value.distortion ?? null,
631
- equalizer: value.equalizer ?? [],
632
- karaoke: value.karaoke ?? null,
633
- rotation: value.rotation ?? null,
634
- timescale: value.timescale ?? null,
635
- vibrato: value.vibrato ?? null,
636
- reverb: value.reverb ?? null,
637
- volume: value.volume ?? 1.0,
638
- bassBoostlevel: value.bassBoostlevel ?? null,
639
- filterStatus: value.filtersStatus ? { ...value.filtersStatus } : {},
623
+ distortion: filters.distortion ?? null,
624
+ equalizer: filters.equalizer ?? [],
625
+ karaoke: filters.karaoke ?? null,
626
+ rotation: filters.rotation ?? null,
627
+ timescale: filters.timescale ?? null,
628
+ vibrato: filters.vibrato ?? null,
629
+ reverb: filters.reverb ?? null,
630
+ volume: filters.volume ?? 1.0,
631
+ bassBoostlevel: filters.bassBoostlevel ?? null,
632
+ filterStatus: filters.filtersStatus ? { ...filters.filtersStatus } : {},
640
633
  };
641
634
  }
642
635
  if (key === "queue") {
643
- return {
644
- current,
645
- tracks,
646
- previous,
647
- };
636
+ return { current, tracks, previous };
648
637
  }
649
638
  if (key === "data") {
650
- const AutoplayUser = value?.Internal_AutoplayUser;
639
+ const data = value;
640
+ const AutoplayUser = data?.Internal_AutoplayUser;
651
641
  const serializedUser = AutoplayUser ? { id: AutoplayUser.id, username: AutoplayUser.username } : null;
652
642
  return {
653
643
  clientUser: serializedUser,
654
- autoplayTries: value?.autoplayTries ?? null,
644
+ autoplayTries: data?.autoplayTries ?? null,
655
645
  };
656
646
  }
657
- return serialize(value);
658
- }));
647
+ return value;
648
+ };
649
+ const jsonString = (0, safe_stable_stringify_1.default)(player, replacer, 2);
650
+ return JSON.parse(jsonString);
659
651
  }
660
652
  /**
661
653
  * Gets the base directory for player data.
@@ -721,6 +713,12 @@ class Structure {
721
713
  }
722
714
  }
723
715
  exports.Structure = Structure;
716
+ class JSONUtils {
717
+ static safe(obj, space) {
718
+ return (0, safe_stable_stringify_1.default)(obj, null, space);
719
+ }
720
+ }
721
+ exports.JSONUtils = JSONUtils;
724
722
  const structures = {
725
723
  Player: require("./Player").Player,
726
724
  Queue: require("../statestorage/MemoryQueue").MemoryQueue,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "magmastream",
3
- "version": "2.9.1-dev.3",
3
+ "version": "2.9.1-dev.4",
4
4
  "description": "A user-friendly Lavalink client designed for NodeJS.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -35,6 +35,7 @@
35
35
  "ioredis": "^5.6.1",
36
36
  "jsdom": "^26.1.0",
37
37
  "lodash": "^4.17.21",
38
+ "safe-stable-stringify": "^2.5.0",
38
39
  "tslib": "^2.8.1",
39
40
  "ws": "^8.18.3"
40
41
  },