diff --git a/packages/svelte/src/index-client.js b/packages/svelte/src/index-client.js index ba1e2d3501..ef6a24074c 100644 --- a/packages/svelte/src/index-client.js +++ b/packages/svelte/src/index-client.js @@ -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'; diff --git a/packages/svelte/src/internal/client/reactivity/resources.js b/packages/svelte/src/internal/client/reactivity/resources.js index 74f4258e31..4092e723c1 100644 --- a/packages/svelte/src/internal/client/reactivity/resources.js +++ b/packages/svelte/src/internal/client/reactivity/resources.js @@ -24,25 +24,14 @@ export class Resource { /** * @param {() => Promise} 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 | null} + * @returns {[set_resource: (resource: Resource) => void, get_resource: () => Resource]} */ -export function getResource(symbol) { - return getContext(resource_symbol)?.get(symbol) ?? null; +export function createResourceContext() { + const key = {}; + + const set_resource = (/** @type {Resource} */ 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]; } /** diff --git a/packages/svelte/types/index.d.ts b/packages/svelte/types/index.d.ts index 8e36693855..c4230a5110 100644 --- a/packages/svelte/types/index.d.ts +++ b/packages/svelte/types/index.d.ts @@ -512,13 +512,13 @@ declare module 'svelte' { * ``` * */ export function untrack(fn: () => T): T; - export function getResource(symbol: symbol): Resource | null; + export function createResourceContext(): [set_resource: (resource: Resource) => void, get_resource: () => Resource]; export function deferPending(resources: Resource | Resource[], fn: () => V): V; export class Resource { - constructor(fn: () => Promise, symbol?: symbol | undefined); + constructor(fn: () => Promise); get pending(): boolean; get current(): T;