@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.
Files changed (2) hide show
  1. package/bin/shard.js +66 -15
  2. 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
- Examples:
32
- shard login --server https://shard-0ow4.onrender.com --username admin --password secret
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, closeRelay);
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
- const heartbeat = setInterval(() => {
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
- clearInterval(heartbeat);
629
+ if (heartbeat) {
630
+ clearInterval(heartbeat);
631
+ heartbeat = null;
632
+ }
587
633
  for (const sig of stopSignals) {
588
- process.off(sig, closeRelay);
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, closeRelay);
644
+ process.off(sig, stopRelayShare);
594
645
  }
595
646
  closeRelay();
596
647
  throw error;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iksdev/shard-cli",
3
- "version": "0.1.17",
3
+ "version": "0.1.19",
4
4
  "description": "CLI pour synchroniser un dossier local avec Shard",
5
5
  "bin": {
6
6
  "shard": "bin/shard.js"