# Instalar o cliente

> Carregue client.js a partir da CDN da Entase e, em seguida, crie uma instância. Não há nenhum pacote para instalar nem etapa de compilação.

O cliente é disponibilizado pela CDN da Entase como um único ficheiro. Não há nenhum pacote npm, nenhum bundle para compilar nem dependências para manter atualizadas – recebe sempre a versão atual.

```html
<script src="https://js.entase.com/client.js"></script>
```

Carregar o script define uma classe `Entase` global. Por si só, não faz mais nada: não efetua pedidos de rede, não altera o DOM, não apresenta nada. Tudo começa quando cria uma instância.

## Criar uma instância

```js
const entase = new Entase({ pk: 'YOUR_PUBLISHABLE_KEY' });
```

Crie **uma instância por página** e reutilize-a para todos os eventos. O construtor regista um listener de `message` na janela e começa a detetar que modo de checkout o seu domínio tem autorização para usar, pelo que criar várias instâncias resulta em listeners duplicados e chamadas de deteção duplicadas, sem qualquer benefício.

Todas as opções têm um valor predefinido, pelo que `new Entase()` sem argumentos é válido – mas, sem `pk`, o cliente não consegue verificar se o seu domínio pode usar o checkout integrado e recorrerá sempre a uma janela pop-up. Consulte [Modos de checkout](/developers/js-client/checkout-modes.md).

## Carregar o script de forma assíncrona

Se carregar `client.js` com `async` ou `defer`, a classe ainda não existirá quando o seu script integrado for executado. A biblioteca emite um evento `entase:ready` em `window` assim que termina de carregar, por isso aguarde por ele:

```html
<script src="https://js.entase.com/client.js" async></script>
<script>
  let entase = null;

  const init = () => { entase = new Entase({ pk: 'YOUR_PUBLISHABLE_KEY' }); };

  if (typeof Entase !== 'undefined') init();
  else window.addEventListener('entase:ready', init);
</script>
```

É importante verificar primeiro com `typeof`: se o script já tiver terminado de carregar, `entase:ready` já terá sido emitido e aguardar por ele seria esperar para sempre.

## Limpeza

Numa aplicação de página única, chame `destroy()` quando a vista proprietária da instância for desmontada:

```js
entase.destroy();
```

Isto remove os listeners da janela registados pelo cliente. Uma instância destruída não pode ser reutilizada – chamar `book()` nela regista um erro e não faz nada. Em vez disso, crie uma nova instância.

## Política de Segurança de Conteúdo

Se o seu site enviar um cabeçalho `Content-Security-Policy`, o checkout necessita de:

- `script-src https://js.entase.com` – para carregar a biblioteca.
- `frame-src https://www.entase.com` – o checkout é apresentado numa iframe no modo de painel.
- `connect-src https://www.entase.com` – o cliente chama a API da Entase para determinar o modo de checkout permitido.

Sem `frame-src`, o modo de painel apresenta um painel vazio. Sem `connect-src`, a deteção do modo falha e todos os checkouts abrem numa janela pop-up.
