@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
JavaScript
/**
* 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);