UNPKG

@neurosity/sdk

Version:
53 lines (52 loc) 1.77 kB
import { Observable, throwError, EMPTY } from "rxjs"; import { switchMap } from "rxjs/operators"; import { whileOnline } from "./whileOnline"; import { validate } from "./subscription"; /** * @internal */ export function getCloudMetric(dependencies, subscription) { const { options, cloudClient, onDeviceChange, status } = dependencies; const { metric, labels, atomic } = subscription; const metricError = validate(metric, labels, options); if (metricError) { return throwError(() => metricError); } const metric$ = new Observable((observer) => { const subscriptions = atomic ? [ cloudClient.metrics.subscribe({ metric: metric, labels: labels, atomic: atomic }) ] : labels.map((label) => { return cloudClient.metrics.subscribe({ metric: metric, labels: [label], atomic: atomic }); }); const subscriptionWithListeners = subscriptions.map((subscription) => ({ subscription, listener: cloudClient.metrics.on(subscription, (...data) => { observer.next(...data); }) })); return () => { subscriptionWithListeners.forEach(({ subscription, listener }) => { cloudClient.metrics.unsubscribe(subscription, listener); }); }; }); return onDeviceChange().pipe(switchMap((device) => { if (!device) { return EMPTY; } return metric$.pipe(whileOnline({ status$: status(), allowWhileOnSleepMode: false })); })); }