Releases: bare-ts/lib
v0.7.0
-
Fix
writeUintSafeandwriteIntSafeby encoding too large numbers in a canonical way.Although the library provides assertions that reject valid inputs, it allows users to disable them.
Even when assertions are disabled, the library must still provide valid encoded values.
Previously,writeUintSafeandwriteIntSafemight output a non-canonical encoding for numbers that were too large.
It now robustly handles invalid input numbers that are too large. -
BREAKING CHANGES: require Node.js 16.9.0 or above.
This allows us to remove code for
BareError#causewhich is now natively supported byError.
v0.6.1
-
Fix
writeUintSafe32that wrongly encoded numbers larger than 16383 (2e14 - 1)This bug affected the encoding of variable-length arrays with more than 16383 items.
v0.4.1
-
Fix
writeUintSafe32that wrongly encoded numbers larger than 16383 (2e14 - 1)This bug affected the encoding of variable-length arrays with more than 16383 items.
v0.6.0
-
Support resizable
ArrayBufferand growableSharedArrayBufferES2024 introduced resizable
ArrayBufferand growableSharedArrayBuffer.
@bare-ts/libnow handle these new features by resizing and growing in-place the buffer
when it reserves space for writing.Note that the library still respects the
maxBufferLengthconfiguration.If
maxBufferLengthis greater than the buffer'smaxByteLength, while a new
buffer is allocated oncemaxByteLengthis exceeded.In the following code, the buffer is resized in-place when
writeFixedStringis called.import * as bare from "@bare-ts/lib" const resizableBuffer = new ArrayBuffer(0, { maxByteLength: 10 }) const config = bare.Config({ initialBufferLength: 0, maxBufferLength: 10 }) const bc = new bare.ByteCursor(new Uint8Array(resizableBuffer), config) bare.writeFixedString(bc, "bare")
-
Export
assert,DEVand integer validators@bare-ts/libnow exports anassertfunction and integer validators such asisI32.
We plan to use these functions in a future version of@bare-ts/tools.The library also exports a
DEVconstant that istrueif thedevelopmentcondition is passed,
or ifNODE_ENVis set todevelopmentunder thenodecondition.
Use the Node's CLI option--conditionsto pass thedevelopmentcondition.These functions should only be used for validating arguments of BARE decoders and encoders.
v0.5.0
-
BREAKING CHANGES: require TypeScript 5.7 or above
JavaScript has two buffer types:
ArrayBufferandSharedArrayBuffer.
Before ES2024, TypeScript treated them as a single type.
ES2024 introduced distinct features forArrayBufferandSharedArrayBuffer.
To take this divergence into account, TypeScript 5.7 added a generic parameter to buffer views.
By default, it is set toArrayBufferLikethat is a supertype toArrayBufferandSharedArrayBuffer.
This change is backward compatible.TypeScript 5.9 went beyond and introduced a breaking change:
Buffer's views no longer extendArrayBuffer.
Moreover,ArrayBufferLikecannot be assigned toArrayBuffer.To accommodate with this change, all BARE
readfunctions now return a view parametrized withArrayBuffer.
For example,readU8ArrayreturnsUint8Array<ArrayBuffer>.
Because we now use parametrized views likeUint8Array<ArrayBuffer>, you have to use TypeScript 5.7 or above.BARE
writefunctions still accept view with any buffer types. -
Export the default bare configuration
import * as bare from "@bare-ts/lib" const config: bare.Config = bare.DEFAULT_CONFIG
-
Support
require(esm)in Node.js v22.10 and aboveThis package now has the new exports condition
module-sync.
It allows users of Node.js v22.10 and above to import the ESM version of the package usingrequire.
It avoids the issues of dual-package hazard. -
Remove
package.jsonmainandmodulefieldsThe
mainandmodulefields supplemented by theexportsfields.
exportsis supported since Node.js v12.7.0
Since we require a version above, we can safely removemain.All major bundlers now support
exports.
Hence, we can also remove themodulefield.
v0.4.0
-
BREAKING CHANGES: remove
ByteCursormethodsTo make bare-ts/lib API uniform, methods of
ByteCursorare replaced by regular functions.import * as bare from "@bare-ts/lib" const bc = new bare.ByteCursor(new Uint8Array(5), bare.Config({})) - bc.check(5) - bc.reserve(5) - bc.read(5) + bare.check(bc, 5) + bare.reserve(bc, 5) + bare.readUnsafeU8FixedArray(bc, 5) -
BREAKING CHANGES: remove
textDecoderThresholdandtextEncoderThresholdconfigurationCalls to native
TextDecoder.decodeandTextEncoder.encodehave a fixed cost.
This cost outperforms the native performance to decode and encode small strings.bare-ts uses a custom implementation to decode and encode small strings.
The choice between the custom and the native codecs is based on thresholds.
These threshold were configurable viatextDecoderThresholdandtextEncoderThresholdconfig properties.This is not clear whether this configuration is worth to expose.
Most of decoded and encoded strings are small.
Fixed thresholds seem fair enough. -
Assertions and development mode
Previously, bare-ts enabled a few assertions to check some function arguments.
For instance, the following code could trigger anAssertionError:import * as bare from "@bare-ts/lib" const bc = new bare.ByteCursor(new Uint8Array(5), bare.Config({})) bare.writeU8(bc, 2**10) // AssertionError: too large number
Assertions are now disabled by default.
They are enabled under the following condition:-
The code is executed under node with
NODE_ENV=development -
The code is executed or bundled under
developmentcondition.
New assertions were added to improve error reporting on development.
More assertions could be added in the future.Because assertions can be disabled, we improved the code robustness:
All uint/int writters truncate their input to ensure that the number of written bytes is bounded. -
v0.3.0
-
Full compliance to IEEE-754 (floating point numbers)
NaN is now a valid value for f32 and f64.
-
Remove {read,write}Void
-
Make @bare-ts/lib platform-agnostic
Use your favorite ESM-ready CDN and simply import @bare-ts/lib.
This was made possible by removing the dependency over node:assert.
v0.2.0
-
Improve performance for reading and writing strings
-
Improve performance for reading variable integers encoded on a single byte
-
Add a reader and a writer for fixed-strings
Users have now access to two new functions that enable to read and
write fixed-length strings.bare.readFixedString(bc, /* string's length in bytes */ 4) bare.writeFixedString(bc, "bare")
-
Simplification of ByteCursor
-
BREAKING CHANGE: rename all decode/encode into read/write
read/write feel more low-level than decode/encode.
read/write are also more used among BARE implementations than decode/encode.
Moreover, in JS, decode and encode are used for high-level API such as
TextDEcoder and TextEncoder.bare.decodeU8(bc) // Previously bare.readU8(bc) // Now bare.encodeU8(bc, 42) // Previously bare.writeU8(bc, 42) // Now
-
BREAKING CHANGE: length can no longer be specified for fixed-array writers
Previously, you had to specify the length of the fixed-array to encode.
If the given length was different of the actual array's length,
then an assertion was thrown ("unmatched length").It is no longer possible to specify the length.
As a consequence, the fixed-array writers can no longer assert the length.Fixed-array writers now have the same signature as other writers.
bare.readerU8FixedArray(bc, Uint8Array.of(42, 24), 2) // Previously bare.writeU8FixedArray(bc, Uint8Array.of(42, 24)) // Now
Note that fixed-array readers still require the specification of the
length:bare.decodeU8FixedArray(bc, 2)
-
BREAKING CHANGE: ByteCursor no longer accept ArrayBuffer
new ByteCursor(new ArrayBuffer(5), config) // Now fails new ByteCursor(new Uint8Array(5), config) // Update to this
-
BREAKING CHANGE: remove
ByteCursor#writeUse
writeU8FixedArrayinstead:const bc = new ByteCursor(buffer, config) bc.write(buffer) // Previously bare.writeU8FixedArray(bc, buffer) // Now
v0.1.1
-
Fix write offset when byteOffset > 0
A ByteCursor may be instantiated with an array of bytes such that
the array's byteOffset is greater than 0.
The previous ByteCursor.write implementation did not take care of adding this byteOffset to the ByteCursor's offset.The following code no longer fail:
const bytes = Uint8Array.of(42, 24).subarray(1) assert(bytes.byteOffset === 1) const bc = ByteCursor(bytes, ...) bc.write(Uint8Array.of(24)) assert.deepEqual(Array.from(bytes), [42, 24]) // Previously failed
-
Smaller CommonJS bundle
-
Improve byte-length computation of small string
v0.1.0
-
ByteCursorabstraction to read and write safely a buffer of bytes -
Enable to configure at runtime:
- initial buffer length
- maximum buffer length
- thresholds (string length) for switching from custom to native UTF-8 decoders/encoders
-
Decoders and encoders for basic types (bool, opaque data, floats, integers, typed arrays, UTF-8 string)