function synchronize(channel, input) {
function receive(event) {
if (event.data.type === "hello") {
send(event);
} else if (event.data.name === input.name && input.value !== event.data.value) {
input.value = event.data.value;
input.dispatchEvent(new CustomEvent("input"));
}
}
function send(event) {
if (!event.isTrusted) return;
channel.postMessage({name: input.name, value: input.value});
}
input.addEventListener("input", send);
channel.addEventListener("message", receive);
channel.postMessage({type: "hello"});
return Generators.disposable(input, () => {
input.removeEventListener("input", send);
channel.removeEventListener("message", receive);
});
}