aa-coordination-resource
Dominic Gannaway 8 months ago
parent 2fb4ea87c1
commit 3ea7924d03

@ -219,4 +219,4 @@ export { getContext, getAllContexts, hasContext, setContext } from './internal/c
export { hydrate, mount, unmount } from './internal/client/render.js';
export { tick, untrack } from './internal/client/runtime.js';
export { createRawSnippet } from './internal/client/dom/blocks/snippet.js';
export { Resource, getResource, deferPending } from './internal/client/reactivity/resources.js';
export { Resource, createResourceContext, deferPending } from './internal/client/reactivity/resources.js';

@ -24,25 +24,14 @@ export class Resource {
/**
* @param {() => Promise<T>} fn
* @param {symbol} [symbol]
*/
constructor(fn, symbol) {
constructor(fn) {
let parent = /** @type {Effect | null} */ (active_effect);
if (parent === null) {
throw new Error('TODO cannot create resources outside of an effect');
}
if (typeof symbol === 'symbol') {
let resources = getContext(resource_symbol);
if (resources === undefined) {
resources = new Map();
setContext(resource_symbol, resources);
}
resources.set(symbol, this);
}
/** @type {{}} */
var current_token;
@ -108,11 +97,30 @@ export class Resource {
/**
* @template T
* @param {symbol} symbol
* @returns {Resource<T> | null}
* @returns {[set_resource: (resource: Resource<T>) => void, get_resource: () => Resource<T>]}
*/
export function getResource(symbol) {
return getContext(resource_symbol)?.get(symbol) ?? null;
export function createResourceContext() {
const key = {};
const set_resource = (/** @type {Resource<T>} */ resource) => {
let resources = getContext(resource_symbol);
if (resources === undefined) {
resources = new Map();
setContext(resource_symbol, resources);
}
resources.set(key, resource);
};
const get_resource = () => {
var resource = getContext(resource_symbol)?.get(key);
if (resource === undefined) {
throw new Error('TODO: No resource found');
}
return resource;
};
return [set_resource, get_resource];
}
/**

@ -512,13 +512,13 @@ declare module 'svelte' {
* ```
* */
export function untrack<T>(fn: () => T): T;
export function getResource<T>(symbol: symbol): Resource<T> | null;
export function createResourceContext<T>(): [set_resource: (resource: Resource<T>) => void, get_resource: () => Resource<T>];
export function deferPending<T, V>(resources: Resource<T> | Resource<T>[], fn: () => V): V;
export class Resource<T> {
constructor(fn: () => Promise<T>, symbol?: symbol | undefined);
constructor(fn: () => Promise<T>);
get pending(): boolean;
get current(): T;

Loading…
Cancel
Save