# Globales

El tiempo de ejecución de la escena garantiza la existencia de ciertos objetos y funciones dentro del entorno sandboxed de JavaScript, además de las utilidades estándar como `Promise`, `Date` o `Math`.

{% hint style="info" %}
Los globals descritos a continuación son conceptos típicos de JavaScript, pero están adaptados al runtime de escenas de Decentraland y pueden no comportarse idénticamente a sus contrapartes en entornos de navegador o Node.
{% endhint %}

### Globals

El runtime inyecta 6 definiciones en el ámbito global de la escena:

1. [`console`](#console): una versión simplificada del típico `console` .
2. [`objeto`](#module): un objeto donde la escena puede añadir sus [interfaz pública](https://github.com/decentraland/docs/blob/main/contributor/execution.md).
3. [`module`](#module): un contenedor para el `objeto` .
4. [`La función global require`](#module): una función para cargar módulos proporcionados por el runtime por nombre.
5. [`fetch`](#http): una implementación restringida del `fetch` function.
6. [`WebSocket`](#http): una implementación restringida del `WebSocket` class.

Todos estos están definidos como propiedades de solo lectura, por lo que no pueden reasignarse. Algunos lanzarán excepciones cuando se usen a menos que se otorguen ciertos [permissions](https://github.com/decentraland/docs/blob/main/contributor/contributor/content/entity-types/scenes.md#permissions) se concedan a la escena.

### Console <a href="#console" id="console"></a>

Las escenas tienen acceso a un `console` objeto, muy parecido al que proporciona un navegador o un entorno Node, aunque limitado a solo algunos de los métodos que normalmente encontrarías.

```ts
type Console = {
  log(...args: any): void
  info(...args: any): void
  debug(...args: any): void
  warning(...args: any): void
  error(...args: any): void
}
```

Al igual que sus contrapartes estándar, cada método acepta argumentos variables de cualquier tipo y los representa como mensajes legibles por humanos. Por ejemplo, esto es válido:

```js
console.log("The thing just appeared", { thing: "foo" }, [1, 2, 3])
```

El comportamiento preciso de estos métodos depende del proveedor, pero los mensajes deben ser accesibles para los desarrolladores de escenas que depuran su código.

{% hint style="info" %}
En el World Explorer basado en navegador de la Foundation, los mensajes de log aparecen en el panel de herramientas de desarrollo.
{% endhint %}

### Imports and Exports <a href="#module" id="module"></a>

Las escenas pueden importar y exportar objetos usando la tradicional [CommonJS](https://wiki.commonjs.org/wiki/Modules/1.0) module interface.

```ts
exports: Object
require(moduleName: string): Object
```

El `La función global require` function permite a las escenas acceder a módulos proporcionados por el runtime (como [EngineApi](https://github.com/decentraland/docs/blob/main/contributor/modules/engine_api.md) o [RestrictedActions](https://github.com/decentraland/docs/blob/main/contributor/modules/restricted_actions.md)), y nada más (no **no** accede a paquetes NPM o módulos por ruta).

Las propiedades añadidas al `objeto` objeto son la interfaz pública de la escena y se expondrán al runtime. De hecho, las escenas *deben* exponer al menos un método para ejecutarse correctamente (ver [ejecución](https://github.com/decentraland/docs/blob/main/contributor/execution.md)).

{% hint style="info" %}
Las escenas escritas en lenguajes como TypeScript usan el más moderno `import` y `export` statements, que pueden transpilarse a usos compatibles con CommonJS de `La función global require` y `objeto`.
{% endhint %}

### HTTP and WebSockets <a href="#http" id="http"></a>

El `fetch` y `WebSocket` globals funcionan exactamente como sus contrapartes bien conocidas (ver [fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) y [WebSocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) en MDN), pero con algunas restricciones impuestas por el runtime.

Al llamar a la `fetch` function:

* Se lanza un error si la URL no comienza con `https://`.
* Se lanza un error si la escena no tiene el [`USE_FETCH` permission](https://github.com/decentraland/docs/blob/main/contributor/contributor/content/entity-types/scenes.md#permissions).
* Un timeout definido por la implementación puede abortar la solicitud.

Al usar la `WebSocket` class:

* Se lanza un error si la URL no comienza con `wss:`
* Se lanza un error si la escena no tiene el [`USE_WEBSOCKET` permission](https://github.com/decentraland/docs/blob/main/contributor/contributor/content/entity-types/scenes.md#permissions).

Aparte de estas diferencias, ambos casos siguen el comportamiento estándar.
