webman/push
webman/push
é um plugin de servidor de push gratuito. O cliente é baseado em um modelo de assinatura, compatível com pusher, e possui diversos clientes como JS, Android (java), IOS (swift), IOS (Obj-C), uniapp, .NET, Unity, Flutter, AngularJS, entre outros. O SDK de push para o backend suporta PHP, Node, Ruby, Asp, Java, Python, Go, Swift, entre outros. O cliente já vem com heartbeat e reconexão automática, tornando o uso muito simples e estável. É adequado para cenários de comunicação instantânea como envio de mensagens e chats.
O plugin inclui um cliente web js chamado push.js e um cliente uniapp chamado uniapp-push.js
. Outros clientes de linguagem podem ser baixados em https://pusher.com/docs/channels/channels_libraries/libraries/.
Instalação
composer require webman/push
Cliente (javascript)
Incluir o cliente javascript
<script src="/plugin/webman/push/push.js"> </script>
Uso do cliente (canal público)
// Estabelecendo conexão
var connection = new Push({
url: 'ws://127.0.0.1:3131', // endereço websocket
app_key: '<app_key, obter em config/plugin/webman/push/app.php>',
auth: '/plugin/webman/push/auth' // autenticação para assinatura (apenas para canais privados)
});
// Supondo que o uid do usuário seja 1
var uid = 1;
// O navegador escuta as mensagens do canal user-1, ou seja, as mensagens do usuário com uid 1
var user_channel = connection.subscribe('user-' + uid);
// Quando houver eventos de mensagem no canal user-1
user_channel.on('message', function(data) {
// data contém o conteúdo da mensagem
console.log(data);
});
// Quando houver eventos friendApply no canal user-1
user_channel.on('friendApply', function (data) {
// data contém informações relevantes sobre solicitação de amizade
console.log(data);
});
// Supondo que o id do grupo seja 2
var group_id = 2;
// O navegador escuta as mensagens do canal group-2, ou seja, escuta as mensagens do grupo 2
var group_channel = connection.subscribe('group-' + group_id);
// Quando houver eventos de mensagem no grupo 2
group_channel.on('message', function(data) {
// data contém o conteúdo da mensagem
console.log(data);
});
Dicas
No exemplo acima,subscribe
implementa a assinatura do canal,message
efriendApply
são eventos no canal. O nome do canal e dos eventos são strings arbitrárias e não precisam ser configurados previamente no servidor.
Push do Servidor (PHP)
use Webman\Push\Api;
$api = new Api(
// no webman, as configurações podem ser obtidas diretamente de config, em um ambiente não-webman, as configurações relevantes devem ser escritas manualmente
'http://127.0.0.1:3232',
config('plugin.webman.push.app.app_key'),
config('plugin.webman.push.app.app_secret')
);
// Enviar a todos os clientes que assinaram user-1 a mensagem do evento message
$api->trigger('user-1', 'message', [
'from_uid' => 2,
'content' => 'Olá, este é o conteúdo da mensagem'
]);
Canal Privado
No exemplo acima, qualquer usuário pode assinar informações através do Push.js, o que não é seguro se as informações forem sensíveis.
webman/push
suporta a assinatura de canais privados, que começam com private-
. Por exemplo:
var connection = new Push({
url: 'ws://127.0.0.1:3131', // endereço websocket
app_key: '<app_key>',
auth: '/plugin/webman/push/auth' // autenticação para assinatura (apenas para canais privados)
});
// Supondo que o uid do usuário seja 1
var uid = 1;
// O navegador escuta as mensagens do canal privado private-user-1
var user_channel = connection.subscribe('private-user-' + uid);
Quando o cliente assina um canal privado (um canal que começa com private-
), o navegador fará uma solicitação de autenticação ajax (o endereço ajax é o endereço configurado no parâmetro auth ao criar um novo Push). O desenvolvedor pode verificar aqui se o usuário atual tem permissão para ouvir este canal. Assim, a segurança da assinatura é garantida.
Para mais informações sobre a autenticação, consulte o código em
config/plugin/webman/push/route.php
.
Push do Cliente
Os exemplos acima mostram que o cliente assina um determinado canal e o servidor chama a API para enviar push. O webman/push também suporta o envio direto de mensagens pelo cliente.
Atenção
O envio entre clientes só é suportado em canais privados (aqueles que começam comprivate-
), e o cliente só pode disparar eventos que começam comclient-
.
Exemplo de envio de evento pelo cliente:
var user_channel = connection.subscribe('private-user-1');
user_channel.on('client-message', function (data) {
//
});
user_channel.trigger('client-message', {from_uid:2, content:"olá"});
Atenção
O código acima envia dados do eventoclient-message
para todos os clientes que assinaramprivate-user-1
(os clientes que enviam a mensagem não receberão os dados que enviaram).
Webhooks
Webhooks são usados para receber alguns eventos do canal.
Atualmente, existem 2 eventos principais:
-
1,
channel_added
Evento disparado quando um canal passa de não ter clientes online para ter clientes online, ou seja, um evento de presença. -
2,
channel_removed
Evento disparado quando todos os clientes de um canal estão offline, ou seja, um evento de ausência.
Dicas
Esses eventos são úteis para manter o status online dos usuários.Atenção
O endereço do webhook deve ser configurado emconfig/plugin/webman/push/app.php
.
O código que processa os eventos do webhook pode ser baseado na lógica emconfig/plugin/webman/push/route.php
.
A desconexão temporária de usuários devido ao recarregamento de página não deve ser considerada como offline; o webman/push fará uma verificação de atraso, assim os eventos online/offline terão um atraso de 1 a 3 segundos.
Proxy wss (SSL)
Conexões ws não podem ser usadas sob https, é necessário usar conexões wss. Para isso, você pode usar o nginx como proxy para wss, a configuração é similar a:
server {
# .... outras configurações omitidas ...
location /app/<app_key>
{
proxy_pass http://127.0.0.1:3131;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Real-IP $remote_addr;
}
}
Atenção: o <app_key>
na configuração acima deve ser obtido em config/plugin/webman/push/app.php
.
Após reiniciar o nginx, use a seguinte forma para conectar ao servidor:
var connection = new Push({
url: 'wss://example.com',
app_key: '<app_key, obter em config/plugin/webman/push/app.php>',
auth: '/plugin/webman/push/auth' // autenticação para assinatura (apenas para canais privados)
});
Atenção
- O endereço deve começar com wss
- Não deve incluir a porta
- Deve se conectar usando o domínio correspondente ao certificado SSL.
Instruções de uso do push-vue.js
-
Copie o arquivo push-vue.js para o diretório do projeto, por exemplo: src/utils/push-vue.js
-
Importar na página vue
## Endereços de outros clientes
O `webman/push` é compatível com pusher, os endereços para baixar clientes em outras linguagens (Java, Swift, .NET, Objective-C, Unity, Flutter, Android, IOS, AngularJS, etc.) estão disponíveis em:
https://pusher.com/docs/channels/channels_libraries/libraries/