# Globais

O runtime da cena garante a existência de certos objetos e funções dentro do ambiente JavaScript isolado, além das utilidades padrão como `Promise`, `Date` ou `Math`.

{% hint style="info" %}
Os globais descritos abaixo são conceitos típicos do JavaScript, mas são adaptados ao runtime de cena do Decentraland e podem não se comportar de forma idêntica aos seus equivalentes em ambientes de navegador ou Node.
{% endhint %}

### Globais

O runtime injeta 6 definições no escopo global da cena:

1. [`console`](#console): uma versão simplificada do típico `console` .
2. [`objeto`](#module): um objeto onde a cena pode adicionar sua [interface pública](https://github.com/decentraland/docs/blob/main/contributor/execution.md).
3. [`module`](#module): um contêiner para os `objeto` .
4. [`require`](#module): uma função para carregar módulos fornecidos pelo runtime por nome.
5. [`fetch`](#http): uma implementação restrita do `fetch` function.
6. [`WebSocket`](#http): uma implementação restrita do `WebSocket` class.

Todos estes são definidos como propriedades somente leitura, portanto não podem ser reatribuídos. Alguns lançarão exceções quando usados a menos que certas [permissions](https://github.com/decentraland/docs/blob/main/contributor/contributor/content/entity-types/scenes.md#permissions) sejam concedidas à cena.

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

As cenas têm acesso a um `console` objeto, muito parecido com o fornecido por um ambiente de navegador ou Node, embora limitado a apenas alguns dos métodos que você normalmente encontraria.

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

Assim como seus equivalentes padrão, cada método aceita argumentos variáveis de qualquer tipo e os renderiza como mensagens legíveis por humanos. Por exemplo, isto é válido:

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

O comportamento preciso desses métodos depende do provedor, mas as mensagens devem estar acessíveis aos desenvolvedores de cena que depuram seu código.

{% hint style="info" %}
No World Explorer baseado em navegador da Foundation, as mensagens de log aparecem no painel de ferramentas do desenvolvedor.
{% endhint %}

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

As cenas podem importar e exportar objetos usando a tradicional [CommonJS](https://wiki.commonjs.org/wiki/Modules/1.0) interface de module.

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

O `require` a função permite que cenas acessem módulos fornecidos pelo runtime (tais como [EngineApi](https://github.com/decentraland/docs/blob/main/contributor/modules/engine_api.md) ou [RestrictedActions](https://github.com/decentraland/docs/blob/main/contributor/modules/restricted_actions.md)), e nada mais (ela **não** acessa pacotes NPM ou módulos por caminho).

Propriedades adicionadas ao `objeto` objeto são a interface pública da cena e serão expostas ao runtime. De fato, as cenas *devem* expor pelo menos um método para rodar corretamente (veja [execution](https://github.com/decentraland/docs/blob/main/contributor/execution.md)).

{% hint style="info" %}
Cenas escritas em linguagens como TypeScript usam o mais moderno `import` e `export` declarações, que podem ser transpiladas para usos compatíveis com CommonJS de `require` e `objeto`.
{% endhint %}

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

O `fetch` e `WebSocket` os globais funcionam exatamente como seus conhecidos equivalentes (veja [fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) e [WebSocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) em MDN), mas com algumas restrições impostas pelo runtime.

Ao chamar a `fetch` função:

* É lançada uma erro se a URL não começar com `https://`.
* É lançada uma erro se a cena não tiver a [`USE_FETCH` permission](https://github.com/decentraland/docs/blob/main/contributor/contributor/content/entity-types/scenes.md#permissions).
* Um timeout definido pela implementação pode abortar a requisição.

Ao usar a `WebSocket` class:

* É lançada uma erro se a URL não começar com `wss:`
* É lançada uma erro se a cena não tiver a [`USE_WEBSOCKET` permission](https://github.com/decentraland/docs/blob/main/contributor/contributor/content/entity-types/scenes.md#permissions).

Além dessas diferenças, ambos os casos seguem o comportamento padrão.
