posthog-js 1.280.0 → 1.280.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/all-external-dependencies.js.map +1 -1
  2. package/dist/array.full.es5.js +1 -1
  3. package/dist/array.full.es5.js.map +1 -1
  4. package/dist/array.full.js +1 -1
  5. package/dist/array.full.js.map +1 -1
  6. package/dist/array.full.no-external.js +1 -1
  7. package/dist/array.full.no-external.js.map +1 -1
  8. package/dist/array.js +1 -1
  9. package/dist/array.js.map +1 -1
  10. package/dist/array.no-external.js +1 -1
  11. package/dist/array.no-external.js.map +1 -1
  12. package/dist/customizations.full.js +1 -1
  13. package/dist/exception-autocapture.js.map +1 -1
  14. package/dist/lazy-recorder.js +1 -1
  15. package/dist/main.js +1 -1
  16. package/dist/main.js.map +1 -1
  17. package/dist/module.d.ts +2 -0
  18. package/dist/module.full.d.ts +2 -0
  19. package/dist/module.full.js +1 -1
  20. package/dist/module.full.js.map +1 -1
  21. package/dist/module.full.no-external.d.ts +2 -0
  22. package/dist/module.full.no-external.js +1 -1
  23. package/dist/module.full.no-external.js.map +1 -1
  24. package/dist/module.js +1 -1
  25. package/dist/module.js.map +1 -1
  26. package/dist/module.no-external.d.ts +2 -0
  27. package/dist/module.no-external.js +1 -1
  28. package/dist/module.no-external.js.map +1 -1
  29. package/dist/posthog-recorder.js +1 -1
  30. package/dist/src/request.d.ts +8 -1
  31. package/dist/src/retry-queue.d.ts +2 -0
  32. package/dist/surveys-preview.d.ts +2 -0
  33. package/dist/surveys-preview.js.map +1 -1
  34. package/dist/surveys.js.map +1 -1
  35. package/lib/package.json +1 -1
  36. package/lib/src/request.d.ts +8 -1
  37. package/lib/src/request.js +22 -8
  38. package/lib/src/request.js.map +1 -1
  39. package/lib/src/retry-queue.d.ts +2 -0
  40. package/lib/src/retry-queue.js +23 -5
  41. package/lib/src/retry-queue.js.map +1 -1
  42. package/package.json +1 -1
package/lib/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "posthog-js",
3
- "version": "1.280.0",
3
+ "version": "1.280.1",
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",
@@ -1,5 +1,12 @@
1
1
  import { RequestWithOptions } from './types';
2
2
  export declare const SUPPORTS_REQUEST: boolean;
3
- export declare const extendURLParams: (url: string, params: Record<string, any>) => string;
3
+ /**
4
+ * Extends a URL with additional query parameters
5
+ * @param url - The URL to extend
6
+ * @param params - The parameters to add
7
+ * @param replace - When true (default), new params overwrite existing ones with same key. When false, existing params are preserved.
8
+ * @returns The URL with extended parameters
9
+ */
10
+ export declare const extendURLParams: (url: string, params: Record<string, any>, replace?: boolean) => string;
4
11
  export declare const jsonStringify: (data: any, space?: string | number) => string;
5
12
  export declare const request: (_options: RequestWithOptions) => void;
@@ -51,16 +51,30 @@ var SIXTY_FOUR_KILOBYTES = 64 * 1024;
51
51
  any overhead doesn't push over the threshold after checking here
52
52
  */
53
53
  var KEEP_ALIVE_THRESHOLD = SIXTY_FOUR_KILOBYTES * 0.8;
