Fehler, Limits und Versionierung
Fehler
Ein fehlgeschlagener Befehl wird mit einem EmbedError abgelehnt. Sein code ist stabil und für Verzweigungen gedacht; message ist für Entwickler geschrieben, die eine Konsole lesen.
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);
}
}
| Eigenschaft | |
|---|---|
code |
Einer der Fehlercodes |
message |
Was schiefgelaufen ist, in einem Satz |
detailedMessage |
Die zugrunde liegende Ursache, sofern vorhanden |
requestId |
Vorhanden, wenn unsere Server am Fehler beteiligt waren. Geben Sie sie in einer Supportanfrage an |
detail |
Strukturierte Zusatzangaben, zum Beispiel { undeclared: [...] } bei undeclared_filter |
Welcher Code was bedeutet
Die Codes fallen in vier Familien, und die richtige Reaktion ist jeweils eine andere.
Ihre Seite ist nicht berechtigt: denied_origin, denied_capability. Darüber entscheidet der Autor. denied_origin lehnt bereits ready ab: Es wurde keine Sitzung geöffnet, und nichts funktioniert, bis Ihre Website den zulässigen Ursprüngen der Karte hinzugefügt wird. denied_capability bedeutet, dass eine Gruppe deaktiviert ist (oder bei exportImage und print, dass eine Vertraulichkeitsbezeichnung den Export verweigert). Blenden Sie die Funktion aus; ein erneuter Versuch hilft nicht.
Die Karte hat es nicht: unsupported_command, unknown_id, undeclared_filter. Prüfen Sie capabilities.commands, bevor Sie eine Funktion anbieten, und bauen Sie Auswahllisten aus dem auf, was die Karte meldet (getLayers, getBookmarks, getFilterSchema), statt aus IDs in Ihrem Code.
Der Aufruf war falsch: invalid_args, too_large. Ein Fehler im aufrufenden Code; die Meldung nennt das Argument.
Später erneut versuchen: rate_limited, busy, budget_exceeded, data_error, timeout, not_ready. Warten Sie ab, statt in einer Schleife zu wiederholen.
Zwei Codes kommen vom SDK und nicht von der Karte: timeout (keine Antwort innerhalb von 15 Sekunden; änderbar mit der Option commandTimeoutMs) und destroyed (Sie haben die Karte zerstört oder neu geladen, während ein Befehl unterwegs war).
Fehler beim Start
Kann die Karte gar nicht starten (eine widerrufene Veröffentlichung, ein abgelehntes Token), wird ready abgelehnt und die Option onError aufgerufen. Die Karte zeigt dem Betrachter ihre eigene Meldung an, es sei denn, Sie übergeben hideErrors: true und zeigen Ihre eigene.
Limits
Diese Werte sind fest. Ihre Seite kann sie nicht erhöhen, und ein Autor kann sie nicht senken; sie werden auch als EMBED_LIMITS exportiert.
| Limit | Wert | Bei Überschreitung |
|---|---|---|
| Befehle | 60 pro Sekunde | rate_limited |
| Eine Befehlsnachricht | 64 KB | too_large, und der Befehl wird nie gelesen |
| Nutzdaten eines Ereignisses | 32 KB | das Ereignis wird verworfen |
Schlüssel in highlight / selectByKey |
500 | invalid_args |
| Analyseoperationen | 60 pro Minute, 1 laufend + 4 wartend pro Ebene | budget_exceeded, busy |
| Analyseergebnisse | 1.000 IDs oder 200 Zeilen pro Liste | gekürzt, mit truncated: true |
featureHover |
eines pro 100 ms | zusammengefasst; der letzte Wert kommt immer an |
Capabilities statt Versionen
await map.ready wird mit einer Beschreibung dessen aufgelöst, was diese Karte beantwortet:
{
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 ist bereits die Schnittmenge aus drei Dingen: was diese Version der Karte implementiert, was diese Art der Einbettung unterstützt und was der Autor aktiviert hat. Die einzige Prüfung, die Sie je brauchen, ist daher:
if (capabilities.commands.includes("exportImage")) showExportButton();
Neue Befehle kommen hinzu, indem sie in diese Liste aufgenommen werden. Eine heute geschriebene Seite funktioniert weiter; eine Seite, die einen neueren Befehl möchte, fragt danach und kommt ohne ihn aus, wenn er fehlt.
Kompatibilität zwischen Alt und Neu
Die Karte und das SDK werden getrennt veröffentlicht, daher kommt jede Seite damit zurecht, dass die andere älter ist.
| Ihre Seite verwendet | Die Karte ist | Was passiert |
|---|---|---|
| Aktuelles SDK | Aktuell | Alles in dieser Dokumentation |
| Aktuelles SDK | Eine ältere Karte ohne Steuerungs-API | Die Karte wird angezeigt. ready wird mit einer leeren commands-Liste aufgelöst, statt zu hängen; Befehle werden mit unsupported_command abgelehnt |
SDK 0.x (nur Anzeige und setFilters) |
Aktuell | Funktioniert unverändert |
Die ausgehandelte Version steht in map.protocol. Sie sollten sie nicht benötigen.
Lebenszyklus
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) liefert das Handle, das bereits in einem Element eingebunden ist, und reset(element) zerstört es. Nützlich in Frameworks, in denen der Code, der die Karte einbindet, nicht derselbe ist, der aufräumt.
Sicherheitsmodell
Für ein Sicherheitsreview sind diese Eigenschaften relevant:
- Isolation. Die Karte läuft in einem ursprungsübergreifenden iframe. Sie kann Ihre Seite nicht lesen und Ihre Seite sie nicht; der einzige Kanal ist
postMessage. - Wer sprechen darf. Die Karte akzeptiert Nachrichten nur von dem Fenster, das sie eingebettet hat, und nur, wenn dessen Ursprung unter den zulässigen Ursprüngen des Autors steht. Ein Frame eines Drittanbieters auf Ihrer Seite kann die Karte nicht steuern, selbst von einem zulässigen Ursprung aus. Umgekehrt akzeptiert das SDK Nachrichten nur von dem Frame, den es erstellt hat, auf dem erwarteten Ursprung, und sendet Tokens nirgendwo anders hin.
- Was gesagt werden darf. Eine geschlossene Liste von Befehlen mit validierten Argumenten. Keiner nimmt eine URL, eine Abfrage, einen Stil, HTML oder Skript entgegen.
- Was zurückkommt. Nur, was ein Betrachter ohnehin sehen kann: QuickInfo-Felder, niemals ganze Zeilen; niemals die Konfiguration, Datenquellen oder Abfragen der Karte.
- Wer entscheidet. Zulässige Ursprünge und die Schalter der Befehlsgruppen sind Teil der signierten Veröffentlichung und werden in der Karte durchgesetzt, und wo ein Befehl unsere Server erreicht (
refreshData), zusätzlich dort. - Der Datenzugriff bleibt unverändert. Die API schafft keinen neuen Weg zu Daten. Eine veröffentlichte Karte liest, was die Veröffentlichung eingefroren hat oder was die Sicherheit auf Zeilenebene ihres Tokens erlaubt; eine organisationsinterne Einbettung liest im Namen des angemeldeten Betrachters.
- Vertraulichkeitsbezeichnungen. Über Bildexport und Drucken entscheiden dieselben Regeln für Vertraulichkeitsbezeichnungen wie über jeden anderen Export aus Icon Map.
- Telemetrie. Wir zählen Steuerungssitzungen und welche Befehlsgruppen verwendet werden. Argumentwerte (Filterwerte, Auswahlen, Ihre Menütitel) werden nie erfasst.
Dieselbe Liste zulässiger Ursprünge legt auch die frame-ancestors-Richtlinie fest. Sie bestimmt also, welche Websites die Karte überhaupt in einem Frame einbinden dürfen.