@openreplay/tracker 14.0.12 → 14.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.js +11 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/main/app/index.d.ts +1 -0
- package/dist/cjs/main/app/observer/iframe_observer.d.ts +0 -1
- package/dist/lib/index.js +65 -46
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/main/app/index.d.ts +1 -0
- package/dist/lib/main/app/observer/iframe_observer.d.ts +0 -1
- package/package.json +3 -4
package/dist/cjs/index.js
CHANGED
|
@@ -57,6 +57,14 @@ function processOptions(obj) {
|
|
|
57
57
|
}
|
|
58
58
|
return true;
|
|
59
59
|
}
|
|
60
|
+
const canAccessTop = () => {
|
|
61
|
+
try {
|
|
62
|
+
return Boolean(window.top);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
60
68
|
class API {
|
|
61
69
|
constructor(options) {
|
|
62
70
|
this.options = options;
|
|
@@ -74,7 +82,7 @@ class API {
|
|
|
74
82
|
const orig = this.options.ingestPoint || index_js_1.DEFAULT_INGEST_POINT;
|
|
75
83
|
req.open('POST', orig + '/v1/web/not-started');
|
|
76
84
|
req.send(JSON.stringify({
|
|
77
|
-
trackerVersion: '14.0.
|
|
85
|
+
trackerVersion: '14.0.14',
|
|
78
86
|
projectKey: this.options.projectKey,
|
|
79
87
|
doNotTrack,
|
|
80
88
|
reason: missingApi.length ? `missing api: ${missingApi.join(',')}` : reason,
|
|
@@ -104,10 +112,11 @@ class API {
|
|
|
104
112
|
};
|
|
105
113
|
this.crossdomainMode = Boolean((0, utils_js_1.inIframe)() && options.crossdomain?.enabled);
|
|
106
114
|
if (!utils_js_1.IN_BROWSER || !processOptions(options)) {
|
|
115
|
+
console.error('OpenReplay: tracker called in a non-browser environment or with invalid options');
|
|
107
116
|
return;
|
|
108
117
|
}
|
|
109
118
|
if (window.__OPENREPLAY__ ||
|
|
110
|
-
(!this.crossdomainMode && (0, utils_js_1.inIframe)() && window.top?.__OPENREPLAY__)) {
|
|
119
|
+
(!this.crossdomainMode && (0, utils_js_1.inIframe)() && canAccessTop() && window.top?.__OPENREPLAY__)) {
|
|
111
120
|
console.error('OpenReplay: one tracker instance has been initialised already');
|
|
112
121
|
return;
|
|
113
122
|
}
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/main/index.ts"],"sourcesContent":["import App, { DEFAULT_INGEST_POINT } from './app/index.js'\n\nexport { default as App } from './app/index.js'\n\nimport { UserAnonymousID, CustomEvent, CustomIssue } from './app/messages.gen.js'\nimport * as _Messages from './app/messages.gen.js'\n\nexport const Messages = _Messages\nexport { SanitizeLevel } from './app/sanitizer.js'\n\nimport Connection from './modules/connection.js'\nimport Console from './modules/console.js'\nimport Exception, {\n getExceptionMessageFromEvent,\n getExceptionMessage,\n} from './modules/exception.js'\nimport Img from './modules/img.js'\nimport Input from './modules/input.js'\nimport Mouse from './modules/mouse.js'\nimport Timing from './modules/timing.js'\nimport Performance from './modules/performance.js'\nimport Scroll from './modules/scroll.js'\nimport Viewport from './modules/viewport.js'\nimport CSSRules from './modules/cssrules.js'\nimport Focus from './modules/focus.js'\nimport Fonts from './modules/fonts.js'\nimport Network from './modules/network.js'\nimport ConstructedStyleSheets from './modules/constructedStyleSheets.js'\nimport Selection from './modules/selection.js'\nimport Tabs from './modules/tabs.js'\n\nimport { IN_BROWSER, deprecationWarn, DOCS_HOST, inIframe } from './utils.js'\nimport FeatureFlags, { IFeatureFlag } from './modules/featureFlags.js'\nimport type { Options as AppOptions } from './app/index.js'\nimport type { Options as ConsoleOptions } from './modules/console.js'\nimport type { Options as ExceptionOptions } from './modules/exception.js'\nimport type { Options as InputOptions } from './modules/input.js'\nimport type { Options as PerformanceOptions } from './modules/performance.js'\nimport type { Options as TimingOptions } from './modules/timing.js'\nimport type { Options as NetworkOptions } from './modules/network.js'\nimport type { MouseHandlerOptions } from './modules/mouse.js'\nimport type { SessionInfo } from './app/session.js'\n\nimport type { StartOptions } from './app/index.js'\n//TODO: unique options init\nimport type { StartPromiseReturn } from './app/index.js'\n\nexport type Options = Partial<\n AppOptions & ConsoleOptions & ExceptionOptions & InputOptions & PerformanceOptions & TimingOptions\n> & {\n projectID?: number // For the back compatibility only (deprecated)\n projectKey: string\n sessionToken?: string\n respectDoNotTrack?: boolean\n autoResetOnWindowOpen?: boolean\n resetTabOnWindowOpen?: boolean\n network?: Partial<NetworkOptions>\n mouse?: Partial<MouseHandlerOptions>\n flags?: {\n onFlagsLoad?: (flags: IFeatureFlag[]) => void\n }\n // dev only\n __DISABLE_SECURE_MODE?: boolean\n}\n\nconst DOCS_SETUP = '/installation/javascript-sdk'\n\nfunction processOptions(obj: any): obj is Options {\n if (obj == null) {\n console.error(\n `OpenReplay: invalid options argument type. Please, check documentation on ${DOCS_HOST}${DOCS_SETUP}`,\n )\n return false\n }\n if (typeof obj.projectKey !== 'string') {\n if (typeof obj.projectKey !== 'number') {\n if (typeof obj.projectID !== 'number') {\n // Back compatability\n console.error(\n `OpenReplay: projectKey is missing or wrong type (string is expected). Please, check ${DOCS_HOST}${DOCS_SETUP} for more information.`,\n )\n return false\n } else {\n obj.projectKey = obj.projectID.toString()\n deprecationWarn('`projectID` option', '`projectKey` option', DOCS_SETUP)\n }\n } else {\n console.warn('OpenReplay: projectKey is expected to have a string type.')\n obj.projectKey = obj.projectKey.toString()\n }\n }\n if (obj.sessionToken != null) {\n deprecationWarn('`sessionToken` option', '`sessionHash` start() option', '/')\n }\n return true\n}\n\nexport default class API {\n public featureFlags: FeatureFlags\n\n private readonly app: App | null = null\n private readonly crossdomainMode: boolean = false\n\n constructor(private readonly options: Options) {\n this.crossdomainMode = Boolean(inIframe() && options.crossdomain?.enabled)\n if (!IN_BROWSER || !processOptions(options)) {\n return\n }\n if (\n (window as any).__OPENREPLAY__ ||\n (!this.crossdomainMode && inIframe() && (window.top as any)?.__OPENREPLAY__)\n ) {\n console.error('OpenReplay: one tracker instance has been initialised already')\n return\n }\n if (!options.__DISABLE_SECURE_MODE && location.protocol !== 'https:') {\n console.error(\n 'OpenReplay: Your website must be publicly accessible and running on SSL in order for OpenReplay to properly capture and replay the user session. You can disable this check by setting `__DISABLE_SECURE_MODE` option to `true` if you are testing in localhost. Keep in mind, that asset files on a local machine are not available to the outside world. This might affect tracking if you use css files.',\n )\n return\n }\n const doNotTrack = this.checkDoNotTrack()\n const failReason: string[] = []\n const conditions: string[] = [\n 'Map',\n 'Set',\n 'MutationObserver',\n 'performance',\n 'timing',\n 'startsWith',\n 'Blob',\n 'Worker',\n ]\n\n if (doNotTrack) {\n failReason.push('doNotTrack')\n } else {\n for (const condition of conditions) {\n if (condition === 'timing') {\n if ('performance' in window && !(condition in performance)) {\n failReason.push(condition)\n break\n }\n } else if (condition === 'startsWith') {\n if (!(condition in String.prototype)) {\n failReason.push(condition)\n break\n }\n } else {\n if (!(condition in window)) {\n failReason.push(condition)\n break\n }\n }\n }\n }\n if (failReason.length > 0) {\n const missingApi = failReason.join(',')\n console.error(\n `OpenReplay: browser doesn't support API required for tracking or doNotTrack is set to 1. Reason: ${missingApi}`,\n )\n this.signalStartIssue('missing_api', failReason)\n return\n }\n\n const app = new App(\n options.projectKey,\n options.sessionToken,\n options,\n this.signalStartIssue,\n this.crossdomainMode,\n )\n this.app = app\n if (!this.crossdomainMode) {\n // no need to send iframe viewport data since its a node for us\n Viewport(app)\n // calculated in main window\n Connection(app)\n // while we can calculate it here, trying to compute it for all parts is hard\n Performance(app, options)\n // no tabs in iframes yet\n Tabs(app)\n }\n Mouse(app, options.mouse)\n // inside iframe, we ignore viewport scroll\n Scroll(app, this.crossdomainMode)\n CSSRules(app)\n ConstructedStyleSheets(app)\n Console(app, options)\n Exception(app, options)\n Img(app)\n Input(app, options)\n Timing(app, options)\n Focus(app)\n Fonts(app)\n Network(app, options.network)\n Selection(app)\n ;(window as any).__OPENREPLAY__ = this\n\n if (options.flags && options.flags.onFlagsLoad) {\n this.onFlagsLoad(options.flags.onFlagsLoad)\n }\n const wOpen = window.open\n if (options.autoResetOnWindowOpen || options.resetTabOnWindowOpen) {\n app.attachStartCallback(() => {\n const tabId = app.getTabId()\n const sessStorage = app.sessionStorage ?? window.sessionStorage\n window.open = function (...args) {\n if (options.autoResetOnWindowOpen) {\n app.resetNextPageSession(true)\n }\n if (options.resetTabOnWindowOpen) {\n sessStorage.removeItem(options.session_tabid_key || '__openreplay_tabid')\n }\n app.resetNextPageSession(false)\n sessStorage.setItem(options.session_tabid_key || '__openreplay_tabid', tabId)\n return wOpen.call(window, ...args)\n }\n })\n app.attachStopCallback(() => {\n window.open = wOpen\n })\n }\n }\n\n checkDoNotTrack = () => {\n return (\n this.options.respectDoNotTrack &&\n (navigator.doNotTrack == '1' ||\n // @ts-ignore\n window.doNotTrack == '1')\n )\n }\n\n signalStartIssue = (reason: string, missingApi: string[]) => {\n const doNotTrack = this.checkDoNotTrack()\n const req = new XMLHttpRequest()\n const orig = this.options.ingestPoint || DEFAULT_INGEST_POINT\n req.open('POST', orig + '/v1/web/not-started')\n req.send(\n JSON.stringify({\n trackerVersion: 'TRACKER_VERSION',\n projectKey: this.options.projectKey,\n doNotTrack,\n reason: missingApi.length ? `missing api: ${missingApi.join(',')}` : reason,\n }),\n )\n }\n\n isFlagEnabled(flagName: string): boolean {\n return this.featureFlags.isFlagEnabled(flagName)\n }\n\n onFlagsLoad(callback: (flags: IFeatureFlag[]) => void): void {\n this.app?.featureFlags.onFlagsLoad(callback)\n }\n\n clearPersistFlags() {\n this.app?.featureFlags.clearPersistFlags()\n }\n\n reloadFlags() {\n return this.app?.featureFlags.reloadFlags()\n }\n\n getFeatureFlag(flagName: string): IFeatureFlag | undefined {\n return this.app?.featureFlags.getFeatureFlag(flagName)\n }\n\n getAllFeatureFlags() {\n return this.app?.featureFlags.flags\n }\n\n public restartCanvasTracking = () => {\n if (this.app === null) {\n return\n }\n this.app.restartCanvasTracking()\n }\n\n use<T>(fn: (app: App | null, options?: Options) => T): T {\n return fn(this.app, this.options)\n }\n\n isActive(): boolean {\n if (this.app === null) {\n return false\n }\n return this.app.active()\n }\n\n /**\n * Creates a named hook that expects event name, data string and msg direction (up/down),\n * it will skip any message bigger than 5 mb or event name bigger than 255 symbols\n * msg direction is \"down\" (incoming) by default\n *\n * @returns {(msgType: string, data: string, dir: 'up' | 'down') => void}\n * */\n trackWs(channelName: string) {\n if (this.app === null) {\n return\n }\n return this.app.trackWs(channelName)\n }\n\n start(startOpts?: Partial<StartOptions>): Promise<StartPromiseReturn> {\n if (this.browserEnvCheck()) {\n if (this.app === null) {\n return Promise.reject(\"Browser doesn't support required api, or doNotTrack is active.\")\n }\n return this.app.start(startOpts)\n } else {\n return Promise.reject('Trying to start not in browser.')\n }\n }\n\n browserEnvCheck() {\n if (!IN_BROWSER) {\n console.error(\n `OpenReplay: you are trying to start Tracker on a node.js environment. If you want to use OpenReplay with SSR, please, use componentDidMount or useEffect API for placing the \\`tracker.start()\\` line. Check documentation on ${DOCS_HOST}${DOCS_SETUP}`,\n )\n return false\n }\n return true\n }\n\n /**\n * start buffering messages without starting the actual session, which gives user 30 seconds to \"activate\" and record\n * session by calling start() on conditional trigger and we will then send buffered batch, so it won't get lost\n * */\n coldStart(startOpts?: Partial<StartOptions>, conditional?: boolean) {\n if (this.browserEnvCheck()) {\n if (this.app === null) {\n return Promise.reject('Tracker not initialized')\n }\n void this.app.coldStart(startOpts, conditional)\n } else {\n return Promise.reject('Trying to start not in browser.')\n }\n }\n\n /**\n * Starts offline session recording. Keep in mind that only user device time will be used for timestamps.\n * (no backend delay sync)\n *\n * @param {Object} startOpts - options for session start, same as .start()\n * @param {Function} onSessionSent - callback that will be called once session is fully sent\n * @returns methods to manipulate buffer:\n *\n * saveBuffer - to save it in localStorage\n *\n * getBuffer - returns current buffer\n *\n * setBuffer - replaces current buffer with given\n * */\n startOfflineRecording(startOpts: Partial<StartOptions>, onSessionSent: () => void) {\n if (this.browserEnvCheck()) {\n if (this.app === null) {\n return Promise.reject('Tracker not initialized')\n }\n return this.app.offlineRecording(startOpts, onSessionSent)\n } else {\n return Promise.reject('Trying to start not in browser.')\n }\n }\n\n /**\n * Uploads the stored session buffer to backend\n * @returns promise that resolves once messages are loaded, it has to be awaited\n * so the session can be uploaded properly\n * @resolve - if messages were loaded into service worker successfully\n * @reject {string} - error message\n * */\n uploadOfflineRecording() {\n if (this.app === null) {\n return\n }\n return this.app.uploadOfflineRecording()\n }\n\n stop(): string | undefined {\n if (this.app === null) {\n return\n }\n this.app.stop()\n return this.app.session.getSessionHash()\n }\n\n forceFlushBatch() {\n if (this.app === null) {\n return\n }\n this.app.forceFlushBatch()\n }\n\n getSessionToken(): string | null | undefined {\n if (this.app === null) {\n return null\n }\n return this.app.getSessionToken()\n }\n\n getSessionInfo(): SessionInfo | null {\n if (this.app === null) {\n return null\n }\n return this.app.session.getInfo()\n }\n\n getSessionID(): string | null | undefined {\n if (this.app === null) {\n return null\n }\n return this.app.getSessionID()\n }\n\n getTabId() {\n if (this.app === null) {\n return null\n }\n return this.app.getTabId()\n }\n\n getUxId() {\n if (this.app === null) {\n return null\n }\n return this.app.getUxtId()\n }\n\n sessionID(): string | null | undefined {\n deprecationWarn(\"'sessionID' method\", \"'getSessionID' method\", '/')\n return this.getSessionID()\n }\n\n getSessionURL(options?: { withCurrentTime?: boolean }): string | undefined {\n if (this.app === null) {\n return undefined\n }\n return this.app.getSessionURL(options)\n }\n\n setUserID(id: string): void {\n if (typeof id === 'string' && this.app !== null) {\n this.app.session.setUserID(id)\n }\n }\n\n userID(id: string): void {\n deprecationWarn(\"'userID' method\", \"'setUserID' method\", '/')\n this.setUserID(id)\n }\n\n setUserAnonymousID(id: string): void {\n if (typeof id === 'string' && this.app !== null) {\n this.app.send(UserAnonymousID(id))\n }\n }\n\n userAnonymousID(id: string): void {\n deprecationWarn(\"'userAnonymousID' method\", \"'setUserAnonymousID' method\", '/')\n this.setUserAnonymousID(id)\n }\n\n setMetadata(key: string, value: string): void {\n if (typeof key === 'string' && typeof value === 'string' && this.app !== null) {\n this.app.session.setMetadata(key, value)\n }\n }\n\n metadata(key: string, value: string): void {\n deprecationWarn(\"'metadata' method\", \"'setMetadata' method\", '/')\n this.setMetadata(key, value)\n }\n\n event(key: string, payload: any = null, issue = false): void {\n if (typeof key === 'string' && this.app !== null) {\n if (issue) {\n return this.issue(key, payload)\n } else {\n try {\n payload = JSON.stringify(payload)\n } catch (e) {\n return\n }\n this.app.send(CustomEvent(key, payload))\n }\n }\n }\n\n issue(key: string, payload: any = null): void {\n if (typeof key === 'string' && this.app !== null) {\n try {\n payload = JSON.stringify(payload)\n } catch (e) {\n return\n }\n this.app.send(CustomIssue(key, payload))\n }\n }\n\n handleError = (\n e: Error | ErrorEvent | PromiseRejectionEvent,\n metadata: Record<string, any> = {},\n ) => {\n if (this.app === null) {\n return\n }\n if (e instanceof Error) {\n const msg = getExceptionMessage(e, [], metadata)\n this.app.send(msg)\n } else if (\n e instanceof ErrorEvent ||\n ('PromiseRejectionEvent' in window && e instanceof PromiseRejectionEvent)\n ) {\n const msg = getExceptionMessageFromEvent(e, undefined, metadata)\n if (msg != null) {\n this.app.send(msg)\n }\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/main/index.ts"],"sourcesContent":["import App, { DEFAULT_INGEST_POINT } from './app/index.js'\n\nexport { default as App } from './app/index.js'\n\nimport { UserAnonymousID, CustomEvent, CustomIssue } from './app/messages.gen.js'\nimport * as _Messages from './app/messages.gen.js'\n\nexport const Messages = _Messages\nexport { SanitizeLevel } from './app/sanitizer.js'\n\nimport Connection from './modules/connection.js'\nimport Console from './modules/console.js'\nimport Exception, {\n getExceptionMessageFromEvent,\n getExceptionMessage,\n} from './modules/exception.js'\nimport Img from './modules/img.js'\nimport Input from './modules/input.js'\nimport Mouse from './modules/mouse.js'\nimport Timing from './modules/timing.js'\nimport Performance from './modules/performance.js'\nimport Scroll from './modules/scroll.js'\nimport Viewport from './modules/viewport.js'\nimport CSSRules from './modules/cssrules.js'\nimport Focus from './modules/focus.js'\nimport Fonts from './modules/fonts.js'\nimport Network from './modules/network.js'\nimport ConstructedStyleSheets from './modules/constructedStyleSheets.js'\nimport Selection from './modules/selection.js'\nimport Tabs from './modules/tabs.js'\n\nimport { IN_BROWSER, deprecationWarn, DOCS_HOST, inIframe } from './utils.js'\nimport FeatureFlags, { IFeatureFlag } from './modules/featureFlags.js'\nimport type { Options as AppOptions } from './app/index.js'\nimport type { Options as ConsoleOptions } from './modules/console.js'\nimport type { Options as ExceptionOptions } from './modules/exception.js'\nimport type { Options as InputOptions } from './modules/input.js'\nimport type { Options as PerformanceOptions } from './modules/performance.js'\nimport type { Options as TimingOptions } from './modules/timing.js'\nimport type { Options as NetworkOptions } from './modules/network.js'\nimport type { MouseHandlerOptions } from './modules/mouse.js'\nimport type { SessionInfo } from './app/session.js'\n\nimport type { StartOptions } from './app/index.js'\n//TODO: unique options init\nimport type { StartPromiseReturn } from './app/index.js'\n\nexport type Options = Partial<\n AppOptions & ConsoleOptions & ExceptionOptions & InputOptions & PerformanceOptions & TimingOptions\n> & {\n projectID?: number // For the back compatibility only (deprecated)\n projectKey: string\n sessionToken?: string\n respectDoNotTrack?: boolean\n autoResetOnWindowOpen?: boolean\n resetTabOnWindowOpen?: boolean\n network?: Partial<NetworkOptions>\n mouse?: Partial<MouseHandlerOptions>\n flags?: {\n onFlagsLoad?: (flags: IFeatureFlag[]) => void\n }\n // dev only\n __DISABLE_SECURE_MODE?: boolean\n}\n\nconst DOCS_SETUP = '/installation/javascript-sdk'\n\nfunction processOptions(obj: any): obj is Options {\n if (obj == null) {\n console.error(\n `OpenReplay: invalid options argument type. Please, check documentation on ${DOCS_HOST}${DOCS_SETUP}`,\n )\n return false\n }\n if (typeof obj.projectKey !== 'string') {\n if (typeof obj.projectKey !== 'number') {\n if (typeof obj.projectID !== 'number') {\n // Back compatability\n console.error(\n `OpenReplay: projectKey is missing or wrong type (string is expected). Please, check ${DOCS_HOST}${DOCS_SETUP} for more information.`,\n )\n return false\n } else {\n obj.projectKey = obj.projectID.toString()\n deprecationWarn('`projectID` option', '`projectKey` option', DOCS_SETUP)\n }\n } else {\n console.warn('OpenReplay: projectKey is expected to have a string type.')\n obj.projectKey = obj.projectKey.toString()\n }\n }\n if (obj.sessionToken != null) {\n deprecationWarn('`sessionToken` option', '`sessionHash` start() option', '/')\n }\n return true\n}\n\nconst canAccessTop = () => {\n try {\n return Boolean(window.top)\n } catch {\n return false\n }\n}\n\nexport default class API {\n public featureFlags: FeatureFlags\n\n private readonly app: App | null = null\n private readonly crossdomainMode: boolean = false\n\n constructor(private readonly options: Options) {\n this.crossdomainMode = Boolean(inIframe() && options.crossdomain?.enabled)\n if (!IN_BROWSER || !processOptions(options)) {\n console.error('OpenReplay: tracker called in a non-browser environment or with invalid options')\n return\n }\n if (\n (window as any).__OPENREPLAY__ ||\n (!this.crossdomainMode && inIframe() && canAccessTop() && (window.top as any)?.__OPENREPLAY__)\n ) {\n console.error('OpenReplay: one tracker instance has been initialised already')\n return\n }\n if (!options.__DISABLE_SECURE_MODE && location.protocol !== 'https:') {\n console.error(\n 'OpenReplay: Your website must be publicly accessible and running on SSL in order for OpenReplay to properly capture and replay the user session. You can disable this check by setting `__DISABLE_SECURE_MODE` option to `true` if you are testing in localhost. Keep in mind, that asset files on a local machine are not available to the outside world. This might affect tracking if you use css files.',\n )\n return\n }\n const doNotTrack = this.checkDoNotTrack()\n const failReason: string[] = []\n const conditions: string[] = [\n 'Map',\n 'Set',\n 'MutationObserver',\n 'performance',\n 'timing',\n 'startsWith',\n 'Blob',\n 'Worker',\n ]\n\n if (doNotTrack) {\n failReason.push('doNotTrack')\n } else {\n for (const condition of conditions) {\n if (condition === 'timing') {\n if ('performance' in window && !(condition in performance)) {\n failReason.push(condition)\n break\n }\n } else if (condition === 'startsWith') {\n if (!(condition in String.prototype)) {\n failReason.push(condition)\n break\n }\n } else {\n if (!(condition in window)) {\n failReason.push(condition)\n break\n }\n }\n }\n }\n if (failReason.length > 0) {\n const missingApi = failReason.join(',')\n console.error(\n `OpenReplay: browser doesn't support API required for tracking or doNotTrack is set to 1. Reason: ${missingApi}`,\n )\n this.signalStartIssue('missing_api', failReason)\n return\n }\n\n const app = new App(\n options.projectKey,\n options.sessionToken,\n options,\n this.signalStartIssue,\n this.crossdomainMode,\n )\n this.app = app\n if (!this.crossdomainMode) {\n // no need to send iframe viewport data since its a node for us\n Viewport(app)\n // calculated in main window\n Connection(app)\n // while we can calculate it here, trying to compute it for all parts is hard\n Performance(app, options)\n // no tabs in iframes yet\n Tabs(app)\n }\n Mouse(app, options.mouse)\n // inside iframe, we ignore viewport scroll\n Scroll(app, this.crossdomainMode)\n CSSRules(app)\n ConstructedStyleSheets(app)\n Console(app, options)\n Exception(app, options)\n Img(app)\n Input(app, options)\n Timing(app, options)\n Focus(app)\n Fonts(app)\n Network(app, options.network)\n Selection(app)\n ;(window as any).__OPENREPLAY__ = this\n\n if (options.flags && options.flags.onFlagsLoad) {\n this.onFlagsLoad(options.flags.onFlagsLoad)\n }\n const wOpen = window.open\n if (options.autoResetOnWindowOpen || options.resetTabOnWindowOpen) {\n app.attachStartCallback(() => {\n const tabId = app.getTabId()\n const sessStorage = app.sessionStorage ?? window.sessionStorage\n window.open = function (...args) {\n if (options.autoResetOnWindowOpen) {\n app.resetNextPageSession(true)\n }\n if (options.resetTabOnWindowOpen) {\n sessStorage.removeItem(options.session_tabid_key || '__openreplay_tabid')\n }\n app.resetNextPageSession(false)\n sessStorage.setItem(options.session_tabid_key || '__openreplay_tabid', tabId)\n return wOpen.call(window, ...args)\n }\n })\n app.attachStopCallback(() => {\n window.open = wOpen\n })\n }\n }\n\n checkDoNotTrack = () => {\n return (\n this.options.respectDoNotTrack &&\n (navigator.doNotTrack == '1' ||\n // @ts-ignore\n window.doNotTrack == '1')\n )\n }\n\n signalStartIssue = (reason: string, missingApi: string[]) => {\n const doNotTrack = this.checkDoNotTrack()\n const req = new XMLHttpRequest()\n const orig = this.options.ingestPoint || DEFAULT_INGEST_POINT\n req.open('POST', orig + '/v1/web/not-started')\n req.send(\n JSON.stringify({\n trackerVersion: 'TRACKER_VERSION',\n projectKey: this.options.projectKey,\n doNotTrack,\n reason: missingApi.length ? `missing api: ${missingApi.join(',')}` : reason,\n }),\n )\n }\n\n isFlagEnabled(flagName: string): boolean {\n return this.featureFlags.isFlagEnabled(flagName)\n }\n\n onFlagsLoad(callback: (flags: IFeatureFlag[]) => void): void {\n this.app?.featureFlags.onFlagsLoad(callback)\n }\n\n clearPersistFlags() {\n this.app?.featureFlags.clearPersistFlags()\n }\n\n reloadFlags() {\n return this.app?.featureFlags.reloadFlags()\n }\n\n getFeatureFlag(flagName: string): IFeatureFlag | undefined {\n return this.app?.featureFlags.getFeatureFlag(flagName)\n }\n\n getAllFeatureFlags() {\n return this.app?.featureFlags.flags\n }\n\n public restartCanvasTracking = () => {\n if (this.app === null) {\n return\n }\n this.app.restartCanvasTracking()\n }\n\n use<T>(fn: (app: App | null, options?: Options) => T): T {\n return fn(this.app, this.options)\n }\n\n isActive(): boolean {\n if (this.app === null) {\n return false\n }\n return this.app.active()\n }\n\n /**\n * Creates a named hook that expects event name, data string and msg direction (up/down),\n * it will skip any message bigger than 5 mb or event name bigger than 255 symbols\n * msg direction is \"down\" (incoming) by default\n *\n * @returns {(msgType: string, data: string, dir: 'up' | 'down') => void}\n * */\n trackWs(channelName: string) {\n if (this.app === null) {\n return\n }\n return this.app.trackWs(channelName)\n }\n\n start(startOpts?: Partial<StartOptions>): Promise<StartPromiseReturn> {\n if (this.browserEnvCheck()) {\n if (this.app === null) {\n return Promise.reject(\"Browser doesn't support required api, or doNotTrack is active.\")\n }\n return this.app.start(startOpts)\n } else {\n return Promise.reject('Trying to start not in browser.')\n }\n }\n\n browserEnvCheck() {\n if (!IN_BROWSER) {\n console.error(\n `OpenReplay: you are trying to start Tracker on a node.js environment. If you want to use OpenReplay with SSR, please, use componentDidMount or useEffect API for placing the \\`tracker.start()\\` line. Check documentation on ${DOCS_HOST}${DOCS_SETUP}`,\n )\n return false\n }\n return true\n }\n\n /**\n * start buffering messages without starting the actual session, which gives user 30 seconds to \"activate\" and record\n * session by calling start() on conditional trigger and we will then send buffered batch, so it won't get lost\n * */\n coldStart(startOpts?: Partial<StartOptions>, conditional?: boolean) {\n if (this.browserEnvCheck()) {\n if (this.app === null) {\n return Promise.reject('Tracker not initialized')\n }\n void this.app.coldStart(startOpts, conditional)\n } else {\n return Promise.reject('Trying to start not in browser.')\n }\n }\n\n /**\n * Starts offline session recording. Keep in mind that only user device time will be used for timestamps.\n * (no backend delay sync)\n *\n * @param {Object} startOpts - options for session start, same as .start()\n * @param {Function} onSessionSent - callback that will be called once session is fully sent\n * @returns methods to manipulate buffer:\n *\n * saveBuffer - to save it in localStorage\n *\n * getBuffer - returns current buffer\n *\n * setBuffer - replaces current buffer with given\n * */\n startOfflineRecording(startOpts: Partial<StartOptions>, onSessionSent: () => void) {\n if (this.browserEnvCheck()) {\n if (this.app === null) {\n return Promise.reject('Tracker not initialized')\n }\n return this.app.offlineRecording(startOpts, onSessionSent)\n } else {\n return Promise.reject('Trying to start not in browser.')\n }\n }\n\n /**\n * Uploads the stored session buffer to backend\n * @returns promise that resolves once messages are loaded, it has to be awaited\n * so the session can be uploaded properly\n * @resolve - if messages were loaded into service worker successfully\n * @reject {string} - error message\n * */\n uploadOfflineRecording() {\n if (this.app === null) {\n return\n }\n return this.app.uploadOfflineRecording()\n }\n\n stop(): string | undefined {\n if (this.app === null) {\n return\n }\n this.app.stop()\n return this.app.session.getSessionHash()\n }\n\n forceFlushBatch() {\n if (this.app === null) {\n return\n }\n this.app.forceFlushBatch()\n }\n\n getSessionToken(): string | null | undefined {\n if (this.app === null) {\n return null\n }\n return this.app.getSessionToken()\n }\n\n getSessionInfo(): SessionInfo | null {\n if (this.app === null) {\n return null\n }\n return this.app.session.getInfo()\n }\n\n getSessionID(): string | null | undefined {\n if (this.app === null) {\n return null\n }\n return this.app.getSessionID()\n }\n\n getTabId() {\n if (this.app === null) {\n return null\n }\n return this.app.getTabId()\n }\n\n getUxId() {\n if (this.app === null) {\n return null\n }\n return this.app.getUxtId()\n }\n\n sessionID(): string | null | undefined {\n deprecationWarn(\"'sessionID' method\", \"'getSessionID' method\", '/')\n return this.getSessionID()\n }\n\n getSessionURL(options?: { withCurrentTime?: boolean }): string | undefined {\n if (this.app === null) {\n return undefined\n }\n return this.app.getSessionURL(options)\n }\n\n setUserID(id: string): void {\n if (typeof id === 'string' && this.app !== null) {\n this.app.session.setUserID(id)\n }\n }\n\n userID(id: string): void {\n deprecationWarn(\"'userID' method\", \"'setUserID' method\", '/')\n this.setUserID(id)\n }\n\n setUserAnonymousID(id: string): void {\n if (typeof id === 'string' && this.app !== null) {\n this.app.send(UserAnonymousID(id))\n }\n }\n\n userAnonymousID(id: string): void {\n deprecationWarn(\"'userAnonymousID' method\", \"'setUserAnonymousID' method\", '/')\n this.setUserAnonymousID(id)\n }\n\n setMetadata(key: string, value: string): void {\n if (typeof key === 'string' && typeof value === 'string' && this.app !== null) {\n this.app.session.setMetadata(key, value)\n }\n }\n\n metadata(key: string, value: string): void {\n deprecationWarn(\"'metadata' method\", \"'setMetadata' method\", '/')\n this.setMetadata(key, value)\n }\n\n event(key: string, payload: any = null, issue = false): void {\n if (typeof key === 'string' && this.app !== null) {\n if (issue) {\n return this.issue(key, payload)\n } else {\n try {\n payload = JSON.stringify(payload)\n } catch (e) {\n return\n }\n this.app.send(CustomEvent(key, payload))\n }\n }\n }\n\n issue(key: string, payload: any = null): void {\n if (typeof key === 'string' && this.app !== null) {\n try {\n payload = JSON.stringify(payload)\n } catch (e) {\n return\n }\n this.app.send(CustomIssue(key, payload))\n }\n }\n\n handleError = (\n e: Error | ErrorEvent | PromiseRejectionEvent,\n metadata: Record<string, any> = {},\n ) => {\n if (this.app === null) {\n return\n }\n if (e instanceof Error) {\n const msg = getExceptionMessage(e, [], metadata)\n this.app.send(msg)\n } else if (\n e instanceof ErrorEvent ||\n ('PromiseRejectionEvent' in window && e instanceof PromiseRejectionEvent)\n ) {\n const msg = getExceptionMessageFromEvent(e, undefined, metadata)\n if (msg != null) {\n this.app.send(msg)\n }\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -293,6 +293,7 @@ export default class App {
|
|
|
293
293
|
* @reject {string} - error message
|
|
294
294
|
* */
|
|
295
295
|
uploadOfflineRecording(): Promise<void>;
|
|
296
|
+
prevOpts: StartOptions;
|
|
296
297
|
private _start;
|
|
297
298
|
restartCanvasTracking: () => void;
|
|
298
299
|
flushBuffer: (buffer: Message[]) => Promise<unknown>;
|
package/dist/lib/index.js
CHANGED
|
@@ -50,7 +50,7 @@ var freb = function (eb, start) {
|
|
|
50
50
|
}
|
|
51
51
|
return { b: b, r: r };
|
|
52
52
|
};
|
|
53
|
-
var _a
|
|
53
|
+
var _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;
|
|
54
54
|
// we can ignore the fact that the other numbers are wrong; they never happen anyway
|
|
55
55
|
fl[28] = 258, revfl[258] = 28;
|
|
56
56
|
var _b = freb(fdeb, 0), revfd = _b.r;
|
|
@@ -4097,12 +4097,6 @@ class IFrameObserver extends Observer {
|
|
|
4097
4097
|
this.app.send(CreateIFrameDocument(rootNodeId, docID));
|
|
4098
4098
|
});
|
|
4099
4099
|
}
|
|
4100
|
-
disconnect() {
|
|
4101
|
-
if (this.docId !== undefined) {
|
|
4102
|
-
this.app.send(RemoveNode(this.docId));
|
|
4103
|
-
}
|
|
4104
|
-
super.disconnect();
|
|
4105
|
-
}
|
|
4106
4100
|
}
|
|
4107
4101
|
|
|
4108
4102
|
class ShadowRootObserver extends Observer {
|
|
@@ -4618,7 +4612,7 @@ class App {
|
|
|
4618
4612
|
this.stopCallbacks = [];
|
|
4619
4613
|
this.commitCallbacks = [];
|
|
4620
4614
|
this.activityState = ActivityState.NotActive;
|
|
4621
|
-
this.version = '14.0.
|
|
4615
|
+
this.version = '14.0.14'; // TODO: version compatability check inside each plugin.
|
|
4622
4616
|
this.socketMode = false;
|
|
4623
4617
|
this.compressionThreshold = 24 * 1000;
|
|
4624
4618
|
this.bc = null;
|
|
@@ -4688,32 +4682,36 @@ class App {
|
|
|
4688
4682
|
return console.error('Couldnt connect to event.source for child iframe tracking');
|
|
4689
4683
|
}
|
|
4690
4684
|
const id = await this.checkNodeId(event.source);
|
|
4691
|
-
if (id
|
|
4692
|
-
|
|
4685
|
+
if (!id) {
|
|
4686
|
+
this.debug.log('Couldnt get node id for iframe', event.source);
|
|
4687
|
+
return;
|
|
4688
|
+
}
|
|
4689
|
+
try {
|
|
4690
|
+
if (this.trackedFrames.includes(data.context)) {
|
|
4691
|
+
this.debug.log('Trying to observe already added iframe; ignore if its a restart');
|
|
4692
|
+
}
|
|
4693
|
+
else {
|
|
4693
4694
|
this.trackedFrames.push(data.context);
|
|
4694
|
-
await this.waitStarted();
|
|
4695
|
-
const token = this.session.getSessionToken();
|
|
4696
|
-
const order = this.trackedFrames.findIndex((f) => f === data.context) + 1;
|
|
4697
|
-
if (order === 0) {
|
|
4698
|
-
this.debug.error('Couldnt get order number for iframe', data.context, this.trackedFrames);
|
|
4699
|
-
}
|
|
4700
|
-
const iframeData = {
|
|
4701
|
-
line: proto.iframeId,
|
|
4702
|
-
id,
|
|
4703
|
-
token,
|
|
4704
|
-
// since indexes go from 0 we +1
|
|
4705
|
-
frameOrderNumber: order,
|
|
4706
|
-
};
|
|
4707
|
-
this.debug.log('Got child frame signal; nodeId', id, event.source, iframeData);
|
|
4708
|
-
// @ts-ignore
|
|
4709
|
-
event.source?.postMessage(iframeData, '*');
|
|
4710
4695
|
}
|
|
4711
|
-
|
|
4712
|
-
|
|
4696
|
+
await this.waitStarted();
|
|
4697
|
+
const token = this.session.getSessionToken();
|
|
4698
|
+
const order = this.trackedFrames.findIndex((f) => f === data.context) + 1;
|
|
4699
|
+
if (order === 0) {
|
|
4700
|
+
this.debug.error('Couldnt get order number for iframe', data.context, this.trackedFrames);
|
|
4713
4701
|
}
|
|
4702
|
+
const iframeData = {
|
|
4703
|
+
line: proto.iframeId,
|
|
4704
|
+
id,
|
|
4705
|
+
token,
|
|
4706
|
+
// since indexes go from 0 we +1
|
|
4707
|
+
frameOrderNumber: order,
|
|
4708
|
+
};
|
|
4709
|
+
this.debug.log('Got child frame signal; nodeId', id, event.source, iframeData);
|
|
4710
|
+
// @ts-ignore
|
|
4711
|
+
event.source?.postMessage(iframeData, '*');
|
|
4714
4712
|
}
|
|
4715
|
-
|
|
4716
|
-
|
|
4713
|
+
catch (e) {
|
|
4714
|
+
console.error(e);
|
|
4717
4715
|
}
|
|
4718
4716
|
};
|
|
4719
4717
|
void signalId();
|
|
@@ -4771,6 +4769,10 @@ class App {
|
|
|
4771
4769
|
return;
|
|
4772
4770
|
}
|
|
4773
4771
|
const nextCommand = this.pollingQueue.order[0];
|
|
4772
|
+
if (nextCommand && this.pollingQueue[nextCommand].length === 0) {
|
|
4773
|
+
this.pollingQueue.order = this.pollingQueue.order.filter((c) => c !== nextCommand);
|
|
4774
|
+
return;
|
|
4775
|
+
}
|
|
4774
4776
|
if (this.pollingQueue[nextCommand].includes(data.context)) {
|
|
4775
4777
|
this.pollingQueue[nextCommand] = this.pollingQueue[nextCommand].filter((c) => c !== data.context);
|
|
4776
4778
|
// @ts-ignore
|
|
@@ -4876,6 +4878,7 @@ class App {
|
|
|
4876
4878
|
this.onSessionSent = () => {
|
|
4877
4879
|
return;
|
|
4878
4880
|
};
|
|
4881
|
+
this.prevOpts = {};
|
|
4879
4882
|
this.restartCanvasTracking = () => {
|
|
4880
4883
|
this.canvasRecorder?.restartTracking();
|
|
4881
4884
|
};
|
|
@@ -5125,7 +5128,16 @@ class App {
|
|
|
5125
5128
|
this.stop(false);
|
|
5126
5129
|
}
|
|
5127
5130
|
else if (data === 'a_start') {
|
|
5128
|
-
|
|
5131
|
+
this.waitStatus(ActivityState.NotActive).then(() => {
|
|
5132
|
+
this.allowAppStart();
|
|
5133
|
+
this.start(this.prevOpts, true)
|
|
5134
|
+
.then((r) => {
|
|
5135
|
+
this.debug.info('Worker restarted, session was too long', r);
|
|
5136
|
+
})
|
|
5137
|
+
.catch((e) => {
|
|
5138
|
+
this.debug.error('Worker restart failed', e);
|
|
5139
|
+
});
|
|
5140
|
+
});
|
|
5129
5141
|
}
|
|
5130
5142
|
else if (data === 'not_init') {
|
|
5131
5143
|
this.debug.warn('OR WebWorker: writer not initialised. Restarting tracker');
|
|
@@ -5604,6 +5616,9 @@ class App {
|
|
|
5604
5616
|
this.clearBuffers();
|
|
5605
5617
|
}
|
|
5606
5618
|
async _start(startOpts = {}, resetByWorker = false, conditionName) {
|
|
5619
|
+
if (Object.keys(startOpts).length !== 0) {
|
|
5620
|
+
this.prevOpts = startOpts;
|
|
5621
|
+
}
|
|
5607
5622
|
const isColdStart = this.activityState === ActivityState.ColdStart;
|
|
5608
5623
|
if (isColdStart && this.coldInterval) {
|
|
5609
5624
|
clearInterval(this.coldInterval);
|
|
@@ -5925,7 +5940,6 @@ class App {
|
|
|
5925
5940
|
}
|
|
5926
5941
|
stop(stopWorker = true) {
|
|
5927
5942
|
if (this.activityState !== ActivityState.NotActive) {
|
|
5928
|
-
console.trace('stopped');
|
|
5929
5943
|
try {
|
|
5930
5944
|
if (!this.insideIframe && this.options.crossdomain?.enabled) {
|
|
5931
5945
|
this.killChildrenFrames();
|
|
@@ -5942,9 +5956,7 @@ class App {
|
|
|
5942
5956
|
}
|
|
5943
5957
|
this.canvasRecorder?.clear();
|
|
5944
5958
|
this.messages.length = 0;
|
|
5945
|
-
this.trackedFrames = [];
|
|
5946
5959
|
this.parentActive = false;
|
|
5947
|
-
this.canStart = false;
|
|
5948
5960
|
}
|
|
5949
5961
|
finally {
|
|
5950
5962
|
this.activityState = ActivityState.NotActive;
|
|
@@ -8030,7 +8042,6 @@ const getURL = (urlString) => {
|
|
|
8030
8042
|
}
|
|
8031
8043
|
};
|
|
8032
8044
|
|
|
8033
|
-
var _a;
|
|
8034
8045
|
// https://fetch.spec.whatwg.org/#concept-bodyinit-extract
|
|
8035
8046
|
const getContentType = (data) => {
|
|
8036
8047
|
if (data instanceof Blob) {
|
|
@@ -8097,17 +8108,13 @@ class BeaconProxyHandler {
|
|
|
8097
8108
|
}
|
|
8098
8109
|
}
|
|
8099
8110
|
class BeaconProxy {
|
|
8100
|
-
static
|
|
8101
|
-
|
|
8102
|
-
}
|
|
8103
|
-
static create(ignoredHeaders, setSessionTokenHeader, sanitize, sendMessage, isServiceUrl) {
|
|
8104
|
-
if (!BeaconProxy.hasSendBeacon()) {
|
|
8111
|
+
static create(originalSendBeacon, ignoredHeaders, setSessionTokenHeader, sanitize, sendMessage, isServiceUrl) {
|
|
8112
|
+
if (!originalSendBeacon) {
|
|
8105
8113
|
return undefined;
|
|
8106
8114
|
}
|
|
8107
|
-
return new Proxy(
|
|
8115
|
+
return new Proxy(originalSendBeacon, new BeaconProxyHandler(ignoredHeaders, setSessionTokenHeader, sanitize, sendMessage, isServiceUrl));
|
|
8108
8116
|
}
|
|
8109
8117
|
}
|
|
8110
|
-
BeaconProxy.origSendBeacon = (_a = window === null || window === void 0 ? void 0 : window.navigator) === null || _a === void 0 ? void 0 : _a.sendBeacon;
|
|
8111
8118
|
|
|
8112
8119
|
var RequestState;
|
|
8113
8120
|
(function (RequestState) {
|
|
@@ -8648,6 +8655,8 @@ function createNetworkProxy(context, ignoredHeaders, setSessionTokenHeader, sani
|
|
|
8648
8655
|
beacon: true,
|
|
8649
8656
|
}, tokenUrlMatcher) {
|
|
8650
8657
|
var _a;
|
|
8658
|
+
if (!context)
|
|
8659
|
+
return;
|
|
8651
8660
|
if (modules.xhr) {
|
|
8652
8661
|
if (context.XMLHttpRequest) {
|
|
8653
8662
|
context.XMLHttpRequest = XHRProxy.create(ignoredHeaders, setSessionTokenHeader, sanitize, sendMessage, isServiceUrl, tokenUrlMatcher);
|
|
@@ -8665,8 +8674,9 @@ function createNetworkProxy(context, ignoredHeaders, setSessionTokenHeader, sani
|
|
|
8665
8674
|
}
|
|
8666
8675
|
}
|
|
8667
8676
|
if (modules.beacon) {
|
|
8668
|
-
if ((_a = context
|
|
8669
|
-
context.navigator.sendBeacon
|
|
8677
|
+
if ((_a = context.navigator) === null || _a === void 0 ? void 0 : _a.sendBeacon) {
|
|
8678
|
+
const origBeacon = context.navigator.sendBeacon;
|
|
8679
|
+
context.navigator.sendBeacon = BeaconProxy.create(origBeacon, ignoredHeaders, setSessionTokenHeader, sanitize, sendMessage, isServiceUrl);
|
|
8670
8680
|
}
|
|
8671
8681
|
}
|
|
8672
8682
|
}
|
|
@@ -8979,6 +8989,14 @@ function processOptions(obj) {
|
|
|
8979
8989
|
}
|
|
8980
8990
|
return true;
|
|
8981
8991
|
}
|
|
8992
|
+
const canAccessTop = () => {
|
|
8993
|
+
try {
|
|
8994
|
+
return Boolean(window.top);
|
|
8995
|
+
}
|
|
8996
|
+
catch {
|
|
8997
|
+
return false;
|
|
8998
|
+
}
|
|
8999
|
+
};
|
|
8982
9000
|
class API {
|
|
8983
9001
|
constructor(options) {
|
|
8984
9002
|
this.options = options;
|
|
@@ -8996,7 +9014,7 @@ class API {
|
|
|
8996
9014
|
const orig = this.options.ingestPoint || DEFAULT_INGEST_POINT;
|
|
8997
9015
|
req.open('POST', orig + '/v1/web/not-started');
|
|
8998
9016
|
req.send(JSON.stringify({
|
|
8999
|
-
trackerVersion: '14.0.
|
|
9017
|
+
trackerVersion: '14.0.14',
|
|
9000
9018
|
projectKey: this.options.projectKey,
|
|
9001
9019
|
doNotTrack,
|
|
9002
9020
|
reason: missingApi.length ? `missing api: ${missingApi.join(',')}` : reason,
|
|
@@ -9026,10 +9044,11 @@ class API {
|
|
|
9026
9044
|
};
|
|
9027
9045
|
this.crossdomainMode = Boolean(inIframe() && options.crossdomain?.enabled);
|
|
9028
9046
|
if (!IN_BROWSER || !processOptions(options)) {
|
|
9047
|
+
console.error('OpenReplay: tracker called in a non-browser environment or with invalid options');
|
|
9029
9048
|
return;
|
|
9030
9049
|
}
|
|
9031
9050
|
if (window.__OPENREPLAY__ ||
|
|
9032
|
-
(!this.crossdomainMode && inIframe() && window.top?.__OPENREPLAY__)) {
|
|
9051
|
+
(!this.crossdomainMode && inIframe() && canAccessTop() && window.top?.__OPENREPLAY__)) {
|
|
9033
9052
|
console.error('OpenReplay: one tracker instance has been initialised already');
|
|
9034
9053
|
return;
|
|
9035
9054
|
}
|