From 00a3d36f148411a7160b018b1d31399e01593e0f Mon Sep 17 00:00:00 2001 From: Antonis Lilis Date: Fri, 14 Mar 2025 15:55:42 +0200 Subject: [PATCH 1/6] Adds `enableExperimentalViewRenderer` and `enableFastViewRendering` from sentry-cocoa --- packages/core/ios/RNSentryReplay.mm | 2 ++ packages/core/src/js/replay/mobilereplay.ts | 27 +++++++++++++++++++++ samples/react-native/src/App.tsx | 2 ++ 3 files changed, 31 insertions(+) diff --git a/packages/core/ios/RNSentryReplay.mm b/packages/core/ios/RNSentryReplay.mm index b43fae4a49..8331d6db43 100644 --- a/packages/core/ios/RNSentryReplay.mm +++ b/packages/core/ios/RNSentryReplay.mm @@ -27,6 +27,8 @@ + (void)updateOptions:(NSMutableDictionary *)options @"errorSampleRate" : options[@"replaysOnErrorSampleRate"] ?: [NSNull null], @"maskAllImages" : replayOptions[@"maskAllImages"] ?: [NSNull null], @"maskAllText" : replayOptions[@"maskAllText"] ?: [NSNull null], + @"enableExperimentalViewRenderer" : replayOptions[@"enableExperimentalViewRenderer"] ?: [NSNull null], + @"enableFastViewRendering" : replayOptions[@"enableFastViewRendering"] ?: [NSNull null], @"maskedViewClasses" : [RNSentryReplay getReplayRNRedactClasses:replayOptions], @"sdkInfo" : @ { @"name" : REACT_NATIVE_SDK_NAME, @"version" : REACT_NATIVE_SDK_PACKAGE_VERSION } diff --git a/packages/core/src/js/replay/mobilereplay.ts b/packages/core/src/js/replay/mobilereplay.ts index 4f4501b138..8686190218 100644 --- a/packages/core/src/js/replay/mobilereplay.ts +++ b/packages/core/src/js/replay/mobilereplay.ts @@ -31,12 +31,39 @@ export interface MobileReplayOptions { * @default true */ maskAllVectors?: boolean; + + /** + * Enables the up to 5x faster experimental view renderer used by the Session Replay integration on iOS. + * + * Enabling this flag will reduce the amount of time it takes to render each frame of the session replay on the main thread, therefore reducing + * interruptions and visual lag. + * + * - Experiment: This is an experimental feature and is therefore disabled by default. + * + * @default false + */ + enableExperimentalViewRenderer?: boolean; + + /** + * Enables up to 5x faster but incommpelte view rendering used by the Session Replay integration on iOS. + * + * Enabling this flag will reduce the amount of time it takes to render each frame of the session replay on the main thread, therefore reducing + * interruptions and visual lag. + * + * - Note: This flag can only be used together with `enableExperimentalViewRenderer` with up to 20% faster render times. + * - Experiment: This is an experimental feature and is therefore disabled by default. + * + * @default false + */ + enableFastViewRendering?: boolean; } const defaultOptions: Required = { maskAllText: true, maskAllImages: true, maskAllVectors: true, + enableExperimentalViewRenderer: false, + enableFastViewRendering: false, }; type MobileReplayIntegration = Integration & { diff --git a/samples/react-native/src/App.tsx b/samples/react-native/src/App.tsx index d74a396be5..9db21936ca 100644 --- a/samples/react-native/src/App.tsx +++ b/samples/react-native/src/App.tsx @@ -98,6 +98,8 @@ Sentry.init({ maskAllImages: true, maskAllVectors: true, maskAllText: true, + enableExperimentalViewRenderer: true, + enableFastViewRendering: true, }), Sentry.appStartIntegration({ standalone: false, From e53a4d71e8613c203252022b3b854ee80a769808 Mon Sep 17 00:00:00 2001 From: Antonis Lilis Date: Fri, 14 Mar 2025 15:58:30 +0200 Subject: [PATCH 2/6] Adds changelog --- CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c355e2eb77..7ed3ff3583 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,20 @@ - Add thread information to spans ([#4579](https://github.com/getsentry/sentry-react-native/pull/4579)) - Exposed `getDataFromUri` as a public API to retrieve data from a URI ([#4638](https://github.com/getsentry/sentry-react-native/pull/4638)) - Improve Warm App Start reporting on Android ([#4641](https://github.com/getsentry/sentry-react-native/pull/4641)) +- Add experimental flags `enableExperimentalViewRenderer` and `enableFastViewRendering` to enable up to 5x times more performance in Session Replay on iOS ([#4660](https://github.com/getsentry/sentry-react-native/pull/4660)) + + ```js + import * as Sentry from '@sentry/react-native'; + + Sentry.init({ + integrations: [ + Sentry.mobileReplayIntegration({ + enableExperimentalViewRenderer: true, + enableFastViewRendering: true, + }), + ], + }); + ``` ### Fixes From 8118fe7d902233d14d5231acc1e9424fd63005ce Mon Sep 17 00:00:00 2001 From: Antonis Lilis Date: Fri, 14 Mar 2025 16:00:21 +0200 Subject: [PATCH 3/6] Fixes broken test --- .../RNSentryCocoaTesterTests/RNSentryReplayOptionsTests.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/core/RNSentryCocoaTester/RNSentryCocoaTesterTests/RNSentryReplayOptionsTests.swift b/packages/core/RNSentryCocoaTester/RNSentryCocoaTesterTests/RNSentryReplayOptionsTests.swift index 0cbe2cefdf..c0ed9ae234 100644 --- a/packages/core/RNSentryCocoaTester/RNSentryCocoaTesterTests/RNSentryReplayOptionsTests.swift +++ b/packages/core/RNSentryCocoaTester/RNSentryCocoaTesterTests/RNSentryReplayOptionsTests.swift @@ -48,13 +48,15 @@ final class RNSentryReplayOptions: XCTestCase { } func assertAllDefaultReplayOptionsAreNotNil(replayOptions: [String: Any]) { - XCTAssertEqual(replayOptions.count, 6) + XCTAssertEqual(replayOptions.count, 8) XCTAssertNotNil(replayOptions["sessionSampleRate"]) XCTAssertNotNil(replayOptions["errorSampleRate"]) XCTAssertNotNil(replayOptions["maskAllImages"]) XCTAssertNotNil(replayOptions["maskAllText"]) XCTAssertNotNil(replayOptions["maskedViewClasses"]) XCTAssertNotNil(replayOptions["sdkInfo"]) + XCTAssertNotNil(replayOptions["enableExperimentalViewRenderer"]) + XCTAssertNotNil(replayOptions["enableFastViewRendering"]) } func testSessionSampleRate() { From 65533d8bc92ae7c1d8fa3e0341f36a47045e156f Mon Sep 17 00:00:00 2001 From: Antonis Lilis Date: Fri, 14 Mar 2025 16:27:10 +0200 Subject: [PATCH 4/6] Fixes lint issue --- packages/core/ios/RNSentryReplay.mm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/core/ios/RNSentryReplay.mm b/packages/core/ios/RNSentryReplay.mm index 8331d6db43..2b6745c82a 100644 --- a/packages/core/ios/RNSentryReplay.mm +++ b/packages/core/ios/RNSentryReplay.mm @@ -27,7 +27,8 @@ + (void)updateOptions:(NSMutableDictionary *)options @"errorSampleRate" : options[@"replaysOnErrorSampleRate"] ?: [NSNull null], @"maskAllImages" : replayOptions[@"maskAllImages"] ?: [NSNull null], @"maskAllText" : replayOptions[@"maskAllText"] ?: [NSNull null], - @"enableExperimentalViewRenderer" : replayOptions[@"enableExperimentalViewRenderer"] ?: [NSNull null], + @"enableExperimentalViewRenderer" : replayOptions[@"enableExperimentalViewRenderer"] + ?: [NSNull null], @"enableFastViewRendering" : replayOptions[@"enableFastViewRendering"] ?: [NSNull null], @"maskedViewClasses" : [RNSentryReplay getReplayRNRedactClasses:replayOptions], @"sdkInfo" : From 920746b8843cb7784d6d7fe8d713b9894663c34e Mon Sep 17 00:00:00 2001 From: Antonis Lilis Date: Fri, 14 Mar 2025 16:56:02 +0200 Subject: [PATCH 5/6] Adds tests --- .../RNSentryReplayOptionsTests.swift | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/packages/core/RNSentryCocoaTester/RNSentryCocoaTesterTests/RNSentryReplayOptionsTests.swift b/packages/core/RNSentryCocoaTester/RNSentryCocoaTesterTests/RNSentryReplayOptionsTests.swift index c0ed9ae234..4d94dba446 100644 --- a/packages/core/RNSentryCocoaTester/RNSentryCocoaTesterTests/RNSentryReplayOptionsTests.swift +++ b/packages/core/RNSentryCocoaTester/RNSentryCocoaTesterTests/RNSentryReplayOptionsTests.swift @@ -166,5 +166,87 @@ final class RNSentryReplayOptions: XCTestCase { XCTAssertEqual(actualOptions.sessionReplay.maskAllText, false) XCTAssertEqual(actualOptions.sessionReplay.maskedViewClasses.count, 0) } + + func testEnableExperimentalViewRendererDefault() { + let optionsDict = ([ + "dsn": "https://abc@def.ingest.sentry.io/1234567", + "replaysOnErrorSampleRate": 0.75 + ] as NSDictionary).mutableCopy() as! NSMutableDictionary + + RNSentryReplay.updateOptions(optionsDict) + + let actualOptions = try! Options(dict: optionsDict as! [String: Any]) + + XCTAssertFalse(actualOptions.sessionReplay.enableExperimentalViewRenderer) + } + + func testEnableExperimentalViewRendererTrue() { + let optionsDict = ([ + "dsn": "https://abc@def.ingest.sentry.io/1234567", + "replaysOnErrorSampleRate": 0.75, + "mobileReplayOptions": [ "enableExperimentalViewRenderer": true ] + ] as NSDictionary).mutableCopy() as! NSMutableDictionary + + RNSentryReplay.updateOptions(optionsDict) + + let actualOptions = try! Options(dict: optionsDict as! [String: Any]) + + XCTAssertTrue(actualOptions.sessionReplay.enableExperimentalViewRenderer) + } + + func testEnableExperimentalViewRendererFalse() { + let optionsDict = ([ + "dsn": "https://abc@def.ingest.sentry.io/1234567", + "replaysOnErrorSampleRate": 0.75, + "mobileReplayOptions": [ "enableExperimentalViewRenderer": false ] + ] as NSDictionary).mutableCopy() as! NSMutableDictionary + + RNSentryReplay.updateOptions(optionsDict) + + let actualOptions = try! Options(dict: optionsDict as! [String: Any]) + + XCTAssertFalse(actualOptions.sessionReplay.enableExperimentalViewRenderer) + } + + func testEnableFastViewRenderingDefault() { + let optionsDict = ([ + "dsn": "https://abc@def.ingest.sentry.io/1234567", + "replaysOnErrorSampleRate": 0.75 + ] as NSDictionary).mutableCopy() as! NSMutableDictionary + + RNSentryReplay.updateOptions(optionsDict) + + let actualOptions = try! Options(dict: optionsDict as! [String: Any]) + + XCTAssertFalse(actualOptions.sessionReplay.enableFastViewRendering) + } + + func testEnableFastViewRenderingTrue() { + let optionsDict = ([ + "dsn": "https://abc@def.ingest.sentry.io/1234567", + "replaysOnErrorSampleRate": 0.75, + "mobileReplayOptions": [ "enableFastViewRendering": true ] + ] as NSDictionary).mutableCopy() as! NSMutableDictionary + + RNSentryReplay.updateOptions(optionsDict) + + let actualOptions = try! Options(dict: optionsDict as! [String: Any]) + + XCTAssertTrue(actualOptions.sessionReplay.enableFastViewRendering) + } + + func testEnableFastViewRenderingFalse() { + let optionsDict = ([ + "dsn": "https://abc@def.ingest.sentry.io/1234567", + "replaysOnErrorSampleRate": 0.75, + "mobileReplayOptions": [ "enableFastViewRendering": false ] + ] as NSDictionary).mutableCopy() as! NSMutableDictionary + + RNSentryReplay.updateOptions(optionsDict) + + let actualOptions = try! Options(dict: optionsDict as! [String: Any]) + + XCTAssertFalse(actualOptions.sessionReplay.enableFastViewRendering) + } } From 6799657765e005d4e83e7ed38a0093872cd92e5f Mon Sep 17 00:00:00 2001 From: Antonis Lilis Date: Wed, 19 Mar 2025 17:20:16 +0200 Subject: [PATCH 6/6] Fix comment typo Co-authored-by: LucasZF --- packages/core/src/js/replay/mobilereplay.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/js/replay/mobilereplay.ts b/packages/core/src/js/replay/mobilereplay.ts index 8686190218..4bdfdd7955 100644 --- a/packages/core/src/js/replay/mobilereplay.ts +++ b/packages/core/src/js/replay/mobilereplay.ts @@ -45,7 +45,7 @@ export interface MobileReplayOptions { enableExperimentalViewRenderer?: boolean; /** - * Enables up to 5x faster but incommpelte view rendering used by the Session Replay integration on iOS. + * Enables up to 5x faster but incomplete view rendering used by the Session Replay integration on iOS. * * Enabling this flag will reduce the amount of time it takes to render each frame of the session replay on the main thread, therefore reducing * interruptions and visual lag.