@multiplayer-app/session-recorder-react-native 0.0.1-alpha.8 → 0.0.1-alpha.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/patch/xhr.js +1 -1
- package/dist/patch/xhr.js.map +1 -1
- package/dist/recorder/index.js +1 -1
- package/dist/recorder/index.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/src/patch/xhr.ts +2 -2
- package/src/recorder/index.ts +4 -3
- package/src/version.ts +1 -1
- package/example-usage.tsx +0 -174
package/dist/patch/xhr.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.setShouldRecordHttpData=exports.setMaxCapturingHttpPayloadSize=void 0;var _typeUtils=require("../utils/type-utils");var _requestUtils=require("../utils/request-utils");var _config=require("../config");var recordRequestHeaders=true;var recordResponseHeaders=true;var shouldRecordBody=true;var maxCapturingHttpPayloadSize=_config.DEFAULT_MAX_HTTP_CAPTURING_PAYLOAD_SIZE;var setMaxCapturingHttpPayloadSize=exports.setMaxCapturingHttpPayloadSize=function setMaxCapturingHttpPayloadSize(_maxCapturingHttpPayloadSize){maxCapturingHttpPayloadSize=_maxCapturingHttpPayloadSize;};var setShouldRecordHttpData=exports.setShouldRecordHttpData=function setShouldRecordHttpData(shouldRecordBody,shouldRecordHeaders){recordRequestHeaders=shouldRecordHeaders;recordResponseHeaders=shouldRecordHeaders;shouldRecordBody=shouldRecordBody;};function _tryReadXHRBody(_ref){var body=_ref.body,url=_ref.url;if((0,_typeUtils.isNullish)(body)){return null;}if((0,_typeUtils.isString)(body)){return body;}if((0,_typeUtils.isFormData)(body)){return(0,_requestUtils.formDataToQuery)(body);}if((0,_typeUtils.isObject)(body)){try{return JSON.stringify(body);}catch(_a){return'[XHR] Failed to stringify response object';}}return"[XHR] Cannot read body of type ".concat(Object.prototype.toString.call(body));}(function(xhr){var originalOpen=XMLHttpRequest.prototype.open;xhr.open=function(method,url){var async=arguments.length>2&&arguments[2]!==undefined?arguments[2]:true;var username=arguments.length>3?arguments[3]:undefined;var password=arguments.length>4?arguments[4]:undefined;var xhr=this;var networkRequest={};var requestHeaders={};var originalSetRequestHeader=xhr.setRequestHeader.bind(xhr);xhr.setRequestHeader=function(header,value){requestHeaders[header]=value;return originalSetRequestHeader(header,value);};if(recordRequestHeaders){networkRequest.requestHeaders=requestHeaders;}var originalSend=xhr.send.bind(xhr);xhr.send=function(body){if(shouldRecordBody){var requestBody=_tryReadXHRBody({body:body,url:url});if((requestBody===null||requestBody===void 0?void 0:requestBody.length)&&
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.setShouldRecordHttpData=exports.setMaxCapturingHttpPayloadSize=void 0;var _typeUtils=require("../utils/type-utils");var _requestUtils=require("../utils/request-utils");var _config=require("../config");var recordRequestHeaders=true;var recordResponseHeaders=true;var shouldRecordBody=true;var maxCapturingHttpPayloadSize=_config.DEFAULT_MAX_HTTP_CAPTURING_PAYLOAD_SIZE;var setMaxCapturingHttpPayloadSize=exports.setMaxCapturingHttpPayloadSize=function setMaxCapturingHttpPayloadSize(_maxCapturingHttpPayloadSize){maxCapturingHttpPayloadSize=_maxCapturingHttpPayloadSize;};var setShouldRecordHttpData=exports.setShouldRecordHttpData=function setShouldRecordHttpData(shouldRecordBody,shouldRecordHeaders){recordRequestHeaders=shouldRecordHeaders;recordResponseHeaders=shouldRecordHeaders;shouldRecordBody=shouldRecordBody;};function _tryReadXHRBody(_ref){var body=_ref.body,url=_ref.url;if((0,_typeUtils.isNullish)(body)){return null;}if((0,_typeUtils.isString)(body)){return body;}if((0,_typeUtils.isFormData)(body)){return(0,_requestUtils.formDataToQuery)(body);}if((0,_typeUtils.isObject)(body)){try{return JSON.stringify(body);}catch(_a){return'[XHR] Failed to stringify response object';}}return"[XHR] Cannot read body of type ".concat(Object.prototype.toString.call(body));}(function(xhr){var originalOpen=XMLHttpRequest.prototype.open;xhr.open=function(method,url){var async=arguments.length>2&&arguments[2]!==undefined?arguments[2]:true;var username=arguments.length>3?arguments[3]:undefined;var password=arguments.length>4?arguments[4]:undefined;var xhr=this;var networkRequest={};var requestHeaders={};var originalSetRequestHeader=xhr.setRequestHeader.bind(xhr);xhr.setRequestHeader=function(header,value){requestHeaders[header]=value;return originalSetRequestHeader(header,value);};if(recordRequestHeaders){networkRequest.requestHeaders=requestHeaders;}var originalSend=xhr.send.bind(xhr);xhr.send=function(body){if(shouldRecordBody){var requestBody=_tryReadXHRBody({body:body,url:url});if((requestBody===null||requestBody===void 0?void 0:requestBody.length)&&requestBody.length<=maxCapturingHttpPayloadSize){networkRequest.requestBody=requestBody;}}return originalSend(body);};xhr.addEventListener('readystatechange',function(){if(xhr.readyState!==xhr.DONE){return;}var responseHeaders={};var rawHeaders=xhr.getAllResponseHeaders();var headers=rawHeaders.trim().split(/[\r\n]+/);headers.forEach(function(line){var parts=line.split(': ');var header=parts.shift();var value=parts.join(': ');if(header){responseHeaders[header]=value;}});if(recordResponseHeaders){networkRequest.responseHeaders=responseHeaders;}if(shouldRecordBody){var responseBody=_tryReadXHRBody({body:xhr.response,url:url});if((responseBody===null||responseBody===void 0?void 0:responseBody.length)&&responseBody.length<=maxCapturingHttpPayloadSize){networkRequest.responseBody=responseBody;}}});xhr.networkRequest=networkRequest;originalOpen.call(xhr,method,url,async,username,password);};})(XMLHttpRequest.prototype);
|
package/dist/patch/xhr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xhr.js","sourceRoot":"","sources":["../../src/patch/xhr.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EACV,SAAS,EACT,QAAQ,EACR,QAAQ,GACT,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,uCAAuC,EAAE,MAAM,WAAW,CAAA;AAEnE,IAAI,oBAAoB,GAAG,IAAI,CAAA;AAC/B,IAAI,qBAAqB,GAAG,IAAI,CAAA;AAChC,MAAM,gBAAgB,GAAG,IAAI,CAAA;AAC7B,IAAI,2BAA2B,GAAG,uCAAuC,CAAA;AAEzE,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,4BAAoC,EAAE,EAAE;IACrF,2BAA2B,GAAG,4BAA4B,CAAA;AAC5D,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,gBAAyB,EAAE,mBAA4B,EAAE,EAAE;IACjG,oBAAoB,GAAG,mBAAmB,CAAA;IAC1C,qBAAqB,GAAG,mBAAmB,CAAA;IAC3C,2BAA2B;IAC3B,gBAAgB,GAAG,gBAAgB,CAAA;AACrC,CAAC,CAAA;AAED,SAAS,eAAe,CAAC,EACvB,IAAI,EACJ,GAAG,GAIJ;IACC,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnB,OAAO,IAAI,CAAA;IACb,CAAC;IAGD,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,OAAO,eAAe,CAAC,IAAI,CAAC,CAAA;IAC9B,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAC7B,CAAC;QAAC,WAAM,CAAC;YACP,OAAO,2CAA2C,CAAA;QACpD,CAAC;IACH,CAAC;IAED,OAAO,kCAAkC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAA;AACjF,CAAC;AAED,CAAC,UAAU,GAAG;IACZ,MAAM,YAAY,GAAG,cAAc,CAAC,SAAS,CAAC,IAAI,CAAA;IAElD,GAAG,CAAC,IAAI,GAAG,UACT,MAAc,EACd,GAAiB,EACjB,KAAK,GAAG,IAAI,EACZ,QAAwB,EACxB,QAAwB;QAExB,MAAM,GAAG,GAAG,IAAsB,CAAA;QAClC,MAAM,cAAc,GAKhB,EAAE,CAAA;QAGN,aAAa;QACb,MAAM,cAAc,GAA2B,EAAE,CAAA;QACjD,MAAM,wBAAwB,GAAG,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC/D,GAAG,CAAC,gBAAgB,GAAG,CAAC,MAAc,EAAE,KAAa,EAAE,EAAE;YACvD,cAAc,CAAC,MAAM,CAAC,GAAG,KAAK,CAAA;YAC9B,OAAO,wBAAwB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAChD,CAAC,CAAA;QACD,IAAI,oBAAoB,EAAE,CAAC;YACzB,cAAc,CAAC,cAAc,GAAG,cAAc,CAAA;QAChD,CAAC;QAED,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACvC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE;YAClB,IAAI,gBAAgB,EAAE,CAAC;gBACrB,MAAM,WAAW,GAAG,eAAe,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAA;gBAElD,IACE,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,MAAM;uBAChB,
|
|
1
|
+
{"version":3,"file":"xhr.js","sourceRoot":"","sources":["../../src/patch/xhr.ts"],"names":[],"mappings":"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"}
|
package/dist/recorder/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.RecorderReactNativeSDK=void 0;var _toConsumableArray2=_interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));var _classCallCheck2=_interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));var _createClass2=_interopRequireDefault(require("@babel/runtime/helpers/createClass"));var _sessionRecorderCommon=require("@multiplayer-app/session-recorder-common");var
|
|
1
|
+
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.RecorderReactNativeSDK=void 0;var _toConsumableArray2=_interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));var _classCallCheck2=_interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));var _createClass2=_interopRequireDefault(require("@babel/runtime/helpers/createClass"));var _sessionRecorderCommon=require("@multiplayer-app/session-recorder-common");var _eventExporter=require("./eventExporter");var _utils=require("../utils");var _screenRecorder=require("./screenRecorder");var _gestureRecorder=require("./gestureRecorder");var _navigationTracker=require("./navigationTracker");var RecorderReactNativeSDK=exports.RecorderReactNativeSDK=function(){function RecorderReactNativeSDK(){(0,_classCallCheck2["default"])(this,RecorderReactNativeSDK);this.isRecording=false;this.recordedEvents=[];this.sessionId=null;this.sessionType=_sessionRecorderCommon.SessionType.PLAIN;this.screenRecorder=new _screenRecorder.ScreenRecorder();this.gestureRecorder=new _gestureRecorder.GestureRecorder();this.navigationTracker=new _navigationTracker.NavigationTracker();}return(0,_createClass2["default"])(RecorderReactNativeSDK,[{key:"init",value:function init(config){this.config=config;this.gestureRecorder.init(config,this,this.screenRecorder);this.navigationTracker.init(config);this.screenRecorder.init(config,this);this.exporter=new _eventExporter.EventExporter({socketUrl:config.apiBaseUrl||'',apiKey:config.apiKey});}},{key:"start",value:function start(sessionId,sessionType){if(!this.config){throw new Error('Configuration not initialized. Call init() before start().');}this.sessionId=sessionId;this.sessionType=sessionType;this.isRecording=true;if(this.config.recordScreen){this.screenRecorder.start();}if(this.config.recordGestures){this.gestureRecorder.start();}if(this.config.recordNavigation){this.navigationTracker.start();}}},{key:"stop",value:function stop(){var _a;this.isRecording=false;this.gestureRecorder.stop();this.navigationTracker.stop();this.screenRecorder.stop();(_a=this.exporter)===null||_a===void 0?void 0:_a.close();}},{key:"setNavigationRef",value:function setNavigationRef(ref){this.navigationTracker.setNavigationRef(ref);}},{key:"setViewShotRef",value:function setViewShotRef(ref){this.screenRecorder.setViewShotRef(ref);}},{key:"recordEvent",value:function recordEvent(event){if(!this.isRecording){return;}if(this.exporter){_utils.logger.debug('RecorderReactNativeSDK','Sending to exporter',event);this.exporter.send({event:event,eventType:event.type,timestamp:event.timestamp,debugSessionId:this.sessionId,debugSessionType:this.sessionType});}}},{key:"recordTouchStart",value:function recordTouchStart(x,y,target,pressure){if(!this.isRecording){return;}this.gestureRecorder.recordTouchStart(x,y,target,pressure);}},{key:"recordTouchMove",value:function recordTouchMove(x,y,target,pressure){if(!this.isRecording){return;}this.gestureRecorder.recordTouchMove(x,y,target,pressure);}},{key:"recordTouchEnd",value:function recordTouchEnd(x,y,target,pressure){if(!this.isRecording){return;}this.gestureRecorder.recordTouchEnd(x,y,target,pressure);}},{key:"getRecordedEvents",value:function getRecordedEvents(){return(0,_toConsumableArray2["default"])(this.recordedEvents);}},{key:"clearRecordedEvents",value:function clearRecordedEvents(){this.recordedEvents=[];}},{key:"getRecordingStats",value:function getRecordingStats(){return{totalEvents:this.recordedEvents.length,isRecording:this.isRecording};}}]);}();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/recorder/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAA;AACtE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/recorder/index.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "0.0.1-alpha.
|
|
1
|
+
export declare const version = "0.0.1-alpha.9";
|
package/dist/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.version=void 0;var version=exports.version="0.0.1-alpha.
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.version=void 0;var version=exports.version="0.0.1-alpha.9";
|
package/package.json
CHANGED
package/src/patch/xhr.ts
CHANGED
|
@@ -92,7 +92,7 @@ function _tryReadXHRBody({
|
|
|
92
92
|
|
|
93
93
|
if (
|
|
94
94
|
requestBody?.length
|
|
95
|
-
&&
|
|
95
|
+
&& requestBody.length <= maxCapturingHttpPayloadSize
|
|
96
96
|
) {
|
|
97
97
|
networkRequest.requestBody = requestBody
|
|
98
98
|
}
|
|
@@ -126,7 +126,7 @@ function _tryReadXHRBody({
|
|
|
126
126
|
|
|
127
127
|
if (
|
|
128
128
|
responseBody?.length
|
|
129
|
-
&&
|
|
129
|
+
&& responseBody.length <= maxCapturingHttpPayloadSize
|
|
130
130
|
) {
|
|
131
131
|
networkRequest.responseBody = responseBody
|
|
132
132
|
}
|
package/src/recorder/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SessionType } from '@multiplayer-app/session-recorder-common'
|
|
2
|
-
import { pack } from '@rrweb/packer'
|
|
2
|
+
// import { pack } from '@rrweb/packer' // Removed to avoid blob creation issues in Hermes
|
|
3
3
|
import { EventExporter } from './eventExporter'
|
|
4
4
|
import { logger } from '../utils'
|
|
5
5
|
import { ScreenRecorder } from './screenRecorder'
|
|
@@ -93,9 +93,10 @@ export class RecorderReactNativeSDK implements EventRecorder {
|
|
|
93
93
|
|
|
94
94
|
if (this.exporter) {
|
|
95
95
|
logger.debug('RecorderReactNativeSDK', 'Sending to exporter', event)
|
|
96
|
-
|
|
96
|
+
// Skip packing to avoid blob creation issues in Hermes
|
|
97
|
+
// const packedEvent = pack(event)
|
|
97
98
|
this.exporter.send({
|
|
98
|
-
event:
|
|
99
|
+
event: event, // Send raw event instead of packed
|
|
99
100
|
eventType: event.type,
|
|
100
101
|
timestamp: event.timestamp,
|
|
101
102
|
debugSessionId: this.sessionId,
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = "0.0.1-alpha.
|
|
1
|
+
export const version = "0.0.1-alpha.9"
|
package/example-usage.tsx
DELETED
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Example usage of the React Native Session Recorder with rrweb integration
|
|
3
|
-
* This file demonstrates how to use the updated session recorder system
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import React from 'react'
|
|
7
|
-
import { View, Text, Button, StyleSheet, Alert } from 'react-native'
|
|
8
|
-
import { SessionRecorderProvider, useSessionRecorder } from './src/context/SessionRecorderContext'
|
|
9
|
-
import { EventType } from './src/types'
|
|
10
|
-
|
|
11
|
-
// Example app component
|
|
12
|
-
function App() {
|
|
13
|
-
return (
|
|
14
|
-
<SessionRecorderProvider
|
|
15
|
-
options={{
|
|
16
|
-
apiKey: 'your-api-key-here',
|
|
17
|
-
version: '1.0.0',
|
|
18
|
-
application: 'ExampleApp',
|
|
19
|
-
environment: 'development',
|
|
20
|
-
recordScreen: true,
|
|
21
|
-
recordGestures: true,
|
|
22
|
-
recordNavigation: true
|
|
23
|
-
}}
|
|
24
|
-
>
|
|
25
|
-
<MainContent />
|
|
26
|
-
</SessionRecorderProvider>
|
|
27
|
-
)
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Main content component that will be wrapped by TouchEventCapture
|
|
31
|
-
function MainContent() {
|
|
32
|
-
const { client } = useSessionRecorder()
|
|
33
|
-
|
|
34
|
-
const handleStartSession = () => {
|
|
35
|
-
try {
|
|
36
|
-
client.start()
|
|
37
|
-
Alert.alert('Session Started', 'Recording has begun!')
|
|
38
|
-
} catch (error) {
|
|
39
|
-
Alert.alert('Error', `Failed to start session: ${error}`)
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const handleStopSession = () => {
|
|
44
|
-
try {
|
|
45
|
-
client.stop()
|
|
46
|
-
Alert.alert('Session Stopped', 'Recording has ended!')
|
|
47
|
-
} catch (error) {
|
|
48
|
-
Alert.alert('Error', `Failed to stop session: ${error}`)
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const handleRecordCustomEvent = () => {
|
|
53
|
-
// Example of recording a custom rrweb event
|
|
54
|
-
const customEvent = {
|
|
55
|
-
type: EventType.Custom,
|
|
56
|
-
data: {
|
|
57
|
-
customType: 'button_click',
|
|
58
|
-
buttonId: 'example_button',
|
|
59
|
-
timestamp: Date.now()
|
|
60
|
-
},
|
|
61
|
-
timestamp: Date.now()
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
client.recordEvent(customEvent)
|
|
65
|
-
Alert.alert('Custom Event', 'Custom event recorded!')
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
const handleGetRecordingStats = () => {
|
|
69
|
-
// This would need to be implemented in the SessionRecorder
|
|
70
|
-
// const stats = client.getRecordingStats()
|
|
71
|
-
// Alert.alert('Recording Stats', `Events recorded: ${stats.totalEvents}`)
|
|
72
|
-
Alert.alert('Recording Stats', 'Feature coming soon!')
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
return (
|
|
76
|
-
<View style={styles.container}>
|
|
77
|
-
<Text style={styles.title}>Session Recorder Example</Text>
|
|
78
|
-
<Text style={styles.subtitle}>This app demonstrates rrweb-compatible session recording for React Native</Text>
|
|
79
|
-
|
|
80
|
-
<View style={styles.buttonContainer}>
|
|
81
|
-
<Button title='Start Recording' onPress={handleStartSession} color='#4CAF50' />
|
|
82
|
-
</View>
|
|
83
|
-
|
|
84
|
-
<View style={styles.buttonContainer}>
|
|
85
|
-
<Button title='Stop Recording' onPress={handleStopSession} color='#F44336' />
|
|
86
|
-
</View>
|
|
87
|
-
|
|
88
|
-
<View style={styles.buttonContainer}>
|
|
89
|
-
<Button title='Record Custom Event' onPress={handleRecordCustomEvent} color='#2196F3' />
|
|
90
|
-
</View>
|
|
91
|
-
|
|
92
|
-
<View style={styles.buttonContainer}>
|
|
93
|
-
<Button title='Get Recording Stats' onPress={handleGetRecordingStats} color='#FF9800' />
|
|
94
|
-
</View>
|
|
95
|
-
|
|
96
|
-
<Text style={styles.instructions}>
|
|
97
|
-
Recording is now AUTOMATIC! When you start a session, the system will automatically:
|
|
98
|
-
{'\n'}• Capture screen snapshots periodically
|
|
99
|
-
{'\n'}• Record all touch interactions (start, move, end)
|
|
100
|
-
{'\n'}• Generate rrweb-compatible events
|
|
101
|
-
{'\n'}• No manual setup required!
|
|
102
|
-
</Text>
|
|
103
|
-
</View>
|
|
104
|
-
)
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
const styles = StyleSheet.create({
|
|
108
|
-
container: {
|
|
109
|
-
flex: 1,
|
|
110
|
-
padding: 20,
|
|
111
|
-
backgroundColor: '#f5f5f5',
|
|
112
|
-
justifyContent: 'center'
|
|
113
|
-
},
|
|
114
|
-
title: {
|
|
115
|
-
fontSize: 24,
|
|
116
|
-
fontWeight: 'bold',
|
|
117
|
-
textAlign: 'center',
|
|
118
|
-
marginBottom: 10,
|
|
119
|
-
color: '#333'
|
|
120
|
-
},
|
|
121
|
-
subtitle: {
|
|
122
|
-
fontSize: 16,
|
|
123
|
-
textAlign: 'center',
|
|
124
|
-
marginBottom: 30,
|
|
125
|
-
color: '#666'
|
|
126
|
-
},
|
|
127
|
-
buttonContainer: {
|
|
128
|
-
marginVertical: 10
|
|
129
|
-
},
|
|
130
|
-
instructions: {
|
|
131
|
-
fontSize: 14,
|
|
132
|
-
textAlign: 'center',
|
|
133
|
-
marginTop: 30,
|
|
134
|
-
color: '#888',
|
|
135
|
-
fontStyle: 'italic'
|
|
136
|
-
}
|
|
137
|
-
})
|
|
138
|
-
|
|
139
|
-
export default App
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* AUTOMATIC RECORDING INTEGRATION:
|
|
143
|
-
*
|
|
144
|
-
* 1. Screen Capture (AUTOMATIC with react-native-view-shot):
|
|
145
|
-
* - Install: npm install react-native-view-shot
|
|
146
|
-
* - iOS: Add to Podfile and run pod install
|
|
147
|
-
* - Android: No additional setup needed
|
|
148
|
-
* - Screen capture happens automatically when session starts
|
|
149
|
-
* - Captures the same View element that handles touch events
|
|
150
|
-
*
|
|
151
|
-
* 2. Touch Events (AUTOMATIC):
|
|
152
|
-
* - TouchEventCapture automatically wraps your app content
|
|
153
|
-
* - Touch events are automatically converted to rrweb MouseInteraction events
|
|
154
|
-
* - Coordinates are automatically mapped from React Native to rrweb format
|
|
155
|
-
* - No manual setup required!
|
|
156
|
-
*
|
|
157
|
-
* 3. Event Recording (AUTOMATIC):
|
|
158
|
-
* - All events are automatically stored in the RecorderReactNativeSDK
|
|
159
|
-
* - Events can be exported using getRecordedEvents()
|
|
160
|
-
* - Events are compatible with standard rrweb players
|
|
161
|
-
* - Recording starts/stops automatically with session
|
|
162
|
-
*
|
|
163
|
-
* 4. ViewShot Integration (AUTOMATIC):
|
|
164
|
-
* - The TouchEventCapture View is automatically used for screen capture
|
|
165
|
-
* - No need to manually set up viewshot refs
|
|
166
|
-
* - Screen captures include all touch interactions
|
|
167
|
-
* - Perfect synchronization between touch events and screen captures
|
|
168
|
-
*
|
|
169
|
-
* 5. Customization (Optional):
|
|
170
|
-
* - Modify capture intervals in ScreenRecorder
|
|
171
|
-
* - Adjust touch event throttling in GestureRecorder
|
|
172
|
-
* - Add custom event types as needed
|
|
173
|
-
* - All core functionality works automatically out of the box
|
|
174
|
-
*/
|