> For the complete documentation index, see [llms.txt](https://docs.skyone.cloud/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.skyone.cloud/espanol/skyone-studio/integraciones/flujos/modulos-de-herramientas/modulo-javascript.md).

# Módulo JavaScript

* [Definición](#definicion)
  * [Posibilidades de uso](#posibilidades-de-uso)
  * [Restricciones de uso](#restricciones-de-uso)
* [Configuración del módulo](#configuracion-del-modulo)
  * [Configuración de las variables](#configuracion-de-variables)
  * [Resultado](#resultado)
* [Funciones de JavaScript](#funciones-de-javascript)
* [Ejemplos de uso](#ejemplos-de-uso)
  * [Código síncrono con dos parámetros](#ejemplo-1-codigo-sincrono-con-dos-parametros)
  * [Código asíncrono con Promises](#ejemplo-2-codigo-asincrono-con-promises)
  * [Crear token utilizando la función **signJwtToken**](#ejemplo-3-crear-un-token-usando-signjwttoken)
  * [Decodificar un token usando la función **decodeJwtToken**](#ejemplo-4-decodificar-un-token-usando-decodejwttoken)
  * [Buenas prácticas](#buenas-practicas)

### Definición

El módulo instrumental **“JavaScript”**, estándar de **Skyone Studio** y disponible para uso en cualquier flujo, permite la ejecución de código JavaScript de forma segura en un entorno controlado.

Este módulo es ideal para transformar datos, realizar cálculos personalizados y ejecutar otras operaciones específicas con **JavaScript**.

A continuación, se detallan los recursos disponibles, restricciones de uso y ejemplos prácticos de cómo utilizar esta funcionalidad.

#### Posibilidades de uso

* **Ejecución de código JavaScript estándar**: Puedes usar todas las funcionalidades estándar de JavaScript, incluyendo declaración de variables, bucles, condicionales y manipulación de objetos y arrays.
* **Funciones Asíncronas y Promises**: Soporte para async/await y Promises, permitiendo operaciones asíncronas como solicitudes simuladas de datos o procesos dependientes de temporizadores.
* **Temporizadores**:
  * setTimeout: disponible para programar operaciones asíncronas después de un retraso especificado.
  * clearTimeout: disponible para cancelar temporizadores creados con setTimeout.
* **Manipulación de Strings y Números**:Uso de funciones globales como parseInt, parseFloat, Number, String, entre otras.
* **Funciones nativas de JavaScript**:Todas las funciones nativas como Math, Date, JSON, Array, Object y RegExp están disponibles.
* **Memoria**: Hasta 60 MB de memoria disponible para la ejecución del código.

#### Restricciones de uso

* **Importación de módulos**: No se pueden importar módulos con require o import. Esto incluye módulos nativos de Node.js y librerías externas, garantizando un entorno seguro y aislado.
* **Acceso al sistema**: No hay acceso al sistema de archivos, red u otras operaciones que puedan comprometer la seguridad de Skyone Studio.
* **Manipulación de procesos**: Funciones como process.exit() o process.kill() no están disponibles.
* **Palabras clave restringidas**: Operaciones como eval y Function están restringidas para evitar que el código escape del entorno seguro.
* **Acceso a variables globales**: El código se ejecuta en un sandbox, aislado del contexto global, sin acceso a variables externas.

***

### Configuración del módulo

El módulo **“JavaScript”** aparece en la opción **Herramientas** dentro de la edición de un flujo.

<figure><img src="/files/YWpYNfpzGSlKyrMbZ0BQ" alt=""><figcaption></figcaption></figure>

Después de seleccionarlo, se mostrará el modal de configuración.

Conoce más sobre el Encabezado del Módulo aquí.

### **Configuración de variables**

Completa los siguientes campos:

* **Clave**: identificación de la variable
* **Valor**: ingresa o arrastra una variable
* **Tipo**: selecciona el tipo de datos adecuado: texto, número, booleano, objeto o array

<figure><img src="/files/lRjd4cYXEzSjtsoRRkCW" alt=""><figcaption></figcaption></figure>

Después de completar la configuración, haz clic en **“Avanzar”**.

***

### Resultado

En esta pantalla es posible ejecutar y visualizar la transformación de datos y manipularlos con JavaScript.

<figure><img src="/files/APtVpKqau4ZoNGaiJkqn" alt=""><figcaption></figcaption></figure>

#### **Parámetros**

Todos los parámetros se pasan dentro del objeto data, lo que significa que todas las variables están accesibles dentro del código JavaScript bajo data.

**Estructura y contenido de data**:

* **Tipo de datos**: data es un objeto JSON, conteniendo pares clave-valor donde los valores pueden ser strings, números, arrays, objetos, booleanos o null.
* **Campos personalizados**: El contenido de data puede incluir cualquier información que el código del usuario requiera; no hay restricciones sobre la estructura mientras sea serializable en JSON.

**Ejemplos de campos**:

* **Números y Strings**: para cálculos o manipulación
* **Arrays y Objetos**: estructuras complejas, listas o objetos anidados
* **Datos de configuración**: determinan cómo debe comportarse el código

Para finalizar la configuración, haz clic en **“Guardar”**.

***

### Funciones de JavaScript

Las funciones de JavaScript integradas facilitan la autenticación y el control de flujo:

* **signJWTToken(body, secret, options):** Genera un token JWT utilizando un objeto (body), una clave secreta (secret) y opciones como el tiempo de expiración (expiresIn).
* **decodeJWTToken(token, secret):** Realiza el decode de un token para recuperar el payload original, validándolo con la clave secreta.

#### Cómo utilizar las funciones en la práctica

Para utilizar las funciones anteriores en su módulo de JavaScript:

1. Haga clic en **Editar** en el módulo para acceder al editor de scripts.
2. Cree una variable para almacenar su clave secreta (**secret**), garantizando la organización y seguridad de los datos.
3. Invoque la función **signJWTToken** pasando los datos necesarios y la clave definida.
4. Para realizar la lectura o validación, utilice la función **decodeJWTToken** informando el token y la misma clave secreta.

{% hint style="warning" %}
**Importante:** La seguridad de la autenticación vía JWT depende de la protección rigurosa de su clave secreta (secret). Nunca la exponga directamente en el código de forma insegura.
{% endhint %}

### Ejemplos de Uso

#### **Ejemplo 1: Código síncrono con dos parámetros**

Supongamos que tenemos dos parámetros: `number1` y `number2`.

Código JavaScript:

```javascript
function addNumbers(data) {
  return data.number1 + data.number2;
}
return addNumbers(data);
```

Al hacer clic en **“Ejecutar”**, el resultado será la suma de ambos parámetros.

<figure><img src="/files/uzho20ZG4AZCL3QIJm0r" alt=""><figcaption></figcaption></figure>

***

#### **Ejemplo 2: Código asíncrono con Promises**

En este ejemplo, vamos a trabajar con un escenario asíncrono utilizando **Promises** en **JavaScript**.

Imagina que queremos procesar los datos después de un cierto tiempo. Usaremos dos parámetros que se encuentran dentro de **"data"**, y la función devolverá una **Promise**.

El código a continuación simula una operación asíncrona utilizando **setTimeout** para esperar un segundo antes de resolver la **Promise** con un mensaje y los datos proporcionados, después de hacer clic en **"Ejecutar"**:

```javascript
function fetchData(data) {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve({ message: 'Data processed successfully', data });
    }, 1000);
  });
}
return fetchData(data);
```

El resultado puede observarse en la imagen a continuación:

<figure><img src="/files/PVfCJGQtpNHTMhMVtcIg" alt=""><figcaption></figcaption></figure>

***

#### **Ejemplo 3: Crear un token usando `signJwtToken`**

En este ejemplo, se demostrará la creación de un **token JWT** utilizando el módulo de **JavaScript**.

Para ello, utilizaremos la función **signJwtToken**, proporcionada por el propio módulo, que permite generar tokens de manera práctica y segura.

La función **signJwtToken** requiere los siguientes parámetros:

* **Payload** *(obligatorio | objeto)*: define el cuerpo del token, que contiene la información que será codificada.
* **Secret** *(obligatorio | texto)*: clave secreta utilizada para firmar y validar el token.
* **Options** *(opcional | objeto)*: permite la configuración de parámetros adicionales del token. Para más información sobre este campo, consulta la documentación de la biblioteca de JavaScript utilizada.

**Ejemplo de uso**

En los datos de entrada puede configurarse un parámetro o variable si es necesario, por ejemplo:

<figure><img src="/files/ptDGZz6QnLpDSqYBWxHi" alt=""><figcaption></figcaption></figure>

**Ejemplo de datos de entrada:**

```json
{
  "data": {
    "payload": {
      "id": 1,
      "first_name": "Kristos",
      "last_name": "Amiranda",
      "email": "kamiranda0@hugedomains.com",
      "gender": "Male",
      "ip_address": "183.129.112.78"
    },
    "secret": "687398ee-8c99-48fe-93b5-5ade50d6e22f"
  }
}
```

Insertamos el siguiente código en el área de **Código JavaScript**:

```json
const {payload, secret} = data;

return signJwtToken(payload, secret, {expiresIn: '1d'})
```

Dado que los parámetros **payload** y **secret** son obligatorios, es posible agregar otras opciones adicionales. En nuestro ejemplo, utilizamos **expiresIn**. Para visualizar las demás opciones,  [consulta la documentación](https://github.com/auth0/node-jsonwebtoken#readme).

Después de la ejecución, el resultado puede observarse en la imagen a continuación:

<figure><img src="/files/ICeKr1k9RIxtJKrsl0YK" alt=""><figcaption></figcaption></figure>

En caso de error, el resultado será diferente, como se muestra a continuación:

```json
{
	"error": "simulate error",
	"success": "false"
}
```

***

### Ejemplo 4: **Decodificar un token usando la función `decodeJwtToken`**

En este ejemplo, vamos a decodificar un token JWT para verificar y acceder a los datos almacenados en él.

Usaremos nuevamente una función proporcionada por el módulo llamada **`decodeJwtToken`**. Esta función espera recibir dos parámetros:

* **token:** Este campo es obligatorio y de tipo *texto*. Representa el token que será decodificado y verificado.
* **secret:** Este campo es obligatorio y de tipo *texto*. Representa la clave secreta utilizada para firmar el token.

**Ejemplo de uso**

Para la entrada, utilizamos los siguientes datos:

```json
{
  "data": {
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiZmlyc3RfbmFtZSI6IktyaXN0b3MiLCJsYXN0X25hbWUiOiJBbWlyYW5kYSIsImVtYWlsIjoia2FtaXJhbmRhMEBodWdlZG9tYWlucy5jb20iLCJnZW5kZXIiOiJNYWxlIiwiaXBfYWRkcmVzcyI6IjE4My4xMjkuMTEyLjc4IiwiaWF0IjoxNzM3NjQwNzk1LCJleHAiOjE3Mzc3MjcxOTV9.Isi8OlBpc-yUa5EsJa9IOA8wgmAFivgrn_pRClssVGE",
    "secret": "687398ee-8c99-48fe-93b5-5ade50d6e22f"
  }
}
```

Insertamos el siguiente código en el área de **Código JavaScript**:

```javascript
const { token, secret } = data;
return decodeJwtToken(token, secret);
```

Después de la ejecución, el resultado puede observarse en la imagen a continuación:

<figure><img src="/files/H9xUHHEz0fZGU5blFqcd" alt=""><figcaption></figcaption></figure>

Error de ejecución:

```json
{
  "error": "simulate error",
  "success": "false"
}
```

***

#### Buenas Prácticas

* **Validación de entrada**: Siempre valida los datos de entrada para garantizar la correcta ejecución y evitar errores inesperados.
* **Desempeño**: Evita bucles infinitos o recursiones profundas que puedan generar uso excesivo de memoria.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.skyone.cloud/espanol/skyone-studio/integraciones/flujos/modulos-de-herramientas/modulo-javascript.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
