@sentry/react-native 3.3.6 → 3.4.2
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 +15 -0
- package/android/src/main/java/io/sentry/react/RNSentryModule.java +2 -1
- package/dist/js/backend.d.ts +4 -4
- package/dist/js/backend.js +10 -10
- package/dist/js/backend.js.map +1 -1
- package/dist/js/client.d.ts +3 -3
- package/dist/js/client.js +3 -3
- package/dist/js/client.js.map +1 -1
- package/dist/js/definitions.d.ts +2 -2
- package/dist/js/definitions.js.map +1 -1
- package/dist/js/index.d.ts +12 -12
- package/dist/js/index.js +12 -12
- package/dist/js/index.js.map +1 -1
- package/dist/js/integrations/debugsymbolicator.d.ts +1 -1
- package/dist/js/integrations/debugsymbolicator.js +17 -17
- package/dist/js/integrations/debugsymbolicator.js.map +1 -1
- package/dist/js/integrations/devicecontext.d.ts +1 -1
- package/dist/js/integrations/devicecontext.js +4 -4
- package/dist/js/integrations/devicecontext.js.map +1 -1
- package/dist/js/integrations/eventorigin.d.ts +1 -1
- package/dist/js/integrations/eventorigin.js +3 -3
- package/dist/js/integrations/eventorigin.js.map +1 -1
- package/dist/js/integrations/index.d.ts +6 -6
- package/dist/js/integrations/index.js +6 -6
- package/dist/js/integrations/index.js.map +1 -1
- package/dist/js/integrations/reactnativeerrorhandlers.d.ts +1 -1
- package/dist/js/integrations/reactnativeerrorhandlers.js +21 -21
- package/dist/js/integrations/reactnativeerrorhandlers.js.map +1 -1
- package/dist/js/integrations/release.d.ts +1 -1
- package/dist/js/integrations/release.js +7 -7
- package/dist/js/integrations/release.js.map +1 -1
- package/dist/js/integrations/sdkinfo.d.ts +1 -1
- package/dist/js/integrations/sdkinfo.js +8 -8
- package/dist/js/integrations/sdkinfo.js.map +1 -1
- package/dist/js/measurements.js +2 -2
- package/dist/js/measurements.js.map +1 -1
- package/dist/js/options.d.ts +4 -4
- package/dist/js/options.js.map +1 -1
- package/dist/js/scope.d.ts +2 -2
- package/dist/js/scope.js +2 -2
- package/dist/js/scope.js.map +1 -1
- package/dist/js/sdk.d.ts +2 -2
- package/dist/js/sdk.js +28 -28
- package/dist/js/sdk.js.map +1 -1
- package/dist/js/touchevents.d.ts +2 -2
- package/dist/js/touchevents.d.ts.map +1 -1
- package/dist/js/touchevents.js +15 -15
- package/dist/js/touchevents.js.map +1 -1
- package/dist/js/tracing/index.d.ts +7 -7
- package/dist/js/tracing/index.js +6 -6
- package/dist/js/tracing/index.js.map +1 -1
- package/dist/js/tracing/nativeframes.d.ts +2 -2
- package/dist/js/tracing/nativeframes.js +6 -6
- package/dist/js/tracing/nativeframes.js.map +1 -1
- package/dist/js/tracing/reactnativenavigation.d.ts +4 -4
- package/dist/js/tracing/reactnativenavigation.js +6 -6
- package/dist/js/tracing/reactnativenavigation.js.map +1 -1
- package/dist/js/tracing/reactnativeprofiler.d.ts +1 -1
- package/dist/js/tracing/reactnativeprofiler.js +3 -3
- package/dist/js/tracing/reactnativeprofiler.js.map +1 -1
- package/dist/js/tracing/reactnativetracing.d.ts +7 -7
- package/dist/js/tracing/reactnativetracing.js +18 -18
- package/dist/js/tracing/reactnativetracing.js.map +1 -1
- package/dist/js/tracing/reactnavigation.d.ts +3 -3
- package/dist/js/tracing/reactnavigation.js +17 -17
- package/dist/js/tracing/reactnavigation.js.map +1 -1
- package/dist/js/tracing/reactnavigationv4.d.ts +3 -3
- package/dist/js/tracing/reactnavigationv4.js +17 -17
- package/dist/js/tracing/reactnavigationv4.js.map +1 -1
- package/dist/js/tracing/routingInstrumentation.d.ts +3 -3
- package/dist/js/tracing/routingInstrumentation.js +1 -1
- package/dist/js/tracing/routingInstrumentation.js.map +1 -1
- package/dist/js/tracing/stalltracking.d.ts +2 -2
- package/dist/js/tracing/stalltracking.js +8 -8
- package/dist/js/tracing/stalltracking.js.map +1 -1
- package/dist/js/tracing/types.d.ts +3 -3
- package/dist/js/tracing/types.js.map +1 -1
- package/dist/js/tracing/utils.d.ts +2 -2
- package/dist/js/tracing/utils.js +6 -6
- package/dist/js/tracing/utils.js.map +1 -1
- package/dist/js/transports/native.d.ts +2 -2
- package/dist/js/transports/native.js +2 -2
- package/dist/js/transports/native.js.map +1 -1
- package/dist/js/version.d.ts +1 -1
- package/dist/js/version.js +2 -2
- package/dist/js/version.js.map +1 -1
- package/dist/js/wrapper.d.ts +4 -4
- package/dist/js/wrapper.js +19 -19
- package/dist/js/wrapper.js.map +1 -1
- package/package.json +13 -13
- package/react-native.config.js +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stalltracking.js","sourceRoot":"","sources":["../../../src/js/tracing/stalltracking.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\nimport { IdleTransaction, Span, Transaction } from \"@sentry/tracing\";\nimport { Measurements } from \"@sentry/types\";\nimport { logger, timestampInSeconds } from \"@sentry/utils\";\n\nexport interface StallMeasurements extends Measurements {\n stall_count: { value: number };\n stall_total_time: { value: number };\n stall_longest_time: { value: number };\n}\n\nexport type StallTrackingOptions = {\n /**\n * How long in milliseconds an event loop iteration can be delayed for before being considered a \"stall.\"\n * @default 100\n */\n minimumStallThreshold: number;\n};\n\n/** Margin of error of 20ms */\nconst MARGIN_OF_ERROR_SECONDS = 0.02;\n/** How long between each iteration in the event loop tracker timeout */\nconst LOOP_TIMEOUT_INTERVAL_MS = 50;\n/** Limit for how many transactions the stall tracker will track at a time to prevent leaks due to transactions not being finished */\nconst MAX_RUNNING_TRANSACTIONS = 10;\n\n/**\n * Stall measurement tracker inspired by the `JSEventLoopWatchdog` used internally in React Native:\n * https://github.com/facebook/react-native/blob/006f5afe120c290a37cf6ff896748fbc062bf7ed/Libraries/Interaction/JSEventLoopWatchdog.js\n *\n * However, we modified the interval implementation to instead have a fixed loop timeout interval of `LOOP_TIMEOUT_INTERVAL_MS`.\n * We then would consider that iteration a stall when the total time for that interval to run is greater than `LOOP_TIMEOUT_INTERVAL_MS + minimumStallThreshold`\n */\nexport class StallTrackingInstrumentation {\n public isTracking: boolean = false;\n\n private _minimumStallThreshold: number;\n\n /** Total amount of time of all stalls that occurred during the current tracking session */\n private _totalStallTime: number = 0;\n /** Total number of stalls that occurred during the current tracking session */\n private _stallCount: number = 0;\n\n /** The last timestamp the iteration ran in milliseconds */\n private _lastIntervalMs: number = 0;\n private _timeout: ReturnType<typeof setTimeout> | null = null;\n\n private _statsByTransaction: Map<\n Transaction,\n {\n longestStallTime: number;\n atStart: StallMeasurements;\n atTimestamp: {\n timestamp: number;\n stats: StallMeasurements;\n } | null;\n }\n > = new Map();\n\n public constructor(\n options: StallTrackingOptions = { minimumStallThreshold: 50 }\n ) {\n this._minimumStallThreshold = options.minimumStallThreshold;\n }\n\n /**\n * @inheritDoc\n * Not used for this integration. Instead call `registerTransactionStart` to start tracking.\n */\n public setupOnce(): void {\n // Do nothing.\n }\n\n /**\n * Register a transaction as started. Starts stall tracking if not already running.\n * @returns A finish method that returns the stall measurements.\n */\n public onTransactionStart(transaction: Transaction): void {\n if (this._statsByTransaction.has(transaction)) {\n logger.error(\n \"[StallTracking] Tried to start stall tracking on a transaction already being tracked. Measurements might be lost.\"\n );\n\n return;\n }\n\n this._startTracking();\n this._statsByTransaction.set(transaction, {\n longestStallTime: 0,\n atTimestamp: null,\n atStart: this._getCurrentStats(transaction),\n });\n this._flushLeakedTransactions();\n\n if (transaction.spanRecorder) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const originalAdd = transaction.spanRecorder.add;\n\n transaction.spanRecorder.add = (span: Span): void => {\n originalAdd.apply(transaction.spanRecorder, [span]);\n\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const originalSpanFinish = span.finish;\n\n span.finish = (endTimestamp?: number) => {\n // We let the span determine its own end timestamp as well in case anything gets changed upstream\n originalSpanFinish.apply(span, [endTimestamp]);\n\n // The span should set a timestamp, so this would be defined.\n if (span.endTimestamp) {\n this._markSpanFinish(transaction, span.endTimestamp);\n }\n };\n };\n }\n }\n\n /**\n * Logs a transaction as finished.\n * Stops stall tracking if no more transactions are running.\n * @returns The stall measurements\n */\n public onTransactionFinish(\n transaction: Transaction | IdleTransaction,\n passedEndTimestamp?: number\n ): void {\n const transactionStats = this._statsByTransaction.get(transaction);\n\n if (!transactionStats) {\n // Transaction has been flushed out somehow, we return null.\n logger.log(\n \"[StallTracking] Stall measurements were not added to transaction due to exceeding the max count.\"\n );\n\n this._statsByTransaction.delete(transaction);\n this._shouldStopTracking();\n\n return;\n }\n\n const endTimestamp = passedEndTimestamp ?? transaction.endTimestamp;\n\n const spans = transaction.spanRecorder\n ? transaction.spanRecorder.spans\n : [];\n const finishedSpanCount = spans.reduce(\n (count, s) => (s !== transaction && s.endTimestamp ? count + 1 : count),\n 0\n );\n\n const trimEnd = transaction.toContext().trimEnd;\n const endWillBeTrimmed = trimEnd && finishedSpanCount > 0;\n\n /*\n This is not safe in the case that something changes upstream, but if we're planning to move this over to @sentry/javascript anyways,\n we can have this temporarily for now.\n */\n const isIdleTransaction = \"activities\" in transaction;\n\n let statsOnFinish: StallMeasurements | undefined;\n if (endTimestamp && isIdleTransaction) {\n /*\n There is different behavior regarding child spans in a normal transaction and an idle transaction. In normal transactions,\n the child spans that aren't finished will be dumped, while in an idle transaction they're cancelled and finished.\n\n Note: `endTimestamp` will always be defined if this is called on an idle transaction finish. This is because we only instrument\n idle transactions inside `ReactNativeTracing`, which will pass an `endTimestamp`.\n */\n\n // There will be cancelled spans, which means that the end won't be trimmed\n const spansWillBeCancelled = spans.some(\n (s) =>\n s !== transaction &&\n s.startTimestamp < endTimestamp &&\n !s.endTimestamp\n );\n\n if (endWillBeTrimmed && !spansWillBeCancelled) {\n // the last span's timestamp will be used.\n\n if (transactionStats.atTimestamp) {\n statsOnFinish = transactionStats.atTimestamp.stats;\n }\n } else {\n // this endTimestamp will be used.\n statsOnFinish = this._getCurrentStats(transaction);\n }\n } else if (endWillBeTrimmed) {\n // If `trimEnd` is used, and there is a span to trim to. If there isn't, then the transaction should use `endTimestamp` or generate one.\n if (transactionStats.atTimestamp) {\n statsOnFinish = transactionStats.atTimestamp.stats;\n }\n } else if (!endTimestamp) {\n statsOnFinish = this._getCurrentStats(transaction);\n }\n\n this._statsByTransaction.delete(transaction);\n this._shouldStopTracking();\n\n if (!statsOnFinish) {\n if (typeof endTimestamp !== \"undefined\") {\n logger.log(\n \"[StallTracking] Stall measurements not added due to `endTimestamp` being set.\"\n );\n } else if (trimEnd) {\n logger.log(\n \"[StallTracking] Stall measurements not added due to `trimEnd` being set but we could not determine the stall measurements at that time.\"\n );\n }\n\n return;\n }\n\n const measurements = {\n stall_count: {\n value:\n statsOnFinish.stall_count.value -\n transactionStats.atStart.stall_count.value,\n },\n stall_total_time: {\n value:\n statsOnFinish.stall_total_time.value -\n transactionStats.atStart.stall_total_time.value,\n },\n stall_longest_time: statsOnFinish.stall_longest_time,\n };\n\n transaction.setMeasurements(measurements);\n }\n\n /**\n * Logs the finish time of the span for use in `trimEnd: true` transactions.\n */\n private _markSpanFinish(\n transaction: Transaction,\n spanEndTimestamp: number\n ): void {\n const previousStats = this._statsByTransaction.get(transaction);\n if (previousStats) {\n if (\n Math.abs(timestampInSeconds() - spanEndTimestamp) >\n MARGIN_OF_ERROR_SECONDS\n ) {\n logger.log(\n \"[StallTracking] Span end not logged due to end timestamp being outside the margin of error from now.\"\n );\n\n if (\n previousStats.atTimestamp &&\n previousStats.atTimestamp.timestamp < spanEndTimestamp\n ) {\n // We also need to delete the stat for the last span, as the transaction would be trimmed to this span not the last one.\n this._statsByTransaction.set(transaction, {\n ...previousStats,\n atTimestamp: null,\n });\n }\n } else {\n this._statsByTransaction.set(transaction, {\n ...previousStats,\n atTimestamp: {\n timestamp: spanEndTimestamp,\n stats: this._getCurrentStats(transaction),\n },\n });\n }\n }\n }\n\n /**\n * Get the current stats for a transaction at a given time.\n */\n private _getCurrentStats(transaction: Transaction): StallMeasurements {\n return {\n stall_count: { value: this._stallCount },\n stall_total_time: { value: this._totalStallTime },\n stall_longest_time: {\n value: this._statsByTransaction.get(transaction)?.longestStallTime ?? 0,\n },\n };\n }\n\n /**\n * Start tracking stalls\n */\n private _startTracking(): void {\n if (!this.isTracking) {\n this.isTracking = true;\n this._lastIntervalMs = Math.floor(timestampInSeconds() * 1000);\n\n this._iteration();\n }\n }\n\n /**\n * Stops the stall tracking interval and calls reset().\n */\n private _stopTracking(): void {\n this.isTracking = false;\n\n if (this._timeout !== null) {\n clearTimeout(this._timeout);\n this._timeout = null;\n }\n\n this._reset();\n }\n\n /**\n * Will stop tracking if there are no more transactions.\n */\n private _shouldStopTracking(): void {\n if (this._statsByTransaction.size === 0) {\n this._stopTracking();\n }\n }\n\n /**\n * Clears all the collected stats\n */\n private _reset(): void {\n this._stallCount = 0;\n this._totalStallTime = 0;\n this._lastIntervalMs = 0;\n this._statsByTransaction.clear();\n }\n\n /**\n * Iteration of the stall tracking interval. Measures how long the timer strayed from its expected time of running, and how\n * long the stall is for.\n */\n private _iteration(): void {\n const now = timestampInSeconds() * 1000;\n const totalTimeTaken = now - this._lastIntervalMs;\n\n if (\n totalTimeTaken >=\n LOOP_TIMEOUT_INTERVAL_MS + this._minimumStallThreshold\n ) {\n const stallTime = totalTimeTaken - LOOP_TIMEOUT_INTERVAL_MS;\n this._stallCount += 1;\n this._totalStallTime += stallTime;\n\n for (const [transaction, value] of this._statsByTransaction.entries()) {\n const longestStallTime = Math.max(\n value.longestStallTime ?? 0,\n stallTime\n );\n\n this._statsByTransaction.set(transaction, {\n ...value,\n longestStallTime,\n });\n }\n }\n\n this._lastIntervalMs = now;\n\n if (this.isTracking) {\n this._timeout = setTimeout(\n this._iteration.bind(this),\n LOOP_TIMEOUT_INTERVAL_MS\n );\n }\n }\n\n /**\n * Deletes leaked transactions (Earliest transactions when we have more than MAX_RUNNING_TRANSACTIONS transactions.)\n */\n private _flushLeakedTransactions(): void {\n if (this._statsByTransaction.size > MAX_RUNNING_TRANSACTIONS) {\n let counter = 0;\n const len = this._statsByTransaction.size - MAX_RUNNING_TRANSACTIONS;\n const transactions = this._statsByTransaction.keys();\n for (const t of transactions) {\n if (counter >= len) break;\n counter += 1;\n this._statsByTransaction.delete(t);\n }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"stalltracking.js","sourceRoot":"","sources":["../../../src/js/tracing/stalltracking.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\nimport { IdleTransaction, Span, Transaction } from '@sentry/tracing';\nimport { Measurements } from '@sentry/types';\nimport { logger, timestampInSeconds } from '@sentry/utils';\n\nexport interface StallMeasurements extends Measurements {\n stall_count: { value: number };\n stall_total_time: { value: number };\n stall_longest_time: { value: number };\n}\n\nexport type StallTrackingOptions = {\n /**\n * How long in milliseconds an event loop iteration can be delayed for before being considered a \"stall.\"\n * @default 100\n */\n minimumStallThreshold: number;\n};\n\n/** Margin of error of 20ms */\nconst MARGIN_OF_ERROR_SECONDS = 0.02;\n/** How long between each iteration in the event loop tracker timeout */\nconst LOOP_TIMEOUT_INTERVAL_MS = 50;\n/** Limit for how many transactions the stall tracker will track at a time to prevent leaks due to transactions not being finished */\nconst MAX_RUNNING_TRANSACTIONS = 10;\n\n/**\n * Stall measurement tracker inspired by the `JSEventLoopWatchdog` used internally in React Native:\n * https://github.com/facebook/react-native/blob/006f5afe120c290a37cf6ff896748fbc062bf7ed/Libraries/Interaction/JSEventLoopWatchdog.js\n *\n * However, we modified the interval implementation to instead have a fixed loop timeout interval of `LOOP_TIMEOUT_INTERVAL_MS`.\n * We then would consider that iteration a stall when the total time for that interval to run is greater than `LOOP_TIMEOUT_INTERVAL_MS + minimumStallThreshold`\n */\nexport class StallTrackingInstrumentation {\n public isTracking: boolean = false;\n\n private _minimumStallThreshold: number;\n\n /** Total amount of time of all stalls that occurred during the current tracking session */\n private _totalStallTime: number = 0;\n /** Total number of stalls that occurred during the current tracking session */\n private _stallCount: number = 0;\n\n /** The last timestamp the iteration ran in milliseconds */\n private _lastIntervalMs: number = 0;\n private _timeout: ReturnType<typeof setTimeout> | null = null;\n\n private _statsByTransaction: Map<\n Transaction,\n {\n longestStallTime: number;\n atStart: StallMeasurements;\n atTimestamp: {\n timestamp: number;\n stats: StallMeasurements;\n } | null;\n }\n > = new Map();\n\n public constructor(\n options: StallTrackingOptions = { minimumStallThreshold: 50 }\n ) {\n this._minimumStallThreshold = options.minimumStallThreshold;\n }\n\n /**\n * @inheritDoc\n * Not used for this integration. Instead call `registerTransactionStart` to start tracking.\n */\n public setupOnce(): void {\n // Do nothing.\n }\n\n /**\n * Register a transaction as started. Starts stall tracking if not already running.\n * @returns A finish method that returns the stall measurements.\n */\n public onTransactionStart(transaction: Transaction): void {\n if (this._statsByTransaction.has(transaction)) {\n logger.error(\n '[StallTracking] Tried to start stall tracking on a transaction already being tracked. Measurements might be lost.'\n );\n\n return;\n }\n\n this._startTracking();\n this._statsByTransaction.set(transaction, {\n longestStallTime: 0,\n atTimestamp: null,\n atStart: this._getCurrentStats(transaction),\n });\n this._flushLeakedTransactions();\n\n if (transaction.spanRecorder) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const originalAdd = transaction.spanRecorder.add;\n\n transaction.spanRecorder.add = (span: Span): void => {\n originalAdd.apply(transaction.spanRecorder, [span]);\n\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const originalSpanFinish = span.finish;\n\n span.finish = (endTimestamp?: number) => {\n // We let the span determine its own end timestamp as well in case anything gets changed upstream\n originalSpanFinish.apply(span, [endTimestamp]);\n\n // The span should set a timestamp, so this would be defined.\n if (span.endTimestamp) {\n this._markSpanFinish(transaction, span.endTimestamp);\n }\n };\n };\n }\n }\n\n /**\n * Logs a transaction as finished.\n * Stops stall tracking if no more transactions are running.\n * @returns The stall measurements\n */\n public onTransactionFinish(\n transaction: Transaction | IdleTransaction,\n passedEndTimestamp?: number\n ): void {\n const transactionStats = this._statsByTransaction.get(transaction);\n\n if (!transactionStats) {\n // Transaction has been flushed out somehow, we return null.\n logger.log(\n '[StallTracking] Stall measurements were not added to transaction due to exceeding the max count.'\n );\n\n this._statsByTransaction.delete(transaction);\n this._shouldStopTracking();\n\n return;\n }\n\n const endTimestamp = passedEndTimestamp ?? transaction.endTimestamp;\n\n const spans = transaction.spanRecorder\n ? transaction.spanRecorder.spans\n : [];\n const finishedSpanCount = spans.reduce(\n (count, s) => (s !== transaction && s.endTimestamp ? count + 1 : count),\n 0\n );\n\n const trimEnd = transaction.toContext().trimEnd;\n const endWillBeTrimmed = trimEnd && finishedSpanCount > 0;\n\n /*\n This is not safe in the case that something changes upstream, but if we're planning to move this over to @sentry/javascript anyways,\n we can have this temporarily for now.\n */\n const isIdleTransaction = 'activities' in transaction;\n\n let statsOnFinish: StallMeasurements | undefined;\n if (endTimestamp && isIdleTransaction) {\n /*\n There is different behavior regarding child spans in a normal transaction and an idle transaction. In normal transactions,\n the child spans that aren't finished will be dumped, while in an idle transaction they're cancelled and finished.\n\n Note: `endTimestamp` will always be defined if this is called on an idle transaction finish. This is because we only instrument\n idle transactions inside `ReactNativeTracing`, which will pass an `endTimestamp`.\n */\n\n // There will be cancelled spans, which means that the end won't be trimmed\n const spansWillBeCancelled = spans.some(\n (s) =>\n s !== transaction &&\n s.startTimestamp < endTimestamp &&\n !s.endTimestamp\n );\n\n if (endWillBeTrimmed && !spansWillBeCancelled) {\n // the last span's timestamp will be used.\n\n if (transactionStats.atTimestamp) {\n statsOnFinish = transactionStats.atTimestamp.stats;\n }\n } else {\n // this endTimestamp will be used.\n statsOnFinish = this._getCurrentStats(transaction);\n }\n } else if (endWillBeTrimmed) {\n // If `trimEnd` is used, and there is a span to trim to. If there isn't, then the transaction should use `endTimestamp` or generate one.\n if (transactionStats.atTimestamp) {\n statsOnFinish = transactionStats.atTimestamp.stats;\n }\n } else if (!endTimestamp) {\n statsOnFinish = this._getCurrentStats(transaction);\n }\n\n this._statsByTransaction.delete(transaction);\n this._shouldStopTracking();\n\n if (!statsOnFinish) {\n if (typeof endTimestamp !== 'undefined') {\n logger.log(\n '[StallTracking] Stall measurements not added due to `endTimestamp` being set.'\n );\n } else if (trimEnd) {\n logger.log(\n '[StallTracking] Stall measurements not added due to `trimEnd` being set but we could not determine the stall measurements at that time.'\n );\n }\n\n return;\n }\n\n const measurements = {\n stall_count: {\n value:\n statsOnFinish.stall_count.value -\n transactionStats.atStart.stall_count.value,\n },\n stall_total_time: {\n value:\n statsOnFinish.stall_total_time.value -\n transactionStats.atStart.stall_total_time.value,\n },\n stall_longest_time: statsOnFinish.stall_longest_time,\n };\n\n transaction.setMeasurements(measurements);\n }\n\n /**\n * Logs the finish time of the span for use in `trimEnd: true` transactions.\n */\n private _markSpanFinish(\n transaction: Transaction,\n spanEndTimestamp: number\n ): void {\n const previousStats = this._statsByTransaction.get(transaction);\n if (previousStats) {\n if (\n Math.abs(timestampInSeconds() - spanEndTimestamp) >\n MARGIN_OF_ERROR_SECONDS\n ) {\n logger.log(\n '[StallTracking] Span end not logged due to end timestamp being outside the margin of error from now.'\n );\n\n if (\n previousStats.atTimestamp &&\n previousStats.atTimestamp.timestamp < spanEndTimestamp\n ) {\n // We also need to delete the stat for the last span, as the transaction would be trimmed to this span not the last one.\n this._statsByTransaction.set(transaction, {\n ...previousStats,\n atTimestamp: null,\n });\n }\n } else {\n this._statsByTransaction.set(transaction, {\n ...previousStats,\n atTimestamp: {\n timestamp: spanEndTimestamp,\n stats: this._getCurrentStats(transaction),\n },\n });\n }\n }\n }\n\n /**\n * Get the current stats for a transaction at a given time.\n */\n private _getCurrentStats(transaction: Transaction): StallMeasurements {\n return {\n stall_count: { value: this._stallCount },\n stall_total_time: { value: this._totalStallTime },\n stall_longest_time: {\n value: this._statsByTransaction.get(transaction)?.longestStallTime ?? 0,\n },\n };\n }\n\n /**\n * Start tracking stalls\n */\n private _startTracking(): void {\n if (!this.isTracking) {\n this.isTracking = true;\n this._lastIntervalMs = Math.floor(timestampInSeconds() * 1000);\n\n this._iteration();\n }\n }\n\n /**\n * Stops the stall tracking interval and calls reset().\n */\n private _stopTracking(): void {\n this.isTracking = false;\n\n if (this._timeout !== null) {\n clearTimeout(this._timeout);\n this._timeout = null;\n }\n\n this._reset();\n }\n\n /**\n * Will stop tracking if there are no more transactions.\n */\n private _shouldStopTracking(): void {\n if (this._statsByTransaction.size === 0) {\n this._stopTracking();\n }\n }\n\n /**\n * Clears all the collected stats\n */\n private _reset(): void {\n this._stallCount = 0;\n this._totalStallTime = 0;\n this._lastIntervalMs = 0;\n this._statsByTransaction.clear();\n }\n\n /**\n * Iteration of the stall tracking interval. Measures how long the timer strayed from its expected time of running, and how\n * long the stall is for.\n */\n private _iteration(): void {\n const now = timestampInSeconds() * 1000;\n const totalTimeTaken = now - this._lastIntervalMs;\n\n if (\n totalTimeTaken >=\n LOOP_TIMEOUT_INTERVAL_MS + this._minimumStallThreshold\n ) {\n const stallTime = totalTimeTaken - LOOP_TIMEOUT_INTERVAL_MS;\n this._stallCount += 1;\n this._totalStallTime += stallTime;\n\n for (const [transaction, value] of this._statsByTransaction.entries()) {\n const longestStallTime = Math.max(\n value.longestStallTime ?? 0,\n stallTime\n );\n\n this._statsByTransaction.set(transaction, {\n ...value,\n longestStallTime,\n });\n }\n }\n\n this._lastIntervalMs = now;\n\n if (this.isTracking) {\n this._timeout = setTimeout(\n this._iteration.bind(this),\n LOOP_TIMEOUT_INTERVAL_MS\n );\n }\n }\n\n /**\n * Deletes leaked transactions (Earliest transactions when we have more than MAX_RUNNING_TRANSACTIONS transactions.)\n */\n private _flushLeakedTransactions(): void {\n if (this._statsByTransaction.size > MAX_RUNNING_TRANSACTIONS) {\n let counter = 0;\n const len = this._statsByTransaction.size - MAX_RUNNING_TRANSACTIONS;\n const transactions = this._statsByTransaction.keys();\n for (const t of transactions) {\n if (counter >= len) break;\n counter += 1;\n this._statsByTransaction.delete(t);\n }\n }\n }\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TransactionContext } from
|
|
1
|
+
import { TransactionContext } from '@sentry/types';
|
|
2
2
|
export interface ReactNavigationRoute {
|
|
3
3
|
name: string;
|
|
4
4
|
key: string;
|
|
@@ -20,8 +20,8 @@ export declare type RouteChangeContextData = {
|
|
|
20
20
|
};
|
|
21
21
|
export interface ReactNavigationTransactionContext extends TransactionContext {
|
|
22
22
|
tags: {
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
'routing.instrumentation': string;
|
|
24
|
+
'routing.route.name': string;
|
|
25
25
|
};
|
|
26
26
|
data: RouteChangeContextData;
|
|
27
27
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/js/tracing/types.ts"],"names":[],"mappings":"","sourcesContent":["import { TransactionContext } from
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/js/tracing/types.ts"],"names":[],"mappings":"","sourcesContent":["import { TransactionContext } from '@sentry/types';\n\nexport interface ReactNavigationRoute {\n name: string;\n key: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n params: Record<string, any>;\n}\n\nexport interface ReactNavigationCurrentRoute extends ReactNavigationRoute {\n hasBeenSeen: boolean;\n}\n\nexport type RouteChangeContextData = {\n previousRoute?: {\n [key: string]: unknown;\n name: string;\n } | null;\n route: {\n [key: string]: unknown;\n name: string;\n hasBeenSeen: boolean;\n };\n};\n\nexport interface ReactNavigationTransactionContext extends TransactionContext {\n tags: {\n 'routing.instrumentation': string;\n 'routing.route.name': string;\n };\n data: RouteChangeContextData;\n}\n\nexport type BeforeNavigate = (\n context: TransactionContext\n) => TransactionContext;\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { IdleTransaction, Span, Transaction } from
|
|
2
|
-
import { TransactionContext } from
|
|
1
|
+
import { IdleTransaction, Span, Transaction } from '@sentry/tracing';
|
|
2
|
+
import { TransactionContext } from '@sentry/types';
|
|
3
3
|
export declare const getBlankTransactionContext: (name: string) => TransactionContext;
|
|
4
4
|
/**
|
|
5
5
|
* A margin of error of 50ms is allowed for the async native bridge call.
|
package/dist/js/tracing/utils.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { timestampInSeconds } from
|
|
1
|
+
import { timestampInSeconds } from '@sentry/utils';
|
|
2
2
|
export const getBlankTransactionContext = (name) => {
|
|
3
3
|
return {
|
|
4
|
-
name:
|
|
5
|
-
op:
|
|
4
|
+
name: 'Route Change',
|
|
5
|
+
op: 'navigation',
|
|
6
6
|
tags: {
|
|
7
|
-
|
|
7
|
+
'routing.instrumentation': name,
|
|
8
8
|
},
|
|
9
9
|
data: {},
|
|
10
10
|
};
|
|
@@ -30,8 +30,8 @@ transaction, endTimestamp) {
|
|
|
30
30
|
const diff = endTimestamp - transaction.startTimestamp;
|
|
31
31
|
const isOutdatedTransaction = endTimestamp && (diff > secToMs(maxDuration) || diff < 0);
|
|
32
32
|
if (isOutdatedTransaction) {
|
|
33
|
-
transaction.setStatus(
|
|
34
|
-
transaction.setTag(
|
|
33
|
+
transaction.setStatus('deadline_exceeded');
|
|
34
|
+
transaction.setTag('maxTransactionDurationExceeded', 'true');
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/js/tracing/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,IAAY,EACQ,EAAE;IACtB,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE;YACJ,yBAAyB,EAAE,IAAI;SAChC;QACD,IAAI,EAAE,EAAE;KACT,CAAC;AACJ,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAE5C,MAAM,sBAAsB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAE1C;;;GAGG;AACH,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI,GAAG,IAAI,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,WAAmB,EAAE,aAAa;AAClC,WAA4B,EAC5B,YAAoB;IAEpB,MAAM,IAAI,GAAG,YAAY,GAAG,WAAW,CAAC,cAAc,CAAC;IACvD,MAAM,qBAAqB,GACzB,YAAY,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;IAC5D,IAAI,qBAAqB,EAAE;QACzB,WAAW,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC3C,WAAW,CAAC,MAAM,CAAC,gCAAgC,EAAE,MAAM,CAAC,CAAC;KAC9D;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACvC,OAAO,sBAAsB,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,WAAwB,EACxB,QAAqD;IAErD,IAAI,WAAW,CAAC,YAAY,EAAE;QAC5B,6DAA6D;QAC7D,MAAM,WAAW,GAAG,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC;QAEjD,WAAW,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,IAAU,EAAQ,EAAE;YAClD,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YAEpD,6DAA6D;YAC7D,MAAM,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC;YAEvC,IAAI,CAAC,MAAM,GAAG,CAAC,YAAqB,EAAE,EAAE;gBACtC,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;gBAE/C,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YAC/B,CAAC,CAAC;QACJ,CAAC,CAAC;KACH;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,OAAO,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,GAAG,SAAS,CAAC,IAAI,uBAAuB,CAAC;AAC/E,CAAC","sourcesContent":["import { IdleTransaction, Span, Transaction } from
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/js/tracing/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,IAAY,EACQ,EAAE;IACtB,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE;YACJ,yBAAyB,EAAE,IAAI;SAChC;QACD,IAAI,EAAE,EAAE;KACT,CAAC;AACJ,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAE5C,MAAM,sBAAsB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAE1C;;;GAGG;AACH,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI,GAAG,IAAI,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,WAAmB,EAAE,aAAa;AAClC,WAA4B,EAC5B,YAAoB;IAEpB,MAAM,IAAI,GAAG,YAAY,GAAG,WAAW,CAAC,cAAc,CAAC;IACvD,MAAM,qBAAqB,GACzB,YAAY,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;IAC5D,IAAI,qBAAqB,EAAE;QACzB,WAAW,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC3C,WAAW,CAAC,MAAM,CAAC,gCAAgC,EAAE,MAAM,CAAC,CAAC;KAC9D;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACvC,OAAO,sBAAsB,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,WAAwB,EACxB,QAAqD;IAErD,IAAI,WAAW,CAAC,YAAY,EAAE;QAC5B,6DAA6D;QAC7D,MAAM,WAAW,GAAG,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC;QAEjD,WAAW,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,IAAU,EAAQ,EAAE;YAClD,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YAEpD,6DAA6D;YAC7D,MAAM,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC;YAEvC,IAAI,CAAC,MAAM,GAAG,CAAC,YAAqB,EAAE,EAAE;gBACtC,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;gBAE/C,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YAC/B,CAAC,CAAC;QACJ,CAAC,CAAC;KACH;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,OAAO,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,GAAG,SAAS,CAAC,IAAI,uBAAuB,CAAC;AAC/E,CAAC","sourcesContent":["import { IdleTransaction, Span, Transaction } from '@sentry/tracing';\nimport { TransactionContext } from '@sentry/types';\nimport { timestampInSeconds } from '@sentry/utils';\n\nexport const getBlankTransactionContext = (\n name: string\n): TransactionContext => {\n return {\n name: 'Route Change',\n op: 'navigation',\n tags: {\n 'routing.instrumentation': name,\n },\n data: {},\n };\n};\n\n/**\n * A margin of error of 50ms is allowed for the async native bridge call.\n * Anything larger would reduce the accuracy of our frames measurements.\n */\nexport const MARGIN_OF_ERROR_SECONDS = 0.05;\n\nconst timeOriginMilliseconds = Date.now();\n\n/**\n * Converts from seconds to milliseconds\n * @param time time in seconds\n */\nfunction secToMs(time: number): number {\n return time * 1000;\n}\n\n/**\n *\n */\nexport function adjustTransactionDuration(\n maxDuration: number, // in seconds\n transaction: IdleTransaction,\n endTimestamp: number\n): void {\n const diff = endTimestamp - transaction.startTimestamp;\n const isOutdatedTransaction =\n endTimestamp && (diff > secToMs(maxDuration) || diff < 0);\n if (isOutdatedTransaction) {\n transaction.setStatus('deadline_exceeded');\n transaction.setTag('maxTransactionDurationExceeded', 'true');\n }\n}\n\n/**\n * Returns the timestamp where the JS global scope was initialized.\n */\nexport function getTimeOriginMilliseconds(): number {\n return timeOriginMilliseconds;\n}\n\n/**\n * Calls the callback every time a child span of the transaction is finished.\n */\nexport function instrumentChildSpanFinish(\n transaction: Transaction,\n callback: (span: Span, endTimestamp?: number) => void\n): void {\n if (transaction.spanRecorder) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const originalAdd = transaction.spanRecorder.add;\n\n transaction.spanRecorder.add = (span: Span): void => {\n originalAdd.apply(transaction.spanRecorder, [span]);\n\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const originalSpanFinish = span.finish;\n\n span.finish = (endTimestamp?: number) => {\n originalSpanFinish.apply(span, [endTimestamp]);\n\n callback(span, endTimestamp);\n };\n };\n }\n}\n\n/**\n * Determines if the timestamp is now or within the specified margin of error from now.\n */\nexport function isNearToNow(timestamp: number): boolean {\n return Math.abs(timestampInSeconds() - timestamp) <= MARGIN_OF_ERROR_SECONDS;\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Event, Response, Transport } from
|
|
2
|
-
import { PromiseBuffer } from
|
|
1
|
+
import { Event, Response, Transport } from '@sentry/types';
|
|
2
|
+
import { PromiseBuffer } from '@sentry/utils';
|
|
3
3
|
/** Native Transport class implementation */
|
|
4
4
|
export declare class NativeTransport implements Transport {
|
|
5
5
|
/** A simple buffer holding all requests. */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { makePromiseBuffer } from
|
|
2
|
-
import { NATIVE } from
|
|
1
|
+
import { makePromiseBuffer } from '@sentry/utils';
|
|
2
|
+
import { NATIVE } from '../wrapper';
|
|
3
3
|
/** Native Transport class implementation */
|
|
4
4
|
export class NativeTransport {
|
|
5
5
|
constructor() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.js","sourceRoot":"","sources":["../../../src/js/transports/native.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAiB,MAAM,eAAe,CAAC;AAEjE,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,4CAA4C;AAC5C,MAAM,OAAO,eAAe;IAA5B;QACE,4CAA4C;QACzB,YAAO,GAA4B,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAe9E,CAAC;IAbC;;OAEG;IACI,SAAS,CAAC,KAAY;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,OAAgB;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;CACF","sourcesContent":["import { Event, Response, Transport } from
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../../../src/js/transports/native.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAiB,MAAM,eAAe,CAAC;AAEjE,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,4CAA4C;AAC5C,MAAM,OAAO,eAAe;IAA5B;QACE,4CAA4C;QACzB,YAAO,GAA4B,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAe9E,CAAC;IAbC;;OAEG;IACI,SAAS,CAAC,KAAY;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,OAAgB;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;CACF","sourcesContent":["import { Event, Response, Transport } from '@sentry/types';\nimport { makePromiseBuffer, PromiseBuffer } from '@sentry/utils';\n\nimport { NATIVE } from '../wrapper';\n\n/** Native Transport class implementation */\nexport class NativeTransport implements Transport {\n /** A simple buffer holding all requests. */\n protected readonly _buffer: PromiseBuffer<Response> = makePromiseBuffer(30);\n\n /**\n * @inheritDoc\n */\n public sendEvent(event: Event): PromiseLike<Response> {\n return this._buffer.add(() => NATIVE.sendEvent(event));\n }\n\n /**\n * @inheritDoc\n */\n public close(timeout?: number): PromiseLike<boolean> {\n return this._buffer.drain(timeout);\n }\n}\n"]}
|
package/dist/js/version.d.ts
CHANGED
package/dist/js/version.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export const SDK_NAME =
|
|
2
|
-
export const SDK_VERSION =
|
|
1
|
+
export const SDK_NAME = 'sentry.javascript.react-native';
|
|
2
|
+
export const SDK_VERSION = '3.4.2';
|
|
3
3
|
//# sourceMappingURL=version.js.map
|
package/dist/js/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/js/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,gCAAgC,CAAC;AACzD,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC","sourcesContent":["export const SDK_NAME =
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/js/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,gCAAgC,CAAC;AACzD,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC","sourcesContent":["export const SDK_NAME = 'sentry.javascript.react-native';\nexport const SDK_VERSION = '3.4.2';\n"]}
|
package/dist/js/wrapper.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Breadcrumb, Event, Package, Response, Severity, User } from
|
|
2
|
-
import { Platform } from
|
|
3
|
-
import { NativeAppStartResponse, NativeDeviceContextsResponse, NativeFramesResponse, NativeReleaseResponse, SentryNativeBridgeModule } from
|
|
4
|
-
import { ReactNativeOptions } from
|
|
1
|
+
import { Breadcrumb, Event, Package, Response, Severity, User } from '@sentry/types';
|
|
2
|
+
import { Platform } from 'react-native';
|
|
3
|
+
import { NativeAppStartResponse, NativeDeviceContextsResponse, NativeFramesResponse, NativeReleaseResponse, SentryNativeBridgeModule } from './definitions';
|
|
4
|
+
import { ReactNativeOptions } from './options';
|
|
5
5
|
interface SentryNativeWrapper {
|
|
6
6
|
enableNative: boolean;
|
|
7
7
|
nativeIsReady: boolean;
|
package/dist/js/wrapper.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { __awaiter, __rest } from "tslib";
|
|
2
2
|
/* eslint-disable max-lines */
|
|
3
|
-
import { Severity, } from
|
|
4
|
-
import { logger, SentryError } from
|
|
5
|
-
import { NativeModules, Platform } from
|
|
3
|
+
import { Severity, } from '@sentry/types';
|
|
4
|
+
import { logger, SentryError } from '@sentry/utils';
|
|
5
|
+
import { NativeModules, Platform } from 'react-native';
|
|
6
6
|
const RNSentry = NativeModules.RNSentry;
|
|
7
7
|
/**
|
|
8
8
|
* Our internal interface for calling native functions
|
|
@@ -17,8 +17,8 @@ export const NATIVE = {
|
|
|
17
17
|
return __awaiter(this, void 0, void 0, function* () {
|
|
18
18
|
if (!this.enableNative) {
|
|
19
19
|
return {
|
|
20
|
-
reason:
|
|
21
|
-
status:
|
|
20
|
+
reason: 'Event was skipped as native SDK is not enabled.',
|
|
21
|
+
status: 'skipped',
|
|
22
22
|
};
|
|
23
23
|
}
|
|
24
24
|
if (!this._isModuleLoaded(RNSentry)) {
|
|
@@ -32,7 +32,7 @@ export const NATIVE = {
|
|
|
32
32
|
sdk: event.sdk,
|
|
33
33
|
};
|
|
34
34
|
let envelopeWasSent = false;
|
|
35
|
-
if (NATIVE.platform ===
|
|
35
|
+
if (NATIVE.platform === 'android') {
|
|
36
36
|
// Android
|
|
37
37
|
const headerString = JSON.stringify(header);
|
|
38
38
|
/*
|
|
@@ -58,9 +58,9 @@ export const NATIVE = {
|
|
|
58
58
|
// The native call failed, we do nothing, we have payload.length as a fallback
|
|
59
59
|
}
|
|
60
60
|
const item = {
|
|
61
|
-
content_type:
|
|
61
|
+
content_type: 'application/json',
|
|
62
62
|
length,
|
|
63
|
-
type: (_e = payload.type) !== null && _e !== void 0 ? _e :
|
|
63
|
+
type: (_e = payload.type) !== null && _e !== void 0 ? _e : 'event',
|
|
64
64
|
};
|
|
65
65
|
const itemString = JSON.stringify(item);
|
|
66
66
|
const envelopeString = `${headerString}\n${itemString}\n${payloadString}`;
|
|
@@ -82,11 +82,11 @@ export const NATIVE = {
|
|
|
82
82
|
}
|
|
83
83
|
if (envelopeWasSent) {
|
|
84
84
|
return {
|
|
85
|
-
status:
|
|
85
|
+
status: 'success',
|
|
86
86
|
};
|
|
87
87
|
}
|
|
88
88
|
return {
|
|
89
|
-
status:
|
|
89
|
+
status: 'failed',
|
|
90
90
|
};
|
|
91
91
|
});
|
|
92
92
|
},
|
|
@@ -99,19 +99,19 @@ export const NATIVE = {
|
|
|
99
99
|
const options = Object.assign({ enableNative: true, autoInitializeNativeSdk: true }, originalOptions);
|
|
100
100
|
if (!options.enableNative) {
|
|
101
101
|
if (options.enableNativeNagger) {
|
|
102
|
-
logger.warn(
|
|
102
|
+
logger.warn('Note: Native Sentry SDK is disabled.');
|
|
103
103
|
}
|
|
104
104
|
this.enableNative = false;
|
|
105
105
|
return false;
|
|
106
106
|
}
|
|
107
107
|
if (!options.autoInitializeNativeSdk) {
|
|
108
108
|
if (options.enableNativeNagger) {
|
|
109
|
-
logger.warn(
|
|
109
|
+
logger.warn('Note: Native Sentry SDK was not initialized automatically, you will need to initialize it manually. If you wish to disable the native SDK and get rid of this warning, pass enableNative: false');
|
|
110
110
|
}
|
|
111
111
|
return false;
|
|
112
112
|
}
|
|
113
113
|
if (!options.dsn) {
|
|
114
|
-
logger.warn(
|
|
114
|
+
logger.warn('Warning: No DSN was provided. The Sentry SDK will be disabled. Native SDK will also not be initalized.');
|
|
115
115
|
return false;
|
|
116
116
|
}
|
|
117
117
|
if (!this._isModuleLoaded(RNSentry)) {
|
|
@@ -152,7 +152,7 @@ export const NATIVE = {
|
|
|
152
152
|
if (!this._isModuleLoaded(RNSentry)) {
|
|
153
153
|
throw this._NativeClientError;
|
|
154
154
|
}
|
|
155
|
-
if (this.platform !==
|
|
155
|
+
if (this.platform !== 'ios') {
|
|
156
156
|
return null;
|
|
157
157
|
}
|
|
158
158
|
return RNSentry.fetchNativeSdkInfo();
|
|
@@ -169,7 +169,7 @@ export const NATIVE = {
|
|
|
169
169
|
if (!this._isModuleLoaded(RNSentry)) {
|
|
170
170
|
throw this._NativeClientError;
|
|
171
171
|
}
|
|
172
|
-
if (this.platform !==
|
|
172
|
+
if (this.platform !== 'ios') {
|
|
173
173
|
// Only ios uses deviceContexts, return an empty object.
|
|
174
174
|
return {};
|
|
175
175
|
}
|
|
@@ -249,7 +249,7 @@ export const NATIVE = {
|
|
|
249
249
|
if (!this._isModuleLoaded(RNSentry)) {
|
|
250
250
|
throw this._NativeClientError;
|
|
251
251
|
}
|
|
252
|
-
const stringifiedValue = typeof value ===
|
|
252
|
+
const stringifiedValue = typeof value === 'string' ? value : JSON.stringify(value);
|
|
253
253
|
RNSentry.setTag(key, stringifiedValue);
|
|
254
254
|
},
|
|
255
255
|
/**
|
|
@@ -266,7 +266,7 @@ export const NATIVE = {
|
|
|
266
266
|
throw this._NativeClientError;
|
|
267
267
|
}
|
|
268
268
|
// we stringify the extra as native only takes in strings.
|
|
269
|
-
const stringifiedExtra = typeof extra ===
|
|
269
|
+
const stringifiedExtra = typeof extra === 'string' ? extra : JSON.stringify(extra);
|
|
270
270
|
RNSentry.setExtra(key, stringifiedExtra);
|
|
271
271
|
},
|
|
272
272
|
/**
|
|
@@ -352,7 +352,7 @@ export const NATIVE = {
|
|
|
352
352
|
Object.keys(data).forEach((dataKey) => {
|
|
353
353
|
const value = data[dataKey];
|
|
354
354
|
serialized[dataKey] =
|
|
355
|
-
typeof value ===
|
|
355
|
+
typeof value === 'string' ? value : JSON.stringify(value);
|
|
356
356
|
});
|
|
357
357
|
return serialized;
|
|
358
358
|
},
|
|
@@ -388,7 +388,7 @@ export const NATIVE = {
|
|
|
388
388
|
_isModuleLoaded(module) {
|
|
389
389
|
return !!module;
|
|
390
390
|
},
|
|
391
|
-
_DisabledNativeError: new SentryError(
|
|
391
|
+
_DisabledNativeError: new SentryError('Native is disabled'),
|
|
392
392
|
_NativeClientError: new SentryError("Native Client is not available, can't start on native."),
|
|
393
393
|
enableNative: true,
|
|
394
394
|
nativeIsReady: false,
|
package/dist/js/wrapper.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrapper.js","sourceRoot":"","sources":["../../src/js/wrapper.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\nimport {\n Breadcrumb,\n Event,\n Package,\n Response,\n Severity,\n User,\n} from \"@sentry/types\";\nimport { logger, SentryError } from \"@sentry/utils\";\nimport { NativeModules, Platform } from \"react-native\";\n\nimport {\n NativeAppStartResponse,\n NativeDeviceContextsResponse,\n NativeFramesResponse,\n NativeReleaseResponse,\n SentryNativeBridgeModule,\n} from \"./definitions\";\nimport { ReactNativeOptions } from \"./options\";\n\nconst RNSentry = NativeModules.RNSentry as SentryNativeBridgeModule | undefined;\n\ninterface SentryNativeWrapper {\n enableNative: boolean;\n nativeIsReady: boolean;\n platform: typeof Platform.OS;\n\n _NativeClientError: Error;\n _DisabledNativeError: Error;\n\n _processLevels(event: Event): Event;\n _processLevel(level: Severity): Severity;\n _serializeObject(data: { [key: string]: unknown }): { [key: string]: string };\n _isModuleLoaded(\n module: SentryNativeBridgeModule | undefined\n ): module is SentryNativeBridgeModule;\n\n isNativeTransportAvailable(): boolean;\n\n initNativeSdk(options: ReactNativeOptions): PromiseLike<boolean>;\n closeNativeSdk(): PromiseLike<void>;\n\n sendEvent(event: Event): PromiseLike<Response>;\n\n fetchNativeRelease(): PromiseLike<NativeReleaseResponse>;\n fetchNativeDeviceContexts(): PromiseLike<NativeDeviceContextsResponse>;\n fetchNativeAppStart(): PromiseLike<NativeAppStartResponse | null>;\n fetchNativeFrames(): PromiseLike<NativeFramesResponse | null>;\n fetchNativeSdkInfo(): PromiseLike<Package | null>;\n\n disableNativeFramesTracking(): void;\n\n addBreadcrumb(breadcrumb: Breadcrumb): void;\n setContext(key: string, context: { [key: string]: unknown } | null): void;\n clearBreadcrumbs(): void;\n setExtra(key: string, extra: unknown): void;\n setUser(user: User | null): void;\n setTag(key: string, value: string): void;\n\n nativeCrash(): void;\n}\n\n/**\n * Our internal interface for calling native functions\n */\nexport const NATIVE: SentryNativeWrapper = {\n /**\n * Sending the event over the bridge to native\n * @param event Event\n */\n async sendEvent(_event: Event): Promise<Response> {\n if (!this.enableNative) {\n return {\n reason: `Event was skipped as native SDK is not enabled.`,\n status: \"skipped\",\n };\n }\n\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n const event = this._processLevels(_event);\n\n // Delete this metadata as this should not be sent to Sentry.\n delete event.sdkProcessingMetadata;\n\n const header = {\n event_id: event.event_id,\n sdk: event.sdk,\n };\n\n let envelopeWasSent = false;\n if (NATIVE.platform === \"android\") {\n // Android\n\n const headerString = JSON.stringify(header);\n\n /*\n We do this to avoid duplicate breadcrumbs on Android as sentry-android applies the breadcrumbs\n from the native scope onto every envelope sent through it. This scope will contain the breadcrumbs\n sent through the scope sync feature. This causes duplicate breadcrumbs.\n We then remove the breadcrumbs in all cases but if it is handled == false,\n this is a signal that the app would crash and android would lose the breadcrumbs by the time the app is restarted to read\n the envelope.\n */\n if (event.exception?.values?.[0]?.mechanism?.handled != false && event.breadcrumbs) {\n event.breadcrumbs = [];\n }\n\n const payload = {\n ...event,\n message: {\n message: event.message,\n },\n };\n\n const payloadString = JSON.stringify(payload);\n let length = payloadString.length;\n try {\n length = await RNSentry.getStringBytesLength(payloadString);\n } catch {\n // The native call failed, we do nothing, we have payload.length as a fallback\n }\n\n const item = {\n content_type: \"application/json\",\n length,\n type: payload.type ?? \"event\",\n };\n\n const itemString = JSON.stringify(item);\n\n const envelopeString = `${headerString}\\n${itemString}\\n${payloadString}`;\n\n envelopeWasSent = await RNSentry.captureEnvelope(envelopeString);\n } else {\n // iOS/Mac\n\n const payload = {\n ...event,\n message: {\n message: event.message,\n },\n };\n\n // Serialize and remove any instances that will crash the native bridge such as Spans\n const serializedPayload = JSON.parse(JSON.stringify(payload));\n\n // The envelope item is created (and its length determined) on the iOS side of the native bridge.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n envelopeWasSent = await RNSentry.captureEnvelope({\n header,\n payload: serializedPayload,\n });\n }\n\n if (envelopeWasSent) {\n return {\n status: \"success\",\n };\n }\n\n return {\n status: \"failed\",\n };\n },\n\n /**\n * Starts native with the provided options.\n * @param options ReactNativeOptions\n */\n async initNativeSdk(originalOptions: ReactNativeOptions): Promise<boolean> {\n const options = {\n enableNative: true,\n autoInitializeNativeSdk: true,\n ...originalOptions,\n };\n\n if (!options.enableNative) {\n if (options.enableNativeNagger) {\n logger.warn(\"Note: Native Sentry SDK is disabled.\");\n }\n this.enableNative = false;\n return false;\n }\n if (!options.autoInitializeNativeSdk) {\n if (options.enableNativeNagger) {\n logger.warn(\n \"Note: Native Sentry SDK was not initialized automatically, you will need to initialize it manually. If you wish to disable the native SDK and get rid of this warning, pass enableNative: false\"\n );\n }\n return false;\n }\n\n if (!options.dsn) {\n logger.warn(\n \"Warning: No DSN was provided. The Sentry SDK will be disabled. Native SDK will also not be initalized.\"\n );\n return false;\n }\n\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n // filter out all the options that would crash native.\n /* eslint-disable @typescript-eslint/unbound-method,@typescript-eslint/no-unused-vars */\n const {\n beforeSend,\n beforeBreadcrumb,\n integrations,\n defaultIntegrations,\n transport,\n ...filteredOptions\n } = options;\n /* eslint-enable @typescript-eslint/unbound-method,@typescript-eslint/no-unused-vars */\n\n const nativeIsReady = await RNSentry.initNativeSdk(filteredOptions);\n\n this.nativeIsReady = nativeIsReady;\n\n return nativeIsReady;\n },\n\n /**\n * Fetches the release from native\n */\n async fetchNativeRelease(): Promise<NativeReleaseResponse> {\n if (!this.enableNative) {\n throw this._DisabledNativeError;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n return RNSentry.fetchNativeRelease();\n },\n\n /**\n * Fetches the Sdk info for the native sdk.\n * NOTE: Only available on iOS.\n */\n async fetchNativeSdkInfo(): Promise<Package | null> {\n if (!this.enableNative) {\n throw this._DisabledNativeError;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n if (this.platform !== \"ios\") {\n return null;\n }\n\n return RNSentry.fetchNativeSdkInfo();\n },\n\n /**\n * Fetches the device contexts. Not used on Android.\n */\n async fetchNativeDeviceContexts(): Promise<NativeDeviceContextsResponse> {\n if (!this.enableNative) {\n throw this._DisabledNativeError;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n if (this.platform !== \"ios\") {\n // Only ios uses deviceContexts, return an empty object.\n return {};\n }\n\n return RNSentry.fetchNativeDeviceContexts();\n },\n\n async fetchNativeAppStart(): Promise<NativeAppStartResponse | null> {\n if (!this.enableNative) {\n throw this._DisabledNativeError;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n return RNSentry.fetchNativeAppStart();\n },\n\n async fetchNativeFrames(): Promise<NativeFramesResponse | null> {\n if (!this.enableNative) {\n throw this._DisabledNativeError;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n return RNSentry.fetchNativeFrames();\n },\n\n /**\n * Triggers a native crash.\n * Use this only for testing purposes.\n */\n nativeCrash(): void {\n if (!this.enableNative) {\n return;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n RNSentry.crash();\n },\n\n /**\n * Sets the user in the native scope.\n * Passing null clears the user.\n */\n setUser(user: User | null): void {\n if (!this.enableNative) {\n return;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n // separate and serialze all non-default user keys.\n let defaultUserKeys = null;\n let otherUserKeys = null;\n if (user) {\n const { id, ip_address, email, username, ...otherKeys } = user;\n defaultUserKeys = this._serializeObject({\n email,\n id,\n ip_address,\n username,\n });\n otherUserKeys = this._serializeObject(otherKeys);\n }\n\n RNSentry.setUser(defaultUserKeys, otherUserKeys);\n },\n\n /**\n * Sets a tag in the native module.\n * @param key string\n * @param value string\n */\n setTag(key: string, value: string): void {\n if (!this.enableNative) {\n return;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n const stringifiedValue =\n typeof value === \"string\" ? value : JSON.stringify(value);\n\n RNSentry.setTag(key, stringifiedValue);\n },\n\n /**\n * Sets an extra in the native scope, will stringify\n * extra value if it isn't already a string.\n * @param key string\n * @param extra any\n */\n setExtra(key: string, extra: unknown): void {\n if (!this.enableNative) {\n return;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n // we stringify the extra as native only takes in strings.\n const stringifiedExtra =\n typeof extra === \"string\" ? extra : JSON.stringify(extra);\n\n RNSentry.setExtra(key, stringifiedExtra);\n },\n\n /**\n * Adds breadcrumb to the native scope.\n * @param breadcrumb Breadcrumb\n */\n addBreadcrumb(breadcrumb: Breadcrumb): void {\n if (!this.enableNative) {\n return;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n RNSentry.addBreadcrumb({\n ...breadcrumb,\n // Process and convert deprecated levels\n level: breadcrumb.level\n ? this._processLevel(breadcrumb.level)\n : undefined,\n data: breadcrumb.data\n ? this._serializeObject(breadcrumb.data)\n : undefined,\n });\n },\n\n /**\n * Clears breadcrumbs on the native scope.\n */\n clearBreadcrumbs(): void {\n if (!this.enableNative) {\n return;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n RNSentry.clearBreadcrumbs();\n },\n\n /**\n * Sets context on the native scope. Not implemented in Android yet.\n * @param key string\n * @param context key-value map\n */\n setContext(key: string, context: { [key: string]: unknown } | null): void {\n if (!this.enableNative) {\n return;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n RNSentry.setContext(\n key,\n context !== null ? this._serializeObject(context) : null\n );\n },\n\n /**\n * Closes the Native Layer SDK\n */\n async closeNativeSdk(): Promise<void> {\n if (!this.enableNative) {\n return;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n return;\n }\n\n return RNSentry.closeNativeSdk().then(() => {\n this.enableNative = false;\n });\n },\n\n disableNativeFramesTracking(): void {\n if (!this.enableNative) {\n return;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n return;\n }\n\n RNSentry.disableNativeFramesTracking();\n },\n\n isNativeTransportAvailable(): boolean {\n return this.enableNative && this._isModuleLoaded(RNSentry);\n },\n\n /**\n * Serializes all values of root-level keys into strings.\n * @param data key-value map.\n * @returns An object where all root-level values are strings.\n */\n _serializeObject(data: {\n [key: string]: unknown;\n }): { [key: string]: string } {\n const serialized: { [key: string]: string } = {};\n\n Object.keys(data).forEach((dataKey) => {\n const value = data[dataKey];\n serialized[dataKey] =\n typeof value === \"string\" ? value : JSON.stringify(value);\n });\n\n return serialized;\n },\n\n /**\n * Convert js severity level in event.level and event.breadcrumbs to more widely supported levels.\n * @param event\n * @returns Event with more widely supported Severity level strings\n */\n _processLevels(event: Event): Event {\n const processed: Event = {\n ...event,\n level: event.level ? this._processLevel(event.level) : undefined,\n breadcrumbs: event.breadcrumbs?.map((breadcrumb) => ({\n ...breadcrumb,\n level: breadcrumb.level\n ? this._processLevel(breadcrumb.level)\n : undefined,\n })),\n };\n\n return processed;\n },\n\n /**\n * Convert js severity level which has critical and log to more widely supported levels.\n * @param level\n * @returns More widely supported Severity level strings\n */\n _processLevel(level: Severity): Severity {\n if (level === Severity.Critical) {\n return Severity.Fatal;\n }\n if (level === Severity.Log) {\n return Severity.Debug;\n }\n\n return level;\n },\n\n /**\n * Checks whether the RNSentry module is loaded.\n */\n _isModuleLoaded(\n module: SentryNativeBridgeModule | undefined\n ): module is SentryNativeBridgeModule {\n return !!module;\n },\n\n _DisabledNativeError: new SentryError(\"Native is disabled\"),\n\n _NativeClientError: new SentryError(\n \"Native Client is not available, can't start on native.\"\n ),\n\n enableNative: true,\n nativeIsReady: false,\n platform: Platform.OS,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"wrapper.js","sourceRoot":"","sources":["../../src/js/wrapper.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\nimport {\n Breadcrumb,\n Event,\n Package,\n Response,\n Severity,\n User,\n} from '@sentry/types';\nimport { logger, SentryError } from '@sentry/utils';\nimport { NativeModules, Platform } from 'react-native';\n\nimport {\n NativeAppStartResponse,\n NativeDeviceContextsResponse,\n NativeFramesResponse,\n NativeReleaseResponse,\n SentryNativeBridgeModule,\n} from './definitions';\nimport { ReactNativeOptions } from './options';\n\nconst RNSentry = NativeModules.RNSentry as SentryNativeBridgeModule | undefined;\n\ninterface SentryNativeWrapper {\n enableNative: boolean;\n nativeIsReady: boolean;\n platform: typeof Platform.OS;\n\n _NativeClientError: Error;\n _DisabledNativeError: Error;\n\n _processLevels(event: Event): Event;\n _processLevel(level: Severity): Severity;\n _serializeObject(data: { [key: string]: unknown }): { [key: string]: string };\n _isModuleLoaded(\n module: SentryNativeBridgeModule | undefined\n ): module is SentryNativeBridgeModule;\n\n isNativeTransportAvailable(): boolean;\n\n initNativeSdk(options: ReactNativeOptions): PromiseLike<boolean>;\n closeNativeSdk(): PromiseLike<void>;\n\n sendEvent(event: Event): PromiseLike<Response>;\n\n fetchNativeRelease(): PromiseLike<NativeReleaseResponse>;\n fetchNativeDeviceContexts(): PromiseLike<NativeDeviceContextsResponse>;\n fetchNativeAppStart(): PromiseLike<NativeAppStartResponse | null>;\n fetchNativeFrames(): PromiseLike<NativeFramesResponse | null>;\n fetchNativeSdkInfo(): PromiseLike<Package | null>;\n\n disableNativeFramesTracking(): void;\n\n addBreadcrumb(breadcrumb: Breadcrumb): void;\n setContext(key: string, context: { [key: string]: unknown } | null): void;\n clearBreadcrumbs(): void;\n setExtra(key: string, extra: unknown): void;\n setUser(user: User | null): void;\n setTag(key: string, value: string): void;\n\n nativeCrash(): void;\n}\n\n/**\n * Our internal interface for calling native functions\n */\nexport const NATIVE: SentryNativeWrapper = {\n /**\n * Sending the event over the bridge to native\n * @param event Event\n */\n async sendEvent(_event: Event): Promise<Response> {\n if (!this.enableNative) {\n return {\n reason: 'Event was skipped as native SDK is not enabled.',\n status: 'skipped',\n };\n }\n\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n const event = this._processLevels(_event);\n\n // Delete this metadata as this should not be sent to Sentry.\n delete event.sdkProcessingMetadata;\n\n const header = {\n event_id: event.event_id,\n sdk: event.sdk,\n };\n\n let envelopeWasSent = false;\n if (NATIVE.platform === 'android') {\n // Android\n\n const headerString = JSON.stringify(header);\n\n /*\n We do this to avoid duplicate breadcrumbs on Android as sentry-android applies the breadcrumbs\n from the native scope onto every envelope sent through it. This scope will contain the breadcrumbs\n sent through the scope sync feature. This causes duplicate breadcrumbs.\n We then remove the breadcrumbs in all cases but if it is handled == false,\n this is a signal that the app would crash and android would lose the breadcrumbs by the time the app is restarted to read\n the envelope.\n */\n if (event.exception?.values?.[0]?.mechanism?.handled != false && event.breadcrumbs) {\n event.breadcrumbs = [];\n }\n\n const payload = {\n ...event,\n message: {\n message: event.message,\n },\n };\n\n const payloadString = JSON.stringify(payload);\n let length = payloadString.length;\n try {\n length = await RNSentry.getStringBytesLength(payloadString);\n } catch {\n // The native call failed, we do nothing, we have payload.length as a fallback\n }\n\n const item = {\n content_type: 'application/json',\n length,\n type: payload.type ?? 'event',\n };\n\n const itemString = JSON.stringify(item);\n\n const envelopeString = `${headerString}\\n${itemString}\\n${payloadString}`;\n\n envelopeWasSent = await RNSentry.captureEnvelope(envelopeString);\n } else {\n // iOS/Mac\n\n const payload = {\n ...event,\n message: {\n message: event.message,\n },\n };\n\n // Serialize and remove any instances that will crash the native bridge such as Spans\n const serializedPayload = JSON.parse(JSON.stringify(payload));\n\n // The envelope item is created (and its length determined) on the iOS side of the native bridge.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n envelopeWasSent = await RNSentry.captureEnvelope({\n header,\n payload: serializedPayload,\n });\n }\n\n if (envelopeWasSent) {\n return {\n status: 'success',\n };\n }\n\n return {\n status: 'failed',\n };\n },\n\n /**\n * Starts native with the provided options.\n * @param options ReactNativeOptions\n */\n async initNativeSdk(originalOptions: ReactNativeOptions): Promise<boolean> {\n const options = {\n enableNative: true,\n autoInitializeNativeSdk: true,\n ...originalOptions,\n };\n\n if (!options.enableNative) {\n if (options.enableNativeNagger) {\n logger.warn('Note: Native Sentry SDK is disabled.');\n }\n this.enableNative = false;\n return false;\n }\n if (!options.autoInitializeNativeSdk) {\n if (options.enableNativeNagger) {\n logger.warn(\n 'Note: Native Sentry SDK was not initialized automatically, you will need to initialize it manually. If you wish to disable the native SDK and get rid of this warning, pass enableNative: false'\n );\n }\n return false;\n }\n\n if (!options.dsn) {\n logger.warn(\n 'Warning: No DSN was provided. The Sentry SDK will be disabled. Native SDK will also not be initalized.'\n );\n return false;\n }\n\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n // filter out all the options that would crash native.\n /* eslint-disable @typescript-eslint/unbound-method,@typescript-eslint/no-unused-vars */\n const {\n beforeSend,\n beforeBreadcrumb,\n integrations,\n defaultIntegrations,\n transport,\n ...filteredOptions\n } = options;\n /* eslint-enable @typescript-eslint/unbound-method,@typescript-eslint/no-unused-vars */\n\n const nativeIsReady = await RNSentry.initNativeSdk(filteredOptions);\n\n this.nativeIsReady = nativeIsReady;\n\n return nativeIsReady;\n },\n\n /**\n * Fetches the release from native\n */\n async fetchNativeRelease(): Promise<NativeReleaseResponse> {\n if (!this.enableNative) {\n throw this._DisabledNativeError;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n return RNSentry.fetchNativeRelease();\n },\n\n /**\n * Fetches the Sdk info for the native sdk.\n * NOTE: Only available on iOS.\n */\n async fetchNativeSdkInfo(): Promise<Package | null> {\n if (!this.enableNative) {\n throw this._DisabledNativeError;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n if (this.platform !== 'ios') {\n return null;\n }\n\n return RNSentry.fetchNativeSdkInfo();\n },\n\n /**\n * Fetches the device contexts. Not used on Android.\n */\n async fetchNativeDeviceContexts(): Promise<NativeDeviceContextsResponse> {\n if (!this.enableNative) {\n throw this._DisabledNativeError;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n if (this.platform !== 'ios') {\n // Only ios uses deviceContexts, return an empty object.\n return {};\n }\n\n return RNSentry.fetchNativeDeviceContexts();\n },\n\n async fetchNativeAppStart(): Promise<NativeAppStartResponse | null> {\n if (!this.enableNative) {\n throw this._DisabledNativeError;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n return RNSentry.fetchNativeAppStart();\n },\n\n async fetchNativeFrames(): Promise<NativeFramesResponse | null> {\n if (!this.enableNative) {\n throw this._DisabledNativeError;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n return RNSentry.fetchNativeFrames();\n },\n\n /**\n * Triggers a native crash.\n * Use this only for testing purposes.\n */\n nativeCrash(): void {\n if (!this.enableNative) {\n return;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n RNSentry.crash();\n },\n\n /**\n * Sets the user in the native scope.\n * Passing null clears the user.\n */\n setUser(user: User | null): void {\n if (!this.enableNative) {\n return;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n // separate and serialze all non-default user keys.\n let defaultUserKeys = null;\n let otherUserKeys = null;\n if (user) {\n const { id, ip_address, email, username, ...otherKeys } = user;\n defaultUserKeys = this._serializeObject({\n email,\n id,\n ip_address,\n username,\n });\n otherUserKeys = this._serializeObject(otherKeys);\n }\n\n RNSentry.setUser(defaultUserKeys, otherUserKeys);\n },\n\n /**\n * Sets a tag in the native module.\n * @param key string\n * @param value string\n */\n setTag(key: string, value: string): void {\n if (!this.enableNative) {\n return;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n const stringifiedValue =\n typeof value === 'string' ? value : JSON.stringify(value);\n\n RNSentry.setTag(key, stringifiedValue);\n },\n\n /**\n * Sets an extra in the native scope, will stringify\n * extra value if it isn't already a string.\n * @param key string\n * @param extra any\n */\n setExtra(key: string, extra: unknown): void {\n if (!this.enableNative) {\n return;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n // we stringify the extra as native only takes in strings.\n const stringifiedExtra =\n typeof extra === 'string' ? extra : JSON.stringify(extra);\n\n RNSentry.setExtra(key, stringifiedExtra);\n },\n\n /**\n * Adds breadcrumb to the native scope.\n * @param breadcrumb Breadcrumb\n */\n addBreadcrumb(breadcrumb: Breadcrumb): void {\n if (!this.enableNative) {\n return;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n RNSentry.addBreadcrumb({\n ...breadcrumb,\n // Process and convert deprecated levels\n level: breadcrumb.level\n ? this._processLevel(breadcrumb.level)\n : undefined,\n data: breadcrumb.data\n ? this._serializeObject(breadcrumb.data)\n : undefined,\n });\n },\n\n /**\n * Clears breadcrumbs on the native scope.\n */\n clearBreadcrumbs(): void {\n if (!this.enableNative) {\n return;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n RNSentry.clearBreadcrumbs();\n },\n\n /**\n * Sets context on the native scope. Not implemented in Android yet.\n * @param key string\n * @param context key-value map\n */\n setContext(key: string, context: { [key: string]: unknown } | null): void {\n if (!this.enableNative) {\n return;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n throw this._NativeClientError;\n }\n\n RNSentry.setContext(\n key,\n context !== null ? this._serializeObject(context) : null\n );\n },\n\n /**\n * Closes the Native Layer SDK\n */\n async closeNativeSdk(): Promise<void> {\n if (!this.enableNative) {\n return;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n return;\n }\n\n return RNSentry.closeNativeSdk().then(() => {\n this.enableNative = false;\n });\n },\n\n disableNativeFramesTracking(): void {\n if (!this.enableNative) {\n return;\n }\n if (!this._isModuleLoaded(RNSentry)) {\n return;\n }\n\n RNSentry.disableNativeFramesTracking();\n },\n\n isNativeTransportAvailable(): boolean {\n return this.enableNative && this._isModuleLoaded(RNSentry);\n },\n\n /**\n * Serializes all values of root-level keys into strings.\n * @param data key-value map.\n * @returns An object where all root-level values are strings.\n */\n _serializeObject(data: {\n [key: string]: unknown;\n }): { [key: string]: string } {\n const serialized: { [key: string]: string } = {};\n\n Object.keys(data).forEach((dataKey) => {\n const value = data[dataKey];\n serialized[dataKey] =\n typeof value === 'string' ? value : JSON.stringify(value);\n });\n\n return serialized;\n },\n\n /**\n * Convert js severity level in event.level and event.breadcrumbs to more widely supported levels.\n * @param event\n * @returns Event with more widely supported Severity level strings\n */\n _processLevels(event: Event): Event {\n const processed: Event = {\n ...event,\n level: event.level ? this._processLevel(event.level) : undefined,\n breadcrumbs: event.breadcrumbs?.map((breadcrumb) => ({\n ...breadcrumb,\n level: breadcrumb.level\n ? this._processLevel(breadcrumb.level)\n : undefined,\n })),\n };\n\n return processed;\n },\n\n /**\n * Convert js severity level which has critical and log to more widely supported levels.\n * @param level\n * @returns More widely supported Severity level strings\n */\n _processLevel(level: Severity): Severity {\n if (level === Severity.Critical) {\n return Severity.Fatal;\n }\n if (level === Severity.Log) {\n return Severity.Debug;\n }\n\n return level;\n },\n\n /**\n * Checks whether the RNSentry module is loaded.\n */\n _isModuleLoaded(\n module: SentryNativeBridgeModule | undefined\n ): module is SentryNativeBridgeModule {\n return !!module;\n },\n\n _DisabledNativeError: new SentryError('Native is disabled'),\n\n _NativeClientError: new SentryError(\n \"Native Client is not available, can't start on native.\"\n ),\n\n enableNative: true,\n nativeIsReady: false,\n platform: Platform.OS,\n};\n"]}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@sentry/react-native",
|
|
3
3
|
"homepage": "https://github.com/getsentry/sentry-react-native",
|
|
4
4
|
"repository": "https://github.com/getsentry/sentry-react-native",
|
|
5
|
-
"version": "3.
|
|
5
|
+
"version": "3.4.2",
|
|
6
6
|
"description": "Official Sentry SDK for react-native",
|
|
7
7
|
"typings": "dist/js/index.d.ts",
|
|
8
8
|
"types": "dist/js/index.d.ts",
|
|
@@ -40,21 +40,21 @@
|
|
|
40
40
|
"react-native": ">=0.56.0"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@sentry/browser": "6.
|
|
44
|
-
"@sentry/cli": "^1.
|
|
45
|
-
"@sentry/core": "6.
|
|
46
|
-
"@sentry/hub": "6.
|
|
47
|
-
"@sentry/integrations": "6.
|
|
48
|
-
"@sentry/react": "6.
|
|
49
|
-
"@sentry/tracing": "6.
|
|
50
|
-
"@sentry/types": "6.
|
|
51
|
-
"@sentry/utils": "6.
|
|
43
|
+
"@sentry/browser": "6.19.2",
|
|
44
|
+
"@sentry/cli": "^1.74.2",
|
|
45
|
+
"@sentry/core": "6.19.2",
|
|
46
|
+
"@sentry/hub": "6.19.2",
|
|
47
|
+
"@sentry/integrations": "6.19.2",
|
|
48
|
+
"@sentry/react": "6.19.2",
|
|
49
|
+
"@sentry/tracing": "6.19.2",
|
|
50
|
+
"@sentry/types": "6.19.2",
|
|
51
|
+
"@sentry/utils": "6.19.2",
|
|
52
52
|
"@sentry/wizard": "^1.2.17"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
|
-
"@sentry-internal/eslint-config-sdk": "6.
|
|
56
|
-
"@sentry-internal/eslint-plugin-sdk": "6.
|
|
57
|
-
"@sentry/typescript": "^5.20.
|
|
55
|
+
"@sentry-internal/eslint-config-sdk": "6.19.2",
|
|
56
|
+
"@sentry-internal/eslint-plugin-sdk": "6.19.2",
|
|
57
|
+
"@sentry/typescript": "^5.20.1",
|
|
58
58
|
"@types/jest": "^26.0.15",
|
|
59
59
|
"@types/react": "^16.9.49",
|
|
60
60
|
"@types/react-native": "^0.66.11",
|
package/react-native.config.js
CHANGED
|
@@ -2,17 +2,17 @@ module.exports = {
|
|
|
2
2
|
dependency: {
|
|
3
3
|
platforms: {
|
|
4
4
|
ios: {
|
|
5
|
-
sharedLibraries: [
|
|
5
|
+
sharedLibraries: ['libz']
|
|
6
6
|
},
|
|
7
7
|
android: {
|
|
8
|
-
packageInstance:
|
|
8
|
+
packageInstance: 'new RNSentryPackage()'
|
|
9
9
|
}
|
|
10
10
|
},
|
|
11
11
|
hooks: {
|
|
12
12
|
postlink:
|
|
13
|
-
|
|
13
|
+
'node node_modules/@sentry/wizard/dist/bin.js -i reactNative -p ios android',
|
|
14
14
|
postunlink:
|
|
15
|
-
|
|
15
|
+
'node node_modules/@sentry/wizard/dist/bin.js -i reactNative -p ios android --uninstall'
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
};
|