posthog-js 1.90.2 → 1.91.0

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.
Files changed (73) hide show
  1. package/dist/array.full.js +1 -1
  2. package/dist/array.full.js.map +1 -1
  3. package/dist/array.js +1 -1
  4. package/dist/array.js.map +1 -1
  5. package/dist/es.js +1 -1
  6. package/dist/es.js.map +1 -1
  7. package/dist/exception-autocapture.js +1 -1
  8. package/dist/exception-autocapture.js.map +1 -1
  9. package/dist/module.d.ts +3 -4
  10. package/dist/module.js +1 -1
  11. package/dist/module.js.map +1 -1
  12. package/dist/recorder-v2.js +1 -1
  13. package/dist/recorder-v2.js.map +1 -1
  14. package/dist/recorder.js +1 -1
  15. package/dist/recorder.js.map +1 -1
  16. package/dist/surveys.js +1 -1
  17. package/dist/surveys.js.map +1 -1
  18. package/lib/package.json +1 -1
  19. package/lib/src/autocapture-utils.js +2 -1
  20. package/lib/src/autocapture-utils.js.map +1 -1
  21. package/lib/src/autocapture.js +11 -4
  22. package/lib/src/autocapture.js.map +1 -1
  23. package/lib/src/decide.js +2 -1
  24. package/lib/src/decide.js.map +1 -1
  25. package/lib/src/extensions/exception-autocapture/index.js +6 -3
  26. package/lib/src/extensions/exception-autocapture/index.js.map +1 -1
  27. package/lib/src/extensions/replay/sessionrecording.js +8 -8
  28. package/lib/src/extensions/replay/sessionrecording.js.map +1 -1
  29. package/lib/src/extensions/replay/web-performance.js +1 -0
  30. package/lib/src/extensions/replay/web-performance.js.map +1 -1
  31. package/lib/src/extensions/surveys.js +10 -2
  32. package/lib/src/extensions/surveys.js.map +1 -1
  33. package/lib/src/extensions/toolbar.d.ts +2 -2
  34. package/lib/src/extensions/toolbar.js +16 -13
  35. package/lib/src/extensions/toolbar.js.map +1 -1
  36. package/lib/src/gdpr-utils.js +2 -2
  37. package/lib/src/gdpr-utils.js.map +1 -1
  38. package/lib/src/loader-exception-autocapture.js +4 -3
  39. package/lib/src/loader-exception-autocapture.js.map +1 -1
  40. package/lib/src/loader-recorder-v2.js +7 -4
  41. package/lib/src/loader-recorder-v2.js.map +1 -1
  42. package/lib/src/loader-recorder.js +6 -6
  43. package/lib/src/loader-recorder.js.map +1 -1
  44. package/lib/src/loader-surveys.js +5 -3
  45. package/lib/src/loader-surveys.js.map +1 -1
  46. package/lib/src/page-view.js +14 -11
  47. package/lib/src/page-view.js.map +1 -1
  48. package/lib/src/posthog-core.js +21 -22
  49. package/lib/src/posthog-core.js.map +1 -1
  50. package/lib/src/posthog-surveys.js +7 -4
  51. package/lib/src/posthog-surveys.js.map +1 -1
  52. package/lib/src/retry-queue.js +2 -1
  53. package/lib/src/retry-queue.js.map +1 -1
  54. package/lib/src/session-props.d.ts +1 -2
  55. package/lib/src/session-props.js +2 -2
  56. package/lib/src/session-props.js.map +1 -1
  57. package/lib/src/sessionid.js +1 -1
  58. package/lib/src/sessionid.js.map +1 -1
  59. package/lib/src/storage.d.ts +1 -1
  60. package/lib/src/storage.js +18 -8
  61. package/lib/src/storage.js.map +1 -1
  62. package/lib/src/utils/event-utils.js +16 -10
  63. package/lib/src/utils/event-utils.js.map +1 -1
  64. package/lib/src/utils/globals.d.ts +5 -4
  65. package/lib/src/utils/globals.js +7 -5
  66. package/lib/src/utils/globals.js.map +1 -1
  67. package/lib/src/utils/index.js +7 -4
  68. package/lib/src/utils/index.js.map +1 -1
  69. package/lib/src/utils/logger.js +5 -2
  70. package/lib/src/utils/logger.js.map +1 -1
  71. package/lib/src/uuidv7.js +1 -1
  72. package/lib/src/uuidv7.js.map +1 -1
  73. package/package.json +1 -1
@@ -1,9 +1,12 @@
1
1
  import { SURVEYS } from './constants';
2
2
  import { _isUrlMatchingRegex } from './utils/request-utils';
3
+ import { window, document } from './utils/globals';
3
4
  export var surveyUrlValidationMap = {
4
- icontains: function (conditionsUrl) { return window.location.href.toLowerCase().indexOf(conditionsUrl.toLowerCase()) > -1; },
5
- regex: function (conditionsUrl) { return _isUrlMatchingRegex(window.location.href, conditionsUrl); },
6
- exact: function (conditionsUrl) { return window.location.href === conditionsUrl; },
5
+ icontains: function (conditionsUrl) {
6
+ return !!window && window.location.href.toLowerCase().indexOf(conditionsUrl.toLowerCase()) > -1;
7
+ },
8
+ regex: function (conditionsUrl) { return !!window && _isUrlMatchingRegex(window.location.href, conditionsUrl); },
9
+ exact: function (conditionsUrl) { return (window === null || window === void 0 ? void 0 : window.location.href) === conditionsUrl; },
7
10
  };
