<!-- review: finished -->

<a id="njs-reference"></a>

# Referencia de la API de NJS

El módulo [NJS](https://es.angie.software//angie/docs/installation/external-modules/njs.md#external-njs) proporciona objetos, métodos y propiedades para extender la funcionalidad de Angie.

Esta referencia contiene únicamente propiedades, métodos y módulos específicos de NJS que no cumplen con ECMAScript. Las definiciones de propiedades y métodos de NJS que cumplen con ECMAScript se pueden encontrar en la [especificación de ECMAScript](http://www.ecma-international.org/ecma-262/).

<a id="njs-nginx-objects"></a>

## Objetos de Angie

<a id="njs-http-request"></a>

### Solicitud HTTP

- `r.args{}`
- `r.done()`
- `r.error()`
- `r.finish()`
- `r.headersIn{}`
- `r.headersOut{}`
- `r.httpVersion`
- `r.internal`
- `r.internalRedirect()`
- `r.log()`
- `r.method`
- `r.parent`
- `r.remoteAddress`
- `r.requestBody`
- `r.requestBuffer`
- `r.requestText`
- `r.rawHeadersIn[]`
- `r.rawHeadersOut[]`
- `r.responseBody`
- `r.responseBuffer`
- `r.responseText`
- `r.return()`
- `r.send()`
- `r.sendBuffer()`
- `r.sendHeader()`
- `r.setReturnValue()`
- `r.status`
- `r.subrequest()`
- `r.uri`
- `r.rawVariables{}`
- `r.variables{}`
- `r.warn()`

El objeto de solicitud HTTP está disponible únicamente en el módulo [HTTP JS](https://es.angie.software//angie/docs/installation/external-modules/http_js.md#http-js). Antes de la versión 0.8.5, todas las propiedades de cadena del objeto eran cadenas de bytes.

<a id="r-args"></a>

`r.args{}`

> Objeto de argumentos de la solicitud, solo lectura.

> La cadena de consulta se devuelve como un objeto. Desde la versión 0.7.6, las claves duplicadas se devuelven como un array, las claves distinguen entre mayúsculas y minúsculas, tanto las claves como los valores se decodifican en porcentaje.

> Por ejemplo, la cadena de consulta

> ```text
> a=1&b=%32&A=3&b=4&B=two%20words
> ```

> se convierte a `r.args` como:

> ```javascript
> {a: "1", b: ["2", "4"], A: "3", B: "two words"}
> ```

> Se pueden lograr escenarios de análisis más avanzados con el módulo [Query String](#njs-querystring) y la variable `$args`, por ejemplo:

> ```javascript
> import qs from 'querystring';

> function args(r) {
>     return qs.parse(r.variables.args);
> }
> ```

> El objeto de argumentos se evalúa en el primer acceso a `r.args`. Si solo se necesita un único argumento, por ejemplo `foo`, se pueden usar las variables de Angie:

> ```javascript
> r.variables.arg_foo
> ```

> Aquí, el objeto de variables de Angie devuelve el primer valor para una clave dada, sin distinguir entre mayúsculas y minúsculas, sin decodificación de porcentaje.

> Para convertir `r.args` de nuevo a una cadena, se puede usar el método `stringify` de Query String.

<a id="r-done"></a>

`r.done()`
: Después de llamar a esta función, los siguientes fragmentos de datos se pasarán al cliente sin llamar a `js_body_filter` (0.5.2). Solo se puede llamar desde la función `js_body_filter`.

<a id="r-error"></a>

`r.error(string)`
: Escribe una `string` en el registro de errores en el nivel de registro `error`.
  <br/>
  #### NOTE
  Como Angie tiene un límite de longitud máxima de línea codificado, solo se pueden registrar los primeros 2048 bytes de la cadena.

<a id="r-finish"></a>

`r.finish()`
: Finaliza el envío de una respuesta al cliente.

<a id="r-headers-in"></a>

`r.headersIn{}`
: Objeto de encabezados entrantes, solo lectura.
  <br/>
  Se puede acceder al encabezado de solicitud `Foo` con la sintaxis: `headersIn.foo` o `headersIn['Foo']`.
  <br/>
  Los encabezados de solicitud `Authorization`, `Content-Length`, `Content-Range`, `Content-Type`, `ETag`, `Expect`, `From`, `Host`, `If-Match`, `If-Modified-Since`, `If-None-Match`, `If-Range`, `If-Unmodified-Since`, `Max-Forwards`, `Proxy-Authorization`, `Referer`, `Transfer-Encoding` y `User-Agent` pueden tener solo un valor de campo (0.4.1). Los valores de campo duplicados en los encabezados `Cookie` se separan por punto y coma (`;`). Los valores de campo duplicados en todos los demás encabezados de solicitud se separan por comas.

<a id="r-headers-out"></a>

`r.headersOut{}`
: Objeto de encabezados salientes para la solicitud principal, escribible.
  <br/>
  Si `r.headersOut{}` es el objeto de respuesta de una subsolicitud, representa los encabezados de respuesta. En este caso, los valores de campo en los encabezados de respuesta `Accept-Ranges`, `Connection`, `Content-Disposition`, `Content-Encoding`, `Content-Length`, `Content-Range`, `Date`, `Keep-Alive`, `Server`, `Transfer-Encoding`, `X-Accel-*` pueden omitirse.
  <br/>
  Se puede acceder al encabezado de respuesta `Foo` con la sintaxis: `headersOut.foo` o `headersOut['Foo']`.
  <br/>
  Los encabezados salientes deben establecerse antes de que se envíe un encabezado de respuesta a un cliente; de lo contrario, la actualización del encabezado se ignorará. Esto significa que `r.headersOut{}` es efectivamente escribible en:
  <br/>
  - el manejador `js_content` antes de que se llame a `r.sendHeader()` o `r.return()`
  - el manejador `js_header_filter`
  <br/>
  Los valores de campo de los encabezados de respuesta multivalor (0.4.0) se pueden establecer con la sintaxis:
  <br/>
  ```javascript
  r.headersOut['Foo'] = ['a', 'b']
  ```
  <br/>
  donde la salida será:
  <br/>
  ```text
  Foo: a
  Foo: b
  ```
  <br/>
  Se eliminarán todos los valores de campo anteriores del encabezado de respuesta `Foo`.
  <br/>
  Para los encabezados de respuesta estándar que aceptan solo un valor de campo único como `Content-Type`, solo el último elemento del array tendrá efecto. Los valores de campo del encabezado de respuesta `Set-Cookie` siempre se devuelven como un array. Los valores de campo duplicados en los encabezados de respuesta `Age`, `Content-Encoding`, `Content-Length`, `Content-Type`, `ETag`, `Expires`, `Last-Modified`, `Location`, `Retry-After` se ignoran. Los valores de campo duplicados en todos los demás encabezados de respuesta se separan por comas.

<a id="r-http-version"></a>

`r.httpVersion`
: Versión HTTP, solo lectura.

<a id="r-internal"></a>

`r.internal`
: Valor booleano, `true` para ubicaciones internas.

<a id="r-internal-redirect"></a>

`r.internalRedirect(uri)`
: Realiza una redirección interna al `uri` especificado. Si el URI comienza con el prefijo `@`, se considera una ubicación con nombre. En una nueva ubicación, todo el procesamiento de la solicitud se repite comenzando desde `NGX_HTTP_SERVER_REWRITE_PHASE` para ubicaciones ordinarias y desde `NGX_HTTP_REWRITE_PHASE` para ubicaciones con nombre. Como resultado, una redirección a una ubicación con nombre no verifica el límite `client_max_body_size`. Las solicitudes redirigidas se vuelven internas y pueden acceder a ubicaciones internas. La redirección real ocurre después de que se completa la ejecución del manejador.
  <br/>
  #### NOTE
  Después de la redirección, se inicia una nueva VM de NJS en la ubicación de destino, y la VM en la ubicación original se detiene. Los valores de las variables de Angie se mantienen y se pueden usar para pasar información a la ubicación de destino. Desde la versión 0.5.3, se puede usar una variable declarada con la directiva `js_var` para HTTP o Stream.
  <br/>
  #### NOTE
  Desde la versión 0.7.4, el método acepta URI escapados.

<a id="r-log"></a>

`r.log(string)`
: Escribe una `string` en el registro de errores en el nivel de registro `info`.
  <br/>
  #### NOTE
  Como Angie tiene un límite de longitud máxima de línea codificado, solo se pueden registrar los primeros 2048 bytes de la cadena.

<a id="r-method"></a>

`r.method`
: Método HTTP, solo lectura.

<a id="r-parent"></a>

`r.parent`
: Hace referencia al objeto de solicitud padre.

<a id="r-remote-address"></a>

`r.remoteAddress`
: Dirección del cliente, solo lectura.

<a id="r-request-body"></a>

`r.requestBody`
: La propiedad quedó obsoleta en la versión 0.5.0 y se eliminó en la versión 0.8.0. En su lugar, se debe usar la propiedad `r.requestBuffer` o `r.requestText`.

<a id="r-request-buffer"></a>

`r.requestBuffer`
: Cuerpo de la solicitud del cliente si no se ha escrito en un archivo temporal (desde la versión 0.5.0). Para asegurar que el cuerpo de la solicitud del cliente esté en memoria, su tamaño debe limitarse mediante `client_max_body_size`, y se debe establecer un tamaño de búfer suficiente usando `client_body_buffer_size`. La propiedad está disponible solo en la directiva `js_content`.

<a id="r-request-text"></a>

`r.requestText`
: Lo mismo que `r.requestBuffer`, pero devuelve una `string`. Tenga en cuenta que puede convertir bytes no válidos en la codificación UTF-8 en el carácter de reemplazo.

<a id="r-raw-headers-in"></a>

`r.rawHeadersIn[]`
: Devuelve un array de pares clave-valor exactamente como se recibieron del cliente (0.4.1).
  <br/>
  Por ejemplo, con los siguientes encabezados de solicitud:
  <br/>
  ```text
  Host: localhost
  Foo:  bar
  foo:  bar2
  ```
  <br/>
  la salida de `r.rawHeadersIn` será:
  <br/>
  ```javascript
  [
      ['Host', 'localhost'],
      ['Foo', 'bar'],
      ['foo', 'bar2']
  ]
  ```
  <br/>
  Todos los encabezados `foo` se pueden recopilar con la sintaxis:
  <br/>
  ```javascript
  r.rawHeadersIn.filter(v=>v[0].toLowerCase() == 'foo').map(v=>v[1])
  ```
  <br/>
  la salida será:
  <br/>
  ```javascript
  ['bar', 'bar2']
  ```
  <br/>
  Los nombres de los campos de encabezado no se convierten a minúsculas, los valores de campo duplicados no se fusionan.

<a id="r-raw-headers-out"></a>

`r.rawHeadersOut[]`
: Devuelve un array de pares clave-valor de encabezados de respuesta (0.4.1). Los nombres de los campos de encabezado no se convierten a minúsculas, los valores de campo duplicados no se fusionan.

<a id="r-response-body"></a>

`r.responseBody`
: La propiedad quedó obsoleta en la versión 0.5.0 y se eliminó en la versión 0.8.0. En su lugar, se debe usar la propiedad `r.responseBuffer` o `r.responseText`.

<a id="r-response-buffer"></a>

`r.responseBuffer`
: Contiene el cuerpo de respuesta de la subsolicitud, solo lectura (desde la versión 0.5.0). El tamaño de `r.responseBuffer` está limitado por la directiva `subrequest_output_buffer_size`.

<a id="r-response-text"></a>

`r.responseText`
: Lo mismo que `r.responseBuffer` pero devuelve una cadena (desde 0.5.0). Tenga en cuenta que puede convertir bytes no válidos en codificación UTF-8 en el carácter de reemplazo.

<a id="r-return"></a>

`r.return(status[, string | Buffer])`
: Envía la respuesta completa con el `status` especificado al cliente. La respuesta puede ser una cadena o Buffer (0.5.0).
  <br/>
  Es posible especificar una URL de redirección (para los códigos 301, 302, 303, 307 y 308) o el texto del cuerpo de la respuesta (para otros códigos) como segundo argumento.

<a id="r-send"></a>

`r.send(string | Buffer)`
: Envía una parte del cuerpo de la respuesta al cliente. Los datos enviados pueden ser una cadena o Buffer (0.5.0).

<a id="r-sendbuffer"></a>

`r.sendBuffer(data[, options])`
: Añade datos a la cadena de fragmentos de datos que se reenviarán al siguiente filtro de cuerpo (0.5.2). El reenvío real ocurre más tarde, cuando se procesan todos los fragmentos de datos de la cadena actual.
  <br/>
  Los datos pueden ser una cadena o Buffer. `options` es un objeto utilizado para anular las banderas de búfer de Angie derivadas de un búfer de fragmento de datos entrante. Las banderas se pueden anular con las siguientes banderas:
  <br/>
  `last`
  : Booleano, `true` si el búfer es el último búfer.
  <br/>
  `flush`
  : Booleano, `true` si el búfer debe tener la bandera `flush`.
  <br/>
  El método solo se puede llamar desde la función `js_body_filter`.

<a id="r-send-header"></a>

`r.sendHeader()`
: Envía las cabeceras HTTP al cliente.

<a id="r-set-return-value"></a>

`r.setReturnValue(value)`
: Establece el valor de retorno del manejador `js_set` (0.7.0). A diferencia de una declaración de retorno ordinaria, este método debe usarse cuando el manejador es una función asíncrona de JS. Por ejemplo:
  <br/>
  ```javascript
  async function js_set(r) {
      const digest = await crypto.subtle.digest('SHA-256', r.headersIn.host);
      r.setReturnValue(digest);
  }
  ```

<a id="r-status"></a>

`r.status`
: Estado, escribible.

<a id="r-subrequest"></a>

`r.subrequest(uri[, options[, callback]])`
: Crea una subsolicitud con el `uri` y `options` dados, e instala un `callback` de finalización opcional.
  <br/>
  Una subsolicitud comparte sus cabeceras de entrada con la solicitud del cliente. Para enviar cabeceras diferentes de las cabeceras originales a un servidor proxy, se puede usar la directiva `proxy_set_header`. Para enviar un conjunto completamente nuevo de cabeceras a un servidor proxy, se puede usar la directiva `proxy_pass_request_headers`.
  <br/>
  Si `options` es una cadena, entonces contiene la cadena de argumentos de la subsolicitud. De lo contrario, se espera que `options` sea un objeto con las siguientes claves:
  <br/>
  `args`
  : Cadena de argumentos, por defecto se usa una cadena vacía.
  <br/>
  `body`
  : Cuerpo de la solicitud, por defecto se usa el cuerpo de la solicitud del objeto de solicitud padre.
  <br/>
  `method`
  : Método HTTP, por defecto se usa el método `GET`.
  <br/>
  `detached`
  : Bandera booleana (0.3.9); si es `true`, la subsolicitud creada es una subsolicitud independiente. Las respuestas a subsolicitudes independientes se ignoran. A diferencia de las subsolicitudes ordinarias, una subsolicitud independiente se puede crear dentro de un manejador de variable. La bandera `detached` y el argumento callback son mutuamente excluyentes.
  <br/>
  El `callback` de finalización recibe un objeto de respuesta de subsolicitud con métodos y propiedades idénticos al objeto de solicitud padre.
  <br/>
  Desde 0.3.8, si no se proporciona un `callback`, se devuelve el objeto `Promise` que se resuelve en el objeto de respuesta de subsolicitud.
  <br/>
  Por ejemplo, para ver todas las cabeceras de respuesta en la subsolicitud:
  <br/>
  ```javascript
  async function handler(r) {
      const reply = await r.subrequest('/path');
  <br/>
      for (const h in reply.headersOut) {
          r.log(`${h}: ${reply.headersOut[h]}`);
      }
  <br/>
      r.return(200);
  }
  ```

<a id="r-uri"></a>

`r.uri`
: URI actual en la solicitud, normalizado, solo lectura.

<a id="r-raw-variables"></a>

`r.rawVariables{}`
: Variables de Angie como Buffers, escribible (desde 0.5.0).

<a id="r-variables"></a>

`r.variables{}`
: Objeto de variables de Angie, escribible (desde 0.2.8).
  <br/>
  Por ejemplo, para obtener la variable `$foo`, se puede usar una de las siguientes sintaxis:
  <br/>
  ```javascript
  r.variables['foo']
  r.variables.foo
  ```
  <br/>
  Desde 0.8.6, las capturas de expresiones regulares se pueden acceder usando la siguiente sintaxis:
  <br/>
  ```javascript
  r.variables['1']
  r.variables[1]
  ```
  <br/>
  Angie trata las variables referenciadas en `angie.conf` y las variables no referenciadas de manera diferente. Cuando se referencia una variable, puede ser cacheable, pero cuando no se referencia, siempre es no cacheable. Por ejemplo, cuando la variable `$request_id` solo se accede desde NJS, tiene un nuevo valor cada vez que se evalúa. Pero, cuando `$request_id` se referencia, por ejemplo:
  <br/>
  ```nginx
  proxy_set_header X-Request-Id $request_id;
  ```
  <br/>
  el `r.variables.request_id` devuelve el mismo valor cada vez.
  <br/>
  Una variable es escribible si:
  <br/>
  - fue creada usando la directiva `js_var` para HTTP o Stream (desde 0.5.3)
  - está referenciada en el archivo de configuración de Angie
  <br/>
  Aun así, algunas variables integradas todavía no se les puede asignar un valor (por ejemplo, `$http_`).

<a id="r-warn"></a>

`r.warn(string)`
: Escribe una `string` en el registro de errores en el nivel de registro `warning`.
  <br/>
  #### NOTE
  Como Angie tiene un límite de longitud máxima de línea codificado, solo se pueden registrar los primeros 2048 bytes de la cadena.

<a id="njs-stream-session"></a>

### Sesión de Stream

- `s.allow()`
- `s.decline()`
- `s.deny()`
- `s.done()`
- `s.error()`
- `s.log()`
- `s.off()`
- `s.on()`
- `s.remoteAddress`
- `s.rawVariables{}`
- `s.send()`
- `s.sendDownstream()`
- `s.sendUpstream()`
- `s.status`
- `s.setReturnValue()`
- `s.variables{}`
- `s.warn()`

El objeto de sesión de stream solo está disponible en el módulo [Stream JS](https://es.angie.software//angie/docs/installation/external-modules/stream_js.md#stream-js). Antes de 0.8.5, todas las propiedades de cadena del objeto eran cadenas de bytes.

<a id="njs-s-allow"></a>

`s.allow()`
: Un alias de `s.done(0)` (0.2.4).

<a id="njs-s-decline"></a>

`s.decline()`
: Un alias de `s.done(-5)` (0.2.4).

<a id="njs-s-deny"></a>

`s.deny()`
: Un alias de `s.done(403)` (0.2.4).

<a id="njs-s-done"></a>

`s.done([code])`
: Establece un `code` de salida para el manejador de fase actual a un valor de código, por defecto `0`. La finalización real ocurre cuando se completa el manejador js y se procesan todos los eventos pendientes, por ejemplo, de `ngx.fetch()` o `setTimeout()` (0.2.4).
  <br/>
  Valores de código posibles:
  <br/>
  - `0` — finalización exitosa, pasando el control a la siguiente fase
  - `-5` — indeciso, pasando el control al siguiente manejador de la fase actual (si existe)
  - `403` — acceso prohibido
  <br/>
  Solo se puede llamar desde una función de manejador de fase: `js_access` o `js_preread`.

<a id="njs-s-error"></a>

`s.error(string)`
: Escribe una `string` enviada en el registro de errores en el nivel de registro `error`.
  <br/>
  #### NOTE
  Como Angie tiene un límite de longitud máxima de línea codificado, solo se pueden registrar los primeros 2048 bytes de la cadena.

<a id="s-log"></a>

`s.log(string)`
: Escribe una `string` enviada en el registro de errores en el nivel de registro `info`.
  <br/>
  #### NOTE
  Como Angie tiene un límite de longitud máxima de línea codificado, solo se pueden registrar los primeros 2048 bytes de la cadena.

<a id="s-off"></a>

`s.off(eventName)`
: Anula el registro del callback establecido por el método `s.on()` (0.2.4).

<a id="s-on"></a>

`s.on(event, callback)`
: Registra un `callback` para el `event` especificado (0.2.4).
  <br/>
  Un `event` puede ser una de las siguientes cadenas:
  <br/>
  `upload`
  : Nuevos datos (cadena) de un cliente.
  <br/>
  `download`
  : Nuevos datos (cadena) a un cliente.
  <br/>
  `upstream`
  : Nuevos datos (Buffer) de un cliente (desde 0.5.0).
  <br/>
  `downstream`
  : Nuevos datos (Buffer) a un cliente (desde 0.5.0).
  <br/>
  El callback de finalización tiene el siguiente prototipo: `callback(data, flags)`, donde `data` es cadena o Buffer (dependiendo del tipo de evento); `flags` es un objeto con las siguientes propiedades:
  <br/>
  `last`
  : Un valor booleano, `true` si los datos son el último búfer.

<a id="s-remote-address"></a>

`s.remoteAddress`
: Dirección del cliente, solo lectura.

<a id="s-raw-variables"></a>

`s.rawVariables`
: Variables de Angie como Buffers, escribible (desde 0.5.0).

<a id="s-send"></a>

`s.send(data[, options])`
: Añade datos a la cadena de fragmentos de datos que se reenviarán en la dirección de avance: en el callback de descarga a un cliente; en la carga a un servidor upstream (0.2.4). El reenvío real ocurre más tarde, cuando se procesan todos los fragmentos de datos de la cadena actual.
  <br/>
  Los datos pueden ser una cadena o Buffer (0.5.0). `options` es un objeto utilizado para anular las banderas de búfer de Angie derivadas de un búfer de fragmento de datos entrante. Las banderas se pueden anular con las siguientes banderas:
  <br/>
  `last`
  : Booleano, `true` si el búfer es el último búfer.
  <br/>
  `flush`
  : Booleano, `true` si el búfer debe tener la bandera `flush`.
  <br/>
  El método se puede llamar varias veces por invocación de callback.

<a id="s-send-downstream"></a>

`s.sendDownstream()`
: Idéntico a `s.send()`, excepto que siempre envía datos a un cliente (desde 0.7.8).

<a id="s-send-upstream"></a>

`s.sendUpstream()`
: Idéntico a `s.send()`, excepto que siempre envía datos desde un cliente (desde 0.7.8).

<a id="s-status"></a>

`s.status`
: Código de estado de la sesión, un alias de la variable `$status`, solo lectura (desde 0.5.2).

<a id="s-set-return-value"></a>

`s.setReturnValue(value)`
: Establece el valor de retorno del manejador `js_set` (0.7.0). A diferencia de una sentencia return ordinaria, este método debe usarse cuando el manejador es una función JS asíncrona. Por ejemplo:
  <br/>
  ```javascript
  async function js_set(r) {
      const digest = await crypto.subtle.digest('SHA-256', r.headersIn.host);
      r.setReturnValue(digest);
  }
  ```

<a id="s-variables"></a>

`s.variables{}`
: Objeto de variables de Angie, escribible (desde 0.2.8). Una variable solo puede ser escribible si está referenciada en el archivo de configuración de Angie. Aun así, algunas variables integradas todavía no pueden ser asignadas con un valor.

<a id="s-warn"></a>

`s.warn(string)`
: Escribe la `string` enviada en el registro de errores con el nivel de registro `warning`.
  <br/>
  #### NOTE
  Como Angie tiene un límite de longitud máxima de línea codificado, solo se pueden registrar los primeros 2048 bytes de la cadena.

<a id="njs-periodic-session"></a>

### Sesión Periódica

- `PeriodicSession.rawVariables{}`
- `PeriodicSession.variables{}`

El objeto `Periodic Session` se proporciona como el primer argumento para el manejador `js_periodic` para HTTP y Stream (desde 0.8.1).

`PeriodicSession.rawVariables{}`
: Variables de Angie como Buffers, escribibles.

`PeriodicSession.variables{}`
: Objeto de variables de Angie, escribible.

<a id="njs-headers"></a>

### Headers

- `Headers()`
- `Headers.append()`
- `Headers.delete()`
- `Headers.get()`
- `Headers.getAll()`
- `Headers.forEach()`
- `Headers.has()`
- `Headers.set()`

La interfaz `Headers` de la API Fetch está disponible desde 0.5.1.

Se puede crear un nuevo objeto `Headers` usando el constructor `Headers()` (desde 0.7.10):

`Headers([init])`
: `init`
  : Un objeto que contiene cabeceras HTTP para prepoblar el objeto `Headers`, puede ser un `string`, un `array` de pares nombre-valor, o un objeto `Headers` existente.

Un nuevo objeto `Headers` tiene las siguientes propiedades y métodos:

`append()`
: Añade un nuevo valor a una cabecera existente en el objeto `Headers`, o añade la cabecera si aún no existe (desde 0.7.10).

`delete()`
: Elimina una cabecera del objeto `Headers` (desde 0.7.10).

`get()`
: Devuelve una cadena que contiene los valores de todas las cabeceras con el nombre especificado separados por una coma y un espacio.

`getAll(name)`
: Devuelve un array que contiene los valores de todas las cabeceras con el nombre especificado.

`forEach()`
: Ejecuta una función proporcionada una vez por cada par clave/valor en el objeto `Headers` (desde 0.7.10).

`has()`
: Devuelve un valor booleano que indica si existe una cabecera con el nombre especificado.

`set()`
: Establece un nuevo valor para una cabecera existente dentro del objeto `Headers`, o añade la cabecera si aún no existe (desde 0.7.10).

<a id="njs-request"></a>

### Request

- `Request()`
- `Request.arrayBuffer()`
- `Request.bodyUsed`
- `Request.cache`
- `Request.credentials`
- `Request.headers`
- `Request.json()`
- `Request.method`
- `Request.mode`
- `Request.text()`
- `Request.url`

La interfaz `Request` de la API Fetch está disponible desde 0.7.10.

Se puede crear un nuevo objeto `Request` usando el constructor `Request()`:

`Request[resource[, options]])`
: Crea un objeto `Request` para obtener que puede pasarse posteriormente a `ngx.fetch()`. El `resource` puede ser una URL o un objeto `Request` existente. El `options` es un argumento opcional que se espera que sea un objeto con las siguientes claves:
  <br/>
  `body`
  : El cuerpo de la petición, por defecto está vacío.
  <br/>
  `headers`
  : El objeto de cabeceras de la petición — el objeto que contiene cabeceras HTTP para prepoblar el objeto `Headers`, puede ser un `string`, un `array` de pares nombre-valor, o un objeto `Headers` existente.
  <br/>
  `method`
  : El método HTTP, por defecto se usa el método GET.

Un nuevo objeto `Request` tiene las siguientes propiedades y métodos:

`arrayBuffer()`
: Devuelve una `Promise` que se resuelve con un `ArrayBuffer`.

`bodyUsed`
: Un valor booleano, `true` si el cuerpo fue usado en la petición.

`cache`
: Contiene el modo de caché de la petición.

`credentials`
: Contiene las credenciales de la petición, por defecto es `same-origin`.

`headers`
: El objeto `Headers` de solo lectura asociado con el `Request`.

`json()`
: Devuelve una `Promise` que se resuelve con el resultado de analizar el cuerpo de la petición como JSON.

`method`
: Contiene el método de la petición.

`mode`
: Contiene el modo de la petición.

`text()`
: Devuelve una `Promise` que se resuelve con una representación de cadena del cuerpo de la petición.

`url`
: Contiene la URL de la petición.

<a id="njs-response"></a>

### Response

- `Response()`
- `Response.arrayBuffer()`
- `Response.bodyUsed`
- `Response.headers`
- `Response.json()`
- `Response.ok`
- `Response.redirected`
- `Response.status`
- `Response.statusText`
- `Response.text()`
- `Response.type`
- `Response.url`

La interfaz `Response` está disponible desde 0.5.1.

Se puede crear un nuevo objeto `Response` usando el constructor `Response()` (desde 0.7.10):

`Response[body[, options]])`
: Crea un objeto `Response`. El `body` es un argumento opcional, puede ser un `string` o un `buffer`, por defecto es `null`. El `options` es un argumento opcional que se espera que sea un objeto con las siguientes claves:
  <br/>
  `headers`
  : El objeto de cabeceras de respuesta — el objeto que contiene cabeceras HTTP para prepoblar el objeto `Headers`, puede ser un `string`, un `array` de pares nombre-valor, o un objeto `Headers` existente.
  <br/>
  `status`
  : El código de estado de la respuesta.
  <br/>
  `statusText`
  : El mensaje de estado correspondiente al código de estado.

Un nuevo objeto `Response()` tiene las siguientes propiedades y métodos:

`arrayBuffer()`
: Toma un flujo `Response` y lo lee hasta completarlo. Devuelve una `Promise` que se resuelve con un `ArrayBuffer`.

`bodyUsed`
: Un valor booleano, `true` si el cuerpo fue leído.

`headers`
: El objeto `Headers` de solo lectura asociado con el `Response`.

`json()`
: Toma un flujo `Response` y lo lee hasta completarlo. Devuelve una `Promise` que se resuelve con el resultado de analizar el texto del cuerpo como JSON.

`ok`
: Un valor booleano, `true` si la respuesta fue exitosa (códigos de estado entre 200–299).

`redirected`
: Un valor booleano, `true` si la respuesta es el resultado de una redirección.

`status`
: El código de estado de la respuesta.

`statusText`
: El mensaje de estado correspondiente al código de estado.

`text()`
: Toma un flujo `Response` y lo lee hasta completarlo. Devuelve una `Promise` que se resuelve con una cadena.

`type`
: El tipo de la respuesta.

`url`
: La URL de la respuesta.

<a id="njs-ngx"></a>

### ngx

- `ngx.build`
- `ngx.conf_file_path`
- `ngx.conf_prefix`
- `ngx.error_log_path`
- `ngx.fetch()`
- `ngx.log()`
- `ngx.prefix`
- `ngx.version`
- `ngx.version_number`
- `ngx.worker_id`

El objeto global `ngx` está disponible desde 0.5.0.

`ngx.build`
: Una cadena que contiene un nombre de compilación opcional de Angie, corresponde al argumento `--build=name` del script configure, por defecto es `""` (0.8.0).

`ngx.conf_file_path`
: Una cadena que contiene la ruta del archivo al archivo de configuración actual de Angie (0.8.0).

`ngx.conf_prefix`
: Una cadena que contiene la ruta del archivo al prefijo de configuración de Angie — el directorio donde Angie está buscando actualmente la configuración (0.7.8).

`ngx.error_log_path`
: Una cadena que contiene la ruta del archivo al archivo de registro de errores actual (0.8.0).

<a id="ngx-fetch"></a>

`ngx.fetch(resource, [options])`
: Realiza una solicitud para obtener un `resource` (0.5.1), que puede ser una URL o el objeto `Request` (0.7.10). Devuelve una `Promise` que se resuelve con el objeto `Response`. Desde 0.7.0, se admite el esquema `https://`; las redirecciones no se gestionan.
  <br/>
  Si la URL en el `resource` se especifica como un nombre de dominio, se resuelve utilizando un resolver. Si se especifica el esquema `https://`, la directiva `js_fetch_trusted_certificate` debe configurarse para la autenticación del servidor HTTPS del `resource`.
  <br/>
  Se espera que el parámetro `options` sea un objeto con las siguientes claves:
  <br/>
  `body`
  : Cuerpo de la solicitud, por defecto está vacío.
  <br/>
  `buffer_size`
  : El tamaño del búfer para leer la respuesta, por defecto es `4096`.
  <br/>
  `headers`
  : Objeto de encabezados de la solicitud.
  <br/>
  `max_response_body_size`
  : El tamaño máximo del cuerpo de la respuesta en bytes, por defecto es `32768`.
  <br/>
  `method`
  : Método HTTP, por defecto se utiliza el método `GET`.
  <br/>
  `verify`
  : Habilita o deshabilita la verificación del certificado del servidor HTTPS, por defecto es `true` (0.7.0).
  <br/>
  Ejemplo:
  <br/>
  ```javascript
  let reply = await ngx.fetch('http://example.com/');
  let body = await reply.text();
  <br/>
  r.return(200, body);
  ```

`ngx.log(level, message)`
: Escribe un mensaje en el registro de errores con el nivel de registro especificado. El parámetro `level` especifica uno de los niveles de registro; el parámetro `message` puede ser una cadena o Buffer. Se pueden especificar los siguientes niveles de registro: `ngx.INFO`, `ngx.WARN` y `ngx.ERR`.
  <br/>
  #### NOTE
  Como Angie tiene un límite de longitud máxima de línea codificado, solo se pueden registrar los primeros 2048 bytes de la cadena.

`ngx.prefix`
: Una cadena que contiene la ruta del archivo al prefijo de Angie — un directorio que contiene los archivos del servidor (0.8.0).

`ngx.version`
: Una cadena que contiene la versión de Angie, por ejemplo: `1.25.0` (0.8.0).

`ngx.version_number`
: Un número que contiene la versión de Angie, por ejemplo: `1025000` (0.8.0).

`ngx.worker_id`
: Un número que corresponde al ID interno del worker de Angie, el valor está entre `0` y el valor especificado en la directiva `worker_processes` (0.8.0).

<a id="njs-ngx-shared"></a>

### ngx.shared

El objeto global `ngx.shared` está disponible desde 0.8.0.

<a id="njs-shareddict"></a>

#### SharedDict

- `ngx.shared.SharedDict.add()`
- `ngx.shared.SharedDict.capacity`
- `ngx.shared.SharedDict.clear()`
- `ngx.shared.SharedDict.delete()`
- `ngx.shared.SharedDict.freeSpace()`
- `ngx.shared.SharedDict.get()`
- `ngx.shared.SharedDict.has()`
- `ngx.shared.SharedDict.incr()`
- `ngx.shared.SharedDict.items()`
- `ngx.shared.SharedDict.keys()`
- `ngx.shared.SharedDict.name`
- `ngx.shared.SharedDict.pop()`
- `ngx.shared.SharedDict.replace()`
- `ngx.shared.SharedDict.set()`
- `ngx.shared.SharedDict.size()`
- `ngx.shared.SharedDict.type`

El objeto de diccionario compartido está disponible desde 0.8.0. El nombre, tipo y tamaño del diccionario compartido se establecen con la directiva `js_shared_dict_zone` en HTTP o Stream.

Un objeto `SharedDict()` tiene las siguientes propiedades y métodos:

`ngx.shared.SharedDict.add(key, value [,timeout])`
: Establece el `value` para la `key` especificada en el diccionario solo si la clave aún no existe. El argumento `key` es una cadena que representa la clave del elemento a agregar; el argumento `value` es el valor del elemento a agregar.
  <br/>
  El argumento opcional `timeout` se especifica en milisegundos y anula el parámetro `timeout` de la directiva `js_shared_dict_zone` en HTTP o Stream (desde 0.8.5). Puede ser útil cuando se espera que algunas claves tengan tiempos de espera únicos.
  <br/>
  Devuelve `true` si el valor se ha agregado correctamente al diccionario `SharedDict`; `false` si la clave ya existe en el diccionario. Lanza `SharedMemoryError` si no hay suficiente espacio libre en el diccionario `SharedDict`. Lanza `TypeError` si el `value` es de un tipo diferente al esperado por este diccionario.

`ngx.shared.SharedDict.capacity`
: Devuelve la capacidad del diccionario `SharedDict`, corresponde al parámetro `size` de la directiva `js_shared_dict_zone` en HTTP o Stream.

`ngx.shared.SharedDict.clear()`
: Elimina todos los elementos del diccionario `SharedDict`.

`ngx.shared.SharedDict.delete(key)`
: Elimina el elemento asociado con la clave especificada del diccionario `SharedDict`; `true` si el elemento en el diccionario existía y fue eliminado, `false` en caso contrario.

`ngx.shared.SharedDict.freeSpace()`
: Devuelve el tamaño de página libre en bytes. Si el tamaño es cero, el diccionario `SharedDict` seguirá aceptando nuevos valores si hay espacio en las páginas ocupadas.

`ngx.shared.SharedDict.get(key)`
: Recupera el elemento por su `key`; devuelve el valor asociado con la `key` o `undefined` si no hay ninguno.

`ngx.shared.SharedDict.has(key)`
: Busca un elemento por su `key`; devuelve `true` si tal elemento existe o `false` en caso contrario.

`ngx.shared.SharedDict.incr(key,delta[[,init], timeout])`
: Incrementa el valor entero asociado con la `key` por `delta`. El argumento `key` es una cadena; el argumento `delta` es el número por el cual incrementar o decrementar el valor. Si la clave no existe, el elemento se inicializará al argumento opcional `init`, por defecto es `0`.
  <br/>
  El argumento opcional `timeout` se especifica en milisegundos y anula el parámetro `timeout` de la directiva `js_shared_dict_zone` en HTTP o Stream (desde 0.8.5). Puede ser útil cuando se espera que algunas claves tengan tiempos de espera únicos.
  <br/>
  Devuelve el nuevo valor. Lanza `SharedMemoryError` si no hay suficiente espacio libre en el diccionario `SharedDict`. Lanza `TypeError` si este diccionario no espera números.
  <br/>
  #### NOTE
  Este método solo se puede utilizar si el tipo de diccionario se declaró con el parámetro `type=number` de la directiva `js_shared_dict_zone` en HTTP o Stream.

`ngx.shared.SharedDict.items([maxCount])`
: Devuelve un array de los elementos clave-valor del diccionario `SharedDict` (desde 0.8.1). El parámetro `maxCount` establece el número máximo de elementos a recuperar, por defecto es `1024`.

`ngx.shared.SharedDict.keys([maxCount])`
: Devuelve un array de las claves del diccionario `SharedDict`. El parámetro `maxCount` establece el número máximo de claves a recuperar, por defecto es `1024`.

`ngx.shared.SharedDict.name`
: Devuelve el nombre del diccionario `SharedDict`, corresponde al parámetro `zone=` de la directiva `js_shared_dict_zone` en HTTP o Stream.

`ngx.shared.SharedDict.pop(key)`
: Elimina el elemento asociado con la `key` especificada del diccionario `SharedDict`; devuelve el valor asociado con la `key` o `undefined` si no hay ninguno.

`ngx.shared.SharedDict.replace(key, value)`
: Reemplaza el `value` para la `key` especificada solo si la clave ya existe; devuelve `true` si el valor se reemplazó correctamente, `false` si la clave no existe en el diccionario `SharedDict`. Lanza `SharedMemoryError` si no hay suficiente espacio libre en el diccionario `SharedDict`. Lanza `TypeError` si el `value` es de un tipo diferente al esperado por este diccionario.

`ngx.shared.SharedDict.set(key, value [,timeout])`
: Establece el `value` para la `key` especificada; devuelve este diccionario `SharedDict` (para encadenamiento de métodos).
  <br/>
  El argumento opcional `timeout` se especifica en milisegundos y anula el parámetro `timeout` de la directiva `js_shared_dict_zone` en HTTP o Stream (desde 0.8.5). Puede ser útil cuando se espera que algunas claves tengan tiempos de espera únicos.

`ngx.shared.SharedDict.size()`
: Devuelve el número de elementos del diccionario `SharedDict`.

`ngx.shared.SharedDict.type`
: Devuelve `string` o `number` que corresponde al tipo de diccionario `SharedDict` establecido por el parámetro `type=` de la directiva `js_shared_dict_zone` en HTTP o Stream.

<a id="njs-builtin-objects"></a>

## Objetos Integrados

<a id="njs-console"></a>

### console

- `console.error()`
- `console.info()`
- `console.log()`
- `console.time()`
- `console.timeEnd()`
- `console.warn()`

El objeto `console` está disponible en Angie desde 0.8.2, en CLI desde 0.2.6.

`console.error(msg[, msg2 ...])`
: Emite uno o más mensajes de error. El mensaje puede ser una cadena o un objeto.

`console.info(msg[, msg2 ...])`
: Emite uno o más mensajes informativos. El mensaje puede ser una cadena o un objeto.

`console.log(msg[, msg2 ...])`
: Emite uno o más mensajes de registro. El mensaje puede ser una cadena o un objeto.

`console.time(label)`
: Inicia un temporizador que puede rastrear cuánto tiempo tarda una operación. El parámetro `label` permite nombrar diferentes temporizadores. Si se llama a `console.timeEnd()` con el mismo nombre, se emitirá el tiempo transcurrido desde que se inició el temporizador, en milisegundos.

`console.timeEnd(label)`
: Detiene un temporizador iniciado previamente por `console.time()`. El parámetro `label` permite nombrar diferentes temporizadores.

`console.warn(msg[, msg2 ...])`
: Emite uno o más mensajes de advertencia. El mensaje puede ser una cadena o un objeto.

<a id="njs-builtin-crypto"></a>

### crypto

- `crypto.getRandomValues()`
- `crypto.subtle.encrypt()`
- `crypto.subtle.decrypt()`
- `crypto.subtle.deriveBits()`
- `crypto.subtle.deriveKey()`
- `crypto.subtle.digest()`
- `crypto.subtle.exportKey()`
- `crypto.subtle.generateKey()`
- `crypto.subtle.importKey()`
- `crypto.subtle.sign()`
- `crypto.subtle.verify()`

El objeto `crypto` es un objeto global que permite utilizar funcionalidad criptográfica (desde 0.7.0).

`crypto.getRandomValues(typedArray)`
: Obtiene valores aleatorios criptográficamente fuertes. Devuelve el mismo array pasado como `typedArray` pero con su contenido reemplazado por los números aleatorios recién generados. Valores posibles:
  <br/>
  `typedArray`
  : Puede ser `Int8Array`, `Int16Array`, `Uint16Array`, `Int32Array`, o `Uint32Array`.

`crypto.subtle.encrypt(algorithm, key, data)`
: Cifra `data` utilizando el `algorithm` y la `key` proporcionados. Devuelve una `Promise` que se cumple con un `ArrayBuffer` que contiene el texto cifrado. Valores posibles:
  <br/>
  `algorithm`
  : Un objeto que especifica el algoritmo a utilizar y cualquier parámetro adicional si es necesario:
    <br/>
    - Para `RSA-OAEP`, pase un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `RSA-OAEP`:
        ```javascript
        crypto.subtle.encrypt({name: "RSA-OAEP"}, key, data)
        ```
    - Para `AES-CTR`, pase un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `AES-CTR`.
    <br/>
      `counter`
      : Un `ArrayBuffer`, `TypedArray`, o `DataView` — el valor inicial del bloque contador, debe tener 16 bytes de longitud (el tamaño de bloque AES). Los bits de longitud más a la derecha de este bloque se utilizan para el contador, y el resto se utiliza para el nonce. Por ejemplo, si la longitud se establece en 64, entonces la primera mitad del contador es el nonce y la segunda mitad se utiliza para el contador.
    <br/>
      `length`
      : El número de bits en el bloque contador que se utilizan para el contador real. El contador debe ser lo suficientemente grande como para que no se desborde.
    - Para `AES-CBC`, pase un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `AES-CBC`.
    <br/>
      `iv`
      : El vector de inicialización, es un `ArrayBuffer`, `TypedArray`, o `DataView`, debe tener 16 bytes, ser impredecible y preferiblemente criptográficamente aleatorio. Sin embargo, no necesita ser secreto, por ejemplo, puede transmitirse sin cifrar junto con el texto cifrado.
    - Para `AES-GCM`, pase un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `AES-GCM`.
    <br/>
      `iv`
      : El vector de inicialización, es un `ArrayBuffer`, `TypedArray`, o `DataView`, debe tener 16 bytes, y debe ser único para cada operación de cifrado realizada con una clave dada.
    <br/>
      `additionalData`
      : (opcional) es un `ArrayBuffer`, `TypedArray`, o `DataView` que contiene datos adicionales que no se cifrarán pero se autenticarán junto con los datos cifrados. Si se especifica `additionalData`, entonces los mismos datos deben especificarse en la llamada correspondiente a `decrypt()`: si los datos proporcionados a la llamada `decrypt()` no coinciden con los datos originales, el descifrado lanzará una excepción. La longitud en bits de `additionalData` debe ser menor que `2^64 - 1`.
    <br/>
      `tagLength`
      : (opcional, por defecto es `128`) - un `number` que determina el tamaño en bits de la etiqueta de autenticación generada en la operación de cifrado y utilizada para la autenticación en el descifrado correspondiente. Valores posibles: `32`, `64`, `96`, `104`, `112`, `120`, o `128`. La especificación AES-GCM recomienda que debe ser `96`, `104`, `112`, `120`, o `128`, aunque `32` o `64` bits pueden ser aceptables en algunas aplicaciones.
  <br/>
  `key`
  : Una `CryptoKey` que contiene la clave a utilizar para el cifrado.
  <br/>
  `data`
  : Un `ArrayBuffer`, `TypedArray`, o `DataView` que contiene los datos a cifrar (también conocidos como texto plano).

`crypto.subtle.decrypt(algorithm, key, data)`
: Descifra datos cifrados. Devuelve una `Promise` con los datos descifrados. Valores posibles:
  <br/>
  `algorithm`
  : Un objeto que especifica el algoritmo a utilizar, y cualquier parámetro adicional según sea necesario. Los valores proporcionados para los parámetros adicionales deben coincidir con los pasados en la llamada correspondiente a `encrypt()`.
    <br/>
    - Para `RSA-OAEP`, pase un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `RSA-OAEP`:
        ```javascript
        crypto.subtle.encrypt({name: "RSA-OAEP"}, key, data)
        ```
    - Para `AES-CTR`, pase un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `AES-CTR`.
    <br/>
      `counter`
      : Un `ArrayBuffer`, `TypedArray`, o `DataView` — el valor inicial del bloque contador, debe tener 16 bytes de longitud (el tamaño de bloque AES). Los bits de longitud más a la derecha de este bloque se utilizan para el contador, y el resto se utiliza para el nonce. Por ejemplo, si la longitud se establece en 64, entonces la primera mitad del contador es el nonce y la segunda mitad se utiliza para el contador.
    <br/>
      `length`
      : El número de bits en el bloque contador que se utilizan para el contador real. El contador debe ser lo suficientemente grande como para que no se desborde.
    - Para `AES-CBC`, pase un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `AES-CBC`.
    <br/>
      `iv`
      : El vector de inicialización, es un `ArrayBuffer`, `TypedArray`, o `DataView`, debe tener 16 bytes, ser impredecible y preferiblemente criptográficamente aleatorio. Sin embargo, no necesita ser secreto (por ejemplo, puede transmitirse sin cifrar junto con el texto cifrado).
    - Para `AES-GCM`, pase un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `AES-GCM`.
    <br/>
      `iv`
      : El vector de inicialización, es un `ArrayBuffer`, `TypedArray`, o `DataView`, debe tener 16 bytes, y debe ser único para cada operación de cifrado realizada con una clave dada.
    <br/>
      `additionalData`
      : (opcional) es un `ArrayBuffer`, `TypedArray`, o `DataView` que contiene datos adicionales que no se cifrarán pero se autenticarán junto con los datos cifrados. Si se especifica `additionalData`, entonces los mismos datos deben especificarse en la llamada correspondiente a `decrypt()`: si los datos proporcionados a la llamada `decrypt()` no coinciden con los datos originales, el descifrado lanzará una excepción. La longitud en bits de `additionalData` debe ser menor que `2^64 - 1`.
    <br/>
      `tagLength`
      : (opcional, por defecto es `128`) - un `number` que determina el tamaño en bits de la etiqueta de autenticación generada en la operación de cifrado y utilizada para la autenticación en el descifrado correspondiente. Valores posibles: `32`, `64`, `96`, `104`, `112`, `120`, o `128`. La especificación AES-GCM recomienda que debe ser `96`, `104`, `112`, `120`, o `128`, aunque `32` o `64` bits pueden ser aceptables en algunas aplicaciones.
  <br/>
  `key`
  : Una `CryptoKey` que contiene la clave a utilizar para el descifrado. Si se utiliza `RSA-OAEP`, esta es la propiedad `privateKey` del objeto `CryptoKeyPair`.
  <br/>
  `data`
  : Un `ArrayBuffer`, `TypedArray`, o `DataView` que contiene los datos a descifrar (también conocidos como texto cifrado).

`crypto.subtle.deriveBits(algorithm, baseKey, length)`
: Deriva un array de bits de una clave base. Devuelve una `Promise` que se cumplirá con un `ArrayBuffer` que contiene los bits derivados. Valores posibles:
  <br/>
  `algorithm`
  : Un objeto que define el algoritmo de derivación a utilizar:
    <br/>
    - Para `HKDF`, pase un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `HKDF`.
    <br/>
      `hash`
      : Una cadena con el algoritmo de resumen a utilizar: `SHA-1`, `SHA-256`, `SHA-384`, o `SHA-512`.
    <br/>
      `salt`
      : Un `ArrayBuffer`, `TypedArray`, o `DataView` que representa un valor aleatorio o pseudoaleatorio con la misma longitud que la salida de la función `digest`. A diferencia del material de clave de entrada pasado a `deriveKey()`, el salt no necesita mantenerse en secreto.
    <br/>
      `info`
      : Un `ArrayBuffer`, `TypedArray`, o `DataView` que representa información contextual específica de la aplicación utilizada para vincular la clave derivada a una aplicación o contexto, y permite derivar diferentes claves para diferentes contextos mientras se utiliza el mismo material de clave de entrada. Esta propiedad es obligatoria pero puede ser un búfer vacío.
    - Para `PBKDF2`, pase un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `PBKDF2`.
    <br/>
      `hash`
      : Una cadena con el algoritmo de resumen a utilizar: `SHA-1`, `SHA-256`, `SHA-384`, o `SHA-512`.
    <br/>
      `salt`
      : Un `ArrayBuffer`, `TypedArray`, o `DataView` que representa un valor aleatorio o pseudoaleatorio de al menos `16` bytes. A diferencia del material de clave de entrada pasado a `deriveKey()`, el salt no necesita mantenerse en secreto.
    <br/>
      `iterations`
      : Un `number` que representa el número de veces que se ejecutará la función hash en `deriveKey()`.
    - Para `ECDH`, pase un objeto con las siguientes claves (desde 0.9.1):
    <br/>
      `name`
      : Una cadena, debe establecerse en `ECDH`.
    <br/>
      `public`
      : Una `CryptoKey` que representa la clave pública de la otra parte. La clave debe generarse utilizando la misma curva que la clave base.
  <br/>
  `baseKey`
  : Una `CryptoKey` que representa la entrada al algoritmo de derivación. Si `algorithm` es `HKDF` o `PBKDF2`, debe ser una clave secreta. Si `algorithm` es `ECDH`, debe ser una clave privada `ECDH`.
  <br/>
  `length`
  : Un número que representa el número de bits a derivar. Para ser compatible con todos los navegadores, el número debe ser múltiplo de `8`.

`crypto.subtle.deriveKey(algorithm, baseKey, derivedKeyAlgorithm, extractable, keyUsages)`
: Deriva una clave secreta de una clave maestra. Devuelve una `Promise` que se cumple con un objeto `CryptoKey` que representa la nueva clave. Valores posibles:
  <br/>
  `algorithm`
  : Un objeto que define el algoritmo de derivación a utilizar:
    <br/>
    - Para `HKDF`, pase el objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `HKDF`.
    <br/>
      `hash`
      : Una cadena con el algoritmo de resumen a utilizar: `SHA-1`, `SHA-256`, `SHA-384`, o `SHA-512`.
    <br/>
      `salt`
      : Un `ArrayBuffer`, `TypedArray`, o `DataView` que representa un valor aleatorio o pseudoaleatorio con la misma longitud que la salida de la función `digest`. A diferencia del material de clave de entrada pasado a `deriveKey()`, el salt no necesita mantenerse en secreto.
    <br/>
      `info`
      : Un `ArrayBuffer`, `TypedArray`, o `DataView` que representa información contextual específica de la aplicación utilizada para vincular la clave derivada a una aplicación o contexto, y permite derivar diferentes claves para diferentes contextos mientras se utiliza el mismo material de clave de entrada. Esta propiedad es obligatoria pero puede ser un búfer vacío.
    - Para `PBKDF2`, pase el objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `PBKDF2`.
    <br/>
      `hash`
      : Una cadena con el algoritmo de resumen a utilizar: `SHA-1`, `SHA-256`, `SHA-384`, o `SHA-512`.
    <br/>
      `salt`
      : Un `ArrayBuffer`, `TypedArray`, o `DataView` que representa un valor aleatorio o pseudoaleatorio de al menos `16` bytes. A diferencia del material de clave de entrada pasado a `deriveKey()`, el salt no necesita mantenerse en secreto.
    <br/>
      `iterations`
      : Un `number` que representa el número de veces que se ejecutará la función hash en `deriveKey()`.
    - Para `ECDH`, pase un objeto con las siguientes claves (desde 0.9.1):
    <br/>
      `name`
      : Una cadena, debe establecerse en `ECDH`.
    <br/>
      `publicKey`
      : Una `CryptoKey` que representa la clave pública de la otra parte. La clave debe generarse utilizando la misma curva que la clave base.
  <br/>
  `baseKey`
  : Una `CryptoKey` que representa la entrada al algoritmo de derivación. Si `algorithm` es `HKDF` o `PBKDF2`, debe ser una clave secreta. Si `algorithm` es `ECDH`, debe ser una clave privada `ECDH`.
  <br/>
  `derivedKeyAlgorithm`
  : Un objeto que define el algoritmo que utilizará la clave derivada:
    <br/>
    - Para `HMAC`, pase un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `HMAC`.
    <br/>
      `hash`
      : Una cadena con el nombre de la función de resumen a utilizar: `SHA-1`, `SHA-256`, `SHA-384`, o `SHA-512`.
    <br/>
      `length`
      : (opcional) un `number` que representa la longitud en bits de la clave. Si se omite, la longitud de la clave es igual al tamaño de bloque de la función hash elegida.
    - Para `AES-CTR`, `AES-CBC`, o `AES-GCM`, pase un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `AES-CTR`, `AES-CBC`, o `AES-GCM`, dependiendo del algoritmo utilizado.
    <br/>
      `length`
      : Un `number` que representa la longitud en bits de la clave a generar: puede ser `128`, `192`, o `256`.
  <br/>
  `extractable`
  : Un valor `boolean` que indica si será posible exportar la clave utilizando `exportKey()` o `wrapKey()`.
  <br/>
  `keyUsages`
  : Un `array` de cadenas que indica qué se puede hacer con la clave derivada. Los valores posibles del array son `encrypt`, `decrypt`, `sign`, `verify`, `deriveKey`, `deriveBits`, `wrapKey`, `unwrapKey`.

`crypto.subtle.digest(algorithm, data)`
: Genera un resumen de los datos proporcionados. Devuelve una `Promise` que se cumple con un `ArrayBuffer` que contiene el resumen. Valores posibles:
  <br/>
  `algorithm`
  : Una cadena que define la función hash a utilizar: `SHA-1`, `SHA-256`, `SHA-384`, o `SHA-512`.
  <br/>
  `data`
  : Un `ArrayBuffer`, `TypedArray`, o `DataView` que contiene los datos de los que se generará el resumen.

`crypto.subtle.exportKey(format, key)`
: Exporta una clave. Devuelve una `Promise`. Si `format` era `jwk`, entonces la promesa se cumple con un objeto JSON que contiene la clave. De lo contrario, la promesa se cumple con un `ArrayBuffer` que contiene la clave. Valores posibles:
  <br/>
  `format`
  : Una cadena que describe el formato de datos en el que se exportará la clave. Puede ser uno de los siguientes:
    <br/>
    - `raw`: formato Raw, un `ArrayBuffer` que contiene los bytes de la clave.
    - `pkcs8`: formato PKCS #8, un `ArrayBuffer` que contiene los datos de clave privada codificados en PKCS #8.
    - `spki`: formato SubjectPublicKeyInfo, un `ArrayBuffer` que contiene los datos de clave pública codificados en SubjectPublicKeyInfo.
    - `jwk`: formato JSON Web Key, un objeto JSON que contiene la clave.
  <br/>
  `key`
  : La `CryptoKey` a exportar.

`crypto.subtle.generateKey(algorithm, extractable, keyUsages)`
: Genera una nueva clave (para algoritmos simétricos) o un par de claves (para algoritmos de clave pública). Devuelve una `Promise` que se cumple con una `CryptoKey` (para algoritmos simétricos) o un objeto `CryptoKeyPair` (para algoritmos de clave pública). Valores posibles:
  <br/>
  `algorithm`
  : Un objeto que define el tipo de clave a generar y proporciona atributos específicos del algoritmo adicionales:
    <br/>
    - Para `RSASSA-PKCS1-v1_5`, `RSA-PSS`, o `RSA-OAEP`, pase un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `RSASSA-PKCS1-v1_5`, `RSA-PSS`, o `RSA-OAEP`, dependiendo del algoritmo utilizado.
    <br/>
      `modulusLength`
      : Un `number` que representa la longitud en bits del módulo RSA, debe ser al menos `1024`.
    <br/>
      `publicExponent`
      : Un `Uint8Array` que representa el exponente público. A menos que tenga una buena razón para usar algo más, especifique `65537` aquí (`[0x01, 0x00, 0x01]`).
    <br/>
      `hash`
      : Una cadena que representa el nombre de la función de resumen a utilizar: `SHA-256`, `SHA-384`, o `SHA-512`.
    - Para `ECDSA` o `ECDH`, pase un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `ECDSA` o `ECDH`, dependiendo del algoritmo utilizado.
    <br/>
      `namedCurve`
      : Una cadena que representa el nombre de la curva elíptica a utilizar: `P-256`, `P-384`, o `P-521`.
    - Para `HMAC`, pase un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `HMAC`.
    <br/>
      `hash`
      : Una cadena que representa el nombre de la función de resumen a utilizar: `SHA-1`, `SHA-256`, `SHA-384`, o `SHA-512`.
    <br/>
      `length`
      : (opcional) un `number` que representa la longitud en bits de la clave. Si se omite, la longitud de la clave es igual al tamaño de bloque de la función hash elegida.
    - Para `AES-CTR`, `AES-CBC`, o `AES-GCM`, pase un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `AES-CTR`, `AES-CBC`, o `AES-GCM`, dependiendo del algoritmo utilizado.
    <br/>
      `length`
      : Un `number` que representa la longitud en bits de la clave a generar: puede ser `128`, `192`, o `256`.
  <br/>
  `extractable`
  : Un valor `boolean` que indica si será posible exportar la clave utilizando `exportKey()` o `wrapKey()`.
  <br/>
  `keyUsages`
  : Un `array` de cadenas que indica qué se puede hacer con la clave. Los valores posibles del array son `encrypt`, `decrypt`, `sign`, `verify`, `deriveKey`, `deriveBits`, `wrapKey`, `unwrapKey`.

`crypto.subtle.importKey(format, keyData, algorithm, extractable, keyUsages)`
: Importa una clave. Devuelve una `Promise` que se cumple con el objeto `CryptoKey` importado. Valores posibles:
  <br/>
  `format`
  : Una cadena que describe el formato de datos de la clave a importar. Puede ser uno de los siguientes:
    <br/>
    - `raw`: formato Raw, un `ArrayBuffer` que contiene los bytes de la clave.
    - `pkcs8`: formato PKCS #8, un `ArrayBuffer` que contiene los datos de clave privada codificados en PKCS #8.
    - `spki`: formato SubjectPublicKeyInfo, un `ArrayBuffer` que contiene los datos de clave pública codificados en SubjectPublicKeyInfo.
    - `jwk`: formato JSON Web Key, un objeto JSON que contiene la clave.
  <br/>
  `keyData`
  : Un `ArrayBuffer`, `TypedArray`, `DataView`, o `JSONWebKey` que contiene la clave en el formato dado.
  <br/>
  `algorithm`
  : Un objeto que define el tipo de clave a importar y proporciona atributos específicos del algoritmo adicionales:
    <br/>
    - Para `RSASSA-PKCS1-v1_5`, `RSA-PSS`, o `RSA-OAEP`, pase un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `RSASSA-PKCS1-v1_5`, `RSA-PSS`, o `RSA-OAEP`, dependiendo del algoritmo utilizado.
    <br/>
      `hash`
      : Una cadena que representa el nombre de la función de resumen a utilizar: `SHA-256`, `SHA-384`, o `SHA-512`.
    - Para `ECDSA` o `ECDH`, pase un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `ECDSA` o `ECDH`, dependiendo del algoritmo utilizado.
    <br/>
      `namedCurve`
      : Una cadena que representa el nombre de la curva elíptica a utilizar: `P-256`, `P-384`, o `P-521`.
    - Para `HMAC`, pase un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `HMAC`.
    <br/>
      `hash`
      : Una cadena que representa el nombre de la función de resumen a utilizar: `SHA-1`, `SHA-256`, `SHA-384`, o `SHA-512`.
    <br/>
      `length`
      : (opcional) un `number` que representa la longitud en bits de la clave. Si se omite, la longitud de la clave es igual al tamaño de bloque de la función hash elegida.
    - Para `AES-CTR`, `AES-CBC`, o `AES-GCM`, pase un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `AES-CTR`, `AES-CBC`, o `AES-GCM`, dependiendo del algoritmo utilizado.
    - Para `PBKDF2`, pase la cadena `PBKDF2`.
    - Para `HKDF`, pase la cadena `HKDF`.
  <br/>
  `extractable`
  : Un valor `boolean` que indica si será posible exportar la clave utilizando `exportKey()` o `wrapKey()`.
  <br/>
  `keyUsages`
  : Un `array` de cadenas que indica qué se puede hacer con la clave. Los valores posibles del array son `encrypt`, `decrypt`, `sign`, `verify`, `deriveKey`, `deriveBits`, `wrapKey`, `unwrapKey`.

`crypto.subtle.sign(algorithm, key, data)`
: Firma datos. Devuelve una `Promise` que se cumple con un `ArrayBuffer` que contiene la firma. Valores posibles:
  <br/>
  `algorithm`
  : Una cadena o un objeto que especifica el algoritmo de firma a utilizar y sus parámetros:
    <br/>
    - Para `RSASSA-PKCS1-v1_5`, pase la cadena `RSASSA-PKCS1-v1_5` o un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `RSASSA-PKCS1-v1_5`.
    - Para `RSA-PSS`, pase un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `RSA-PSS`.
    <br/>
      `saltLength`
      : Un `number` que representa la longitud del salt aleatorio a utilizar, en bytes.
    - Para `ECDSA`, pase un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `ECDSA`.
    <br/>
      `hash`
      : Una cadena que representa el nombre de la función de resumen a utilizar: `SHA-256`, `SHA-384`, o `SHA-512`.
    - Para `HMAC`, pase la cadena `HMAC` o un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `HMAC`.
  <br/>
  `key`
  : Una `CryptoKey` que contiene la clave a utilizar para firmar. Si `algorithm` identifica un algoritmo de clave pública, esta es la clave privada.
  <br/>
  `data`
  : Un `ArrayBuffer`, `TypedArray`, o `DataView` que contiene los datos a firmar.

`crypto.subtle.verify(algorithm, key, signature, data)`
: Verifica una firma. Devuelve una `Promise` que se cumple con un valor `boolean`: `true` si la firma es válida, `false` en caso contrario. Valores posibles:
  <br/>
  `algorithm`
  : Una cadena o un objeto que especifica el algoritmo a utilizar y sus parámetros: los valores deben coincidir con los pasados a la llamada correspondiente a `sign()`.
    <br/>
    - Para `RSASSA-PKCS1-v1_5`, pase la cadena `RSASSA-PKCS1-v1_5` o un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `RSASSA-PKCS1-v1_5`.
    - Para `RSA-PSS`, pase un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `RSA-PSS`.
    <br/>
      `saltLength`
      : Un `number` que representa la longitud del salt aleatorio a utilizar, en bytes.
    - Para `ECDSA`, pase un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `ECDSA`.
    <br/>
      `hash`
      : Una cadena que representa el nombre de la función de resumen a utilizar: `SHA-256`, `SHA-384`, o `SHA-512`.
    - Para `HMAC`, pase la cadena `HMAC` o un objeto con las siguientes claves:
    <br/>
      `name`
      : Una cadena, debe establecerse en `HMAC`.
  <br/>
  `key`
  : Una `CryptoKey` que contiene la clave a utilizar para la verificación. Es la clave secreta para un algoritmo simétrico y la clave pública para un sistema de clave pública.
  <br/>
  `signature`
  : Un `ArrayBuffer` que contiene la firma a verificar.
  <br/>
  `data`
  : Un `ArrayBuffer`, `TypedArray`, o `DataView` que contiene los datos cuya firma se va a verificar.

<a id="njs-cryptokey"></a>

#### CryptoKey

- `CryptoKey.algorithm`
- `CryptoKey.extractable`
- `CryptoKey.type`
- `CryptoKey.usages`

El objeto `CryptoKey` representa una `clave` criptográfica obtenida de uno de los métodos `SubtleCrypto`: `crypto.subtle.generateKey()`, `crypto.subtle.deriveKey()`, `crypto.subtle.importKey()`.

`CryptoKey.algorithm`
: Devuelve un objeto que describe el algoritmo para el cual se puede usar esta clave y cualquier parámetro adicional asociado (desde 0.8.0), solo lectura.

`CryptoKey.extractable`
: Un valor booleano, `true` si la clave se puede exportar (desde 0.8.0), solo lectura.

`CryptoKey.type`
: Un valor de cadena que indica qué tipo de clave está representada por el objeto, solo lectura. Valores posibles:
  <br/>
  `secret`
  : Esta clave es una clave secreta para usar con un algoritmo simétrico.
  <br/>
  `private`
  : Esta clave es la mitad privada de un `CryptoKeyPair` de algoritmo asimétrico.
  <br/>
  `public`
  : Esta clave es la mitad pública de un `CryptoKeyPair` de algoritmo asimétrico.

`CryptoKey.usages`
: Un array de cadenas que indica para qué se puede usar esta clave (desde 0.8.0), solo lectura. Valores posibles del array:
  <br/>
  `encrypt`
  : Clave para cifrar mensajes.
  <br/>
  `decrypt`
  : Clave para descifrar mensajes.
  <br/>
  `sign`
  : Clave para firmar mensajes.
  <br/>
  `verify`
  : Clave para verificar firmas.
  <br/>
  `deriveKey`
  : Clave para derivar una nueva clave.
  <br/>
  `deriveBits`
  : Clave para derivar bits.

<a id="njs-cryptokeypair"></a>

#### CryptoKeyPair

- `CryptoKeyPair.privateKey`
- `CryptoKeyPair.publicKey`

El `CryptoKeyPair` es un objeto de diccionario de la API WebCrypto que representa un par de claves asimétricas.

`CryptoKeyPair.privateKey`
: Un objeto `CryptoKey` que representa la clave privada.

`CryptoKeyPair.publicKey`
: Un objeto `CryptoKey` que representa la clave pública.

<a id="njs-njs"></a>

### njs

- `njs.version`
- `njs.version_number`
- `njs.dump()`
- `njs.memoryStats`
- `njs.on()`

El objeto `njs` es un objeto global que representa la instancia actual de la VM (desde 0.2.0).

`njs.version`
: Devuelve una cadena con la versión actual de NJS (por ejemplo, "0.7.4").

`njs.version_number`
: Devuelve un número con la versión actual de NJS. Por ejemplo, "0.7.4" se devuelve como `0x000704` (desde 0.7.4).

`njs.dump(value)`
: Devuelve la representación de cadena con formato legible para un valor.

`njs.memoryStats`
: Objeto que contiene estadísticas de memoria para la instancia actual de la VM (desde 0.7.8).
  <br/>
  `size`
  : Cantidad de memoria en bytes que el pool de memoria de NJS ha reclamado del sistema operativo.

`njs.on(event, callback)`
: Registra un callback para el evento de VM especificado (desde 0.5.2). Un evento puede ser una de las siguientes cadenas:
  <br/>
  `exit`
  : Se llama antes de que se destruya la VM. El callback se llama sin argumentos.

<a id="njs-process"></a>

### process

- `process.argv`
- `process.env`
- `process.kill()`
- `process.pid`
- `process.ppid`

El objeto `process` es un objeto global que proporciona información sobre el proceso actual (0.3.3).

`process.argv`
: Devuelve un array que contiene los argumentos de línea de comandos pasados cuando se inició el proceso actual.

`process.env`
: Devuelve un objeto que contiene el entorno del usuario.
  <br/>
  #### NOTE
  Por defecto, Angie elimina todas las variables de entorno heredadas de su proceso padre excepto la variable TZ. Use la directiva `env` para preservar algunas de las variables heredadas.

`process.kill(pid, number | string)`
: Envía la señal al proceso identificado por `pid`. Los nombres de señal son números o cadenas como `SIGINT` o `SIGHUP`. Consulte [kill(2)](https://man7.org/linux/man-pages/man2/kill.2.html) para más información.

`process.pid`
: Devuelve el PID del proceso actual.

`process.ppid`
: Devuelve el PID del proceso padre actual.

<a id="njs-string"></a>

### String

Por defecto, todas las cadenas en NJS son cadenas Unicode. Corresponden a cadenas ECMAScript que contienen caracteres Unicode. Antes de 0.8.0, también se admitían cadenas de bytes.

<a id="byte-strings-removed"></a>

#### Cadenas de Bytes (Eliminadas)

#### NOTE
Desde 0.8.0, se eliminó el soporte para cadenas de bytes y métodos de cadenas de bytes. Al trabajar con secuencias de bytes, se debe usar el objeto [Buffer](#njs-buffer) y las propiedades Buffer, como `r.requestBuffer`, `r.rawVariables`.

Las cadenas de bytes contenían una secuencia de bytes y se usaban para serializar cadenas Unicode a datos externos y deserializar desde fuentes externas. Por ejemplo, el método `toUTF8()` serializaba una cadena Unicode a una cadena de bytes usando codificación UTF-8. El método `toBytes()` serializaba una cadena Unicode con puntos de código hasta 255 en una cadena de bytes; de lo contrario, se devolvía `null`.

Los siguientes métodos quedaron obsoletos y se eliminaron en 0.8.0:

- `String.bytesFrom()` (eliminado en 0.8.0, use `Buffer.from()`)
- `String.prototype.fromBytes()` (eliminado en 0.8.0)
- `String.prototype.fromUTF8()` (eliminado en 0.8.0, use `TextDecoder`)
- `String.prototype.toBytes()` (eliminado en 0.8.0)
- `String.prototype.toString()` con codificación (eliminado en 0.8.0)
- `String.prototype.toUTF8()` (eliminado en 0.8.0, use `TextEncoder`)

<a id="njs-webapi"></a>

## API Web

<a id="njs-textdecoder"></a>

### TextDecoder

- `TextDecoder()`
- `TextDecoder.prototype.encoding`
- `TextDecoder.prototype.fatal`
- `TextDecoder.prototype.ignoreBOM`
- `TextDecoder.prototype.decode()`

El `TextDecoder` produce un flujo de puntos de código a partir de un flujo de bytes (0.4.3).

`TextDecoder([[encoding], options])`
: Crea un nuevo objeto `TextDecoder` para la `codificación` especificada; actualmente, solo se admite UTF-8. El `options` es un diccionario `TextDecoderOptions` con la propiedad:
  <br/>
  `fatal`
  : Indicador booleano que indica si `TextDecoder.decode()` debe lanzar la excepción `TypeError` cuando se encuentra un error de codificación, por defecto es `false`.

`TextDecoder.prototype.encoding`
: Devuelve una cadena con el nombre de la codificación usada por `TextDecoder()`, solo lectura.

`TextDecoder.prototype.fatal`
: Indicador booleano, `true` si el modo de error es fatal, solo lectura.

`TextDecoder.prototype.ignoreBOM`
: Indicador booleano, `true` si se ignora la marca de orden de bytes, solo lectura.

`TextDecoder.prototype.decode(buffer, [options])`
: Devuelve una cadena con el texto decodificado del `buffer` por `TextDecoder()`. El buffer puede ser `ArrayBuffer`. El `options` es un diccionario `TextDecodeOptions` con la propiedad:
  <br/>
  `stream`
  : Indicador booleano que indica si seguirán datos adicionales en llamadas posteriores a `decode()`: `true` si se procesan los datos en fragmentos, y `false` para el fragmento final o si los datos no están fragmentados. Por defecto es `false`.
  <br/>
  Ejemplo:
  <br/>
  ```javascript
  >> (new TextDecoder()).decode(new Uint8Array([206,177,206,178]))
  αβ
  ```

<a id="njs-textencoder"></a>

### TextEncoder

- `TextEncoder()`
- `TextEncoder.prototype.encode()`
- `TextEncoder.prototype.encodeInto()`

El objeto `TextEncoder` produce un flujo de bytes con codificación UTF-8 a partir de un flujo de puntos de código (0.4.3).

`TextEncoder()`
: Devuelve un `TextEncoder` recién construido que generará un flujo de bytes con codificación UTF-8.

`TextEncoder.prototype.encode(string)`
: Codifica `string` en un `Uint8Array` con texto codificado en UTF-8.

`TextEncoder.prototype.encodeInto(string, uint8Array)`
: Codifica una `string` a UTF-8, coloca el resultado en el `Uint8Array` de destino y devuelve un objeto de diccionario que muestra el progreso de la codificación. El objeto de diccionario contiene dos miembros:
  <br/>
  `read`
  : El número de unidades UTF-16 de código de la `string` de origen convertidas a UTF-8.
  <br/>
  `written`
  : El número de bytes modificados en el `Uint8Array` de destino.

<a id="njs-timers"></a>

## Temporizadores

- `clearTimeout()`
- `setTimeout()`

`clearTimeout(timeout)`
: Cancela un objeto `timeout` creado por `setTimeout()`.

`setTimeout(function, milliseconds[, argument1, argumentN])`
: Llama a una `function` después de un número especificado de `milliseconds`. Se pueden pasar uno o más `arguments` opcionales a la función especificada. Devuelve un objeto `timeout`.
  <br/>
  Ejemplo:
  <br/>
  ```javascript
  function handler(v)
  {
      // ...
  }
  <br/>
  t = setTimeout(handler, 12);
  <br/>
  // ...
  <br/>
  clearTimeout(t);
  ```

<a id="njs-global-functions"></a>

### Funciones Globales

- `atob()`
- `btoa()`

`atob(encodedData)`
: Decodifica una cadena de datos que ha sido codificada usando codificación `Base64`. El parámetro `encodedData` es una cadena binaria que contiene datos codificados en Base64. Devuelve una cadena que contiene los datos decodificados de `encodedData`.
  <br/>
  El método similar `btoa()` puede usarse para codificar y transmitir datos que de otro modo podrían causar problemas de comunicación, luego transmitirlos y usar el método `atob()` para decodificar los datos nuevamente. Por ejemplo, puede codificar, transmitir y decodificar caracteres de control como los valores ASCII `0` hasta `31`.
  <br/>
  Ejemplo:
  <br/>
  ```javascript
  const encodedData = btoa("text to encode"); // encode a string
  const decodedData = atob(encodedData); // decode the string
  ```

`btoa(stringToEncode)`
: Crea una cadena ASCII codificada en Base64 a partir de una cadena binaria. El parámetro `stringToEncode` es una cadena binaria a codificar. Devuelve una cadena ASCII que contiene la representación Base64 de `stringToEncode`.
  <br/>
  El método puede usarse para codificar datos que de otro modo podrían causar problemas de comunicación, transmitirlos y luego usar el método `atob()` para decodificar los datos nuevamente. Por ejemplo, puede codificar caracteres de control como los valores ASCII `0` hasta `31`.
  <br/>
  Ejemplo:
  <br/>
  ```javascript
  const encodedData = btoa("text to encode"); // encode a string
  const decodedData = atob(encodedData); // decode the string
  ```

<a id="njs-builtin-modules"></a>

## Módulos Integrados

<a id="njs-buffer"></a>

### Buffer

El objeto `Buffer` es una forma compatible con Node.js de trabajar con datos binarios. Debido al extenso tamaño del archivo, esta sección se limita a una lista completa de métodos de Buffer.

- `Buffer.alloc()`
- `Buffer.allocUnsafe()`
- `Buffer.byteLength()`
- `Buffer.compare()`
- `Buffer.concat()`
- `Buffer.from(array)`
- `Buffer.from(arrayBuffer)`
- `Buffer.from(buffer)`
- `Buffer.from(object)`
- `Buffer.from(string)`
- `Buffer.isBuffer()`
- `Buffer.isEncoding()`
- `buffer[]`
- `buf.buffer`
- `buf.byteOffset`
- `buf.compare()`
- `buf.copy()`
- `buf.equals()`
- `buf.fill()`
- `buf.includes()`
- `buf.indexOf()`
- `buf.lastIndexOf()`
- `buf.length`
- `buf.readIntBE()`
- `buf.readIntLE()`
- `buf.readUIntBE()`
- `buf.readUIntLE()`
- `buf.readDoubleBE()`
- `buf.readDoubleLE()`
- `buf.readFloatBE()`
- `buf.readFloatLE()`
- `buf.subarray()`
- `buf.slice()`
- `buf.swap16()`
- `buf.swap32()`
- `buf.swap64()`
- `buf.toJSON()`
- `buf.toString()`
- `buf.write()`
- `buf.writeIntBE()`
- `buf.writeIntLE()`
- `buf.writeUIntBE()`
- `buf.writeUIntLE()`
- `buf.writeDoubleBE()`
- `buf.writeDoubleLE()`
- `buf.writeFloatBE()`
- `buf.writeFloatLE()`

Para documentación detallada de los métodos de Buffer, consulte la [documentación de Buffer de Node.js](https://nodejs.org/api/buffer.html).

<a id="njs-crypto"></a>

### Crypto

El módulo Crypto proporciona soporte de funcionalidad criptográfica. El objeto del módulo Crypto se importa usando `import crypto from 'crypto'`.

#### NOTE
Desde la versión 0.7.0, la API de crypto extendida está disponible como un objeto global [crypto](#njs-builtin-crypto).

- `crypto.createHash()`
- `crypto.createHmac()`

`crypto.createHash(algorithm)`
: Crea y devuelve un objeto Hash que puede usarse para generar resúmenes hash usando el `algorithm` dado. El algoritmo puede ser `md5`, `sha1` y `sha256`.

`crypto.createHmac(algorithm, secret key)`
: Crea y devuelve un objeto HMAC que usa el `algorithm` y la `secret key` dados. El algoritmo puede ser `md5`, `sha1` y `sha256`.

<a id="hash"></a>

#### Hash

- `hash.update()`
- `hash.digest()`
- `hash.copy()`

`hash.update(data)`
: Actualiza el contenido del hash con los `data` dados.

`hash.digest([encoding])`
: Calcula el resumen de todos los datos pasados usando `hash.update()`. La codificación puede ser `hex`, `base64` y `base64url`. Si no se proporciona codificación, se devuelve un objeto Buffer (0.4.4).
  <br/>
  #### NOTE
  Antes de la versión 0.4.4, se devolvía una cadena de bytes en lugar de un objeto Buffer.

`hash.copy()`
: Hace una copia del estado actual del hash (desde 0.7.12).

Ejemplo:

```javascript
import crypto from 'crypto';

crypto.createHash('sha1').update('A').update('B').digest('base64url');
/* BtlFlCqiamG-GMPiK_GbvKjdK10 */
```

<a id="hmac"></a>

#### HMAC

- `hmac.update()`
- `hmac.digest()`

`hmac.update(data)`
: Actualiza el contenido del HMAC con los `data` dados.

`hmac.digest([encoding])`
: Calcula el resumen HMAC de todos los datos pasados usando `hmac.update()`. La codificación puede ser `hex`, `base64` y `base64url`. Si no se proporciona codificación, se devuelve un objeto Buffer (0.4.4).
  <br/>
  #### NOTE
  Antes de la versión 0.4.4, se devolvía una cadena de bytes en lugar de un objeto Buffer.

<a id="njs-fs"></a>

### fs

El módulo `fs` proporciona operaciones con el sistema de archivos. El objeto del módulo se importa usando `import fs from 'fs'`.

- `fs.accessSync()`
- `fs.appendFileSync()`
- `fs.mkdirSync()`
- `fs.readdirSync()`
- `fs.readFileSync()`
- `fs.realpathSync()`
- `fs.renameSync()`
- `fs.rmdirSync()`
- `fs.symlinkSync()`
- `fs.unlinkSync()`
- `fs.writeFileSync()`
- `fs.promises.readFile()`
- `fs.promises.appendFile()`
- `fs.promises.writeFile()`
- `fs.promises.readdir()`
- `fs.promises.mkdir()`
- `fs.promises.rmdir()`
- `fs.promises.rename()`
- `fs.promises.unlink()`
- `fs.promises.symlink()`
- `fs.promises.access()`
- `fs.promises.realpath()`

Para documentación detallada de los métodos de fs, consulte la [documentación de fs de Node.js](https://nodejs.org/api/fs.html).

<a id="njs-querystring"></a>

### Query String

El módulo Query String proporciona métodos para analizar y formatear cadenas de consulta de URL. El objeto del módulo se importa usando `import qs from 'querystring'`.

- `querystring.decode()`
- `querystring.encode()`
- `querystring.escape()`
- `querystring.parse()`
- `querystring.stringify()`
- `querystring.unescape()`

`querystring.decode()`
: Un alias de `querystring.parse()`.

`querystring.encode()`
: Un alias de `querystring.stringify()`.

`querystring.escape(string)`
: Realiza la codificación de porcentaje de URL de la `string` de manera optimizada para los requisitos de las cadenas de consulta de URL. El método es usado por `querystring.stringify()` y no debe usarse directamente.

`querystring.parse(string[, separator[, equal[, options]]])`
: Analiza la `string` como una cadena de consulta de URL y devuelve un objeto. El parámetro opcional `separator` (predeterminado: `&`) especifica la subcadena para delimitar pares clave-valor. El parámetro opcional `equal` (predeterminado: `=`) especifica la subcadena para delimitar claves y valores. El parámetro opcional `options` es un objeto que puede contener la siguiente propiedad:
  <br/>
  `decodeURIComponent`
  : Función a usar al decodificar caracteres codificados en porcentaje en la cadena de consulta, predeterminado: `querystring.unescape()`.
  <br/>
  `maxKeys`
  : El número máximo de claves a analizar, predeterminado: `1000`. El valor `0` elimina las limitaciones para contar claves.
  <br/>
  Ejemplo:
  <br/>
  ```javascript
  >> qs.parse('foo=bar&abc=xyz&abc=123')
  {
      foo: 'bar',
      abc: ['xyz', '123']
  }
  ```

`querystring.stringify(object[, separator[, equal[, options]]])`
: Produce una cadena de consulta de URL a partir del `object` iterando a través de sus propias propiedades. El parámetro opcional `separator` (predeterminado: `&`) especifica la subcadena para delimitar pares clave-valor. El parámetro opcional `equal` (predeterminado: `=`) especifica la subcadena para delimitar claves y valores. El parámetro opcional `options` es un objeto que puede contener la siguiente propiedad:
  <br/>
  `encodeURIComponent`
  : Función a usar al convertir caracteres no seguros para URL a codificación de porcentaje en la cadena de consulta, predeterminado: `querystring.escape()`.
  <br/>
  Ejemplo:
  <br/>
  ```javascript
  >> qs.stringify({ foo: 'bar', baz: ['qux', 'quux'], corge: '' })
  'foo=bar&baz=qux&baz=quux&corge='
  ```

`querystring.unescape(string)`
: Realiza la decodificación de caracteres codificados en porcentaje de URL en la `string`. El método es usado por `querystring.parse()` y no debe usarse directamente.

<a id="njs-xml"></a>

### XML

- `xml.parse()`
- `xml.c14n()`
- `xml.exclusiveC14n()`
- `xml.serialize()`
- `xml.serializeToString()`
- `XMLDoc`
- `XMLNode`
- `XMLAttr`

El módulo XML permite trabajar con documentos XML (desde 0.7.10). El objeto del módulo XML se importa usando `import xml from 'xml'`.

Ejemplo:

```javascript
import xml from 'xml';

let data = `<note><to b="bar" a= "foo" >Tove</to><from>Jani</from></note>`;
let doc = xml.parse(data);

console.log(doc.note.to.$text) /* 'Tove' */
console.log(doc.note.to.$attr$b) /* 'bar' */
console.log(doc.note.$tags[1].$text) /* 'Jani' */

let dec = new TextDecoder();
let c14n = dec.decode(xml.exclusiveC14n(doc.note));
console.log(c14n) /* '<note><to a="foo" b="bar">Tove</to><from>Jani</from></note>' */

c14n = dec.decode(xml.exclusiveC14n(doc.note.to));
console.log(c14n) /* '<to a="foo" b="bar">Tove</to>' */

c14n = dec.decode(xml.exclusiveC14n(doc.note, doc.note.to /* excluding 'to' */));
console.log(c14n) /* '<note><from>Jani</from></note>' */
```

`parse(string | Buffer)`
: Analiza una cadena o Buffer para obtener un documento XML; devuelve un objeto envolvente `XMLDoc` que representa el documento XML analizado.

`c14n(root_node[, excluding_node])`
: Canonicaliza `root_node` y sus hijos según [Canonical XML Version 1.1](https://www.w3.org/TR/xml-c14n). El `root_node` puede ser un objeto envolvente `XMLNode` o `XMLDoc` alrededor de la estructura XML. Devuelve un objeto Buffer que contiene la salida canonicalizada.
  <br/>
  `excluding_node`
  : Permite omitir de la salida una parte del documento.

`exclusiveC14n(root_node[, excluding_node[, withComments[,prefix_list]]])`
: Canonicaliza `root_node` y sus hijos según [Exclusive XML Canonicalization Version 1.0](https://www.w3.org/TR/xml-exc-c14n/).
  <br/>
  `root_node`
  : Un objeto envolvente `XMLNode` o `XMLDoc` alrededor de la estructura XML.
  <br/>
  `excluding_node`
  : Permite omitir de la salida una parte del documento correspondiente al nodo y sus hijos.
  <br/>
  `withComments`
  : Un valor booleano, `false` por defecto. Si es `true`, la canonicalización corresponde a [Exclusive XML Canonicalization Version 1.0](http://www.w3.org/2001/10/xml-exc-c14n#WithComments). Devuelve un objeto Buffer que contiene la salida canonicalizada.
  <br/>
  `prefix_list`
  : Una cadena opcional con prefijos de espacios de nombres separados por espacios para espacios de nombres que también deben incluirse en la salida.

`serialize()`
: Lo mismo que `xml.c14n()` (desde 0.7.11).

`serializeToString()`
: Lo mismo que `xml.c14n()` excepto que devuelve el resultado como `string` (desde 0.7.11).

`XMLDoc`
: Un objeto envolvente XMLDoc alrededor de la estructura XML, el nodo raíz del documento.
  <br/>
  > `doc.$root`
  > : La raíz del documento por su nombre o undefined.
  <br/>
  > `doc.abc`
  > : La primera etiqueta raíz llamada `abc` como un objeto envolvente `XMLNode`.

`XMLNode`
: Un objeto envolvente XMLNode alrededor de un nodo de etiqueta XML.
  <br/>
  > `node.abc`
  > : Lo mismo que `node.$tag$abc`.
  <br/>
  > `node.$attr$abc`
  > : El valor del atributo `abc` del nodo, escribible desde 0.7.11.
  <br/>
  > `node.$attr$abc=xyz`
  > : Lo mismo que `node.setAttribute('abc', xyz)` (desde 0.7.11).
  <br/>
  > `node.$attrs`
  > : Un objeto envolvente `XMLAttr` para todos los atributos del nodo.
  <br/>
  > `node.$name`
  > : El nombre del nodo.
  <br/>
  > `node.$ns`
  > : El espacio de nombres del nodo.
  <br/>
  > `node.$parent`
  > : El nodo padre del nodo actual.
  <br/>
  > `node.$tag$abc`
  > : La primera etiqueta hija del nodo llamada `abc`, escribible desde 0.7.11.
  <br/>
  > `node.$tags`
  > : Un array de todas las etiquetas hijas.
  <br/>
  > `node.$tags = [node1, node2, ...]`
  > : Lo mismo que `node.removeChildren()`; `node.addChild(node1)`; `node.addChild(node2)` (desde 0.7.11).
  <br/>
  > `node.$tags$abc`
  > : Todas las etiquetas hijas llamadas `abc` del nodo, escribible desde 0.7.11.
  <br/>
  > `node.$text`
  > : El contenido del nodo, escribible desde 0.7.11.
  <br/>
  > `node.$text = 'abc'`
  > : Lo mismo que `node.setText('abc')` (desde 0.7.11).
  <br/>
  > `node.addChild(nd)`
  > : Añade un XMLNode como hijo al nodo (desde 0.7.11). `nd` se copia recursivamente antes de añadirse al nodo.
  <br/>
  > `node.removeAllAttributes()`
  > : Elimina todos los atributos del nodo (desde 0.7.11).
  <br/>
  > `node.removeAttribute(attr_name)`
  > : Elimina el atributo llamado `attr_name` (desde 0.7.11).
  <br/>
  > `node.removeChildren(tag_name)`
  > : Elimina todas las etiquetas hijas llamadas `tag_name` (desde 0.7.11). Si `tag_name` está ausente, se eliminan todas las etiquetas hijas.
  <br/>
  > `node.removeText()`
  > : Elimina el valor de texto del nodo (0.7.11).
  <br/>
  > `node.setAttribute(attr_name, value)`
  > : Establece un valor para `attr_name` (desde 0.7.11). Cuando el valor es `null`, se elimina el atributo llamado `attr_name`.
  <br/>
  > `node.setText(value)`
  > : Establece un valor de texto para el nodo (desde 0.7.11). Cuando el valor es `null`, se elimina el texto del nodo.

`XMLAttr`
: Un objeto envolvente XMLAttr alrededor de los atributos del nodo XML.
  <br/>
  > `attr.abc`
  > : El valor del atributo `abc`.

<a id="njs-zlib"></a>

### zlib

El módulo `zlib` (0.5.2) proporciona funcionalidad de compresión y descompresión usando zlib. El objeto del módulo se importa usando `import zlib from 'zlib'`.

- `zlib.constants`
- `zlib.deflateRawSync()`
- `zlib.deflateSync()`
- `zlib.inflateRawSync()`
- `zlib.inflateSync()`

`zlib.constants`
: Devuelve un diccionario de constantes de zlib.

`zlib.deflateRawSync(data[, options])`
: Comprime `data` usando el algoritmo Deflate sin la cabecera zlib.

`zlib.deflateSync(data[, options])`
: Comprime `data` usando el algoritmo Deflate.

`zlib.inflateRawSync(data[, options])`
: Descomprime `data` usando el algoritmo Deflate sin la cabecera zlib.

`zlib.inflateSync(data[, options])`
: Descomprime `data` usando el algoritmo Deflate.

El parámetro `options` es un objeto que puede contener las siguientes propiedades:

`level`
: Nivel de compresión (por defecto: `zlib.constants.Z_DEFAULT_COMPRESSION`).

`memLevel`
: Especifica cuánta memoria debe asignarse para el estado de compresión (por defecto: `zlib.constants.Z_DEFAULT_MEMLEVEL`).

`strategy`
: Ajusta el algoritmo de compresión (por defecto: `zlib.constants.Z_DEFAULT_STRATEGY`).

`windowBits`
: Establece el tamaño de la ventana (por defecto: `zlib.constants.Z_DEFAULT_WINDOWBITS`).

`dictionary`
: Buffer que contiene el diccionario de compresión predefinido.

`info`
: Un valor booleano, si es `true`, devuelve un objeto con buffer y engine.

`chunkSize`
: Tamaño de fragmento para la compresión (por defecto: `zlib.constants.Z_DEFAULT_CHUNK`).

Ejemplo:

```javascript
import zlib from 'zlib';

const deflated = zlib.deflateSync('Hello World!');
const inflated = zlib.inflateSync(deflated);

console.log(inflated.toString()); // 'Hello World!'
```
