UNPKG

@visactor/vrender

Version:

```typescript import { xxx } from '@visactor/vrender'; ```

89 lines (77 loc) 3.62 kB
export const DEFAULT_SHARED_APP_KEY = "default"; const SHARED_APP_REGISTRY_KEY = Symbol.for("visactor.vrender.sharedAppRegistry"); function getSharedAppRegistry() { var _a; const target = globalThis, registry = null !== (_a = target[SHARED_APP_REGISTRY_KEY]) && void 0 !== _a ? _a : new Map; return target[SHARED_APP_REGISTRY_KEY] = registry, registry; } function getSharedAppEnvRegistry(env, create) { const registry = getSharedAppRegistry(), envRegistry = registry.get(env); if (envRegistry || !create) return envRegistry; const nextEnvRegistry = new Map; return registry.set(env, nextEnvRegistry), nextEnvRegistry; } function getOrCreateSharedAppEnvRegistry(env) { return getSharedAppEnvRegistry(env, !0); } function removeSharedAppRecord(env, key, record) { const registry = getSharedAppRegistry(), envRegistry = registry.get(env); (null == envRegistry ? void 0 : envRegistry.get(key)) === record && (envRegistry.delete(key), envRegistry.size || registry.delete(env)); } function releaseSharedAppRecord(env, key, record) { record.released || (record.released = !0, record.refCount = 0, removeSharedAppRecord(env, key, record), record.releaseApp()); } function createSharedAppRecord(env, key, options, createApp) { const app = createApp(options), originalRelease = app.release.bind(app), record = { app: app, refCount: 0, released: !1, releaseApp: originalRelease }; return app.release = () => releaseSharedAppRecord(env, key, record), record; } function createSharedAppHandle(registryEnv, handleEnv, key, record) { let released = !1; return { app: record.app, env: handleEnv, key: key, release() { if (released) return; released = !0; const envRegistry = getSharedAppEnvRegistry(registryEnv, !1); (null == envRegistry ? void 0 : envRegistry.get(key)) !== record || record.released || (record.refCount -= 1, record.refCount <= 0 && releaseSharedAppRecord(registryEnv, key, record)); } }; } export function acquireSharedApp(registryEnv, options, createApp, handleEnv = registryEnv) { var _a; const key = null !== (_a = options.key) && void 0 !== _a ? _a : "default", envRegistry = getOrCreateSharedAppEnvRegistry(registryEnv); let record = envRegistry.get(key); return (null == record ? void 0 : record.app.released) && (releaseSharedAppRecord(registryEnv, key, record), record = void 0), record || (record = createSharedAppRecord(registryEnv, key, options, createApp), envRegistry.set(key, record)), record.refCount += 1, createSharedAppHandle(registryEnv, handleEnv, key, record); } export function getSharedApp(env, key = "default") { var _a; const record = null === (_a = getSharedAppEnvRegistry(env, !1)) || void 0 === _a ? void 0 : _a.get(key); return !record || record.released || record.app.released ? null : record.app; } export function getAllSharedApps() { const apps = [], seen = new Set; return getSharedAppRegistry().forEach((envRegistry => { envRegistry.forEach((record => { record.released || record.app.released || seen.has(record.app) || (seen.add(record.app), apps.push(record.app)); })); })), apps; } export function releaseSharedApp(env, key = "default") { var _a; const record = null === (_a = getSharedAppEnvRegistry(env, !1)) || void 0 === _a ? void 0 : _a.get(key); record && releaseSharedAppRecord(env, key, record); } //# sourceMappingURL=shared-registry.js.map