@travetto/cache
Advanced tools
Comparing version 4.0.7 to 4.1.0
{ | ||
"name": "@travetto/cache", | ||
"version": "4.0.7", | ||
"version": "4.1.0", | ||
"description": "Caching functionality with decorators for declarative use.", | ||
@@ -28,8 +28,8 @@ "keywords": [ | ||
"dependencies": { | ||
"@travetto/di": "^4.0.7", | ||
"@travetto/model": "^4.0.7" | ||
"@travetto/di": "^4.1.0", | ||
"@travetto/model": "^4.1.0" | ||
}, | ||
"peerDependencies": { | ||
"@travetto/test": "^4.0.7", | ||
"@travetto/transformer": "^4.0.4" | ||
"@travetto/test": "^4.1.0", | ||
"@travetto/transformer": "^4.1.0" | ||
}, | ||
@@ -36,0 +36,0 @@ "peerDependenciesMeta": { |
@@ -1,6 +0,6 @@ | ||
import { ExpiresAt, Model, ModelExpirySupport, NotFoundError } from '@travetto/model'; | ||
import { ExpiresAt, Index, Model, ModelExpirySupport, NotFoundError } from '@travetto/model'; | ||
import { Text } from '@travetto/schema'; | ||
import { Inject, Injectable } from '@travetto/di'; | ||
import { Env } from '@travetto/base'; | ||
import { isStorageSupported } from '@travetto/model/src/internal/service/common'; | ||
import { AppError, Env } from '@travetto/base'; | ||
import { isIndexedSupported, isStorageSupported } from '@travetto/model/src/internal/service/common'; | ||
@@ -15,2 +15,7 @@ import { CacheError } from './error'; | ||
@Index({ | ||
name: 'keySpace', | ||
type: 'unsorted', | ||
fields: [{ keySpace: 1 }] | ||
}) | ||
@Model({ autoCreate: false }) | ||
@@ -21,2 +26,3 @@ export class CacheRecord { | ||
entry: string; | ||
keySpace: string; | ||
@ExpiresAt() | ||
@@ -82,3 +88,3 @@ expiresAt: Date; | ||
*/ | ||
async set(id: string, entry: unknown, maxAge?: number): Promise<unknown> { | ||
async set(id: string, keySpace: string, entry: unknown, maxAge?: number): Promise<unknown> { | ||
const entryText = CacheUtil.toSafeJSON(entry); | ||
@@ -90,2 +96,3 @@ | ||
entry: entryText!, | ||
keySpace, | ||
expiresAt: new Date(maxAge ? maxAge + Date.now() : INFINITE_MAX_AGE), | ||
@@ -108,2 +115,18 @@ issuedAt: new Date() | ||
/** | ||
* Remove all entries by key space | ||
* @param id | ||
*/ | ||
async deleteAll(keySpace: string): Promise<void> { | ||
if (isIndexedSupported(this.#modelService)) { | ||
const removes: Promise<void>[] = []; | ||
for await (const item of this.#modelService.listByIndex(CacheRecord, 'keySpace', { keySpace })) { | ||
removes.push(this.#modelService.delete(CacheRecord, item.id)); | ||
} | ||
await Promise.all(removes); | ||
} else { | ||
throw new AppError('Unable to delete all on an un-indexed database', 'general'); | ||
} | ||
} | ||
/** | ||
* Purge the cache store of all data, if supported | ||
@@ -154,3 +177,3 @@ */ | ||
const data = await fn.apply(target, params); | ||
res = await this.set(id, data, config.maxAge); | ||
res = await this.set(id, config.keySpace!, data, config.maxAge); | ||
} | ||
@@ -157,0 +180,0 @@ |
@@ -9,2 +9,3 @@ import assert from 'node:assert'; | ||
import { ModelSuite } from '@travetto/model/support/test/suite'; | ||
import { isIndexedSupported } from '@travetto/model/src/internal/service/common'; | ||
import { Class } from '@travetto/base'; | ||
@@ -76,2 +77,8 @@ import { Schema } from '@travetto/schema'; | ||
} | ||
async deleteAllUsers() { | ||
this.source.deleteAll('user.id'); | ||
await timers.setTimeout(100); | ||
return true; | ||
} | ||
} | ||
@@ -214,2 +221,41 @@ | ||
} | ||
@Test() | ||
async allEviction() { | ||
if (!isIndexedSupported(this.serviceClass.prototype)) { | ||
return; | ||
} | ||
const service = await this.testService; | ||
// Prime cache | ||
for (let i = 0; i < 10; i++) { | ||
const start = Date.now(); | ||
await service.getUser(`${i}`); | ||
assert((Date.now() - start) >= 100); | ||
} | ||
// Read cache | ||
for (let i = 0; i < 10; i++) { | ||
const start = Date.now(); | ||
await service.getUser(`${i}`); | ||
assert((Date.now() - start) <= (this.baseLatency + 100)); | ||
} | ||
await service.deleteAllUsers(); | ||
// Prime cache | ||
for (let i = 0; i < 10; i++) { | ||
const start = Date.now(); | ||
await service.getUser(`${i}`); | ||
assert((Date.now() - start) >= 100); | ||
} | ||
// Read cache | ||
for (let i = 0; i < 10; i++) { | ||
const start = Date.now(); | ||
await service.getUser(`${i}`); | ||
assert((Date.now() - start) <= (this.baseLatency + 100)); | ||
} | ||
} | ||
} |
31203
561
Updated@travetto/di@^4.1.0
Updated@travetto/model@^4.1.0