fix never-expiring cache entries

pull/17124/head
Elliott Johnson 2 weeks ago
parent 6873685b2f
commit 8939bbfbc2

@ -1,7 +1,7 @@
import { BaseCacheObserver } from '../../shared/cache-observer.js';
import { ObservableCache } from '../../shared/observable-cache.js';
import { tick } from '../runtime.js';
import { render_effect } from './effects.js';
import { get_effect_validation_error_code, render_effect } from './effects.js';
/** @typedef {{ count: number, item: any }} Entry */
/** @type {ObservableCache} */
@ -18,8 +18,8 @@ export function cache(key, fn) {
const entry = client_cache.get(key);
const maybe_remove = create_remover(key);
let tracking = true;
try {
const tracking = get_effect_validation_error_code() === null;
if (tracking) {
render_effect(() => {
if (entry) entry.count++;
return () => {
@ -29,8 +29,6 @@ export function cache(key, fn) {
maybe_remove(entry);
};
});
} catch {
tracking = false;
}
if (cached) {

@ -48,17 +48,28 @@ import { without_reactive_context } from '../dom/elements/bindings/shared.js';
* @param {'$effect' | '$effect.pre' | '$inspect'} rune
*/
export function validate_effect(rune) {
const code = get_effect_validation_error_code();
if (code === null) return;
e[code](rune);
}
/**
* @returns {'effect_orphan' | 'effect_in_unowned_derived' | 'effect_in_teardown' | null}
*/
export function get_effect_validation_error_code() {
if (active_effect === null && active_reaction === null) {
e.effect_orphan(rune);
return 'effect_orphan';
}
if (active_reaction !== null && (active_reaction.f & UNOWNED) !== 0 && active_effect === null) {
e.effect_in_unowned_derived();
return 'effect_in_unowned_derived';
}
if (is_destroying_effect) {
e.effect_in_teardown(rune);
return 'effect_in_teardown';
}
return null;
}
/**

Loading…
Cancel
Save