b2a icon indicating copy to clipboard operation
b2a copied to clipboard

btoa and atob support for node.js or old browsers, with the Unicode Problems fixed

Build Status Coverage

b2a

btoa and atob (base64/base64url encoding and decoding) support for node.js or old browsers, with the Unicode Problems fixed.

The common problem of other libraries is that they fail to encode 16-bit strings. Since DOMStrings are 16-bit-encoded strings, in most browsers calling window.btoa on a Unicode string will cause a 'Character Out Of Range' exception if a character exceeds the range of a 8-bit byte (0x00~0xFF).

This module will try to reuse window.atob and window.btoa when possible.

Install

$ npm install b2a

Usage

import {
  // Encode a string in base-64
  btoa,
  // Decode a string in base-64
  atob,

  // Encode a string into base64url
  btoau,
  // Decode a base64url-encoded string
  atobu
} from 'b2a'

btoa('a')           // 'YQ=='
window.btoa('a')    // 'YQ==', works fine with ASCII characters


// Oooooooops!
// In most browsers, calling btoa() on a Unicode string
// will cause a Character Out Of Range exception.
window.btoa('中文')  // throws InvalidCharacterError ❌

btoa('中文')         // '5Lit5paH' ✅


// Oooooooops!
window.atob('5Lit5paH')   // '中æ', oh no! ❌

atob('5Lit5paH')          // '中文', great! ✅


btoau('μπορούμε')                 // zrzPgM6_z4HOv8-NzrzOtQ==

atobu('zrzPgM6_z4HOv8-NzrzOtQ==') // μπορούμε

base64url support since 1.1.0

Since 1.1.0, btoau and atobu are introduced to encode and decode in base64url format.

import {btoau} from 'b2a'

location.href = `https://domain.com/login?return_to=${btoau(location.href)}`

License

MIT