UNPKG

@orbit/record-cache

Version:

Orbit base classes used to access and maintain a set of records.

103 lines 17.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SyncCacheIntegrityProcessor = void 0; const sync_operation_processor_1 = require("../sync-operation-processor"); const cache_integrity_utils_1 = require("./utils/cache-integrity-utils"); /** * An operation processor that ensures that a cache's data is consistent and * doesn't contain any dead references. * * This is achieved by maintaining a mapping of reverse relationships for each * record. When a record is removed, any references to it can also be identified * and removed. */ class SyncCacheIntegrityProcessor extends sync_operation_processor_1.SyncOperationProcessor { after(operation) { switch (operation.op) { case 'replaceRelatedRecord': this.removeInverseRelationship(operation.record, operation.relationship, this.accessor.getRelatedRecordSync(operation.record, operation.relationship)); return []; case 'replaceRelatedRecords': this.removeInverseRelationships(operation.record, operation.relationship, this.accessor.getRelatedRecordsSync(operation.record, operation.relationship)); return []; case 'removeFromRelatedRecords': this.removeInverseRelationship(operation.record, operation.relationship, operation.relatedRecord); return []; case 'removeRecord': this.removeAllInverseRelationships(operation.record); return []; case 'updateRecord': this.removeAllInverseRelationships(operation.record); return []; default: return []; } } finally(operation) { switch (operation.op) { case 'replaceRelatedRecord': this.addInverseRelationship(operation.record, operation.relationship, operation.relatedRecord); return []; case 'replaceRelatedRecords': this.addInverseRelationships(operation.record, operation.relationship, operation.relatedRecords); return []; case 'addToRelatedRecords': this.addInverseRelationship(operation.record, operation.relationship, operation.relatedRecord); return []; case 'addRecord': this.addAllInverseRelationships(operation.record); return []; case 'updateRecord': this.addAllInverseRelationships(operation.record); return []; case 'removeRecord': return this.clearInverseRelationshipOps(operation.record); default: return []; } } addInverseRelationship(record, relationship, relatedRecord) { let inverseRelationship = (0, cache_integrity_utils_1.getInverseRelationship)(this.accessor.schema, record, relationship, relatedRecord); if (inverseRelationship) { this.accessor.addInverseRelationshipsSync([inverseRelationship]); } } addInverseRelationships(record, relationship, relatedRecords) { let inverseRelationships = (0, cache_integrity_utils_1.getInverseRelationships)(this.accessor.schema, record, relationship, relatedRecords); if (inverseRelationships) { this.accessor.addInverseRelationshipsSync(inverseRelationships); } } addAllInverseRelationships(record) { let inverseRelationships = (0, cache_integrity_utils_1.getAllInverseRelationships)(this.accessor.schema, record); if (inverseRelationships.length > 0) { this.accessor.addInverseRelationshipsSync(inverseRelationships); } } removeInverseRelationship(record, relationship, relatedRecord) { let inverseRelationship = (0, cache_integrity_utils_1.getInverseRelationship)(this.accessor.schema, record, relationship, relatedRecord); if (inverseRelationship) { this.accessor.removeInverseRelationshipsSync([inverseRelationship]); } } removeInverseRelationships(record, relationship, relatedRecords) { let inverseRelationships = (0, cache_integrity_utils_1.getInverseRelationships)(this.accessor.schema, record, relationship, relatedRecords); if (inverseRelationships.length > 0) { this.accessor.removeInverseRelationshipsSync(inverseRelationships); } } removeAllInverseRelationships(record) { const currentRecord = this.accessor.getRecordSync(record); if (currentRecord) { const inverseRelationships = (0, cache_integrity_utils_1.getAllInverseRelationships)(this.accessor.schema, currentRecord); if (inverseRelationships.length > 0) { this.accessor.removeInverseRelationshipsSync(inverseRelationships); } } } clearInverseRelationshipOps(record) { return (0, cache_integrity_utils_1.getInverseRelationshipRemovalOps)(this.accessor.schema, this.accessor.getInverseRelationshipsSync(record)); } } exports.SyncCacheIntegrityProcessor = SyncCacheIntegrityProcessor; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1jYWNoZS1pbnRlZ3JpdHktcHJvY2Vzc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL29wZXJhdGlvbi1wcm9jZXNzb3JzL3N5bmMtY2FjaGUtaW50ZWdyaXR5LXByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLQSwwRUFBcUU7QUFDckUseUVBS3VDO0FBRXZDOzs7Ozs7O0dBT0c7QUFDSCxNQUFhLDJCQUE0QixTQUFRLGlEQUFzQjtJQUNyRSxLQUFLLENBQUMsU0FBMEI7UUFDOUIsUUFBUSxTQUFTLENBQUMsRUFBRSxFQUFFO1lBQ3BCLEtBQUssc0JBQXNCO2dCQUN6QixJQUFJLENBQUMseUJBQXlCLENBQzVCLFNBQVMsQ0FBQyxNQUFNLEVBQ2hCLFNBQVMsQ0FBQyxZQUFZLEVBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQ2hDLFNBQVMsQ0FBQyxNQUFNLEVBQ2hCLFNBQVMsQ0FBQyxZQUFZLENBQ3ZCLENBQ0YsQ0FBQztnQkFDRixPQUFPLEVBQUUsQ0FBQztZQUVaLEtBQUssdUJBQXVCO2dCQUMxQixJQUFJLENBQUMsMEJBQTBCLENBQzdCLFNBQVMsQ0FBQyxNQUFNLEVBQ2hCLFNBQVMsQ0FBQyxZQUFZLEVBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQ2pDLFNBQVMsQ0FBQyxNQUFNLEVBQ2hCLFNBQVMsQ0FBQyxZQUFZLENBQ3ZCLENBQ0YsQ0FBQztnQkFDRixPQUFPLEVBQUUsQ0FBQztZQUVaLEtBQUssMEJBQTBCO2dCQUM3QixJQUFJLENBQUMseUJBQXlCLENBQzVCLFNBQVMsQ0FBQyxNQUFNLEVBQ2hCLFNBQVMsQ0FBQyxZQUFZLEVBQ3RCLFNBQVMsQ0FBQyxhQUFhLENBQ3hCLENBQUM7Z0JBQ0YsT0FBTyxFQUFFLENBQUM7WUFFWixLQUFLLGNBQWM7Z0JBQ2pCLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7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ICBSZWNvcmRJZGVudGl0eSxcbiAgUmVjb3JkT3BlcmF0aW9uXG59IGZyb20gJ0BvcmJpdC9yZWNvcmRzJztcbmltcG9ydCB7IFN5bmNPcGVyYXRpb25Qcm9jZXNzb3IgfSBmcm9tICcuLi9zeW5jLW9wZXJhdGlvbi1wcm9jZXNzb3InO1xuaW1wb3J0IHtcbiAgZ2V0SW52ZXJzZVJlbGF0aW9uc2hpcCxcbiAgZ2V0SW52ZXJzZVJlbGF0aW9uc2hpcHMsXG4gIGdldEFsbEludmVyc2VSZWxhdGlvbnNoaXBzLFxuICBnZXRJbnZlcnNlUmVsYXRpb25zaGlwUmVtb3ZhbE9wc1xufSBmcm9tICcuL3V0aWxzL2NhY2hlLWludGVncml0eS11dGlscyc7XG5cbi8qKlxuICogQW4gb3BlcmF0aW9uIHByb2Nlc3NvciB0aGF0IGVuc3VyZXMgdGhhdCBhIGNhY2hlJ3MgZGF0YSBpcyBjb25zaXN0ZW50IGFuZFxuICogZG9lc24ndCBjb250YWluIGFueSBkZWFkIHJlZmVyZW5jZXMuXG4gKlxuICogVGhpcyBpcyBhY2hpZXZlZCBieSBtYWludGFpbmluZyBhIG1hcHBpbmcgb2YgcmV2ZXJzZSByZWxhdGlvbnNoaXBzIGZvciBlYWNoXG4gKiByZWNvcmQuIFdoZW4gYSByZWNvcmQgaXMgcmVtb3ZlZCwgYW55IHJlZmVyZW5jZXMgdG8gaXQgY2FuIGFsc28gYmUgaWRlbnRpZmllZFxuICogYW5kIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTeW5jQ2FjaGVJbnRlZ3JpdHlQcm9jZXNzb3IgZXh0ZW5kcyBTeW5jT3BlcmF0aW9uUHJvY2Vzc29yIHtcbiAgYWZ0ZXIob3BlcmF0aW9uOiBSZWNvcmRPcGVyYXRpb24pOiBSZWNvcmRPcGVyYXRpb25bXSB7XG4gICAgc3dpdGNoIChvcGVyYXRpb24ub3ApIHtcbiAgICAgIGNhc2UgJ3JlcGxhY2VSZWxhdGVkUmVjb3JkJzpcbiAgICAgICAgdGhpcy5yZW1vdmVJbnZlcnNlUmVsYXRpb25zaGlwKFxuICAgICAgICAgIG9wZXJhdGlvbi5yZWNvcmQsXG4gICAgICAgICAgb3BlcmF0aW9uLnJlbGF0aW9uc2hpcCxcbiAgICAgICAgICB0aGlzLmFjY2Vzc29yLmdldFJlbGF0ZWRSZWNvcmRTeW5jKFxuICAgICAgICAgICAgb3BlcmF0aW9uLnJlY29yZCxcbiAgICAgICAgICAgIG9wZXJhdGlvbi5yZWxhdGlvbnNoaXBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBbXTtcblxuICAgICAgY2FzZSAncmVwbGFjZVJlbGF0ZWRSZWNvcmRzJzpcbiAgICAgICAgdGhpcy5yZW1vdmVJbnZlcnNlUmVsYXRpb25zaGlwcyhcbiAgICAgICAgICBvcGVyYXRpb24ucmVjb3JkLFxuICAgICAgICAgIG9wZXJhdGlvbi5yZWxhdGlvbnNoaXAsXG4gICAgICAgICAgdGhpcy5hY2Nlc3Nvci5nZXRSZWxhdGVkUmVjb3Jkc1N5bmMoXG4gICAgICAgICAgICBvcGVyYXRpb24ucmVjb3JkLFxuICAgICAgICAgICAgb3BlcmF0aW9uLnJlbGF0aW9uc2hpcFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuXG4gICAgICBjYXNlICdyZW1vdmVGcm9tUmVsYXRlZFJlY29yZHMnOlxuICAgICAgICB0aGlzLnJlbW92ZUludmVyc2VSZWxhdGlvbnNoaXAoXG4gICAgICAgICAgb3BlcmF0aW9uLnJlY29yZCxcbiAgICAgICAgICBvcGVyYXRpb24ucmVsYXRpb25zaGlwLFxuICAgICAgICAgIG9wZXJhdGlvbi5yZWxhdGVkUmVjb3JkXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBbXTtcblxuICAgICAgY2FzZSAncmVtb3ZlUmVjb3JkJzpcbiAgICAgICAgdGhpcy5yZW1vdmVBbGxJbnZlcnNlUmVsYXRpb25zaGlwcyhvcGVyYXRpb24ucmVjb3JkKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuXG4gICAgICBjYXNlICd1cGRhdGVSZWNvcmQnOlxuICAgICAgICB0aGlzLnJlbW92ZUFsbEludmVyc2VSZWxhdGlvbnNoaXBzKG9wZXJhdGlvbi5yZWNvcmQpO1xuICAgICAgICByZXR1cm4gW107XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBmaW5hbGx5KG9wZXJhdGlvbjogUmVjb3JkT3BlcmF0aW9uKTogUmVjb3JkT3BlcmF0aW9uW10ge1xuICAgIHN3aXRjaCAob3BlcmF0aW9uLm9wKSB7XG4gICAgICBjYXNlICdyZXBsYWNlUmVsYXRlZFJlY29yZCc6XG4gICAgICAgIHRoaXMuYWRkSW52ZXJzZVJlbGF0aW9uc2hpcChcbiAgICAgICAgICBvcGVyYXRpb24ucmVjb3JkLFxuICAgICAgICAgIG9wZXJhdGlvbi5yZWxhdGlvbnNoaXAsXG4gICAgICAgICAgb3BlcmF0aW9uLnJlbGF0ZWRSZWNvcmRcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuXG4gICAgICBjYXNlICdyZXBsYWNlUmVsYXRlZFJlY29yZHMnOlxuICAgICAgICB0aGlzLmFkZEludmVyc2VSZWxhdGlvbnNoaXBzKFxuICAgICAgICAgIG9wZXJhdGlvbi5yZWNvcmQsXG4gICAgICAgICAgb3BlcmF0aW9uLnJlbGF0aW9uc2hpcCxcbiAgICAgICAgICBvcGVyYXRpb24ucmVsYXRlZFJlY29yZHNcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuXG4gICAgICBjYXNlICdhZGRUb1JlbGF0ZWRSZWNvcmRzJzpcbiAgICAgICAgdGhpcy5hZGRJbnZlcnNlUmVsYXRpb25zaGlwKFxuICAgICAgICAgIG9wZXJhdGlvbi5yZWNvcmQsXG4gICAgICAgICAgb3BlcmF0aW9uLnJlbGF0aW9uc2hpcCxcbiAgICAgICAgICBvcGVyYXRpb24ucmVsYXRlZFJlY29yZFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gW107XG5cbiAgICAgIGNhc2UgJ2FkZFJlY29yZCc6XG4gICAgICAgIHRoaXMuYWRkQWxsSW52ZXJzZVJlbGF0aW9uc2hpcHMob3BlcmF0aW9uLnJlY29yZCk7XG4gICAgICAgIHJldHVybiBbXTtcblxuICAgICAgY2FzZSAndXBkYXRlUmVjb3JkJzpcbiAgICAgICAgdGhpcy5hZGRBbGxJbnZlcnNlUmVsYXRpb25zaGlwcyhvcGVyYXRpb24ucmVjb3JkKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuXG4gICAgICBjYXNlICdyZW1vdmVSZWNvcmQnOlxuICAgICAgICByZXR1cm4gdGhpcy5jbGVhckludmVyc2VSZWxhdGlvbnNoaXBPcHMob3BlcmF0aW9uLnJlY29yZCk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRkSW52ZXJzZVJlbGF0aW9uc2hpcChcbiAgICByZWNvcmQ6IFJlY29yZElkZW50aXR5LFxuICAgIHJlbGF0aW9uc2hpcDogc3RyaW5nLFxuICAgIHJlbGF0ZWRSZWNvcmQ6IFJlY29yZElkZW50aXR5IHwgbnVsbFxuICApOiB2b2lkIHtcbiAgICBsZXQgaW52ZXJzZVJlbGF0aW9uc2hpcCA9IGdldEludmVyc2VSZWxhdGlvbnNoaXAoXG4gICAgICB0aGlzLmFjY2Vzc29yLnNjaGVtYSxcbiAgICAgIHJlY29yZCxcbiAgICAgIHJlbGF0aW9uc2hpcCxcbiAgICAgIHJlbGF0ZWRSZWNvcmRcbiAgICApO1xuICAgIGlmIChpbnZlcnNlUmVsYXRpb25zaGlwKSB7XG4gICAgICB0aGlzLmFjY2Vzc29yLmFkZEludmVyc2VSZWxhdGlvbnNoaXBzU3luYyhbaW52ZXJzZVJlbGF0aW9uc2hpcF0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhZGRJbnZlcnNlUmVsYXRpb25zaGlwcyhcbiAgICByZWNvcmQ6IFJlY29yZElkZW50aXR5LFxuICAgIHJlbGF0aW9uc2hpcDogc3RyaW5nLFxuICAgIHJlbGF0ZWRSZWNvcmRzOiBSZWNvcmRJZGVudGl0eVtdXG4gICk6IHZvaWQge1xuICAgIGxldCBpbnZlcnNlUmVsYXRpb25zaGlwcyA9IGdldEludmVyc2VSZWxhdGlvbnNoaXBzKFxuICAgICAgdGhpcy5hY2Nlc3Nvci5zY2hlbWEsXG4gICAgICByZWNvcmQsXG4gICAgICByZWxhdGlvbnNoaXAsXG4gICAgICByZWxhdGVkUmVjb3Jkc1xuICAgICk7XG4gICAgaWYgKGludmVyc2VSZWxhdGlvbnNoaXBzKSB7XG4gICAgICB0aGlzLmFjY2Vzc29yLmFkZEludmVyc2VSZWxhdGlvbnNoaXBzU3luYyhpbnZlcnNlUmVsYXRpb25zaGlwcyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFkZEFsbEludmVyc2VSZWxhdGlvbnNoaXBzKHJlY29yZDogSW5pdGlhbGl6ZWRSZWNvcmQpOiB2b2lkIHtcbiAgICBsZXQgaW52ZXJzZVJlbGF0aW9uc2hpcHMgPSBnZXRBbGxJbnZlcnNlUmVsYXRpb25zaGlwcyhcbiAgICAgIHRoaXMuYWNjZXNzb3Iuc2NoZW1hLFxuICAgICAgcmVjb3JkXG4gICAgKTtcbiAgICBpZiAoaW52ZXJzZVJlbGF0aW9uc2hpcHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5hY2Nlc3Nvci5hZGRJbnZlcnNlUmVsYXRpb25zaGlwc1N5bmMoaW52ZXJzZVJlbGF0aW9uc2hpcHMpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCByZW1vdmVJbnZlcnNlUmVsYXRpb25zaGlwKFxuICAgIHJlY29yZDogUmVjb3JkSWRlbnRpdHksXG4gICAgcmVsYXRpb25zaGlwOiBzdHJpbmcsXG4gICAgcmVsYXRlZFJlY29yZD86IFJlY29yZElkZW50aXR5IHwgbnVsbFxuICApOiB2b2lkIHtcbiAgICBsZXQgaW52ZXJzZVJlbGF0aW9uc2hpcCA9IGdldEludmVyc2VSZWxhdGlvbnNoaXAoXG4gICAgICB0aGlzLmFjY2Vzc29yLnNjaGVtYSxcbiAgICAgIHJlY29yZCxcbiAgICAgIHJlbGF0aW9uc2hpcCxcbiAgICAgIHJlbGF0ZWRSZWNvcmRcbiAgICApO1xuICAgIGlmIChpbnZlcnNlUmVsYXRpb25zaGlwKSB7XG4gICAgICB0aGlzLmFjY2Vzc29yLnJlbW92ZUludmVyc2VSZWxhdGlvbnNoaXBzU3luYyhbaW52ZXJzZVJlbGF0aW9uc2hpcF0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCByZW1vdmVJbnZlcnNlUmVsYXRpb25zaGlwcyhcbiAgICByZWNvcmQ6IFJlY29yZElkZW50aXR5LFxuICAgIHJlbGF0aW9uc2hpcDogc3RyaW5nLFxuICAgIHJlbGF0ZWRSZWNvcmRzPzogUmVjb3JkSWRlbnRpdHlbXVxuICApOiB2b2lkIHtcbiAgICBsZXQgaW52ZXJzZVJlbGF0aW9uc2hpcHMgPSBnZXRJbnZlcnNlUmVsYXRpb25zaGlwcyhcbiAgICAgIHRoaXMuYWNjZXNzb3Iuc2NoZW1hLFxuICAgICAgcmVjb3JkLFxuICAgICAgcmVsYXRpb25zaGlwLFxuICAgICAgcmVsYXRlZFJlY29yZHNcbiAgICApO1xuICAgIGlmIChpbnZlcnNlUmVsYXRpb25zaGlwcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmFjY2Vzc29yLnJlbW92ZUludmVyc2VSZWxhdGlvbnNoaXBzU3luYyhpbnZlcnNlUmVsYXRpb25zaGlwcyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHJlbW92ZUFsbEludmVyc2VSZWxhdGlvbnNoaXBzKHJlY29yZDogUmVjb3JkSWRlbnRpdHkpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50UmVjb3JkID0gdGhpcy5hY2Nlc3Nvci5nZXRSZWNvcmRTeW5jKHJlY29yZCk7XG4gICAgaWYgKGN1cnJlbnRSZWNvcmQpIHtcbiAgICAgIGNvbnN0IGludmVyc2VSZWxhdGlvbnNoaXBzID0gZ2V0QWxsSW52ZXJzZVJlbGF0aW9uc2hpcHMoXG4gICAgICAgIHRoaXMuYWNjZXNzb3Iuc2NoZW1hLFxuICAgICAgICBjdXJyZW50UmVjb3JkXG4gICAgICApO1xuICAgICAgaWYgKGludmVyc2VSZWxhdGlvbnNoaXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5hY2Nlc3Nvci5yZW1vdmVJbnZlcnNlUmVsYXRpb25zaGlwc1N5bmMoaW52ZXJzZVJlbGF0aW9uc2hpcHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhckludmVyc2VSZWxhdGlvbnNoaXBPcHMoXG4gICAgcmVjb3JkOiBSZWNvcmRJZGVudGl0eVxuICApOiBSZWNvcmRPcGVyYXRpb25bXSB7XG4gICAgcmV0dXJuIGdldEludmVyc2VSZWxhdGlvbnNoaXBSZW1vdmFsT3BzKFxuICAgICAgdGhpcy5hY2Nlc3Nvci5zY2hlbWEsXG4gICAgICB0aGlzLmFjY2Vzc29yLmdldEludmVyc2VSZWxhdGlvbnNoaXBzU3luYyhyZWNvcmQpXG4gICAgKTtcbiAgfVxufVxuIl19