@angular/fire
Version:
The official library for Firebase and Angular
115 lines • 9.17 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { stateChanges } from './state-changes';
import { fromRef } from '../observable/fromRef';
import { map, scan, skipWhile, withLatestFrom } from 'rxjs/operators';
/**
* @template T
* @param {?} query
* @param {?=} events
* @param {?=} scheduler
* @return {?}
*/
export function auditTrail(query, events, scheduler) {
/** @type {?} */
const auditTrail$ = stateChanges(query, events)
.pipe(scan((/**
* @param {?} current
* @param {?} action
* @return {?}
*/
(current, action) => [...current, action]), []));
return waitForLoaded(query, auditTrail$, scheduler);
}
/**
* @record
*/
function LoadedMetadata() { }
if (false) {
/** @type {?} */
LoadedMetadata.prototype.data;
/** @type {?} */
LoadedMetadata.prototype.lastKeyToLoad;
}
/**
* @template T
* @param {?} query
* @param {?=} scheduler
* @return {?}
*/
function loadedData(query, scheduler) {
// Create an observable of loaded values to retrieve the
// known dataset. This will allow us to know what key to
// emit the "whole" array at when listening for child events.
return fromRef(query, 'value', 'on', scheduler)
.pipe(map((/**
* @param {?} data
* @return {?}
*/
data => {
// Store the last key in the data set
/** @type {?} */
let lastKeyToLoad;
// Loop through loaded dataset to find the last key
data.payload.forEach((/**
* @param {?} child
* @return {?}
*/
child => {
lastKeyToLoad = child.key;
return false;
}));
// return data set and the current last key loaded
return { data, lastKeyToLoad };
})));
}
/**
* @template T
* @param {?} query
* @param {?} action$
* @param {?=} scheduler
* @return {?}
*/
function waitForLoaded(query, action$, scheduler) {
/** @type {?} */
const loaded$ = loadedData(query, scheduler);
return loaded$
.pipe(withLatestFrom(action$),
// Get the latest values from the "loaded" and "child" datasets
// We can use both datasets to form an array of the latest values.
map((/**
* @param {?} __0
* @return {?}
*/
([loaded, actions]) => {
// Store the last key in the data set
/** @type {?} */
const lastKeyToLoad = loaded.lastKeyToLoad;
// Store all child keys loaded at this point
/** @type {?} */
const loadedKeys = actions.map((/**
* @param {?} snap
* @return {?}
*/
snap => snap.key));
return { actions, lastKeyToLoad, loadedKeys };
})),
// This is the magical part, only emit when the last load key
// in the dataset has been loaded by a child event. At this point
// we can assume the dataset is "whole".
skipWhile((/**
* @param {?} meta
* @return {?}
*/
meta => meta.loadedKeys.indexOf(meta.lastKeyToLoad) === -1)),
// Pluck off the meta data because the user only cares
// to iterate through the snapshots
map((/**
* @param {?} meta
* @return {?}
*/
meta => meta.actions)));
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdHJhaWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvbGlzdC9hdWRpdC10cmFpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7O0FBRXRFLE1BQU0sVUFBVSxVQUFVLENBQUksS0FBb0IsRUFBRSxNQUFxQixFQUFFLFNBQXlCOztVQUM1RixXQUFXLEdBQUcsWUFBWSxDQUFJLEtBQUssRUFBRSxNQUFNLENBQUM7U0FDL0MsSUFBSSxDQUNILElBQUk7Ozs7O0lBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsT0FBTyxFQUFFLE1BQU0sQ0FBQyxHQUFFLEVBQUUsQ0FBQyxDQUNwRDtJQUNILE9BQU8sYUFBYSxDQUFJLEtBQUssRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDekQsQ0FBQzs7OztBQUVELDZCQUdDOzs7SUFGQyw4QkFBc0M7O0lBQ3RDLHVDQUFtQjs7Ozs7Ozs7QUFHckIsU0FBUyxVQUFVLENBQUksS0FBb0IsRUFBRSxTQUF5QjtJQUNwRSx3REFBd0Q7SUFDeEQsd0RBQXdEO0lBQ3hELDZEQUE2RDtJQUM3RCxPQUFPLE9BQU8sQ0FBSSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLENBQUM7U0FDakQsSUFBSSxDQUNILEdBQUc7Ozs7SUFBQyxJQUFJLENBQUMsRUFBRTs7O1lBRUwsYUFBYTtRQUNqQixtREFBbUQ7UUFDbkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPOzs7O1FBQUMsS0FBSyxDQUFDLEVBQUU7WUFDM0IsYUFBYSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFBQyxPQUFPLEtBQUssQ0FBQztRQUMxQyxDQUFDLEVBQUMsQ0FBQztRQUNILGtEQUFrRDtRQUNsRCxPQUFPLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDO0lBQ2pDLENBQUMsRUFBQyxDQUNILENBQUM7QUFDSixDQUFDOzs7Ozs7OztBQUVELFNBQVMsYUFBYSxDQUFJLEtBQW9CLEVBQUUsT0FBd0MsRUFBRSxTQUF5Qjs7VUFDM0csT0FBTyxHQUFHLFVBQVUsQ0FBSSxLQUFLLEVBQUUsU0FBUyxDQUFDO0lBQy9DLE9BQU8sT0FBTztTQUNYLElBQUksQ0FDSCxjQUFjLENBQUMsT0FBTyxDQUFDO0lBQ3ZCLCtEQUErRDtJQUMvRCxrRUFBa0U7SUFDbEUsR0FBRzs7OztJQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRTs7O2NBRWxCLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYTs7O2NBRXBDLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRzs7OztRQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBQztRQUNoRCxPQUFPLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsQ0FBQztJQUNoRCxDQUFDLEVBQUM7SUFDRiw2REFBNkQ7SUFDN0QsaUVBQWlFO0lBQ2pFLHdDQUF3QztJQUN4QyxTQUFTOzs7O0lBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUM7SUFDckUsc0RBQXNEO0lBQ3RELG1DQUFtQztJQUNuQyxHQUFHOzs7O0lBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFDLENBQzFCLENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5ndWxhckZpcmVBY3Rpb24sIENoaWxkRXZlbnQsIERhdGFiYXNlUXVlcnksIERhdGFTbmFwc2hvdCwgU25hcHNob3RBY3Rpb24gfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IHN0YXRlQ2hhbmdlcyB9IGZyb20gJy4vc3RhdGUtY2hhbmdlcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTY2hlZHVsZXJMaWtlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmcm9tUmVmIH0gZnJvbSAnLi4vb2JzZXJ2YWJsZS9mcm9tUmVmJztcblxuaW1wb3J0IHsgbWFwLCBzY2FuLCBza2lwV2hpbGUsIHdpdGhMYXRlc3RGcm9tIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXVkaXRUcmFpbDxUPihxdWVyeTogRGF0YWJhc2VRdWVyeSwgZXZlbnRzPzogQ2hpbGRFdmVudFtdLCBzY2hlZHVsZXI/OiBTY2hlZHVsZXJMaWtlKTogT2JzZXJ2YWJsZTxTbmFwc2hvdEFjdGlvbjxUPltdPiB7XG4gIGNvbnN0IGF1ZGl0VHJhaWwkID0gc3RhdGVDaGFuZ2VzPFQ+KHF1ZXJ5LCBldmVudHMpXG4gICAgLnBpcGUoXG4gICAgICBzY2FuKChjdXJyZW50LCBhY3Rpb24pID0+IFsuLi5jdXJyZW50LCBhY3Rpb25dLCBbXSlcbiAgICApO1xuICByZXR1cm4gd2FpdEZvckxvYWRlZDxUPihxdWVyeSwgYXVkaXRUcmFpbCQsIHNjaGVkdWxlcik7XG59XG5cbmludGVyZmFjZSBMb2FkZWRNZXRhZGF0YSB7XG4gIGRhdGE6IEFuZ3VsYXJGaXJlQWN0aW9uPERhdGFTbmFwc2hvdD47XG4gIGxhc3RLZXlUb0xvYWQ6IGFueTtcbn1cblxuZnVuY3Rpb24gbG9hZGVkRGF0YTxUPihxdWVyeTogRGF0YWJhc2VRdWVyeSwgc2NoZWR1bGVyPzogU2NoZWR1bGVyTGlrZSk6IE9ic2VydmFibGU8TG9hZGVkTWV0YWRhdGE+IHtcbiAgLy8gQ3JlYXRlIGFuIG9ic2VydmFibGUgb2YgbG9hZGVkIHZhbHVlcyB0byByZXRyaWV2ZSB0aGVcbiAgLy8ga25vd24gZGF0YXNldC4gVGhpcyB3aWxsIGFsbG93IHVzIHRvIGtub3cgd2hhdCBrZXkgdG9cbiAgLy8gZW1pdCB0aGUgXCJ3aG9sZVwiIGFycmF5IGF0IHdoZW4gbGlzdGVuaW5nIGZvciBjaGlsZCBldmVudHMuXG4gIHJldHVybiBmcm9tUmVmPFQ+KHF1ZXJ5LCAndmFsdWUnLCAnb24nLCBzY2hlZHVsZXIpXG4gIC5waXBlKFxuICAgIG1hcChkYXRhID0+IHtcbiAgICAgIC8vIFN0b3JlIHRoZSBsYXN0IGtleSBpbiB0aGUgZGF0YSBzZXRcbiAgICAgIGxldCBsYXN0S2V5VG9Mb2FkO1xuICAgICAgLy8gTG9vcCB0aHJvdWdoIGxvYWRlZCBkYXRhc2V0IHRvIGZpbmQgdGhlIGxhc3Qga2V5XG4gICAgICBkYXRhLnBheWxvYWQuZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgIGxhc3RLZXlUb0xvYWQgPSBjaGlsZC5rZXk7IHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICAgICAgLy8gcmV0dXJuIGRhdGEgc2V0IGFuZCB0aGUgY3VycmVudCBsYXN0IGtleSBsb2FkZWRcbiAgICAgIHJldHVybiB7IGRhdGEsIGxhc3RLZXlUb0xvYWQgfTtcbiAgICB9KVxuICApO1xufVxuXG5mdW5jdGlvbiB3YWl0Rm9yTG9hZGVkPFQ+KHF1ZXJ5OiBEYXRhYmFzZVF1ZXJ5LCBhY3Rpb24kOiBPYnNlcnZhYmxlPFNuYXBzaG90QWN0aW9uPFQ+W10+LCBzY2hlZHVsZXI/OiBTY2hlZHVsZXJMaWtlKSB7XG4gIGNvbnN0IGxvYWRlZCQgPSBsb2FkZWREYXRhPFQ+KHF1ZXJ5LCBzY2hlZHVsZXIpO1xuICByZXR1cm4gbG9hZGVkJFxuICAgIC5waXBlKFxuICAgICAgd2l0aExhdGVzdEZyb20oYWN0aW9uJCksXG4gICAgICAvLyBHZXQgdGhlIGxhdGVzdCB2YWx1ZXMgZnJvbSB0aGUgXCJsb2FkZWRcIiBhbmQgXCJjaGlsZFwiIGRhdGFzZXRzXG4gICAgICAvLyBXZSBjYW4gdXNlIGJvdGggZGF0YXNldHMgdG8gZm9ybSBhbiBhcnJheSBvZiB0aGUgbGF0ZXN0IHZhbHVlcy5cbiAgICAgIG1hcCgoW2xvYWRlZCwgYWN0aW9uc10pID0+IHtcbiAgICAgICAgLy8gU3RvcmUgdGhlIGxhc3Qga2V5IGluIHRoZSBkYXRhIHNldFxuICAgICAgICBjb25zdCBsYXN0S2V5VG9Mb2FkID0gbG9hZGVkLmxhc3RLZXlUb0xvYWQ7XG4gICAgICAgIC8vIFN0b3JlIGFsbCBjaGlsZCBrZXlzIGxvYWRlZCBhdCB0aGlzIHBvaW50XG4gICAgICAgIGNvbnN0IGxvYWRlZEtleXMgPSBhY3Rpb25zLm1hcChzbmFwID0+IHNuYXAua2V5KTtcbiAgICAgICAgcmV0dXJuIHsgYWN0aW9ucywgbGFzdEtleVRvTG9hZCwgbG9hZGVkS2V5cyB9O1xuICAgICAgfSksXG4gICAgICAvLyBUaGlzIGlzIHRoZSBtYWdpY2FsIHBhcnQsIG9ubHkgZW1pdCB3aGVuIHRoZSBsYXN0IGxvYWQga2V5XG4gICAgICAvLyBpbiB0aGUgZGF0YXNldCBoYXMgYmVlbiBsb2FkZWQgYnkgYSBjaGlsZCBldmVudC4gQXQgdGhpcyBwb2ludFxuICAgICAgLy8gd2UgY2FuIGFzc3VtZSB0aGUgZGF0YXNldCBpcyBcIndob2xlXCIuXG4gICAgICBza2lwV2hpbGUobWV0YSA9PiBtZXRhLmxvYWRlZEtleXMuaW5kZXhPZihtZXRhLmxhc3RLZXlUb0xvYWQpID09PSAtMSksXG4gICAgICAvLyBQbHVjayBvZmYgdGhlIG1ldGEgZGF0YSBiZWNhdXNlIHRoZSB1c2VyIG9ubHkgY2FyZXNcbiAgICAgIC8vIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUgc25hcHNob3RzXG4gICAgICBtYXAobWV0YSA9PiBtZXRhLmFjdGlvbnMpXG4gICAgKTtcbn1cbiJdfQ==