Grappler é um servidor minimalista para conexões "comet" que expõe uma API única e consistente em todos os transportes. Atualmente, o Grappler suporta os seguintes transportes (cada um com uma lista de navegadores suportados atualmente conhecidos):
* - As implementações XMLHttpRequest de alguns navegadores contêm peculiaridades inesperadas (por exemplo, o navegador integrado para Android 1.6)
O Grappler exporta um objeto principal: Server
.
lib/common.js exporta objetos LOG
e STATE
, que contêm constantes usadas para registrar mensagens e verificar o estado de um cliente, respectivamente.
O objeto LOG
é:
{
INFO: 1,
WARN: 2,
ERROR: 3
}
O objeto STATE
é:
{
ACCEPTED: 1, // internal use only
TEMP: 2, // internal use only
PROTO_HTTP: 4, // client is HTTP-based
PROTO_WEBSOCKET: 8 // client is WebSocket-based
}
Cria uma nova instância de um servidor grappler.
options
é um objeto com os seguintes valores padrão:
{
// A callback for receiving "debug" information. It is called with two arguments: message and message level.
// Message level is one of the values in the `LOG` object.
logger: function(msg, msgLevel) {},
// A string or array of strings which denote who is allowed to connect to this grappler Server instance.
// The format of the string is: "hostname:port", "hostname", or an asterisk substituted for either the hostname
// or port, or both, to act as a wildcard.
origins: "*:*",
// An integer value in milliseconds representing the interval in which a ping is sent to an HTTP client for those
// transports that need to do so.
pingInterval: 3000,
// A storage provider used to store client objects. The default is to use 'object', a simple hash. Other available
// storage providers can be found in lib/storage. The value here is the name without the 'storage' prefix and file extension.
storage: 'object'
}
fnHandleNormalHTTP
é um retorno de chamada capaz de substituir o grappler para uma conexão HTTP de entrada. Se nenhum cabeçalho for enviado, o grappler assume o controle da conexão. Os argumentos fornecidos para esse retorno de chamada são os mesmos para o evento request
de http.Server
, ou seja: objetos http.ServerRequest e http.ServerResponse. Deve-se observar que se você deseja que o grappler lide automaticamente com todas as conexões HTTP de entrada, mas deseja especificar um retorno de chamada para fnAcceptClient
, será necessário especificar um valor false
para fnHandleNormalHTTP
.
fnAcceptClient
é um retorno de chamada executado no momento em que um cliente se conecta. O principal objetivo deste retorno de chamada é ter a chance de negar imediatamente a um cliente acesso adicional ao servidor grappler. Por exemplo, seu aplicativo pode manter uma lista negra ou pode colocar automaticamente na lista negra/restringir um determinado IP após x conexões em um determinado período de tempo. Se esse retorno de chamada retornar false
, a conexão será interrompida automaticamente, caso contrário, a conexão será permitida. O retorno de chamada recebe um argumento, que é o objeto net.Stream
que representa a conexão.
function(client) { }
Este evento é emitido sempre que um novo cliente se conecta com sucesso ao sistema. client
é uma instância de HttpClient
.
function(err) { }
Emitido quando ocorre um erro inesperado.
Inicia o servidor escutando na port
e host
especificados. Se host
for omitido, o servidor escutará qualquer endereço IP.
Envia data
para todos os clientes conectados usando uma encoding
opcional.
Desliga o servidor, deixando de escutar conexões de entrada e cortando quaisquer conexões de cliente existentes.
Há outro objeto importante que é usado no grappler: o objeto HttpClient
. HttpClient
representa um usuário conectado ao servidor e pode ser usado para interagir com esse usuário.
function() { }
Emitido quando o buffer de gravação do cliente fica vazio.
function() { }
Emitido quando o cliente se desconecta.
Um campo de bits que contém o estado atual do cliente. Consulte o objeto STATE
mencionado anteriormente para bits válidos.
O endereço IP do cliente.
Envia data
usando uma encoding
opcional para o cliente. Esta função retorna true
se todos os dados foram descarregados com sucesso para o buffer do kernel. Caso contrário, retornará false
se todos ou parte dos dados estiverem enfileirados na memória do usuário. drain
será emitido quando o buffer do kernel estiver livre novamente.
Envia data
para todos os outros clientes conectados usando uma encoding
opcional.
Corta à força a conexão do cliente com o servidor.