posthog-js 1.131.2 → 1.131.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "posthog-js",
3
- "version": "1.131.2",
3
+ "version": "1.131.3",
4
4
  "description": "Posthog-js allows you to automatically capture usage and send events to PostHog.",
5
5
  "repository": "https://github.com/PostHog/posthog-js",
6
6
  "author": "hey@posthog.com",
@@ -25,4 +25,5 @@ export declare const CAPTURE_RATE_LIMIT = "$capture_rate_limit";
25
25
  export declare const INITIAL_CAMPAIGN_PARAMS = "$initial_campaign_params";
26
26
  export declare const INITIAL_REFERRER_INFO = "$initial_referrer_info";
27
27
  export declare const ENABLE_PERSON_PROCESSING = "$epp";
28
+ export declare const TOOLBAR_ID = "__POSTHOG_TOOLBAR__";
28
29
  export declare const PERSISTENCE_RESERVED_PROPERTIES: string[];
@@ -30,6 +30,7 @@ export var CAPTURE_RATE_LIMIT = '$capture_rate_limit';
30
30
  export var INITIAL_CAMPAIGN_PARAMS = '$initial_campaign_params';
31
31
  export var INITIAL_REFERRER_INFO = '$initial_referrer_info';
32
32
  export var ENABLE_PERSON_PROCESSING = '$epp';
33
+ export var TOOLBAR_ID = '__POSTHOG_TOOLBAR__';
33
34
  // These are properties that are reserved and will not be automatically included in events
