Repository navigation
Expand file tree
/
Copy pathfromRef.ts
More file actions
60 lines (57 loc) · 1.73 KB
/
Copy pathfromRef.ts
File metadata and controls
60 lines (57 loc) · 1.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import { AngularFireAction, DatabaseQuery, DatabaseSnapshot, ListenEvent } from '../interfaces';
import { asyncScheduler, Observable, SchedulerLike } from 'rxjs';
import { map, share } from 'rxjs/operators';
interface SnapshotPrevKey<T> {
snapshot: DatabaseSnapshot<T>;
prevKey: string | null | undefined;
}
/**
* Create an observable from a Database Reference or Database Query.
* @param ref Database Reference
* @param event Listen event type ('value', 'added', 'changed', 'removed', 'moved')
* @param listenType 'on' or 'once'
* @param scheduler - Rxjs scheduler
*/
export function fromRef<T>(ref: DatabaseQuery,
event: ListenEvent,
listenType = 'on',
scheduler: SchedulerLike = asyncScheduler
): Observable<AngularFireAction<DatabaseSnapshot<T>>> {
return new Observable<SnapshotPrevKey<T>>(subscriber => {
let fn: any | null = null;
fn = ref[listenType](event, (snapshot, prevKey) => {
scheduler.schedule(() => {
subscriber.next({ snapshot, prevKey });
});
if (listenType === 'once') {
scheduler.schedule(() => subscriber.complete());
}
}, err => {
scheduler.schedule(() => subscriber.error(err));
});
if (listenType === 'on') {
return {
unsubscribe() {
if (fn != null) {
ref.off(event, fn);
}
}
};
} else {
return {
unsubscribe() {
}
};
}
}).pipe(
map(payload => {
const { snapshot, prevKey } = payload;
let key: string | null = null;
if (snapshot.exists()) {
key = snapshot.key;
}
return { type: event, payload: snapshot, prevKey, key };
}),
share()
);
}