npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

asterisk-cache

v1.0.1

Published

Biblioteca para cachear filas e agentes do Asterisk AMI

Readme

Asterisk Cache

Biblioteca para cachear filas e agentes do Asterisk AMI, com suporte a eventos em tempo real e reconexão automática.

Características

Cache e Eventos

  • Cache em tempo real de filas e agentes
  • Eventos em tempo real para mudanças de status e pausa
  • Agrupamento de eventos para reduzir processamento (delay: 500ms)
  • Suporte a múltiplas filas por agente
  • Status consistente em todas as filas

Conexão

  • Reconexão automática com o Asterisk
  • Timeout de conexão configurável (padrão: 10 segundos)
  • Tratamento de erros robusto
  • Limpeza automática de listeners e timeouts

Comandos AMI Suportados

  • QueuePause: Pausa um agente em todas as filas
  • QueueUnpause: Despausa um agente em todas as filas
  • QueueAdd: Adiciona um agente a uma fila
  • QueueRemove: Remove um agente de uma fila

Eventos AMI Monitorados

  • QueueMemberStatus: Mudanças de status dos agentes
  • QueueMemberAdded: Adição de agentes às filas
  • QueueMemberRemoved: Remoção de agentes das filas
  • QueueMemberPause: Mudanças de status de pausa
  • FullyBooted: Inicialização do Asterisk

Instalação

npm install asterisk-cache

Uso

const AsteriskCache = require('asterisk-cache');

// Configuração do Asterisk AMI
const config = {
    host: '127.0.0.1',
    port: 5038,
    username: 'admin',
    secret: 'amp111'
};

// Criar instância do cache
const cache = new AsteriskCache(config);

// Conectar ao Asterisk
await cache.connect();

// Eventos de conexão
cache.on('connected', () => {
    console.log('Conectado ao Asterisk');
});

cache.on('disconnected', () => {
    console.log('Desconectado do Asterisk');
});

cache.on('reconnecting', (data) => {
    console.log(`Tentando reconectar em ${data.delay/1000} segundos...`);
});

cache.on('connectionError', (error) => {
    console.error(`Erro de conexão (${error.code}): ${error.message}`);
});

// Eventos de filas e agentes
cache.on('queuesUpdated', (queues) => {
    console.log('Filas atualizadas:', queues);
});

cache.on('memberStatusChanged', (data) => {
    console.log(`Agente ${data.member.extension} mudou de status em ${data.queues.length} filas:`);
    data.queues.forEach(queue => {
        console.log(`- ${queue}`);
    });
    console.log(`Status: ${data.member.status}`);
    console.log(`Pausado: ${data.member.paused}`);
});

cache.on('memberPauseChanged', (data) => {
    console.log(`Agente ${data.member.extension} mudou status de pausa em ${data.queues.length} filas:`);
    data.queues.forEach(queue => {
        console.log(`- ${queue}`);
    });
    console.log(`Pausado: ${data.member.paused}`);
    console.log(`Motivo: ${data.member.pausedReason}`);
});

cache.on('memberAdded', (data) => {
    console.log(`Agente ${data.member.extension} adicionado à fila ${data.queue}`);
});

cache.on('memberRemoved', (data) => {
    console.log(`Agente ${data.member.extension} removido da fila ${data.queue}`);
});

// Métodos disponíveis
const queues = cache.getQueues();
const queue = cache.getQueue('fila1');
const agent = cache.getAgentByExtension('SIP/1001');
const availableAgents = cache.getAvailableAgents('fila1'); // Retorna apenas os agentes com status = 1 e pausa = 0
const queueAgents = cache.getQueueAgents('fila1'); // Retorna todos os agentes de uma fila
const allAgents = cache.getAllAgents(); // Retorna todos os agentes com suas filas

// Exemplo de uso dos novos métodos
console.log('Agentes da fila Suporte:');
queueAgents.forEach(agent => {
    console.log(`- ${agent.name} (${agent.extension})`);
    console.log(`  Status: ${agent.status}`);
    console.log(`  Pausado: ${agent.paused}`);
});

console.log('\nTodos os agentes e suas filas:');
allAgents.forEach(agent => {
    console.log(`- ${agent.name} (${agent.extension})`);
    console.log(`  Filas: ${agent.queues.join(', ')}`);
    console.log(`  Status: ${agent.status}`);
    console.log(`  Pausado: ${agent.paused}`);
});

// Pausar/despausar agente
await cache.pauseMember('SIP/1001', 'Almoço');
await cache.unpauseMember('SIP/1001');

// Adicionar/remover agente de fila
await cache.addMemberToQueue('SIP/1001', 'Juca', 'fila1'); // Adiciona agente à fila
await cache.removeMemberFromQueue('SIP/1001', 'fila1'); // Remove agente da fila

// Desconectar
await cache.disconnect();

Eventos

Eventos de Conexão

connected

Emitido quando a conexão com o Asterisk é estabelecida.

// Sem payload

disconnected

Emitido quando a conexão com o Asterisk é perdida.

// Sem payload

reconnecting

Emitido antes de tentar reconectar ao Asterisk.

{
    delay: 5000 // Tempo em milissegundos até a próxima tentativa
}

connectionError

Emitido quando ocorre qualquer erro de conexão.

{
    code: 'TIMEOUT' | 'INVALID_PEER' | 'CONNECTION_ERROR' | 'SOCKET_ERROR' | 'RECONNECTION_ERROR' | 'CLEANUP_ERROR',
    message: 'Descrição do erro'
}

