diff --git a/README.md b/README.md index d60a857..4c31070 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,9 @@ await cache.set({ fileName: 'myFileName', key: 'myUniqueKey', payload: myPayload // Retrieve cached data by file name prefix and file name const data = await cache.get({ fileName: 'myFileName', key: 'myUniqueKey' }); +// Retrieve current list of files inside cache +const data = await cache.files(); + // Flush cache by passing regex await cache.flushByRegex('myString', 'myString2'); // Flush cache by regex match (single or multiple same matches) diff --git a/_docs/content/2.api/1.functions.md b/_docs/content/2.api/1.functions.md index ac577f7..297cd42 100644 --- a/_docs/content/2.api/1.functions.md +++ b/_docs/content/2.api/1.functions.md @@ -20,6 +20,44 @@ const data = await cache.get({ fileName: 'myFileName', key: 'myUniqueKey' }); ``` --- +### Get Files + +::code-group + +```ts [Code] +const files = cache.files() +``` + + +```json [Response] +[ + { + "name": "myFileNameFirst hash_132d085c88b595f1ef63d51afcc700028145f194732ae460aaec04f574c5c5de", + "size": { + "bytes": 75, + "megabytes": 0.00007152557373046875 + }, + "ttl": 60, + "expiration": 1710405034332, + "expires_in": 59.997 + }, + { + "name": "myFileNameSecond hash_132d085c88b595f1ef63d51afcc700028145f194732ae460aaec04f574c5c5de", + "size": { + "bytes": 75, + "megabytes": 0.00007152557373046875 + }, + "ttl": 60, + "expiration": 1710405034334, + "expires_in": 59.998 + } +] +``` + +:: + +--- + ### Flush all ```ts diff --git a/package.json b/package.json index f6e9912..55994bb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "file-sys-cache", - "version": "2.0.1", + "version": "2.1.0", "description": "A Node.js package providing efficient caching using the file system for storage.", "type": "module", "main": "./dist/file-sys-cache.cjs", diff --git a/src/lib/file-sys-cache.spec.ts b/src/lib/file-sys-cache.spec.ts index b88886a..ac06b9e 100644 --- a/src/lib/file-sys-cache.spec.ts +++ b/src/lib/file-sys-cache.spec.ts @@ -145,6 +145,35 @@ describe('FileSysCache', () => { }) }) + describe('files', () => { + const basePath = './.unit-file-sys-cache--files' + afterEach(() => { + // Delete cache folder after each test + rmSync(basePath, { recursive: true, force: true }) + }) + it('should return files', async () => { + const cache = new FileSysCache({ basePath }) + + await cache.set({ fileName: '1', key, payload }) + await cache.set({ fileName: '2', key, payload }) + const result = await cache.files() + const entry = result[0] + expect(Array.isArray(result)).toBeTruthy() + expect(entry.name).toBeDefined() + expect(entry.name).toContain('1 hash_') + expect(typeof entry.size).toBe('object') + expect(entry.size).toBeDefined() + expect(entry.size.bytes).toBeDefined() + expect(entry.size.bytes).toBe(75) + expect(entry.size.megabytes).toBeDefined() + expect(entry.size.megabytes).toBe(0.00007152557373046875) + + expect(entry.ttl).toBe(60) + expect(entry.expiration).toBeDefined() + expect(entry.expires_in).toBeDefined() + }) + }) + describe('invalidate', () => { const basePath = './.unit-file-sys-cache--invalidate' afterAll(() => { diff --git a/src/lib/file-sys-cache.ts b/src/lib/file-sys-cache.ts index e68501a..3745803 100644 --- a/src/lib/file-sys-cache.ts +++ b/src/lib/file-sys-cache.ts @@ -119,12 +119,55 @@ export default class FileSysCache { } } + async files (): Promise> { + const FILES: Array<{ + name: string + size: { + bytes: number + megabytes: number + } + ttl: number + expiration: number + expires_in: number | null + }> = [] + try { + const files = readdirSync(this.basePath) + for (const file of files) { + const stats = statSync(`${this.basePath}/${file}`) + try { + const { ttl, expiration, expiresIn } = (await this.validateFile(file)) || { ttl: 0, expiration: 0, expiresIn: 0 } + FILES.push({ + name: file, + size: { + bytes: stats.size, + megabytes: stats.size / (1024 * 1024) + }, + ttl, + expiration, + expires_in: expiresIn + }) + } catch (_) {} + } + } catch (_) { + } + return FILES + } + async invalidate (): Promise { try { const files = readdirSync(this.basePath) for (const file of files) { try { - const { expiresIn } = (await this.validateFile(file)) || { ttl: 0, expiresIn: 0 } + const { expiresIn } = (await this.validateFile(file)) || { expiresIn: 0 } const invalid = (expiresIn || 0) <= 0 if (invalid) { unlinkSync(`${this.basePath}/${file}`) @@ -142,7 +185,7 @@ export default class FileSysCache { } } - private async validateFile (key: IArguments['key']): Promise<{ ttl: number, expiresIn: number | null } | undefined> { + private async validateFile (key: IArguments['key']): Promise<{ ttl: number, expiration: number, expiresIn: number | null } | undefined> { try { // Construct the file path within the cache folder const filePath = path.resolve(this.basePath, `${key}`) @@ -163,6 +206,7 @@ export default class FileSysCache { // Return the payload data and TTL return { ttl: data.ttl, + expiration: data.expiration, expiresIn } } catch (error: any) {