From d0c8567022f1c15cf4f390f345c0662b3cdc398c Mon Sep 17 00:00:00 2001
From: cv <34649812+cpvalente@users.noreply.github.com>
Date: Thu, 1 Apr 2021 12:22:23 +0200
Subject: [PATCH 1/5] playback + timer
timer not working yet
---
src/common/components/countdown/Countdown.jsx | 14 +--
src/features/control/PlaybackControl.jsx | 3 +-
src/features/editors/Editor.jsx | 119 +++++++++++++++++-
3 files changed, 117 insertions(+), 19 deletions(-)
diff --git a/src/common/components/countdown/Countdown.jsx b/src/common/components/countdown/Countdown.jsx
index 6733b38a7..5248f4639 100644
--- a/src/common/components/countdown/Countdown.jsx
+++ b/src/common/components/countdown/Countdown.jsx
@@ -1,4 +1,3 @@
-import { useEffect, useState } from 'react';
import styles from './Countdown.module.css';
function display(seconds) {
@@ -11,20 +10,9 @@ function display(seconds) {
}
export default function Countdown({ time, small }) {
- const [counter, setCounter] = useState(time);
-
- useEffect(() => {
- console.log('setting time here');
- setCounter(time);
- }, [time]);
-
- useEffect(() => {
- counter > 0 && setTimeout(() => setCounter(counter - 1), 1000);
- }, [counter]);
-
return (
- {display(counter)}
+ {time === null ? '- -:- -' : display(time * 60)}
);
}
diff --git a/src/features/control/PlaybackControl.jsx b/src/features/control/PlaybackControl.jsx
index 1732f494e..f7c52a783 100644
--- a/src/features/control/PlaybackControl.jsx
+++ b/src/features/control/PlaybackControl.jsx
@@ -27,7 +27,7 @@ export default function PlaybackControl(props) {
colorScheme='green'
className={style.start}
disabled={roll}
- onClick={() => props.playbackControl('start')}
+ onClick={() => props.playbackControl('play')}
>
Start
@@ -67,6 +67,7 @@ export default function PlaybackControl(props) {
colorScheme='blue'
className={style.reset}
onClick={() => props.playbackControl('roll')}
+ disabled
>
Roll
diff --git a/src/features/editors/Editor.jsx b/src/features/editors/Editor.jsx
index 4e9513a8a..93696bdc5 100644
--- a/src/features/editors/Editor.jsx
+++ b/src/features/editors/Editor.jsx
@@ -2,7 +2,7 @@ import { IconButton } from '@chakra-ui/button';
import { SettingsIcon } from '@chakra-ui/icons';
import { Grid, GridItem, Heading } from '@chakra-ui/layout';
import { Box } from '@chakra-ui/layout';
-import { getHours, getMinutes } from 'date-fns';
+import { addSeconds, getHours, getMinutes, getSeconds } from 'date-fns';
import { differenceInSeconds } from 'date-fns/esm';
import { useContext } from 'react';
import { useEffect, useState } from 'react';
@@ -28,10 +28,113 @@ export default function Editor() {
prevState: 'pause',
});
+ // Timer stuff
+ const [timer, setTimer] = useState({
+ TIMER_UPDATE_INTERVAL: 250,
+ currentTime: null,
+ currentTimeSeconds: null,
+
+ playMode: 'stop',
+
+ isStarted: false,
+ isRunning: false,
+
+ startTime: null,
+ pauseTime: null,
+
+ lastRun: null,
+ elapsedTime: 0,
+
+ elapsedStartedTime: 0,
+ elapsedRunningTime: 0,
+
+ totalElapsedPausedTime: 0,
+ periodElapsedPausedTime: 0,
+
+ elapsedResumeTime: 0,
+
+ targetTime: null,
+ });
+
+ // update timer object
+ const updateTimer = (vals) => {
+ setTimer({ ...timer, ...vals });
+ };
+
+ // set timer target
+ const setTimerTargetinSeconds = (target) => {
+ const t = addSeconds(new Date(), target);
+ updateTimer({ currentTime: t, currentTimeSeconds: target, targetTime: t });
+ };
+
+ // timer playback control
+ const setTimerState = (state) => {
+ const now = new Date();
+
+ switch (state) {
+ case 'play': {
+ updateTimer({ playMode: state, isStarted: true, startTime: now, lastRun: now });
+ break;
+ }
+ case 'pause': {
+ updateTimer({ playMode: state, pauseTime: now, isRunning: false });
+ break;
+ }
+
+ default:
+ break;
+ }
+ };
+
+ // update
+ const updateTime = () => {
+ // exit if we are not ready
+ if (timer.startTime == null) return;
+
+ // aux
+ const now = new Date();
+
+ // how long has the time been running
+ const elapsedTime = now - timer.startTime;
+
+ if (timer.playMode === 'play') {
+ // current time here
+ const currentTime = timer.targetTime - elapsedTime;
+ updateTimer({
+ currentTime: currentTime,
+ currentTimeSeconds: getSeconds(currentTime),
+ elapsedTime: elapsedTime,
+ lastRun: now,
+ });
+ }
+
+ if (timer.playMode === 'pause') {
+ const pausedTime = now - timer.pauseTime;
+ updateTimer({
+ totalElapsedPausedTime: timer.totalElapsedPausedTime + pausedTime,
+ periodElapsedPausedTime: timer.periodElapsedPausedTime + now,
+ elapsedTime: elapsedTime,
+ lastRun: now,
+ });
+ }
+
+ // call again
+ setTimeout(updateTime, timer.TIMER_UPDATE_INTERVAL);
+ };
+
+ // when playmode changes, we might schedule a timer
+ // is this enough for change or should i check prevstate?
+ useEffect(() => {
+ if (playback.state !== 'stop' || playback.state !== null) {
+ updateTime();
+ }
+ }, [playback.state]);
+
const updatePlayback = (vals) => {
setPlayback({ ...playback, ...vals });
};
+ // gets timer on current
// ?? I have already done this a few times,
// maybe loop once and get all data?
const getCurrentTime = (target) => {
@@ -50,23 +153,24 @@ export default function Editor() {
let minEnd = getHours(curEvent.timeEnd) * 60;
minEnd = minEnd + getMinutes(curEvent.timeEnd);
-
// return time in seconds
- return ((minEnd - minStart) * 60);
+ return (minEnd - minStart) * 60;
}
};
const playbackControl = (action, payload) => {
switch (action) {
- case 'start': {
+ case 'play': {
if (playback.state !== 'play') {
updatePlayback({ state: 'play', prevState: playback.state });
+ setTimerState('play');
}
break;
}
case 'pause': {
if (playback.state !== 'pause') {
updatePlayback({ state: 'pause', prevState: playback.state });
+ setTimerState('pause');
}
break;
}
@@ -94,6 +198,8 @@ export default function Editor() {
let time = getCurrentTime(cur);
// update playback
updatePlayback({ current: cur, next: nxt, currentTimer: time });
+ // set timer
+ setTimerTargetinSeconds(time);
}
break;
}
@@ -113,6 +219,8 @@ export default function Editor() {
let time = getCurrentTime(cur);
// update playback
updatePlayback({ current: cur, next: nxt, currentTimer: time });
+ // set timer
+ setTimerTargetinSeconds(time);
}
break;
}
@@ -122,6 +230,7 @@ export default function Editor() {
};
console.log('playback here', playback);
+ console.log('timer here', timer);
return (
From c39f3f2dde8eb6b994f81ebc0e255ba3b0c64b5b Mon Sep 17 00:00:00 2001
From: cv <34649812+cpvalente@users.noreply.github.com>
Date: Mon, 5 Apr 2021 22:33:31 +0200
Subject: [PATCH 2/5] node server + separate client folder
---
.gitignore | 2 +-
package.json => client/package.json | 1 +
{public => client/public}/favicon.ico | Bin
{public => client/public}/index.html | 0
{public => client/public}/logo192.png | Bin
{public => client/public}/logo512.png | Bin
{public => client/public}/manifest.json | 0
{public => client/public}/robots.txt | 0
{src => client/src}/App.css | 0
{src => client/src}/App.js | 0
{src => client/src}/App.test.js | 0
.../src}/app/context/eventContext.js | 0
.../src}/app/context/eventListContext.js | 0
.../app/context/presenterMessageContext.js | 0
{src => client/src}/app/sampleData.js | 0
{src => client/src}/app/userConfig.js | 0
{src => client/src}/app/utils.js | 0
.../common/components/countdown/Countdown.jsx | 0
.../components/countdown/Countdown.module.css | 0
.../myProgressBar/MyProgressBar.jsx | 0
.../myProgressBar/MyProgressBar.module.css | 0
.../components/smallTimer/SmallTimer.jsx | 0
.../smallTimer/SmallTimer.module.css | 0
.../common/components/text/NumberedText.jsx | 0
.../components/text/NumberedText.module.css | 0
{src => client/src}/common/dateConfig.js | 0
.../src}/common/input/ChakraInput.jsx | 0
.../src}/features/control/PlaybackControl.jsx | 0
.../control/PlaybackControl.module.css | 0
.../src}/features/editors/Editor.jsx | 25 +-
.../src}/features/editors/Editor.module.css | 0
.../src}/features/editors/list/BlockBlock.jsx | 0
.../src}/features/editors/list/DelayBlock.jsx | 0
.../src}/features/editors/list/EventList.jsx | 0
.../features/editors/list/EventListItem.jsx | 0
.../features/editors/list/List.module.css | 0
.../src}/features/editors/list/listUtils.js | 0
.../src}/features/form/MessageForm.jsx | 0
.../src}/features/menu/EventListMenu.jsx | 0
.../features/menu/EventListMenu.module.css | 0
.../features/viewers/DefaultPresenter.jsx | 0
.../src}/features/viewers/IFrameLoader.jsx | 0
.../features/viewers/IFrameLoader.module.css | 0
.../features/viewers/PreviewContainer.jsx | 0
.../viewers/PreviewContainer.module.css | 0
.../src}/features/viewers/viewers.css | 0
{src => client/src}/index.css | 0
{src => client/src}/index.js | 0
{src => client/src}/logo.svg | 0
{src => client/src}/reportWebVitals.js | 0
{src => client/src}/setupTests.js | 0
yarn.lock => client/yarn.lock | 85 ++-
server/app.js | 40 ++
server/package.json | 16 +
server/routes/index.js | 8 +
server/yarn.lock | 553 ++++++++++++++++++
56 files changed, 724 insertions(+), 6 deletions(-)
rename package.json => client/package.json (96%)
rename {public => client/public}/favicon.ico (100%)
rename {public => client/public}/index.html (100%)
rename {public => client/public}/logo192.png (100%)
rename {public => client/public}/logo512.png (100%)
rename {public => client/public}/manifest.json (100%)
rename {public => client/public}/robots.txt (100%)
rename {src => client/src}/App.css (100%)
rename {src => client/src}/App.js (100%)
rename {src => client/src}/App.test.js (100%)
rename {src => client/src}/app/context/eventContext.js (100%)
rename {src => client/src}/app/context/eventListContext.js (100%)
rename {src => client/src}/app/context/presenterMessageContext.js (100%)
rename {src => client/src}/app/sampleData.js (100%)
rename {src => client/src}/app/userConfig.js (100%)
rename {src => client/src}/app/utils.js (100%)
rename {src => client/src}/common/components/countdown/Countdown.jsx (100%)
rename {src => client/src}/common/components/countdown/Countdown.module.css (100%)
rename {src => client/src}/common/components/myProgressBar/MyProgressBar.jsx (100%)
rename {src => client/src}/common/components/myProgressBar/MyProgressBar.module.css (100%)
rename {src => client/src}/common/components/smallTimer/SmallTimer.jsx (100%)
rename {src => client/src}/common/components/smallTimer/SmallTimer.module.css (100%)
rename {src => client/src}/common/components/text/NumberedText.jsx (100%)
rename {src => client/src}/common/components/text/NumberedText.module.css (100%)
rename {src => client/src}/common/dateConfig.js (100%)
rename {src => client/src}/common/input/ChakraInput.jsx (100%)
rename {src => client/src}/features/control/PlaybackControl.jsx (100%)
rename {src => client/src}/features/control/PlaybackControl.module.css (100%)
rename {src => client/src}/features/editors/Editor.jsx (94%)
rename {src => client/src}/features/editors/Editor.module.css (100%)
rename {src => client/src}/features/editors/list/BlockBlock.jsx (100%)
rename {src => client/src}/features/editors/list/DelayBlock.jsx (100%)
rename {src => client/src}/features/editors/list/EventList.jsx (100%)
rename {src => client/src}/features/editors/list/EventListItem.jsx (100%)
rename {src => client/src}/features/editors/list/List.module.css (100%)
rename {src => client/src}/features/editors/list/listUtils.js (100%)
rename {src => client/src}/features/form/MessageForm.jsx (100%)
rename {src => client/src}/features/menu/EventListMenu.jsx (100%)
rename {src => client/src}/features/menu/EventListMenu.module.css (100%)
rename {src => client/src}/features/viewers/DefaultPresenter.jsx (100%)
rename {src => client/src}/features/viewers/IFrameLoader.jsx (100%)
rename {src => client/src}/features/viewers/IFrameLoader.module.css (100%)
rename {src => client/src}/features/viewers/PreviewContainer.jsx (100%)
rename {src => client/src}/features/viewers/PreviewContainer.module.css (100%)
rename {src => client/src}/features/viewers/viewers.css (100%)
rename {src => client/src}/index.css (100%)
rename {src => client/src}/index.js (100%)
rename {src => client/src}/logo.svg (100%)
rename {src => client/src}/reportWebVitals.js (100%)
rename {src => client/src}/setupTests.js (100%)
rename yarn.lock => client/yarn.lock (99%)
create mode 100644 server/app.js
create mode 100644 server/package.json
create mode 100644 server/routes/index.js
create mode 100644 server/yarn.lock
diff --git a/.gitignore b/.gitignore
index 942699584..35b7f1997 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,7 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
-/node_modules
+node_modules
/.pnp
.pnp.js
diff --git a/package.json b/client/package.json
similarity index 96%
rename from package.json
rename to client/package.json
index 866d7a301..c3185fa2a 100644
--- a/package.json
+++ b/client/package.json
@@ -17,6 +17,7 @@
"react-router": "^5.2.0",
"react-router-dom": "^5.2.0",
"react-scripts": "4.0.3",
+ "socket.io-client": "^4.0.1",
"web-vitals": "^1.0.1"
},
"scripts": {
diff --git a/public/favicon.ico b/client/public/favicon.ico
similarity index 100%
rename from public/favicon.ico
rename to client/public/favicon.ico
diff --git a/public/index.html b/client/public/index.html
similarity index 100%
rename from public/index.html
rename to client/public/index.html
diff --git a/public/logo192.png b/client/public/logo192.png
similarity index 100%
rename from public/logo192.png
rename to client/public/logo192.png
diff --git a/public/logo512.png b/client/public/logo512.png
similarity index 100%
rename from public/logo512.png
rename to client/public/logo512.png
diff --git a/public/manifest.json b/client/public/manifest.json
similarity index 100%
rename from public/manifest.json
rename to client/public/manifest.json
diff --git a/public/robots.txt b/client/public/robots.txt
similarity index 100%
rename from public/robots.txt
rename to client/public/robots.txt
diff --git a/src/App.css b/client/src/App.css
similarity index 100%
rename from src/App.css
rename to client/src/App.css
diff --git a/src/App.js b/client/src/App.js
similarity index 100%
rename from src/App.js
rename to client/src/App.js
diff --git a/src/App.test.js b/client/src/App.test.js
similarity index 100%
rename from src/App.test.js
rename to client/src/App.test.js
diff --git a/src/app/context/eventContext.js b/client/src/app/context/eventContext.js
similarity index 100%
rename from src/app/context/eventContext.js
rename to client/src/app/context/eventContext.js
diff --git a/src/app/context/eventListContext.js b/client/src/app/context/eventListContext.js
similarity index 100%
rename from src/app/context/eventListContext.js
rename to client/src/app/context/eventListContext.js
diff --git a/src/app/context/presenterMessageContext.js b/client/src/app/context/presenterMessageContext.js
similarity index 100%
rename from src/app/context/presenterMessageContext.js
rename to client/src/app/context/presenterMessageContext.js
diff --git a/src/app/sampleData.js b/client/src/app/sampleData.js
similarity index 100%
rename from src/app/sampleData.js
rename to client/src/app/sampleData.js
diff --git a/src/app/userConfig.js b/client/src/app/userConfig.js
similarity index 100%
rename from src/app/userConfig.js
rename to client/src/app/userConfig.js
diff --git a/src/app/utils.js b/client/src/app/utils.js
similarity index 100%
rename from src/app/utils.js
rename to client/src/app/utils.js
diff --git a/src/common/components/countdown/Countdown.jsx b/client/src/common/components/countdown/Countdown.jsx
similarity index 100%
rename from src/common/components/countdown/Countdown.jsx
rename to client/src/common/components/countdown/Countdown.jsx
diff --git a/src/common/components/countdown/Countdown.module.css b/client/src/common/components/countdown/Countdown.module.css
similarity index 100%
rename from src/common/components/countdown/Countdown.module.css
rename to client/src/common/components/countdown/Countdown.module.css
diff --git a/src/common/components/myProgressBar/MyProgressBar.jsx b/client/src/common/components/myProgressBar/MyProgressBar.jsx
similarity index 100%
rename from src/common/components/myProgressBar/MyProgressBar.jsx
rename to client/src/common/components/myProgressBar/MyProgressBar.jsx
diff --git a/src/common/components/myProgressBar/MyProgressBar.module.css b/client/src/common/components/myProgressBar/MyProgressBar.module.css
similarity index 100%
rename from src/common/components/myProgressBar/MyProgressBar.module.css
rename to client/src/common/components/myProgressBar/MyProgressBar.module.css
diff --git a/src/common/components/smallTimer/SmallTimer.jsx b/client/src/common/components/smallTimer/SmallTimer.jsx
similarity index 100%
rename from src/common/components/smallTimer/SmallTimer.jsx
rename to client/src/common/components/smallTimer/SmallTimer.jsx
diff --git a/src/common/components/smallTimer/SmallTimer.module.css b/client/src/common/components/smallTimer/SmallTimer.module.css
similarity index 100%
rename from src/common/components/smallTimer/SmallTimer.module.css
rename to client/src/common/components/smallTimer/SmallTimer.module.css
diff --git a/src/common/components/text/NumberedText.jsx b/client/src/common/components/text/NumberedText.jsx
similarity index 100%
rename from src/common/components/text/NumberedText.jsx
rename to client/src/common/components/text/NumberedText.jsx
diff --git a/src/common/components/text/NumberedText.module.css b/client/src/common/components/text/NumberedText.module.css
similarity index 100%
rename from src/common/components/text/NumberedText.module.css
rename to client/src/common/components/text/NumberedText.module.css
diff --git a/src/common/dateConfig.js b/client/src/common/dateConfig.js
similarity index 100%
rename from src/common/dateConfig.js
rename to client/src/common/dateConfig.js
diff --git a/src/common/input/ChakraInput.jsx b/client/src/common/input/ChakraInput.jsx
similarity index 100%
rename from src/common/input/ChakraInput.jsx
rename to client/src/common/input/ChakraInput.jsx
diff --git a/src/features/control/PlaybackControl.jsx b/client/src/features/control/PlaybackControl.jsx
similarity index 100%
rename from src/features/control/PlaybackControl.jsx
rename to client/src/features/control/PlaybackControl.jsx
diff --git a/src/features/control/PlaybackControl.module.css b/client/src/features/control/PlaybackControl.module.css
similarity index 100%
rename from src/features/control/PlaybackControl.module.css
rename to client/src/features/control/PlaybackControl.module.css
diff --git a/src/features/editors/Editor.jsx b/client/src/features/editors/Editor.jsx
similarity index 94%
rename from src/features/editors/Editor.jsx
rename to client/src/features/editors/Editor.jsx
index 93696bdc5..73c6bd08f 100644
--- a/src/features/editors/Editor.jsx
+++ b/client/src/features/editors/Editor.jsx
@@ -14,6 +14,7 @@ import MessageForm from '../form/MessageForm';
import PreviewContainer from '../viewers/PreviewContainer';
import styles from './Editor.module.css';
import EventList from './list/EventList';
+import { io } from 'socket.io-client';
export default function Editor() {
const [formMode, setFormMode] = useState(null);
@@ -28,12 +29,27 @@ export default function Editor() {
prevState: 'pause',
});
+ const [response, setResponse] = useState('');
+
+ // WEBSOCKETZ
+ useEffect(() => {
+ // TODO: add namespace?
+ const socket = io('http://localhost:4001', { transport: ['websocket'] });
+ console.log('websocket started');
+
+ socket.on('FromAPI', (data) => {
+ setResponse(data);
+ console.log('websocket stuff', data);
+ });
+
+ return () => socket.disconnect();
+ }, []);
+
// Timer stuff
const [timer, setTimer] = useState({
TIMER_UPDATE_INTERVAL: 250,
currentTime: null,
currentTimeSeconds: null,
-
playMode: 'stop',
isStarted: false,
@@ -73,7 +89,12 @@ export default function Editor() {
switch (state) {
case 'play': {
- updateTimer({ playMode: state, isStarted: true, startTime: now, lastRun: now });
+ updateTimer({
+ playMode: state,
+ isStarted: true,
+ startTime: now,
+ lastRun: now,
+ });
break;
}
case 'pause': {
diff --git a/src/features/editors/Editor.module.css b/client/src/features/editors/Editor.module.css
similarity index 100%
rename from src/features/editors/Editor.module.css
rename to client/src/features/editors/Editor.module.css
diff --git a/src/features/editors/list/BlockBlock.jsx b/client/src/features/editors/list/BlockBlock.jsx
similarity index 100%
rename from src/features/editors/list/BlockBlock.jsx
rename to client/src/features/editors/list/BlockBlock.jsx
diff --git a/src/features/editors/list/DelayBlock.jsx b/client/src/features/editors/list/DelayBlock.jsx
similarity index 100%
rename from src/features/editors/list/DelayBlock.jsx
rename to client/src/features/editors/list/DelayBlock.jsx
diff --git a/src/features/editors/list/EventList.jsx b/client/src/features/editors/list/EventList.jsx
similarity index 100%
rename from src/features/editors/list/EventList.jsx
rename to client/src/features/editors/list/EventList.jsx
diff --git a/src/features/editors/list/EventListItem.jsx b/client/src/features/editors/list/EventListItem.jsx
similarity index 100%
rename from src/features/editors/list/EventListItem.jsx
rename to client/src/features/editors/list/EventListItem.jsx
diff --git a/src/features/editors/list/List.module.css b/client/src/features/editors/list/List.module.css
similarity index 100%
rename from src/features/editors/list/List.module.css
rename to client/src/features/editors/list/List.module.css
diff --git a/src/features/editors/list/listUtils.js b/client/src/features/editors/list/listUtils.js
similarity index 100%
rename from src/features/editors/list/listUtils.js
rename to client/src/features/editors/list/listUtils.js
diff --git a/src/features/form/MessageForm.jsx b/client/src/features/form/MessageForm.jsx
similarity index 100%
rename from src/features/form/MessageForm.jsx
rename to client/src/features/form/MessageForm.jsx
diff --git a/src/features/menu/EventListMenu.jsx b/client/src/features/menu/EventListMenu.jsx
similarity index 100%
rename from src/features/menu/EventListMenu.jsx
rename to client/src/features/menu/EventListMenu.jsx
diff --git a/src/features/menu/EventListMenu.module.css b/client/src/features/menu/EventListMenu.module.css
similarity index 100%
rename from src/features/menu/EventListMenu.module.css
rename to client/src/features/menu/EventListMenu.module.css
diff --git a/src/features/viewers/DefaultPresenter.jsx b/client/src/features/viewers/DefaultPresenter.jsx
similarity index 100%
rename from src/features/viewers/DefaultPresenter.jsx
rename to client/src/features/viewers/DefaultPresenter.jsx
diff --git a/src/features/viewers/IFrameLoader.jsx b/client/src/features/viewers/IFrameLoader.jsx
similarity index 100%
rename from src/features/viewers/IFrameLoader.jsx
rename to client/src/features/viewers/IFrameLoader.jsx
diff --git a/src/features/viewers/IFrameLoader.module.css b/client/src/features/viewers/IFrameLoader.module.css
similarity index 100%
rename from src/features/viewers/IFrameLoader.module.css
rename to client/src/features/viewers/IFrameLoader.module.css
diff --git a/src/features/viewers/PreviewContainer.jsx b/client/src/features/viewers/PreviewContainer.jsx
similarity index 100%
rename from src/features/viewers/PreviewContainer.jsx
rename to client/src/features/viewers/PreviewContainer.jsx
diff --git a/src/features/viewers/PreviewContainer.module.css b/client/src/features/viewers/PreviewContainer.module.css
similarity index 100%
rename from src/features/viewers/PreviewContainer.module.css
rename to client/src/features/viewers/PreviewContainer.module.css
diff --git a/src/features/viewers/viewers.css b/client/src/features/viewers/viewers.css
similarity index 100%
rename from src/features/viewers/viewers.css
rename to client/src/features/viewers/viewers.css
diff --git a/src/index.css b/client/src/index.css
similarity index 100%
rename from src/index.css
rename to client/src/index.css
diff --git a/src/index.js b/client/src/index.js
similarity index 100%
rename from src/index.js
rename to client/src/index.js
diff --git a/src/logo.svg b/client/src/logo.svg
similarity index 100%
rename from src/logo.svg
rename to client/src/logo.svg
diff --git a/src/reportWebVitals.js b/client/src/reportWebVitals.js
similarity index 100%
rename from src/reportWebVitals.js
rename to client/src/reportWebVitals.js
diff --git a/src/setupTests.js b/client/src/setupTests.js
similarity index 100%
rename from src/setupTests.js
rename to client/src/setupTests.js
diff --git a/yarn.lock b/client/yarn.lock
similarity index 99%
rename from yarn.lock
rename to client/yarn.lock
index f99fd91cc..f696fb14a 100644
--- a/yarn.lock
+++ b/client/yarn.lock
@@ -2339,6 +2339,11 @@
dependencies:
"@babel/types" "^7.3.0"
+"@types/component-emitter@^1.2.10":
+ version "1.2.10"
+ resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.10.tgz#ef5b1589b9f16544642e473db5ea5639107ef3ea"
+ integrity sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==
+
"@types/eslint@^7.2.6":
version "7.2.7"
resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.7.tgz#f7ef1cf0dceab0ae6f9a976a0a9af14ab1baca26"
@@ -3407,11 +3412,21 @@ babylon@^6.18.0:
resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
+backo2@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
+ integrity sha1-MasayLEpNjRj41s+u2n038+6eUc=
+
balanced-match@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
+base64-arraybuffer@0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812"
+ integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=
+
base64-js@^1.0.2:
version "1.5.1"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
@@ -4080,7 +4095,7 @@ commondir@^1.0.1:
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
-component-emitter@^1.2.1:
+component-emitter@^1.2.1, component-emitter@~1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
@@ -4633,7 +4648,7 @@ debug@^3.1.1, debug@^3.2.6:
dependencies:
ms "^2.1.1"
-debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
+debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.3.1:
version "4.3.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
@@ -5016,6 +5031,28 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0:
dependencies:
once "^1.4.0"
+engine.io-client@~5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-5.0.1.tgz#9470fc6655c9789c5c0aa1a0e7e7d9ae9753a798"
+ integrity sha512-CQtGN3YwfvbxVwpPugcsHe5rHT4KgT49CEcQppNtu9N7WxbPN0MAG27lGaem7bvtCFtGNLSL+GEqXsFSz36jTg==
+ dependencies:
+ base64-arraybuffer "0.1.4"
+ component-emitter "~1.3.0"
+ debug "~4.3.1"
+ engine.io-parser "~4.0.1"
+ has-cors "1.1.0"
+ parseqs "0.0.6"
+ parseuri "0.0.6"
+ ws "~7.4.2"
+ yeast "0.1.2"
+
+engine.io-parser@~4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-4.0.2.tgz#e41d0b3fb66f7bf4a3671d2038a154024edb501e"
+ integrity sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==
+ dependencies:
+ base64-arraybuffer "0.1.4"
+
enhanced-resolve@^4.3.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec"
@@ -6125,6 +6162,11 @@ has-bigints@^1.0.1:
resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113"
integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==
+has-cors@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39"
+ integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=
+
has-flag@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
@@ -8708,6 +8750,16 @@ parse5@6.0.1:
resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b"
integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==
+parseqs@0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5"
+ integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==
+
+parseuri@0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a"
+ integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==
+
parseurl@~1.3.2, parseurl@~1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
@@ -10829,6 +10881,28 @@ snapdragon@^0.8.1:
source-map-resolve "^0.5.0"
use "^3.1.0"
+socket.io-client@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.0.1.tgz#8f3bf4ce9282dda1741a4ed0f726b412944e012b"
+ integrity sha512-6AkaEG5zrVuSVW294cH1chioag9i1OqnCYjKwTc3EBGXbnyb98Lw7yMa40ifLjFj3y6fsFKsd0llbUZUCRf3Qw==
+ dependencies:
+ "@types/component-emitter" "^1.2.10"
+ backo2 "~1.0.2"
+ component-emitter "~1.3.0"
+ debug "~4.3.1"
+ engine.io-client "~5.0.0"
+ parseuri "0.0.6"
+ socket.io-parser "~4.0.4"
+
+socket.io-parser@~4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0"
+ integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==
+ dependencies:
+ "@types/component-emitter" "^1.2.10"
+ component-emitter "~1.3.0"
+ debug "~4.3.1"
+
sockjs-client@^1.5.0:
version "1.5.1"
resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.1.tgz#256908f6d5adfb94dabbdbd02c66362cca0f9ea6"
@@ -12403,7 +12477,7 @@ ws@^6.2.1:
dependencies:
async-limiter "~1.0.0"
-ws@^7.4.4:
+ws@^7.4.4, ws@~7.4.2:
version "7.4.4"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz#383bc9742cb202292c9077ceab6f6047b17f2d59"
integrity sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==
@@ -12492,6 +12566,11 @@ yargs@^15.4.1:
y18n "^4.0.0"
yargs-parser "^18.1.2"
+yeast@0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"
+ integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk=
+
yocto-queue@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
diff --git a/server/app.js b/server/app.js
new file mode 100644
index 000000000..111b00a71
--- /dev/null
+++ b/server/app.js
@@ -0,0 +1,40 @@
+const express = require('express');
+const http = require('http');
+const socketIo = require('socket.io');
+
+const port = process.env.PORT || 4001;
+const index = require('./routes/index');
+
+const app = express();
+app.use(index);
+
+const server = http.createServer(app);
+
+const io = socketIo(server, {
+ cors: {
+ origin: 'http://localhost:3000',
+ methods: ['GET', 'POST'],
+ },
+});
+
+let interval;
+
+io.on('connection', (socket) => {
+ console.log('New client connected');
+ if (interval) {
+ clearInterval(interval);
+ }
+ interval = setInterval(() => getApiAndEmit(socket), 1000);
+ socket.on('disconnect', () => {
+ console.log('Client disconnected');
+ clearInterval(interval);
+ });
+});
+
+const getApiAndEmit = (socket) => {
+ const response = new Date();
+ // Emitting a new message. Will be consumed by the client
+ socket.emit('FromAPI', response);
+};
+
+server.listen(port, () => console.log(`Listening on port ${port}`));
diff --git a/server/package.json b/server/package.json
new file mode 100644
index 000000000..bf391d93f
--- /dev/null
+++ b/server/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "passport-example",
+ "version": "0.0.1",
+ "description": "Example with Passport (http://www.passportjs.org/)",
+ "dependencies": {
+ "body-parser": "~1.19.0",
+ "express": "~4.17.1",
+ "express-session": "~1.17.1",
+ "passport": "~0.4.1",
+ "passport-local": "~1.0.0",
+ "socket.io": "^4.0.0"
+ },
+ "scripts": {
+ "start": "node app.js"
+ }
+}
\ No newline at end of file
diff --git a/server/routes/index.js b/server/routes/index.js
new file mode 100644
index 000000000..264eb5c26
--- /dev/null
+++ b/server/routes/index.js
@@ -0,0 +1,8 @@
+const express = require('express');
+const router = express.Router();
+
+router.get('/', (req, res) => {
+ res.send({ response: 'I am alive' }).status(200);
+});
+
+module.exports = router;
diff --git a/server/yarn.lock b/server/yarn.lock
new file mode 100644
index 000000000..182780d0c
--- /dev/null
+++ b/server/yarn.lock
@@ -0,0 +1,553 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@types/component-emitter@^1.2.10":
+ version "1.2.10"
+ resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.10.tgz#ef5b1589b9f16544642e473db5ea5639107ef3ea"
+ integrity sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==
+
+"@types/cookie@^0.4.0":
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.0.tgz#14f854c0f93d326e39da6e3b6f34f7d37513d108"
+ integrity sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==
+
+"@types/cors@^2.8.8":
+ version "2.8.10"
+ resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.10.tgz#61cc8469849e5bcdd0c7044122265c39cec10cf4"
+ integrity sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ==
+
+"@types/node@>=10.0.0":
+ version "14.14.37"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.37.tgz#a3dd8da4eb84a996c36e331df98d82abd76b516e"
+ integrity sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw==
+
+accepts@~1.3.4, accepts@~1.3.7:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
+ integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
+ dependencies:
+ mime-types "~2.1.24"
+ negotiator "0.6.2"
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
+
+base64-arraybuffer@0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812"
+ integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=
+
+base64id@2.0.0, base64id@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6"
+ integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==
+
+body-parser@1.19.0, body-parser@~1.19.0:
+ version "1.19.0"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
+ integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
+ dependencies:
+ bytes "3.1.0"
+ content-type "~1.0.4"
+ debug "2.6.9"
+ depd "~1.1.2"
+ http-errors "1.7.2"
+ iconv-lite "0.4.24"
+ on-finished "~2.3.0"
+ qs "6.7.0"
+ raw-body "2.4.0"
+ type-is "~1.6.17"
+
+bytes@3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
+ integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
+
+component-emitter@~1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
+ integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
+
+content-disposition@0.5.3:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
+ integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
+ dependencies:
+ safe-buffer "5.1.2"
+
+content-type@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+ integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+ integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
+
+cookie@0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
+ integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
+
+cookie@~0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1"
+ integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==
+
+cors@~2.8.5:
+ version "2.8.5"
+ resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
+ integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
+ dependencies:
+ object-assign "^4"
+ vary "^1"
+
+debug@2.6.9:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@~4.3.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
+ integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
+ dependencies:
+ ms "2.1.2"
+
+depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+ integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+
+depd@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
+ integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
+
+destroy@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+ integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
+
+engine.io-parser@~4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-4.0.2.tgz#e41d0b3fb66f7bf4a3671d2038a154024edb501e"
+ integrity sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==
+ dependencies:
+ base64-arraybuffer "0.1.4"
+
+engine.io@~5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-5.0.0.tgz#470dc94a8a4907fa4d2cd1fa6611426afcee61bf"
+ integrity sha512-BATIdDV3H1SrE9/u2BAotvsmjJg0t1P4+vGedImSs1lkFAtQdvk4Ev1y4LDiPF7BPWgXWEG+NDY+nLvW3UrMWw==
+ dependencies:
+ accepts "~1.3.4"
+ base64id "2.0.0"
+ cookie "~0.4.1"
+ cors "~2.8.5"
+ debug "~4.3.1"
+ engine.io-parser "~4.0.0"
+ ws "~7.4.2"
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
+
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
+
+express-session@~1.17.1:
+ version "1.17.1"
+ resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.17.1.tgz#36ecbc7034566d38c8509885c044d461c11bf357"
+ integrity sha512-UbHwgqjxQZJiWRTMyhvWGvjBQduGCSBDhhZXYenziMFjxst5rMV+aJZ6hKPHZnPyHGsrqRICxtX8jtEbm/z36Q==
+ dependencies:
+ cookie "0.4.0"
+ cookie-signature "1.0.6"
+ debug "2.6.9"
+ depd "~2.0.0"
+ on-headers "~1.0.2"
+ parseurl "~1.3.3"
+ safe-buffer "5.2.0"
+ uid-safe "~2.1.5"
+
+express@~4.17.1:
+ version "4.17.1"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
+ integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
+ dependencies:
+ accepts "~1.3.7"
+ array-flatten "1.1.1"
+ body-parser "1.19.0"
+ content-disposition "0.5.3"
+ content-type "~1.0.4"
+ cookie "0.4.0"
+ cookie-signature "1.0.6"
+ debug "2.6.9"
+ depd "~1.1.2"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ finalhandler "~1.1.2"
+ fresh "0.5.2"
+ merge-descriptors "1.0.1"
+ methods "~1.1.2"
+ on-finished "~2.3.0"
+ parseurl "~1.3.3"
+ path-to-regexp "0.1.7"
+ proxy-addr "~2.0.5"
+ qs "6.7.0"
+ range-parser "~1.2.1"
+ safe-buffer "5.1.2"
+ send "0.17.1"
+ serve-static "1.14.1"
+ setprototypeof "1.1.1"
+ statuses "~1.5.0"
+ type-is "~1.6.18"
+ utils-merge "1.0.1"
+ vary "~1.1.2"
+
+finalhandler@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
+ integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
+ dependencies:
+ debug "2.6.9"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ on-finished "~2.3.0"
+ parseurl "~1.3.3"
+ statuses "~1.5.0"
+ unpipe "~1.0.0"
+
+forwarded@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
+ integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
+
+http-errors@1.7.2:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
+ integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
+http-errors@~1.7.2:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
+ integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.4"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
+iconv-lite@0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+inherits@2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+ integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
+
+inherits@2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+ipaddr.js@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
+
+merge-descriptors@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+ integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
+
+mime-db@1.47.0:
+ version "1.47.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c"
+ integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==
+
+mime-types@~2.1.24:
+ version "2.1.30"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d"
+ integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==
+ dependencies:
+ mime-db "1.47.0"
+
+mime@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+
+ms@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
+ integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+negotiator@0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
+ integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
+
+object-assign@^4:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
+ dependencies:
+ ee-first "1.1.1"
+
+on-headers@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f"
+ integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==
+
+parseurl@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+passport-local@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/passport-local/-/passport-local-1.0.0.tgz#1fe63268c92e75606626437e3b906662c15ba6ee"
+ integrity sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=
+ dependencies:
+ passport-strategy "1.x.x"
+
+passport-strategy@1.x.x:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4"
+ integrity sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=
+
+passport@~0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/passport/-/passport-0.4.1.tgz#941446a21cb92fc688d97a0861c38ce9f738f270"
+ integrity sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==
+ dependencies:
+ passport-strategy "1.x.x"
+ pause "0.0.1"
+
+path-to-regexp@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+ integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
+
+pause@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d"
+ integrity sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=
+
+proxy-addr@~2.0.5:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf"
+ integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==
+ dependencies:
+ forwarded "~0.1.2"
+ ipaddr.js "1.9.1"
+
+qs@6.7.0:
+ version "6.7.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
+ integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
+
+random-bytes@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b"
+ integrity sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=
+
+range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+raw-body@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
+ integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
+ dependencies:
+ bytes "3.1.0"
+ http-errors "1.7.2"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+safe-buffer@5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-buffer@5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519"
+ integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+send@0.17.1:
+ version "0.17.1"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
+ integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
+ dependencies:
+ debug "2.6.9"
+ depd "~1.1.2"
+ destroy "~1.0.4"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ fresh "0.5.2"
+ http-errors "~1.7.2"
+ mime "1.6.0"
+ ms "2.1.1"
+ on-finished "~2.3.0"
+ range-parser "~1.2.1"
+ statuses "~1.5.0"
+
+serve-static@1.14.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
+ integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.17.1"
+
+setprototypeof@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
+ integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
+
+socket.io-adapter@~2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.2.0.tgz#43af9157c4609e74b8addc6867873ac7eb48fda2"
+ integrity sha512-rG49L+FwaVEwuAdeBRq49M97YI3ElVabJPzvHT9S6a2CWhDKnjSFasvwAwSYPRhQzfn4NtDIbCaGYgOCOU/rlg==
+
+socket.io-parser@~4.0.3:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0"
+ integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==
+ dependencies:
+ "@types/component-emitter" "^1.2.10"
+ component-emitter "~1.3.0"
+ debug "~4.3.1"
+
+socket.io@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.0.1.tgz#d2e01cf3780d810b66182b3fbef08a04a4ccf924"
+ integrity sha512-g8eZB9lV0f4X4gndG0k7YZAywOg1VxYgCUspS4V+sDqsgI/duqd0AW84pKkbGj/wQwxrqrEq+VZrspRfTbHTAQ==
+ dependencies:
+ "@types/cookie" "^0.4.0"
+ "@types/cors" "^2.8.8"
+ "@types/node" ">=10.0.0"
+ accepts "~1.3.4"
+ base64id "~2.0.0"
+ debug "~4.3.1"
+ engine.io "~5.0.0"
+ socket.io-adapter "~2.2.0"
+ socket.io-parser "~4.0.3"
+
+"statuses@>= 1.5.0 < 2", statuses@~1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+ integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
+
+toidentifier@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
+ integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
+
+type-is@~1.6.17, type-is@~1.6.18:
+ version "1.6.18"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
+uid-safe@~2.1.5:
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a"
+ integrity sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==
+ dependencies:
+ random-bytes "~1.0.0"
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
+
+vary@^1, vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
+
+ws@~7.4.2:
+ version "7.4.4"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz#383bc9742cb202292c9077ceab6f6047b17f2d59"
+ integrity sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==
From d703773b8856dde6c4739f1bea99c2d465828009 Mon Sep 17 00:00:00 2001
From: cv <34649812+cpvalente@users.noreply.github.com>
Date: Mon, 5 Apr 2021 23:17:59 +0200
Subject: [PATCH 3/5] websocket data test
---
client/src/features/editors/Editor.jsx | 7 ++--
server/app.js | 8 +++++
server/data/sampleData.js | 48 ++++++++++++++++++++++++++
3 files changed, 61 insertions(+), 2 deletions(-)
create mode 100644 server/data/sampleData.js
diff --git a/client/src/features/editors/Editor.jsx b/client/src/features/editors/Editor.jsx
index 73c6bd08f..4770e01df 100644
--- a/client/src/features/editors/Editor.jsx
+++ b/client/src/features/editors/Editor.jsx
@@ -38,8 +38,11 @@ export default function Editor() {
console.log('websocket started');
socket.on('FromAPI', (data) => {
- setResponse(data);
- console.log('websocket stuff', data);
+ console.log('got date', data);
+ });
+
+ socket.on('eventdata', (data) => {
+ console.log('got eventdata', data);
});
return () => socket.disconnect();
diff --git a/server/app.js b/server/app.js
index 111b00a71..9ef56fbb1 100644
--- a/server/app.js
+++ b/server/app.js
@@ -1,6 +1,10 @@
const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
+const sampleData = require('./data/sampleData.js');
+
+// TODO: implement timer
+// TODO: - Play / pause
const port = process.env.PORT || 4001;
const index = require('./routes/index');
@@ -8,8 +12,10 @@ const index = require('./routes/index');
const app = express();
app.use(index);
+// create HTTP server
const server = http.createServer(app);
+// initialise socketIO server
const io = socketIo(server, {
cors: {
origin: 'http://localhost:3000',
@@ -17,10 +23,12 @@ const io = socketIo(server, {
},
});
+// transmit
let interval;
io.on('connection', (socket) => {
console.log('New client connected');
+ socket.emit('eventdata', sampleData);
if (interval) {
clearInterval(interval);
}
diff --git a/server/data/sampleData.js b/server/data/sampleData.js
new file mode 100644
index 000000000..37aebb198
--- /dev/null
+++ b/server/data/sampleData.js
@@ -0,0 +1,48 @@
+const dummy = new Date();
+
+const sampleData = [
+ {
+ id: '1',
+ order: 1,
+ title: 'Is the internet a fad?',
+ subtitle: 'It is',
+ presenter: 'Carlos Valente',
+ timeStart: new Date('October 13, 2014 11:30:00'),
+ timeEnd: new Date('October 13, 2014 11:50:00'),
+ clockStarted: dummy,
+ timerDuration: 60,
+ type: 'event',
+ },
+ {
+ id: 0.4849093424577693,
+ order: 2,
+ timerDuration: 25,
+ type: 'delay',
+ },
+ {
+ id: '2',
+ order: 3,
+ title: 'Is reddit a dictatorship?',
+ subtitle: 'It is',
+ presenter: 'Carlos Valente',
+ timeStart: new Date('October 13, 2014 12:30:00'),
+ timeEnd: new Date('October 13, 2014 12:50:00'),
+ clockStarted: dummy,
+ timerDuration: 60,
+ type: 'event',
+ },
+ {
+ id: '3',
+ order: 4,
+ title: 'Out of words',
+ subtitle: '',
+ presenter: 'Carlos Valente',
+ timeStart: new Date('October 13, 2014 13:30:00'),
+ timeEnd: new Date('October 13, 2014 13:50:00'),
+ clockStarted: dummy,
+ timerDuration: 60,
+ type: 'event',
+ },
+];
+
+module.exports = sampleData;
\ No newline at end of file
From 766a117025f149947486196cba94bfbc7a39bcfc Mon Sep 17 00:00:00 2001
From: cv <34649812+cpvalente@users.noreply.github.com>
Date: Tue, 6 Apr 2021 12:21:30 +0200
Subject: [PATCH 4/5] time from server
---
client/src/features/editors/Editor.jsx | 146 ++-----------------------
server/app.js | 8 +-
2 files changed, 14 insertions(+), 140 deletions(-)
diff --git a/client/src/features/editors/Editor.jsx b/client/src/features/editors/Editor.jsx
index 4770e01df..b6938c931 100644
--- a/client/src/features/editors/Editor.jsx
+++ b/client/src/features/editors/Editor.jsx
@@ -29,7 +29,9 @@ export default function Editor() {
prevState: 'pause',
});
- const [response, setResponse] = useState('');
+ const updatePlayback = (vals) => {
+ setPlayback({ ...playback, ...vals });
+ };
// WEBSOCKETZ
useEffect(() => {
@@ -37,8 +39,9 @@ export default function Editor() {
const socket = io('http://localhost:4001', { transport: ['websocket'] });
console.log('websocket started');
- socket.on('FromAPI', (data) => {
- console.log('got date', data);
+ socket.on('timerSeconds', (data) => {
+ console.log('got time', data);
+ updatePlayback({ currentTimer: data });
});
socket.on('eventdata', (data) => {
@@ -48,60 +51,13 @@ export default function Editor() {
return () => socket.disconnect();
}, []);
- // Timer stuff
- const [timer, setTimer] = useState({
- TIMER_UPDATE_INTERVAL: 250,
- currentTime: null,
- currentTimeSeconds: null,
- playMode: 'stop',
-
- isStarted: false,
- isRunning: false,
-
- startTime: null,
- pauseTime: null,
-
- lastRun: null,
- elapsedTime: 0,
-
- elapsedStartedTime: 0,
- elapsedRunningTime: 0,
-
- totalElapsedPausedTime: 0,
- periodElapsedPausedTime: 0,
-
- elapsedResumeTime: 0,
-
- targetTime: null,
- });
-
- // update timer object
- const updateTimer = (vals) => {
- setTimer({ ...timer, ...vals });
- };
-
- // set timer target
- const setTimerTargetinSeconds = (target) => {
- const t = addSeconds(new Date(), target);
- updateTimer({ currentTime: t, currentTimeSeconds: target, targetTime: t });
- };
-
// timer playback control
const setTimerState = (state) => {
- const now = new Date();
-
switch (state) {
case 'play': {
- updateTimer({
- playMode: state,
- isStarted: true,
- startTime: now,
- lastRun: now,
- });
break;
}
case 'pause': {
- updateTimer({ playMode: state, pauseTime: now, isRunning: false });
break;
}
@@ -110,78 +66,6 @@ export default function Editor() {
}
};
- // update
- const updateTime = () => {
- // exit if we are not ready
- if (timer.startTime == null) return;
-
- // aux
- const now = new Date();
-
- // how long has the time been running
- const elapsedTime = now - timer.startTime;
-
- if (timer.playMode === 'play') {
- // current time here
- const currentTime = timer.targetTime - elapsedTime;
- updateTimer({
- currentTime: currentTime,
- currentTimeSeconds: getSeconds(currentTime),
- elapsedTime: elapsedTime,
- lastRun: now,
- });
- }
-
- if (timer.playMode === 'pause') {
- const pausedTime = now - timer.pauseTime;
- updateTimer({
- totalElapsedPausedTime: timer.totalElapsedPausedTime + pausedTime,
- periodElapsedPausedTime: timer.periodElapsedPausedTime + now,
- elapsedTime: elapsedTime,
- lastRun: now,
- });
- }
-
- // call again
- setTimeout(updateTime, timer.TIMER_UPDATE_INTERVAL);
- };
-
- // when playmode changes, we might schedule a timer
- // is this enough for change or should i check prevstate?
- useEffect(() => {
- if (playback.state !== 'stop' || playback.state !== null) {
- updateTime();
- }
- }, [playback.state]);
-
- const updatePlayback = (vals) => {
- setPlayback({ ...playback, ...vals });
- };
-
- // gets timer on current
- // ?? I have already done this a few times,
- // maybe loop once and get all data?
- const getCurrentTime = (target) => {
- if (events !== null) {
- // loop through events to find target
- const filteredEvents = events.filter((e) => e.type === 'event');
- const curEvent = filteredEvents[target];
-
- // set as event
- setEvent(curEvent);
-
- // extract time only from dates
- let minStart = getHours(curEvent.timeStart) * 60;
- minStart = minStart + getMinutes(curEvent.timeStart);
-
- let minEnd = getHours(curEvent.timeEnd) * 60;
- minEnd = minEnd + getMinutes(curEvent.timeEnd);
-
- // return time in seconds
- return (minEnd - minStart) * 60;
- }
- };
-
const playbackControl = (action, payload) => {
switch (action) {
case 'play': {
@@ -217,13 +101,8 @@ export default function Editor() {
}
if (playback.numEvents > 1) nxt = cur + 1;
if (nxt > playback.numEvents) nxt = playback.numEvents;
-
- // get time
- let time = getCurrentTime(cur);
// update playback
- updatePlayback({ current: cur, next: nxt, currentTimer: time });
- // set timer
- setTimerTargetinSeconds(time);
+ updatePlayback({ current: cur, next: nxt });
}
break;
}
@@ -238,13 +117,7 @@ export default function Editor() {
}
if (playback.numEvents > 1) nxt = cur + 1;
if (nxt >= playback.numEvents) nxt = playback.numEvents - 1;
-
- // get time
- let time = getCurrentTime(cur);
- // update playback
- updatePlayback({ current: cur, next: nxt, currentTimer: time });
- // set timer
- setTimerTargetinSeconds(time);
+ updatePlayback({ current: cur, next: nxt });
}
break;
}
@@ -254,7 +127,6 @@ export default function Editor() {
};
console.log('playback here', playback);
- console.log('timer here', timer);
return (
diff --git a/server/app.js b/server/app.js
index 9ef56fbb1..ac1bf1563 100644
--- a/server/app.js
+++ b/server/app.js
@@ -23,6 +23,9 @@ const io = socketIo(server, {
},
});
+// timer stuff, for now
+let timer = 5400;
+
// transmit
let interval;
@@ -40,9 +43,8 @@ io.on('connection', (socket) => {
});
const getApiAndEmit = (socket) => {
- const response = new Date();
- // Emitting a new message. Will be consumed by the client
- socket.emit('FromAPI', response);
+ socket.emit('timerSeconds', timer);
+ if (timer > 0) timer = timer - 1;
};
server.listen(port, () => console.log(`Listening on port ${port}`));
From 9d10e6283c7ff24dc61c487c6263e6add48c500f Mon Sep 17 00:00:00 2001
From: cv <34649812+cpvalente@users.noreply.github.com>
Date: Tue, 6 Apr 2021 12:38:54 +0200
Subject: [PATCH 5/5] update .gitignore
---
.gitignore | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.gitignore b/.gitignore
index 35b7f1997..6e37e924c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,7 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
-node_modules
+node_modules/
/.pnp
.pnp.js