Various operations on Uint8Array data
Last release 3 months ago
20 May 2026
Release timing varies
gaps range from 8 days to 3 months
Some releases are documented
notes for 10 of 18 stable releases
Nothing withdrawn
no release was ever pulled
11 months old
31 releases · first in 2025
Release timeline
31 releases since 2025One column per month.
Releases
- 1.15.120 May 2026
- 1.15.04 Mar 2026
Release notes
Open source →- feat:
isomorphicDecode(),isomorphicEncode()in/encoding.js(in #68) - doc: deprecate
latin1toString()/latin1fromString()in favor ofisomorphicDecode()/isomorphicEncode()(see #55) - feat:
fromBase32crockford/toBase32crockfordin/base32.js - feat:
typedCopyBytes()in/array.js - feat: add
'arraybuffer'output format support in methods acceptingformatparameter (in #70) - feat:
'uint8'(default) output format now never returns pooledUint8Arrayinstances (see below)
This release brings support of native ArrayBuffer return format (under the name of
format: 'arraybuffer').Converting
Uint8ArraytoArrayBufferdownstream is non-trivial, and there is a lot of confusion in the ecosystem around those.
A simple access to.bufferis often seen and is incorrect -- code accepting Uint8Arrays that it didn't create should not assume that it did not receive for example a result of.subarray()(where.buffersize mismatches the view size), or a Node.js pooledBufferinstance (which are also Uint8Arrays).That pattern (using
.bufferand failing to check bounds) has been a source of numerous errors in ecosystem libraries.To minimize the risks from such mistakes, this library now never returns
Uint8Arrayinstances (default format) that are not complete views of their underlyingArrayBuffer.In other words, now the following are true for a returned Uint8Array instance
u8:u8.buffer.byteLength === u8.byteLengthu8.byteOffset === 0deepStrictEqual(new Uint8Array(u8.buffer), u8)
The affected parts (which previously returned non-complete views / subarrays) are:
- On multiple platforms:
fromBase58Check,createMultibyteEncoder,createSinglebyteEncoder - On Node.js import condition only (any Node.js version):
latin1fromString,utf8fromString,utf16fromString - On Node.js import condition with Node.js < 25:
fromHex,fromBase64
This comes at a reasonable performance cost (almost exclusively on Node.js import condition), but correctness/security comes first.
Note
This change doesn't affect
TextEncoder, which is already governed by the Encoding Standard which demands non-pooled Uint8Arrays.This also doesn't affect
typedView()(from/array.js) which by definition is always a view of the same underlyingArrayBufferdata.
But nowtypedCopyBytes()is introduced.Important
This change does not affect
'buffer'return format, which can still return pooledBufferinstances.
This is similar to the behavior of nativeBuffer.from/Buffer.allocwhich are pooled.Apart from making returned Uint8Array instances complete views, a dedicated ArrayBuffer return format is introduced to eliminate the need to use
.bufferon the returned values in downstream code at all (as it's a bad pattern in general and tooling/lint will/should flag that).Full Changelog: v1.14.1...v1.15.0
- feat:
- 1.14.113 Feb 2026
Release notes
Open source →fix: ensure TextEncoder never returns pooled arrays
Previous implementation always ensured 0-offset Uint8Array (
ret.byteOffset === 0),
but not that there is no data past the returned view (ret.byteLength === ret.buffer.byteLength).This is now fixed.
This only affected Node.js-like platforms, as only there native buffers are pooled.
Full Changelog: v1.14.0...v1.14.1
- 1.14.012 Feb 2026
Release notes
Open source →-
Fix
makeBase58check()Typescript types -
Add
sideEffectsconfigurationOnly
@exodus/bytes/encoding.jsexport has side-effects, and those side-effects are internal:It is documented to load multi-byte codecs for both this import and future (and previous)
/encoding-lite.jsimports, even if the current import does not use the provided TextDecoder.Both
/encoding.jsand/encoding-lite.jsare designed to return the exact same TextDecoder class and methods, and loading full implementation provides multi-byte encodings support everywhere.As
/encoding-lite.jscan be used as a global polyfill, the setup has to avoid polyfill conflicts if something loads/encoding.jsand then something else replaces it with/encoding-lite.js(or vice versa)The same mechanism is reused to keep
/whatwg.jsminimal by default, and only support multi-byte encodings if/encoding.jswas imported and loaded them at any point.This is not a new change, just documenting the existing behavior and exposing
sideEffectsconfiguration so that bundlers can optmize out other imports. -
Further bundle size optimizations
Full Changelog: v1.13.0...v1.14.0
-
- 1.13.011 Feb 2026
Release notes
Open source →What's Changed
-
Bundle size reductions, especially for browsers
Under
browsermodule resolution target, we rely on browsers to have a working UTF-8 / UTF-16 / windows-1252 (latin1 subset)TextDecoderimplementation that doesn't have bugs when used without streaming and withignoreBOM: true, and aTextEncoderWhile browsers have bugs even in UTF-8, those bugs are related to streams and/or BOM processing, and that specific combination we use seems to be always robust.
In previous versions we already used native codepaths for those where possible and operated under the same assumption.
-
Disable hex/base64 performance optimization for Firefox >=133 <146
We used a guarded useragent check for those versions to prefer js fallback instead of native base64 / hex implementations, as native was slow before FF 146 (ref: https://bugzilla.mozilla.org/show_bug.cgi?id=1994067 and linked issues)
As the usage of FF <146 diminished according to caniuse stats, this check is not worth it anymore.
This version removes that useragent check.
Those Firefox versions are still supported by the library, but now the native base64 / hex implementation is always used when available.
See 8cab29a for implementation details.
Full Changelog: v1.12.0...v1.13.0
-
- 1.12.08 Feb 2026
Release notes
Open source →- Fix UTF-16 on platforms with present but broken native UTF-16 TextDecoder (e.g. workerd, see cloudflare/workerd#6028)
- Test in CI on workerd, xs and graaljs
Full Changelog: v1.11.0...v1.12.0
- 1.11.01 Feb 2026
Release notes
Open source →What's Changed
- feat: add
/whatwg.jsandpercentEncodeAfterEncoding()in #37 - doc: add documentation on https://exodusoss.github.io/bytes
- fix:
utf16toStringLoose(Uint16Array)on Big-Endian hardware in #44
New Contributors
Full Changelog: v1.10.0...v1.11.0
- feat: add
- 1.10.026 Jan 2026
Release notes
Open source →What's Changed
- Add TypeScript types for all entry points
- Test and accept
Uint8Array<SharedArrayBuffer>input - Add iso-2022-jp fatal encoder (in #36)
- Improve documentation
Full Changelog: v1.9.0...v1.10.0
- 1.9.018 Jan 2026
Release notes
Open source →- Implement strict multi-byte encoders, except for
iso-2022-jpfor now - Add
/encoding-browser.jsto load only native lightweight TextDecoder/TextEncoder in browser bundles - Add
/index.jsexport with usage warning, mostly for IDEs - Switch
/base58check.jspeer dep (used on non-Node.js platforms) to@noble/hashesdirectly (previously@exodus/crypto) - Fix
legacyHookDecode()behavior on non-even (incomplete) UTF-16 byte length - Fix
utf16toString(uint16arr)on Big-Endian Node.js - Performance improvements in encoders and decoders
Full Changelog: v1.8.0...v1.9.0
- Implement strict multi-byte encoders, except for
- 1.8.02 Jan 2026
Release notes
Open source →What's Changed
- feat: support
iso-8859-1,iso-8859-9,iso-8859-11encodings insingle-byte.js - feat:
latin1fromString,latin1toString - feat: types for
encoding.jsby @ajaymathur in #12 - feat: types for
encoding-lite.js - perf improvements for encodings
New Contributors
- @ajaymathur made their first contribution in #12
Full Changelog: v1.7.0...v1.8.0
- feat: support
- 1.7.028 Dec 2025
Nothing published for this version
- 1.6.025 Dec 2025
Nothing published for this version
- 1.5.024 Dec 2025
Nothing published for this version
- 1.4.024 Dec 2025
Nothing published for this version
- 1.3.023 Dec 2025
Nothing published for this version
- 1.2.022 Dec 2025
Nothing published for this version
- 1.1.022 Dec 2025
Nothing published for this version
- 1.0.020 Dec 2025
Nothing published for this version
- 1.0.0-rc.1217 Dec 2025pre-release
Nothing published for this version
- 1.0.0-rc.1116 Dec 2025pre-release
Nothing published for this version
- 1.0.0-rc.1015 Dec 2025pre-release
Nothing published for this version
- 1.0.0-rc.915 Dec 2025pre-release
Nothing published for this version
- 1.0.0-rc.86 Dec 2025pre-release
Nothing published for this version
- 1.0.0-rc.73 Dec 2025pre-release
Nothing published for this version
- 1.0.0-rc.62 Dec 2025pre-release
Nothing published for this version
- 1.0.0-rc.514 Oct 2025pre-release
Nothing published for this version
- 1.0.0-rc.46 Oct 2025pre-release
Nothing published for this version
- 1.0.0-rc.33 Oct 2025pre-release
Nothing published for this version
- 1.0.0-rc.219 Sept 2025pre-release
Nothing published for this version
- 1.0.0-rc.119 Sept 2025pre-release
Nothing published for this version
- 1.0.0-rc.019 Sept 2025pre-release
Nothing published for this version