From dee0ff1a5c0d415c99a58aa2afd7d5f9f4c3efce Mon Sep 17 00:00:00 2001 From: cv <34649812+cpvalente@users.noreply.github.com> Date: Sun, 11 Apr 2021 13:10:57 +0200 Subject: [PATCH] bugfix bugfix with socket client - client now subscribes to events - client gets playstate on start --- .../src/features/control/PlaybackControl.jsx | 21 +++++++--- server/app.js | 38 ++++++++++++++----- server/classes/Timer.js | 4 ++ 3 files changed, 47 insertions(+), 16 deletions(-) diff --git a/client/src/features/control/PlaybackControl.jsx b/client/src/features/control/PlaybackControl.jsx index e1adce7ab..fe8d581a4 100644 --- a/client/src/features/control/PlaybackControl.jsx +++ b/client/src/features/control/PlaybackControl.jsx @@ -39,23 +39,32 @@ export default function PlaybackControl() { expectedFinish: null, }); - // Torbjorn: why is this not updating? + // handle incoming messages useEffect(() => { if (socket == null) return; + // Subscribe to timer event + socket.emit('subscribe-to-timer'); + + // ask for playstate + socket.emit('get-playstate'); + + socket.on('playstate', (data) => { + setPlayback(data); + }); + // Handle timer socket.on('timer', (data) => { - console.log('websocket: got data', data); setTimer({ ...data }); }); // Clear listener - return () => socket.off('timer'); + return () => { + socket.emit('release-timer'); + socket.off('timer'); + }; }, [socket]); - // TO SEND TO SOCKET HERE WE CAN USE - // socket.emit('test') - // TODO: Move to playback API // Soould this go through sockets? const playbackControl = async (action, payload) => { diff --git a/server/app.js b/server/app.js index c5d8d2737..c28980545 100644 --- a/server/app.js +++ b/server/app.js @@ -52,26 +52,44 @@ const io = socketIo(server, { }, }); +// Torbjorn: should the interval be here or inside the connection? +// I am guessing one interval per timer // interval function let interval; io.on('connection', (socket) => { console.log('New client connected'); - // timer API - socket.emit('timer', timer.getObject()); + // let interval = null; - // avoid multiple intervals - if (interval) { - clearInterval(interval); - } - // set callback for timer events - interval = setInterval(() => getApiAndEmit(socket), config.timer.refresh); + // subscribe to timer + socket.on('subscribe-to-timer', () => { + console.log('New subscription'); + // avoid multiple intervals + if (interval) clearInterval(interval); + + // send current data + socket.emit('timer', timer.getObject()); + + // set callback for timer events + interval = setInterval(() => emitTimer(socket), config.timer.refresh); + }); + + // unsubscribe to timer + socket.on('release-timer', () => { + console.log('Releasing subscription'); + // avoid multiple intervals + if (interval) clearInterval(interval); + }); socket.on('get-timer', () => { socket.emit('timer', timer.getObject()); }); + socket.on('get-playstate', () => { + socket.emit('playstate', timer.playState); + }); + // playback API socket.on('set-presenter-text', (data) => { timer.presenterText = data; @@ -104,12 +122,12 @@ io.on('connection', (socket) => { // handle client disconnect socket.on('disconnect', () => { console.log('Client disconnected'); - clearInterval(interval); + if (interval) clearInterval(interval); }); }); // send timer events -const getApiAndEmit = (socket) => { +const emitTimer = (socket) => { // send current timer socket.emit('timer', timer.getObject()); }; diff --git a/server/classes/Timer.js b/server/classes/Timer.js index 6c291c3a7..0c5088f98 100644 --- a/server/classes/Timer.js +++ b/server/classes/Timer.js @@ -88,6 +88,10 @@ class Timer { return Timer.toSeconds(this._current); } + get playState() { + return this.state; + } + // playback start() { // do we need to change