UNPKG

triostack-audit-sdk

Version:

A server-side audit logging middleware for Node.js applications with Express, Fastify, and Koa support. Includes comprehensive test examples and documentation.

185 lines (143 loc) • 6.15 kB
#!/usr/bin/env node import fetch from 'node-fetch'; console.log('šŸŽ¬ Triostack Audit SDK Demo'); console.log('===========================\n'); const SERVER_URL = 'http://localhost:3001'; const AUDIT_URL = 'http://localhost:3002'; async function wait(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function makeRequest(url, options = {}) { try { const response = await fetch(url, { headers: { 'Content-Type': 'application/json', 'x-user-id': options.userId || 'demo-user', ...options.headers }, ...options }); const data = await response.json().catch(() => ({})); return { status: response.status, ok: response.ok, data }; } catch (error) { return { status: 0, ok: false, error: error.message }; } } async function checkServers() { console.log('šŸ” Checking if servers are running...'); const serverCheck = await makeRequest(`${SERVER_URL}/`); const auditCheck = await makeRequest(`${AUDIT_URL}/health`); if (!serverCheck.ok) { console.log('āŒ Test server is not running. Please start it first:'); console.log(' npm run start'); return false; } if (!auditCheck.ok) { console.log('āŒ Audit server is not running. Please start it first:'); console.log(' npm run audit'); return false; } console.log('āœ… Both servers are running!\n'); return true; } async function runDemo() { if (!(await checkServers())) { return; } console.log('šŸŽÆ Starting demo...\n'); // Demo 1: Basic requests console.log('1ļøāƒ£ Demo: Basic API Requests'); console.log('───────────────────────────'); const users = ['alice', 'bob', 'charlie', 'admin']; const endpoints = ['/', '/api/users', '/api/manual-track']; for (let i = 0; i < 6; i++) { const user = users[i % users.length]; const endpoint = endpoints[i % endpoints.length]; console.log(`šŸ“” ${user} → ${endpoint}`); const result = await makeRequest(`${SERVER_URL}${endpoint}`, { userId: user }); if (result.ok) { console.log(` āœ… Success (${result.status})`); } else { console.log(` āŒ Failed: ${result.error}`); } await wait(500); // Wait between requests } // Demo 2: Slow endpoint console.log('\n2ļøāƒ£ Demo: Slow Endpoint (2 seconds)'); console.log('──────────────────────────────────'); console.log('ā³ This will take 2 seconds...'); const startTime = Date.now(); const slowResult = await makeRequest(`${SERVER_URL}/api/slow`, { userId: 'slow-user' }); const duration = (Date.now() - startTime) / 1000; if (slowResult.ok) { console.log(`āœ… Slow request completed in ${duration.toFixed(1)}s`); } else { console.log(`āŒ Slow request failed: ${slowResult.error}`); } // Demo 3: Error handling console.log('\n3ļøāƒ£ Demo: Error Handling'); console.log('───────────────────────'); const errorResult = await makeRequest(`${SERVER_URL}/api/error`, { userId: 'error-user' }); console.log(`šŸ“Š Error endpoint returned: ${errorResult.status}`); // Demo 4: Login simulation console.log('\n4ļøāƒ£ Demo: Login Simulation'); console.log('─────────────────────────'); const loginResult = await makeRequest(`${SERVER_URL}/api/login`, { method: 'POST', userId: 'login-user', body: JSON.stringify({ username: 'demo', password: 'test123' }) }); if (loginResult.ok) { console.log('āœ… Login simulation completed'); } else { console.log(`āŒ Login failed: ${loginResult.error}`); } // Demo 5: Bulk requests console.log('\n5ļøāƒ£ Demo: Bulk Requests (10 requests)'); console.log('─────────────────────────────────────'); const bulkResults = { success: 0, error: 0 }; for (let i = 0; i < 10; i++) { const user = `bulk-user-${i}`; const endpoint = endpoints[i % endpoints.length]; const result = await makeRequest(`${SERVER_URL}${endpoint}`, { userId: user }); if (result.ok) { bulkResults.success++; process.stdout.write('āœ…'); } else { bulkResults.error++; process.stdout.write('āŒ'); } await wait(200); } console.log(`\nšŸ“Š Bulk Results: ${bulkResults.success} success, ${bulkResults.error} errors`); // Demo 6: View audit events console.log('\n6ļøāƒ£ Demo: Viewing Audit Events'); console.log('─────────────────────────────'); await wait(1000); // Wait for all events to be processed const eventsResult = await makeRequest(`${AUDIT_URL}/audit`); if (eventsResult.ok) { const { totalEvents, events } = eventsResult.data; console.log(`šŸ“ˆ Total audit events: ${totalEvents}`); if (events.length > 0) { console.log('\nšŸ“Š Recent Events:'); events.slice(-5).forEach((event, index) => { const time = new Date(event.timestamp).toLocaleTimeString(); console.log(` ${index + 1}. ${time} - ${event.route} (${event.userId}) - ${event.duration}s`); }); } } else { console.log(`āŒ Failed to fetch events: ${eventsResult.error}`); } console.log('\nšŸŽ‰ Demo completed!'); console.log('\nšŸ’” What happened:'); console.log(' • All requests were automatically audited'); console.log(' • Each request captured user ID, route, duration, and geolocation'); console.log(' • Audit events were sent to the mock audit server'); console.log(' • You can view all events at http://localhost:3002/audit'); console.log('\nšŸ”— Next steps:'); console.log(' • Open client-test.html for interactive testing'); console.log(' • Run "node curl-test.js" for automated testing'); console.log(' • Check the console output for detailed audit logs'); } // Run the demo runDemo().catch(console.error);