posthog-js 1.174.2 → 1.174.4

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 (40) hide show
  1. package/dist/all-external-dependencies.js +1 -15
  2. package/dist/all-external-dependencies.js.map +1 -1
  3. package/dist/array.full.es5.js +1 -1
  4. package/dist/array.full.es5.js.map +1 -1
  5. package/dist/array.full.js +2 -16
  6. package/dist/array.full.js.map +1 -1
  7. package/dist/array.full.no-external.js +2 -16
  8. package/dist/array.full.no-external.js.map +1 -1
  9. package/dist/array.js +2 -2
  10. package/dist/array.js.map +1 -1
  11. package/dist/array.no-external.js +2 -2
  12. package/dist/array.no-external.js.map +1 -1
  13. package/dist/main.js +2 -2
  14. package/dist/main.js.map +1 -1
  15. package/dist/module.d.ts +1 -0
  16. package/dist/module.full.d.ts +1 -0
  17. package/dist/module.full.js +2 -16
  18. package/dist/module.full.js.map +1 -1
  19. package/dist/module.full.no-external.d.ts +1 -0
  20. package/dist/module.full.no-external.js +2 -16
  21. package/dist/module.full.no-external.js.map +1 -1
  22. package/dist/module.js +2 -2
  23. package/dist/module.js.map +1 -1
  24. package/dist/module.no-external.d.ts +1 -0
  25. package/dist/module.no-external.js +2 -2
  26. package/dist/module.no-external.js.map +1 -1
  27. package/dist/recorder-v2.js +1 -15
  28. package/dist/recorder-v2.js.map +1 -1
  29. package/dist/recorder.js +1 -15
  30. package/dist/recorder.js.map +1 -1
  31. package/dist/src/entrypoints/recorder.d.ts +2 -2
  32. package/dist/src/sessionid.d.ts +1 -0
  33. package/lib/package.json +6 -5
  34. package/lib/src/entrypoints/recorder.d.ts +2 -2
  35. package/lib/src/entrypoints/recorder.js +6 -5
  36. package/lib/src/entrypoints/recorder.js.map +1 -1
  37. package/lib/src/sessionid.d.ts +1 -0
  38. package/lib/src/sessionid.js +1 -0
  39. package/lib/src/sessionid.js.map +1 -1
  40. package/package.json +6 -5
@@ -1,4 +1,4 @@
1
- import { record } from 'rrweb';
1
+ import { record as rrwebRecord } from 'rrweb';
2
2
  import type { RecordPlugin } from '@rrweb/types';
3
3
  import { CapturedNetworkRequest, NetworkRecordOptions } from '../types';
4
4
  export type NetworkData = {
@@ -8,4 +8,4 @@ export type NetworkData = {
8
8
  export declare function findLast<T>(array: Array<T>, predicate: (value: T) => boolean): T | undefined;
9
9
  export declare const NETWORK_PLUGIN_NAME = "rrweb/network@1";
10
10
  export declare const getRecordNetworkPlugin: (options?: NetworkRecordOptions) => RecordPlugin;
11
- export default record;
11
+ export default rrwebRecord;
@@ -32,5 +32,6 @@ export declare class SessionIdManager {
32
32
  activityTimeout: boolean;
33
33
  sessionPastMaximumLength: boolean;
34
34
  } | undefined;
35
+ lastActivityTimestamp: number;
35
36
  };
36
37
  }
package/lib/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "posthog-js",
3
- "version": "1.174.2",
3
+ "version": "1.174.4",
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",
@@ -58,7 +58,7 @@
58
58
  "@rollup/plugin-node-resolve": "^15.3.0",
59
59
  "@rollup/plugin-terser": "^0.4.4",
60
60
  "@rollup/plugin-typescript": "^12.1.1",
61
- "@rrweb/types": "2.0.0-alpha.13",
61
+ "@rrweb/types": "2.0.0-alpha.16",
62
62
  "@sentry/types": "8.7.0",
63
63
  "@testing-library/dom": "^9.3.0",
64
64
  "@testing-library/jest-dom": "^6.5.0",
@@ -103,8 +103,9 @@
103
103
  "rollup": "^4.24.0",
104
104
  "rollup-plugin-dts": "^6.1.1",
105
105
  "rollup-plugin-visualizer": "^5.12.0",
106
- "rrweb": "2.0.0-alpha.13",
107
- "rrweb-snapshot": "2.0.0-alpha.13",
106
+ "rrweb": "2.0.0-alpha.16",
107
+ "@rrweb/rrweb-plugin-console-record": "2.0.0-alpha.15",
108
+ "rrweb-snapshot": "2.0.0-alpha.16",
108
109
  "sinon": "9.0.2",
109
110
  "testcafe": "1.19.0",
110
111
  "testcafe-browser-provider-browserstack": "1.14.0",
@@ -126,7 +127,7 @@
126
127
  ],
127
128
  "pnpm": {
128
129
  "patchedDependencies": {
129
- "rrweb@2.0.0-alpha.13": "patches/rrweb@2.0.0-alpha.13.patch"
130
+ "rrweb@2.0.0-alpha.16": "patches/rrweb@2.0.0-alpha.16.patch"
130
131
  }
131
132
  }
132
133
  }
@@ -1,4 +1,4 @@
1
- import { record } from 'rrweb';
1
+ import { record as rrwebRecord } from 'rrweb';
2
2
  import type { RecordPlugin } from '@rrweb/types';
3
3
  import { CapturedNetworkRequest, NetworkRecordOptions } from '../types';
