@airgrid/edgekit
Version:
A privacy focused library for cookie-less audience creation.
60 lines (49 loc) • 1.48 kB
text/typescript
import { storage, timeStampInSecs } from '../utils';
import { PageView, StorageKeys, PageFeatureResult } from '../../types';
const DEFAULT_MAX_FEATURES_SIZE = 300;
class ViewStore {
private pageViews: PageView[];
private storageSize: number;
constructor() {
this.pageViews = [];
this.storageSize = DEFAULT_MAX_FEATURES_SIZE;
this._load();
}
_load(): void {
this.pageViews = storage.get(StorageKeys.PAGE_VIEWS) || [];
}
_save(): void {
storage.set(StorageKeys.PAGE_VIEWS, this.pageViews);
}
_trim(): void {
if (this.pageViews.length <= this.storageSize) return;
this.pageViews.sort((a: PageView, b: PageView): number => b.ts - a.ts);
this.pageViews = this.pageViews.slice(0, this.storageSize);
}
/**
* @param storageSize Max pageView items to be kept
*/
setStorageSize(storageSize?: number): void {
if (!storageSize || storageSize < 0) return;
this.storageSize = storageSize;
}
savePageView(
features: Record<string, PageFeatureResult> | undefined,
metadata?: Record<string, string | number | boolean>
): void {
if (!features || Object.keys(features).length < 1) return;
const ts = timeStampInSecs();
const pageView: PageView = {
ts,
features,
...metadata,
};
this.pageViews.push(pageView);
this._trim();
this._save();
}
getCopyOfPageViews(): PageView[] {
return [...this.pageViews];
}
}
export const viewStore = new ViewStore();