@iksdev/shard-cli 0.1.17 → 0.1.19
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/shard.js +66 -15
- package/package.json +1 -1
package/bin/shard.js
CHANGED
|
@@ -19,17 +19,23 @@ const IGNORED_DIRS = new Set(['.git', 'node_modules']);
|
|
|
19
19
|
function printHelp() {
|
|
20
20
|
console.log(`Shard CLI
|
|
21
21
|
|
|
22
|
-
Usage:
|
|
23
|
-
shard login --username <name> --password <pass> [--server <url>]
|
|
24
|
-
shard whoami [--server <url>]
|
|
25
|
-
shard sync <folder> [--server <url>] [--dry-run] [--force] [--once] [--interval-ms <n>]
|
|
22
|
+
Usage:
|
|
23
|
+
shard login --username <name> --password <pass> [--server <url>]
|
|
24
|
+
shard whoami [--server <url>]
|
|
25
|
+
shard sync <folder> [--server <url>] [--dry-run] [--force] [--once] [--interval-ms <n>]
|
|
26
26
|
shard share <file> [--server <url>] [--limits <n>] [--temps <jours>] [--upload]
|
|
27
|
-
shard logout
|
|
28
|
-
shard config show
|
|
29
|
-
shard config set-server <url>
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
shard login --
|
|
27
|
+
shard logout
|
|
28
|
+
shard config show
|
|
29
|
+
shard config set-server <url>
|
|
30
|
+
|
|
31
|
+
Commandes:
|
|
32
|
+
shard login --username <name> --password <pass> [--server <url>]
|
|
33
|
+
shard sync <folder> [--server <url>] [--dry-run] [--force] [--once] [--interval-ms <n>]
|
|
34
|
+
shard share <file> [--server <url>] [--limits <n>] [--temps <jours>] [--upload]
|
|
35
|
+
shard logout
|
|
36
|
+
|
|
37
|
+
Examples:
|
|
38
|
+
shard login --server https://shard-0ow4.onrender.com --username admin --password secret
|
|
33
39
|
shard sync ./MonDossier
|
|
34
40
|
shard sync ./MonDossier --once
|
|
35
41
|
shard sync ./MonDossier --dry-run
|
|
@@ -455,6 +461,24 @@ async function shareFile(positionals, flags) {
|
|
|
455
461
|
|
|
456
462
|
let relayClientId = '';
|
|
457
463
|
let closed = false;
|
|
464
|
+
let heartbeat = null;
|
|
465
|
+
let createdShareId = null;
|
|
466
|
+
let shareRevoked = false;
|
|
467
|
+
|
|
468
|
+
const revokeCreatedShare = async () => {
|
|
469
|
+
if (!createdShareId || shareRevoked) return;
|
|
470
|
+
shareRevoked = true;
|
|
471
|
+
try {
|
|
472
|
+
await httpJson(`${server}/api/share/${createdShareId}`, {
|
|
473
|
+
method: 'DELETE',
|
|
474
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
475
|
+
});
|
|
476
|
+
console.log('Lien relay revoque.');
|
|
477
|
+
} catch (err) {
|
|
478
|
+
console.error(`Impossible de revoquer le lien automatiquement: ${err.message}`);
|
|
479
|
+
}
|
|
480
|
+
};
|
|
481
|
+
|
|
458
482
|
const closeRelay = () => {
|
|
459
483
|
if (closed) return;
|
|
460
484
|
closed = true;
|
|
@@ -462,8 +486,23 @@ async function shareFile(positionals, flags) {
|
|
|
462
486
|
};
|
|
463
487
|
|
|
464
488
|
const stopSignals = ['SIGINT', 'SIGTERM'];
|
|
489
|
+
const stopRelayShare = (signal) => {
|
|
490
|
+
if (closed) return;
|
|
491
|
+
console.log(`Arret du partage (${signal}). Revocation du lien...`);
|
|
492
|
+
Promise.resolve()
|
|
493
|
+
.then(async () => {
|
|
494
|
+
if (heartbeat) {
|
|
495
|
+
clearInterval(heartbeat);
|
|
496
|
+
heartbeat = null;
|
|
497
|
+
}
|
|
498
|
+
await revokeCreatedShare();
|
|
499
|
+
})
|
|
500
|
+
.finally(() => {
|
|
501
|
+
closeRelay();
|
|
502
|
+
});
|
|
503
|
+
};
|
|
465
504
|
for (const sig of stopSignals) {
|
|
466
|
-
process.on(sig,
|
|
505
|
+
process.on(sig, stopRelayShare);
|
|
467
506
|
}
|
|
468
507
|
|
|
469
508
|
const openPromise = new Promise((resolve, reject) => {
|
|
@@ -544,7 +583,7 @@ async function shareFile(positionals, flags) {
|
|
|
544
583
|
}
|
|
545
584
|
});
|
|
546
585
|
|
|
547
|
-
|
|
586
|
+
heartbeat = setInterval(() => {
|
|
548
587
|
if (relaySocket.readyState === WebSocket.OPEN) {
|
|
549
588
|
relaySocket.send(JSON.stringify({ type: 'heartbeat', ts: Date.now() }));
|
|
550
589
|
}
|
|
@@ -571,6 +610,10 @@ async function shareFile(positionals, flags) {
|
|
|
571
610
|
});
|
|
572
611
|
|
|
573
612
|
const share = created?.share || {};
|
|
613
|
+
if (share?.id) {
|
|
614
|
+
const n = Number(share.id);
|
|
615
|
+
if (Number.isFinite(n) && n > 0) createdShareId = n;
|
|
616
|
+
}
|
|
574
617
|
console.log(`Partage relay cree pour: ${fileName}`);
|
|
575
618
|
if (share.url) console.log(`URL Shard: ${share.url}`);
|
|
576
619
|
if (share.token) console.log(`Token: ${share.token}`);
|
|
@@ -583,14 +626,22 @@ async function shareFile(positionals, flags) {
|
|
|
583
626
|
await new Promise((resolve) => {
|
|
584
627
|
relaySocket.on('close', () => resolve());
|
|
585
628
|
});
|
|
586
|
-
|
|
629
|
+
if (heartbeat) {
|
|
630
|
+
clearInterval(heartbeat);
|
|
631
|
+
heartbeat = null;
|
|
632
|
+
}
|
|
587
633
|
for (const sig of stopSignals) {
|
|
588
|
-
process.off(sig,
|
|
634
|
+
process.off(sig, stopRelayShare);
|
|
589
635
|
}
|
|
590
636
|
return;
|
|
591
637
|
} catch (error) {
|
|
638
|
+
if (heartbeat) {
|
|
639
|
+
clearInterval(heartbeat);
|
|
640
|
+
heartbeat = null;
|
|
641
|
+
}
|
|
642
|
+
await revokeCreatedShare();
|
|
592
643
|
for (const sig of stopSignals) {
|
|
593
|
-
process.off(sig,
|
|
644
|
+
process.off(sig, stopRelayShare);
|
|
594
645
|
}
|
|
595
646
|
closeRelay();
|
|
596
647
|
throw error;
|