Incremental commit

This commit is contained in:
G.Ambatte
2026-10-10 15:54:59 +13:00
parent 5a0b9d8aae
commit a51231535c
2 changed files with 27 additions and 13 deletions
+1 -1
View File
@@ -203,7 +203,7 @@ export default async function createApp(vite) {
'Content-Encoding' : 'none' 'Content-Encoding' : 'none'
}); });
; ;
Stream.subscribe(res); Stream.subscribe(req.params.id, res);
}); });
+26 -12
View File
@@ -12,21 +12,27 @@ let subscribers = [];
const debounceUnsub = _.debounce((id)=>{ unsubscribe(id); }, UNSUB_DELAY, { leading: false, trailing: true }); const debounceUnsub = _.debounce((id)=>{ unsubscribe(id); }, UNSUB_DELAY, { leading: false, trailing: true });
// Listener functions // Listener functions
const subscribe = function(res){ const subscribe = function(shareId, res){
const id = nanoid(); const subscriber = {
subscribers.push({ id, 'stream': res }); id : nanoid(), // NanoID is assumed globally unique
shareId,
stream : res,
time : new Date
};
res.write(`event: subscribe\ndata: { id: ${id} }\n\n`); subscribers.push(subscriber);
debounceUnsub(id); Stream.emit('sendUpdate', 'subscribe', { id: subscriber.id, shareId: subscriber.shareId, time: subscriber.time });
return id;
debounceUnsub(subscriber.id);
return subscriber.id;
}; };
const unsubscribe = function(id){ const unsubscribe = function(id){
subscribers subscribers
.filter((sub)=>{return sub.id == id;}) .filter((sub)=>{return sub.id == id;})
.forEach((sub)=>{ .forEach((sub)=>{
sub.stream.write(`event: unsubscribe\ndata: { id: ${id} }\n\n`); Stream.emit('sendUpdate', 'unsubscribe', { id: sub.id, shareId: sub.shareId, time: new Date });
}); });
subscribers = subscribers.filter((sub)=>{ return sub.id != id; }); subscribers = subscribers.filter((sub)=>{ return sub.id != id; });
@@ -35,14 +41,22 @@ const unsubscribe = function(id){
// Create global sendUpdate listener // Create global sendUpdate listener
Stream.on('sendUpdate', (event, data)=>{ Stream.on('sendUpdate', (event, data)=>{
console.log('Event:', event, '\nData:', data); console.log('Event:', event, '\nData:', data);
subscribers.forEach((sub)=>{ subscribers
sub?.stream?.write(`event: ${event}\ndata: ${JSON.stringify(data)}\n\n`); .filter((sub)=>{return data.shareId == sub.shareId; })
.forEach((sub)=>{
sub?.stream?.write(`event: ${event}\ndata: ${JSON.stringify(data)}\n\n`);
// invoke debounced unsub to delay execution // invoke debounced unsub to delay execution
debounceUnsub(sub.id); debounceUnsub(sub.id);
}); });
}); });
// DEBUG: Report subscriber count periodically
const REPORT_DELAY = 1000; //ms
const reportIntervalId = setInterval(()=>{
console.log('Subscriber count:', subscribers.length);
}, REPORT_DELAY);
export default { export default {
emit : function(event) {return Stream.emit(event, ...([...arguments].slice(1)));}, // Arguments doesn't work for arrow functions emit : function(event) {return Stream.emit(event, ...([...arguments].slice(1)));}, // Arguments doesn't work for arrow functions
on : (event, listener)=>{return Stream.on(event, listener);}, on : (event, listener)=>{return Stream.on(event, listener);},