mirror of
https://github.com/naturalcrit/homebrewery.git
synced 2026-09-23 22:43:56 +00:00
Merge pull request #4034 from G-Ambatte/experimentalEventStreamEmitter
Experimental event stream emitter
This commit is contained in:
@@ -1,6 +1,5 @@
|
|||||||
import 'core-js/es/string/to-well-formed.js'; // Polyfill for older browsers
|
import 'core-js/es/string/to-well-formed.js'; // Polyfill for older browsers
|
||||||
import './homebrew.less';
|
import './homebrew.less';
|
||||||
import React from 'react';
|
|
||||||
import { BrowserRouter as Router, Routes, Route, useParams, useSearchParams } from 'react-router';
|
import { BrowserRouter as Router, Routes, Route, useParams, useSearchParams } from 'react-router';
|
||||||
|
|
||||||
import { updateLocalStorage } from './utils/updateLocalStorage/updateLocalStorageKeys.js';
|
import { updateLocalStorage } from './utils/updateLocalStorage/updateLocalStorageKeys.js';
|
||||||
|
|||||||
@@ -39,6 +39,18 @@ const SharePage = (props)=>{
|
|||||||
document.addEventListener('keydown', handleControlKeys);
|
document.addEventListener('keydown', handleControlKeys);
|
||||||
fetchThemeBundle(undefined, setThemeBundle, brew.renderer, brew.theme);
|
fetchThemeBundle(undefined, setThemeBundle, brew.renderer, brew.theme);
|
||||||
|
|
||||||
|
// listen for changes in the brew version
|
||||||
|
const eventSource = new EventSource('/stream');
|
||||||
|
eventSource.addEventListener('message', (evt)=>{
|
||||||
|
const messageData = JSON.parse(evt.data);
|
||||||
|
|
||||||
|
if(messageData.eventType == 'brewUpdated'){
|
||||||
|
if(messageData.shareId == brew.shareId && messageData.version != brew.version) {
|
||||||
|
console.log(`brew has been updated, viewing ${brew.version}, new version is ${messageData.version}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return ()=>{
|
return ()=>{
|
||||||
document.removeEventListener('keydown', handleControlKeys);
|
document.removeEventListener('keydown', handleControlKeys);
|
||||||
};
|
};
|
||||||
|
|||||||
+26
-3
@@ -1,4 +1,4 @@
|
|||||||
/*eslint max-lines: ["warn", {"max": 500, "skipBlankLines": true, "skipComments": true}]*/
|
/*eslint max-lines: ["warn", {"max": 400, "skipBlankLines": true, "skipComments": true}]*/
|
||||||
// Set working directory to project root
|
// Set working directory to project root
|
||||||
import { dirname } from 'path';
|
import { dirname } from 'path';
|
||||||
import { fileURLToPath } from 'url';
|
import { fileURLToPath } from 'url';
|
||||||
@@ -30,6 +30,8 @@ import contentNegotiation from './middleware/content-negotiation.js';
|
|||||||
import bodyParser from 'body-parser';
|
import bodyParser from 'body-parser';
|
||||||
import cookieParser from 'cookie-parser';
|
import cookieParser from 'cookie-parser';
|
||||||
import forceSSL from './forcessl.mw.js';
|
import forceSSL from './forcessl.mw.js';
|
||||||
|
|
||||||
|
import Stream from './eventStreamSource.js';
|
||||||
import dbCheck from './middleware/dbCheck.js';
|
import dbCheck from './middleware/dbCheck.js';
|
||||||
|
|
||||||
import cors from 'cors';
|
import cors from 'cors';
|
||||||
@@ -124,10 +126,10 @@ export default async function createApp(vite) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
app.use(pageRoutes({
|
app.use(pageRoutes({
|
||||||
defaultMetaTags,
|
defaultMetaTags,
|
||||||
HomebrewModel,
|
HomebrewModel,
|
||||||
sanitizeBrew,
|
sanitizeBrew,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
//Robots.txt
|
//Robots.txt
|
||||||
app.get('/robots.txt', (req, res)=>{
|
app.get('/robots.txt', (req, res)=>{
|
||||||
@@ -182,6 +184,27 @@ export default async function createApp(vite) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Create Event Stream source for pages to listen to
|
||||||
|
app.get('/stream', (req, res)=>{
|
||||||
|
res.writeHead(200, {
|
||||||
|
'Content-Type' : 'text/event-stream',
|
||||||
|
'Cache-Control' : 'no-cache',
|
||||||
|
'Connection' : 'keep-alive',
|
||||||
|
'Content-Encoding' : 'none'
|
||||||
|
});
|
||||||
|
|
||||||
|
Stream.on('sendUpdate', (event, data)=>{
|
||||||
|
console.log('Event:', event, '\nData:', data);
|
||||||
|
res.write(`data: ${JSON.stringify({ ...data, eventType: event })}\n\n`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// After Stream starts, send initStream event
|
||||||
|
setTimeout(()=>{
|
||||||
|
Stream.emit('sendUpdate', 'initStream', { time: new Date });
|
||||||
|
}, 1000);
|
||||||
|
|
||||||
|
|
||||||
// Local only
|
// Local only
|
||||||
if(isLocalEnvironment){
|
if(isLocalEnvironment){
|
||||||
// Login
|
// Login
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
import { EventEmitter } from 'events';
|
||||||
|
|
||||||
|
const Stream = new EventEmitter;
|
||||||
|
|
||||||
|
export default {
|
||||||
|
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);},
|
||||||
|
off : (event, listener)=>{return Stream.off(event, listener);}
|
||||||
|
};
|
||||||
@@ -21,6 +21,8 @@ const router = express.Router();
|
|||||||
import { DEFAULT_BREW, DEFAULT_BREW_LOAD } from './brewDefaults.js';
|
import { DEFAULT_BREW, DEFAULT_BREW_LOAD } from './brewDefaults.js';
|
||||||
import Themes from '../themes/themes.json' with { type: 'json' };
|
import Themes from '../themes/themes.json' with { type: 'json' };
|
||||||
|
|
||||||
|
import Stream from './eventStreamSource.js';
|
||||||
|
|
||||||
const isStaticTheme = (renderer, themeName)=>{
|
const isStaticTheme = (renderer, themeName)=>{
|
||||||
return Themes[renderer]?.[themeName] !== undefined;
|
return Themes[renderer]?.[themeName] !== undefined;
|
||||||
};
|
};
|
||||||
@@ -500,6 +502,8 @@ const api = {
|
|||||||
|
|
||||||
saved.textBin = undefined; // Remove textBin from the saved object to save bandwidth
|
saved.textBin = undefined; // Remove textBin from the saved object to save bandwidth
|
||||||
|
|
||||||
|
Stream.emit('sendUpdate', 'brewUpdated', { time: new Date, shareId: brew.shareId, version: brew.version });
|
||||||
|
|
||||||
res.status(200).send(saved);
|
res.status(200).send(saved);
|
||||||
},
|
},
|
||||||
deleteGoogleBrew : async (account, id, editId, res)=>{
|
deleteGoogleBrew : async (account, id, editId, res)=>{
|
||||||
|
|||||||
Reference in New Issue
Block a user