react-native-nitro-tracing 0.6.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 (233) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/LICENSE +21 -0
  3. package/NitroTracing.podspec +32 -0
  4. package/README.md +75 -0
  5. package/android/CMakeLists.txt +49 -0
  6. package/android/build.gradle +133 -0
  7. package/android/fix-prefab.gradle +51 -0
  8. package/android/gradle.properties +5 -0
  9. package/android/proguard-rules.pro +5 -0
  10. package/android/src/main/AndroidManifest.xml +2 -0
  11. package/android/src/main/cpp/cpp-adapter.cpp +47 -0
  12. package/android/src/main/java/com/margelo/nitro/nitrotracing/HermesSamplingGuard.kt +43 -0
  13. package/android/src/main/java/com/margelo/nitro/nitrotracing/NitroTracingFrameSource.kt +36 -0
  14. package/android/src/main/java/com/margelo/nitro/nitrotracing/NitroTracingPackage.kt +31 -0
  15. package/client.ts +15 -0
  16. package/cpp/HermesSampling.cpp +26 -0
  17. package/cpp/HermesSampling.hpp +10 -0
  18. package/cpp/HybridRecording.cpp +66 -0
  19. package/cpp/HybridRecording.hpp +30 -0
  20. package/cpp/HybridTraceSpan.cpp +10 -0
  21. package/cpp/HybridTraceSpan.hpp +17 -0
  22. package/cpp/HybridTracing.cpp +10 -0
  23. package/cpp/HybridTracing.hpp +10 -0
  24. package/cpp/NativeConversions.cpp +77 -0
  25. package/cpp/NativeConversions.hpp +15 -0
  26. package/cpp/core/NativeSampler.cpp +152 -0
  27. package/cpp/core/NativeSampler.hpp +56 -0
  28. package/cpp/core/Recorder.cpp +218 -0
  29. package/cpp/core/Recorder.hpp +60 -0
  30. package/cpp/core/Retention.cpp +26 -0
  31. package/cpp/core/Retention.hpp +7 -0
  32. package/cpp/core/TraceJson.cpp +214 -0
  33. package/cpp/core/TraceJson.hpp +7 -0
  34. package/cpp/core/TraceTypes.hpp +62 -0
  35. package/expo.ts +2 -0
  36. package/ios/NitroTracingFrameSource.mm +35 -0
  37. package/lib/commonjs/client.cjs +767 -0
  38. package/lib/commonjs/client.cjs.map +7 -0
  39. package/lib/commonjs/expo.cjs +88 -0
  40. package/lib/commonjs/expo.cjs.map +7 -0
  41. package/lib/commonjs/index.cjs +28 -0
  42. package/lib/commonjs/index.cjs.map +7 -0
  43. package/lib/commonjs/performance.cjs +112 -0
  44. package/lib/commonjs/performance.cjs.map +7 -0
  45. package/lib/commonjs/plugins.cjs +477 -0
  46. package/lib/commonjs/plugins.cjs.map +7 -0
  47. package/lib/commonjs/react.cjs +3833 -0
  48. package/lib/commonjs/react.cjs.map +7 -0
  49. package/lib/commonjs/release-profiler.cjs +142 -0
  50. package/lib/commonjs/release-profiler.cjs.map +7 -0
  51. package/lib/commonjs/sentry.cjs +188 -0
  52. package/lib/commonjs/sentry.cjs.map +7 -0
  53. package/lib/module/client.mjs +768 -0
  54. package/lib/module/client.mjs.map +7 -0
  55. package/lib/module/expo.mjs +62 -0
  56. package/lib/module/expo.mjs.map +7 -0
  57. package/lib/module/index.mjs +7 -0
  58. package/lib/module/index.mjs.map +7 -0
  59. package/lib/module/performance.mjs +89 -0
  60. package/lib/module/performance.mjs.map +7 -0
  61. package/lib/module/plugins.mjs +461 -0
  62. package/lib/module/plugins.mjs.map +7 -0
  63. package/lib/module/react.mjs +3851 -0
  64. package/lib/module/react.mjs.map +7 -0
  65. package/lib/module/release-profiler.mjs +137 -0
  66. package/lib/module/release-profiler.mjs.map +7 -0
  67. package/lib/module/sentry.mjs +165 -0
  68. package/lib/module/sentry.mjs.map +7 -0
  69. package/lib/typescript/client.d.ts +4 -0
  70. package/lib/typescript/expo.d.ts +2 -0
  71. package/lib/typescript/performance.d.ts +2 -0
  72. package/lib/typescript/plugins.d.ts +12 -0
  73. package/lib/typescript/react.d.ts +5 -0
  74. package/lib/typescript/release-profiler.d.ts +2 -0
  75. package/lib/typescript/sentry.d.ts +2 -0
  76. package/lib/typescript/src/client/TracingSink.d.ts +10 -0
  77. package/lib/typescript/src/client/createTraceClient.d.ts +82 -0
  78. package/lib/typescript/src/client/playground.d.ts +12 -0
  79. package/lib/typescript/src/expo/ExpoAdapter.d.ts +15 -0
  80. package/lib/typescript/src/expo/index.d.ts +2 -0
  81. package/lib/typescript/src/index.d.ts +6 -0
  82. package/lib/typescript/src/plugins/TracePlugin.d.ts +22 -0
  83. package/lib/typescript/src/plugins/errors.d.ts +15 -0
  84. package/lib/typescript/src/plugins/nativeMetrics.d.ts +13 -0
  85. package/lib/typescript/src/plugins/navigation.d.ts +29 -0
  86. package/lib/typescript/src/plugins/network.d.ts +23 -0
  87. package/lib/typescript/src/plugins/orderSpans.d.ts +3 -0
  88. package/lib/typescript/src/plugins/performance.d.ts +13 -0
  89. package/lib/typescript/src/plugins/releaseProfiler.d.ts +25 -0
  90. package/lib/typescript/src/plugins/runtimeMetrics.d.ts +17 -0
  91. package/lib/typescript/src/plugins/sentry.d.ts +15 -0
  92. package/lib/typescript/src/plugins/startPlugins.d.ts +4 -0
  93. package/lib/typescript/src/react/DetailView.d.ts +11 -0
  94. package/lib/typescript/src/react/ExplorerFilters.d.ts +9 -0
  95. package/lib/typescript/src/react/ExplorerView.d.ts +9 -0
  96. package/lib/typescript/src/react/InspectorControls.d.ts +229 -0
  97. package/lib/typescript/src/react/InspectorHeader.d.ts +8 -0
  98. package/lib/typescript/src/react/InspectorSheet.d.ts +16 -0
  99. package/lib/typescript/src/react/MetricsView.d.ts +7 -0
  100. package/lib/typescript/src/react/SummaryView.d.ts +11 -0
  101. package/lib/typescript/src/react/TimelineView.d.ts +8 -0
  102. package/lib/typescript/src/react/TraceInspector.d.ts +11 -0
  103. package/lib/typescript/src/react/TraceOverlay.d.ts +17 -0
  104. package/lib/typescript/src/react/explorerModel.d.ts +38 -0
  105. package/lib/typescript/src/react/labels.d.ts +203 -0
  106. package/lib/typescript/src/react/native.d.ts +42 -0
  107. package/lib/typescript/src/react/readSnapshot.d.ts +4 -0
  108. package/lib/typescript/src/react/store.d.ts +9 -0
  109. package/lib/typescript/src/react/topics.d.ts +80 -0
  110. package/lib/typescript/src/react/useAppReadyMetric.d.ts +3 -0
  111. package/lib/typescript/src/react/useLiveRecording.d.ts +4 -0
  112. package/lib/typescript/src/react/useTraceViewer.d.ts +140 -0
  113. package/lib/typescript/src/react/viewerModel.d.ts +59 -0
  114. package/lib/typescript/src/specs/Recording.nitro.d.ts +31 -0
  115. package/lib/typescript/src/specs/TraceSpan.nitro.d.ts +14 -0
  116. package/lib/typescript/src/specs/Tracing.nitro.d.ts +17 -0
  117. package/lib/typescript/src/types/CompletedSpanOptions.d.ts +15 -0
  118. package/lib/typescript/src/types/EventContext.d.ts +8 -0
  119. package/lib/typescript/src/types/MarkEvent.d.ts +4 -0
  120. package/lib/typescript/src/types/MarkOptions.d.ts +6 -0
  121. package/lib/typescript/src/types/MetricEvent.d.ts +8 -0
  122. package/lib/typescript/src/types/MetricOptions.d.ts +10 -0
  123. package/lib/typescript/src/types/NativeSamplingOptions.d.ts +7 -0
  124. package/lib/typescript/src/types/ReadOptions.d.ts +7 -0
  125. package/lib/typescript/src/types/RecordingOptions.d.ts +11 -0
  126. package/lib/typescript/src/types/RecordingStats.d.ts +25 -0
  127. package/lib/typescript/src/types/SpanEvent.d.ts +13 -0
  128. package/lib/typescript/src/types/SpanOptions.d.ts +6 -0
  129. package/lib/typescript/src/types/SpanOutcome.d.ts +2 -0
  130. package/lib/typescript/src/types/TraceAttribute.d.ts +7 -0
  131. package/lib/typescript/src/types/TraceAttributes.d.ts +3 -0
  132. package/lib/typescript/src/types/TraceContext.d.ts +10 -0
  133. package/lib/typescript/src/types/TracePage.d.ts +18 -0
  134. package/lib/typescript/src/types.d.ts +17 -0
  135. package/nitro.json +20 -0
  136. package/nitrogen/generated/.gitattributes +1 -0
  137. package/nitrogen/generated/android/NitroTracing+autolinking.cmake +83 -0
  138. package/nitrogen/generated/android/NitroTracing+autolinking.gradle +27 -0
  139. package/nitrogen/generated/android/NitroTracingOnLoad.cpp +49 -0
  140. package/nitrogen/generated/android/NitroTracingOnLoad.hpp +34 -0
  141. package/nitrogen/generated/android/kotlin/com/margelo/nitro/nitrotracing/NitroTracingOnLoad.kt +35 -0
  142. package/nitrogen/generated/ios/NitroTracing+autolinking.rb +62 -0
  143. package/nitrogen/generated/ios/NitroTracing-Swift-Cxx-Bridge.cpp +17 -0
  144. package/nitrogen/generated/ios/NitroTracing-Swift-Cxx-Bridge.hpp +27 -0
  145. package/nitrogen/generated/ios/NitroTracing-Swift-Cxx-Umbrella.hpp +38 -0
  146. package/nitrogen/generated/ios/NitroTracingAutolinking.mm +35 -0
  147. package/nitrogen/generated/ios/NitroTracingAutolinking.swift +16 -0
  148. package/nitrogen/generated/shared/c++/CompletedSpanOptions.hpp +122 -0
  149. package/nitrogen/generated/shared/c++/HybridRecordingSpec.cpp +31 -0
  150. package/nitrogen/generated/shared/c++/HybridRecordingSpec.hpp +100 -0
  151. package/nitrogen/generated/shared/c++/HybridTraceSpanSpec.cpp +23 -0
  152. package/nitrogen/generated/shared/c++/HybridTraceSpanSpec.hpp +65 -0
  153. package/nitrogen/generated/shared/c++/HybridTracingSpec.cpp +22 -0
  154. package/nitrogen/generated/shared/c++/HybridTracingSpec.hpp +68 -0
  155. package/nitrogen/generated/shared/c++/MarkEvent.hpp +102 -0
  156. package/nitrogen/generated/shared/c++/MarkOptions.hpp +99 -0
  157. package/nitrogen/generated/shared/c++/MetricEvent.hpp +110 -0
  158. package/nitrogen/generated/shared/c++/MetricOptions.hpp +107 -0
  159. package/nitrogen/generated/shared/c++/NativeSamplingOptions.hpp +87 -0
  160. package/nitrogen/generated/shared/c++/ReadOptions.hpp +87 -0
  161. package/nitrogen/generated/shared/c++/RecordingOptions.hpp +95 -0
  162. package/nitrogen/generated/shared/c++/RecordingStats.hpp +123 -0
  163. package/nitrogen/generated/shared/c++/SpanEvent.hpp +121 -0
  164. package/nitrogen/generated/shared/c++/SpanOptions.hpp +99 -0
  165. package/nitrogen/generated/shared/c++/SpanOutcome.hpp +84 -0
  166. package/nitrogen/generated/shared/c++/TraceAttribute.hpp +87 -0
  167. package/nitrogen/generated/shared/c++/TracePage.hpp +111 -0
  168. package/package.json +236 -0
  169. package/performance.ts +2 -0
  170. package/plugins.ts +24 -0
  171. package/react-native.config.js +16 -0
  172. package/react.ts +10 -0
  173. package/release-profiler.ts +6 -0
  174. package/sentry.ts +2 -0
  175. package/src/client/TracingSink.ts +25 -0
  176. package/src/client/createTraceClient.ts +439 -0
  177. package/src/client/playground.ts +143 -0
  178. package/src/expo/ExpoAdapter.ts +71 -0
  179. package/src/expo/index.ts +2 -0
  180. package/src/index.ts +8 -0
  181. package/src/plugins/TracePlugin.ts +22 -0
  182. package/src/plugins/errors.ts +69 -0
  183. package/src/plugins/nativeMetrics.ts +26 -0
  184. package/src/plugins/navigation.ts +111 -0
  185. package/src/plugins/network.ts +178 -0
  186. package/src/plugins/orderSpans.ts +22 -0
  187. package/src/plugins/performance.ts +120 -0
  188. package/src/plugins/releaseProfiler.ts +123 -0
  189. package/src/plugins/runtimeMetrics.ts +131 -0
  190. package/src/plugins/sentry.ts +176 -0
  191. package/src/plugins/startPlugins.ts +58 -0
  192. package/src/react/DetailView.tsx +514 -0
  193. package/src/react/ExplorerFilters.tsx +151 -0
  194. package/src/react/ExplorerView.tsx +243 -0
  195. package/src/react/InspectorControls.tsx +651 -0
  196. package/src/react/InspectorHeader.tsx +171 -0
  197. package/src/react/InspectorSheet.tsx +89 -0
  198. package/src/react/MetricsView.tsx +182 -0
  199. package/src/react/SummaryView.tsx +121 -0
  200. package/src/react/TimelineView.tsx +87 -0
  201. package/src/react/TraceInspector.tsx +196 -0
  202. package/src/react/TraceOverlay.tsx +585 -0
  203. package/src/react/explorerModel.ts +285 -0
  204. package/src/react/labels.ts +234 -0
  205. package/src/react/native.tsx +159 -0
  206. package/src/react/readSnapshot.ts +58 -0
  207. package/src/react/store.ts +31 -0
  208. package/src/react/topics.ts +427 -0
  209. package/src/react/useAppReadyMetric.ts +10 -0
  210. package/src/react/useLiveRecording.ts +43 -0
  211. package/src/react/useTraceViewer.ts +333 -0
  212. package/src/react/viewerModel.ts +172 -0
  213. package/src/specs/Recording.nitro.ts +40 -0
  214. package/src/specs/TraceSpan.nitro.ts +14 -0
  215. package/src/specs/Tracing.nitro.ts +14 -0
  216. package/src/types/CompletedSpanOptions.ts +15 -0
  217. package/src/types/EventContext.ts +8 -0
  218. package/src/types/MarkEvent.ts +3 -0
  219. package/src/types/MarkOptions.ts +6 -0
  220. package/src/types/MetricEvent.ts +8 -0
  221. package/src/types/MetricOptions.ts +10 -0
  222. package/src/types/NativeSamplingOptions.ts +7 -0
  223. package/src/types/ReadOptions.ts +7 -0
  224. package/src/types/RecordingOptions.ts +11 -0
  225. package/src/types/RecordingStats.ts +25 -0
  226. package/src/types/SpanEvent.ts +13 -0
  227. package/src/types/SpanOptions.ts +6 -0
  228. package/src/types/SpanOutcome.ts +2 -0
  229. package/src/types/TraceAttribute.ts +7 -0
  230. package/src/types/TraceAttributes.ts +4 -0
  231. package/src/types/TraceContext.ts +10 -0
  232. package/src/types/TracePage.ts +18 -0
  233. package/src/types.ts +17 -0
