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 { hydrate, mount, unmount } from './internal/client/render.js';
export { tick, untrack } from './internal/client/runtime.js'; export { tick, untrack } from './internal/client/runtime.js';
export { createRawSnippet } from './internal/client/dom/blocks/snippet.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 {() => Promise<T>} fn
* @param {symbol} [symbol]
*/ */
constructor(fn, symbol) { constructor(fn) {
let parent = /** @type {Effect | null} */ (active_effect); let parent = /** @type {Effect | null} */ (active_effect);
if (parent === null) { if (parent === null) {
throw new Error('TODO cannot create resources outside of an effect'); 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 {{}} */ /** @type {{}} */
var current_token; var current_token;
@ -108,11 +97,30 @@ export class Resource {
/** /**
* @template T * @template T
* @param {symbol} symbol * @returns {[set_resource: (resource: Resource<T>) => void, get_resource: () => Resource<T>]}
* @returns {Resource<T> | null}
*/ */
export function getResource(symbol) { export function createResourceContext() {
return getContext(resource_symbol)?.get(symbol) ?? null; 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 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 function deferPending<T, V>(resources: Resource<T> | Resource<T>[], fn: () => V): V;
export class Resource<T> { export class Resource<T> {
constructor(fn: () => Promise<T>, symbol?: symbol | undefined); constructor(fn: () => Promise<T>);
get pending(): boolean; get pending(): boolean;
get current(): T; get current(): T;

Loading…
Cancel
Save