diff options
author | Richard Viney <richard.viney@gmail.com> | 2024-06-23 16:59:06 +1200 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2024-06-23 09:40:23 +0100 |
commit | 3592b0b847d0c4348fc37be868ac22607ce426de (patch) | |
tree | 3245d99c349932bf7c07bee1aec9b1562e375419 | |
parent | 6a6d5adf356993031ab2e79012e436dd2567a2f9 (diff) | |
download | gleam_stdlib-3592b0b847d0c4348fc37be868ac22607ce426de.tar.gz gleam_stdlib-3592b0b847d0c4348fc37be868ac22607ce426de.zip |
Improve Base64 decode performance
-rw-r--r-- | CHANGELOG.md | 5 | ||||
-rw-r--r-- | src/gleam_stdlib.mjs | 6 | ||||
-rw-r--r-- | test/gleam/bit_array_test.gleam | 8 |
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() { |