Start · Sprachen · JavaScript · Referenz · WorkerGlobalScope.btoa()

WorkerGlobalScope.btoa()

Methode

Wandelt innerhalb eines Workers einen Binär-String (jedes Zeichen 0–255) in einen Base64-codierten ASCII-String um.

seit JavaScript Baseline: alle Browser (in Workern) Kategorie: webapi

Signatur

WorkerGlobalScope.btoa(stringToEncode)

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

Typ
string
Beschreibung
Ein ASCII-String mit der Base64-Darstellung von 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'));
YWRtaW46Z2VoZWlt

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'));
R3LDvMOfZQ==

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'));
YWJj

Fehlerbehandlung bei ungültigen Zeichen

try {
  btoa('Preis: 5 €');
} catch (err) {
  console.log(err.name);
}
InvalidCharacterError

// Wichtig · Fallstricke

  • Nur Latin-1: Zeichen über U+00FF führen zu einer InvalidCharacterError-Ausnahme. Für Unicode immer den Umweg über TextEncoder gehen.
  • 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 einen RangeError (zu viele Argumente) auslösen – große Daten besser stückweise umwandeln. Neuere Umgebungen bieten Uint8Array.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 aber Buffer.from(str).toString('base64').