Skip to content
File

Blob: src/workerd/api/base64.c++

1.7 KB
1#include "base64.h"
2 
3#include "simdutf.h"
4 
5#include <kj/debug.h>
6 
7namespace workerd::api {
8 
9jsg::JsBufferSource Base64Module::decodeArray(jsg::Lock& js, jsg::JsBufferSource input) {
10 auto ptr = input.asArrayPtr();
11 auto size = simdutf::maximal_binary_length_from_base64(
12 reinterpret_cast<const char*>(ptr.begin()), ptr.size());
13 auto buf = jsg::JsArrayBuffer::create(js, size);
14 auto result = simdutf::base64_to_binary(ptr.asChars().begin(), input.size(),
15 buf.asArrayPtr().asChars().begin(), simdutf::base64_default);
16 JSG_REQUIRE(result.error == simdutf::SUCCESS, DOMSyntaxError,
17 kj::str("Invalid base64 at position ", result.count, ": ",
18 simdutf::error_to_string(result.error).data()));
19 KJ_ASSERT(result.count <= size);
20 buf = buf.slice(js, result.count);
21 return jsg::JsBufferSource(buf);
22}
23 
24jsg::JsBufferSource Base64Module::encodeArray(jsg::Lock& js, jsg::JsBufferSource input) {
25 auto size = simdutf::base64_length_from_binary(input.size());
26 auto buf = jsg::JsArrayBuffer::create(js, size);
27 auto out_size = simdutf::binary_to_base64(input.asArrayPtr().asChars().begin(), input.size(),
28 buf.asArrayPtr().asChars().begin(), simdutf::base64_default);
29 KJ_ASSERT(out_size <= size);
30 buf = buf.slice(js, out_size);
31 return jsg::JsBufferSource(buf);
32}
33 
34jsg::JsString Base64Module::encodeArrayToString(jsg::Lock& js, jsg::JsBufferSource input) {
35 KJ_ASSERT(input.size() < 256 * 1024 * 1024);
36 auto size = simdutf::base64_length_from_binary(input.size());
37 kj::SmallArray<char, 1024> buf(size);
38 auto out_size = simdutf::binary_to_base64(
39 input.asArrayPtr().asChars().begin(), input.size(), buf.begin(), simdutf::base64_default);
40 KJ_ASSERT(out_size <= size);
41 return js.str(buf.first(out_size));
42}
43 
44} // namespace workerd::api