8
11
  var PostHogSurveys = /** @class */ (function () {
9
12
  function PostHogSurveys(instance) {
@@ -43,7 +46,7 @@ var PostHogSurveys = /** @class */ (function () {
43
46
  ? surveyUrlValidationMap[(_c = (_b = survey.conditions) === null || _b === void 0 ? void 0 : _b.urlMatchType) !== null && _c !== void 0 ? _c : 'icontains'](survey.conditions.url)
44
47
  : true;
45
48
  var selectorCheck = ((_d = survey.conditions) === null || _d === void 0 ? void 0 : _d.selector)
46
- ? document.querySelector(survey.conditions.selector)
49
+ ? document === null || document === void 0 ? void 0 : document.querySelector(survey.conditions.selector)
47
50
  : true;
48
51
  return urlCheck && selectorCheck;
49
52
  });
@@ -1 +1 @@
1
- {"version":3,"file":"posthog-surveys.js","sourceRoot":"","sources":["../../src/posthog-surveys.ts"],"names":[],"mappings":"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","sourcesContent":["import { PostHog } from './posthog-core'\nimport { SURVEYS } from './constants'\nimport { SurveyCallback, SurveyUrlMatchType } from './posthog-surveys-types'\nimport { _isUrlMatchingRegex } from './utils/request-utils'\n\nexport const surveyUrlValidationMap: Record<SurveyUrlMatchType, (conditionsUrl: string) => boolean> = {\n icontains: (conditionsUrl) => window.location.href.toLowerCase().indexOf(conditionsUrl.toLowerCase()) > -1,\n regex: (conditionsUrl) => _isUrlMatchingRegex(window.location.href, conditionsUrl),\n exact: (conditionsUrl) => window.location.href === conditionsUrl,\n}\n\nexport class PostHogSurveys {\n instance: PostHog\n\n constructor(instance: PostHog) {\n this.instance = instance\n }\n\n getSurveys(callback: SurveyCallback, forceReload = false) {\n const existingSurveys = this.instance.get_property(SURVEYS)\n if (!existingSurveys || forceReload) {\n this.instance._send_request(\n `${this.instance.config.api_host}/api/surveys/?token=${this.instance.config.token}`,\n {},\n { method: 'GET' },\n (response) => {\n const surveys = response.surveys || []\n this.instance.persistence?.register({ [SURVEYS]: surveys })\n return callback(surveys)\n }\n )\n } else {\n return callback(existingSurveys)\n }\n }\n\n getActiveMatchingSurveys(callback: SurveyCallback, forceReload = false) {\n this.getSurveys((surveys) => {\n const activeSurveys = surveys.filter((survey) => {\n return !!(survey.start_date && !survey.end_date)\n })\n const conditionMatchedSurveys = activeSurveys.filter((survey) => {\n if (!survey.conditions) {\n return true\n }\n\n // use urlMatchType to validate url condition, fallback to contains for backwards compatibility\n const urlCheck = survey.conditions?.url\n ? surveyUrlValidationMap[survey.conditions?.urlMatchType ?? 'icontains'](survey.conditions.url)\n : true\n const selectorCheck = survey.conditions?.selector\n ? document.querySelector(survey.conditions.selector)\n : true\n return urlCheck && selectorCheck\n })\n const targetingMatchedSurveys = conditionMatchedSurveys.filter((survey) => {\n if (!survey.linked_flag_key && !survey.targeting_flag_key) {\n return true\n }\n const linkedFlagCheck = survey.linked_flag_key\n ? this.instance.featureFlags.isFeatureEnabled(survey.linked_flag_key)\n : true\n const targetingFlagCheck = survey.targeting_flag_key\n ? this.instance.featureFlags.isFeatureEnabled(survey.targeting_flag_key)\n : true\n return linkedFlagCheck && targetingFlagCheck\n })\n\n return callback(targetingMatchedSurveys)\n }, forceReload)\n }\n}\n"]}
1
+ {"version":3,"file":"posthog-surveys.js","sourceRoot":"","sources":["../../src/posthog-surveys.ts"],"names":[],"mappings":"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","sourcesContent":["import { PostHog } from './posthog-core'\nimport { SURVEYS } from './constants'\nimport { SurveyCallback, SurveyUrlMatchType } from './posthog-surveys-types'\nimport { _isUrlMatchingRegex } from './utils/request-utils'\nimport { window, document } from './utils/globals'\n\nexport const surveyUrlValidationMap: Record<SurveyUrlMatchType, (conditionsUrl: string) => boolean> = {\n icontains: (conditionsUrl) =>\n !!window && window.location.href.toLowerCase().indexOf(conditionsUrl.toLowerCase()) > -1,\n regex: (conditionsUrl) => !!window && _isUrlMatchingRegex(window.location.href, conditionsUrl),\n exact: (conditionsUrl) => window?.location.href === conditionsUrl,\n}\n\nexport class PostHogSurveys {\n instance: PostHog\n\n constructor(instance: PostHog) {\n this.instance = instance\n }\n\n getSurveys(callback: SurveyCallback, forceReload = false) {\n const existingSurveys = this.instance.get_property(SURVEYS)\n if (!existingSurveys || forceReload) {\n this.instance._send_request(\n `${this.instance.config.api_host}/api/surveys/?token=${this.instance.config.token}`,\n {},\n { method: 'GET' },\n (response) => {\n const surveys = response.surveys || []\n this.instance.persistence?.register({ [SURVEYS]: surveys })\n return callback(surveys)\n }\n )\n } else {\n return callback(existingSurveys)\n }\n }\n\n getActiveMatchingSurveys(callback: SurveyCallback, forceReload = false) {\n this.getSurveys((surveys) => {\n const activeSurveys = surveys.filter((survey) => {\n return !!(survey.start_date && !survey.end_date)\n })\n const conditionMatchedSurveys = activeSurveys.filter((survey) => {\n if (!survey.conditions) {\n return true\n }\n\n // use urlMatchType to validate url condition, fallback to contains for backwards compatibility\n const urlCheck = survey.conditions?.url\n ? surveyUrlValidationMap[survey.conditions?.urlMatchType ?? 'icontains'](survey.conditions.url)\n : true\n const selectorCheck = survey.conditions?.selector\n ? document?.querySelector(survey.conditions.selector)\n : true\n return urlCheck && selectorCheck\n })\n const targetingMatchedSurveys = conditionMatchedSurveys.filter((survey) => {\n if (!survey.linked_flag_key && !survey.targeting_flag_key) {\n return true\n }\n const linkedFlagCheck = survey.linked_flag_key\n ? this.instance.featureFlags.isFeatureEnabled(survey.linked_flag_key)\n : true\n const targetingFlagCheck = survey.targeting_flag_key\n ? this.instance.featureFlags.isFeatureEnabled(survey.targeting_flag_key)\n : true\n return linkedFlagCheck && targetingFlagCheck\n })\n\n return callback(targetingMatchedSurveys)\n }, forceReload)\n }\n}\n"]}
@@ -39,6 +39,7 @@ import { RequestQueueScaffold } from './base-request-queue';
39
39
  import { encodePostData, xhr } from './send-request';
40
40
  import { _isUndefined } from './utils/type-utils';
41
41
  import { logger } from './utils/logger';
42
+ import { window } from './utils/globals';
42
43
  var thirtyMinutes = 30 * 60 * 1000;
43
44
  /**
44
45
  * Generates a jitter-ed exponential backoff delay in milliseconds
@@ -151,7 +152,7 @@ var RetryQueue = /** @class */ (function (_super) {
151
152
  try {
152
153
  // we've had send beacon in place for at least 2 years
153
154
  // eslint-disable-next-line compat/compat
154
- window.navigator.sendBeacon(url, encodePostData(data, __assign(__assign({}, options), { sendBeacon: true })));
155
+ window === null || window === void 0 ? void 0 : window.navigator.sendBeacon(url, encodePostData(data, __assign(__assign({}, options), { sendBeacon: true })));
155
156
  }
156
157
  catch (e) {
157
158
  // Note sendBeacon automatically retries, and after the first retry it will lose reference to contextual `this`.
@@ -1 +1 @@
1
- {"version":3,"file":"retry-queue.js","sourceRoot":"","sources":["../../src/retry-queue.ts"],"names":[],"mappings":"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","sourcesContent":["import { RequestQueueScaffold } from './base-request-queue'\nimport { encodePostData, xhr } from './send-request'\nimport { QueuedRequestData, RetryQueueElement } from './types'\nimport { RateLimiter } from './rate-limiter'\n\nimport { _isUndefined } from './utils/type-utils'\nimport { logger } from './utils/logger'\n\nconst thirtyMinutes = 30 * 60 * 1000\n\n/**\n * Generates a jitter-ed exponential backoff delay in milliseconds\n *\n * The base value is 6 seconds, which is doubled with each retry\n * up to the maximum of 30 minutes\n *\n * Each value then has +/- 50% jitter\n *\n * Giving a range of 6 seconds up to 45 minutes\n */\nexport function pickNextRetryDelay(retriesPerformedSoFar: number): number {\n const rawBackoffTime = 3000 * 2 ** retriesPerformedSoFar\n const minBackoff = rawBackoffTime / 2\n const cappedBackoffTime = Math.min(thirtyMinutes, rawBackoffTime)\n const jitterFraction = Math.random() - 0.5 // A random number between -0.5 and 0.5\n const jitter = jitterFraction * (cappedBackoffTime - minBackoff)\n return Math.ceil(cappedBackoffTime + jitter)\n}\n\nexport class RetryQueue extends RequestQueueScaffold {\n queue: RetryQueueElement[]\n isPolling: boolean\n areWeOnline: boolean\n onXHRError: (failedRequest: XMLHttpRequest) => void\n rateLimiter: RateLimiter\n\n constructor(onXHRError: (failedRequest: XMLHttpRequest) => void, rateLimiter: RateLimiter) {\n super()\n this.isPolling = false\n this.queue = []\n this.areWeOnline = true\n this.onXHRError = onXHRError\n this.rateLimiter = rateLimiter\n\n if (!_isUndefined(window) && 'onLine' in window.navigator) {\n this.areWeOnline = window.navigator.onLine\n window.addEventListener('online', () => {\n this._handleWeAreNowOnline()\n })\n window.addEventListener('offline', () => {\n this.areWeOnline = false\n })\n }\n }\n\n enqueue(requestData: QueuedRequestData): void {\n const retriesPerformedSoFar = requestData.retriesPerformedSoFar || 0\n if (retriesPerformedSoFar >= 10) {\n return\n }\n const msToNextRetry = pickNextRetryDelay(retriesPerformedSoFar)\n const retryAt = new Date(Date.now() + msToNextRetry)\n\n this.queue.push({ retryAt, requestData })\n\n let logMessage = `Enqueued failed request for retry in ${msToNextRetry}`\n if (!navigator.onLine) {\n logMessage += ' (Browser is offline)'\n }\n logger.warn(logMessage)\n\n if (!this.isPolling) {\n this.isPolling = true\n this.poll()\n }\n }\n\n poll(): void {\n this._poller && clearTimeout(this._poller)\n this._poller = setTimeout(() => {\n if (this.areWeOnline && this.queue.length > 0) {\n this.flush()\n }\n this.poll()\n }, this._pollInterval) as any as number\n }\n\n flush(): void {\n // using Date.now to make tests easier, as recommended here https://codewithhugo.com/mocking-the-current-date-in-jest-tests/\n const now = new Date(Date.now())\n const toFlush = this.queue.filter(({ retryAt }) => retryAt < now)\n if (toFlush.length > 0) {\n this.queue = this.queue.filter(({ retryAt }) => retryAt >= now)\n for (const { requestData } of toFlush) {\n this._executeXhrRequest(requestData)\n }\n }\n }\n\n unload(): void {\n if (this._poller) {\n clearTimeout(this._poller)\n this._poller = undefined\n }\n\n for (const { requestData } of this.queue) {\n const { url, data, options } = requestData\n\n if (this.rateLimiter.isRateLimited(options._batchKey)) {\n logger.warn('[RetryQueue] is quota limited. Dropping request.')\n continue\n }\n\n try {\n // we've had send beacon in place for at least 2 years\n // eslint-disable-next-line compat/compat\n window.navigator.sendBeacon(url, encodePostData(data, { ...options, sendBeacon: true }))\n } catch (e) {\n // Note sendBeacon automatically retries, and after the first retry it will lose reference to contextual `this`.\n // This means in some cases `this.getConfig` will be undefined.\n logger.error(e)\n }\n }\n this.queue = []\n }\n\n _executeXhrRequest({ url, data, options, headers, callback, retriesPerformedSoFar }: QueuedRequestData): void {\n if (this.rateLimiter.isRateLimited(options._batchKey)) {\n return\n }\n\n xhr({\n url,\n data: data || {},\n options: options || {},\n headers: headers || {},\n retriesPerformedSoFar: retriesPerformedSoFar || 0,\n callback,\n retryQueue: this,\n onXHRError: this.onXHRError,\n onResponse: this.rateLimiter.checkForLimiting,\n })\n }\n\n _handleWeAreNowOnline(): void {\n this.areWeOnline = true\n this.flush()\n }\n}\n"]}
1
+ {"version":3,"file":"retry-queue.js","sourceRoot":"","sources":["../../src/retry-queue.ts"],"names":[],"mappings":"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","sourcesContent":["import { RequestQueueScaffold } from './base-request-queue'\nimport { encodePostData, xhr } from './send-request'\nimport { QueuedRequestData, RetryQueueElement } from './types'\nimport { RateLimiter } from './rate-limiter'\n\nimport { _isUndefined } from './utils/type-utils'\nimport { logger } from './utils/logger'\nimport { window } from './utils/globals'\n\nconst thirtyMinutes = 30 * 60 * 1000\n\n/**\n * Generates a jitter-ed exponential backoff delay in milliseconds\n *\n * The base value is 6 seconds, which is doubled with each retry\n * up to the maximum of 30 minutes\n *\n * Each value then has +/- 50% jitter\n *\n * Giving a range of 6 seconds up to 45 minutes\n */\nexport function pickNextRetryDelay(retriesPerformedSoFar: number): number {\n const rawBackoffTime = 3000 * 2 ** retriesPerformedSoFar\n const minBackoff = rawBackoffTime / 2\n const cappedBackoffTime = Math.min(thirtyMinutes, rawBackoffTime)\n const jitterFraction = Math.random() - 0.5 // A random number between -0.5 and 0.5\n const jitter = jitterFraction * (cappedBackoffTime - minBackoff)\n return Math.ceil(cappedBackoffTime + jitter)\n}\n\nexport class RetryQueue extends RequestQueueScaffold {\n queue: RetryQueueElement[]\n isPolling: boolean\n areWeOnline: boolean\n onXHRError: (failedRequest: XMLHttpRequest) => void\n rateLimiter: RateLimiter\n\n constructor(onXHRError: (failedRequest: XMLHttpRequest) => void, rateLimiter: RateLimiter) {\n super()\n this.isPolling = false\n this.queue = []\n this.areWeOnline = true\n this.onXHRError = onXHRError\n this.rateLimiter = rateLimiter\n\n if (!_isUndefined(window) && 'onLine' in window.navigator) {\n this.areWeOnline = window.navigator.onLine\n window.addEventListener('online', () => {\n this._handleWeAreNowOnline()\n })\n window.addEventListener('offline', () => {\n this.areWeOnline = false\n })\n }\n }\n\n enqueue(requestData: QueuedRequestData): void {\n const retriesPerformedSoFar = requestData.retriesPerformedSoFar || 0\n if (retriesPerformedSoFar >= 10) {\n return\n }\n const msToNextRetry = pickNextRetryDelay(retriesPerformedSoFar)\n const retryAt = new Date(Date.now() + msToNextRetry)\n\n this.queue.push({ retryAt, requestData })\n\n let logMessage = `Enqueued failed request for retry in ${msToNextRetry}`\n if (!navigator.onLine) {\n logMessage += ' (Browser is offline)'\n }\n logger.warn(logMessage)\n\n if (!this.isPolling) {\n this.isPolling = true\n this.poll()\n }\n }\n\n poll(): void {\n this._poller && clearTimeout(this._poller)\n this._poller = setTimeout(() => {\n if (this.areWeOnline && this.queue.length > 0) {\n this.flush()\n }\n this.poll()\n }, this._pollInterval) as any as number\n }\n\n flush(): void {\n // using Date.now to make tests easier, as recommended here https://codewithhugo.com/mocking-the-current-date-in-jest-tests/\n const now = new Date(Date.now())\n const toFlush = this.queue.filter(({ retryAt }) => retryAt < now)\n if (toFlush.length > 0) {\n this.queue = this.queue.filter(({ retryAt }) => retryAt >= now)\n for (const { requestData } of toFlush) {\n this._executeXhrRequest(requestData)\n }\n }\n }\n\n unload(): void {\n if (this._poller) {\n clearTimeout(this._poller)\n this._poller = undefined\n }\n\n for (const { requestData } of this.queue) {\n const { url, data, options } = requestData\n\n if (this.rateLimiter.isRateLimited(options._batchKey)) {\n logger.warn('[RetryQueue] is quota limited. Dropping request.')\n continue\n }\n\n try {\n // we've had send beacon in place for at least 2 years\n // eslint-disable-next-line compat/compat\n window?.navigator.sendBeacon(url, encodePostData(data, { ...options, sendBeacon: true }))\n } catch (e) {\n // Note sendBeacon automatically retries, and after the first retry it will lose reference to contextual `this`.\n // This means in some cases `this.getConfig` will be undefined.\n logger.error(e)\n }\n }\n this.queue = []\n }\n\n _executeXhrRequest({ url, data, options, headers, callback, retriesPerformedSoFar }: QueuedRequestData): void {\n if (this.rateLimiter.isRateLimited(options._batchKey)) {\n return\n }\n\n xhr({\n url,\n data: data || {},\n options: options || {},\n headers: headers || {},\n retriesPerformedSoFar: retriesPerformedSoFar || 0,\n callback,\n retryQueue: this,\n onXHRError: this.onXHRError,\n onResponse: this.rateLimiter.checkForLimiting,\n })\n }\n\n _handleWeAreNowOnline(): void {\n this.areWeOnline = true\n this.flush()\n }\n}\n"]}
@@ -13,12 +13,11 @@ interface StoredSessionSourceProps {
13
13
  sessionId: string;
14
14
  props: SessionSourceProps;
15
15
  }
16
- export declare const generateSessionSourceParams: () => SessionSourceProps;
17
16
  export declare class SessionPropsManager {
18
17
  private readonly _sessionIdManager;
19
18
  private readonly _persistence;
20
19
  private readonly _sessionSourceParamGenerator;
21
- constructor(sessionIdManager: SessionIdManager, persistence: PostHogPersistence, sessionSourceParamGenerator?: typeof generateSessionSourceParams);
20
+ constructor(sessionIdManager: SessionIdManager, persistence: PostHogPersistence, sessionSourceParamGenerator?: () => SessionSourceProps);
22
21
  _getStoredProps(): StoredSessionSourceProps | undefined;
23
22
  _onSessionIdCallback: (sessionId: string) => void;
24
23
  getSessionProps(): {
@@ -20,8 +20,8 @@ var __assign = (this && this.__assign) || function () {
20
20
  import { window } from './utils/globals';
21
21
  import { _info } from './utils/event-utils';
22
22
  import { CLIENT_SESSION_PROPS } from './constants';
23
- export var generateSessionSourceParams = function () {
24
- return __assign({ initialPathName: window.location.pathname, referringDomain: _info.referringDomain() }, _info.campaignParams());
23
+ var generateSessionSourceParams = function () {
24
+ return __assign({ initialPathName: (window === null || window === void 0 ? void 0 : window.location.pathname) || '', referringDomain: _info.referringDomain() }, _info.campaignParams());
25
25
  };
26
26
  var SessionPropsManager = /** @class */ (function () {
27
27
  function SessionPropsManager(sessionIdManager, persistence, sessionSourceParamGenerator) {
@@ -1 +1 @@
1
- {"version":3,"file":"session-props.js","sourceRoot":"","sources":["../../src/session-props.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAG3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAiBlD,MAAM,CAAC,IAAM,2BAA2B,GAAG;IACvC,kBACI,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EACzC,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,IACrC,KAAK,CAAC,cAAc,EAAE,EAC5B;AACL,CAAC,CAAA;AAED;IAKI,6BACI,gBAAkC,EAClC,WAA+B,EAC/B,2BAAgE;QAHpE,iBAUC;QAMD,yBAAoB,GAAG,UAAC,SAAiB;;YACrC,IAAM,MAAM,GAAG,KAAI,CAAC,eAAe,EAAE,CAAA;YACrC,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE;gBAC1C,OAAM;aACT;YAED,IAAM,QAAQ,GAA6B;gBACvC,SAAS,WAAA;gBACT,KAAK,EAAE,KAAI,CAAC,4BAA4B,EAAE;aAC7C,CAAA;YACD,KAAI,CAAC,YAAY,CAAC,QAAQ,WAAG,GAAC,oBAAoB,IAAG,QAAQ,MAAG,CAAA;QACpE,CAAC,CAAA;QAtBG,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAA;QACzC,IAAI,CAAC,YAAY,GAAG,WAAW,CAAA;QAC/B,IAAI,CAAC,4BAA4B,GAAG,2BAA2B,IAAI,2BAA2B,CAAA;QAE9F,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;IACjE,CAAC;IAED,6CAAe,GAAf;QACI,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAA;IACxD,CAAC;IAeD,6CAAe,GAAf;;QACI,IAAM,CAAC,GAAG,MAAA,IAAI,CAAC,eAAe,EAAE,0CAAE,KAAK,CAAA;QACvC,IAAI,CAAC,CAAC,EAAE;YACJ,OAAO,EAAE,CAAA;SACZ;QAED,OAAO;YACH,sCAAsC,EAAE,CAAC,CAAC,eAAe;YACzD,gCAAgC,EAAE,CAAC,CAAC,eAAe;YACnD,kCAAkC,EAAE,CAAC,CAAC,UAAU;YAChD,oCAAoC,EAAE,CAAC,CAAC,YAAY;YACpD,kCAAkC,EAAE,CAAC,CAAC,UAAU;YAChD,mCAAmC,EAAE,CAAC,CAAC,WAAW;YAClD,gCAAgC,EAAE,CAAC,CAAC,QAAQ;SAC/C,CAAA;IACL,CAAC;IACL,0BAAC;AAAD,CAAC,AAlDD,IAkDC","sourcesContent":["/* Client-side session parameters. These are primarily used by web analytics,\n * which relies on these for session analytics without the plugin server being\n * available for the person level set-once properties. Obviously not consistent\n * between client-side events and server-side events but this is acceptable\n * as web analytics only uses client-side.\n *\n * These have the same lifespan as a session_id\n */\nimport { window } from './utils/globals'\nimport { _info } from './utils/event-utils'\nimport { SessionIdManager } from './sessionid'\nimport { PostHogPersistence } from './posthog-persistence'\nimport { CLIENT_SESSION_PROPS } from './constants'\n\ninterface SessionSourceProps {\n initialPathName: string\n referringDomain: string // Is actually host, but named domain for internal consistency. Should contain a port if there is one.\n utm_medium?: string\n utm_source?: string\n utm_campaign?: string\n utm_content?: string\n utm_term?: string\n}\n\ninterface StoredSessionSourceProps {\n sessionId: string\n props: SessionSourceProps\n}\n\nexport const generateSessionSourceParams = (): SessionSourceProps => {\n return {\n initialPathName: window.location.pathname,\n referringDomain: _info.referringDomain(),\n ..._info.campaignParams(),\n }\n}\n\nexport class SessionPropsManager {\n private readonly _sessionIdManager: SessionIdManager\n private readonly _persistence: PostHogPersistence\n private readonly _sessionSourceParamGenerator: typeof generateSessionSourceParams\n\n constructor(\n sessionIdManager: SessionIdManager,\n persistence: PostHogPersistence,\n sessionSourceParamGenerator?: typeof generateSessionSourceParams\n ) {\n this._sessionIdManager = sessionIdManager\n this._persistence = persistence\n this._sessionSourceParamGenerator = sessionSourceParamGenerator || generateSessionSourceParams\n\n this._sessionIdManager.onSessionId(this._onSessionIdCallback)\n }\n\n _getStoredProps(): StoredSessionSourceProps | undefined {\n return this._persistence.props[CLIENT_SESSION_PROPS]\n }\n\n _onSessionIdCallback = (sessionId: string) => {\n const stored = this._getStoredProps()\n if (stored && stored.sessionId === sessionId) {\n return\n }\n\n const newProps: StoredSessionSourceProps = {\n sessionId,\n props: this._sessionSourceParamGenerator(),\n }\n this._persistence.register({ [CLIENT_SESSION_PROPS]: newProps })\n }\n\n getSessionProps() {\n const p = this._getStoredProps()?.props\n if (!p) {\n return {}\n }\n\n return {\n $client_session_initial_referring_host: p.referringDomain,\n $client_session_initial_pathname: p.initialPathName,\n $client_session_initial_utm_source: p.utm_source,\n $client_session_initial_utm_campaign: p.utm_campaign,\n $client_session_initial_utm_medium: p.utm_medium,\n $client_session_initial_utm_content: p.utm_content,\n $client_session_initial_utm_term: p.utm_term,\n }\n }\n}\n"]}
1
+ {"version":3,"file":"session-props.js","sourceRoot":"","sources":["../../src/session-props.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAG3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAiBlD,IAAM,2BAA2B,GAAG;IAChC,kBACI,eAAe,EAAE,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,QAAQ,CAAC,QAAQ,KAAI,EAAE,EAChD,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,IACrC,KAAK,CAAC,cAAc,EAAE,EAC5B;AACL,CAAC,CAAA;AAED;IAKI,6BACI,gBAAkC,EAClC,WAA+B,EAC/B,2BAAsD;QAH1D,iBAUC;QAMD,yBAAoB,GAAG,UAAC,SAAiB;;YACrC,IAAM,MAAM,GAAG,KAAI,CAAC,eAAe,EAAE,CAAA;YACrC,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE;gBAC1C,OAAM;aACT;YAED,IAAM,QAAQ,GAA6B;gBACvC,SAAS,WAAA;gBACT,KAAK,EAAE,KAAI,CAAC,4BAA4B,EAAE;aAC7C,CAAA;YACD,KAAI,CAAC,YAAY,CAAC,QAAQ,WAAG,GAAC,oBAAoB,IAAG,QAAQ,MAAG,CAAA;QACpE,CAAC,CAAA;QAtBG,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAA;QACzC,IAAI,CAAC,YAAY,GAAG,WAAW,CAAA;QAC/B,IAAI,CAAC,4BAA4B,GAAG,2BAA2B,IAAI,2BAA2B,CAAA;QAE9F,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;IACjE,CAAC;IAED,6CAAe,GAAf;QACI,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAA;IACxD,CAAC;IAeD,6CAAe,GAAf;;QACI,IAAM,CAAC,GAAG,MAAA,IAAI,CAAC,eAAe,EAAE,0CAAE,KAAK,CAAA;QACvC,IAAI,CAAC,CAAC,EAAE;YACJ,OAAO,EAAE,CAAA;SACZ;QAED,OAAO;YACH,sCAAsC,EAAE,CAAC,CAAC,eAAe;YACzD,gCAAgC,EAAE,CAAC,CAAC,eAAe;YACnD,kCAAkC,EAAE,CAAC,CAAC,UAAU;YAChD,oCAAoC,EAAE,CAAC,CAAC,YAAY;YACpD,kCAAkC,EAAE,CAAC,CAAC,UAAU;YAChD,mCAAmC,EAAE,CAAC,CAAC,WAAW;YAClD,gCAAgC,EAAE,CAAC,CAAC,QAAQ;SAC/C,CAAA;IACL,CAAC;IACL,0BAAC;AAAD,CAAC,AAlDD,IAkDC","sourcesContent":["/* Client-side session parameters. These are primarily used by web analytics,\n * which relies on these for session analytics without the plugin server being\n * available for the person level set-once properties. Obviously not consistent\n * between client-side events and server-side events but this is acceptable\n * as web analytics only uses client-side.\n *\n * These have the same lifespan as a session_id\n */\nimport { window } from './utils/globals'\nimport { _info } from './utils/event-utils'\nimport { SessionIdManager } from './sessionid'\nimport { PostHogPersistence } from './posthog-persistence'\nimport { CLIENT_SESSION_PROPS } from './constants'\n\ninterface SessionSourceProps {\n initialPathName: string\n referringDomain: string // Is actually host, but named domain for internal consistency. Should contain a port if there is one.\n utm_medium?: string\n utm_source?: string\n utm_campaign?: string\n utm_content?: string\n utm_term?: string\n}\n\ninterface StoredSessionSourceProps {\n sessionId: string\n props: SessionSourceProps\n}\n\nconst generateSessionSourceParams = (): SessionSourceProps => {\n return {\n initialPathName: window?.location.pathname || '',\n referringDomain: _info.referringDomain(),\n ..._info.campaignParams(),\n }\n}\n\nexport class SessionPropsManager {\n private readonly _sessionIdManager: SessionIdManager\n private readonly _persistence: PostHogPersistence\n private readonly _sessionSourceParamGenerator: () => SessionSourceProps\n\n constructor(\n sessionIdManager: SessionIdManager,\n persistence: PostHogPersistence,\n sessionSourceParamGenerator?: () => SessionSourceProps\n ) {\n this._sessionIdManager = sessionIdManager\n this._persistence = persistence\n this._sessionSourceParamGenerator = sessionSourceParamGenerator || generateSessionSourceParams\n\n this._sessionIdManager.onSessionId(this._onSessionIdCallback)\n }\n\n _getStoredProps(): StoredSessionSourceProps | undefined {\n return this._persistence.props[CLIENT_SESSION_PROPS]\n }\n\n _onSessionIdCallback = (sessionId: string) => {\n const stored = this._getStoredProps()\n if (stored && stored.sessionId === sessionId) {\n return\n }\n\n const newProps: StoredSessionSourceProps = {\n sessionId,\n props: this._sessionSourceParamGenerator(),\n }\n this._persistence.register({ [CLIENT_SESSION_PROPS]: newProps })\n }\n\n getSessionProps() {\n const p = this._getStoredProps()?.props\n if (!p) {\n return {}\n }\n\n return {\n $client_session_initial_referring_host: p.referringDomain,\n $client_session_initial_pathname: p.initialPathName,\n $client_session_initial_utm_source: p.utm_source,\n $client_session_initial_utm_campaign: p.utm_campaign,\n $client_session_initial_utm_medium: p.utm_medium,\n $client_session_initial_utm_content: p.utm_content,\n $client_session_initial_utm_term: p.utm_term,\n }\n }\n}\n"]}
@@ -148,7 +148,7 @@ var SessionIdManager = /** @class */ (function () {
148
148
  */
149
149
  SessionIdManager.prototype._listenToReloadWindow = function () {
150
150
  var _this = this;
151
- window.addEventListener('beforeunload', function () {
151
+ window === null || window === void 0 ? void 0 : window.addEventListener('beforeunload', function () {
152
152
  if (_this._canUseSessionStorage()) {
153
153
  sessionStore.remove(_this._primary_window_exists_storage_key);
154
154
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sessionid.js","sourceRoot":"","sources":["../../src/sessionid.ts"],"names":[],"mappings":"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","sourcesContent":["import { PostHogPersistence } from './posthog-persistence'\nimport { SESSION_ID } from './constants'\nimport { sessionStore } from './storage'\nimport { PostHogConfig, SessionIdChangedCallback } from './types'\nimport { uuidv7 } from './uuidv7'\nimport { window } from './utils/globals'\n\nimport { _isArray, _isNumber, _isUndefined } from './utils/type-utils'\nimport { logger } from './utils/logger'\n\nconst MAX_SESSION_IDLE_TIMEOUT = 30 * 60 // 30 minutes\nconst MIN_SESSION_IDLE_TIMEOUT = 60 // 1 minute\nconst SESSION_LENGTH_LIMIT = 24 * 3600 * 1000 // 24 hours\n\nexport class SessionIdManager {\n private readonly _sessionIdGenerator: () => string\n private readonly _windowIdGenerator: () => string\n private config: Partial<PostHogConfig>\n private persistence: PostHogPersistence\n private _windowId: string | null | undefined\n private _sessionId: string | null | undefined\n private readonly _window_id_storage_key: string\n private readonly _primary_window_exists_storage_key: string\n private _sessionStartTimestamp: number | null\n\n private _sessionActivityTimestamp: number | null\n private readonly _sessionTimeoutMs: number\n private _sessionIdChangedHandlers: SessionIdChangedCallback[] = []\n\n constructor(\n config: Partial<PostHogConfig>,\n persistence: PostHogPersistence,\n sessionIdGenerator?: () => string,\n windowIdGenerator?: () => string\n ) {\n this.config = config\n this.persistence = persistence\n this._windowId = undefined\n this._sessionId = undefined\n this._sessionStartTimestamp = null\n this._sessionActivityTimestamp = null\n this._sessionIdGenerator = sessionIdGenerator || uuidv7\n this._windowIdGenerator = windowIdGenerator || uuidv7\n\n const persistenceName = config['persistence_name'] || config['token']\n let desiredTimeout = config['session_idle_timeout_seconds'] || MAX_SESSION_IDLE_TIMEOUT\n\n if (!_isNumber(desiredTimeout)) {\n logger.warn('session_idle_timeout_seconds must be a number. Defaulting to 30 minutes.')\n desiredTimeout = MAX_SESSION_IDLE_TIMEOUT\n } else if (desiredTimeout > MAX_SESSION_IDLE_TIMEOUT) {\n logger.warn('session_idle_timeout_seconds cannot be greater than 30 minutes. Using 30 minutes instead.')\n } else if (desiredTimeout < MIN_SESSION_IDLE_TIMEOUT) {\n logger.warn('session_idle_timeout_seconds cannot be less than 60 seconds. Using 60 seconds instead.')\n }\n\n this._sessionTimeoutMs =\n Math.min(Math.max(desiredTimeout, MIN_SESSION_IDLE_TIMEOUT), MAX_SESSION_IDLE_TIMEOUT) * 1000\n this._window_id_storage_key = 'ph_' + persistenceName + '_window_id'\n this._primary_window_exists_storage_key = 'ph_' + persistenceName + '_primary_window_exists'\n\n // primary_window_exists is set when the DOM has been loaded and is cleared on unload\n // if it exists here it means there was no unload which suggests this window is opened as a tab duplication, window.open, etc.\n if (this._canUseSessionStorage()) {\n const lastWindowId = sessionStore.parse(this._window_id_storage_key)\n\n const primaryWindowExists = sessionStore.parse(this._primary_window_exists_storage_key)\n if (lastWindowId && !primaryWindowExists) {\n // Persist window from previous storage state\n this._windowId = lastWindowId\n } else {\n // Wipe any reference to previous window id\n sessionStore.remove(this._window_id_storage_key)\n }\n // Flag this session as having a primary window\n sessionStore.set(this._primary_window_exists_storage_key, true)\n }\n\n this._listenToReloadWindow()\n }\n\n onSessionId(callback: SessionIdChangedCallback): () => void {\n // KLUDGE: when running in tests the handlers array was always undefined\n // it's yucky but safe to set it here so that it's always definitely available\n if (_isUndefined(this._sessionIdChangedHandlers)) {\n this._sessionIdChangedHandlers = []\n }\n\n this._sessionIdChangedHandlers.push(callback)\n if (this._sessionId) {\n callback(this._sessionId, this._windowId)\n }\n return () => {\n this._sessionIdChangedHandlers = this._sessionIdChangedHandlers.filter((h) => h !== callback)\n }\n }\n\n private _canUseSessionStorage(): boolean {\n // We only want to use sessionStorage if persistence is enabled and not memory storage\n return this.config.persistence !== 'memory' && !this.persistence.disabled && sessionStore.is_supported()\n }\n\n // Note: this tries to store the windowId in sessionStorage. SessionStorage is unique to the current window/tab,\n // and persists page loads/reloads. So it's uniquely suited for storing the windowId. This function also respects\n // when persistence is disabled (by user config) and when sessionStorage is not supported (it *should* be supported on all browsers),\n // and in that case, it falls back to memory (which sadly, won't persist page loads)\n private _setWindowId(windowId: string): void {\n if (windowId !== this._windowId) {\n this._windowId = windowId\n if (this._canUseSessionStorage()) {\n sessionStore.set(this._window_id_storage_key, windowId)\n }\n }\n }\n\n private _getWindowId(): string | null {\n if (this._windowId) {\n return this._windowId\n }\n if (this._canUseSessionStorage()) {\n return sessionStore.parse(this._window_id_storage_key)\n }\n // New window id will be generated\n return null\n }\n\n // Note: 'this.persistence.register' can be disabled in the config.\n // In that case, this works by storing sessionId and the timestamp in memory.\n private _setSessionId(\n sessionId: string | null,\n sessionActivityTimestamp: number | null,\n sessionStartTimestamp: number | null\n ): void {\n if (\n sessionId !== this._sessionId ||\n sessionActivityTimestamp !== this._sessionActivityTimestamp ||\n sessionStartTimestamp !== this._sessionStartTimestamp\n ) {\n this._sessionStartTimestamp = sessionStartTimestamp\n this._sessionActivityTimestamp = sessionActivityTimestamp\n this._sessionId = sessionId\n\n this.persistence.register({\n [SESSION_ID]: [sessionActivityTimestamp, sessionId, sessionStartTimestamp],\n })\n }\n }\n\n private _getSessionId(): [number, string, number] {\n if (this._sessionId && this._sessionActivityTimestamp && this._sessionStartTimestamp) {\n return [this._sessionActivityTimestamp, this._sessionId, this._sessionStartTimestamp]\n }\n const sessionId = this.persistence.props[SESSION_ID]\n\n if (_isArray(sessionId) && sessionId.length === 2) {\n // Storage does not yet have a session start time. Add the last activity timestamp as the start time\n sessionId.push(sessionId[0])\n }\n\n return sessionId || [0, null, 0]\n }\n\n // Resets the session id by setting it to null. On the subsequent call to checkAndGetSessionAndWindowId,\n // new ids will be generated.\n resetSessionId(): void {\n this._setSessionId(null, null, null)\n }\n\n /*\n * Listens to window unloads and removes the primaryWindowExists key from sessionStorage.\n * Reloaded or fresh tabs created after a DOM unloads (reloading the same tab) WILL NOT have this primaryWindowExists flag in session storage.\n * Cloned sessions (new tab, tab duplication, window.open(), ...) WILL have this primaryWindowExists flag in their copied session storage.\n * We conditionally check the primaryWindowExists value in the constructor to decide if the window id in the last session storage should be carried over.\n */\n private _listenToReloadWindow(): void {\n window.addEventListener('beforeunload', () => {\n if (this._canUseSessionStorage()) {\n sessionStore.remove(this._primary_window_exists_storage_key)\n }\n })\n }\n\n /*\n * This function returns the current sessionId and windowId. It should be used to\n * access these values over directly calling `._sessionId` or `._windowId`.\n * In addition to returning the sessionId and windowId, this function also manages cycling the\n * sessionId and windowId when appropriate by doing the following:\n *\n * 1. If the sessionId or windowId is not set, it will generate a new one and store it.\n * 2. If the readOnly param is set to false, it will:\n * a. Check if it has been > SESSION_CHANGE_THRESHOLD since the last call with this flag set.\n * If so, it will generate a new sessionId and store it.\n * b. Update the timestamp stored with the sessionId to ensure the current session is extended\n * for the appropriate amount of time.\n *\n * @param {boolean} readOnly (optional) Defaults to False. Should be set to True when the call to the function should not extend or cycle the session (e.g. being called for non-user generated events)\n * @param {Number} timestamp (optional) Defaults to the current time. The timestamp to be stored with the sessionId (used when determining if a new sessionId should be generated)\n */\n checkAndGetSessionAndWindowId(readOnly = false, _timestamp: number | null = null) {\n const timestamp = _timestamp || new Date().getTime()\n\n // eslint-disable-next-line prefer-const\n let [lastTimestamp, sessionId, startTimestamp] = this._getSessionId()\n let windowId = this._getWindowId()\n\n const sessionPastMaximumLength =\n startTimestamp && startTimestamp > 0 && Math.abs(timestamp - startTimestamp) > SESSION_LENGTH_LIMIT\n\n let valuesChanged = false\n const noSessionId = !sessionId\n const activityTimeout = !readOnly && Math.abs(timestamp - lastTimestamp) > this._sessionTimeoutMs\n if (noSessionId || activityTimeout || sessionPastMaximumLength) {\n sessionId = this._sessionIdGenerator()\n windowId = this._windowIdGenerator()\n startTimestamp = timestamp\n valuesChanged = true\n } else if (!windowId) {\n windowId = this._windowIdGenerator()\n valuesChanged = true\n }\n\n const newTimestamp = lastTimestamp === 0 || !readOnly || sessionPastMaximumLength ? timestamp : lastTimestamp\n const sessionStartTimestamp = startTimestamp === 0 ? new Date().getTime() : startTimestamp\n\n this._setWindowId(windowId)\n this._setSessionId(sessionId, newTimestamp, sessionStartTimestamp)\n\n if (valuesChanged) {\n this._sessionIdChangedHandlers.forEach((handler) => handler(sessionId, windowId))\n }\n\n return {\n sessionId,\n windowId,\n sessionStartTimestamp,\n }\n }\n}\n"]}
1
+ {"version":3,"file":"sessionid.js","sourceRoot":"","sources":["../../src/sessionid.ts"],"names":[],"mappings":"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","sourcesContent":["import { PostHogPersistence } from './posthog-persistence'\nimport { SESSION_ID } from './constants'\nimport { sessionStore } from './storage'\nimport { PostHogConfig, SessionIdChangedCallback } from './types'\nimport { uuidv7 } from './uuidv7'\nimport { window } from './utils/globals'\n\nimport { _isArray, _isNumber, _isUndefined } from './utils/type-utils'\nimport { logger } from './utils/logger'\n\nconst MAX_SESSION_IDLE_TIMEOUT = 30 * 60 // 30 minutes\nconst MIN_SESSION_IDLE_TIMEOUT = 60 // 1 minute\nconst SESSION_LENGTH_LIMIT = 24 * 3600 * 1000 // 24 hours\n\nexport class SessionIdManager {\n private readonly _sessionIdGenerator: () => string\n private readonly _windowIdGenerator: () => string\n private config: Partial<PostHogConfig>\n private persistence: PostHogPersistence\n private _windowId: string | null | undefined\n private _sessionId: string | null | undefined\n private readonly _window_id_storage_key: string\n private readonly _primary_window_exists_storage_key: string\n private _sessionStartTimestamp: number | null\n\n private _sessionActivityTimestamp: number | null\n private readonly _sessionTimeoutMs: number\n private _sessionIdChangedHandlers: SessionIdChangedCallback[] = []\n\n constructor(\n config: Partial<PostHogConfig>,\n persistence: PostHogPersistence,\n sessionIdGenerator?: () => string,\n windowIdGenerator?: () => string\n ) {\n this.config = config\n this.persistence = persistence\n this._windowId = undefined\n this._sessionId = undefined\n this._sessionStartTimestamp = null\n this._sessionActivityTimestamp = null\n this._sessionIdGenerator = sessionIdGenerator || uuidv7\n this._windowIdGenerator = windowIdGenerator || uuidv7\n\n const persistenceName = config['persistence_name'] || config['token']\n let desiredTimeout = config['session_idle_timeout_seconds'] || MAX_SESSION_IDLE_TIMEOUT\n\n if (!_isNumber(desiredTimeout)) {\n logger.warn('session_idle_timeout_seconds must be a number. Defaulting to 30 minutes.')\n desiredTimeout = MAX_SESSION_IDLE_TIMEOUT\n } else if (desiredTimeout > MAX_SESSION_IDLE_TIMEOUT) {\n logger.warn('session_idle_timeout_seconds cannot be greater than 30 minutes. Using 30 minutes instead.')\n } else if (desiredTimeout < MIN_SESSION_IDLE_TIMEOUT) {\n logger.warn('session_idle_timeout_seconds cannot be less than 60 seconds. Using 60 seconds instead.')\n }\n\n this._sessionTimeoutMs =\n Math.min(Math.max(desiredTimeout, MIN_SESSION_IDLE_TIMEOUT), MAX_SESSION_IDLE_TIMEOUT) * 1000\n this._window_id_storage_key = 'ph_' + persistenceName + '_window_id'\n this._primary_window_exists_storage_key = 'ph_' + persistenceName + '_primary_window_exists'\n\n // primary_window_exists is set when the DOM has been loaded and is cleared on unload\n // if it exists here it means there was no unload which suggests this window is opened as a tab duplication, window.open, etc.\n if (this._canUseSessionStorage()) {\n const lastWindowId = sessionStore.parse(this._window_id_storage_key)\n\n const primaryWindowExists = sessionStore.parse(this._primary_window_exists_storage_key)\n if (lastWindowId && !primaryWindowExists) {\n // Persist window from previous storage state\n this._windowId = lastWindowId\n } else {\n // Wipe any reference to previous window id\n sessionStore.remove(this._window_id_storage_key)\n }\n // Flag this session as having a primary window\n sessionStore.set(this._primary_window_exists_storage_key, true)\n }\n\n this._listenToReloadWindow()\n }\n\n onSessionId(callback: SessionIdChangedCallback): () => void {\n // KLUDGE: when running in tests the handlers array was always undefined\n // it's yucky but safe to set it here so that it's always definitely available\n if (_isUndefined(this._sessionIdChangedHandlers)) {\n this._sessionIdChangedHandlers = []\n }\n\n this._sessionIdChangedHandlers.push(callback)\n if (this._sessionId) {\n callback(this._sessionId, this._windowId)\n }\n return () => {\n this._sessionIdChangedHandlers = this._sessionIdChangedHandlers.filter((h) => h !== callback)\n }\n }\n\n private _canUseSessionStorage(): boolean {\n // We only want to use sessionStorage if persistence is enabled and not memory storage\n return this.config.persistence !== 'memory' && !this.persistence.disabled && sessionStore.is_supported()\n }\n\n // Note: this tries to store the windowId in sessionStorage. SessionStorage is unique to the current window/tab,\n // and persists page loads/reloads. So it's uniquely suited for storing the windowId. This function also respects\n // when persistence is disabled (by user config) and when sessionStorage is not supported (it *should* be supported on all browsers),\n // and in that case, it falls back to memory (which sadly, won't persist page loads)\n private _setWindowId(windowId: string): void {\n if (windowId !== this._windowId) {\n this._windowId = windowId\n if (this._canUseSessionStorage()) {\n sessionStore.set(this._window_id_storage_key, windowId)\n }\n }\n }\n\n private _getWindowId(): string | null {\n if (this._windowId) {\n return this._windowId\n }\n if (this._canUseSessionStorage()) {\n return sessionStore.parse(this._window_id_storage_key)\n }\n // New window id will be generated\n return null\n }\n\n // Note: 'this.persistence.register' can be disabled in the config.\n // In that case, this works by storing sessionId and the timestamp in memory.\n private _setSessionId(\n sessionId: string | null,\n sessionActivityTimestamp: number | null,\n sessionStartTimestamp: number | null\n ): void {\n if (\n sessionId !== this._sessionId ||\n sessionActivityTimestamp !== this._sessionActivityTimestamp ||\n sessionStartTimestamp !== this._sessionStartTimestamp\n ) {\n this._sessionStartTimestamp = sessionStartTimestamp\n this._sessionActivityTimestamp = sessionActivityTimestamp\n this._sessionId = sessionId\n\n this.persistence.register({\n [SESSION_ID]: [sessionActivityTimestamp, sessionId, sessionStartTimestamp],\n })\n }\n }\n\n private _getSessionId(): [number, string, number] {\n if (this._sessionId && this._sessionActivityTimestamp && this._sessionStartTimestamp) {\n return [this._sessionActivityTimestamp, this._sessionId, this._sessionStartTimestamp]\n }\n const sessionId = this.persistence.props[SESSION_ID]\n\n if (_isArray(sessionId) && sessionId.length === 2) {\n // Storage does not yet have a session start time. Add the last activity timestamp as the start time\n sessionId.push(sessionId[0])\n }\n\n return sessionId || [0, null, 0]\n }\n\n // Resets the session id by setting it to null. On the subsequent call to checkAndGetSessionAndWindowId,\n // new ids will be generated.\n resetSessionId(): void {\n this._setSessionId(null, null, null)\n }\n\n /*\n * Listens to window unloads and removes the primaryWindowExists key from sessionStorage.\n * Reloaded or fresh tabs created after a DOM unloads (reloading the same tab) WILL NOT have this primaryWindowExists flag in session storage.\n * Cloned sessions (new tab, tab duplication, window.open(), ...) WILL have this primaryWindowExists flag in their copied session storage.\n * We conditionally check the primaryWindowExists value in the constructor to decide if the window id in the last session storage should be carried over.\n */\n private _listenToReloadWindow(): void {\n window?.addEventListener('beforeunload', () => {\n if (this._canUseSessionStorage()) {\n sessionStore.remove(this._primary_window_exists_storage_key)\n }\n })\n }\n\n /*\n * This function returns the current sessionId and windowId. It should be used to\n * access these values over directly calling `._sessionId` or `._windowId`.\n * In addition to returning the sessionId and windowId, this function also manages cycling the\n * sessionId and windowId when appropriate by doing the following:\n *\n * 1. If the sessionId or windowId is not set, it will generate a new one and store it.\n * 2. If the readOnly param is set to false, it will:\n * a. Check if it has been > SESSION_CHANGE_THRESHOLD since the last call with this flag set.\n * If so, it will generate a new sessionId and store it.\n * b. Update the timestamp stored with the sessionId to ensure the current session is extended\n * for the appropriate amount of time.\n *\n * @param {boolean} readOnly (optional) Defaults to False. Should be set to True when the call to the function should not extend or cycle the session (e.g. being called for non-user generated events)\n * @param {Number} timestamp (optional) Defaults to the current time. The timestamp to be stored with the sessionId (used when determining if a new sessionId should be generated)\n */\n checkAndGetSessionAndWindowId(readOnly = false, _timestamp: number | null = null) {\n const timestamp = _timestamp || new Date().getTime()\n\n // eslint-disable-next-line prefer-const\n let [lastTimestamp, sessionId, startTimestamp] = this._getSessionId()\n let windowId = this._getWindowId()\n\n const sessionPastMaximumLength =\n startTimestamp && startTimestamp > 0 && Math.abs(timestamp - startTimestamp) > SESSION_LENGTH_LIMIT\n\n let valuesChanged = false\n const noSessionId = !sessionId\n const activityTimeout = !readOnly && Math.abs(timestamp - lastTimestamp) > this._sessionTimeoutMs\n if (noSessionId || activityTimeout || sessionPastMaximumLength) {\n sessionId = this._sessionIdGenerator()\n windowId = this._windowIdGenerator()\n startTimestamp = timestamp\n valuesChanged = true\n } else if (!windowId) {\n windowId = this._windowIdGenerator()\n valuesChanged = true\n }\n\n const newTimestamp = lastTimestamp === 0 || !readOnly || sessionPastMaximumLength ? timestamp : lastTimestamp\n const sessionStartTimestamp = startTimestamp === 0 ? new Date().getTime() : startTimestamp\n\n this._setWindowId(windowId)\n this._setSessionId(sessionId, newTimestamp, sessionStartTimestamp)\n\n if (valuesChanged) {\n this._sessionIdChangedHandlers.forEach((handler) => handler(sessionId, windowId))\n }\n\n return {\n sessionId,\n windowId,\n sessionStartTimestamp,\n }\n }\n}\n"]}
@@ -12,7 +12,7 @@ import { PersistentStore } from './types';
12
12
  *
13
13
  * inspired by https://github.com/AngusFu/browser-root-domain
14
14
  */
15
- export declare function seekFirstNonPublicSubDomain(hostname: string, cookieJar?: Document): string;
15
+ export declare function seekFirstNonPublicSubDomain(hostname: string, cookieJar?: Document | undefined): string;
16
16
  export declare function chooseCookieDomain(hostname: string, cross_subdomain: boolean | undefined): string;
17
17
  export declare const cookieStore: PersistentStore;
18
18
  export declare const localStore: PersistentStore;
@@ -13,6 +13,7 @@ import { _extend } from './utils';
13
13
  import { DISTINCT_ID, SESSION_ID, SESSION_RECORDING_IS_SAMPLED } from './constants';
14
14
  import { _isNull, _isUndefined } from './utils/type-utils';
15
15
  import { logger } from './utils/logger';
16
+ import { window, document } from './utils/globals';
16
17
  import { uuidv7 } from './uuidv7';
17
18
  var Y1970 = 'Thu, 01 Jan 1970 00:00:00 GMT';
18
19
  /**
@@ -30,6 +31,9 @@ var Y1970 = 'Thu, 01 Jan 1970 00:00:00 GMT';
30
31
  */
31
32
  export function seekFirstNonPublicSubDomain(hostname, cookieJar) {
32
33
  if (cookieJar === void 0) { cookieJar = document; }
34
+ if (!cookieJar) {
35
+ return '';
36
+ }
33
37
  if (['localhost', '127.0.0.1'].includes(hostname))
34
38
  return '';
35
39
  var list = hostname.split('.');
@@ -71,11 +75,14 @@ export function chooseCookieDomain(hostname, cross_subdomain) {
71
75
  }
72
76
  // Methods partially borrowed from quirksmode.org/js/cookies.html
73
77
  export var cookieStore = {
74
- is_supported: function () { return true; },
78
+ is_supported: function () { return !!document; },
75
79
  error: function (msg) {
76
80
  logger.error('cookieStore error: ' + msg);
77
81
  },
78
82
  get: function (name) {
83
+ if (!document) {
84
+ return;
85
+ }
79
86
  try {
80
87
  var nameEQ = name + '=';
81
88
  var ca = document.cookie.split(';').filter(function (x) { return x.length; });
@@ -103,6 +110,9 @@ export var cookieStore = {
103
110
  return cookie;
104
111
  },
105
112
  set: function (name, value, days, cross_subdomain, is_secure) {
113
+ if (!document) {
114
+ return;
115
+ }
106
116
  try {
107
117
  var expires = '', secure = '';
108
118
  var cdomain = chooseCookieDomain(document.location.hostname, cross_subdomain);
@@ -171,7 +181,7 @@ export var localStore = {
171
181
  },
172
182
  get: function (name) {
173
183
  try {
174
- return window.localStorage.getItem(name);
184
+ return window === null || window === void 0 ? void 0 : window.localStorage.getItem(name);
175
185
  }
176
186
  catch (err) {
177
187
  localStore.error(err);
@@ -189,7 +199,7 @@ export var localStore = {
189
199
  },
190
200
  set: function (name, value) {
191
201
  try {
192
- window.localStorage.setItem(name, JSON.stringify(value));
202
+ window === null || window === void 0 ? void 0 : window.localStorage.setItem(name, JSON.stringify(value));
193
203
  }
194
204
  catch (err) {
195
205
  localStore.error(err);
@@ -197,7 +207,7 @@ export var localStore = {
197
207
  },
198
208
  remove: function (name) {
199
209
  try {
200
- window.localStorage.removeItem(name);
210
+ window === null || window === void 0 ? void 0 : window.localStorage.removeItem(name);
201
211
  }
202
212
  catch (err) {
203
213
  localStore.error(err);
@@ -242,7 +252,7 @@ export var localPlusCookieStore = __assign(__assign({}, localStore), { parse: fu
242
252
  }
243
253
  }, remove: function (name, cross_subdomain) {
244
254
  try {
245
- window.localStorage.removeItem(name);
255
+ window === null || window === void 0 ? void 0 : window.localStorage.removeItem(name);
246
256
  cookieStore.remove(name, cross_subdomain);
247
257
  }
248
258
  catch (err) {
@@ -305,7 +315,7 @@ export var sessionStore = {
305
315
  },
306
316
  get: function (name) {
307
317
  try {
308
- return window.sessionStorage.getItem(name);
318
+ return window === null || window === void 0 ? void 0 : window.sessionStorage.getItem(name);
309
319
  }
310
320
  catch (err) {
311
321
  sessionStore.error(err);
@@ -323,7 +333,7 @@ export var sessionStore = {
323
333
  },
324
334
  set: function (name, value) {
325
335
  try {
326
- window.sessionStorage.setItem(name, JSON.stringify(value));
336
+ window === null || window === void 0 ? void 0 : window.sessionStorage.setItem(name, JSON.stringify(value));
327
337
  }
328
338
  catch (err) {
329
339
  sessionStore.error(err);
@@ -331,7 +341,7 @@ export var sessionStore = {
331
341
  },
332
342
  remove: function (name) {
333
343
  try {
334
- window.sessionStorage.removeItem(name);
344
+ window === null || window === void 0 ? void 0 : window.sessionStorage.removeItem(name);
335
345
  }
336
346
  catch (err) {
337
347
  sessionStore.error(err);
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/storage.ts"],"names":[],"mappings":"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","sourcesContent":["import { _extend } from './utils'\nimport { PersistentStore, Properties } from './types'\nimport { DISTINCT_ID, SESSION_ID, SESSION_RECORDING_IS_SAMPLED } from './constants'\n\nimport { _isNull, _isUndefined } from './utils/type-utils'\nimport { logger } from './utils/logger'\nimport { uuidv7 } from './uuidv7'\n\nconst Y1970 = 'Thu, 01 Jan 1970 00:00:00 GMT'\n\n/**\n * Browsers don't offer a way to check if something is a public suffix\n * e.g. `.com.au`, `.io`, `.org.uk`\n *\n * But they do reject cookies set on public suffixes\n * Setting a cookie on `.co.uk` would mean it was sent for every `.co.uk` site visited\n *\n * So, we can use this to check if a domain is a public suffix\n * by trying to set a cookie on a subdomain of the provided hostname\n * until the browser accepts it\n *\n * inspired by https://github.com/AngusFu/browser-root-domain\n */\nexport function seekFirstNonPublicSubDomain(hostname: string, cookieJar = document): string {\n if (['localhost', '127.0.0.1'].includes(hostname)) return ''\n\n const list = hostname.split('.')\n let len = list.length\n const key = 'dmn_chk_' + uuidv7()\n const R = new RegExp('(^|;)\\\\s*' + key + '=1')\n\n while (len--) {\n const candidate = list.slice(len).join('.')\n const candidateCookieValue = key + '=1;domain=.' + candidate\n\n // try to set cookie\n cookieJar.cookie = candidateCookieValue\n\n if (R.test(cookieJar.cookie)) {\n // the cookie was accepted by the browser, remove the test cookie\n cookieJar.cookie = candidateCookieValue + ';expires=' + Y1970\n return candidate\n }\n }\n return ''\n}\n\nconst DOMAIN_MATCH_REGEX = /[a-z0-9][a-z0-9-]+\\.[a-z]{2,}$/i\nconst originalCookieDomainFn = (hostname: string): string => {\n const matches = hostname.match(DOMAIN_MATCH_REGEX)\n return matches ? matches[0] : ''\n}\n\nexport function chooseCookieDomain(hostname: string, cross_subdomain: boolean | undefined): string {\n if (cross_subdomain) {\n // NOTE: Could we use this for cross domain tracking?\n let matchedSubDomain = seekFirstNonPublicSubDomain(hostname)\n\n if (!matchedSubDomain) {\n const originalMatch = originalCookieDomainFn(hostname)\n if (originalMatch !== matchedSubDomain) {\n logger.info('Warning: cookie subdomain discovery mismatch', originalMatch, matchedSubDomain)\n }\n matchedSubDomain = originalMatch\n }\n\n return matchedSubDomain ? '; domain=.' + matchedSubDomain : ''\n }\n return ''\n}\n\n// Methods partially borrowed from quirksmode.org/js/cookies.html\nexport const cookieStore: PersistentStore = {\n is_supported: () => true,\n\n error: function (msg) {\n logger.error('cookieStore error: ' + msg)\n },\n\n get: function (name) {\n try {\n const nameEQ = name + '='\n const ca = document.cookie.split(';').filter((x) => x.length)\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i]\n while (c.charAt(0) == ' ') {\n c = c.substring(1, c.length)\n }\n if (c.indexOf(nameEQ) === 0) {\n return decodeURIComponent(c.substring(nameEQ.length, c.length))\n }\n }\n } catch (err) {}\n return null\n },\n\n parse: function (name) {\n let cookie\n try {\n cookie = JSON.parse(cookieStore.get(name)) || {}\n } catch (err) {\n // noop\n }\n return cookie\n },\n\n set: function (name, value, days, cross_subdomain, is_secure) {\n try {\n let expires = '',\n secure = ''\n\n const cdomain = chooseCookieDomain(document.location.hostname, cross_subdomain)\n\n if (days) {\n const date = new Date()\n date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000)\n expires = '; expires=' + date.toUTCString()\n }\n\n if (is_secure) {\n secure = '; secure'\n }\n\n const new_cookie_val =\n name +\n '=' +\n encodeURIComponent(JSON.stringify(value)) +\n expires +\n '; SameSite=Lax; path=/' +\n cdomain +\n secure\n document.cookie = new_cookie_val\n return new_cookie_val\n } catch (err) {\n return\n }\n },\n\n remove: function (name, cross_subdomain) {\n try {\n cookieStore.set(name, '', -1, cross_subdomain)\n } catch (err) {\n return\n }\n },\n}\n\nlet _localStorage_supported: boolean | null = null\n\nexport const localStore: PersistentStore = {\n is_supported: function () {\n if (!_isNull(_localStorage_supported)) {\n return _localStorage_supported\n }\n\n let supported = true\n if (!_isUndefined(window)) {\n try {\n const key = '__mplssupport__',\n val = 'xyz'\n localStore.set(key, val)\n if (localStore.get(key) !== '\"xyz\"') {\n supported = false\n }\n localStore.remove(key)\n } catch (err) {\n supported = false\n }\n } else {\n supported = false\n }\n if (!supported) {\n logger.error('localStorage unsupported; falling back to cookie store')\n }\n\n _localStorage_supported = supported\n return supported\n },\n\n error: function (msg) {\n logger.error('localStorage error: ' + msg)\n },\n\n get: function (name) {\n try {\n return window.localStorage.getItem(name)\n } catch (err) {\n localStore.error(err)\n }\n return null\n },\n\n parse: function (name) {\n try {\n return JSON.parse(localStore.get(name)) || {}\n } catch (err) {\n // noop\n }\n return null\n },\n\n set: function (name, value) {\n try {\n window.localStorage.setItem(name, JSON.stringify(value))\n } catch (err) {\n localStore.error(err)\n }\n },\n\n remove: function (name) {\n try {\n window.localStorage.removeItem(name)\n } catch (err) {\n localStore.error(err)\n }\n },\n}\n\n// Use localstorage for most data but still use cookie for COOKIE_PERSISTED_PROPERTIES\n// This solves issues with cookies having too much data in them causing headers too large\n// Also makes sure we don't have to send a ton of data to the server\nconst COOKIE_PERSISTED_PROPERTIES = [DISTINCT_ID, SESSION_ID, SESSION_RECORDING_IS_SAMPLED]\n\nexport const localPlusCookieStore: PersistentStore = {\n ...localStore,\n parse: function (name) {\n try {\n let extend: Properties = {}\n try {\n // See if there's a cookie stored with data.\n extend = cookieStore.parse(name) || {}\n } catch (err) {}\n const value = _extend(extend, JSON.parse(localStore.get(name) || '{}'))\n localStore.set(name, value)\n return value\n } catch (err) {\n // noop\n }\n return null\n },\n\n set: function (name, value, days, cross_subdomain, is_secure) {\n try {\n localStore.set(name, value)\n const cookiePersistedProperties: Record<string, any> = {}\n COOKIE_PERSISTED_PROPERTIES.forEach((key) => {\n if (value[key]) {\n cookiePersistedProperties[key] = value[key]\n }\n })\n\n if (Object.keys(cookiePersistedProperties).length) {\n cookieStore.set(name, cookiePersistedProperties, days, cross_subdomain, is_secure)\n }\n } catch (err) {\n localStore.error(err)\n }\n },\n\n remove: function (name, cross_subdomain) {\n try {\n window.localStorage.removeItem(name)\n cookieStore.remove(name, cross_subdomain)\n } catch (err) {\n localStore.error(err)\n }\n },\n}\n\nconst memoryStorage: Properties = {}\n\n// Storage that only lasts the length of the pageview if we don't want to use cookies\nexport const memoryStore: PersistentStore = {\n is_supported: function () {\n return true\n },\n\n error: function (msg) {\n logger.error('memoryStorage error: ' + msg)\n },\n\n get: function (name) {\n return memoryStorage[name] || null\n },\n\n parse: function (name) {\n return memoryStorage[name] || null\n },\n\n set: function (name, value) {\n memoryStorage[name] = value\n },\n\n remove: function (name) {\n delete memoryStorage[name]\n },\n}\n\nlet sessionStorageSupported: boolean | null = null\nexport const resetSessionStorageSupported = () => {\n sessionStorageSupported = null\n}\n// Storage that only lasts the length of a tab/window. Survives page refreshes\nexport const sessionStore: PersistentStore = {\n is_supported: function () {\n if (!_isNull(sessionStorageSupported)) {\n return sessionStorageSupported\n }\n sessionStorageSupported = true\n if (!_isUndefined(window)) {\n try {\n const key = '__support__',\n val = 'xyz'\n sessionStore.set(key, val)\n if (sessionStore.get(key) !== '\"xyz\"') {\n sessionStorageSupported = false\n }\n sessionStore.remove(key)\n } catch (err) {\n sessionStorageSupported = false\n }\n } else {\n sessionStorageSupported = false\n }\n return sessionStorageSupported\n },\n\n error: function (msg) {\n logger.error('sessionStorage error: ', msg)\n },\n\n get: function (name) {\n try {\n return window.sessionStorage.getItem(name)\n } catch (err) {\n sessionStore.error(err)\n }\n return null\n },\n\n parse: function (name) {\n try {\n return JSON.parse(sessionStore.get(name)) || null\n } catch (err) {\n // noop\n }\n return null\n },\n\n set: function (name, value) {\n try {\n window.sessionStorage.setItem(name, JSON.stringify(value))\n } catch (err) {\n sessionStore.error(err)\n }\n },\n\n remove: function (name) {\n try {\n window.sessionStorage.removeItem(name)\n } catch (err) {\n sessionStore.error(err)\n }\n },\n}\n"]}
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/storage.ts"],"names":[],"mappings":"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","sourcesContent":["import { _extend } from './utils'\nimport { PersistentStore, Properties } from './types'\nimport { DISTINCT_ID, SESSION_ID, SESSION_RECORDING_IS_SAMPLED } from './constants'\n\nimport { _isNull, _isUndefined } from './utils/type-utils'\nimport { logger } from './utils/logger'\nimport { window, document } from './utils/globals'\nimport { uuidv7 } from './uuidv7'\n\nconst Y1970 = 'Thu, 01 Jan 1970 00:00:00 GMT'\n\n/**\n * Browsers don't offer a way to check if something is a public suffix\n * e.g. `.com.au`, `.io`, `.org.uk`\n *\n * But they do reject cookies set on public suffixes\n * Setting a cookie on `.co.uk` would mean it was sent for every `.co.uk` site visited\n *\n * So, we can use this to check if a domain is a public suffix\n * by trying to set a cookie on a subdomain of the provided hostname\n * until the browser accepts it\n *\n * inspired by https://github.com/AngusFu/browser-root-domain\n */\nexport function seekFirstNonPublicSubDomain(hostname: string, cookieJar = document): string {\n if (!cookieJar) {\n return ''\n }\n if (['localhost', '127.0.0.1'].includes(hostname)) return ''\n\n const list = hostname.split('.')\n let len = list.length\n const key = 'dmn_chk_' + uuidv7()\n const R = new RegExp('(^|;)\\\\s*' + key + '=1')\n\n while (len--) {\n const candidate = list.slice(len).join('.')\n const candidateCookieValue = key + '=1;domain=.' + candidate\n\n // try to set cookie\n cookieJar.cookie = candidateCookieValue\n\n if (R.test(cookieJar.cookie)) {\n // the cookie was accepted by the browser, remove the test cookie\n cookieJar.cookie = candidateCookieValue + ';expires=' + Y1970\n return candidate\n }\n }\n return ''\n}\n\nconst DOMAIN_MATCH_REGEX = /[a-z0-9][a-z0-9-]+\\.[a-z]{2,}$/i\nconst originalCookieDomainFn = (hostname: string): string => {\n const matches = hostname.match(DOMAIN_MATCH_REGEX)\n return matches ? matches[0] : ''\n}\n\nexport function chooseCookieDomain(hostname: string, cross_subdomain: boolean | undefined): string {\n if (cross_subdomain) {\n // NOTE: Could we use this for cross domain tracking?\n let matchedSubDomain = seekFirstNonPublicSubDomain(hostname)\n\n if (!matchedSubDomain) {\n const originalMatch = originalCookieDomainFn(hostname)\n if (originalMatch !== matchedSubDomain) {\n logger.info('Warning: cookie subdomain discovery mismatch', originalMatch, matchedSubDomain)\n }\n matchedSubDomain = originalMatch\n }\n\n return matchedSubDomain ? '; domain=.' + matchedSubDomain : ''\n }\n return ''\n}\n\n// Methods partially borrowed from quirksmode.org/js/cookies.html\nexport const cookieStore: PersistentStore = {\n is_supported: () => !!document,\n\n error: function (msg) {\n logger.error('cookieStore error: ' + msg)\n },\n\n get: function (name) {\n if (!document) {\n return\n }\n\n try {\n const nameEQ = name + '='\n const ca = document.cookie.split(';').filter((x) => x.length)\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i]\n while (c.charAt(0) == ' ') {\n c = c.substring(1, c.length)\n }\n if (c.indexOf(nameEQ) === 0) {\n return decodeURIComponent(c.substring(nameEQ.length, c.length))\n }\n }\n } catch (err) {}\n return null\n },\n\n parse: function (name) {\n let cookie\n try {\n cookie = JSON.parse(cookieStore.get(name)) || {}\n } catch (err) {\n // noop\n }\n return cookie\n },\n\n set: function (name, value, days, cross_subdomain, is_secure) {\n if (!document) {\n return\n }\n try {\n let expires = '',\n secure = ''\n\n const cdomain = chooseCookieDomain(document.location.hostname, cross_subdomain)\n\n if (days) {\n const date = new Date()\n date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000)\n expires = '; expires=' + date.toUTCString()\n }\n\n if (is_secure) {\n secure = '; secure'\n }\n\n const new_cookie_val =\n name +\n '=' +\n encodeURIComponent(JSON.stringify(value)) +\n expires +\n '; SameSite=Lax; path=/' +\n cdomain +\n secure\n document.cookie = new_cookie_val\n return new_cookie_val\n } catch (err) {\n return\n }\n },\n\n remove: function (name, cross_subdomain) {\n try {\n cookieStore.set(name, '', -1, cross_subdomain)\n } catch (err) {\n return\n }\n },\n}\n\nlet _localStorage_supported: boolean | null = null\n\nexport const localStore: PersistentStore = {\n is_supported: function () {\n if (!_isNull(_localStorage_supported)) {\n return _localStorage_supported\n }\n\n let supported = true\n if (!_isUndefined(window)) {\n try {\n const key = '__mplssupport__',\n val = 'xyz'\n localStore.set(key, val)\n if (localStore.get(key) !== '\"xyz\"') {\n supported = false\n }\n localStore.remove(key)\n } catch (err) {\n supported = false\n }\n } else {\n supported = false\n }\n if (!supported) {\n logger.error('localStorage unsupported; falling back to cookie store')\n }\n\n _localStorage_supported = supported\n return supported\n },\n\n error: function (msg) {\n logger.error('localStorage error: ' + msg)\n },\n\n get: function (name) {\n try {\n return window?.localStorage.getItem(name)\n } catch (err) {\n localStore.error(err)\n }\n return null\n },\n\n parse: function (name) {\n try {\n return JSON.parse(localStore.get(name)) || {}\n } catch (err) {\n // noop\n }\n return null\n },\n\n set: function (name, value) {\n try {\n window?.localStorage.setItem(name, JSON.stringify(value))\n } catch (err) {\n localStore.error(err)\n }\n },\n\n remove: function (name) {\n try {\n window?.localStorage.removeItem(name)\n } catch (err) {\n localStore.error(err)\n }\n },\n}\n\n// Use localstorage for most data but still use cookie for COOKIE_PERSISTED_PROPERTIES\n// This solves issues with cookies having too much data in them causing headers too large\n// Also makes sure we don't have to send a ton of data to the server\nconst COOKIE_PERSISTED_PROPERTIES = [DISTINCT_ID, SESSION_ID, SESSION_RECORDING_IS_SAMPLED]\n\nexport const localPlusCookieStore: PersistentStore = {\n ...localStore,\n parse: function (name) {\n try {\n let extend: Properties = {}\n try {\n // See if there's a cookie stored with data.\n extend = cookieStore.parse(name) || {}\n } catch (err) {}\n const value = _extend(extend, JSON.parse(localStore.get(name) || '{}'))\n localStore.set(name, value)\n return value\n } catch (err) {\n // noop\n }\n return null\n },\n\n set: function (name, value, days, cross_subdomain, is_secure) {\n try {\n localStore.set(name, value)\n const cookiePersistedProperties: Record<string, any> = {}\n COOKIE_PERSISTED_PROPERTIES.forEach((key) => {\n if (value[key]) {\n cookiePersistedProperties[key] = value[key]\n }\n })\n\n if (Object.keys(cookiePersistedProperties).length) {\n cookieStore.set(name, cookiePersistedProperties, days, cross_subdomain, is_secure)\n }\n } catch (err) {\n localStore.error(err)\n }\n },\n\n remove: function (name, cross_subdomain) {\n try {\n window?.localStorage.removeItem(name)\n cookieStore.remove(name, cross_subdomain)\n } catch (err) {\n localStore.error(err)\n }\n },\n}\n\nconst memoryStorage: Properties = {}\n\n// Storage that only lasts the length of the pageview if we don't want to use cookies\nexport const memoryStore: PersistentStore = {\n is_supported: function () {\n return true\n },\n\n error: function (msg) {\n logger.error('memoryStorage error: ' + msg)\n },\n\n get: function (name) {\n return memoryStorage[name] || null\n },\n\n parse: function (name) {\n return memoryStorage[name] || null\n },\n\n set: function (name, value) {\n memoryStorage[name] = value\n },\n\n remove: function (name) {\n delete memoryStorage[name]\n },\n}\n\nlet sessionStorageSupported: boolean | null = null\nexport const resetSessionStorageSupported = () => {\n sessionStorageSupported = null\n}\n// Storage that only lasts the length of a tab/window. Survives page refreshes\nexport const sessionStore: PersistentStore = {\n is_supported: function () {\n if (!_isNull(sessionStorageSupported)) {\n return sessionStorageSupported\n }\n sessionStorageSupported = true\n if (!_isUndefined(window)) {\n try {\n const key = '__support__',\n val = 'xyz'\n sessionStore.set(key, val)\n if (sessionStore.get(key) !== '\"xyz\"') {\n sessionStorageSupported = false\n }\n sessionStore.remove(key)\n } catch (err) {\n sessionStorageSupported = false\n }\n } else {\n sessionStorageSupported = false\n }\n return sessionStorageSupported\n },\n\n error: function (msg) {\n logger.error('sessionStorage error: ', msg)\n },\n\n get: function (name) {\n try {\n return window?.sessionStorage.getItem(name)\n } catch (err) {\n sessionStore.error(err)\n }\n return null\n },\n\n parse: function (name) {\n try {\n return JSON.parse(sessionStore.get(name)) || null\n } catch (err) {\n // noop\n }\n return null\n },\n\n set: function (name, value) {\n try {\n window?.sessionStorage.setItem(name, JSON.stringify(value))\n } catch (err) {\n sessionStore.error(err)\n }\n },\n\n remove: function (name) {\n try {\n window?.sessionStorage.removeItem(name)\n } catch (err) {\n sessionStore.error(err)\n }\n },\n}\n"]}
@@ -2,7 +2,7 @@ import { _getQueryParam } from './request-utils';
2
2
  import { _isNull, _isUndefined } from './type-utils';
3
3
  import Config from '../config';
4
4
  import { _each, _extend, _includes, _strip_empty_properties, _timestamp } from './index';
5
- import { document, userAgent } from './globals';
5
+ import { document, window, userAgent, assignableWindow } from './globals';
6
6
  /**
7
7
  * Safari detection turns out to be complicted. For e.g. https://stackoverflow.com/a/29696509
8
8
  * We can be slightly loose because some options have been ruled out (e.g. firefox on iOS)
@@ -25,7 +25,7 @@ export var _info = {
25
25
  ].concat(customParams || []);
26
26
  var params = {};
27
27
  _each(campaign_keywords, function (kwkey) {
28
- var kw = _getQueryParam(document.URL, kwkey);
28
+ var kw = document ? _getQueryParam(document.URL, kwkey) : '';
29
29
  if (kw.length) {
30
30
  params[kwkey] = kw;
31
31
  }
@@ -33,7 +33,7 @@ export var _info = {
33
33
  return params;
34
34
  },
35
35
  searchEngine: function () {
36
- var referrer = document.referrer;
36
+ var referrer = document === null || document === void 0 ? void 0 : document.referrer;
37
37
  if (!referrer) {
38
38
  return null;
39
39
  }
@@ -57,7 +57,7 @@ export var _info = {
57
57
  var search = _info.searchEngine(), param = search != 'yahoo' ? 'q' : 'p', ret = {};
58
58
  if (!_isNull(search)) {
59
59
  ret['$search_engine'] = search;
60
- var keyword = _getQueryParam(document.referrer, param);
60
+ var keyword = document ? _getQueryParam(document.referrer, param) : '';
61
61
  if (keyword.length) {
62
62
  ret['ph_keyword'] = keyword;
63
63
  }
@@ -265,10 +265,10 @@ export var _info = {
265
265
  }
266
266
  },
267
267
  referrer: function () {
268
- return document.referrer || '$direct';
268
+ return (document === null || document === void 0 ? void 0 : document.referrer) || '$direct';
269
269
  },
270
270
  referringDomain: function () {
271
- if (!document.referrer) {
271
+ if (!(document === null || document === void 0 ? void 0 : document.referrer)) {
272
272
  return '$direct';
273
273
  }
274
274
  var parser = document.createElement('a'); // Unfortunately we cannot use new URL due to IE11
@@ -276,11 +276,14 @@ export var _info = {
276
276
  return parser.host;
277
277
  },
278
278
  properties: function () {
279
+ if (!userAgent) {
280
+ return {};
281
+ }
279
282
  var _a = _info.os(userAgent), os_name = _a.os_name, os_version = _a.os_version;
280
283
  return _extend(_strip_empty_properties({
281
284
  $os: os_name,
282
285
  $os_version: os_version,
283
- $browser: _info.browser(userAgent, navigator.vendor, window.opera),
286
+ $browser: _info.browser(userAgent, navigator.vendor, assignableWindow.opera),
284
287
  $device: _info.device(userAgent),
285
288
  $device_type: _info.deviceType(userAgent),
286
289
  }), {
@@ -288,7 +291,7 @@ export var _info = {
288
291
  $host: window === null || window === void 0 ? void 0 : window.location.host,
289
292
  $pathname: window === null || window === void 0 ? void 0 : window.location.pathname,
290
293
  $raw_user_agent: userAgent.length > 1000 ? userAgent.substring(0, 997) + '...' : userAgent,
291
- $browser_version: _info.browserVersion(userAgent, navigator.vendor, window.opera),
294
+ $browser_version: _info.browserVersion(userAgent, navigator.vendor, assignableWindow.opera),
292
295
  $browser_language: _info.browserLanguage(),
293
296
  $screen_height: window === null || window === void 0 ? void 0 : window.screen.height,
294
297
  $screen_width: window === null || window === void 0 ? void 0 : window.screen.width,
@@ -301,13 +304,16 @@ export var _info = {
301
304
  });
302
305
  },
303
306
  people_properties: function () {
307
+ if (!userAgent) {
308
+ return {};
309
+ }
304
310
  var _a = _info.os(userAgent), os_name = _a.os_name, os_version = _a.os_version;
305
311
  return _extend(_strip_empty_properties({
306
312
  $os: os_name,
307
313
  $os_version: os_version,
308
- $browser: _info.browser(userAgent, navigator.vendor, window.opera),
314
+ $browser: _info.browser(userAgent, navigator.vendor, assignableWindow.opera),
309
315
  }), {
310
- $browser_version: _info.browserVersion(userAgent, navigator.vendor, window.opera),
316
+ $browser_version: _info.browserVersion(userAgent, navigator.vendor, assignableWindow.opera),
311
317
  });
312
318
  },
313
319
  };