posthog-js 1.83.0 → 1.83.2

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 (52) hide show
  1. package/dist/array.full.js +2 -2
  2. package/dist/array.full.js.map +1 -1
  3. package/dist/array.js +2 -2
  4. package/dist/array.js.map +1 -1
  5. package/dist/es.js +2 -2
  6. package/dist/es.js.map +1 -1
  7. package/dist/module.d.ts +4 -2
  8. package/dist/module.js +2 -2
  9. package/dist/module.js.map +1 -1
  10. package/dist/surveys.js +1 -1
  11. package/dist/surveys.js.map +1 -1
  12. package/lib/package.json +1 -1
  13. package/lib/src/autocapture-utils.js +2 -2
  14. package/lib/src/autocapture-utils.js.map +1 -1
  15. package/lib/src/autocapture.js +1 -1
  16. package/lib/src/autocapture.js.map +1 -1
  17. package/lib/src/decide.js +6 -6
  18. package/lib/src/decide.js.map +1 -1
  19. package/lib/src/extensions/exceptions/exception-autocapture.js +3 -5
  20. package/lib/src/extensions/exceptions/exception-autocapture.js.map +1 -1
  21. package/lib/src/extensions/segment-integration.d.ts +0 -18
  22. package/lib/src/extensions/segment-integration.js +20 -1
  23. package/lib/src/extensions/segment-integration.js.map +1 -1
  24. package/lib/src/extensions/sessionrecording.d.ts +4 -2
  25. package/lib/src/extensions/sessionrecording.js +23 -9
  26. package/lib/src/extensions/sessionrecording.js.map +1 -1
  27. package/lib/src/extensions/surveys.js +3 -2
  28. package/lib/src/extensions/surveys.js.map +1 -1
  29. package/lib/src/extensions/web-performance.js +3 -3
  30. package/lib/src/extensions/web-performance.js.map +1 -1
  31. package/lib/src/gdpr-utils.d.ts +1 -11
  32. package/lib/src/gdpr-utils.js +4 -34
  33. package/lib/src/gdpr-utils.js.map +1 -1
  34. package/lib/src/posthog-core.js +17 -19
  35. package/lib/src/posthog-core.js.map +1 -1
  36. package/lib/src/posthog-featureflags.js +3 -3
  37. package/lib/src/posthog-featureflags.js.map +1 -1
  38. package/lib/src/rate-limiter.js +1 -1
  39. package/lib/src/rate-limiter.js.map +1 -1
  40. package/lib/src/retry-queue.js +4 -8
  41. package/lib/src/retry-queue.js.map +1 -1
  42. package/lib/src/sessionid.js +4 -3
  43. package/lib/src/sessionid.js.map +1 -1
  44. package/lib/src/storage.js +2 -5
  45. package/lib/src/storage.js.map +1 -1
  46. package/lib/src/utils.d.ts +7 -8
  47. package/lib/src/utils.js +33 -57
  48. package/lib/src/utils.js.map +1 -1
  49. package/package.json +1 -1
  50. package/react/dist/esm/index.js +3 -3
  51. package/react/dist/types/context/PostHogProvider.d.ts.map +1 -1
  52. package/react/dist/umd/index.js +3 -3
@@ -128,7 +128,7 @@ var PostHogFeatureFlags = /** @class */ (function () {
128
128
  }
129
129
  }
