Signatur
Beschreibung
Die Methode btoa() („binary to ASCII“) steht im globalen Geltungsbereich von Web Workern, Shared Workern und Service Workern zur Verfügung und entspricht funktional Window.btoa(). Sie nimmt einen Binär-String entgegen, also einen String, in dem jedes Zeichen genau ein Byte (Codepunkt 0–255) darstellt, und liefert dessen Base64-Darstellung zurück.
Typische Einsatzfälle in Workern sind das Erzeugen von data:-URLs, das Codieren von Zugangsdaten für den HTTP-Header Authorization: Basic … bei fetch()-Aufrufen oder das Serialisieren kleiner Binärdaten (z. B. Hash-Werte aus crypto.subtle) für die Übertragung als Text.
Wichtig: btoa() arbeitet nicht mit beliebigem Unicode. Enthält der String ein Zeichen oberhalb von U+00FF (z. B. „€“ oder Emojis), wird eine DOMException vom Typ InvalidCharacterError geworfen. Unicode-Text muss daher zuerst mit TextEncoder in Bytes umgewandelt und diese in einen Binär-String überführt werden.
Das Gegenstück zum Decodieren ist WorkerGlobalScope.atob(). Da die Methode global verfügbar ist, ruft man sie im Worker einfach als btoa(...) oder self.btoa(...) auf.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $stringToEncode Pflicht | string | Der zu codierende Binär-String. Jedes Zeichen muss einen Codepunkt zwischen 0 und 255 haben. Nicht-String-Werte werden vorher in einen String umgewandelt. |
Rückgabewert
stringToEncode (Alphabet A–Z a–z 0–9 + /, ggf. mit =-Auffüllung).Beispiele
Basic-Auth-Header in einem Worker erzeugen
// worker.js
self.addEventListener('message', async (event) => {
const { user, password, url } = event.data;
const credentials = btoa(`${user}:${password}`);
const response = await fetch(url, {
headers: { Authorization: `Basic ${credentials}` }
});
self.postMessage({ status: response.status });
});
console.log(btoa('admin:geheim'));
Unicode-Text sicher codieren
// btoa('Grüße 😀') würde InvalidCharacterError werfen
const toBase64 = (text) => {
const bytes = new TextEncoder().encode(text);
let binary = '';
for (const byte of bytes) binary += String.fromCharCode(byte);
return btoa(binary);
};
console.log(toBase64('Grüße'));
SHA-256-Hash als Base64 ausgeben
const hashBase64 = async (text) => {
const data = new TextEncoder().encode(text);
const digest = await crypto.subtle.digest('SHA-256', data);
const binary = String.fromCharCode(...new Uint8Array(digest));
return btoa(binary);
};
hashBase64('hallo').then((h) => self.postMessage(h));
console.log(btoa('abc'));
Fehlerbehandlung bei ungültigen Zeichen
try {
btoa('Preis: 5 €');
} catch (err) {
console.log(err.name);
}
// Wichtig · Fallstricke
- Nur Latin-1: Zeichen über
U+00FFführen zu einerInvalidCharacterError-Ausnahme. Für Unicode immer den Umweg überTextEncodergehen. - Keine Verschlüsselung: Base64 ist nur eine Codierung. Zugangsdaten in Basic-Auth-Headern sind ohne HTTPS im Klartext lesbar.
- Kein URL-sicheres Base64: Die Ausgabe enthält
+,/und=. Für URLs oder JWTs muss man diese Zeichen ersetzen (-,_, Auffüllung entfernen). - Performance:
String.fromCharCode(...bytes)kann bei sehr großen Arrays einenRangeError(zu viele Argumente) auslösen – große Daten besser stückweise umwandeln. Neuere Umgebungen bietenUint8Array.prototype.toBase64()als modernere Alternative (noch nicht überall verfügbar). - Kompatibilität: In allen modernen Browsern in Dedicated, Shared und Service Workern verfügbar; Node.js stellt
btoa()seit Version 16 global bereit, empfiehlt aberBuffer.from(str).toString('base64').