@rejourneyco/react-native 1.0.0

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.
Files changed (152) hide show
  1. package/android/build.gradle.kts +135 -0
  2. package/android/consumer-rules.pro +10 -0
  3. package/android/proguard-rules.pro +1 -0
  4. package/android/src/main/AndroidManifest.xml +15 -0
  5. package/android/src/main/java/com/rejourney/RejourneyModuleImpl.kt +2981 -0
  6. package/android/src/main/java/com/rejourney/capture/ANRHandler.kt +206 -0
  7. package/android/src/main/java/com/rejourney/capture/ActivityTracker.kt +98 -0
  8. package/android/src/main/java/com/rejourney/capture/CaptureEngine.kt +1553 -0
  9. package/android/src/main/java/com/rejourney/capture/CaptureHeuristics.kt +375 -0
  10. package/android/src/main/java/com/rejourney/capture/CrashHandler.kt +153 -0
  11. package/android/src/main/java/com/rejourney/capture/MotionEvent.kt +215 -0
  12. package/android/src/main/java/com/rejourney/capture/SegmentUploader.kt +512 -0
  13. package/android/src/main/java/com/rejourney/capture/VideoEncoder.kt +773 -0
  14. package/android/src/main/java/com/rejourney/capture/ViewHierarchyScanner.kt +633 -0
  15. package/android/src/main/java/com/rejourney/capture/ViewSerializer.kt +286 -0
  16. package/android/src/main/java/com/rejourney/core/Constants.kt +117 -0
  17. package/android/src/main/java/com/rejourney/core/Logger.kt +93 -0
  18. package/android/src/main/java/com/rejourney/core/Types.kt +124 -0
  19. package/android/src/main/java/com/rejourney/lifecycle/SessionLifecycleService.kt +162 -0
  20. package/android/src/main/java/com/rejourney/network/DeviceAuthManager.kt +747 -0
  21. package/android/src/main/java/com/rejourney/network/HttpClientProvider.kt +16 -0
  22. package/android/src/main/java/com/rejourney/network/NetworkMonitor.kt +272 -0
  23. package/android/src/main/java/com/rejourney/network/UploadManager.kt +1363 -0
  24. package/android/src/main/java/com/rejourney/network/UploadWorker.kt +492 -0
  25. package/android/src/main/java/com/rejourney/privacy/PrivacyMask.kt +645 -0
  26. package/android/src/main/java/com/rejourney/touch/GestureClassifier.kt +233 -0
  27. package/android/src/main/java/com/rejourney/touch/KeyboardTracker.kt +158 -0
  28. package/android/src/main/java/com/rejourney/touch/TextInputTracker.kt +181 -0
  29. package/android/src/main/java/com/rejourney/touch/TouchInterceptor.kt +591 -0
  30. package/android/src/main/java/com/rejourney/utils/EventBuffer.kt +284 -0
  31. package/android/src/main/java/com/rejourney/utils/OEMDetector.kt +154 -0
  32. package/android/src/main/java/com/rejourney/utils/PerfTiming.kt +235 -0
  33. package/android/src/main/java/com/rejourney/utils/Telemetry.kt +297 -0
  34. package/android/src/main/java/com/rejourney/utils/WindowUtils.kt +84 -0
  35. package/android/src/newarch/java/com/rejourney/RejourneyModule.kt +187 -0
  36. package/android/src/newarch/java/com/rejourney/RejourneyPackage.kt +40 -0
  37. package/android/src/oldarch/java/com/rejourney/RejourneyModule.kt +218 -0
  38. package/android/src/oldarch/java/com/rejourney/RejourneyPackage.kt +23 -0
  39. package/ios/Capture/RJANRHandler.h +42 -0
  40. package/ios/Capture/RJANRHandler.m +328 -0
  41. package/ios/Capture/RJCaptureEngine.h +275 -0
  42. package/ios/Capture/RJCaptureEngine.m +2062 -0
  43. package/ios/Capture/RJCaptureHeuristics.h +80 -0
  44. package/ios/Capture/RJCaptureHeuristics.m +903 -0
  45. package/ios/Capture/RJCrashHandler.h +46 -0
  46. package/ios/Capture/RJCrashHandler.m +313 -0
  47. package/ios/Capture/RJMotionEvent.h +183 -0
  48. package/ios/Capture/RJMotionEvent.m +183 -0
  49. package/ios/Capture/RJPerformanceManager.h +100 -0
  50. package/ios/Capture/RJPerformanceManager.m +373 -0
  51. package/ios/Capture/RJPixelBufferDownscaler.h +42 -0
  52. package/ios/Capture/RJPixelBufferDownscaler.m +85 -0
  53. package/ios/Capture/RJSegmentUploader.h +146 -0
  54. package/ios/Capture/RJSegmentUploader.m +778 -0
  55. package/ios/Capture/RJVideoEncoder.h +247 -0
  56. package/ios/Capture/RJVideoEncoder.m +1036 -0
  57. package/ios/Capture/RJViewControllerTracker.h +73 -0
  58. package/ios/Capture/RJViewControllerTracker.m +508 -0
  59. package/ios/Capture/RJViewHierarchyScanner.h +215 -0
  60. package/ios/Capture/RJViewHierarchyScanner.m +1464 -0
  61. package/ios/Capture/RJViewSerializer.h +119 -0
  62. package/ios/Capture/RJViewSerializer.m +498 -0
  63. package/ios/Core/RJConstants.h +124 -0
  64. package/ios/Core/RJConstants.m +88 -0
  65. package/ios/Core/RJLifecycleManager.h +85 -0
  66. package/ios/Core/RJLifecycleManager.m +308 -0
  67. package/ios/Core/RJLogger.h +61 -0
  68. package/ios/Core/RJLogger.m +211 -0
  69. package/ios/Core/RJTypes.h +176 -0
  70. package/ios/Core/RJTypes.m +66 -0
  71. package/ios/Core/Rejourney.h +64 -0
  72. package/ios/Core/Rejourney.mm +2495 -0
  73. package/ios/Network/RJDeviceAuthManager.h +94 -0
  74. package/ios/Network/RJDeviceAuthManager.m +967 -0
  75. package/ios/Network/RJNetworkMonitor.h +68 -0
  76. package/ios/Network/RJNetworkMonitor.m +267 -0
  77. package/ios/Network/RJRetryManager.h +73 -0
  78. package/ios/Network/RJRetryManager.m +325 -0
  79. package/ios/Network/RJUploadManager.h +267 -0
  80. package/ios/Network/RJUploadManager.m +2296 -0
  81. package/ios/Privacy/RJPrivacyMask.h +163 -0
  82. package/ios/Privacy/RJPrivacyMask.m +922 -0
  83. package/ios/Rejourney.h +63 -0
  84. package/ios/Touch/RJGestureClassifier.h +130 -0
  85. package/ios/Touch/RJGestureClassifier.m +333 -0
  86. package/ios/Touch/RJTouchInterceptor.h +169 -0
  87. package/ios/Touch/RJTouchInterceptor.m +772 -0
  88. package/ios/Utils/RJEventBuffer.h +112 -0
  89. package/ios/Utils/RJEventBuffer.m +358 -0
  90. package/ios/Utils/RJGzipUtils.h +33 -0
  91. package/ios/Utils/RJGzipUtils.m +89 -0
  92. package/ios/Utils/RJKeychainManager.h +48 -0
  93. package/ios/Utils/RJKeychainManager.m +111 -0
  94. package/ios/Utils/RJPerfTiming.h +209 -0
  95. package/ios/Utils/RJPerfTiming.m +264 -0
  96. package/ios/Utils/RJTelemetry.h +92 -0
  97. package/ios/Utils/RJTelemetry.m +320 -0
  98. package/ios/Utils/RJWindowUtils.h +66 -0
  99. package/ios/Utils/RJWindowUtils.m +133 -0
  100. package/lib/commonjs/NativeRejourney.js +40 -0
  101. package/lib/commonjs/components/Mask.js +79 -0
  102. package/lib/commonjs/index.js +1381 -0
  103. package/lib/commonjs/sdk/autoTracking.js +1259 -0
  104. package/lib/commonjs/sdk/constants.js +151 -0
  105. package/lib/commonjs/sdk/errorTracking.js +199 -0
  106. package/lib/commonjs/sdk/index.js +50 -0
  107. package/lib/commonjs/sdk/metricsTracking.js +204 -0
  108. package/lib/commonjs/sdk/navigation.js +151 -0
  109. package/lib/commonjs/sdk/networkInterceptor.js +412 -0
  110. package/lib/commonjs/sdk/utils.js +363 -0
  111. package/lib/commonjs/types/expo-router.d.js +2 -0
  112. package/lib/commonjs/types/index.js +2 -0
  113. package/lib/module/NativeRejourney.js +38 -0
  114. package/lib/module/components/Mask.js +72 -0
  115. package/lib/module/index.js +1284 -0
  116. package/lib/module/sdk/autoTracking.js +1233 -0
  117. package/lib/module/sdk/constants.js +145 -0
  118. package/lib/module/sdk/errorTracking.js +189 -0
  119. package/lib/module/sdk/index.js +12 -0
  120. package/lib/module/sdk/metricsTracking.js +187 -0
  121. package/lib/module/sdk/navigation.js +143 -0
  122. package/lib/module/sdk/networkInterceptor.js +401 -0
  123. package/lib/module/sdk/utils.js +342 -0
  124. package/lib/module/types/expo-router.d.js +2 -0
  125. package/lib/module/types/index.js +2 -0
  126. package/lib/typescript/NativeRejourney.d.ts +147 -0
  127. package/lib/typescript/components/Mask.d.ts +39 -0
  128. package/lib/typescript/index.d.ts +117 -0
  129. package/lib/typescript/sdk/autoTracking.d.ts +204 -0
  130. package/lib/typescript/sdk/constants.d.ts +120 -0
  131. package/lib/typescript/sdk/errorTracking.d.ts +32 -0
  132. package/lib/typescript/sdk/index.d.ts +9 -0
  133. package/lib/typescript/sdk/metricsTracking.d.ts +58 -0
  134. package/lib/typescript/sdk/navigation.d.ts +33 -0
  135. package/lib/typescript/sdk/networkInterceptor.d.ts +47 -0
  136. package/lib/typescript/sdk/utils.d.ts +148 -0
  137. package/lib/typescript/types/index.d.ts +624 -0
  138. package/package.json +102 -0
  139. package/rejourney.podspec +21 -0
  140. package/src/NativeRejourney.ts +165 -0
  141. package/src/components/Mask.tsx +80 -0
  142. package/src/index.ts +1459 -0
  143. package/src/sdk/autoTracking.ts +1373 -0
  144. package/src/sdk/constants.ts +134 -0
  145. package/src/sdk/errorTracking.ts +231 -0
  146. package/src/sdk/index.ts +11 -0
  147. package/src/sdk/metricsTracking.ts +232 -0
  148. package/src/sdk/navigation.ts +157 -0
  149. package/src/sdk/networkInterceptor.ts +440 -0
  150. package/src/sdk/utils.ts +369 -0
  151. package/src/types/expo-router.d.ts +7 -0
  152. package/src/types/index.ts +739 -0