34
35
  export var PERSISTENCE_RESERVED_PROPERTIES = [
35
36
  PEOPLE_DISTINCT_ID_KEY,
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,mBAAmB;AAEnB,0FAA0F;AAC1F,MAAM,CAAC,IAAM,sBAAsB,GAAG,qBAAqB,CAAA;AAC3D,MAAM,CAAC,IAAM,WAAW,GAAG,aAAa,CAAA;AACxC,MAAM,CAAC,IAAM,YAAY,GAAG,SAAS,CAAA;AACrC,MAAM,CAAC,IAAM,gBAAgB,GAAG,SAAS,CAAA;AACzC,MAAM,CAAC,IAAM,gBAAgB,GAAG,UAAU,CAAA;AAC1C,MAAM,CAAC,IAAM,gCAAgC,GAAG,mCAAmC,CAAA;AACnF,MAAM,CAAC,IAAM,4BAA4B,GAAG,+BAA+B,CAAA;AAC3E,MAAM,CAAC,IAAM,qCAAqC,GAAG,wCAAwC,CAAA;AAC7F,MAAM,CAAC,IAAM,yCAAyC,GAAG,4CAA4C,CAAA;AACrG,MAAM,CAAC,IAAM,yCAAyC,GAAG,4CAA4C,CAAA;AACrG,MAAM,CAAC,IAAM,kCAAkC,GAAG,qCAAqC,CAAA;AACvF,MAAM,CAAC,IAAM,6BAA6B,GAAG,qBAAqB,CAAA;AAClE,MAAM,CAAC,IAAM,kCAAkC,GAAG,0BAA0B,CAAA;AAC5E,MAAM,CAAC,IAAM,UAAU,GAAG,QAAQ,CAAA;AAClC,MAAM,CAAC,IAAM,4BAA4B,GAAG,qBAAqB,CAAA;AACjE,MAAM,CAAC,IAAM,qBAAqB,GAAG,wBAAwB,CAAA;AAC7D,MAAM,CAAC,IAAM,iCAAiC,GAAG,wBAAwB,CAAA;AACzE,MAAM,CAAC,IAAM,4BAA4B,GAAG,2BAA2B,CAAA;AACvE,MAAM,CAAC,IAAM,2BAA2B,GAAG,0BAA0B,CAAA;AACrE,MAAM,CAAC,IAAM,OAAO,GAAG,UAAU,CAAA;AACjC,MAAM,CAAC,IAAM,kBAAkB,GAAG,qBAAqB,CAAA;AACvD,MAAM,CAAC,IAAM,UAAU,GAAG,aAAa,CAAA;AACvC,MAAM,CAAC,IAAM,oBAAoB,GAAG,uBAAuB,CAAA;AAC3D,MAAM,CAAC,IAAM,kBAAkB,GAAG,qBAAqB,CAAA;AACvD,MAAM,CAAC,IAAM,uBAAuB,GAAG,0BAA0B,CAAA;AACjE,MAAM,CAAC,IAAM,qBAAqB,GAAG,wBAAwB,CAAA;AAC7D,MAAM,CAAC,IAAM,wBAAwB,GAAG,MAAM,CAAA;AAE9C,0FAA0F;AAC1F,MAAM,CAAC,IAAM,+BAA+B,GAAG;IAC3C,sBAAsB;IACtB,YAAY;IACZ,gBAAgB;IAChB,gBAAgB;IAChB,qCAAqC;IACrC,4BAA4B;IAC5B,UAAU;IACV,qBAAqB;IACrB,UAAU;IACV,iCAAiC;IACjC,2BAA2B;IAC3B,4BAA4B;IAC5B,OAAO;IACP,kBAAkB;IAClB,oBAAoB;IACpB,kBAAkB;IAClB,uBAAuB;IACvB,qBAAqB;IACrB,wBAAwB;CAC3B,CAAA","sourcesContent":["/*\n * Constants\n */\n\n/* PROPERTY KEYS */\n\n// This key is deprecated, but we want to check for it to see whether aliasing is allowed.\nexport const PEOPLE_DISTINCT_ID_KEY = '$people_distinct_id'\nexport const DISTINCT_ID = 'distinct_id'\nexport const ALIAS_ID_KEY = '__alias'\nexport const CAMPAIGN_IDS_KEY = '__cmpns'\nexport const EVENT_TIMERS_KEY = '__timers'\nexport const AUTOCAPTURE_DISABLED_SERVER_SIDE = '$autocapture_disabled_server_side'\nexport const HEATMAPS_ENABLED_SERVER_SIDE = '$heatmaps_enabled_server_side'\nexport const SESSION_RECORDING_ENABLED_SERVER_SIDE = '$session_recording_enabled_server_side'\nexport const CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE = '$console_log_recording_enabled_server_side'\nexport const SESSION_RECORDING_NETWORK_PAYLOAD_CAPTURE = '$session_recording_network_payload_capture'\nexport const SESSION_RECORDING_CANVAS_RECORDING = '$session_recording_canvas_recording'\nexport const SESSION_RECORDING_SAMPLE_RATE = '$replay_sample_rate'\nexport const SESSION_RECORDING_MINIMUM_DURATION = '$replay_minimum_duration'\nexport const SESSION_ID = '$sesid'\nexport const SESSION_RECORDING_IS_SAMPLED = '$session_is_sampled'\nexport const ENABLED_FEATURE_FLAGS = '$enabled_feature_flags'\nexport const PERSISTENCE_EARLY_ACCESS_FEATURES = '$early_access_features'\nexport const STORED_PERSON_PROPERTIES_KEY = '$stored_person_properties'\nexport const STORED_GROUP_PROPERTIES_KEY = '$stored_group_properties'\nexport const SURVEYS = '$surveys'\nexport const FLAG_CALL_REPORTED = '$flag_call_reported'\nexport const USER_STATE = '$user_state'\nexport const CLIENT_SESSION_PROPS = '$client_session_props'\nexport const CAPTURE_RATE_LIMIT = '$capture_rate_limit'\nexport const INITIAL_CAMPAIGN_PARAMS = '$initial_campaign_params'\nexport const INITIAL_REFERRER_INFO = '$initial_referrer_info'\nexport const ENABLE_PERSON_PROCESSING = '$epp'\n\n// These are properties that are reserved and will not be automatically included in events\nexport const PERSISTENCE_RESERVED_PROPERTIES = [\n PEOPLE_DISTINCT_ID_KEY,\n ALIAS_ID_KEY,\n CAMPAIGN_IDS_KEY,\n EVENT_TIMERS_KEY,\n SESSION_RECORDING_ENABLED_SERVER_SIDE,\n HEATMAPS_ENABLED_SERVER_SIDE,\n SESSION_ID,\n ENABLED_FEATURE_FLAGS,\n USER_STATE,\n PERSISTENCE_EARLY_ACCESS_FEATURES,\n STORED_GROUP_PROPERTIES_KEY,\n STORED_PERSON_PROPERTIES_KEY,\n SURVEYS,\n FLAG_CALL_REPORTED,\n CLIENT_SESSION_PROPS,\n CAPTURE_RATE_LIMIT,\n INITIAL_CAMPAIGN_PARAMS,\n INITIAL_REFERRER_INFO,\n ENABLE_PERSON_PROCESSING,\n]\n"]}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,mBAAmB;AAEnB,0FAA0F;AAC1F,MAAM,CAAC,IAAM,sBAAsB,GAAG,qBAAqB,CAAA;AAC3D,MAAM,CAAC,IAAM,WAAW,GAAG,aAAa,CAAA;AACxC,MAAM,CAAC,IAAM,YAAY,GAAG,SAAS,CAAA;AACrC,MAAM,CAAC,IAAM,gBAAgB,GAAG,SAAS,CAAA;AACzC,MAAM,CAAC,IAAM,gBAAgB,GAAG,UAAU,CAAA;AAC1C,MAAM,CAAC,IAAM,gCAAgC,GAAG,mCAAmC,CAAA;AACnF,MAAM,CAAC,IAAM,4BAA4B,GAAG,+BAA+B,CAAA;AAC3E,MAAM,CAAC,IAAM,qCAAqC,GAAG,wCAAwC,CAAA;AAC7F,MAAM,CAAC,IAAM,yCAAyC,GAAG,4CAA4C,CAAA;AACrG,MAAM,CAAC,IAAM,yCAAyC,GAAG,4CAA4C,CAAA;AACrG,MAAM,CAAC,IAAM,kCAAkC,GAAG,qCAAqC,CAAA;AACvF,MAAM,CAAC,IAAM,6BAA6B,GAAG,qBAAqB,CAAA;AAClE,MAAM,CAAC,IAAM,kCAAkC,GAAG,0BAA0B,CAAA;AAC5E,MAAM,CAAC,IAAM,UAAU,GAAG,QAAQ,CAAA;AAClC,MAAM,CAAC,IAAM,4BAA4B,GAAG,qBAAqB,CAAA;AACjE,MAAM,CAAC,IAAM,qBAAqB,GAAG,wBAAwB,CAAA;AAC7D,MAAM,CAAC,IAAM,iCAAiC,GAAG,wBAAwB,CAAA;AACzE,MAAM,CAAC,IAAM,4BAA4B,GAAG,2BAA2B,CAAA;AACvE,MAAM,CAAC,IAAM,2BAA2B,GAAG,0BAA0B,CAAA;AACrE,MAAM,CAAC,IAAM,OAAO,GAAG,UAAU,CAAA;AACjC,MAAM,CAAC,IAAM,kBAAkB,GAAG,qBAAqB,CAAA;AACvD,MAAM,CAAC,IAAM,UAAU,GAAG,aAAa,CAAA;AACvC,MAAM,CAAC,IAAM,oBAAoB,GAAG,uBAAuB,CAAA;AAC3D,MAAM,CAAC,IAAM,kBAAkB,GAAG,qBAAqB,CAAA;AACvD,MAAM,CAAC,IAAM,uBAAuB,GAAG,0BAA0B,CAAA;AACjE,MAAM,CAAC,IAAM,qBAAqB,GAAG,wBAAwB,CAAA;AAC7D,MAAM,CAAC,IAAM,wBAAwB,GAAG,MAAM,CAAA;AAC9C,MAAM,CAAC,IAAM,UAAU,GAAG,qBAAqB,CAAA;AAE/C,0FAA0F;AAC1F,MAAM,CAAC,IAAM,+BAA+B,GAAG;IAC3C,sBAAsB;IACtB,YAAY;IACZ,gBAAgB;IAChB,gBAAgB;IAChB,qCAAqC;IACrC,4BAA4B;IAC5B,UAAU;IACV,qBAAqB;IACrB,UAAU;IACV,iCAAiC;IACjC,2BAA2B;IAC3B,4BAA4B;IAC5B,OAAO;IACP,kBAAkB;IAClB,oBAAoB;IACpB,kBAAkB;IAClB,uBAAuB;IACvB,qBAAqB;IACrB,wBAAwB;CAC3B,CAAA","sourcesContent":["/*\n * Constants\n */\n\n/* PROPERTY KEYS */\n\n// This key is deprecated, but we want to check for it to see whether aliasing is allowed.\nexport const PEOPLE_DISTINCT_ID_KEY = '$people_distinct_id'\nexport const DISTINCT_ID = 'distinct_id'\nexport const ALIAS_ID_KEY = '__alias'\nexport const CAMPAIGN_IDS_KEY = '__cmpns'\nexport const EVENT_TIMERS_KEY = '__timers'\nexport const AUTOCAPTURE_DISABLED_SERVER_SIDE = '$autocapture_disabled_server_side'\nexport const HEATMAPS_ENABLED_SERVER_SIDE = '$heatmaps_enabled_server_side'\nexport const SESSION_RECORDING_ENABLED_SERVER_SIDE = '$session_recording_enabled_server_side'\nexport const CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE = '$console_log_recording_enabled_server_side'\nexport const SESSION_RECORDING_NETWORK_PAYLOAD_CAPTURE = '$session_recording_network_payload_capture'\nexport const SESSION_RECORDING_CANVAS_RECORDING = '$session_recording_canvas_recording'\nexport const SESSION_RECORDING_SAMPLE_RATE = '$replay_sample_rate'\nexport const SESSION_RECORDING_MINIMUM_DURATION = '$replay_minimum_duration'\nexport const SESSION_ID = '$sesid'\nexport const SESSION_RECORDING_IS_SAMPLED = '$session_is_sampled'\nexport const ENABLED_FEATURE_FLAGS = '$enabled_feature_flags'\nexport const PERSISTENCE_EARLY_ACCESS_FEATURES = '$early_access_features'\nexport const STORED_PERSON_PROPERTIES_KEY = '$stored_person_properties'\nexport const STORED_GROUP_PROPERTIES_KEY = '$stored_group_properties'\nexport const SURVEYS = '$surveys'\nexport const FLAG_CALL_REPORTED = '$flag_call_reported'\nexport const USER_STATE = '$user_state'\nexport const CLIENT_SESSION_PROPS = '$client_session_props'\nexport const CAPTURE_RATE_LIMIT = '$capture_rate_limit'\nexport const INITIAL_CAMPAIGN_PARAMS = '$initial_campaign_params'\nexport const INITIAL_REFERRER_INFO = '$initial_referrer_info'\nexport const ENABLE_PERSON_PROCESSING = '$epp'\nexport const TOOLBAR_ID = '__POSTHOG_TOOLBAR__'\n\n// These are properties that are reserved and will not be automatically included in events\nexport const PERSISTENCE_RESERVED_PROPERTIES = [\n PEOPLE_DISTINCT_ID_KEY,\n ALIAS_ID_KEY,\n CAMPAIGN_IDS_KEY,\n EVENT_TIMERS_KEY,\n SESSION_RECORDING_ENABLED_SERVER_SIDE,\n HEATMAPS_ENABLED_SERVER_SIDE,\n SESSION_ID,\n ENABLED_FEATURE_FLAGS,\n USER_STATE,\n PERSISTENCE_EARLY_ACCESS_FEATURES,\n STORED_GROUP_PROPERTIES_KEY,\n STORED_PERSON_PROPERTIES_KEY,\n SURVEYS,\n FLAG_CALL_REPORTED,\n CLIENT_SESSION_PROPS,\n CAPTURE_RATE_LIMIT,\n INITIAL_CAMPAIGN_PARAMS,\n INITIAL_REFERRER_INFO,\n ENABLE_PERSON_PROCESSING,\n]\n"]}
@@ -2,8 +2,9 @@ import { PostHog } from '../posthog-core';
2
2
  import { ToolbarParams } from '../types';
3
3
  export declare class Toolbar {
4
4
  instance: PostHog;
5
- private _toolbarScriptLoaded;
6
5
  constructor(instance: PostHog);
6
+ private setToolbarState;
7
+ private getToolbarState;
7
8
  /**
8
9
  * To load the toolbar, we need an access token and other state. That state comes from one of three places:
9
10
  * 1. In the URL hash params
@@ -13,17 +13,31 @@ import { registerEvent, trySafe, loadScript } from '../utils';
13
13
  import { _getHashParam } from '../utils/request-utils';
14
14
  import { logger } from '../utils/logger';
15
15
  import { window, document, assignableWindow } from '../utils/globals';
16
+ import { TOOLBAR_ID } from '../constants';
16
17
  // TRICKY: Many web frameworks will modify the route on load, potentially before posthog is initialized.
17
18
  // To get ahead of this we grab it as soon as the posthog-js is parsed
18
19
  var STATE_FROM_WINDOW = (window === null || window === void 0 ? void 0 : window.location)
19
20
  ? _getHashParam(window.location.hash, '__posthog') || _getHashParam(location.hash, 'state')
20
21
  : null;
21
22
  var LOCALSTORAGE_KEY = '_postHogToolbarParams';
23
+ var ToolbarState;
24
+ (function (ToolbarState) {
25
+ ToolbarState[ToolbarState["UNINITIALIZED"] = 0] = "UNINITIALIZED";
26
+ ToolbarState[ToolbarState["LOADING"] = 1] = "LOADING";
27
+ ToolbarState[ToolbarState["LOADED"] = 2] = "LOADED";
28
+ })(ToolbarState || (ToolbarState = {}));
22
29
  var Toolbar = /** @class */ (function () {
23
30
  function Toolbar(instance) {
24
- this._toolbarScriptLoaded = false;
25
31
  this.instance = instance;
26
32
  }
33
+ // NOTE: We store the state of the toolbar in the global scope to avoid multiple instances of the SDK loading the toolbar
34
+ Toolbar.prototype.setToolbarState = function (state) {
35
+ assignableWindow['ph_toolbar_state'] = state;
36
+ };
37
+ Toolbar.prototype.getToolbarState = function () {
38
+ var _a;
39
+ return (_a = assignableWindow['ph_toolbar_state']) !== null && _a !== void 0 ? _a : ToolbarState.UNINITIALIZED;
40
+ };
27
41
  /**
28
42
  * To load the toolbar, we need an access token and other state. That state comes from one of three places:
29
43
  * 1. In the URL hash params
@@ -109,19 +123,20 @@ var Toolbar = /** @class */ (function () {
109
123
  };
110
124
  Toolbar.prototype.loadToolbar = function (params) {
111
125
  var _this = this;
112
- if (!window || (window.localStorage.getItem(LOCALSTORAGE_KEY) && this._toolbarScriptLoaded)) {
126
+ var toolbarRunning = !!(document === null || document === void 0 ? void 0 : document.getElementById(TOOLBAR_ID));
127
+ if (!window || toolbarRunning) {
113
128
  // The toolbar will clear the localStorage key when it's done with it. If it is present that indicates the toolbar is already open and running
114
129
  return false;
115
130
  }
116
131
  var disableToolbarMetrics = this.instance.requestRouter.region === 'custom' && this.instance.config.advanced_disable_toolbar_metrics;
117
132
  var toolbarParams = __assign(__assign(__assign({ token: this.instance.config.token }, params), { apiURL: this.instance.requestRouter.endpointFor('ui') }), (disableToolbarMetrics ? { instrument: false } : {}));
118
133
  window.localStorage.setItem(LOCALSTORAGE_KEY, JSON.stringify(__assign(__assign({}, toolbarParams), { source: undefined })));
119
- if (this._toolbarScriptLoaded) {
134
+ if (this.getToolbarState() === ToolbarState.LOADED) {
120
135
  this._callLoadToolbar(toolbarParams);
121
136
  }
122
- else {
137
+ else if (this.getToolbarState() === ToolbarState.UNINITIALIZED) {
123
138
  // only load the toolbar once, even if there are multiple instances of PostHogLib
124
- this._toolbarScriptLoaded = true;
139
+ this.setToolbarState(ToolbarState.LOADING);
125
140
  // toolbar.js is served from the PostHog CDN, this has a TTL of 24 hours.
126
141
  // the toolbar asset includes a rotating "token" that is valid for 5 minutes.
127
142
  var fiveMinutesInMillis = 5 * 60 * 1000;
@@ -131,15 +146,16 @@ var Toolbar = /** @class */ (function () {
131
146
  loadScript(toolbarUrl, function (err) {
132
147
  if (err) {
133
148
  logger.error('Failed to load toolbar', err);
134
- _this._toolbarScriptLoaded = false;
149
+ _this.setToolbarState(ToolbarState.UNINITIALIZED);
135
150
  return;
136
151
  }
152
+ _this.setToolbarState(ToolbarState.LOADED);
137
153
  _this._callLoadToolbar(toolbarParams);
138
154
  });
139
155
  // Turbolinks doesn't fire an onload event but does replace the entire body, including the toolbar.
140
156
  // Thus, we ensure the toolbar is only loaded inside the body, and then reloaded on turbolinks:load.
141
157
  registerEvent(window, 'turbolinks:load', function () {
142
- _this._toolbarScriptLoaded = false;
158
+ _this.setToolbarState(ToolbarState.UNINITIALIZED);
143
159
  _this.loadToolbar(toolbarParams);
144
160
  });
145
161
  }
@@ -1 +1 @@
1
- {"version":3,"file":"toolbar.js","sourceRoot":"","sources":["../../../src/extensions/toolbar.ts"],"names":[],"mappings":"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","sourcesContent":["import { registerEvent, trySafe, loadScript } from '../utils'\nimport { PostHog } from '../posthog-core'\nimport { ToolbarParams } from '../types'\nimport { _getHashParam } from '../utils/request-utils'\nimport { logger } from '../utils/logger'\nimport { window, document, assignableWindow } from '../utils/globals'\n\n// TRICKY: Many web frameworks will modify the route on load, potentially before posthog is initialized.\n// To get ahead of this we grab it as soon as the posthog-js is parsed\nconst STATE_FROM_WINDOW = window?.location\n ? _getHashParam(window.location.hash, '__posthog') || _getHashParam(location.hash, 'state')\n : null\n\nconst LOCALSTORAGE_KEY = '_postHogToolbarParams'\n\nexport class Toolbar {\n instance: PostHog\n\n private _toolbarScriptLoaded = false\n\n constructor(instance: PostHog) {\n this.instance = instance\n }\n\n /**\n * To load the toolbar, we need an access token and other state. That state comes from one of three places:\n * 1. In the URL hash params\n * 2. From session storage under the key `toolbarParams` if the toolbar was initialized on a previous page\n */\n maybeLoadToolbar(\n location: Location | undefined = undefined,\n localStorage: Storage | undefined = undefined,\n history: History | undefined = undefined\n ): boolean {\n if (!window || !document) {\n return false\n }\n location = location ?? window.location\n history = history ?? window.history\n\n try {\n // Before running the code we check if we can access localStorage, if not we opt-out\n if (!localStorage) {\n try {\n window.localStorage.setItem('test', 'test')\n window.localStorage.removeItem('test')\n } catch (error) {\n return false\n }\n\n // If localStorage was undefined, and localStorage is supported we set the default value\n localStorage = window?.localStorage\n }\n\n /**\n * Info about the state\n * The state is a json object\n * 1. (Legacy) The state can be `state={}` as a urlencoded object of info. In this case\n * 2. The state should now be found in `__posthog={}` and can be base64 encoded or urlencoded.\n * 3. Base64 encoding is preferred and will gradually be rolled out everywhere\n */\n\n const stateHash =\n STATE_FROM_WINDOW || _getHashParam(location.hash, '__posthog') || _getHashParam(location.hash, 'state')\n\n let toolbarParams: ToolbarParams\n const state = stateHash\n ? trySafe(() => JSON.parse(atob(decodeURIComponent(stateHash)))) ||\n trySafe(() => JSON.parse(decodeURIComponent(stateHash)))\n : null\n\n const parseFromUrl = state && state['action'] === 'ph_authorize'\n\n if (parseFromUrl) {\n // happens if they are initializing the toolbar using an old snippet\n toolbarParams = state\n toolbarParams.source = 'url'\n\n if (toolbarParams && Object.keys(toolbarParams).length > 0) {\n if (state['desiredHash']) {\n // hash that was in the url before the redirect\n location.hash = state['desiredHash']\n } else if (history) {\n // second param is unused see https://developer.mozilla.org/en-US/docs/Web/API/History/replaceState\n history.replaceState(history.state, '', location.pathname + location.search) // completely remove hash\n } else {\n location.hash = '' // clear hash (but leaves # unfortunately)\n }\n }\n } else {\n // get credentials from localStorage from a previous initialization\n toolbarParams = JSON.parse(localStorage.getItem(LOCALSTORAGE_KEY) || '{}')\n toolbarParams.source = 'localstorage'\n\n // delete \"add-action\" or other intent from toolbarParams, otherwise we'll have the same intent\n // every time we open the page (e.g. you just visiting your own site an hour later)\n delete toolbarParams.userIntent\n }\n\n if (toolbarParams['token'] && this.instance.config.token === toolbarParams['token']) {\n this.loadToolbar(toolbarParams)\n return true\n } else {\n return false\n }\n } catch (e) {\n return false\n }\n }\n\n private _callLoadToolbar(params: ToolbarParams) {\n ;(assignableWindow['ph_load_toolbar'] || assignableWindow['ph_load_editor'])(params, this.instance)\n }\n\n loadToolbar(params?: ToolbarParams): boolean {\n if (!window || (window.localStorage.getItem(LOCALSTORAGE_KEY) && this._toolbarScriptLoaded)) {\n // The toolbar will clear the localStorage key when it's done with it. If it is present that indicates the toolbar is already open and running\n return false\n }\n\n const disableToolbarMetrics =\n this.instance.requestRouter.region === 'custom' && this.instance.config.advanced_disable_toolbar_metrics\n\n const toolbarParams = {\n token: this.instance.config.token,\n ...params,\n apiURL: this.instance.requestRouter.endpointFor('ui'),\n ...(disableToolbarMetrics ? { instrument: false } : {}),\n }\n window.localStorage.setItem(\n LOCALSTORAGE_KEY,\n JSON.stringify({\n ...toolbarParams,\n source: undefined,\n })\n )\n\n if (this._toolbarScriptLoaded) {\n this._callLoadToolbar(toolbarParams)\n } else {\n // only load the toolbar once, even if there are multiple instances of PostHogLib\n this._toolbarScriptLoaded = true\n\n // toolbar.js is served from the PostHog CDN, this has a TTL of 24 hours.\n // the toolbar asset includes a rotating \"token\" that is valid for 5 minutes.\n const fiveMinutesInMillis = 5 * 60 * 1000\n // this ensures that we bust the cache periodically\n const timestampToNearestFiveMinutes = Math.floor(Date.now() / fiveMinutesInMillis) * fiveMinutesInMillis\n const toolbarUrl = this.instance.requestRouter.endpointFor(\n 'assets',\n `/static/toolbar.js?t=${timestampToNearestFiveMinutes}`\n )\n\n loadScript(toolbarUrl, (err) => {\n if (err) {\n logger.error('Failed to load toolbar', err)\n this._toolbarScriptLoaded = false\n return\n }\n this._callLoadToolbar(toolbarParams)\n })\n\n // Turbolinks doesn't fire an onload event but does replace the entire body, including the toolbar.\n // Thus, we ensure the toolbar is only loaded inside the body, and then reloaded on turbolinks:load.\n registerEvent(window, 'turbolinks:load', () => {\n this._toolbarScriptLoaded = false\n this.loadToolbar(toolbarParams)\n })\n }\n\n return true\n }\n\n /** @deprecated Use \"loadToolbar\" instead. */\n _loadEditor(params: ToolbarParams): boolean {\n return this.loadToolbar(params)\n }\n\n /** @deprecated Use \"maybeLoadToolbar\" instead. */\n maybeLoadEditor(\n location: Location | undefined = undefined,\n localStorage: Storage | undefined = undefined,\n history: History | undefined = undefined\n ): boolean {\n return this.maybeLoadToolbar(location, localStorage, history)\n }\n}\n"]}
1
+ {"version":3,"file":"toolbar.js","sourceRoot":"","sources":["../../../src/extensions/toolbar.ts"],"names":[],"mappings":"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","sourcesContent":["import { registerEvent, trySafe, loadScript } from '../utils'\nimport { PostHog } from '../posthog-core'\nimport { ToolbarParams } from '../types'\nimport { _getHashParam } from '../utils/request-utils'\nimport { logger } from '../utils/logger'\nimport { window, document, assignableWindow } from '../utils/globals'\nimport { TOOLBAR_ID } from '../constants'\n\n// TRICKY: Many web frameworks will modify the route on load, potentially before posthog is initialized.\n// To get ahead of this we grab it as soon as the posthog-js is parsed\nconst STATE_FROM_WINDOW = window?.location\n ? _getHashParam(window.location.hash, '__posthog') || _getHashParam(location.hash, 'state')\n : null\n\nconst LOCALSTORAGE_KEY = '_postHogToolbarParams'\n\nenum ToolbarState {\n UNINITIALIZED = 0,\n LOADING = 1,\n LOADED = 2,\n}\n\nexport class Toolbar {\n instance: PostHog\n\n constructor(instance: PostHog) {\n this.instance = instance\n }\n\n // NOTE: We store the state of the toolbar in the global scope to avoid multiple instances of the SDK loading the toolbar\n private setToolbarState(state: ToolbarState) {\n assignableWindow['ph_toolbar_state'] = state\n }\n\n private getToolbarState(): ToolbarState {\n return assignableWindow['ph_toolbar_state'] ?? ToolbarState.UNINITIALIZED\n }\n\n /**\n * To load the toolbar, we need an access token and other state. That state comes from one of three places:\n * 1. In the URL hash params\n * 2. From session storage under the key `toolbarParams` if the toolbar was initialized on a previous page\n */\n maybeLoadToolbar(\n location: Location | undefined = undefined,\n localStorage: Storage | undefined = undefined,\n history: History | undefined = undefined\n ): boolean {\n if (!window || !document) {\n return false\n }\n location = location ?? window.location\n history = history ?? window.history\n\n try {\n // Before running the code we check if we can access localStorage, if not we opt-out\n if (!localStorage) {\n try {\n window.localStorage.setItem('test', 'test')\n window.localStorage.removeItem('test')\n } catch (error) {\n return false\n }\n\n // If localStorage was undefined, and localStorage is supported we set the default value\n localStorage = window?.localStorage\n }\n\n /**\n * Info about the state\n * The state is a json object\n * 1. (Legacy) The state can be `state={}` as a urlencoded object of info. In this case\n * 2. The state should now be found in `__posthog={}` and can be base64 encoded or urlencoded.\n * 3. Base64 encoding is preferred and will gradually be rolled out everywhere\n */\n\n const stateHash =\n STATE_FROM_WINDOW || _getHashParam(location.hash, '__posthog') || _getHashParam(location.hash, 'state')\n\n let toolbarParams: ToolbarParams\n const state = stateHash\n ? trySafe(() => JSON.parse(atob(decodeURIComponent(stateHash)))) ||\n trySafe(() => JSON.parse(decodeURIComponent(stateHash)))\n : null\n\n const parseFromUrl = state && state['action'] === 'ph_authorize'\n\n if (parseFromUrl) {\n // happens if they are initializing the toolbar using an old snippet\n toolbarParams = state\n toolbarParams.source = 'url'\n\n if (toolbarParams && Object.keys(toolbarParams).length > 0) {\n if (state['desiredHash']) {\n // hash that was in the url before the redirect\n location.hash = state['desiredHash']\n } else if (history) {\n // second param is unused see https://developer.mozilla.org/en-US/docs/Web/API/History/replaceState\n history.replaceState(history.state, '', location.pathname + location.search) // completely remove hash\n } else {\n location.hash = '' // clear hash (but leaves # unfortunately)\n }\n }\n } else {\n // get credentials from localStorage from a previous initialization\n\n toolbarParams = JSON.parse(localStorage.getItem(LOCALSTORAGE_KEY) || '{}')\n toolbarParams.source = 'localstorage'\n\n // delete \"add-action\" or other intent from toolbarParams, otherwise we'll have the same intent\n // every time we open the page (e.g. you just visiting your own site an hour later)\n delete toolbarParams.userIntent\n }\n\n if (toolbarParams['token'] && this.instance.config.token === toolbarParams['token']) {\n this.loadToolbar(toolbarParams)\n return true\n } else {\n return false\n }\n } catch (e) {\n return false\n }\n }\n\n private _callLoadToolbar(params: ToolbarParams) {\n ;(assignableWindow['ph_load_toolbar'] || assignableWindow['ph_load_editor'])(params, this.instance)\n }\n\n loadToolbar(params?: ToolbarParams): boolean {\n const toolbarRunning = !!document?.getElementById(TOOLBAR_ID)\n\n if (!window || toolbarRunning) {\n // The toolbar will clear the localStorage key when it's done with it. If it is present that indicates the toolbar is already open and running\n return false\n }\n\n const disableToolbarMetrics =\n this.instance.requestRouter.region === 'custom' && this.instance.config.advanced_disable_toolbar_metrics\n\n const toolbarParams = {\n token: this.instance.config.token,\n ...params,\n apiURL: this.instance.requestRouter.endpointFor('ui'),\n ...(disableToolbarMetrics ? { instrument: false } : {}),\n }\n window.localStorage.setItem(\n LOCALSTORAGE_KEY,\n JSON.stringify({\n ...toolbarParams,\n source: undefined,\n })\n )\n\n if (this.getToolbarState() === ToolbarState.LOADED) {\n this._callLoadToolbar(toolbarParams)\n } else if (this.getToolbarState() === ToolbarState.UNINITIALIZED) {\n // only load the toolbar once, even if there are multiple instances of PostHogLib\n this.setToolbarState(ToolbarState.LOADING)\n\n // toolbar.js is served from the PostHog CDN, this has a TTL of 24 hours.\n // the toolbar asset includes a rotating \"token\" that is valid for 5 minutes.\n const fiveMinutesInMillis = 5 * 60 * 1000\n // this ensures that we bust the cache periodically\n const timestampToNearestFiveMinutes = Math.floor(Date.now() / fiveMinutesInMillis) * fiveMinutesInMillis\n const toolbarUrl = this.instance.requestRouter.endpointFor(\n 'assets',\n `/static/toolbar.js?t=${timestampToNearestFiveMinutes}`\n )\n\n loadScript(toolbarUrl, (err) => {\n if (err) {\n logger.error('Failed to load toolbar', err)\n this.setToolbarState(ToolbarState.UNINITIALIZED)\n return\n }\n this.setToolbarState(ToolbarState.LOADED)\n this._callLoadToolbar(toolbarParams)\n })\n\n // Turbolinks doesn't fire an onload event but does replace the entire body, including the toolbar.\n // Thus, we ensure the toolbar is only loaded inside the body, and then reloaded on turbolinks:load.\n registerEvent(window, 'turbolinks:load', () => {\n this.setToolbarState(ToolbarState.UNINITIALIZED)\n this.loadToolbar(toolbarParams)\n })\n }\n\n return true\n }\n\n /** @deprecated Use \"loadToolbar\" instead. */\n _loadEditor(params: ToolbarParams): boolean {\n return this.loadToolbar(params)\n }\n\n /** @deprecated Use \"maybeLoadToolbar\" instead. */\n maybeLoadEditor(\n location: Location | undefined = undefined,\n localStorage: Storage | undefined = undefined,\n history: History | undefined = undefined\n ): boolean {\n return this.maybeLoadToolbar(location, localStorage, history)\n }\n}\n"]}
@@ -13,7 +13,7 @@ import { includes, registerEvent } from './utils';
13
13
  import RageClick from './extensions/rageclick';
14
14
  import { document, window } from './utils/globals';
15
15
  import { getParentElement, isTag } from './autocapture-utils';
16
- import { HEATMAPS_ENABLED_SERVER_SIDE } from './constants';
16
+ import { HEATMAPS_ENABLED_SERVER_SIDE, TOOLBAR_ID } from './constants';
17
17
  import { isUndefined } from './utils/type-utils';
18
18
  import { logger } from './utils/logger';
19
19
  function elementOrParentPositionMatches(el, matches, breakOnElement) {
@@ -29,7 +29,6 @@ function elementOrParentPositionMatches(el, matches, breakOnElement) {
29
29
  }
30
30
  return false;
31
31
  }
32
- var TOOLBAR_ID = '__POSTHOG_TOOLBAR__';
33
32
  function elementInToolbar(el) {
34
33
  var _a;
35
34
  // NOTE: .closest is not supported in IE11 hence the operator check
@@ -1 +1 @@
1
- {"version":3,"file":"heatmaps.js","sourceRoot":"","sources":["../../src/heatmaps.ts"],"names":[],"mappings":"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","sourcesContent":["import { includes, registerEvent } from './utils'\nimport RageClick from './extensions/rageclick'\nimport { DecideResponse, Properties } from './types'\nimport { PostHog } from './posthog-core'\n\nimport { document, window } from './utils/globals'\nimport { getParentElement, isTag } from './autocapture-utils'\nimport { HEATMAPS_ENABLED_SERVER_SIDE } from './constants'\nimport { isUndefined } from './utils/type-utils'\nimport { logger } from './utils/logger'\n\ntype HeatmapEventBuffer =\n | {\n [key: string]: Properties[]\n }\n | undefined\n\nfunction elementOrParentPositionMatches(el: Element, matches: string[], breakOnElement?: Element): boolean {\n let curEl: Element | false = el\n\n while (curEl && !isTag(curEl, 'body')) {\n if (curEl === breakOnElement) {\n return false\n }\n\n if (includes(matches, window?.getComputedStyle(curEl).position)) {\n return true\n }\n\n curEl = getParentElement(curEl)\n }\n\n return false\n}\n\nconst TOOLBAR_ID = '__POSTHOG_TOOLBAR__'\n\nfunction elementInToolbar(el: Element): boolean {\n // NOTE: .closest is not supported in IE11 hence the operator check\n return el.id === TOOLBAR_ID || !!el.closest?.('#' + TOOLBAR_ID)\n}\n\nexport class Heatmaps {\n instance: PostHog\n rageclicks = new RageClick()\n _enabledServerSide: boolean = false\n _initialized = false\n _mouseMoveTimeout: number | undefined\n\n // TODO: Periodically flush this if no other event has taken care of it\n private buffer: HeatmapEventBuffer\n\n constructor(instance: PostHog) {\n this.instance = instance\n this._enabledServerSide = !!this.instance.persistence?.props[HEATMAPS_ENABLED_SERVER_SIDE]\n }\n\n public startIfEnabled(): void {\n if (this.isEnabled && !this._initialized) {\n logger.info('[heatmaps] Heatmaps enabled, starting...')\n this._setupListeners()\n }\n }\n\n public get isEnabled(): boolean {\n return !isUndefined(this.instance.config.enable_heatmaps)\n ? this.instance.config.enable_heatmaps\n : this._enabledServerSide\n }\n\n public afterDecideResponse(response: DecideResponse) {\n const optIn = !!response['heatmaps']\n\n if (this.instance.persistence) {\n this.instance.persistence.register({\n [HEATMAPS_ENABLED_SERVER_SIDE]: optIn,\n })\n }\n // store this in-memory in case persistence is disabled\n this._enabledServerSide = optIn\n this.startIfEnabled()\n }\n\n public getAndClearBuffer(): HeatmapEventBuffer {\n const buffer = this.buffer\n this.buffer = undefined\n return buffer\n }\n\n private _setupListeners(): void {\n if (!window || !document) {\n return\n }\n\n registerEvent(document, 'click', (e) => this._onClick((e || window?.event) as MouseEvent), false, true)\n registerEvent(document, 'mousemove', (e) => this._onMouseMove((e || window?.event) as MouseEvent), false, true)\n\n this._initialized = true\n }\n\n private _getProperties(e: MouseEvent, type: string): Properties {\n // We need to know if the target element is fixed or not\n // If fixed then we won't account for scrolling\n // If not then we will account for scrolling\n\n const scrollY = this.instance.scrollManager.scrollY()\n const scrollX = this.instance.scrollManager.scrollX()\n const scrollElement = this.instance.scrollManager.scrollElement()\n\n const isFixedOrSticky = elementOrParentPositionMatches(e.target as Element, ['fixed', 'sticky'], scrollElement)\n\n return {\n x: e.clientX + (isFixedOrSticky ? 0 : scrollX),\n y: e.clientY + (isFixedOrSticky ? 0 : scrollY),\n target_fixed: isFixedOrSticky,\n type,\n }\n }\n\n private _onClick(e: MouseEvent): void {\n if (elementInToolbar(e.target as Element)) {\n return\n }\n const properties = this._getProperties(e, 'click')\n\n if (this.rageclicks?.isRageClick(e.clientX, e.clientY, new Date().getTime())) {\n this._capture({\n ...properties,\n type: 'rageclick',\n })\n }\n\n // TODO: Detect deadclicks\n\n this._capture(properties)\n }\n\n private _onMouseMove(e: Event): void {\n if (elementInToolbar(e.target as Element)) {\n return\n }\n clearTimeout(this._mouseMoveTimeout)\n\n this._mouseMoveTimeout = setTimeout(() => {\n this._capture(this._getProperties(e as MouseEvent, 'mousemove'))\n }, 500)\n }\n\n private _capture(properties: Properties): void {\n if (!window) {\n return\n }\n const url = window.location.href\n\n this.buffer = this.buffer || {}\n\n if (!this.buffer[url]) {\n this.buffer[url] = []\n }\n\n this.buffer[url].push(properties)\n }\n}\n"]}
1
+ {"version":3,"file":"heatmaps.js","sourceRoot":"","sources":["../../src/heatmaps.ts"],"names":[],"mappings":"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","sourcesContent":["import { includes, registerEvent } from './utils'\nimport RageClick from './extensions/rageclick'\nimport { DecideResponse, Properties } from './types'\nimport { PostHog } from './posthog-core'\n\nimport { document, window } from './utils/globals'\nimport { getParentElement, isTag } from './autocapture-utils'\nimport { HEATMAPS_ENABLED_SERVER_SIDE, TOOLBAR_ID } from './constants'\nimport { isUndefined } from './utils/type-utils'\nimport { logger } from './utils/logger'\n\ntype HeatmapEventBuffer =\n | {\n [key: string]: Properties[]\n }\n | undefined\n\nfunction elementOrParentPositionMatches(el: Element, matches: string[], breakOnElement?: Element): boolean {\n let curEl: Element | false = el\n\n while (curEl && !isTag(curEl, 'body')) {\n if (curEl === breakOnElement) {\n return false\n }\n\n if (includes(matches, window?.getComputedStyle(curEl).position)) {\n return true\n }\n\n curEl = getParentElement(curEl)\n }\n\n return false\n}\n\nfunction elementInToolbar(el: Element): boolean {\n // NOTE: .closest is not supported in IE11 hence the operator check\n return el.id === TOOLBAR_ID || !!el.closest?.('#' + TOOLBAR_ID)\n}\n\nexport class Heatmaps {\n instance: PostHog\n rageclicks = new RageClick()\n _enabledServerSide: boolean = false\n _initialized = false\n _mouseMoveTimeout: number | undefined\n\n // TODO: Periodically flush this if no other event has taken care of it\n private buffer: HeatmapEventBuffer\n\n constructor(instance: PostHog) {\n this.instance = instance\n this._enabledServerSide = !!this.instance.persistence?.props[HEATMAPS_ENABLED_SERVER_SIDE]\n }\n\n public startIfEnabled(): void {\n if (this.isEnabled && !this._initialized) {\n logger.info('[heatmaps] Heatmaps enabled, starting...')\n this._setupListeners()\n }\n }\n\n public get isEnabled(): boolean {\n return !isUndefined(this.instance.config.enable_heatmaps)\n ? this.instance.config.enable_heatmaps\n : this._enabledServerSide\n }\n\n public afterDecideResponse(response: DecideResponse) {\n const optIn = !!response['heatmaps']\n\n if (this.instance.persistence) {\n this.instance.persistence.register({\n [HEATMAPS_ENABLED_SERVER_SIDE]: optIn,\n })\n }\n // store this in-memory in case persistence is disabled\n this._enabledServerSide = optIn\n this.startIfEnabled()\n }\n\n public getAndClearBuffer(): HeatmapEventBuffer {\n const buffer = this.buffer\n this.buffer = undefined\n return buffer\n }\n\n private _setupListeners(): void {\n if (!window || !document) {\n return\n }\n\n registerEvent(document, 'click', (e) => this._onClick((e || window?.event) as MouseEvent), false, true)\n registerEvent(document, 'mousemove', (e) => this._onMouseMove((e || window?.event) as MouseEvent), false, true)\n\n this._initialized = true\n }\n\n private _getProperties(e: MouseEvent, type: string): Properties {\n // We need to know if the target element is fixed or not\n // If fixed then we won't account for scrolling\n // If not then we will account for scrolling\n\n const scrollY = this.instance.scrollManager.scrollY()\n const scrollX = this.instance.scrollManager.scrollX()\n const scrollElement = this.instance.scrollManager.scrollElement()\n\n const isFixedOrSticky = elementOrParentPositionMatches(e.target as Element, ['fixed', 'sticky'], scrollElement)\n\n return {\n x: e.clientX + (isFixedOrSticky ? 0 : scrollX),\n y: e.clientY + (isFixedOrSticky ? 0 : scrollY),\n target_fixed: isFixedOrSticky,\n type,\n }\n }\n\n private _onClick(e: MouseEvent): void {\n if (elementInToolbar(e.target as Element)) {\n return\n }\n const properties = this._getProperties(e, 'click')\n\n if (this.rageclicks?.isRageClick(e.clientX, e.clientY, new Date().getTime())) {\n this._capture({\n ...properties,\n type: 'rageclick',\n })\n }\n\n // TODO: Detect deadclicks\n\n this._capture(properties)\n }\n\n private _onMouseMove(e: Event): void {\n if (elementInToolbar(e.target as Element)) {\n return\n }\n clearTimeout(this._mouseMoveTimeout)\n\n this._mouseMoveTimeout = setTimeout(() => {\n this._capture(this._getProperties(e as MouseEvent, 'mousemove'))\n }, 500)\n }\n\n private _capture(properties: Properties): void {\n if (!window) {\n return\n }\n const url = window.location.href\n\n this.buffer = this.buffer || {}\n\n if (!this.buffer[url]) {\n this.buffer[url] = []\n }\n\n this.buffer[url].push(properties)\n }\n}\n"]}
@@ -300,7 +300,7 @@ var PostHog = /** @class */ (function () {
300
300
  this.config.persistence === 'sessionStorage'
301
301
  ? this.persistence
302
302
  : new PostHogPersistence(__assign(__assign({}, this.config), { persistence: 'sessionStorage' }));
303
- this._requestQueue = new RequestQueue(function (req) { return _this._send_request(req); });
303
+ this._requestQueue = new RequestQueue(function (req) { return _this._send_retriable_request(req); });
304
304
  this._retryQueue = new RetryQueue(this);
305
305
  this.__request_queue = [];
306
306
  this.sessionManager = new SessionIdManager(this.config, this.persistence);