@ansight/react-native 1.0.2-preview.1

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.
@@ -0,0 +1,130 @@
1
+ #import <Foundation/Foundation.h>
2
+ #import <React/RCTBridge+Private.h>
3
+ #import <React/RCTBridge.h>
4
+ #import <jsi/instrumentation.h>
5
+ #import <jsi/jsi.h>
6
+
7
+ #include <algorithm>
8
+ #include <atomic>
9
+ #include <exception>
10
+ #include <functional>
11
+ #include <initializer_list>
12
+ #include <string>
13
+ #include <unordered_map>
14
+
15
+ @interface RCTBridge ()
16
+ - (void)invokeAsync:(std::function<void()> &&)func;
17
+ @end
18
+
19
+ namespace {
20
+ int64_t heapValue(
21
+ const std::unordered_map<std::string, int64_t>& heapInfo,
22
+ std::initializer_list<const char*> keys) {
23
+ for (const auto* key : keys) {
24
+ const auto iterator = heapInfo.find(key);
25
+ if (iterator != heapInfo.end() && iterator->second > 0) {
26
+ return iterator->second;
27
+ }
28
+ }
29
+ return 0;
30
+ }
31
+ } // namespace
32
+
33
+ @interface AnsightReactNativeMemorySampler : NSObject
34
+ - (void)attachToBridge:(RCTBridge *)bridge;
35
+ - (NSNumber *_Nullable)jsHeapUsedBytes;
36
+ - (NSNumber *_Nullable)jsHeapTotalBytes;
37
+ @end
38
+
39
+ @implementation AnsightReactNativeMemorySampler {
40
+ __weak RCTBridge *_bridge;
41
+ std::atomic<bool> _refreshScheduled;
42
+ std::atomic<bool> _hasSample;
43
+ std::atomic<int64_t> _jsHeapUsedBytes;
44
+ std::atomic<int64_t> _jsHeapTotalBytes;
45
+ }
46
+
47
+ - (instancetype)init
48
+ {
49
+ if (self = [super init]) {
50
+ _refreshScheduled.store(false);
51
+ _hasSample.store(false);
52
+ _jsHeapUsedBytes.store(0);
53
+ _jsHeapTotalBytes.store(0);
54
+ }
55
+ return self;
56
+ }
57
+
58
+ - (void)attachToBridge:(RCTBridge *)bridge
59
+ {
60
+ _bridge = bridge;
61
+ [self requestRefresh];
62
+ }
63
+
64
+ - (NSNumber *)jsHeapUsedBytes
65
+ {
66
+ [self requestRefresh];
67
+ int64_t value = _jsHeapUsedBytes.load();
68
+ return _hasSample.load() && value > 0 ? @(value) : nil;
69
+ }
70
+
71
+ - (NSNumber *)jsHeapTotalBytes
72
+ {
73
+ [self requestRefresh];
74
+ int64_t value = _jsHeapTotalBytes.load();
75
+ return _hasSample.load() && value > 0 ? @(value) : nil;
76
+ }
77
+
78
+ - (void)requestRefresh
79
+ {
80
+ RCTBridge *bridge = [_bridge batchedBridge] ?: _bridge;
81
+ if (!bridge) {
82
+ return;
83
+ }
84
+
85
+ bool expected = false;
86
+ if (!_refreshScheduled.compare_exchange_strong(expected, true)) {
87
+ return;
88
+ }
89
+
90
+ __weak AnsightReactNativeMemorySampler *weakSelf = self;
91
+ __weak RCTBridge *weakBridge = bridge;
92
+ [bridge invokeAsync:[weakSelf, weakBridge]() {
93
+ AnsightReactNativeMemorySampler *strongSelf = weakSelf;
94
+ RCTBridge *strongBridge = weakBridge;
95
+ if (!strongSelf || !strongBridge) {
96
+ if (strongSelf) {
97
+ strongSelf->_refreshScheduled.store(false);
98
+ }
99
+ return;
100
+ }
101
+
102
+ @try {
103
+ try {
104
+ RCTCxxBridge *cxxBridge = (RCTCxxBridge *)strongBridge;
105
+ auto *runtime = reinterpret_cast<facebook::jsi::Runtime *>(cxxBridge.runtime);
106
+ if (runtime) {
107
+ const auto heapInfo = runtime->instrumentation().getHeapInfo(false);
108
+ int64_t used = heapValue(
109
+ heapInfo,
110
+ {"hermes_allocatedBytes", "allocatedBytes", "usedJSHeapSize"});
111
+ int64_t total = heapValue(
112
+ heapInfo,
113
+ {"hermes_heapSize", "heapSize", "totalJSHeapSize"});
114
+ if (used > 0) {
115
+ strongSelf->_jsHeapUsedBytes.store(used);
116
+ strongSelf->_jsHeapTotalBytes.store(std::max(total, used));
117
+ strongSelf->_hasSample.store(true);
118
+ }
119
+ }
120
+ } catch (const std::exception &) {
121
+ } catch (...) {
122
+ }
123
+ } @catch (NSException *) {
124
+ }
125
+
126
+ strongSelf->_refreshScheduled.store(false);
127
+ }];
128
+ }
129
+
130
+ @end
@@ -0,0 +1,167 @@
1
+ #import <React/RCTBridgeModule.h>
2
+ #import <React/RCTEventEmitter.h>
3
+
4
+ @interface RCT_EXTERN_MODULE(AnsightReactNative, RCTEventEmitter)
5
+
6
+ RCT_EXTERN_METHOD(initialize:(NSDictionary *)options
7
+ resolver:(RCTPromiseResolveBlock)resolve
8
+ rejecter:(RCTPromiseRejectBlock)reject)
9
+
10
+ RCT_EXTERN_METHOD(initializeAndActivate:(NSDictionary *)options
11
+ resolver:(RCTPromiseResolveBlock)resolve
12
+ rejecter:(RCTPromiseRejectBlock)reject)
13
+
14
+ RCT_EXTERN_METHOD(activate:(RCTPromiseResolveBlock)resolve
15
+ rejecter:(RCTPromiseRejectBlock)reject)
16
+
17
+ RCT_EXTERN_METHOD(deactivate:(RCTPromiseResolveBlock)resolve
18
+ rejecter:(RCTPromiseRejectBlock)reject)
19
+
20
+ RCT_EXTERN_METHOD(clear:(RCTPromiseResolveBlock)resolve
21
+ rejecter:(RCTPromiseRejectBlock)reject)
22
+
23
+ RCT_EXTERN_METHOD(registerMetricChannel:(NSDictionary *)channel
24
+ resolver:(RCTPromiseResolveBlock)resolve
25
+ rejecter:(RCTPromiseRejectBlock)reject)
26
+
27
+ RCT_EXTERN_METHOD(recordMetric:(double)value
28
+ channel:(double)channel
29
+ resolver:(RCTPromiseResolveBlock)resolve
30
+ rejecter:(RCTPromiseRejectBlock)reject)
31
+
32
+ RCT_EXTERN_METHOD(recordEvent:(NSDictionary *)input
33
+ resolver:(RCTPromiseResolveBlock)resolve
34
+ rejecter:(RCTPromiseRejectBlock)reject)
35
+
36
+ RCT_EXTERN_METHOD(screenViewed:(NSString *)name
37
+ details:(NSDictionary *)details
38
+ resolver:(RCTPromiseResolveBlock)resolve
39
+ rejecter:(RCTPromiseRejectBlock)reject)
40
+
41
+ RCT_EXTERN_METHOD(setAppLifecycleState:(NSString *)state
42
+ resolver:(RCTPromiseResolveBlock)resolve
43
+ rejecter:(RCTPromiseRejectBlock)reject)
44
+
45
+ RCT_EXTERN_METHOD(connect:(NSString *)pairingPayload
46
+ options:(NSDictionary *)options
47
+ resolver:(RCTPromiseResolveBlock)resolve
48
+ rejecter:(RCTPromiseRejectBlock)reject)
49
+
50
+ RCT_EXTERN_METHOD(openSession:(NSString *)pairingPayload
51
+ options:(NSDictionary *)options
52
+ resolver:(RCTPromiseResolveBlock)resolve
53
+ rejecter:(RCTPromiseRejectBlock)reject)
54
+
55
+ RCT_EXTERN_METHOD(disconnect:(RCTPromiseResolveBlock)resolve
56
+ rejecter:(RCTPromiseRejectBlock)reject)
57
+
58
+ RCT_EXTERN_METHOD(completeSession:(RCTPromiseResolveBlock)resolve
59
+ rejecter:(RCTPromiseRejectBlock)reject)
60
+
61
+ RCT_EXTERN_METHOD(closeSession:(RCTPromiseResolveBlock)resolve
62
+ rejecter:(RCTPromiseRejectBlock)reject)
63
+
64
+ RCT_EXTERN_METHOD(savePairingConfig:(NSString *)pairingPayload
65
+ options:(NSDictionary *)options
66
+ resolver:(RCTPromiseResolveBlock)resolve
67
+ rejecter:(RCTPromiseRejectBlock)reject)
68
+
69
+ RCT_EXTERN_METHOD(clearSavedPairing:(RCTPromiseResolveBlock)resolve
70
+ rejecter:(RCTPromiseRejectBlock)reject)
71
+
72
+ RCT_EXTERN_METHOD(clearCachedSession:(RCTPromiseResolveBlock)resolve
73
+ rejecter:(RCTPromiseRejectBlock)reject)
74
+
75
+ RCT_EXTERN_METHOD(notifyHostConnectionConfigChanged:(RCTPromiseResolveBlock)resolve
76
+ rejecter:(RCTPromiseRejectBlock)reject)
77
+
78
+ RCT_EXTERN_METHOD(status:(RCTPromiseResolveBlock)resolve
79
+ rejecter:(RCTPromiseRejectBlock)reject)
80
+
81
+ RCT_EXTERN_METHOD(snapshot:(RCTPromiseResolveBlock)resolve
82
+ rejecter:(RCTPromiseRejectBlock)reject)
83
+
84
+ RCT_EXTERN_METHOD(hostConnectionStatus:(RCTPromiseResolveBlock)resolve
85
+ rejecter:(RCTPromiseRejectBlock)reject)
86
+
87
+ RCT_EXTERN_METHOD(hostConnectionCapabilities:(RCTPromiseResolveBlock)resolve
88
+ rejecter:(RCTPromiseRejectBlock)reject)
89
+
90
+ RCT_EXTERN_METHOD(currentOptions:(RCTPromiseResolveBlock)resolve
91
+ rejecter:(RCTPromiseRejectBlock)reject)
92
+
93
+ RCT_EXTERN_METHOD(recordedMetrics:(nonnull NSNumber *)limit
94
+ resolver:(RCTPromiseResolveBlock)resolve
95
+ rejecter:(RCTPromiseRejectBlock)reject)
96
+
97
+ RCT_EXTERN_METHOD(recordedEvents:(nonnull NSNumber *)limit
98
+ resolver:(RCTPromiseResolveBlock)resolve
99
+ rejecter:(RCTPromiseRejectBlock)reject)
100
+
101
+ RCT_EXTERN_METHOD(sendClientLog:(NSString *)line
102
+ resolver:(RCTPromiseResolveBlock)resolve
103
+ rejecter:(RCTPromiseRejectBlock)reject)
104
+
105
+ RCT_EXTERN_METHOD(captureBuiltInTelemetrySample:(RCTPromiseResolveBlock)resolve
106
+ rejecter:(RCTPromiseRejectBlock)reject)
107
+
108
+ RCT_EXTERN_METHOD(isFramesPerSecondEnabled:(RCTPromiseResolveBlock)resolve
109
+ rejecter:(RCTPromiseRejectBlock)reject)
110
+
111
+ RCT_EXTERN_METHOD(enableFramesPerSecond:(RCTPromiseResolveBlock)resolve
112
+ rejecter:(RCTPromiseRejectBlock)reject)
113
+
114
+ RCT_EXTERN_METHOD(disableFramesPerSecond:(RCTPromiseResolveBlock)resolve
115
+ rejecter:(RCTPromiseRejectBlock)reject)
116
+
117
+ RCT_EXTERN_METHOD(captureScreenFrame:(NSDictionary *)options
118
+ resolver:(RCTPromiseResolveBlock)resolve
119
+ rejecter:(RCTPromiseRejectBlock)reject)
120
+
121
+ RCT_EXTERN_METHOD(enableTouchCapture:(RCTPromiseResolveBlock)resolve
122
+ rejecter:(RCTPromiseRejectBlock)reject)
123
+
124
+ RCT_EXTERN_METHOD(disableTouchCapture:(RCTPromiseResolveBlock)resolve
125
+ rejecter:(RCTPromiseRejectBlock)reject)
126
+
127
+ RCT_EXTERN_METHOD(updateSessionProperties:(NSDictionary *)properties
128
+ resolver:(RCTPromiseResolveBlock)resolve
129
+ rejecter:(RCTPromiseRejectBlock)reject)
130
+
131
+ RCT_EXTERN_METHOD(clearSessionProperties:(RCTPromiseResolveBlock)resolve
132
+ rejecter:(RCTPromiseRejectBlock)reject)
133
+
134
+ RCT_EXTERN_METHOD(registerCustomProperty:(NSString *)group
135
+ key:(NSString *)key
136
+ value:(NSString *)value
137
+ resolver:(RCTPromiseResolveBlock)resolve
138
+ rejecter:(RCTPromiseRejectBlock)reject)
139
+
140
+ RCT_EXTERN_METHOD(removeCustomProperty:(NSString *)group
141
+ key:(NSString *)key
142
+ resolver:(RCTPromiseResolveBlock)resolve
143
+ rejecter:(RCTPromiseRejectBlock)reject)
144
+
145
+ RCT_EXTERN_METHOD(registerCustomTool:(NSDictionary *)definition
146
+ resolver:(RCTPromiseResolveBlock)resolve
147
+ rejecter:(RCTPromiseRejectBlock)reject)
148
+
149
+ RCT_EXTERN_METHOD(unregisterCustomTool:(NSString *)toolId
150
+ resolver:(RCTPromiseResolveBlock)resolve
151
+ rejecter:(RCTPromiseRejectBlock)reject)
152
+
153
+ RCT_EXTERN_METHOD(clearRegisteredCustomTools:(RCTPromiseResolveBlock)resolve
154
+ rejecter:(RCTPromiseRejectBlock)reject)
155
+
156
+ RCT_EXTERN_METHOD(resolveToolCall:(NSString *)requestId
157
+ result:(NSDictionary *)result
158
+ resolver:(RCTPromiseResolveBlock)resolve
159
+ rejecter:(RCTPromiseRejectBlock)reject)
160
+
161
+ RCT_EXTERN_METHOD(queueBinaryTransfer:(NSString *)requestId
162
+ base64Data:(NSString *)base64Data
163
+ chunkBytes:(nonnull NSNumber *)chunkBytes
164
+ resolver:(RCTPromiseResolveBlock)resolve
165
+ rejecter:(RCTPromiseRejectBlock)reject)
166
+
167
+ @end
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@ansight/react-native",
3
+ "version": "1.0.2-preview.1",
4
+ "description": "React Native bridge for the Ansight mobile SDK.",
5
+ "main": "index.js",
6
+ "types": "index.d.ts",
7
+ "license": "SEE LICENSE IN LICENSE",
8
+ "homepage": "https://github.com/ansight-ai/ansight-sdk#readme",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/ansight-ai/ansight-sdk.git",
12
+ "directory": "src/react-native"
13
+ },
14
+ "bugs": {
15
+ "url": "https://github.com/ansight-ai/ansight-sdk/issues"
16
+ },
17
+ "publishConfig": {
18
+ "access": "public"
19
+ },
20
+ "files": [
21
+ "android/build.gradle",
22
+ "android/src",
23
+ "ios",
24
+ "LICENSE",
25
+ "README.md",
26
+ "index.js",
27
+ "index.d.ts",
28
+ "tsconfig.json",
29
+ "AnsightReactNative.podspec",
30
+ "react-native.config.js"
31
+ ],
32
+ "keywords": [
33
+ "ansight",
34
+ "react-native",
35
+ "sdk",
36
+ "debugging",
37
+ "inspection"
38
+ ],
39
+ "peerDependencies": {
40
+ "react": "*",
41
+ "react-native": ">=0.72"
42
+ },
43
+ "scripts": {
44
+ "check": "node --check index.js && tsc --noEmit",
45
+ "typecheck": "tsc --noEmit"
46
+ },
47
+ "devDependencies": {
48
+ "typescript": "^5.9.2"
49
+ }
50
+ }
@@ -0,0 +1,12 @@
1
+ module.exports = {
2
+ dependency: {
3
+ platforms: {
4
+ ios: {
5
+ podspecPath: "AnsightReactNative.podspec",
6
+ },
7
+ android: {
8
+ sourceDir: "./android",
9
+ },
10
+ },
11
+ },
12
+ };
package/tsconfig.json ADDED
@@ -0,0 +1,12 @@
1
+ {
2
+ "compilerOptions": {
3
+ "allowJs": false,
4
+ "moduleResolution": "node",
5
+ "noEmit": true,
6
+ "strict": true,
7
+ "target": "ES2020"
8
+ },
9
+ "files": [
10
+ "index.d.ts"
11
+ ]
12
+ }