80 lines
2.3 KiB
TypeScript
80 lines
2.3 KiB
TypeScript
/**
|
|
* Global state key registry for Majoor Assets Manager.
|
|
*
|
|
* This module is now a **thin shim** over the Pinia store
|
|
* `useRuntimeStore` (ui/stores/useRuntimeStore.js).
|
|
*
|
|
* When Pinia is active (Vue mounted), reads and writes are forwarded to the
|
|
* reactive store. Before Pinia is ready (early bootstrap), the legacy
|
|
* Symbol-keyed globalThis fallback is used so the extension never crashes.
|
|
*
|
|
* Consumers do NOT need to change their imports — this file keeps the same
|
|
* public API: getRuntimeState, setRuntimeStatePatch, setEnrichmentState,
|
|
* getEnrichmentState.
|
|
*/
|
|
|
|
export {
|
|
getRuntimeEnrichmentState as getEnrichmentState,
|
|
setRuntimeEnrichmentState as setEnrichmentState,
|
|
} from "../stores/runtimeEnrichmentState.js";
|
|
|
|
const RUNTIME_STATE_KEY = Symbol.for("majoor.assets_manager.runtime_state");
|
|
|
|
export interface RuntimeState {
|
|
api: unknown;
|
|
assetsDeletedHandler: unknown;
|
|
enrichmentActive: boolean;
|
|
enrichmentQueueLength: number;
|
|
[key: string]: unknown;
|
|
}
|
|
|
|
type RuntimeRoot = typeof globalThis & {
|
|
[RUNTIME_STATE_KEY]?: RuntimeState;
|
|
};
|
|
|
|
function createDefaultRuntimeState(): RuntimeState {
|
|
return {
|
|
api: null,
|
|
assetsDeletedHandler: null,
|
|
enrichmentActive: false,
|
|
enrichmentQueueLength: 0,
|
|
};
|
|
}
|
|
|
|
function _runtimeRoot(): RuntimeRoot {
|
|
try {
|
|
return typeof globalThis !== "undefined" ? globalThis : ({} as RuntimeRoot);
|
|
} catch {
|
|
return {} as RuntimeRoot;
|
|
}
|
|
}
|
|
|
|
export function getRuntimeState(): RuntimeState {
|
|
const root = _runtimeRoot();
|
|
try {
|
|
if (!root[RUNTIME_STATE_KEY] || typeof root[RUNTIME_STATE_KEY] !== "object") {
|
|
root[RUNTIME_STATE_KEY] = createDefaultRuntimeState();
|
|
}
|
|
return root[RUNTIME_STATE_KEY];
|
|
} catch {
|
|
return createDefaultRuntimeState();
|
|
}
|
|
}
|
|
|
|
const _BLOCKED_KEYS = new Set(["__proto__", "constructor", "prototype"]);
|
|
|
|
export function setRuntimeStatePatch(patch: Record<string, any> = {}): RuntimeState {
|
|
const state = getRuntimeState();
|
|
try {
|
|
const safePatch = patch || {};
|
|
for (const key of Object.keys(safePatch)) {
|
|
if (!_BLOCKED_KEYS.has(key)) {
|
|
state[key] = safePatch[key];
|
|
}
|
|
}
|
|
} catch (e) {
|
|
console.debug?.(e);
|
|
}
|
|
return state;
|
|
}
|