@orbit/record-cache
Version:
Orbit base classes used to access and maintain a set of records.
113 lines • 16 kB
JavaScript
;
var _a, _b;
Object.defineProperty(exports, "__esModule", { value: true });
exports.LiveQuery = void 0;
const core_1 = require("@orbit/core");
const records_1 = require("@orbit/records");
const record_change_1 = require("./record-change");
const { assert } = core_1.Orbit;
class LiveQuery {
constructor(settings) {
assert('Only single expression queries are supported on LiveQuery', !Array.isArray(settings.query.expressions));
this.debounce = settings.debounce;
this._query = settings.query;
}
_subscribe(onNext) {
const execute = this.debounce ? onceTick(onNext) : onNext;
const unsubscribePatch = this.cache.on('patch', (operation) => {
if (this.operationRelevantForQuery(operation)) {
execute();
}
});
const unsubscribeReset = this.cache.on('reset', () => {
execute();
});
function unsubscribe() {
cancelTick(execute);
unsubscribePatch();
unsubscribeReset();
}
return unsubscribe;
}
operationRelevantForQuery(operation) {
const change = (0, record_change_1.recordOperationChange)(operation);
const expression = this._query.expressions;
return this.queryExpressionRelevantForChange(expression, change);
}
queryExpressionRelevantForChange(expression, change) {
switch (expression.op) {
case 'findRecord':
return this.findRecordQueryExpressionRelevantForChange(expression, change);
case 'findRecords':
return this.findRecordsQueryExpressionRelevantForChange(expression, change);
case 'findRelatedRecord':
return this.findRelatedRecordQueryExpressionRelevantForChange(expression, change);
case 'findRelatedRecords':
return this.findRelatedRecordsQueryExpressionRelevantForChange(expression, change);
default:
return true;
}
}
findRecordQueryExpressionRelevantForChange(expression, change) {
return (0, records_1.equalRecordIdentities)(expression.record, change);
}
findRecordsQueryExpressionRelevantForChange(expression, change) {
if (expression.type) {
return expression.type === change.type;
}
else if (expression.records) {
for (let record of expression.records) {
if (record.type === change.type) {
return true;
}
}
return false;
}
return true;
}
findRelatedRecordQueryExpressionRelevantForChange(expression, change) {
return ((0, records_1.equalRecordIdentities)(expression.record, change) &&
(change.relationships.includes(expression.relationship) || change.remove));
}
findRelatedRecordsQueryExpressionRelevantForChange(expression, change) {
const relationshipDef = this.schema.getRelationship(expression.record.type, expression.relationship);
const type = relationshipDef === null || relationshipDef === void 0 ? void 0 : relationshipDef.type;
if (Array.isArray(type) && type.find((type) => type === change.type)) {
return true;
}
else if (type === change.type) {
return true;
}
return ((0, records_1.equalRecordIdentities)(expression.record, change) &&
(change.relationships.includes(expression.relationship) || change.remove));
}
}
exports.LiveQuery = LiveQuery;
const isNode = typeof ((_a = core_1.Orbit.globals.process) === null || _a === void 0 ? void 0 : _a.nextTick) === 'function';
let resolvedPromise;
const nextTick = isNode
? function (fn) {
if (!resolvedPromise) {
resolvedPromise = Promise.resolve();
}
resolvedPromise.then(() => {
core_1.Orbit.globals.process.nextTick(fn);
});
}
: (_b = core_1.Orbit.globals.setImmediate) !== null && _b !== void 0 ? _b : setTimeout;
function onceTick(fn) {
return function tick() {
if (!ticks.has(tick)) {
ticks.add(tick);
nextTick(() => {
fn();
cancelTick(tick);
});
}
};
}
function cancelTick(tick) {
ticks.delete(tick);
}
const ticks = new WeakSet();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl2ZS1xdWVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saXZlLXF1ZXJ5L2xpdmUtcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLHNDQUE2QztBQUM3Qyw0Q0FVd0I7QUFFeEIsbURBQXNFO0FBRXRFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxZQUFLLENBQUM7QUFPekIsTUFBc0IsU0FBUztJQStCN0IsWUFBWSxRQUEyQjtRQUNyQyxNQUFNLENBQ0osMkRBQTJELEVBQzNELENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUMzQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztJQUMvQixDQUFDO0lBaENTLFVBQVUsQ0FBQyxNQUFrQjtRQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUUxRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUNwQyxPQUFPLEVBQ1AsQ0FBQyxTQUEwQixFQUFFLEVBQUU7WUFDN0IsSUFBSSxJQUFJLENBQUMseUJBQXlCLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQzdDLE9BQU8sRUFBRSxDQUFDO2FBQ1g7UUFDSCxDQUFDLENBQ0YsQ0FBQztRQUVGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtZQUNuRCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUFDO1FBRUgsU0FBUyxXQUFXO1lBQ2xCLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZ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SyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyQixDQUFDO0FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9yYml0LCBFdmVudGVkIH0gZnJvbSAnQG9yYml0L2NvcmUnO1xuaW1wb3J0IHtcbiAgUmVjb3JkUXVlcnlFeHByZXNzaW9uLFxuICBGaW5kUmVjb3JkLFxuICBGaW5kUmVjb3JkcyxcbiAgRmluZFJlbGF0ZWRSZWNvcmQsXG4gIEZpbmRSZWxhdGVkUmVjb3JkcyxcbiAgZXF1YWxSZWNvcmRJZGVudGl0aWVzLFxuICBSZWNvcmRRdWVyeSxcbiAgUmVjb3JkU2NoZW1hLFxuICBSZWNvcmRPcGVyYXRpb25cbn0gZnJvbSAnQG9yYml0L3JlY29yZHMnO1xuXG5pbXBvcnQgeyBSZWNvcmRDaGFuZ2UsIHJlY29yZE9wZXJhdGlvbkNoYW5nZSB9IGZyb20gJy4vcmVjb3JkLWNoYW5nZSc7XG5cbmNvbnN0IHsgYXNzZXJ0IH0gPSBPcmJpdDtcblxuZXhwb3J0IGludGVyZmFjZSBMaXZlUXVlcnlTZXR0aW5ncyB7XG4gIGRlYm91bmNlOiBib29sZWFuO1xuICBxdWVyeTogUmVjb3JkUXVlcnk7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMaXZlUXVlcnkge1xuICByZWFkb25seSBkZWJvdW5jZTogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCBjYWNoZSgpOiBFdmVudGVkO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0IHNjaGVtYSgpOiBSZWNvcmRTY2hlbWE7XG5cbiAgcHJvdGVjdGVkIF9xdWVyeTogUmVjb3JkUXVlcnk7XG4gIHByb3RlY3RlZCBfc3Vic2NyaWJlKG9uTmV4dDogKCkgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIGNvbnN0IGV4ZWN1dGUgPSB0aGlzLmRlYm91bmNlID8gb25jZVRpY2sob25OZXh0KSA6IG9uTmV4dDtcblxuICAgIGNvbnN0IHVuc3Vic2NyaWJlUGF0Y2ggPSB0aGlzLmNhY2hlLm9uKFxuICAgICAgJ3BhdGNoJyxcbiAgICAgIChvcGVyYXRpb246IFJlY29yZE9wZXJhdGlvbikgPT4ge1xuICAgICAgICBpZiAodGhpcy5vcGVyYXRpb25SZWxldmFudEZvclF1ZXJ5KG9wZXJhdGlvbikpIHtcbiAgICAgICAgICBleGVjdXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgdW5zdWJzY3JpYmVSZXNldCA9IHRoaXMuY2FjaGUub24oJ3Jlc2V0JywgKCkgPT4ge1xuICAgICAgZXhlY3V0ZSgpO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICBjYW5jZWxUaWNrKGV4ZWN1dGUpO1xuICAgICAgdW5zdWJzY3JpYmVQYXRjaCgpO1xuICAgICAgdW5zdWJzY3JpYmVSZXNldCgpO1xuICAgIH1cblxuICAgIHJldHVybiB1bnN1YnNjcmliZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHNldHRpbmdzOiBMaXZlUXVlcnlTZXR0aW5ncykge1xuICAgIGFzc2VydChcbiAgICAgICdPbmx5IHNpbmdsZSBleHByZXNzaW9uIHF1ZXJpZXMgYXJlIHN1cHBvcnRlZCBvbiBMaXZlUXVlcnknLFxuICAgICAgIUFycmF5LmlzQXJyYXkoc2V0dGluZ3MucXVlcnkuZXhwcmVzc2lvbnMpXG4gICAgKTtcbiAgICB0aGlzLmRlYm91bmNlID0gc2V0dGluZ3MuZGVib3VuY2U7XG4gICAgdGhpcy5fcXVlcnkgPSBzZXR0aW5ncy5xdWVyeTtcbiAgfVxuXG4gIG9wZXJhdGlvblJlbGV2YW50Rm9yUXVlcnkob3BlcmF0aW9uOiBSZWNvcmRPcGVyYXRpb24pOiBib29sZWFuIHtcbiAgICBjb25zdCBjaGFuZ2UgPSByZWNvcmRPcGVyYXRpb25DaGFuZ2Uob3BlcmF0aW9uKTtcbiAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5fcXVlcnkuZXhwcmVzc2lvbnMgYXMgUmVjb3JkUXVlcnlFeHByZXNzaW9uO1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5RXhwcmVzc2lvblJlbGV2YW50Rm9yQ2hhbmdlKGV4cHJlc3Npb24sIGNoYW5nZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcXVlcnlFeHByZXNzaW9uUmVsZXZhbnRGb3JDaGFuZ2UoXG4gICAgZXhwcmVzc2lvbjogUmVjb3JkUXVlcnlFeHByZXNzaW9uLFxuICAgIGNoYW5nZTogUmVjb3JkQ2hhbmdlXG4gICk6IGJvb2xlYW4ge1xuICAgIHN3aXRjaCAoZXhwcmVzc2lvbi5vcCkge1xuICAgICAgY2FzZSAnZmluZFJlY29yZCc6XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRSZWNvcmRRdWVyeUV4cHJlc3Npb25SZWxldmFudEZvckNoYW5nZShcbiAgICAgICAgICBleHByZXNzaW9uIGFzIEZpbmRSZWNvcmQsXG4gICAgICAgICAgY2hhbmdlXG4gICAgICAgICk7XG4gICAgICBjYXNlICdmaW5kUmVjb3Jkcyc6XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRSZWNvcmRzUXVlcnlFeHByZXNzaW9uUmVsZXZhbnRGb3JDaGFuZ2UoXG4gICAgICAgICAgZXhwcmVzc2lvbiBhcyBGaW5kUmVjb3JkcyxcbiAgICAgICAgICBjaGFuZ2VcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgJ2ZpbmRSZWxhdGVkUmVjb3JkJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZFJlbGF0ZWRSZWNvcmRRdWVyeUV4cHJlc3Npb25SZWxldmFudEZvckNoYW5nZShcbiAgICAgICAgICBleHByZXNzaW9uIGFzIEZpbmRSZWxhdGVkUmVjb3JkLFxuICAgICAgICAgIGNoYW5nZVxuICAgICAgICApO1xuICAgICAgY2FzZSAnZmluZFJlbGF0ZWRSZWNvcmRzJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZFJlbGF0ZWRSZWNvcmRzUXVlcnlFeHByZXNzaW9uUmVsZXZhbnRGb3JDaGFuZ2UoXG4gICAgICAgICAgZXhwcmVzc2lvbiBhcyBGaW5kUmVsYXRlZFJlY29yZHMsXG4gICAgICAgICAgY2hhbmdlXG4gICAgICAgICk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZmluZFJlY29yZFF1ZXJ5RXhwcmVzc2lvblJlbGV2YW50Rm9yQ2hhbmdlKFxuICAgIGV4cHJlc3Npb246IEZpbmRSZWNvcmQsXG4gICAgY2hhbmdlOiBSZWNvcmRDaGFuZ2VcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGVxdWFsUmVjb3JkSWRlbnRpdGllcyhleHByZXNzaW9uLnJlY29yZCwgY2hhbmdlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaW5kUmVjb3Jkc1F1ZXJ5RXhwcmVzc2lvblJlbGV2YW50Rm9yQ2hhbmdlKFxuICAgIGV4cHJlc3Npb246IEZpbmRSZWNvcmRzLFxuICAgIGNoYW5nZTogUmVjb3JkQ2hhbmdlXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChleHByZXNzaW9uLnR5cGUpIHtcbiAgICAgIHJldHVybiBleHByZXNzaW9uLnR5cGUgPT09IGNoYW5nZS50eXBlO1xuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5yZWNvcmRzKSB7XG4gICAgICBmb3IgKGxldCByZWNvcmQgb2YgZXhwcmVzc2lvbi5yZWNvcmRzKSB7XG4gICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gY2hhbmdlLnR5cGUpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaW5kUmVsYXRlZFJlY29yZFF1ZXJ5RXhwcmVzc2lvblJlbGV2YW50Rm9yQ2hhbmdlKFxuICAgIGV4cHJlc3Npb246IEZpbmRSZWxhdGVkUmVjb3JkLFxuICAgIGNoYW5nZTogUmVjb3JkQ2hhbmdlXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBlcXVhbFJlY29yZElkZW50aXRpZXMoZXhwcmVzc2lvbi5yZWNvcmQsIGNoYW5nZSkgJiZcbiAgICAgIChjaGFuZ2UucmVsYXRpb25zaGlwcy5pbmNsdWRlcyhleHByZXNzaW9uLnJlbGF0aW9uc2hpcCkgfHwgY2hhbmdlLnJlbW92ZSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZpbmRSZWxhdGVkUmVjb3Jkc1F1ZXJ5RXhwcmVzc2lvblJlbGV2YW50Rm9yQ2hhbmdlKFxuICAgIGV4cHJlc3Npb246IEZpbmRSZWxhdGVkUmVjb3JkcyxcbiAgICBjaGFuZ2U6IFJlY29yZENoYW5nZVxuICApOiBib29sZWFuIHtcbiAgICBjb25zdCByZWxhdGlvbnNoaXBEZWYgPSB0aGlzLnNjaGVtYS5nZXRSZWxhdGlvbnNoaXAoXG4gICAgICBleHByZXNzaW9uLnJlY29yZC50eXBlLFxuICAgICAgZXhwcmVzc2lvbi5yZWxhdGlvbnNoaXBcbiAgICApO1xuICAgIGNvbnN0IHR5cGUgPSByZWxhdGlvbnNoaXBEZWY/LnR5cGU7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0eXBlKSAmJiB0eXBlLmZpbmQoKHR5cGUpID0+IHR5cGUgPT09IGNoYW5nZS50eXBlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBjaGFuZ2UudHlwZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIGVxdWFsUmVjb3JkSWRlbnRpdGllcyhleHByZXNzaW9uLnJlY29yZCwgY2hhbmdlKSAmJlxuICAgICAgKGNoYW5nZS5yZWxhdGlvbnNoaXBzLmluY2x1ZGVzKGV4cHJlc3Npb24ucmVsYXRpb25zaGlwKSB8fCBjaGFuZ2UucmVtb3ZlKVxuICAgICk7XG4gIH1cbn1cblxuY29uc3QgaXNOb2RlID0gdHlwZW9mIE9yYml0Lmdsb2JhbHMucHJvY2Vzcz8ubmV4dFRpY2sgPT09ICdmdW5jdGlvbic7XG5sZXQgcmVzb2x2ZWRQcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuY29uc3QgbmV4dFRpY2sgPSBpc05vZGVcbiAgPyBmdW5jdGlvbiAoZm46ICgpID0+IHZvaWQpIHtcbiAgICAgIGlmICghcmVzb2x2ZWRQcm9taXNlKSB7XG4gICAgICAgIHJlc29sdmVkUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZWRQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICBPcmJpdC5nbG9iYWxzLnByb2Nlc3MubmV4dFRpY2soZm4pO1xuICAgICAgfSk7XG4gICAgfVxuICA6IE9yYml0Lmdsb2JhbHMuc2V0SW1tZWRpYXRlID8/IHNldFRpbWVvdXQ7XG5cbmZ1bmN0aW9uIG9uY2VUaWNrKGZuOiAoKSA9PiB2b2lkKSB7XG4gIHJldHVybiBmdW5jdGlvbiB0aWNrKCkge1xuICAgIGlmICghdGlja3MuaGFzKHRpY2spKSB7XG4gICAgICB0aWNrcy5hZGQodGljayk7XG4gICAgICBuZXh0VGljaygoKSA9PiB7XG4gICAgICAgIGZuKCk7XG4gICAgICAgIGNhbmNlbFRpY2sodGljayk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNhbmNlbFRpY2sodGljazogKCkgPT4gdm9pZCkge1xuICB0aWNrcy5kZWxldGUodGljayk7XG59XG5cbmNvbnN0IHRpY2tzID0gbmV3IFdlYWtTZXQoKTtcbiJdfQ==