Skip to content

Instantly share code, notes, and snippets.

@hedleygois
Created March 29, 2021 11:38
Show Gist options
  • Save hedleygois/6ab3ce0842014bb8b41bd4710f58ddfa to your computer and use it in GitHub Desktop.
Save hedleygois/6ab3ce0842014bb8b41bd4710f58ddfa to your computer and use it in GitHub Desktop.
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