@launchdarkly/o11y 1.3.1 → 1.4.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/CHANGELOG.md +22 -0
- package/dist/LDObserve-BQr7RYVC.js +130 -0
- package/dist/LDObserve-BQr7RYVC.js.map +1 -0
- package/dist/LDObserve.d.ts +73 -1
- package/dist/LDObserve.js +2 -2
- package/dist/LDRecord.d.ts +73 -1
- package/dist/LDRecord.js +43 -24
- package/dist/LDRecord.js.map +1 -1
- package/dist/buffer-CwCRPuMA.js +248 -0
- package/dist/buffer-CwCRPuMA.js.map +1 -0
- package/dist/{common-BjaGmQrE.js → common-D8kkCWo3.js} +721 -689
- package/dist/{common-BjaGmQrE.js.map → common-D8kkCWo3.js.map} +1 -1
- package/dist/index.d.ts +103 -5
- package/dist/index.js +335 -365
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +112 -112
- package/dist/index.umd.js.map +1 -1
- package/dist/{observe-D78YYNE1.js → observe-BCebRa17.js} +2055 -2044
- package/dist/{observe-D78YYNE1.js.map → observe-BCebRa17.js.map} +1 -1
- package/dist/observe.d.ts +21 -1
- package/dist/observe.js +4 -4
- package/dist/{record-BZHDLKsW.js → record-DG2IcHxO.js} +38 -47
- package/dist/{record-BZHDLKsW.js.map → record-DG2IcHxO.js.map} +1 -1
- package/dist/record.d.ts +24 -2
- package/dist/record.js +3 -3
- package/package.json +1 -1
- package/dist/LDObserve-DhF3vCDR.js +0 -92
- package/dist/LDObserve-DhF3vCDR.js.map +0 -1
- package/dist/buffer-BjzLorpP.js +0 -124
- package/dist/buffer-BjzLorpP.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/client/listeners/network-listener/utils/web-socket-listener.ts","../src/client/listeners/network-listener/network-listener.ts","../src/client/listeners/first-load-listeners.tsx","../src/client/index.tsx","../src/browserExtension/extensionListener.ts","../src/environments/electron.ts","../src/integrations/segment.ts","../src/listeners/fetch/index.ts","../src/listeners/web-socket/index.ts","../src/index.tsx"],"sourcesContent":["import { WebSocketEvent, WebSocketRequest } from './models'\n\nexport type WebSocketRequestListenerCallback = (event: WebSocketRequest) => void\n\nexport type WebSocketEventListenerCallback = (event: WebSocketEvent) => void\n\nexport type HighlightWebSocketWindow = Window & {\n\t/**\n\t * Callback for web socket open and close events that are displayed in the network requests\n\t */\n\t_highlightWebSocketRequestCallback: WebSocketRequestListenerCallback\n\t/**\n\t * Callback for web socket message and error events that are displayed under the websocket requests\n\t */\n\t_highlightWebSocketEventCallback: WebSocketEventListenerCallback\n\tWebSocket: any\n}\n\ndeclare var window: HighlightWebSocketWindow\n\nconst WebSocketListener = (\n\trequestCallback: WebSocketRequestListenerCallback,\n\teventCallback: WebSocketEventListenerCallback,\n\turlBlocklist: string[],\n) => {\n\tconst initialHighlightWebSocketRequestCallback =\n\t\twindow._highlightWebSocketRequestCallback\n\twindow._highlightWebSocketRequestCallback = requestCallback\n\n\tconst initialHighlightWebSocketEventCallback =\n\t\twindow._highlightWebSocketEventCallback\n\twindow._highlightWebSocketEventCallback = (eventData: WebSocketEvent) => {\n\t\tconst { message, size, ...visibleEventData } = eventData\n\t\tconst blockedUrl = urlBlocklist.some((blockedUrl) =>\n\t\t\teventData.name.toLowerCase().includes(blockedUrl),\n\t\t)\n\n\t\tconst redactedEventData = blockedUrl ? visibleEventData : eventData\n\n\t\teventCallback(redactedEventData)\n\t}\n\n\treturn () => {\n\t\twindow._highlightWebSocketRequestCallback =\n\t\t\tinitialHighlightWebSocketRequestCallback\n\t\twindow._highlightWebSocketEventCallback =\n\t\t\tinitialHighlightWebSocketEventCallback\n\t}\n}\n\nexport { WebSocketListener }\n","import { NetworkRecordingOptions } from '../../types/client'\nimport { FetchListener } from './utils/fetch-listener'\nimport { RequestResponsePair } from './utils/models'\nimport {\n\tWebSocketEventListenerCallback,\n\tWebSocketListener,\n\tWebSocketRequestListenerCallback,\n} from './utils/web-socket-listener'\nimport { XHRListener } from './utils/xhr-listener'\n\nexport type NetworkListenerCallback = (\n\trequestResponsePair: RequestResponsePair,\n) => void\n\ntype NetworkListenerArguments = {\n\txhrCallback: NetworkListenerCallback\n\tfetchCallback: NetworkListenerCallback\n\twebSocketRequestCallback: WebSocketRequestListenerCallback\n\twebSocketEventCallback: WebSocketEventListenerCallback\n\tdisableWebSocketRecording: boolean\n\tbodyKeysToRedact: string[]\n\thighlightEndpoints: string[]\n\ttracingOrigins: boolean | (string | RegExp)[]\n\turlBlocklist: string[]\n} & Pick<NetworkRecordingOptions, 'bodyKeysToRecord'>\n\nexport const NetworkListener = ({\n\txhrCallback,\n\tfetchCallback,\n\twebSocketRequestCallback,\n\twebSocketEventCallback,\n\tdisableWebSocketRecording,\n\tbodyKeysToRedact,\n\thighlightEndpoints,\n\ttracingOrigins,\n\turlBlocklist,\n\tbodyKeysToRecord,\n}: NetworkListenerArguments) => {\n\tconst removeXHRListener = XHRListener(\n\t\txhrCallback,\n\t\thighlightEndpoints,\n\t\ttracingOrigins,\n\t\turlBlocklist,\n\t\tbodyKeysToRedact,\n\t\tbodyKeysToRecord,\n\t)\n\tconst removeFetchListener = FetchListener(\n\t\tfetchCallback,\n\t\thighlightEndpoints,\n\t\ttracingOrigins,\n\t\turlBlocklist,\n\t\tbodyKeysToRedact,\n\t\tbodyKeysToRecord,\n\t)\n\n\tconst removeWebSocketListener = !disableWebSocketRecording\n\t\t? WebSocketListener(\n\t\t\t\twebSocketRequestCallback,\n\t\t\t\twebSocketEventCallback,\n\t\t\t\turlBlocklist,\n\t\t\t)\n\t\t: () => {}\n\n\treturn () => {\n\t\tremoveXHRListener()\n\t\tremoveFetchListener()\n\t\tremoveWebSocketListener()\n\t}\n}\n","import { ConsoleListener, defaultLogOptions } from './console-listener'\nimport { ErrorListener } from './error-listener'\n\nimport stringify from 'json-stringify-safe'\nimport { ERRORS_TO_IGNORE, ERROR_PATTERNS_TO_IGNORE } from '../constants/errors'\nimport { HighlightClassOptions } from '../index'\nimport { shutdown } from '../otel'\nimport { ALL_CONSOLE_METHODS, ConsoleMethods } from '../types/client'\nimport { ConsoleMessage, ErrorMessage } from '../types/shared-types'\nimport { NetworkListener } from './network-listener/network-listener'\nimport {\n\tRequestResponsePair,\n\tWebSocketEvent,\n\tWebSocketRequest,\n} from './network-listener/utils/models'\nimport { DEFAULT_URL_BLOCKLIST } from './network-listener/utils/network-sanitizer'\nimport {\n\tmatchPerformanceTimingsWithRequestResponsePair,\n\tshouldNetworkRequestBeRecorded,\n} from './network-listener/utils/utils'\nimport randomUuidV4 from '../utils/randomUuidV4'\n\n// Note: This class is used by both firstload and client. When constructed in client, it will match the current\n// codebase. When constructed in firstload, it will match the codebase at the time the npm package was published.\nexport class FirstLoadListeners {\n\tdisableConsoleRecording: boolean\n\treportConsoleErrors: boolean\n\tenablePromisePatch: boolean\n\tconsoleMethodsToRecord: ConsoleMethods[]\n\tlisteners: (() => void)[]\n\terrors: ErrorMessage[]\n\tmessages: ConsoleMessage[]\n\t// The properties below were added in 4.0.0 (Feb 2022), and are patched in by client via setupNetworkListeners()\n\toptions: HighlightClassOptions\n\thasNetworkRecording: boolean | undefined = true\n\tdisableNetworkRecording!: boolean\n\tenableRecordingNetworkContents!: boolean\n\txhrNetworkContents!: RequestResponsePair[]\n\tfetchNetworkContents!: RequestResponsePair[]\n\tdisableRecordingWebSocketContents!: boolean\n\twebSocketNetworkContents!: WebSocketRequest[] | undefined\n\twebSocketEventContents!: WebSocketEvent[]\n\ttracingOrigins!: boolean | (string | RegExp)[]\n\tnetworkHeadersToRedact!: string[]\n\tnetworkBodyKeysToRedact: string[] | undefined\n\tnetworkBodyKeysToRecord: string[] | undefined\n\tnetworkHeaderKeysToRecord: string[] | undefined\n\tlastNetworkRequestTimestamp: number\n\turlBlocklist!: string[]\n\thighlightEndpoints!: string[]\n\trequestResponseSanitizer?: (\n\t\tpair: RequestResponsePair,\n\t) => RequestResponsePair | null\n\n\tconstructor(options: HighlightClassOptions) {\n\t\tthis.options = options\n\t\tthis.disableConsoleRecording = !!options.disableConsoleRecording\n\t\tthis.reportConsoleErrors = options.reportConsoleErrors ?? false\n\t\tthis.enablePromisePatch = options.enablePromisePatch ?? false\n\t\tthis.consoleMethodsToRecord = options.consoleMethodsToRecord || [\n\t\t\t...ALL_CONSOLE_METHODS,\n\t\t]\n\t\tthis.listeners = []\n\t\tthis.errors = []\n\t\tthis.messages = []\n\t\tthis.lastNetworkRequestTimestamp = 0\n\t}\n\n\tisListening() {\n\t\treturn this.listeners.length > 0\n\t}\n\n\tstartListening() {\n\t\tif (this.isListening()) return\n\t\tconst highlightThis = this\n\t\tif (!this.disableConsoleRecording) {\n\t\t\tthis.listeners.push(\n\t\t\t\tConsoleListener(\n\t\t\t\t\t(c: ConsoleMessage) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tthis.reportConsoleErrors &&\n\t\t\t\t\t\t\t(c.type === 'Error' || c.type === 'error') &&\n\t\t\t\t\t\t\tc.value &&\n\t\t\t\t\t\t\tc.trace\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst errorValue = stringify(c.value)\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tERRORS_TO_IGNORE.includes(errorValue) ||\n\t\t\t\t\t\t\t\tERROR_PATTERNS_TO_IGNORE.some((pattern) =>\n\t\t\t\t\t\t\t\t\terrorValue.includes(pattern),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\thighlightThis.errors.push({\n\t\t\t\t\t\t\t\tevent: errorValue,\n\t\t\t\t\t\t\t\ttype: 'console.error',\n\t\t\t\t\t\t\t\turl: window.location.href,\n\t\t\t\t\t\t\t\tsource: c.trace[0]?.fileName\n\t\t\t\t\t\t\t\t\t? c.trace[0].fileName\n\t\t\t\t\t\t\t\t\t: '',\n\t\t\t\t\t\t\t\tlineNumber: c.trace[0]?.lineNumber\n\t\t\t\t\t\t\t\t\t? c.trace[0].lineNumber\n\t\t\t\t\t\t\t\t\t: 0,\n\t\t\t\t\t\t\t\tcolumnNumber: c.trace[0]?.columnNumber\n\t\t\t\t\t\t\t\t\t? c.trace[0].columnNumber\n\t\t\t\t\t\t\t\t\t: 0,\n\t\t\t\t\t\t\t\tstackTrace: c.trace,\n\t\t\t\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t\t\t\t\tid: randomUuidV4(),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t\thighlightThis.messages.push(c)\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t...defaultLogOptions,\n\t\t\t\t\t\tlevel: this.consoleMethodsToRecord,\n\t\t\t\t\t\trecordLaunchDarklySdkLogs:\n\t\t\t\t\t\t\tthis.options.recordLaunchDarklySdkLogs,\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tthis.listeners.push(\n\t\t\tErrorListener(\n\t\t\t\t(e: ErrorMessage) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tERRORS_TO_IGNORE.includes(e.event) ||\n\t\t\t\t\t\tERROR_PATTERNS_TO_IGNORE.some((pattern) =>\n\t\t\t\t\t\t\te.event.includes(pattern),\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\thighlightThis.errors.push(e)\n\t\t\t\t},\n\t\t\t\t{ enablePromisePatch: this.enablePromisePatch },\n\t\t\t),\n\t\t)\n\t\tthis.listeners.push(shutdown)\n\t\tFirstLoadListeners.setupNetworkListener(this, this.options)\n\t}\n\n\tstopListening() {\n\t\tthis.listeners.forEach((stop: () => void) => stop())\n\t\tthis.listeners = []\n\t}\n\n\t// We define this as a static method because versions earlier than 4.0.0 (Feb 2022) don't have this code.\n\t// For those versions, calling this from client will monkey-patch the network listeners onto the old FirstLoadListener object.\n\tstatic setupNetworkListener(\n\t\tsThis: FirstLoadListeners,\n\t\toptions: HighlightClassOptions,\n\t): void {\n\t\tconst _backendUrl =\n\t\t\toptions?.backendUrl ||\n\t\t\timport.meta.env.REACT_APP_PUBLIC_GRAPH_URI ||\n\t\t\t'https://pub.highlight.io'\n\t\tconst otlpEndpoint = options.otlpEndpoint || 'https://otel.highlight.io'\n\t\tsThis.highlightEndpoints = [\n\t\t\t_backendUrl,\n\t\t\t`${otlpEndpoint}/v1/traces`,\n\t\t\t`${otlpEndpoint}/v1/logs`,\n\t\t\t`${otlpEndpoint}/v1/metrics`,\n\t\t]\n\n\t\tsThis.xhrNetworkContents = []\n\t\tsThis.fetchNetworkContents = []\n\t\tsThis.webSocketNetworkContents = []\n\t\tsThis.webSocketEventContents = []\n\t\tsThis.networkHeadersToRedact = []\n\t\tsThis.urlBlocklist = []\n\t\tsThis.tracingOrigins = options.tracingOrigins || []\n\n\t\t// Old versions of `firstload` use `disableNetworkRecording`. We fork here to ensure backwards compatibility.\n\t\tif (options?.disableNetworkRecording !== undefined) {\n\t\t\tsThis.disableNetworkRecording = options?.disableNetworkRecording\n\t\t\tsThis.enableRecordingNetworkContents = false\n\t\t\tsThis.disableRecordingWebSocketContents = true\n\t\t\tsThis.networkHeadersToRedact = []\n\t\t\tsThis.networkBodyKeysToRedact = []\n\t\t\tsThis.urlBlocklist = []\n\t\t\tsThis.networkBodyKeysToRecord = []\n\t\t} else if (typeof options?.networkRecording === 'boolean') {\n\t\t\tsThis.disableNetworkRecording = !options.networkRecording\n\t\t\tsThis.enableRecordingNetworkContents = false\n\t\t\tsThis.disableRecordingWebSocketContents = true\n\t\t\tsThis.networkHeadersToRedact = []\n\t\t\tsThis.networkBodyKeysToRedact = []\n\t\t\tsThis.urlBlocklist = []\n\t\t} else {\n\t\t\tif (options.networkRecording?.enabled !== undefined) {\n\t\t\t\tsThis.disableNetworkRecording =\n\t\t\t\t\t!options.networkRecording.enabled\n\t\t\t} else {\n\t\t\t\tsThis.disableNetworkRecording = false\n\t\t\t}\n\t\t\tsThis.enableRecordingNetworkContents =\n\t\t\t\toptions.networkRecording?.recordHeadersAndBody || false\n\t\t\tsThis.disableRecordingWebSocketContents =\n\t\t\t\toptions.networkRecording?.disableWebSocketEventRecordings ||\n\t\t\t\tfalse\n\t\t\tsThis.networkHeadersToRedact =\n\t\t\t\toptions.networkRecording?.networkHeadersToRedact?.map(\n\t\t\t\t\t(header) => header.toLowerCase(),\n\t\t\t\t) || []\n\t\t\tsThis.networkBodyKeysToRedact =\n\t\t\t\toptions.networkRecording?.networkBodyKeysToRedact?.map(\n\t\t\t\t\t(bodyKey) => bodyKey.toLowerCase(),\n\t\t\t\t) || []\n\t\t\tsThis.urlBlocklist =\n\t\t\t\toptions.networkRecording?.urlBlocklist?.map((url) =>\n\t\t\t\t\turl.toLowerCase(),\n\t\t\t\t) || []\n\t\t\tsThis.urlBlocklist = [\n\t\t\t\t...sThis.urlBlocklist,\n\t\t\t\t...DEFAULT_URL_BLOCKLIST,\n\t\t\t]\n\n\t\t\tsThis.requestResponseSanitizer =\n\t\t\t\toptions.networkRecording?.requestResponseSanitizer\n\n\t\t\tsThis.networkHeaderKeysToRecord =\n\t\t\t\toptions.networkRecording?.headerKeysToRecord\n\t\t\t// `headerKeysToRecord` override `networkHeadersToRedact`.\n\t\t\tif (sThis.networkHeaderKeysToRecord) {\n\t\t\t\tsThis.networkHeadersToRedact = []\n\t\t\t\tsThis.networkHeaderKeysToRecord =\n\t\t\t\t\tsThis.networkHeaderKeysToRecord.map((key) =>\n\t\t\t\t\t\tkey.toLocaleLowerCase(),\n\t\t\t\t\t)\n\t\t\t}\n\n\t\t\tsThis.networkBodyKeysToRecord =\n\t\t\t\toptions.networkRecording?.bodyKeysToRecord\n\t\t\t// `bodyKeysToRecord` override `networkBodyKeysToRedact`.\n\t\t\tif (sThis.networkBodyKeysToRecord) {\n\t\t\t\tsThis.networkBodyKeysToRedact = []\n\t\t\t\tsThis.networkBodyKeysToRecord =\n\t\t\t\t\tsThis.networkBodyKeysToRecord.map((key) =>\n\t\t\t\t\t\tkey.toLocaleLowerCase(),\n\t\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\t!sThis.disableNetworkRecording &&\n\t\t\tsThis.enableRecordingNetworkContents\n\t\t) {\n\t\t\tsThis.hasNetworkRecording = true\n\t\t\tsThis.listeners.push(\n\t\t\t\tNetworkListener({\n\t\t\t\t\txhrCallback: (requestResponsePair) => {\n\t\t\t\t\t\tsThis.xhrNetworkContents.push(requestResponsePair)\n\t\t\t\t\t},\n\t\t\t\t\tfetchCallback: (requestResponsePair) => {\n\t\t\t\t\t\tsThis.fetchNetworkContents.push(requestResponsePair)\n\t\t\t\t\t},\n\t\t\t\t\twebSocketRequestCallback: (event) => {\n\t\t\t\t\t\tif (sThis.webSocketNetworkContents) {\n\t\t\t\t\t\t\tsThis.webSocketNetworkContents.push(event)\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\twebSocketEventCallback: (event) => {\n\t\t\t\t\t\tsThis.webSocketEventContents.push(event)\n\t\t\t\t\t},\n\t\t\t\t\tdisableWebSocketRecording:\n\t\t\t\t\t\tsThis.disableRecordingWebSocketContents,\n\t\t\t\t\tbodyKeysToRedact: sThis.networkBodyKeysToRedact,\n\t\t\t\t\thighlightEndpoints: sThis.highlightEndpoints,\n\t\t\t\t\ttracingOrigins: sThis.tracingOrigins,\n\t\t\t\t\turlBlocklist: sThis.urlBlocklist,\n\t\t\t\t\tbodyKeysToRecord: sThis.networkBodyKeysToRecord,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t}\n\n\tstatic getRecordedNetworkResources(\n\t\tsThis: FirstLoadListeners,\n\t\trecordingStartTime: number,\n\t): Array<PerformanceResourceTiming | WebSocketRequest> {\n\t\tlet httpResources: Array<PerformanceResourceTiming> = []\n\t\tlet webSocketResources: Array<WebSocketRequest> = []\n\n\t\tif (!sThis.disableNetworkRecording) {\n\t\t\tconst documentTimeOrigin = window?.performance?.timeOrigin || 0\n\t\t\t// get all resources that don't include 'api.highlight.run'\n\t\t\thttpResources = performance.getEntriesByType(\n\t\t\t\t'resource',\n\t\t\t) as PerformanceResourceTiming[]\n\n\t\t\t// Subtract session start time from performance.timeOrigin\n\t\t\t// Subtract diff to the times to do the offsets\n\t\t\tconst offset = (recordingStartTime - documentTimeOrigin) * 2\n\n\t\t\thttpResources = httpResources\n\t\t\t\t.filter((r) => {\n\t\t\t\t\tif (r.responseEnd < sThis.lastNetworkRequestTimestamp) {\n\t\t\t\t\t\treturn false\n\t\t\t\t\t}\n\n\t\t\t\t\treturn shouldNetworkRequestBeRecorded(\n\t\t\t\t\t\tr.name,\n\t\t\t\t\t\tsThis.highlightEndpoints,\n\t\t\t\t\t\tsThis.tracingOrigins,\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t\t.map((resource) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...resource.toJSON(),\n\t\t\t\t\t\toffsetStartTime: resource.startTime - offset,\n\t\t\t\t\t\toffsetResponseEnd: resource.responseEnd - offset,\n\t\t\t\t\t\toffsetFetchStart: resource.fetchStart - offset,\n\t\t\t\t\t}\n\t\t\t\t})\n\n\t\t\tsThis.lastNetworkRequestTimestamp =\n\t\t\t\thttpResources.at(-1)?.responseEnd ||\n\t\t\t\tsThis.lastNetworkRequestTimestamp\n\n\t\t\tif (sThis.enableRecordingNetworkContents) {\n\t\t\t\tconst sanitizeOptions = {\n\t\t\t\t\theadersToRedact: sThis.networkHeadersToRedact,\n\t\t\t\t\theadersToRecord: sThis.networkHeaderKeysToRecord,\n\t\t\t\t\trequestResponseSanitizer: sThis.requestResponseSanitizer,\n\t\t\t\t}\n\n\t\t\t\thttpResources = matchPerformanceTimingsWithRequestResponsePair(\n\t\t\t\t\thttpResources,\n\t\t\t\t\tsThis.xhrNetworkContents,\n\t\t\t\t\t'xmlhttprequest',\n\t\t\t\t\tsanitizeOptions,\n\t\t\t\t)\n\t\t\t\thttpResources = matchPerformanceTimingsWithRequestResponsePair(\n\t\t\t\t\thttpResources,\n\t\t\t\t\tsThis.fetchNetworkContents,\n\t\t\t\t\t'fetch',\n\t\t\t\t\tsanitizeOptions,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\tif (!sThis.disableRecordingWebSocketContents) {\n\t\t\twebSocketResources = sThis.webSocketNetworkContents || []\n\t\t}\n\n\t\treturn [...httpResources, ...webSocketResources]\n\t}\n\n\tstatic getRecordedWebSocketEvents(\n\t\tsThis: FirstLoadListeners,\n\t): Array<WebSocketEvent> {\n\t\tlet webSocketEvents: Array<WebSocketEvent> = []\n\n\t\tif (\n\t\t\t!sThis.disableNetworkRecording &&\n\t\t\t!sThis.disableRecordingWebSocketContents\n\t\t) {\n\t\t\twebSocketEvents = sThis.webSocketEventContents\n\t\t}\n\n\t\treturn webSocketEvents\n\t}\n\n\tstatic clearRecordedNetworkResources(sThis: FirstLoadListeners): void {\n\t\tif (!sThis.disableNetworkRecording) {\n\t\t\tsThis.xhrNetworkContents = []\n\t\t\tsThis.fetchNetworkContents = []\n\t\t\tsThis.webSocketNetworkContents = []\n\t\t\tsThis.webSocketEventContents = []\n\t\t\tperformance.clearResourceTimings()\n\t\t}\n\t}\n}\n","import { getRecordSequentialIdPlugin } from '@highlight-run/rrweb-rrweb-plugin-sequential-id-record'\nimport { eventWithTime, listenerHandler } from '@highlight-run/rrweb-types'\nimport { print } from 'graphql'\nimport { GraphQLClient } from 'graphql-request'\nimport stringify from 'json-stringify-safe'\nimport {\n\taddCustomEvent as rrwebAddCustomEvent,\n\trecord,\n} from '@highlight-run/rrweb'\nimport {\n\tgetSdk,\n\tPushPayloadMutationVariables,\n\tPushSessionEventsDocument,\n\tPushSessionEventsMutationVariables,\n\tSdk,\n} from './graph/generated/operations'\nimport { FirstLoadListeners } from './listeners/first-load-listeners'\nimport { PathListener } from './listeners/path-listener'\nimport {\n\tAmplitudeIntegrationOptions,\n\tConsoleMethods,\n\tDebugOptions,\n\tMetricCategory,\n\tMetricName,\n\tMixpanelIntegrationOptions,\n\tNetworkRecordingOptions,\n\tSessionShortcutOptions,\n} from './types/client'\nimport {\n\tHighlightOptions,\n\tHighlightPublicInterface,\n\tIntegration,\n\tMetadata,\n\tMetric,\n\tPrivacySettingOption,\n\tRecordMetric,\n\tSamplingStrategy,\n\tSessionDetails,\n\tStartOptions,\n} from './types/types'\nimport {\n\tdetermineMaskInputOptions,\n\tdetermineTextPrivacySetting,\n} from './utils/privacy'\n\nimport {\n\tFIRST_SEND_FREQUENCY,\n\tHIGHLIGHT_URL,\n\tMAX_SESSION_LENGTH,\n\tSEND_FREQUENCY,\n\tSNAPSHOT_SETTINGS,\n\tVISIBILITY_DEBOUNCE_MS,\n} from './constants/sessions'\nimport { ReplayEventsInput } from './graph/generated/schemas'\nimport { ClickListener } from './listeners/click-listener/click-listener'\nimport { FocusListener } from './listeners/focus-listener/focus-listener'\nimport {\n\tJankListener,\n\tJankPayload,\n} from './listeners/jank-listener/jank-listener'\nimport { HighlightFetchWindow } from './listeners/network-listener/utils/fetch-listener'\nimport { RequestResponsePair } from './listeners/network-listener/utils/models'\nimport { sanitizeUrl } from './listeners/network-listener/utils/network-sanitizer'\nimport { PageVisibilityListener } from './listeners/page-visibility-listener'\nimport {\n\tPerformanceListener,\n\tPerformancePayload,\n} from './listeners/performance-listener/performance-listener'\nimport { SegmentIntegrationListener } from './listeners/segment-integration-listener'\nimport SessionShortcutListener from './listeners/session-shortcut/session-shortcut-listener'\nimport {\n\tViewportResizeListener,\n\ttype ViewportResizeListenerArgs,\n} from './listeners/viewport-resize-listener'\nimport { WebVitalsListener } from './listeners/web-vitals-listener/web-vitals-listener'\nimport {\n\tNetworkPerformanceListener,\n\tNetworkPerformancePayload,\n} from './listeners/network-listener/performance-listener'\nimport { Logger } from './logger'\nimport { getMeter, getTracer, setupBrowserTracing, shutdown } from './otel'\nimport {\n\tHighlightIframeMessage,\n\tHighlightIframeReponse,\n\tIFRAME_PARENT_READY,\n\tIFRAME_PARENT_RESPONSE,\n} from './types/iframe'\nimport {\n\tConsoleMessage,\n\tErrorMessage,\n\tErrorMessageType,\n\tSource,\n} from './types/shared-types'\nimport { getSimpleSelector } from './utils/dom'\nimport { getGraphQLRequestWrapper } from './utils/graph'\nimport { clearHighlightLogs, getHighlightLogs } from './utils/highlight-logging'\nimport { getPerformanceMethods } from './utils/performance/performance'\nimport { GenerateSecureID } from './utils/secure-id'\nimport {\n\tgetPreviousSessionData,\n\tSessionData,\n\tsetSessionData,\n\tsetSessionSecureID,\n} from './utils/sessionStorage/highlightSession'\nimport { SESSION_STORAGE_KEYS } from './utils/sessionStorage/sessionStorageKeys'\nimport {\n\tgetItem,\n\tLocalStorageKeys,\n\tremoveItem,\n\tsetCookieWriteEnabled,\n\tsetItem,\n\tsetStorageMode,\n} from './utils/storage'\nimport { getDefaultDataURLOptions, isMetricSafeNumber } from './utils/utils'\nimport { metricInstrumentOptions } from './utils/metricUnits'\nimport { type HighlightClientRequestWorker } from './workers/highlight-client-worker'\nimport { payloadToBase64 } from './utils/payload'\nimport HighlightClientWorker from './workers/highlight-client-worker?worker&inline'\nimport { MessageType, PropertyType } from './workers/types'\nimport { parseError } from './utils/errors'\nimport {\n\tAttributes,\n\tCounter,\n\tGauge,\n\tHistogram,\n\tUpDownCounter,\n} from '@opentelemetry/api'\nimport { IntegrationClient } from '../integrations'\nimport { LaunchDarklyIntegration, LDClient } from '../integrations/launchdarkly'\nimport { createLog, defaultLogOptions } from './listeners/console-listener'\nimport { CustomSampler } from './otel/sampling/CustomSampler'\nimport { sdkLog, setSdkDebugLogging } from './utils/sdkLogger'\nimport randomUuidV4 from './utils/randomUuidV4'\nimport { LDContext } from '@launchdarkly/js-client-sdk'\nimport { MaskInputOptions } from './types/record'\nimport { ProductAnalyticsEvents } from './types/observe'\n\nexport const HighlightWarning = (context: string, msg: any) => {\n\tsdkLog('warn', `Highlight Warning: (${context}): `, { output: msg })\n}\n\nexport type HighlightClassOptions = {\n\torganizationID: number | string\n\tdebug?: boolean | DebugOptions\n\tbackendUrl?: string\n\ttracingOrigins?: boolean | (string | RegExp)[]\n\tdisableNetworkRecording?: boolean\n\tnetworkRecording?: boolean | NetworkRecordingOptions\n\tdisableBackgroundRecording?: boolean\n\tdisableConsoleRecording?: boolean\n\tdisableSessionRecording?: boolean\n\treportConsoleErrors?: boolean\n\tconsoleMethodsToRecord?: ConsoleMethods[]\n\trecordLaunchDarklySdkLogs?: boolean\n\tprivacySetting?: PrivacySettingOption\n\tmaskAllInputs?: boolean\n\tmaskInputOptions?: MaskInputOptions\n\tmaskPiiText?: boolean\n\tmaskTextClass?: string | RegExp\n\tmaskTextSelector?: string\n\tblockClass?: string | RegExp\n\tblockSelector?: string\n\tignoreClass?: string\n\tignoreSelector?: string\n\tenableSegmentIntegration?: boolean\n\tenableCanvasRecording?: boolean\n\tenablePerformanceRecording?: boolean\n\tenablePromisePatch?: boolean\n\tsamplingStrategy?: SamplingStrategy\n\tinlineImages?: boolean\n\tinlineVideos?: boolean\n\tinlineStylesheet?: boolean\n\tstyleSheetResyncInterval?: number\n\trecordCrossOriginIframe?: boolean\n\tfirstloadVersion?: string\n\tenvironment?: 'development' | 'production' | 'staging' | string\n\tappVersion?: string\n\tserviceName?: string\n\tsessionKey?: string\n\tsessionShortcut?: SessionShortcutOptions\n\tsessionSecureID: string // Introduced in firstLoad 3.0.1\n\tstorageMode?: 'sessionStorage' | 'localStorage'\n\tsessionCookie?: boolean\n\tsendMode?: 'webworker' | 'local'\n\totlpEndpoint?: HighlightOptions['otlpEndpoint']\n\totel?: HighlightOptions['otel']\n\tproductAnalytics?: boolean | ProductAnalyticsEvents\n\tcontextFriendlyName?: (context: LDContext) => string | undefined\n}\n\n/**\n * Subset of HighlightClassOptions that is stored with the session. These fields are stored for debugging purposes.\n */\ntype HighlightClassOptionsInternal = Omit<\n\tHighlightClassOptions,\n\t'firstloadVersion'\n>\n\nexport class Highlight {\n\toptions!: HighlightClassOptions\n\t/** Determines if the client is running on a Highlight property (e.g. frontend). */\n\tisRunningOnHighlight!: boolean\n\t/** Verbose project ID that is exposed to users. Legacy users may still be using ints. */\n\torganizationID!: string\n\t// ECMAScript-private (#) so the internal GraphQL SDK type — which\n\t// references graphql-request / graphql — does not leak into the published\n\t// declaration file and break consumer type-checking.\n\t#graphqlSDK!: Sdk\n\tevents!: eventWithTime[]\n\tsessionData!: SessionData\n\tready!: boolean\n\tmanualStopped!: boolean\n\tstate!: 'NotRecording' | 'Recording'\n\tlogger!: Logger\n\tenableSegmentIntegration!: boolean\n\tprivacySetting!: PrivacySettingOption\n\tenableCanvasRecording!: boolean\n\tenablePerformanceRecording!: boolean\n\tsamplingStrategy!: SamplingStrategy\n\tinlineImages!: boolean\n\tinlineVideos!: boolean\n\tinlineStylesheet!: boolean\n\tstyleSheetResyncInterval!: number\n\tdebugOptions!: DebugOptions\n\tlisteners!: listenerHandler[]\n\tfirstloadVersion!: string\n\tenvironment!: string\n\tsessionShortcut!: SessionShortcutOptions\n\t/** The end-user's app version. This isn't Highlight's version. */\n\tappVersion!: string | undefined\n\tserviceName!: string\n\t_worker!: HighlightClientRequestWorker\n\t_optionsInternal!: HighlightClassOptionsInternal\n\t_backendUrl!: string\n\t_recordingStartTime!: number\n\t_isOnLocalHost!: boolean\n\t_onToggleFeedbackFormVisibility!: () => void\n\t_firstLoadListeners!: FirstLoadListeners\n\t_isCrossOriginIframe!: boolean\n\t_eventBytesSinceSnapshot!: number\n\t_lastSnapshotTime!: number\n\t_lastVisibilityChangeTime!: number\n\tpushPayloadTimerId!: ReturnType<typeof setTimeout> | undefined\n\thasSessionUnloaded!: boolean\n\thasPushedData!: boolean\n\treloaded!: boolean\n\t_hasPreviouslyInitialized!: boolean\n\t_recordStop!: listenerHandler | undefined\n\t_gauges: Map<string, Gauge> = new Map<string, Gauge>()\n\t_counters: Map<string, Counter> = new Map<string, Counter>()\n\t_histograms: Map<string, Histogram> = new Map<string, Histogram>()\n\t_up_down_counters: Map<string, UpDownCounter> = new Map<\n\t\tstring,\n\t\tUpDownCounter\n\t>()\n\t_integrations: IntegrationClient[] = []\n\n\tstatic create(options: HighlightClassOptions): Highlight {\n\t\treturn new Highlight(options)\n\t}\n\n\tconstructor(\n\t\toptions: HighlightClassOptions,\n\t\tfirstLoadListeners?: FirstLoadListeners,\n\t) {\n\t\tif (!options.sessionSecureID) {\n\t\t\t// Firstload versions before 3.0.1 did not have this property\n\t\t\toptions.sessionSecureID = GenerateSecureID()\n\t\t}\n\t\tthis.options = options\n\t\tif (typeof this.options?.debug === 'boolean') {\n\t\t\tthis.debugOptions = this.options.debug\n\t\t\t\t? { clientInteractions: true }\n\t\t\t\t: {}\n\t\t} else {\n\t\t\tthis.debugOptions = this.options?.debug ?? {}\n\t\t}\n\t\tthis.logger = new Logger(this.debugOptions.clientInteractions)\n\t\tif (options.debug) {\n\t\t\tsetSdkDebugLogging(true)\n\t\t}\n\t\tif (options.storageMode) {\n\t\t\tthis.logger.log(\n\t\t\t\t`initializing in ${options.storageMode} session mode`,\n\t\t\t)\n\t\t\tsetStorageMode(options.storageMode)\n\t\t}\n\t\tsetCookieWriteEnabled(!!options?.sessionCookie)\n\n\t\tthis._worker =\n\t\t\tnew HighlightClientWorker() as HighlightClientRequestWorker\n\t\tthis._worker.onmessage = (e) => {\n\t\t\tif (e.data.response?.type === MessageType.AsyncEvents) {\n\t\t\t\tthis._eventBytesSinceSnapshot += e.data.response.eventsSize\n\t\t\t\tthis.logger.log(\n\t\t\t\t\t`Web worker sent payloadID ${e.data.response.id} size ${\n\t\t\t\t\t\te.data.response.eventsSize\n\t\t\t\t\t} bytes, compression ratio ${\n\t\t\t\t\t\te.data.response.eventsSize /\n\t\t\t\t\t\te.data.response.compressedSize\n\t\t\t\t\t}.\n Total since snapshot: ${(\n\t\t\t\t\tthis._eventBytesSinceSnapshot / 1000000\n\t\t\t\t).toFixed(1)}MB`,\n\t\t\t\t)\n\t\t\t} else if (e.data.response?.type === MessageType.CustomEvent) {\n\t\t\t\tthis.addCustomEvent(\n\t\t\t\t\te.data.response.tag,\n\t\t\t\t\te.data.response.payload,\n\t\t\t\t)\n\t\t\t} else if (e.data.response?.type === MessageType.Stop) {\n\t\t\t\tHighlightWarning(\n\t\t\t\t\t'Stopping recording due to worker failure',\n\t\t\t\t\te.data.response,\n\t\t\t\t)\n\t\t\t\tthis.stopRecording(false)\n\t\t\t}\n\t\t}\n\n\t\tlet storedSessionData = getPreviousSessionData()\n\t\tthis.reloaded = false\n\t\t// only fetch session data from local storage on the first `initialize` call\n\t\tif (\n\t\t\t!this.sessionData?.sessionSecureID &&\n\t\t\tstoredSessionData?.sessionSecureID\n\t\t) {\n\t\t\tthis.sessionData = storedSessionData\n\t\t\tthis.options.sessionSecureID = storedSessionData.sessionSecureID\n\t\t\tthis.reloaded = true\n\t\t\tthis.logger.log(\n\t\t\t\t`Tab reloaded, continuing previous session: ${this.sessionData.sessionSecureID}`,\n\t\t\t)\n\t\t} else {\n\t\t\t// new session. we should clear any session storage data\n\t\t\tfor (const storageKeyName of Object.values(SESSION_STORAGE_KEYS)) {\n\t\t\t\tremoveItem(storageKeyName)\n\t\t\t}\n\t\t\tthis.sessionData = {\n\t\t\t\tsessionSecureID: this.options.sessionSecureID,\n\t\t\t\tprojectID: 0,\n\t\t\t\tsessionStartTime: Date.now(),\n\t\t\t}\n\t\t}\n\t\t// these should not be in initMembers since we want them to\n\t\t// persist across session resets\n\t\tthis._hasPreviouslyInitialized = false\n\t\t// Old firstLoad versions (Feb 2022) do not pass in FirstLoadListeners, so we have to fallback to creating it\n\t\tthis._firstLoadListeners =\n\t\t\tfirstLoadListeners || new FirstLoadListeners(this.options)\n\t\ttry {\n\t\t\t// throws if parent is cross-origin\n\t\t\tif (window.parent.document) {\n\t\t\t\tthis._isCrossOriginIframe = false\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// if recordCrossOriginIframe is set to false, operate as if highlight is only recording the iframe as a dedicated web app.\n\t\t\t// this is useful if you are running highlight on your app that is used in a cross-origin iframe with no access to the parent page.\n\t\t\tthis._isCrossOriginIframe =\n\t\t\t\tthis.options.recordCrossOriginIframe ?? true\n\t\t}\n\t\tthis._initMembers(this.options)\n\t}\n\n\t// Start a new session\n\tasync _reset({\n\t\tforceNew,\n\t\tsessionKey,\n\t}: {\n\t\tforceNew?: boolean\n\t\tsessionKey?: string\n\t}) {\n\t\tif (this.pushPayloadTimerId) {\n\t\t\tclearTimeout(this.pushPayloadTimerId)\n\t\t\tthis.pushPayloadTimerId = undefined\n\t\t}\n\n\t\tlet user_identifier, user_object\n\t\tif (!forceNew) {\n\t\t\ttry {\n\t\t\t\tuser_identifier = getItem(SESSION_STORAGE_KEYS.USER_IDENTIFIER)\n\t\t\t\tconst user_object_string = getItem(\n\t\t\t\t\tSESSION_STORAGE_KEYS.USER_OBJECT,\n\t\t\t\t)\n\t\t\t\tif (user_object_string) {\n\t\t\t\t\tuser_object = JSON.parse(user_object_string)\n\t\t\t\t}\n\t\t\t} catch (err) {}\n\t\t}\n\t\tfor (const storageKeyName of Object.values(SESSION_STORAGE_KEYS)) {\n\t\t\tremoveItem(storageKeyName)\n\t\t}\n\n\t\t// no need to set the sessionStorage value here since firstload won't call\n\t\t// init again after a reset, and `this.initialize()` will set sessionStorage\n\t\tthis.sessionData.sessionSecureID = sessionKey\n\t\t\t? GenerateSecureID(`${this.organizationID}-${sessionKey}`)\n\t\t\t: GenerateSecureID()\n\t\tthis.sessionData.sessionKey = sessionKey\n\t\tthis.sessionData.sessionStartTime = Date.now()\n\t\tthis.options.sessionSecureID = this.sessionData.sessionSecureID\n\t\tthis.stopRecording()\n\t\tthis._firstLoadListeners.stopListening()\n\t\tthis._firstLoadListeners = new FirstLoadListeners(this.options)\n\t\tawait this.initialize()\n\t\tif (user_identifier && user_object) {\n\t\t\tthis.identify(user_identifier, user_object)\n\t\t}\n\t}\n\n\t_initMembers(options: HighlightClassOptions) {\n\t\tthis.sessionShortcut = false\n\t\tthis._recordingStartTime = 0\n\t\tthis._isOnLocalHost =\n\t\t\twindow.location.hostname === 'localhost' ||\n\t\t\twindow.location.hostname === '127.0.0.1' ||\n\t\t\twindow.location.hostname === ''\n\n\t\tthis.ready = false\n\t\tthis.state = 'NotRecording'\n\t\tthis.manualStopped = false\n\t\tthis.enableSegmentIntegration = !!options.enableSegmentIntegration\n\t\tthis.privacySetting = options.privacySetting ?? 'default'\n\t\tthis.enableCanvasRecording = options.enableCanvasRecording ?? false\n\t\tthis.enablePerformanceRecording =\n\t\t\toptions.enablePerformanceRecording ?? true\n\t\t// default to inlining stylesheets/images locally to help with recording accuracy\n\t\tthis.inlineImages = options.inlineImages ?? this._isOnLocalHost\n\t\tthis.inlineVideos = options.inlineVideos ?? this._isOnLocalHost\n\t\tthis.inlineStylesheet = options.inlineStylesheet ?? this._isOnLocalHost\n\t\tthis.styleSheetResyncInterval = options.styleSheetResyncInterval ?? 2000\n\t\tthis.samplingStrategy = {\n\t\t\tcanvasFactor: 0.5,\n\t\t\tcanvasMaxSnapshotDimension: 360,\n\t\t\tcanvasClearWebGLBuffer: true,\n\t\t\tdataUrlOptions: getDefaultDataURLOptions(),\n\t\t\t...(options.samplingStrategy ?? {\n\t\t\t\tcanvas: 2,\n\t\t\t}),\n\t\t}\n\t\tthis._backendUrl = options?.backendUrl ?? 'https://pub.highlight.io'\n\n\t\t// If _backendUrl is a relative URL, convert it to an absolute URL\n\t\t// so that it's usable from a web worker.\n\t\tif (this._backendUrl[0] === '/') {\n\t\t\tthis._backendUrl = new URL(this._backendUrl, document.baseURI).href\n\t\t}\n\n\t\tconst client = new GraphQLClient(`${this._backendUrl}`, {\n\t\t\theaders: {},\n\t\t})\n\t\tthis.#graphqlSDK = getSdk(client, getGraphQLRequestWrapper())\n\t\tthis.environment = options.environment ?? 'production'\n\t\tthis.appVersion = options.appVersion\n\t\tthis.serviceName = options.serviceName ?? ''\n\n\t\tif (typeof options.organizationID === 'string') {\n\t\t\tthis.organizationID = options.organizationID\n\t\t} else {\n\t\t\tthis.organizationID = options.organizationID.toString()\n\t\t}\n\t\tthis.isRunningOnHighlight =\n\t\t\tthis.organizationID === '1' || this.organizationID === '1jdkoe52'\n\t\tthis.firstloadVersion = options.firstloadVersion || 'unknown'\n\t\tthis.sessionShortcut = options.sessionShortcut || false\n\t\tthis._onToggleFeedbackFormVisibility = () => {}\n\t\t// We only want to store a subset of the options for debugging purposes. Firstload version is stored as another field so we don't need to store it here.\n\t\tconst { firstloadVersion: _, ...optionsInternal } = options\n\t\tthis._optionsInternal = optionsInternal\n\t\tthis.listeners = []\n\n\t\tthis.events = []\n\t\tthis.hasSessionUnloaded = false\n\t\tthis.hasPushedData = false\n\n\t\tif (window.Intercom) {\n\t\t\twindow.Intercom('onShow', () => {\n\t\t\t\twindow.Intercom('update', {\n\t\t\t\t\thighlightSessionURL:\n\t\t\t\t\t\tthis.getCurrentSessionURLWithTimestamp(),\n\t\t\t\t})\n\t\t\t\tthis.addProperties({ event: 'Intercom onShow' })\n\t\t\t})\n\t\t}\n\n\t\tthis._eventBytesSinceSnapshot = 0\n\t\tthis._lastSnapshotTime = new Date().getTime()\n\t\tthis._lastVisibilityChangeTime = new Date().getTime()\n\t}\n\n\tidentify(user_identifier: string, user_object = {}, source?: Source) {\n\t\tif (!user_identifier || user_identifier === '') {\n\t\t\tconsole.warn(\n\t\t\t\t`Highlight's identify() call was passed an empty identifier.`,\n\t\t\t\t{ user_identifier, user_object },\n\t\t\t)\n\t\t\treturn\n\t\t}\n\t\tthis.sessionData.userIdentifier = user_identifier.toString()\n\t\tthis.sessionData.userObject = user_object\n\t\tsetItem(\n\t\t\tSESSION_STORAGE_KEYS.USER_IDENTIFIER,\n\t\t\tuser_identifier.toString(),\n\t\t)\n\t\tsetItem(SESSION_STORAGE_KEYS.USER_OBJECT, JSON.stringify(user_object))\n\t\tthis._worker.postMessage({\n\t\t\tmessage: {\n\t\t\t\ttype: MessageType.Identify,\n\t\t\t\tuserIdentifier: user_identifier,\n\t\t\t\tuserObject: user_object,\n\t\t\t\tsource,\n\t\t\t},\n\t\t})\n\t\tfor (const integration of this._integrations) {\n\t\t\tintegration.identify(\n\t\t\t\tthis.sessionData.sessionSecureID,\n\t\t\t\tuser_identifier,\n\t\t\t\tuser_object,\n\t\t\t\tsource,\n\t\t\t)\n\t\t}\n\t}\n\n\tlog(message: any, level: string, metadata?: Attributes) {\n\t\tthis._firstLoadListeners.messages.push(\n\t\t\tcreateLog(level, defaultLogOptions, message, metadata),\n\t\t)\n\t}\n\n\tpushCustomError(message: string, payload?: string) {\n\t\treturn this.consumeCustomError(new Error(message), undefined, payload)\n\t}\n\n\tconsumeCustomError(error: Error, message?: string, payload?: string) {\n\t\tlet obj = {}\n\t\tif (payload) {\n\t\t\ttry {\n\t\t\t\tobj = { ...JSON.parse(payload), ...obj }\n\t\t\t} catch (e) {}\n\t\t}\n\t\treturn this.consumeError(error, {\n\t\t\tmessage,\n\t\t\tpayload: obj,\n\t\t})\n\t}\n\n\tconsumeError(\n\t\terror: Error,\n\t\t{\n\t\t\tmessage,\n\t\t\tpayload,\n\t\t\tsource,\n\t\t\ttype,\n\t\t}: {\n\t\t\tmessage?: string\n\t\t\tpayload?: object\n\t\t\tsource?: string\n\t\t\ttype?: ErrorMessageType\n\t\t},\n\t) {\n\t\tif (error.cause) {\n\t\t\tpayload = { ...payload, 'exception.cause': error.cause }\n\t\t}\n\t\tlet event = message ? message + ':' + error.message : error.message\n\t\tif (type === 'React.ErrorBoundary') {\n\t\t\tevent = 'ErrorBoundary: ' + event\n\t\t}\n\t\tconst res = parseError(error)\n\t\tconst errorMsg: ErrorMessage = {\n\t\t\tevent,\n\t\t\ttype: type ?? 'custom',\n\t\t\turl: window.location.href,\n\t\t\tsource: source ?? '',\n\t\t\tlineNumber: res[0]?.lineNumber ? res[0]?.lineNumber : 0,\n\t\t\tcolumnNumber: res[0]?.columnNumber ? res[0]?.columnNumber : 0,\n\t\t\tstackTrace: res,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tpayload: JSON.stringify(payload),\n\t\t\tid: randomUuidV4(),\n\t\t}\n\t\tthis._firstLoadListeners.errors.push(errorMsg)\n\t\tfor (const integration of this._integrations) {\n\t\t\tintegration.error(this.sessionData.sessionSecureID, errorMsg)\n\t\t}\n\t}\n\n\taddProperties(properties_obj = {}, typeArg?: PropertyType) {\n\t\t// Remove any properties which throw on structuredClone\n\t\t// (structuredClone is used when posting messages to the worker)\n\t\tconst obj = { ...properties_obj } as any\n\t\tObject.entries(obj).forEach(([key, val]) => {\n\t\t\ttry {\n\t\t\t\tstructuredClone(val)\n\t\t\t} catch {\n\t\t\t\tdelete obj[key]\n\t\t\t}\n\t\t})\n\t\tthis._worker.postMessage({\n\t\t\tmessage: {\n\t\t\t\ttype: MessageType.Properties,\n\t\t\t\tpropertiesObject: obj,\n\t\t\t\tpropertyType: typeArg,\n\t\t\t},\n\t\t})\n\t\tfor (const integration of this._integrations) {\n\t\t\tintegration.track(this.sessionData.sessionSecureID, {\n\t\t\t\tsessionSecureID: this.sessionData.sessionSecureID,\n\t\t\t\tpropertyType: typeArg,\n\t\t\t\t...properties_obj,\n\t\t\t})\n\t\t}\n\t}\n\n\tasync initialize(options?: StartOptions): Promise<undefined> {\n\t\tif (\n\t\t\t(navigator?.webdriver && !window.Cypress) ||\n\t\t\tnavigator?.userAgent?.includes('Googlebot') ||\n\t\t\tnavigator?.userAgent?.includes('AdsBot')\n\t\t) {\n\t\t\tthis._firstLoadListeners?.stopListening()\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tif (options?.forceNew) {\n\t\t\t\tawait this._reset(options)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\toptions?.sessionKey &&\n\t\t\t\toptions?.sessionKey !== this.sessionData.sessionKey\n\t\t\t) {\n\t\t\t\tawait this._reset({ ...options, forceNew: true })\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst sampler = new CustomSampler()\n\n\t\t\tsetupBrowserTracing(\n\t\t\t\t{\n\t\t\t\t\tbackendUrl:\n\t\t\t\t\t\tthis.options?.backendUrl ?? 'https://pub.highlight.io',\n\t\t\t\t\totlpEndpoint:\n\t\t\t\t\t\tthis.options?.otlpEndpoint ??\n\t\t\t\t\t\t'https://otel.highlight.io',\n\t\t\t\t\tprojectId: this.options?.organizationID,\n\t\t\t\t\tsessionSecureId: this.options?.sessionSecureID,\n\t\t\t\t\tenvironment: this.options?.environment ?? 'production',\n\t\t\t\t\tnetworkRecordingOptions:\n\t\t\t\t\t\ttypeof this.options?.networkRecording === 'object'\n\t\t\t\t\t\t\t? this.options.networkRecording\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\ttracingOrigins: this.options?.tracingOrigins,\n\t\t\t\t\tserviceName:\n\t\t\t\t\t\tthis.options?.serviceName ?? 'highlight-browser',\n\t\t\t\t\tinstrumentations: this.options?.otel?.instrumentations,\n\t\t\t\t\tgetIntegrations: () => [...this._integrations],\n\t\t\t\t\tproductAnalyticsEvents: this._productAnalyticsEvents(),\n\t\t\t\t},\n\t\t\t\tsampler,\n\t\t\t)\n\t\t\t// reset metrics to connect them to the new meter\n\t\t\tthis._gauges.clear()\n\t\t\tthis._counters.clear()\n\t\t\tthis._histograms.clear()\n\t\t\tthis._up_down_counters.clear()\n\n\t\t\tthis.logger.log(\n\t\t\t\t`Initializing...`,\n\t\t\t\toptions,\n\t\t\t\tthis.sessionData,\n\t\t\t\tthis.options,\n\t\t\t)\n\n\t\t\tthis.sessionData =\n\t\t\t\tgetPreviousSessionData(this.sessionData.sessionSecureID) ??\n\t\t\t\tthis.sessionData\n\t\t\tif (!this.sessionData?.sessionStartTime) {\n\t\t\t\tthis._recordingStartTime = new Date().getTime()\n\t\t\t\tthis.sessionData.sessionStartTime = this._recordingStartTime\n\t\t\t} else {\n\t\t\t\tthis._recordingStartTime = this.sessionData?.sessionStartTime\n\t\t\t}\n\t\t\t// To handle the 'Duplicate Tab' function, remove id from storage until page unload\n\t\t\tsetSessionSecureID('')\n\t\t\tsetSessionData(this.sessionData)\n\n\t\t\tlet clientID = getItem(LocalStorageKeys['CLIENT_ID'])\n\n\t\t\tif (!clientID) {\n\t\t\t\tclientID = GenerateSecureID()\n\t\t\t\tsetItem(LocalStorageKeys['CLIENT_ID'], clientID)\n\t\t\t}\n\n\t\t\t// Duplicate of logic inside FirstLoadListeners.setupNetworkListener,\n\t\t\t// needed for initializeSession\n\t\t\tlet enableNetworkRecording\n\t\t\tif (this.options.disableSessionRecording) {\n\t\t\t\tenableNetworkRecording = false\n\t\t\t} else if (this.options.disableNetworkRecording !== undefined) {\n\t\t\t\tenableNetworkRecording = false\n\t\t\t} else if (typeof this.options.networkRecording === 'boolean') {\n\t\t\t\tenableNetworkRecording = false\n\t\t\t} else {\n\t\t\t\tenableNetworkRecording =\n\t\t\t\t\tthis.options.networkRecording?.recordHeadersAndBody || false\n\t\t\t}\n\n\t\t\tlet destinationDomains: string[] = []\n\t\t\tif (\n\t\t\t\ttypeof this.options.networkRecording === 'object' &&\n\t\t\t\tthis.options.networkRecording.destinationDomains?.length\n\t\t\t) {\n\t\t\t\tdestinationDomains =\n\t\t\t\t\tthis.options.networkRecording.destinationDomains\n\t\t\t}\n\t\t\tif (this._isCrossOriginIframe) {\n\t\t\t\t// wait for 'cross-origin iframe ready' message\n\t\t\t\tawait this._setupCrossOriginIframe()\n\t\t\t} else {\n\t\t\t\tconst gr = await this.#graphqlSDK.initializeSession({\n\t\t\t\t\torganization_verbose_id: this.organizationID,\n\t\t\t\t\tenable_strict_privacy: this.privacySetting === 'strict',\n\t\t\t\t\tprivacy_setting: this.privacySetting,\n\t\t\t\t\tenable_recording_network_contents: enableNetworkRecording,\n\t\t\t\t\tclientVersion: this.firstloadVersion,\n\t\t\t\t\tfirstloadVersion: this.firstloadVersion,\n\t\t\t\t\tclientConfig: JSON.stringify(this._optionsInternal),\n\t\t\t\t\tenvironment: this.environment,\n\t\t\t\t\tid: clientID,\n\t\t\t\t\tappVersion: this.appVersion,\n\t\t\t\t\tserviceName: this.serviceName,\n\t\t\t\t\tsession_secure_id: this.sessionData.sessionSecureID,\n\t\t\t\t\tsession_key: this.sessionData.sessionKey,\n\t\t\t\t\tclient_id: clientID,\n\t\t\t\t\tnetwork_recording_domains: destinationDomains,\n\t\t\t\t\tdisable_session_recording:\n\t\t\t\t\t\tthis.options.disableSessionRecording,\n\t\t\t\t})\n\t\t\t\tif (\n\t\t\t\t\tgr.initializeSession.secure_id !==\n\t\t\t\t\tthis.sessionData.sessionSecureID\n\t\t\t\t) {\n\t\t\t\t\tthis.logger.log(\n\t\t\t\t\t\t`Unexpected secure id returned by initializeSession: ${gr.initializeSession.secure_id}, ` +\n\t\t\t\t\t\t\t`expected ${this.sessionData.sessionSecureID}`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tthis.sessionData.sessionSecureID =\n\t\t\t\t\tgr.initializeSession.secure_id\n\t\t\t\tthis.sessionData.projectID = parseInt(\n\t\t\t\t\tgr?.initializeSession?.project_id || '0',\n\t\t\t\t)\n\n\t\t\t\tsampler.setConfig(gr.initializeSession.sampling)\n\n\t\t\t\tif (\n\t\t\t\t\t!this.sessionData.projectID ||\n\t\t\t\t\t!this.sessionData.sessionSecureID\n\t\t\t\t) {\n\t\t\t\t\tsdkLog(\n\t\t\t\t\t\t'error',\n\t\t\t\t\t\t'Failed to initialize Highlight; an error occurred on our end.',\n\t\t\t\t\t\tthis.sessionData,\n\t\t\t\t\t)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.logger.log(\n\t\t\t\t`Loaded Highlight\nRemote: ${this._backendUrl}\nProject ID: ${this.sessionData.projectID}\nSessionSecureID: ${this.sessionData.sessionSecureID}`,\n\t\t\t)\n\t\t\tthis.options.sessionSecureID = this.sessionData.sessionSecureID\n\t\t\tthis._worker.postMessage({\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: MessageType.Initialize,\n\t\t\t\t\tsessionSecureID: this.sessionData.sessionSecureID,\n\t\t\t\t\tbackend: this._backendUrl,\n\t\t\t\t\tdebug: !!this.debugOptions.clientInteractions,\n\t\t\t\t\trecordingStartTime: this._recordingStartTime,\n\t\t\t\t},\n\t\t\t})\n\t\t\tfor (const integration of this._integrations) {\n\t\t\t\tintegration.init(this.sessionData.sessionSecureID)\n\t\t\t}\n\n\t\t\tif (this.sessionData.userIdentifier) {\n\t\t\t\tthis.identify(\n\t\t\t\t\tthis.sessionData.userIdentifier,\n\t\t\t\t\tthis.sessionData.userObject,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tif (!this._firstLoadListeners.isListening()) {\n\t\t\t\tthis._firstLoadListeners.startListening()\n\t\t\t} else if (!this._firstLoadListeners.hasNetworkRecording) {\n\t\t\t\t// for firstload versions < 3.0. even if they are listening, add network listeners\n\t\t\t\tFirstLoadListeners.setupNetworkListener(\n\t\t\t\t\tthis._firstLoadListeners,\n\t\t\t\t\tthis.options,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tif (this.pushPayloadTimerId) {\n\t\t\t\tclearTimeout(this.pushPayloadTimerId)\n\t\t\t\tthis.pushPayloadTimerId = undefined\n\t\t\t}\n\t\t\tif (!this._isCrossOriginIframe) {\n\t\t\t\tthis.pushPayloadTimerId = setTimeout(() => {\n\t\t\t\t\tthis._save()\n\t\t\t\t}, FIRST_SEND_FREQUENCY)\n\t\t\t}\n\n\t\t\t// if disabled, do not record session events / rrweb events.\n\t\t\t// we still use firstload listeners to record frontend js console logs and errors.\n\t\t\tif (this.options.disableSessionRecording) {\n\t\t\t\tthis.logger.log(\n\t\t\t\t\t`Highlight is NOT RECORDING a session replay per H.init setting.`,\n\t\t\t\t)\n\t\t\t\tthis.ready = true\n\t\t\t\tthis.state = 'Recording'\n\t\t\t\tthis.manualStopped = false\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst { getDeviceDetails } = getPerformanceMethods()\n\t\t\tif (getDeviceDetails) {\n\t\t\t\tthis.recordGauge({\n\t\t\t\t\tname: MetricName.DeviceMemory,\n\t\t\t\t\tvalue: getDeviceDetails().deviceMemory,\n\t\t\t\t\tcategory: MetricCategory.Device,\n\t\t\t\t\tgroup: window.location.href,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tconst emit = (\n\t\t\t\tevent: eventWithTime,\n\t\t\t\tisCheckout?: boolean | undefined,\n\t\t\t) => {\n\t\t\t\tif (isCheckout) {\n\t\t\t\t\tthis.logger.log('received isCheckout emit', { event })\n\t\t\t\t}\n\t\t\t\tthis.events.push(event)\n\t\t\t}\n\t\t\temit.bind(this)\n\n\t\t\tconst alreadyRecording = !!this._recordStop\n\t\t\t// if we were already recording, stop recording to reset rrweb state (eg. reset _sid)\n\t\t\tif (this._recordStop) {\n\t\t\t\tthis._recordStop()\n\t\t\t\tthis._recordStop = undefined\n\t\t\t}\n\n\t\t\tconst [maskAllInputs, maskInputOptions] = determineMaskInputOptions(\n\t\t\t\tthis.privacySetting,\n\t\t\t\tthis.options.maskAllInputs,\n\t\t\t\tthis.options.maskInputOptions,\n\t\t\t)\n\n\t\t\tthis._recordStop = record({\n\t\t\t\tignoreClass: this.options.ignoreClass ?? 'highlight-ignore',\n\t\t\t\tignoreSelector: this.options.ignoreSelector,\n\t\t\t\tblockClass: this.options.blockClass ?? 'highlight-block',\n\t\t\t\tblockSelector: this.options.blockSelector,\n\t\t\t\temit,\n\t\t\t\trecordCrossOriginIframes: this.options.recordCrossOriginIframe,\n\t\t\t\tprivacySetting: determineTextPrivacySetting(\n\t\t\t\t\tthis.privacySetting,\n\t\t\t\t\tthis.options.maskPiiText,\n\t\t\t\t),\n\t\t\t\tmaskAllInputs,\n\t\t\t\tmaskInputOptions: maskInputOptions,\n\t\t\t\tmaskTextClass: this.options.maskTextClass,\n\t\t\t\tmaskTextSelector: this.options.maskTextSelector,\n\t\t\t\trecordCanvas: this.enableCanvasRecording,\n\t\t\t\tsampling: {\n\t\t\t\t\tcanvas: {\n\t\t\t\t\t\tfps: this.samplingStrategy.canvas,\n\t\t\t\t\t\tfpsManual: this.samplingStrategy.canvasManualSnapshot,\n\t\t\t\t\t\tresizeFactor: this.samplingStrategy.canvasFactor,\n\t\t\t\t\t\tclearWebGLBuffer:\n\t\t\t\t\t\t\tthis.samplingStrategy.canvasClearWebGLBuffer,\n\t\t\t\t\t\tinitialSnapshotDelay:\n\t\t\t\t\t\t\tthis.samplingStrategy.canvasInitialSnapshotDelay,\n\t\t\t\t\t\tdataURLOptions: this.samplingStrategy.dataUrlOptions,\n\t\t\t\t\t\tmaxSnapshotDimension:\n\t\t\t\t\t\t\tthis.samplingStrategy.canvasMaxSnapshotDimension,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tkeepIframeSrcFn: (_src: string) => {\n\t\t\t\t\treturn !this.options.recordCrossOriginIframe\n\t\t\t\t},\n\t\t\t\tinlineImages: this.inlineImages,\n\t\t\t\tinlineVideos: this.inlineVideos,\n\t\t\t\tcollectFonts: this.inlineImages,\n\t\t\t\tinlineStylesheet: this.inlineStylesheet,\n\t\t\t\tstyleSheetResyncInterval: this.styleSheetResyncInterval,\n\t\t\t\tplugins: [getRecordSequentialIdPlugin()],\n\t\t\t\tlogger:\n\t\t\t\t\t(typeof this.options.debug === 'boolean' &&\n\t\t\t\t\t\tthis.options.debug) ||\n\t\t\t\t\t(typeof this.options.debug === 'object' &&\n\t\t\t\t\t\tthis.options.debug.domRecording)\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tdebug: this.logger.log,\n\t\t\t\t\t\t\t\twarn: HighlightWarning,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined,\n\t\t\t})\n\n\t\t\t// recordStop is not part of listeners because we do not actually want to stop rrweb\n\t\t\t// rrweb has some bugs that make the stop -> restart workflow broken (eg iframe listeners)\n\t\t\tif (!alreadyRecording) {\n\t\t\t\tif (this.options.recordCrossOriginIframe) {\n\t\t\t\t\tthis._setupCrossOriginIframeParent()\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (document.referrer) {\n\t\t\t\t// Don't record the referrer if it's the same origin.\n\t\t\t\t// Non-single page apps might have the referrer set to the same origin.\n\t\t\t\t// If we record this then the referrer data will not be useful.\n\t\t\t\t// Most users will want to see referrers outside of their website/app.\n\t\t\t\t// This will be a configuration set in `H.init()` later.\n\t\t\t\tif (\n\t\t\t\t\t!(\n\t\t\t\t\t\twindow &&\n\t\t\t\t\t\tdocument.referrer.includes(window.location.origin)\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tthis.addCustomEvent<string>('Referrer', document.referrer)\n\t\t\t\t\tthis.addProperties(\n\t\t\t\t\t\t{ referrer: document.referrer },\n\t\t\t\t\t\t{ type: 'session' },\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.sessionData.sessionKey) {\n\t\t\t\tthis.addProperties(\n\t\t\t\t\t{\n\t\t\t\t\t\tsessionKey: this.sessionData.sessionKey,\n\t\t\t\t\t},\n\t\t\t\t\t{ type: 'session' },\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tthis._setupWindowListeners()\n\t\t\tthis.ready = true\n\t\t\tthis.state = 'Recording'\n\t\t\tthis.manualStopped = false\n\t\t} catch (e) {\n\t\t\tif (this._isOnLocalHost) {\n\t\t\t\tsdkLog('error', e)\n\t\t\t\tHighlightWarning('initializeSession', e)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _productAnalyticsEvents(): ProductAnalyticsEvents {\n\t\tconst pa = this.options?.productAnalytics\n\t\tif (pa === false) {\n\t\t\treturn {}\n\t\t}\n\n\t\tconst paEvents = {\n\t\t\tclicks: true,\n\t\t\tpageViews: true,\n\t\t\ttrackEvents: true,\n\t\t}\n\t\tif (pa === undefined || pa === true) {\n\t\t\treturn paEvents\n\t\t}\n\n\t\tfor (const event of Object.keys(pa)) {\n\t\t\tif (pa[event as keyof ProductAnalyticsEvents] === false) {\n\t\t\t\tpaEvents[event as keyof ProductAnalyticsEvents] = false\n\t\t\t}\n\t\t}\n\t\treturn paEvents\n\t}\n\n\tasync _visibilityHandler(hidden: boolean) {\n\t\tif (this.manualStopped) {\n\t\t\tthis.logger.log(`Ignoring visibility event due to manual stop.`)\n\t\t\treturn\n\t\t}\n\t\tif (\n\t\t\tnew Date().getTime() - this._lastVisibilityChangeTime <\n\t\t\tVISIBILITY_DEBOUNCE_MS\n\t\t) {\n\t\t\treturn\n\t\t}\n\t\tthis._lastVisibilityChangeTime = new Date().getTime()\n\t\tthis.logger.log(`Detected window ${hidden ? 'hidden' : 'visible'}.`)\n\t\tif (!hidden) {\n\t\t\tif (this.options.disableBackgroundRecording) {\n\t\t\t\tawait this.initialize()\n\t\t\t}\n\t\t\tthis.addCustomEvent('TabHidden', false)\n\t\t} else {\n\t\t\tthis.addCustomEvent('TabHidden', true)\n\t\t\tif (this.options.disableBackgroundRecording) {\n\t\t\t\tthis.stopRecording()\n\t\t\t}\n\t\t}\n\t}\n\n\tasync _setupCrossOriginIframe() {\n\t\tthis.logger.log(`highlight in cross-origin iframe is waiting `)\n\t\t// wait until we get a initialization message from the parent window\n\t\tawait new Promise<void>((r) => {\n\t\t\tconst listener = (message: MessageEvent) => {\n\t\t\t\tif (message.data.highlight === IFRAME_PARENT_READY) {\n\t\t\t\t\tconst msg = message.data as HighlightIframeMessage\n\t\t\t\t\tthis.logger.log(`highlight got window message `, msg)\n\t\t\t\t\tthis.sessionData.projectID = msg.projectID\n\t\t\t\t\tthis.sessionData.sessionSecureID = msg.sessionSecureID\n\t\t\t\t\t// reply back that we got the message and are set up\n\t\t\t\t\twindow.parent.postMessage(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thighlight: IFRAME_PARENT_RESPONSE,\n\t\t\t\t\t\t} as HighlightIframeReponse,\n\t\t\t\t\t\t'*',\n\t\t\t\t\t)\n\t\t\t\t\t// stop listening to parent messages\n\t\t\t\t\twindow.removeEventListener('message', listener)\n\t\t\t\t\tr()\n\t\t\t\t}\n\t\t\t}\n\t\t\twindow.addEventListener('message', listener)\n\t\t})\n\t}\n\n\t_setupCrossOriginIframeParent() {\n\t\tthis.logger.log(\n\t\t\t`highlight setting up cross origin iframe parent notification`,\n\t\t)\n\t\t// notify iframes that highlight is ready\n\t\tsetInterval(() => {\n\t\t\twindow.document.querySelectorAll('iframe').forEach((iframe) => {\n\t\t\t\tiframe.contentWindow?.postMessage(\n\t\t\t\t\t{\n\t\t\t\t\t\thighlight: IFRAME_PARENT_READY,\n\t\t\t\t\t\tprojectID: this.sessionData.projectID,\n\t\t\t\t\t\tsessionSecureID: this.sessionData.sessionSecureID,\n\t\t\t\t\t} as HighlightIframeMessage,\n\t\t\t\t\t'*',\n\t\t\t\t)\n\t\t\t})\n\t\t}, FIRST_SEND_FREQUENCY)\n\t\twindow.addEventListener('message', (message: MessageEvent) => {\n\t\t\tif (message.data.highlight === IFRAME_PARENT_RESPONSE) {\n\t\t\t\tthis.logger.log(\n\t\t\t\t\t`highlight got response from initialized iframe`,\n\t\t\t\t)\n\t\t\t}\n\t\t})\n\t}\n\n\t_setupWindowListeners() {\n\t\ttry {\n\t\t\tconst highlightThis = this\n\t\t\tif (this.enableSegmentIntegration) {\n\t\t\t\tthis.listeners.push(\n\t\t\t\t\tSegmentIntegrationListener((obj: any) => {\n\t\t\t\t\t\tif (obj.type === 'track') {\n\t\t\t\t\t\t\tconst properties: { [key: string]: string } = {}\n\t\t\t\t\t\t\tproperties['segment-event'] = obj.event\n\t\t\t\t\t\t\thighlightThis.addProperties(properties, {\n\t\t\t\t\t\t\t\ttype: 'track',\n\t\t\t\t\t\t\t\tsource: 'segment',\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t} else if (obj.type === 'identify') {\n\t\t\t\t\t\t\t// Removes the starting and end quotes\n\t\t\t\t\t\t\t// Example: \"boba\" -> boba\n\t\t\t\t\t\t\tconst trimmedUserId = obj.userId.replace(\n\t\t\t\t\t\t\t\t/^\"(.*)\"$/,\n\t\t\t\t\t\t\t\t'$1',\n\t\t\t\t\t\t\t)\n\n\t\t\t\t\t\t\thighlightThis.identify(\n\t\t\t\t\t\t\t\ttrimmedUserId,\n\t\t\t\t\t\t\t\tobj.traits,\n\t\t\t\t\t\t\t\t'segment',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\t\t\tthis.listeners.push(\n\t\t\t\tPathListener((url: string) => {\n\t\t\t\t\tif (this.reloaded) {\n\t\t\t\t\t\tthis.addCustomEvent<string>('Reload', url)\n\t\t\t\t\t\tthis.reloaded = false\n\t\t\t\t\t\thighlightThis.addProperties(\n\t\t\t\t\t\t\t{ reload: true },\n\t\t\t\t\t\t\t{ type: 'session' },\n\t\t\t\t\t\t)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.addCustomEvent<string>('Navigate', url)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tthis.listeners.push(\n\t\t\t\tViewportResizeListener(\n\t\t\t\t\t(viewport: ViewportResizeListenerArgs) => {\n\t\t\t\t\t\tthis.addCustomEvent('Viewport', viewport)\n\t\t\t\t\t\tthis.submitViewportMetrics(viewport)\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t)\n\t\t\tthis.listeners.push(\n\t\t\t\tClickListener((clickTarget, event) => {\n\t\t\t\t\tlet selector = null\n\t\t\t\t\tlet textContent = null\n\t\t\t\t\tif (event && event.target) {\n\t\t\t\t\t\tconst t = event.target as HTMLElement\n\t\t\t\t\t\tselector = getSimpleSelector(t)\n\t\t\t\t\t\ttextContent = t.textContent\n\t\t\t\t\t\t// avoid sending huge strings here\n\t\t\t\t\t\tif (textContent && textContent.length > 2000) {\n\t\t\t\t\t\t\ttextContent = textContent.substring(0, 2000)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.addCustomEvent('Click', {\n\t\t\t\t\t\tclickTarget,\n\t\t\t\t\t\tclickTextContent: textContent,\n\t\t\t\t\t\tclickSelector: selector,\n\t\t\t\t\t})\n\t\t\t\t}),\n\t\t\t)\n\t\t\tthis.listeners.push(\n\t\t\t\tFocusListener((focusTarget) => {\n\t\t\t\t\tif (focusTarget) {\n\t\t\t\t\t\tthis.addCustomEvent('Focus', focusTarget)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tthis.listeners.push(\n\t\t\t\tWebVitalsListener((data) => {\n\t\t\t\t\tconst { name, value } = data\n\t\t\t\t\tconst tags: { name: string; value: string }[] = []\n\t\t\t\t\tconst addTag = (n: string, v: string | undefined) => {\n\t\t\t\t\t\tif (v) tags.push({ name: n, value: v })\n\t\t\t\t\t}\n\t\t\t\t\tswitch (data.name) {\n\t\t\t\t\t\tcase 'LCP': {\n\t\t\t\t\t\t\tconst a = data.attribution\n\t\t\t\t\t\t\taddTag('web_vital.element', a.element)\n\t\t\t\t\t\t\taddTag(\n\t\t\t\t\t\t\t\t'web_vital.attribution.url',\n\t\t\t\t\t\t\t\ta.url ? sanitizeUrl(a.url) : undefined,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase 'CLS': {\n\t\t\t\t\t\t\tconst a = data.attribution\n\t\t\t\t\t\t\taddTag('web_vital.element', a.largestShiftTarget)\n\t\t\t\t\t\t\taddTag('web_vital.load_state', a.loadState)\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase 'INP': {\n\t\t\t\t\t\t\tconst a = data.attribution\n\t\t\t\t\t\t\taddTag('web_vital.element', a.eventTarget)\n\t\t\t\t\t\t\taddTag('web_vital.event_type', a.eventType)\n\t\t\t\t\t\t\taddTag('web_vital.load_state', a.loadState)\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase 'FID': {\n\t\t\t\t\t\t\tconst a = data.attribution\n\t\t\t\t\t\t\taddTag('web_vital.element', a.eventTarget)\n\t\t\t\t\t\t\taddTag('web_vital.event_type', a.eventType)\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase 'FCP': {\n\t\t\t\t\t\t\tconst a = data.attribution\n\t\t\t\t\t\t\taddTag('web_vital.load_state', a.loadState)\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase 'TTFB':\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tthis.recordGauge({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\tgroup: window.location.href,\n\t\t\t\t\t\tcategory: MetricCategory.WebVital,\n\t\t\t\t\t\ttags: tags.length ? tags : undefined,\n\t\t\t\t\t})\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tthis.listeners.push(\n\t\t\t\tNetworkPerformanceListener(\n\t\t\t\t\t(payload: NetworkPerformancePayload) => {\n\t\t\t\t\t\tconst tags: { name: string; value: string }[] = []\n\t\t\t\t\t\tif (payload.saveData !== undefined) {\n\t\t\t\t\t\t\ttags.push({\n\t\t\t\t\t\t\t\tname: 'saveData',\n\t\t\t\t\t\t\t\tvalue: payload.saveData.toString(),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (payload.effectiveType !== undefined) {\n\t\t\t\t\t\t\ttags.push({\n\t\t\t\t\t\t\t\tname: 'effectiveType',\n\t\t\t\t\t\t\t\tvalue: payload.effectiveType.toString(),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (payload.type !== undefined) {\n\t\t\t\t\t\t\ttags.push({\n\t\t\t\t\t\t\t\tname: 'type',\n\t\t\t\t\t\t\t\tvalue: payload.type.toString(),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t\tObject.entries(payload).forEach(([name, value]) => {\n\t\t\t\t\t\t\tif (isMetricSafeNumber(value)) {\n\t\t\t\t\t\t\t\tthis.recordGauge({\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tvalue: value as number,\n\t\t\t\t\t\t\t\t\tcategory: MetricCategory.Performance,\n\t\t\t\t\t\t\t\t\tgroup: window.location.href,\n\t\t\t\t\t\t\t\t\ttags,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t},\n\t\t\t\t\tthis._recordingStartTime,\n\t\t\t\t),\n\t\t\t)\n\n\t\t\tif (this.sessionShortcut) {\n\t\t\t\tthis.listeners.push(\n\t\t\t\t\tSessionShortcutListener(this.sessionShortcut, () => {\n\t\t\t\t\t\twindow.open(\n\t\t\t\t\t\t\tthis.getCurrentSessionURLWithTimestamp(),\n\t\t\t\t\t\t\t'_blank',\n\t\t\t\t\t\t)\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tif (this.enablePerformanceRecording) {\n\t\t\t\tthis.listeners.push(\n\t\t\t\t\tPerformanceListener((payload: PerformancePayload) => {\n\t\t\t\t\t\tthis.addCustomEvent('Performance', stringify(payload))\n\t\t\t\t\t\tObject.entries(payload)\n\t\t\t\t\t\t\t.filter(([name]) => name !== 'relativeTimestamp')\n\t\t\t\t\t\t\t.forEach(\n\t\t\t\t\t\t\t\t([name, value]) =>\n\t\t\t\t\t\t\t\t\tvalue &&\n\t\t\t\t\t\t\t\t\tthis.recordGauge({\n\t\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\t\t\t\tcategory: MetricCategory.Performance,\n\t\t\t\t\t\t\t\t\t\tgroup: window.location.href,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t}, this._recordingStartTime),\n\t\t\t\t)\n\t\t\t\tthis.listeners.push(\n\t\t\t\t\tJankListener((payload: JankPayload) => {\n\t\t\t\t\t\tthis.addCustomEvent('Jank', stringify(payload))\n\t\t\t\t\t\tthis.recordGauge({\n\t\t\t\t\t\t\tname: 'Jank',\n\t\t\t\t\t\t\tvalue: payload.jankAmount,\n\t\t\t\t\t\t\tcategory: MetricCategory.WebVital,\n\t\t\t\t\t\t\tgroup: payload.querySelector,\n\t\t\t\t\t\t})\n\t\t\t\t\t}, this._recordingStartTime),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\t// only do this once, since we want to keep the visibility listener attached even when recoding is stopped\n\t\t\tif (!this._hasPreviouslyInitialized) {\n\t\t\t\t// setup electron main thread window visiblity events listener\n\t\t\t\tif (window.electron?.ipcRenderer) {\n\t\t\t\t\twindow.electron.ipcRenderer.on(\n\t\t\t\t\t\t'highlight.run',\n\t\t\t\t\t\t({ visible }: { visible: boolean }) => {\n\t\t\t\t\t\t\tthis._visibilityHandler(!visible)\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t\tthis.logger.log('Set up Electron highlight.run events.')\n\t\t\t\t} else {\n\t\t\t\t\t// Send the payload every time the page is no longer visible - this includes when the tab is closed, as well\n\t\t\t\t\t// as when switching tabs or apps on mobile. Non-blocking.\n\t\t\t\t\tPageVisibilityListener((isTabHidden) =>\n\t\t\t\t\t\tthis._visibilityHandler(isTabHidden),\n\t\t\t\t\t)\n\t\t\t\t\tthis.logger.log('Set up document visibility listener.')\n\t\t\t\t}\n\t\t\t\tthis._hasPreviouslyInitialized = true\n\t\t\t}\n\n\t\t\t// Clear the timer so it doesn't block the next page navigation.\n\t\t\tconst unloadListener = () => {\n\t\t\t\tthis.hasSessionUnloaded = true\n\t\t\t\tif (this.pushPayloadTimerId) {\n\t\t\t\t\tclearTimeout(this.pushPayloadTimerId)\n\t\t\t\t\tthis.pushPayloadTimerId = undefined\n\t\t\t\t}\n\t\t\t}\n\t\t\twindow.addEventListener('beforeunload', unloadListener)\n\t\t\tthis.listeners.push(() =>\n\t\t\t\twindow.removeEventListener('beforeunload', unloadListener),\n\t\t\t)\n\t\t} catch (e) {\n\t\t\tif (this._isOnLocalHost) {\n\t\t\t\tsdkLog('error', e)\n\t\t\t\tHighlightWarning('initializeSession _setupWindowListeners', e)\n\t\t\t}\n\t\t}\n\n\t\tconst unloadListener = () => {\n\t\t\tthis.addCustomEvent('Page Unload', '')\n\t\t\tsetSessionSecureID(this.sessionData.sessionSecureID)\n\t\t\tsetSessionData(this.sessionData)\n\t\t}\n\t\twindow.addEventListener('beforeunload', unloadListener)\n\t\tthis.listeners.push(() =>\n\t\t\twindow.removeEventListener('beforeunload', unloadListener),\n\t\t)\n\n\t\t// beforeunload is not supported on iOS on Safari. Apple docs recommend using `pagehide` instead.\n\t\tconst isOnIOS =\n\t\t\tnavigator.userAgent.match(/iPad/i) ||\n\t\t\tnavigator.userAgent.match(/iPhone/i)\n\t\tif (isOnIOS) {\n\t\t\tconst unloadListener = () => {\n\t\t\t\tthis.addCustomEvent('Page Unload', '')\n\t\t\t\tsetSessionSecureID(this.sessionData.sessionSecureID)\n\t\t\t\tsetSessionData(this.sessionData)\n\t\t\t}\n\t\t\twindow.addEventListener('pagehide', unloadListener)\n\t\t\tthis.listeners.push(() =>\n\t\t\t\twindow.removeEventListener('pagehide', unloadListener),\n\t\t\t)\n\t\t}\n\t}\n\n\tsubmitViewportMetrics({\n\t\theight,\n\t\twidth,\n\t\tavailHeight,\n\t\tavailWidth,\n\t}: ViewportResizeListenerArgs) {\n\t\tthis.recordGauge({\n\t\t\tname: MetricName.ViewportHeight,\n\t\t\tvalue: height,\n\t\t\tcategory: MetricCategory.Device,\n\t\t\tgroup: window.location.href,\n\t\t})\n\t\tthis.recordGauge({\n\t\t\tname: MetricName.ViewportWidth,\n\t\t\tvalue: width,\n\t\t\tcategory: MetricCategory.Device,\n\t\t\tgroup: window.location.href,\n\t\t})\n\t\tthis.recordGauge({\n\t\t\tname: MetricName.ScreenHeight,\n\t\t\tvalue: availHeight,\n\t\t\tcategory: MetricCategory.Device,\n\t\t\tgroup: window.location.href,\n\t\t})\n\t\tthis.recordGauge({\n\t\t\tname: MetricName.ScreenWidth,\n\t\t\tvalue: availWidth,\n\t\t\tcategory: MetricCategory.Device,\n\t\t\tgroup: window.location.href,\n\t\t})\n\t\tthis.recordGauge({\n\t\t\tname: MetricName.ViewportArea,\n\t\t\tvalue: height * width,\n\t\t\tcategory: MetricCategory.Device,\n\t\t\tgroup: window.location.href,\n\t\t})\n\t}\n\n\trecordGauge(metric: RecordMetric) {\n\t\tlet gauge = this._gauges.get(metric.name)\n\t\tif (!gauge) {\n\t\t\tgauge = getMeter()?.createGauge(\n\t\t\t\tmetric.name,\n\t\t\t\tmetricInstrumentOptions(metric.name, metric.unit),\n\t\t\t)\n\t\t\tif (!gauge) return\n\t\t\tthis._gauges.set(metric.name, gauge)\n\t\t}\n\t\tgauge.record(metric.value, {\n\t\t\t...metric.tags?.reduce((a, b) => ({ ...a, [b.name]: b.value }), {}),\n\t\t\tgroup: metric.group,\n\t\t\tcategory: metric.category,\n\t\t\t'highlight.session_id': this.sessionData.sessionSecureID,\n\t\t})\n\t\tfor (const integration of this._integrations) {\n\t\t\tintegration.recordGauge(this.sessionData.sessionSecureID, metric)\n\t\t}\n\t}\n\n\trecordCount(metric: RecordMetric) {\n\t\tlet counter = this._counters.get(metric.name)\n\t\tif (!counter) {\n\t\t\tcounter = getMeter()?.createCounter(\n\t\t\t\tmetric.name,\n\t\t\t\tmetricInstrumentOptions(metric.name, metric.unit),\n\t\t\t)\n\t\t\tif (!counter) return\n\t\t\tthis._counters.set(metric.name, counter)\n\t\t}\n\t\tcounter.add(metric.value, {\n\t\t\t...metric.tags?.reduce((a, b) => ({ ...a, [b.name]: b.value }), {}),\n\t\t\tgroup: metric.group,\n\t\t\tcategory: metric.category,\n\t\t\t'highlight.session_id': this.sessionData.sessionSecureID,\n\t\t})\n\t}\n\n\trecordIncr(metric: Omit<RecordMetric, 'value'>) {\n\t\tthis.recordCount({ ...metric, value: 1 })\n\t}\n\n\trecordHistogram(metric: RecordMetric) {\n\t\tlet histogram = this._histograms.get(metric.name)\n\t\tif (!histogram) {\n\t\t\thistogram = getMeter()?.createHistogram(\n\t\t\t\tmetric.name,\n\t\t\t\tmetricInstrumentOptions(metric.name, metric.unit),\n\t\t\t)\n\t\t\tif (!histogram) return\n\t\t\tthis._histograms.set(metric.name, histogram)\n\t\t}\n\t\thistogram.record(metric.value, {\n\t\t\t...metric.tags?.reduce((a, b) => ({ ...a, [b.name]: b.value }), {}),\n\t\t\tgroup: metric.group,\n\t\t\tcategory: metric.category,\n\t\t\t'highlight.session_id': this.sessionData.sessionSecureID,\n\t\t})\n\t}\n\n\trecordUpDownCounter(metric: RecordMetric) {\n\t\tlet up_down_counter = this._up_down_counters.get(metric.name)\n\t\tif (!up_down_counter) {\n\t\t\tup_down_counter = getMeter()?.createUpDownCounter(\n\t\t\t\tmetric.name,\n\t\t\t\tmetricInstrumentOptions(metric.name, metric.unit),\n\t\t\t)\n\t\t\tif (!up_down_counter) return\n\t\t\tthis._up_down_counters.set(metric.name, up_down_counter)\n\t\t}\n\t\tup_down_counter.add(metric.value, {\n\t\t\t...metric.tags?.reduce((a, b) => ({ ...a, [b.name]: b.value }), {}),\n\t\t\tgroup: metric.group,\n\t\t\tcategory: metric.category,\n\t\t\t'highlight.session_id': this.sessionData.sessionSecureID,\n\t\t})\n\t}\n\n\t/**\n\t * Stops Highlight from recording.\n\t * @param manual The end user requested to stop recording.\n\t */\n\tstopRecording(manual?: boolean) {\n\t\tthis.manualStopped = !!manual\n\t\tif (this.manualStopped) {\n\t\t\tthis.addCustomEvent(\n\t\t\t\t'Stop',\n\t\t\t\t'H.stop() was called which stops Highlight from recording.',\n\t\t\t)\n\t\t}\n\t\tthis.state = 'NotRecording'\n\t\t// stop rrweb recording mutation observers\n\t\tif (manual && this._recordStop) {\n\t\t\tthis._recordStop()\n\t\t\tthis._recordStop = undefined\n\t\t}\n\t\t// stop all other event listeners, to be restarted on initialize()\n\t\tthis.listeners.forEach((stop) => stop())\n\t\tthis.listeners = []\n\t\tvoid shutdown()\n\t}\n\n\tgetCurrentSessionTimestamp() {\n\t\treturn this._recordingStartTime\n\t}\n\n\t/**\n\t * Returns the current timestamp for the current session.\n\t */\n\tgetCurrentSessionURLWithTimestamp() {\n\t\tconst now = new Date().getTime()\n\t\tconst { projectID, sessionSecureID } = this.sessionData\n\t\tconst relativeTimestamp = (now - this._recordingStartTime) / 1000\n\t\treturn `https://${HIGHLIGHT_URL}/${projectID}/sessions/${sessionSecureID}?ts=${relativeTimestamp}`\n\t}\n\n\tgetCurrentSessionURL() {\n\t\tconst projectID = this.sessionData.projectID\n\t\tconst sessionSecureID = this.sessionData.sessionSecureID\n\t\tif (projectID && sessionSecureID) {\n\t\t\treturn `https://${HIGHLIGHT_URL}/${projectID}/sessions/${sessionSecureID}`\n\t\t}\n\t\treturn null\n\t}\n\n\tasync snapshot(element: HTMLCanvasElement) {\n\t\tawait record.snapshotCanvas(element)\n\t}\n\n\taddSessionFeedback({\n\t\ttimestamp,\n\t\tverbatim,\n\t\tuser_email,\n\t\tuser_name,\n\t}: {\n\t\tverbatim: string\n\t\ttimestamp: string\n\t\tuser_name?: string\n\t\tuser_email?: string\n\t}) {\n\t\tthis._worker.postMessage({\n\t\t\tmessage: {\n\t\t\t\ttype: MessageType.Feedback,\n\t\t\t\tverbatim,\n\t\t\t\ttimestamp,\n\t\t\t\tuserName: user_name || this.sessionData.userIdentifier,\n\t\t\t\tuserEmail:\n\t\t\t\t\tuser_email || (this.sessionData.userObject as any)?.name,\n\t\t\t},\n\t\t})\n\t}\n\n\t// Reset the events array and push to a backend.\n\tasync _save() {\n\t\ttry {\n\t\t\t// reset the session if over 4 hours and no sessionKey is provided\n\t\t\tif (\n\t\t\t\tthis.state === 'Recording' &&\n\t\t\t\tthis.listeners &&\n\t\t\t\t!this.sessionData.sessionKey &&\n\t\t\t\tthis.sessionData.sessionStartTime &&\n\t\t\t\tDate.now() - this.sessionData.sessionStartTime >\n\t\t\t\t\tMAX_SESSION_LENGTH\n\t\t\t) {\n\t\t\t\tthis.logger.log(`Resetting session`, {\n\t\t\t\t\tstart: this.sessionData.sessionStartTime,\n\t\t\t\t})\n\t\t\t\tawait this._reset({})\n\t\t\t}\n\t\t\tlet sendFn = undefined\n\t\t\tif (this.options?.sendMode === 'local') {\n\t\t\t\tsendFn = async (payload: any) => {\n\t\t\t\t\tlet blob = new Blob(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\tquery: print(PushSessionEventsDocument),\n\t\t\t\t\t\t\t\tvariables: payload,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t],\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'application/json',\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t\tawait window.fetch(`${this._backendUrl}`, {\n\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\tbody: blob,\n\t\t\t\t\t})\n\t\t\t\t\treturn 0\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait this._sendPayload({ sendFn })\n\t\t\tthis.hasPushedData = true\n\t\t\tthis.sessionData.lastPushTime = Date.now()\n\t\t\tsetSessionData(this.sessionData)\n\t\t} catch (e) {\n\t\t\tif (this._isOnLocalHost) {\n\t\t\t\tsdkLog('error', e)\n\t\t\t\tHighlightWarning('_save', e)\n\t\t\t}\n\t\t}\n\t\tif (this.state === 'Recording') {\n\t\t\tif (this.pushPayloadTimerId) {\n\t\t\t\tclearTimeout(this.pushPayloadTimerId)\n\t\t\t\tthis.pushPayloadTimerId = undefined\n\t\t\t}\n\t\t\tthis.pushPayloadTimerId = setTimeout(() => {\n\t\t\t\tthis._save()\n\t\t\t}, SEND_FREQUENCY)\n\t\t}\n\t}\n\n\t/**\n\t * This proxy should be used instead of rrweb's native addCustomEvent.\n\t * The proxy makes sure recording has started before emitting a custom event.\n\t */\n\taddCustomEvent<T>(tag: string, payload: T): void {\n\t\tif (this.state === 'NotRecording') {\n\t\t\tlet intervalId: ReturnType<typeof setInterval>\n\t\t\tconst worker = () => {\n\t\t\t\tclearInterval(intervalId)\n\t\t\t\tif (this.state === 'Recording' && this.events.length > 0) {\n\t\t\t\t\trrwebAddCustomEvent(tag, payload)\n\t\t\t\t} else {\n\t\t\t\t\tintervalId = setTimeout(worker, 500)\n\t\t\t\t}\n\t\t\t}\n\t\t\tintervalId = setTimeout(worker, 500)\n\t\t} else if (\n\t\t\tthis.state === 'Recording' &&\n\t\t\t(this.events.length > 0 || this.hasPushedData)\n\t\t) {\n\t\t\trrwebAddCustomEvent(tag, payload)\n\t\t}\n\t}\n\n\tasync _sendPayload({\n\t\tsendFn,\n\t}: {\n\t\tsendFn?: (\n\t\t\tpayload: PushSessionEventsMutationVariables,\n\t\t) => Promise<number>\n\t}) {\n\t\tconst resources = FirstLoadListeners.getRecordedNetworkResources(\n\t\t\tthis._firstLoadListeners,\n\t\t\tthis._recordingStartTime,\n\t\t)\n\t\tconst webSocketEvents = FirstLoadListeners.getRecordedWebSocketEvents(\n\t\t\tthis._firstLoadListeners,\n\t\t)\n\t\tconst events = [...this.events]\n\t\tconst messages = [...this._firstLoadListeners.messages]\n\t\tconst errors = [...this._firstLoadListeners.errors]\n\n\t\t// if it is time to take a full snapshot,\n\t\t// ensure the snapshot is at the beginning of the next payload\n\t\t// After snapshot thresholds have been met,\n\t\t// take a full snapshot and reset the counters\n\t\tconst { bytes, time } = this.enableCanvasRecording\n\t\t\t? SNAPSHOT_SETTINGS.canvas\n\t\t\t: SNAPSHOT_SETTINGS.normal\n\t\tif (\n\t\t\tthis._eventBytesSinceSnapshot >= bytes &&\n\t\t\tnew Date().getTime() - this._lastSnapshotTime >= time\n\t\t) {\n\t\t\tthis.takeFullSnapshot()\n\t\t}\n\n\t\tthis.logger.log(\n\t\t\t`Sending: ${events.length} events, ${messages.length} messages, ${resources.length} network resources, ${errors.length} errors \\nTo: ${this._backendUrl}\\nOrg: ${this.organizationID}\\nSessionSecureID: ${this.sessionData.sessionSecureID}`,\n\t\t)\n\t\tconst payloadId = new Date().getTime()\n\t\tconst highlightLogs = getHighlightLogs()\n\t\tif (sendFn) {\n\t\t\tconst sessionPayload: PushPayloadMutationVariables = {\n\t\t\t\tsession_secure_id: this.sessionData.sessionSecureID,\n\t\t\t\tpayload_id: payloadId.toString(),\n\t\t\t\tevents: { events } as ReplayEventsInput,\n\t\t\t\tmessages: stringify({ messages }),\n\t\t\t\tresources: JSON.stringify({ resources }),\n\t\t\t\tweb_socket_events: JSON.stringify({ webSocketEvents }),\n\t\t\t\terrors,\n\t\t\t\tis_beacon: false,\n\t\t\t\thas_session_unloaded: this.hasSessionUnloaded,\n\t\t\t\thighlight_logs: highlightLogs || undefined,\n\t\t\t}\n\n\t\t\tconst { compressedBase64 } = await payloadToBase64(sessionPayload)\n\t\t\tawait sendFn({\n\t\t\t\tsession_secure_id: this.sessionData.sessionSecureID,\n\t\t\t\tpayload_id: new Date().getTime().toString(),\n\t\t\t\tdata: compressedBase64,\n\t\t\t})\n\t\t} else {\n\t\t\tthis._worker.postMessage({\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: MessageType.AsyncEvents,\n\t\t\t\t\tid: payloadId,\n\t\t\t\t\tevents,\n\t\t\t\t\tmessages,\n\t\t\t\t\terrors,\n\t\t\t\t\tresourcesString: JSON.stringify({ resources: resources }),\n\t\t\t\t\twebSocketEventsString: JSON.stringify({\n\t\t\t\t\t\twebSocketEvents: webSocketEvents,\n\t\t\t\t\t}),\n\t\t\t\t\thasSessionUnloaded: this.hasSessionUnloaded,\n\t\t\t\t\thighlightLogs: highlightLogs,\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\tsetSessionData(this.sessionData)\n\n\t\t// If sendFn throws an exception, the data below will not be cleared, and it will be re-uploaded on the next PushPayload.\n\t\tFirstLoadListeners.clearRecordedNetworkResources(\n\t\t\tthis._firstLoadListeners,\n\t\t)\n\t\t// We are creating a weak copy of the events. rrweb could have pushed more events to this.events while we send the request with the events as a payload.\n\t\t// Originally, we would clear this.events but this could lead to a race condition.\n\t\t// Example Scenario:\n\t\t// 1. Create the events payload from this.events (with N events)\n\t\t// 2. rrweb pushes to this.events (with M events)\n\t\t// 3. Network request made to push payload (Only includes N events)\n\t\t// 4. this.events is cleared (we lose M events)\n\t\tthis.events = this.events.slice(events.length)\n\n\t\tthis._firstLoadListeners.messages =\n\t\t\tthis._firstLoadListeners.messages.slice(messages.length)\n\t\tthis._firstLoadListeners.errors = this._firstLoadListeners.errors.slice(\n\t\t\terrors.length,\n\t\t)\n\t\tclearHighlightLogs(highlightLogs)\n\t}\n\n\tprivate takeFullSnapshot() {\n\t\tif (!this._recordStop) {\n\t\t\tthis.logger.log(`skipping full snapshot as rrweb is not running`)\n\t\t\treturn\n\t\t}\n\t\tthis.logger.log(`taking full snapshot`, {\n\t\t\tbytesSinceSnapshot: this._eventBytesSinceSnapshot,\n\t\t\tlastSnapshotTime: this._lastSnapshotTime,\n\t\t})\n\t\trecord.takeFullSnapshot()\n\t\tthis._eventBytesSinceSnapshot = 0\n\t\tthis._lastSnapshotTime = new Date().getTime()\n\t}\n\n\tregisterLD(client: LDClient) {\n\t\t// TODO(vkorolik): can only register one LD client for now\n\t\tif (this._integrations.length) return\n\t\tthis._integrations.push(new LaunchDarklyIntegration(client))\n\t}\n}\n\ninterface HighlightWindow extends Window {\n\tHighlight: Highlight\n\tIntercom?: any\n\telectron?: {\n\t\tipcRenderer: {\n\t\t\ton: (channel: string, listener: (...args: any[]) => void) => {}\n\t\t}\n\t}\n\tCypress?: any\n}\n\ndeclare var window: HighlightWindow\n\ndeclare global {\n\tinterface Console {\n\t\tdefaultLog: any\n\t\tdefaultError: any\n\t\tdefaultWarn: any\n\t\tdefaultDebug: any\n\t}\n}\n\nexport { GenerateSecureID, getPreviousSessionData, getTracer, MetricCategory }\nexport type {\n\tAmplitudeIntegrationOptions,\n\tConsoleMessage,\n\tHighlightFetchWindow,\n\tHighlightOptions,\n\tHighlightPublicInterface,\n\tIntegration,\n\tLDClient,\n\tMetadata,\n\tMetric,\n\tMixpanelIntegrationOptions,\n\tRequestResponsePair,\n\tSessionDetails,\n}\n","import { H } from '../index'\n\nexport const listenToChromeExtensionMessage = () => {\n\t// typeof checks to see if chrome is defined. chrome is not defined outside of the context of an extension or Chromium browser.\n\tif (typeof chrome !== 'undefined' && chrome?.runtime?.onMessage) {\n\t\tchrome?.runtime?.onMessage.addListener(\n\t\t\t(message, _sender, sendResponse) => {\n\t\t\t\tconst action = message.action\n\t\t\t\tconsole.log(\n\t\t\t\t\t`[highlight] received '${action}' event from extension.`,\n\t\t\t\t)\n\t\t\t\tswitch (action) {\n\t\t\t\t\tcase 'init': {\n\t\t\t\t\t\tH.init(1, {\n\t\t\t\t\t\t\tdebug: true,\n\t\t\t\t\t\t})\n\t\t\t\t\t\tH.getSessionURL().then((url) => {\n\t\t\t\t\t\t\tsendResponse({ url })\n\t\t\t\t\t\t})\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tcase 'stop': {\n\t\t\t\t\t\tH.stop()\n\t\t\t\t\t\tsendResponse({ success: true })\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true\n\t\t\t},\n\t\t)\n\t}\n}\n","/*\nGiven a `BrowserWindow`, sets up event listeners for Highlight.\n */\nexport default function configureElectronHighlight(window: any) {\n\tif (window.on && window.webContents?.send) {\n\t\twindow.on('focus', () => {\n\t\t\twindow.webContents.send('highlight.run', { visible: true })\n\t\t})\n\n\t\twindow.on('blur', () => {\n\t\t\twindow.webContents.send('highlight.run', { visible: false })\n\t\t})\n\n\t\twindow.on('close', () => {\n\t\t\twindow.webContents.send('highlight.run', { visible: false })\n\t\t})\n\t}\n}\n","import type { HighlightPublicInterface } from '../client'\n\ninterface SegmentContext {\n\tpayload: any\n\tnext: any\n\tintegrations?: any\n}\n\nexport const HighlightSegmentMiddleware = ({\n\tnext,\n\tpayload,\n}: SegmentContext) => {\n\tif (\n\t\ttypeof window !== 'undefined' &&\n\t\ttypeof document !== 'undefined' &&\n\t\t'H' in window\n\t) {\n\t\tif (payload.obj.type === 'track') {\n\t\t\tconst trackEventName = payload.obj.event\n\t\t\tconst trackEventProperties = payload.obj.properties\n\t\t\twindow.H.track(trackEventName, trackEventProperties)\n\t\t} else if (payload.obj.type === 'identify') {\n\t\t\tconst identifier = payload.obj.userId\n\t\t\t// only send identify call if segment identify was called\n\t\t\t// with a user ID, since highlight identify requires a user ID.\n\t\t\tif (identifier?.length) {\n\t\t\t\tconst identifyMetadata = payload.obj.traits\n\t\t\t\twindow.H.identify(identifier, identifyMetadata)\n\t\t\t}\n\t\t}\n\t}\n\n\tnext(payload)\n}\n\ninterface HighlightWindow extends Window {\n\tH: HighlightPublicInterface\n}\n\ndeclare var window: HighlightWindow\n","import type { HighlightFetchWindow } from '../../client'\nimport type { HighlightPublicInterface } from '../../client'\n\ntype HighlightWindow = Window & {\n\tH: HighlightPublicInterface\n} & HighlightFetchWindow\n\ndeclare var window: HighlightWindow\n\nexport const initializeFetchListener = () => {\n\tif (typeof window !== 'undefined') {\n\t\t// avoid initializing fetch listener more than once.\n\t\tif (typeof window._highlightFetchPatch !== 'undefined') {\n\t\t\treturn\n\t\t}\n\t\twindow._originalFetch = window.fetch\n\t\twindow._fetchProxy = (\n\t\t\tinput: RequestInfo,\n\t\t\tinit: RequestInit | undefined,\n\t\t) => {\n\t\t\treturn window._originalFetch(input, init)\n\t\t}\n\n\t\twindow._highlightFetchPatch = (\n\t\t\tinput: RequestInfo,\n\t\t\tinit: RequestInit | undefined,\n\t\t) => {\n\t\t\treturn window._fetchProxy.call(window || global, input, init)\n\t\t}\n\n\t\twindow.fetch = window._highlightFetchPatch\n\t}\n}\n","import { createNetworkRequestId } from '../../client/listeners/network-listener/utils/utils'\nimport type { HighlightWebSocketWindow } from '../../client/listeners/network-listener/utils/web-socket-listener'\n\ndeclare var window: HighlightWebSocketWindow\n\nconst placeholderCallback = () => null\n\nexport const initializeWebSocketListener = () => {\n\tif (typeof window !== 'undefined') {\n\t\t// avoid initializing fetch listener more than once.\n\t\tif (typeof window._highlightWebSocketRequestCallback !== 'undefined') {\n\t\t\treturn\n\t\t}\n\n\t\twindow._highlightWebSocketRequestCallback = placeholderCallback\n\t\twindow._highlightWebSocketEventCallback = placeholderCallback\n\n\t\tconst WebSocketProxy = new Proxy(window.WebSocket, {\n\t\t\tconstruct(\n\t\t\t\ttarget,\n\t\t\t\targs: [url: string, protocols?: string | string[]],\n\t\t\t) {\n\t\t\t\tconst [, socketId] = createNetworkRequestId()\n\t\t\t\tconst webSocket = new target(...args)\n\n\t\t\t\tconst openHandler = (event: Event) => {\n\t\t\t\t\twindow._highlightWebSocketRequestCallback({\n\t\t\t\t\t\tsocketId,\n\t\t\t\t\t\tinitiatorType: 'websocket',\n\t\t\t\t\t\ttype: 'open',\n\t\t\t\t\t\tname: webSocket.url,\n\t\t\t\t\t\tstartTimeAbs: performance.timeOrigin + event.timeStamp,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tconst closeHandler = (event: CloseEvent) => {\n\t\t\t\t\twindow._highlightWebSocketRequestCallback({\n\t\t\t\t\t\tsocketId,\n\t\t\t\t\t\tinitiatorType: 'websocket',\n\t\t\t\t\t\ttype: 'close',\n\t\t\t\t\t\tname: webSocket.url,\n\t\t\t\t\t\tresponseEndAbs:\n\t\t\t\t\t\t\tperformance.timeOrigin + event.timeStamp,\n\t\t\t\t\t})\n\n\t\t\t\t\twebSocket.removeEventListener('open', openHandler)\n\t\t\t\t\twebSocket.removeEventListener('error', errorHandler)\n\t\t\t\t\twebSocket.removeEventListener('message', messageHandler)\n\t\t\t\t\twebSocket.removeEventListener('close', closeHandler)\n\t\t\t\t}\n\n\t\t\t\tconst messageHandler = (event: MessageEvent) => {\n\t\t\t\t\tconst { data } = event\n\t\t\t\t\tconst message =\n\t\t\t\t\t\ttypeof data === 'string' ? event.data : undefined\n\n\t\t\t\t\tlet size: number\n\t\t\t\t\tif (typeof data === 'string') {\n\t\t\t\t\t\tsize = data.length\n\t\t\t\t\t} else if (data instanceof Blob) {\n\t\t\t\t\t\tsize = data.size\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsize = data.byteLength || 0\n\t\t\t\t\t}\n\n\t\t\t\t\twindow._highlightWebSocketEventCallback({\n\t\t\t\t\t\tsocketId,\n\t\t\t\t\t\ttype: 'received',\n\t\t\t\t\t\tname: webSocket.url,\n\t\t\t\t\t\ttimeStamp: performance.timeOrigin + event.timeStamp,\n\t\t\t\t\t\tsize,\n\t\t\t\t\t\tmessage,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tconst errorHandler = (event: Event) => {\n\t\t\t\t\twindow._highlightWebSocketEventCallback({\n\t\t\t\t\t\tsocketId,\n\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\tname: webSocket.url,\n\t\t\t\t\t\ttimeStamp: performance.timeOrigin + event.timeStamp,\n\t\t\t\t\t\tsize: 0,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\twebSocket.addEventListener('open', openHandler)\n\t\t\t\twebSocket.addEventListener('error', errorHandler)\n\t\t\t\twebSocket.addEventListener('message', messageHandler)\n\t\t\t\twebSocket.addEventListener('close', closeHandler)\n\n\t\t\t\tconst sendProxy = new Proxy(webSocket.send, {\n\t\t\t\t\tapply: function (\n\t\t\t\t\t\tsendTarget,\n\t\t\t\t\t\tthisArg,\n\t\t\t\t\t\targs: [data: string | Blob | ArrayBuffer],\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst data = args[0]\n\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\ttypeof data === 'string' ? data : undefined\n\n\t\t\t\t\t\tlet size: number\n\t\t\t\t\t\tif (typeof data === 'string') {\n\t\t\t\t\t\t\tsize = data.length\n\t\t\t\t\t\t} else if (data instanceof Blob) {\n\t\t\t\t\t\t\tsize = data.size\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsize = data.byteLength || 0\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\twindow._highlightWebSocketEventCallback({\n\t\t\t\t\t\t\tsocketId,\n\t\t\t\t\t\t\ttype: 'sent',\n\t\t\t\t\t\t\tname: webSocket.url,\n\t\t\t\t\t\t\ttimeStamp:\n\t\t\t\t\t\t\t\tperformance.timeOrigin + performance.now(),\n\t\t\t\t\t\t\tsize,\n\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tsendTarget.apply(thisArg, args)\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\twebSocket.send = sendProxy\n\n\t\t\t\treturn webSocket\n\t\t\t},\n\t\t})\n\n\t\twindow.WebSocket = WebSocketProxy\n\t}\n}\n","/**\n * This is the API reference for the LaunchDarkly Observability and Session Replay SDK for JavaScript.\n *\n * This SDK is intended for use in browser environments.\n *\n * In typical usage, you will use this alongside the launchdarkly SDK while initializing\n * by providing {@link Observe} and {@link Record} plugins.\n *\n * For more information, see the [SDK Reference Guide](https://docs.launchdarkly.com/sdk/observability).\n *\n * @packageDocumentation\n */\nimport type { HighlightClassOptions, RequestResponsePair } from './client'\nimport { GenerateSecureID, Highlight } from './client'\nimport { FirstLoadListeners } from './client/listeners/first-load-listeners'\nimport type {\n\tHighlightOptions,\n\tHighlightPublicInterface,\n\tMetadata,\n\tMetric,\n\tOnHighlightReadyOptions,\n\tSessionDetails,\n} from './client/types/types'\nimport {\n\ttype AmplitudeAPI,\n\tsetupAmplitudeIntegration,\n} from './integrations/amplitude.js'\nimport {\n\ttype MixpanelAPI,\n\tsetupMixpanelIntegration,\n} from './integrations/mixpanel.js'\n\nimport { HIGHLIGHT_URL } from './client/constants/sessions.js'\nimport type { ErrorMessageType, Source } from './client/types/shared-types'\nimport {\n\tgetPreviousSessionData,\n\tloadCookieSessionData,\n} from './client/utils/sessionStorage/highlightSession.js'\nimport { setCookieWriteEnabled } from './client/utils/storage'\nimport { Attributes, Context, Span, SpanOptions } from '@opentelemetry/api'\nimport version from './version.js'\nimport { listenToChromeExtensionMessage } from './browserExtension/extensionListener.js'\nimport configureElectronHighlight from './environments/electron.js'\nimport { HighlightSegmentMiddleware } from './integrations/segment.js'\nimport { initializeFetchListener } from './listeners/fetch'\nimport { initializeWebSocketListener } from './listeners/web-socket'\nimport { ViewportResizeListenerArgs } from './client/listeners/viewport-resize-listener'\nimport { getNoopSpan } from './client/otel/utils.js'\nimport { getTracer } from './client/otel'\nimport {\n\tLaunchDarklyIntegration,\n\tsetupLaunchDarklyIntegration,\n} from './integrations/launchdarkly'\nimport { IntegrationClient } from './integrations'\nimport { sdkLog } from './client/utils/sdkLogger'\n\nenum MetricCategory {\n\tDevice = 'Device',\n\tWebVital = 'WebVital',\n\tFrontend = 'Frontend',\n\tBackend = 'Backend',\n}\n\nconst HighlightWarning = (context: string, msg: any) => {\n\tsdkLog('warn', `highlight.run warning: (${context}): `, msg)\n}\n\ninterface HighlightWindow extends Window {\n\tHighlightIO: new (\n\t\toptions: HighlightClassOptions,\n\t\tfirstLoadListeners: FirstLoadListeners,\n\t) => Highlight\n\tH: HighlightPublicInterface\n\tmixpanel?: MixpanelAPI\n\tamplitude?: AmplitudeAPI\n\tIntercom?: any\n}\ndeclare var window: HighlightWindow\n\nconst READY_WAIT_LOOP_MS = 200\n\nlet onHighlightReadyQueue: {\n\toptions?: OnHighlightReadyOptions\n\tfunc: () => void | Promise<void>\n}[] = []\nlet onHighlightReadyTimeout: ReturnType<typeof setTimeout> | undefined =\n\tundefined\n\nlet highlight_obj: Highlight\nlet first_load_listeners: FirstLoadListeners\nlet integrations: IntegrationClient[] = []\nlet init_called = false\ntype Callback = (span?: Span) => any\n\nconst H: HighlightPublicInterface = {\n\toptions: undefined,\n\tinit: (projectID?: string | number, options?: HighlightOptions) => {\n\t\ttry {\n\t\t\tH.options = options\n\n\t\t\t// Don't run init when called outside of the browser.\n\t\t\tif (\n\t\t\t\ttypeof window === 'undefined' ||\n\t\t\t\ttypeof document === 'undefined'\n\t\t\t) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Don't initialize if an projectID is not set.\n\t\t\tif (!projectID) {\n\t\t\t\tconsole.info(\n\t\t\t\t\t'Highlight is not initializing because projectID was passed undefined.',\n\t\t\t\t)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (options?.sessionCookie) {\n\t\t\t\tloadCookieSessionData()\n\t\t\t} else {\n\t\t\t\tsetCookieWriteEnabled(false)\n\t\t\t}\n\n\t\t\tconst previousSession = getPreviousSessionData()\n\t\t\tlet sessionSecureID = GenerateSecureID()\n\n\t\t\tif (options?.sessionKey) {\n\t\t\t\tsessionSecureID = GenerateSecureID(\n\t\t\t\t\t`${projectID}-${options.sessionKey}`,\n\t\t\t\t)\n\t\t\t} else if (previousSession?.sessionSecureID) {\n\t\t\t\tsessionSecureID = previousSession.sessionSecureID\n\t\t\t}\n\n\t\t\t// `init` was already called, do not reinitialize\n\t\t\tif (init_called) {\n\t\t\t\treturn { sessionSecureID }\n\t\t\t}\n\t\t\tinit_called = true\n\n\t\t\tinitializeFetchListener()\n\t\t\tinitializeWebSocketListener()\n\n\t\t\tconst client_options: HighlightClassOptions = {\n\t\t\t\t...options,\n\t\t\t\torganizationID: projectID,\n\t\t\t\tfirstloadVersion: version,\n\t\t\t\tenvironment: options?.environment || 'production',\n\t\t\t\tappVersion: options?.version,\n\t\t\t\tsessionSecureID,\n\t\t\t}\n\n\t\t\tfirst_load_listeners = new FirstLoadListeners(client_options)\n\t\t\tif (!options?.manualStart) {\n\t\t\t\t// Start some of the listeners before client is loaded, then hand the\n\t\t\t\t// listeners over for client to manage\n\t\t\t\tfirst_load_listeners.startListening()\n\t\t\t}\n\n\t\t\thighlight_obj =\n\t\t\t\thighlight_obj ??\n\t\t\t\tnew Highlight(client_options, first_load_listeners)\n\n\t\t\tif (!options?.manualStart) {\n\t\t\t\thighlight_obj.initialize()\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t!options?.integrations?.mixpanel?.disabled &&\n\t\t\t\toptions?.integrations?.mixpanel?.projectToken\n\t\t\t) {\n\t\t\t\tsetupMixpanelIntegration(options.integrations.mixpanel)\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t!options?.integrations?.amplitude?.disabled &&\n\t\t\t\toptions?.integrations?.amplitude?.apiKey\n\t\t\t) {\n\t\t\t\tsetupAmplitudeIntegration(options.integrations.amplitude)\n\t\t\t}\n\n\t\t\treturn { sessionSecureID }\n\t\t} catch (e) {\n\t\t\tHighlightWarning('init', e)\n\t\t}\n\t},\n\tsnapshot: async (element: HTMLCanvasElement) => {\n\t\ttry {\n\t\t\tif (highlight_obj && highlight_obj.ready) {\n\t\t\t\treturn await highlight_obj.snapshot(element)\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tHighlightWarning('snapshot', e)\n\t\t}\n\t},\n\taddSessionFeedback: ({\n\t\tverbatim,\n\t\tuserName,\n\t\tuserEmail,\n\t\ttimestampOverride,\n\t}) => {\n\t\ttry {\n\t\t\tH.onHighlightReady(() =>\n\t\t\t\thighlight_obj.addSessionFeedback({\n\t\t\t\t\tverbatim,\n\t\t\t\t\ttimestamp: timestampOverride || new Date().toISOString(),\n\t\t\t\t\tuser_email: userEmail,\n\t\t\t\t\tuser_name: userName,\n\t\t\t\t}),\n\t\t\t)\n\t\t} catch (e) {\n\t\t\tHighlightWarning('error', e)\n\t\t}\n\t},\n\tconsumeError: (\n\t\terror: Error,\n\t\tmessage?: string,\n\t\tpayload?: { [key: string]: string },\n\t) => {\n\t\ttry {\n\t\t\tH.onHighlightReady(() =>\n\t\t\t\thighlight_obj.consumeCustomError(\n\t\t\t\t\terror,\n\t\t\t\t\tmessage,\n\t\t\t\t\tJSON.stringify(payload),\n\t\t\t\t),\n\t\t\t)\n\t\t} catch (e) {\n\t\t\tHighlightWarning('error', e)\n\t\t}\n\t},\n\tconsume: (\n\t\terror: Error,\n\t\topts: {\n\t\t\tmessage?: string\n\t\t\tpayload?: object\n\t\t\tsource?: string\n\t\t\ttype?: ErrorMessageType\n\t\t},\n\t) => {\n\t\ttry {\n\t\t\tH.onHighlightReady(() => highlight_obj.consumeError(error, opts))\n\t\t} catch (e) {\n\t\t\tHighlightWarning('error', e)\n\t\t}\n\t},\n\terror: (message: string, payload?: { [key: string]: string }) => {\n\t\ttry {\n\t\t\tH.onHighlightReady(() =>\n\t\t\t\thighlight_obj.pushCustomError(message, JSON.stringify(payload)),\n\t\t\t)\n\t\t} catch (e) {\n\t\t\tHighlightWarning('error', e)\n\t\t}\n\t},\n\ttrack: (event: string, metadata: Metadata = {}) => {\n\t\ttry {\n\t\t\tH.onHighlightReady(() => {\n\t\t\t\thighlight_obj.addProperties({ ...metadata, event: event })\n\t\t\t\thighlight_obj.log('H.track', 'INFO', {\n\t\t\t\t\t...(metadata ?? {}),\n\t\t\t\t\tevent,\n\t\t\t\t})\n\t\t\t})\n\t\t\tconst highlightUrl = highlight_obj?.getCurrentSessionURL()\n\n\t\t\tif (!H.options?.integrations?.mixpanel?.disabled) {\n\t\t\t\tif (window.mixpanel?.track) {\n\t\t\t\t\twindow.mixpanel.track(event, {\n\t\t\t\t\t\t...metadata,\n\t\t\t\t\t\thighlightSessionURL: highlightUrl,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!H.options?.integrations?.amplitude?.disabled) {\n\t\t\t\tif (window.amplitude?.getInstance) {\n\t\t\t\t\twindow.amplitude.getInstance().logEvent(event, {\n\t\t\t\t\t\t...metadata,\n\t\t\t\t\t\thighlightSessionURL: highlightUrl,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!H.options?.integrations?.intercom?.disabled) {\n\t\t\t\tif (window.Intercom) {\n\t\t\t\t\twindow.Intercom('trackEvent', event, metadata)\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tHighlightWarning('track', e)\n\t\t}\n\t},\n\tlog: (message: any, level: string, metadata?: Attributes) => {\n\t\ttry {\n\t\t\tH.onHighlightReady(() =>\n\t\t\t\thighlight_obj.log(message, level, metadata ?? {}),\n\t\t\t)\n\t\t} catch (e) {\n\t\t\tHighlightWarning('log', e)\n\t\t}\n\t},\n\tstart: (options) => {\n\t\tif (highlight_obj?.state === 'Recording' && !options?.forceNew) {\n\t\t\tif (!options?.silent) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'Highlight is already recording. Please `H.stop()` the current session before starting a new one.',\n\t\t\t\t)\n\t\t\t}\n\t\t} else {\n\t\t\t// the client replaces its listeners on reset, so start the instance it\n\t\t\t// currently owns rather than the one created at init\n\t\t\tconst listeners =\n\t\t\t\thighlight_obj?._firstLoadListeners ?? first_load_listeners\n\t\t\tlisteners.startListening()\n\t\t\tH.onHighlightReady(\n\t\t\t\tasync () => {\n\t\t\t\t\tawait highlight_obj.initialize(options)\n\t\t\t\t},\n\t\t\t\t{ waitForReady: false },\n\t\t\t)\n\t\t}\n\t},\n\tstop: (options) => {\n\t\tif (highlight_obj?.state !== 'Recording') {\n\t\t\tif (!options?.silent) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'Highlight is already stopped. Please call `H.start()`.',\n\t\t\t\t)\n\t\t\t}\n\t\t} else {\n\t\t\tH.onHighlightReady(() => highlight_obj.stopRecording(true))\n\t\t}\n\t},\n\tidentify: (\n\t\tidentifier: string,\n\t\tmetadata: Metadata = {},\n\t\tsource?: Source,\n\t) => {\n\t\ttry {\n\t\t\tH.onHighlightReady(() =>\n\t\t\t\thighlight_obj.identify(identifier, metadata, source),\n\t\t\t)\n\t\t} catch (e) {\n\t\t\tHighlightWarning('identify', e)\n\t\t}\n\t\tif (!H.options?.integrations?.mixpanel?.disabled) {\n\t\t\tif (window.mixpanel?.identify) {\n\t\t\t\twindow.mixpanel.identify(\n\t\t\t\t\ttypeof metadata?.email === 'string'\n\t\t\t\t\t\t? metadata?.email\n\t\t\t\t\t\t: identifier,\n\t\t\t\t)\n\t\t\t\tif (metadata) {\n\t\t\t\t\twindow.mixpanel.track('identify', metadata)\n\t\t\t\t\twindow.mixpanel.people.set(metadata)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!H.options?.integrations?.amplitude?.disabled) {\n\t\t\tif (window.amplitude?.getInstance) {\n\t\t\t\twindow.amplitude.getInstance().setUserId(identifier)\n\n\t\t\t\tif (Object.keys(metadata).length > 0) {\n\t\t\t\t\tconst amplitudeUserProperties = Object.keys(\n\t\t\t\t\t\tmetadata,\n\t\t\t\t\t).reduce((acc, key) => {\n\t\t\t\t\t\tacc.set(key, metadata[key])\n\n\t\t\t\t\t\treturn acc\n\t\t\t\t\t}, new window.amplitude.Identify())\n\n\t\t\t\t\twindow.amplitude\n\t\t\t\t\t\t.getInstance()\n\t\t\t\t\t\t.identify(amplitudeUserProperties)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tmetrics: (metrics: Metric[]) => {\n\t\ttry {\n\t\t\tfor (const m of metrics) {\n\t\t\t\tH.recordMetric(m)\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tHighlightWarning('metrics', e)\n\t\t}\n\t},\n\trecordMetric: (metric: Metric) => {\n\t\ttry {\n\t\t\tH.onHighlightReady(() => {\n\t\t\t\thighlight_obj.recordGauge({\n\t\t\t\t\t...metric,\n\t\t\t\t\ttags: metric.tags ?? [],\n\t\t\t\t\tgroup: window.location.href,\n\t\t\t\t\tcategory: MetricCategory.Frontend,\n\t\t\t\t})\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tHighlightWarning('recordMetric', e)\n\t\t}\n\t},\n\trecordCount: (metric: Metric) => {\n\t\ttry {\n\t\t\tH.onHighlightReady(() => {\n\t\t\t\thighlight_obj.recordCount(metric)\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tHighlightWarning('recordCount', e)\n\t\t}\n\t},\n\trecordIncr: (metric: Omit<Metric, 'value'>) => {\n\t\ttry {\n\t\t\tH.onHighlightReady(() => {\n\t\t\t\thighlight_obj.recordIncr(metric)\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tHighlightWarning('recordIncr', e)\n\t\t}\n\t},\n\trecordHistogram: (metric: Metric) => {\n\t\ttry {\n\t\t\tH.onHighlightReady(() => {\n\t\t\t\thighlight_obj.recordHistogram(metric)\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tHighlightWarning('recordHistogram', e)\n\t\t}\n\t},\n\trecordUpDownCounter: (metric: Metric) => {\n\t\ttry {\n\t\t\tH.onHighlightReady(() => {\n\t\t\t\thighlight_obj.recordUpDownCounter(metric)\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tHighlightWarning('recordUpDownCounter', e)\n\t\t}\n\t},\n\tstartSpan: (\n\t\tname: string,\n\t\toptions: SpanOptions | ((span?: Span) => any),\n\t\tcontext?: Context | ((span?: Span) => any),\n\t\tfn?: (span?: Span) => any,\n\t): any => {\n\t\tconst tracer = getTracer()\n\t\tif (!tracer) {\n\t\t\tconst noopSpan = getNoopSpan()\n\n\t\t\tif (fn === undefined && context === undefined) {\n\t\t\t\treturn (options as Callback)(noopSpan)\n\t\t\t} else if (fn === undefined) {\n\t\t\t\treturn (context as Callback)(noopSpan)\n\t\t\t} else {\n\t\t\t\treturn fn(noopSpan)\n\t\t\t}\n\t\t}\n\n\t\tconst wrapCallback = (span: Span, callback: (span: Span) => any) => {\n\t\t\tconst result = callback(span)\n\t\t\tif (result instanceof Promise) {\n\t\t\t\treturn result.finally(() => span.end())\n\t\t\t} else {\n\t\t\t\tspan.end()\n\t\t\t\treturn result\n\t\t\t}\n\t\t}\n\n\t\tif (fn === undefined && context === undefined) {\n\t\t\treturn tracer.startActiveSpan(name, (span) =>\n\t\t\t\twrapCallback(span, options as Callback),\n\t\t\t)\n\t\t} else if (fn === undefined) {\n\t\t\treturn tracer.startActiveSpan(\n\t\t\t\tname,\n\t\t\t\toptions as SpanOptions,\n\t\t\t\t(span) => wrapCallback(span, context as Callback),\n\t\t\t)\n\t\t} else {\n\t\t\treturn tracer.startActiveSpan(\n\t\t\t\tname,\n\t\t\t\toptions as SpanOptions,\n\t\t\t\tcontext as Context,\n\t\t\t\t(span) => wrapCallback(span, fn),\n\t\t\t)\n\t\t}\n\t},\n\tstartManualSpan: (\n\t\tname: string,\n\t\toptions: SpanOptions | ((span: Span) => any),\n\t\tcontext?: Context | ((span: Span) => any),\n\t\tfn?: (span: Span) => any,\n\t): any => {\n\t\tconst tracer = getTracer()\n\t\tif (!tracer) {\n\t\t\tconst noopSpan = getNoopSpan()\n\n\t\t\tif (fn === undefined && context === undefined) {\n\t\t\t\treturn (options as Callback)(noopSpan)\n\t\t\t} else if (fn === undefined) {\n\t\t\t\treturn (context as Callback)(noopSpan)\n\t\t\t} else {\n\t\t\t\treturn fn(noopSpan)\n\t\t\t}\n\t\t}\n\n\t\tif (fn === undefined && context === undefined) {\n\t\t\treturn tracer.startActiveSpan(name, options as Callback)\n\t\t} else if (fn === undefined) {\n\t\t\treturn tracer.startActiveSpan(\n\t\t\t\tname,\n\t\t\t\toptions as SpanOptions,\n\t\t\t\tcontext as Callback,\n\t\t\t)\n\t\t} else {\n\t\t\treturn tracer.startActiveSpan(\n\t\t\t\tname,\n\t\t\t\toptions as SpanOptions,\n\t\t\t\tcontext as Context,\n\t\t\t\tfn,\n\t\t\t)\n\t\t}\n\t},\n\tgetSessionURL: () => {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tH.onHighlightReady(() => {\n\t\t\t\tconst secureID = highlight_obj.sessionData.sessionSecureID\n\t\t\t\tconst data = getPreviousSessionData(secureID)\n\n\t\t\t\tif (data) {\n\t\t\t\t\tresolve(\n\t\t\t\t\t\t`https://${HIGHLIGHT_URL}/${data.projectID}/sessions/${secureID}`,\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\treject(new Error(`Unable to get session URL: ${secureID}`))\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t},\n\tgetSessionDetails: () => {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tH.onHighlightReady(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst baseUrl = await H.getSessionURL()\n\t\t\t\t\tif (!baseUrl) {\n\t\t\t\t\t\tthrow new Error('Could not get session URL')\n\t\t\t\t\t}\n\n\t\t\t\t\tconst secureID = highlight_obj.sessionData.sessionSecureID\n\t\t\t\t\tconst sessionData = getPreviousSessionData(secureID)\n\t\t\t\t\tconst currentSessionTimestamp =\n\t\t\t\t\t\tsessionData?.sessionStartTime\n\t\t\t\t\tif (!currentSessionTimestamp) {\n\t\t\t\t\t\tthrow new Error('Could not get session start timestamp')\n\t\t\t\t\t}\n\n\t\t\t\t\tconst now = new Date().getTime()\n\t\t\t\t\tconst url = new URL(baseUrl)\n\t\t\t\t\tconst urlWithTimestamp = new URL(baseUrl)\n\t\t\t\t\turlWithTimestamp.searchParams.set(\n\t\t\t\t\t\t'ts',\n\t\t\t\t\t\t((now - currentSessionTimestamp) / 1000).toString(),\n\t\t\t\t\t)\n\n\t\t\t\t\tresolve({\n\t\t\t\t\t\turl: url.toString(),\n\t\t\t\t\t\turlWithTimestamp: urlWithTimestamp.toString(),\n\t\t\t\t\t\tsessionSecureID: secureID,\n\t\t\t\t\t} as SessionDetails)\n\t\t\t\t} catch (error) {\n\t\t\t\t\treject(error)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t},\n\tgetRecordingState: () => {\n\t\treturn highlight_obj?.state ?? 'NotRecording'\n\t},\n\tonHighlightReady: (func, options) => {\n\t\t// Run the callback immediately if Highlight is already ready\n\t\tif (highlight_obj && highlight_obj.ready) {\n\t\t\tfunc()\n\t\t\treturn\n\t\t}\n\n\t\tonHighlightReadyQueue.push({ options, func })\n\n\t\tif (onHighlightReadyTimeout !== undefined) {\n\t\t\treturn\n\t\t}\n\n\t\tconst processQueue = () => {\n\t\t\tconst newQueue = onHighlightReadyQueue.filter((item) => {\n\t\t\t\tif (\n\t\t\t\t\t!highlight_obj ||\n\t\t\t\t\t(item.options?.waitForReady !== false &&\n\t\t\t\t\t\t!highlight_obj.ready)\n\t\t\t\t) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\n\t\t\t\titem.func()\n\t\t\t\treturn false\n\t\t\t})\n\n\t\t\tonHighlightReadyQueue = newQueue\n\t\t\tonHighlightReadyTimeout = undefined\n\n\t\t\tif (onHighlightReadyQueue.length > 0) {\n\t\t\t\tonHighlightReadyTimeout = setTimeout(\n\t\t\t\t\tprocessQueue,\n\t\t\t\t\tREADY_WAIT_LOOP_MS,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\tprocessQueue()\n\t},\n\tregisterLD(client) {\n\t\t// TODO(vkorolik): can only register one LD client for now\n\t\tif (integrations.length) return\n\t\t// client integration necessary to track events from ErrorListener\n\t\tH.onHighlightReady(() => {\n\t\t\thighlight_obj.registerLD(client)\n\t\t})\n\t\t// firstload integration necessary to immediately capture ld.identify\n\t\tsetupLaunchDarklyIntegration(this, client, H.options)\n\t\tintegrations.push(new LaunchDarklyIntegration(client))\n\t},\n}\n\nif (typeof window !== 'undefined') {\n\twindow.H = H\n}\n\nlistenToChromeExtensionMessage()\ninitializeFetchListener()\ninitializeWebSocketListener()\n\n// Helpers only for testing\nconst __testing = {\n\treset: () => {\n\t\tinit_called = false\n\t\thighlight_obj = undefined as any\n\t\tonHighlightReadyQueue = []\n\t\tonHighlightReadyTimeout = undefined\n\t\tfirst_load_listeners = undefined as any\n\t},\n\tsetHighlightObj: (obj: Partial<Highlight>) => {\n\t\thighlight_obj = obj as Highlight\n\t},\n}\n\nexport {\n\tconfigureElectronHighlight,\n\tGenerateSecureID,\n\tH,\n\tHighlightSegmentMiddleware,\n\tMetricCategory,\n\t__testing,\n}\nexport type {\n\tHighlightOptions,\n\tViewportResizeListenerArgs,\n\tMetadata,\n\tRequestResponsePair,\n}\nexport { Observe } from './plugins/observe'\nexport { LDObserve } from './sdk/LDObserve'\nexport { Record } from './plugins/record'\nexport { LDRecord } from './sdk/LDRecord'\nexport type { ObserveOptions } from './client/types/observe'\nexport type { RecordOptions } from './client/types/record'\n"],"names":["WebSocketListener","requestCallback","eventCallback","urlBlocklist","initialHighlightWebSocketRequestCallback","initialHighlightWebSocketEventCallback","eventData","_a","message","size","visibleEventData","__objRest","redactedEventData","blockedUrl","NetworkListener","xhrCallback","fetchCallback","webSocketRequestCallback","webSocketEventCallback","disableWebSocketRecording","bodyKeysToRedact","highlightEndpoints","tracingOrigins","bodyKeysToRecord","removeXHRListener","XHRListener","removeFetchListener","FetchListener","removeWebSocketListener","FirstLoadListeners","options","__publicField","_b","ALL_CONSOLE_METHODS","highlightThis","ConsoleListener","c","errorValue","stringify","ERRORS_TO_IGNORE","ERROR_PATTERNS_TO_IGNORE","pattern","_c","randomUuidV4","__spreadProps","__spreadValues","defaultLogOptions","ErrorListener","e","shutdown","stop","sThis","_backendUrl","otlpEndpoint","_e","_d","header","_g","_f","bodyKey","_i","_h","url","DEFAULT_URL_BLOCKLIST","_j","_k","key","_l","requestResponsePair","event","recordingStartTime","httpResources","webSocketResources","documentTimeOrigin","offset","r","shouldNetworkRequestBeRecorded","resource","sanitizeOptions","matchPerformanceTimingsWithRequestResponsePair","webSocketEvents","HighlightWarning","context","msg","sdkLog","_Highlight","firstLoadListeners","__privateAdd","_graphqlSDK","GenerateSecureID","Logger","setSdkDebugLogging","setStorageMode","setCookieWriteEnabled","HighlightClientWorker","MessageType","storedSessionData","getPreviousSessionData","storageKeyName","SESSION_STORAGE_KEYS","removeItem","_0","__async","forceNew","sessionKey","user_identifier","user_object","getItem","user_object_string","err","getDefaultDataURLOptions","client","GraphQLClient","__privateSet","getSdk","getGraphQLRequestWrapper","_","optionsInternal","source","setItem","integration","level","metadata","createLog","payload","error","obj","type","res","parseError","errorMsg","properties_obj","typeArg","val","sampler","CustomSampler","setupBrowserTracing","_m","_o","_n","_q","_p","_r","_s","_t","setSessionSecureID","setSessionData","clientID","LocalStorageKeys","enableNetworkRecording","_u","destinationDomains","_v","gr","__privateGet","_w","FIRST_SEND_FREQUENCY","getDeviceDetails","getPerformanceMethods","MetricName","MetricCategory","emit","isCheckout","alreadyRecording","maskAllInputs","maskInputOptions","determineMaskInputOptions","record","_x","_y","determineTextPrivacySetting","_src","getRecordSequentialIdPlugin","pa","paEvents","hidden","VISIBILITY_DEBOUNCE_MS","listener","IFRAME_PARENT_READY","IFRAME_PARENT_RESPONSE","iframe","SegmentIntegrationListener","properties","trimmedUserId","PathListener","ViewportResizeListener","viewport","ClickListener","clickTarget","selector","textContent","t","getSimpleSelector","FocusListener","focusTarget","WebVitalsListener","data","name","value","tags","addTag","n","v","a","sanitizeUrl","NetworkPerformanceListener","isMetricSafeNumber","SessionShortcutListener","PerformanceListener","JankListener","visible","PageVisibilityListener","isTabHidden","unloadListener","height","width","availHeight","availWidth","metric","gauge","getMeter","metricInstrumentOptions","b","counter","histogram","up_down_counter","manual","now","projectID","sessionSecureID","relativeTimestamp","HIGHLIGHT_URL","element","timestamp","verbatim","user_email","user_name","MAX_SESSION_LENGTH","sendFn","blob","print","PushSessionEventsDocument","SEND_FREQUENCY","tag","intervalId","worker","rrwebAddCustomEvent","resources","events","messages","errors","bytes","time","SNAPSHOT_SETTINGS","payloadId","highlightLogs","getHighlightLogs","sessionPayload","compressedBase64","payloadToBase64","clearHighlightLogs","LaunchDarklyIntegration","Highlight","listenToChromeExtensionMessage","_sender","sendResponse","action","H","configureElectronHighlight","window","HighlightSegmentMiddleware","next","trackEventName","trackEventProperties","identifier","identifyMetadata","initializeFetchListener","input","init","placeholderCallback","initializeWebSocketListener","WebSocketProxy","target","args","socketId","createNetworkRequestId","webSocket","openHandler","closeHandler","errorHandler","messageHandler","sendProxy","sendTarget","thisArg","READY_WAIT_LOOP_MS","onHighlightReadyQueue","onHighlightReadyTimeout","highlight_obj","first_load_listeners","integrations","init_called","loadCookieSessionData","previousSession","client_options","version","setupMixpanelIntegration","setupAmplitudeIntegration","userName","userEmail","timestampOverride","opts","highlightUrl","amplitudeUserProperties","acc","metrics","m","fn","tracer","getTracer","noopSpan","getNoopSpan","wrapCallback","span","callback","result","resolve","reject","secureID","baseUrl","sessionData","currentSessionTimestamp","urlWithTimestamp","func","processQueue","item","setupLaunchDarklyIntegration","__testing"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/client/listeners/network-listener/utils/web-socket-listener.ts","../src/client/listeners/network-listener/network-listener.ts","../src/client/listeners/first-load-listeners.tsx","../src/client/index.tsx","../src/browserExtension/extensionListener.ts","../src/environments/electron.ts","../src/integrations/segment.ts","../src/listeners/fetch/index.ts","../src/listeners/web-socket/index.ts","../src/index.tsx"],"sourcesContent":["import { WebSocketEvent, WebSocketRequest } from './models'\n\nexport type WebSocketRequestListenerCallback = (event: WebSocketRequest) => void\n\nexport type WebSocketEventListenerCallback = (event: WebSocketEvent) => void\n\nexport type HighlightWebSocketWindow = Window & {\n\t/**\n\t * Callback for web socket open and close events that are displayed in the network requests\n\t */\n\t_highlightWebSocketRequestCallback: WebSocketRequestListenerCallback\n\t/**\n\t * Callback for web socket message and error events that are displayed under the websocket requests\n\t */\n\t_highlightWebSocketEventCallback: WebSocketEventListenerCallback\n\tWebSocket: any\n}\n\ndeclare var window: HighlightWebSocketWindow\n\nconst WebSocketListener = (\n\trequestCallback: WebSocketRequestListenerCallback,\n\teventCallback: WebSocketEventListenerCallback,\n\turlBlocklist: string[],\n) => {\n\tconst initialHighlightWebSocketRequestCallback =\n\t\twindow._highlightWebSocketRequestCallback\n\twindow._highlightWebSocketRequestCallback = requestCallback\n\n\tconst initialHighlightWebSocketEventCallback =\n\t\twindow._highlightWebSocketEventCallback\n\twindow._highlightWebSocketEventCallback = (eventData: WebSocketEvent) => {\n\t\tconst { message, size, ...visibleEventData } = eventData\n\t\tconst blockedUrl = urlBlocklist.some((blockedUrl) =>\n\t\t\teventData.name.toLowerCase().includes(blockedUrl),\n\t\t)\n\n\t\tconst redactedEventData = blockedUrl ? visibleEventData : eventData\n\n\t\teventCallback(redactedEventData)\n\t}\n\n\treturn () => {\n\t\twindow._highlightWebSocketRequestCallback =\n\t\t\tinitialHighlightWebSocketRequestCallback\n\t\twindow._highlightWebSocketEventCallback =\n\t\t\tinitialHighlightWebSocketEventCallback\n\t}\n}\n\nexport { WebSocketListener }\n","import { NetworkRecordingOptions } from '../../types/client'\nimport { FetchListener } from './utils/fetch-listener'\nimport { RequestResponsePair } from './utils/models'\nimport {\n\tWebSocketEventListenerCallback,\n\tWebSocketListener,\n\tWebSocketRequestListenerCallback,\n} from './utils/web-socket-listener'\nimport { XHRListener } from './utils/xhr-listener'\n\nexport type NetworkListenerCallback = (\n\trequestResponsePair: RequestResponsePair,\n) => void\n\ntype NetworkListenerArguments = {\n\txhrCallback: NetworkListenerCallback\n\tfetchCallback: NetworkListenerCallback\n\twebSocketRequestCallback: WebSocketRequestListenerCallback\n\twebSocketEventCallback: WebSocketEventListenerCallback\n\tdisableWebSocketRecording: boolean\n\tbodyKeysToRedact: string[]\n\thighlightEndpoints: string[]\n\ttracingOrigins: boolean | (string | RegExp)[]\n\turlBlocklist: string[]\n} & Pick<NetworkRecordingOptions, 'bodyKeysToRecord'>\n\nexport const NetworkListener = ({\n\txhrCallback,\n\tfetchCallback,\n\twebSocketRequestCallback,\n\twebSocketEventCallback,\n\tdisableWebSocketRecording,\n\tbodyKeysToRedact,\n\thighlightEndpoints,\n\ttracingOrigins,\n\turlBlocklist,\n\tbodyKeysToRecord,\n}: NetworkListenerArguments) => {\n\tconst removeXHRListener = XHRListener(\n\t\txhrCallback,\n\t\thighlightEndpoints,\n\t\ttracingOrigins,\n\t\turlBlocklist,\n\t\tbodyKeysToRedact,\n\t\tbodyKeysToRecord,\n\t)\n\tconst removeFetchListener = FetchListener(\n\t\tfetchCallback,\n\t\thighlightEndpoints,\n\t\ttracingOrigins,\n\t\turlBlocklist,\n\t\tbodyKeysToRedact,\n\t\tbodyKeysToRecord,\n\t)\n\n\tconst removeWebSocketListener = !disableWebSocketRecording\n\t\t? WebSocketListener(\n\t\t\t\twebSocketRequestCallback,\n\t\t\t\twebSocketEventCallback,\n\t\t\t\turlBlocklist,\n\t\t\t)\n\t\t: () => {}\n\n\treturn () => {\n\t\tremoveXHRListener()\n\t\tremoveFetchListener()\n\t\tremoveWebSocketListener()\n\t}\n}\n","import { ConsoleListener, defaultLogOptions } from './console-listener'\nimport { ErrorListener } from './error-listener'\n\nimport stringify from 'json-stringify-safe'\nimport { ERRORS_TO_IGNORE, ERROR_PATTERNS_TO_IGNORE } from '../constants/errors'\nimport { HighlightClassOptions } from '../index'\nimport { shutdown } from '../otel'\nimport { ALL_CONSOLE_METHODS, ConsoleMethods } from '../types/client'\nimport { ConsoleMessage, ErrorMessage } from '../types/shared-types'\nimport { NetworkListener } from './network-listener/network-listener'\nimport {\n\tRequestResponsePair,\n\tWebSocketEvent,\n\tWebSocketRequest,\n} from './network-listener/utils/models'\nimport { DEFAULT_URL_BLOCKLIST } from './network-listener/utils/network-sanitizer'\nimport {\n\tmatchPerformanceTimingsWithRequestResponsePair,\n\tshouldNetworkRequestBeRecorded,\n} from './network-listener/utils/utils'\nimport randomUuidV4 from '../utils/randomUuidV4'\n\n// Note: This class is used by both firstload and client. When constructed in client, it will match the current\n// codebase. When constructed in firstload, it will match the codebase at the time the npm package was published.\nexport class FirstLoadListeners {\n\tdisableConsoleRecording: boolean\n\treportConsoleErrors: boolean\n\tenablePromisePatch: boolean\n\tconsoleMethodsToRecord: ConsoleMethods[]\n\tlisteners: (() => void)[]\n\terrors: ErrorMessage[]\n\tmessages: ConsoleMessage[]\n\t// The properties below were added in 4.0.0 (Feb 2022), and are patched in by client via setupNetworkListeners()\n\toptions: HighlightClassOptions\n\thasNetworkRecording: boolean | undefined = true\n\tdisableNetworkRecording!: boolean\n\tenableRecordingNetworkContents!: boolean\n\txhrNetworkContents!: RequestResponsePair[]\n\tfetchNetworkContents!: RequestResponsePair[]\n\tdisableRecordingWebSocketContents!: boolean\n\twebSocketNetworkContents!: WebSocketRequest[] | undefined\n\twebSocketEventContents!: WebSocketEvent[]\n\ttracingOrigins!: boolean | (string | RegExp)[]\n\tnetworkHeadersToRedact!: string[]\n\tnetworkBodyKeysToRedact: string[] | undefined\n\tnetworkBodyKeysToRecord: string[] | undefined\n\tnetworkHeaderKeysToRecord: string[] | undefined\n\tlastNetworkRequestTimestamp: number\n\turlBlocklist!: string[]\n\thighlightEndpoints!: string[]\n\trequestResponseSanitizer?: (\n\t\tpair: RequestResponsePair,\n\t) => RequestResponsePair | null\n\n\tconstructor(options: HighlightClassOptions) {\n\t\tthis.options = options\n\t\tthis.disableConsoleRecording = !!options.disableConsoleRecording\n\t\tthis.reportConsoleErrors = options.reportConsoleErrors ?? false\n\t\tthis.enablePromisePatch = options.enablePromisePatch ?? false\n\t\tthis.consoleMethodsToRecord = options.consoleMethodsToRecord || [\n\t\t\t...ALL_CONSOLE_METHODS,\n\t\t]\n\t\tthis.listeners = []\n\t\tthis.errors = []\n\t\tthis.messages = []\n\t\tthis.lastNetworkRequestTimestamp = 0\n\t}\n\n\tisListening() {\n\t\treturn this.listeners.length > 0\n\t}\n\n\tstartListening() {\n\t\tif (this.isListening()) return\n\t\tconst highlightThis = this\n\t\tif (!this.disableConsoleRecording) {\n\t\t\tthis.listeners.push(\n\t\t\t\tConsoleListener(\n\t\t\t\t\t(c: ConsoleMessage) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tthis.reportConsoleErrors &&\n\t\t\t\t\t\t\t(c.type === 'Error' || c.type === 'error') &&\n\t\t\t\t\t\t\tc.value &&\n\t\t\t\t\t\t\tc.trace\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst errorValue = stringify(c.value)\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tERRORS_TO_IGNORE.includes(errorValue) ||\n\t\t\t\t\t\t\t\tERROR_PATTERNS_TO_IGNORE.some((pattern) =>\n\t\t\t\t\t\t\t\t\terrorValue.includes(pattern),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\thighlightThis.errors.push({\n\t\t\t\t\t\t\t\tevent: errorValue,\n\t\t\t\t\t\t\t\ttype: 'console.error',\n\t\t\t\t\t\t\t\turl: window.location.href,\n\t\t\t\t\t\t\t\tsource: c.trace[0]?.fileName\n\t\t\t\t\t\t\t\t\t? c.trace[0].fileName\n\t\t\t\t\t\t\t\t\t: '',\n\t\t\t\t\t\t\t\tlineNumber: c.trace[0]?.lineNumber\n\t\t\t\t\t\t\t\t\t? c.trace[0].lineNumber\n\t\t\t\t\t\t\t\t\t: 0,\n\t\t\t\t\t\t\t\tcolumnNumber: c.trace[0]?.columnNumber\n\t\t\t\t\t\t\t\t\t? c.trace[0].columnNumber\n\t\t\t\t\t\t\t\t\t: 0,\n\t\t\t\t\t\t\t\tstackTrace: c.trace,\n\t\t\t\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t\t\t\t\tid: randomUuidV4(),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t\thighlightThis.messages.push(c)\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t...defaultLogOptions,\n\t\t\t\t\t\tlevel: this.consoleMethodsToRecord,\n\t\t\t\t\t\trecordLaunchDarklySdkLogs:\n\t\t\t\t\t\t\tthis.options.recordLaunchDarklySdkLogs,\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\tthis.listeners.push(\n\t\t\tErrorListener(\n\t\t\t\t(e: ErrorMessage) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tERRORS_TO_IGNORE.includes(e.event) ||\n\t\t\t\t\t\tERROR_PATTERNS_TO_IGNORE.some((pattern) =>\n\t\t\t\t\t\t\te.event.includes(pattern),\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\thighlightThis.errors.push(e)\n\t\t\t\t},\n\t\t\t\t{ enablePromisePatch: this.enablePromisePatch },\n\t\t\t),\n\t\t)\n\t\tthis.listeners.push(shutdown)\n\t\tFirstLoadListeners.setupNetworkListener(this, this.options)\n\t}\n\n\tstopListening() {\n\t\tthis.listeners.forEach((stop: () => void) => stop())\n\t\tthis.listeners = []\n\t}\n\n\t// We define this as a static method because versions earlier than 4.0.0 (Feb 2022) don't have this code.\n\t// For those versions, calling this from client will monkey-patch the network listeners onto the old FirstLoadListener object.\n\tstatic setupNetworkListener(\n\t\tsThis: FirstLoadListeners,\n\t\toptions: HighlightClassOptions,\n\t): void {\n\t\tconst _backendUrl =\n\t\t\toptions?.backendUrl ||\n\t\t\timport.meta.env.REACT_APP_PUBLIC_GRAPH_URI ||\n\t\t\t'https://pub.highlight.io'\n\t\tconst otlpEndpoint = options.otlpEndpoint || 'https://otel.highlight.io'\n\t\tsThis.highlightEndpoints = [\n\t\t\t_backendUrl,\n\t\t\t`${otlpEndpoint}/v1/traces`,\n\t\t\t`${otlpEndpoint}/v1/logs`,\n\t\t\t`${otlpEndpoint}/v1/metrics`,\n\t\t]\n\n\t\tsThis.xhrNetworkContents = []\n\t\tsThis.fetchNetworkContents = []\n\t\tsThis.webSocketNetworkContents = []\n\t\tsThis.webSocketEventContents = []\n\t\tsThis.networkHeadersToRedact = []\n\t\tsThis.urlBlocklist = []\n\t\tsThis.tracingOrigins = options.tracingOrigins || []\n\n\t\t// Old versions of `firstload` use `disableNetworkRecording`. We fork here to ensure backwards compatibility.\n\t\tif (options?.disableNetworkRecording !== undefined) {\n\t\t\tsThis.disableNetworkRecording = options?.disableNetworkRecording\n\t\t\tsThis.enableRecordingNetworkContents = false\n\t\t\tsThis.disableRecordingWebSocketContents = true\n\t\t\tsThis.networkHeadersToRedact = []\n\t\t\tsThis.networkBodyKeysToRedact = []\n\t\t\tsThis.urlBlocklist = []\n\t\t\tsThis.networkBodyKeysToRecord = []\n\t\t} else if (typeof options?.networkRecording === 'boolean') {\n\t\t\tsThis.disableNetworkRecording = !options.networkRecording\n\t\t\tsThis.enableRecordingNetworkContents = false\n\t\t\tsThis.disableRecordingWebSocketContents = true\n\t\t\tsThis.networkHeadersToRedact = []\n\t\t\tsThis.networkBodyKeysToRedact = []\n\t\t\tsThis.urlBlocklist = []\n\t\t} else {\n\t\t\tif (options.networkRecording?.enabled !== undefined) {\n\t\t\t\tsThis.disableNetworkRecording =\n\t\t\t\t\t!options.networkRecording.enabled\n\t\t\t} else {\n\t\t\t\tsThis.disableNetworkRecording = false\n\t\t\t}\n\t\t\tsThis.enableRecordingNetworkContents =\n\t\t\t\toptions.networkRecording?.recordHeadersAndBody || false\n\t\t\tsThis.disableRecordingWebSocketContents =\n\t\t\t\toptions.networkRecording?.disableWebSocketEventRecordings ||\n\t\t\t\tfalse\n\t\t\tsThis.networkHeadersToRedact =\n\t\t\t\toptions.networkRecording?.networkHeadersToRedact?.map(\n\t\t\t\t\t(header) => header.toLowerCase(),\n\t\t\t\t) || []\n\t\t\tsThis.networkBodyKeysToRedact =\n\t\t\t\toptions.networkRecording?.networkBodyKeysToRedact?.map(\n\t\t\t\t\t(bodyKey) => bodyKey.toLowerCase(),\n\t\t\t\t) || []\n\t\t\tsThis.urlBlocklist =\n\t\t\t\toptions.networkRecording?.urlBlocklist?.map((url) =>\n\t\t\t\t\turl.toLowerCase(),\n\t\t\t\t) || []\n\t\t\tsThis.urlBlocklist = [\n\t\t\t\t...sThis.urlBlocklist,\n\t\t\t\t...DEFAULT_URL_BLOCKLIST,\n\t\t\t]\n\n\t\t\tsThis.requestResponseSanitizer =\n\t\t\t\toptions.networkRecording?.requestResponseSanitizer\n\n\t\t\tsThis.networkHeaderKeysToRecord =\n\t\t\t\toptions.networkRecording?.headerKeysToRecord\n\t\t\t// `headerKeysToRecord` override `networkHeadersToRedact`.\n\t\t\tif (sThis.networkHeaderKeysToRecord) {\n\t\t\t\tsThis.networkHeadersToRedact = []\n\t\t\t\tsThis.networkHeaderKeysToRecord =\n\t\t\t\t\tsThis.networkHeaderKeysToRecord.map((key) =>\n\t\t\t\t\t\tkey.toLocaleLowerCase(),\n\t\t\t\t\t)\n\t\t\t}\n\n\t\t\tsThis.networkBodyKeysToRecord =\n\t\t\t\toptions.networkRecording?.bodyKeysToRecord\n\t\t\t// `bodyKeysToRecord` override `networkBodyKeysToRedact`.\n\t\t\tif (sThis.networkBodyKeysToRecord) {\n\t\t\t\tsThis.networkBodyKeysToRedact = []\n\t\t\t\tsThis.networkBodyKeysToRecord =\n\t\t\t\t\tsThis.networkBodyKeysToRecord.map((key) =>\n\t\t\t\t\t\tkey.toLocaleLowerCase(),\n\t\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\t!sThis.disableNetworkRecording &&\n\t\t\tsThis.enableRecordingNetworkContents\n\t\t) {\n\t\t\tsThis.hasNetworkRecording = true\n\t\t\tsThis.listeners.push(\n\t\t\t\tNetworkListener({\n\t\t\t\t\txhrCallback: (requestResponsePair) => {\n\t\t\t\t\t\tsThis.xhrNetworkContents.push(requestResponsePair)\n\t\t\t\t\t},\n\t\t\t\t\tfetchCallback: (requestResponsePair) => {\n\t\t\t\t\t\tsThis.fetchNetworkContents.push(requestResponsePair)\n\t\t\t\t\t},\n\t\t\t\t\twebSocketRequestCallback: (event) => {\n\t\t\t\t\t\tif (sThis.webSocketNetworkContents) {\n\t\t\t\t\t\t\tsThis.webSocketNetworkContents.push(event)\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\twebSocketEventCallback: (event) => {\n\t\t\t\t\t\tsThis.webSocketEventContents.push(event)\n\t\t\t\t\t},\n\t\t\t\t\tdisableWebSocketRecording:\n\t\t\t\t\t\tsThis.disableRecordingWebSocketContents,\n\t\t\t\t\tbodyKeysToRedact: sThis.networkBodyKeysToRedact,\n\t\t\t\t\thighlightEndpoints: sThis.highlightEndpoints,\n\t\t\t\t\ttracingOrigins: sThis.tracingOrigins,\n\t\t\t\t\turlBlocklist: sThis.urlBlocklist,\n\t\t\t\t\tbodyKeysToRecord: sThis.networkBodyKeysToRecord,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t}\n\n\tstatic getRecordedNetworkResources(\n\t\tsThis: FirstLoadListeners,\n\t\trecordingStartTime: number,\n\t): Array<PerformanceResourceTiming | WebSocketRequest> {\n\t\tlet httpResources: Array<PerformanceResourceTiming> = []\n\t\tlet webSocketResources: Array<WebSocketRequest> = []\n\n\t\tif (!sThis.disableNetworkRecording) {\n\t\t\tconst documentTimeOrigin = window?.performance?.timeOrigin || 0\n\t\t\t// get all resources that don't include 'api.highlight.run'\n\t\t\thttpResources = performance.getEntriesByType(\n\t\t\t\t'resource',\n\t\t\t) as PerformanceResourceTiming[]\n\n\t\t\t// Subtract session start time from performance.timeOrigin\n\t\t\t// Subtract diff to the times to do the offsets\n\t\t\tconst offset = (recordingStartTime - documentTimeOrigin) * 2\n\n\t\t\thttpResources = httpResources\n\t\t\t\t.filter((r) => {\n\t\t\t\t\tif (r.responseEnd < sThis.lastNetworkRequestTimestamp) {\n\t\t\t\t\t\treturn false\n\t\t\t\t\t}\n\n\t\t\t\t\treturn shouldNetworkRequestBeRecorded(\n\t\t\t\t\t\tr.name,\n\t\t\t\t\t\tsThis.highlightEndpoints,\n\t\t\t\t\t\tsThis.tracingOrigins,\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t\t.map((resource) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...resource.toJSON(),\n\t\t\t\t\t\toffsetStartTime: resource.startTime - offset,\n\t\t\t\t\t\toffsetResponseEnd: resource.responseEnd - offset,\n\t\t\t\t\t\toffsetFetchStart: resource.fetchStart - offset,\n\t\t\t\t\t}\n\t\t\t\t})\n\n\t\t\tsThis.lastNetworkRequestTimestamp =\n\t\t\t\thttpResources.at(-1)?.responseEnd ||\n\t\t\t\tsThis.lastNetworkRequestTimestamp\n\n\t\t\tif (sThis.enableRecordingNetworkContents) {\n\t\t\t\tconst sanitizeOptions = {\n\t\t\t\t\theadersToRedact: sThis.networkHeadersToRedact,\n\t\t\t\t\theadersToRecord: sThis.networkHeaderKeysToRecord,\n\t\t\t\t\trequestResponseSanitizer: sThis.requestResponseSanitizer,\n\t\t\t\t}\n\n\t\t\t\thttpResources = matchPerformanceTimingsWithRequestResponsePair(\n\t\t\t\t\thttpResources,\n\t\t\t\t\tsThis.xhrNetworkContents,\n\t\t\t\t\t'xmlhttprequest',\n\t\t\t\t\tsanitizeOptions,\n\t\t\t\t)\n\t\t\t\thttpResources = matchPerformanceTimingsWithRequestResponsePair(\n\t\t\t\t\thttpResources,\n\t\t\t\t\tsThis.fetchNetworkContents,\n\t\t\t\t\t'fetch',\n\t\t\t\t\tsanitizeOptions,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\tif (!sThis.disableRecordingWebSocketContents) {\n\t\t\twebSocketResources = sThis.webSocketNetworkContents || []\n\t\t}\n\n\t\treturn [...httpResources, ...webSocketResources]\n\t}\n\n\tstatic getRecordedWebSocketEvents(\n\t\tsThis: FirstLoadListeners,\n\t): Array<WebSocketEvent> {\n\t\tlet webSocketEvents: Array<WebSocketEvent> = []\n\n\t\tif (\n\t\t\t!sThis.disableNetworkRecording &&\n\t\t\t!sThis.disableRecordingWebSocketContents\n\t\t) {\n\t\t\twebSocketEvents = sThis.webSocketEventContents\n\t\t}\n\n\t\treturn webSocketEvents\n\t}\n\n\tstatic clearRecordedNetworkResources(sThis: FirstLoadListeners): void {\n\t\tif (!sThis.disableNetworkRecording) {\n\t\t\tsThis.xhrNetworkContents = []\n\t\t\tsThis.fetchNetworkContents = []\n\t\t\tsThis.webSocketNetworkContents = []\n\t\t\tsThis.webSocketEventContents = []\n\t\t\tperformance.clearResourceTimings()\n\t\t}\n\t}\n}\n","import { getRecordSequentialIdPlugin } from '@highlight-run/rrweb-rrweb-plugin-sequential-id-record'\nimport { eventWithTime, listenerHandler } from '@highlight-run/rrweb-types'\nimport { print } from 'graphql'\nimport { GraphQLClient } from 'graphql-request'\nimport stringify from 'json-stringify-safe'\nimport {\n\taddCustomEvent as rrwebAddCustomEvent,\n\trecord,\n} from '@highlight-run/rrweb'\nimport {\n\tgetSdk,\n\tPushPayloadMutationVariables,\n\tPushSessionEventsDocument,\n\tPushSessionEventsMutationVariables,\n\tSdk,\n} from './graph/generated/operations'\nimport { FirstLoadListeners } from './listeners/first-load-listeners'\nimport { PathListener } from './listeners/path-listener'\nimport {\n\tAmplitudeIntegrationOptions,\n\tConsoleMethods,\n\tDebugOptions,\n\tMetricCategory,\n\tMetricName,\n\tMixpanelIntegrationOptions,\n\tNetworkRecordingOptions,\n\tSessionShortcutOptions,\n} from './types/client'\nimport {\n\tHighlightOptions,\n\tHighlightPublicInterface,\n\tIntegration,\n\tMetadata,\n\tMetric,\n\tPrivacySettingOption,\n\tRecordMetric,\n\tSamplingStrategy,\n\tSessionDetails,\n\tStartOptions,\n} from './types/types'\nimport {\n\tdetermineMaskInputOptions,\n\tdetermineTextPrivacySetting,\n} from './utils/privacy'\n\nimport {\n\tFIRST_SEND_FREQUENCY,\n\tHIGHLIGHT_URL,\n\tMAX_SESSION_LENGTH,\n\tSEND_FREQUENCY,\n\tSNAPSHOT_SETTINGS,\n\tVISIBILITY_DEBOUNCE_MS,\n} from './constants/sessions'\nimport { ReplayEventsInput } from './graph/generated/schemas'\nimport { ClickListener } from './listeners/click-listener/click-listener'\nimport { FocusListener } from './listeners/focus-listener/focus-listener'\nimport {\n\tJankListener,\n\tJankPayload,\n} from './listeners/jank-listener/jank-listener'\nimport { HighlightFetchWindow } from './listeners/network-listener/utils/fetch-listener'\nimport { RequestResponsePair } from './listeners/network-listener/utils/models'\nimport { sanitizeUrl } from './listeners/network-listener/utils/network-sanitizer'\nimport { PageVisibilityListener } from './listeners/page-visibility-listener'\nimport {\n\tPerformanceListener,\n\tPerformancePayload,\n} from './listeners/performance-listener/performance-listener'\nimport { SegmentIntegrationListener } from './listeners/segment-integration-listener'\nimport SessionShortcutListener from './listeners/session-shortcut/session-shortcut-listener'\nimport {\n\tViewportResizeListener,\n\ttype ViewportResizeListenerArgs,\n} from './listeners/viewport-resize-listener'\nimport { WebVitalsListener } from './listeners/web-vitals-listener/web-vitals-listener'\nimport {\n\tNetworkPerformanceListener,\n\tNetworkPerformancePayload,\n} from './listeners/network-listener/performance-listener'\nimport { Logger } from './logger'\nimport { getMeter, getTracer, setupBrowserTracing, shutdown } from './otel'\nimport {\n\tHighlightIframeMessage,\n\tHighlightIframeReponse,\n\tIFRAME_PARENT_READY,\n\tIFRAME_PARENT_RESPONSE,\n} from './types/iframe'\nimport {\n\tConsoleMessage,\n\tErrorMessage,\n\tErrorMessageType,\n\tSource,\n} from './types/shared-types'\nimport { getSimpleSelector } from './utils/dom'\nimport { getGraphQLRequestWrapper } from './utils/graph'\nimport { clearHighlightLogs, getHighlightLogs } from './utils/highlight-logging'\nimport { getPerformanceMethods } from './utils/performance/performance'\nimport { GenerateSecureID } from './utils/secure-id'\nimport {\n\tgetPreviousSessionData,\n\tSessionData,\n\tsetSessionData,\n\tsetSessionSecureID,\n} from './utils/sessionStorage/highlightSession'\nimport { SESSION_STORAGE_KEYS } from './utils/sessionStorage/sessionStorageKeys'\nimport {\n\tgetItem,\n\tLocalStorageKeys,\n\tremoveItem,\n\tsetCookieDomain,\n\tsetCookieWriteEnabled,\n\tsetItem,\n\tsetStorageMode,\n} from './utils/storage'\nimport { getDefaultDataURLOptions, isMetricSafeNumber } from './utils/utils'\nimport { metricInstrumentOptions } from './utils/metricUnits'\nimport { type HighlightClientRequestWorker } from './workers/highlight-client-worker'\nimport { payloadToBase64 } from './utils/payload'\nimport HighlightClientWorker from './workers/highlight-client-worker?worker&inline'\nimport { MessageType, PropertyType } from './workers/types'\nimport { parseError } from './utils/errors'\nimport {\n\tAttributes,\n\tCounter,\n\tGauge,\n\tHistogram,\n\tUpDownCounter,\n} from '@opentelemetry/api'\nimport { IntegrationClient } from '../integrations'\nimport { LaunchDarklyIntegration, LDClient } from '../integrations/launchdarkly'\nimport { createLog, defaultLogOptions } from './listeners/console-listener'\nimport { CustomSampler } from './otel/sampling/CustomSampler'\nimport { sdkLog, setSdkDebugLogging } from './utils/sdkLogger'\nimport randomUuidV4 from './utils/randomUuidV4'\nimport { LDContext } from '@launchdarkly/js-client-sdk'\nimport { MaskInputOptions } from './types/record'\nimport { ProductAnalyticsEvents } from './types/observe'\n\nexport const HighlightWarning = (context: string, msg: any) => {\n\tsdkLog('warn', `Highlight Warning: (${context}): `, { output: msg })\n}\n\nexport type HighlightClassOptions = {\n\torganizationID: number | string\n\tdebug?: boolean | DebugOptions\n\tbackendUrl?: string\n\ttracingOrigins?: boolean | (string | RegExp)[]\n\tdisableNetworkRecording?: boolean\n\tnetworkRecording?: boolean | NetworkRecordingOptions\n\tdisableBackgroundRecording?: boolean\n\tdisableConsoleRecording?: boolean\n\tdisableSessionRecording?: boolean\n\treportConsoleErrors?: boolean\n\tconsoleMethodsToRecord?: ConsoleMethods[]\n\trecordLaunchDarklySdkLogs?: boolean\n\tprivacySetting?: PrivacySettingOption\n\tmaskAllInputs?: boolean\n\tmaskInputOptions?: MaskInputOptions\n\tmaskPiiText?: boolean\n\tmaskTextClass?: string | RegExp\n\tmaskTextSelector?: string\n\tblockClass?: string | RegExp\n\tblockSelector?: string\n\tignoreClass?: string\n\tignoreSelector?: string\n\tenableSegmentIntegration?: boolean\n\tenableCanvasRecording?: boolean\n\tenablePerformanceRecording?: boolean\n\tenablePromisePatch?: boolean\n\tsamplingStrategy?: SamplingStrategy\n\tinlineImages?: boolean\n\tinlineVideos?: boolean\n\tinlineStylesheet?: boolean\n\tstyleSheetResyncInterval?: number\n\trecordCrossOriginIframe?: boolean\n\tfirstloadVersion?: string\n\tenvironment?: 'development' | 'production' | 'staging' | string\n\tappVersion?: string\n\tserviceName?: string\n\tsessionKey?: string\n\tsessionShortcut?: SessionShortcutOptions\n\tsessionSecureID: string // Introduced in firstLoad 3.0.1\n\tstorageMode?: 'sessionStorage' | 'localStorage'\n\tsessionCookie?: boolean\n\tsessionCookieDomain?: string\n\tsendMode?: 'webworker' | 'local'\n\totlpEndpoint?: HighlightOptions['otlpEndpoint']\n\totel?: HighlightOptions['otel']\n\tproductAnalytics?: boolean | ProductAnalyticsEvents\n\tcontextFriendlyName?: (context: LDContext) => string | undefined\n}\n\n/**\n * Subset of HighlightClassOptions that is stored with the session. These fields are stored for debugging purposes.\n */\ntype HighlightClassOptionsInternal = Omit<\n\tHighlightClassOptions,\n\t'firstloadVersion'\n>\n\nexport class Highlight {\n\toptions!: HighlightClassOptions\n\t/** Determines if the client is running on a Highlight property (e.g. frontend). */\n\tisRunningOnHighlight!: boolean\n\t/** Verbose project ID that is exposed to users. Legacy users may still be using ints. */\n\torganizationID!: string\n\t// ECMAScript-private (#) so the internal GraphQL SDK type — which\n\t// references graphql-request / graphql — does not leak into the published\n\t// declaration file and break consumer type-checking.\n\t#graphqlSDK!: Sdk\n\tevents!: eventWithTime[]\n\tsessionData!: SessionData\n\tready!: boolean\n\tmanualStopped!: boolean\n\tstate!: 'NotRecording' | 'Recording'\n\tlogger!: Logger\n\tenableSegmentIntegration!: boolean\n\tprivacySetting!: PrivacySettingOption\n\tenableCanvasRecording!: boolean\n\tenablePerformanceRecording!: boolean\n\tsamplingStrategy!: SamplingStrategy\n\tinlineImages!: boolean\n\tinlineVideos!: boolean\n\tinlineStylesheet!: boolean\n\tstyleSheetResyncInterval!: number\n\tdebugOptions!: DebugOptions\n\tlisteners!: listenerHandler[]\n\tfirstloadVersion!: string\n\tenvironment!: string\n\tsessionShortcut!: SessionShortcutOptions\n\t/** The end-user's app version. This isn't Highlight's version. */\n\tappVersion!: string | undefined\n\tserviceName!: string\n\t_worker!: HighlightClientRequestWorker\n\t_optionsInternal!: HighlightClassOptionsInternal\n\t_backendUrl!: string\n\t_recordingStartTime!: number\n\t_isOnLocalHost!: boolean\n\t_onToggleFeedbackFormVisibility!: () => void\n\t_firstLoadListeners!: FirstLoadListeners\n\t_isCrossOriginIframe!: boolean\n\t_eventBytesSinceSnapshot!: number\n\t_lastSnapshotTime!: number\n\t_lastVisibilityChangeTime!: number\n\tpushPayloadTimerId!: ReturnType<typeof setTimeout> | undefined\n\thasSessionUnloaded!: boolean\n\thasPushedData!: boolean\n\treloaded!: boolean\n\t_hasPreviouslyInitialized!: boolean\n\t_recordStop!: listenerHandler | undefined\n\t_gauges: Map<string, Gauge> = new Map<string, Gauge>()\n\t_counters: Map<string, Counter> = new Map<string, Counter>()\n\t_histograms: Map<string, Histogram> = new Map<string, Histogram>()\n\t_up_down_counters: Map<string, UpDownCounter> = new Map<\n\t\tstring,\n\t\tUpDownCounter\n\t>()\n\t_integrations: IntegrationClient[] = []\n\n\tstatic create(options: HighlightClassOptions): Highlight {\n\t\treturn new Highlight(options)\n\t}\n\n\tconstructor(\n\t\toptions: HighlightClassOptions,\n\t\tfirstLoadListeners?: FirstLoadListeners,\n\t) {\n\t\tif (!options.sessionSecureID) {\n\t\t\t// Firstload versions before 3.0.1 did not have this property\n\t\t\toptions.sessionSecureID = GenerateSecureID()\n\t\t}\n\t\tthis.options = options\n\t\tif (typeof this.options?.debug === 'boolean') {\n\t\t\tthis.debugOptions = this.options.debug\n\t\t\t\t? { clientInteractions: true }\n\t\t\t\t: {}\n\t\t} else {\n\t\t\tthis.debugOptions = this.options?.debug ?? {}\n\t\t}\n\t\tthis.logger = new Logger(this.debugOptions.clientInteractions)\n\t\tif (options.debug) {\n\t\t\tsetSdkDebugLogging(true)\n\t\t}\n\t\tif (options.storageMode) {\n\t\t\tthis.logger.log(\n\t\t\t\t`initializing in ${options.storageMode} session mode`,\n\t\t\t)\n\t\t\tsetStorageMode(options.storageMode)\n\t\t}\n\t\tsetCookieWriteEnabled(!!options?.sessionCookie)\n\t\t// Only override when set, so options without a domain (e.g. a second\n\t\t// plugin) keep a domain configured earlier.\n\t\tif (options?.sessionCookieDomain !== undefined) {\n\t\t\tsetCookieDomain(options.sessionCookieDomain)\n\t\t}\n\n\t\tthis._worker =\n\t\t\tnew HighlightClientWorker() as HighlightClientRequestWorker\n\t\tthis._worker.onmessage = (e) => {\n\t\t\tif (e.data.response?.type === MessageType.AsyncEvents) {\n\t\t\t\tthis._eventBytesSinceSnapshot += e.data.response.eventsSize\n\t\t\t\tthis.logger.log(\n\t\t\t\t\t`Web worker sent payloadID ${e.data.response.id} size ${\n\t\t\t\t\t\te.data.response.eventsSize\n\t\t\t\t\t} bytes, compression ratio ${\n\t\t\t\t\t\te.data.response.eventsSize /\n\t\t\t\t\t\te.data.response.compressedSize\n\t\t\t\t\t}.\n Total since snapshot: ${(\n\t\t\t\t\tthis._eventBytesSinceSnapshot / 1000000\n\t\t\t\t).toFixed(1)}MB`,\n\t\t\t\t)\n\t\t\t} else if (e.data.response?.type === MessageType.CustomEvent) {\n\t\t\t\tthis.addCustomEvent(\n\t\t\t\t\te.data.response.tag,\n\t\t\t\t\te.data.response.payload,\n\t\t\t\t)\n\t\t\t} else if (e.data.response?.type === MessageType.Stop) {\n\t\t\t\tHighlightWarning(\n\t\t\t\t\t'Stopping recording due to worker failure',\n\t\t\t\t\te.data.response,\n\t\t\t\t)\n\t\t\t\tthis.stopRecording(false)\n\t\t\t}\n\t\t}\n\n\t\tlet storedSessionData = getPreviousSessionData()\n\t\tthis.reloaded = false\n\t\t// only fetch session data from local storage on the first `initialize` call\n\t\tif (\n\t\t\t!this.sessionData?.sessionSecureID &&\n\t\t\tstoredSessionData?.sessionSecureID\n\t\t) {\n\t\t\tthis.sessionData = storedSessionData\n\t\t\tthis.options.sessionSecureID = storedSessionData.sessionSecureID\n\t\t\tthis.reloaded = true\n\t\t\tthis.logger.log(\n\t\t\t\t`Tab reloaded, continuing previous session: ${this.sessionData.sessionSecureID}`,\n\t\t\t)\n\t\t} else {\n\t\t\t// new session. we should clear any session storage data\n\t\t\tfor (const storageKeyName of Object.values(SESSION_STORAGE_KEYS)) {\n\t\t\t\tremoveItem(storageKeyName)\n\t\t\t}\n\t\t\tthis.sessionData = {\n\t\t\t\tsessionSecureID: this.options.sessionSecureID,\n\t\t\t\tprojectID: 0,\n\t\t\t\tsessionStartTime: Date.now(),\n\t\t\t}\n\t\t}\n\t\t// these should not be in initMembers since we want them to\n\t\t// persist across session resets\n\t\tthis._hasPreviouslyInitialized = false\n\t\t// Old firstLoad versions (Feb 2022) do not pass in FirstLoadListeners, so we have to fallback to creating it\n\t\tthis._firstLoadListeners =\n\t\t\tfirstLoadListeners || new FirstLoadListeners(this.options)\n\t\ttry {\n\t\t\t// throws if parent is cross-origin\n\t\t\tif (window.parent.document) {\n\t\t\t\tthis._isCrossOriginIframe = false\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// if recordCrossOriginIframe is set to false, operate as if highlight is only recording the iframe as a dedicated web app.\n\t\t\t// this is useful if you are running highlight on your app that is used in a cross-origin iframe with no access to the parent page.\n\t\t\tthis._isCrossOriginIframe =\n\t\t\t\tthis.options.recordCrossOriginIframe ?? true\n\t\t}\n\t\tthis._initMembers(this.options)\n\t}\n\n\t// Start a new session\n\tasync _reset({\n\t\tforceNew,\n\t\tsessionKey,\n\t}: {\n\t\tforceNew?: boolean\n\t\tsessionKey?: string\n\t}) {\n\t\tif (this.pushPayloadTimerId) {\n\t\t\tclearTimeout(this.pushPayloadTimerId)\n\t\t\tthis.pushPayloadTimerId = undefined\n\t\t}\n\n\t\tlet user_identifier, user_object\n\t\tif (!forceNew) {\n\t\t\ttry {\n\t\t\t\tuser_identifier = getItem(SESSION_STORAGE_KEYS.USER_IDENTIFIER)\n\t\t\t\tconst user_object_string = getItem(\n\t\t\t\t\tSESSION_STORAGE_KEYS.USER_OBJECT,\n\t\t\t\t)\n\t\t\t\tif (user_object_string) {\n\t\t\t\t\tuser_object = JSON.parse(user_object_string)\n\t\t\t\t}\n\t\t\t} catch (err) {}\n\t\t}\n\t\tfor (const storageKeyName of Object.values(SESSION_STORAGE_KEYS)) {\n\t\t\tremoveItem(storageKeyName)\n\t\t}\n\n\t\t// no need to set the sessionStorage value here since firstload won't call\n\t\t// init again after a reset, and `this.initialize()` will set sessionStorage\n\t\tthis.sessionData.sessionSecureID = sessionKey\n\t\t\t? GenerateSecureID(`${this.organizationID}-${sessionKey}`)\n\t\t\t: GenerateSecureID()\n\t\tthis.sessionData.sessionKey = sessionKey\n\t\tthis.sessionData.sessionStartTime = Date.now()\n\t\tthis.options.sessionSecureID = this.sessionData.sessionSecureID\n\t\tthis.stopRecording()\n\t\tthis._firstLoadListeners.stopListening()\n\t\tthis._firstLoadListeners = new FirstLoadListeners(this.options)\n\t\tawait this.initialize()\n\t\tif (user_identifier && user_object) {\n\t\t\tthis.identify(user_identifier, user_object)\n\t\t}\n\t}\n\n\t_initMembers(options: HighlightClassOptions) {\n\t\tthis.sessionShortcut = false\n\t\tthis._recordingStartTime = 0\n\t\tthis._isOnLocalHost =\n\t\t\twindow.location.hostname === 'localhost' ||\n\t\t\twindow.location.hostname === '127.0.0.1' ||\n\t\t\twindow.location.hostname === ''\n\n\t\tthis.ready = false\n\t\tthis.state = 'NotRecording'\n\t\tthis.manualStopped = false\n\t\tthis.enableSegmentIntegration = !!options.enableSegmentIntegration\n\t\tthis.privacySetting = options.privacySetting ?? 'default'\n\t\tthis.enableCanvasRecording = options.enableCanvasRecording ?? false\n\t\tthis.enablePerformanceRecording =\n\t\t\toptions.enablePerformanceRecording ?? true\n\t\t// default to inlining stylesheets/images locally to help with recording accuracy\n\t\tthis.inlineImages = options.inlineImages ?? this._isOnLocalHost\n\t\tthis.inlineVideos = options.inlineVideos ?? this._isOnLocalHost\n\t\tthis.inlineStylesheet = options.inlineStylesheet ?? this._isOnLocalHost\n\t\tthis.styleSheetResyncInterval = options.styleSheetResyncInterval ?? 2000\n\t\tthis.samplingStrategy = {\n\t\t\tcanvasFactor: 0.5,\n\t\t\tcanvasMaxSnapshotDimension: 360,\n\t\t\tcanvasClearWebGLBuffer: true,\n\t\t\tdataUrlOptions: getDefaultDataURLOptions(),\n\t\t\t...(options.samplingStrategy ?? {\n\t\t\t\tcanvas: 2,\n\t\t\t}),\n\t\t}\n\t\tthis._backendUrl = options?.backendUrl ?? 'https://pub.highlight.io'\n\n\t\t// If _backendUrl is a relative URL, convert it to an absolute URL\n\t\t// so that it's usable from a web worker.\n\t\tif (this._backendUrl[0] === '/') {\n\t\t\tthis._backendUrl = new URL(this._backendUrl, document.baseURI).href\n\t\t}\n\n\t\tconst client = new GraphQLClient(`${this._backendUrl}`, {\n\t\t\theaders: {},\n\t\t})\n\t\tthis.#graphqlSDK = getSdk(client, getGraphQLRequestWrapper())\n\t\tthis.environment = options.environment ?? 'production'\n\t\tthis.appVersion = options.appVersion\n\t\tthis.serviceName = options.serviceName ?? ''\n\n\t\tif (typeof options.organizationID === 'string') {\n\t\t\tthis.organizationID = options.organizationID\n\t\t} else {\n\t\t\tthis.organizationID = options.organizationID.toString()\n\t\t}\n\t\tthis.isRunningOnHighlight =\n\t\t\tthis.organizationID === '1' || this.organizationID === '1jdkoe52'\n\t\tthis.firstloadVersion = options.firstloadVersion || 'unknown'\n\t\tthis.sessionShortcut = options.sessionShortcut || false\n\t\tthis._onToggleFeedbackFormVisibility = () => {}\n\t\t// We only want to store a subset of the options for debugging purposes. Firstload version is stored as another field so we don't need to store it here.\n\t\tconst { firstloadVersion: _, ...optionsInternal } = options\n\t\tthis._optionsInternal = optionsInternal\n\t\tthis.listeners = []\n\n\t\tthis.events = []\n\t\tthis.hasSessionUnloaded = false\n\t\tthis.hasPushedData = false\n\n\t\tif (window.Intercom) {\n\t\t\twindow.Intercom('onShow', () => {\n\t\t\t\twindow.Intercom('update', {\n\t\t\t\t\thighlightSessionURL:\n\t\t\t\t\t\tthis.getCurrentSessionURLWithTimestamp(),\n\t\t\t\t})\n\t\t\t\tthis.addProperties({ event: 'Intercom onShow' })\n\t\t\t})\n\t\t}\n\n\t\tthis._eventBytesSinceSnapshot = 0\n\t\tthis._lastSnapshotTime = new Date().getTime()\n\t\tthis._lastVisibilityChangeTime = new Date().getTime()\n\t}\n\n\tidentify(user_identifier: string, user_object = {}, source?: Source) {\n\t\tif (!user_identifier || user_identifier === '') {\n\t\t\tconsole.warn(\n\t\t\t\t`Highlight's identify() call was passed an empty identifier.`,\n\t\t\t\t{ user_identifier, user_object },\n\t\t\t)\n\t\t\treturn\n\t\t}\n\t\tthis.sessionData.userIdentifier = user_identifier.toString()\n\t\tthis.sessionData.userObject = user_object\n\t\tsetItem(\n\t\t\tSESSION_STORAGE_KEYS.USER_IDENTIFIER,\n\t\t\tuser_identifier.toString(),\n\t\t)\n\t\tsetItem(SESSION_STORAGE_KEYS.USER_OBJECT, JSON.stringify(user_object))\n\t\tthis._worker.postMessage({\n\t\t\tmessage: {\n\t\t\t\ttype: MessageType.Identify,\n\t\t\t\tuserIdentifier: user_identifier,\n\t\t\t\tuserObject: user_object,\n\t\t\t\tsource,\n\t\t\t},\n\t\t})\n\t\tfor (const integration of this._integrations) {\n\t\t\tintegration.identify(\n\t\t\t\tthis.sessionData.sessionSecureID,\n\t\t\t\tuser_identifier,\n\t\t\t\tuser_object,\n\t\t\t\tsource,\n\t\t\t)\n\t\t}\n\t}\n\n\tlog(message: any, level: string, metadata?: Attributes) {\n\t\tthis._firstLoadListeners.messages.push(\n\t\t\tcreateLog(level, defaultLogOptions, message, metadata),\n\t\t)\n\t}\n\n\tpushCustomError(message: string, payload?: string) {\n\t\treturn this.consumeCustomError(new Error(message), undefined, payload)\n\t}\n\n\tconsumeCustomError(error: Error, message?: string, payload?: string) {\n\t\tlet obj = {}\n\t\tif (payload) {\n\t\t\ttry {\n\t\t\t\tobj = { ...JSON.parse(payload), ...obj }\n\t\t\t} catch (e) {}\n\t\t}\n\t\treturn this.consumeError(error, {\n\t\t\tmessage,\n\t\t\tpayload: obj,\n\t\t})\n\t}\n\n\tconsumeError(\n\t\terror: Error,\n\t\t{\n\t\t\tmessage,\n\t\t\tpayload,\n\t\t\tsource,\n\t\t\ttype,\n\t\t}: {\n\t\t\tmessage?: string\n\t\t\tpayload?: object\n\t\t\tsource?: string\n\t\t\ttype?: ErrorMessageType\n\t\t},\n\t) {\n\t\tif (error.cause) {\n\t\t\tpayload = { ...payload, 'exception.cause': error.cause }\n\t\t}\n\t\tlet event = message ? message + ':' + error.message : error.message\n\t\tif (type === 'React.ErrorBoundary') {\n\t\t\tevent = 'ErrorBoundary: ' + event\n\t\t}\n\t\tconst res = parseError(error)\n\t\tconst errorMsg: ErrorMessage = {\n\t\t\tevent,\n\t\t\ttype: type ?? 'custom',\n\t\t\turl: window.location.href,\n\t\t\tsource: source ?? '',\n\t\t\tlineNumber: res[0]?.lineNumber ? res[0]?.lineNumber : 0,\n\t\t\tcolumnNumber: res[0]?.columnNumber ? res[0]?.columnNumber : 0,\n\t\t\tstackTrace: res,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tpayload: JSON.stringify(payload),\n\t\t\tid: randomUuidV4(),\n\t\t}\n\t\tthis._firstLoadListeners.errors.push(errorMsg)\n\t\tfor (const integration of this._integrations) {\n\t\t\tintegration.error(this.sessionData.sessionSecureID, errorMsg)\n\t\t}\n\t}\n\n\taddProperties(properties_obj = {}, typeArg?: PropertyType) {\n\t\t// Remove any properties which throw on structuredClone\n\t\t// (structuredClone is used when posting messages to the worker)\n\t\tconst obj = { ...properties_obj } as any\n\t\tObject.entries(obj).forEach(([key, val]) => {\n\t\t\ttry {\n\t\t\t\tstructuredClone(val)\n\t\t\t} catch {\n\t\t\t\tdelete obj[key]\n\t\t\t}\n\t\t})\n\t\tthis._worker.postMessage({\n\t\t\tmessage: {\n\t\t\t\ttype: MessageType.Properties,\n\t\t\t\tpropertiesObject: obj,\n\t\t\t\tpropertyType: typeArg,\n\t\t\t},\n\t\t})\n\t\tfor (const integration of this._integrations) {\n\t\t\tintegration.track(this.sessionData.sessionSecureID, {\n\t\t\t\tsessionSecureID: this.sessionData.sessionSecureID,\n\t\t\t\tpropertyType: typeArg,\n\t\t\t\t...properties_obj,\n\t\t\t})\n\t\t}\n\t}\n\n\tasync initialize(options?: StartOptions): Promise<undefined> {\n\t\tif (\n\t\t\t(navigator?.webdriver && !window.Cypress) ||\n\t\t\tnavigator?.userAgent?.includes('Googlebot') ||\n\t\t\tnavigator?.userAgent?.includes('AdsBot')\n\t\t) {\n\t\t\tthis._firstLoadListeners?.stopListening()\n\t\t\treturn\n\t\t}\n\n\t\ttry {\n\t\t\tif (options?.forceNew) {\n\t\t\t\tawait this._reset(options)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\toptions?.sessionKey &&\n\t\t\t\toptions?.sessionKey !== this.sessionData.sessionKey\n\t\t\t) {\n\t\t\t\tawait this._reset({ ...options, forceNew: true })\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst sampler = new CustomSampler()\n\n\t\t\tsetupBrowserTracing(\n\t\t\t\t{\n\t\t\t\t\tbackendUrl:\n\t\t\t\t\t\tthis.options?.backendUrl ?? 'https://pub.highlight.io',\n\t\t\t\t\totlpEndpoint:\n\t\t\t\t\t\tthis.options?.otlpEndpoint ??\n\t\t\t\t\t\t'https://otel.highlight.io',\n\t\t\t\t\tprojectId: this.options?.organizationID,\n\t\t\t\t\tsessionSecureId: this.options?.sessionSecureID,\n\t\t\t\t\tenvironment: this.options?.environment ?? 'production',\n\t\t\t\t\tnetworkRecordingOptions:\n\t\t\t\t\t\ttypeof this.options?.networkRecording === 'object'\n\t\t\t\t\t\t\t? this.options.networkRecording\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\ttracingOrigins: this.options?.tracingOrigins,\n\t\t\t\t\tserviceName:\n\t\t\t\t\t\tthis.options?.serviceName ?? 'highlight-browser',\n\t\t\t\t\tinstrumentations: this.options?.otel?.instrumentations,\n\t\t\t\t\tgetIntegrations: () => [...this._integrations],\n\t\t\t\t\tproductAnalyticsEvents: this._productAnalyticsEvents(),\n\t\t\t\t},\n\t\t\t\tsampler,\n\t\t\t)\n\t\t\t// reset metrics to connect them to the new meter\n\t\t\tthis._gauges.clear()\n\t\t\tthis._counters.clear()\n\t\t\tthis._histograms.clear()\n\t\t\tthis._up_down_counters.clear()\n\n\t\t\tthis.logger.log(\n\t\t\t\t`Initializing...`,\n\t\t\t\toptions,\n\t\t\t\tthis.sessionData,\n\t\t\t\tthis.options,\n\t\t\t)\n\n\t\t\tthis.sessionData =\n\t\t\t\tgetPreviousSessionData(this.sessionData.sessionSecureID) ??\n\t\t\t\tthis.sessionData\n\t\t\tif (!this.sessionData?.sessionStartTime) {\n\t\t\t\tthis._recordingStartTime = new Date().getTime()\n\t\t\t\tthis.sessionData.sessionStartTime = this._recordingStartTime\n\t\t\t} else {\n\t\t\t\tthis._recordingStartTime = this.sessionData?.sessionStartTime\n\t\t\t}\n\t\t\t// To handle the 'Duplicate Tab' function, remove id from storage until page unload\n\t\t\tsetSessionSecureID('')\n\t\t\tsetSessionData(this.sessionData)\n\n\t\t\tlet clientID = getItem(LocalStorageKeys['CLIENT_ID'])\n\n\t\t\tif (!clientID) {\n\t\t\t\tclientID = GenerateSecureID()\n\t\t\t\tsetItem(LocalStorageKeys['CLIENT_ID'], clientID)\n\t\t\t}\n\n\t\t\t// Duplicate of logic inside FirstLoadListeners.setupNetworkListener,\n\t\t\t// needed for initializeSession\n\t\t\tlet enableNetworkRecording\n\t\t\tif (this.options.disableSessionRecording) {\n\t\t\t\tenableNetworkRecording = false\n\t\t\t} else if (this.options.disableNetworkRecording !== undefined) {\n\t\t\t\tenableNetworkRecording = false\n\t\t\t} else if (typeof this.options.networkRecording === 'boolean') {\n\t\t\t\tenableNetworkRecording = false\n\t\t\t} else {\n\t\t\t\tenableNetworkRecording =\n\t\t\t\t\tthis.options.networkRecording?.recordHeadersAndBody || false\n\t\t\t}\n\n\t\t\tlet destinationDomains: string[] = []\n\t\t\tif (\n\t\t\t\ttypeof this.options.networkRecording === 'object' &&\n\t\t\t\tthis.options.networkRecording.destinationDomains?.length\n\t\t\t) {\n\t\t\t\tdestinationDomains =\n\t\t\t\t\tthis.options.networkRecording.destinationDomains\n\t\t\t}\n\t\t\tif (this._isCrossOriginIframe) {\n\t\t\t\t// wait for 'cross-origin iframe ready' message\n\t\t\t\tawait this._setupCrossOriginIframe()\n\t\t\t} else {\n\t\t\t\tconst gr = await this.#graphqlSDK.initializeSession({\n\t\t\t\t\torganization_verbose_id: this.organizationID,\n\t\t\t\t\tenable_strict_privacy: this.privacySetting === 'strict',\n\t\t\t\t\tprivacy_setting: this.privacySetting,\n\t\t\t\t\tenable_recording_network_contents: enableNetworkRecording,\n\t\t\t\t\tclientVersion: this.firstloadVersion,\n\t\t\t\t\tfirstloadVersion: this.firstloadVersion,\n\t\t\t\t\tclientConfig: JSON.stringify(this._optionsInternal),\n\t\t\t\t\tenvironment: this.environment,\n\t\t\t\t\tid: clientID,\n\t\t\t\t\tappVersion: this.appVersion,\n\t\t\t\t\tserviceName: this.serviceName,\n\t\t\t\t\tsession_secure_id: this.sessionData.sessionSecureID,\n\t\t\t\t\tsession_key: this.sessionData.sessionKey,\n\t\t\t\t\tclient_id: clientID,\n\t\t\t\t\tnetwork_recording_domains: destinationDomains,\n\t\t\t\t\tdisable_session_recording:\n\t\t\t\t\t\tthis.options.disableSessionRecording,\n\t\t\t\t})\n\t\t\t\tif (\n\t\t\t\t\tgr.initializeSession.secure_id !==\n\t\t\t\t\tthis.sessionData.sessionSecureID\n\t\t\t\t) {\n\t\t\t\t\tthis.logger.log(\n\t\t\t\t\t\t`Unexpected secure id returned by initializeSession: ${gr.initializeSession.secure_id}, ` +\n\t\t\t\t\t\t\t`expected ${this.sessionData.sessionSecureID}`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tthis.sessionData.sessionSecureID =\n\t\t\t\t\tgr.initializeSession.secure_id\n\t\t\t\tthis.sessionData.projectID = parseInt(\n\t\t\t\t\tgr?.initializeSession?.project_id || '0',\n\t\t\t\t)\n\n\t\t\t\tsampler.setConfig(gr.initializeSession.sampling)\n\n\t\t\t\tif (\n\t\t\t\t\t!this.sessionData.projectID ||\n\t\t\t\t\t!this.sessionData.sessionSecureID\n\t\t\t\t) {\n\t\t\t\t\tsdkLog(\n\t\t\t\t\t\t'error',\n\t\t\t\t\t\t'Failed to initialize Highlight; an error occurred on our end.',\n\t\t\t\t\t\tthis.sessionData,\n\t\t\t\t\t)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.logger.log(\n\t\t\t\t`Loaded Highlight\nRemote: ${this._backendUrl}\nProject ID: ${this.sessionData.projectID}\nSessionSecureID: ${this.sessionData.sessionSecureID}`,\n\t\t\t)\n\t\t\tthis.options.sessionSecureID = this.sessionData.sessionSecureID\n\t\t\tthis._worker.postMessage({\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: MessageType.Initialize,\n\t\t\t\t\tsessionSecureID: this.sessionData.sessionSecureID,\n\t\t\t\t\tbackend: this._backendUrl,\n\t\t\t\t\tdebug: !!this.debugOptions.clientInteractions,\n\t\t\t\t\trecordingStartTime: this._recordingStartTime,\n\t\t\t\t},\n\t\t\t})\n\t\t\tfor (const integration of this._integrations) {\n\t\t\t\tintegration.init(this.sessionData.sessionSecureID)\n\t\t\t}\n\n\t\t\tif (this.sessionData.userIdentifier) {\n\t\t\t\tthis.identify(\n\t\t\t\t\tthis.sessionData.userIdentifier,\n\t\t\t\t\tthis.sessionData.userObject,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tif (!this._firstLoadListeners.isListening()) {\n\t\t\t\tthis._firstLoadListeners.startListening()\n\t\t\t} else if (!this._firstLoadListeners.hasNetworkRecording) {\n\t\t\t\t// for firstload versions < 3.0. even if they are listening, add network listeners\n\t\t\t\tFirstLoadListeners.setupNetworkListener(\n\t\t\t\t\tthis._firstLoadListeners,\n\t\t\t\t\tthis.options,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tif (this.pushPayloadTimerId) {\n\t\t\t\tclearTimeout(this.pushPayloadTimerId)\n\t\t\t\tthis.pushPayloadTimerId = undefined\n\t\t\t}\n\t\t\tif (!this._isCrossOriginIframe) {\n\t\t\t\tthis.pushPayloadTimerId = setTimeout(() => {\n\t\t\t\t\tthis._save()\n\t\t\t\t}, FIRST_SEND_FREQUENCY)\n\t\t\t}\n\n\t\t\t// if disabled, do not record session events / rrweb events.\n\t\t\t// we still use firstload listeners to record frontend js console logs and errors.\n\t\t\tif (this.options.disableSessionRecording) {\n\t\t\t\tthis.logger.log(\n\t\t\t\t\t`Highlight is NOT RECORDING a session replay per H.init setting.`,\n\t\t\t\t)\n\t\t\t\tthis.ready = true\n\t\t\t\tthis.state = 'Recording'\n\t\t\t\tthis.manualStopped = false\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst { getDeviceDetails } = getPerformanceMethods()\n\t\t\tif (getDeviceDetails) {\n\t\t\t\tthis.recordGauge({\n\t\t\t\t\tname: MetricName.DeviceMemory,\n\t\t\t\t\tvalue: getDeviceDetails().deviceMemory,\n\t\t\t\t\tcategory: MetricCategory.Device,\n\t\t\t\t\tgroup: window.location.href,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tconst emit = (\n\t\t\t\tevent: eventWithTime,\n\t\t\t\tisCheckout?: boolean | undefined,\n\t\t\t) => {\n\t\t\t\tif (isCheckout) {\n\t\t\t\t\tthis.logger.log('received isCheckout emit', { event })\n\t\t\t\t}\n\t\t\t\tthis.events.push(event)\n\t\t\t}\n\t\t\temit.bind(this)\n\n\t\t\tconst alreadyRecording = !!this._recordStop\n\t\t\t// if we were already recording, stop recording to reset rrweb state (eg. reset _sid)\n\t\t\tif (this._recordStop) {\n\t\t\t\tthis._recordStop()\n\t\t\t\tthis._recordStop = undefined\n\t\t\t}\n\n\t\t\tconst [maskAllInputs, maskInputOptions] = determineMaskInputOptions(\n\t\t\t\tthis.privacySetting,\n\t\t\t\tthis.options.maskAllInputs,\n\t\t\t\tthis.options.maskInputOptions,\n\t\t\t)\n\n\t\t\tthis._recordStop = record({\n\t\t\t\tignoreClass: this.options.ignoreClass ?? 'highlight-ignore',\n\t\t\t\tignoreSelector: this.options.ignoreSelector,\n\t\t\t\tblockClass: this.options.blockClass ?? 'highlight-block',\n\t\t\t\tblockSelector: this.options.blockSelector,\n\t\t\t\temit,\n\t\t\t\trecordCrossOriginIframes: this.options.recordCrossOriginIframe,\n\t\t\t\tprivacySetting: determineTextPrivacySetting(\n\t\t\t\t\tthis.privacySetting,\n\t\t\t\t\tthis.options.maskPiiText,\n\t\t\t\t),\n\t\t\t\tmaskAllInputs,\n\t\t\t\tmaskInputOptions: maskInputOptions,\n\t\t\t\tmaskTextClass: this.options.maskTextClass,\n\t\t\t\tmaskTextSelector: this.options.maskTextSelector,\n\t\t\t\trecordCanvas: this.enableCanvasRecording,\n\t\t\t\tsampling: {\n\t\t\t\t\tcanvas: {\n\t\t\t\t\t\tfps: this.samplingStrategy.canvas,\n\t\t\t\t\t\tfpsManual: this.samplingStrategy.canvasManualSnapshot,\n\t\t\t\t\t\tresizeFactor: this.samplingStrategy.canvasFactor,\n\t\t\t\t\t\tclearWebGLBuffer:\n\t\t\t\t\t\t\tthis.samplingStrategy.canvasClearWebGLBuffer,\n\t\t\t\t\t\tinitialSnapshotDelay:\n\t\t\t\t\t\t\tthis.samplingStrategy.canvasInitialSnapshotDelay,\n\t\t\t\t\t\tdataURLOptions: this.samplingStrategy.dataUrlOptions,\n\t\t\t\t\t\tmaxSnapshotDimension:\n\t\t\t\t\t\t\tthis.samplingStrategy.canvasMaxSnapshotDimension,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tkeepIframeSrcFn: (_src: string) => {\n\t\t\t\t\treturn !this.options.recordCrossOriginIframe\n\t\t\t\t},\n\t\t\t\tinlineImages: this.inlineImages,\n\t\t\t\tinlineVideos: this.inlineVideos,\n\t\t\t\tcollectFonts: this.inlineImages,\n\t\t\t\tinlineStylesheet: this.inlineStylesheet,\n\t\t\t\tstyleSheetResyncInterval: this.styleSheetResyncInterval,\n\t\t\t\tplugins: [getRecordSequentialIdPlugin()],\n\t\t\t\tlogger:\n\t\t\t\t\t(typeof this.options.debug === 'boolean' &&\n\t\t\t\t\t\tthis.options.debug) ||\n\t\t\t\t\t(typeof this.options.debug === 'object' &&\n\t\t\t\t\t\tthis.options.debug.domRecording)\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tdebug: this.logger.log,\n\t\t\t\t\t\t\t\twarn: HighlightWarning,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined,\n\t\t\t})\n\n\t\t\t// recordStop is not part of listeners because we do not actually want to stop rrweb\n\t\t\t// rrweb has some bugs that make the stop -> restart workflow broken (eg iframe listeners)\n\t\t\tif (!alreadyRecording) {\n\t\t\t\tif (this.options.recordCrossOriginIframe) {\n\t\t\t\t\tthis._setupCrossOriginIframeParent()\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (document.referrer) {\n\t\t\t\t// Don't record the referrer if it's the same origin.\n\t\t\t\t// Non-single page apps might have the referrer set to the same origin.\n\t\t\t\t// If we record this then the referrer data will not be useful.\n\t\t\t\t// Most users will want to see referrers outside of their website/app.\n\t\t\t\t// This will be a configuration set in `H.init()` later.\n\t\t\t\tif (\n\t\t\t\t\t!(\n\t\t\t\t\t\twindow &&\n\t\t\t\t\t\tdocument.referrer.includes(window.location.origin)\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tthis.addCustomEvent<string>('Referrer', document.referrer)\n\t\t\t\t\tthis.addProperties(\n\t\t\t\t\t\t{ referrer: document.referrer },\n\t\t\t\t\t\t{ type: 'session' },\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.sessionData.sessionKey) {\n\t\t\t\tthis.addProperties(\n\t\t\t\t\t{\n\t\t\t\t\t\tsessionKey: this.sessionData.sessionKey,\n\t\t\t\t\t},\n\t\t\t\t\t{ type: 'session' },\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tthis._setupWindowListeners()\n\t\t\tthis.ready = true\n\t\t\tthis.state = 'Recording'\n\t\t\tthis.manualStopped = false\n\t\t} catch (e) {\n\t\t\tif (this._isOnLocalHost) {\n\t\t\t\tsdkLog('error', e)\n\t\t\t\tHighlightWarning('initializeSession', e)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _productAnalyticsEvents(): ProductAnalyticsEvents {\n\t\tconst pa = this.options?.productAnalytics\n\t\tif (pa === false) {\n\t\t\treturn {}\n\t\t}\n\n\t\tconst paEvents = {\n\t\t\tclicks: true,\n\t\t\tpageViews: true,\n\t\t\ttrackEvents: true,\n\t\t}\n\t\tif (pa === undefined || pa === true) {\n\t\t\treturn paEvents\n\t\t}\n\n\t\tfor (const event of Object.keys(pa)) {\n\t\t\tif (pa[event as keyof ProductAnalyticsEvents] === false) {\n\t\t\t\tpaEvents[event as keyof ProductAnalyticsEvents] = false\n\t\t\t}\n\t\t}\n\t\treturn paEvents\n\t}\n\n\tasync _visibilityHandler(hidden: boolean) {\n\t\tif (this.manualStopped) {\n\t\t\tthis.logger.log(`Ignoring visibility event due to manual stop.`)\n\t\t\treturn\n\t\t}\n\t\tif (\n\t\t\tnew Date().getTime() - this._lastVisibilityChangeTime <\n\t\t\tVISIBILITY_DEBOUNCE_MS\n\t\t) {\n\t\t\treturn\n\t\t}\n\t\tthis._lastVisibilityChangeTime = new Date().getTime()\n\t\tthis.logger.log(`Detected window ${hidden ? 'hidden' : 'visible'}.`)\n\t\tif (!hidden) {\n\t\t\tif (this.options.disableBackgroundRecording) {\n\t\t\t\tawait this.initialize()\n\t\t\t}\n\t\t\tthis.addCustomEvent('TabHidden', false)\n\t\t} else {\n\t\t\tthis.addCustomEvent('TabHidden', true)\n\t\t\tif (this.options.disableBackgroundRecording) {\n\t\t\t\tthis.stopRecording()\n\t\t\t}\n\t\t}\n\t}\n\n\tasync _setupCrossOriginIframe() {\n\t\tthis.logger.log(`highlight in cross-origin iframe is waiting `)\n\t\t// wait until we get a initialization message from the parent window\n\t\tawait new Promise<void>((r) => {\n\t\t\tconst listener = (message: MessageEvent) => {\n\t\t\t\tif (message.data.highlight === IFRAME_PARENT_READY) {\n\t\t\t\t\tconst msg = message.data as HighlightIframeMessage\n\t\t\t\t\tthis.logger.log(`highlight got window message `, msg)\n\t\t\t\t\tthis.sessionData.projectID = msg.projectID\n\t\t\t\t\tthis.sessionData.sessionSecureID = msg.sessionSecureID\n\t\t\t\t\t// reply back that we got the message and are set up\n\t\t\t\t\twindow.parent.postMessage(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\thighlight: IFRAME_PARENT_RESPONSE,\n\t\t\t\t\t\t} as HighlightIframeReponse,\n\t\t\t\t\t\t'*',\n\t\t\t\t\t)\n\t\t\t\t\t// stop listening to parent messages\n\t\t\t\t\twindow.removeEventListener('message', listener)\n\t\t\t\t\tr()\n\t\t\t\t}\n\t\t\t}\n\t\t\twindow.addEventListener('message', listener)\n\t\t})\n\t}\n\n\t_setupCrossOriginIframeParent() {\n\t\tthis.logger.log(\n\t\t\t`highlight setting up cross origin iframe parent notification`,\n\t\t)\n\t\t// notify iframes that highlight is ready\n\t\tsetInterval(() => {\n\t\t\twindow.document.querySelectorAll('iframe').forEach((iframe) => {\n\t\t\t\tiframe.contentWindow?.postMessage(\n\t\t\t\t\t{\n\t\t\t\t\t\thighlight: IFRAME_PARENT_READY,\n\t\t\t\t\t\tprojectID: this.sessionData.projectID,\n\t\t\t\t\t\tsessionSecureID: this.sessionData.sessionSecureID,\n\t\t\t\t\t} as HighlightIframeMessage,\n\t\t\t\t\t'*',\n\t\t\t\t)\n\t\t\t})\n\t\t}, FIRST_SEND_FREQUENCY)\n\t\twindow.addEventListener('message', (message: MessageEvent) => {\n\t\t\tif (message.data.highlight === IFRAME_PARENT_RESPONSE) {\n\t\t\t\tthis.logger.log(\n\t\t\t\t\t`highlight got response from initialized iframe`,\n\t\t\t\t)\n\t\t\t}\n\t\t})\n\t}\n\n\t_setupWindowListeners() {\n\t\ttry {\n\t\t\tconst highlightThis = this\n\t\t\tif (this.enableSegmentIntegration) {\n\t\t\t\tthis.listeners.push(\n\t\t\t\t\tSegmentIntegrationListener((obj: any) => {\n\t\t\t\t\t\tif (obj.type === 'track') {\n\t\t\t\t\t\t\tconst properties: { [key: string]: string } = {}\n\t\t\t\t\t\t\tproperties['segment-event'] = obj.event\n\t\t\t\t\t\t\thighlightThis.addProperties(properties, {\n\t\t\t\t\t\t\t\ttype: 'track',\n\t\t\t\t\t\t\t\tsource: 'segment',\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t} else if (obj.type === 'identify') {\n\t\t\t\t\t\t\t// Removes the starting and end quotes\n\t\t\t\t\t\t\t// Example: \"boba\" -> boba\n\t\t\t\t\t\t\tconst trimmedUserId = obj.userId.replace(\n\t\t\t\t\t\t\t\t/^\"(.*)\"$/,\n\t\t\t\t\t\t\t\t'$1',\n\t\t\t\t\t\t\t)\n\n\t\t\t\t\t\t\thighlightThis.identify(\n\t\t\t\t\t\t\t\ttrimmedUserId,\n\t\t\t\t\t\t\t\tobj.traits,\n\t\t\t\t\t\t\t\t'segment',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\t\t\tthis.listeners.push(\n\t\t\t\tPathListener((url: string) => {\n\t\t\t\t\tif (this.reloaded) {\n\t\t\t\t\t\tthis.addCustomEvent<string>('Reload', url)\n\t\t\t\t\t\tthis.reloaded = false\n\t\t\t\t\t\thighlightThis.addProperties(\n\t\t\t\t\t\t\t{ reload: true },\n\t\t\t\t\t\t\t{ type: 'session' },\n\t\t\t\t\t\t)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.addCustomEvent<string>('Navigate', url)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tthis.listeners.push(\n\t\t\t\tViewportResizeListener(\n\t\t\t\t\t(viewport: ViewportResizeListenerArgs) => {\n\t\t\t\t\t\tthis.addCustomEvent('Viewport', viewport)\n\t\t\t\t\t\tthis.submitViewportMetrics(viewport)\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t)\n\t\t\tthis.listeners.push(\n\t\t\t\tClickListener((clickTarget, event) => {\n\t\t\t\t\tlet selector = null\n\t\t\t\t\tlet textContent = null\n\t\t\t\t\tif (event && event.target) {\n\t\t\t\t\t\tconst t = event.target as HTMLElement\n\t\t\t\t\t\tselector = getSimpleSelector(t)\n\t\t\t\t\t\ttextContent = t.textContent\n\t\t\t\t\t\t// avoid sending huge strings here\n\t\t\t\t\t\tif (textContent && textContent.length > 2000) {\n\t\t\t\t\t\t\ttextContent = textContent.substring(0, 2000)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.addCustomEvent('Click', {\n\t\t\t\t\t\tclickTarget,\n\t\t\t\t\t\tclickTextContent: textContent,\n\t\t\t\t\t\tclickSelector: selector,\n\t\t\t\t\t})\n\t\t\t\t}),\n\t\t\t)\n\t\t\tthis.listeners.push(\n\t\t\t\tFocusListener((focusTarget) => {\n\t\t\t\t\tif (focusTarget) {\n\t\t\t\t\t\tthis.addCustomEvent('Focus', focusTarget)\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tthis.listeners.push(\n\t\t\t\tWebVitalsListener((data) => {\n\t\t\t\t\tconst { name, value } = data\n\t\t\t\t\tconst tags: { name: string; value: string }[] = []\n\t\t\t\t\tconst addTag = (n: string, v: string | undefined) => {\n\t\t\t\t\t\tif (v) tags.push({ name: n, value: v })\n\t\t\t\t\t}\n\t\t\t\t\tswitch (data.name) {\n\t\t\t\t\t\tcase 'LCP': {\n\t\t\t\t\t\t\tconst a = data.attribution\n\t\t\t\t\t\t\taddTag('web_vital.element', a.element)\n\t\t\t\t\t\t\taddTag(\n\t\t\t\t\t\t\t\t'web_vital.attribution.url',\n\t\t\t\t\t\t\t\ta.url ? sanitizeUrl(a.url) : undefined,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase 'CLS': {\n\t\t\t\t\t\t\tconst a = data.attribution\n\t\t\t\t\t\t\taddTag('web_vital.element', a.largestShiftTarget)\n\t\t\t\t\t\t\taddTag('web_vital.load_state', a.loadState)\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase 'INP': {\n\t\t\t\t\t\t\tconst a = data.attribution\n\t\t\t\t\t\t\taddTag('web_vital.element', a.eventTarget)\n\t\t\t\t\t\t\taddTag('web_vital.event_type', a.eventType)\n\t\t\t\t\t\t\taddTag('web_vital.load_state', a.loadState)\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase 'FID': {\n\t\t\t\t\t\t\tconst a = data.attribution\n\t\t\t\t\t\t\taddTag('web_vital.element', a.eventTarget)\n\t\t\t\t\t\t\taddTag('web_vital.event_type', a.eventType)\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase 'FCP': {\n\t\t\t\t\t\t\tconst a = data.attribution\n\t\t\t\t\t\t\taddTag('web_vital.load_state', a.loadState)\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase 'TTFB':\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tthis.recordGauge({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\tgroup: window.location.href,\n\t\t\t\t\t\tcategory: MetricCategory.WebVital,\n\t\t\t\t\t\ttags: tags.length ? tags : undefined,\n\t\t\t\t\t})\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tthis.listeners.push(\n\t\t\t\tNetworkPerformanceListener(\n\t\t\t\t\t(payload: NetworkPerformancePayload) => {\n\t\t\t\t\t\tconst tags: { name: string; value: string }[] = []\n\t\t\t\t\t\tif (payload.saveData !== undefined) {\n\t\t\t\t\t\t\ttags.push({\n\t\t\t\t\t\t\t\tname: 'saveData',\n\t\t\t\t\t\t\t\tvalue: payload.saveData.toString(),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (payload.effectiveType !== undefined) {\n\t\t\t\t\t\t\ttags.push({\n\t\t\t\t\t\t\t\tname: 'effectiveType',\n\t\t\t\t\t\t\t\tvalue: payload.effectiveType.toString(),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (payload.type !== undefined) {\n\t\t\t\t\t\t\ttags.push({\n\t\t\t\t\t\t\t\tname: 'type',\n\t\t\t\t\t\t\t\tvalue: payload.type.toString(),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t\tObject.entries(payload).forEach(([name, value]) => {\n\t\t\t\t\t\t\tif (isMetricSafeNumber(value)) {\n\t\t\t\t\t\t\t\tthis.recordGauge({\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tvalue: value as number,\n\t\t\t\t\t\t\t\t\tcategory: MetricCategory.Performance,\n\t\t\t\t\t\t\t\t\tgroup: window.location.href,\n\t\t\t\t\t\t\t\t\ttags,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t},\n\t\t\t\t\tthis._recordingStartTime,\n\t\t\t\t),\n\t\t\t)\n\n\t\t\tif (this.sessionShortcut) {\n\t\t\t\tthis.listeners.push(\n\t\t\t\t\tSessionShortcutListener(this.sessionShortcut, () => {\n\t\t\t\t\t\twindow.open(\n\t\t\t\t\t\t\tthis.getCurrentSessionURLWithTimestamp(),\n\t\t\t\t\t\t\t'_blank',\n\t\t\t\t\t\t)\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tif (this.enablePerformanceRecording) {\n\t\t\t\tthis.listeners.push(\n\t\t\t\t\tPerformanceListener((payload: PerformancePayload) => {\n\t\t\t\t\t\tthis.addCustomEvent('Performance', stringify(payload))\n\t\t\t\t\t\tObject.entries(payload)\n\t\t\t\t\t\t\t.filter(([name]) => name !== 'relativeTimestamp')\n\t\t\t\t\t\t\t.forEach(\n\t\t\t\t\t\t\t\t([name, value]) =>\n\t\t\t\t\t\t\t\t\tvalue &&\n\t\t\t\t\t\t\t\t\tthis.recordGauge({\n\t\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\t\t\t\tcategory: MetricCategory.Performance,\n\t\t\t\t\t\t\t\t\t\tgroup: window.location.href,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t}, this._recordingStartTime),\n\t\t\t\t)\n\t\t\t\tthis.listeners.push(\n\t\t\t\t\tJankListener((payload: JankPayload) => {\n\t\t\t\t\t\tthis.addCustomEvent('Jank', stringify(payload))\n\t\t\t\t\t\tthis.recordGauge({\n\t\t\t\t\t\t\tname: 'Jank',\n\t\t\t\t\t\t\tvalue: payload.jankAmount,\n\t\t\t\t\t\t\tcategory: MetricCategory.WebVital,\n\t\t\t\t\t\t\tgroup: payload.querySelector,\n\t\t\t\t\t\t})\n\t\t\t\t\t}, this._recordingStartTime),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\t// only do this once, since we want to keep the visibility listener attached even when recoding is stopped\n\t\t\tif (!this._hasPreviouslyInitialized) {\n\t\t\t\t// setup electron main thread window visiblity events listener\n\t\t\t\tif (window.electron?.ipcRenderer) {\n\t\t\t\t\twindow.electron.ipcRenderer.on(\n\t\t\t\t\t\t'highlight.run',\n\t\t\t\t\t\t({ visible }: { visible: boolean }) => {\n\t\t\t\t\t\t\tthis._visibilityHandler(!visible)\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t\tthis.logger.log('Set up Electron highlight.run events.')\n\t\t\t\t} else {\n\t\t\t\t\t// Send the payload every time the page is no longer visible - this includes when the tab is closed, as well\n\t\t\t\t\t// as when switching tabs or apps on mobile. Non-blocking.\n\t\t\t\t\tPageVisibilityListener((isTabHidden) =>\n\t\t\t\t\t\tthis._visibilityHandler(isTabHidden),\n\t\t\t\t\t)\n\t\t\t\t\tthis.logger.log('Set up document visibility listener.')\n\t\t\t\t}\n\t\t\t\tthis._hasPreviouslyInitialized = true\n\t\t\t}\n\n\t\t\t// Clear the timer so it doesn't block the next page navigation.\n\t\t\tconst unloadListener = () => {\n\t\t\t\tthis.hasSessionUnloaded = true\n\t\t\t\tif (this.pushPayloadTimerId) {\n\t\t\t\t\tclearTimeout(this.pushPayloadTimerId)\n\t\t\t\t\tthis.pushPayloadTimerId = undefined\n\t\t\t\t}\n\t\t\t}\n\t\t\twindow.addEventListener('beforeunload', unloadListener)\n\t\t\tthis.listeners.push(() =>\n\t\t\t\twindow.removeEventListener('beforeunload', unloadListener),\n\t\t\t)\n\t\t} catch (e) {\n\t\t\tif (this._isOnLocalHost) {\n\t\t\t\tsdkLog('error', e)\n\t\t\t\tHighlightWarning('initializeSession _setupWindowListeners', e)\n\t\t\t}\n\t\t}\n\n\t\tconst unloadListener = () => {\n\t\t\tthis.addCustomEvent('Page Unload', '')\n\t\t\tsetSessionSecureID(this.sessionData.sessionSecureID)\n\t\t\tsetSessionData(this.sessionData)\n\t\t}\n\t\twindow.addEventListener('beforeunload', unloadListener)\n\t\tthis.listeners.push(() =>\n\t\t\twindow.removeEventListener('beforeunload', unloadListener),\n\t\t)\n\n\t\t// beforeunload is not supported on iOS on Safari. Apple docs recommend using `pagehide` instead.\n\t\tconst isOnIOS =\n\t\t\tnavigator.userAgent.match(/iPad/i) ||\n\t\t\tnavigator.userAgent.match(/iPhone/i)\n\t\tif (isOnIOS) {\n\t\t\tconst unloadListener = () => {\n\t\t\t\tthis.addCustomEvent('Page Unload', '')\n\t\t\t\tsetSessionSecureID(this.sessionData.sessionSecureID)\n\t\t\t\tsetSessionData(this.sessionData)\n\t\t\t}\n\t\t\twindow.addEventListener('pagehide', unloadListener)\n\t\t\tthis.listeners.push(() =>\n\t\t\t\twindow.removeEventListener('pagehide', unloadListener),\n\t\t\t)\n\t\t}\n\t}\n\n\tsubmitViewportMetrics({\n\t\theight,\n\t\twidth,\n\t\tavailHeight,\n\t\tavailWidth,\n\t}: ViewportResizeListenerArgs) {\n\t\tthis.recordGauge({\n\t\t\tname: MetricName.ViewportHeight,\n\t\t\tvalue: height,\n\t\t\tcategory: MetricCategory.Device,\n\t\t\tgroup: window.location.href,\n\t\t})\n\t\tthis.recordGauge({\n\t\t\tname: MetricName.ViewportWidth,\n\t\t\tvalue: width,\n\t\t\tcategory: MetricCategory.Device,\n\t\t\tgroup: window.location.href,\n\t\t})\n\t\tthis.recordGauge({\n\t\t\tname: MetricName.ScreenHeight,\n\t\t\tvalue: availHeight,\n\t\t\tcategory: MetricCategory.Device,\n\t\t\tgroup: window.location.href,\n\t\t})\n\t\tthis.recordGauge({\n\t\t\tname: MetricName.ScreenWidth,\n\t\t\tvalue: availWidth,\n\t\t\tcategory: MetricCategory.Device,\n\t\t\tgroup: window.location.href,\n\t\t})\n\t\tthis.recordGauge({\n\t\t\tname: MetricName.ViewportArea,\n\t\t\tvalue: height * width,\n\t\t\tcategory: MetricCategory.Device,\n\t\t\tgroup: window.location.href,\n\t\t})\n\t}\n\n\trecordGauge(metric: RecordMetric) {\n\t\tlet gauge = this._gauges.get(metric.name)\n\t\tif (!gauge) {\n\t\t\tgauge = getMeter()?.createGauge(\n\t\t\t\tmetric.name,\n\t\t\t\tmetricInstrumentOptions(metric.name, metric.unit),\n\t\t\t)\n\t\t\tif (!gauge) return\n\t\t\tthis._gauges.set(metric.name, gauge)\n\t\t}\n\t\tgauge.record(metric.value, {\n\t\t\t...metric.tags?.reduce((a, b) => ({ ...a, [b.name]: b.value }), {}),\n\t\t\tgroup: metric.group,\n\t\t\tcategory: metric.category,\n\t\t\t'highlight.session_id': this.sessionData.sessionSecureID,\n\t\t})\n\t\tfor (const integration of this._integrations) {\n\t\t\tintegration.recordGauge(this.sessionData.sessionSecureID, metric)\n\t\t}\n\t}\n\n\trecordCount(metric: RecordMetric) {\n\t\tlet counter = this._counters.get(metric.name)\n\t\tif (!counter) {\n\t\t\tcounter = getMeter()?.createCounter(\n\t\t\t\tmetric.name,\n\t\t\t\tmetricInstrumentOptions(metric.name, metric.unit),\n\t\t\t)\n\t\t\tif (!counter) return\n\t\t\tthis._counters.set(metric.name, counter)\n\t\t}\n\t\tcounter.add(metric.value, {\n\t\t\t...metric.tags?.reduce((a, b) => ({ ...a, [b.name]: b.value }), {}),\n\t\t\tgroup: metric.group,\n\t\t\tcategory: metric.category,\n\t\t\t'highlight.session_id': this.sessionData.sessionSecureID,\n\t\t})\n\t}\n\n\trecordIncr(metric: Omit<RecordMetric, 'value'>) {\n\t\tthis.recordCount({ ...metric, value: 1 })\n\t}\n\n\trecordHistogram(metric: RecordMetric) {\n\t\tlet histogram = this._histograms.get(metric.name)\n\t\tif (!histogram) {\n\t\t\thistogram = getMeter()?.createHistogram(\n\t\t\t\tmetric.name,\n\t\t\t\tmetricInstrumentOptions(metric.name, metric.unit),\n\t\t\t)\n\t\t\tif (!histogram) return\n\t\t\tthis._histograms.set(metric.name, histogram)\n\t\t}\n\t\thistogram.record(metric.value, {\n\t\t\t...metric.tags?.reduce((a, b) => ({ ...a, [b.name]: b.value }), {}),\n\t\t\tgroup: metric.group,\n\t\t\tcategory: metric.category,\n\t\t\t'highlight.session_id': this.sessionData.sessionSecureID,\n\t\t})\n\t}\n\n\trecordUpDownCounter(metric: RecordMetric) {\n\t\tlet up_down_counter = this._up_down_counters.get(metric.name)\n\t\tif (!up_down_counter) {\n\t\t\tup_down_counter = getMeter()?.createUpDownCounter(\n\t\t\t\tmetric.name,\n\t\t\t\tmetricInstrumentOptions(metric.name, metric.unit),\n\t\t\t)\n\t\t\tif (!up_down_counter) return\n\t\t\tthis._up_down_counters.set(metric.name, up_down_counter)\n\t\t}\n\t\tup_down_counter.add(metric.value, {\n\t\t\t...metric.tags?.reduce((a, b) => ({ ...a, [b.name]: b.value }), {}),\n\t\t\tgroup: metric.group,\n\t\t\tcategory: metric.category,\n\t\t\t'highlight.session_id': this.sessionData.sessionSecureID,\n\t\t})\n\t}\n\n\t/**\n\t * Stops Highlight from recording.\n\t * @param manual The end user requested to stop recording.\n\t */\n\tstopRecording(manual?: boolean) {\n\t\tthis.manualStopped = !!manual\n\t\tif (this.manualStopped) {\n\t\t\tthis.addCustomEvent(\n\t\t\t\t'Stop',\n\t\t\t\t'H.stop() was called which stops Highlight from recording.',\n\t\t\t)\n\t\t}\n\t\tthis.state = 'NotRecording'\n\t\t// stop rrweb recording mutation observers\n\t\tif (manual && this._recordStop) {\n\t\t\tthis._recordStop()\n\t\t\tthis._recordStop = undefined\n\t\t}\n\t\t// stop all other event listeners, to be restarted on initialize()\n\t\tthis.listeners.forEach((stop) => stop())\n\t\tthis.listeners = []\n\t\tvoid shutdown()\n\t}\n\n\tgetCurrentSessionTimestamp() {\n\t\treturn this._recordingStartTime\n\t}\n\n\t/**\n\t * Returns the current timestamp for the current session.\n\t */\n\tgetCurrentSessionURLWithTimestamp() {\n\t\tconst now = new Date().getTime()\n\t\tconst { projectID, sessionSecureID } = this.sessionData\n\t\tconst relativeTimestamp = (now - this._recordingStartTime) / 1000\n\t\treturn `https://${HIGHLIGHT_URL}/${projectID}/sessions/${sessionSecureID}?ts=${relativeTimestamp}`\n\t}\n\n\tgetCurrentSessionURL() {\n\t\tconst projectID = this.sessionData.projectID\n\t\tconst sessionSecureID = this.sessionData.sessionSecureID\n\t\tif (projectID && sessionSecureID) {\n\t\t\treturn `https://${HIGHLIGHT_URL}/${projectID}/sessions/${sessionSecureID}`\n\t\t}\n\t\treturn null\n\t}\n\n\tasync snapshot(element: HTMLCanvasElement) {\n\t\tawait record.snapshotCanvas(element)\n\t}\n\n\t/** @deprecated Session feedback is no longer supported. This is a no-op. */\n\taddSessionFeedback(_feedback: {\n\t\tverbatim: string\n\t\ttimestamp: string\n\t\tuser_name?: string\n\t\tuser_email?: string\n\t}) {}\n\n\t// Reset the events array and push to a backend.\n\tasync _save() {\n\t\ttry {\n\t\t\t// reset the session if over 4 hours and no sessionKey is provided\n\t\t\tif (\n\t\t\t\tthis.state === 'Recording' &&\n\t\t\t\tthis.listeners &&\n\t\t\t\t!this.sessionData.sessionKey &&\n\t\t\t\tthis.sessionData.sessionStartTime &&\n\t\t\t\tDate.now() - this.sessionData.sessionStartTime >\n\t\t\t\t\tMAX_SESSION_LENGTH\n\t\t\t) {\n\t\t\t\tthis.logger.log(`Resetting session`, {\n\t\t\t\t\tstart: this.sessionData.sessionStartTime,\n\t\t\t\t})\n\t\t\t\tawait this._reset({})\n\t\t\t}\n\t\t\tlet sendFn = undefined\n\t\t\tif (this.options?.sendMode === 'local') {\n\t\t\t\tsendFn = async (payload: any) => {\n\t\t\t\t\tlet blob = new Blob(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\tquery: print(PushSessionEventsDocument),\n\t\t\t\t\t\t\t\tvariables: payload,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t],\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'application/json',\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t\tawait window.fetch(`${this._backendUrl}`, {\n\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\tbody: blob,\n\t\t\t\t\t})\n\t\t\t\t\treturn 0\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait this._sendPayload({ sendFn })\n\t\t\tthis.hasPushedData = true\n\t\t\tthis.sessionData.lastPushTime = Date.now()\n\t\t\tsetSessionData(this.sessionData)\n\t\t} catch (e) {\n\t\t\tif (this._isOnLocalHost) {\n\t\t\t\tsdkLog('error', e)\n\t\t\t\tHighlightWarning('_save', e)\n\t\t\t}\n\t\t}\n\t\tif (this.state === 'Recording') {\n\t\t\tif (this.pushPayloadTimerId) {\n\t\t\t\tclearTimeout(this.pushPayloadTimerId)\n\t\t\t\tthis.pushPayloadTimerId = undefined\n\t\t\t}\n\t\t\tthis.pushPayloadTimerId = setTimeout(() => {\n\t\t\t\tthis._save()\n\t\t\t}, SEND_FREQUENCY)\n\t\t}\n\t}\n\n\t/**\n\t * This proxy should be used instead of rrweb's native addCustomEvent.\n\t * The proxy makes sure recording has started before emitting a custom event.\n\t */\n\taddCustomEvent<T>(tag: string, payload: T): void {\n\t\tif (this.state === 'NotRecording') {\n\t\t\tlet intervalId: ReturnType<typeof setInterval>\n\t\t\tconst worker = () => {\n\t\t\t\tclearInterval(intervalId)\n\t\t\t\tif (this.state === 'Recording' && this.events.length > 0) {\n\t\t\t\t\trrwebAddCustomEvent(tag, payload)\n\t\t\t\t} else {\n\t\t\t\t\tintervalId = setTimeout(worker, 500)\n\t\t\t\t}\n\t\t\t}\n\t\t\tintervalId = setTimeout(worker, 500)\n\t\t} else if (\n\t\t\tthis.state === 'Recording' &&\n\t\t\t(this.events.length > 0 || this.hasPushedData)\n\t\t) {\n\t\t\trrwebAddCustomEvent(tag, payload)\n\t\t}\n\t}\n\n\tasync _sendPayload({\n\t\tsendFn,\n\t}: {\n\t\tsendFn?: (\n\t\t\tpayload: PushSessionEventsMutationVariables,\n\t\t) => Promise<number>\n\t}) {\n\t\tconst resources = FirstLoadListeners.getRecordedNetworkResources(\n\t\t\tthis._firstLoadListeners,\n\t\t\tthis._recordingStartTime,\n\t\t)\n\t\tconst webSocketEvents = FirstLoadListeners.getRecordedWebSocketEvents(\n\t\t\tthis._firstLoadListeners,\n\t\t)\n\t\tconst events = [...this.events]\n\t\tconst messages = [...this._firstLoadListeners.messages]\n\t\tconst errors = [...this._firstLoadListeners.errors]\n\n\t\t// if it is time to take a full snapshot,\n\t\t// ensure the snapshot is at the beginning of the next payload\n\t\t// After snapshot thresholds have been met,\n\t\t// take a full snapshot and reset the counters\n\t\tconst { bytes, time } = this.enableCanvasRecording\n\t\t\t? SNAPSHOT_SETTINGS.canvas\n\t\t\t: SNAPSHOT_SETTINGS.normal\n\t\tif (\n\t\t\tthis._eventBytesSinceSnapshot >= bytes &&\n\t\t\tnew Date().getTime() - this._lastSnapshotTime >= time\n\t\t) {\n\t\t\tthis.takeFullSnapshot()\n\t\t}\n\n\t\tthis.logger.log(\n\t\t\t`Sending: ${events.length} events, ${messages.length} messages, ${resources.length} network resources, ${errors.length} errors \\nTo: ${this._backendUrl}\\nOrg: ${this.organizationID}\\nSessionSecureID: ${this.sessionData.sessionSecureID}`,\n\t\t)\n\t\tconst payloadId = new Date().getTime()\n\t\tconst highlightLogs = getHighlightLogs()\n\t\tif (sendFn) {\n\t\t\tconst sessionPayload: PushPayloadMutationVariables = {\n\t\t\t\tsession_secure_id: this.sessionData.sessionSecureID,\n\t\t\t\tpayload_id: payloadId.toString(),\n\t\t\t\tevents: { events } as ReplayEventsInput,\n\t\t\t\tmessages: stringify({ messages }),\n\t\t\t\tresources: JSON.stringify({ resources }),\n\t\t\t\tweb_socket_events: JSON.stringify({ webSocketEvents }),\n\t\t\t\terrors,\n\t\t\t\tis_beacon: false,\n\t\t\t\thas_session_unloaded: this.hasSessionUnloaded,\n\t\t\t\thighlight_logs: highlightLogs || undefined,\n\t\t\t}\n\n\t\t\tconst { compressedBase64 } = await payloadToBase64(sessionPayload)\n\t\t\tawait sendFn({\n\t\t\t\tsession_secure_id: this.sessionData.sessionSecureID,\n\t\t\t\tpayload_id: new Date().getTime().toString(),\n\t\t\t\tdata: compressedBase64,\n\t\t\t})\n\t\t} else {\n\t\t\tthis._worker.postMessage({\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: MessageType.AsyncEvents,\n\t\t\t\t\tid: payloadId,\n\t\t\t\t\tevents,\n\t\t\t\t\tmessages,\n\t\t\t\t\terrors,\n\t\t\t\t\tresourcesString: JSON.stringify({ resources: resources }),\n\t\t\t\t\twebSocketEventsString: JSON.stringify({\n\t\t\t\t\t\twebSocketEvents: webSocketEvents,\n\t\t\t\t\t}),\n\t\t\t\t\thasSessionUnloaded: this.hasSessionUnloaded,\n\t\t\t\t\thighlightLogs: highlightLogs,\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\tsetSessionData(this.sessionData)\n\n\t\t// If sendFn throws an exception, the data below will not be cleared, and it will be re-uploaded on the next PushPayload.\n\t\tFirstLoadListeners.clearRecordedNetworkResources(\n\t\t\tthis._firstLoadListeners,\n\t\t)\n\t\t// We are creating a weak copy of the events. rrweb could have pushed more events to this.events while we send the request with the events as a payload.\n\t\t// Originally, we would clear this.events but this could lead to a race condition.\n\t\t// Example Scenario:\n\t\t// 1. Create the events payload from this.events (with N events)\n\t\t// 2. rrweb pushes to this.events (with M events)\n\t\t// 3. Network request made to push payload (Only includes N events)\n\t\t// 4. this.events is cleared (we lose M events)\n\t\tthis.events = this.events.slice(events.length)\n\n\t\tthis._firstLoadListeners.messages =\n\t\t\tthis._firstLoadListeners.messages.slice(messages.length)\n\t\tthis._firstLoadListeners.errors = this._firstLoadListeners.errors.slice(\n\t\t\terrors.length,\n\t\t)\n\t\tclearHighlightLogs(highlightLogs)\n\t}\n\n\tprivate takeFullSnapshot() {\n\t\tif (!this._recordStop) {\n\t\t\tthis.logger.log(`skipping full snapshot as rrweb is not running`)\n\t\t\treturn\n\t\t}\n\t\tthis.logger.log(`taking full snapshot`, {\n\t\t\tbytesSinceSnapshot: this._eventBytesSinceSnapshot,\n\t\t\tlastSnapshotTime: this._lastSnapshotTime,\n\t\t})\n\t\trecord.takeFullSnapshot()\n\t\tthis._eventBytesSinceSnapshot = 0\n\t\tthis._lastSnapshotTime = new Date().getTime()\n\t}\n\n\tregisterLD(client: LDClient) {\n\t\t// TODO(vkorolik): can only register one LD client for now\n\t\tif (this._integrations.length) return\n\t\tthis._integrations.push(new LaunchDarklyIntegration(client))\n\t}\n}\n\ninterface HighlightWindow extends Window {\n\tHighlight: Highlight\n\tIntercom?: any\n\telectron?: {\n\t\tipcRenderer: {\n\t\t\ton: (channel: string, listener: (...args: any[]) => void) => {}\n\t\t}\n\t}\n\tCypress?: any\n}\n\ndeclare var window: HighlightWindow\n\ndeclare global {\n\tinterface Console {\n\t\tdefaultLog: any\n\t\tdefaultError: any\n\t\tdefaultWarn: any\n\t\tdefaultDebug: any\n\t}\n}\n\nexport { GenerateSecureID, getPreviousSessionData, getTracer, MetricCategory }\nexport type {\n\tAmplitudeIntegrationOptions,\n\tConsoleMessage,\n\tHighlightFetchWindow,\n\tHighlightOptions,\n\tHighlightPublicInterface,\n\tIntegration,\n\tLDClient,\n\tMetadata,\n\tMetric,\n\tMixpanelIntegrationOptions,\n\tRequestResponsePair,\n\tSessionDetails,\n}\n","import { H } from '../index'\n\nexport const listenToChromeExtensionMessage = () => {\n\t// typeof checks to see if chrome is defined. chrome is not defined outside of the context of an extension or Chromium browser.\n\tif (typeof chrome !== 'undefined' && chrome?.runtime?.onMessage) {\n\t\tchrome?.runtime?.onMessage.addListener(\n\t\t\t(message, _sender, sendResponse) => {\n\t\t\t\tconst action = message.action\n\t\t\t\tconsole.log(\n\t\t\t\t\t`[highlight] received '${action}' event from extension.`,\n\t\t\t\t)\n\t\t\t\tswitch (action) {\n\t\t\t\t\tcase 'init': {\n\t\t\t\t\t\tH.init(1, {\n\t\t\t\t\t\t\tdebug: true,\n\t\t\t\t\t\t})\n\t\t\t\t\t\tH.getSessionURL().then((url) => {\n\t\t\t\t\t\t\tsendResponse({ url })\n\t\t\t\t\t\t})\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tcase 'stop': {\n\t\t\t\t\t\tH.stop()\n\t\t\t\t\t\tsendResponse({ success: true })\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true\n\t\t\t},\n\t\t)\n\t}\n}\n","/*\nGiven a `BrowserWindow`, sets up event listeners for Highlight.\n */\nexport default function configureElectronHighlight(window: any) {\n\tif (window.on && window.webContents?.send) {\n\t\twindow.on('focus', () => {\n\t\t\twindow.webContents.send('highlight.run', { visible: true })\n\t\t})\n\n\t\twindow.on('blur', () => {\n\t\t\twindow.webContents.send('highlight.run', { visible: false })\n\t\t})\n\n\t\twindow.on('close', () => {\n\t\t\twindow.webContents.send('highlight.run', { visible: false })\n\t\t})\n\t}\n}\n","import type { HighlightPublicInterface } from '../client'\n\ninterface SegmentContext {\n\tpayload: any\n\tnext: any\n\tintegrations?: any\n}\n\nexport const HighlightSegmentMiddleware = ({\n\tnext,\n\tpayload,\n}: SegmentContext) => {\n\tif (\n\t\ttypeof window !== 'undefined' &&\n\t\ttypeof document !== 'undefined' &&\n\t\t'H' in window\n\t) {\n\t\tif (payload.obj.type === 'track') {\n\t\t\tconst trackEventName = payload.obj.event\n\t\t\tconst trackEventProperties = payload.obj.properties\n\t\t\twindow.H.track(trackEventName, trackEventProperties)\n\t\t} else if (payload.obj.type === 'identify') {\n\t\t\tconst identifier = payload.obj.userId\n\t\t\t// only send identify call if segment identify was called\n\t\t\t// with a user ID, since highlight identify requires a user ID.\n\t\t\tif (identifier?.length) {\n\t\t\t\tconst identifyMetadata = payload.obj.traits\n\t\t\t\twindow.H.identify(identifier, identifyMetadata)\n\t\t\t}\n\t\t}\n\t}\n\n\tnext(payload)\n}\n\ninterface HighlightWindow extends Window {\n\tH: HighlightPublicInterface\n}\n\ndeclare var window: HighlightWindow\n","import type { HighlightFetchWindow } from '../../client'\nimport type { HighlightPublicInterface } from '../../client'\n\ntype HighlightWindow = Window & {\n\tH: HighlightPublicInterface\n} & HighlightFetchWindow\n\ndeclare var window: HighlightWindow\n\nexport const initializeFetchListener = () => {\n\tif (typeof window !== 'undefined') {\n\t\t// avoid initializing fetch listener more than once.\n\t\tif (typeof window._highlightFetchPatch !== 'undefined') {\n\t\t\treturn\n\t\t}\n\t\twindow._originalFetch = window.fetch\n\t\twindow._fetchProxy = (\n\t\t\tinput: RequestInfo,\n\t\t\tinit: RequestInit | undefined,\n\t\t) => {\n\t\t\treturn window._originalFetch(input, init)\n\t\t}\n\n\t\twindow._highlightFetchPatch = (\n\t\t\tinput: RequestInfo,\n\t\t\tinit: RequestInit | undefined,\n\t\t) => {\n\t\t\treturn window._fetchProxy.call(window || global, input, init)\n\t\t}\n\n\t\twindow.fetch = window._highlightFetchPatch\n\t}\n}\n","import { createNetworkRequestId } from '../../client/listeners/network-listener/utils/utils'\nimport type { HighlightWebSocketWindow } from '../../client/listeners/network-listener/utils/web-socket-listener'\n\ndeclare var window: HighlightWebSocketWindow\n\nconst placeholderCallback = () => null\n\nexport const initializeWebSocketListener = () => {\n\tif (typeof window !== 'undefined') {\n\t\t// avoid initializing fetch listener more than once.\n\t\tif (typeof window._highlightWebSocketRequestCallback !== 'undefined') {\n\t\t\treturn\n\t\t}\n\n\t\twindow._highlightWebSocketRequestCallback = placeholderCallback\n\t\twindow._highlightWebSocketEventCallback = placeholderCallback\n\n\t\tconst WebSocketProxy = new Proxy(window.WebSocket, {\n\t\t\tconstruct(\n\t\t\t\ttarget,\n\t\t\t\targs: [url: string, protocols?: string | string[]],\n\t\t\t) {\n\t\t\t\tconst [, socketId] = createNetworkRequestId()\n\t\t\t\tconst webSocket = new target(...args)\n\n\t\t\t\tconst openHandler = (event: Event) => {\n\t\t\t\t\twindow._highlightWebSocketRequestCallback({\n\t\t\t\t\t\tsocketId,\n\t\t\t\t\t\tinitiatorType: 'websocket',\n\t\t\t\t\t\ttype: 'open',\n\t\t\t\t\t\tname: webSocket.url,\n\t\t\t\t\t\tstartTimeAbs: performance.timeOrigin + event.timeStamp,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tconst closeHandler = (event: CloseEvent) => {\n\t\t\t\t\twindow._highlightWebSocketRequestCallback({\n\t\t\t\t\t\tsocketId,\n\t\t\t\t\t\tinitiatorType: 'websocket',\n\t\t\t\t\t\ttype: 'close',\n\t\t\t\t\t\tname: webSocket.url,\n\t\t\t\t\t\tresponseEndAbs:\n\t\t\t\t\t\t\tperformance.timeOrigin + event.timeStamp,\n\t\t\t\t\t})\n\n\t\t\t\t\twebSocket.removeEventListener('open', openHandler)\n\t\t\t\t\twebSocket.removeEventListener('error', errorHandler)\n\t\t\t\t\twebSocket.removeEventListener('message', messageHandler)\n\t\t\t\t\twebSocket.removeEventListener('close', closeHandler)\n\t\t\t\t}\n\n\t\t\t\tconst messageHandler = (event: MessageEvent) => {\n\t\t\t\t\tconst { data } = event\n\t\t\t\t\tconst message =\n\t\t\t\t\t\ttypeof data === 'string' ? event.data : undefined\n\n\t\t\t\t\tlet size: number\n\t\t\t\t\tif (typeof data === 'string') {\n\t\t\t\t\t\tsize = data.length\n\t\t\t\t\t} else if (data instanceof Blob) {\n\t\t\t\t\t\tsize = data.size\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsize = data.byteLength || 0\n\t\t\t\t\t}\n\n\t\t\t\t\twindow._highlightWebSocketEventCallback({\n\t\t\t\t\t\tsocketId,\n\t\t\t\t\t\ttype: 'received',\n\t\t\t\t\t\tname: webSocket.url,\n\t\t\t\t\t\ttimeStamp: performance.timeOrigin + event.timeStamp,\n\t\t\t\t\t\tsize,\n\t\t\t\t\t\tmessage,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tconst errorHandler = (event: Event) => {\n\t\t\t\t\twindow._highlightWebSocketEventCallback({\n\t\t\t\t\t\tsocketId,\n\t\t\t\t\t\ttype: 'error',\n\t\t\t\t\t\tname: webSocket.url,\n\t\t\t\t\t\ttimeStamp: performance.timeOrigin + event.timeStamp,\n\t\t\t\t\t\tsize: 0,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\twebSocket.addEventListener('open', openHandler)\n\t\t\t\twebSocket.addEventListener('error', errorHandler)\n\t\t\t\twebSocket.addEventListener('message', messageHandler)\n\t\t\t\twebSocket.addEventListener('close', closeHandler)\n\n\t\t\t\tconst sendProxy = new Proxy(webSocket.send, {\n\t\t\t\t\tapply: function (\n\t\t\t\t\t\tsendTarget,\n\t\t\t\t\t\tthisArg,\n\t\t\t\t\t\targs: [data: string | Blob | ArrayBuffer],\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst data = args[0]\n\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\ttypeof data === 'string' ? data : undefined\n\n\t\t\t\t\t\tlet size: number\n\t\t\t\t\t\tif (typeof data === 'string') {\n\t\t\t\t\t\t\tsize = data.length\n\t\t\t\t\t\t} else if (data instanceof Blob) {\n\t\t\t\t\t\t\tsize = data.size\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsize = data.byteLength || 0\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\twindow._highlightWebSocketEventCallback({\n\t\t\t\t\t\t\tsocketId,\n\t\t\t\t\t\t\ttype: 'sent',\n\t\t\t\t\t\t\tname: webSocket.url,\n\t\t\t\t\t\t\ttimeStamp:\n\t\t\t\t\t\t\t\tperformance.timeOrigin + performance.now(),\n\t\t\t\t\t\t\tsize,\n\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tsendTarget.apply(thisArg, args)\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\twebSocket.send = sendProxy\n\n\t\t\t\treturn webSocket\n\t\t\t},\n\t\t})\n\n\t\twindow.WebSocket = WebSocketProxy\n\t}\n}\n","/**\n * This is the API reference for the LaunchDarkly Observability and Session Replay SDK for JavaScript.\n *\n * This SDK is intended for use in browser environments.\n *\n * In typical usage, you will use this alongside the launchdarkly SDK while initializing\n * by providing {@link Observe} and {@link Record} plugins.\n *\n * For more information, see the [SDK Reference Guide](https://docs.launchdarkly.com/sdk/observability).\n *\n * @packageDocumentation\n */\nimport type { HighlightClassOptions, RequestResponsePair } from './client'\nimport { GenerateSecureID, Highlight } from './client'\nimport { FirstLoadListeners } from './client/listeners/first-load-listeners'\nimport type {\n\tHighlightOptions,\n\tHighlightPublicInterface,\n\tMetadata,\n\tMetric,\n\tOnHighlightReadyOptions,\n\tSessionDetails,\n} from './client/types/types'\nimport {\n\ttype AmplitudeAPI,\n\tsetupAmplitudeIntegration,\n} from './integrations/amplitude.js'\nimport {\n\ttype MixpanelAPI,\n\tsetupMixpanelIntegration,\n} from './integrations/mixpanel.js'\n\nimport { HIGHLIGHT_URL } from './client/constants/sessions.js'\nimport type { ErrorMessageType, Source } from './client/types/shared-types'\nimport {\n\tgetPreviousSessionData,\n\tloadCookieSessionData,\n} from './client/utils/sessionStorage/highlightSession.js'\nimport { setCookieWriteEnabled } from './client/utils/storage'\nimport { Attributes, Context, Span, SpanOptions } from '@opentelemetry/api'\nimport version from './version.js'\nimport { listenToChromeExtensionMessage } from './browserExtension/extensionListener.js'\nimport configureElectronHighlight from './environments/electron.js'\nimport { HighlightSegmentMiddleware } from './integrations/segment.js'\nimport { initializeFetchListener } from './listeners/fetch'\nimport { initializeWebSocketListener } from './listeners/web-socket'\nimport { ViewportResizeListenerArgs } from './client/listeners/viewport-resize-listener'\nimport { getNoopSpan } from './client/otel/utils.js'\nimport { getTracer } from './client/otel'\nimport {\n\tLaunchDarklyIntegration,\n\tsetupLaunchDarklyIntegration,\n} from './integrations/launchdarkly'\nimport { IntegrationClient } from './integrations'\nimport { sdkLog } from './client/utils/sdkLogger'\n\nenum MetricCategory {\n\tDevice = 'Device',\n\tWebVital = 'WebVital',\n\tFrontend = 'Frontend',\n\tBackend = 'Backend',\n}\n\nconst HighlightWarning = (context: string, msg: any) => {\n\tsdkLog('warn', `highlight.run warning: (${context}): `, msg)\n}\n\ninterface HighlightWindow extends Window {\n\tHighlightIO: new (\n\t\toptions: HighlightClassOptions,\n\t\tfirstLoadListeners: FirstLoadListeners,\n\t) => Highlight\n\tH: HighlightPublicInterface\n\tmixpanel?: MixpanelAPI\n\tamplitude?: AmplitudeAPI\n\tIntercom?: any\n}\ndeclare var window: HighlightWindow\n\nconst READY_WAIT_LOOP_MS = 200\n\nlet onHighlightReadyQueue: {\n\toptions?: OnHighlightReadyOptions\n\tfunc: () => void | Promise<void>\n}[] = []\nlet onHighlightReadyTimeout: ReturnType<typeof setTimeout> | undefined =\n\tundefined\n\nlet highlight_obj: Highlight\nlet first_load_listeners: FirstLoadListeners\nlet integrations: IntegrationClient[] = []\nlet init_called = false\ntype Callback = (span?: Span) => any\n\nconst H: HighlightPublicInterface = {\n\toptions: undefined,\n\tinit: (projectID?: string | number, options?: HighlightOptions) => {\n\t\ttry {\n\t\t\tH.options = options\n\n\t\t\t// Don't run init when called outside of the browser.\n\t\t\tif (\n\t\t\t\ttypeof window === 'undefined' ||\n\t\t\t\ttypeof document === 'undefined'\n\t\t\t) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Don't initialize if an projectID is not set.\n\t\t\tif (!projectID) {\n\t\t\t\tconsole.info(\n\t\t\t\t\t'Highlight is not initializing because projectID was passed undefined.',\n\t\t\t\t)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (options?.sessionCookie) {\n\t\t\t\tloadCookieSessionData()\n\t\t\t} else {\n\t\t\t\tsetCookieWriteEnabled(false)\n\t\t\t}\n\n\t\t\tconst previousSession = getPreviousSessionData()\n\t\t\tlet sessionSecureID = GenerateSecureID()\n\n\t\t\tif (options?.sessionKey) {\n\t\t\t\tsessionSecureID = GenerateSecureID(\n\t\t\t\t\t`${projectID}-${options.sessionKey}`,\n\t\t\t\t)\n\t\t\t} else if (previousSession?.sessionSecureID) {\n\t\t\t\tsessionSecureID = previousSession.sessionSecureID\n\t\t\t}\n\n\t\t\t// `init` was already called, do not reinitialize\n\t\t\tif (init_called) {\n\t\t\t\treturn { sessionSecureID }\n\t\t\t}\n\t\t\tinit_called = true\n\n\t\t\tinitializeFetchListener()\n\t\t\tinitializeWebSocketListener()\n\n\t\t\tconst client_options: HighlightClassOptions = {\n\t\t\t\t...options,\n\t\t\t\torganizationID: projectID,\n\t\t\t\tfirstloadVersion: version,\n\t\t\t\tenvironment: options?.environment || 'production',\n\t\t\t\tappVersion: options?.version,\n\t\t\t\tsessionSecureID,\n\t\t\t}\n\n\t\t\tfirst_load_listeners = new FirstLoadListeners(client_options)\n\t\t\tif (!options?.manualStart) {\n\t\t\t\t// Start some of the listeners before client is loaded, then hand the\n\t\t\t\t// listeners over for client to manage\n\t\t\t\tfirst_load_listeners.startListening()\n\t\t\t}\n\n\t\t\thighlight_obj =\n\t\t\t\thighlight_obj ??\n\t\t\t\tnew Highlight(client_options, first_load_listeners)\n\n\t\t\tif (!options?.manualStart) {\n\t\t\t\thighlight_obj.initialize()\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t!options?.integrations?.mixpanel?.disabled &&\n\t\t\t\toptions?.integrations?.mixpanel?.projectToken\n\t\t\t) {\n\t\t\t\tsetupMixpanelIntegration(options.integrations.mixpanel)\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t!options?.integrations?.amplitude?.disabled &&\n\t\t\t\toptions?.integrations?.amplitude?.apiKey\n\t\t\t) {\n\t\t\t\tsetupAmplitudeIntegration(options.integrations.amplitude)\n\t\t\t}\n\n\t\t\treturn { sessionSecureID }\n\t\t} catch (e) {\n\t\t\tHighlightWarning('init', e)\n\t\t}\n\t},\n\tsnapshot: async (element: HTMLCanvasElement) => {\n\t\ttry {\n\t\t\tif (highlight_obj && highlight_obj.ready) {\n\t\t\t\treturn await highlight_obj.snapshot(element)\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tHighlightWarning('snapshot', e)\n\t\t}\n\t},\n\t/** @deprecated Session feedback is no longer supported. This is a no-op. */\n\taddSessionFeedback: () => {},\n\tconsumeError: (\n\t\terror: Error,\n\t\tmessage?: string,\n\t\tpayload?: { [key: string]: string },\n\t) => {\n\t\ttry {\n\t\t\tH.onHighlightReady(() =>\n\t\t\t\thighlight_obj.consumeCustomError(\n\t\t\t\t\terror,\n\t\t\t\t\tmessage,\n\t\t\t\t\tJSON.stringify(payload),\n\t\t\t\t),\n\t\t\t)\n\t\t} catch (e) {\n\t\t\tHighlightWarning('error', e)\n\t\t}\n\t},\n\tconsume: (\n\t\terror: Error,\n\t\topts: {\n\t\t\tmessage?: string\n\t\t\tpayload?: object\n\t\t\tsource?: string\n\t\t\ttype?: ErrorMessageType\n\t\t},\n\t) => {\n\t\ttry {\n\t\t\tH.onHighlightReady(() => highlight_obj.consumeError(error, opts))\n\t\t} catch (e) {\n\t\t\tHighlightWarning('error', e)\n\t\t}\n\t},\n\terror: (message: string, payload?: { [key: string]: string }) => {\n\t\ttry {\n\t\t\tH.onHighlightReady(() =>\n\t\t\t\thighlight_obj.pushCustomError(message, JSON.stringify(payload)),\n\t\t\t)\n\t\t} catch (e) {\n\t\t\tHighlightWarning('error', e)\n\t\t}\n\t},\n\ttrack: (event: string, metadata: Metadata = {}) => {\n\t\ttry {\n\t\t\tH.onHighlightReady(() => {\n\t\t\t\thighlight_obj.addProperties({ ...metadata, event: event })\n\t\t\t\thighlight_obj.log('H.track', 'INFO', {\n\t\t\t\t\t...(metadata ?? {}),\n\t\t\t\t\tevent,\n\t\t\t\t})\n\t\t\t})\n\t\t\tconst highlightUrl = highlight_obj?.getCurrentSessionURL()\n\n\t\t\tif (!H.options?.integrations?.mixpanel?.disabled) {\n\t\t\t\tif (window.mixpanel?.track) {\n\t\t\t\t\twindow.mixpanel.track(event, {\n\t\t\t\t\t\t...metadata,\n\t\t\t\t\t\thighlightSessionURL: highlightUrl,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!H.options?.integrations?.amplitude?.disabled) {\n\t\t\t\tif (window.amplitude?.getInstance) {\n\t\t\t\t\twindow.amplitude.getInstance().logEvent(event, {\n\t\t\t\t\t\t...metadata,\n\t\t\t\t\t\thighlightSessionURL: highlightUrl,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!H.options?.integrations?.intercom?.disabled) {\n\t\t\t\tif (window.Intercom) {\n\t\t\t\t\twindow.Intercom('trackEvent', event, metadata)\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tHighlightWarning('track', e)\n\t\t}\n\t},\n\tlog: (message: any, level: string, metadata?: Attributes) => {\n\t\ttry {\n\t\t\tH.onHighlightReady(() =>\n\t\t\t\thighlight_obj.log(message, level, metadata ?? {}),\n\t\t\t)\n\t\t} catch (e) {\n\t\t\tHighlightWarning('log', e)\n\t\t}\n\t},\n\tstart: (options) => {\n\t\tif (highlight_obj?.state === 'Recording' && !options?.forceNew) {\n\t\t\tif (!options?.silent) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'Highlight is already recording. Please `H.stop()` the current session before starting a new one.',\n\t\t\t\t)\n\t\t\t}\n\t\t} else {\n\t\t\t// the client replaces its listeners on reset, so start the instance it\n\t\t\t// currently owns rather than the one created at init\n\t\t\tconst listeners =\n\t\t\t\thighlight_obj?._firstLoadListeners ?? first_load_listeners\n\t\t\tlisteners.startListening()\n\t\t\tH.onHighlightReady(\n\t\t\t\tasync () => {\n\t\t\t\t\tawait highlight_obj.initialize(options)\n\t\t\t\t},\n\t\t\t\t{ waitForReady: false },\n\t\t\t)\n\t\t}\n\t},\n\tstop: (options) => {\n\t\tif (highlight_obj?.state !== 'Recording') {\n\t\t\tif (!options?.silent) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'Highlight is already stopped. Please call `H.start()`.',\n\t\t\t\t)\n\t\t\t}\n\t\t} else {\n\t\t\tH.onHighlightReady(() => highlight_obj.stopRecording(true))\n\t\t}\n\t},\n\tidentify: (\n\t\tidentifier: string,\n\t\tmetadata: Metadata = {},\n\t\tsource?: Source,\n\t) => {\n\t\ttry {\n\t\t\tH.onHighlightReady(() =>\n\t\t\t\thighlight_obj.identify(identifier, metadata, source),\n\t\t\t)\n\t\t} catch (e) {\n\t\t\tHighlightWarning('identify', e)\n\t\t}\n\t\tif (!H.options?.integrations?.mixpanel?.disabled) {\n\t\t\tif (window.mixpanel?.identify) {\n\t\t\t\twindow.mixpanel.identify(\n\t\t\t\t\ttypeof metadata?.email === 'string'\n\t\t\t\t\t\t? metadata?.email\n\t\t\t\t\t\t: identifier,\n\t\t\t\t)\n\t\t\t\tif (metadata) {\n\t\t\t\t\twindow.mixpanel.track('identify', metadata)\n\t\t\t\t\twindow.mixpanel.people.set(metadata)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!H.options?.integrations?.amplitude?.disabled) {\n\t\t\tif (window.amplitude?.getInstance) {\n\t\t\t\twindow.amplitude.getInstance().setUserId(identifier)\n\n\t\t\t\tif (Object.keys(metadata).length > 0) {\n\t\t\t\t\tconst amplitudeUserProperties = Object.keys(\n\t\t\t\t\t\tmetadata,\n\t\t\t\t\t).reduce((acc, key) => {\n\t\t\t\t\t\tacc.set(key, metadata[key])\n\n\t\t\t\t\t\treturn acc\n\t\t\t\t\t}, new window.amplitude.Identify())\n\n\t\t\t\t\twindow.amplitude\n\t\t\t\t\t\t.getInstance()\n\t\t\t\t\t\t.identify(amplitudeUserProperties)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tmetrics: (metrics: Metric[]) => {\n\t\ttry {\n\t\t\tfor (const m of metrics) {\n\t\t\t\tH.recordMetric(m)\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tHighlightWarning('metrics', e)\n\t\t}\n\t},\n\trecordMetric: (metric: Metric) => {\n\t\ttry {\n\t\t\tH.onHighlightReady(() => {\n\t\t\t\thighlight_obj.recordGauge({\n\t\t\t\t\t...metric,\n\t\t\t\t\ttags: metric.tags ?? [],\n\t\t\t\t\tgroup: window.location.href,\n\t\t\t\t\tcategory: MetricCategory.Frontend,\n\t\t\t\t})\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tHighlightWarning('recordMetric', e)\n\t\t}\n\t},\n\trecordCount: (metric: Metric) => {\n\t\ttry {\n\t\t\tH.onHighlightReady(() => {\n\t\t\t\thighlight_obj.recordCount(metric)\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tHighlightWarning('recordCount', e)\n\t\t}\n\t},\n\trecordIncr: (metric: Omit<Metric, 'value'>) => {\n\t\ttry {\n\t\t\tH.onHighlightReady(() => {\n\t\t\t\thighlight_obj.recordIncr(metric)\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tHighlightWarning('recordIncr', e)\n\t\t}\n\t},\n\trecordHistogram: (metric: Metric) => {\n\t\ttry {\n\t\t\tH.onHighlightReady(() => {\n\t\t\t\thighlight_obj.recordHistogram(metric)\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tHighlightWarning('recordHistogram', e)\n\t\t}\n\t},\n\trecordUpDownCounter: (metric: Metric) => {\n\t\ttry {\n\t\t\tH.onHighlightReady(() => {\n\t\t\t\thighlight_obj.recordUpDownCounter(metric)\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tHighlightWarning('recordUpDownCounter', e)\n\t\t}\n\t},\n\tstartSpan: (\n\t\tname: string,\n\t\toptions: SpanOptions | ((span?: Span) => any),\n\t\tcontext?: Context | ((span?: Span) => any),\n\t\tfn?: (span?: Span) => any,\n\t): any => {\n\t\tconst tracer = getTracer()\n\t\tif (!tracer) {\n\t\t\tconst noopSpan = getNoopSpan()\n\n\t\t\tif (fn === undefined && context === undefined) {\n\t\t\t\treturn (options as Callback)(noopSpan)\n\t\t\t} else if (fn === undefined) {\n\t\t\t\treturn (context as Callback)(noopSpan)\n\t\t\t} else {\n\t\t\t\treturn fn(noopSpan)\n\t\t\t}\n\t\t}\n\n\t\tconst wrapCallback = (span: Span, callback: (span: Span) => any) => {\n\t\t\tconst result = callback(span)\n\t\t\tif (result instanceof Promise) {\n\t\t\t\treturn result.finally(() => span.end())\n\t\t\t} else {\n\t\t\t\tspan.end()\n\t\t\t\treturn result\n\t\t\t}\n\t\t}\n\n\t\tif (fn === undefined && context === undefined) {\n\t\t\treturn tracer.startActiveSpan(name, (span) =>\n\t\t\t\twrapCallback(span, options as Callback),\n\t\t\t)\n\t\t} else if (fn === undefined) {\n\t\t\treturn tracer.startActiveSpan(\n\t\t\t\tname,\n\t\t\t\toptions as SpanOptions,\n\t\t\t\t(span) => wrapCallback(span, context as Callback),\n\t\t\t)\n\t\t} else {\n\t\t\treturn tracer.startActiveSpan(\n\t\t\t\tname,\n\t\t\t\toptions as SpanOptions,\n\t\t\t\tcontext as Context,\n\t\t\t\t(span) => wrapCallback(span, fn),\n\t\t\t)\n\t\t}\n\t},\n\tstartManualSpan: (\n\t\tname: string,\n\t\toptions: SpanOptions | ((span: Span) => any),\n\t\tcontext?: Context | ((span: Span) => any),\n\t\tfn?: (span: Span) => any,\n\t): any => {\n\t\tconst tracer = getTracer()\n\t\tif (!tracer) {\n\t\t\tconst noopSpan = getNoopSpan()\n\n\t\t\tif (fn === undefined && context === undefined) {\n\t\t\t\treturn (options as Callback)(noopSpan)\n\t\t\t} else if (fn === undefined) {\n\t\t\t\treturn (context as Callback)(noopSpan)\n\t\t\t} else {\n\t\t\t\treturn fn(noopSpan)\n\t\t\t}\n\t\t}\n\n\t\tif (fn === undefined && context === undefined) {\n\t\t\treturn tracer.startActiveSpan(name, options as Callback)\n\t\t} else if (fn === undefined) {\n\t\t\treturn tracer.startActiveSpan(\n\t\t\t\tname,\n\t\t\t\toptions as SpanOptions,\n\t\t\t\tcontext as Callback,\n\t\t\t)\n\t\t} else {\n\t\t\treturn tracer.startActiveSpan(\n\t\t\t\tname,\n\t\t\t\toptions as SpanOptions,\n\t\t\t\tcontext as Context,\n\t\t\t\tfn,\n\t\t\t)\n\t\t}\n\t},\n\tgetSessionURL: () => {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tH.onHighlightReady(() => {\n\t\t\t\tconst secureID = highlight_obj.sessionData.sessionSecureID\n\t\t\t\tconst data = getPreviousSessionData(secureID)\n\n\t\t\t\tif (data) {\n\t\t\t\t\tresolve(\n\t\t\t\t\t\t`https://${HIGHLIGHT_URL}/${data.projectID}/sessions/${secureID}`,\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\treject(new Error(`Unable to get session URL: ${secureID}`))\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t},\n\tgetSessionDetails: () => {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tH.onHighlightReady(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst baseUrl = await H.getSessionURL()\n\t\t\t\t\tif (!baseUrl) {\n\t\t\t\t\t\tthrow new Error('Could not get session URL')\n\t\t\t\t\t}\n\n\t\t\t\t\tconst secureID = highlight_obj.sessionData.sessionSecureID\n\t\t\t\t\tconst sessionData = getPreviousSessionData(secureID)\n\t\t\t\t\tconst currentSessionTimestamp =\n\t\t\t\t\t\tsessionData?.sessionStartTime\n\t\t\t\t\tif (!currentSessionTimestamp) {\n\t\t\t\t\t\tthrow new Error('Could not get session start timestamp')\n\t\t\t\t\t}\n\n\t\t\t\t\tconst now = new Date().getTime()\n\t\t\t\t\tconst url = new URL(baseUrl)\n\t\t\t\t\tconst urlWithTimestamp = new URL(baseUrl)\n\t\t\t\t\turlWithTimestamp.searchParams.set(\n\t\t\t\t\t\t'ts',\n\t\t\t\t\t\t((now - currentSessionTimestamp) / 1000).toString(),\n\t\t\t\t\t)\n\n\t\t\t\t\tresolve({\n\t\t\t\t\t\turl: url.toString(),\n\t\t\t\t\t\turlWithTimestamp: urlWithTimestamp.toString(),\n\t\t\t\t\t\tsessionSecureID: secureID,\n\t\t\t\t\t} as SessionDetails)\n\t\t\t\t} catch (error) {\n\t\t\t\t\treject(error)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t},\n\tgetRecordingState: () => {\n\t\treturn highlight_obj?.state ?? 'NotRecording'\n\t},\n\tonHighlightReady: (func, options) => {\n\t\t// Run the callback immediately if Highlight is already ready\n\t\tif (highlight_obj && highlight_obj.ready) {\n\t\t\tfunc()\n\t\t\treturn\n\t\t}\n\n\t\tonHighlightReadyQueue.push({ options, func })\n\n\t\tif (onHighlightReadyTimeout !== undefined) {\n\t\t\treturn\n\t\t}\n\n\t\tconst processQueue = () => {\n\t\t\tconst newQueue = onHighlightReadyQueue.filter((item) => {\n\t\t\t\tif (\n\t\t\t\t\t!highlight_obj ||\n\t\t\t\t\t(item.options?.waitForReady !== false &&\n\t\t\t\t\t\t!highlight_obj.ready)\n\t\t\t\t) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\n\t\t\t\titem.func()\n\t\t\t\treturn false\n\t\t\t})\n\n\t\t\tonHighlightReadyQueue = newQueue\n\t\t\tonHighlightReadyTimeout = undefined\n\n\t\t\tif (onHighlightReadyQueue.length > 0) {\n\t\t\t\tonHighlightReadyTimeout = setTimeout(\n\t\t\t\t\tprocessQueue,\n\t\t\t\t\tREADY_WAIT_LOOP_MS,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\tprocessQueue()\n\t},\n\tregisterLD(client) {\n\t\t// TODO(vkorolik): can only register one LD client for now\n\t\tif (integrations.length) return\n\t\t// client integration necessary to track events from ErrorListener\n\t\tH.onHighlightReady(() => {\n\t\t\thighlight_obj.registerLD(client)\n\t\t})\n\t\t// firstload integration necessary to immediately capture ld.identify\n\t\tsetupLaunchDarklyIntegration(this, client, H.options)\n\t\tintegrations.push(new LaunchDarklyIntegration(client))\n\t},\n}\n\nif (typeof window !== 'undefined') {\n\twindow.H = H\n}\n\nlistenToChromeExtensionMessage()\ninitializeFetchListener()\ninitializeWebSocketListener()\n\n// Helpers only for testing\nconst __testing = {\n\treset: () => {\n\t\tinit_called = false\n\t\thighlight_obj = undefined as any\n\t\tonHighlightReadyQueue = []\n\t\tonHighlightReadyTimeout = undefined\n\t\tfirst_load_listeners = undefined as any\n\t},\n\tsetHighlightObj: (obj: Partial<Highlight>) => {\n\t\thighlight_obj = obj as Highlight\n\t},\n}\n\nexport {\n\tconfigureElectronHighlight,\n\tGenerateSecureID,\n\tH,\n\tHighlightSegmentMiddleware,\n\tMetricCategory,\n\t__testing,\n}\nexport type {\n\tHighlightOptions,\n\tViewportResizeListenerArgs,\n\tMetadata,\n\tRequestResponsePair,\n}\nexport { Observe } from './plugins/observe'\nexport { LDObserve } from './sdk/LDObserve'\nexport { Record } from './plugins/record'\nexport { LDRecord } from './sdk/LDRecord'\nexport type { ObserveOptions } from './client/types/observe'\nexport type { RecordOptions } from './client/types/record'\n"],"names":["WebSocketListener","requestCallback","eventCallback","urlBlocklist","initialHighlightWebSocketRequestCallback","initialHighlightWebSocketEventCallback","eventData","_a","message","size","visibleEventData","__objRest","redactedEventData","blockedUrl","NetworkListener","xhrCallback","fetchCallback","webSocketRequestCallback","webSocketEventCallback","disableWebSocketRecording","bodyKeysToRedact","highlightEndpoints","tracingOrigins","bodyKeysToRecord","removeXHRListener","XHRListener","removeFetchListener","FetchListener","removeWebSocketListener","FirstLoadListeners","options","__publicField","_b","ALL_CONSOLE_METHODS","highlightThis","ConsoleListener","c","errorValue","stringify","ERRORS_TO_IGNORE","ERROR_PATTERNS_TO_IGNORE","pattern","_c","randomUuidV4","__spreadProps","__spreadValues","defaultLogOptions","ErrorListener","e","shutdown","stop","sThis","_backendUrl","otlpEndpoint","_e","_d","header","_g","_f","bodyKey","_i","_h","url","DEFAULT_URL_BLOCKLIST","_j","_k","key","_l","requestResponsePair","event","recordingStartTime","httpResources","webSocketResources","documentTimeOrigin","offset","r","shouldNetworkRequestBeRecorded","resource","sanitizeOptions","matchPerformanceTimingsWithRequestResponsePair","webSocketEvents","HighlightWarning","context","msg","sdkLog","_Highlight","firstLoadListeners","__privateAdd","_graphqlSDK","GenerateSecureID","Logger","setSdkDebugLogging","setStorageMode","setCookieWriteEnabled","setCookieDomain","HighlightClientWorker","MessageType","storedSessionData","getPreviousSessionData","storageKeyName","SESSION_STORAGE_KEYS","removeItem","_0","__async","forceNew","sessionKey","user_identifier","user_object","getItem","user_object_string","err","getDefaultDataURLOptions","client","GraphQLClient","__privateSet","getSdk","getGraphQLRequestWrapper","_","optionsInternal","source","setItem","integration","level","metadata","createLog","payload","error","obj","type","res","parseError","errorMsg","properties_obj","typeArg","val","sampler","CustomSampler","setupBrowserTracing","_m","_o","_n","_q","_p","_r","_s","_t","setSessionSecureID","setSessionData","clientID","LocalStorageKeys","enableNetworkRecording","_u","destinationDomains","_v","gr","__privateGet","_w","FIRST_SEND_FREQUENCY","getDeviceDetails","getPerformanceMethods","MetricName","MetricCategory","emit","isCheckout","alreadyRecording","maskAllInputs","maskInputOptions","determineMaskInputOptions","record","_x","_y","determineTextPrivacySetting","_src","getRecordSequentialIdPlugin","pa","paEvents","hidden","VISIBILITY_DEBOUNCE_MS","listener","IFRAME_PARENT_READY","IFRAME_PARENT_RESPONSE","iframe","SegmentIntegrationListener","properties","trimmedUserId","PathListener","ViewportResizeListener","viewport","ClickListener","clickTarget","selector","textContent","t","getSimpleSelector","FocusListener","focusTarget","WebVitalsListener","data","name","value","tags","addTag","n","v","a","sanitizeUrl","NetworkPerformanceListener","isMetricSafeNumber","SessionShortcutListener","PerformanceListener","JankListener","visible","PageVisibilityListener","isTabHidden","unloadListener","height","width","availHeight","availWidth","metric","gauge","getMeter","metricInstrumentOptions","b","counter","histogram","up_down_counter","manual","now","projectID","sessionSecureID","relativeTimestamp","HIGHLIGHT_URL","element","_feedback","MAX_SESSION_LENGTH","sendFn","blob","print","PushSessionEventsDocument","SEND_FREQUENCY","tag","intervalId","worker","rrwebAddCustomEvent","resources","events","messages","errors","bytes","time","SNAPSHOT_SETTINGS","payloadId","highlightLogs","getHighlightLogs","sessionPayload","compressedBase64","payloadToBase64","clearHighlightLogs","LaunchDarklyIntegration","Highlight","listenToChromeExtensionMessage","_sender","sendResponse","action","H","configureElectronHighlight","window","HighlightSegmentMiddleware","next","trackEventName","trackEventProperties","identifier","identifyMetadata","initializeFetchListener","input","init","placeholderCallback","initializeWebSocketListener","WebSocketProxy","target","args","socketId","createNetworkRequestId","webSocket","openHandler","closeHandler","errorHandler","messageHandler","sendProxy","sendTarget","thisArg","READY_WAIT_LOOP_MS","onHighlightReadyQueue","onHighlightReadyTimeout","highlight_obj","first_load_listeners","integrations","init_called","loadCookieSessionData","previousSession","client_options","version","setupMixpanelIntegration","setupAmplitudeIntegration","opts","highlightUrl","amplitudeUserProperties","acc","metrics","m","fn","tracer","getTracer","noopSpan","getNoopSpan","wrapCallback","span","callback","result","resolve","reject","secureID","baseUrl","sessionData","currentSessionTimestamp","urlWithTimestamp","func","processQueue","item","setupLaunchDarklyIntegration","__testing"],"mappings":"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"}
|