Improve handling of disconnected Streamdelay server

This commit is contained in:
Max Goodhart
2020-06-30 17:23:16 -07:00
parent cc79f387fd
commit cc14f2a17f
3 changed files with 33 additions and 24 deletions

View File

@@ -36,8 +36,13 @@ export default class StreamdelayClient extends EventEmitter {
} }
emitState() { emitState() {
const isConnected = this.ws.readyState === WebSocket.OPEN
if (isConnected && !this.status) {
// Wait until we've received the first status message
return
}
this.emit('state', { this.emit('state', {
isConnected: this.ws.readyState === WebSocket.OPEN, isConnected,
...this.status, ...this.status,
}) })
} }

View File

@@ -105,7 +105,7 @@ async function main() {
streams: [], streams: [],
customStreams: [], customStreams: [],
views: [], views: [],
streamdelay: false, streamdelay: { isConnected: false },
} }
const getInitialState = () => clientState const getInitialState = () => clientState
let broadcastState = () => {} let broadcastState = () => {}

View File

@@ -22,7 +22,9 @@ function App({ wsEndpoint }) {
const [streams, setStreams] = useState([]) const [streams, setStreams] = useState([])
const [customStreams, setCustomStreams] = useState([]) const [customStreams, setCustomStreams] = useState([])
const [stateIdxMap, setStateIdxMap] = useState(new Map()) const [stateIdxMap, setStateIdxMap] = useState(new Map())
const [delayState, setDelayState] = useState(false) const [delayState, setDelayState] = useState({
isConnected: false,
})
const allStreams = sortBy([...streams, ...customStreams], ['_id']) const allStreams = sortBy([...streams, ...customStreams], ['_id'])
useEffect(() => { useEffect(() => {
@@ -70,7 +72,7 @@ function App({ wsEndpoint }) {
setStreams(newStreams) setStreams(newStreams)
setCustomStreams(newCustomStreams) setCustomStreams(newCustomStreams)
setDelayState( setDelayState(
streamdelay && { streamdelay.isConnected && {
...streamdelay, ...streamdelay,
state: State.from(streamdelay.state), state: State.from(streamdelay.state),
}, },
@@ -228,12 +230,10 @@ function App({ wsEndpoint }) {
<div> <div>
connection status: {isConnected ? 'connected' : 'connecting...'} connection status: {isConnected ? 'connected' : 'connecting...'}
</div> </div>
{delayState !== false && (
<StreamDelayBox <StreamDelayBox
delayState={delayState} delayState={delayState}
setStreamCensored={setStreamCensored} setStreamCensored={setStreamCensored}
/> />
)}
<StyledDataContainer isConnected={isConnected}> <StyledDataContainer isConnected={isConnected}>
<div> <div>
{range(0, GRID_COUNT).map((y) => ( {range(0, GRID_COUNT).map((y) => (
@@ -304,6 +304,7 @@ function StreamDelayBox({ delayState, setStreamCensored }) {
setStreamCensored(!delayState.isCensored) setStreamCensored(!delayState.isCensored)
}, [delayState.isCensored, setStreamCensored]) }, [delayState.isCensored, setStreamCensored])
let buttonText let buttonText
if (delayState.isConnected) {
if (delayState.state.matches('censorship.censored.deactivating')) { if (delayState.state.matches('censorship.censored.deactivating')) {
buttonText = 'Deactivating...' buttonText = 'Deactivating...'
} else if (delayState.isCensored) { } else if (delayState.isCensored) {
@@ -311,14 +312,15 @@ function StreamDelayBox({ delayState, setStreamCensored }) {
} else { } else {
buttonText = 'Censor stream' buttonText = 'Censor stream'
} }
}
return ( return (
<div> <div>
<StyledStreamDelayBox> <StyledStreamDelayBox>
<strong>Streamdelay</strong> <strong>Streamdelay</strong>
<span>{delayState.isConnected ? 'connected' : 'connecting...'}</span> <span>{delayState.isConnected ? 'connected' : 'connecting...'}</span>
{delayState.isConnected && ( {delayState.isConnected && (
<>
<span>delay: {delayState.delaySeconds}s</span> <span>delay: {delayState.delaySeconds}s</span>
)}
<StyledToggleButton <StyledToggleButton
isActive={delayState.isCensored} isActive={delayState.isCensored}
onClick={handleToggleStreamCensored} onClick={handleToggleStreamCensored}
@@ -326,6 +328,8 @@ function StreamDelayBox({ delayState, setStreamCensored }) {
> >
{buttonText} {buttonText}
</StyledToggleButton> </StyledToggleButton>
</>
)}
</StyledStreamDelayBox> </StyledStreamDelayBox>
</div> </div>
) )