magmastream 2.9.0-dev.44 → 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.
@@ -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
  }
@@ -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.44",
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",