Shit to res.close listener

This commit is contained in:
G.Ambatte
2026-10-12 21:35:21 +13:00
parent 195f18659d
commit 1bd64b397f
3 changed files with 27 additions and 47 deletions
+16 -26
View File
@@ -54,39 +54,29 @@ const SharePage = (props)=>{
document.addEventListener('keydown', handleControlKeys); document.addEventListener('keydown', handleControlKeys);
fetchThemeBundle(undefined, setThemeBundle, currentBrew.renderer, currentBrew.theme); fetchThemeBundle(undefined, setThemeBundle, currentBrew.renderer, currentBrew.theme);
// generate unique fingerprint let eventSource;
const clientFingerprint = nanoid(24); // Start a stream if the brew has been updated in the last month
if(Date.parse(props.brew?.updatedAt) > (new Date).setDate((new Date).getDate() - 30)){
// listen for changes in the brew version
eventSource = new EventSource(`/api/stream/${props.brew.shareId}`);
// listen for changes in the brew version eventSource.addEventListener('brewUpdated', (evt)=>{
const eventSource = new EventSource(`/api/stream/${props.brew.shareId}?client=${clientFingerprint}`); const messageData = JSON.parse(evt.data);
let subId = ''; if(messageData.version != currentBrew.version) {
eventSource.addEventListener('subscribe', (evt)=>{ console.log('should fetch brew');
const messageData = JSON.parse(evt.data); fetchUpdatedBrew();
}
});
}
if(messageData.client == clientFingerprint){ function unsub(){
subId = messageData.id; eventSource?.close();
}
});
eventSource.addEventListener('brewUpdated', (evt)=>{
const messageData = JSON.parse(evt.data);
if(messageData.version != currentBrew.version) {
console.log('should fetch brew');
fetchUpdatedBrew();
}
});
async function unsub(){
await request.get(`/api/stream/unsubscribe/${subId}`);
}; };
window.addEventListener('beforeunload', unsub);
return async ()=>{ return async ()=>{
document.removeEventListener('keydown', handleControlKeys); document.removeEventListener('keydown', handleControlKeys);
window.removeEventListener('beforeunload', unsub); unsub();
eventSource.close();
}; };
}, []); }, []);
+6 -15
View File
@@ -11,9 +11,7 @@ const DEBUG = {
}; };
// Delays // Delays
const UNSUB_DELAY = 60 * 1000; //ms const REPORT_DELAY = config.get('REPORT_DELAY') || 30 * 60 * 1000; //ms
const REFRESH_DELAY = 60 * 1000; //ms
const REPORT_DELAY = 5 * 1000; //ms
const Stream = new EventEmitter; const Stream = new EventEmitter;
@@ -22,19 +20,17 @@ const Stream = new EventEmitter;
let subscribers = []; let subscribers = [];
// Listener functions // Listener functions
const subscribe = function(shareId, res, clientFingerprint){ const subscribe = function(shareId, res){
const id = nanoid(24); // NanoID is assumed globally unique; const id = nanoid(24); // NanoID is assumed globally unique;
const subscriber = { const subscriber = {
id, id,
shareId, shareId,
stream : res, stream : res
time : new Date,
unsubTimer : setTimeout(()=>{ unsubscribe(id); }, UNSUB_DELAY)
}; };
subscribers.push(subscriber); subscribers.push(subscriber);
Stream.emit('sendUpdate', 'subscribe', { id: subscriber.id, shareId: subscriber.shareId, client: clientFingerprint, time: subscriber.time }); Stream.emit('sendUpdate', 'subscribe', { id: subscriber.id, shareId: subscriber.shareId });
return subscriber.id; return subscriber.id;
}; };
@@ -44,7 +40,8 @@ const unsubscribe = function(id){
.filter((sub)=>{return sub.id == id;}) .filter((sub)=>{return sub.id == id;})
.forEach((sub)=>{ .forEach((sub)=>{
clearTimeout(sub.unsubTimer); clearTimeout(sub.unsubTimer);
Stream.emit('sendUpdate', 'unsubscribe', { id: sub.id, shareId: sub.shareId, time: new Date }); Stream.emit('sendUpdate', 'unsubscribe', { id: sub.id, shareId: sub.shareId });
sub?.stream?.status(200).end();
}); });
subscribers = subscribers.filter((sub)=>{ return sub.id != id; }); subscribers = subscribers.filter((sub)=>{ return sub.id != id; });
@@ -59,12 +56,6 @@ Stream.on('sendUpdate', (event, data)=>{
return data.shareId == sub.shareId; return data.shareId == sub.shareId;
}) })
.forEach((sub)=>{ .forEach((sub)=>{
if(event == 'brewUpdated'){
// Reset the unsubscription timer
clearTimeout(sub.unsubTimer);
sub.unsubTimer = setTimeout(()=>{ unsubscribe(sub.id); }, REFRESH_DELAY);
}
sub?.stream?.write(`event: ${event}\ndata: ${JSON.stringify(data)}\n\n`); sub?.stream?.write(`event: ${event}\ndata: ${JSON.stringify(data)}\n\n`);
}); });
}); });
+5 -6
View File
@@ -12,13 +12,12 @@ app.get('/api/stream/:id', (req, res)=>{
'Connection' : 'keep-alive', 'Connection' : 'keep-alive',
'Content-Encoding' : 'none' 'Content-Encoding' : 'none'
}); });
;
Stream.subscribe(req.params.id, res, req.query?.client);
});
app.get('/api/stream/unsubscribe/:id', (req, res)=>{ const subId = Stream.subscribe(req.params.id, res);
Stream.unsubscribe(req.params?.id);
res.status(200).send(); res.on('close', ()=>{
Stream.unsubscribe(subId);
});
}); });
export default app; export default app;