Erros, limites e controle de versão
Erros
Um comando que falha é rejeitado com um EmbedError. O code dele é estável e feito para tomar decisões no código; message é escrita para um desenvolvedor lendo o console.
const { EmbedError } = IconMapEmbed;
try {
await map.applyBookmark({ bookmarkId });
} catch (e) {
if (!(e instanceof EmbedError)) throw e;
switch (e.code) {
case "unknown_id": return forgetBookmark(bookmarkId);
case "denied_capability": return hideBookmarkMenu();
default: report(e.code, e.message, e.requestId);
}
}
| Propriedade | |
|---|---|
code |
Um dos códigos de erro |
message |
O que deu errado, em uma frase |
detailedMessage |
A causa subjacente, quando houver |
requestId |
Presente quando a falha envolveu nossos servidores; informe-o em uma solicitação de suporte |
detail |
Informações estruturadas extras, por exemplo { undeclared: [...] } em undeclared_filter |
O que cada código significa
Os códigos se dividem em quatro famílias, e a resposta adequada é diferente para cada uma.
Sua página não tem permissão: denied_origin, denied_capability. Quem decide é o autor. denied_origin rejeita o próprio ready: nenhuma sessão foi aberta, e nada vai funcionar até que o seu site seja adicionado às origens permitidas do mapa. denied_capability significa que um grupo está desativado (ou, para exportImage e print, que um rótulo de confidencialidade recusa a exportação). Oculte o recurso; tentar de novo não ajuda.
O mapa não tem isso: unsupported_command, unknown_id, undeclared_filter. Verifique capabilities.commands antes de oferecer um recurso e construa os seletores a partir do que o mapa informa (getLayers, getBookmarks, getFilterSchema), e não de IDs no seu código.
A chamada estava errada: invalid_args, too_large. Um bug no código que faz a chamada; a mensagem indica o argumento.
Tente de novo mais tarde: rate_limited, busy, budget_exceeded, data_error, timeout, not_ready. Espere um pouco antes de tentar, em vez de repetir em loop.
Dois códigos vêm do SDK, e não do mapa: timeout (nenhuma resposta em 15 segundos; altere com a opção commandTimeoutMs) e destroyed (você destruiu ou recarregou o mapa enquanto um comando estava em andamento).
Falhas de inicialização
Se o mapa não conseguir iniciar (uma publicação revogada, um token recusado), ready é rejeitado e a opção onError é chamada. O mapa mostra a própria mensagem ao leitor, a menos que você passe hideErrors: true e mostre a sua.
Limites
Estes limites são fixos. Sua página não pode aumentá-los, e um autor não pode reduzi-los; eles também são exportados como EMBED_LIMITS.
| Limite | Valor | Quando excedido |
|---|---|---|
| Comandos | 60 por segundo | rate_limited |
| Uma mensagem de comando | 64 KB | too_large, e o comando nunca é lido |
| Um payload de evento | 32 KB | o evento é descartado |
Chaves em highlight / selectByKey |
500 | invalid_args |
| Operações de análise | 60 por minuto, 1 em execução + 4 aguardando por camada | budget_exceeded, busy |
| Resultados de análise | 1.000 IDs ou 200 linhas por lista | cortados, com truncated: true |
featureHover |
um a cada 100 ms | agrupados; o último valor sempre chega |
Capacidades, não versões
await map.ready é resolvido com um descritor do que este mapa vai responder:
{
protocol: 2,
commands: ["getView", "setView", ...],
events: ["viewChanged", "featureClick", ...],
policy: { enabled: true, read: true, camera: true, layers: true, ... },
map: { publishId, surface: "published", dataMode: "snapshot", bookmarks: true, locales: ["en-US", "de-DE", ...] }
}
commands já é a interseção de três coisas: o que esta versão do mapa implementa, o que este tipo de incorporação suporta e o que o autor ativou. Então a única verificação de que você precisa é:
if (capabilities.commands.includes("exportImage")) showExportButton();
Novos comandos chegam sendo adicionados a essa lista. Uma página escrita hoje continua funcionando; uma página que quer um comando mais novo o solicita e se adapta quando ele não está disponível.
Compatibilidade entre versões antigas e novas
O mapa e o SDK são lançados separadamente, então cada um lida com o outro sendo mais antigo.
| Sua página usa | O mapa é | O que acontece |
|---|---|---|
| SDK atual | Atual | Tudo o que está nesta documentação |
| SDK atual | Um mapa mais antigo, sem a API de controle | O mapa é exibido. ready é resolvido com uma lista commands vazia, em vez de travar; os comandos são rejeitados com unsupported_command |
SDK 0.x (só exibição e setFilters) |
Atual | Funciona sem alterações |
A versão combinada fica em map.protocol. Você não deve precisar dela.
Ciclo de vida
map.reload(); // reload the frame; subscriptions are restored when it is back
map.destroy(); // remove the frame; anything in flight rejects with `destroyed`
getEmbed(element) retorna o handle já montado em um elemento, e reset(element) o destrói. Isso é útil em frameworks em que o código que monta o mapa não é o mesmo que faz a limpeza.
Modelo de segurança
Para uma revisão de segurança, estas são as propriedades que importam:
- Isolamento. O mapa é executado em um iframe de outra origem. Ele não consegue ler a sua página, e a sua página não consegue lê-lo; o único canal é
postMessage. - Quem pode falar. O mapa aceita mensagens apenas da janela que o colocou no frame, e só se a origem dessa janela estiver nas origens permitidas do autor. Um frame de terceiros na sua página não consegue controlar o mapa, mesmo a partir de uma origem permitida. O SDK, por sua vez, aceita mensagens apenas do frame que criou, na origem esperada, e não envia tokens para nenhum outro lugar.
- O que pode ser dito. Uma lista fechada de comandos com argumentos validados. Nenhum deles recebe uma URL, uma consulta, um estilo, HTML ou script.
- O que volta. Só o que um leitor já pode ver: campos da dica de ferramenta, nunca linhas inteiras; nunca a configuração, as fontes de dados ou as consultas do mapa.
- Quem decide. As origens permitidas e as chaves dos grupos de comandos fazem parte da publicação assinada e são impostas dentro do mapa e, quando um comando chega aos nossos servidores (
refreshData), também lá. - O acesso aos dados não muda. A API não cria nenhum caminho novo até os dados. Um mapa publicado lê o que a publicação congelou ou o que a segurança em nível de linha do token permite; uma incorporação organizacional lê como o leitor conectado.
- Rótulos de confidencialidade. A exportação de imagem e a impressão seguem as mesmas regras de rótulos de confidencialidade de qualquer outra exportação do Icon Map.
- Telemetria. Contamos as sessões de controle e quais grupos de comandos são usados. Os valores dos argumentos (valores de filtro, seleções, títulos dos seus menus) nunca são coletados.
A mesma lista de origens permitidas também define a política frame-ancestors, então ela determina quais sites podem sequer exibir o mapa em um frame.