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#

Sintaxe

js_access function | module.function;

Padrão

Contexto

stream, server

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:

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#

Sintaxe

js_fetch_buffer_size size;

Padrão

js_fetch_buffer_size 16k;

Contexto

stream, server

Define o tamanho do buffer usado para leitura e escrita com Fetch API.

js_fetch_ciphers#

Sintaxe

js_fetch_ciphers ciphers;

Padrão

js_fetch_ciphers HIGH:!aNULL:!MD5;

Contexto

stream, server

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#

Sintaxe

js_fetch_max_response_buffer_size size;

Padrão

js_fetch_max_response_buffer_size 1m;

Contexto

stream, server

Define o tamanho máximo da resposta recebida com Fetch API.

js_fetch_protocols#

Sintaxe

js_fetch_protocols [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];

Padrão

js_fetch_protocols TLSv1 TLSv1.1 TLSv1.2;

Contexto

stream, server

Habilita os protocolos especificados para conexões HTTPS com Fetch API.

js_fetch_timeout#

Sintaxe

js_fetch_timeout time;

Padrão

js_fetch_timeout 60s;

Contexto

stream, server

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#

Sintaxe

js_fetch_trusted_certificate file;

Padrão

Contexto

stream, server

Especifica um arquivo com certificados CA confiáveis no formato PEM usado para verificar o certificado HTTPS com Fetch API.

js_fetch_verify#

Sintaxe

js_fetch_verify on | off;

Padrão

js_fetch_verify on;

Contexto

stream, server

Habilita ou desabilita a verificação do certificado do servidor HTTPS com a Fetch API.

js_fetch_verify_depth#

Sintaxe

js_fetch_verify_depth number;

Padrão

js_fetch_verify_depth 100;

Contexto

stream, server

Define a profundidade de verificação na cadeia de certificados do servidor HTTPS com a Fetch API.

js_filter#

Sintaxe

js_filter function | module.function;

Padrão

Contexto

stream, server

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:

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#

Sintaxe

js_import module.js | export_name from module.js;

Padrão

Contexto

stream, server

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#

Sintaxe

js_path path;

Padrão

Contexto

stream, server

Define um caminho adicional para módulos njs.

js_preload_object#

Sintaxe

js_preload_object name.json | name from file.json;

Padrão

Contexto

stream, server

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#

Sintaxe

js_preread function | module.function;

Padrão

Contexto

stream, server

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:

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#

Sintaxe

js_set $variable function | module.function;

Padrão

Contexto

stream, server

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_shared_dict_zone#

Sintaxe

js_shared_dict_zone zone=nome:tamanho [timeout=tempo] [type=string | number] [evict];

Padrão

Contexto

stream

Define o nome e tamanho da zona de memória compartilhada que mantém o dicionário chave-valor compartilhado entre os processos worker.

type

parâmetro opcional, permite redefinir o tipo de valor para number, por padrão o dicionário compartilhado usa uma string como chave e valor

timeout

parâmetro opcional, define o tempo após o qual todas as entradas do dicionário compartilhado são removidas da zona

evict

parâmetro opcional, remove o par chave-valor mais antigo quando o armazenamento da zona está esgotado

Exemplos:

example.conf:
    # Cria um dicionário de 1Mb com valores string,
    # remove pares chave-valor após 60 segundos de inatividade:
    js_shared_dict_zone zone=foo:1M timeout=60s;

    # Cria um dicionário de 512Kb com valores string,
    # remove forçadamente os pares chave-valor mais antigos quando a zona está esgotada:
    js_shared_dict_zone zone=bar:512K timeout=30s evict;

    # Cria um dicionário permanente de 32Kb com valores numéricos:
    js_shared_dict_zone zone=num:32k type=number;
example.js:
    function get(r) {
        r.return(200, ngx.shared.foo.get(r.args.key));
    }

    function set(r) {
        r.return(200, ngx.shared.foo.set(r.args.key, r.args.value));
    }

    function delete(r) {
        r.return(200, ngx.shared.bar.delete(r.args.key));
    }

    function increment(r) {
        r.return(200, ngx.shared.num.incr(r.args.key, 2));
    }

js_var#

Sintaxe

js_var $variável [valor];

Padrão

Contexto

stream, server

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.