Eventos de Filas e Agentes

queuesUpdated

Emitido quando as filas são atualizadas.

{
    queues: [
        {
            name: 'fila1',
            max: 0,
            strategy: 'ringall',
            calls: 0,
            holdtime: 0,
            talktime: 0,
            completed: 0,
            abandoned: 0,
            servicelevel: 0,
            servicelevelperf: 0,
            servicelevelperf2: 0,
            weight: 0,
            members: [
                {
                    name: 'Agente 1',
                    extension: 'SIP/1001',
                    stateInterface: 'SIP/1001',
                    membership: 'static',
                    penalty: 0,
                    callsTaken: 0,
                    lastCall: 0,
                    lastPause: 0,
                    loginTime: 0,
                    inCall: 0,
                    status: 1,
                    paused: 0,
                    pausedReason: '',
                    wrapupTime: 0
                }
            ]
        }
    ]
}

memberStatusChanged

Emitido quando o status de um agente muda.

{
    queues: ['fila1', 'fila2'], // Filas afetadas
    member: {
        name: 'Agente 1',
        extension: 'SIP/1001',
        stateInterface: 'SIP/1001',
        membership: 'static',
        penalty: 0,
        callsTaken: 0,
        lastCall: 0,
        lastPause: 0,
        loginTime: 0,
        inCall: 0,
        status: 1,
        paused: 0,
        pausedReason: '',
        wrapupTime: 0
    },
    paused: 0
}

memberPauseChanged

Emitido quando o status de pausa de um agente muda.

{
    queues: ['fila1', 'fila2'], // Filas afetadas
    member: {
        name: 'Agente 1',
        extension: 'SIP/1001',
        stateInterface: 'SIP/1001',
        membership: 'static',
        penalty: 0,
        callsTaken: 0,
        lastCall: 0,
        lastPause: 0,
        loginTime: 0,
        inCall: 0,
        status: 1,
        paused: 1,
        pausedReason: 'Almoço',
        wrapupTime: 0
    },
    paused: 1
}

memberAdded

Emitido quando um agente é adicionado a uma fila.

{
    queue: 'fila1',
    member: {
        name: 'Agente 1',
        extension: 'SIP/1001',
        stateInterface: 'SIP/1001',
        membership: 'static',
        penalty: 0,
        callsTaken: 0,
        lastCall: 0,
        lastPause: 0,
        loginTime: 0,
        inCall: 0,
        status: 1,
        paused: 0,
        pausedReason: '',
        wrapupTime: 0
    }
}

memberRemoved

Emitido quando um agente é removido de uma fila.

{
    queue: 'fila1',
    member: {
        name: 'Agente 1',
        extension: 'SIP/1001',
        stateInterface: 'SIP/1001',
        membership: 'static',
        penalty: 0,
        callsTaken: 0,
        lastCall: 0,
        lastPause: 0,
        loginTime: 0,
        inCall: 0,
        status: 1,
        paused: 0,
        pausedReason: '',
        wrapupTime: 0
    }
}

Métodos

connect()

Conecta ao Asterisk AMI.

disconnect()

Desconecta do Asterisk AMI.

getQueues()

Retorna um array com todas as filas.

getQueue(queueName)

Retorna uma fila específica.

getAgentByExtension(extension)

Retorna os dados de um agente pelo ramal, incluindo todas as filas que ele está logado.

getAvailableAgents(queueName)

Retorna um array com os agentes disponíveis de uma fila específica. Retorna apenas os agentes com status = 1 e pausa = 0

getQueueAgents(queueName)

Retorna um array com todos os agentes de uma fila específica.

  • queueName: Nome da fila
  • Retorna um array de agentes com seus dados e a fila

getAllAgents()

Retorna um array com todos os agentes e suas filas.

  • Retorna um array de agentes com seus dados e um array de filas que eles estão logados

pauseMember(memberInterface, reason)

Pausa um agente em todas as filas que ele está logado.

unpauseMember(memberInterface)

Despausa um agente em todas as filas que ele está logado.

addMemberToQueue(memberInterface, memberName, queueName, paused = 0, penalty = 0)

Adiciona um agente a uma fila específica.

  • memberInterface: Interface do agente (ex: 'SIP/1001')
  • memberName: Nome do agente (ex: Juca)
  • queueName: Nome da fila (ex: Suporte)
  • paused: 1 - Pausado, 0 - Sem pausa. (opcional, padrão: 0)
  • penalty: Penalidade do agente (opcional, padrão: 0)

removeMemberFromQueue(memberInterface, queueName)

Remove um agente de uma fila específica.

  • memberInterface: Interface do agente (ex: 'SIP/1001')
  • queueName: Nome da fila

Configuração

const config = {
    host: '10.11.31.4',     // IP do Asterisk
    port: 5038,             // Porta do AMI
    username: 'admin',      // Usuário do AMI
    secret: 'amp111'        // Senha do AMI
};

Características Técnicas

  • Reconexão automática em caso de desconexão
  • Timeout de conexão configurável (padrão: 10 segundos)
  • Agrupamento de eventos para reduzir processamento (delay: 500ms)
  • Tratamento de erros robusto
  • Suporte a múltiplas filas por agente
  • Status consistente em todas as filas
  • Limpeza automática de listeners e timeouts

Contribuição

Contribuições são bem-vindas! Por favor, sinta-se à vontade para enviar um Pull Request.

Licença

MIT