add resource

aa-coordination-resource
Dominic Gannaway 8 months ago
parent ba5d219a53
commit c6e0351267

@ -24,7 +24,6 @@ export const EFFECT_PRESERVED = 1 << 21; // effects with this flag should not be
// Flags used for async // Flags used for async
export const REACTION_IS_UPDATING = 1 << 22; export const REACTION_IS_UPDATING = 1 << 22;
export const BOUNDARY_SUSPENDED = 1 << 23; export const BOUNDARY_SUSPENDED = 1 << 23;
export const IS_PENDING = 1 << 24;
export const STATE_SYMBOL = Symbol('$state'); export const STATE_SYMBOL = Symbol('$state');
export const STATE_SYMBOL_METADATA = Symbol('$state metadata'); export const STATE_SYMBOL_METADATA = Symbol('$state metadata');

@ -1,11 +1,11 @@
/** @import { Derived, Effect, Source } from '#client' */ /** @import { Derived, Effect, Source } from '#client' */
import { UNINITIALIZED } from '../../../constants'; import { UNINITIALIZED } from '../../../constants.js';
import { EFFECT_PRESERVED, IS_PENDING } from '../constants'; import { EFFECT_PRESERVED } from '../constants.js';
import { active_effect, captured_signals, get, handle_error } from '../runtime'; import { active_effect, get, handle_error } from '../runtime.js';
import { derived } from './deriveds'; import { derived } from './deriveds.js';
import { block } from './effects'; import { block } from './effects.js';
import { internal_set, source } from './sources'; import { internal_set, source } from './sources.js';
/** /**
* @template T * @template T
@ -29,23 +29,18 @@ export class Resource {
/** @type {{}} */ /** @type {{}} */
var current_token; var current_token;
this.#current.f ^= IS_PENDING;
this.#fn = derived(() => Promise.resolve(fn())); this.#fn = derived(() => Promise.resolve(fn()));
block(() => { block(() => {
var current = this.#current;
if ((current.f & IS_PENDING) === 0) {
current.f ^= IS_PENDING;
}
var token = (current_token = {}); var token = (current_token = {});
internal_set(this.#pending, true); internal_set(this.#pending, true);
get(this.#fn).then( get(this.#fn)
.then(
(value) => { (value) => {
if (current_token !== token) return; if (current_token !== token) return;
internal_set(this.#current, value); internal_set(this.#current, value);
internal_set(this.#pending, false); internal_set(this.#pending, false);
this.#current.f ^= IS_PENDING;
return value; return value;
}, },
(error) => { (error) => {
@ -53,7 +48,8 @@ export class Resource {
internal_set(this.#pending, false); internal_set(this.#pending, false);
throw error; throw error;
} }
).catch((e) => { )
.catch((e) => {
handle_error(e, parent, null, parent.ctx); handle_error(e, parent, null, parent.ctx);
}); });
}, EFFECT_PRESERVED); }, EFFECT_PRESERVED);
@ -66,10 +62,6 @@ export class Resource {
get current() { get current() {
var value = get(this.#current); var value = get(this.#current);
if (captured_signals !== null) {
get(this.#fn);
}
if (value === UNINITIALIZED) { if (value === UNINITIALIZED) {
return this.#fn.v; return this.#fn.v;
} }
@ -78,12 +70,10 @@ export class Resource {
} }
get latest() { get latest() {
var current = this.#current;
var value = get(current);
var promise = get(this.#fn); var promise = get(this.#fn);
if ((current.f & IS_PENDING) === 0) { if (!this.#pending.v) {
return value; return this.#current.v;
} }
return promise; return promise;

Loading…
Cancel
Save