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.
- package/dist/all-external-dependencies.js.map +1 -1
- package/dist/array.full.es5.js +1 -1
- package/dist/array.full.es5.js.map +1 -1
- package/dist/array.full.js +1 -1
- package/dist/array.full.js.map +1 -1
- package/dist/array.full.no-external.js +1 -1
- package/dist/array.full.no-external.js.map +1 -1
- package/dist/array.js +1 -1
- package/dist/array.js.map +1 -1
- package/dist/array.no-external.js +1 -1
- package/dist/array.no-external.js.map +1 -1
- package/dist/customizations.full.js +1 -1
- package/dist/exception-autocapture.js.map +1 -1
- package/dist/lazy-recorder.js +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/module.d.ts +2 -0
- package/dist/module.full.d.ts +2 -0
- package/dist/module.full.js +1 -1
- package/dist/module.full.js.map +1 -1
- package/dist/module.full.no-external.d.ts +2 -0
- package/dist/module.full.no-external.js +1 -1
- package/dist/module.full.no-external.js.map +1 -1
- package/dist/module.js +1 -1
- package/dist/module.js.map +1 -1
- package/dist/module.no-external.d.ts +2 -0
- package/dist/module.no-external.js +1 -1
- package/dist/module.no-external.js.map +1 -1
- package/dist/posthog-recorder.js +1 -1
- package/dist/src/request.d.ts +8 -1
- package/dist/src/retry-queue.d.ts +2 -0
- package/dist/surveys-preview.d.ts +2 -0
- package/dist/surveys-preview.js.map +1 -1
- package/dist/surveys.js.map +1 -1
- package/lib/package.json +1 -1
- package/lib/src/request.d.ts +8 -1
- package/lib/src/request.js +22 -8
- package/lib/src/request.js.map +1 -1
- package/lib/src/retry-queue.d.ts +2 -0
- package/lib/src/retry-queue.js +23 -5
- package/lib/src/retry-queue.js.map +1 -1
- package/package.json +1 -1
package/lib/package.json
CHANGED
package/lib/src/request.d.ts
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { RequestWithOptions } from './types';
|
|
2
2
|
export declare const SUPPORTS_REQUEST: boolean;
|
|
3
|
-
|
|
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;
|
package/lib/src/request.js
CHANGED
|
@@ -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
|
-
|
|
55
|
-
|
|
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('&').
|
|
58
|
-
var _a
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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) {
|
package/lib/src/request.js.map
CHANGED
|
@@ -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"]}
|
package/lib/src/retry-queue.d.ts
CHANGED
|
@@ -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;
|
package/lib/src/retry-queue.js
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
73
|
+
this._onlineListener = function () {
|
|
74
74
|
_this._areWeOnline = true;
|
|
75
75
|
_this._flush();
|
|
76
|
-
}
|
|
77
|
-
|
|
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