mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-03-31 04:23:40 +00:00
refactor: isolate network toast and login redirect to separate services (#1412)
* refactor: isolate network toast and login redirect to separate services * chore: remove accidentally committed sketch of a service * chore: tidying things up * feat: add `GlobalModule` encapsulating all global subscription services * remove angular build cache when building deps * chore: fix more issues found while testing * chore: fix issues reported by testing * chore: fix template error * chore: fix server-info * chore: fix server-info * fix: switch to Observable to fix race conditions * fix embassy name display on load * update patchdb * clean up patch data watch Co-authored-by: Lucy Cifferello <12953208+elvece@users.noreply.github.com>
This commit is contained in:
@@ -1,31 +1,54 @@
|
||||
import { Observable, from, interval, race, OperatorFunction, Observer, combineLatest } from 'rxjs'
|
||||
import { take, map, concatMap } from 'rxjs/operators'
|
||||
import {
|
||||
Observable,
|
||||
from,
|
||||
interval,
|
||||
race,
|
||||
OperatorFunction,
|
||||
Observer,
|
||||
combineLatest,
|
||||
} from 'rxjs'
|
||||
import { take, map } from 'rxjs/operators'
|
||||
|
||||
export function fromAsync$<S, T> (async: (s: S) => Promise<T>, s: S): Observable<T>
|
||||
export function fromAsync$<T> (async: () => Promise<T>): Observable<T>
|
||||
export function fromAsync$<S, T> (async: (s: S) => Promise<T>, s?: S): Observable<T> {
|
||||
export function fromAsync$<S, T>(
|
||||
async: (s: S) => Promise<T>,
|
||||
s: S,
|
||||
): Observable<T>
|
||||
export function fromAsync$<T>(async: () => Promise<T>): Observable<T>
|
||||
export function fromAsync$<S, T>(
|
||||
async: (s: S) => Promise<T>,
|
||||
s?: S,
|
||||
): Observable<T> {
|
||||
return from(async(s as S))
|
||||
}
|
||||
|
||||
export function fromAsyncP<T> (async: () => Promise<T>): Promise<T>
|
||||
export function fromAsyncP<S, T> (async: (s: S) => Promise<T>, s?: S): Promise<T> {
|
||||
export function fromAsyncP<T>(async: () => Promise<T>): Promise<T>
|
||||
export function fromAsyncP<S, T>(
|
||||
async: (s: S) => Promise<T>,
|
||||
s?: S,
|
||||
): Promise<T> {
|
||||
return async(s as S)
|
||||
}
|
||||
|
||||
// emits + completes after ms
|
||||
export function emitAfter$ (ms: number): Observable<number> {
|
||||
export function emitAfter$(ms: number): Observable<number> {
|
||||
return interval(ms).pipe(take(1))
|
||||
}
|
||||
|
||||
// throws unless source observable emits withing timeout
|
||||
export function throwIn<T> (timeout: number): OperatorFunction<T, T> {
|
||||
return o => race(
|
||||
o,
|
||||
emitAfter$(timeout).pipe(map(() => { throw new Error('timeout') } )))
|
||||
export function throwIn<T>(timeout: number): OperatorFunction<T, T> {
|
||||
return o =>
|
||||
race(
|
||||
o,
|
||||
emitAfter$(timeout).pipe(
|
||||
map(() => {
|
||||
throw new Error('timeout')
|
||||
}),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
// o.pipe(squash) : Observable<void> regardless of o emission type.
|
||||
export const squash = map(() => { })
|
||||
export const squash = map(() => {})
|
||||
|
||||
/*
|
||||
The main purpose of fromSync$ is to normalize error handling during a sequence
|
||||
@@ -59,10 +82,10 @@ export const squash = map(() => { })
|
||||
}
|
||||
```
|
||||
*/
|
||||
export function fromSync$<S, T> (sync: (s: S) => T, s: S): Observable<T>
|
||||
export function fromSync$<T> (sync: () => T): Observable<T>
|
||||
export function fromSync$<S, T> (sync: (s: S) => T, s?: S): Observable<T> {
|
||||
return new Observable( (subscriber: Observer<T>) => {
|
||||
export function fromSync$<S, T>(sync: (s: S) => T, s: S): Observable<T>
|
||||
export function fromSync$<T>(sync: () => T): Observable<T>
|
||||
export function fromSync$<S, T>(sync: (s: S) => T, s?: S): Observable<T> {
|
||||
return new Observable((subscriber: Observer<T>) => {
|
||||
try {
|
||||
subscriber.next(sync(s as S))
|
||||
subscriber.complete()
|
||||
@@ -71,24 +94,3 @@ export function fromSync$<S, T> (sync: (s: S) => T, s?: S): Observable<T> {
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/*
|
||||
this function concats the current values (e.g in behavior subjects) or next values (in traditional observables) to a collection of values in a pipe.
|
||||
e.g. if t: Observable<T>, and o1: Observable<O1> o2: Observable<O2> then t.pipe(concatObservableValues([o1, o2])): Observable<[T1, O1, O2]> and emits iff t emits.
|
||||
Note that the standard combineLatest([t, o1, o2]) is also of type Observable<[T, O2, O2]>, but this observable triggers when any of t, o1, o2 emits.
|
||||
*/
|
||||
export function concatObservableValues<T, O> (observables: [Observable<O>]): OperatorFunction<T, [T, O]>
|
||||
export function concatObservableValues<T, O> (observables: [Observable<O>]): OperatorFunction<[T], [T, O]>
|
||||
export function concatObservableValues<T1, T2, O> (observables: [Observable<O>]): OperatorFunction<[T1, T2], [T1, T2, O]>
|
||||
export function concatObservableValues<T, O1, O2> (observables: [Observable<O1>, Observable<O2>]): OperatorFunction<[T], [T, O1, O2]>
|
||||
export function concatObservableValues<T1, T2, O1, O2> (observables: [Observable<O1>, Observable<O2>]): OperatorFunction<[T1, T2], [T1, T2, O1, O2]>
|
||||
export function concatObservableValues (observables: Observable<any>[]): OperatorFunction<any[], any[]> {
|
||||
return o => o.pipe(concatMap(args => combineLatest(observables).pipe(
|
||||
map(obs => {
|
||||
if (!(args instanceof Array)) return [args, ...obs]
|
||||
return [...args, ...obs]
|
||||
}),
|
||||
take(1),
|
||||
),
|
||||
))
|
||||
}
|
||||
Reference in New Issue
Block a user