@visactor/vrender
Version:
```typescript import { xxx } from '@visactor/vrender'; ```
89 lines (77 loc) • 3.62 kB
JavaScript
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