posthog-js 1.84.2 → 1.84.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/array.full.js +1 -10
- package/dist/array.full.js.map +1 -1
- package/dist/array.js +1 -10
- package/dist/array.js.map +1 -1
- package/dist/es.js +1 -10
- package/dist/es.js.map +1 -1
- package/dist/module.d.ts +32 -148
- package/dist/module.js +1 -10
- package/dist/module.js.map +1 -1
- package/dist/recorder-v2.js +2 -2
- package/dist/recorder-v2.js.map +1 -1
- package/dist/recorder.js +1 -1
- package/dist/recorder.js.map +1 -1
- package/dist/surveys.js +1 -1
- package/dist/surveys.js.map +1 -1
- package/lib/package.json +9 -4
- package/lib/src/autocapture-utils.js +6 -6
- package/lib/src/autocapture-utils.js.map +1 -1
- package/lib/src/autocapture.js +5 -5
- package/lib/src/autocapture.js.map +1 -1
- package/lib/src/constants.d.ts +1 -0
- package/lib/src/constants.js +1 -0
- package/lib/src/constants.js.map +1 -1
- package/lib/src/extensions/exceptions/error-conversion.js +3 -2
- package/lib/src/extensions/exceptions/error-conversion.js.map +1 -1
- package/lib/src/extensions/exceptions/exception-autocapture.js +4 -7
- package/lib/src/extensions/exceptions/exception-autocapture.js.map +1 -1
- package/lib/src/extensions/exceptions/stack-trace.js +3 -2
- package/lib/src/extensions/exceptions/stack-trace.js.map +1 -1
- package/lib/src/extensions/exceptions/type-checking.js +3 -2
- package/lib/src/extensions/exceptions/type-checking.js.map +1 -1
- package/lib/src/extensions/{sessionrecording-utils.js → replay/sessionrecording-utils.js} +3 -2
- package/lib/src/extensions/replay/sessionrecording-utils.js.map +1 -0
- package/lib/src/extensions/{sessionrecording.d.ts → replay/sessionrecording.d.ts} +27 -19
- package/lib/src/extensions/{sessionrecording.js → replay/sessionrecording.js} +217 -92
- package/lib/src/extensions/replay/sessionrecording.js.map +1 -0
- package/lib/src/extensions/{web-performance.d.ts → replay/web-performance.d.ts} +2 -2
- package/lib/src/extensions/{web-performance.js → replay/web-performance.js} +3 -3
- package/lib/src/extensions/replay/web-performance.js.map +1 -0
- package/lib/src/extensions/surveys.js +3 -2
- package/lib/src/extensions/surveys.js.map +1 -1
- package/lib/src/loader-recorder-v2.js +2 -3
- package/lib/src/loader-recorder-v2.js.map +1 -1
- package/lib/src/loader-recorder.js +2 -1
- package/lib/src/loader-recorder.js.map +1 -1
- package/lib/src/loader-surveys.js +2 -1
- package/lib/src/loader-surveys.js.map +1 -1
- package/lib/src/posthog-core.d.ts +2 -2
- package/lib/src/posthog-core.js +14 -14
- package/lib/src/posthog-core.js.map +1 -1
- package/lib/src/posthog-featureflags.js +4 -4
- package/lib/src/posthog-featureflags.js.map +1 -1
- package/lib/src/posthog-persistence.js +4 -4
- package/lib/src/posthog-persistence.js.map +1 -1
- package/lib/src/request-queue.js +2 -2
- package/lib/src/request-queue.js.map +1 -1
- package/lib/src/retry-queue.js +7 -3
- package/lib/src/retry-queue.js.map +1 -1
- package/lib/src/send-request.js +3 -3
- package/lib/src/send-request.js.map +1 -1
- package/lib/src/sessionid.d.ts +6 -4
- package/lib/src/sessionid.js +17 -15
- package/lib/src/sessionid.js.map +1 -1
- package/lib/src/storage.js +7 -7
- package/lib/src/storage.js.map +1 -1
- package/lib/src/types.d.ts +3 -0
- package/lib/src/types.js.map +1 -1
- package/lib/src/utils.d.ts +8 -10
- package/lib/src/utils.js +42 -31
- package/lib/src/utils.js.map +1 -1
- package/lib/src/uuidv7.js +6 -4
- package/lib/src/uuidv7.js.map +1 -1
- package/package.json +9 -4
- package/lib/src/extensions/sessionrecording-utils.js.map +0 -1
- package/lib/src/extensions/sessionrecording.js.map +0 -1
- package/lib/src/extensions/web-performance.js.map +0 -1
- /package/lib/src/extensions/{sessionrecording-utils.d.ts → replay/sessionrecording-utils.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stack-trace.js","sourceRoot":"","sources":["../../../../src/extensions/exceptions/stack-trace.ts"],"names":[],"mappings":"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","sourcesContent":["// copied and adapted from https://github.com/getsentry/sentry-javascript/blob/41fef4b10f3a644179b77985f00f8696c908539f/packages/browser/src/stack-parsers.ts\n// 💖open source\n\n// This was originally forked from https://github.com/csnover/TraceKit, and was largely\n// re-written as part of raven - js.\n//\n// This code was later copied to the JavaScript mono - repo and further modified and\n// refactored over the years.\n\n// Copyright (c) 2013 Onur Can Cakmak onur.cakmak@gmail.com and all TraceKit contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this\n// software and associated documentation files(the 'Software'), to deal in the Software\n// without restriction, including without limitation the rights to use, copy, modify,\n// merge, publish, distribute, sublicense, and / or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following\n// conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies\n// or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n// PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n// CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE\n// OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nconst WEBPACK_ERROR_REGEXP = /\\(error: (.*)\\)/\nconst STACKTRACE_FRAME_LIMIT = 50\n\nconst UNKNOWN_FUNCTION = '?'\n\nconst OPERA10_PRIORITY = 10\nconst OPERA11_PRIORITY = 20\nconst CHROME_PRIORITY = 30\nconst WINJS_PRIORITY = 40\nconst GECKO_PRIORITY = 50\n\nexport interface StackFrame {\n filename?: string\n function?: string\n module?: string\n platform?: string\n lineno?: number\n colno?: number\n abs_path?: string\n context_line?: string\n pre_context?: string[]\n post_context?: string[]\n in_app?: boolean\n instruction_addr?: string\n addr_mode?: string\n vars?: { [key: string]: any }\n debug_id?: string\n}\n\nfunction createFrame(filename: string, func: string, lineno?: number, colno?: number): StackFrame {\n const frame: StackFrame = {\n filename,\n function: func,\n in_app: true, // All browser frames are considered in_app\n }\n\n if (lineno !== undefined) {\n frame.lineno = lineno\n }\n\n if (colno !== undefined) {\n frame.colno = colno\n }\n\n return frame\n}\n\nexport type StackParser = (stack: string, skipFirst?: number) => StackFrame[]\nexport type StackLineParserFn = (line: string) => StackFrame | undefined\nexport type StackLineParser = [number, StackLineParserFn]\n\n// Chromium based browsers: Chrome, Brave, new Opera, new Edge\nconst chromeRegex =\n /^\\s*at (?:(.+?\\)(?: \\[.+\\])?|.*?) ?\\((?:address at )?)?(?:async )?((?:<anonymous>|[-a-z]+:|.*bundle|\\/)?.*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i\nconst chromeEvalRegex = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/\n\nconst chrome: StackLineParserFn = (line) => {\n const parts = chromeRegex.exec(line)\n\n if (parts) {\n const isEval = parts[2] && parts[2].indexOf('eval') === 0 // start of line\n\n if (isEval) {\n const subMatch = chromeEvalRegex.exec(parts[2])\n\n if (subMatch) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = subMatch[1] // url\n parts[3] = subMatch[2] // line\n parts[4] = subMatch[3] // column\n }\n }\n\n // Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now\n // would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable)\n const [func, filename] = extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2])\n\n return createFrame(filename, func, parts[3] ? +parts[3] : undefined, parts[4] ? +parts[4] : undefined)\n }\n\n return\n}\n\nexport const chromeStackLineParser: StackLineParser = [CHROME_PRIORITY, chrome]\n\n// gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n// We need this specific case for now because we want no other regex to match.\nconst geckoREgex =\n /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:[-a-z]+)?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js)|\\/[\\w\\-. /=]+)(?::(\\d+))?(?::(\\d+))?\\s*$/i\nconst geckoEvalRegex = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i\n\nconst gecko: StackLineParserFn = (line) => {\n const parts = geckoREgex.exec(line)\n\n if (parts) {\n const isEval = parts[3] && parts[3].indexOf(' > eval') > -1\n if (isEval) {\n const subMatch = geckoEvalRegex.exec(parts[3])\n\n if (subMatch) {\n // throw out eval line/column and use top-most line number\n parts[1] = parts[1] || 'eval'\n parts[3] = subMatch[1]\n parts[4] = subMatch[2]\n parts[5] = '' // no column when eval\n }\n }\n\n let filename = parts[3]\n let func = parts[1] || UNKNOWN_FUNCTION\n ;[func, filename] = extractSafariExtensionDetails(func, filename)\n\n return createFrame(filename, func, parts[4] ? +parts[4] : undefined, parts[5] ? +parts[5] : undefined)\n }\n\n return\n}\n\nexport const geckoStackLineParser: StackLineParser = [GECKO_PRIORITY, gecko]\n\nconst winjsRegex = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:[-a-z]+):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i\n\nconst winjs: StackLineParserFn = (line) => {\n const parts = winjsRegex.exec(line)\n\n return parts\n ? createFrame(parts[2], parts[1] || UNKNOWN_FUNCTION, +parts[3], parts[4] ? +parts[4] : undefined)\n : undefined\n}\n\nexport const winjsStackLineParser: StackLineParser = [WINJS_PRIORITY, winjs]\n\nconst opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i\n\nconst opera10: StackLineParserFn = (line) => {\n const parts = opera10Regex.exec(line)\n return parts ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1]) : undefined\n}\n\nexport const opera10StackLineParser: StackLineParser = [OPERA10_PRIORITY, opera10]\n\nconst opera11Regex = / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\\(.*\\))? in (.*):\\s*$/i\n\nconst opera11: StackLineParserFn = (line) => {\n const parts = opera11Regex.exec(line)\n return parts ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2]) : undefined\n}\n\nexport const opera11StackLineParser: StackLineParser = [OPERA11_PRIORITY, opera11]\n\nexport const defaultStackLineParsers = [chromeStackLineParser, geckoStackLineParser, winjsStackLineParser]\n\nexport function reverse(stack: ReadonlyArray<StackFrame>): StackFrame[] {\n if (!stack.length) {\n return []\n }\n\n const localStack = stack.slice(0, STACKTRACE_FRAME_LIMIT)\n\n localStack.reverse()\n\n return localStack.map((frame) => ({\n ...frame,\n filename: frame.filename || localStack[localStack.length - 1].filename,\n function: frame.function || '?',\n }))\n}\n\nexport function createStackParser(...parsers: StackLineParser[]): StackParser {\n const sortedParsers = parsers.sort((a, b) => a[0] - b[0]).map((p) => p[1])\n\n return (stack: string, skipFirst = 0): StackFrame[] => {\n const frames: StackFrame[] = []\n const lines = stack.split('\\n')\n\n for (let i = skipFirst; i < lines.length; i++) {\n const line = lines[i]\n // Ignore lines over 1kb as they are unlikely to be stack frames.\n // Many of the regular expressions use backtracking which results in run time that increases exponentially with\n // input size. Huge strings can result in hangs/Denial of Service:\n // https://github.com/getsentry/sentry-javascript/issues/2286\n if (line.length > 1024) {\n continue\n }\n\n // https://github.com/getsentry/sentry-javascript/issues/5459\n // Remove webpack (error: *) wrappers\n const cleanedLine = WEBPACK_ERROR_REGEXP.test(line) ? line.replace(WEBPACK_ERROR_REGEXP, '$1') : line\n\n // https://github.com/getsentry/sentry-javascript/issues/7813\n // Skip Error: lines\n if (cleanedLine.match(/\\S*Error: /)) {\n continue\n }\n\n for (const parser of sortedParsers) {\n const frame = parser(cleanedLine)\n\n if (frame) {\n frames.push(frame)\n break\n }\n }\n\n if (frames.length >= STACKTRACE_FRAME_LIMIT) {\n break\n }\n }\n\n return reverse(frames)\n }\n}\n\nexport const defaultStackParser = createStackParser(...defaultStackLineParsers)\n\n/**\n * Safari web extensions, starting version unknown, can produce \"frames-only\" stacktraces.\n * What it means, is that instead of format like:\n *\n * Error: wat\n * at function@url:row:col\n * at function@url:row:col\n * at function@url:row:col\n *\n * it produces something like:\n *\n * function@url:row:col\n * function@url:row:col\n * function@url:row:col\n *\n * Because of that, it won't be captured by `chrome` RegExp and will fall into `Gecko` branch.\n * This function is extracted so that we can use it in both places without duplicating the logic.\n * Unfortunately \"just\" changing RegExp is too complicated now and making it pass all tests\n * and fix this case seems like an impossible, or at least way too time-consuming task.\n */\nconst extractSafariExtensionDetails = (func: string, filename: string): [string, string] => {\n const isSafariExtension = func.indexOf('safari-extension') !== -1\n const isSafariWebExtension = func.indexOf('safari-web-extension') !== -1\n\n return isSafariExtension || isSafariWebExtension\n ? [\n func.indexOf('@') !== -1 ? func.split('@')[0] : UNKNOWN_FUNCTION,\n isSafariExtension ? `safari-extension:${filename}` : `safari-web-extension:${filename}`,\n ]\n : [func, filename]\n}\n"]}
|
|
1
|
+
{"version":3,"file":"stack-trace.js","sourceRoot":"","sources":["../../../../src/extensions/exceptions/stack-trace.ts"],"names":[],"mappings":"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","sourcesContent":["// copied and adapted from https://github.com/getsentry/sentry-javascript/blob/41fef4b10f3a644179b77985f00f8696c908539f/packages/browser/src/stack-parsers.ts\n// 💖open source\n\n// This was originally forked from https://github.com/csnover/TraceKit, and was largely\n// re-written as part of raven - js.\n//\n// This code was later copied to the JavaScript mono - repo and further modified and\n// refactored over the years.\n\n// Copyright (c) 2013 Onur Can Cakmak onur.cakmak@gmail.com and all TraceKit contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this\n// software and associated documentation files(the 'Software'), to deal in the Software\n// without restriction, including without limitation the rights to use, copy, modify,\n// merge, publish, distribute, sublicense, and / or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following\n// conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies\n// or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n// PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n// CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE\n// OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nimport { _isUndefined } from '../../utils'\n\nconst WEBPACK_ERROR_REGEXP = /\\(error: (.*)\\)/\nconst STACKTRACE_FRAME_LIMIT = 50\n\nconst UNKNOWN_FUNCTION = '?'\n\nconst OPERA10_PRIORITY = 10\nconst OPERA11_PRIORITY = 20\nconst CHROME_PRIORITY = 30\nconst WINJS_PRIORITY = 40\nconst GECKO_PRIORITY = 50\n\nexport interface StackFrame {\n filename?: string\n function?: string\n module?: string\n platform?: string\n lineno?: number\n colno?: number\n abs_path?: string\n context_line?: string\n pre_context?: string[]\n post_context?: string[]\n in_app?: boolean\n instruction_addr?: string\n addr_mode?: string\n vars?: { [key: string]: any }\n debug_id?: string\n}\n\nfunction createFrame(filename: string, func: string, lineno?: number, colno?: number): StackFrame {\n const frame: StackFrame = {\n filename,\n function: func,\n in_app: true, // All browser frames are considered in_app\n }\n\n if (!_isUndefined(lineno)) {\n frame.lineno = lineno\n }\n\n if (!_isUndefined(colno)) {\n frame.colno = colno\n }\n\n return frame\n}\n\nexport type StackParser = (stack: string, skipFirst?: number) => StackFrame[]\nexport type StackLineParserFn = (line: string) => StackFrame | undefined\nexport type StackLineParser = [number, StackLineParserFn]\n\n// Chromium based browsers: Chrome, Brave, new Opera, new Edge\nconst chromeRegex =\n /^\\s*at (?:(.+?\\)(?: \\[.+\\])?|.*?) ?\\((?:address at )?)?(?:async )?((?:<anonymous>|[-a-z]+:|.*bundle|\\/)?.*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i\nconst chromeEvalRegex = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/\n\nconst chrome: StackLineParserFn = (line) => {\n const parts = chromeRegex.exec(line)\n\n if (parts) {\n const isEval = parts[2] && parts[2].indexOf('eval') === 0 // start of line\n\n if (isEval) {\n const subMatch = chromeEvalRegex.exec(parts[2])\n\n if (subMatch) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = subMatch[1] // url\n parts[3] = subMatch[2] // line\n parts[4] = subMatch[3] // column\n }\n }\n\n // Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now\n // would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable)\n const [func, filename] = extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2])\n\n return createFrame(filename, func, parts[3] ? +parts[3] : undefined, parts[4] ? +parts[4] : undefined)\n }\n\n return\n}\n\nexport const chromeStackLineParser: StackLineParser = [CHROME_PRIORITY, chrome]\n\n// gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n// We need this specific case for now because we want no other regex to match.\nconst geckoREgex =\n /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:[-a-z]+)?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js)|\\/[\\w\\-. /=]+)(?::(\\d+))?(?::(\\d+))?\\s*$/i\nconst geckoEvalRegex = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i\n\nconst gecko: StackLineParserFn = (line) => {\n const parts = geckoREgex.exec(line)\n\n if (parts) {\n const isEval = parts[3] && parts[3].indexOf(' > eval') > -1\n if (isEval) {\n const subMatch = geckoEvalRegex.exec(parts[3])\n\n if (subMatch) {\n // throw out eval line/column and use top-most line number\n parts[1] = parts[1] || 'eval'\n parts[3] = subMatch[1]\n parts[4] = subMatch[2]\n parts[5] = '' // no column when eval\n }\n }\n\n let filename = parts[3]\n let func = parts[1] || UNKNOWN_FUNCTION\n ;[func, filename] = extractSafariExtensionDetails(func, filename)\n\n return createFrame(filename, func, parts[4] ? +parts[4] : undefined, parts[5] ? +parts[5] : undefined)\n }\n\n return\n}\n\nexport const geckoStackLineParser: StackLineParser = [GECKO_PRIORITY, gecko]\n\nconst winjsRegex = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:[-a-z]+):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i\n\nconst winjs: StackLineParserFn = (line) => {\n const parts = winjsRegex.exec(line)\n\n return parts\n ? createFrame(parts[2], parts[1] || UNKNOWN_FUNCTION, +parts[3], parts[4] ? +parts[4] : undefined)\n : undefined\n}\n\nexport const winjsStackLineParser: StackLineParser = [WINJS_PRIORITY, winjs]\n\nconst opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i\n\nconst opera10: StackLineParserFn = (line) => {\n const parts = opera10Regex.exec(line)\n return parts ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1]) : undefined\n}\n\nexport const opera10StackLineParser: StackLineParser = [OPERA10_PRIORITY, opera10]\n\nconst opera11Regex = / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\\(.*\\))? in (.*):\\s*$/i\n\nconst opera11: StackLineParserFn = (line) => {\n const parts = opera11Regex.exec(line)\n return parts ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2]) : undefined\n}\n\nexport const opera11StackLineParser: StackLineParser = [OPERA11_PRIORITY, opera11]\n\nexport const defaultStackLineParsers = [chromeStackLineParser, geckoStackLineParser, winjsStackLineParser]\n\nexport function reverse(stack: ReadonlyArray<StackFrame>): StackFrame[] {\n if (!stack.length) {\n return []\n }\n\n const localStack = stack.slice(0, STACKTRACE_FRAME_LIMIT)\n\n localStack.reverse()\n\n return localStack.map((frame) => ({\n ...frame,\n filename: frame.filename || localStack[localStack.length - 1].filename,\n function: frame.function || '?',\n }))\n}\n\nexport function createStackParser(...parsers: StackLineParser[]): StackParser {\n const sortedParsers = parsers.sort((a, b) => a[0] - b[0]).map((p) => p[1])\n\n return (stack: string, skipFirst = 0): StackFrame[] => {\n const frames: StackFrame[] = []\n const lines = stack.split('\\n')\n\n for (let i = skipFirst; i < lines.length; i++) {\n const line = lines[i]\n // Ignore lines over 1kb as they are unlikely to be stack frames.\n // Many of the regular expressions use backtracking which results in run time that increases exponentially with\n // input size. Huge strings can result in hangs/Denial of Service:\n // https://github.com/getsentry/sentry-javascript/issues/2286\n if (line.length > 1024) {\n continue\n }\n\n // https://github.com/getsentry/sentry-javascript/issues/5459\n // Remove webpack (error: *) wrappers\n const cleanedLine = WEBPACK_ERROR_REGEXP.test(line) ? line.replace(WEBPACK_ERROR_REGEXP, '$1') : line\n\n // https://github.com/getsentry/sentry-javascript/issues/7813\n // Skip Error: lines\n if (cleanedLine.match(/\\S*Error: /)) {\n continue\n }\n\n for (const parser of sortedParsers) {\n const frame = parser(cleanedLine)\n\n if (frame) {\n frames.push(frame)\n break\n }\n }\n\n if (frames.length >= STACKTRACE_FRAME_LIMIT) {\n break\n }\n }\n\n return reverse(frames)\n }\n}\n\nexport const defaultStackParser = createStackParser(...defaultStackLineParsers)\n\n/**\n * Safari web extensions, starting version unknown, can produce \"frames-only\" stacktraces.\n * What it means, is that instead of format like:\n *\n * Error: wat\n * at function@url:row:col\n * at function@url:row:col\n * at function@url:row:col\n *\n * it produces something like:\n *\n * function@url:row:col\n * function@url:row:col\n * function@url:row:col\n *\n * Because of that, it won't be captured by `chrome` RegExp and will fall into `Gecko` branch.\n * This function is extracted so that we can use it in both places without duplicating the logic.\n * Unfortunately \"just\" changing RegExp is too complicated now and making it pass all tests\n * and fix this case seems like an impossible, or at least way too time-consuming task.\n */\nconst extractSafariExtensionDetails = (func: string, filename: string): [string, string] => {\n const isSafariExtension = func.indexOf('safari-extension') !== -1\n const isSafariWebExtension = func.indexOf('safari-web-extension') !== -1\n\n return isSafariExtension || isSafariWebExtension\n ? [\n func.indexOf('@') !== -1 ? func.split('@')[0] : UNKNOWN_FUNCTION,\n isSafariExtension ? `safari-extension:${filename}` : `safari-web-extension:${filename}`,\n ]\n : [func, filename]\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { _isFunction, _isNull, _isObject, _isUndefined } from '../../utils';
|
|
1
2
|
export function isEvent(candidate) {
|
|
2
|
-
return
|
|
3
|
+
return !_isUndefined(Event) && isInstanceOf(candidate, Event);
|
|
3
4
|
}
|
|
4
5
|
export function isPlainObject(candidate) {
|
|
5
6
|
return isBuiltin(candidate, 'Object');
|
|
@@ -13,7 +14,7 @@ export function isInstanceOf(candidate, base) {
|
|
|
13
14
|
}
|
|
14
15
|
}
|
|
15
16
|
export function isPrimitive(candidate) {
|
|
16
|
-
return candidate
|
|
17
|
+
return _isNull(candidate) || (!_isObject(candidate) && !_isFunction(candidate));
|
|
17
18
|
}
|
|
18
19
|
export function isError(candidate) {
|
|
19
20
|
switch (Object.prototype.toString.call(candidate)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-checking.js","sourceRoot":"","sources":["../../../../src/extensions/exceptions/type-checking.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,OAAO,CAAC,SAAkB;IACtC,OAAO,
|
|
1
|
+
{"version":3,"file":"type-checking.js","sourceRoot":"","sources":["../../../../src/extensions/exceptions/type-checking.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE3E,MAAM,UAAU,OAAO,CAAC,SAAkB;IACtC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;AACjE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAkB;IAC5C,OAAO,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;AACzC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,SAAkB,EAAE,IAAS;IACtD,IAAI;QACA,OAAO,SAAS,YAAY,IAAI,CAAA;KACnC;IAAC,OAAO,EAAE,EAAE;QACT,OAAO,KAAK,CAAA;KACf;AACL,CAAC;AAED,MAAM,UAAU,WAAW,CACvB,SAAkB;IAElB,OAAO,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAA;AACnF,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,SAAkB;IACtC,QAAQ,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;QAC/C,KAAK,gBAAgB,CAAC;QACtB,KAAK,oBAAoB,CAAC;QAC1B,KAAK,uBAAuB;YACxB,OAAO,IAAI,CAAA;QACf;YACI,OAAO,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;KAC5C;AACL,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAA6B;IACtD,OAAO,SAAS,CAAC,KAAK,EAAE,YAAY,CAAC,CAAA;AACzC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAkB;IAC/C,OAAO,OAAO,IAAK,SAAmB,CAAA;AAC1C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,SAAkB,EAAE,SAAiB;IAC3D,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,kBAAW,SAAS,MAAG,CAAA;AAChF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAkB;IAC7C,OAAO,SAAS,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;AAC/C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,SAAkB;IACzC,OAAO,SAAS,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;AAC3C,CAAC","sourcesContent":["import { _isFunction, _isNull, _isObject, _isUndefined } from '../../utils'\n\nexport function isEvent(candidate: unknown): candidate is Event {\n return !_isUndefined(Event) && isInstanceOf(candidate, Event)\n}\n\nexport function isPlainObject(candidate: unknown): candidate is Record<string, unknown> {\n return isBuiltin(candidate, 'Object')\n}\n\nexport function isInstanceOf(candidate: unknown, base: any): boolean {\n try {\n return candidate instanceof base\n } catch (_e) {\n return false\n }\n}\n\nexport function isPrimitive(\n candidate: unknown\n): candidate is number | string | boolean | bigint | symbol | null | undefined {\n return _isNull(candidate) || (!_isObject(candidate) && !_isFunction(candidate))\n}\n\nexport function isError(candidate: unknown): candidate is Error {\n switch (Object.prototype.toString.call(candidate)) {\n case '[object Error]':\n case '[object Exception]':\n case '[object DOMException]':\n return true\n default:\n return isInstanceOf(candidate, Error)\n }\n}\n\nexport function isErrorEvent(event: string | Error | Event): event is ErrorEvent {\n return isBuiltin(event, 'ErrorEvent')\n}\n\nexport function isErrorWithStack(candidate: unknown): candidate is Error {\n return 'stack' in (candidate as Error)\n}\n\nexport function isBuiltin(candidate: unknown, className: string): boolean {\n return Object.prototype.toString.call(candidate) === `[object ${className}]`\n}\n\nexport function isDOMException(candidate: unknown): boolean {\n return isBuiltin(candidate, 'DOMException')\n}\n\nexport function isDOMError(candidate: unknown): boolean {\n return isBuiltin(candidate, 'DOMError')\n}\n"]}
|
|
@@ -25,6 +25,7 @@ var __read = (this && this.__read) || function (o, n) {
|
|
|
25
25
|
}
|
|
26
26
|
return ar;
|
|
27
27
|
};
|
|
28
|
+
import { _isObject } from '../../utils';
|
|
28
29
|
export var replacementImageURI = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNOCAwSDE2TDAgMTZWOEw4IDBaIiBmaWxsPSIjMkQyRDJEIi8+CjxwYXRoIGQ9Ik0xNiA4VjE2SDhMMTYgOFoiIGZpbGw9IiMyRDJEMkQiLz4KPC9zdmc+Cg==';
|
|
29
30
|
export var FULL_SNAPSHOT_EVENT_TYPE = 2;
|
|
30
31
|
export var META_EVENT_TYPE = 4;
|
|
@@ -83,9 +84,9 @@ export function truncateLargeConsoleLogs(_event) {
|
|
|
83
84
|
var MAX_STRING_SIZE = 2000; // Maximum number of characters allowed in a string
|
|
84
85
|
var MAX_STRINGS_PER_LOG = 10; // A log can consist of multiple strings (e.g. consol.log('string1', 'string2'))
|
|
85
86
|
if (event &&
|
|
86
|
-
|
|
87
|
+
_isObject(event) &&
|
|
87
88
|
event.type === PLUGIN_EVENT_TYPE &&
|
|
88
|
-
|
|
89
|
+
_isObject(event.data) &&
|
|
89
90
|
event.data.plugin === CONSOLE_LOG_PLUGIN_NAME) {
|
|
90
91
|
// Note: event.data.payload.payload comes from rr-web, and is an array of strings
|
|
91
92
|
if (event.data.payload.payload.length > MAX_STRINGS_PER_LOG) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionrecording-utils.js","sourceRoot":"","sources":["../../../../src/extensions/replay/sessionrecording-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n KeepIframeSrcFn,\n RecordPlugin,\n SamplingStrategy,\n blockClass,\n eventWithTime,\n hooksParam,\n listenerHandler,\n maskTextClass,\n pluginEvent,\n mutationCallbackParam,\n} from '@rrweb/types'\nimport type { Mirror, MaskInputOptions, MaskInputFn, MaskTextFn, SlimDOMOptions, DataURLOptions } from 'rrweb-snapshot'\nimport { _isObject } from '../../utils'\n\nexport const replacementImageURI =\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNOCAwSDE2TDAgMTZWOEw4IDBaIiBmaWxsPSIjMkQyRDJEIi8+CjxwYXRoIGQ9Ik0xNiA4VjE2SDhMMTYgOFoiIGZpbGw9IiMyRDJEMkQiLz4KPC9zdmc+Cg=='\n\nexport const FULL_SNAPSHOT_EVENT_TYPE = 2\nexport const META_EVENT_TYPE = 4\nexport const INCREMENTAL_SNAPSHOT_EVENT_TYPE = 3\nexport const PLUGIN_EVENT_TYPE = 6\nexport const MUTATION_SOURCE_TYPE = 0\n\nexport const MAX_MESSAGE_SIZE = 5000000 // ~5mb\n\nexport type rrwebRecord = {\n (options: recordOptions<eventWithTime>): listenerHandler\n addCustomEvent: (tag: string, payload: any) => void\n takeFullSnapshot: () => void\n mirror: Mirror\n}\n\nexport declare type recordOptions<T> = {\n emit?: (e: T, isCheckout?: boolean) => void\n checkoutEveryNth?: number\n checkoutEveryNms?: number\n blockClass?: blockClass\n blockSelector?: string\n ignoreClass?: string\n maskTextClass?: maskTextClass\n maskTextSelector?: string\n maskAllInputs?: boolean\n maskInputOptions?: MaskInputOptions\n maskInputFn?: MaskInputFn\n maskTextFn?: MaskTextFn\n slimDOMOptions?: SlimDOMOptions | 'all' | true\n ignoreCSSAttributes?: Set<string>\n inlineStylesheet?: boolean\n hooks?: hooksParam\n // packFn?: PackFn\n sampling?: SamplingStrategy\n dataURLOptions?: DataURLOptions\n recordCanvas?: boolean\n recordCrossOriginIframes?: boolean\n recordAfter?: 'DOMContentLoaded' | 'load'\n userTriggeredOnInput?: boolean\n collectFonts?: boolean\n inlineImages?: boolean\n plugins?: RecordPlugin[]\n mousemoveWait?: number\n keepIframeSrcFn?: KeepIframeSrcFn\n // errorHandler?: ErrorHandler\n}\n\n/*\n * Check whether a data payload is nearing 5mb. If it is, it checks the data for\n * data URIs (the likely culprit for large payloads). If it finds data URIs, it either replaces\n * it with a generic image (if it's an image) or removes it.\n * @data {object} the rr-web data object\n * @returns {object} the rr-web data object with data uris filtered out\n */\nexport function ensureMaxMessageSize(data: eventWithTime): { event: eventWithTime; size: number } {\n let stringifiedData = JSON.stringify(data)\n // Note: with compression, this limit may be able to be increased\n // but we're assuming most of the size is from a data uri which\n // is unlikely to be compressed further\n if (stringifiedData.length > MAX_MESSAGE_SIZE) {\n // Regex that matches the pattern for a dataURI with the shape 'data:{mime type};{encoding},{data}'. It:\n // 1) Checks if the pattern starts with 'data:' (potentially, not at the start of the string)\n // 2) Extracts the mime type of the data uri in the first group\n // 3) Determines when the data URI ends.Depending on if it's used in the src tag or css, it can end with a ) or \"\n const dataURIRegex = /data:([\\w/\\-.]+);(\\w+),([^)\"]*)/gim\n const matches = stringifiedData.matchAll(dataURIRegex)\n for (const match of matches) {\n if (match[1].toLocaleLowerCase().slice(0, 6) === 'image/') {\n stringifiedData = stringifiedData.replace(match[0], replacementImageURI)\n } else {\n stringifiedData = stringifiedData.replace(match[0], '')\n }\n }\n }\n return { event: JSON.parse(stringifiedData), size: stringifiedData.length }\n}\n\nexport const CONSOLE_LOG_PLUGIN_NAME = 'rrweb/console@1' // The name of the rr-web plugin that emits console logs\n\n// Console logs can be really large. This function truncates large logs\n// It's a simple function that just truncates long strings.\n// TODO: Ideally this function would have better handling of objects + lists,\n// so they could still be rendered in a pretty way after truncation.\nexport function truncateLargeConsoleLogs(_event: eventWithTime) {\n const event = _event as pluginEvent<{ payload: string[] }>\n\n const MAX_STRING_SIZE = 2000 // Maximum number of characters allowed in a string\n const MAX_STRINGS_PER_LOG = 10 // A log can consist of multiple strings (e.g. consol.log('string1', 'string2'))\n\n if (\n event &&\n _isObject(event) &&\n event.type === PLUGIN_EVENT_TYPE &&\n _isObject(event.data) &&\n event.data.plugin === CONSOLE_LOG_PLUGIN_NAME\n ) {\n // Note: event.data.payload.payload comes from rr-web, and is an array of strings\n if (event.data.payload.payload.length > MAX_STRINGS_PER_LOG) {\n event.data.payload.payload = event.data.payload.payload.slice(0, MAX_STRINGS_PER_LOG)\n event.data.payload.payload.push('...[truncated]')\n }\n const updatedPayload = []\n for (let i = 0; i < event.data.payload.payload.length; i++) {\n if (\n event.data.payload.payload[i] && // Value can be null\n event.data.payload.payload[i].length > MAX_STRING_SIZE\n ) {\n updatedPayload.push(event.data.payload.payload[i].slice(0, MAX_STRING_SIZE) + '...[truncated]')\n } else {\n updatedPayload.push(event.data.payload.payload[i])\n }\n }\n event.data.payload.payload = updatedPayload\n // Return original type\n return _event\n }\n return _event\n}\n\nexport class MutationRateLimiter {\n private bucketSize = 100\n private refillRate = 10\n private mutationBuckets: Record<string, number> = {}\n private loggedTracker: Record<string, boolean> = {}\n\n constructor(\n private readonly rrweb: rrwebRecord,\n private readonly options: {\n bucketSize?: number\n refillRate?: number\n onBlockedNode?: (id: number, node: Node | null) => void\n } = {}\n ) {\n this.refillRate = this.options.refillRate ?? this.refillRate\n this.bucketSize = this.options.bucketSize ?? this.bucketSize\n setInterval(() => {\n this.refillBuckets()\n }, 1000)\n }\n\n private refillBuckets = () => {\n Object.keys(this.mutationBuckets).forEach((key) => {\n this.mutationBuckets[key] = this.mutationBuckets[key] + this.refillRate\n\n if (this.mutationBuckets[key] >= this.bucketSize) {\n delete this.mutationBuckets[key]\n }\n })\n }\n\n private getNodeOrRelevantParent = (id: number): [number, Node | null] => {\n // For some nodes we know they are part of a larger tree such as an SVG.\n // For those we want to block the entire node, not just the specific attribute\n\n const node = this.rrweb.mirror.getNode(id)\n\n // Check if the node is an Element and then find the closest parent that is an SVG\n if (node?.nodeName !== 'svg' && node instanceof Element) {\n const closestSVG = node.closest('svg')\n\n if (closestSVG) {\n return [this.rrweb.mirror.getId(closestSVG), closestSVG]\n }\n }\n\n return [id, node]\n }\n\n private numberOfChanges = (data: Partial<mutationCallbackParam>) => {\n return (\n (data.removes?.length ?? 0) +\n (data.attributes?.length ?? 0) +\n (data.texts?.length ?? 0) +\n (data.adds?.length ?? 0)\n )\n }\n\n public throttleMutations = (event: eventWithTime) => {\n if (event.type !== INCREMENTAL_SNAPSHOT_EVENT_TYPE || event.data.source !== MUTATION_SOURCE_TYPE) {\n return event\n }\n\n const data = event.data as Partial<mutationCallbackParam>\n const initialMutationCount = this.numberOfChanges(data)\n\n if (data.attributes) {\n // Most problematic mutations come from attrs where the style or minor properties are changed rapidly\n data.attributes = data.attributes.filter((attr) => {\n const [nodeId, node] = this.getNodeOrRelevantParent(attr.id)\n\n if (this.mutationBuckets[nodeId] === 0) {\n return false\n }\n\n this.mutationBuckets[nodeId] = this.mutationBuckets[nodeId] ?? this.bucketSize\n this.mutationBuckets[nodeId] = Math.max(this.mutationBuckets[nodeId] - 1, 0)\n\n if (this.mutationBuckets[nodeId] === 0) {\n if (!this.loggedTracker[nodeId]) {\n this.loggedTracker[nodeId] = true\n this.options.onBlockedNode?.(nodeId, node)\n }\n }\n\n return attr\n })\n }\n\n // Check if every part of the mutation is empty in which case there is nothing to do\n const mutationCount = this.numberOfChanges(data)\n\n if (mutationCount === 0 && initialMutationCount !== mutationCount) {\n // If we have modified the mutation count and the remaining count is 0, then we don't need the event.\n return\n }\n return event\n }\n}\n"]}
|
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { type eventWithTime, type listenerHandler } from '@rrweb/types';
|
|
1
|
+
import { PostHog } from '../../posthog-core';
|
|
2
|
+
import { DecideResponse } from '../../types';
|
|
3
|
+
import { type eventWithTime } from '@rrweb/types';
|
|
5
4
|
export declare const RECORDING_IDLE_ACTIVITY_TIMEOUT_MS: number;
|
|
5
|
+
export declare const TEN_MINUTES_IN_MS: number;
|
|
6
6
|
export declare const RECORDING_MAX_EVENT_SIZE: number;
|
|
7
7
|
export declare const RECORDING_BUFFER_TIMEOUT = 2000;
|
|
8
8
|
export declare const SESSION_RECORDING_BATCH_KEY = "recordings";
|
|
9
9
|
export declare class SessionRecording {
|
|
10
|
-
|
|
11
|
-
get endpoint(): string;
|
|
10
|
+
private _linkedFlagSeen;
|
|
12
11
|
private instance;
|
|
13
|
-
private emit;
|
|
14
12
|
private _endpoint;
|
|
15
13
|
private windowId;
|
|
16
14
|
private sessionId;
|
|
@@ -18,21 +16,30 @@ export declare class SessionRecording {
|
|
|
18
16
|
private flushBufferTimer?;
|
|
19
17
|
private buffer?;
|
|
20
18
|
private mutationRateLimiter?;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
19
|
+
private _captureStarted;
|
|
20
|
+
private stopRrweb;
|
|
21
|
+
private receivedDecide;
|
|
22
|
+
private rrwebRecord;
|
|
23
|
+
private isIdle;
|
|
24
|
+
private _linkedFlag;
|
|
25
|
+
private _sampleRate;
|
|
26
|
+
private _minimumDuration;
|
|
27
|
+
get started(): boolean;
|
|
28
|
+
private get sessionManager();
|
|
29
|
+
private get isSampled();
|
|
30
|
+
private get sessionDuration();
|
|
31
|
+
private get isRecordingEnabled();
|
|
32
|
+
private get isConsoleLogCaptureEnabled();
|
|
33
|
+
private get recordingVersion();
|
|
34
|
+
/**
|
|
35
|
+
* defaults to buffering mode until a decide response is received
|
|
36
|
+
* once a decide response is received status can be disabled, active or sampled
|
|
37
|
+
*/
|
|
38
|
+
private get status();
|
|
28
39
|
constructor(instance: PostHog);
|
|
29
|
-
private getSessionManager;
|
|
30
40
|
startRecordingIfEnabled(): void;
|
|
31
|
-
started(): boolean;
|
|
32
41
|
stopRecording(): void;
|
|
33
|
-
|
|
34
|
-
isConsoleLogCaptureEnabled(): boolean;
|
|
35
|
-
getRecordingVersion(): any;
|
|
42
|
+
private makeSamplingDecision;
|
|
36
43
|
afterDecideResponse(response: DecideResponse): void;
|
|
37
44
|
log(message: string, level?: 'log' | 'warn' | 'error'): void;
|
|
38
45
|
private startCaptureAndTrySendingQueuedSnapshots;
|
|
@@ -43,6 +50,7 @@ export declare class SessionRecording {
|
|
|
43
50
|
private _onScriptLoaded;
|
|
44
51
|
onRRwebEmit(rawEvent: eventWithTime): void;
|
|
45
52
|
private _maskUrl;
|
|
53
|
+
private clearBuffer;
|
|
46
54
|
private _flushBuffer;
|
|
47
55
|
private _captureSnapshotBuffered;
|
|
48
56
|
private _captureSnapshot;
|