JS#
O módulo é usado para implementar manipuladores em njs — um subconjunto da linguagem JavaScript.
Em nossos repositórios, o módulo é construído dinamicamente e está disponível como um pacote separado chamado
angie-module-njs
ou angie-pro-module-njs
.
Nota
Uma versão leve do pacote, chamada ...-njs-light
, também está
disponível; no entanto, ela não pode ser usada lado a lado com a versão regular.
Exemplo de Configuração#
stream {
js_import stream.js;
js_set $bar stream.bar;
js_set $req_line stream.req_line;
server {
listen 12345;
js_preread stream.preread;
return $req_line;
}
server {
listen 12346;
js_access stream.access;
proxy_pass 127.0.0.1:8000;
js_filter stream.header_inject;
}
}
http {
server {
listen 8000;
location / {
return 200 $http_foo\n;
}
}
}
O arquivo stream.js
:
var line = '';
function bar(s) {
var v = s.variables;
s.log("hello from bar() handler!");
return "bar-var" + v.remote_port + "; pid=" + v.pid;
}
function preread(s) {
s.on('upload', function (data, flags) {
var n = data.indexOf('\n');
if (n != -1) {
line = data.substr(0, n);
s.done();
}
});
}
function req_line(s) {
return line;
}
// Read HTTP request line.
// Collect bytes in 'req' until
// request line is read.
// Injects HTTP header into a client's request
var my_header = 'Foo: foo';
function header_inject(s) {
var req = '';
s.on('upload', function(data, flags) {
req += data;
var n = req.search('\n');
if (n != -1) {
var rest = req.substr(n + 1);
req = req.substr(0, n + 1);
s.send(req + my_header + '\r\n' + rest, flags);
s.off('upload');
}
});
}
function access(s) {
if (s.remoteAddress.match('^192.*')) {
s.deny();
return;
}
s.allow();
}
export default {bar, preread, req_line, header_inject, access};
Diretivas#
js_access#
Define uma função njs que será chamada na fase de acesso. Funções de módulo podem ser referenciadas.
A função é chamada uma vez no momento em que a sessão de stream atinge a fase de acesso pela primeira vez. A função é chamada com os seguintes argumentos:
| o objeto sessão de stream |
Nesta fase, é possível realizar inicialização ou registrar um callback com o método s.on() para cada bloco de dados recebido até que um dos seguintes métodos seja chamado: s.done(), s.decline(), s.allow(). Assim que um desses métodos é chamado, o processamento da sessão de stream muda para a próxima fase e todos os callbacks s.on() atuais são descartados.
js_fetch_buffer_size#
Define o tamanho do buffer usado para leitura e escrita com Fetch API.
js_fetch_ciphers#
Especifica as cifras habilitadas para conexões HTTPS com Fetch API. As cifras são especificadas no formato compreendido pela biblioteca OpenSSL.
A lista de cifras depende da versão do OpenSSL instalada.
A lista completa pode ser visualizada usando o comando openssl ciphers
.
js_fetch_max_response_buffer_size#
| |
Padrão |
|
stream, server |
Define o tamanho máximo da resposta recebida com Fetch API.
js_fetch_protocols#
| |
Padrão |
|
stream, server |
Habilita os protocolos especificados para conexões HTTPS com Fetch API.
js_fetch_timeout#
Define um timeout para leitura e escrita para Fetch API. O timeout é definido apenas entre duas operações sucessivas de leitura/escrita, não para toda a resposta. Se nenhum dado for transmitido dentro deste tempo, a conexão é fechada.
js_fetch_trusted_certificate#
Especifica um arquivo com certificados CA confiáveis no formato PEM usado para verificar o certificado HTTPS com Fetch API.
js_fetch_verify#
Habilita ou desabilita a verificação do certificado do servidor HTTPS com a Fetch API.
js_fetch_verify_depth#
Define a profundidade de verificação na cadeia de certificados do servidor HTTPS com a Fetch API.
js_filter#
Define um filtro de dados. Funções de módulo podem ser referenciadas.
A função de filtro é chamada uma vez no momento em que a sessão de stream atinge a fase de conteúdo. A função de filtro é chamada com os seguintes argumentos:
| o objeto sessão de stream |
Nesta fase, é possível realizar inicialização ou registrar um callback com o método s.on() para cada bloco de dados recebido. O método s.off() pode ser usado para cancelar o registro de um callback e parar a filtragem.
Nota
Como o manipulador js_filter retorna seu resultado imediatamente, ele suporta apenas operações síncronas. Portanto, operações assíncronas como ngx.fetch() ou setTimeout() não são suportadas.
js_import#
Importa um módulo que implementa manipuladores de localização e variável em njs. O export_name é usado como um namespace para acessar as funções do módulo. Se o export_name não for especificado, o nome do módulo será usado como namespace.
js_import stream.js;
Aqui, o nome do módulo stream é usado como namespace ao acessar as exportações. Se o módulo importado exporta foo(), então stream.foo é usado para acessá-la.
Várias diretivas js_import podem ser especificadas.
js_path#
Define um caminho adicional para módulos njs.
js_preload_object#
Pré-carrega um objeto imutável no momento da configuração. O name é usado como nome da variável global através da qual o objeto está disponível no código njs. Se o name não for especificado, o nome do arquivo será usado em seu lugar.
js_preload_object map.json;
Aqui, o map é usado como nome ao acessar o objeto pré-carregado.
Várias diretivas js_preload_object podem ser especificadas.
js_preread#
Define uma função njs que será chamada na fase de pré-leitura. Funções de módulo podem ser referenciadas.
A função é chamada uma vez no momento em que a sessão de stream atinge a fase de pré-leitura pela primeira vez. A função é chamada com os seguintes argumentos:
| o objeto sessão de stream |
Nesta fase, é possível realizar inicialização ou registrar um callback com o método s.on() para cada bloco de dados recebido até que um dos seguintes métodos seja chamado: s.done(), s.decline(), s.allow(). Quando um desses métodos é chamado, a sessão de stream muda para a próxima fase e todos os callbacks s.on() atuais são descartados.
Nota
Como o manipulador js_preread retorna seu resultado imediatamente, ele suporta apenas operações síncronas. Portanto, operações assíncronas como ngx.fetch() ou setTimeout() não são suportadas. No entanto, operações assíncronas são suportadas em callbacks s.on() na fase de pré-leitura.
js_set#
Define uma função njs para a variável especificada. Funções de módulo podem ser referenciadas.
A função é chamada quando a variável é referenciada pela primeira vez para uma determinada requisição. O momento exato depende de uma fase na qual a variável é referenciada. Isso pode ser usado para executar alguma lógica não relacionada à avaliação da variável. Por exemplo, se a variável é referenciada apenas na diretiva log_format, seu manipulador não será executado até a fase de log. Este manipulador pode ser usado para fazer alguma limpeza logo antes da requisição ser liberada.
Nota
Como o manipulador js_set retorna seu resultado imediatamente, ele suporta apenas operações síncronas. Portanto, operações assíncronas como ngx.fetch() ou setTimeout() não são suportadas.
js_var#
Declara uma variável gravável. O valor pode conter texto, variáveis e sua combinação.
Propriedades do Objeto de Sessão#
Cada manipulador njs de stream recebe um argumento, um objeto de sessão de stream.