pubsub = {
const target = new EventTarget(),
teardown = p => (!p ? invalidation : Promise.race([invalidation, p])),
subscribe = (name, handler, invalidated) => {
target.addEventListener(name, handler);
teardown(invalidated).then(() => target.removeEventListener(name, handler));
},
unsubscribe = (name, handler) => {
target.removeEventListener(name, handler);
},
publish = (name, data) => {
target.dispatchEvent(new CustomEvent(name, { detail: data }));
};
return { subscribe, unsubscribe, publish };
}