130
130
  if (!this._override_warning) {
131
- console.warn('[PostHog] Overriding feature flags!', {
131
+ logger.warn(' Overriding feature flags!', {
132
132
  enabledFlags: enabledFlags,
133
133
  overriddenFlags: overriddenFlags,
134
134
  finalFlags: finalFlags,
@@ -217,7 +217,7 @@ var PostHogFeatureFlags = /** @class */ (function () {
217
217
  var _b;
218
218
  if (options === void 0) { options = {}; }
219
219
  if (!this.instance.decideEndpointWasHit && !(this.getFlags() && this.getFlags().length > 0)) {
220
- console.warn('getFeatureFlag for key "' + key + '" failed. Feature flags didn\'t load in time.');
220
+ logger.warn('getFeatureFlag for key "' + key + '" failed. Feature flags didn\'t load in time.');
221
221
  return undefined;
222
222
  }
223
223
  var flagValue = this.getFlagVariants()[key];
@@ -254,7 +254,7 @@ var PostHogFeatureFlags = /** @class */ (function () {
254
254
  PostHogFeatureFlags.prototype.isFeatureEnabled = function (key, options) {
255
255
  if (options === void 0) { options = {}; }
256
256
  if (!this.instance.decideEndpointWasHit && !(this.getFlags() && this.getFlags().length > 0)) {
257
- console.warn('isFeatureEnabled for key "' + key + '" failed. Feature flags didn\'t load in time.');
257
+ logger.warn('isFeatureEnabled for key "' + key + '" failed. Feature flags didn\'t load in time.');
258
258
  return undefined;
259
259
  }
260
260
  return !!this.getFeatureFlag(key, options);
@@ -1 +1 @@
1
- {"version":3,"file":"posthog-featureflags.js","sourceRoot":"","sources":["../../src/posthog-featureflags.ts"],"names":[],"mappings":"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","sourcesContent":["import { _base64Encode, _entries, _extend, logger } from './utils'\nimport { PostHog } from './posthog-core'\nimport {\n DecideResponse,\n FeatureFlagsCallback,\n EarlyAccessFeatureCallback,\n EarlyAccessFeatureResponse,\n Properties,\n JsonType,\n RequestCallback,\n} from './types'\nimport { PostHogPersistence } from './posthog-persistence'\n\nimport {\n PERSISTENCE_EARLY_ACCESS_FEATURES,\n ENABLED_FEATURE_FLAGS,\n STORED_GROUP_PROPERTIES_KEY,\n STORED_PERSON_PROPERTIES_KEY,\n FLAG_CALL_REPORTED,\n} from './constants'\n\nconst PERSISTENCE_ACTIVE_FEATURE_FLAGS = '$active_feature_flags'\nconst PERSISTENCE_OVERRIDE_FEATURE_FLAGS = '$override_feature_flags'\nconst PERSISTENCE_FEATURE_FLAG_PAYLOADS = '$feature_flag_payloads'\n\nexport const filterActiveFeatureFlags = (featureFlags?: Record<string, string | boolean>) => {\n const activeFeatureFlags: Record<string, string | boolean> = {}\n for (const [key, value] of _entries(featureFlags || {})) {\n if (value) {\n activeFeatureFlags[key] = value\n }\n }\n return activeFeatureFlags\n}\n\nexport const parseFeatureFlagDecideResponse = (\n response: Partial<DecideResponse>,\n persistence: PostHogPersistence,\n currentFlags: Record<string, string | boolean> = {},\n currentFlagPayloads: Record<string, JsonType> = {}\n) => {\n const flags = response['featureFlags']\n const flagPayloads = response['featureFlagPayloads']\n if (flags) {\n // using the v1 api\n if (Array.isArray(flags)) {\n const $enabled_feature_flags: Record<string, boolean> = {}\n if (flags) {\n for (let i = 0; i < flags.length; i++) {\n $enabled_feature_flags[flags[i]] = true\n }\n }\n persistence &&\n persistence.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: flags,\n [ENABLED_FEATURE_FLAGS]: $enabled_feature_flags,\n })\n } else {\n // using the v2+ api\n let newFeatureFlags = flags\n let newFeatureFlagPayloads = flagPayloads\n if (response.errorsWhileComputingFlags) {\n // if not all flags were computed, we upsert flags instead of replacing them\n newFeatureFlags = { ...currentFlags, ...newFeatureFlags }\n newFeatureFlagPayloads = { ...currentFlagPayloads, ...newFeatureFlagPayloads }\n }\n persistence &&\n persistence.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: Object.keys(filterActiveFeatureFlags(newFeatureFlags)),\n [ENABLED_FEATURE_FLAGS]: newFeatureFlags || {},\n [PERSISTENCE_FEATURE_FLAG_PAYLOADS]: newFeatureFlagPayloads || {},\n })\n }\n }\n}\n\nexport class PostHogFeatureFlags {\n instance: PostHog\n _override_warning: boolean\n featureFlagEventHandlers: FeatureFlagsCallback[]\n reloadFeatureFlagsQueued: boolean\n reloadFeatureFlagsInAction: boolean\n $anon_distinct_id: string | undefined\n\n constructor(instance: PostHog) {\n this.instance = instance\n this._override_warning = false\n this.featureFlagEventHandlers = []\n\n this.reloadFeatureFlagsQueued = false\n this.reloadFeatureFlagsInAction = false\n }\n\n getFlags(): string[] {\n return Object.keys(this.getFlagVariants())\n }\n\n getFlagVariants(): Record<string, string | boolean> {\n const enabledFlags = this.instance.get_property(ENABLED_FEATURE_FLAGS)\n const overriddenFlags = this.instance.get_property(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n if (!overriddenFlags) {\n return enabledFlags || {}\n }\n\n const finalFlags = _extend({}, enabledFlags)\n const overriddenKeys = Object.keys(overriddenFlags)\n for (let i = 0; i < overriddenKeys.length; i++) {\n if (overriddenFlags[overriddenKeys[i]] === false) {\n delete finalFlags[overriddenKeys[i]]\n } else {\n finalFlags[overriddenKeys[i]] = overriddenFlags[overriddenKeys[i]]\n }\n }\n if (!this._override_warning) {\n console.warn('[PostHog] Overriding feature flags!', {\n enabledFlags,\n overriddenFlags,\n finalFlags,\n })\n this._override_warning = true\n }\n return finalFlags\n }\n\n getFlagPayloads(): Record<string, JsonType> {\n const flagPayloads = this.instance.get_property(PERSISTENCE_FEATURE_FLAG_PAYLOADS)\n return flagPayloads || {}\n }\n\n /**\n * Reloads feature flags asynchronously.\n *\n * Constraints:\n *\n * 1. Avoid parallel requests\n * 2. Delay a few milliseconds after each reloadFeatureFlags call to batch subsequent changes together\n * 3. Don't call this during initial load (as /decide will be called instead), see posthog-core.js\n */\n reloadFeatureFlags(): void {\n if (!this.reloadFeatureFlagsQueued) {\n this.reloadFeatureFlagsQueued = true\n this._startReloadTimer()\n }\n }\n\n setAnonymousDistinctId(anon_distinct_id: string): void {\n this.$anon_distinct_id = anon_distinct_id\n }\n\n setReloadingPaused(isPaused: boolean): void {\n this.reloadFeatureFlagsInAction = isPaused\n }\n\n resetRequestQueue(): void {\n this.reloadFeatureFlagsQueued = false\n }\n\n _startReloadTimer(): void {\n if (this.reloadFeatureFlagsQueued && !this.reloadFeatureFlagsInAction) {\n setTimeout(() => {\n if (!this.reloadFeatureFlagsInAction && this.reloadFeatureFlagsQueued) {\n this.reloadFeatureFlagsQueued = false\n this._reloadFeatureFlagsRequest()\n }\n }, 5)\n }\n }\n\n _reloadFeatureFlagsRequest(): void {\n this.setReloadingPaused(true)\n const token = this.instance.config.token\n const personProperties = this.instance.get_property(STORED_PERSON_PROPERTIES_KEY)\n const groupProperties = this.instance.get_property(STORED_GROUP_PROPERTIES_KEY)\n const json_data = JSON.stringify({\n token: token,\n distinct_id: this.instance.get_distinct_id(),\n groups: this.instance.getGroups(),\n $anon_distinct_id: this.$anon_distinct_id,\n person_properties: personProperties,\n group_properties: groupProperties,\n disable_flags: this.instance.config.advanced_disable_feature_flags || undefined,\n })\n\n const encoded_data = _base64Encode(json_data)\n this.instance._send_request(\n this.instance.config.api_host + '/decide/?v=3',\n { data: encoded_data },\n { method: 'POST' },\n this.instance._prepare_callback((response) => {\n // reset anon_distinct_id after at least a single request with it\n // makes it through\n this.$anon_distinct_id = undefined\n this.receivedFeatureFlags(response as DecideResponse)\n\n // :TRICKY: Reload - start another request if queued!\n this.setReloadingPaused(false)\n this._startReloadTimer()\n }) as RequestCallback\n )\n }\n\n /*\n * Get feature flag's value for user.\n *\n * ### Usage:\n *\n * if(posthog.getFeatureFlag('my-flag') === 'some-variant') { // do something }\n *\n * @param {Object|String} key Key of the feature flag.\n * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n */\n getFeatureFlag(key: string, options: { send_event?: boolean } = {}): boolean | string | undefined {\n if (!this.instance.decideEndpointWasHit && !(this.getFlags() && this.getFlags().length > 0)) {\n console.warn('getFeatureFlag for key \"' + key + '\" failed. Feature flags didn\\'t load in time.')\n return undefined\n }\n const flagValue = this.getFlagVariants()[key]\n const flagReportValue = `${flagValue}`\n const flagCallReported: Record<string, string[]> = this.instance.get_property(FLAG_CALL_REPORTED) || {}\n\n if (options.send_event || !('send_event' in options)) {\n if (!(key in flagCallReported) || !flagCallReported[key].includes(flagReportValue)) {\n if (Array.isArray(flagCallReported[key])) {\n flagCallReported[key].push(flagReportValue)\n } else {\n flagCallReported[key] = [flagReportValue]\n }\n this.instance.persistence?.register({ [FLAG_CALL_REPORTED]: flagCallReported })\n\n this.instance.capture('$feature_flag_called', { $feature_flag: key, $feature_flag_response: flagValue })\n }\n }\n return flagValue\n }\n\n getFeatureFlagPayload(key: string): JsonType {\n const payloads = this.getFlagPayloads()\n return payloads[key]\n }\n\n /*\n * See if feature flag is enabled for user.\n *\n * ### Usage:\n *\n * if(posthog.isFeatureEnabled('beta-feature')) { // do something }\n *\n * @param {Object|String} key Key of the feature flag.\n * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n */\n isFeatureEnabled(key: string, options: { send_event?: boolean } = {}): boolean | undefined {\n if (!this.instance.decideEndpointWasHit && !(this.getFlags() && this.getFlags().length > 0)) {\n console.warn('isFeatureEnabled for key \"' + key + '\" failed. Feature flags didn\\'t load in time.')\n return undefined\n }\n return !!this.getFeatureFlag(key, options)\n }\n\n addFeatureFlagsHandler(handler: FeatureFlagsCallback): void {\n this.featureFlagEventHandlers.push(handler)\n }\n\n removeFeatureFlagsHandler(handler: FeatureFlagsCallback): void {\n this.featureFlagEventHandlers = this.featureFlagEventHandlers.filter((h) => h !== handler)\n }\n\n receivedFeatureFlags(response: Partial<DecideResponse>): void {\n if (!this.instance.persistence) {\n return\n }\n this.instance.decideEndpointWasHit = true\n const currentFlags = this.getFlagVariants()\n const currentFlagPayloads = this.getFlagPayloads()\n parseFeatureFlagDecideResponse(response, this.instance.persistence, currentFlags, currentFlagPayloads)\n this._fireFeatureFlagsCallbacks()\n }\n\n /*\n * Override feature flags for debugging.\n *\n * ### Usage:\n *\n * - posthog.feature_flags.override(false)\n * - posthog.feature_flags.override(['beta-feature'])\n * - posthog.feature_flags.override({'beta-feature': 'variant', 'other-feature': True})\n *\n * @param {Object|Array|String} flags Flags to override with.\n */\n override(flags: boolean | string[] | Record<string, string | boolean>): void {\n if (!this.instance.__loaded || !this.instance.persistence) {\n return logger.unintializedWarning('posthog.feature_flags.override')\n }\n\n this._override_warning = false\n\n if (flags === false) {\n this.instance.persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n } else if (Array.isArray(flags)) {\n const flagsObj: Record<string, string | boolean> = {}\n for (let i = 0; i < flags.length; i++) {\n flagsObj[flags[i]] = true\n }\n this.instance.persistence.register({ [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: flagsObj })\n } else {\n this.instance.persistence.register({ [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: flags })\n }\n }\n /*\n * Register an event listener that runs when feature flags become available or when they change.\n * If there are flags, the listener is called immediately in addition to being called on future changes.\n *\n * ### Usage:\n *\n * posthog.onFeatureFlags(function(featureFlags) { // do something })\n *\n * @param {Function} [callback] The callback function will be called once the feature flags are ready or when they are updated.\n * It'll return a list of feature flags enabled for the user.\n * @returns {Function} A function that can be called to unsubscribe the listener. Used by useEffect when the component unmounts.\n */\n onFeatureFlags(callback: FeatureFlagsCallback): () => void {\n this.addFeatureFlagsHandler(callback)\n if (this.instance.decideEndpointWasHit) {\n const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n callback(flags, flagVariants)\n }\n return () => this.removeFeatureFlagsHandler(callback)\n }\n\n updateEarlyAccessFeatureEnrollment(key: string, isEnrolled: boolean): void {\n const enrollmentPersonProp = {\n [`$feature_enrollment/${key}`]: isEnrolled,\n }\n this.instance.capture('$feature_enrollment_update', {\n $feature_flag: key,\n $feature_enrollment: isEnrolled,\n $set: enrollmentPersonProp,\n })\n this.setPersonPropertiesForFlags(enrollmentPersonProp, false)\n\n const newFlags = { ...this.getFlagVariants(), [key]: isEnrolled }\n this.instance.persistence?.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: Object.keys(filterActiveFeatureFlags(newFlags)),\n [ENABLED_FEATURE_FLAGS]: newFlags,\n })\n this._fireFeatureFlagsCallbacks()\n }\n\n getEarlyAccessFeatures(callback: EarlyAccessFeatureCallback, force_reload = false): void {\n const existing_early_access_features = this.instance.get_property(PERSISTENCE_EARLY_ACCESS_FEATURES)\n\n if (!existing_early_access_features || force_reload) {\n this.instance._send_request(\n `${this.instance.config.api_host}/api/early_access_features/?token=${this.instance.config.token}`,\n {},\n { method: 'GET' },\n (response) => {\n const earlyAccessFeatures = (response as EarlyAccessFeatureResponse).earlyAccessFeatures\n this.instance.persistence?.register({ [PERSISTENCE_EARLY_ACCESS_FEATURES]: earlyAccessFeatures })\n return callback(earlyAccessFeatures)\n }\n )\n } else {\n return callback(existing_early_access_features)\n }\n }\n\n _prepareFeatureFlagsForCallbacks(): { flags: string[]; flagVariants: Record<string, string | boolean> } {\n const flags = this.getFlags()\n const flagVariants = this.getFlagVariants()\n\n // Return truthy\n const truthyFlags = flags.filter((flag) => flagVariants[flag])\n const truthyFlagVariants = Object.keys(flagVariants)\n .filter((variantKey) => flagVariants[variantKey])\n .reduce((res: Record<string, string | boolean>, key) => {\n res[key] = flagVariants[key]\n return res\n }, {})\n\n return {\n flags: truthyFlags,\n flagVariants: truthyFlagVariants,\n }\n }\n\n _fireFeatureFlagsCallbacks(): void {\n const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n this.featureFlagEventHandlers.forEach((handler) => handler(flags, flagVariants))\n }\n\n /**\n * Set override person properties for feature flags.\n * This is used when dealing with new persons / where you don't want to wait for ingestion\n * to update user properties.\n */\n setPersonPropertiesForFlags(properties: Properties, reloadFeatureFlags = true): void {\n // Get persisted person properties\n const existingProperties = this.instance.get_property(STORED_PERSON_PROPERTIES_KEY) || {}\n\n this.instance.register({\n [STORED_PERSON_PROPERTIES_KEY]: {\n ...existingProperties,\n ...properties,\n },\n })\n\n if (reloadFeatureFlags) {\n this.instance.reloadFeatureFlags()\n }\n }\n\n resetPersonPropertiesForFlags(): void {\n this.instance.unregister(STORED_PERSON_PROPERTIES_KEY)\n }\n\n /**\n * Set override group properties for feature flags.\n * This is used when dealing with new groups / where you don't want to wait for ingestion\n * to update properties.\n * Takes in an object, the key of which is the group type.\n * For example:\n * setGroupPropertiesForFlags({'organization': { name: 'CYZ', employees: '11' } })\n */\n setGroupPropertiesForFlags(properties: { [type: string]: Properties }, reloadFeatureFlags = true): void {\n // Get persisted group properties\n const existingProperties = this.instance.get_property(STORED_GROUP_PROPERTIES_KEY) || {}\n\n if (Object.keys(existingProperties).length !== 0) {\n Object.keys(existingProperties).forEach((groupType) => {\n existingProperties[groupType] = {\n ...existingProperties[groupType],\n ...properties[groupType],\n }\n delete properties[groupType]\n })\n }\n\n this.instance.register({\n [STORED_GROUP_PROPERTIES_KEY]: {\n ...existingProperties,\n ...properties,\n },\n })\n\n if (reloadFeatureFlags) {\n this.instance.reloadFeatureFlags()\n }\n }\n\n resetGroupPropertiesForFlags(group_type?: string): void {\n if (group_type) {\n const existingProperties = this.instance.get_property(STORED_GROUP_PROPERTIES_KEY) || {}\n this.instance.register({\n [STORED_GROUP_PROPERTIES_KEY]: { ...existingProperties, [group_type]: {} },\n })\n } else {\n this.instance.unregister(STORED_GROUP_PROPERTIES_KEY)\n }\n }\n}\n"]}
1
+ {"version":3,"file":"posthog-featureflags.js","sourceRoot":"","sources":["../../src/posthog-featureflags.ts"],"names":[],"mappings":"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","sourcesContent":["import { _base64Encode, _entries, _extend, logger } from './utils'\nimport { PostHog } from './posthog-core'\nimport {\n DecideResponse,\n FeatureFlagsCallback,\n EarlyAccessFeatureCallback,\n EarlyAccessFeatureResponse,\n Properties,\n JsonType,\n RequestCallback,\n} from './types'\nimport { PostHogPersistence } from './posthog-persistence'\n\nimport {\n PERSISTENCE_EARLY_ACCESS_FEATURES,\n ENABLED_FEATURE_FLAGS,\n STORED_GROUP_PROPERTIES_KEY,\n STORED_PERSON_PROPERTIES_KEY,\n FLAG_CALL_REPORTED,\n} from './constants'\n\nconst PERSISTENCE_ACTIVE_FEATURE_FLAGS = '$active_feature_flags'\nconst PERSISTENCE_OVERRIDE_FEATURE_FLAGS = '$override_feature_flags'\nconst PERSISTENCE_FEATURE_FLAG_PAYLOADS = '$feature_flag_payloads'\n\nexport const filterActiveFeatureFlags = (featureFlags?: Record<string, string | boolean>) => {\n const activeFeatureFlags: Record<string, string | boolean> = {}\n for (const [key, value] of _entries(featureFlags || {})) {\n if (value) {\n activeFeatureFlags[key] = value\n }\n }\n return activeFeatureFlags\n}\n\nexport const parseFeatureFlagDecideResponse = (\n response: Partial<DecideResponse>,\n persistence: PostHogPersistence,\n currentFlags: Record<string, string | boolean> = {},\n currentFlagPayloads: Record<string, JsonType> = {}\n) => {\n const flags = response['featureFlags']\n const flagPayloads = response['featureFlagPayloads']\n if (flags) {\n // using the v1 api\n if (Array.isArray(flags)) {\n const $enabled_feature_flags: Record<string, boolean> = {}\n if (flags) {\n for (let i = 0; i < flags.length; i++) {\n $enabled_feature_flags[flags[i]] = true\n }\n }\n persistence &&\n persistence.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: flags,\n [ENABLED_FEATURE_FLAGS]: $enabled_feature_flags,\n })\n } else {\n // using the v2+ api\n let newFeatureFlags = flags\n let newFeatureFlagPayloads = flagPayloads\n if (response.errorsWhileComputingFlags) {\n // if not all flags were computed, we upsert flags instead of replacing them\n newFeatureFlags = { ...currentFlags, ...newFeatureFlags }\n newFeatureFlagPayloads = { ...currentFlagPayloads, ...newFeatureFlagPayloads }\n }\n persistence &&\n persistence.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: Object.keys(filterActiveFeatureFlags(newFeatureFlags)),\n [ENABLED_FEATURE_FLAGS]: newFeatureFlags || {},\n [PERSISTENCE_FEATURE_FLAG_PAYLOADS]: newFeatureFlagPayloads || {},\n })\n }\n }\n}\n\nexport class PostHogFeatureFlags {\n instance: PostHog\n _override_warning: boolean\n featureFlagEventHandlers: FeatureFlagsCallback[]\n reloadFeatureFlagsQueued: boolean\n reloadFeatureFlagsInAction: boolean\n $anon_distinct_id: string | undefined\n\n constructor(instance: PostHog) {\n this.instance = instance\n this._override_warning = false\n this.featureFlagEventHandlers = []\n\n this.reloadFeatureFlagsQueued = false\n this.reloadFeatureFlagsInAction = false\n }\n\n getFlags(): string[] {\n return Object.keys(this.getFlagVariants())\n }\n\n getFlagVariants(): Record<string, string | boolean> {\n const enabledFlags = this.instance.get_property(ENABLED_FEATURE_FLAGS)\n const overriddenFlags = this.instance.get_property(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n if (!overriddenFlags) {\n return enabledFlags || {}\n }\n\n const finalFlags = _extend({}, enabledFlags)\n const overriddenKeys = Object.keys(overriddenFlags)\n for (let i = 0; i < overriddenKeys.length; i++) {\n if (overriddenFlags[overriddenKeys[i]] === false) {\n delete finalFlags[overriddenKeys[i]]\n } else {\n finalFlags[overriddenKeys[i]] = overriddenFlags[overriddenKeys[i]]\n }\n }\n if (!this._override_warning) {\n logger.warn(' Overriding feature flags!', {\n enabledFlags,\n overriddenFlags,\n finalFlags,\n })\n this._override_warning = true\n }\n return finalFlags\n }\n\n getFlagPayloads(): Record<string, JsonType> {\n const flagPayloads = this.instance.get_property(PERSISTENCE_FEATURE_FLAG_PAYLOADS)\n return flagPayloads || {}\n }\n\n /**\n * Reloads feature flags asynchronously.\n *\n * Constraints:\n *\n * 1. Avoid parallel requests\n * 2. Delay a few milliseconds after each reloadFeatureFlags call to batch subsequent changes together\n * 3. Don't call this during initial load (as /decide will be called instead), see posthog-core.js\n */\n reloadFeatureFlags(): void {\n if (!this.reloadFeatureFlagsQueued) {\n this.reloadFeatureFlagsQueued = true\n this._startReloadTimer()\n }\n }\n\n setAnonymousDistinctId(anon_distinct_id: string): void {\n this.$anon_distinct_id = anon_distinct_id\n }\n\n setReloadingPaused(isPaused: boolean): void {\n this.reloadFeatureFlagsInAction = isPaused\n }\n\n resetRequestQueue(): void {\n this.reloadFeatureFlagsQueued = false\n }\n\n _startReloadTimer(): void {\n if (this.reloadFeatureFlagsQueued && !this.reloadFeatureFlagsInAction) {\n setTimeout(() => {\n if (!this.reloadFeatureFlagsInAction && this.reloadFeatureFlagsQueued) {\n this.reloadFeatureFlagsQueued = false\n this._reloadFeatureFlagsRequest()\n }\n }, 5)\n }\n }\n\n _reloadFeatureFlagsRequest(): void {\n this.setReloadingPaused(true)\n const token = this.instance.config.token\n const personProperties = this.instance.get_property(STORED_PERSON_PROPERTIES_KEY)\n const groupProperties = this.instance.get_property(STORED_GROUP_PROPERTIES_KEY)\n const json_data = JSON.stringify({\n token: token,\n distinct_id: this.instance.get_distinct_id(),\n groups: this.instance.getGroups(),\n $anon_distinct_id: this.$anon_distinct_id,\n person_properties: personProperties,\n group_properties: groupProperties,\n disable_flags: this.instance.config.advanced_disable_feature_flags || undefined,\n })\n\n const encoded_data = _base64Encode(json_data)\n this.instance._send_request(\n this.instance.config.api_host + '/decide/?v=3',\n { data: encoded_data },\n { method: 'POST' },\n this.instance._prepare_callback((response) => {\n // reset anon_distinct_id after at least a single request with it\n // makes it through\n this.$anon_distinct_id = undefined\n this.receivedFeatureFlags(response as DecideResponse)\n\n // :TRICKY: Reload - start another request if queued!\n this.setReloadingPaused(false)\n this._startReloadTimer()\n }) as RequestCallback\n )\n }\n\n /*\n * Get feature flag's value for user.\n *\n * ### Usage:\n *\n * if(posthog.getFeatureFlag('my-flag') === 'some-variant') { // do something }\n *\n * @param {Object|String} key Key of the feature flag.\n * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n */\n getFeatureFlag(key: string, options: { send_event?: boolean } = {}): boolean | string | undefined {\n if (!this.instance.decideEndpointWasHit && !(this.getFlags() && this.getFlags().length > 0)) {\n logger.warn('getFeatureFlag for key \"' + key + '\" failed. Feature flags didn\\'t load in time.')\n return undefined\n }\n const flagValue = this.getFlagVariants()[key]\n const flagReportValue = `${flagValue}`\n const flagCallReported: Record<string, string[]> = this.instance.get_property(FLAG_CALL_REPORTED) || {}\n\n if (options.send_event || !('send_event' in options)) {\n if (!(key in flagCallReported) || !flagCallReported[key].includes(flagReportValue)) {\n if (Array.isArray(flagCallReported[key])) {\n flagCallReported[key].push(flagReportValue)\n } else {\n flagCallReported[key] = [flagReportValue]\n }\n this.instance.persistence?.register({ [FLAG_CALL_REPORTED]: flagCallReported })\n\n this.instance.capture('$feature_flag_called', { $feature_flag: key, $feature_flag_response: flagValue })\n }\n }\n return flagValue\n }\n\n getFeatureFlagPayload(key: string): JsonType {\n const payloads = this.getFlagPayloads()\n return payloads[key]\n }\n\n /*\n * See if feature flag is enabled for user.\n *\n * ### Usage:\n *\n * if(posthog.isFeatureEnabled('beta-feature')) { // do something }\n *\n * @param {Object|String} key Key of the feature flag.\n * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n */\n isFeatureEnabled(key: string, options: { send_event?: boolean } = {}): boolean | undefined {\n if (!this.instance.decideEndpointWasHit && !(this.getFlags() && this.getFlags().length > 0)) {\n logger.warn('isFeatureEnabled for key \"' + key + '\" failed. Feature flags didn\\'t load in time.')\n return undefined\n }\n return !!this.getFeatureFlag(key, options)\n }\n\n addFeatureFlagsHandler(handler: FeatureFlagsCallback): void {\n this.featureFlagEventHandlers.push(handler)\n }\n\n removeFeatureFlagsHandler(handler: FeatureFlagsCallback): void {\n this.featureFlagEventHandlers = this.featureFlagEventHandlers.filter((h) => h !== handler)\n }\n\n receivedFeatureFlags(response: Partial<DecideResponse>): void {\n if (!this.instance.persistence) {\n return\n }\n this.instance.decideEndpointWasHit = true\n const currentFlags = this.getFlagVariants()\n const currentFlagPayloads = this.getFlagPayloads()\n parseFeatureFlagDecideResponse(response, this.instance.persistence, currentFlags, currentFlagPayloads)\n this._fireFeatureFlagsCallbacks()\n }\n\n /*\n * Override feature flags for debugging.\n *\n * ### Usage:\n *\n * - posthog.feature_flags.override(false)\n * - posthog.feature_flags.override(['beta-feature'])\n * - posthog.feature_flags.override({'beta-feature': 'variant', 'other-feature': True})\n *\n * @param {Object|Array|String} flags Flags to override with.\n */\n override(flags: boolean | string[] | Record<string, string | boolean>): void {\n if (!this.instance.__loaded || !this.instance.persistence) {\n return logger.unintializedWarning('posthog.feature_flags.override')\n }\n\n this._override_warning = false\n\n if (flags === false) {\n this.instance.persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n } else if (Array.isArray(flags)) {\n const flagsObj: Record<string, string | boolean> = {}\n for (let i = 0; i < flags.length; i++) {\n flagsObj[flags[i]] = true\n }\n this.instance.persistence.register({ [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: flagsObj })\n } else {\n this.instance.persistence.register({ [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: flags })\n }\n }\n /*\n * Register an event listener that runs when feature flags become available or when they change.\n * If there are flags, the listener is called immediately in addition to being called on future changes.\n *\n * ### Usage:\n *\n * posthog.onFeatureFlags(function(featureFlags) { // do something })\n *\n * @param {Function} [callback] The callback function will be called once the feature flags are ready or when they are updated.\n * It'll return a list of feature flags enabled for the user.\n * @returns {Function} A function that can be called to unsubscribe the listener. Used by useEffect when the component unmounts.\n */\n onFeatureFlags(callback: FeatureFlagsCallback): () => void {\n this.addFeatureFlagsHandler(callback)\n if (this.instance.decideEndpointWasHit) {\n const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n callback(flags, flagVariants)\n }\n return () => this.removeFeatureFlagsHandler(callback)\n }\n\n updateEarlyAccessFeatureEnrollment(key: string, isEnrolled: boolean): void {\n const enrollmentPersonProp = {\n [`$feature_enrollment/${key}`]: isEnrolled,\n }\n this.instance.capture('$feature_enrollment_update', {\n $feature_flag: key,\n $feature_enrollment: isEnrolled,\n $set: enrollmentPersonProp,\n })\n this.setPersonPropertiesForFlags(enrollmentPersonProp, false)\n\n const newFlags = { ...this.getFlagVariants(), [key]: isEnrolled }\n this.instance.persistence?.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: Object.keys(filterActiveFeatureFlags(newFlags)),\n [ENABLED_FEATURE_FLAGS]: newFlags,\n })\n this._fireFeatureFlagsCallbacks()\n }\n\n getEarlyAccessFeatures(callback: EarlyAccessFeatureCallback, force_reload = false): void {\n const existing_early_access_features = this.instance.get_property(PERSISTENCE_EARLY_ACCESS_FEATURES)\n\n if (!existing_early_access_features || force_reload) {\n this.instance._send_request(\n `${this.instance.config.api_host}/api/early_access_features/?token=${this.instance.config.token}`,\n {},\n { method: 'GET' },\n (response) => {\n const earlyAccessFeatures = (response as EarlyAccessFeatureResponse).earlyAccessFeatures\n this.instance.persistence?.register({ [PERSISTENCE_EARLY_ACCESS_FEATURES]: earlyAccessFeatures })\n return callback(earlyAccessFeatures)\n }\n )\n } else {\n return callback(existing_early_access_features)\n }\n }\n\n _prepareFeatureFlagsForCallbacks(): { flags: string[]; flagVariants: Record<string, string | boolean> } {\n const flags = this.getFlags()\n const flagVariants = this.getFlagVariants()\n\n // Return truthy\n const truthyFlags = flags.filter((flag) => flagVariants[flag])\n const truthyFlagVariants = Object.keys(flagVariants)\n .filter((variantKey) => flagVariants[variantKey])\n .reduce((res: Record<string, string | boolean>, key) => {\n res[key] = flagVariants[key]\n return res\n }, {})\n\n return {\n flags: truthyFlags,\n flagVariants: truthyFlagVariants,\n }\n }\n\n _fireFeatureFlagsCallbacks(): void {\n const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n this.featureFlagEventHandlers.forEach((handler) => handler(flags, flagVariants))\n }\n\n /**\n * Set override person properties for feature flags.\n * This is used when dealing with new persons / where you don't want to wait for ingestion\n * to update user properties.\n */\n setPersonPropertiesForFlags(properties: Properties, reloadFeatureFlags = true): void {\n // Get persisted person properties\n const existingProperties = this.instance.get_property(STORED_PERSON_PROPERTIES_KEY) || {}\n\n this.instance.register({\n [STORED_PERSON_PROPERTIES_KEY]: {\n ...existingProperties,\n ...properties,\n },\n })\n\n if (reloadFeatureFlags) {\n this.instance.reloadFeatureFlags()\n }\n }\n\n resetPersonPropertiesForFlags(): void {\n this.instance.unregister(STORED_PERSON_PROPERTIES_KEY)\n }\n\n /**\n * Set override group properties for feature flags.\n * This is used when dealing with new groups / where you don't want to wait for ingestion\n * to update properties.\n * Takes in an object, the key of which is the group type.\n * For example:\n * setGroupPropertiesForFlags({'organization': { name: 'CYZ', employees: '11' } })\n */\n setGroupPropertiesForFlags(properties: { [type: string]: Properties }, reloadFeatureFlags = true): void {\n // Get persisted group properties\n const existingProperties = this.instance.get_property(STORED_GROUP_PROPERTIES_KEY) || {}\n\n if (Object.keys(existingProperties).length !== 0) {\n Object.keys(existingProperties).forEach((groupType) => {\n existingProperties[groupType] = {\n ...existingProperties[groupType],\n ...properties[groupType],\n }\n delete properties[groupType]\n })\n }\n\n this.instance.register({\n [STORED_GROUP_PROPERTIES_KEY]: {\n ...existingProperties,\n ...properties,\n },\n })\n\n if (reloadFeatureFlags) {\n this.instance.reloadFeatureFlags()\n }\n }\n\n resetGroupPropertiesForFlags(group_type?: string): void {\n if (group_type) {\n const existingProperties = this.instance.get_property(STORED_GROUP_PROPERTIES_KEY) || {}\n this.instance.register({\n [STORED_GROUP_PROPERTIES_KEY]: { ...existingProperties, [group_type]: {} },\n })\n } else {\n this.instance.unregister(STORED_GROUP_PROPERTIES_KEY)\n }\n }\n}\n"]}
@@ -9,7 +9,7 @@ var RateLimiter = /** @class */ (function () {
9
9
  var response = JSON.parse(xmlHttpRequest.responseText);
10
10
  var quotaLimitedProducts = response.quota_limited || [];
11
11
  quotaLimitedProducts.forEach(function (batchKey) {
12
- logger.log("[PostHog RateLimiter] ".concat(batchKey || 'events', " is quota limited."));
12
+ logger.info("[RateLimiter] ".concat(batchKey || 'events', " is quota limited."));
13
13
  _this.limits[batchKey] = new Date().getTime() + oneMinuteInMilliseconds;
14
14
  });
15
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/rate-limiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAEhC,IAAM,uBAAuB,GAAG,EAAE,GAAG,IAAI,CAAA;AAMzC;IAAA;QAAA,iBAyBC;QAxBG,WAAM,GAA2B,EAAE,CAAA;QAW5B,qBAAgB,GAAG,UAAC,cAA8B;YACrD,IAAI;gBACA,IAAM,QAAQ,GAAoB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,CAAA;gBACzE,IAAM,oBAAoB,GAAG,QAAQ,CAAC,aAAa,IAAI,EAAE,CAAA;gBACzD,oBAAoB,CAAC,OAAO,CAAC,UAAC,QAAQ;oBAClC,MAAM,CAAC,GAAG,CAAC,gCAAyB,QAAQ,IAAI,QAAQ,uBAAoB,CAAC,CAAA;oBAC7E,KAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,uBAAuB,CAAA;gBAC1E,CAAC,CAAC,CAAA;aACL;YAAC,OAAO,CAAC,EAAE;gBACR,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;gBACf,OAAM;aACT;QACL,CAAC,CAAA;IACL,CAAC;IAtBU,mCAAa,GAApB,UAAqB,QAA4B;QAC7C,IAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAA;QAE7D,IAAI,UAAU,KAAK,KAAK,EAAE;YACtB,OAAO,KAAK,CAAA;SACf;QACD,OAAO,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,UAAU,CAAA;IAC5C,CAAC;IAeL,kBAAC;AAAD,CAAC,AAzBD,IAyBC","sourcesContent":["import { logger } from './utils'\n\nconst oneMinuteInMilliseconds = 60 * 1000\n\ninterface CaptureResponse {\n quota_limited?: string[]\n}\n\nexport class RateLimiter {\n limits: Record<string, number> = {}\n\n public isRateLimited(batchKey: string | undefined): boolean {\n const retryAfter = this.limits[batchKey || 'events'] || false\n\n if (retryAfter === false) {\n return false\n }\n return new Date().getTime() < retryAfter\n }\n\n public checkForLimiting = (xmlHttpRequest: XMLHttpRequest): void => {\n try {\n const response: CaptureResponse = JSON.parse(xmlHttpRequest.responseText)\n const quotaLimitedProducts = response.quota_limited || []\n quotaLimitedProducts.forEach((batchKey) => {\n logger.log(`[PostHog RateLimiter] ${batchKey || 'events'} is quota limited.`)\n this.limits[batchKey] = new Date().getTime() + oneMinuteInMilliseconds\n })\n } catch (e) {\n logger.error(e)\n return\n }\n }\n}\n"]}
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/rate-limiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAEhC,IAAM,uBAAuB,GAAG,EAAE,GAAG,IAAI,CAAA;AAMzC;IAAA;QAAA,iBAyBC;QAxBG,WAAM,GAA2B,EAAE,CAAA;QAW5B,qBAAgB,GAAG,UAAC,cAA8B;YACrD,IAAI;gBACA,IAAM,QAAQ,GAAoB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,CAAA;gBACzE,IAAM,oBAAoB,GAAG,QAAQ,CAAC,aAAa,IAAI,EAAE,CAAA;gBACzD,oBAAoB,CAAC,OAAO,CAAC,UAAC,QAAQ;oBAClC,MAAM,CAAC,IAAI,CAAC,wBAAiB,QAAQ,IAAI,QAAQ,uBAAoB,CAAC,CAAA;oBACtE,KAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,uBAAuB,CAAA;gBAC1E,CAAC,CAAC,CAAA;aACL;YAAC,OAAO,CAAC,EAAE;gBACR,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;gBACf,OAAM;aACT;QACL,CAAC,CAAA;IACL,CAAC;IAtBU,mCAAa,GAApB,UAAqB,QAA4B;QAC7C,IAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAA;QAE7D,IAAI,UAAU,KAAK,KAAK,EAAE;YACtB,OAAO,KAAK,CAAA;SACf;QACD,OAAO,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,UAAU,CAAA;IAC5C,CAAC;IAeL,kBAAC;AAAD,CAAC,AAzBD,IAyBC","sourcesContent":["import { logger } from './utils'\n\nconst oneMinuteInMilliseconds = 60 * 1000\n\ninterface CaptureResponse {\n quota_limited?: string[]\n}\n\nexport class RateLimiter {\n limits: Record<string, number> = {}\n\n public isRateLimited(batchKey: string | undefined): boolean {\n const retryAfter = this.limits[batchKey || 'events'] || false\n\n if (retryAfter === false) {\n return false\n }\n return new Date().getTime() < retryAfter\n }\n\n public checkForLimiting = (xmlHttpRequest: XMLHttpRequest): void => {\n try {\n const response: CaptureResponse = JSON.parse(xmlHttpRequest.responseText)\n const quotaLimitedProducts = response.quota_limited || []\n quotaLimitedProducts.forEach((batchKey) => {\n logger.info(`[RateLimiter] ${batchKey || 'events'} is quota limited.`)\n this.limits[batchKey] = new Date().getTime() + oneMinuteInMilliseconds\n })\n } catch (e) {\n logger.error(e)\n return\n }\n }\n}\n"]}
@@ -37,7 +37,7 @@ var __values = (this && this.__values) || function(o) {
37
37
  };
38
38
  import { RequestQueueScaffold } from './base-request-queue';
39
39
  import { encodePostData, xhr } from './send-request';
40
- import Config from './config';
40
+ import { logger } from './utils';
41
41
  var thirtyMinutes = 30 * 60 * 1000;
42
42
  /**
43
43
  * Generates a jitter-ed exponential backoff delay in milliseconds
@@ -85,7 +85,7 @@ var RetryQueue = /** @class */ (function (_super) {
85
85
  var msToNextRetry = pickNextRetryDelay(retriesPerformedSoFar);
86
86
  var retryAt = new Date(Date.now() + msToNextRetry);
87
87
  this.queue.push({ retryAt: retryAt, requestData: requestData });
88
- console.warn("Enqueued failed request for retry in ".concat(msToNextRetry));
88
+ logger.warn("Enqueued failed request for retry in ".concat(msToNextRetry));
89
89
  if (!this.isPolling) {
90
90
  this.isPolling = true;
91
91
  this.poll();
@@ -140,9 +140,7 @@ var RetryQueue = /** @class */ (function (_super) {
140
140
  var requestData = _c.value.requestData;
141
141
  var url = requestData.url, data = requestData.data, options = requestData.options;
142
142
  if (this.rateLimiter.isRateLimited(options._batchKey)) {
143
- if (Config.DEBUG) {
144
- console.warn('[PostHog RetryQueue] is quota limited. Dropping request.');
145
- }
143
+ logger.warn('[RetryQueue] is quota limited. Dropping request.');
146
144
  continue;
147
145
  }
148
146
  try {
@@ -153,9 +151,7 @@ var RetryQueue = /** @class */ (function (_super) {
153
151
  catch (e) {
154
152
  // Note sendBeacon automatically retries, and after the first retry it will lose reference to contextual `this`.
155
153
  // This means in some cases `this.getConfig` will be undefined.
156
- if (Config.DEBUG) {
157
- console.error(e);
158
- }
154
+ logger.error(e);
159
155
  }
160
156
  }
161
157
  }
@@ -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 Config from './config'\nimport { RateLimiter } from './rate-limiter'\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 (typeof window !== 'undefined' && '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 console.warn(`Enqueued failed request for retry in ${msToNextRetry}`)\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 if (Config.DEBUG) {\n console.warn('[PostHog RetryQueue] is quota limited. Dropping request.')\n }\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 if (Config.DEBUG) {\n console.error(e)\n }\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 { logger } from './utils'\nimport { RateLimiter } from './rate-limiter'\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 (typeof window !== 'undefined' && '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 logger.warn(`Enqueued failed request for retry in ${msToNextRetry}`)\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"]}
@@ -17,6 +17,7 @@ var __read = (this && this.__read) || function (o, n) {
17
17
  import { SESSION_ID } from './constants';
18
18
  import { sessionStore } from './storage';
19
19
  import { uuidv7 } from './uuidv7';
20
+ import { logger } from './utils';
20
21
  var MAX_SESSION_IDLE_TIMEOUT = 30 * 60; // 30 mins
21
22
  var MIN_SESSION_IDLE_TIMEOUT = 60; // 1 mins
22
23
  var SESSION_LENGTH_LIMIT = 24 * 3600 * 1000; // 24 hours
@@ -32,14 +33,14 @@ var SessionIdManager = /** @class */ (function () {
32
33
  var persistenceName = config['persistence_name'] || config['token'];
33
34
  var desiredTimeout = config['session_idle_timeout_seconds'] || MAX_SESSION_IDLE_TIMEOUT;
34
35
  if (typeof desiredTimeout !== 'number') {
35
- console.warn('[PostHog] session_idle_timeout_seconds must be a number. Defaulting to 30 minutes.');
36
+ logger.warn('session_idle_timeout_seconds must be a number. Defaulting to 30 minutes.');
36
37
  desiredTimeout = MAX_SESSION_IDLE_TIMEOUT;
37
38
  }
38
39
  else if (desiredTimeout > MAX_SESSION_IDLE_TIMEOUT) {
39
- console.warn('[PostHog] session_idle_timeout_seconds cannot be greater than 30 minutes. Using 30 minutes instead.');
40
+ logger.warn('session_idle_timeout_seconds cannot be greater than 30 minutes. Using 30 minutes instead.');
40
41
  }
41
42
  else if (desiredTimeout < MIN_SESSION_IDLE_TIMEOUT) {
42
- console.warn('[PostHog] session_idle_timeout_seconds cannot be less than 60 seconds. Using 60 seconds instead.');
43
+ logger.warn('session_idle_timeout_seconds cannot be less than 60 seconds. Using 60 seconds instead.');
43
44
  }
44
45
  this._sessionTimeoutMs =
45
46
  Math.min(Math.max(desiredTimeout, MIN_SESSION_IDLE_TIMEOUT), MAX_SESSION_IDLE_TIMEOUT) * 1000;
@@ -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'\n\nconst MAX_SESSION_IDLE_TIMEOUT = 30 * 60 // 30 mins\nconst MIN_SESSION_IDLE_TIMEOUT = 60 // 1 mins\nconst SESSION_LENGTH_LIMIT = 24 * 3600 * 1000 // 24 hours\n\nexport class SessionIdManager {\n private config: Partial<PostHogConfig>\n private persistence: PostHogPersistence\n private _windowId: string | null | undefined\n private _sessionId: string | null | undefined\n private _window_id_storage_key: string\n private _primary_window_exists_storage_key: string\n private _sessionStartTimestamp: number | null\n private _sessionActivityTimestamp: number | null\n private _sessionTimeoutMs: number\n private _sessionIdChangedHandlers: SessionIdChangedCallback[] = []\n\n constructor(config: Partial<PostHogConfig>, persistence: PostHogPersistence) {\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\n const persistenceName = config['persistence_name'] || config['token']\n let desiredTimeout = config['session_idle_timeout_seconds'] || MAX_SESSION_IDLE_TIMEOUT\n\n if (typeof desiredTimeout !== 'number') {\n console.warn('[PostHog] 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 console.warn(\n '[PostHog] session_idle_timeout_seconds cannot be greater than 30 minutes. Using 30 minutes instead.'\n )\n } else if (desiredTimeout < MIN_SESSION_IDLE_TIMEOUT) {\n console.warn(\n '[PostHog] session_idle_timeout_seconds cannot be less than 60 seconds. Using 60 seconds instead.'\n )\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 (this._sessionIdChangedHandlers === undefined) {\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 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 (Array.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`. In addition\n * 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 if (\n !sessionId ||\n (!readOnly && Math.abs(timestamp - lastTimestamp) > this._sessionTimeoutMs) ||\n sessionPastMaximumLength\n ) {\n sessionId = uuidv7()\n windowId = uuidv7()\n startTimestamp = timestamp\n valuesChanged = true\n } else if (!windowId) {\n windowId = uuidv7()\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":";;;;;;;;;;;;;;;;AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAEhC,IAAM,wBAAwB,GAAG,EAAE,GAAG,EAAE,CAAA,CAAC,UAAU;AACnD,IAAM,wBAAwB,GAAG,EAAE,CAAA,CAAC,SAAS;AAC7C,IAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAA,CAAC,WAAW;AAEzD;IAYI,0BAAY,MAA8B,EAAE,WAA+B;QAFnE,8BAAyB,GAA+B,EAAE,CAAA;QAG9D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAA;QAC3B,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAA;QAClC,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAA;QAErC,IAAM,eAAe,GAAG,MAAM,CAAC,kBAAkB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAA;QACrE,IAAI,cAAc,GAAG,MAAM,CAAC,8BAA8B,CAAC,IAAI,wBAAwB,CAAA;QAEvF,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE;YACpC,MAAM,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAA;YACvF,cAAc,GAAG,wBAAwB,CAAA;SAC5C;aAAM,IAAI,cAAc,GAAG,wBAAwB,EAAE;YAClD,MAAM,CAAC,IAAI,CAAC,4FAA4F,CAAC,CAAA;SAC5G;aAAM,IAAI,cAAc,GAAG,wBAAwB,EAAE;YAClD,MAAM,CAAC,IAAI,CAAC,wFAAwF,CAAC,CAAA;SACxG;QAED,IAAI,CAAC,iBAAiB;YAClB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,wBAAwB,CAAC,EAAE,wBAAwB,CAAC,GAAG,IAAI,CAAA;QACjG,IAAI,CAAC,sBAAsB,GAAG,KAAK,GAAG,eAAe,GAAG,YAAY,CAAA;QACpE,IAAI,CAAC,kCAAkC,GAAG,KAAK,GAAG,eAAe,GAAG,wBAAwB,CAAA;QAE5F,qFAAqF;QACrF,8HAA8H;QAC9H,IAAI,IAAI,CAAC,qBAAqB,EAAE,EAAE;YAC9B,IAAM,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;YAEpE,IAAM,mBAAmB,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAA;YACvF,IAAI,YAAY,IAAI,CAAC,mBAAmB,EAAE;gBACtC,6CAA6C;gBAC7C,IAAI,CAAC,SAAS,GAAG,YAAY,CAAA;aAChC;iBAAM;gBACH,2CAA2C;gBAC3C,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;aACnD;YACD,+CAA+C;YAC/C,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,kCAAkC,EAAE,IAAI,CAAC,CAAA;SAClE;QAED,IAAI,CAAC,qBAAqB,EAAE,CAAA;IAChC,CAAC;IAED,sCAAW,GAAX,UAAY,QAAkC;QAA9C,iBAcC;QAbG,wEAAwE;QACxE,8EAA8E;QAC9E,IAAI,IAAI,CAAC,yBAAyB,KAAK,SAAS,EAAE;YAC9C,IAAI,CAAC,yBAAyB,GAAG,EAAE,CAAA;SACtC;QAED,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC7C,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;SAC5C;QACD,OAAO;YACH,KAAI,CAAC,yBAAyB,GAAG,KAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,KAAK,QAAQ,EAAd,CAAc,CAAC,CAAA;QACjG,CAAC,CAAA;IACL,CAAC;IAEO,gDAAqB,GAA7B;QACI,sFAAsF;QACtF,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,YAAY,CAAC,YAAY,EAAE,CAAA;IAC5G,CAAC;IAED,gHAAgH;IAChH,iHAAiH;IACjH,qIAAqI;IACrI,oFAAoF;IAC5E,uCAAY,GAApB,UAAqB,QAAgB;QACjC,IAAI,QAAQ,KAAK,IAAI,CAAC,SAAS,EAAE;YAC7B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;YACzB,IAAI,IAAI,CAAC,qBAAqB,EAAE,EAAE;gBAC9B,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAA;aAC1D;SACJ;IACL,CAAC;IAEO,uCAAY,GAApB;QACI,IAAI,IAAI,CAAC,SAAS,EAAE;YAChB,OAAO,IAAI,CAAC,SAAS,CAAA;SACxB;QACD,IAAI,IAAI,CAAC,qBAAqB,EAAE,EAAE;YAC9B,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;SACzD;QACD,kCAAkC;QAClC,OAAO,IAAI,CAAA;IACf,CAAC;IAED,mEAAmE;IACnE,6EAA6E;IACrE,wCAAa,GAArB,UACI,SAAwB,EACxB,wBAAuC,EACvC,qBAAoC;;QAEpC,IACI,SAAS,KAAK,IAAI,CAAC,UAAU;YAC7B,wBAAwB,KAAK,IAAI,CAAC,yBAAyB;YAC3D,qBAAqB,KAAK,IAAI,CAAC,sBAAsB,EACvD;YACE,IAAI,CAAC,sBAAsB,GAAG,qBAAqB,CAAA;YACnD,IAAI,CAAC,yBAAyB,GAAG,wBAAwB,CAAA;YACzD,IAAI,CAAC,UAAU,GAAG,SAAS,CAAA;YAC3B,IAAI,CAAC,WAAW,CAAC,QAAQ;gBACrB,GAAC,UAAU,IAAG,CAAC,wBAAwB,EAAE,SAAS,EAAE,qBAAqB,CAAC;oBAC5E,CAAA;SACL;IACL,CAAC;IAEO,wCAAa,GAArB;QACI,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,yBAAyB,IAAI,IAAI,CAAC,sBAAsB,EAAE;YAClF,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,sBAAsB,CAAC,CAAA;SACxF;QACD,IAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QAEpD,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;YACpD,oGAAoG;YACpG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;SAC/B;QAED,OAAO,SAAS,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IACpC,CAAC;IAED,wGAAwG;IACxG,6BAA6B;IAC7B,yCAAc,GAAd;QACI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IACxC,CAAC;IAED;;;;;OAKG;IACK,gDAAqB,GAA7B;QAAA,iBAMC;QALG,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE;YACpC,IAAI,KAAI,CAAC,qBAAqB,EAAE,EAAE;gBAC9B,YAAY,CAAC,MAAM,CAAC,KAAI,CAAC,kCAAkC,CAAC,CAAA;aAC/D;QACL,CAAC,CAAC,CAAA;IACN,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACH,wDAA6B,GAA7B,UAA8B,QAAgB,EAAE,UAAgC;QAAlD,yBAAA,EAAA,gBAAgB;QAAE,2BAAA,EAAA,iBAAgC;QAC5E,IAAM,SAAS,GAAG,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;QAEpD,wCAAwC;QACpC,IAAA,KAAA,OAA6C,IAAI,CAAC,aAAa,EAAE,IAAA,EAAhE,aAAa,QAAA,EAAE,SAAS,QAAA,EAAE,cAAc,QAAwB,CAAA;QACrE,IAAI,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAA;QAElC,IAAM,wBAAwB,GAC1B,cAAc,IAAI,cAAc,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,cAAc,CAAC,GAAG,oBAAoB,CAAA;QAEvG,IAAI,aAAa,GAAG,KAAK,CAAA;QACzB,IACI,CAAC,SAAS;YACV,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,aAAa,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC;YAC3E,wBAAwB,EAC1B;YACE,SAAS,GAAG,MAAM,EAAE,CAAA;YACpB,QAAQ,GAAG,MAAM,EAAE,CAAA;YACnB,cAAc,GAAG,SAAS,CAAA;YAC1B,aAAa,GAAG,IAAI,CAAA;SACvB;aAAM,IAAI,CAAC,QAAQ,EAAE;YAClB,QAAQ,GAAG,MAAM,EAAE,CAAA;YACnB,aAAa,GAAG,IAAI,CAAA;SACvB;QAED,IAAM,YAAY,GAAG,aAAa,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,wBAAwB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAA;QAC7G,IAAM,qBAAqB,GAAG,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,cAAc,CAAA;QAE1F,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;QAC3B,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,YAAY,EAAE,qBAAqB,CAAC,CAAA;QAElE,IAAI,aAAa,EAAE;YACf,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,EAA5B,CAA4B,CAAC,CAAA;SACpF;QAED,OAAO;YACH,SAAS,WAAA;YACT,QAAQ,UAAA;YACR,qBAAqB,uBAAA;SACxB,CAAA;IACL,CAAC;IACL,uBAAC;AAAD,CAAC,AAtND,IAsNC","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 { logger } from './utils'\n\nconst MAX_SESSION_IDLE_TIMEOUT = 30 * 60 // 30 mins\nconst MIN_SESSION_IDLE_TIMEOUT = 60 // 1 mins\nconst SESSION_LENGTH_LIMIT = 24 * 3600 * 1000 // 24 hours\n\nexport class SessionIdManager {\n private config: Partial<PostHogConfig>\n private persistence: PostHogPersistence\n private _windowId: string | null | undefined\n private _sessionId: string | null | undefined\n private _window_id_storage_key: string\n private _primary_window_exists_storage_key: string\n private _sessionStartTimestamp: number | null\n private _sessionActivityTimestamp: number | null\n private _sessionTimeoutMs: number\n private _sessionIdChangedHandlers: SessionIdChangedCallback[] = []\n\n constructor(config: Partial<PostHogConfig>, persistence: PostHogPersistence) {\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\n const persistenceName = config['persistence_name'] || config['token']\n let desiredTimeout = config['session_idle_timeout_seconds'] || MAX_SESSION_IDLE_TIMEOUT\n\n if (typeof desiredTimeout !== 'number') {\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 (this._sessionIdChangedHandlers === undefined) {\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 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 (Array.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`. In addition\n * 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 if (\n !sessionId ||\n (!readOnly && Math.abs(timestamp - lastTimestamp) > this._sessionTimeoutMs) ||\n sessionPastMaximumLength\n ) {\n sessionId = uuidv7()\n windowId = uuidv7()\n startTimestamp = timestamp\n valuesChanged = true\n } else if (!windowId) {\n windowId = uuidv7()\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"]}
@@ -10,9 +10,8 @@ var __assign = (this && this.__assign) || function () {
10
10
  return __assign.apply(this, arguments);
11
11
  };
12
12
  import { _extend, logger } from './utils';
13
- import Config from './config';
14
13
  import { DISTINCT_ID, SESSION_ID } from './constants';
15
- var DOMAIN_MATCH_REGEX = /[a-z0-9][a-z0-9-]+\.[a-z.]{2,6}$/i;
14
+ var DOMAIN_MATCH_REGEX = /[a-z0-9][a-z0-9-]+\.[a-z]{2,}$/i;
16
15
  // Methods partially borrowed from quirksmode.org/js/cookies.html
17
16
  export var cookieStore = {
18
17
  is_supported: function () { return true; },
@@ -249,9 +248,7 @@ export var sessionStore = {
249
248
  return sessionStorageSupported;
250
249
  },
251
250
  error: function (msg) {
252
- if (Config.DEBUG) {
253
- logger.error('sessionStorage error: ', msg);
254
- }
251
+ logger.error('sessionStorage error: ', msg);
255
252
  },
256
253
  get: function (name) {
257
254
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/storage.ts"],"names":[],"mappings":"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","sourcesContent":["import { _extend, logger } from './utils'\nimport { PersistentStore, Properties } from './types'\nimport Config from './config'\nimport { DISTINCT_ID, SESSION_ID } from './constants'\n\nconst DOMAIN_MATCH_REGEX = /[a-z0-9][a-z0-9-]+\\.[a-z.]{2,6}$/i\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 cdomain = '',\n expires = '',\n secure = ''\n\n if (cross_subdomain) {\n // NOTE: Could we use this for cross domain tracking?\n const matches = document.location.hostname.match(DOMAIN_MATCH_REGEX),\n domain = matches ? matches[0] : ''\n\n cdomain = domain ? '; domain=.' + domain : ''\n }\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 (_localStorage_supported !== null) {\n return _localStorage_supported\n }\n\n let supported = true\n if (typeof window !== 'undefined') {\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]\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 (sessionStorageSupported !== null) {\n return sessionStorageSupported\n }\n sessionStorageSupported = true\n if (typeof window !== 'undefined') {\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 if (Config.DEBUG) {\n logger.error('sessionStorage error: ', msg)\n }\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, logger } from './utils'\nimport { PersistentStore, Properties } from './types'\nimport { DISTINCT_ID, SESSION_ID } from './constants'\n\nconst DOMAIN_MATCH_REGEX = /[a-z0-9][a-z0-9-]+\\.[a-z]{2,}$/i\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 cdomain = '',\n expires = '',\n secure = ''\n\n if (cross_subdomain) {\n // NOTE: Could we use this for cross domain tracking?\n const matches = document.location.hostname.match(DOMAIN_MATCH_REGEX),\n domain = matches ? matches[0] : ''\n\n cdomain = domain ? '; domain=.' + domain : ''\n }\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 (_localStorage_supported !== null) {\n return _localStorage_supported\n }\n\n let supported = true\n if (typeof window !== 'undefined') {\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]\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 (sessionStorageSupported !== null) {\n return sessionStorageSupported\n }\n sessionStorageSupported = true\n if (typeof window !== 'undefined') {\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,13 +2,12 @@ import { Breaker, EventHandler, Properties } from './types';
2
2
  declare const win: Window & typeof globalThis;
3
3
  declare const document: Document;
4
4
  declare const userAgent: string;
5
- declare const logger: {
6
- /** @type {function(...*)} */
7
- log: (...args: any[]) => void;
8
- /** @type {function(...*)} */
9
- error: (..._args: any[]) => void;
10
- /** @type {function(...*)} */
11
- critical: (..._args: any[]) => void;
5
+ export declare const logger: {
6
+ _log: (level: 'log' | 'warn' | 'error', ...args: any[]) => void;
7
+ info: (...args: any[]) => void;
8
+ warn: (...args: any[]) => void;
9
+ error: (...args: any[]) => void;
10
+ critical: (...args: any[]) => void;
12
11
  unintializedWarning: (methodName: string) => void;
13
12
  };
14
13
  export declare const _trim: (str: string) => string;
@@ -90,4 +89,4 @@ export declare const _info: {
90
89
  properties: () => Properties;
91
90
  people_properties: () => Properties;
92
91
  };
93
- export { win as window, userAgent, logger, document };
92
+ export { win as window, userAgent, document };