UNPKG

@supernick135/face-scanner-client

Version:

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

204 lines (170 loc) • 6.06 kB
/** * Face Scanner Monitor Client Example * * This example demonstrates how to use the Face Scanner WebSocket client * for monitoring and real-time dashboards with API key authentication. */ const WebSocketClient = require('../lib/client/WebSocketClient'); async function monitorExample() { console.log('šŸ“Š Starting Face Scanner Monitor Client Example'); // Create monitor client using API key authentication const monitorClient = WebSocketClient.createMonitorClient({ wsUrl: 'ws://localhost:8080/ws', apiKey: 'your-monitor-api-key-here', schoolId: 'school123', // Optional: monitor specific school reconnect: true, heartbeatInterval: 30000 }); // Statistics tracking const stats = { totalScans: 0, successfulScans: 0, failedScans: 0, uniqueStudents: new Set(), deviceActivity: new Map() }; // Set up event listeners monitorClient.on('connected', () => { console.log('āœ… Monitor connected to Face Scanner server'); }); monitorClient.on('authenticated', () => { console.log('šŸ” Monitor authenticated successfully'); // Join additional rooms for comprehensive monitoring setTimeout(() => { console.log('šŸ  Joining monitoring rooms...'); monitorClient.joinRoom('global'); // Global events monitorClient.joinRoom('school:school123'); // School-specific events }, 1000); }); monitorClient.on('authError', (error) => { console.error('āŒ Authentication failed:', error.message); }); monitorClient.on('roomUpdate', (data) => { console.log(`šŸ  Room ${data.action}:`, data.room); }); // Monitor face scanning events monitorClient.on('faceDetected', (data) => { stats.totalScans++; if (data.studentId) { stats.uniqueStudents.add(data.studentId); } // Track device activity if (data.deviceId) { const count = stats.deviceActivity.get(data.deviceId) || 0; stats.deviceActivity.set(data.deviceId, count + 1); } console.log('šŸ‘¤ Face detected:', { studentId: data.studentId || 'Unknown', deviceId: data.deviceId, schoolId: data.schoolId, confidence: data.confidence, timestamp: new Date(data.timestamp).toLocaleString() }); displayStats(); }); monitorClient.on('scanComplete', (data) => { if (data.success) { stats.successfulScans++; console.log('āœ… Successful scan:', { studentId: data.studentId, deviceId: data.deviceId, processingTime: data.processingTime || 'N/A' }); } displayStats(); }); monitorClient.on('noFace', (data) => { stats.failedScans++; console.log('šŸ‘» No face detected:', { deviceId: data.deviceId, reason: data.reason, timestamp: new Date(data.timestamp).toLocaleString() }); displayStats(); }); monitorClient.on('faceError', (data) => { stats.failedScans++; console.log('āš ļø Face scan error:', { deviceId: data.deviceId, studentId: data.studentId, error: data.error, timestamp: new Date(data.timestamp).toLocaleString() }); displayStats(); }); // Monitor system events monitorClient.on('deviceStatus', (data) => { console.log('šŸ”§ Device status update:', data); }); monitorClient.on('systemAlert', (data) => { console.log('šŸ“¢ System alert:', data); }); monitorClient.on('clientConnected', (data) => { console.log('šŸ”— Client connected:', data); }); monitorClient.on('clientDisconnected', (data) => { console.log('šŸ”Œ Client disconnected:', data); }); // Connection monitoring monitorClient.on('disconnected', ({ code, reason }) => { console.log(`šŸ”Œ Monitor disconnected: ${code} - ${reason}`); }); monitorClient.on('reconnecting', (attempt) => { console.log(`šŸ”„ Monitor reconnecting... (${attempt})`); }); monitorClient.on('error', (error) => { console.error('āŒ WebSocket error:', error); }); // Display current statistics function displayStats() { console.log('\nšŸ“ˆ === MONITORING DASHBOARD ==='); console.log(`Total Scans: ${stats.totalScans}`); console.log(`Successful: ${stats.successfulScans}`); console.log(`Failed: ${stats.failedScans}`); console.log(`Success Rate: ${stats.totalScans > 0 ? ((stats.successfulScans / stats.totalScans) * 100).toFixed(1) : 0}%`); console.log(`Unique Students: ${stats.uniqueStudents.size}`); console.log(`Active Devices: ${stats.deviceActivity.size}`); if (stats.deviceActivity.size > 0) { console.log('\nšŸ”§ Device Activity:'); stats.deviceActivity.forEach((count, deviceId) => { console.log(` ${deviceId}: ${count} scans`); }); } console.log('================================\n'); } try { // Connect to server await monitorClient.connect(); // Display initial dashboard displayStats(); // Periodic status updates const statusInterval = setInterval(() => { const status = monitorClient.getConnectionStatus(); console.log('šŸ” Connection Status:', { connected: status.connected, rooms: status.subscriptions?.length || 0, uptime: Math.floor((Date.now() - startTime) / 1000) + 's' }); }, 60000); // Every minute const startTime = Date.now(); // Keep running for monitoring console.log('šŸ‘‚ Monitor is now listening for all Face Scanner events...'); console.log('ā±ļø Monitor will run for 5 minutes for demonstration...'); setTimeout(() => { console.log('šŸ›‘ Shutting down monitor client'); clearInterval(statusInterval); monitorClient.disconnect(); process.exit(0); }, 300000); // Run for 5 minutes } catch (error) { console.error('āŒ Failed to start monitor 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 monitorExample().catch(console.error);