Initial commit
This commit is contained in:
50
src/managers/CachedManager.js
Normal file
50
src/managers/CachedManager.js
Normal file
@@ -0,0 +1,50 @@
|
||||
'use strict';
|
||||
|
||||
const DataManager = require('./DataManager');
|
||||
|
||||
/**
|
||||
* Manages the API methods of a data model with a mutable cache of instances.
|
||||
* @extends {DataManager}
|
||||
* @abstract
|
||||
*/
|
||||
class CachedManager extends DataManager {
|
||||
constructor(client, holds, iterable) {
|
||||
super(client, holds);
|
||||
|
||||
Object.defineProperty(this, '_cache', { value: this.client.options.makeCache(this.constructor, this.holds) });
|
||||
|
||||
if (iterable) {
|
||||
for (const item of iterable) {
|
||||
this._add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The cache of items for this manager.
|
||||
* @type {Collection}
|
||||
* @abstract
|
||||
*/
|
||||
get cache() {
|
||||
return this._cache;
|
||||
}
|
||||
|
||||
_add(data, cache = true, { id, extras = [] } = {}) {
|
||||
const existing = this.cache.get(id ?? data.id);
|
||||
if (existing) {
|
||||
if (cache) {
|
||||
existing._patch(data);
|
||||
return existing;
|
||||
}
|
||||
const clone = existing._clone();
|
||||
clone._patch(data);
|
||||
return clone;
|
||||
}
|
||||
|
||||
const entry = this.holds ? new this.holds(this.client, data, ...extras) : data;
|
||||
if (cache) this.cache.set(id ?? entry.id, entry);
|
||||
return entry;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = CachedManager;
|
||||
Reference in New Issue
Block a user