54
- var extendURLParams = function (url, params) {
55
- var _a = __read(url.split('?'), 2), baseUrl = _a[0], search = _a[1];
54
+ /**
55
+ * Extends a URL with additional query parameters
56
+ * @param url - The URL to extend
57
+ * @param params - The parameters to add
58
+ * @param replace - When true (default), new params overwrite existing ones with same key. When false, existing params are preserved.
59
+ * @returns The URL with extended parameters
60
+ */
61
+ var extendURLParams = function (url, params, replace) {
62
+ var _a;
63
+ if (replace === void 0) { replace = true; }
64
+ var _b = __read(url.split('?'), 2), baseUrl = _b[0], search = _b[1];
56
65
  var newParams = __assign({}, params);
57
- search === null || search === void 0 ? void 0 : search.split('&').forEach(function (pair) {
58
- var _a = __read(pair.split('='), 1), key = _a[0];
66
+ var updatedSearch = (_a = search === null || search === void 0 ? void 0 : search.split('&').map(function (pair) {
67
+ var _a;
68
+ var _b = __read(pair.split('='), 2), key = _b[0], origValue = _b[1];
69
+ var value = replace ? ((_a = newParams[key]) !== null && _a !== void 0 ? _a : origValue) : origValue;
59
70
  delete newParams[key];
60
- });
61
- var newSearch = (0, request_utils_1.formDataToQuery)(newParams);
62
- newSearch = newSearch ? (search ? search + '&' : '') + newSearch : search;
63
- return "".concat(baseUrl, "?").concat(newSearch);
71
+ return "".concat(key, "=").concat(value);
72
+ })) !== null && _a !== void 0 ? _a : [];
73
+ var remaining = (0, request_utils_1.formDataToQuery)(newParams);
74
+ if (remaining) {
75
+ updatedSearch.push(remaining);
76
+ }
77
+ return "".concat(baseUrl, "?").concat(updatedSearch.join('&'));
64
78
  };
65
79
  exports.extendURLParams = extendURLParams;
66
80
  var jsonStringify = function (data, space) {
@@ -1 +1 @@
1
- {"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/request.ts"],"names":[],"mappings":"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","sourcesContent":["import { each, find } from './utils'\nimport Config from './config'\nimport { Compression, RequestWithOptions, RequestResponse } from './types'\nimport { formDataToQuery } from './utils/request-utils'\n\nimport { logger } from './utils/logger'\nimport { AbortController, fetch, navigator, XMLHttpRequest } from './utils/globals'\nimport { gzipSync, strToU8 } from 'fflate'\n\nimport { _base64Encode } from './utils/encode-utils'\n\n// eslint-disable-next-line compat/compat\nexport const SUPPORTS_REQUEST = !!XMLHttpRequest || !!fetch\n\nconst CONTENT_TYPE_PLAIN = 'text/plain'\nconst CONTENT_TYPE_JSON = 'application/json'\nconst CONTENT_TYPE_FORM = 'application/x-www-form-urlencoded'\nconst SIXTY_FOUR_KILOBYTES = 64 * 1024\n/*\n fetch will fail if we request keepalive with a body greater than 64kb\n sets the threshold lower than that so that\n any overhead doesn't push over the threshold after checking here\n*/\nconst KEEP_ALIVE_THRESHOLD = SIXTY_FOUR_KILOBYTES * 0.8\ntype EncodedBody = {\n contentType: string\n body: string | BlobPart\n estimatedSize: number\n}\n\nexport const extendURLParams = (url: string, params: Record<string, any>): string => {\n const [baseUrl, search] = url.split('?')\n const newParams = { ...params }\n\n search?.split('&').forEach((pair) => {\n const [key] = pair.split('=')\n delete newParams[key]\n })\n\n let newSearch = formDataToQuery(newParams)\n newSearch = newSearch ? (search ? search + '&' : '') + newSearch : search\n\n return `${baseUrl}?${newSearch}`\n}\n\nexport const jsonStringify = (data: any, space?: string | number): string => {\n // With plain JSON.stringify, we get an exception when a property is a BigInt. This has caused problems for some users,\n // see https://github.com/PostHog/posthog-js/issues/1440\n // To work around this, we convert BigInts to strings before stringifying the data. This is not ideal, as we lose\n // information that this was originally a number, but given ClickHouse doesn't support BigInts, the customer\n // would not be able to operate on these numerically anyway.\n return JSON.stringify(data, (_, value) => (typeof value === 'bigint' ? value.toString() : value), space)\n}\n\nconst encodeToDataString = (data: string | Record<string, any>): string => {\n return 'data=' + encodeURIComponent(typeof data === 'string' ? data : jsonStringify(data))\n}\n\nconst encodePostData = ({ data, compression }: RequestWithOptions): EncodedBody | undefined => {\n if (!data) {\n return\n }\n\n if (compression === Compression.GZipJS) {\n const gzipData = gzipSync(strToU8(jsonStringify(data)), { mtime: 0 })\n const blob = new Blob([gzipData], { type: CONTENT_TYPE_PLAIN })\n return {\n contentType: CONTENT_TYPE_PLAIN,\n body: blob,\n estimatedSize: blob.size,\n }\n }\n\n if (compression === Compression.Base64) {\n const b64data = _base64Encode(jsonStringify(data))\n const encodedBody = encodeToDataString(b64data)\n\n return {\n contentType: CONTENT_TYPE_FORM,\n body: encodedBody,\n estimatedSize: new Blob([encodedBody]).size,\n }\n }\n\n const jsonBody = jsonStringify(data)\n return {\n contentType: CONTENT_TYPE_JSON,\n body: jsonBody,\n estimatedSize: new Blob([jsonBody]).size,\n }\n}\n\nconst xhr = (options: RequestWithOptions) => {\n const req = new XMLHttpRequest!()\n req.open(options.method || 'GET', options.url, true)\n const { contentType, body } = encodePostData(options) ?? {}\n\n each(options.headers, function (headerValue, headerName) {\n req.setRequestHeader(headerName, headerValue)\n })\n\n if (contentType) {\n req.setRequestHeader('Content-Type', contentType)\n }\n\n if (options.timeout) {\n req.timeout = options.timeout\n }\n if (!options.disableXHRCredentials) {\n // send the ph_optout cookie\n // withCredentials cannot be modified until after calling .open on Android and Mobile Safari\n req.withCredentials = true\n }\n req.onreadystatechange = () => {\n // XMLHttpRequest.DONE == 4, except in safari 4\n if (req.readyState === 4) {\n const response: RequestResponse = {\n statusCode: req.status,\n text: req.responseText,\n }\n if (req.status === 200) {\n try {\n response.json = JSON.parse(req.responseText)\n } catch {\n // logger.error(e)\n }\n }\n\n options.callback?.(response)\n }\n }\n req.send(body)\n}\n\nconst _fetch = (options: RequestWithOptions) => {\n const { contentType, body, estimatedSize } = encodePostData(options) ?? {}\n\n // eslint-disable-next-line compat/compat\n const headers = new Headers()\n each(options.headers, function (headerValue, headerName) {\n headers.append(headerName, headerValue)\n })\n\n if (contentType) {\n headers.append('Content-Type', contentType)\n }\n\n const url = options.url\n let aborter: { signal: any; timeout: ReturnType<typeof setTimeout> } | null = null\n\n if (AbortController) {\n const controller = new AbortController()\n aborter = {\n signal: controller.signal,\n timeout: setTimeout(() => controller.abort(), options.timeout),\n }\n }\n\n fetch!(url, {\n method: options?.method || 'GET',\n headers,\n // if body is greater than 64kb, then fetch with keepalive will error\n // see 8:10:5 at https://fetch.spec.whatwg.org/#http-network-or-cache-fetch,\n // but we do want to set keepalive sometimes as it can help with success\n // when e.g. a page is being closed\n // so let's get the best of both worlds and only set keepalive for POST requests\n // where the body is less than 64kb\n // NB this is fetch keepalive and not http keepalive\n keepalive: options.method === 'POST' && (estimatedSize || 0) < KEEP_ALIVE_THRESHOLD,\n body,\n signal: aborter?.signal,\n ...options.fetchOptions,\n })\n .then((response) => {\n return response.text().then((responseText) => {\n const res: RequestResponse = {\n statusCode: response.status,\n text: responseText,\n }\n\n if (response.status === 200) {\n try {\n res.json = JSON.parse(responseText)\n } catch (e) {\n logger.error(e)\n }\n }\n\n options.callback?.(res)\n })\n })\n .catch((error) => {\n logger.error(error)\n options.callback?.({ statusCode: 0, text: error })\n })\n .finally(() => (aborter ? clearTimeout(aborter.timeout) : null))\n\n return\n}\n\nconst _sendBeacon = (options: RequestWithOptions) => {\n // beacon documentation https://w3c.github.io/beacon/\n // beacons format the message and use the type property\n\n const url = extendURLParams(options.url, {\n beacon: '1',\n })\n\n try {\n const { contentType, body } = encodePostData(options) ?? {}\n // sendBeacon requires a blob so we convert it\n const sendBeaconBody = typeof body === 'string' ? new Blob([body], { type: contentType }) : body\n navigator!.sendBeacon!(url, sendBeaconBody)\n } catch {\n // send beacon is a best-effort, fire-and-forget mechanism on page unload,\n // we don't want to throw errors here\n }\n}\n\nconst AVAILABLE_TRANSPORTS: {\n transport: RequestWithOptions['transport']\n method: (options: RequestWithOptions) => void\n}[] = []\n\n// We add the transports in order of preference\nif (fetch) {\n AVAILABLE_TRANSPORTS.push({\n transport: 'fetch',\n method: _fetch,\n })\n}\n\nif (XMLHttpRequest) {\n AVAILABLE_TRANSPORTS.push({\n transport: 'XHR',\n method: xhr,\n })\n}\n\nif (navigator?.sendBeacon) {\n AVAILABLE_TRANSPORTS.push({\n transport: 'sendBeacon',\n method: _sendBeacon,\n })\n}\n\n// This is the entrypoint. It takes care of sanitizing the options and then calls the appropriate request method.\nexport const request = (_options: RequestWithOptions) => {\n // Clone the options so we don't modify the original object\n const options = { ..._options }\n options.timeout = options.timeout || 60000\n\n options.url = extendURLParams(options.url, {\n _: new Date().getTime().toString(),\n ver: Config.LIB_VERSION,\n compression: options.compression,\n })\n\n const transport = options.transport ?? 'fetch'\n\n const availableTransports = AVAILABLE_TRANSPORTS.filter(\n (t) => !options.disableTransport || !t.transport || !options.disableTransport.includes(t.transport)\n )\n\n const transportMethod =\n find(availableTransports, (t) => t.transport === transport)?.method ?? availableTransports[0].method\n\n if (!transportMethod) {\n throw new Error('No available transport method')\n }\n\n transportMethod(options)\n}\n"]}
1
+ {"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/request.ts"],"names":[],"mappings":"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","sourcesContent":["import { each, find } from './utils'\nimport Config from './config'\nimport { Compression, RequestWithOptions, RequestResponse } from './types'\nimport { formDataToQuery } from './utils/request-utils'\n\nimport { logger } from './utils/logger'\nimport { AbortController, fetch, navigator, XMLHttpRequest } from './utils/globals'\nimport { gzipSync, strToU8 } from 'fflate'\n\nimport { _base64Encode } from './utils/encode-utils'\n\n// eslint-disable-next-line compat/compat\nexport const SUPPORTS_REQUEST = !!XMLHttpRequest || !!fetch\n\nconst CONTENT_TYPE_PLAIN = 'text/plain'\nconst CONTENT_TYPE_JSON = 'application/json'\nconst CONTENT_TYPE_FORM = 'application/x-www-form-urlencoded'\nconst SIXTY_FOUR_KILOBYTES = 64 * 1024\n/*\n fetch will fail if we request keepalive with a body greater than 64kb\n sets the threshold lower than that so that\n any overhead doesn't push over the threshold after checking here\n*/\nconst KEEP_ALIVE_THRESHOLD = SIXTY_FOUR_KILOBYTES * 0.8\ntype EncodedBody = {\n contentType: string\n body: string | BlobPart\n estimatedSize: number\n}\n\n/**\n * Extends a URL with additional query parameters\n * @param url - The URL to extend\n * @param params - The parameters to add\n * @param replace - When true (default), new params overwrite existing ones with same key. When false, existing params are preserved.\n * @returns The URL with extended parameters\n */\nexport const extendURLParams = (url: string, params: Record<string, any>, replace: boolean = true): string => {\n const [baseUrl, search] = url.split('?')\n const newParams = { ...params }\n\n const updatedSearch =\n search?.split('&').map((pair) => {\n const [key, origValue] = pair.split('=')\n const value = replace ? (newParams[key] ?? origValue) : origValue\n delete newParams[key]\n return `${key}=${value}`\n }) ?? []\n\n const remaining = formDataToQuery(newParams)\n if (remaining) {\n updatedSearch.push(remaining)\n }\n\n return `${baseUrl}?${updatedSearch.join('&')}`\n}\n\nexport const jsonStringify = (data: any, space?: string | number): string => {\n // With plain JSON.stringify, we get an exception when a property is a BigInt. This has caused problems for some users,\n // see https://github.com/PostHog/posthog-js/issues/1440\n // To work around this, we convert BigInts to strings before stringifying the data. This is not ideal, as we lose\n // information that this was originally a number, but given ClickHouse doesn't support BigInts, the customer\n // would not be able to operate on these numerically anyway.\n return JSON.stringify(data, (_, value) => (typeof value === 'bigint' ? value.toString() : value), space)\n}\n\nconst encodeToDataString = (data: string | Record<string, any>): string => {\n return 'data=' + encodeURIComponent(typeof data === 'string' ? data : jsonStringify(data))\n}\n\nconst encodePostData = ({ data, compression }: RequestWithOptions): EncodedBody | undefined => {\n if (!data) {\n return\n }\n\n if (compression === Compression.GZipJS) {\n const gzipData = gzipSync(strToU8(jsonStringify(data)), { mtime: 0 })\n const blob = new Blob([gzipData], { type: CONTENT_TYPE_PLAIN })\n return {\n contentType: CONTENT_TYPE_PLAIN,\n body: blob,\n estimatedSize: blob.size,\n }\n }\n\n if (compression === Compression.Base64) {\n const b64data = _base64Encode(jsonStringify(data))\n const encodedBody = encodeToDataString(b64data)\n\n return {\n contentType: CONTENT_TYPE_FORM,\n body: encodedBody,\n estimatedSize: new Blob([encodedBody]).size,\n }\n }\n\n const jsonBody = jsonStringify(data)\n return {\n contentType: CONTENT_TYPE_JSON,\n body: jsonBody,\n estimatedSize: new Blob([jsonBody]).size,\n }\n}\n\nconst xhr = (options: RequestWithOptions) => {\n const req = new XMLHttpRequest!()\n req.open(options.method || 'GET', options.url, true)\n const { contentType, body } = encodePostData(options) ?? {}\n\n each(options.headers, function (headerValue, headerName) {\n req.setRequestHeader(headerName, headerValue)\n })\n\n if (contentType) {\n req.setRequestHeader('Content-Type', contentType)\n }\n\n if (options.timeout) {\n req.timeout = options.timeout\n }\n if (!options.disableXHRCredentials) {\n // send the ph_optout cookie\n // withCredentials cannot be modified until after calling .open on Android and Mobile Safari\n req.withCredentials = true\n }\n req.onreadystatechange = () => {\n // XMLHttpRequest.DONE == 4, except in safari 4\n if (req.readyState === 4) {\n const response: RequestResponse = {\n statusCode: req.status,\n text: req.responseText,\n }\n if (req.status === 200) {\n try {\n response.json = JSON.parse(req.responseText)\n } catch {\n // logger.error(e)\n }\n }\n\n options.callback?.(response)\n }\n }\n req.send(body)\n}\n\nconst _fetch = (options: RequestWithOptions) => {\n const { contentType, body, estimatedSize } = encodePostData(options) ?? {}\n\n // eslint-disable-next-line compat/compat\n const headers = new Headers()\n each(options.headers, function (headerValue, headerName) {\n headers.append(headerName, headerValue)\n })\n\n if (contentType) {\n headers.append('Content-Type', contentType)\n }\n\n const url = options.url\n let aborter: { signal: any; timeout: ReturnType<typeof setTimeout> } | null = null\n\n if (AbortController) {\n const controller = new AbortController()\n aborter = {\n signal: controller.signal,\n timeout: setTimeout(() => controller.abort(), options.timeout),\n }\n }\n\n fetch!(url, {\n method: options?.method || 'GET',\n headers,\n // if body is greater than 64kb, then fetch with keepalive will error\n // see 8:10:5 at https://fetch.spec.whatwg.org/#http-network-or-cache-fetch,\n // but we do want to set keepalive sometimes as it can help with success\n // when e.g. a page is being closed\n // so let's get the best of both worlds and only set keepalive for POST requests\n // where the body is less than 64kb\n // NB this is fetch keepalive and not http keepalive\n keepalive: options.method === 'POST' && (estimatedSize || 0) < KEEP_ALIVE_THRESHOLD,\n body,\n signal: aborter?.signal,\n ...options.fetchOptions,\n })\n .then((response) => {\n return response.text().then((responseText) => {\n const res: RequestResponse = {\n statusCode: response.status,\n text: responseText,\n }\n\n if (response.status === 200) {\n try {\n res.json = JSON.parse(responseText)\n } catch (e) {\n logger.error(e)\n }\n }\n\n options.callback?.(res)\n })\n })\n .catch((error) => {\n logger.error(error)\n options.callback?.({ statusCode: 0, text: error })\n })\n .finally(() => (aborter ? clearTimeout(aborter.timeout) : null))\n\n return\n}\n\nconst _sendBeacon = (options: RequestWithOptions) => {\n // beacon documentation https://w3c.github.io/beacon/\n // beacons format the message and use the type property\n\n const url = extendURLParams(options.url, {\n beacon: '1',\n })\n\n try {\n const { contentType, body } = encodePostData(options) ?? {}\n // sendBeacon requires a blob so we convert it\n const sendBeaconBody = typeof body === 'string' ? new Blob([body], { type: contentType }) : body\n navigator!.sendBeacon!(url, sendBeaconBody)\n } catch {\n // send beacon is a best-effort, fire-and-forget mechanism on page unload,\n // we don't want to throw errors here\n }\n}\n\nconst AVAILABLE_TRANSPORTS: {\n transport: RequestWithOptions['transport']\n method: (options: RequestWithOptions) => void\n}[] = []\n\n// We add the transports in order of preference\nif (fetch) {\n AVAILABLE_TRANSPORTS.push({\n transport: 'fetch',\n method: _fetch,\n })\n}\n\nif (XMLHttpRequest) {\n AVAILABLE_TRANSPORTS.push({\n transport: 'XHR',\n method: xhr,\n })\n}\n\nif (navigator?.sendBeacon) {\n AVAILABLE_TRANSPORTS.push({\n transport: 'sendBeacon',\n method: _sendBeacon,\n })\n}\n\n// This is the entrypoint. It takes care of sanitizing the options and then calls the appropriate request method.\nexport const request = (_options: RequestWithOptions) => {\n // Clone the options so we don't modify the original object\n const options = { ..._options }\n options.timeout = options.timeout || 60000\n\n options.url = extendURLParams(options.url, {\n _: new Date().getTime().toString(),\n ver: Config.LIB_VERSION,\n compression: options.compression,\n })\n\n const transport = options.transport ?? 'fetch'\n\n const availableTransports = AVAILABLE_TRANSPORTS.filter(\n (t) => !options.disableTransport || !t.transport || !options.disableTransport.includes(t.transport)\n )\n\n const transportMethod =\n find(availableTransports, (t) => t.transport === transport)?.method ?? availableTransports[0].method\n\n if (!transportMethod) {\n throw new Error('No available transport method')\n }\n\n transportMethod(options)\n}\n"]}
@@ -18,6 +18,8 @@ export declare class RetryQueue {
18
18
  private _pollIntervalMs;
19
19
  private _queue;
20
20
  private _areWeOnline;
21
+ private _onlineListener;
22
+ private _offlineListener;
21
23
  constructor(_instance: PostHog);
22
24
  get length(): number;
23
25
  retriableRequest({ retriesPerformedSoFar, ...options }: RetriableRequestWithOptions): void;
@@ -63,20 +63,22 @@ var RetryQueue = /** @class */ (function () {
63
63
  function RetryQueue(_instance) {
64
64
  var _this = this;
65
65
  this._instance = _instance;
66
- this._isPolling = false; // flag to continue to recursively poll or not
66
+ this._isPolling = false;
67
67
  this._pollIntervalMs = 3000;
68
68
  this._queue = [];
69
69
  this._queue = [];
70
70
  this._areWeOnline = true;
71
71
  if (!(0, core_1.isUndefined)(globals_1.window) && 'onLine' in globals_1.window.navigator) {
72
72
  this._areWeOnline = globals_1.window.navigator.onLine;
73
- (0, utils_1.addEventListener)(globals_1.window, 'online', function () {
73
+ this._onlineListener = function () {
74
74
  _this._areWeOnline = true;
75
75
  _this._flush();
76
- });
77
- (0, utils_1.addEventListener)(globals_1.window, 'offline', function () {
76
+ };
77
+ this._offlineListener = function () {
78
78
  _this._areWeOnline = false;
79
- });
79
+ };
80
+ (0, utils_1.addEventListener)(globals_1.window, 'online', this._onlineListener);
81
+ (0, utils_1.addEventListener)(globals_1.window, 'offline', this._offlineListener);
80
82
  }
81
83
  }
82
84
  Object.defineProperty(RetryQueue.prototype, "length", {
@@ -122,6 +124,11 @@ var RetryQueue = /** @class */ (function () {
122
124
  RetryQueue.prototype._poll = function () {
123
125
  var _this = this;
124
126
  this._poller && clearTimeout(this._poller);
127
+ if (this._queue.length === 0) {
128
+ this._isPolling = false;
129
+ this._poller = undefined;
130
+ return;
131
+ }
125
132
  this._poller = setTimeout(function () {
126
133
  if (_this._areWeOnline && _this._queue.length > 0) {
127
134
  _this._flush();
@@ -163,6 +170,17 @@ var RetryQueue = /** @class */ (function () {
163
170
  clearTimeout(this._poller);
164
171
  this._poller = undefined;
165
172
  }
173
+ this._isPolling = false;
174
+ if (!(0, core_1.isUndefined)(globals_1.window)) {
175
+ if (this._onlineListener) {
176
+ globals_1.window.removeEventListener('online', this._onlineListener);
177
+ this._onlineListener = undefined;
178
+ }
179
+ if (this._offlineListener) {
180
+ globals_1.window.removeEventListener('offline', this._offlineListener);
181
+ this._offlineListener = undefined;
182
+ }
183
+ }
166
184
  try {
167
185
  for (var _b = __values(this._queue), _c = _b.next(); !_c.done; _c = _b.next()) {
168
186
  var requestOptions = _c.value.requestOptions;
@@ -1 +1 @@
1
- {"version":3,"file":"retry-queue.js","sourceRoot":"","sources":["../../src/retry-queue.ts"],"names":[],"mappings":"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","sourcesContent":["import { RetriableRequestWithOptions } from './types'\n\nimport { isNumber, isUndefined } from '@posthog/core'\nimport { logger } from './utils/logger'\nimport { window } from './utils/globals'\nimport { PostHog } from './posthog-core'\nimport { extendURLParams } from './request'\nimport { addEventListener } from './utils'\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\ninterface RetryQueueElement {\n retryAt: number\n requestOptions: RetriableRequestWithOptions\n}\n\nexport class RetryQueue {\n private _isPolling: boolean = false // flag to continue to recursively poll or not\n private _poller: number | undefined // to become interval for reference to clear later\n private _pollIntervalMs: number = 3000\n private _queue: RetryQueueElement[] = []\n private _areWeOnline: boolean\n\n constructor(private _instance: PostHog) {\n this._queue = []\n this._areWeOnline = true\n\n if (!isUndefined(window) && 'onLine' in window.navigator) {\n this._areWeOnline = window.navigator.onLine\n\n addEventListener(window, 'online', () => {\n this._areWeOnline = true\n this._flush()\n })\n\n addEventListener(window, 'offline', () => {\n this._areWeOnline = false\n })\n }\n }\n\n get length() {\n return this._queue.length\n }\n\n retriableRequest({ retriesPerformedSoFar, ...options }: RetriableRequestWithOptions): void {\n if (isNumber(retriesPerformedSoFar) && retriesPerformedSoFar > 0) {\n options.url = extendURLParams(options.url, { retry_count: retriesPerformedSoFar })\n }\n\n this._instance._send_request({\n ...options,\n callback: (response) => {\n if (response.statusCode !== 200 && (response.statusCode < 400 || response.statusCode >= 500)) {\n if ((retriesPerformedSoFar ?? 0) < 10) {\n this._enqueue({\n retriesPerformedSoFar,\n ...options,\n })\n return\n }\n }\n\n options.callback?.(response)\n },\n })\n }\n\n private _enqueue(requestOptions: RetriableRequestWithOptions): void {\n const retriesPerformedSoFar = requestOptions.retriesPerformedSoFar || 0\n requestOptions.retriesPerformedSoFar = retriesPerformedSoFar + 1\n\n const msToNextRetry = pickNextRetryDelay(retriesPerformedSoFar)\n const retryAt = Date.now() + msToNextRetry\n\n this._queue.push({ retryAt, requestOptions })\n\n let logMessage = `Enqueued failed request for retry in ${msToNextRetry}`\n if (!navigator.onLine) {\n logMessage += ' (Browser is offline)'\n }\n logger.warn(logMessage)\n\n if (!this._isPolling) {\n this._isPolling = true\n this._poll()\n }\n }\n\n private _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._pollIntervalMs) as any as number\n }\n\n private _flush(): void {\n const now = Date.now()\n const notToFlush: RetryQueueElement[] = []\n const toFlush = this._queue.filter((item) => {\n if (item.retryAt < now) {\n return true\n }\n notToFlush.push(item)\n return false\n })\n\n this._queue = notToFlush\n\n if (toFlush.length > 0) {\n for (const { requestOptions } of toFlush) {\n this.retriableRequest(requestOptions)\n }\n }\n }\n\n unload(): void {\n if (this._poller) {\n clearTimeout(this._poller)\n this._poller = undefined\n }\n\n for (const { requestOptions } of this._queue) {\n try {\n // we've had send beacon in place for at least 2 years\n // eslint-disable-next-line compat/compat\n this._instance._send_request({\n ...requestOptions,\n transport: 'sendBeacon',\n })\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"]}
1
+ {"version":3,"file":"retry-queue.js","sourceRoot":"","sources":["../../src/retry-queue.ts"],"names":[],"mappings":"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","sourcesContent":["import { RetriableRequestWithOptions } from './types'\n\nimport { isNumber, isUndefined } from '@posthog/core'\nimport { logger } from './utils/logger'\nimport { window } from './utils/globals'\nimport { PostHog } from './posthog-core'\nimport { extendURLParams } from './request'\nimport { addEventListener } from './utils'\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\ninterface RetryQueueElement {\n retryAt: number\n requestOptions: RetriableRequestWithOptions\n}\n\nexport class RetryQueue {\n private _isPolling: boolean = false\n private _poller: number | undefined\n private _pollIntervalMs: number = 3000\n private _queue: RetryQueueElement[] = []\n private _areWeOnline: boolean\n private _onlineListener: (() => void) | undefined\n private _offlineListener: (() => void) | undefined\n\n constructor(private _instance: PostHog) {\n this._queue = []\n this._areWeOnline = true\n\n if (!isUndefined(window) && 'onLine' in window.navigator) {\n this._areWeOnline = window.navigator.onLine\n\n this._onlineListener = () => {\n this._areWeOnline = true\n this._flush()\n }\n\n this._offlineListener = () => {\n this._areWeOnline = false\n }\n\n addEventListener(window, 'online', this._onlineListener)\n addEventListener(window, 'offline', this._offlineListener)\n }\n }\n\n get length() {\n return this._queue.length\n }\n\n retriableRequest({ retriesPerformedSoFar, ...options }: RetriableRequestWithOptions): void {\n if (isNumber(retriesPerformedSoFar) && retriesPerformedSoFar > 0) {\n options.url = extendURLParams(options.url, { retry_count: retriesPerformedSoFar })\n }\n\n this._instance._send_request({\n ...options,\n callback: (response) => {\n if (response.statusCode !== 200 && (response.statusCode < 400 || response.statusCode >= 500)) {\n if ((retriesPerformedSoFar ?? 0) < 10) {\n this._enqueue({\n retriesPerformedSoFar,\n ...options,\n })\n return\n }\n }\n\n options.callback?.(response)\n },\n })\n }\n\n private _enqueue(requestOptions: RetriableRequestWithOptions): void {\n const retriesPerformedSoFar = requestOptions.retriesPerformedSoFar || 0\n requestOptions.retriesPerformedSoFar = retriesPerformedSoFar + 1\n\n const msToNextRetry = pickNextRetryDelay(retriesPerformedSoFar)\n const retryAt = Date.now() + msToNextRetry\n\n this._queue.push({ retryAt, requestOptions })\n\n let logMessage = `Enqueued failed request for retry in ${msToNextRetry}`\n if (!navigator.onLine) {\n logMessage += ' (Browser is offline)'\n }\n logger.warn(logMessage)\n\n if (!this._isPolling) {\n this._isPolling = true\n this._poll()\n }\n }\n\n private _poll(): void {\n this._poller && clearTimeout(this._poller)\n\n if (this._queue.length === 0) {\n this._isPolling = false\n this._poller = undefined\n return\n }\n\n this._poller = setTimeout(() => {\n if (this._areWeOnline && this._queue.length > 0) {\n this._flush()\n }\n this._poll()\n }, this._pollIntervalMs) as any as number\n }\n\n private _flush(): void {\n const now = Date.now()\n const notToFlush: RetryQueueElement[] = []\n const toFlush = this._queue.filter((item) => {\n if (item.retryAt < now) {\n return true\n }\n notToFlush.push(item)\n return false\n })\n\n this._queue = notToFlush\n\n if (toFlush.length > 0) {\n for (const { requestOptions } of toFlush) {\n this.retriableRequest(requestOptions)\n }\n }\n }\n\n unload(): void {\n if (this._poller) {\n clearTimeout(this._poller)\n this._poller = undefined\n }\n\n this._isPolling = false\n\n if (!isUndefined(window)) {\n if (this._onlineListener) {\n window.removeEventListener('online', this._onlineListener)\n this._onlineListener = undefined\n }\n if (this._offlineListener) {\n window.removeEventListener('offline', this._offlineListener)\n this._offlineListener = undefined\n }\n }\n\n for (const { requestOptions } of this._queue) {\n try {\n // we've had send beacon in place for at least 2 years\n // eslint-disable-next-line compat/compat\n this._instance._send_request({\n ...requestOptions,\n transport: 'sendBeacon',\n })\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "posthog-js",
3
- "version": "1.280.0",
3
+ "version": "1.280.1",
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",