Skip to main content
Glama
createSharedComposable.ts1.14 kB
import { type EffectScope, effectScope } from 'vue'; type AnyFn = (...args: any[]) => any; export type SharedComposableReturn<T extends AnyFn = AnyFn> = T; import { getCurrentScope, onScopeDispose } from 'vue'; /** * Call onScopeDispose() if it's inside an effect scope lifecycle, if not, do nothing * */ export const tryOnScopeDispose = (fn: () => void) => { if (getCurrentScope()) { onScopeDispose(fn); return true; } return false; }; /** * Make a composable function usable with multiple Vue instances. */ export const createSharedComposable = <Fn extends AnyFn>( composable: Fn ): SharedComposableReturn<Fn> => { let subscribers = 0; let state: ReturnType<Fn> | undefined; let scope: EffectScope | undefined; const dispose = () => { subscribers -= 1; if (scope && subscribers <= 0) { scope.stop(); state = undefined; scope = undefined; } }; return <Fn>((...args) => { subscribers += 1; if (!scope) { scope = effectScope(true); state = scope.run(() => composable(...args)); } tryOnScopeDispose(dispose); return state; }); };

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/aymericzip/intlayer'

If you have feedback or need assistance with the MCP directory API, please join our Discord server