Gestion des Événements
Le SDK émet plusieurs événements pour gérer divers états et messages. Vous pouvez écouter ces événements pour gérer le comportement de votre application en conséquence.
Événements Disponibles
Événements de Connexion
- open: Émis lorsque la connexion WebSocket est ouverte avec succès.
- close: Émis lorsque la connexion WebSocket est fermée.
Événements de Message
- message: Émis lorsqu'un message est reçu du serveur.
- superpower.response: Événement moderne pour gérer les réponses du serveur (recommandé).
- message.{action}: Événements spécifiques à l'action (ex:
message.summarize,message.translate).
Événements d'Erreur
- error: Émis lorsqu'une erreur se produit.
- superpower.error: Événement moderne pour les erreurs structurées (recommandé).
Écoute d'Événements de Base
client.on('open', () => {
console.log('Connexion WebSocket ouverte.');
});
client.on('message', (payload) => {
console.log('Message reçu:', payload);
});
client.on('error', (error) => {
console.error('Une erreur est survenue:', error);
});
client.on('close', (event) => {
console.log('Connexion WebSocket fermée:', event.code);
});
Noms d'Événements Modernes
Pour le nouveau code, utilisez les noms d'événements modernes:
// Recommandé: Noms d'événements modernes
client.on('superpower.response', (response) => {
console.log('Réponse reçue:', response);
if (response.status === 'success') {
console.log('Action réussie:', response.action);
console.log('Données de réponse:', response.data);
}
});
client.on('superpower.error', (error) => {
console.error(`[${error.category}] ${error.code}:`, error.message);
});
Événements Spécifiques à l'Action
Écoutez des opérations IA spécifiques sans filtrage manuel:
// Écouter uniquement les réponses de résumé
client.on('message.summarize', (response) => {
const results = response.payload.message.results;
if (results && results.length > 0) {
const content = results[0].response[0].content;
console.log('Résumé reçu:', content);
displaySummary(content);
}
});
client.on('message.translate', (response) => {
const results = response.payload.message.results;
if (results && results.length > 0) {
const content = results[0].response[0].content;
console.log('Traduction reçue:', content);
displayTranslation(content);
}
});
client.on('message.recommend', (response) => {
const results = response.payload.message.results;
if (results && results.length > 0) {
// Les recommandations peuvent contenir plusieurs éléments
const recommendations = results[0].response;
console.log('Recommandations:', recommendations);
displayRecommendations(recommendations);
}
});
Événements d'action disponibles:
message.adjustmessage.elevatemessage.interactionmessage.receptionmessage.summarizemessage.translatemessage.recommendmessage.insights
Gestion des Erreurs
Le SDK inclut une gestion d'erreurs structurée avec catégorisation et suggestions de dépannage.
Catégories d'Erreur
- AUTHENTICATION: Erreurs d'authentification et d'autorisation
- WEBSOCKET: Erreurs de connexion et de transport
- VALIDATION: Erreurs de validation de payload et de schéma
- ORCHESTRATOR: Erreurs d'orchestration côté serveur
Structure d'Objet d'Erreur
{
category: 'WEBSOCKET', // Catégorie d'erreur
code: 'INVALID_WEBSOCKET_URL', // Code d'erreur
message: 'Empty or invalid Websocket URL', // Message d'erreur
details: null, // Contexte d'erreur supplémentaire
suggestions: [], // Suggestions de dépannage
correlationId: 'abc123', // ID de corrélation de requête (le cas échéant)
timestamp: '2025-01-15T10:30:00.000Z' // Horodatage ISO 8601
}
Gérer les Erreurs
client.on('error', (error) => {
console.error(`[${error.category}] ${error.code}: ${error.message}`);
// Afficher les suggestions si disponibles
if (error.suggestions && error.suggestions.length > 0) {
console.log('Suggestions:');
error.suggestions.forEach(suggestion => {
console.log(` - ${suggestion}`);
});
}
// Gestion spécifique à la catégorie
switch (error.category) {
case 'AUTHENTICATION':
handleAuthError(error);
break;
case 'WEBSOCKET':
handleConnectionError(error);
break;
case 'VALIDATION':
handleValidationError(error);
break;
}
});
Gestion des Événements
Écouteurs Une Seule Fois
Écouter un événement une seule fois:
client.once('open', () => {
console.log('Première connexion établie');
});
Supprimer les Écouteurs
// Définir une fonction nommée pour la suppression
function handleMessage(message) {
console.log('Message:', message);
}
// Ajouter un écouteur
client.on('message', handleMessage);
// Supprimer un écouteur spécifique
client.off('message', handleMessage);
// Supprimer tous les écouteurs pour un événement
client.removeAllListeners('message');
Modèle de Nettoyage
Supprimez toujours les écouteurs lorsque les composants se démontent pour éviter les fuites de mémoire:
// Exemple React
useEffect(() => {
const handleMessage = (message) => console.log(message);
const handleError = (error) => console.error(error);
client.on('message', handleMessage);
client.on('error', handleError);
// Nettoyage au démontage
return () => {
client.off('message', handleMessage);
client.off('error', handleError);
};
}, [client]);
Exemple Complet
import OptaveJavaScriptSDK from '@optave/client-sdk';
const client = new OptaveJavaScriptSDK({
websocketUrl: 'wss://ws-{{tenant}}.oco.optave.{{tld}}',
authTransport: 'subprotocol',
tokenProvider: async () => {
// Remplacez '/api/optave-token' par votre véritable endpoint backend
const response = await fetch('/api/optave-token');
return (await response.json()).token;
}
});
// Événements de connexion
client.on('open', () => {
console.log('✓ Connecté');
updateStatus('connected');
});
client.on('close', (event) => {
console.log(`✗ Déconnecté: ${event.code}`);
updateStatus('disconnected');
if (!event.wasClean) {
setTimeout(() => reconnect(), 5000);
}
});
// Gestion des messages
client.on('superpower.response', (response) => {
console.log(`Réponse pour ${response.action}:`, response);
if (response.status === 'success') {
displayResponse(response);
}
});
// Gestionnaires spécifiques à l'action
client.on('message.summarize', (response) => {
const results = response.payload.message.results;
if (results && results.length > 0) {
const content = results[0].response[0].content;
console.log('Résumé reçu:', content);
displaySummary(content);
}
});
// Gestion des erreurs
client.on('superpower.error', (error) => {
console.error(`[${error.category}] ${error.code}:`, error.message);
switch (error.category) {
case 'AUTHENTICATION':
handleAuthenticationError(error);
break;
case 'WEBSOCKET':
handleConnectionError(error);
break;
case 'VALIDATION':
handleValidationError(error);
break;
}
});
// Connecter
await client.openConnection();