@@ -0,0 +1,275 @@
1
+ //
2
+ // RJCaptureEngine.h
3
+ // Rejourney
4
+ //
5
+ // Video capture orchestrator with H.264 encoding.
6
+ //
7
+ // The capture engine is responsible for:
8
+ // - Fixed 1 FPS video segment capture with H.264 encoding
9
+ // - View hierarchy serialization for debugging and privacy
10
+ // - Adapting to system conditions (memory, thermal, battery)
11
+ // - Uploading video segments via presigned URLs
12
+ //
13
+ // Licensed under the Apache License, Version 2.0 (the "License");
14
+ // you may not use this file except in compliance with the License.
15
+ // You may obtain a copy of the License at
16
+ //
17
+ // http://www.apache.org/licenses/LICENSE-2.0
18
+ //
19
+ // Unless required by applicable law or agreed to in writing, software
20
+ // distributed under the License is distributed on an "AS IS" BASIS,
21
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22
+ // See the License for the specific language governing permissions and
23
+ // limitations under the License.
24
+ //
25
+ // Copyright (c) 2026 Rejourney
26
+ //
27
+
28
+ #import "../Core/RJTypes.h"
29
+ #import <Foundation/Foundation.h>
30
+ #import <UIKit/UIKit.h>
31
+
32
+ @class RJVideoEncoder;
33
+ @class RJViewSerializer;
34
+ @class RJSegmentUploader;
35
+ @class RJPrivacyMask;
36
+
37
+ @protocol RJVideoEncoderDelegate;
38
+
39
+ NS_ASSUME_NONNULL_BEGIN
40
+
41
+ /**
42
+ * Block type for providing the key window.
43
+ * The engine uses this to avoid direct UIKit coupling.
44
+ */
45
+ typedef UIWindow *_Nullable (^RJWindowProvider)(void);
46
+
47
+ /**
48
+ * Video capture orchestrator with H.264 segment encoding.
49
+ *
50
+ * Captures screenshots at 1 FPS, encodes them as H.264 video
51
+ * segments, and uploads via presigned URLs. Also captures view hierarchy JSON
52
+ * for debugging and element identification.
53
+ *
54
+ * ## Features
55
+ * - H.264 video segment encoding (60 second segments)
56
+ * - View hierarchy serialization for breadcrumb overlays
57
+ * - Privacy masking for sensitive content
58
+ * - Memory-aware capture (respects system memory pressure)
59
+ * - Thermal throttling (reduces to 0.5 FPS when hot)
60
+ * - Battery-aware capture scheduling
61
+ * - Adaptive scale reduction under load
62
+ *
63
+ * ## Usage
64
+ * ```objc
65
+ * RJCaptureEngine *engine = [[RJCaptureEngine alloc] initWithWindowProvider:^{
66
+ * return [self getKeyWindow];
67
+ * }];
68
+ *
69
+ * // Configure uploader before starting session
70
+ * [engine configureSegmentUploaderWithBaseURL:@"https://ingest.rejourney.io"
71
+ * apiKey:@"rj_..."
72
+ * projectId:@"proj_..."];
73
+ *
74
+ * [engine startSessionWithId:@"session_123"];
75
+ * // ... later ...
76
+ * [engine stopSession];
77
+ * ```
78
+ *
79
+ * @note This class is not thread-safe. Call all methods from the main thread.
80
+ */
81
+ @interface RJCaptureEngine : NSObject <RJVideoEncoderDelegate>
82
+
83
+ #pragma mark - Video Capture Configuration
84
+
85
+ /// Capture scale factor as a fraction of device screen scale (0.0-1.0).
86
+ /// Example: on a 3x device, 0.35 -> ~1.0 px/pt. Default: 0.35
87
+ @property(nonatomic, assign) CGFloat captureScale;
88
+
89
+ /// Target FPS for video capture. Default: 1.
90
+ @property(nonatomic, assign) NSInteger videoFPS;
91
+
92
+ /// Number of frames per video segment. Default: 60 (60 seconds at 1 FPS).
93
+ @property(nonatomic, assign) NSInteger framesPerSegment;
94
+
95
+ /// Target video bitrate in bits per second. Default: 400000 (400 kbps).
96
+ @property(nonatomic, assign) NSInteger videoBitrate;
97
+
98
+ /// Capture view hierarchy every N frames. Default: 5 (every 5s at 1 FPS).
99
+ @property(nonatomic, assign) NSInteger hierarchyCaptureInterval;
100
+
101
+ /// Whether segment uploads are enabled. Default: YES.
102
+ @property(nonatomic, assign) BOOL uploadsEnabled;
103
+
104
+ #pragma mark - Adaptive Behavior
105
+
106
+ /// Whether to adjust quality based on memory pressure. Default: YES
107
+ @property(nonatomic, assign) BOOL adaptiveQualityEnabled;
108
+
109
+ /// Whether to reduce captures when device is hot. Default: YES
110
+ @property(nonatomic, assign) BOOL thermalThrottleEnabled;
111
+
112
+ /// Whether to reduce captures on low battery. Default: YES
113
+ @property(nonatomic, assign) BOOL batteryAwareEnabled;
114
+
115
+ #pragma mark - Privacy Configuration
116
+
117
+ /// Whether to mask text input fields during capture. Default: YES
118
+ @property(nonatomic, assign) BOOL privacyMaskTextInputs;
119
+
120
+ /// Whether to mask camera preview views during capture. Default: YES
121
+ @property(nonatomic, assign) BOOL privacyMaskCameraViews;
122
+
123
+ /// Whether to mask web views during capture. Default: YES
124
+ @property(nonatomic, assign) BOOL privacyMaskWebViews;
125
+
126
+ /// Whether to mask video layers during capture. Default: YES
127
+ @property(nonatomic, assign) BOOL privacyMaskVideoLayers;
128
+
129
+ /// Direct access to the privacy mask for manual nativeID masking
130
+ @property(nonatomic, readonly) RJPrivacyMask *privacyMask;
131
+
132
+ #pragma mark - Read-only State
133
+
134
+ /// Current performance level based on system conditions
135
+ @property(nonatomic, readonly) RJPerformanceLevel currentPerformanceLevel;
136
+
137
+ /// Whether a capture session is currently active
138
+ @property(nonatomic, readonly) BOOL isRecording;
139
+
140
+ /// Whether the UI is ready for capture (e.g. splash screen hidden)
141
+ @property(atomic, readonly) BOOL uiReadyForCapture;
142
+
143
+ /// Current session ID
144
+ @property(nonatomic, readonly, nullable) NSString *sessionId;
145
+
146
+ /// Video encoder for segment capture
147
+ @property(nonatomic, readonly, nullable) RJVideoEncoder *videoEncoder;
148
+
149
+ /// View hierarchy serializer
150
+ @property(nonatomic, readonly, nullable) RJViewSerializer *viewSerializer;
151
+
152
+ /// Segment uploader
153
+ @property(nonatomic, readonly, nullable) RJSegmentUploader *segmentUploader;
154
+
155
+ #pragma mark - Initialization
156
+
157
+ /**
158
+ * Creates a new capture engine with the specified window provider.
159
+ *
160
+ * @param windowProvider Block that returns the key window for capture.
161
+ * Called on main thread during capture operations.
162
+ * @return A new capture engine instance.
163
+ */
164
+ - (instancetype)initWithWindowProvider:(RJWindowProvider)windowProvider;
165
+
166
+ /// Unavailable. Use initWithWindowProvider: instead.
167
+ - (instancetype)init NS_UNAVAILABLE;
168
+
169
+ #pragma mark - Configuration
170
+
171
+ /**
172
+ * Configures the segment uploader for video capture.
173
+ * Call this BEFORE starting a session.
174
+ *
175
+ * @param baseURL The API base URL (e.g., "https://ingest.rejourney.io")
176
+ * @param apiKey The public API key (e.g., "rj_...")
177
+ * @param projectId The project identifier
178
+ */
179
+ - (void)configureSegmentUploaderWithBaseURL:(NSString *)baseURL
180
+ apiKey:(NSString *)apiKey
181
+ projectId:(NSString *)projectId;
182
+
183
+ #pragma mark - Session Lifecycle
184
+
185
+ /**
186
+ * Starts a new video capture session.
187
+ *
188
+ * @param sessionId Unique identifier for the session.
189
+ */
190
+ - (void)startSessionWithId:(NSString *)sessionId;
191
+
192
+ /**
193
+ * Stops the current capture session.
194
+ * Finishes any pending video segment and uploads it.
195
+ */
196
+ - (void)stopSession;
197
+
198
+ /**
199
+ * Stops the current capture session SYNCHRONOUSLY.
200
+ * Use during app termination when async completion may not fire.
201
+ * Blocks until segment is finished and upload is initiated.
202
+ */
203
+ - (void)stopSessionSync;
204
+
205
+ /**
206
+ * Waits for pending segment uploads to finish (best-effort).
207
+ * Use during termination to avoid missing video on session end.
208
+ */
209
+ - (void)waitForPendingSegmentUploadsWithTimeout:(NSTimeInterval)timeout;
210
+
211
+ #pragma mark - App Lifecycle Events
212
+
213
+ /**
214
+ * Pauses video capture and finishes the current segment.
215
+ * Call when app enters background to ensure the segment is uploaded.
216
+ */
217
+ - (void)pauseVideoCapture;
218
+
219
+ /**
220
+ * Pauses video capture SYNCHRONOUSLY.
221
+ * Use during app termination/background when async completion may not fire.
222
+ * Blocks until segment is written and upload is initiated.
223
+ * Has a timeout to prevent app freeze.
224
+ */
225
+ - (void)pauseVideoCaptureSync;
226
+
227
+ /**
228
+ * Resumes video capture after a pause.
229
+ * Starts a new segment from the current screen state.
230
+ */
231
+ - (void)resumeVideoCapture;
232
+
233
+ #pragma mark - Event Notifications (Optional - for enhanced metadata)
234
+
235
+ /**
236
+ * Notifies the engine of a navigation event.
237
+ * This is optional - video capture continues regardless.
238
+ * Useful for attaching screen names to hierarchy snapshots.
239
+ *
240
+ * @param screenName Name of the screen being navigated to.
241
+ */
242
+ - (void)notifyNavigationToScreen:(NSString *)screenName;
243
+
244
+ /**
245
+ * Notifies the engine of a gesture event.
246
+ * This is optional - video captures gestures visually.
247
+ * Useful for logging touch events alongside video.
248
+ *
249
+ * @param gestureType The type of gesture (e.g., "tap", "swipe_left").
250
+ */
251
+ - (void)notifyGesture:(NSString *)gestureType;
252
+
253
+ /**
254
+ * Notifies the engine of a React Native commit/mount boundary.
255
+ * This is optional and can be called from RN render pipeline hooks.
256
+ */
257
+ - (void)notifyReactNativeCommit;
258
+
259
+ /**
260
+ * Notifies the engine that the UI is ready for capture.
261
+ * Call this after splash screen is hidden and initial layout is complete.
262
+ */
263
+ - (void)notifyUIReady;
264
+
265
+ #pragma mark - Memory Management
266
+
267
+ /**
268
+ * Handles a memory warning by reducing quality temporarily.
269
+ * Called automatically on UIApplicationDidReceiveMemoryWarningNotification.
270
+ */
271
+ - (void)handleMemoryWarning;
272
+
273
+ @end
274
+
275
+ NS_ASSUME_NONNULL_END