4
4
  export type NetworkData = {
@@ -8,4 +8,4 @@ export type NetworkData = {
8
8
  export declare function findLast<T>(array: Array<T>, predicate: (value: T) => boolean): T | undefined;
9
9
  export declare const NETWORK_PLUGIN_NAME = "rrweb/network@1";
10
10
  export declare const getRecordNetworkPlugin: (options?: NetworkRecordOptions) => RecordPlugin;
11
- export default record;
11
+ export default rrwebRecord;
@@ -56,8 +56,9 @@ var __values = (this && this.__values) || function(o) {
56
56
  };
57
57
  throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
58
58
  };
59
- import { version } from 'rrweb/package.json';
60
- import { getRecordConsolePlugin, record } from 'rrweb';
59
+ // @ts-expect-error - Patched to include the version
60
+ import { record as rrwebRecord, version } from 'rrweb';
61
+ import { getRecordConsolePlugin } from '@rrweb/rrweb-plugin-console-record';
61
62
  import { isArray, isBoolean, isDocument, isFormData, isNull, isNullish, isObject, isString, isUndefined, } from '../utils/type-utils';
62
63
  import { logger } from '../utils/logger';
63
64
  import { assignableWindow } from '../utils/globals';
@@ -584,14 +585,14 @@ export var getRecordNetworkPlugin = function (options) {
584
585
  // rrweb/networ@1 ends
585
586
  assignableWindow.__PosthogExtensions__ = assignableWindow.__PosthogExtensions__ || {};
586
587
  assignableWindow.__PosthogExtensions__.rrwebPlugins = { getRecordConsolePlugin: getRecordConsolePlugin, getRecordNetworkPlugin: getRecordNetworkPlugin };
587
- assignableWindow.__PosthogExtensions__.rrweb = { record: record, version: 'v2', rrwebVersion: version };
588
+ assignableWindow.__PosthogExtensions__.rrweb = { record: rrwebRecord, version: 'v2', rrwebVersion: version };
588
589
  // we used to put all of these items directly on window, and now we put it on __PosthogExtensions__
589
590
  // but that means that old clients which lazily load this extension are looking in the wrong place
590
591
  // yuck,
591
592
  // so we also put them directly on the window
592
593
  // when 1.161.1 is the oldest version seen in production we can remove this
593
- assignableWindow.rrweb = { record: record, version: 'v2', rrwebVersion: version };
594
+ assignableWindow.rrweb = { record: rrwebRecord, version: 'v2', rrwebVersion: version };
594
595
  assignableWindow.rrwebConsoleRecord = { getRecordConsolePlugin: getRecordConsolePlugin };
595
596
  assignableWindow.getRecordNetworkPlugin = getRecordNetworkPlugin;
596
- export default record;
597
+ export default rrwebRecord;
597
598
  //# sourceMappingURL=recorder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"recorder.js","sourceRoot":"","sources":["../../../src/entrypoints/recorder.ts"],"names":[],"mappings":"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","sourcesContent":["import { version } from 'rrweb/package.json'\nimport { getRecordConsolePlugin, record } from 'rrweb'\n\n// rrweb/network@1 code starts\n// most of what is below here will be removed when rrweb release their code for this\n// see https://github.com/rrweb-io/rrweb/pull/1105\n/// <reference lib=\"dom\" />\n// NB adopted from https://github.com/rrweb-io/rrweb/pull/1105 which looks like it will be accepted into rrweb\n// however, in the PR, it throws when the performance observer data is not available\n// and assumes it is running in a browser with the Request API (i.e. not IE11)\n// copying here so that we can use it before rrweb adopt it\nimport type { IWindow, listenerHandler, RecordPlugin } from '@rrweb/types'\nimport { CapturedNetworkRequest, Headers, InitiatorType, NetworkRecordOptions } from '../types'\nimport {\n isArray,\n isBoolean,\n isDocument,\n isFormData,\n isNull,\n isNullish,\n isObject,\n isString,\n isUndefined,\n} from '../utils/type-utils'\nimport { logger } from '../utils/logger'\nimport { assignableWindow } from '../utils/globals'\nimport { defaultNetworkOptions } from '../extensions/replay/config'\nimport { formDataToQuery } from '../utils/request-utils'\nimport { patch } from '../extensions/replay/rrweb-plugins/patch'\nimport { isHostOnDenyList } from '../extensions/replay/external/denylist'\n\nexport type NetworkData = {\n requests: CapturedNetworkRequest[]\n isInitial?: boolean\n}\n\ntype networkCallback = (data: NetworkData) => void\n\nconst isNavigationTiming = (entry: PerformanceEntry): entry is PerformanceNavigationTiming =>\n entry.entryType === 'navigation'\nconst isResourceTiming = (entry: PerformanceEntry): entry is PerformanceResourceTiming => entry.entryType === 'resource'\n\ntype ObservedPerformanceEntry = (PerformanceNavigationTiming | PerformanceResourceTiming) & {\n responseStatus?: number\n}\n\nexport function findLast<T>(array: Array<T>, predicate: (value: T) => boolean): T | undefined {\n const length = array.length\n for (let i = length - 1; i >= 0; i -= 1) {\n if (predicate(array[i])) {\n return array[i]\n }\n }\n return undefined\n}\n\nfunction initPerformanceObserver(cb: networkCallback, win: IWindow, options: Required<NetworkRecordOptions>) {\n // if we are only observing timings then we could have a single observer for all types, with buffer true,\n // but we are going to filter by initiatorType _if we are wrapping fetch and xhr as the wrapped functions\n // will deal with those.\n // so we have a block which captures requests from before fetch/xhr is wrapped\n // these are marked `isInitial` so playback can display them differently if needed\n // they will never have method/status/headers/body because they are pre-wrapping that provides that\n if (options.recordInitialRequests) {\n const initialPerformanceEntries = win.performance\n .getEntries()\n .filter(\n (entry): entry is ObservedPerformanceEntry =>\n isNavigationTiming(entry) ||\n (isResourceTiming(entry) && options.initiatorTypes.includes(entry.initiatorType as InitiatorType))\n )\n cb({\n requests: initialPerformanceEntries.flatMap((entry) =>\n prepareRequest({ entry, method: undefined, status: undefined, networkRequest: {}, isInitial: true })\n ),\n isInitial: true,\n })\n }\n const observer = new win.PerformanceObserver((entries) => {\n // if recordBody or recordHeaders is true then we don't want to record fetch or xhr here\n // as the wrapped functions will do that. Otherwise, this filter becomes a noop\n // because we do want to record them here\n const wrappedInitiatorFilter = (entry: ObservedPerformanceEntry) =>\n options.recordBody || options.recordHeaders\n ? entry.initiatorType !== 'xmlhttprequest' && entry.initiatorType !== 'fetch'\n : true\n\n const performanceEntries = entries.getEntries().filter(\n (entry): entry is ObservedPerformanceEntry =>\n isNavigationTiming(entry) ||\n (isResourceTiming(entry) &&\n options.initiatorTypes.includes(entry.initiatorType as InitiatorType) &&\n // TODO if we are _only_ capturing timing we don't want to filter initiator here\n wrappedInitiatorFilter(entry))\n )\n\n cb({\n requests: performanceEntries.flatMap((entry) =>\n prepareRequest({ entry, method: undefined, status: undefined, networkRequest: {} })\n ),\n })\n })\n // compat checked earlier\n // eslint-disable-next-line compat/compat\n const entryTypes = PerformanceObserver.supportedEntryTypes.filter((x) =>\n options.performanceEntryTypeToObserve.includes(x)\n )\n // initial records are gathered above, so we don't need to observe and buffer each type separately\n observer.observe({ entryTypes })\n return () => {\n observer.disconnect()\n }\n}\n\nfunction shouldRecordHeaders(type: 'request' | 'response', recordHeaders: NetworkRecordOptions['recordHeaders']) {\n return !!recordHeaders && (isBoolean(recordHeaders) || recordHeaders[type])\n}\n\nfunction shouldRecordBody({\n type,\n recordBody,\n headers,\n}: {\n type: 'request' | 'response'\n recordBody: NetworkRecordOptions['recordBody']\n headers: Headers\n url: string | URL | RequestInfo\n}) {\n function matchesContentType(contentTypes: string[]) {\n const contentTypeHeader = Object.keys(headers).find((key) => key.toLowerCase() === 'content-type')\n const contentType = contentTypeHeader && headers[contentTypeHeader]\n return contentTypes.some((ct) => contentType?.includes(ct))\n }\n\n if (!recordBody) return false\n if (isBoolean(recordBody)) return true\n if (isArray(recordBody)) return matchesContentType(recordBody)\n const recordBodyType = recordBody[type]\n if (isBoolean(recordBodyType)) return recordBodyType\n return matchesContentType(recordBodyType)\n}\n\nasync function getRequestPerformanceEntry(\n win: IWindow,\n initiatorType: string,\n url: string,\n start?: number,\n end?: number,\n attempt = 0\n): Promise<PerformanceResourceTiming | null> {\n if (attempt > 10) {\n logger.warn('Failed to get performance entry for request', { url, initiatorType })\n return null\n }\n const urlPerformanceEntries = win.performance.getEntriesByName(url) as PerformanceResourceTiming[]\n const performanceEntry = findLast(\n urlPerformanceEntries,\n (entry) =>\n isResourceTiming(entry) &&\n entry.initiatorType === initiatorType &&\n (isUndefined(start) || entry.startTime >= start) &&\n (isUndefined(end) || entry.startTime <= end)\n )\n if (!performanceEntry) {\n await new Promise((resolve) => setTimeout(resolve, 50 * attempt))\n return getRequestPerformanceEntry(win, initiatorType, url, start, end, attempt + 1)\n }\n return performanceEntry\n}\n\n/**\n * According to MDN https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/response\n * xhr response is typed as any but can be an ArrayBuffer, a Blob, a Document, a JavaScript object,\n * or a string, depending on the value of XMLHttpRequest.responseType, that contains the response entity body.\n *\n * XHR request body is Document | XMLHttpRequestBodyInit | null | undefined\n */\nfunction _tryReadXHRBody({\n body,\n options,\n url,\n}: {\n body: Document | XMLHttpRequestBodyInit | any | null | undefined\n options: NetworkRecordOptions\n url: string | URL | RequestInfo\n}): string | null {\n if (isNullish(body)) {\n return null\n }\n\n const { hostname, isHostDenied } = isHostOnDenyList(url, options)\n if (isHostDenied) {\n return hostname + ' is in deny list'\n }\n\n if (isString(body)) {\n return body\n }\n\n if (isDocument(body)) {\n return body.textContent\n }\n\n if (isFormData(body)) {\n return formDataToQuery(body)\n }\n\n if (isObject(body)) {\n try {\n return JSON.stringify(body)\n } catch {\n return '[SessionReplay] Failed to stringify response object'\n }\n }\n\n return '[SessionReplay] Cannot read body of type ' + toString.call(body)\n}\n\nfunction initXhrObserver(cb: networkCallback, win: IWindow, options: Required<NetworkRecordOptions>): listenerHandler {\n if (!options.initiatorTypes.includes('xmlhttprequest')) {\n return () => {\n //\n }\n }\n const recordRequestHeaders = shouldRecordHeaders('request', options.recordHeaders)\n const recordResponseHeaders = shouldRecordHeaders('response', options.recordHeaders)\n\n const restorePatch = patch(\n win.XMLHttpRequest.prototype,\n 'open',\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n (originalOpen: typeof XMLHttpRequest.prototype.open) => {\n return function (\n method: string,\n url: string | URL,\n async = true,\n username?: string | null,\n password?: string | null\n ) {\n // because this function is returned in its actual context `this` _is_ an XMLHttpRequest\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const xhr = this as XMLHttpRequest\n\n // check IE earlier than this, we only initialize if Request is present\n // eslint-disable-next-line compat/compat\n const req = new Request(url)\n const networkRequest: Partial<CapturedNetworkRequest> = {}\n let start: number | undefined\n let end: number | undefined\n\n const requestHeaders: Headers = {}\n const originalSetRequestHeader = xhr.setRequestHeader.bind(xhr)\n xhr.setRequestHeader = (header: string, value: string) => {\n requestHeaders[header] = value\n return originalSetRequestHeader(header, value)\n }\n if (recordRequestHeaders) {\n networkRequest.requestHeaders = requestHeaders\n }\n\n const originalSend = xhr.send.bind(xhr)\n xhr.send = (body) => {\n if (\n shouldRecordBody({\n type: 'request',\n headers: requestHeaders,\n url,\n recordBody: options.recordBody,\n })\n ) {\n networkRequest.requestBody = _tryReadXHRBody({ body, options, url })\n }\n start = win.performance.now()\n return originalSend(body)\n }\n\n xhr.addEventListener('readystatechange', () => {\n if (xhr.readyState !== xhr.DONE) {\n return\n }\n end = win.performance.now()\n const responseHeaders: Headers = {}\n const rawHeaders = xhr.getAllResponseHeaders()\n const headers = rawHeaders.trim().split(/[\\r\\n]+/)\n headers.forEach((line) => {\n const parts = line.split(': ')\n const header = parts.shift()\n const value = parts.join(': ')\n if (header) {\n responseHeaders[header] = value\n }\n })\n if (recordResponseHeaders) {\n networkRequest.responseHeaders = responseHeaders\n }\n if (\n shouldRecordBody({\n type: 'response',\n headers: responseHeaders,\n url,\n recordBody: options.recordBody,\n })\n ) {\n networkRequest.responseBody = _tryReadXHRBody({ body: xhr.response, options, url })\n }\n getRequestPerformanceEntry(win, 'xmlhttprequest', req.url, start, end)\n .then((entry) => {\n const requests = prepareRequest({\n entry,\n method: req.method,\n status: xhr?.status,\n networkRequest,\n start,\n end,\n url: url.toString(),\n initiatorType: 'xmlhttprequest',\n })\n cb({ requests })\n })\n .catch(() => {\n //\n })\n })\n originalOpen.call(xhr, method, url, async, username, password)\n }\n }\n )\n return () => {\n restorePatch()\n }\n}\n\n/**\n * Check if this PerformanceEntry is either a PerformanceResourceTiming or a PerformanceNavigationTiming\n * NB PerformanceNavigationTiming extends PerformanceResourceTiming\n * Here we don't care which interface it implements as both expose `serverTimings`\n */\nconst exposesServerTiming = (event: PerformanceEntry | null): event is PerformanceResourceTiming =>\n !isNull(event) && (event.entryType === 'navigation' || event.entryType === 'resource')\n\nfunction prepareRequest({\n entry,\n method,\n status,\n networkRequest,\n isInitial,\n start,\n end,\n url,\n initiatorType,\n}: {\n entry: PerformanceResourceTiming | null\n method: string | undefined\n status: number | undefined\n networkRequest: Partial<CapturedNetworkRequest>\n isInitial?: boolean\n start?: number\n end?: number\n // if there is no performance observer entry, we still need to know the url\n url?: string\n // if there is no performance observer entry, we can provide the initiatorType\n initiatorType?: string\n}): CapturedNetworkRequest[] {\n start = entry ? entry.startTime : start\n end = entry ? entry.responseEnd : end\n\n // kudos to sentry javascript sdk for excellent background on why to use Date.now() here\n // https://github.com/getsentry/sentry-javascript/blob/e856e40b6e71a73252e788cd42b5260f81c9c88e/packages/utils/src/time.ts#L70\n // can't start observer if performance.now() is not available\n // eslint-disable-next-line compat/compat\n const timeOrigin = Math.floor(Date.now() - performance.now())\n // clickhouse can't ingest timestamps that are floats\n // (in this case representing fractions of a millisecond we don't care about anyway)\n // use timeOrigin if we really can't gather a start time\n const timestamp = Math.floor(timeOrigin + (start || 0))\n\n const entryJSON = entry ? entry.toJSON() : { name: url }\n\n const requests: CapturedNetworkRequest[] = [\n {\n ...entryJSON,\n startTime: isUndefined(start) ? undefined : Math.round(start),\n endTime: isUndefined(end) ? undefined : Math.round(end),\n timeOrigin,\n timestamp,\n method: method,\n initiatorType: entry ? (entry.initiatorType as InitiatorType) : initiatorType,\n status,\n requestHeaders: networkRequest.requestHeaders,\n requestBody: networkRequest.requestBody,\n responseHeaders: networkRequest.responseHeaders,\n responseBody: networkRequest.responseBody,\n isInitial,\n },\n ]\n\n if (exposesServerTiming(entry)) {\n for (const timing of entry.serverTiming || []) {\n requests.push({\n timeOrigin,\n timestamp,\n startTime: Math.round(entry.startTime),\n name: timing.name,\n duration: timing.duration,\n // the spec has a closed list of possible types\n // https://developer.mozilla.org/en-US/docs/Web/API/PerformanceEntry/entryType\n // but, we need to know this was a server timing so that we know to\n // match it to the appropriate navigation or resource timing\n // that matching will have to be on timestamp and $current_url\n entryType: 'serverTiming',\n })\n }\n }\n\n return requests\n}\n\nconst contentTypePrefixDenyList = ['video/', 'audio/']\n\nfunction _checkForCannotReadResponseBody({\n r,\n options,\n url,\n}: {\n r: Response\n options: NetworkRecordOptions\n url: string | URL | RequestInfo\n}): string | null {\n if (r.headers.get('Transfer-Encoding') === 'chunked') {\n return 'Chunked Transfer-Encoding is not supported'\n }\n\n // `get` and `has` are case-insensitive\n // but return the header value with the casing that was supplied\n const contentType = r.headers.get('Content-Type')?.toLowerCase()\n const contentTypeIsDenied = contentTypePrefixDenyList.some((prefix) => contentType?.startsWith(prefix))\n if (contentType && contentTypeIsDenied) {\n return `Content-Type ${contentType} is not supported`\n }\n\n const { hostname, isHostDenied } = isHostOnDenyList(url, options)\n if (isHostDenied) {\n return hostname + ' is in deny list'\n }\n\n return null\n}\n\nfunction _tryReadBody(r: Request | Response): Promise<string> {\n // there are now already multiple places where we're using Promise...\n // eslint-disable-next-line compat/compat\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => resolve('[SessionReplay] Timeout while trying to read body'), 500)\n try {\n r.clone()\n .text()\n .then(\n (txt) => resolve(txt),\n (reason) => reject(reason)\n )\n .finally(() => clearTimeout(timeout))\n } catch {\n clearTimeout(timeout)\n resolve('[SessionReplay] Failed to read body')\n }\n })\n}\n\nasync function _tryReadRequestBody({\n r,\n options,\n url,\n}: {\n r: Request\n options: NetworkRecordOptions\n url: string | URL | RequestInfo\n}): Promise<string> {\n const { hostname, isHostDenied } = isHostOnDenyList(url, options)\n if (isHostDenied) {\n return Promise.resolve(hostname + ' is in deny list')\n }\n\n return _tryReadBody(r)\n}\n\nasync function _tryReadResponseBody({\n r,\n options,\n url,\n}: {\n r: Response\n options: NetworkRecordOptions\n url: string | URL | RequestInfo\n}): Promise<string> {\n const cannotReadBodyReason: string | null = _checkForCannotReadResponseBody({ r, options, url })\n if (!isNull(cannotReadBodyReason)) {\n return Promise.resolve(cannotReadBodyReason)\n }\n\n return _tryReadBody(r)\n}\n\nfunction initFetchObserver(\n cb: networkCallback,\n win: IWindow,\n options: Required<NetworkRecordOptions>\n): listenerHandler {\n if (!options.initiatorTypes.includes('fetch')) {\n return () => {\n //\n }\n }\n const recordRequestHeaders = shouldRecordHeaders('request', options.recordHeaders)\n const recordResponseHeaders = shouldRecordHeaders('response', options.recordHeaders)\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const restorePatch = patch(win, 'fetch', (originalFetch: typeof fetch) => {\n return async function (url: URL | RequestInfo, init?: RequestInit | undefined) {\n // check IE earlier than this, we only initialize if Request is present\n // eslint-disable-next-line compat/compat\n const req = new Request(url, init)\n let res: Response | undefined\n const networkRequest: Partial<CapturedNetworkRequest> = {}\n let start: number | undefined\n let end: number | undefined\n\n try {\n const requestHeaders: Headers = {}\n req.headers.forEach((value, header) => {\n requestHeaders[header] = value\n })\n if (recordRequestHeaders) {\n networkRequest.requestHeaders = requestHeaders\n }\n if (\n shouldRecordBody({\n type: 'request',\n headers: requestHeaders,\n url,\n recordBody: options.recordBody,\n })\n ) {\n networkRequest.requestBody = await _tryReadRequestBody({ r: req, options, url })\n }\n\n start = win.performance.now()\n res = await originalFetch(req)\n end = win.performance.now()\n\n const responseHeaders: Headers = {}\n res.headers.forEach((value, header) => {\n responseHeaders[header] = value\n })\n if (recordResponseHeaders) {\n networkRequest.responseHeaders = responseHeaders\n }\n if (\n shouldRecordBody({\n type: 'response',\n headers: responseHeaders,\n url,\n recordBody: options.recordBody,\n })\n ) {\n networkRequest.responseBody = await _tryReadResponseBody({ r: res, options, url })\n }\n\n return res\n } finally {\n getRequestPerformanceEntry(win, 'fetch', req.url, start, end)\n .then((entry) => {\n const requests = prepareRequest({\n entry,\n method: req.method,\n status: res?.status,\n networkRequest,\n start,\n end,\n url: req.url,\n initiatorType: 'fetch',\n })\n cb({ requests })\n })\n .catch(() => {\n //\n })\n }\n }\n })\n return () => {\n restorePatch()\n }\n}\n\nlet initialisedHandler: listenerHandler | null = null\n\nfunction initNetworkObserver(\n callback: networkCallback,\n win: IWindow, // top window or in an iframe\n options: NetworkRecordOptions\n): listenerHandler {\n if (!('performance' in win)) {\n return () => {\n //\n }\n }\n\n if (initialisedHandler) {\n logger.warn('Network observer already initialised, doing nothing')\n return () => {\n // the first caller should already have this handler and will be responsible for teardown\n }\n }\n\n const networkOptions = (\n options ? Object.assign({}, defaultNetworkOptions, options) : defaultNetworkOptions\n ) as Required<NetworkRecordOptions>\n\n const cb: networkCallback = (data) => {\n const requests: CapturedNetworkRequest[] = []\n data.requests.forEach((request) => {\n const maskedRequest = networkOptions.maskRequestFn(request)\n if (maskedRequest) {\n requests.push(maskedRequest)\n }\n })\n\n if (requests.length > 0) {\n callback({ ...data, requests })\n }\n }\n const performanceObserver = initPerformanceObserver(cb, win, networkOptions)\n\n // only wrap fetch and xhr if headers or body are being recorded\n let xhrObserver: listenerHandler = () => {}\n let fetchObserver: listenerHandler = () => {}\n if (networkOptions.recordHeaders || networkOptions.recordBody) {\n xhrObserver = initXhrObserver(cb, win, networkOptions)\n fetchObserver = initFetchObserver(cb, win, networkOptions)\n }\n\n initialisedHandler = () => {\n performanceObserver()\n xhrObserver()\n fetchObserver()\n }\n return initialisedHandler\n}\n\n// use the plugin name so that when this functionality is adopted into rrweb\n// we can remove this plugin and use the core functionality with the same data\nexport const NETWORK_PLUGIN_NAME = 'rrweb/network@1'\n\n// TODO how should this be typed?\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nexport const getRecordNetworkPlugin: (options?: NetworkRecordOptions) => RecordPlugin = (options) => {\n return {\n name: NETWORK_PLUGIN_NAME,\n observer: initNetworkObserver,\n options: options,\n }\n}\n\n// rrweb/networ@1 ends\n\nassignableWindow.__PosthogExtensions__ = assignableWindow.__PosthogExtensions__ || {}\nassignableWindow.__PosthogExtensions__.rrwebPlugins = { getRecordConsolePlugin, getRecordNetworkPlugin }\nassignableWindow.__PosthogExtensions__.rrweb = { record: record, version: 'v2', rrwebVersion: version }\n\n// we used to put all of these items directly on window, and now we put it on __PosthogExtensions__\n// but that means that old clients which lazily load this extension are looking in the wrong place\n// yuck,\n// so we also put them directly on the window\n// when 1.161.1 is the oldest version seen in production we can remove this\nassignableWindow.rrweb = { record: record, version: 'v2', rrwebVersion: version }\nassignableWindow.rrwebConsoleRecord = { getRecordConsolePlugin }\nassignableWindow.getRecordNetworkPlugin = getRecordNetworkPlugin\n\nexport default record\n"]}
1
+ {"version":3,"file":"recorder.js","sourceRoot":"","sources":["../../../src/entrypoints/recorder.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-expect-error - Patched to include the version\nimport { record as rrwebRecord, version } from 'rrweb'\nimport { getRecordConsolePlugin } from '@rrweb/rrweb-plugin-console-record'\n\n// rrweb/network@1 code starts\n// most of what is below here will be removed when rrweb release their code for this\n// see https://github.com/rrweb-io/rrweb/pull/1105\n/// <reference lib=\"dom\" />\n// NB adopted from https://github.com/rrweb-io/rrweb/pull/1105 which looks like it will be accepted into rrweb\n// however, in the PR, it throws when the performance observer data is not available\n// and assumes it is running in a browser with the Request API (i.e. not IE11)\n// copying here so that we can use it before rrweb adopt it\nimport type { IWindow, listenerHandler, RecordPlugin } from '@rrweb/types'\nimport { CapturedNetworkRequest, Headers, InitiatorType, NetworkRecordOptions } from '../types'\nimport {\n isArray,\n isBoolean,\n isDocument,\n isFormData,\n isNull,\n isNullish,\n isObject,\n isString,\n isUndefined,\n} from '../utils/type-utils'\nimport { logger } from '../utils/logger'\nimport { assignableWindow } from '../utils/globals'\nimport { defaultNetworkOptions } from '../extensions/replay/config'\nimport { formDataToQuery } from '../utils/request-utils'\nimport { patch } from '../extensions/replay/rrweb-plugins/patch'\nimport { isHostOnDenyList } from '../extensions/replay/external/denylist'\n\nexport type NetworkData = {\n requests: CapturedNetworkRequest[]\n isInitial?: boolean\n}\n\ntype networkCallback = (data: NetworkData) => void\n\nconst isNavigationTiming = (entry: PerformanceEntry): entry is PerformanceNavigationTiming =>\n entry.entryType === 'navigation'\nconst isResourceTiming = (entry: PerformanceEntry): entry is PerformanceResourceTiming => entry.entryType === 'resource'\n\ntype ObservedPerformanceEntry = (PerformanceNavigationTiming | PerformanceResourceTiming) & {\n responseStatus?: number\n}\n\nexport function findLast<T>(array: Array<T>, predicate: (value: T) => boolean): T | undefined {\n const length = array.length\n for (let i = length - 1; i >= 0; i -= 1) {\n if (predicate(array[i])) {\n return array[i]\n }\n }\n return undefined\n}\n\nfunction initPerformanceObserver(cb: networkCallback, win: IWindow, options: Required<NetworkRecordOptions>) {\n // if we are only observing timings then we could have a single observer for all types, with buffer true,\n // but we are going to filter by initiatorType _if we are wrapping fetch and xhr as the wrapped functions\n // will deal with those.\n // so we have a block which captures requests from before fetch/xhr is wrapped\n // these are marked `isInitial` so playback can display them differently if needed\n // they will never have method/status/headers/body because they are pre-wrapping that provides that\n if (options.recordInitialRequests) {\n const initialPerformanceEntries = win.performance\n .getEntries()\n .filter(\n (entry): entry is ObservedPerformanceEntry =>\n isNavigationTiming(entry) ||\n (isResourceTiming(entry) && options.initiatorTypes.includes(entry.initiatorType as InitiatorType))\n )\n cb({\n requests: initialPerformanceEntries.flatMap((entry) =>\n prepareRequest({ entry, method: undefined, status: undefined, networkRequest: {}, isInitial: true })\n ),\n isInitial: true,\n })\n }\n const observer = new win.PerformanceObserver((entries) => {\n // if recordBody or recordHeaders is true then we don't want to record fetch or xhr here\n // as the wrapped functions will do that. Otherwise, this filter becomes a noop\n // because we do want to record them here\n const wrappedInitiatorFilter = (entry: ObservedPerformanceEntry) =>\n options.recordBody || options.recordHeaders\n ? entry.initiatorType !== 'xmlhttprequest' && entry.initiatorType !== 'fetch'\n : true\n\n const performanceEntries = entries.getEntries().filter(\n (entry): entry is ObservedPerformanceEntry =>\n isNavigationTiming(entry) ||\n (isResourceTiming(entry) &&\n options.initiatorTypes.includes(entry.initiatorType as InitiatorType) &&\n // TODO if we are _only_ capturing timing we don't want to filter initiator here\n wrappedInitiatorFilter(entry))\n )\n\n cb({\n requests: performanceEntries.flatMap((entry) =>\n prepareRequest({ entry, method: undefined, status: undefined, networkRequest: {} })\n ),\n })\n })\n // compat checked earlier\n // eslint-disable-next-line compat/compat\n const entryTypes = PerformanceObserver.supportedEntryTypes.filter((x) =>\n options.performanceEntryTypeToObserve.includes(x)\n )\n // initial records are gathered above, so we don't need to observe and buffer each type separately\n observer.observe({ entryTypes })\n return () => {\n observer.disconnect()\n }\n}\n\nfunction shouldRecordHeaders(type: 'request' | 'response', recordHeaders: NetworkRecordOptions['recordHeaders']) {\n return !!recordHeaders && (isBoolean(recordHeaders) || recordHeaders[type])\n}\n\nfunction shouldRecordBody({\n type,\n recordBody,\n headers,\n}: {\n type: 'request' | 'response'\n recordBody: NetworkRecordOptions['recordBody']\n headers: Headers\n url: string | URL | RequestInfo\n}) {\n function matchesContentType(contentTypes: string[]) {\n const contentTypeHeader = Object.keys(headers).find((key) => key.toLowerCase() === 'content-type')\n const contentType = contentTypeHeader && headers[contentTypeHeader]\n return contentTypes.some((ct) => contentType?.includes(ct))\n }\n\n if (!recordBody) return false\n if (isBoolean(recordBody)) return true\n if (isArray(recordBody)) return matchesContentType(recordBody)\n const recordBodyType = recordBody[type]\n if (isBoolean(recordBodyType)) return recordBodyType\n return matchesContentType(recordBodyType)\n}\n\nasync function getRequestPerformanceEntry(\n win: IWindow,\n initiatorType: string,\n url: string,\n start?: number,\n end?: number,\n attempt = 0\n): Promise<PerformanceResourceTiming | null> {\n if (attempt > 10) {\n logger.warn('Failed to get performance entry for request', { url, initiatorType })\n return null\n }\n const urlPerformanceEntries = win.performance.getEntriesByName(url) as PerformanceResourceTiming[]\n const performanceEntry = findLast(\n urlPerformanceEntries,\n (entry) =>\n isResourceTiming(entry) &&\n entry.initiatorType === initiatorType &&\n (isUndefined(start) || entry.startTime >= start) &&\n (isUndefined(end) || entry.startTime <= end)\n )\n if (!performanceEntry) {\n await new Promise((resolve) => setTimeout(resolve, 50 * attempt))\n return getRequestPerformanceEntry(win, initiatorType, url, start, end, attempt + 1)\n }\n return performanceEntry\n}\n\n/**\n * According to MDN https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/response\n * xhr response is typed as any but can be an ArrayBuffer, a Blob, a Document, a JavaScript object,\n * or a string, depending on the value of XMLHttpRequest.responseType, that contains the response entity body.\n *\n * XHR request body is Document | XMLHttpRequestBodyInit | null | undefined\n */\nfunction _tryReadXHRBody({\n body,\n options,\n url,\n}: {\n body: Document | XMLHttpRequestBodyInit | any | null | undefined\n options: NetworkRecordOptions\n url: string | URL | RequestInfo\n}): string | null {\n if (isNullish(body)) {\n return null\n }\n\n const { hostname, isHostDenied } = isHostOnDenyList(url, options)\n if (isHostDenied) {\n return hostname + ' is in deny list'\n }\n\n if (isString(body)) {\n return body\n }\n\n if (isDocument(body)) {\n return body.textContent\n }\n\n if (isFormData(body)) {\n return formDataToQuery(body)\n }\n\n if (isObject(body)) {\n try {\n return JSON.stringify(body)\n } catch {\n return '[SessionReplay] Failed to stringify response object'\n }\n }\n\n return '[SessionReplay] Cannot read body of type ' + toString.call(body)\n}\n\nfunction initXhrObserver(cb: networkCallback, win: IWindow, options: Required<NetworkRecordOptions>): listenerHandler {\n if (!options.initiatorTypes.includes('xmlhttprequest')) {\n return () => {\n //\n }\n }\n const recordRequestHeaders = shouldRecordHeaders('request', options.recordHeaders)\n const recordResponseHeaders = shouldRecordHeaders('response', options.recordHeaders)\n\n const restorePatch = patch(\n win.XMLHttpRequest.prototype,\n 'open',\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n (originalOpen: typeof XMLHttpRequest.prototype.open) => {\n return function (\n method: string,\n url: string | URL,\n async = true,\n username?: string | null,\n password?: string | null\n ) {\n // because this function is returned in its actual context `this` _is_ an XMLHttpRequest\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const xhr = this as XMLHttpRequest\n\n // check IE earlier than this, we only initialize if Request is present\n // eslint-disable-next-line compat/compat\n const req = new Request(url)\n const networkRequest: Partial<CapturedNetworkRequest> = {}\n let start: number | undefined\n let end: number | undefined\n\n const requestHeaders: Headers = {}\n const originalSetRequestHeader = xhr.setRequestHeader.bind(xhr)\n xhr.setRequestHeader = (header: string, value: string) => {\n requestHeaders[header] = value\n return originalSetRequestHeader(header, value)\n }\n if (recordRequestHeaders) {\n networkRequest.requestHeaders = requestHeaders\n }\n\n const originalSend = xhr.send.bind(xhr)\n xhr.send = (body) => {\n if (\n shouldRecordBody({\n type: 'request',\n headers: requestHeaders,\n url,\n recordBody: options.recordBody,\n })\n ) {\n networkRequest.requestBody = _tryReadXHRBody({ body, options, url })\n }\n start = win.performance.now()\n return originalSend(body)\n }\n\n xhr.addEventListener('readystatechange', () => {\n if (xhr.readyState !== xhr.DONE) {\n return\n }\n end = win.performance.now()\n const responseHeaders: Headers = {}\n const rawHeaders = xhr.getAllResponseHeaders()\n const headers = rawHeaders.trim().split(/[\\r\\n]+/)\n headers.forEach((line) => {\n const parts = line.split(': ')\n const header = parts.shift()\n const value = parts.join(': ')\n if (header) {\n responseHeaders[header] = value\n }\n })\n if (recordResponseHeaders) {\n networkRequest.responseHeaders = responseHeaders\n }\n if (\n shouldRecordBody({\n type: 'response',\n headers: responseHeaders,\n url,\n recordBody: options.recordBody,\n })\n ) {\n networkRequest.responseBody = _tryReadXHRBody({ body: xhr.response, options, url })\n }\n getRequestPerformanceEntry(win, 'xmlhttprequest', req.url, start, end)\n .then((entry) => {\n const requests = prepareRequest({\n entry,\n method: req.method,\n status: xhr?.status,\n networkRequest,\n start,\n end,\n url: url.toString(),\n initiatorType: 'xmlhttprequest',\n })\n cb({ requests })\n })\n .catch(() => {\n //\n })\n })\n originalOpen.call(xhr, method, url, async, username, password)\n }\n }\n )\n return () => {\n restorePatch()\n }\n}\n\n/**\n * Check if this PerformanceEntry is either a PerformanceResourceTiming or a PerformanceNavigationTiming\n * NB PerformanceNavigationTiming extends PerformanceResourceTiming\n * Here we don't care which interface it implements as both expose `serverTimings`\n */\nconst exposesServerTiming = (event: PerformanceEntry | null): event is PerformanceResourceTiming =>\n !isNull(event) && (event.entryType === 'navigation' || event.entryType === 'resource')\n\nfunction prepareRequest({\n entry,\n method,\n status,\n networkRequest,\n isInitial,\n start,\n end,\n url,\n initiatorType,\n}: {\n entry: PerformanceResourceTiming | null\n method: string | undefined\n status: number | undefined\n networkRequest: Partial<CapturedNetworkRequest>\n isInitial?: boolean\n start?: number\n end?: number\n // if there is no performance observer entry, we still need to know the url\n url?: string\n // if there is no performance observer entry, we can provide the initiatorType\n initiatorType?: string\n}): CapturedNetworkRequest[] {\n start = entry ? entry.startTime : start\n end = entry ? entry.responseEnd : end\n\n // kudos to sentry javascript sdk for excellent background on why to use Date.now() here\n // https://github.com/getsentry/sentry-javascript/blob/e856e40b6e71a73252e788cd42b5260f81c9c88e/packages/utils/src/time.ts#L70\n // can't start observer if performance.now() is not available\n // eslint-disable-next-line compat/compat\n const timeOrigin = Math.floor(Date.now() - performance.now())\n // clickhouse can't ingest timestamps that are floats\n // (in this case representing fractions of a millisecond we don't care about anyway)\n // use timeOrigin if we really can't gather a start time\n const timestamp = Math.floor(timeOrigin + (start || 0))\n\n const entryJSON = entry ? entry.toJSON() : { name: url }\n\n const requests: CapturedNetworkRequest[] = [\n {\n ...entryJSON,\n startTime: isUndefined(start) ? undefined : Math.round(start),\n endTime: isUndefined(end) ? undefined : Math.round(end),\n timeOrigin,\n timestamp,\n method: method,\n initiatorType: entry ? (entry.initiatorType as InitiatorType) : initiatorType,\n status,\n requestHeaders: networkRequest.requestHeaders,\n requestBody: networkRequest.requestBody,\n responseHeaders: networkRequest.responseHeaders,\n responseBody: networkRequest.responseBody,\n isInitial,\n },\n ]\n\n if (exposesServerTiming(entry)) {\n for (const timing of entry.serverTiming || []) {\n requests.push({\n timeOrigin,\n timestamp,\n startTime: Math.round(entry.startTime),\n name: timing.name,\n duration: timing.duration,\n // the spec has a closed list of possible types\n // https://developer.mozilla.org/en-US/docs/Web/API/PerformanceEntry/entryType\n // but, we need to know this was a server timing so that we know to\n // match it to the appropriate navigation or resource timing\n // that matching will have to be on timestamp and $current_url\n entryType: 'serverTiming',\n })\n }\n }\n\n return requests\n}\n\nconst contentTypePrefixDenyList = ['video/', 'audio/']\n\nfunction _checkForCannotReadResponseBody({\n r,\n options,\n url,\n}: {\n r: Response\n options: NetworkRecordOptions\n url: string | URL | RequestInfo\n}): string | null {\n if (r.headers.get('Transfer-Encoding') === 'chunked') {\n return 'Chunked Transfer-Encoding is not supported'\n }\n\n // `get` and `has` are case-insensitive\n // but return the header value with the casing that was supplied\n const contentType = r.headers.get('Content-Type')?.toLowerCase()\n const contentTypeIsDenied = contentTypePrefixDenyList.some((prefix) => contentType?.startsWith(prefix))\n if (contentType && contentTypeIsDenied) {\n return `Content-Type ${contentType} is not supported`\n }\n\n const { hostname, isHostDenied } = isHostOnDenyList(url, options)\n if (isHostDenied) {\n return hostname + ' is in deny list'\n }\n\n return null\n}\n\nfunction _tryReadBody(r: Request | Response): Promise<string> {\n // there are now already multiple places where we're using Promise...\n // eslint-disable-next-line compat/compat\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => resolve('[SessionReplay] Timeout while trying to read body'), 500)\n try {\n r.clone()\n .text()\n .then(\n (txt) => resolve(txt),\n (reason) => reject(reason)\n )\n .finally(() => clearTimeout(timeout))\n } catch {\n clearTimeout(timeout)\n resolve('[SessionReplay] Failed to read body')\n }\n })\n}\n\nasync function _tryReadRequestBody({\n r,\n options,\n url,\n}: {\n r: Request\n options: NetworkRecordOptions\n url: string | URL | RequestInfo\n}): Promise<string> {\n const { hostname, isHostDenied } = isHostOnDenyList(url, options)\n if (isHostDenied) {\n return Promise.resolve(hostname + ' is in deny list')\n }\n\n return _tryReadBody(r)\n}\n\nasync function _tryReadResponseBody({\n r,\n options,\n url,\n}: {\n r: Response\n options: NetworkRecordOptions\n url: string | URL | RequestInfo\n}): Promise<string> {\n const cannotReadBodyReason: string | null = _checkForCannotReadResponseBody({ r, options, url })\n if (!isNull(cannotReadBodyReason)) {\n return Promise.resolve(cannotReadBodyReason)\n }\n\n return _tryReadBody(r)\n}\n\nfunction initFetchObserver(\n cb: networkCallback,\n win: IWindow,\n options: Required<NetworkRecordOptions>\n): listenerHandler {\n if (!options.initiatorTypes.includes('fetch')) {\n return () => {\n //\n }\n }\n const recordRequestHeaders = shouldRecordHeaders('request', options.recordHeaders)\n const recordResponseHeaders = shouldRecordHeaders('response', options.recordHeaders)\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const restorePatch = patch(win, 'fetch', (originalFetch: typeof fetch) => {\n return async function (url: URL | RequestInfo, init?: RequestInit | undefined) {\n // check IE earlier than this, we only initialize if Request is present\n // eslint-disable-next-line compat/compat\n const req = new Request(url, init)\n let res: Response | undefined\n const networkRequest: Partial<CapturedNetworkRequest> = {}\n let start: number | undefined\n let end: number | undefined\n\n try {\n const requestHeaders: Headers = {}\n req.headers.forEach((value, header) => {\n requestHeaders[header] = value\n })\n if (recordRequestHeaders) {\n networkRequest.requestHeaders = requestHeaders\n }\n if (\n shouldRecordBody({\n type: 'request',\n headers: requestHeaders,\n url,\n recordBody: options.recordBody,\n })\n ) {\n networkRequest.requestBody = await _tryReadRequestBody({ r: req, options, url })\n }\n\n start = win.performance.now()\n res = await originalFetch(req)\n end = win.performance.now()\n\n const responseHeaders: Headers = {}\n res.headers.forEach((value, header) => {\n responseHeaders[header] = value\n })\n if (recordResponseHeaders) {\n networkRequest.responseHeaders = responseHeaders\n }\n if (\n shouldRecordBody({\n type: 'response',\n headers: responseHeaders,\n url,\n recordBody: options.recordBody,\n })\n ) {\n networkRequest.responseBody = await _tryReadResponseBody({ r: res, options, url })\n }\n\n return res\n } finally {\n getRequestPerformanceEntry(win, 'fetch', req.url, start, end)\n .then((entry) => {\n const requests = prepareRequest({\n entry,\n method: req.method,\n status: res?.status,\n networkRequest,\n start,\n end,\n url: req.url,\n initiatorType: 'fetch',\n })\n cb({ requests })\n })\n .catch(() => {\n //\n })\n }\n }\n })\n return () => {\n restorePatch()\n }\n}\n\nlet initialisedHandler: listenerHandler | null = null\n\nfunction initNetworkObserver(\n callback: networkCallback,\n win: IWindow, // top window or in an iframe\n options: NetworkRecordOptions\n): listenerHandler {\n if (!('performance' in win)) {\n return () => {\n //\n }\n }\n\n if (initialisedHandler) {\n logger.warn('Network observer already initialised, doing nothing')\n return () => {\n // the first caller should already have this handler and will be responsible for teardown\n }\n }\n\n const networkOptions = (\n options ? Object.assign({}, defaultNetworkOptions, options) : defaultNetworkOptions\n ) as Required<NetworkRecordOptions>\n\n const cb: networkCallback = (data) => {\n const requests: CapturedNetworkRequest[] = []\n data.requests.forEach((request) => {\n const maskedRequest = networkOptions.maskRequestFn(request)\n if (maskedRequest) {\n requests.push(maskedRequest)\n }\n })\n\n if (requests.length > 0) {\n callback({ ...data, requests })\n }\n }\n const performanceObserver = initPerformanceObserver(cb, win, networkOptions)\n\n // only wrap fetch and xhr if headers or body are being recorded\n let xhrObserver: listenerHandler = () => {}\n let fetchObserver: listenerHandler = () => {}\n if (networkOptions.recordHeaders || networkOptions.recordBody) {\n xhrObserver = initXhrObserver(cb, win, networkOptions)\n fetchObserver = initFetchObserver(cb, win, networkOptions)\n }\n\n initialisedHandler = () => {\n performanceObserver()\n xhrObserver()\n fetchObserver()\n }\n return initialisedHandler\n}\n\n// use the plugin name so that when this functionality is adopted into rrweb\n// we can remove this plugin and use the core functionality with the same data\nexport const NETWORK_PLUGIN_NAME = 'rrweb/network@1'\n\n// TODO how should this be typed?\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nexport const getRecordNetworkPlugin: (options?: NetworkRecordOptions) => RecordPlugin = (options) => {\n return {\n name: NETWORK_PLUGIN_NAME,\n observer: initNetworkObserver,\n options: options,\n }\n}\n\n// rrweb/networ@1 ends\n\nassignableWindow.__PosthogExtensions__ = assignableWindow.__PosthogExtensions__ || {}\nassignableWindow.__PosthogExtensions__.rrwebPlugins = { getRecordConsolePlugin, getRecordNetworkPlugin }\nassignableWindow.__PosthogExtensions__.rrweb = { record: rrwebRecord, version: 'v2', rrwebVersion: version }\n\n// we used to put all of these items directly on window, and now we put it on __PosthogExtensions__\n// but that means that old clients which lazily load this extension are looking in the wrong place\n// yuck,\n// so we also put them directly on the window\n// when 1.161.1 is the oldest version seen in production we can remove this\nassignableWindow.rrweb = { record: rrwebRecord, version: 'v2', rrwebVersion: version }\nassignableWindow.rrwebConsoleRecord = { getRecordConsolePlugin }\nassignableWindow.getRecordNetworkPlugin = getRecordNetworkPlugin\n\nexport default rrwebRecord\n"]}
@@ -32,5 +32,6 @@ export declare class SessionIdManager {
32
32
  activityTimeout: boolean;
33
33
  sessionPastMaximumLength: boolean;
34
34
  } | undefined;
35
+ lastActivityTimestamp: number;
35
36
  };
36
37
  }
