async-states
Version:
Core of async-states
61 lines (58 loc) • 1.83 kB
JavaScript
import { isFunction, __DEV__ } from '../utils.js';
import devtools from '../devtools/Devtools.js';
function subscribeToInstance(instance, options) {
let props = isFunction(options) ? { cb: options } : options;
if (!isFunction(props.cb)) {
return;
}
if (!instance.subsIndex) {
instance.subsIndex = 0;
}
if (!instance.subscriptions) {
instance.subscriptions = {};
}
instance.subsIndex += 1;
let subscriptionKey = props.key;
if (subscriptionKey === undefined) {
subscriptionKey = `$${instance.subsIndex}`;
}
function cleanup() {
delete instance.subscriptions[subscriptionKey];
if (__DEV__)
devtools.emitUnsub(instance, subscriptionKey);
if (instance.config.resetStateOnDispose) {
instance.actions.dispose();
}
}
instance.subscriptions[subscriptionKey] = { props, cleanup };
if (__DEV__)
devtools.emitSub(instance, subscriptionKey);
return cleanup;
}
function subscribeToInstanceEvent(instance, eventType, eventHandler) {
if (!instance.events) {
instance.events = {};
}
if (!instance.events[eventType]) {
instance.events[eventType] = {};
}
let events = instance.events[eventType];
if (!instance.eventsIndex) {
instance.eventsIndex = 0;
}
let index = ++instance.eventsIndex;
events[index] = eventHandler;
return function () {
delete events[index];
};
}
function notifySubscribers(instance) {
if (!instance.subscriptions) {
return;
}
Object.values(instance.subscriptions).forEach((subscription) => {
subscription.props.cb(instance.state);
});
}
export { notifySubscribers, subscribeToInstance, subscribeToInstanceEvent };
//# sourceMappingURL=StateSubscription.js.map