shelving
Version:
Toolkit for using data in JavaScript.
61 lines (60 loc) • 2.39 kB
JavaScript
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);
}
}