magmastream 2.9.0-dev.43 → 2.9.0-dev.45

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
@@ -2441,13 +2441,6 @@ declare class Manager extends EventEmitter {
2441
2441
  * @returns The player if it exists, undefined otherwise.
2442
2442
  */
2443
2443
  getPlayer(guildId: string): Player | undefined;
2444
- /**
2445
- * @deprecated - Will be removed with v2.10.0 use {@link getPlayer} instead
2446
- * Returns a player or undefined if it does not exist.
2447
- * @param guildId The guild ID of the player to retrieve.
2448
- * @returns The player if it exists, undefined otherwise.
2449
- */
2450
- get(guildId: string): Promise<Player | undefined>;
2451
2444
  /**
2452
2445
  * Creates a player or returns one if it already exists.
2453
2446
  * @param options The options to create the player with.
@@ -57,6 +57,7 @@ class JsonQueue {
57
57
  * @param queue The queue.
58
58
  */
59
59
  async setQueue(queue) {
60
+ await this.deleteFile(this.queuePath);
60
61
  await this.writeJSON(this.queuePath, queue);
61
62
  }
62
63
  /**
@@ -49,6 +49,7 @@ class Manager extends events_1.EventEmitter {
49
49
  // Initialize structures
50
50
  Utils_1.Structure.get("Player").init(this);
51
51
  Utils_1.TrackUtils.init(this);
52
+ Utils_1.PlayerUtils.init(this);
52
53
  if (options.trackPartial) {
53
54
  Utils_1.TrackUtils.setTrackPartial(options.trackPartial);
54
55
  delete options.trackPartial;
@@ -264,15 +265,6 @@ class Manager extends events_1.EventEmitter {
264
265
  getPlayer(guildId) {
265
266
  return this.players.get(guildId);
266
267
  }
267
- /**
268
- * @deprecated - Will be removed with v2.10.0 use {@link getPlayer} instead
269
- * Returns a player or undefined if it does not exist.
270
- * @param guildId The guild ID of the player to retrieve.
271
- * @returns The player if it exists, undefined otherwise.
272
- */
273
- async get(guildId) {
274
- return this.players.get(guildId);
275
- }
276
268
  /**
277
269
  * Creates a player or returns one if it already exists.
278
270
  * @param options The options to create the player with.
@@ -373,7 +365,7 @@ class Manager extends events_1.EventEmitter {
373
365
  * @returns A promise that resolves to an array of TrackData objects.
374
366
  * @throws Will throw an error if no nodes are available or if the API request fails.
375
367
  */
376
- decodeTracks(tracks) {
368
+ async decodeTracks(tracks) {
377
369
  this.emit(Enums_1.ManagerEventTypes.Debug, `[MANAGER] Decoding tracks: ${JSON.stringify(tracks)}`);
378
370
  return new Promise(async (resolve, reject) => {
379
371
  const node = this.nodes.first();
@@ -414,6 +406,7 @@ class Manager extends events_1.EventEmitter {
414
406
  return;
415
407
  }
416
408
  const serializedPlayer = await Utils_1.PlayerUtils.serializePlayer(player);
409
+ await promises_1.default.mkdir(path_1.default.dirname(playerStateFilePath), { recursive: true });
417
410
  await promises_1.default.writeFile(playerStateFilePath, JSON.stringify(serializedPlayer, null, 2), "utf-8");
418
411
  this.emit(Enums_1.ManagerEventTypes.Debug, `[MANAGER] Player state saved: ${guildId}`);
419
412
  }
@@ -466,6 +459,7 @@ class Manager extends events_1.EventEmitter {
466
459
  throw new Error(`Could not find node: ${nodeId}`);
467
460
  const info = (await node.rest.getAllPlayers());
468
461
  switch (this.options.stateStorage.type) {
462
+ case Enums_1.StateStorageType.Memory:
469
463
  case Enums_1.StateStorageType.JSON:
470
464
  {
471
465
  const playersBaseDir = Utils_1.PlayerUtils.getPlayersBaseDir();
@@ -652,8 +646,7 @@ class Manager extends events_1.EventEmitter {
652
646
  const data = await promises_1.default.readFile(stateFilePath, "utf-8");
653
647
  const state = JSON.parse(data);
654
648
  if (state && typeof state === "object" && state.node?.options?.identifier === nodeId) {
655
- // Remove the entire guild directory or just the state file depending on your cleanup strategy
656
- await promises_1.default.rm(Utils_1.PlayerUtils.getGuildDir(guildId), { recursive: true, force: true });
649
+ await promises_1.default.rm(Utils_1.PlayerUtils.getPlayerStatePath(guildId), { force: true });
657
650
  this.emit(Enums_1.ManagerEventTypes.Debug, `[MANAGER] Deleted player state folder for guild ${guildId}`);
658
651
  }
659
652
  }
@@ -90,6 +90,7 @@ class Node {
90
90
  this.manager.emit(Enums_1.ManagerEventTypes.NodeCreate, this);
91
91
  this.rest = new Rest_1.Rest(this, this.manager);
92
92
  switch (this.manager.options.stateStorage.type) {
93
+ case Enums_1.StateStorageType.Memory:
93
94
  case Enums_1.StateStorageType.JSON:
94
95
  this.sessionIdsFilePath = path_1.default.join(process.cwd(), "magmastream", "sessionData", "sessionIds.json");
95
96
  const configDir = path_1.default.dirname(this.sessionIdsFilePath);
@@ -140,6 +141,7 @@ class Node {
140
141
  */
141
142
  async loadSessionIds() {
142
143
  switch (this.manager.options.stateStorage.type) {
144
+ case Enums_1.StateStorageType.Memory:
143
145
  case Enums_1.StateStorageType.JSON: {
144
146
  if (fs_1.default.existsSync(this.sessionIdsFilePath)) {
145
147
  this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[NODE] Loading sessionIds from file: ${this.sessionIdsFilePath}`);
@@ -195,11 +197,42 @@ class Node {
195
197
  */
196
198
  async updateSessionId() {
197
199
  switch (this.manager.options.stateStorage.type) {
200
+ case Enums_1.StateStorageType.Memory:
198
201
  case Enums_1.StateStorageType.JSON: {
199
202
  this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[NODE] Updating sessionIds to file: ${this.sessionIdsFilePath}`);
200
203
  const compositeKey = `${this.options.identifier}::${this.manager.options.clusterId}`;
201
- this.sessionIdsMap.set(compositeKey, this.sessionId);
202
- fs_1.default.writeFileSync(this.sessionIdsFilePath, JSON.stringify(Object.fromEntries(this.sessionIdsMap)));
204
+ const filePath = this.sessionIdsFilePath;
205
+ let updated = false;
206
+ let retries = 3;
207
+ while (!updated && retries > 0) {
208
+ try {
209
+ let fileData = {};
210
+ if (fs_1.default.existsSync(filePath)) {
211
+ try {
212
+ const raw = fs_1.default.readFileSync(filePath, "utf-8");
213
+ fileData = raw.trim() ? JSON.parse(raw) : {};
214
+ }
215
+ catch (err) {
216
+ this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[NODE] Failed to read/parse sessionIds.json: ${err.message}`);
217
+ fileData = {};
218
+ }
219
+ }
220
+ fileData[compositeKey] = this.sessionId;
221
+ const tmpPath = `${filePath}.tmp`;
222
+ fs_1.default.writeFileSync(tmpPath, JSON.stringify(fileData, null, 2), "utf-8");
223
+ fs_1.default.renameSync(tmpPath, filePath);
224
+ this.sessionIdsMap = new Map(Object.entries(fileData));
225
+ updated = true;
226
+ }
227
+ catch (err) {
228
+ retries--;
229
+ if (retries === 0) {
230
+ this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[NODE] Failed to update sessionIds after retries: ${err.message}`);
231
+ throw err;
232
+ }
233
+ await new Promise((r) => setTimeout(r, 50));
234
+ }
235
+ }
203
236
  break;
204
237
  }
205
238
  case Enums_1.StateStorageType.Redis: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "magmastream",
3
- "version": "2.9.0-dev.43",
3
+ "version": "2.9.0-dev.45",
4
4
  "description": "A user-friendly Lavalink client designed for NodeJS.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",