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.
- package/bin/mslxdff.js +38 -10
- 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
|
|
335
|
-
//
|
|
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
|
-
|
|
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
|
|
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
|
|