aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md5
-rw-r--r--src/gleam_stdlib.mjs6
-rw-r--r--test/gleam/bit_array_test.gleam8
3 files changed, 13 insertions, 6 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ea30f7d..8847122 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -18,8 +18,9 @@
- The behaviour of the string trim functions is now consistent across targets.
- `iterator.yield` now yields values without waiting for the next one to become
available.
-- Base64 encoding speed improvements. Encoding of bit arrays over ~100KiB to
- Base64 on JavaScript no longer throws an exception.
+- Improved bit array Base64 encoding and decoding speed on JavaScript.
+- Fixed a bug where Base64 encoding a bit array larger than ~100KiB would throw
+ an exception on JavaScript.
## v0.38.0 - 2024-05-24
diff --git a/src/gleam_stdlib.mjs b/src/gleam_stdlib.mjs
index c4111f9..d067cec 100644
--- a/src/gleam_stdlib.mjs
+++ b/src/gleam_stdlib.mjs
@@ -551,7 +551,11 @@ export function encode64(bit_array, padding) {
export function decode64(sBase64) {
try {
const binString = atob(sBase64);
- const array = Uint8Array.from(binString, (c) => c.charCodeAt(0));
+ const length = binString.length;
+ const array = new Uint8Array(length);
+ for (let i = 0; i < length; i++) {
+ array[i] = binString.charCodeAt(i);
+ }
return new Ok(new BitArray(array));
} catch {
return new Error(Nil);
diff --git a/test/gleam/bit_array_test.gleam b/test/gleam/bit_array_test.gleam
index 1c3e7db..6693752 100644
--- a/test/gleam/bit_array_test.gleam
+++ b/test/gleam/bit_array_test.gleam
@@ -162,11 +162,13 @@ pub fn base64_encode_test() {
|> bit_array.base64_encode(True)
|> should.equal("")
- string.repeat("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 1024 * 32)
+ string.repeat("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 1024 * 32)
|> bit_array.from_string
|> bit_array.base64_encode(True)
- |> string.length
- |> should.equal(1_398_104)
+ |> should.equal(string.repeat(
+ "QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB",
+ 1024 * 32,
+ ))
}
pub fn base64_decode_test() {