+82
-11
README.md
+82
-11
README.md
······+A file that hasn't been accessed eventually gets evicted from hot (LRU), then warm (size limit + policy). Next request fetches from cold and promotes it back up.···+getWithMetadata?(key: string): Promise<{ data: Uint8Array; metadata: StorageMetadata } | null>+The optional `getWithMetadata` method returns both data and metadata in a single call. Implement it if your backend can fetch both efficiently (e.g., parallel I/O, single query). Falls back to separate `get()` + `getMetadata()` calls if not implemented.
+17
-10
serve-example.ts
+17
-10
serve-example.ts
·········
+112
-55
src/TieredStorage.ts
+112
-55
src/TieredStorage.ts
···············
+2
src/index.ts
+2
src/index.ts
+36
-11
src/tiers/DiskStorageTier.ts
+36
-11
src/tiers/DiskStorageTier.ts
···import { readFile, writeFile, unlink, readdir, stat, mkdir, rm, rename } from 'node:fs/promises';+import type { StorageTier, StorageMetadata, TierStats, TierGetResult } from '../types/index.js';···
+19
-1
src/tiers/MemoryStorageTier.ts
+19
-1
src/tiers/MemoryStorageTier.ts
···+import type { StorageTier, StorageMetadata, TierStats, TierGetResult } from '../types/index.js';···
+70
-1
src/tiers/S3StorageTier.ts
+70
-1
src/tiers/S3StorageTier.ts
···+import type { StorageTier, StorageMetadata, TierStats, TierGetResult } from '../types/index.js';···
+67
src/types/index.ts
+67
src/types/index.ts
············
+40
src/utils/glob.ts
+40
src/utils/glob.ts
···
+175
test/TieredStorage.test.ts
+175
test/TieredStorage.test.ts
···
+95
test/glob.test.ts
+95
test/glob.test.ts
···