base64-encoding
Version:
Fast Base64 encoding and decoding powered by WebAssembly.
101 lines (60 loc) • 3.29 kB
Markdown
# Base64 Encoding
Fast Base64 encoding and decoding powered by WebAssembly.
This library is modeled after the WHATWG `TextEncoder` and `TextDecoder` API,
providing a `Base64Encoder` and `Base64Decoder` class.
The C implementation was chosen based on benchmarks provided by [`gaspardpetit/base64`](https://github.com/gaspardpetit/base64).
## Usage
```js
const encoder = await new Base64Encoder().optimize();
encoder.encode(new TextEncoder().encode('foobar')) // => Zm9vYmFy
const decoder = await new Base64Decoder().optimize();
new TextDecoder().decode(decoder.decode("Zm9vYmFy")) // => foobar
```
For one-shot usage, you can use the JS implementation without instantiating a WASM instance:
```js
new Base64Encoder().encode(new TextEncoder().encode('foobar')) // => Zm9vYmFy
new TextDecoder().decode(new Base64Decoder().decode("Zm9vYmFy")) // => foobar
```
### URL-friendly Encoding
This implementation also supports a URL-friendly variant of Base64, where
- all `'+'` are mapped to `'-'`
- all `'/'` are mapped to `'_'`
- the padding characters `'='` are omitted
To use this variant, provide the `url` setting when creating the encoder.
```js
const encoder = await new Base64Encoder({ url: true }).optimize();
```
For decoding URL-friendly Base64 no extra steps are required.
## Performance
TBD
Currently only the encoder provides a significant performance improvement over the pure JS implementation.
## Distribution
This module is published on npm under the [`base64-encoding`](https://www.npmjs.com/package/base64-encoding) tag.
The package contains the following:
- The root folder ([Browse](https://unpkg.com/browse/base64-encoding/)) exports ES modules in ES2018 syntax.
All internal module paths are fully qualified, so they can be imported in Deno or the browser directly:
```ts
import * as b64 from 'https://unpkg.com/base64-encoding?module';
```
- The `module` folder ([Browse](https://unpkg.com/browse/base64-encoding/module/)) contains a rolled-up version of the above.
```ts
import * as b64 from 'https://unpkg.com/base64-encoding/module';
```
- The `cjs` folder ([Browse](https://unpkg.com/browse/base64-encoding/cjs/)) exports CommonJS modules in ES2015 syntax for use in node.
```ts
require('base64-encoding')
```
- The `src` folder ([Browse](https://unpkg.com/browse/base64-encoding/src/)) contains the TypeScript source code.
The root and `cjs` folder include type declarations and source maps, so that IntelliSense works out of the box in VSCode.
The `package.json` properly sets the `main`, `module`, `type` and `exports` keys, so that `package.json-`based tools will pick the right version.
## License
TBD
Currently the C code is licensed under an ancient Apache 1.0 license that comes with some pretty old-school requirements, such as including the following in all promotional materials:
> This product includes software
> developed by the Apache Group for use in the Apache HTTP server project
> (http://www.apache.org/).
It is very likely that [`ap_base64.c`](https://github.com/dhamidi/apache-httpd-1.3.42/blob/master/src/ap/ap_base64.c) has been shipped under a Apache-2.0 license somewhere.
Once I locate it, this requirement will go away.
## TODO
- Figure out why decoding is slow
- License