Fixes variants:finding:cut-ts-store-write.s2.changelog-csharp-any-write-overclaim: a C# conditional commit on a clean store lands onto the current file; other C# writes can still overwrite concurrent TypeScript records. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1.6 KiB
1.6 KiB
Changelog
All notable changes to @gamecult/cultcache-ts are recorded here, following
Keep a Changelog.
[0.14.2]
Added
SingleFileMessagePackBackingStoretakes a cross-process write lock on<file>.lock, interoperable with the C# and Rust runtimes (flockon Unix,LockFileExon Windows).pushanddeleteread the current file, merge and replace it under the lock, so concurrent TypeScript and Rust writers no longer lose each other's records across those calls. A fullpushAllstill replaces the whole store, so records a concurrent writer added are lost to it. C# writes are not all alike: a conditional commit on a clean store lands onto the file as it is, but C# writers can still overwrite records a concurrent TypeScript writer added.- The staged file is fsynced before the replace, and on Unix the directory after it. A directory sync failure after the replace is reported as replaced but not durable.
Changed
- The Windows replace is a POSIX-semantics rename first (it lands while C# and Rust readers
hold the store open), falling back to a write-through
MoveFileExW, with 25 attempts 20 ms apart on errors 5, 32 and 33. Writers wait up to 30 s for the lock. - Opening a legacy store that needs healing rewrites it under the lock, from a read taken under the lock.
Dependencies
koffi3.3.0, loaded only on the first write.
[0.14.1]
Added
checkPayloadDepthis re-exported from@gamecult/cultcache-ts/document, so dependents (cultnet-ts/content) bound payload nesting with the same check the cache applies on decode.