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