@@ -0,0 +1,196 @@
1
+ import React, { useEffect } from 'react'
2
+ import { Modal, ScrollView, StatusBar, StyleSheet } from 'react-native'
3
+ import { SafeAreaProvider, SafeAreaView } from 'react-native-safe-area-context'
4
+ import type { TraceClient } from '../client/createTraceClient'
5
+ import { useTraceViewer, type Viewer } from './useTraceViewer'
6
+ import { InspectorHeader } from './InspectorHeader'
7
+ import { ExplorerView } from './ExplorerView'
8
+ import { DetailView } from './DetailView'
9
+ import { MetricsView } from './MetricsView'
10
+ import { SummaryView } from './SummaryView'
11
+ import { TimelineView } from './TimelineView'
12
+ import { NativeTabs } from './native'
13
+ import { defaultBudgets, type Budgets } from './topics'
14
+ import { apple, palette, Row, Section, TabBar } from './InspectorControls'
15
+ import {
16
+ createTranslator,
17
+ type InspectorLabelKey,
18
+ type InspectorLabels,
19
+ type InspectorTranslator,
20
+ } from './labels'
21
+
22
+ const tabs = [
23
+ { value: 'overview', icon: '◉', key: 'overview', iconSize: 18 },
24
+ { value: 'timeline', icon: '☰', key: 'timeline', iconSize: 22 },
25
+ { value: 'explore', icon: '⌕', key: 'explore', iconSize: 30 },
26
+ { value: 'metrics', icon: '▥', key: 'metrics', iconSize: 22 },
27
+ ] as const
28
+ const scenarioKey = {
29
+ nested: 'scenarioNested',
30
+ concurrency: 'scenarioConcurrency',
31
+ cancelled: 'scenarioCancelled',
32
+ idempotent: 'scenarioIdempotent',
33
+ error: 'scenarioError',
34
+ metrics: 'scenarioMetrics',
35
+ } as const satisfies Record<string, InspectorLabelKey>
36
+
37
+ export function TraceInspector({
38
+ client,
39
+ labels,
40
+ translate,
41
+ budgets,
42
+ }: {
43
+ client: TraceClient
44
+ labels?: Partial<InspectorLabels>
45
+ translate?: InspectorTranslator
46
+ /** Local issue thresholds for the Summary and Timeline. */
47
+ budgets?: Partial<Budgets>
48
+ }) {
49
+ const v = useTraceViewer(client, budgets)
50
+ const stallMs = budgets?.stallMs ?? defaultBudgets.stallMs
51
+ const t = translate ?? createTranslator(labels)
52
+ // Android Modals keep the host's status bar style; push dark icons while open.
53
+ useEffect(() => {
54
+ if (!v.visible) return
55
+ const entry = StatusBar.pushStackEntry({ barStyle: 'dark-content' })
56
+ return () => StatusBar.popStackEntry(entry)
57
+ }, [v.visible])
58
+ const identity =
59
+ v.detail?.kind === 'span'
60
+ ? v.detail.value.spanId
61
+ : v.detail?.kind === 'trace'
62
+ ? v.detail.value.id
63
+ : v.detail?.kind === 'metric'
64
+ ? v.detail.value.name
65
+ : v.detail?.kind === 'mark'
66
+ ? String(v.detail.value.sequence)
67
+ : ''
68
+ return (
69
+ <Modal
70
+ visible={v.visible}
71
+ animationType="slide"
72
+ presentationStyle="fullScreen"
73
+ statusBarTranslucent
74
+ onRequestClose={v.detail ? v.back : client.close}
75
+ >
76
+ <SafeAreaProvider>
77
+ <SafeAreaView
78
+ style={styles.root}
79
+ edges={['top', 'bottom', 'left', 'right']}
80
+ >
81
+ <InspectorHeader v={v} t={t} />
82
+ {v.detail ? (
83
+ <DetailView key={`${v.details.length}:${identity}`} v={v} t={t} />
84
+ ) : v.tab === 'tools' ? (
85
+ <ToolsView v={v} t={t} client={client} />
86
+ ) : (
87
+ <NativeTabs
88
+ value={v.tab}
89
+ onChange={v.setTab}
90
+ tint={palette.accent}
91
+ tabs={[
92
+ {
93
+ key: 'overview',
94
+ title: t('overview'),
95
+ sfSymbol: 'gauge.with.dots.needle.67percent',
96
+ badge: v.issues.length ? String(v.issues.length) : undefined,
97
+ render: () => <SummaryView v={v} t={t} budgetMs={stallMs} />,
98
+ },
99
+ {
100
+ key: 'timeline',
101
+ title: t('timeline'),
102
+ sfSymbol: 'list.bullet.below.rectangle',
103
+ render: () => <TimelineView v={v} t={t} />,
104
+ },
105
+ {
106
+ key: 'explore',
107
+ title: t('explore'),
108
+ sfSymbol: 'magnifyingglass',
109
+ render: () => <ExplorerView v={v} t={t} />,
110
+ },
111
+ {
112
+ key: 'metrics',
113
+ title: t('metrics'),
114
+ sfSymbol: 'chart.xyaxis.line',
115
+ render: () => <MetricsView v={v} t={t} />,
116
+ },
117
+ ]}
118
+ fallback={(content) => (
119
+ <>
120
+ {content}
121
+ <TabBar
122
+ items={tabs.map((tab) => ({ ...tab, label: t(tab.key) }))}
123
+ value={v.tab === 'tools' ? 'overview' : v.tab}
124
+ onChange={v.setTab}
125
+ />
126
+ </>
127
+ )}
128
+ />
129
+ )}
130
+ </SafeAreaView>
131
+ </SafeAreaProvider>
132
+ </Modal>
133
+ )
134
+ }
135
+
136
+ function ToolsView({
137
+ v,
138
+ t,
139
+ client,
140
+ }: {
141
+ v: Viewer
142
+ t: InspectorTranslator
143
+ client: TraceClient
144
+ }) {
145
+ const result = v.playgroundResult
146
+ return (
147
+ <ScrollView contentContainerStyle={styles.content}>
148
+ <Section header={t('profiling')} footer={t('profileSeparate')}>
149
+ {client.canProfile ? (
150
+ <Row
151
+ icon="◷"
152
+ title={t(v.profiling ? 'stopProfile' : 'startProfile')}
153
+ subtitle={t('profilingDescription')}
154
+ onPress={v.busy || !v.recording ? undefined : v.toggleProfile}
155
+ last={!v.profilePath}
156
+ />
157
+ ) : (
158
+ <Row title={t('noProfiler')} last />
159
+ )}
160
+ {v.profilePath && (
161
+ <Row
162
+ icon="⇪"
163
+ title={t('shareProfile')}
164
+ subtitle={v.profilePath}
165
+ onPress={client.canShareProfile ? v.shareProfile : undefined}
166
+ last
167
+ />
168
+ )}
169
+ </Section>
170
+ <Section header={t('playground')} footer={t('playgroundDescription')}>
171
+ <Row
172
+ icon="▷"
173
+ title={t('run')}
174
+ onPress={v.busy || !v.recording ? undefined : v.playground}
175
+ last={!result}
176
+ />
177
+ {result?.checks.map((check) => (
178
+ <Row
179
+ key={check.id}
180
+ icon={check.passed ? '✓' : '✕'}
181
+ iconColor={check.passed ? '#34c759' : palette.error}
182
+ title={t(scenarioKey[check.id])}
183
+ />
184
+ ))}
185
+ {result && (
186
+ <Row title={t('openScenario')} onPress={v.openPlayground} last />
187
+ )}
188
+ </Section>
189
+ </ScrollView>
190
+ )
191
+ }
192
+
193
+ const styles = StyleSheet.create({
194
+ root: { flex: 1, backgroundColor: apple.grouped },
195
+ content: { paddingBottom: 32 },
196
+ })