@statsig/client-core
Advanced tools
Comparing version 0.0.1-beta.24 to 0.0.1-beta.25
{ | ||
"name": "@statsig/client-core", | ||
"version": "0.0.1-beta.24", | ||
"version": "0.0.1-beta.25", | ||
"dependencies": {}, | ||
@@ -5,0 +5,0 @@ "type": "commonjs", |
@@ -6,5 +6,5 @@ export declare class MockLocalStorage { | ||
clear(): void; | ||
getItem(key: string): string | null; | ||
getItem(key: string): Promise<string | null>; | ||
setItem(key: string, value: string): void; | ||
removeItem(key: string): void; | ||
} |
"use strict"; | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
@@ -27,3 +36,5 @@ exports.MockLocalStorage = void 0; | ||
getItem(key) { | ||
return this.data[key] ? this.data[key] : null; | ||
return __awaiter(this, void 0, void 0, function* () { | ||
return Promise.resolve(this.data[key] ? this.data[key] : null); | ||
}); | ||
} | ||
@@ -30,0 +41,0 @@ setItem(key, value) { |
@@ -26,2 +26,3 @@ "use strict"; | ||
Object.defineProperty(exports, "Storage", { enumerable: true, get: function () { return StorageProvider_1.Storage; } }); | ||
const UUID_1 = require("./UUID"); | ||
__exportStar(require("./$_StatsigGlobal"), exports); | ||
@@ -57,2 +58,3 @@ __exportStar(require("./ClientInterfaces"), exports); | ||
Log: Log_1.Log, | ||
getUUID: UUID_1.getUUID, | ||
Storage: StorageProvider_1.Storage }); |
@@ -0,3 +1,12 @@ | ||
type SessionState = { | ||
emitFunction: () => void; | ||
ageTimeoutID: ReturnType<typeof setTimeout> | null; | ||
idleTimeoutID: ReturnType<typeof setTimeout> | null; | ||
}; | ||
export declare const SessionID: { | ||
get: (sdkKey: string) => Promise<string>; | ||
_getPromise: (sdkKey: string) => Promise<string>; | ||
_setEmitFunction: (eFunction: () => void, sdkKey: string) => void; | ||
_resetTimeout: (sessionState: SessionState, timeoutID: ReturnType<typeof setTimeout> | null, duration: number) => ReturnType<typeof setTimeout> | null; | ||
}; | ||
export {}; |
@@ -18,26 +18,69 @@ "use strict"; | ||
const SESSION_ID_MAP = {}; | ||
const MAX_SESSION_IDLE_TIME = 10 * 60 * 1000; // 10 minutes | ||
const SESSION_STATE_MAP = {}; | ||
const PROMISE_MAP = {}; | ||
const MAX_SESSION_IDLE_TIME = 30 * 60 * 1000; // 30 minutes | ||
const MAX_SESSION_AGE = 4 * 60 * 60 * 1000; // 4 hours | ||
exports.SessionID = { | ||
get: (sdkKey) => __awaiter(void 0, void 0, void 0, function* () { | ||
if (PROMISE_MAP[sdkKey] != null) { | ||
return PROMISE_MAP[sdkKey]; | ||
} | ||
return (PROMISE_MAP[sdkKey] = exports.SessionID._getPromise(sdkKey)); | ||
}), | ||
_getPromise: (sdkKey) => __awaiter(void 0, void 0, void 0, function* () { | ||
var _a; | ||
let session = SESSION_ID_MAP[sdkKey]; | ||
const now = Date.now(); | ||
let sessionChanged = false; | ||
if (session == null) { | ||
session = (_a = (yield _loadFromStorage(sdkKey))) !== null && _a !== void 0 ? _a : { | ||
sessionID: (0, UUID_1.getUUID)(), | ||
startTime: Date.now(), | ||
lastUpdate: Date.now(), | ||
}; | ||
let tempSession = yield _loadFromStorage(sdkKey); | ||
if (tempSession == null) { | ||
tempSession = { | ||
sessionID: (0, UUID_1.getUUID)(), | ||
startTime: now, | ||
lastUpdate: now, | ||
}; | ||
sessionChanged = true; | ||
} | ||
session = tempSession; | ||
SESSION_ID_MAP[sdkKey] = session; | ||
} | ||
if (Date.now() - session.startTime > MAX_SESSION_AGE || | ||
Date.now() - session.lastUpdate > MAX_SESSION_IDLE_TIME) { | ||
const sessionState = (_a = SESSION_STATE_MAP[sdkKey]) !== null && _a !== void 0 ? _a : { | ||
ageTimeoutID: null, | ||
idleTimeoutID: null, | ||
emitFunction: () => { | ||
return; | ||
}, | ||
}; | ||
if (now - session.startTime > MAX_SESSION_AGE || | ||
now - session.lastUpdate > MAX_SESSION_IDLE_TIME) { | ||
session.sessionID = (0, UUID_1.getUUID)(); | ||
session.startTime = Date.now(); | ||
session.startTime = now; | ||
sessionChanged = true; | ||
} | ||
session.lastUpdate = Date.now(); | ||
session.lastUpdate = now; | ||
_persistToStorage(session, sdkKey); | ||
sessionState.idleTimeoutID = exports.SessionID._resetTimeout(sessionState, sessionState.idleTimeoutID, MAX_SESSION_IDLE_TIME); | ||
if (sessionChanged) { | ||
sessionState.ageTimeoutID = exports.SessionID._resetTimeout(sessionState, sessionState.ageTimeoutID, MAX_SESSION_AGE); | ||
} | ||
SESSION_ID_MAP[sdkKey] = session; | ||
SESSION_STATE_MAP[sdkKey] = sessionState; | ||
PROMISE_MAP[sdkKey] = null; | ||
return session.sessionID; | ||
}), | ||
_setEmitFunction: (eFunction, sdkKey) => { | ||
var _a; | ||
const sessionState = (_a = SESSION_STATE_MAP[sdkKey]) !== null && _a !== void 0 ? _a : { | ||
ageTimeoutID: null, | ||
idleTimeoutID: null, | ||
emitFunction: eFunction, | ||
}; | ||
sessionState.emitFunction = eFunction; | ||
SESSION_STATE_MAP[sdkKey] = sessionState; | ||
}, | ||
_resetTimeout: (sessionState, timeoutID, duration) => { | ||
clearTimeout(timeoutID !== null && timeoutID !== void 0 ? timeoutID : undefined); | ||
return setTimeout(sessionState.emitFunction, duration); | ||
}, | ||
}; | ||
@@ -44,0 +87,0 @@ function _getSessionIDStorageKey(sdkKey) { |
@@ -17,2 +17,3 @@ "use strict"; | ||
const Log_1 = require("./Log"); | ||
const SessionID_1 = require("./SessionID"); | ||
const StableID_1 = require("./StableID"); | ||
@@ -33,2 +34,5 @@ const StorageProvider_1 = require("./StorageProvider"); | ||
this._logger = new EventLogger_1.EventLogger(sdkKey, this._emit.bind(this), network, options); | ||
SessionID_1.SessionID._setEmitFunction(() => { | ||
this._emit({ name: 'session_expired' }); | ||
}, sdkKey); | ||
this._errorBoundary = new ErrorBoundary_1.ErrorBoundary(sdkKey); | ||
@@ -35,0 +39,0 @@ __STATSIG__ = __STATSIG__ !== null && __STATSIG__ !== void 0 ? __STATSIG__ : {}; |
@@ -10,2 +10,3 @@ import { DataAdapterResult } from './StatsigDataAdapter'; | ||
}; | ||
session_expired: object; | ||
error: { | ||
@@ -12,0 +13,0 @@ error: unknown; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.StatsigMetadataProvider = void 0; | ||
const SDK_VERSION = '0.0.1-beta.24'; | ||
const SDK_VERSION = '0.0.1-beta.25'; | ||
let metadata = { | ||
@@ -6,0 +6,0 @@ sdkVersion: SDK_VERSION, |
98609
2346