UNPKG

shelving

Version:

Toolkit for using data in JavaScript.

61 lines (60 loc) 2.39 kB
import { MemoryProvider } from "./MemoryProvider.js"; import { AsyncProvider } from "./Provider.js"; /** Keep a copy of asynchronous remote data in a local synchronous cache. */ export class CacheProvider extends AsyncProvider { source; memory; constructor(source, cache = new MemoryProvider()) { super(); this.source = source; this.memory = cache; } async getItem(collection, id) { const item = await this.source.getItem(collection, id); item ? this.memory.setItem(collection, id, item) : this.memory.deleteItem(collection, id); return item; } getItemSequence(collection, id) { return this.memory.setItemSequence(collection, id, this.source.getItemSequence(collection, id)); } async addItem(collection, data) { const id = await this.source.addItem(collection, data); this.memory.setItem(collection, id, data); return id; } async setItem(collection, id, data) { await this.source.setItem(collection, id, data); this.memory.setItem(collection, id, data); } async updateItem(collection, id, updates) { await this.source.updateItem(collection, id, updates); this.memory.updateItem(collection, id, updates); } async deleteItem(collection, id) { await this.source.deleteItem(collection, id); this.memory.deleteItem(collection, id); } countQuery(collection, query) { return this.source.countQuery(collection, query); } async getQuery(collection, query) { const items = await this.source.getQuery(collection, query); this.memory.setItems(collection, items, query); return items; } getQuerySequence(collection, query) { return this.memory.setItemsSequence(collection, this.source.getQuerySequence(collection, query), query); } async setQuery(collection, query, data) { await this.source.setQuery(collection, query, data); this.memory.setQuery(collection, query, data); } async updateQuery(collection, query, updates) { await this.source.updateQuery(collection, query, updates); this.memory.updateQuery(collection, query, updates); } async deleteQuery(collection, query) { await this.source.deleteQuery(collection, query); this.memory.deleteQuery(collection, query); } }