mslxdff 0.1.23 → 0.1.24

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 (2) hide show
  1. package/bin/mslxdff.js +38 -10
  2. package/package.json +1 -1
package/bin/mslxdff.js CHANGED
@@ -331,11 +331,10 @@ function markJoined(entry) {
331
331
  saveGroupsJoined([...list, entry]);
332
332
  }
333
333
 
334
- // -leavegroup | -leave-groups: leave every joined group. Members deregister
335
- // from their leader; a leader disbands the group (deletes it entirely).
334
+ // -leavegroup | -leave-groups: leave every joined group as a member.
335
+ // Leaders cannot "leave" they must disband with -delgroup <name>.
336
336
  const leaveAll = args.includes("-leavegroup") || args.includes("--leavegroup") || args.includes("-leave-groups");
337
337
  if (leaveAll) {
338
- const groups = createGroupsService({});
339
338
  const peers = createPeersService({});
340
339
  const joined = loadGroupsJoined();
341
340
  if (!joined.length) {
@@ -343,10 +342,11 @@ if (leaveAll) {
343
342
  process.exit(0);
344
343
  }
345
344
  const myToken = (await loadToken()).token;
345
+ const leaders = [];
346
346
  for (const g of joined) {
347
- const peersRemoved = peers.removeByGroup(g.name);
348
347
  if (g.leaderUrl) {
349
348
  // member: deregister from the leader so we stop showing up in -group list
349
+ const peersRemoved = peers.removeByGroup(g.name);
350
350
  try {
351
351
  const res = await fetch(`${g.leaderUrl}/v1/groups/leave`, {
352
352
  method: "POST",
@@ -362,15 +362,42 @@ if (leaveAll) {
362
362
  console.log(`${g.name}: left locally (leader unreachable: ${errMsg(err)})`);
363
363
  }
364
364
  } else {
365
- // leader: disband the whole group
366
- const disbanded = groups.delete(g.name);
367
- const members = Object.values(disbanded?.members || {});
368
- console.log(`${g.name}: disbanded (${members.length} member${members.length === 1 ? "" : "s"} removed)`);
365
+ leaders.push(g.name);
369
366
  }
370
367
  }
371
- const left = joined.map((g) => g.name);
368
+ const left = joined.filter((g) => g.leaderUrl).map((g) => g.name);
372
369
  saveGroupsJoined(loadGroupsJoined().filter((g) => !left.includes(g.name)));
373
370
  console.log(`left ${left.length} group(s)`);
371
+ if (leaders.length) {
372
+ console.log(`\nskipped ${leaders.length} group(s) where this node is the leader:`);
373
+ for (const n of leaders) console.log(` ${n} — leaders can't leave; disband it with: mslxdff -delgroup ${n}`);
374
+ }
375
+ process.exit(0);
376
+ }
377
+
378
+ // -delgroup <name>: a leader disbands one of its groups (local groups state +
379
+ // any member records). Fails if this node is not the leader of that group.
380
+ const delGroupName = argValue("-delgroup", "--delgroup");
381
+ if (delGroupName) {
382
+ const groups = createGroupsService({});
383
+ const peers = createPeersService({});
384
+ const local = groups.list()[delGroupName];
385
+ if (!local) {
386
+ const joined0 = loadGroupsJoined().find((g) => g.name === delGroupName);
387
+ if (joined0?.leaderUrl) {
388
+ console.log(`"${delGroupName}" is led by ${joined0.leaderUrl} — you are a member, use -leavegroup to leave it`);
389
+ } else if (joined0) {
390
+ console.log(`"${delGroupName}" exists in local state but has no group definition — nothing to delete`);
391
+ } else {
392
+ console.log(`group "${delGroupName}" not found on this node`);
393
+ }
394
+ process.exit(1);
395
+ }
396
+ const disbanded = groups.delete(delGroupName);
397
+ const members = Object.values(disbanded?.members || {});
398
+ peers.removeByGroup(delGroupName);
399
+ saveGroupsJoined(loadGroupsJoined().filter((g) => g.name !== delGroupName));
400
+ console.log(`group "${delGroupName}" disbanded (${members.length} member${members.length === 1 ? "" : "s"} removed)`);
374
401
  process.exit(0);
375
402
  }
376
403
 
@@ -688,7 +715,8 @@ Usage:
688
715
  mslxdff -group sync pull the freshest member list for all joined groups
689
716
  mslxdff -group leave <name> leave a group (removes its members from this node)
690
717
  mslxdff -group list list groups on this node
691
- mslxdff -leavegroup leave every group (members deregister, a leader disbands)
718
+ mslxdff -leavegroup leave every joined group as a member (leaders: use -delgroup)
719
+ mslxdff -delgroup <name> disband a group this node leads (deletes it and its members)
692
720
  mslxdff -resetban [ip] clear join-failure bans (all, or one ip)
693
721
  mslxdff -help show this help
694
722
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mslxdff",
3
- "version": "0.1.23",
3
+ "version": "0.1.24",
4
4
  "description": "测试项目,请勿使用。",
5
5
  "type": "module",
6
6
  "bin": {