UNPKG

@orbit/records

Version:

A flexible data access and synchronization layer.

56 lines 5.83 kB
import { deepGet, deepSet } from '@orbit/utils'; /** * Maintains a map between records' ids and keys. */ export class RecordKeyMap { constructor() { this.reset(); } /** * Resets the contents of the key map. */ reset() { this._idsToKeys = {}; this._keysToIds = {}; } /** * Return a key value given a model type, key name, and id. */ idToKey(type, keyName, idValue) { return deepGet(this._idsToKeys, [type, keyName, idValue]); } /** * Return an id value given a model type, key name, and key value. */ keyToId(type, keyName, keyValue) { return deepGet(this._keysToIds, [type, keyName, keyValue]); } /** * Store the id and key values of a record in this key map. */ pushRecord(record) { const { type, id, keys } = record; if (!keys || !id) { return; } Object.keys(keys).forEach((keyName) => { let keyValue = keys[keyName]; if (keyValue) { deepSet(this._idsToKeys, [type, keyName, id], keyValue); deepSet(this._keysToIds, [type, keyName, keyValue], id); } }); } /** * Given a record, find the cached id if it exists. */ idFromKeys(type, keys) { for (let key of Object.keys(keys)) { let value = keys[key]; if (value) { return this.keyToId(type, key, value); } } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkLWtleS1tYXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVjb3JkLWtleS1tYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQVEsTUFBTSxjQUFjLENBQUM7QUFHdEQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUl2QjtRQUNFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUs7UUFDSCxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPLENBQUMsSUFBWSxFQUFFLE9BQWUsRUFBRSxPQUFlO1FBQ3BELE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTyxDQUFDLElBQVksRUFBRSxPQUFlLEVBQUUsUUFBZ0I7UUFDckQsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQUMsTUFBK0M7UUFDeEQsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBRWxDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDaEIsT0FBTztTQUNSO1FBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNwQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0IsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUN4RCxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDekQ7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVUsQ0FBQyxJQUFZLEVBQUUsSUFBa0I7UUFDekMsS0FBSyxJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2pDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0QixJQUFJLEtBQUssRUFBRTtnQkFDVCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUN2QztTQUNGO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVlcEdldCwgZGVlcFNldCwgRGljdCB9IGZyb20gJ0BvcmJpdC91dGlscyc7XG5pbXBvcnQgeyBJbml0aWFsaXplZFJlY29yZCwgVW5pbml0aWFsaXplZFJlY29yZCB9IGZyb20gJy4vcmVjb3JkJztcblxuLyoqXG4gKiBNYWludGFpbnMgYSBtYXAgYmV0d2VlbiByZWNvcmRzJyBpZHMgYW5kIGtleXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWNvcmRLZXlNYXAge1xuICBwcml2YXRlIF9pZHNUb0tleXMhOiBEaWN0PERpY3Q8c3RyaW5nPj47XG4gIHByaXZhdGUgX2tleXNUb0lkcyE6IERpY3Q8RGljdDxzdHJpbmc+PjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnJlc2V0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBjb250ZW50cyBvZiB0aGUga2V5IG1hcC5cbiAgICovXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX2lkc1RvS2V5cyA9IHt9O1xuICAgIHRoaXMuX2tleXNUb0lkcyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGtleSB2YWx1ZSBnaXZlbiBhIG1vZGVsIHR5cGUsIGtleSBuYW1lLCBhbmQgaWQuXG4gICAqL1xuICBpZFRvS2V5KHR5cGU6IHN0cmluZywga2V5TmFtZTogc3RyaW5nLCBpZFZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBkZWVwR2V0KHRoaXMuX2lkc1RvS2V5cywgW3R5cGUsIGtleU5hbWUsIGlkVmFsdWVdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gaWQgdmFsdWUgZ2l2ZW4gYSBtb2RlbCB0eXBlLCBrZXkgbmFtZSwgYW5kIGtleSB2YWx1ZS5cbiAgICovXG4gIGtleVRvSWQodHlwZTogc3RyaW5nLCBrZXlOYW1lOiBzdHJpbmcsIGtleVZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBkZWVwR2V0KHRoaXMuX2tleXNUb0lkcywgW3R5cGUsIGtleU5hbWUsIGtleVZhbHVlXSk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcmUgdGhlIGlkIGFuZCBrZXkgdmFsdWVzIG9mIGEgcmVjb3JkIGluIHRoaXMga2V5IG1hcC5cbiAgICovXG4gIHB1c2hSZWNvcmQocmVjb3JkOiBJbml0aWFsaXplZFJlY29yZCB8IFVuaW5pdGlhbGl6ZWRSZWNvcmQpOiB2b2lkIHtcbiAgICBjb25zdCB7IHR5cGUsIGlkLCBrZXlzIH0gPSByZWNvcmQ7XG5cbiAgICBpZiAoIWtleXMgfHwgIWlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgT2JqZWN0LmtleXMoa2V5cykuZm9yRWFjaCgoa2V5TmFtZSkgPT4ge1xuICAgICAgbGV0IGtleVZhbHVlID0ga2V5c1trZXlOYW1lXTtcbiAgICAgIGlmIChrZXlWYWx1ZSkge1xuICAgICAgICBkZWVwU2V0KHRoaXMuX2lkc1RvS2V5cywgW3R5cGUsIGtleU5hbWUsIGlkXSwga2V5VmFsdWUpO1xuICAgICAgICBkZWVwU2V0KHRoaXMuX2tleXNUb0lkcywgW3R5cGUsIGtleU5hbWUsIGtleVZhbHVlXSwgaWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgcmVjb3JkLCBmaW5kIHRoZSBjYWNoZWQgaWQgaWYgaXQgZXhpc3RzLlxuICAgKi9cbiAgaWRGcm9tS2V5cyh0eXBlOiBzdHJpbmcsIGtleXM6IERpY3Q8c3RyaW5nPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKGtleXMpKSB7XG4gICAgICBsZXQgdmFsdWUgPSBrZXlzW2tleV07XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5VG9JZCh0eXBlLCBrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==