react-native-inapp-inspector 2.5.10 → 2.5.12
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/README.ar.md +0 -8
- package/README.de.md +0 -8
- package/README.es.md +0 -8
- package/README.fr.md +0 -8
- package/README.hi.md +0 -8
- package/README.ja.md +0 -8
- package/README.ko.md +0 -8
- package/README.md +54 -26
- package/README.pt-BR.md +0 -8
- package/README.ru.md +0 -8
- package/README.zh-CN.md +0 -8
- package/dist/commonjs/components/ConsoleLogCard.js +32 -26
- package/dist/commonjs/components/ErrorBoundary.js +1 -1
- package/dist/commonjs/components/Inspector/ConsoleTab.js +19 -14
- package/dist/commonjs/components/Inspector/FloatingCaptureWidget.js +4 -4
- package/dist/commonjs/components/Inspector/InspectorHeader.js +73 -65
- package/dist/commonjs/components/Inspector/MainScreen.js +9 -6
- package/dist/commonjs/components/Inspector/MediaGalleryTab.js +187 -90
- package/dist/commonjs/components/Inspector/NetworkDetail.js +11 -8
- package/dist/commonjs/components/Inspector/NetworkTab.js +33 -31
- package/dist/commonjs/components/Inspector/PerformanceTab.d.ts +2 -0
- package/dist/commonjs/components/Inspector/PerformanceTab.js +652 -0
- package/dist/commonjs/components/Inspector/SettingsPanel.js +346 -245
- package/dist/commonjs/components/Inspector/TabBar.js +17 -16
- package/dist/commonjs/components/LogCard.js +11 -8
- package/dist/commonjs/components/ModuleErrorBoundary.js +1 -1
- package/dist/commonjs/components/NetworkIcons.d.ts +9 -0
- package/dist/commonjs/components/NetworkIcons.js +51 -6
- package/dist/commonjs/constants/index.d.ts +1 -0
- package/dist/commonjs/constants/index.js +1 -1
- package/dist/commonjs/constants/version.d.ts +1 -1
- package/dist/commonjs/constants/version.js +1 -1
- package/dist/commonjs/customHooks/crashHandler.d.ts +9 -1
- package/dist/commonjs/customHooks/crashHandler.js +4 -4
- package/dist/commonjs/helpers/index.d.ts +3 -0
- package/dist/commonjs/helpers/index.js +8 -6
- package/dist/commonjs/helpers/performanceSampler.d.ts +88 -0
- package/dist/commonjs/helpers/performanceSampler.js +1 -0
- package/dist/commonjs/helpers/remoteConfig.d.ts +6 -0
- package/dist/commonjs/helpers/remoteConfig.js +1 -1
- package/dist/commonjs/helpers/telemetry.js +1 -1
- package/dist/commonjs/i18n/locales/ar.json +1 -1
- package/dist/commonjs/i18n/locales/bn.json +1 -1
- package/dist/commonjs/i18n/locales/de.json +1 -1
- package/dist/commonjs/i18n/locales/en.json +1 -1
- package/dist/commonjs/i18n/locales/es.json +1 -1
- package/dist/commonjs/i18n/locales/fr.json +1 -1
- package/dist/commonjs/i18n/locales/gu.json +1 -1
- package/dist/commonjs/i18n/locales/hi.json +1 -1
- package/dist/commonjs/i18n/locales/id.json +1 -1
- package/dist/commonjs/i18n/locales/it.json +1 -1
- package/dist/commonjs/i18n/locales/ja.json +1 -1
- package/dist/commonjs/i18n/locales/kn.json +1 -1
- package/dist/commonjs/i18n/locales/ko.json +1 -1
- package/dist/commonjs/i18n/locales/ml.json +1 -1
- package/dist/commonjs/i18n/locales/mr.json +1 -1
- package/dist/commonjs/i18n/locales/nl.json +1 -1
- package/dist/commonjs/i18n/locales/pa.json +1 -1
- package/dist/commonjs/i18n/locales/pl.json +1 -1
- package/dist/commonjs/i18n/locales/pt.json +1 -1
- package/dist/commonjs/i18n/locales/ru.json +1 -1
- package/dist/commonjs/i18n/locales/ta.json +1 -1
- package/dist/commonjs/i18n/locales/te.json +1 -1
- package/dist/commonjs/i18n/locales/tr.json +1 -1
- package/dist/commonjs/i18n/locales/vi.json +1 -1
- package/dist/commonjs/i18n/locales/zh.json +1 -1
- package/dist/commonjs/index.d.ts +4 -2
- package/dist/commonjs/index.js +3 -3
- package/dist/commonjs/styles/index.js +1 -1
- package/dist/commonjs/types/enums.d.ts +1 -0
- package/dist/commonjs/types/enums.js +1 -1
- package/dist/commonjs/types/interfaces.d.ts +28 -0
- package/dist/esm/components/ConsoleLogCard.js +67 -61
- package/dist/esm/components/ErrorBoundary.js +10 -10
- package/dist/esm/components/Inspector/ConsoleTab.js +33 -28
- package/dist/esm/components/Inspector/FloatingCaptureWidget.js +22 -22
- package/dist/esm/components/Inspector/InspectorHeader.js +194 -186
- package/dist/esm/components/Inspector/MainScreen.js +61 -58
- package/dist/esm/components/Inspector/MediaGalleryTab.js +254 -157
- package/dist/esm/components/Inspector/NetworkDetail.js +62 -59
- package/dist/esm/components/Inspector/NetworkTab.js +39 -37
- package/dist/esm/components/Inspector/PerformanceTab.d.ts +2 -0
- package/dist/esm/components/Inspector/PerformanceTab.js +652 -0
- package/dist/esm/components/Inspector/SettingsPanel.js +407 -306
- package/dist/esm/components/Inspector/TabBar.js +4 -3
- package/dist/esm/components/LogCard.js +37 -34
- package/dist/esm/components/ModuleErrorBoundary.js +1 -1
- package/dist/esm/components/NetworkIcons.d.ts +9 -0
- package/dist/esm/components/NetworkIcons.js +48 -3
- package/dist/esm/constants/index.d.ts +1 -0
- package/dist/esm/constants/index.js +1 -1
- package/dist/esm/constants/version.d.ts +1 -1
- package/dist/esm/constants/version.js +1 -1
- package/dist/esm/customHooks/crashHandler.d.ts +9 -1
- package/dist/esm/customHooks/crashHandler.js +6 -6
- package/dist/esm/helpers/index.d.ts +3 -0
- package/dist/esm/helpers/index.js +8 -6
- package/dist/esm/helpers/performanceSampler.d.ts +88 -0
- package/dist/esm/helpers/performanceSampler.js +1 -0
- package/dist/esm/helpers/remoteConfig.d.ts +6 -0
- package/dist/esm/helpers/remoteConfig.js +1 -1
- package/dist/esm/helpers/telemetry.js +1 -1
- package/dist/esm/i18n/locales/ar.json +1 -1
- package/dist/esm/i18n/locales/bn.json +1 -1
- package/dist/esm/i18n/locales/de.json +1 -1
- package/dist/esm/i18n/locales/en.json +1 -1
- package/dist/esm/i18n/locales/es.json +1 -1
- package/dist/esm/i18n/locales/fr.json +1 -1
- package/dist/esm/i18n/locales/gu.json +1 -1
- package/dist/esm/i18n/locales/hi.json +1 -1
- package/dist/esm/i18n/locales/id.json +1 -1
- package/dist/esm/i18n/locales/it.json +1 -1
- package/dist/esm/i18n/locales/ja.json +1 -1
- package/dist/esm/i18n/locales/kn.json +1 -1
- package/dist/esm/i18n/locales/ko.json +1 -1
- package/dist/esm/i18n/locales/ml.json +1 -1
- package/dist/esm/i18n/locales/mr.json +1 -1
- package/dist/esm/i18n/locales/nl.json +1 -1
- package/dist/esm/i18n/locales/pa.json +1 -1
- package/dist/esm/i18n/locales/pl.json +1 -1
- package/dist/esm/i18n/locales/pt.json +1 -1
- package/dist/esm/i18n/locales/ru.json +1 -1
- package/dist/esm/i18n/locales/ta.json +1 -1
- package/dist/esm/i18n/locales/te.json +1 -1
- package/dist/esm/i18n/locales/tr.json +1 -1
- package/dist/esm/i18n/locales/vi.json +1 -1
- package/dist/esm/i18n/locales/zh.json +1 -1
- package/dist/esm/index.d.ts +4 -2
- package/dist/esm/index.js +8 -8
- package/dist/esm/styles/index.js +1 -1
- package/dist/esm/types/enums.d.ts +1 -0
- package/dist/esm/types/enums.js +1 -1
- package/dist/esm/types/interfaces.d.ts +28 -0
- package/package.json +24 -1
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import{Platform as
|
|
2
|
-
-H "${n}: ${r}"`}),
|
|
3
|
-
-d '${n.replace(/'/g,"'\\''")}'`}return
|
|
1
|
+
import{Platform as S,ToastAndroid as x,Alert as P,NativeModules as u,Linking as y}from"react-native";import $ from"@react-native-clipboard/clipboard";import{showToast as w}from"./toast";import{copyMediaToClipboard as E}from"../native/NativeInspector";import{AppColors as c}from"../styles/AppColors";import{DOMAIN_COLORS as C,DURATION_FAST_MS as M,DURATION_SLOW_MS as D}from"../constants";export*from"./searchQueryParser";export*from"./memoryManager";export*from"./toast";export const isLocalDebugEnvironment=()=>{const e=typeof __DEV__<"u"&&!!__DEV__,t=u.SourceCode?.scriptURL||"",n=t.startsWith("http://")||t.startsWith("https://")||t.includes(":8081")||t.includes(":8082");return e||n},getDomainColor=e=>{if(!e)return C[0];let t=0;for(let n=0;n<e.length;n++)t=e.charCodeAt(n)+((t<<5)-t);return C[Math.abs(t)%C.length]},formatDateTime=e=>{const t=new Date(e),n=(d,l=2)=>String(d).padStart(l,"0"),r=n(t.getDate()),o=n(t.getMonth()+1),s=t.getFullYear(),i=n(t.getHours()),a=n(t.getMinutes()),p=n(t.getSeconds());return`${r}/${o}/${s} ${i}:${a}:${p}`},formatTimestamp=e=>{try{const t=new Date(e),n=t.getHours().toString().padStart(2,"0"),r=t.getMinutes().toString().padStart(2,"0"),o=t.getSeconds().toString().padStart(2,"0"),s=t.getMilliseconds().toString().padStart(3,"0");return`${n}:${r}:${o}.${s}`}catch{return"\u2014"}},getStatusColor=e=>!e||e===0?c.errorColor:e>=500?c.errorColor:e>=400?c.darkOrange:e>=300?c.warningIconGold:c.greenColor,getDurationColor=e=>e==null?c.grayTextWeak:e<M?c.greenColor:e<D?c.lightOrange:c.errorColor,getSize=e=>{try{const t=JSON.stringify(e)?.length??0;return t<1024?`${t} B`:`${(t/1024).toFixed(1)} KB`}catch{return"\u2014"}},formatBytes=e=>{if(e===0||!e||isNaN(e))return"0 B";const t=1024,n=["B","KB","MB","GB"],r=Math.floor(Math.log(e)/Math.log(t));return`${parseFloat((e/Math.pow(t,r)).toFixed(1))} ${n[r]||"B"}`},formatByteSize=e=>!e||e<=0?"0 B":e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(2)} MB`,copyToClipboard=(e,t)=>{const n=typeof e=="function"?e():e;let r="";if(typeof n=="string")r=n;else try{r=JSON.stringify(n,null,2)}catch{r=String(n)}try{typeof $?.setString=="function"?$.setString(r):typeof $?.default?.setString=="function"&&$.default.setString(r)}catch(o){__DEV__&&console.warn("[NetworkInspector] Clipboard.setString failed:",o)}try{w(t?`${t} copied to clipboard`:"Copied to clipboard")}catch{}try{S.OS==="android"&&x?.show&&x.show(t?`${t} copied to clipboard`:"Copied to clipboard",x.SHORT)}catch{}},copyImageOrMediaToClipboard=async(e,t="Image")=>{if(!e)return;let n=!1;try{n=await E(e)}catch{n=!1}if(!n){copyToClipboard(e,t);return}try{w(`${t} copied to clipboard`)}catch{}try{S.OS==="android"&&x?.show&&x.show(`${t} copied to clipboard`,x.SHORT)}catch{}},getPath=e=>{try{const t=new URL(e);return t.pathname+(t.search?t.search:"")}catch{return e.replace(/^https?:\/\/[^/?#]+/,"")||"/"}},getBaseUrl=e=>{try{const t=new URL(e);return`${t.protocol}//${t.host}`}catch{const t=e.match(/^(https?:\/\/[^/]+)/);return t?t[1]:""}},getCurlCommand=e=>{let t=`curl -X ${e.method} "${e.url}"`;if(e.requestHeaders&&Object.entries(e.requestHeaders).forEach(([n,r])=>{t+=` \\
|
|
2
|
+
-H "${n}: ${r}"`}),e.request&&e.method!=="GET"){const n=typeof e.request=="string"?e.request:JSON.stringify(e.request);t+=` \\
|
|
3
|
+
-d '${n.replace(/'/g,"'\\''")}'`}return t},getFetchCommand=e=>{const t={method:e.method};return e.requestHeaders&&Object.keys(e.requestHeaders).length>0&&(t.headers=e.requestHeaders),e.request&&e.method!=="GET"&&(t.body=JSON.stringify(e.request)),`fetch("${e.url}", ${JSON.stringify(t,null,2)})`},getPostmanRequestJson=e=>{let t;try{const s=new URL(e.url),i=s.hostname.split("."),a=s.pathname.replace(/^\//,"").split("/").filter(Boolean),p=[];s.searchParams.forEach((d,l)=>{p.push({key:l,value:d})}),t={raw:e.url,host:i,path:a,query:p.length>0?p:void 0}}catch{t={raw:e.url}}const n=[];e.requestHeaders&&typeof e.requestHeaders=="object"&&Object.entries(e.requestHeaders).forEach(([s,i])=>{n.push({key:s,value:String(i),type:"text"})});let r;if(e.request){const s=e.request;let i="";if(typeof s=="object")try{i=JSON.stringify(s,null,2)}catch{i=String(s)}else i=String(s);r={mode:"raw",raw:i,options:{raw:{language:"json"}}}}const o={info:{name:`${e.method} ${getPath(e.url)||e.url}`,schema:"https://schema.getpostman.com/json/collection/v2.1.0/collection.json",_exporter_id:"inapp-inspector"},item:[{name:`${e.method} ${getPath(e.url)||e.url}`,request:{method:e.method||"GET",header:n,body:r,url:t,description:"Captured by React Native In-App Inspector"},response:[]}]};return JSON.stringify(o,null,2)},openWithPostman=async(e,t)=>{const n=getCurlCommand(e);$.setString(n);const r="postman://";try{if(await y.canOpenURL(r)){await y.openURL(r),t?t("Opened Postman (cURL copied to clipboard)"):w("Opened Postman (cURL copied to clipboard)");return}}catch{}P.alert("Open with Postman",`cURL for "${e.method} ${getPath(e.url)||e.url}" copied to clipboard!
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
In Postman: Click "Import" > paste the cURL to load this request.`,[{text:"Done",style:"cancel"},{text:"Open Postman Web",onPress:()=>{y.openURL("https://web.postman.co/").catch(()=>{})}}])},deduplicateLogs=e=>{const t=new Map;return e.forEach(n=>{if(!t.has(n.id))t.set(n.id,n);else{const r=t.get(n.id);(r.status==null&&n.status!=null||(n.startTime??0)>=(r.startTime??0))&&t.set(n.id,n)}}),Array.from(t.values()).sort((n,r)=>r.id-n.id)},escapeRegex=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),getNavigationInfo=(e,t=[])=>{if(!e)return{path:t.length>0?t.join(" \u2794 "):"",params:null};if(e.name&&!e.routes)return{path:t.length>0?[...t,e.name].join(" \u2794 "):e.name,params:e.params||null};if(!e.routes||!Array.isArray(e.routes)||e.routes.length===0)return{path:t.length>0?t.join(" \u2794 "):"",params:null};const n=typeof e.index=="number"&&e.index>=0&&e.index<e.routes.length?e.index:0,r=e.routes[n];if(!r)return{path:t.length>0?t.join(" \u2794 "):"",params:null};const o=r.name?[...t,r.name]:t;return r?.state?getNavigationInfo(r.state,o):{path:o.length>0?o.join(" \u2794 "):r.name||"",params:r.params||null}},getLogPageName=(e,t)=>{const n=t||e?.routeInfo;if(n&&n.path&&n.path!=="Navigators"){const r=n.path.split(" \u2794 ").map(o=>o.trim()).filter(Boolean);return r.length>0?r[r.length-1]:n.path}if(e.caller&&e.caller!=="Unknown")try{const r=e.caller.match(/([^/\\]+)\.(tsx|jsx|ts|js)/i);if(r&&r[1]){const o=r[1];if(!["networklogger","fetch","axios","apiclient","request","http","index","nativeinspector","inappinspector","bundleanalyzer"].includes(o.toLowerCase()))return o}}catch{}if(e.url)try{const o=e.url.split("?")[0].split("#")[0].replace(/^https?:\/\//i,""),s=o.indexOf("/");if(s!==-1){const a=o.substring(s+1).split("/").filter(Boolean),p=["api","v1","v2","v3","v4","rest","graphql","json","data","service","app"],d=a.filter(l=>!p.includes(l.toLowerCase()));if(d.length>0){const l=d[0];return l.charAt(0).toUpperCase()+l.slice(1)}}const i=o.split("/")[0];if(i)return i}catch{}return"General"},flattenObject=(e,t="")=>{let n={};return typeof e=="object"&&e!==null?Array.isArray(e)?e.forEach((r,o)=>{Object.assign(n,flattenObject(r,t?`${t}[${o}]`:`[${o}]`))}):Object.keys(e).forEach(r=>{Object.assign(n,flattenObject(e[r],t?`${t}.${r}`:r))}):n[t||"root"]=e,n},getDiff=(e,t)=>{const n=flattenObject(e),r=flattenObject(t),o=[];return new Set([...Object.keys(n),...Object.keys(r)]).forEach(i=>{i in n?i in r?n[i]!==r[i]&&o.push({type:"changed",path:i,oldVal:n[i],newVal:r[i]}):o.push({type:"removed",path:i,oldVal:n[i]}):o.push({type:"added",path:i,newVal:r[i]})}),o.sort((i,a)=>i.path.localeCompare(a.path))},formatDisplayUrl=e=>e?e.startsWith("http://")||e.startsWith("https://")?e:`https://${e}`:"",getLocalizedFilePath=(e,t,n)=>e.replace("country-language",`${t?.toLowerCase()}-${n?.toLowerCase()}`),getLocalizedFilePathWithSlash=(e,t,n)=>e.replace("country/language",`${t?.toLowerCase()}/${n?.toLowerCase()}`),isAllValuesEmpty=e=>!e||typeof e!="object"?!0:Object.values(e).every(t=>t&&typeof t=="object"&&!Array.isArray(t)&&Object.keys(t).length===0),formatDateTimeToAnalytics=e=>new Date(e)?.toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit"}),getBundleIdentifier=()=>{const e=u.RNDeviceInfo;if(e&&typeof e.bundleId=="string")return e.bundleId;if(e&&typeof e.getBundleId=="function")try{const o=e.getBundleId();if(typeof o=="string")return o}catch{}const t=u.ExponentConstants;if(t&&t.manifest){const o=t.manifest;if(o.ios&&o.ios.bundleIdentifier)return o.ios.bundleIdentifier;if(o.android&&o.android.package)return o.android.package}const n=u.ExpoApplication;if(n&&typeof n.applicationId=="string")return n.applicationId;const r=u.SourceCode;if(r&&typeof r.scriptURL=="string"){const o=r.scriptURL;if(o.includes("assets/"))try{const s=o.match(/assets\/([^/?#]+)/);if(s&&s[1])return s[1]}catch{}}return"org.reactjs.native.example"},getAppName=()=>{const e=u.PlatformConstants;e&&e.interfaceIdiom;const t=u.RNDeviceInfo;if(t&&typeof t.appName=="string")return t.appName;const n=u.NetworkInspectorModule;if(n&&typeof n.appName=="string"&&n.appName.length>0&&n.appName!=="App")return n.appName;const r=u.ExpoApplication;if(r&&typeof r.applicationName=="string")return r.applicationName;const o=u.ExponentConstants;if(o&&o.manifest){const a=o.manifest;if(a.name)return a.name}const s=u.AppInfo;if(s&&typeof s.appName=="string")return s.appName;const i=getBundleIdentifier();if(i&&i!=="org.reactjs.native.example"){const a=i.split("."),p=a[a.length-1];return p?p.charAt(0).toUpperCase()+p.slice(1):"App"}return"App"},getAppVersionAndBuild=()=>{let e="",t="";const n=u.NetworkInspectorModule;if(n&&(typeof n.appVersion=="string"&&n.appVersion.length>0&&(e=n.appVersion),typeof n.appBuild=="string"&&n.appBuild.length>0&&(t=n.appBuild)),!e||!t){const r=u.ExpoApplication;r&&(!e&&typeof r.nativeAppVersion=="string"&&(e=r.nativeAppVersion),!t&&typeof r.nativeBuildVersion=="string"&&(t=r.nativeBuildVersion))}if(!e||!t){const r=u.ExponentConstants;if(r){const o=r.manifest||r.expoConfig;o&&(!e&&o.version&&(e=String(o.version)),t||(o.ios?.buildNumber?t=String(o.ios.buildNumber):o.android?.versionCode&&(t=String(o.android.versionCode))))}}if(!e||!t){const r=u.RNDeviceInfo;if(r){if(!e){if(typeof r.appVersion=="string")e=r.appVersion;else if(typeof r.getVersion=="function")try{e=r.getVersion()}catch{}}if(!t){if(typeof r.buildNumber=="string")t=r.buildNumber;else if(typeof r.getBuildNumber=="function")try{t=r.getBuildNumber()}catch{}}}}if(!e||!t){const r=u.AppInfo;r&&(!e&&typeof r.versionName=="string"&&(e=r.versionName),!t&&typeof r.versionCode=="string"&&(t=r.versionCode))}if(!e){const r=S.constants||u.PlatformConstants;r&&r.Version&&typeof r.Version=="string"&&r.Version.includes(".")&&(e=r.Version)}return e||(e="1.0"),t||(t="1"),{version:e,build:t,formatted:`${e} (${t})`}},handleOpenExternalLink=e=>{if(!e)return;const t=formatDisplayUrl(e);P.alert("Open Link",`Do you want to open this link in your web browser?
|
|
6
|
+
|
|
7
|
+
${t}`,[{text:"Cancel",style:"cancel"},{text:"Open",onPress:()=>{y.openURL(t).catch(()=>{})}}])},formatTimeShort=e=>{const t=new Date(e),n=String(t.getHours()).padStart(2,"0"),r=String(t.getMinutes()).padStart(2,"0"),o=String(t.getSeconds()).padStart(2,"0");return`${n}:${r}:${o}`},formatTime=e=>{const t=new Date(e),n=String(t.getHours()).padStart(2,"0"),r=String(t.getMinutes()).padStart(2,"0"),o=String(t.getSeconds()).padStart(2,"0"),s=String(t.getMilliseconds()).padStart(3,"0");return`${n}:${r}:${o}.${s}`},formatGap=e=>{if(e<1e3)return`+${e}ms`;const t=Math.round(e/1e3);if(t<60)return`+${t}s`;const n=Math.floor(t/60),r=t%60;return r>0?`+${n}m ${r}s`:`+${n}m`},getJsonContent=e=>{if(!e)return null;const t=[];for(let n=0;n<e.length;n++)(e[n]==="{"||e[n]==="[")&&t.push(n);for(const n of t){const r=e.substring(n).trim();try{const o=JSON.parse(r);if(o!==null&&typeof o=="object")return{header:e.substring(0,n).trim(),data:o}}catch{}}return null},getJsonPreviewText=(e,t=4)=>{try{const n=JSON.stringify(e,null,2),r=n.split(`
|
|
8
|
+
`);return r.length>t?{text:r.slice(0,t).join(`
|
|
7
9
|
`)+`
|
|
8
|
-
...`,hasMore:!0}:{text:n,hasMore:!1}}catch{return{text:String(
|
|
10
|
+
...`,hasMore:!0}:{text:n,hasMore:!1}}catch{return{text:String(e),hasMore:!1}}},parseStackLine=(e,t=!1)=>{let n=e.trim().replace(/^at /,"");if(n.includes("@")){const L=n.indexOf("@"),A=n.substring(0,L).trim(),B=n.substring(L+1).trim();n=A?`${A} (${B})`:B}const r=n.match(/^(.*?)\s*\((.*?)\)$/);let o="<anonymous>",s=n;r&&(o=r[1].trim()||"<anonymous>",s=r[2].trim()),(o.startsWith("?anon_")||o==="?")&&(o="anonymous"),s=s.replace(/^address at /,"");const i=s.match(/^(.*?):(\d+):(\d+)$/);let a=s,p,d;i&&(a=i[1],p=i[2],d=i[3]);let l=a.replace(/[?&].*$/,"").replace(/[)]+$/,"").replace(/\/\/+$/,"");l=l.replace(/^(?:https?:\/\/[^\/]+\/|file:\/\/\/|webpack:\/\/\/?)/,"");let f=l.split("/").filter(Boolean).pop()||l;f=f.replace(/[?&].*$/,"").replace(/[)]+$/,""),(f.startsWith("&")||f.startsWith("?")||f.startsWith("platform=")||f.includes("platform=")||f.startsWith("dev=")||f.includes("dev="))&&(f="Unknown",l="Unknown");const b=f.match(/\.([a-z0-9]+)$/i),m=b?b[1].toLowerCase():"",g=m==="tsx"||m==="jsx"||m==="ts"||m==="js"?m:"other",N=s==="native"||l==="native",v=l.includes("InternalBytecode")||l.includes("metro-runtime")||l.includes("regenerator-runtime")||o==="tryCallOne"||o==="asyncGeneratorStep"||o==="_next"||o==="next"&&N,O=l.includes("node_modules")||l.includes("react-native/Libraries")||l.includes("react-native-inapp-inspector")&&!l.includes("/example/"),I=!N&&!v&&!O&&(g==="tsx"||g==="jsx"||g==="ts"||g==="js"||!f.includes(".bundle")&&f!=="Unknown"),R=I?"app":O?"dependency":N?"native":"runtime",U=v||N||o==="asyncGeneratorStep"||o==="_next";let h=l;h.includes("/example/")?h=h.substring(h.indexOf("/example/")+9):h.includes("/src/")?h=h.substring(h.indexOf("/src/")+1):h.includes("/node_modules/")&&(h=h.substring(h.indexOf("/node_modules/")+14));const _=p?`${f}:${p}${d?`:${d}`:""}`:f;return{raw:e,functionName:o,fileName:f,fullPath:h,rawFilePath:a,fileExt:g,frameType:R,isUserCode:I,isRuntimeNoise:U,lineNumber:p,columnNumber:d,isOrigin:t,copyableLocation:_}},getCleanCallerDisplay=e=>{if(!e||e==="Unknown"||e.trim()==="")return null;const t=e.trim();if(t.startsWith("&platform")||t.startsWith("?platform")||t.startsWith("&")||t.includes("&platform=")||t.includes("?platform=")){const s=t.match(/^(.*?)\s*[\(@]/);if(s&&s[1]&&!s[1].includes("&")&&!s[1].includes("platform")){const i=s[1].trim();if(i&&i!=="<anonymous>"&&i!=="anonymous"&&!i.startsWith("?anon_"))return{fileName:i,functionName:i,display:i}}return null}const n=parseStackLine(e,!0);if(!n)return null;if(n.fileName.includes(".bundle")||n.fileName.includes("platform=")||n.fileName.startsWith("&")||n.fileName.startsWith("?")||n.fileName==="index.bundle"||n.fileName==="bundle"||n.fileName==="Unknown")return n.functionName&&n.functionName!=="<anonymous>"&&n.functionName!=="anonymous"&&!n.functionName.startsWith("?")&&!n.functionName.startsWith("_callee")&&!n.functionName.includes("regeneratorRuntime")?{fileName:n.functionName,lineNumber:n.lineNumber,functionName:n.functionName,display:n.functionName}:null;const o=n.lineNumber?`${n.fileName}:${n.lineNumber}`:n.fileName;return{fileName:n.fileName,lineNumber:n.lineNumber,functionName:n.functionName,display:o}},openInVSCode=(e,t,n)=>{const r=t?Number(t):1,o=n?Number(n):1,s=t?`:${t}`:"",i=n?`:${n}`:"",a=e.replace(/^file:\/\//,"");let p=null;try{const m=u?.SourceCode?.scriptURL||u?.PlatformConstants?.serverHost||u?.DevSettings?.serverHost;if(typeof m=="string"&&m.length>0){const g=m.match(/^(https?:\/\/[^/]+)/);g?p=g[1]:!m.startsWith("http")&&m.includes(":")&&(p=`http://${m}`)}}catch{}Array.from(new Set([...p?[p]:[],"http://localhost:8081","http://127.0.0.1:8081","http://10.0.2.2:8081"])).forEach(m=>{try{fetch(`${m}/open-stack-frame`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({file:a,lineNumber:r,column:o})}).catch(()=>{})}catch{}});const l=`vscode://file/${a.replace(/^\/+/,"")}${s}${i}`,f=`cursor://file/${a.replace(/^\/+/,"")}${s}${i}`,b=`vscode-insiders://file/${a.replace(/^\/+/,"")}${s}${i}`;y.openURL(l).catch(()=>{y.openURL(f).catch(()=>{y.openURL(b).catch(()=>{copyToClipboard(`${a}${s}${i}`,"Location")})})})},ANALYTICS_EVENT_PALETTE=[c.googleBlue,c.googleGreen,c.googlePurple,c.googleTeal,c.googleRed,c.googleOrange,c.blue700,c.materialGreen],getEventColor=e=>{const t=typeof e=="string"?e:String(e||"");let n=0;for(let r=0;r<t.length;r++)n=n*31+t.charCodeAt(r)|0;return ANALYTICS_EVENT_PALETTE[Math.abs(n)%ANALYTICS_EVENT_PALETTE.length]};export{getEventCategory,registerGAPlugin}from"./gaAnalyticsRegistry";export const getCategoryColors=e=>{switch(e){case"page_view":case"Page View":return{bg:c.blueBg,border:c.blueBorder,text:c.blue800};case"ecommerce":case"Ecommerce":return{bg:c.greenBg,border:c.greenBorder,text:c.materialGreen};case"system":case"System":return{bg:c.greyBg,border:c.greyBorder,text:c.grey600};default:return{bg:c.purpleBg,border:c.purpleBorder,text:c.purpleText}}},getRuntimeDiagnostics=()=>{const e=typeof global.HermesInternal<"u",t=typeof global._v8runtime<"u",n=e?"hermes":t?"v8":"jsc",o=typeof global.nativeFabricUIManager<"u"||!!global.__turboModuleProxy?"fabric":"paper";let s=32.4,i=64;try{const a=global.HermesInternal?.getInstrumentedStats?.();a?.js_heap_size?(s=Number((a.js_heap_size/(1024*1024)).toFixed(1)),i=Number(((a.js_allocated_bytes||a.js_heap_size*1.6)/(1024*1024)).toFixed(1))):global.performance?.memory?.usedJSHeapSize&&(s=Number((global.performance.memory.usedJSHeapSize/(1024*1024)).toFixed(1)),i=Number((global.performance.memory.totalJSHeapSize/(1024*1024)).toFixed(1)))}catch{}return{engineType:n,archType:o,usedHeapMb:s,totalAllocMb:i}},isUrlHidden=(e,t)=>{if(!e||!t||t.length===0)return!1;const n=e.trim();if(!n)return!1;const r=n.toLowerCase();for(let o=0;o<t.length;o++){const s=t[o]?.trim();if(!s)continue;const i=s.toLowerCase();if(r.includes(i))return!0;const a=i.replace(/^https?:\/\//,""),p=r.replace(/^https?:\/\//,"");if(a&&p.includes(a))return!0;if(s.includes("*"))try{const d=s.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*");if(new RegExp(d,"i").test(n))return!0}catch{}try{if(new RegExp(s,"i").test(n))return!0}catch{}}return!1};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
export interface FrameSample {
|
|
2
|
+
timestamp: number;
|
|
3
|
+
durationMs: number;
|
|
4
|
+
fps: number;
|
|
5
|
+
isJank: boolean;
|
|
6
|
+
isFrozen: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface JankEvent {
|
|
9
|
+
id: string;
|
|
10
|
+
timestamp: number;
|
|
11
|
+
timeStr: string;
|
|
12
|
+
durationMs: number;
|
|
13
|
+
fps: number;
|
|
14
|
+
severity: 'moderate' | 'severe' | 'frozen';
|
|
15
|
+
}
|
|
16
|
+
export interface MemoryStats {
|
|
17
|
+
usedHeapMb: number;
|
|
18
|
+
totalAllocMb: number;
|
|
19
|
+
peakHeapMb: number;
|
|
20
|
+
engine: string;
|
|
21
|
+
isAvailable: boolean;
|
|
22
|
+
gcCount?: number;
|
|
23
|
+
gcTimeMs?: number;
|
|
24
|
+
}
|
|
25
|
+
export interface PercentileStats {
|
|
26
|
+
p50Ms: number;
|
|
27
|
+
p90Ms: number;
|
|
28
|
+
p95Ms: number;
|
|
29
|
+
p99Ms: number;
|
|
30
|
+
}
|
|
31
|
+
export interface BucketDistribution {
|
|
32
|
+
ultraSmoothCount: number;
|
|
33
|
+
smoothCount: number;
|
|
34
|
+
degradedCount: number;
|
|
35
|
+
stutteredCount: number;
|
|
36
|
+
frozenCount: number;
|
|
37
|
+
totalSamples: number;
|
|
38
|
+
}
|
|
39
|
+
export interface EngineDetails {
|
|
40
|
+
engineName: string;
|
|
41
|
+
isHermes: boolean;
|
|
42
|
+
isFabric: boolean;
|
|
43
|
+
isTurboModules: boolean;
|
|
44
|
+
architectureName: string;
|
|
45
|
+
gcCollections?: number;
|
|
46
|
+
gcCpuTimeMs?: number;
|
|
47
|
+
heapUsedMb: number;
|
|
48
|
+
heapTotalMb: number;
|
|
49
|
+
peakHeapMb: number;
|
|
50
|
+
}
|
|
51
|
+
export interface LivePerformanceData {
|
|
52
|
+
fps: number;
|
|
53
|
+
avgFps: number;
|
|
54
|
+
minFps: number;
|
|
55
|
+
maxFps: number;
|
|
56
|
+
frameDurationMs: number;
|
|
57
|
+
refreshRateHz: number;
|
|
58
|
+
jankCount: number;
|
|
59
|
+
frozenCount: number;
|
|
60
|
+
jankPercent: number;
|
|
61
|
+
apdexScore: number;
|
|
62
|
+
apdexStatus: 'EXCELLENT' | 'GOOD' | 'FAIR' | 'POOR';
|
|
63
|
+
satisfiedCount: number;
|
|
64
|
+
toleratingCount: number;
|
|
65
|
+
frustratedCount: number;
|
|
66
|
+
longTaskCount: number;
|
|
67
|
+
percentiles: PercentileStats;
|
|
68
|
+
budgetUsedPercent: number;
|
|
69
|
+
budgetHeadroomMs: number;
|
|
70
|
+
distribution: BucketDistribution;
|
|
71
|
+
engineDetails: EngineDetails;
|
|
72
|
+
jsEventLoopLagMs: number;
|
|
73
|
+
avgJsLagMs: number;
|
|
74
|
+
peakJsLagMs: number;
|
|
75
|
+
healthScore: number;
|
|
76
|
+
healthStatus: 'EXCELLENT' | 'GOOD' | 'FAIR' | 'POOR';
|
|
77
|
+
frameHistory: number[];
|
|
78
|
+
jsLagHistory: number[];
|
|
79
|
+
recentJanks: JankEvent[];
|
|
80
|
+
memory: MemoryStats;
|
|
81
|
+
sessionDurationSec: number;
|
|
82
|
+
isStressTesting: boolean;
|
|
83
|
+
runJsStressTest: (durationMs?: number) => void;
|
|
84
|
+
runRenderStressTest: () => void;
|
|
85
|
+
triggerGC: () => void;
|
|
86
|
+
resetStats: () => void;
|
|
87
|
+
}
|
|
88
|
+
export declare const usePerformanceMonitor: (active?: boolean) => LivePerformanceData;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{useState as e,useEffect as z,useRef as a,useCallback as k,useMemo as xe}from"react";export const usePerformanceMonitor=(f=!0)=>{const H=a(0),I=a(0),x=a([]),C=a([]),S=a(0),R=a(0),N=a(0),v=a(0),E=a(0),B=a(0),O=a(0),U=a(0),A=a(0),P=a(0),M=a([]),_=a(null),y=a(null),$=a(null),V=a(null),h=k(()=>{const t=!!global.HermesInternal,i=!!global._v8runtime,n=typeof global.nativeFabricUIManager<"u"||!!global.__turboModuleProxy,s=`${t?"Hermes":i?"V8 Engine":"JavaScriptCore"} \u2022 ${n?"Fabric":"Paper"}`;let o=0,u=0,m=!1,g,J;try{const T=global.HermesInternal;if(T?.getInstrumentedStats){const r=T.getInstrumentedStats();if(r&&typeof r=="object"){const l=r.js_heap_size??r.heapSize??r["js.heap_size"]??r.js_allocated_bytes??0,j=r.js_allocated_bytes??r.allocatedBytes??r["js.allocated_bytes"]??r.totalAllocatedBytes??l;(l>0||j>0)&&(o=Number((l/(1024*1024)).toFixed(2)),u=Number((j/(1024*1024)).toFixed(2)),g=r.gc_num_collections??r.num_gc_collections??r["gc.num_collections"],J=r.gc_cpu_time??r.gc_time??r["gc.cpu_time"],m=!0)}}else if(global.performance?.memory?.usedJSHeapSize){const r=global.performance.memory;o=Number((r.usedJSHeapSize/(1024*1024)).toFixed(2)),u=Number((r.totalJSHeapSize/(1024*1024)).toFixed(2)),m=!0}}catch{}const L=v?.current||0,F=Math.max(L,o);return v&&(v.current=F),{usedHeapMb:o,totalAllocMb:u,peakHeapMb:F,engine:s,isAvailable:m,gcCount:g,gcTimeMs:J}},[]),[Ce,Q]=e(60),[Se,W]=e(60),[Re,Y]=e(60),[_e,Z]=e(60),[ye,q]=e(16.6),[Le,ut]=e(60),[Te,ee]=e(0),[ke,te]=e(0),[He,ne]=e(0),[b,re]=e(1),[Ie,se]=e(0),[Ne,oe]=e(0),[ve,ae]=e(0),[G,ce]=e(0),[Ae,Pe]=e({p50Ms:16.6,p90Ms:16.6,p95Ms:16.6,p99Ms:16.6}),[we,De]=e(100),[Je,je]=e(0),[ze,Ee]=e({ultraSmoothCount:0,smoothCount:0,degradedCount:0,stutteredCount:0,frozenCount:0,totalSamples:0}),[Be,ue]=e(0),[Oe,ie]=e(0),[Ue,le]=e(0),[$e,me]=e(()=>Array(45).fill(16.6)),[Ve,fe]=e(()=>Array(25).fill(0)),[qe,ge]=e([]),[Ge,w]=e(!1),[Xe,de]=e(0),[p,X]=e(()=>h()),Ke=xe(()=>{const t=!!global.HermesInternal,i=!!global._v8runtime,n=typeof global.nativeFabricUIManager<"u"||!!global.__turboModuleProxy,c=!!global.__turboModuleProxy;return{engineName:t?"Hermes":i?"V8 Engine":"JavaScriptCore",isHermes:t,isFabric:n,isTurboModules:c,architectureName:n?"Fabric (New Architecture)":"Paper (Legacy)",heapUsedMb:p.usedHeapMb,heapTotalMb:p.totalAllocMb,peakHeapMb:p.peakHeapMb,gcCollections:p.gcCount,gcCpuTimeMs:p.gcTimeMs}},[p]);z(()=>{if(!f)return;let t=!0,i=6;H.current=performance.now();const n=c=>{if(!t)return;if(i>0){H.current=c,i--,_.current=requestAnimationFrame(n);return}const s=c-H.current;if(H.current=c,s>0&&s<800){I.current++;const o=Math.min(60,Math.max(1,Math.round(1e3/Math.max(16,s)))),u=Number(s.toFixed(1));if(s<=18.5)E.current++;else if(s<=66.6){if(B.current++,A.current++,s>36){const m={id:`jank_${Date.now()}_${Math.random().toString(36).substring(2,6)}`,timestamp:Date.now(),timeStr:new Date().toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"}),durationMs:u,fps:o,severity:"moderate"};M.current=[m,...M.current.slice(0,19)]}}else{O.current++,P.current++;const m={id:`jank_${Date.now()}_${Math.random().toString(36).substring(2,6)}`,timestamp:Date.now(),timeStr:new Date().toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"}),durationMs:u,fps:o,severity:"frozen"};M.current=[m,...M.current.slice(0,19)]}x.current.push(u),x.current.length>45&&x.current.shift(),I.current===1?(S.current=o,R.current=o):(o<S.current&&o>=15&&(S.current=o),o>R.current&&(R.current=o))}_.current=requestAnimationFrame(n)};return _.current=requestAnimationFrame(n),()=>{t=!1,_.current&&cancelAnimationFrame(_.current)}},[f]),z(()=>{if(!f)return;const t=30;let i=performance.now()+t,n=5;const c=()=>{const s=performance.now(),o=s-i;if(i=s+t,n>0){n--,y.current=setTimeout(c,t);return}const u=Math.max(0,Number((o-8).toFixed(1)));u>N.current&&(N.current=u),u>=50&&U.current++,C.current.push(u),C.current.length>30&&C.current.shift(),y.current=setTimeout(c,t)};return y.current=setTimeout(c,t),()=>{y.current&&clearTimeout(y.current)}},[f]),z(()=>{if(!f)return;const i=setInterval(()=>{const n=x.current,c=C.current;if(n.length>0){const s=n[n.length-1]??16.6,u=n.reduce((d,K)=>d+K,0)/n.length,m=Math.min(60,Math.max(1,Math.round(1e3/Math.max(16,u)))),g=Math.min(60,Math.max(1,Math.round(1e3/Math.max(16,s))));Q(g),W(m),q(s),me([...n]),Y(S.current||g),Z(R.current||g);const J=Math.max(1,I.current),L=E.current,F=B.current,T=O.current,r=Number(((L+F/2)/Math.max(1,L+F+T)).toFixed(2));re(Math.max(0,Math.min(1,r))),se(L),oe(F),ae(T),ce(U.current);const l=[...n].sort((d,K)=>d-K),j=l[Math.floor(l.length*.5)]??16.6,nt=l[Math.floor(l.length*.9)]??16.6,rt=l[Math.floor(l.length*.95)]??16.6,st=l[Math.floor(l.length*.99)]??16.6;Pe({p50Ms:Number(j.toFixed(1)),p90Ms:Number(nt.toFixed(1)),p95Ms:Number(rt.toFixed(1)),p99Ms:Number(st.toFixed(1))});const ot=Math.min(250,Number((s/16.6*100).toFixed(0))),at=Number(Math.max(0,16.6-s).toFixed(1));De(ot),je(at);let pe=0,Me=0,he=0,be=0,Fe=0;for(const d of n)d<=16.6?pe++:d<=24?Me++:d<=34?he++:d<=66.6?be++:Fe++;Ee({ultraSmoothCount:pe,smoothCount:Me,degradedCount:he,stutteredCount:be,frozenCount:Fe,totalSamples:n.length});const ct=Number(((A.current+P.current)/J*100).toFixed(1));ne(ct),ee(A.current),te(P.current),ge([...M.current])}if(c.length>0){const s=c[c.length-1]??0,o=c.reduce((m,g)=>m+g,0),u=Number((o/c.length).toFixed(1));ue(s),ie(u),le(N.current),fe([...c])}},300);return()=>{clearInterval(i)}},[f]),z(()=>{if(f)return $.current=setInterval(()=>{X(h())},1500),V.current=setInterval(()=>{de(t=>t+1)},1e3),()=>{$.current&&clearInterval($.current),V.current&&clearInterval(V.current)}},[f,h]);const D=xe(()=>{const t=Math.round(b*100-Math.min(G*2,10));return Math.max(0,Math.min(100,t))},[b,G]),Qe=D>=88?"EXCELLENT":D>=72?"GOOD":D>=55?"FAIR":"POOR",We=b>=.94?"EXCELLENT":b>=.85?"GOOD":b>=.7?"FAIR":"POOR",Ye=k((t=120)=>{w(!0),setTimeout(()=>{const i=performance.now();for(;performance.now()-i<t;)Math.sqrt(Math.random()*1e6);w(!1)},50)},[]),Ze=k(()=>{w(!0);let t=0;const i=setInterval(()=>{t++,q(n=>Number((n+.1).toFixed(1))),t>25&&(clearInterval(i),w(!1))},16)},[]),et=k(()=>{try{const t=global.HermesInternal;t?.gc?t.gc():global.gc&&global.gc(),setTimeout(()=>{X(h())},200)}catch{}},[]),tt=k(()=>{I.current=0,E.current=0,B.current=0,O.current=0,U.current=0,A.current=0,P.current=0,S.current=0,R.current=0,N.current=0,v.current=0,x.current=[],C.current=[],M.current=[],Q(60),W(60),Y(60),Z(60),q(16.6),re(1),se(0),oe(0),ae(0),ce(0),ee(0),te(0),ne(0),ue(0),ie(0),le(0),me(Array(45).fill(16.6)),fe(Array(25).fill(0)),ge([]),de(0),X(h())},[h]);return{fps:Ce,avgFps:Se,minFps:Re,maxFps:_e,frameDurationMs:ye,refreshRateHz:Le,jankCount:Te,frozenCount:ke,jankPercent:He,apdexScore:b,apdexStatus:We,satisfiedCount:Ie,toleratingCount:Ne,frustratedCount:ve,longTaskCount:G,percentiles:Ae,budgetUsedPercent:we,budgetHeadroomMs:Je,distribution:ze,engineDetails:Ke,jsEventLoopLagMs:Be,avgJsLagMs:Oe,peakJsLagMs:Ue,healthScore:D,healthStatus:Qe,frameHistory:$e,jsLagHistory:Ve,recentJanks:qe,memory:p,sessionDurationSec:Xe,isStressTesting:Ge,runJsStressTest:Ye,runRenderStressTest:Ze,triggerGC:et,resetStats:tt}};
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import { ActiveTab } from '../types';
|
|
2
|
+
export interface InspectorRemoteConfigResult {
|
|
3
|
+
modules?: Partial<Record<ActiveTab, boolean>>;
|
|
4
|
+
captureWidgetEnabled?: boolean;
|
|
5
|
+
enabled?: boolean;
|
|
6
|
+
}
|
|
2
7
|
export declare function getFirebaseRemoteConfig(customInstance?: any): any;
|
|
3
8
|
export declare function isFirebaseRemoteConfigAvailable(customInstance?: any): boolean;
|
|
9
|
+
export declare function fetchRemoteConfigSettings(customInstance?: any, fetchTimeoutMs?: number): Promise<InspectorRemoteConfigResult | null>;
|
|
4
10
|
export declare function fetchRemoteConfigModuleStatus(customInstance?: any, fetchTimeoutMs?: number): Promise<Partial<Record<ActiveTab, boolean>> | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const d=["apis","logs","perf","analytics","redux","storage","device","crash","debugging","media","socket"];let u=null;export function getFirebaseRemoteConfig(e){if(e&&typeof e=="object")return u=e,e;if(u)return u;try{const n=require("@react-native-firebase/remote-config"),t=typeof n.default=="function"?n.default():typeof n=="function"?n():n;return u=t,t}catch{return null}}export function isFirebaseRemoteConfigAvailable(e){return!!getFirebaseRemoteConfig(e)}function l(e){if(e!=null){if(typeof e=="boolean")return e;if(typeof e=="number")return e!==0;if(typeof e=="string"){const n=e.trim().toLowerCase();if(n==="true"||n==="1"||n==="enabled"||n==="on")return!0;if(n==="false"||n==="0"||n==="disabled"||n==="off")return!1;try{return JSON.parse(e)}catch{return}}if(typeof e.asBoolean=="function")return e.asBoolean();if(typeof e.asString=="function"){const n=e.asString(),t=n.trim().toLowerCase();if(t==="true"||t==="1"||t==="enabled"||t==="on")return!0;if(t==="false"||t==="0"||t==="disabled"||t==="off")return!1;try{return JSON.parse(n)}catch{return}}}}export async function fetchRemoteConfigSettings(e,n=8e3){const t=getFirebaseRemoteConfig(e);if(!t)return null;try{const y=(async()=>{typeof t.fetchAndActivate=="function"?await t.fetchAndActivate():(typeof t.fetch=="function"&&await t.fetch(),typeof t.activate=="function"&&await t.activate())})(),_=new Promise((o,r)=>setTimeout(()=>r(new Error("Remote Config fetch timeout")),n));await Promise.race([y,_]).catch(()=>{});const s=o=>{if(typeof t.getValue=="function")try{return t.getValue(o)}catch{return}return t[o]},f={},i={},b=["inspector_modules","inapp_inspector_modules","react_native_inapp_inspector_modules"];for(const o of b){const r=s(o),c=l(r);if(c&&typeof c=="object")for(const a of d)typeof c[a]=="boolean"&&(i[a]=c[a])}for(const o of d){const r=[`inspector_module_${o}`,`inapp_inspector_${o}`,`inspector_${o}`,`inapp_inspector_module_${o}`,`rn_inspector_${o}`];for(const c of r){const a=s(c),p=l(a);if(typeof p=="boolean"){i[o]=p;break}}}Object.keys(i).length>0&&(i.apis===void 0&&(i.apis=!0),f.modules=i);const g=["inspector_capture_widget_enabled","inapp_inspector_capture_widget","inspector_floating_capture_enabled"];for(const o of g){const r=l(s(o));if(typeof r=="boolean"){f.captureWidgetEnabled=r;break}}const m=["inspector_enabled","inapp_inspector_enabled"];for(const o of m){const r=l(s(o));if(typeof r=="boolean"){f.enabled=r;break}}return Object.keys(f).length>0?f:null}catch{return null}}export async function fetchRemoteConfigModuleStatus(e,n=8e3){return(await fetchRemoteConfigSettings(e,n))?.modules||null}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import b from"react";import{Appearance as ae,Dimensions as re,PixelRatio as P,Platform as l,NativeModules as oe}from"react-native";import{LIB_VERSION as R}from"../constants/version";import{loadSettings as y,saveSettings as S}from"./settingsStore";import{isReduxConnected as ie}from"../customHooks/reduxLogger";import{isFirebaseAnalyticsPatched as se}from"../customHooks/analyticsLogger";import{getCrashRecords as ce}from"../customHooks/crashHandler";import{getNetworkLogs as le}from"../customHooks/networkLogger";import{isNativeModuleAvailable as de}from"../native/NativeInspector";import{getAppName as _e,getBundleIdentifier as ue,getAppVersionAndBuild as pe,isLocalDebugEnvironment as ve}from"./index";import{ENC_MID as $,ENC_SEC as j,TELEMETRY_SALT as v}from"../constants/telemetryConfig";const z="react-native-inapp-inspector",me=`${z}::${v}`;function fe(t,o){const i=[];let r=1518500249;for(let a=0;a<o;a++){const e=t.charCodeAt(a%t.length);r=(r*31+e*17+a*13^r>>>7)&4294967295,i.push(r>>>a%24&255)}return i}function H(t){if(!t)return"";const o=[];for(let a=0;a<t.length;a+=2)o.push(parseInt(t.substring(a,a+2),16));const i=fe(me,o.length),r=[];for(let a=0;a<o.length;a++){const e=i[a],d=v.charCodeAt(a%v.length),c=(o[a]^e^d)&255;r.push(String.fromCharCode(c))}return r.join("")}let u=null,p=null;function ge(){if(u!==null&&p!==null)return{measurementId:u,apiSecret:p};if(!$||!j||!v)return u="",p="",{measurementId:"",apiSecret:""};try{u=H($),p=H(j)}catch{u="",p=""}return{measurementId:u,apiSecret:p}}function K(){const{measurementId:t,apiSecret:o}=ge();return!t||!o?"":`https://www.google-analytics.com/mp/collect?measurement_id=${t}&api_secret=${o}`}const he=1440*60*1e3;let m=!0,U=!1;export function setTelemetryEnabled(t){m=t}export function markSearchFilterUsed(){U=!0}async function Z(){try{const t=await y();if(t.telemetryClientId||t.telemetryDeviceId){const e=t.telemetryClientId||t.telemetryDeviceId||"";return t.telemetryDeviceId||await S({...t,telemetryDeviceId:e}),e}const o=Math.floor(1e8+Math.random()*9e8),i=Math.floor(1e9+Math.random()*9e9),r=`${o}.${i}`,a=Date.now();return await S({...t,telemetryClientId:r,telemetryDeviceId:r,deviceFirstSeen:t.deviceFirstSeen||a}),r}catch{return`${Math.floor(1e8+Math.random()*9e8)}.${Math.floor(1e9+Math.random()*9e9)}`}}function be(){try{if(l.OS==="android"){const t=l.constants||{},o=String(t.Model||"").toLowerCase(),i=String(t.Brand||"").toLowerCase(),r=String(t.Fingerprint||"").toLowerCase(),a=String(t.Hardware||"").toLowerCase(),e=String(t.Manufacturer||"").toLowerCase();return o.includes("emulator")||o.includes("sdk")||o.includes("google_sdk")||o.includes("vbox")||i.includes("generic")||r.startsWith("generic")||a.includes("goldfish")||a.includes("ranchu")||e.includes("genymotion")}if(l.OS==="ios"){const t=l.constants||{};return String(t.Model||"").toLowerCase().includes("simulator")||!!t.isSimulator}}catch{return!1}return!1}function ye(){try{const t=typeof Intl<"u"&&Intl.DateTimeFormat?Intl.DateTimeFormat().resolvedOptions():{},o=t.timeZone||"unknown",i=t.locale||"unknown";let r="unknown";if(i&&i!=="unknown"){const a=i.split(/[-_]/);a.length>1&&(r=a[a.length-1].toUpperCase())}return{countryCode:r,locale:i,timeZone:o}}catch{return{countryCode:"unknown",locale:"unknown",timeZone:"unknown"}}}function G(t,o){const i=l.constants,r=i?.reactNativeVersion?`${i.reactNativeVersion.major}.${i.reactNativeVersion.minor}.${i.reactNativeVersion.patch}`:"unknown",a=typeof global.HermesInternal=="object"&&global.HermesInternal!==null,e=global?.nativeFabricUIManager!==void 0,d=!!(global?._rn_bridgeless||global?.RN$Bridgeless),c=!!(typeof __DEV__<"u"&&__DEV__),n=be(),{countryCode:_,locale:f,timeZone:J}=ye();let w="unknown",k=1,I=1,M="phone",C="portrait";try{const s=re.get("window");w=`${Math.round(s.width)}x${Math.round(s.height)}`,k=P.get(),I=P.getFontScale(),C=s.width>s.height?"landscape":"portrait",M=l.OS==="ios"&&!!l.isPad||Math.min(s.width,s.height)>=600?"tablet":"phone"}catch{}let x="unknown";try{x=ae?.getColorScheme?.()||"unknown"}catch{}const Y=!!(globalThis?.expo||globalThis?.__expo||globalThis?.__turboModuleProxy?.name==="Expo"||l.constants?.ExpoVersion);let g="non_hermes",h="jsc";if(a){h="hermes";try{const s=global.HermesInternal?.getRuntimeProperties?.()||{};g=s["OSS Release Version"]||(s["Bytecode Version"]?`bc_v${s["Bytecode Version"]}`:"hermes")}catch{g="hermes"}}else globalThis?._v8&&(h="v8");let T=!1;try{T=ie()}catch{}let E=!1;try{E=se()}catch{}const N=de(),W=!!(oe?.RNMMKV||globalThis?.MMKV);let D=0;try{D=ce().length}catch{}let V="0";try{const s=le().length;V=s===0?"0":s<=10?"1-10":s<=50?"11-50":s<=100?"51-100":"100+"}catch{}let A=!1;try{A=ve()}catch{}const q=o?.defaultTab||"apis",Q=N&&o?.useNativeFab!==!1?"native_ui_thread":"js_floating_button",X=String(i?.Brand||(l.OS==="ios"?"Apple":"unknown")),ee=String(i?.Model||i?.systemName||(l.OS==="ios"?"iPhone/iPad":"unknown")),te=String(i?.Manufacturer||(l.OS==="ios"?"Apple":"unknown"));let B="App",L="unknown",O="unknown",F="unknown";try{B=_e()||"App",L=ue()||"unknown";const s=pe();O=s.version||"unknown",F=s.build||"unknown"}catch{}const ne=typeof b<"u"&&b.version?b.version:"unknown";return{pkg_name:z,pkg_version:R,lib_version:R,install_type:c?"local_dev":"bundled_production",app_name:B,bundle_id:L,app_version:O,app_build:F,react_version:ne,platform:l.OS,os_version:String(l.Version||"unknown"),rn_version:r,country_code:_,device_locale:f,time_zone:J,device_brand:X,device_model:ee,device_manufacturer:te,device_form_factor:M,screen_resolution:w,screen_density:k,screen_orientation:C,font_scale:I,appearance_mode:x,is_expo:Y,js_engine:h,hermes_version:g,is_hermes:a,is_fabric:e,is_bridgeless:d,has_native_module:N,has_mmkv:W,fab_mode:Q,default_landing_tab:q,captured_crashes_count:D,captured_apis_bracket:V,search_filter_used:U,is_metro_connected:A,is_dev:c,is_emulator:n,device_type:n?"emulator":"real_device",app_mode:c?"local_mode":"bundled_application",redux_attached:T,analytics_attached:E,environment:t||(c?"DEV":"PROD"),engagement_time_msec:1e3}}export async function trackActiveTelemetryHeartbeat(t=!0,o){if(t===!1){m=!1;return}if(m=!0,process.env.NODE_ENV==="test"||typeof globalThis.jest<"u")return;const i=K();if(i)try{const r=await y(),a=r.telemetryLastPing||0,e=Date.now(),d=!r.deviceRegistered;if(!d&&e-a<he)return;const c=await Z(),n=G(o,r),_={...n,device_id:c,is_new_device:d,device_first_seen:r.deviceFirstSeen||e},f=d?[{name:"active_device",params:_},{name:"first_device_install",params:_},{name:"inspector_active_heartbeat",params:_}]:[{name:"active_device",params:_},{name:"inspector_active_heartbeat",params:_}];await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client_id:c,user_id:c,non_personalized_ads:!0,user_properties:{device_id:{value:c},pkg_name:{value:n.pkg_name},pkg_version:{value:n.pkg_version},install_type:{value:n.install_type},app_name:{value:n.app_name},bundle_id:{value:n.bundle_id},app_version:{value:n.app_version},react_version:{value:n.react_version},country:{value:n.country_code},country_code:{value:n.country_code},locale:{value:n.device_locale},time_zone:{value:n.time_zone},device_brand:{value:n.device_brand},device_model:{value:n.device_model},device_form_factor:{value:n.device_form_factor},screen_resolution:{value:n.screen_resolution},appearance_mode:{value:n.appearance_mode},is_expo:{value:String(n.is_expo)},js_engine:{value:n.js_engine},is_fabric:{value:String(n.is_fabric)},is_bridgeless:{value:String(n.is_bridgeless)},has_native_module:{value:String(n.has_native_module)},has_mmkv:{value:String(n.has_mmkv)},fab_mode:{value:n.fab_mode},default_landing_tab:{value:n.default_landing_tab},captured_crashes_count:{value:String(n.captured_crashes_count)},captured_apis_bracket:{value:n.captured_apis_bracket},search_filter_used:{value:String(n.search_filter_used)},is_metro_connected:{value:String(n.is_metro_connected)},redux_attached:{value:String(n.redux_attached)},analytics_attached:{value:String(n.analytics_attached)},platform:{value:n.platform},rn_version:{value:n.rn_version},lib_version:{value:n.lib_version}},events:f})}),await S({...r,telemetryClientId:c,telemetryDeviceId:c,deviceRegistered:!0,deviceFirstSeen:r.deviceFirstSeen||e,telemetryLastPing:e,telemetryLastActive:e})}catch{}}export async function trackTelemetryEvent(t,o){if(!m)return;const i=K();if(i)try{const r=await Z(),a=await y().catch(()=>({})),e=G(void 0,a),d={...e,device_id:r,...o,engagement_time_msec:100};await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client_id:r,user_id:r,non_personalized_ads:!0,user_properties:{device_id:{value:r},pkg_name:{value:e.pkg_name},pkg_version:{value:e.pkg_version},install_type:{value:e.install_type},app_name:{value:e.app_name},bundle_id:{value:e.bundle_id},app_version:{value:e.app_version},react_version:{value:e.react_version},country:{value:e.country_code},country_code:{value:e.country_code},locale:{value:e.device_locale},time_zone:{value:e.time_zone},device_brand:{value:e.device_brand},device_model:{value:e.device_model},device_form_factor:{value:e.device_form_factor},screen_resolution:{value:e.screen_resolution},appearance_mode:{value:e.appearance_mode},is_expo:{value:String(e.is_expo)},js_engine:{value:e.js_engine},is_fabric:{value:String(e.is_fabric)},is_bridgeless:{value:String(e.is_bridgeless)},has_native_module:{value:String(e.has_native_module)},has_mmkv:{value:String(e.has_mmkv)},fab_mode:{value:e.fab_mode},default_landing_tab:{value:e.default_landing_tab},captured_crashes_count:{value:String(e.captured_crashes_count)},captured_apis_bracket:{value:e.captured_apis_bracket},search_filter_used:{value:String(e.search_filter_used)},is_metro_connected:{value:String(e.is_metro_connected)},redux_attached:{value:String(e.redux_attached)},analytics_attached:{value:String(e.analytics_attached)},platform:{value:e.platform},rn_version:{value:e.rn_version},lib_version:{value:e.lib_version}},events:[{name:t,params:d}]})})}catch{}}export function trackInspectorTabView(t){trackTelemetryEvent("inspector_tab_view",{tab_name:t,screen_name:`tab_${t}`,screen_class:"NetworkInspector"})}export function trackInspectorScreenView(t){trackTelemetryEvent("screen_view",{screen_name:t,screen_class:"NetworkInspector"})}export function trackInspectorScreenRecord(t,o="screen"){trackTelemetryEvent("inspector_screen_record",{action:t,recording_type:o})}
|
|
1
|
+
import S from"react";import{Appearance as ie,Dimensions as se,PixelRatio as F,Platform as l,NativeModules as ce}from"react-native";import{LIB_VERSION as u}from"../constants/version";import{loadSettings as w,saveSettings as k}from"./settingsStore";import{isReduxConnected as le}from"../customHooks/reduxLogger";import{isFirebaseAnalyticsPatched as de}from"../customHooks/analyticsLogger";import{getCrashRecords as _e}from"../customHooks/crashHandler";import{getNetworkLogs as ue}from"../customHooks/networkLogger";import{isNativeModuleAvailable as pe}from"../native/NativeInspector";import{getAppName as ve,getBundleIdentifier as me,getAppVersionAndBuild as fe,isLocalDebugEnvironment as ge}from"./index";import{ENC_MID as j,ENC_SEC as U,TELEMETRY_SALT as f}from"../constants/telemetryConfig";const z="react-native-inapp-inspector",he=`${z}::${f}`;function be(e,n){const i=[];let o=1518500249;for(let r=0;r<n;r++){const t=e.charCodeAt(r%e.length);o=(o*31+t*17+r*13^o>>>7)&4294967295,i.push(o>>>r%24&255)}return i}function K(e){if(!e)return"";const n=[];for(let r=0;r<e.length;r+=2)n.push(parseInt(e.substring(r,r+2),16));const i=be(he,n.length),o=[];for(let r=0;r<n.length;r++){const t=i[r],d=f.charCodeAt(r%f.length),c=(n[r]^t^d)&255;o.push(String.fromCharCode(c))}return o.join("")}let p=null,v=null;function H(){if(p!==null&&v!==null)return{measurementId:p,apiSecret:v};if(!j||!U||!f)return p="",v="",{measurementId:"",apiSecret:""};try{p=K(j),v=K(U)}catch{p="",v=""}return{measurementId:p,apiSecret:v}}function G(){const{measurementId:e,apiSecret:n}=H();return!e||!n?"":`https://www.google-analytics.com/mp/collect?measurement_id=${e}&api_secret=${n}`}function Z(e){try{const n=l.OS,i=String(e.os_version||(n==="ios"?"17.0":"13.0")),o=(e.device_locale||"en_US").replace("_","-");if(n==="android"){const r=e.device_model||"Android";return`Mozilla/5.0 (Linux; U; Android ${i}; ${o}; ${r}) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/120.0.0.0 Mobile Safari/537.36 (react-native-inapp-inspector/${u})`}else if(n==="ios"){const r=i.replace(/\./g,"_");return`Mozilla/5.0 (${e.device_model||"iPhone"}; CPU iPhone OS ${r} like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 (react-native-inapp-inspector/${u})`}return`${e.app_name||"App"}/${e.app_version||"1.0"} (${n}; ${i}) react-native-inapp-inspector/${u}`}catch{return`react-native-inapp-inspector/${u}`}}function W(e,n,i){const{measurementId:o}=H();if(!o)return"";const r=String(Math.floor(Date.now()/1e3));return`https://www.google-analytics.com/g/collect?${new URLSearchParams({v:"2",tid:o,cid:i,en:e,_p:String(Math.floor(1e6+Math.random()*9e6)),ul:(n.device_locale||"en_US").toLowerCase().replace("_","-"),sr:n.screen_resolution||"1080x1920",_s:"1",_ee:"1",seg:"1",_et:"1000",sid:r,sct:"1",dl:`https://${n.bundle_id||"app.native"}/inspector`,dt:`${n.app_name||"App"} - Inspector`,"ep.country_code":n.country_code||"unknown","ep.app_name":n.app_name||"App","ep.platform":n.platform||l.OS,"ep.pkg_version":n.pkg_version||u,"ep.install_type":n.install_type||"local_dev","ep.js_engine":n.js_engine||"hermes","ep.rn_version":n.rn_version||"","ep.device_brand":n.device_brand||"","ep.device_model":n.device_model||""}).toString()}`}const ye=1440*60*1e3;let g=!0,q=!1;export function setTelemetryEnabled(e){g=e}export function markSearchFilterUsed(){q=!0}async function J(){try{const e=await w();if(e.telemetryClientId||e.telemetryDeviceId){const t=e.telemetryClientId||e.telemetryDeviceId||"";return e.telemetryDeviceId||await k({...e,telemetryDeviceId:t}),t}const n=Math.floor(1e8+Math.random()*9e8),i=Math.floor(1e9+Math.random()*9e9),o=`${n}.${i}`,r=Date.now();return await k({...e,telemetryClientId:o,telemetryDeviceId:o,deviceFirstSeen:e.deviceFirstSeen||r}),o}catch{return`${Math.floor(1e8+Math.random()*9e8)}.${Math.floor(1e9+Math.random()*9e9)}`}}function Se(){try{if(l.OS==="android"){const e=l.constants||{},n=String(e.Model||"").toLowerCase(),i=String(e.Brand||"").toLowerCase(),o=String(e.Fingerprint||"").toLowerCase(),r=String(e.Hardware||"").toLowerCase(),t=String(e.Manufacturer||"").toLowerCase();return n.includes("emulator")||n.includes("sdk")||n.includes("google_sdk")||n.includes("vbox")||i.includes("generic")||o.startsWith("generic")||r.includes("goldfish")||r.includes("ranchu")||t.includes("genymotion")}if(l.OS==="ios"){const e=l.constants||{};return String(e.Model||"").toLowerCase().includes("simulator")||!!e.isSimulator}}catch{return!1}return!1}function we(){try{const e=typeof Intl<"u"&&Intl.DateTimeFormat?Intl.DateTimeFormat().resolvedOptions():{},n=e.timeZone||"unknown",i=e.locale||"unknown";let o="unknown";if(i&&i!=="unknown"){const r=i.split(/[-_]/);r.length>1&&(o=r[r.length-1].toUpperCase())}return{countryCode:o,locale:i,timeZone:n}}catch{return{countryCode:"unknown",locale:"unknown",timeZone:"unknown"}}}function Y(e,n){const i=l.constants,o=i?.reactNativeVersion?`${i.reactNativeVersion.major}.${i.reactNativeVersion.minor}.${i.reactNativeVersion.patch}`:"unknown",r=typeof global.HermesInternal=="object"&&global.HermesInternal!==null,t=global?.nativeFabricUIManager!==void 0,d=!!(global?._rn_bridgeless||global?.RN$Bridgeless),c=!!(typeof __DEV__<"u"&&__DEV__),a=Se(),{countryCode:_,locale:h,timeZone:m}=we();let M="unknown",I=1,C=1,x="phone",A="portrait";try{const s=se.get("window");M=`${Math.round(s.width)}x${Math.round(s.height)}`,I=F.get(),C=F.getFontScale(),A=s.width>s.height?"landscape":"portrait",x=l.OS==="ios"&&!!l.isPad||Math.min(s.width,s.height)>=600?"tablet":"phone"}catch{}let $="unknown";try{$=ie?.getColorScheme?.()||"unknown"}catch{}const X=!!(globalThis?.expo||globalThis?.__expo||globalThis?.__turboModuleProxy?.name==="Expo"||l.constants?.ExpoVersion);let b="non_hermes",y="jsc";if(r){y="hermes";try{const s=global.HermesInternal?.getRuntimeProperties?.()||{};b=s["OSS Release Version"]||(s["Bytecode Version"]?`bc_v${s["Bytecode Version"]}`:"hermes")}catch{b="hermes"}}else globalThis?._v8&&(y="v8");let T=!1;try{T=le()}catch{}let E=!1;try{E=de()}catch{}const V=pe(),Q=!!(ce?.RNMMKV||globalThis?.MMKV);let P=0;try{P=_e().length}catch{}let D="0";try{const s=ue().length;D=s===0?"0":s<=10?"1-10":s<=50?"11-50":s<=100?"51-100":"100+"}catch{}let N=!1;try{N=ge()}catch{}const ee=n?.defaultTab||"apis",te=V&&n?.useNativeFab!==!1?"native_ui_thread":"js_floating_button",ne=String(i?.Brand||(l.OS==="ios"?"Apple":"unknown")),ae=String(i?.Model||i?.systemName||(l.OS==="ios"?"iPhone/iPad":"unknown")),re=String(i?.Manufacturer||(l.OS==="ios"?"Apple":"unknown"));let O="App",L="unknown",B="unknown",R="unknown";try{O=ve()||"App",L=me()||"unknown";const s=fe();B=s.version||"unknown",R=s.build||"unknown"}catch{}const oe=typeof S<"u"&&S.version?S.version:"unknown";return{pkg_name:z,pkg_version:u,lib_version:u,install_type:c?"local_dev":"bundled_production",app_name:O,bundle_id:L,app_version:B,app_build:R,react_version:oe,platform:l.OS,os_version:String(l.Version||"unknown"),rn_version:o,country_code:_,device_locale:h,time_zone:m,device_brand:ne,device_model:ae,device_manufacturer:re,device_form_factor:x,screen_resolution:M,screen_density:I,screen_orientation:A,font_scale:C,appearance_mode:$,is_expo:X,js_engine:y,hermes_version:b,is_hermes:r,is_fabric:t,is_bridgeless:d,has_native_module:V,has_mmkv:Q,fab_mode:te,default_landing_tab:ee,captured_crashes_count:P,captured_apis_bracket:D,search_filter_used:q,is_metro_connected:N,is_dev:c,is_emulator:a,device_type:a?"emulator":"real_device",app_mode:c?"local_mode":"bundled_application",redux_attached:T,analytics_attached:E,environment:e||(c?"DEV":"PROD"),engagement_time_msec:1e3}}export async function trackActiveTelemetryHeartbeat(e=!0,n){if(e===!1){g=!1;return}if(g=!0,process.env.NODE_ENV==="test"||typeof globalThis.jest<"u")return;const i=G();if(i)try{const o=await w(),r=o.telemetryLastPing||0,t=Date.now(),d=!o.deviceRegistered;if(!d&&t-r<ye)return;const c=await J(),a=Y(n,o),_={...a,device_id:c,is_new_device:d,device_first_seen:o.deviceFirstSeen||t},h=d?[{name:"first_open",params:_},{name:"first_device_install",params:_},{name:"session_start",params:_},{name:"active_device",params:_},{name:"inspector_active_heartbeat",params:_}]:[{name:"session_start",params:_},{name:"app_open",params:_},{name:"active_device",params:_},{name:"inspector_active_heartbeat",params:_}],m=W(d?"first_open":"session_start",a,c);m&&fetch(m,{method:"POST",headers:{"User-Agent":Z(a)}}).catch(()=>{}),await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client_id:c,user_id:c,non_personalized_ads:!0,user_properties:{device_id:{value:c},pkg_name:{value:a.pkg_name},pkg_version:{value:a.pkg_version},install_type:{value:a.install_type},app_name:{value:a.app_name},bundle_id:{value:a.bundle_id},app_version:{value:a.app_version},react_version:{value:a.react_version},country:{value:a.country_code},country_code:{value:a.country_code},locale:{value:a.device_locale},time_zone:{value:a.time_zone},device_brand:{value:a.device_brand},device_model:{value:a.device_model},device_form_factor:{value:a.device_form_factor},screen_resolution:{value:a.screen_resolution},appearance_mode:{value:a.appearance_mode},is_expo:{value:String(a.is_expo)},js_engine:{value:a.js_engine},is_fabric:{value:String(a.is_fabric)},is_bridgeless:{value:String(a.is_bridgeless)},has_native_module:{value:String(a.has_native_module)},has_mmkv:{value:String(a.has_mmkv)},fab_mode:{value:a.fab_mode},default_landing_tab:{value:a.default_landing_tab},captured_crashes_count:{value:String(a.captured_crashes_count)},captured_apis_bracket:{value:a.captured_apis_bracket},search_filter_used:{value:String(a.search_filter_used)},is_metro_connected:{value:String(a.is_metro_connected)},redux_attached:{value:String(a.redux_attached)},analytics_attached:{value:String(a.analytics_attached)},platform:{value:a.platform},rn_version:{value:a.rn_version},lib_version:{value:a.lib_version}},events:h})}),await k({...o,telemetryClientId:c,telemetryDeviceId:c,deviceRegistered:!0,deviceFirstSeen:o.deviceFirstSeen||t,telemetryLastPing:t,telemetryLastActive:t})}catch{}}export async function trackTelemetryEvent(e,n){if(!g)return;const i=G();if(i)try{const o=await J(),r=await w().catch(()=>({})),t=Y(void 0,r),d={...t,device_id:o,...n,engagement_time_msec:100},c=W(e,d,o);c&&fetch(c,{method:"POST",headers:{"User-Agent":Z(t)}}).catch(()=>{}),await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client_id:o,user_id:o,non_personalized_ads:!0,user_properties:{device_id:{value:o},pkg_name:{value:t.pkg_name},pkg_version:{value:t.pkg_version},install_type:{value:t.install_type},app_name:{value:t.app_name},bundle_id:{value:t.bundle_id},app_version:{value:t.app_version},react_version:{value:t.react_version},country:{value:t.country_code},country_code:{value:t.country_code},locale:{value:t.device_locale},time_zone:{value:t.time_zone},device_brand:{value:t.device_brand},device_model:{value:t.device_model},device_form_factor:{value:t.device_form_factor},screen_resolution:{value:t.screen_resolution},appearance_mode:{value:t.appearance_mode},is_expo:{value:String(t.is_expo)},js_engine:{value:t.js_engine},is_fabric:{value:String(t.is_fabric)},is_bridgeless:{value:String(t.is_bridgeless)},has_native_module:{value:String(t.has_native_module)},has_mmkv:{value:String(t.has_mmkv)},fab_mode:{value:t.fab_mode},default_landing_tab:{value:t.default_landing_tab},captured_crashes_count:{value:String(t.captured_crashes_count)},captured_apis_bracket:{value:t.captured_apis_bracket},search_filter_used:{value:String(t.search_filter_used)},is_metro_connected:{value:String(t.is_metro_connected)},redux_attached:{value:String(t.redux_attached)},analytics_attached:{value:String(t.analytics_attached)},platform:{value:t.platform},rn_version:{value:t.rn_version},lib_version:{value:t.lib_version}},events:[{name:e,params:d}]})})}catch{}}export function trackInspectorTabView(e){trackTelemetryEvent("inspector_tab_view",{tab_name:e,screen_name:`tab_${e}`,screen_class:"NetworkInspector"})}export function trackInspectorScreenView(e){trackTelemetryEvent("screen_view",{screen_name:e,screen_class:"NetworkInspector"})}export function trackInspectorScreenRecord(e,n="screen"){trackTelemetryEvent("inspector_screen_record",{action:e,recording_type:n})}
|