repond-events
Version:
events for repond
79 lines (78 loc) • 3.4 kB
JavaScript
import { getItemIds, getState, setState, whenSettingStates } from "repond";
import { repondEventsMeta } from "./meta";
export function setVariable(name, value, scope = "global", options = {}) {
const { isFast } = options;
let scopeIsChain = false;
let scopeIsFastChain = false;
if (!isFast) {
// Non-fast case
const chainIds = getItemIds("chains");
if (scope !== "global" && chainIds.includes(scope)) {
// Scope is a chain
scopeIsChain = true;
// Save to chain's variablesByName in state
whenSettingStates(() => {
const variablesByName = getState("chains", scope)?.variablesByName || {};
setState(`chains.variablesByName`, { ...variablesByName, [name]: value }, scope);
});
}
}
else {
// Fast case
if (scope !== "global" && scope in repondEventsMeta.fastChain.nowFastChainsInfoMap) {
// Scope is a fast chain
scopeIsFastChain = true;
// Save to chain's variablesMap in meta
repondEventsMeta.fastChain.nowFastChainsInfoMap[scope].variablesMap[name] = value;
}
}
if (!scopeIsChain && !scopeIsFastChain) {
// Save to variablesByScopesMap[scope] in meta
if (!repondEventsMeta.variablesByScopesMap[scope]) {
repondEventsMeta.variablesByScopesMap[scope] = {};
}
const variablesForScope = repondEventsMeta.variablesByScopesMap[scope];
variablesForScope[name] = value;
}
}
function findVariableInScope(name, scope = "global", startIsFast = false) {
let foundVariable = undefined;
if (scope !== "global") {
if (startIsFast) {
// Search in the fast chains' meta
let fastChainId = scope;
while (fastChainId) {
const fastChainInfo = repondEventsMeta.fastChain.nowFastChainsInfoMap[fastChainId];
if (fastChainInfo && fastChainInfo.variablesMap && name in fastChainInfo.variablesMap) {
foundVariable = fastChainInfo.variablesMap[name];
break;
}
fastChainId = fastChainInfo ? fastChainInfo.parentFastChainId : null;
}
}
// continue searching in non-fast chains, or start from the root non-fast chain
const rootNonFastChainId = startIsFast ? repondEventsMeta.fastChain.nowRootFastChainParentId : null;
// Search in the chain's state
let chainId = rootNonFastChainId ?? scope;
while (chainId) {
const chainState = getState("chains", chainId);
if (chainState && chainState.variablesByName && name in chainState.variablesByName) {
foundVariable = chainState.variablesByName[name];
break;
}
chainId = chainState ? chainState.parentChainId : null;
}
}
if (foundVariable === undefined) {
// Search in named scopes, defaulting to global
const foundScopeMap = repondEventsMeta.variablesByScopesMap[scope];
if (foundScopeMap && name in foundScopeMap) {
foundVariable = foundScopeMap[name];
}
}
return foundVariable;
}
export function getVariable(name, scope = "global", options = {}) {
const { isFast } = options;
return findVariableInScope(name, scope, isFast);
}