constructor(duration, provider, syncProvider, providerContext) {
		this._duration = duration;
		this._provider = provider;
		this._syncProvider = syncProvider;
		this._providerContext = providerContext;
		/** @type {Map<string, FileSystemCallback<EXPECTED_ANY>[]>} */
		this._activeAsyncOperations = new Map();
		/** @type {Map<string, { err: Error | null, result?: EXPECTED_ANY, level: Set<string> }>} */
		this._data = new Map();
		/** @type {Set<string>[]} */
		this._levels = [];
		for (let i = 0; i < 10; i++) this._levels.push(new Set());
		for (let i = 5000; i < duration; i += 500) this._levels.push(new Set());
		this._currentLevel = 0;
		this._tickInterval = Math.floor(duration / this._levels.length);
		/** @type {STORAGE_MODE_IDLE | STORAGE_MODE_SYNC | STORAGE_MODE_ASYNC} */
		this._mode = STORAGE_MODE_IDLE;

		/** @type {NodeJS.Timeout | undefined} */
		this._timeout = undefined;
		/** @type {number | undefined} */
		this._nextDecay = undefined;

		// eslint-disable-next-line no-warning-comments
		// @ts-ignore
		this.provide = provider ? this.provide.bind(this) : null;
		// eslint-disable-next-line no-warning-comments
		// @ts-ignore
		this.provideSync = syncProvider ? this.provideSync.bind(this) : null;
	}
@param {number} duration max cache duration of items
@param {EXPECTED_FUNCTION | undefined} provider async method
@param {EXPECTED_FUNCTION | undefined} syncProvider sync method
@param {BaseFileSystem} providerContext call context for the provider methods