feat(core): resource cache phase 3 — cacheTime single-runtime eviction#127
Merged
Conversation
Fix 1 — in-flight promise after inactive eviction must not mutate detached entries. Add ownership check (entries.get(key) !== entry) before applying success/failure results, calling staleNotify(), or starting staleTime/cacheTime timers. Fix 2 — switching active key to an already in-flight entry must sync public state (syncFromEntry) before dedupe early return. Previously the dedupe path returned the in-flight promise without updating currentStatus/currentValue/currentError, leaving public getters showing the previous key's state. Add tests: - detached promise resolution does not notify subscribers - detached promise resolution does not start timers - switching to in-flight key syncs state before dedupe return
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Implements Phase 3 of the resource cache proposal: single-runtime
cacheTimefor@intent-framework/core. After an entry becomes stale, the cached value is retained forcacheTimemilliseconds before eviction, giving consumers a grace window to use stale data.API Added
cache.cacheTime?: numberonResourceCacheOptions— eviction delay in ms after stalenessBehavior
cacheTimetimer starts when an entry becomes stale (frominvalidate(), action invalidation, orstaleTimeexpiry)entries.delete(key)silently — no subscriber notificationexecuteLoadclears the cacheTime timer at start (even before deduplicate check) and on successcacheTime: 0schedules eviction on next event loop tick viasetTimeout(fn, 0)Follow-Up Runtime Fixes (35642f1)
Scope Limitations
ResourceNode, within a singleScreenRuntimeInMemoryResourceCacheor dependency-tracked keysFiles Changed
packages/core/src/resource.tscacheTimetype,cacheTimeron Entry, helpers, invalidation/load/disposepackages/core/src/core.test.tsdocs/Resources.mddocs/proposals/Resource-Cache-And-Stale-Semantics.md.changeset/nine-snails-walk.mdValidation
pnpm test— all 232 core tests passpnpm typecheckpnpm buildpnpm lintpnpm pack:checkpnpm changeset status