magmastream 2.9.0-dev.44 → 2.9.0-dev.46

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
@@ -2719,7 +2719,7 @@ declare class Player {
2719
2719
  * @throws {RangeError} If no voice channel has been set.
2720
2720
  * @returns {void}
2721
2721
  */
2722
- connect(): Promise<void>;
2722
+ connect(): void;
2723
2723
  /**
2724
2724
  * Disconnects the player from the voice channel.
2725
2725
  * @returns {this} The player instance.
@@ -133,7 +133,6 @@ class JsonQueue {
133
133
  const tracks = Array.isArray(track) ? track : [track];
134
134
  if (!tracks.length)
135
135
  return;
136
- await this.deleteFile(this.previousPath);
137
136
  await this.writeJSON(this.previousPath, tracks);
138
137
  }
139
138
  /**
@@ -406,6 +406,7 @@ class Manager extends events_1.EventEmitter {
406
406
  return;
407
407
  }
408
408
  const serializedPlayer = await Utils_1.PlayerUtils.serializePlayer(player);
409
+ await promises_1.default.mkdir(path_1.default.dirname(playerStateFilePath), { recursive: true });
409
410
  await promises_1.default.writeFile(playerStateFilePath, JSON.stringify(serializedPlayer, null, 2), "utf-8");
410
411
  this.emit(Enums_1.ManagerEventTypes.Debug, `[MANAGER] Player state saved: ${guildId}`);
411
412
  }
@@ -458,6 +459,7 @@ class Manager extends events_1.EventEmitter {
458
459
  throw new Error(`Could not find node: ${nodeId}`);
459
460
  const info = (await node.rest.getAllPlayers());
460
461
  switch (this.options.stateStorage.type) {
462
+ case Enums_1.StateStorageType.Memory:
461
463
  case Enums_1.StateStorageType.JSON:
462
464
  {
463
465
  const playersBaseDir = Utils_1.PlayerUtils.getPlayersBaseDir();
@@ -644,8 +646,7 @@ class Manager extends events_1.EventEmitter {
644
646
  const data = await promises_1.default.readFile(stateFilePath, "utf-8");
645
647
  const state = JSON.parse(data);
646
648
  if (state && typeof state === "object" && state.node?.options?.identifier === nodeId) {
647
- // Remove the entire guild directory or just the state file depending on your cleanup strategy
648
- 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 });
649
650
  this.emit(Enums_1.ManagerEventTypes.Debug, `[MANAGER] Deleted player state folder for guild ${guildId}`);
650
651
  }
651
652
  }
@@ -1030,6 +1031,7 @@ class Manager extends events_1.EventEmitter {
1030
1031
  }
1031
1032
  player.voiceState.sessionId = update.session_id;
1032
1033
  player.voiceChannelId = update.channel_id;
1034
+ player.options.voiceChannelId = update.channel_id;
1033
1035
  return;
1034
1036
  }
1035
1037
  this.emit(Enums_1.ManagerEventTypes.PlayerDisconnect, player, player.voiceChannelId);
@@ -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: {
@@ -162,7 +162,7 @@ class Player {
162
162
  * @throws {RangeError} If no voice channel has been set.
163
163
  * @returns {void}
164
164
  */
165
- async connect() {
165
+ connect() {
166
166
  // Check if the voice channel has been set.
167
167
  if (!this.voiceChannelId) {
168
168
  throw new RangeError("No voice channel has been set. You must use the `setVoiceChannelId()` method to set the voice channel before connecting.");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "magmastream",
3
- "version": "2.9.0-dev.44",
3
+ "version": "2.9.0-dev.46",
4
4
  "description": "A user-friendly Lavalink client designed for NodeJS.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",