diff --git a/package.json b/package.json index 2bcb6c2..40c9d05 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@eppo/js-client-sdk-common", - "version": "1.8.1", + "version": "2.0.0", "description": "Eppo SDK for client-side JavaScript applications (base for both web and react native)", "main": "dist/index.js", "files": [ diff --git a/src/assignment-cache.ts b/src/assignment-cache.ts index 815a43b..f63eb87 100644 --- a/src/assignment-cache.ts +++ b/src/assignment-cache.ts @@ -54,7 +54,7 @@ export abstract class AssignmentCache { * The primary use case is for client-side SDKs, where the cache is only used * for a single user. */ -export class NonExpiringAssignmentCache extends AssignmentCache> { +export class NonExpiringInMemoryAssignmentCache extends AssignmentCache> { constructor() { super(new Map()); } @@ -69,7 +69,7 @@ export class NonExpiringAssignmentCache extends AssignmentCache> { +export class LRUInMemoryAssignmentCache extends AssignmentCache> { constructor(maxSize: number) { super(new LRUCache({ max: maxSize })); } diff --git a/src/client/eppo-client.spec.ts b/src/client/eppo-client.spec.ts index 8114efb..9d6e12d 100644 --- a/src/client/eppo-client.spec.ts +++ b/src/client/eppo-client.spec.ts @@ -395,7 +395,7 @@ describe('EppoClient E2E test', () => { }); it('does not log duplicate assignments', () => { - client.useNonExpiringAssignmentCache(); + client.useNonExpiringInMemoryAssignmentCache(); client.getAssignment('subject-10', flagKey); client.getAssignment('subject-10', flagKey); @@ -405,7 +405,7 @@ describe('EppoClient E2E test', () => { }); it('logs assignment again after the lru cache is full', () => { - client.useLRUAssignmentCache(2); + client.useLRUInMemoryAssignmentCache(2); client.getAssignment('subject-10', flagKey); // logged client.getAssignment('subject-10', flagKey); // cached @@ -449,7 +449,7 @@ describe('EppoClient E2E test', () => { }, }); - client.useNonExpiringAssignmentCache(); + client.useNonExpiringInMemoryAssignmentCache(); client.getAssignment('subject-10', flagKey); client.getAssignment('subject-10', flagKey); @@ -465,7 +465,7 @@ describe('EppoClient E2E test', () => { }); it('logs twice for the same flag when rollout increases/flag changes', () => { - client.useNonExpiringAssignmentCache(); + client.useNonExpiringInMemoryAssignmentCache(); storage.setEntries({ [flagKey]: { @@ -540,7 +540,7 @@ describe('EppoClient E2E test', () => { }); it('logs the same subject/flag/variation after two changes', () => { - client.useNonExpiringAssignmentCache(); + client.useNonExpiringInMemoryAssignmentCache(); // original configuration version storage.setEntries({ [flagKey]: mockExperimentConfig }); diff --git a/src/client/eppo-client.ts b/src/client/eppo-client.ts index dcdbe6b..4af05af 100644 --- a/src/client/eppo-client.ts +++ b/src/client/eppo-client.ts @@ -3,8 +3,8 @@ import * as md5 from 'md5'; import { AssignmentCache, Cacheable, - LRUAssignmentCache, - NonExpiringAssignmentCache, + LRUInMemoryAssignmentCache, + NonExpiringInMemoryAssignmentCache, } from '../assignment-cache'; import { IAssignmentHooks } from '../assignment-hooks'; import { @@ -418,12 +418,16 @@ export default class EppoClient implements IEppoClient { this.assignmentCache = undefined; } - public useNonExpiringAssignmentCache() { - this.assignmentCache = new NonExpiringAssignmentCache(); + public useNonExpiringInMemoryAssignmentCache() { + this.assignmentCache = new NonExpiringInMemoryAssignmentCache(); } - public useLRUAssignmentCache(maxSize: number) { - this.assignmentCache = new LRUAssignmentCache(maxSize); + public useLRUInMemoryAssignmentCache(maxSize: number) { + this.assignmentCache = new LRUInMemoryAssignmentCache(maxSize); + } + + public useCustomAssignmentCache(cache: AssignmentCache) { + this.assignmentCache = cache; } public setIsGracefulFailureMode(gracefulFailureMode: boolean) { diff --git a/src/index.ts b/src/index.ts index 175b568..af704f2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,4 @@ +import { AssignmentCache } from './assignment-cache'; import { IAssignmentHooks } from './assignment-hooks'; import { IAssignmentLogger, IAssignmentEvent } from './assignment-logger'; import EppoClient, { IEppoClient } from './client/eppo-client'; @@ -18,4 +19,5 @@ export { HttpClient, validation, IConfigurationStore, + AssignmentCache, };