Configuration ChanSpy

Voici ma configuraion dans le fichier extensions.conf pour exécuter le chanspy
[chanspy]
exten => _.,1,Answer()
exten => _.,n,Set(SPYCHAN=${CHANNELS(PJSIP/${ARG2}-)}) ; Utilisation de CHANNELS et - pour obtenir le canal exact
exten => _.,n,ExecIf($[“${SPYCHAN}” != “”]?ExitWhile) ; Vérification et sortie de la boucle si un canal actif est trouvé
;exten => _.,n,Set(SPYMODE=${ARG1}) ; Définir le mode d’espionnage avec l’argument passé
exten => _.,n,EndWhile()
exten => _.,n,ChanSpy(${SPYCHAN},qs) ; Exécuter ChanSpy si SPYCHAN n’est pas vide
exten => n,Hangup() ; Terminer l’appel

J’utilise node js pour lancer les commandes:
ici mon service:

async function spyCall(channel, whisperChannel, spyMode) {
let supNumber = whisperChannel.replace(‘PJSIP/’, ‘’);
let agentNumber = channel.replace(‘PJSIP/’, ‘’);

try {
    // Connexion à l'AMI
    const ami = await AsteriskUtil.connectToAmiConfig();

    // Création d'un client socket pour se connecter à AMI
    const client = new net.Socket();

    return new Promise((resolve, reject) => {
        // Connexion au serveur AMI
        client.connect(ami.options.port, ami.options.host, () => {
            console.log('Connexion établie avec le serveur AMI');

            // Envoi de la commande de login
            client.write('Action: Login\r\n');
            client.write('Events: off\r\n');
            client.write('ActionID: 555\r\n');
            client.write(`Username: ${ami.options.username}\r\n`);
            client.write(`Secret: ${ami.options.password}\r\n\r\n`);
        });

        client.on('data', (data) => {
            const message = data.toString();

            // Vérification de la réponse du serveur AMI après la commande de login
            if (message.includes('Response: Success')) {
                // console.log('Connexion réussie avec AMI.');

                // Envoi de la commande pour espionner le canal
                client.write('Action: Originate\r\n');
                client.write(`Channel: Local/${supNumber}@chanspy\r\n`);
                client.write('Context: chanspy\r\n');
                client.write(`Exten: ${agentNumber}\r\n`);
                client.write('Priority: 1\r\n');
                client.write(`Variable: ARG2=${agentNumber}\r\n`);
                client.write('CallerID: ChanSpy <555>\r\n');
                client.write('Application: ChanSpy\r\n');
                // client.write(`Variable: ARG1=${spyMode}\r\n`);
                client.write('ActionID: 12345\r\n\r\n');

                client.once('data', (originateMessage) => {
                    const originateResponse = originateMessage.toString();

                    if (originateResponse.includes('Response: Error')) {
                        console.error('Erreur Originate:', originateResponse);
                        reject({ response: 'Échec de la commande Originate pour démarrer l\'espionnage' });
                    } else {
                        resolve({ response: 'Écoute en cours' });
                    }
                });

            } else if (message.includes('Response: Error')) {
                console.error('Erreur dans la connexion ou l’action AMI');
                reject({ error: 'Erreur lors de la connexion AMI ou action échouée' });
            }
        });

        // Gestion des erreurs de connexion
        client.on('error', (err) => {
            console.error('Erreur de connexion AMI:', err);
            reject({ error: 'Erreur de connexion AMI' });
        });

        // Gestion de la fermeture de la connexion
        client.on('close', () => {
            console.log("Connexion fermée avec le serveur AMI");
        });
    });
} catch (error) {
    console.error('Erreur lors de l\'espionnage du canal:', error);
    reject({ error: 'Erreur interne du serveur' });
}

}

ici mon controller:

async function spyCall(req, res) {
try {

    let channel = req.body.channel;
    let whisperChannel = req.body.whisperChannel;
    let spyMode = req.body.spyMode;

    try {
        // Récupération du retour du channel
        let startSpyCall = await DialerService.spyCall(channel, whisperChannel, spyMode);
        console.log("Réponse:", startSpyCall);

        if (startSpyCall.response === "Écoute en cours") {

            return res.status(200).json({
                success: "Ecoute du canal activée"
            });

        } else {
            return res.status(500).json({
                error: "Erreur lors de l'écoute. Impossible de se connecter au canal"
            });
        }
    } catch (error) {
        return res.status(500).json({
            error: "Erreur lors de la fermeture du précédent écouté. Veuillez fermer le canal avant de procéder à l'écoute sur un nouveau canal"
        });
    }
}

catch (error) {
    console.error(error);
    return res.status(419).json({
        error: error
    });
}

}

je veux écouter depuis l’interface superviseur, un agent lorsqu’il est en cours d’appel.
Sur l’interface superviseur, j’ai intégrer un softphone pour qu’il me permette d’entendre ce qui se dit dans l’appel. Mais tout ce que j’obtiens lors des tests c’est la file d’attente qui bug, les appels sont hachés en gros le pbx bug lorsque je lance l’écoute!

Toute aide serait la bienvenue…Merci d’avance :raised_hands::cry: