async function* messagesFromEditSocket(token, form, cancel) {
const gen = Generators.queue(notify => {
const {id, version} = form;
const socket = new WebSocket(`wss://ws.observablehq.com/document/${id}/edit`);
console.log(socket);
const msgHistory = [];
const object = {socket, msgHistory};
socket.onopen = () => {
console.log('read socket opened');
socket.send(`{"type":"hello","token":"${token}","version":${version}}`);
notify(object);
};
socket.onmessage = (m) => {
console.log(m);
const parsed = JSON.parse(m.data);
if (parsed.type !== 'pong') {
msgHistory.push(parsed);
notify(object);
}
else console.log('received pong', m);
}
socket.onerror = (e) => notify(Promise.reject(new Error("socket error", e)));
const ping = () => {
socket.send('{"type":"ping"}');
console.log('sent ping');
};
const pingInterval = setInterval(ping, 40000);
cancel.then(() => socket.close());
socket.onclose = () => {
console.log('read socket closed');
clearInterval(pingInterval);
notify(object);
};
return () => socket.close();
});
for await (const obj of gen) {
yield obj;
}
}