UNPKG

kura

Version:

The FileSystem API abstraction library.

92 lines (77 loc) 2.21 kB
import { AbstractAccessor } from "./AbstractAccessor"; import { INDEX_DIR_PATH } from "./FileSystemConstants"; import { FileSystemObject } from "./FileSystemObject"; import { ContentsCacheOptions } from "./FileSystemOptions"; import { getMemorySize } from "./FileSystemUtil"; export interface ContentCacheEntry { access: number; content: Blob | BufferSource | string; lastModified: number; size: number; } export class ContentsCache { private cache: { [fullPath: string]: ContentCacheEntry } = {}; private options: ContentsCacheOptions; constructor(accessor: AbstractAccessor) { this.options = accessor.options.contentsCacheOptions; } public clear() { this.cache = {}; } public get(fullPath: string) { const entry = this.cache[fullPath]; if (!entry) { return null; } entry.access = Date.now(); return entry.content; } public put(obj: FileSystemObject, content: Blob | BufferSource | string) { const fullPath = obj.fullPath; if (fullPath.startsWith(INDEX_DIR_PATH)) { return; } delete this.cache[fullPath]; const size = getMemorySize(content); if (size === 0 || this.options.limitSize < size) { return; } const capacity = this.options.capacity; let sum = 0; const list: { fullPath: string; size: number; access: number }[] = []; for (const [fullPath, entry] of Object.entries(this.cache)) { sum += entry.size; list.push({ fullPath, size: entry.size, access: entry.access }); } let current = sum + size; if (current <= capacity) { this.cache[fullPath] = { content, size, lastModified: obj.lastModified, access: Date.now(), }; return; } list.sort((a, b) => { return b.access - a.access; }); const limit = capacity - size; for (const item of list) { delete this.cache[item.fullPath]; current -= item.size; if (current <= limit) { break; } } this.cache[fullPath] = { content, size, lastModified: obj.lastModified, access: Date.now(), }; } public remove(fullPath: string) { delete this.cache[fullPath]; } }