@ruvector/edge-net 0.2.1 → 0.4.0

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/cli.js CHANGED
@@ -110,6 +110,9 @@ function printHelp() {
110
110
  ${c('bold', 'COMMANDS:')}
111
111
  ${c('green', 'start')} Start an edge-net node in the terminal
112
112
  ${c('green', 'join')} Join network with public key (multi-contributor support)
113
+ ${c('green', 'genesis')} Start a genesis/signaling server for P2P network
114
+ ${c('green', 'firebase')} Setup Firebase (Google Cloud) for P2P bootstrap
115
+ ${c('green', 'p2p')} Start full P2P network node
113
116
  ${c('green', 'benchmark')} Run performance benchmarks
114
117
  ${c('green', 'info')} Show package and WASM information
115
118
  ${c('green', 'demo')} Run interactive demonstration
@@ -123,6 +126,15 @@ ${c('bold', 'EXAMPLES:')}
123
126
  ${c('dim', '# Join with new identity (multi-contributor)')}
124
127
  $ npx @ruvector/edge-net join --generate
125
128
 
129
+ ${c('dim', '# Start genesis/signaling server (for local P2P)')}
130
+ $ npx @ruvector/edge-net genesis --port 8787
131
+
132
+ ${c('dim', '# Setup Firebase for cloud-based P2P bootstrap')}
133
+ $ npx @ruvector/edge-net firebase --project YOUR_PROJECT_ID
134
+
135
+ ${c('dim', '# Start full P2P network node')}
136
+ $ npx @ruvector/edge-net p2p
137
+
126
138
  ${c('dim', '# Run benchmarks')}
127
139
  $ npx @ruvector/edge-net benchmark
128
140
 
@@ -422,6 +434,94 @@ async function runJoin() {
422
434
  child.on('close', (code) => process.exit(code));
423
435
  }
424
436
 
437
+ async function runGenesis() {
438
+ // Delegate to genesis.js
439
+ printBanner();
440
+ console.log(`${c('bold', 'Starting Genesis/Signaling Server...')}\n`);
441
+
442
+ const { spawn } = await import('child_process');
443
+ const args = process.argv.slice(3);
444
+
445
+ // Default to port 8787 if not specified
446
+ if (!args.includes('--port') && !args.includes('-p')) {
447
+ args.push('--port', '8787');
448
+ }
449
+
450
+ const child = spawn('node', [join(__dirname, 'genesis.js'), ...args], {
451
+ stdio: 'inherit'
452
+ });
453
+ child.on('close', (code) => process.exit(code));
454
+ }
455
+
456
+ async function runFirebaseSetup() {
457
+ // Delegate to firebase-setup.js
458
+ printBanner();
459
+ console.log(`${c('bold', 'Firebase Setup (Google Cloud)')}\n`);
460
+
461
+ const { spawn } = await import('child_process');
462
+ const args = process.argv.slice(3);
463
+ const child = spawn('node', [join(__dirname, 'firebase-setup.js'), ...args], {
464
+ stdio: 'inherit'
465
+ });
466
+ child.on('close', (code) => process.exit(code));
467
+ }
468
+
469
+ async function runP2P() {
470
+ printBanner();
471
+ console.log(`${c('bold', 'Starting P2P Network Node...')}\n`);
472
+
473
+ await setupPolyfills();
474
+
475
+ try {
476
+ const { createP2PNetwork } = await import('./p2p.js');
477
+
478
+ // Generate node ID
479
+ const nodeId = `node-${Math.random().toString(36).slice(2, 10)}`;
480
+
481
+ console.log(`${c('cyan', 'Node ID:')} ${nodeId}`);
482
+ console.log(`${c('cyan', 'Mode:')} Firebase bootstrap → DHT → Full P2P\n`);
483
+
484
+ console.log(`${c('dim', 'Initializing components...')}`);
485
+
486
+ const network = await createP2PNetwork(
487
+ { nodeId },
488
+ {
489
+ // Use Firebase bootstrap if configured, fall back to local
490
+ bootstrapStrategy: process.env.FIREBASE_API_KEY ? 'firebase' : 'local',
491
+ }
492
+ );
493
+
494
+ console.log(`\n${c('bold', 'NETWORK STATUS:')}`);
495
+ const stats = network.getStats();
496
+ console.log(` ${c('cyan', 'Mode:')} ${c('green', stats.mode)}`);
497
+ console.log(` ${c('cyan', 'Bootstrap:')} ${stats.bootstrapMode}`);
498
+ console.log(` ${c('cyan', 'Peers:')} ${stats.peers}`);
499
+ console.log(` ${c('cyan', 'Firebase:')} ${stats.firebaseConnected ? c('green', 'Connected') : c('yellow', 'Not configured')}`);
500
+ console.log(` ${c('cyan', 'DHT Peers:')} ${stats.dhtPeers}`);
501
+ console.log(` ${c('cyan', 'Ledger Balance:')} ${stats.ledgerBalance}`);
502
+
503
+ console.log(`\n${c('dim', 'Press Ctrl+C to stop.')}`);
504
+
505
+ // Periodic status updates
506
+ setInterval(() => {
507
+ const s = network.getStats();
508
+ process.stdout.write(`\r${c('dim', `[${new Date().toLocaleTimeString()}]`)} Peers: ${s.peers} | Mode: ${s.mode} | Balance: ${s.ledgerBalance} `);
509
+ }, 5000);
510
+
511
+ process.on('SIGINT', async () => {
512
+ console.log(`\n\n${c('yellow', 'Stopping P2P network...')}`);
513
+ await network.stop();
514
+ console.log(`${c('green', '✓')} Network stopped.`);
515
+ process.exit(0);
516
+ });
517
+
518
+ } catch (err) {
519
+ console.error(`${c('red', '✗ Failed to start P2P network:')}\n`, err.message);
520
+ console.log(`\n${c('dim', 'Tip: Run')} ${c('cyan', 'npx @ruvector/edge-net firebase')} ${c('dim', 'to setup Firebase bootstrap.')}`);
521
+ process.exit(1);
522
+ }
523
+ }
524
+
425
525
  // Main
426
526
  const command = process.argv[2] || 'help';
427
527
 
@@ -432,6 +532,19 @@ switch (command) {
432
532
  case 'join':
433
533
  runJoin();
434
534
  break;
535
+ case 'genesis':
536
+ case 'signaling':
537
+ runGenesis();
538
+ break;
539
+ case 'firebase':
540
+ case 'firebase-setup':
541
+ case 'gcloud':
542
+ runFirebaseSetup();
543
+ break;
544
+ case 'p2p':
545
+ case 'network':
546
+ runP2P();
547
+ break;
435
548
  case 'benchmark':
436
549
  case 'bench':
437
550
  runBenchmark();