Changelog
All notable changes to the OffHeap project are documented here.
[0.4.0] - 2026-07-11
Added
- Reactive Lifecycle Hooks: Introduced
onEvict,onExpire, andonMisslifecycle hooks across LRU, ARC, and W-TinyLFU eviction policies with zero-allocation fast-paths when hooks are not configured. - Enriched Statistics System: Added
.stats()telemetry fields includingsets,deletes,evictions,expirations,hitRate, anduptimeMs. - Real-time Status Monitoring Engine: Added
.monitor(callback, intervalMs)to poll delta statistics and metrics rates (e.g. operations/second) in real-time, guarded by a hard safety floor of16ms. - Shard Imbalance Analysis: Exposes a per-shard statistics array and computes standard deviation of shard sizes (
sizeStdDev) to help developers locate hash collision or key distribution issues. - Memory RSS Telemetry: Exposes process RSS (
processRss) next to cached payload bytes (payloadBytes) to help developers distinguish between theoretical off-heap payload usage and actual native memory allocation footprints.
Fixed
- JS Wrapper Cache Isolation & Persistence: Configured
CacheManagerto cache initializedCachewrapper instances, preserving their custom settings (such as hooks or monitoring intervals) and L1 heap caches during subsequent retrieval.
[0.3.12] - 2026-07-09
Fixed
- CI/CD Publish (include generated loaders): Configured an explicit
"files"allowlist in the mainpackage.json. This ensures that the generatedbinding.jsandbinding.d.tsnative loader files are included in the published NPM package (previously they were excluded by NPM because they are listed in.gitignore), resolving runtime "Cannot find module './binding'" errors.
[0.3.11] - 2026-07-09
Fixed
- CI/CD Build (bootstrap resolution bypass): Configured all
npm cicalls inCI.ymlto omit optional dependencies during compile time using the--omit=optionalflag. This breaks the bootstrapping catch-22, preventing the build/publish pipelines from failing when trying to resolve the new scoped packages (which don't exist on the registry yet).
[0.3.10] - 2026-07-09
Fixed
- CI/CD Publish (correct NPM scope @onlykgzin): Corrected the scope of all platform-specific sub-packages to be published under the
@onlykgzin/scope (the actual owner's NPM username). This resolves theScope not foundpublication errors.
[0.3.9] - 2026-07-09
Fixed
- CI/CD Publish (NPM spam filter bypass): Configured all platform-specific sub-packages to be published under the
@ryangustav/scope (e.g.@ryangustav/offheap-win32-x64-msvc), while keeping the main wrapper package unscoped (offheap). This successfully bypasses NPM's automated spam detection and typosquatting protection algorithms, which were blocking publication of the Windows package.
[0.3.8] - 2026-07-09
Fixed
- CI/CD Build (package-lock.json version sync): Re-generated and synchronized
package-lock.jsonwith the latest version0.3.8and all 7 optional native binary platform dependencies. Previously,package-lock.jsonwas outdated at0.1.0, which causednpm cito fail immediately in the build job for all platforms due to locks/manifest mismatch.
[0.3.7] - 2026-07-09
Fixed
- CI/CD Publish (npm provenance validation): Configured the
"repository"URL block insidepackage.jsonand propagated it to all platform-specific sub-packages. This resolves theError verifying sigstore provenance bundle: Failed to validate repository informationerror when publishing to NPM with provenance enabled.
[0.3.6] - 2026-07-09
Fixed
- CI/CD Publish (npm local path & script execution):
- Prefixed local publication paths with
./(e.g../npm/*) inCI.ymlso thatnpm publishcorrectly recognizes them as local directories instead of attempting to fetch git ssh paths. - Added
--ignore-scriptsto the main package publication command. This prevents theprepublishOnlyscript hook from triggeringnapi prepublishinside CI, avoiding secondary target publication conflicts and registry E403 forbidden errors.
- Prefixed local publication paths with
[0.3.5] - 2026-07-09
Fixed
- CI/CD Publish (npm platform directories): Committed the
npm/platform directories (generated vianapi create-npm-dir) to the repository. These directories contain thepackage.jsonstubs withos,cpu, andmainfields that NAPI-RS requires to exist on disk beforenapi artifactscan copy.nodebinaries into them. Previously they were never committed to git, causingENOENTwrite failures in CI. - Removed redundant
PrepublishCI step: Thenapi prepublishcommand does not create directories — it only publishes existing ones. Removed the step from the publish job since it served no purpose without pre-existing directories.
[0.3.4] - 2026-07-09
Fixed
- CI/CD Publish (prepublish order): Swapped the order of the
PrepublishandCopy artifactssteps in the publish job inCI.yml. This ensures that the platform directories are scaffolded bynapi prepublishbeforenapi artifactsattempts to copy the.nodebinaries, preventingENOENTdirectory-missing errors.
[0.3.3] - 2026-07-09
Fixed
- CI/CD Publish (napi config): Reconfigured
"napi"block to usetriples.additionalinpackage.jsonso that the NAPI-RS CLI correctly maps all 7 target platforms, resolving theNo dist dir founderror during artifact packaging.
[0.3.2] - 2026-07-09
Fixed
- CI/CD Publish (napi artifacts): Added all 7 build targets to
optionalDependenciesinpackage.jsonto resolve theType Error: No dist dir founderror duringnapi artifactsexecution in the release job.
[0.3.1] - 2026-07-09
Fixed
- Alpine/Musl TLS Relocation: Enabled the
local_dynamic_tlsfeature flag on themimallocallocator crate. This resolves theinitial-exec TLS resolves to dynamic definitionruntime relocation error encountered on musl libc systems (like Alpine Linux) when Node.js dynamically loads (dlopen) the compiled Rust native library. - macOS Cross-Architecture Tests: Disabled native testing for the
x86_64-apple-darwintarget built on macOS host runners (which are now Apple Siliconarm64), preventing the loader mismatch error. - CI Release Pipeline: Updated the CI upload artifacts to include generated binding loader files (
binding.js,binding.d.ts) and configured the publish step to loop over and publish all platform-specific sub-packages innpm/*alongside the main package.
Added
- Postinstall Load Check: Added a diagnostic postinstall check in
scripts/postinstall.jsthat verifies native binary loading and fails with descriptive advice if platform binaries fail to install, while exiting cleanly during local development.
[0.3.0] - 2026-07-09
Added
- Process-wide Shared State: Moved the internal cache registry to a process-wide global static map in Rust (
GLOBAL_CACHES), enabling multiple Node.jsworker_threads(isolated V8 Isolates) to share and mutate the exact same underlying native L2 cache memory space directly without serialization/copying overhead. - Worker Threads Integration Tests: Added a multi-threaded concurrent stress test verifying thread-safety and shared memory access.
Fixed
- Finalization Registry Bug: Removed the JS-heap
FinalizationRegistryfrom theCacheclass wrapper, preventing the GC of a single thread's cache wrapper from destroying the cache contents for other threads. Memory is now cleanly managed by Rust standard reference counting (Arc). - CacheManager Memory Leak: Removed the global
activeManagerstracking set andprocess.on('exit')cleanup hooks, allowing unusedCacheManagerinstances to be garbage collected in Node.js.
[0.2.0] - 2026-07-09
- Version bump to release layout.
[0.1.0] - 2026-07-08
- Initial implementation of the caching framework in Rust with NAPI-RS.
- Support for Least Recently Used (LRU), Adaptive Replacement Cache (ARC), and Window TinyLFU (W-TinyLFU) eviction policies.
- High-performance sharded memory locks, serialization boundaries, and telemetry tracking.
