@statsig/client-core 3.14.1 → 3.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,13 @@
1
1
  {
2
2
  "name": "@statsig/client-core",
3
- "version": "3.14.1",
3
+ "version": "3.15.1",
4
+ "license": "ISC",
5
+ "homepage": "https://github.com/statsig-io/js-client-monorepo",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "github:statsig-io/js-client-monorepo",
9
+ "directory": "packages/client-core"
10
+ },
4
11
  "dependencies": {},
5
12
  "type": "commonjs",
6
13
  "main": "./src/index.js",
@@ -226,6 +226,7 @@ class EventLogger {
226
226
  params: {
227
227
  [NetworkConfig_1.NetworkParam.EventCount]: String(events.length),
228
228
  },
229
+ credentials: 'same-origin',
229
230
  };
230
231
  }
231
232
  _saveFailedLogsToStorage(events) {
@@ -13,6 +13,7 @@ type RequestArgs = {
13
13
  attempt?: number;
14
14
  params?: Record<string, string>;
15
15
  headers?: Record<string, string>;
16
+ credentials?: RequestCredentials;
16
17
  };
17
18
  type DataFlags = {
18
19
  isStatsigEncodable?: boolean;
@@ -12,4 +12,5 @@ export type OverrideAdapter = {
12
12
  config: ParamStoreConfig;
13
13
  details: EvaluationDetails;
14
14
  } | null;
15
+ loadFromStorage?(): void | Promise<void>;
15
16
  };
package/src/SessionID.js CHANGED
@@ -54,16 +54,20 @@ function _overrideSessionId(override, sdkKey) {
54
54
  function _bumpSession(session) {
55
55
  const now = Date.now();
56
56
  const data = session.data;
57
+ const sdkKey = session.sdkKey;
57
58
  if (_isIdle(data) || _hasRunTooLong(data)) {
58
59
  data.sessionID = (0, UUID_1.getUUID)();
59
60
  data.startTime = now;
61
+ const client = __STATSIG__ === null || __STATSIG__ === void 0 ? void 0 : __STATSIG__.instance(sdkKey);
62
+ if (client) {
63
+ client.$emt({ name: 'session_expired' });
64
+ }
60
65
  }
61
66
  data.lastUpdate = now;
62
67
  _persistToStorage(data, session.sdkKey);
63
68
  clearTimeout(session.idleTimeoutID);
64
69
  clearTimeout(session.ageTimeoutID);
65
70
  const lifetime = now - data.startTime;
66
- const sdkKey = session.sdkKey;
67
71
  session.idleTimeoutID = _createSessionTimeout(sdkKey, MAX_SESSION_IDLE_TIME);
68
72
  session.ageTimeoutID = _createSessionTimeout(sdkKey, MAX_SESSION_AGE - lifetime);
69
73
  return session;
package/src/StableID.d.ts CHANGED
@@ -1,4 +1,7 @@
1
1
  export declare const StableID: {
2
+ cookiesEnabled: boolean;
3
+ randomID: string;
2
4
  get: (sdkKey: string) => string;
3
5
  setOverride: (override: string, sdkKey: string) => void;
6
+ _setCookiesEnabled: (sdkKey: string, cookiesEnabled: boolean) => void;
4
7
  };
package/src/StableID.js CHANGED
@@ -3,24 +3,41 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.StableID = void 0;
4
4
  const CacheKey_1 = require("./CacheKey");
5
5
  const Log_1 = require("./Log");
6
+ const SafeJs_1 = require("./SafeJs");
6
7
  const StorageProvider_1 = require("./StorageProvider");
7
8
  const UUID_1 = require("./UUID");
8
9
  const PROMISE_MAP = {};
10
+ const COOKIE_ENABLED_MAP = {};
9
11
  exports.StableID = {
12
+ cookiesEnabled: false,
13
+ randomID: Math.random().toString(36),
10
14
  get: (sdkKey) => {
11
- if (PROMISE_MAP[sdkKey] == null) {
12
- let stableID = _loadFromStorage(sdkKey);
13
- if (stableID == null) {
14
- stableID = (0, UUID_1.getUUID)();
15
- _persistToStorage(stableID, sdkKey);
16
- }
15
+ if (PROMISE_MAP[sdkKey] != null) {
16
+ return PROMISE_MAP[sdkKey];
17
+ }
18
+ let stableID = null;
19
+ stableID = _loadFromCookie(sdkKey);
20
+ if (stableID != null) {
17
21
  PROMISE_MAP[sdkKey] = stableID;
22
+ _persistToStorage(stableID, sdkKey);
23
+ return stableID;
24
+ }
25
+ stableID = _loadFromStorage(sdkKey);
26
+ if (stableID == null) {
27
+ stableID = (0, UUID_1.getUUID)();
18
28
  }
19
- return PROMISE_MAP[sdkKey];
29
+ _persistToStorage(stableID, sdkKey);
30
+ _persistToCookie(stableID, sdkKey);
31
+ PROMISE_MAP[sdkKey] = stableID;
32
+ return stableID;
20
33
  },
21
34
  setOverride: (override, sdkKey) => {
22
35
  PROMISE_MAP[sdkKey] = override;
23
36
  _persistToStorage(override, sdkKey);
37
+ _persistToCookie(override, sdkKey);
38
+ },
39
+ _setCookiesEnabled: (sdkKey, cookiesEnabled) => {
40
+ COOKIE_ENABLED_MAP[sdkKey] = cookiesEnabled;
24
41
  },
25
42
  };
26
43
  function _getStableIDStorageKey(sdkKey) {
@@ -32,10 +49,34 @@ function _persistToStorage(stableID, sdkKey) {
32
49
  (0, StorageProvider_1._setObjectInStorage)(storageKey, stableID);
33
50
  }
34
51
  catch (e) {
35
- Log_1.Log.warn('Failed to save StableID');
52
+ Log_1.Log.warn('Failed to save StableID to storage');
36
53
  }
37
54
  }
38
55
  function _loadFromStorage(sdkKey) {
39
56
  const storageKey = _getStableIDStorageKey(sdkKey);
40
57
  return (0, StorageProvider_1._getObjectFromStorage)(storageKey);
41
58
  }
59
+ function _loadFromCookie(sdkKey) {
60
+ if (!COOKIE_ENABLED_MAP[sdkKey] || (0, SafeJs_1._getDocumentSafe)() == null) {
61
+ return null;
62
+ }
63
+ const cookies = document.cookie.split(';');
64
+ for (const cookie of cookies) {
65
+ const [key, value] = cookie.trim().split('=');
66
+ if (key === _getCookieName(sdkKey)) {
67
+ return decodeURIComponent(value);
68
+ }
69
+ }
70
+ return null;
71
+ }
72
+ function _persistToCookie(stableID, sdkKey) {
73
+ if (!COOKIE_ENABLED_MAP[sdkKey] || !document) {
74
+ return;
75
+ }
76
+ const expiryDate = new Date();
77
+ expiryDate.setFullYear(expiryDate.getFullYear() + 1);
78
+ document.cookie = `${_getCookieName(sdkKey)}=${encodeURIComponent(stableID)}; expires=${expiryDate.toUTCString()}; path=/`;
79
+ }
80
+ function _getCookieName(sdkKey) {
81
+ return `statsig.stable_id.${(0, CacheKey_1._getStorageKey)(sdkKey)}`;
82
+ }
@@ -18,11 +18,12 @@ const Log_1 = require("./Log");
18
18
  const MemoKey_1 = require("./MemoKey");
19
19
  const SafeJs_1 = require("./SafeJs");
20
20
  const SessionID_1 = require("./SessionID");
21
+ const StableID_1 = require("./StableID");
21
22
  const StorageProvider_1 = require("./StorageProvider");
22
23
  const MAX_MEMO_CACHE_SIZE = 3000;
23
24
  class StatsigClientBase {
24
25
  constructor(sdkKey, adapter, network, options) {
25
- var _a;
26
+ var _a, _b, _c, _d;
26
27
  this.loadingStatus = 'Uninitialized';
27
28
  this._initializePromise = null;
28
29
  this._listeners = {};
@@ -32,6 +33,8 @@ class StatsigClientBase {
32
33
  (options === null || options === void 0 ? void 0 : options.initialSessionID) &&
33
34
  SessionID_1.StatsigSession.overrideInitialSessionID(options.initialSessionID, sdkKey);
34
35
  (options === null || options === void 0 ? void 0 : options.storageProvider) && StorageProvider_1.Storage._setProvider(options.storageProvider);
36
+ (options === null || options === void 0 ? void 0 : options.enableCookies) &&
37
+ this.updateRuntimeOptions({ enableCookies: options.enableCookies });
35
38
  this._sdkKey = sdkKey;
36
39
  this._options = options !== null && options !== void 0 ? options : {};
37
40
  this._memoCache = {};
@@ -45,6 +48,7 @@ class StatsigClientBase {
45
48
  this.dataAdapter = adapter;
46
49
  this.dataAdapter.attach(sdkKey, options, network);
47
50
  this.storageProvider = StorageProvider_1.Storage;
51
+ (_d = (_c = (_b = this.overrideAdapter) === null || _b === void 0 ? void 0 : _b.loadFromStorage) === null || _c === void 0 ? void 0 : _c.call(_b)) === null || _d === void 0 ? void 0 : _d.catch((e) => this._errorBoundary.logError('OA::loadFromStorage', e));
48
52
  this._primeReadyRipcord();
49
53
  _assignGlobalInstance(sdkKey, this);
50
54
  }
@@ -62,6 +66,10 @@ class StatsigClientBase {
62
66
  this._options.disableStorage = options.disableStorage;
63
67
  StorageProvider_1.Storage._setDisabled(options.disableStorage);
64
68
  }
69
+ if (options.enableCookies != null) {
70
+ this._options.enableCookies = options.enableCookies;
71
+ StableID_1.StableID._setCookiesEnabled(this._sdkKey, options.enableCookies);
72
+ }
65
73
  }
66
74
  /**
67
75
  * Flushes any currently queued events.
@@ -1,4 +1,4 @@
1
- export declare const SDK_VERSION = "3.14.1";
1
+ export declare const SDK_VERSION = "3.15.1";
2
2
  export type StatsigMetadata = {
3
3
  readonly [key: string]: string | undefined;
4
4
  readonly appVersion?: string;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.StatsigMetadataProvider = exports.SDK_VERSION = void 0;
4
- exports.SDK_VERSION = '3.14.1';
4
+ exports.SDK_VERSION = '3.15.1';
5
5
  let metadata = {
6
6
  sdkVersion: exports.SDK_VERSION,
7
7
  sdkType: 'js-mono', // js-mono is overwritten by Precomp and OnDevice clients
@@ -20,6 +20,10 @@ export type StatsigRuntimeMutableOptions = {
20
20
  * default: `false`
21
21
  */
22
22
  disableCompression?: boolean;
23
+ /**
24
+ * Opt in cookie usage.
25
+ */
26
+ enableCookies?: boolean;
23
27
  };
24
28
  export type NetworkConfigCommon = {
25
29
  /**