d1d842098a
#9271 djs > Backports the following pull requests to version 13: > > * docs: describe private properties #8879 > * fix(snowflake): snowflakes length #9144 > * fix(Message): `bulkDeletable` permissions should be retrieved later for DMs #9146 > * fix(Message#editable): update editable check in threads locked #9216 > * fix: add support for new guild feature `GUILD_WEB_PAGE_VANITY_URL` #9219 > * fix(AutocompleteInteraction): Send `name_localizations` correctly #9238 > * fix(ThreadManager): Respect `cache` and `force` in fetching #9239 > * docs(FetchArchivedThreadOptions): `before` respects `archive_timestamp`, not creation timestamp #9240 > * refactor(FetchThreadsOptions): Remove `active` #9241 > * docs: differ `User#send` #9251 > * docs: add more examples #9252 > * fix(ClientUser): No mutation on edit #9259 > * fix: resolving string bitfield #9262 > * refactor: call `GuildBanManager#create()` directly #9263 > * docs(Role): Fix example for `comparePositionTo()` #9270 > * docs: fix compare position example #9272 > * fix: Keep symbols in actions manager #9293
72 lines
1.8 KiB
JavaScript
72 lines
1.8 KiB
JavaScript
'use strict';
|
|
|
|
const DataManager = require('./DataManager');
|
|
const { _cleanupSymbol } = require('../util/Constants');
|
|
|
|
/**
|
|
* 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, this.holds) });
|
|
|
|
let cleanup = this._cache[_cleanupSymbol]?.();
|
|
if (cleanup) {
|
|
cleanup = cleanup.bind(this._cache);
|
|
client._cleanups.add(cleanup);
|
|
client._finalizers.register(this, {
|
|
cleanup,
|
|
message:
|
|
`Garbage collection completed on ${this.constructor.name}, ` +
|
|
`which had a ${this._cache.constructor.name} of ${this.holds.name}.`,
|
|
name: this.constructor.name,
|
|
});
|
|
}
|
|
|
|
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;
|