
- API server with ChaCha20-Poly1305 encryption - TypeScript SDK client with full functionality - Complete documentation in docs/ - Environment variable processing with composite variables - HTTPS-only API on port 6666 - Storage structure for configuration files - Tests and examples included Features: - Quantum-resistant encryption (ChaCha20-Poly1305) - Variable substitution from .env files - Comprehensive TypeScript SDK - Full API documentation and specifications - Deployment guides and security model
185 lines
6.3 KiB
TypeScript
185 lines
6.3 KiB
TypeScript
/**
|
||
* Exemple d'utilisation avancée du SDK Vault 4NK
|
||
* Démontre les fonctionnalités avancées et la gestion d'erreurs
|
||
*/
|
||
|
||
import { VaultClient, VaultCrypto, VaultApiError, VaultDecryptionError } from '../src/index';
|
||
|
||
async function advancedExample() {
|
||
console.log('🚀 Exemple d\'utilisation avancée du SDK Vault 4NK');
|
||
console.log('=' .repeat(60));
|
||
|
||
try {
|
||
// 1. Génération d'une clé de chiffrement personnalisée
|
||
console.log('🔑 Génération d\'une clé de chiffrement...');
|
||
const customKey = VaultCrypto.generateKey();
|
||
console.log(` Clé générée: ${customKey.substring(0, 10)}...`);
|
||
|
||
// Validation de la clé
|
||
const isValid = VaultCrypto.validateKey(customKey);
|
||
console.log(` Clé valide: ${isValid ? 'Oui' : 'Non'}`);
|
||
|
||
// 2. Création du client avec configuration personnalisée
|
||
console.log('\n⚙️ Configuration du client...');
|
||
const client = new VaultClient(
|
||
{
|
||
baseUrl: 'https://vault.4nkweb.com:6666',
|
||
verifySsl: false, // Désactivé pour les certificats auto-signés
|
||
timeout: 10000, // Timeout de 10 secondes
|
||
},
|
||
'quantum_resistant_demo_key_32_bytes!' // Clé de démonstration
|
||
);
|
||
|
||
// 3. Gestion d'erreurs avancée
|
||
console.log('\n🛡️ Test de gestion d\'erreurs...');
|
||
|
||
// Test avec un fichier inexistant
|
||
try {
|
||
await client.getFile('dev', 'fichier-inexistant.conf');
|
||
} catch (error) {
|
||
if (error instanceof VaultApiError) {
|
||
console.log(` ✅ Erreur API capturée: ${error.message} (${error.statusCode})`);
|
||
} else {
|
||
console.log(` ❌ Erreur inattendue: ${error}`);
|
||
}
|
||
}
|
||
|
||
// Test avec un environnement inexistant
|
||
try {
|
||
await client.getFile('prod', 'bitcoin/bitcoin.conf');
|
||
} catch (error) {
|
||
if (error instanceof VaultApiError) {
|
||
console.log(` ✅ Erreur environnement: ${error.message} (${error.statusCode})`);
|
||
}
|
||
}
|
||
|
||
// 4. Récupération de fichiers avec analyse de contenu
|
||
console.log('\n📊 Analyse de contenu des fichiers...');
|
||
|
||
const filePaths = [
|
||
'bitcoin/bitcoin.conf',
|
||
'tor/torrc',
|
||
'sdk_relay/sdk_relay.conf'
|
||
];
|
||
|
||
for (const filePath of filePaths) {
|
||
try {
|
||
const file = await client.getFile('dev', filePath);
|
||
|
||
console.log(`\n 📄 ${file.filename}:`);
|
||
console.log(` Taille: ${file.size} caractères`);
|
||
console.log(` Chiffré: ${file.encrypted ? 'Oui' : 'Non'}`);
|
||
|
||
// Analyse du contenu
|
||
const lines = file.content.split('\n');
|
||
const configLines = lines.filter(line =>
|
||
line.trim() && !line.trim().startsWith('#')
|
||
);
|
||
|
||
console.log(` Lignes totales: ${lines.length}`);
|
||
console.log(` Lignes de config: ${configLines.length}`);
|
||
|
||
// Recherche de variables d'environnement
|
||
const envVars = file.content.match(/\$\{[^}]+\}/g) || [];
|
||
if (envVars.length > 0) {
|
||
console.log(` Variables env: ${envVars.length} (${envVars.slice(0, 3).join(', ')}...)`);
|
||
}
|
||
|
||
} catch (error) {
|
||
console.log(` ❌ Erreur pour ${filePath}: ${error instanceof Error ? error.message : error}`);
|
||
}
|
||
}
|
||
|
||
// 5. Test de performance avec récupération parallèle
|
||
console.log('\n⚡ Test de performance...');
|
||
const startTime = Date.now();
|
||
|
||
const parallelRequests = [
|
||
{ env: 'dev', filePath: 'bitcoin/bitcoin.conf' },
|
||
{ env: 'dev', filePath: 'tor/torrc' },
|
||
{ env: 'dev', filePath: 'sdk_relay/sdk_relay.conf' },
|
||
{ env: 'dev', filePath: 'supervisor/supervisord.conf' }
|
||
];
|
||
|
||
const files = await client.getFiles(parallelRequests);
|
||
const endTime = Date.now();
|
||
|
||
console.log(` Fichiers récupérés: ${files.length}`);
|
||
console.log(` Temps total: ${endTime - startTime}ms`);
|
||
console.log(` Temps moyen par fichier: ${Math.round((endTime - startTime) / files.length)}ms`);
|
||
|
||
const totalSize = files.reduce((sum, file) => sum + file.size, 0);
|
||
console.log(` Taille totale: ${totalSize} caractères`);
|
||
|
||
// 6. Monitoring et métriques
|
||
console.log('\n📈 Monitoring et métriques...');
|
||
|
||
// Test de connectivité répété
|
||
const pingTests = 5;
|
||
const pingResults: boolean[] = [];
|
||
|
||
for (let i = 0; i < pingTests; i++) {
|
||
const isConnected = await client.ping();
|
||
pingResults.push(isConnected);
|
||
await new Promise(resolve => setTimeout(resolve, 100)); // Délai de 100ms
|
||
}
|
||
|
||
const successRate = (pingResults.filter(r => r).length / pingTests) * 100;
|
||
console.log(` Tests de connectivité: ${pingTests}`);
|
||
console.log(` Taux de succès: ${successRate}%`);
|
||
|
||
// 7. Utilisation de clés dérivées
|
||
console.log('\n🔐 Test de clés dérivées...');
|
||
const password = 'mon-mot-de-passe-secret';
|
||
const derivedKey = VaultCrypto.hashToKey(password);
|
||
console.log(` Mot de passe: ${password}`);
|
||
console.log(` Clé dérivée: ${derivedKey.substring(0, 10)}...`);
|
||
console.log(` Clé valide: ${VaultCrypto.validateKey(derivedKey) ? 'Oui' : 'Non'}`);
|
||
|
||
console.log('\n🎉 Exemple avancé terminé avec succès!');
|
||
|
||
} catch (error) {
|
||
console.error('❌ Erreur fatale:', error instanceof Error ? error.message : error);
|
||
|
||
if (error instanceof VaultApiError) {
|
||
console.error(` Code d'erreur: ${error.statusCode}`);
|
||
console.error(` Endpoint: ${error.endpoint}`);
|
||
} else if (error instanceof VaultDecryptionError) {
|
||
console.error(' Type: Erreur de déchiffrement');
|
||
}
|
||
|
||
process.exit(1);
|
||
}
|
||
}
|
||
|
||
// Fonction utilitaire pour les tests de performance
|
||
async function performanceTest(client: VaultClient, iterations: number = 10) {
|
||
console.log(`\n🏃 Test de performance (${iterations} itérations)...`);
|
||
|
||
const times: number[] = [];
|
||
|
||
for (let i = 0; i < iterations; i++) {
|
||
const start = Date.now();
|
||
await client.getFile('dev', 'bitcoin/bitcoin.conf');
|
||
const end = Date.now();
|
||
times.push(end - start);
|
||
}
|
||
|
||
const avgTime = times.reduce((sum, time) => sum + time, 0) / times.length;
|
||
const minTime = Math.min(...times);
|
||
const maxTime = Math.max(...times);
|
||
|
||
console.log(` Temps moyen: ${Math.round(avgTime)}ms`);
|
||
console.log(` Temps min: ${minTime}ms`);
|
||
console.log(` Temps max: ${maxTime}ms`);
|
||
|
||
return { avgTime, minTime, maxTime };
|
||
}
|
||
|
||
// Exécution de l'exemple
|
||
if (require.main === module) {
|
||
advancedExample();
|
||
}
|
||
|
||
export { advancedExample, performanceTest };
|