@@ -229,6 +229,7 @@ var SessionIdManager = /** @class */ (function () {
229
229
  windowId: windowId,
230
230
  sessionStartTimestamp: sessionStartTimestamp,
231
231
  changeReason: valuesChanged ? { noSessionId: noSessionId, activityTimeout: activityTimeout, sessionPastMaximumLength: sessionPastMaximumLength } : undefined,
232
+ lastActivityTimestamp: lastTimestamp,
232
233
  };
233
234
  };
234
235
  return SessionIdManager;
@@ -1 +1 @@
1
- {"version":3,"file":"sessionid.js","sourceRoot":"","sources":["../../src/sessionid.ts"],"names":[],"mappings":"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","sourcesContent":["import { PostHogPersistence } from './posthog-persistence'\nimport { SESSION_ID } from './constants'\nimport { sessionStore } from './storage'\nimport { PostHogConfig, SessionIdChangedCallback } from './types'\nimport { uuid7ToTimestampMs, uuidv7 } from './uuidv7'\nimport { window } from './utils/globals'\n\nimport { isArray, isNumber, isUndefined } from './utils/type-utils'\nimport { logger } from './utils/logger'\n\nconst MAX_SESSION_IDLE_TIMEOUT = 30 * 60 // 30 minutes\nconst MIN_SESSION_IDLE_TIMEOUT = 60 // 1 minute\nconst SESSION_LENGTH_LIMIT = 24 * 3600 * 1000 // 24 hours\n\nexport class SessionIdManager {\n private readonly _sessionIdGenerator: () => string\n private readonly _windowIdGenerator: () => string\n private config: Partial<PostHogConfig>\n private persistence: PostHogPersistence\n private _windowId: string | null | undefined\n private _sessionId: string | null | undefined\n private readonly _window_id_storage_key: string\n private readonly _primary_window_exists_storage_key: string\n private _sessionStartTimestamp: number | null\n\n private _sessionActivityTimestamp: number | null\n private _sessionIdChangedHandlers: SessionIdChangedCallback[] = []\n private readonly _sessionTimeoutMs: number\n\n constructor(\n config: Partial<PostHogConfig>,\n persistence: PostHogPersistence,\n sessionIdGenerator?: () => string,\n windowIdGenerator?: () => string\n ) {\n this.config = config\n this.persistence = persistence\n this._windowId = undefined\n this._sessionId = undefined\n this._sessionStartTimestamp = null\n this._sessionActivityTimestamp = null\n this._sessionIdGenerator = sessionIdGenerator || uuidv7\n this._windowIdGenerator = windowIdGenerator || uuidv7\n\n const persistenceName = config['persistence_name'] || config['token']\n let desiredTimeout = config['session_idle_timeout_seconds'] || MAX_SESSION_IDLE_TIMEOUT\n\n if (!isNumber(desiredTimeout)) {\n logger.warn('session_idle_timeout_seconds must be a number. Defaulting to 30 minutes.')\n desiredTimeout = MAX_SESSION_IDLE_TIMEOUT\n } else if (desiredTimeout > MAX_SESSION_IDLE_TIMEOUT) {\n logger.warn('session_idle_timeout_seconds cannot be greater than 30 minutes. Using 30 minutes instead.')\n } else if (desiredTimeout < MIN_SESSION_IDLE_TIMEOUT) {\n logger.warn('session_idle_timeout_seconds cannot be less than 60 seconds. Using 60 seconds instead.')\n }\n\n this._sessionTimeoutMs =\n Math.min(Math.max(desiredTimeout, MIN_SESSION_IDLE_TIMEOUT), MAX_SESSION_IDLE_TIMEOUT) * 1000\n this._window_id_storage_key = 'ph_' + persistenceName + '_window_id'\n this._primary_window_exists_storage_key = 'ph_' + persistenceName + '_primary_window_exists'\n\n // primary_window_exists is set when the DOM has been loaded and is cleared on unload\n // if it exists here it means there was no unload which suggests this window is opened as a tab duplication, window.open, etc.\n if (this._canUseSessionStorage()) {\n const lastWindowId = sessionStore.parse(this._window_id_storage_key)\n\n const primaryWindowExists = sessionStore.parse(this._primary_window_exists_storage_key)\n if (lastWindowId && !primaryWindowExists) {\n // Persist window from previous storage state\n this._windowId = lastWindowId\n } else {\n // Wipe any reference to previous window id\n sessionStore.remove(this._window_id_storage_key)\n }\n // Flag this session as having a primary window\n sessionStore.set(this._primary_window_exists_storage_key, true)\n }\n\n if (this.config.bootstrap?.sessionID) {\n try {\n const sessionStartTimestamp = uuid7ToTimestampMs(this.config.bootstrap.sessionID)\n this._setSessionId(this.config.bootstrap.sessionID, new Date().getTime(), sessionStartTimestamp)\n } catch (e) {\n logger.error('Invalid sessionID in bootstrap', e)\n }\n }\n\n this._listenToReloadWindow()\n }\n\n get sessionTimeoutMs(): number {\n return this._sessionTimeoutMs\n }\n\n onSessionId(callback: SessionIdChangedCallback): () => void {\n // KLUDGE: when running in tests the handlers array was always undefined\n // it's yucky but safe to set it here so that it's always definitely available\n if (isUndefined(this._sessionIdChangedHandlers)) {\n this._sessionIdChangedHandlers = []\n }\n\n this._sessionIdChangedHandlers.push(callback)\n if (this._sessionId) {\n callback(this._sessionId, this._windowId)\n }\n return () => {\n this._sessionIdChangedHandlers = this._sessionIdChangedHandlers.filter((h) => h !== callback)\n }\n }\n\n private _canUseSessionStorage(): boolean {\n // We only want to use sessionStorage if persistence is enabled and not memory storage\n return this.config.persistence !== 'memory' && !this.persistence.disabled && sessionStore.is_supported()\n }\n\n // Note: this tries to store the windowId in sessionStorage. SessionStorage is unique to the current window/tab,\n // and persists page loads/reloads. So it's uniquely suited for storing the windowId. This function also respects\n // when persistence is disabled (by user config) and when sessionStorage is not supported (it *should* be supported on all browsers),\n // and in that case, it falls back to memory (which sadly, won't persist page loads)\n private _setWindowId(windowId: string): void {\n if (windowId !== this._windowId) {\n this._windowId = windowId\n if (this._canUseSessionStorage()) {\n sessionStore.set(this._window_id_storage_key, windowId)\n }\n }\n }\n\n private _getWindowId(): string | null {\n if (this._windowId) {\n return this._windowId\n }\n if (this._canUseSessionStorage()) {\n return sessionStore.parse(this._window_id_storage_key)\n }\n // New window id will be generated\n return null\n }\n\n // Note: 'this.persistence.register' can be disabled in the config.\n // In that case, this works by storing sessionId and the timestamp in memory.\n private _setSessionId(\n sessionId: string | null,\n sessionActivityTimestamp: number | null,\n sessionStartTimestamp: number | null\n ): void {\n if (\n sessionId !== this._sessionId ||\n sessionActivityTimestamp !== this._sessionActivityTimestamp ||\n sessionStartTimestamp !== this._sessionStartTimestamp\n ) {\n this._sessionStartTimestamp = sessionStartTimestamp\n this._sessionActivityTimestamp = sessionActivityTimestamp\n this._sessionId = sessionId\n\n this.persistence.register({\n [SESSION_ID]: [sessionActivityTimestamp, sessionId, sessionStartTimestamp],\n })\n }\n }\n\n private _getSessionId(): [number, string, number] {\n if (this._sessionId && this._sessionActivityTimestamp && this._sessionStartTimestamp) {\n return [this._sessionActivityTimestamp, this._sessionId, this._sessionStartTimestamp]\n }\n const sessionId = this.persistence.props[SESSION_ID]\n\n if (isArray(sessionId) && sessionId.length === 2) {\n // Storage does not yet have a session start time. Add the last activity timestamp as the start time\n sessionId.push(sessionId[0])\n }\n\n return sessionId || [0, null, 0]\n }\n\n // Resets the session id by setting it to null. On the subsequent call to checkAndGetSessionAndWindowId,\n // new ids will be generated.\n resetSessionId(): void {\n this._setSessionId(null, null, null)\n }\n\n /*\n * Listens to window unloads and removes the primaryWindowExists key from sessionStorage.\n * Reloaded or fresh tabs created after a DOM unloads (reloading the same tab) WILL NOT have this primaryWindowExists flag in session storage.\n * Cloned sessions (new tab, tab duplication, window.open(), ...) WILL have this primaryWindowExists flag in their copied session storage.\n * We conditionally check the primaryWindowExists value in the constructor to decide if the window id in the last session storage should be carried over.\n */\n private _listenToReloadWindow(): void {\n window?.addEventListener('beforeunload', () => {\n if (this._canUseSessionStorage()) {\n sessionStore.remove(this._primary_window_exists_storage_key)\n }\n })\n }\n\n /*\n * This function returns the current sessionId and windowId. It should be used to\n * access these values over directly calling `._sessionId` or `._windowId`.\n * In addition to returning the sessionId and windowId, this function also manages cycling the\n * sessionId and windowId when appropriate by doing the following:\n *\n * 1. If the sessionId or windowId is not set, it will generate a new one and store it.\n * 2. If the readOnly param is set to false, it will:\n * a. Check if it has been > SESSION_CHANGE_THRESHOLD since the last call with this flag set.\n * If so, it will generate a new sessionId and store it.\n * b. Update the timestamp stored with the sessionId to ensure the current session is extended\n * for the appropriate amount of time.\n *\n * @param {boolean} readOnly (optional) Defaults to False. Should be set to True when the call to the function should not extend or cycle the session (e.g. being called for non-user generated events)\n * @param {Number} timestamp (optional) Defaults to the current time. The timestamp to be stored with the sessionId (used when determining if a new sessionId should be generated)\n */\n checkAndGetSessionAndWindowId(readOnly = false, _timestamp: number | null = null) {\n const timestamp = _timestamp || new Date().getTime()\n\n // eslint-disable-next-line prefer-const\n let [lastTimestamp, sessionId, startTimestamp] = this._getSessionId()\n let windowId = this._getWindowId()\n\n const sessionPastMaximumLength =\n isNumber(startTimestamp) &&\n startTimestamp > 0 &&\n Math.abs(timestamp - startTimestamp) > SESSION_LENGTH_LIMIT\n\n let valuesChanged = false\n const noSessionId = !sessionId\n const activityTimeout = !readOnly && Math.abs(timestamp - lastTimestamp) > this.sessionTimeoutMs\n if (noSessionId || activityTimeout || sessionPastMaximumLength) {\n sessionId = this._sessionIdGenerator()\n windowId = this._windowIdGenerator()\n logger.info('[SessionId] new session ID generated', {\n sessionId,\n windowId,\n changeReason: { noSessionId, activityTimeout, sessionPastMaximumLength },\n })\n startTimestamp = timestamp\n valuesChanged = true\n } else if (!windowId) {\n windowId = this._windowIdGenerator()\n valuesChanged = true\n }\n\n const newTimestamp = lastTimestamp === 0 || !readOnly || sessionPastMaximumLength ? timestamp : lastTimestamp\n const sessionStartTimestamp = startTimestamp === 0 ? new Date().getTime() : startTimestamp\n\n this._setWindowId(windowId)\n this._setSessionId(sessionId, newTimestamp, sessionStartTimestamp)\n\n if (valuesChanged) {\n this._sessionIdChangedHandlers.forEach((handler) =>\n handler(\n sessionId,\n windowId,\n valuesChanged ? { noSessionId, activityTimeout, sessionPastMaximumLength } : undefined\n )\n )\n }\n\n return {\n sessionId,\n windowId,\n sessionStartTimestamp,\n changeReason: valuesChanged ? { noSessionId, activityTimeout, sessionPastMaximumLength } : undefined,\n }\n }\n}\n"]}
1
+ {"version":3,"file":"sessionid.js","sourceRoot":"","sources":["../../src/sessionid.ts"],"names":[],"mappings":"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","sourcesContent":["import { PostHogPersistence } from './posthog-persistence'\nimport { SESSION_ID } from './constants'\nimport { sessionStore } from './storage'\nimport { PostHogConfig, SessionIdChangedCallback } from './types'\nimport { uuid7ToTimestampMs, uuidv7 } from './uuidv7'\nimport { window } from './utils/globals'\n\nimport { isArray, isNumber, isUndefined } from './utils/type-utils'\nimport { logger } from './utils/logger'\n\nconst MAX_SESSION_IDLE_TIMEOUT = 30 * 60 // 30 minutes\nconst MIN_SESSION_IDLE_TIMEOUT = 60 // 1 minute\nconst SESSION_LENGTH_LIMIT = 24 * 3600 * 1000 // 24 hours\n\nexport class SessionIdManager {\n private readonly _sessionIdGenerator: () => string\n private readonly _windowIdGenerator: () => string\n private config: Partial<PostHogConfig>\n private persistence: PostHogPersistence\n private _windowId: string | null | undefined\n private _sessionId: string | null | undefined\n private readonly _window_id_storage_key: string\n private readonly _primary_window_exists_storage_key: string\n private _sessionStartTimestamp: number | null\n\n private _sessionActivityTimestamp: number | null\n private _sessionIdChangedHandlers: SessionIdChangedCallback[] = []\n private readonly _sessionTimeoutMs: number\n\n constructor(\n config: Partial<PostHogConfig>,\n persistence: PostHogPersistence,\n sessionIdGenerator?: () => string,\n windowIdGenerator?: () => string\n ) {\n this.config = config\n this.persistence = persistence\n this._windowId = undefined\n this._sessionId = undefined\n this._sessionStartTimestamp = null\n this._sessionActivityTimestamp = null\n this._sessionIdGenerator = sessionIdGenerator || uuidv7\n this._windowIdGenerator = windowIdGenerator || uuidv7\n\n const persistenceName = config['persistence_name'] || config['token']\n let desiredTimeout = config['session_idle_timeout_seconds'] || MAX_SESSION_IDLE_TIMEOUT\n\n if (!isNumber(desiredTimeout)) {\n logger.warn('session_idle_timeout_seconds must be a number. Defaulting to 30 minutes.')\n desiredTimeout = MAX_SESSION_IDLE_TIMEOUT\n } else if (desiredTimeout > MAX_SESSION_IDLE_TIMEOUT) {\n logger.warn('session_idle_timeout_seconds cannot be greater than 30 minutes. Using 30 minutes instead.')\n } else if (desiredTimeout < MIN_SESSION_IDLE_TIMEOUT) {\n logger.warn('session_idle_timeout_seconds cannot be less than 60 seconds. Using 60 seconds instead.')\n }\n\n this._sessionTimeoutMs =\n Math.min(Math.max(desiredTimeout, MIN_SESSION_IDLE_TIMEOUT), MAX_SESSION_IDLE_TIMEOUT) * 1000\n this._window_id_storage_key = 'ph_' + persistenceName + '_window_id'\n this._primary_window_exists_storage_key = 'ph_' + persistenceName + '_primary_window_exists'\n\n // primary_window_exists is set when the DOM has been loaded and is cleared on unload\n // if it exists here it means there was no unload which suggests this window is opened as a tab duplication, window.open, etc.\n if (this._canUseSessionStorage()) {\n const lastWindowId = sessionStore.parse(this._window_id_storage_key)\n\n const primaryWindowExists = sessionStore.parse(this._primary_window_exists_storage_key)\n if (lastWindowId && !primaryWindowExists) {\n // Persist window from previous storage state\n this._windowId = lastWindowId\n } else {\n // Wipe any reference to previous window id\n sessionStore.remove(this._window_id_storage_key)\n }\n // Flag this session as having a primary window\n sessionStore.set(this._primary_window_exists_storage_key, true)\n }\n\n if (this.config.bootstrap?.sessionID) {\n try {\n const sessionStartTimestamp = uuid7ToTimestampMs(this.config.bootstrap.sessionID)\n this._setSessionId(this.config.bootstrap.sessionID, new Date().getTime(), sessionStartTimestamp)\n } catch (e) {\n logger.error('Invalid sessionID in bootstrap', e)\n }\n }\n\n this._listenToReloadWindow()\n }\n\n get sessionTimeoutMs(): number {\n return this._sessionTimeoutMs\n }\n\n onSessionId(callback: SessionIdChangedCallback): () => void {\n // KLUDGE: when running in tests the handlers array was always undefined\n // it's yucky but safe to set it here so that it's always definitely available\n if (isUndefined(this._sessionIdChangedHandlers)) {\n this._sessionIdChangedHandlers = []\n }\n\n this._sessionIdChangedHandlers.push(callback)\n if (this._sessionId) {\n callback(this._sessionId, this._windowId)\n }\n return () => {\n this._sessionIdChangedHandlers = this._sessionIdChangedHandlers.filter((h) => h !== callback)\n }\n }\n\n private _canUseSessionStorage(): boolean {\n // We only want to use sessionStorage if persistence is enabled and not memory storage\n return this.config.persistence !== 'memory' && !this.persistence.disabled && sessionStore.is_supported()\n }\n\n // Note: this tries to store the windowId in sessionStorage. SessionStorage is unique to the current window/tab,\n // and persists page loads/reloads. So it's uniquely suited for storing the windowId. This function also respects\n // when persistence is disabled (by user config) and when sessionStorage is not supported (it *should* be supported on all browsers),\n // and in that case, it falls back to memory (which sadly, won't persist page loads)\n private _setWindowId(windowId: string): void {\n if (windowId !== this._windowId) {\n this._windowId = windowId\n if (this._canUseSessionStorage()) {\n sessionStore.set(this._window_id_storage_key, windowId)\n }\n }\n }\n\n private _getWindowId(): string | null {\n if (this._windowId) {\n return this._windowId\n }\n if (this._canUseSessionStorage()) {\n return sessionStore.parse(this._window_id_storage_key)\n }\n // New window id will be generated\n return null\n }\n\n // Note: 'this.persistence.register' can be disabled in the config.\n // In that case, this works by storing sessionId and the timestamp in memory.\n private _setSessionId(\n sessionId: string | null,\n sessionActivityTimestamp: number | null,\n sessionStartTimestamp: number | null\n ): void {\n if (\n sessionId !== this._sessionId ||\n sessionActivityTimestamp !== this._sessionActivityTimestamp ||\n sessionStartTimestamp !== this._sessionStartTimestamp\n ) {\n this._sessionStartTimestamp = sessionStartTimestamp\n this._sessionActivityTimestamp = sessionActivityTimestamp\n this._sessionId = sessionId\n\n this.persistence.register({\n [SESSION_ID]: [sessionActivityTimestamp, sessionId, sessionStartTimestamp],\n })\n }\n }\n\n private _getSessionId(): [number, string, number] {\n if (this._sessionId && this._sessionActivityTimestamp && this._sessionStartTimestamp) {\n return [this._sessionActivityTimestamp, this._sessionId, this._sessionStartTimestamp]\n }\n const sessionId = this.persistence.props[SESSION_ID]\n\n if (isArray(sessionId) && sessionId.length === 2) {\n // Storage does not yet have a session start time. Add the last activity timestamp as the start time\n sessionId.push(sessionId[0])\n }\n\n return sessionId || [0, null, 0]\n }\n\n // Resets the session id by setting it to null. On the subsequent call to checkAndGetSessionAndWindowId,\n // new ids will be generated.\n resetSessionId(): void {\n this._setSessionId(null, null, null)\n }\n\n /*\n * Listens to window unloads and removes the primaryWindowExists key from sessionStorage.\n * Reloaded or fresh tabs created after a DOM unloads (reloading the same tab) WILL NOT have this primaryWindowExists flag in session storage.\n * Cloned sessions (new tab, tab duplication, window.open(), ...) WILL have this primaryWindowExists flag in their copied session storage.\n * We conditionally check the primaryWindowExists value in the constructor to decide if the window id in the last session storage should be carried over.\n */\n private _listenToReloadWindow(): void {\n window?.addEventListener('beforeunload', () => {\n if (this._canUseSessionStorage()) {\n sessionStore.remove(this._primary_window_exists_storage_key)\n }\n })\n }\n\n /*\n * This function returns the current sessionId and windowId. It should be used to\n * access these values over directly calling `._sessionId` or `._windowId`.\n * In addition to returning the sessionId and windowId, this function also manages cycling the\n * sessionId and windowId when appropriate by doing the following:\n *\n * 1. If the sessionId or windowId is not set, it will generate a new one and store it.\n * 2. If the readOnly param is set to false, it will:\n * a. Check if it has been > SESSION_CHANGE_THRESHOLD since the last call with this flag set.\n * If so, it will generate a new sessionId and store it.\n * b. Update the timestamp stored with the sessionId to ensure the current session is extended\n * for the appropriate amount of time.\n *\n * @param {boolean} readOnly (optional) Defaults to False. Should be set to True when the call to the function should not extend or cycle the session (e.g. being called for non-user generated events)\n * @param {Number} timestamp (optional) Defaults to the current time. The timestamp to be stored with the sessionId (used when determining if a new sessionId should be generated)\n */\n checkAndGetSessionAndWindowId(readOnly = false, _timestamp: number | null = null) {\n const timestamp = _timestamp || new Date().getTime()\n\n // eslint-disable-next-line prefer-const\n let [lastTimestamp, sessionId, startTimestamp] = this._getSessionId()\n let windowId = this._getWindowId()\n\n const sessionPastMaximumLength =\n isNumber(startTimestamp) &&\n startTimestamp > 0 &&\n Math.abs(timestamp - startTimestamp) > SESSION_LENGTH_LIMIT\n\n let valuesChanged = false\n const noSessionId = !sessionId\n const activityTimeout = !readOnly && Math.abs(timestamp - lastTimestamp) > this.sessionTimeoutMs\n if (noSessionId || activityTimeout || sessionPastMaximumLength) {\n sessionId = this._sessionIdGenerator()\n windowId = this._windowIdGenerator()\n logger.info('[SessionId] new session ID generated', {\n sessionId,\n windowId,\n changeReason: { noSessionId, activityTimeout, sessionPastMaximumLength },\n })\n startTimestamp = timestamp\n valuesChanged = true\n } else if (!windowId) {\n windowId = this._windowIdGenerator()\n valuesChanged = true\n }\n\n const newTimestamp = lastTimestamp === 0 || !readOnly || sessionPastMaximumLength ? timestamp : lastTimestamp\n const sessionStartTimestamp = startTimestamp === 0 ? new Date().getTime() : startTimestamp\n\n this._setWindowId(windowId)\n this._setSessionId(sessionId, newTimestamp, sessionStartTimestamp)\n\n if (valuesChanged) {\n this._sessionIdChangedHandlers.forEach((handler) =>\n handler(\n sessionId,\n windowId,\n valuesChanged ? { noSessionId, activityTimeout, sessionPastMaximumLength } : undefined\n )\n )\n }\n\n return {\n sessionId,\n windowId,\n sessionStartTimestamp,\n changeReason: valuesChanged ? { noSessionId, activityTimeout, sessionPastMaximumLength } : undefined,\n lastActivityTimestamp: lastTimestamp,\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "posthog-js",
3
- "version": "1.174.2",
3
+ "version": "1.174.4",
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",
@@ -58,7 +58,7 @@
58
58
  "@rollup/plugin-node-resolve": "^15.3.0",
59
59
  "@rollup/plugin-terser": "^0.4.4",
60
60
  "@rollup/plugin-typescript": "^12.1.1",
61
- "@rrweb/types": "2.0.0-alpha.13",
61
+ "@rrweb/types": "2.0.0-alpha.16",
62
62
  "@sentry/types": "8.7.0",
63
63
  "@testing-library/dom": "^9.3.0",
64
64
  "@testing-library/jest-dom": "^6.5.0",
@@ -103,8 +103,9 @@
103
103
  "rollup": "^4.24.0",
104
104
  "rollup-plugin-dts": "^6.1.1",
105
105
  "rollup-plugin-visualizer": "^5.12.0",
106
- "rrweb": "2.0.0-alpha.13",
107
- "rrweb-snapshot": "2.0.0-alpha.13",
106
+ "rrweb": "2.0.0-alpha.16",
107
+ "@rrweb/rrweb-plugin-console-record": "2.0.0-alpha.15",
108
+ "rrweb-snapshot": "2.0.0-alpha.16",
108
109
  "sinon": "9.0.2",
109
110
  "testcafe": "1.19.0",
110
111
  "testcafe-browser-provider-browserstack": "1.14.0",
@@ -126,7 +127,7 @@
126
127
  ],
127
128
  "pnpm": {
128
129
  "patchedDependencies": {
129
- "rrweb@2.0.0-alpha.13": "patches/rrweb@2.0.0-alpha.13.patch"
130
+ "rrweb@2.0.0-alpha.16": "patches/rrweb@2.0.0-alpha.16.patch"
130
131
  }
131
132
  }
132
133
  }