UNPKG

@supernick135/face-scanner-client

Version:

Node.js client library for ZKTeco face scanning devices integration with comprehensive API support

220 lines (175 loc) • 6.72 kB
/** * Face Scanner Admin Client Example * * This example demonstrates how to use the Face Scanner WebSocket client * for administrative tasks with JWT authentication. */ const WebSocketClient = require('../lib/client/WebSocketClient'); async function adminExample() { console.log('šŸ‘‘ Starting Face Scanner Admin Client Example'); // Create admin client using JWT authentication (legacy for admin users) const adminClient = WebSocketClient.createAdminClient({ wsUrl: 'ws://localhost:8080/ws', jwt: 'your-admin-jwt-token-here', // JWT token with admin privileges reconnect: true, heartbeatInterval: 30000 }); // Set up event listeners adminClient.on('connected', () => { console.log('āœ… Admin connected to Face Scanner server'); }); adminClient.on('authenticated', () => { console.log('šŸ” Admin authenticated successfully'); console.log('šŸ‘‘ Admin has full access to all functions'); // Join admin rooms setTimeout(() => { console.log('šŸ  Joining admin monitoring rooms...'); adminClient.joinRoom('admin'); adminClient.joinRoom('global'); }, 1000); }); adminClient.on('authError', (error) => { console.error('āŒ Authentication failed:', error.message); }); adminClient.on('roomUpdate', (data) => { console.log(`šŸ  Room ${data.action}:`, data.room); }); // Listen for all system events adminClient.on('faceDetected', (data) => { console.log('šŸ‘¤ [ADMIN] Face detected:', { studentId: data.studentId, deviceId: data.deviceId, schoolId: data.schoolId, confidence: data.confidence }); }); adminClient.on('scanComplete', (data) => { console.log('āœ… [ADMIN] Scan completed:', { studentId: data.studentId, deviceId: data.deviceId, schoolId: data.schoolId, success: data.success }); }); adminClient.on('clientConnected', (data) => { console.log('šŸ”— [ADMIN] New client connected:', data); }); adminClient.on('clientDisconnected', (data) => { console.log('šŸ”Œ [ADMIN] Client disconnected:', data); }); // Handle server statistics adminClient.on('message', (message) => { if (message.type === 'stats_response') { console.log('\nšŸ“Š === SERVER STATISTICS ==='); const stats = message.payload; console.log(`Total Connections: ${stats.totalConnections || 0}`); console.log(`Server Uptime: ${Math.floor((stats.serverUptime || 0) / 1000)}s`); if (stats.connectionsByType) { console.log('\nConnections by Type:'); Object.entries(stats.connectionsByType).forEach(([type, count]) => { console.log(` ${type}: ${count}`); }); } if (stats.activeRooms && stats.activeRooms.length > 0) { console.log(`\nActive Rooms (${stats.activeRooms.length}):`); stats.activeRooms.forEach(room => { console.log(` ${room}`); }); } if (stats.memoryUsage) { console.log(`\nMemory Usage: ${Math.round(stats.memoryUsage.heapUsed / 1024 / 1024)}MB`); } if (stats.rateLimiter) { console.log(`Rate Limiter: ${stats.rateLimiter.activeClients || 0} active clients`); } console.log('============================\n'); } }); // Connection monitoring adminClient.on('disconnected', ({ code, reason }) => { console.log(`šŸ”Œ Admin disconnected: ${code} - ${reason}`); }); adminClient.on('reconnecting', (attempt) => { console.log(`šŸ”„ Admin reconnecting... (${attempt})`); }); adminClient.on('error', (error) => { console.error('āŒ WebSocket error:', error); }); try { // Connect to server await adminClient.connect(); // Demonstrate admin functions console.log('šŸ”§ Starting admin operations demonstration...'); // Request server statistics periodically const requestStats = () => { console.log('šŸ“Š Requesting server statistics...'); adminClient.requestStats(); }; // Initial stats request setTimeout(requestStats, 3000); // Periodic stats requests const statsInterval = setInterval(requestStats, 30000); // Every 30 seconds // Simulate admin actions setTimeout(() => { console.log('⚔ Demonstrating admin room management...'); // Join specific school monitoring adminClient.joinRoom('school:school123'); adminClient.joinRoom('school:school456'); setTimeout(() => { // Leave a room adminClient.leaveRoom('school:school456'); }, 5000); }, 8000); // Simulate client management (if there are clients to manage) setTimeout(() => { console.log('šŸ‘„ Admin client management example'); console.log(' (In real usage, you would kick specific problematic clients)'); // Example of how to kick a client (commented out for safety) // adminClient.kickClient('problematic-client-id', 'Violating usage policy'); }, 15000); // Demonstrate error handling setTimeout(() => { console.log('šŸ›”ļø Testing admin error handling...'); try { // Try to join an invalid room format (should be rejected) adminClient.joinRoom('invalid-room-name'); } catch (error) { console.log('āœ… Error handling working correctly:', error.message); } }, 20000); // Display connection status const displayStatus = () => { const status = adminClient.getConnectionStatus(); console.log('šŸ” Admin Connection Status:', { connected: status.connected, authMethod: status.authMethod, clientType: status.clientType, activeRooms: status.subscriptions?.length || 0 }); }; // Initial status setTimeout(displayStatus, 5000); // Periodic status updates const statusInterval = setInterval(displayStatus, 60000); // Every minute // Keep running for administration console.log('šŸ‘‚ Admin is now monitoring all Face Scanner activities...'); console.log('ā±ļø Admin will run for 5 minutes for demonstration...'); setTimeout(() => { console.log('šŸ›‘ Shutting down admin client'); clearInterval(statsInterval); clearInterval(statusInterval); adminClient.disconnect(); process.exit(0); }, 300000); // Run for 5 minutes } catch (error) { console.error('āŒ Failed to start admin client:', error); process.exit(1); } } // Handle process termination process.on('SIGINT', () => { console.log('\nšŸ›‘ Received SIGINT, shutting down gracefully...'); process.exit(0); }); // Run the example adminExample().catch(console.error);