Created
March 29, 2021 11:38
-
-
Save hedleygois/6ab3ce0842014bb8b41bd4710f58ddfa to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
export type TelemetryDefinitionsParams = [ | |
string, | |
NodeId[], | |
Opt<Moment>, | |
number | |
]; | |
type Output = RequestStatus<Error, TelemetryStreamDefinition[]>; | |
export const useTelemetryStreamDefinitions = (): Output => { | |
const query = useSelector(selectQueryToExecute); | |
const selection = useSelector(selectTelemetryComponentSelection); | |
const timeoutInSeconds = useSelector(selectDefaultAjaxRequestTimeout); | |
const timestamp = useSelector(selectedTimestamp); | |
const definitions$ = useObservable<Output, TelemetryDefinitionsParams>(getTelemetryDefinitions, [ | |
query, | |
selection, | |
timestamp, | |
timeoutInSeconds | |
]); | |
return useObservableState(definitions$, loadingStatus()); | |
}; | |
export function getTelemetryDefinitions(props: Observable<TelemetryDefinitionsParams>): Observable<Output> { | |
const ONE_MINUTE = 60000; // 1 minute | |
const requestProps = props.pipe( | |
map(([query, selection, queryTime, timeoutInSeconds]) => ({ | |
query, | |
selection, | |
queryTime, | |
timeoutInSeconds | |
})), | |
distinctUntilChanged(isEqual) | |
); | |
const requestPast = requestProps.pipe( | |
filter(request => request.queryTime.isPresent()), | |
flatMap(({ query, selection, queryTime, timeoutInSeconds }) => | |
requestTelemetryDefinitionsObservable({ | |
query, | |
selection, | |
queryTime, | |
timeoutInSeconds | |
}) | |
) | |
); | |
const pollLive = pollRequest({ | |
startPoll: requestProps.pipe(filter(request => request.queryTime.isAbsent())), | |
stopPoll: requestProps.pipe( | |
filter(request => request.queryTime.isPresent()), | |
mapTo(undefined) | |
), | |
request: requestTelemetryDefinitionsObservable, | |
interval: ONE_MINUTE | |
}); | |
return merge(requestPast, pollLive); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment