mirror of
https://github.com/discordjs/discord.js.git
synced 2026-06-03 17:40:07 +00:00
* fix(CachedManager): allow overriding constructor for makeCache * feat: allow determining makeCache based on non-overriden constructor * types: cleanup leftovers --------- Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
65 lines
1.4 KiB
JavaScript
65 lines
1.4 KiB
JavaScript
'use strict';
|
|
|
|
const DataManager = require('./DataManager');
|
|
const { MakeCacheOverrideSymbol } = require('../util/Symbols');
|
|
|
|
/**
|
|
* 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);
|
|
|
|
/**
|
|
* The private cache of items for this manager.
|
|
* @type {Collection}
|
|
* @private
|
|
* @readonly
|
|
* @name CachedManager#_cache
|
|
*/
|
|
Object.defineProperty(this, '_cache', {
|
|
value: this.client.options.makeCache(
|
|
this.constructor[MakeCacheOverrideSymbol] ?? this.constructor,
|
|
this.holds,
|
|
this.constructor,
|
|
),
|
|
});
|
|
|
|
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;
|