@sanity/client
Version:
Client for retrieving, creating and patching data from Sanity.io
31 lines (28 loc) • 914 B
text/typescript
import {
catchError,
concat,
mergeMap,
Observable,
of,
type OperatorFunction,
throwError,
timer,
} from 'rxjs'
import {ConnectionFailedError} from './eventsource'
/**
* Note: connection failure is not the same as network disconnect which may happen more frequent.
* The EventSource instance will automatically reconnect in case of a network disconnect, however,
* in some rare cases a ConnectionFailed Error will be thrown and this operator explicitly retries these
*/
export function reconnectOnConnectionFailure<T>(): OperatorFunction<T, T | {type: 'reconnect'}> {
return function (source: Observable<T>) {
return source.pipe(
catchError((err, caught) => {
if (err instanceof ConnectionFailedError) {
return concat(of({type: 'reconnect' as const}), timer(1000).pipe(mergeMap(() => caught)))
}
return throwError(() => err)
}),
)
}
}