@buoy-gg/js-top 7.0.3

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 (168) hide show
  1. package/LICENSE +58 -0
  2. package/README.md +56 -0
  3. package/lib/commonjs/index.js +97 -0
  4. package/lib/commonjs/index.js.map +1 -0
  5. package/lib/commonjs/js-top/components/BusySparkline.js +56 -0
  6. package/lib/commonjs/js-top/components/BusySparkline.js.map +1 -0
  7. package/lib/commonjs/js-top/components/JsTopHudOverlay.js +79 -0
  8. package/lib/commonjs/js-top/components/JsTopHudOverlay.js.map +1 -0
  9. package/lib/commonjs/js-top/components/JsTopModal.js +347 -0
  10. package/lib/commonjs/js-top/components/JsTopModal.js.map +1 -0
  11. package/lib/commonjs/js-top/components/TaskDetailView.js +329 -0
  12. package/lib/commonjs/js-top/components/TaskDetailView.js.map +1 -0
  13. package/lib/commonjs/js-top/components/TaskTable.js +360 -0
  14. package/lib/commonjs/js-top/components/TaskTable.js.map +1 -0
  15. package/lib/commonjs/js-top/engine/JsTopController.js +350 -0
  16. package/lib/commonjs/js-top/engine/JsTopController.js.map +1 -0
  17. package/lib/commonjs/js-top/engine/aggregator.js +148 -0
  18. package/lib/commonjs/js-top/engine/aggregator.js.map +1 -0
  19. package/lib/commonjs/js-top/engine/busyProbe.js +101 -0
  20. package/lib/commonjs/js-top/engine/busyProbe.js.map +1 -0
  21. package/lib/commonjs/js-top/engine/frameStack.js +133 -0
  22. package/lib/commonjs/js-top/engine/frameStack.js.map +1 -0
  23. package/lib/commonjs/js-top/engine/longtasks.js +141 -0
  24. package/lib/commonjs/js-top/engine/longtasks.js.map +1 -0
  25. package/lib/commonjs/js-top/engine/now.js +38 -0
  26. package/lib/commonjs/js-top/engine/now.js.map +1 -0
  27. package/lib/commonjs/js-top/engine/originRegistry.js +402 -0
  28. package/lib/commonjs/js-top/engine/originRegistry.js.map +1 -0
  29. package/lib/commonjs/js-top/engine/patches/bridge.js +60 -0
  30. package/lib/commonjs/js-top/engine/patches/bridge.js.map +1 -0
  31. package/lib/commonjs/js-top/engine/patches/microtasks.js +27 -0
  32. package/lib/commonjs/js-top/engine/patches/microtasks.js.map +1 -0
  33. package/lib/commonjs/js-top/engine/patches/promises.js +65 -0
  34. package/lib/commonjs/js-top/engine/patches/promises.js.map +1 -0
  35. package/lib/commonjs/js-top/engine/patches/timers.js +66 -0
  36. package/lib/commonjs/js-top/engine/patches/timers.js.map +1 -0
  37. package/lib/commonjs/js-top/engine/state.js +63 -0
  38. package/lib/commonjs/js-top/engine/state.js.map +1 -0
  39. package/lib/commonjs/js-top/engine/symbolicate.js +95 -0
  40. package/lib/commonjs/js-top/engine/symbolicate.js.map +1 -0
  41. package/lib/commonjs/js-top/sync/jsTopSyncAdapter.js +74 -0
  42. package/lib/commonjs/js-top/sync/jsTopSyncAdapter.js.map +1 -0
  43. package/lib/commonjs/js-top/types/index.js +46 -0
  44. package/lib/commonjs/js-top/types/index.js.map +1 -0
  45. package/lib/commonjs/js-top/utils/preferences.js +39 -0
  46. package/lib/commonjs/js-top/utils/preferences.js.map +1 -0
  47. package/lib/commonjs/package.json +1 -0
  48. package/lib/commonjs/preset.js +75 -0
  49. package/lib/commonjs/preset.js.map +1 -0
  50. package/lib/module/index.js +47 -0
  51. package/lib/module/index.js.map +1 -0
  52. package/lib/module/js-top/components/BusySparkline.js +52 -0
  53. package/lib/module/js-top/components/BusySparkline.js.map +1 -0
  54. package/lib/module/js-top/components/JsTopHudOverlay.js +75 -0
  55. package/lib/module/js-top/components/JsTopHudOverlay.js.map +1 -0
  56. package/lib/module/js-top/components/JsTopModal.js +343 -0
  57. package/lib/module/js-top/components/JsTopModal.js.map +1 -0
  58. package/lib/module/js-top/components/TaskDetailView.js +325 -0
  59. package/lib/module/js-top/components/TaskDetailView.js.map +1 -0
  60. package/lib/module/js-top/components/TaskTable.js +353 -0
  61. package/lib/module/js-top/components/TaskTable.js.map +1 -0
  62. package/lib/module/js-top/engine/JsTopController.js +347 -0
  63. package/lib/module/js-top/engine/JsTopController.js.map +1 -0
  64. package/lib/module/js-top/engine/aggregator.js +136 -0
  65. package/lib/module/js-top/engine/aggregator.js.map +1 -0
  66. package/lib/module/js-top/engine/busyProbe.js +94 -0
  67. package/lib/module/js-top/engine/busyProbe.js.map +1 -0
  68. package/lib/module/js-top/engine/frameStack.js +126 -0
  69. package/lib/module/js-top/engine/frameStack.js.map +1 -0
  70. package/lib/module/js-top/engine/longtasks.js +133 -0
  71. package/lib/module/js-top/engine/longtasks.js.map +1 -0
  72. package/lib/module/js-top/engine/now.js +33 -0
  73. package/lib/module/js-top/engine/now.js.map +1 -0
  74. package/lib/module/js-top/engine/originRegistry.js +388 -0
  75. package/lib/module/js-top/engine/originRegistry.js.map +1 -0
  76. package/lib/module/js-top/engine/patches/bridge.js +56 -0
  77. package/lib/module/js-top/engine/patches/bridge.js.map +1 -0
  78. package/lib/module/js-top/engine/patches/microtasks.js +23 -0
  79. package/lib/module/js-top/engine/patches/microtasks.js.map +1 -0
  80. package/lib/module/js-top/engine/patches/promises.js +62 -0
  81. package/lib/module/js-top/engine/patches/promises.js.map +1 -0
  82. package/lib/module/js-top/engine/patches/timers.js +62 -0
  83. package/lib/module/js-top/engine/patches/timers.js.map +1 -0
  84. package/lib/module/js-top/engine/state.js +54 -0
  85. package/lib/module/js-top/engine/state.js.map +1 -0
  86. package/lib/module/js-top/engine/symbolicate.js +91 -0
  87. package/lib/module/js-top/engine/symbolicate.js.map +1 -0
  88. package/lib/module/js-top/sync/jsTopSyncAdapter.js +70 -0
  89. package/lib/module/js-top/sync/jsTopSyncAdapter.js.map +1 -0
  90. package/lib/module/js-top/types/index.js +42 -0
  91. package/lib/module/js-top/types/index.js.map +1 -0
  92. package/lib/module/js-top/utils/preferences.js +34 -0
  93. package/lib/module/js-top/utils/preferences.js.map +1 -0
  94. package/lib/module/preset.js +71 -0
  95. package/lib/module/preset.js.map +1 -0
  96. package/lib/typescript/index.d.ts +21 -0
  97. package/lib/typescript/index.d.ts.map +1 -0
  98. package/lib/typescript/js-top/components/BusySparkline.d.ts +8 -0
  99. package/lib/typescript/js-top/components/BusySparkline.d.ts.map +1 -0
  100. package/lib/typescript/js-top/components/JsTopHudOverlay.d.ts +8 -0
  101. package/lib/typescript/js-top/components/JsTopHudOverlay.d.ts.map +1 -0
  102. package/lib/typescript/js-top/components/JsTopModal.d.ts +39 -0
  103. package/lib/typescript/js-top/components/JsTopModal.d.ts.map +1 -0
  104. package/lib/typescript/js-top/components/TaskDetailView.d.ts +15 -0
  105. package/lib/typescript/js-top/components/TaskDetailView.d.ts.map +1 -0
  106. package/lib/typescript/js-top/components/TaskTable.d.ts +38 -0
  107. package/lib/typescript/js-top/components/TaskTable.d.ts.map +1 -0
  108. package/lib/typescript/js-top/engine/JsTopController.d.ts +78 -0
  109. package/lib/typescript/js-top/engine/JsTopController.d.ts.map +1 -0
  110. package/lib/typescript/js-top/engine/__tests__/engine.test.d.ts +9 -0
  111. package/lib/typescript/js-top/engine/__tests__/engine.test.d.ts.map +1 -0
  112. package/lib/typescript/js-top/engine/aggregator.d.ts +33 -0
  113. package/lib/typescript/js-top/engine/aggregator.d.ts.map +1 -0
  114. package/lib/typescript/js-top/engine/busyProbe.d.ts +25 -0
  115. package/lib/typescript/js-top/engine/busyProbe.d.ts.map +1 -0
  116. package/lib/typescript/js-top/engine/frameStack.d.ts +44 -0
  117. package/lib/typescript/js-top/engine/frameStack.d.ts.map +1 -0
  118. package/lib/typescript/js-top/engine/longtasks.d.ts +37 -0
  119. package/lib/typescript/js-top/engine/longtasks.d.ts.map +1 -0
  120. package/lib/typescript/js-top/engine/now.d.ts +9 -0
  121. package/lib/typescript/js-top/engine/now.d.ts.map +1 -0
  122. package/lib/typescript/js-top/engine/originRegistry.d.ts +82 -0
  123. package/lib/typescript/js-top/engine/originRegistry.d.ts.map +1 -0
  124. package/lib/typescript/js-top/engine/patches/bridge.d.ts +17 -0
  125. package/lib/typescript/js-top/engine/patches/bridge.d.ts.map +1 -0
  126. package/lib/typescript/js-top/engine/patches/microtasks.d.ts +6 -0
  127. package/lib/typescript/js-top/engine/patches/microtasks.d.ts.map +1 -0
  128. package/lib/typescript/js-top/engine/patches/promises.d.ts +18 -0
  129. package/lib/typescript/js-top/engine/patches/promises.d.ts.map +1 -0
  130. package/lib/typescript/js-top/engine/patches/timers.d.ts +11 -0
  131. package/lib/typescript/js-top/engine/patches/timers.d.ts.map +1 -0
  132. package/lib/typescript/js-top/engine/state.d.ts +35 -0
  133. package/lib/typescript/js-top/engine/state.d.ts.map +1 -0
  134. package/lib/typescript/js-top/engine/symbolicate.d.ts +16 -0
  135. package/lib/typescript/js-top/engine/symbolicate.d.ts.map +1 -0
  136. package/lib/typescript/js-top/sync/jsTopSyncAdapter.d.ts +43 -0
  137. package/lib/typescript/js-top/sync/jsTopSyncAdapter.d.ts.map +1 -0
  138. package/lib/typescript/js-top/types/index.d.ts +130 -0
  139. package/lib/typescript/js-top/types/index.d.ts.map +1 -0
  140. package/lib/typescript/js-top/utils/preferences.d.ts +13 -0
  141. package/lib/typescript/js-top/utils/preferences.d.ts.map +1 -0
  142. package/lib/typescript/preset.d.ts +49 -0
  143. package/lib/typescript/preset.d.ts.map +1 -0
  144. package/package.json +67 -0
  145. package/src/index.tsx +69 -0
  146. package/src/js-top/components/BusySparkline.tsx +59 -0
  147. package/src/js-top/components/JsTopHudOverlay.tsx +78 -0
  148. package/src/js-top/components/JsTopModal.tsx +421 -0
  149. package/src/js-top/components/TaskDetailView.tsx +349 -0
  150. package/src/js-top/components/TaskTable.tsx +365 -0
  151. package/src/js-top/engine/JsTopController.ts +401 -0
  152. package/src/js-top/engine/__tests__/engine.test.ts +337 -0
  153. package/src/js-top/engine/aggregator.ts +148 -0
  154. package/src/js-top/engine/busyProbe.ts +100 -0
  155. package/src/js-top/engine/frameStack.ts +142 -0
  156. package/src/js-top/engine/longtasks.ts +137 -0
  157. package/src/js-top/engine/now.ts +33 -0
  158. package/src/js-top/engine/originRegistry.ts +495 -0
  159. package/src/js-top/engine/patches/bridge.ts +69 -0
  160. package/src/js-top/engine/patches/microtasks.ts +25 -0
  161. package/src/js-top/engine/patches/promises.ts +57 -0
  162. package/src/js-top/engine/patches/timers.ts +80 -0
  163. package/src/js-top/engine/state.ts +66 -0
  164. package/src/js-top/engine/symbolicate.ts +109 -0
  165. package/src/js-top/sync/jsTopSyncAdapter.ts +72 -0
  166. package/src/js-top/types/index.ts +144 -0
  167. package/src/js-top/utils/preferences.ts +35 -0
  168. package/src/preset.tsx +67 -0
@@ -0,0 +1 @@
1
+ {"version":3,"names":["memo","useState","ScrollView","StyleSheet","Text","TouchableOpacity","View","macOSColors","jsx","_jsx","jsxs","_jsxs","SORT_OPTIONS","key","title","API_BADGE","timeout","text","color","prefix","interval","immediate","raf","microtask","then","bridge","unattributed","other","badgeFor","api","displayName","row","name","label","startsWith","slice","length","replace","trim","fmt","n","Math","round","toFixed","statsLine","calls","avgMs","maxMs","totalMs","TaskRow","rank","onPress","badge","Wrapper","style","rowStyles","activeOpacity","children","topLine","borderColor","backgroundColor","badgeText","numberOfLines","freezes","freezeBadge","worstFreezeMs","freezeBadgeSevere","windowMs","pctOfBusy","semantic","error","warning","unit","pct","pctMuted","subLine","barTrack","barFill","width","min","stats","prev","next","TaskTable","rows","onSelectRow","sortKey","setSortKey","sorted","sort","a","b","styles","root","sortRow","sortLabel","map","o","sortChip","sortChipOn","sortChipText","sortChipTextOn","body","i","empty","create","flex","minHeight","flexDirection","alignItems","gap","paddingHorizontal","paddingVertical","borderBottomWidth","borderBottomColor","border","default","background","card","muted","fontSize","fontWeight","letterSpacing","marginRight","borderWidth","borderRadius","info","fontVariant","textAlign","hairlineWidth","primary","secondary","paddingLeft","height","input","overflow","opacity"],"sourceRoot":"../../../../src","sources":["js-top/components/TaskTable.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,IAAI,EAAEC,QAAQ,QAAQ,OAAO;AACtC,SACEC,UAAU,EACVC,UAAU,EACVC,IAAI,EACJC,gBAAgB,EAChBC,IAAI,QACC,cAAc;AACrB,SAASC,WAAW,QAAQ,oBAAoB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAKjD,MAAMC,YAA+C,GAAG,CACtD;EAAEC,GAAG,EAAE,UAAU;EAAEC,KAAK,EAAE;AAAS,CAAC,EACpC;EAAED,GAAG,EAAE,OAAO;EAAEC,KAAK,EAAE;AAAQ,CAAC,EAChC;EAAED,GAAG,EAAE,OAAO;EAAEC,KAAK,EAAE;AAAM,CAAC,EAC9B;EAAED,GAAG,EAAE,OAAO;EAAEC,KAAK,EAAE;AAAM,CAAC,EAC9B;EAAED,GAAG,EAAE,SAAS;EAAEC,KAAK,EAAE;AAAQ,CAAC,CACnC;AAED,OAAO,MAAMC,SAGZ,GAAG;EACFC,OAAO,EAAE;IAAEC,IAAI,EAAE,SAAS;IAAEC,KAAK,EAAE,SAAS;IAAEC,MAAM,EAAE;EAAa,CAAC;EACpEC,QAAQ,EAAE;IAAEH,IAAI,EAAE,UAAU;IAAEC,KAAK,EAAE,SAAS;IAAEC,MAAM,EAAE;EAAc,CAAC;EACvEE,SAAS,EAAE;IAAEJ,IAAI,EAAE,OAAO;IAAEC,KAAK,EAAE,SAAS;IAAEC,MAAM,EAAE;EAAe,CAAC;EACtEG,GAAG,EAAE;IAAEL,IAAI,EAAE,KAAK;IAAEC,KAAK,EAAE,SAAS;IAAEC,MAAM,EAAE;EAAwB,CAAC;EACvEI,SAAS,EAAE;IAAEN,IAAI,EAAE,OAAO;IAAEC,KAAK,EAAE,SAAS;IAAEC,MAAM,EAAE;EAAiB,CAAC;EACxEK,IAAI,EAAE;IAAEP,IAAI,EAAE,SAAS;IAAEC,KAAK,EAAE,SAAS;IAAEC,MAAM,EAAE;EAAe,CAAC;EACnEM,MAAM,EAAE;IAAER,IAAI,EAAE,QAAQ;IAAEC,KAAK,EAAE,SAAS;IAAEC,MAAM,EAAE;EAAS,CAAC;EAC9DO,YAAY,EAAE;IAAET,IAAI,EAAE,QAAQ;IAAEC,KAAK,EAAE;EAAU,CAAC;EAClDS,KAAK,EAAE;IAAEV,IAAI,EAAE,OAAO;IAAEC,KAAK,EAAE,SAAS;IAAEC,MAAM,EAAE;EAAQ;AAC5D,CAAC;AAED,OAAO,SAASS,QAAQA,CAACC,GAAY,EAAE;EACrC,OAAOd,SAAS,CAACc,GAAG,CAAC,IAAId,SAAS,CAACY,KAAK;AAC1C;;AAEA;AACA,OAAO,SAASG,WAAWA,CAACC,GAAoC,EAAU;EACxE,IAAIA,GAAG,CAACF,GAAG,KAAK,cAAc,EAAE,OAAO,kCAAkC;EACzE,IAAIE,GAAG,CAACF,GAAG,KAAK,OAAO,EAAE,OAAO,sBAAsB;EACtD,MAAMV,MAAM,GAAGS,QAAQ,CAACG,GAAG,CAACF,GAAG,CAAC,CAACV,MAAM;EACvC,IAAIa,IAAI,GAAGD,GAAG,CAACE,KAAK;EACpB,IAAId,MAAM,IAAIa,IAAI,CAACE,UAAU,CAACf,MAAM,CAAC,EAAEa,IAAI,GAAGA,IAAI,CAACG,KAAK,CAAChB,MAAM,CAACiB,MAAM,CAAC;EACvEJ,IAAI,GAAGA,IAAI,CAACK,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAACC,IAAI,CAAC,CAAC;EAC1C,OAAON,IAAI,CAACI,MAAM,GAAG,CAAC,GAAGJ,IAAI,GAAG,WAAW;AAC7C;AAEA,SAASO,GAAGA,CAACC,CAAS,EAAU;EAC9B,IAAIA,CAAC,IAAI,MAAM,EAAE,OAAO,GAAGC,IAAI,CAACC,KAAK,CAACF,CAAC,GAAG,IAAI,CAAC,GAAG;EAClD,IAAIA,CAAC,IAAI,IAAI,EAAE,OAAO,GAAG,CAACA,CAAC,GAAG,IAAI,EAAEG,OAAO,CAAC,CAAC,CAAC,GAAG;EACjD,IAAIH,CAAC,IAAI,GAAG,EAAE,OAAO,GAAGC,IAAI,CAACC,KAAK,CAACF,CAAC,CAAC,EAAE;EACvC,OAAO,GAAGC,IAAI,CAACC,KAAK,CAACF,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE;AACrC;AAEA,SAASI,SAASA,CAACb,GAAa,EAAU;EACxC,IAAIA,GAAG,CAACc,KAAK,IAAI,CAAC,EAAE,OAAO,2CAA2C;EACtE,OAAO,GAAGN,GAAG,CAACR,GAAG,CAACc,KAAK,CAAC,gBAAgBN,GAAG,CAACR,GAAG,CAACe,KAAK,CAAC,UAAUP,GAAG,CAACR,GAAG,CAACgB,KAAK,CAAC,YAAYR,GAAG,CAACR,GAAG,CAACiB,OAAO,CAAC,KAAK;AACjH;AAEA,MAAMC,OAAO,gBAAGjD,IAAI,CAClB,SAASiD,OAAOA,CAAC;EACflB,GAAG;EACHmB,IAAI;EACJC;AAKF,CAAC,EAAE;EACD,MAAMC,KAAK,GAAGxB,QAAQ,CAACG,GAAG,CAACF,GAAG,CAAC;EAC/B,MAAMwB,OAAO,GAAGF,OAAO,GAAG9C,gBAAgB,GAAGC,IAAI;EACjD,oBACEK,KAAA,CAAC0C,OAAO;IACNC,KAAK,EAAEC,SAAS,CAACxB,GAAI;IAAA,IAChBoB,OAAO,GAAG;MAAEA,OAAO,EAAEA,CAAA,KAAMA,OAAO,CAACpB,GAAG,CAAC;MAAEyB,aAAa,EAAE;IAAI,CAAC,GAAG,CAAC,CAAC;IAAAC,QAAA,gBAEvE9C,KAAA,CAACL,IAAI;MAACgD,KAAK,EAAEC,SAAS,CAACG,OAAQ;MAAAD,QAAA,gBAC7BhD,IAAA,CAACL,IAAI;QAACkD,KAAK,EAAEC,SAAS,CAACL,IAAK;QAAAO,QAAA,EAAEP;MAAI,CAAO,CAAC,eAC1CzC,IAAA,CAACH,IAAI;QACHgD,KAAK,EAAE,CACLC,SAAS,CAACH,KAAK,EACf;UAAEO,WAAW,EAAEP,KAAK,CAAClC,KAAK;UAAE0C,eAAe,EAAE,GAAGR,KAAK,CAAClC,KAAK;QAAK,CAAC,CACjE;QAAAuC,QAAA,eAEFhD,IAAA,CAACL,IAAI;UAACkD,KAAK,EAAE,CAACC,SAAS,CAACM,SAAS,EAAE;YAAE3C,KAAK,EAAEkC,KAAK,CAAClC;UAAM,CAAC,CAAE;UAAAuC,QAAA,EACxDL,KAAK,CAACnC;QAAI,CACP;MAAC,CACH,CAAC,eACPR,IAAA,CAACL,IAAI;QAACkD,KAAK,EAAEC,SAAS,CAACvB,IAAK;QAAC8B,aAAa,EAAE,CAAE;QAAAL,QAAA,EAC3C3B,WAAW,CAACC,GAAG;MAAC,CACb,CAAC,EACNA,GAAG,CAACgC,OAAO,GAAG,CAAC,iBACdpD,KAAA,CAACP,IAAI;QACHkD,KAAK,EAAE,CACLC,SAAS,CAACS,WAAW,EACrBjC,GAAG,CAACkC,aAAa,IAAI,GAAG,IAAIV,SAAS,CAACW,iBAAiB,CACvD;QAAAT,QAAA,GACH,aACI,EAAC1B,GAAG,CAACgC,OAAO;MAAA,CACX,CACP,eACDpD,KAAA,CAACP,IAAI;QACHkD,KAAK,EAAE,CACLC,SAAS,CAACY,QAAQ,EAClBpC,GAAG,CAACF,GAAG,KAAK,cAAc,IACxBE,GAAG,CAACqC,SAAS,IAAI,EAAE,IAAI;UACrBlD,KAAK,EACHa,GAAG,CAACqC,SAAS,IAAI,EAAE,GACf7D,WAAW,CAAC8D,QAAQ,CAACC,KAAK,GAC1B/D,WAAW,CAAC8D,QAAQ,CAACE;QAC7B,CAAC,CACH;QAAAd,QAAA,GAEDlB,GAAG,CAACR,GAAG,CAACoC,QAAQ,CAAC,eAClB1D,IAAA,CAACL,IAAI;UAACkD,KAAK,EAAEC,SAAS,CAACiB,IAAK;UAAAf,QAAA,EAAC;QAAG,CAAM,CAAC;MAAA,CACnC,CAAC,eACP9C,KAAA,CAACP,IAAI;QACHkD,KAAK,EAAE,CACLC,SAAS,CAACkB,GAAG,EACb1C,GAAG,CAACF,GAAG,KAAK,cAAc,IAAI0B,SAAS,CAACmB,QAAQ,CAChD;QAAAjB,QAAA,GAEDhB,IAAI,CAACC,KAAK,CAACX,GAAG,CAACqC,SAAS,CAAC,EAAC,GAC7B;MAAA,CAAM,CAAC;IAAA,CACH,CAAC,eACPzD,KAAA,CAACL,IAAI;MAACgD,KAAK,EAAEC,SAAS,CAACoB,OAAQ;MAAAlB,QAAA,gBAC7BhD,IAAA,CAACH,IAAI;QAACgD,KAAK,EAAEC,SAAS,CAACqB,QAAS;QAAAnB,QAAA,eAC9BhD,IAAA,CAACH,IAAI;UACHgD,KAAK,EAAE,CACLC,SAAS,CAACsB,OAAO,EACjB;YACEC,KAAK,EAAE,GAAGrC,IAAI,CAACsC,GAAG,CAAC,GAAG,EAAEhD,GAAG,CAACqC,SAAS,CAAC,GAAG;YACzCR,eAAe,EAAER,KAAK,CAAClC;UACzB,CAAC;QACD,CACH;MAAC,CACE,CAAC,eACPT,IAAA,CAACL,IAAI;QAACkD,KAAK,EAAEC,SAAS,CAACyB,KAAM;QAAClB,aAAa,EAAE,CAAE;QAAAL,QAAA,EAC5Cb,SAAS,CAACb,GAAG;MAAC,CACX,CAAC;IAAA,CACH,CAAC;EAAA,CACA,CAAC;AAEd,CAAC,EACD,CAACkD,IAAI,EAAEC,IAAI,KACTD,IAAI,CAAC/B,IAAI,KAAKgC,IAAI,CAAChC,IAAI,IACvB+B,IAAI,CAAC9B,OAAO,KAAK+B,IAAI,CAAC/B,OAAO,IAC7B8B,IAAI,CAAClD,GAAG,CAAClB,GAAG,KAAKqE,IAAI,CAACnD,GAAG,CAAClB,GAAG,IAC7BoE,IAAI,CAAClD,GAAG,CAACoC,QAAQ,KAAKe,IAAI,CAACnD,GAAG,CAACoC,QAAQ,IACvCc,IAAI,CAAClD,GAAG,CAACc,KAAK,KAAKqC,IAAI,CAACnD,GAAG,CAACc,KAAK,IACjCoC,IAAI,CAAClD,GAAG,CAACgB,KAAK,KAAKmC,IAAI,CAACnD,GAAG,CAACgB,KAAK,IACjCkC,IAAI,CAAClD,GAAG,CAACiB,OAAO,KAAKkC,IAAI,CAACnD,GAAG,CAACiB,OAAO,IACrCiC,IAAI,CAAClD,GAAG,CAACqC,SAAS,KAAKc,IAAI,CAACnD,GAAG,CAACqC,SAAS,IACzCa,IAAI,CAAClD,GAAG,CAACgC,OAAO,KAAKmB,IAAI,CAACnD,GAAG,CAACgC,OAAO,IACrCkB,IAAI,CAAClD,GAAG,CAACkC,aAAa,KAAKiB,IAAI,CAACnD,GAAG,CAACkC,aACxC,CAAC;AAED,OAAO,SAASkB,SAASA,CAAC;EACxBC,IAAI;EACJC;AAKF,CAAC,EAAE;EACD,MAAM,CAACC,OAAO,EAAEC,UAAU,CAAC,GAAGtF,QAAQ,CAAU,UAAU,CAAC;EAE3D,MAAMuF,MAAM,GACVF,OAAO,KAAK,UAAU,GAClBF,IAAI,GACJ,CAAC,GAAGA,IAAI,CAAC,CAACK,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKA,CAAC,CAACL,OAAO,CAAC,GAAGI,CAAC,CAACJ,OAAO,CAAC,CAAC;EAEvD,oBACE3E,KAAA,CAACL,IAAI;IAACgD,KAAK,EAAEsC,MAAM,CAACC,IAAK;IAAApC,QAAA,gBACvB9C,KAAA,CAACL,IAAI;MAACgD,KAAK,EAAEsC,MAAM,CAACE,OAAQ;MAAArC,QAAA,gBAC1BhD,IAAA,CAACL,IAAI;QAACkD,KAAK,EAAEsC,MAAM,CAACG,SAAU;QAAAtC,QAAA,EAAC;MAAI,CAAM,CAAC,EACzC7C,YAAY,CAACoF,GAAG,CAAEC,CAAC,iBAClBxF,IAAA,CAACJ,gBAAgB;QAEf8C,OAAO,EAAEA,CAAA,KAAMoC,UAAU,CAACU,CAAC,CAACpF,GAAG,CAAE;QACjCyC,KAAK,EAAE,CAACsC,MAAM,CAACM,QAAQ,EAAEZ,OAAO,KAAKW,CAAC,CAACpF,GAAG,IAAI+E,MAAM,CAACO,UAAU,CAAE;QAAA1C,QAAA,eAEjEhD,IAAA,CAACL,IAAI;UACHkD,KAAK,EAAE,CACLsC,MAAM,CAACQ,YAAY,EACnBd,OAAO,KAAKW,CAAC,CAACpF,GAAG,IAAI+E,MAAM,CAACS,cAAc,CAC1C;UAAA5C,QAAA,EAEDwC,CAAC,CAACnF;QAAK,CACJ;MAAC,GAXFmF,CAAC,CAACpF,GAYS,CACnB,CAAC;IAAA,CACE,CAAC,eACPF,KAAA,CAACT,UAAU;MAACoD,KAAK,EAAEsC,MAAM,CAACU,IAAK;MAAA7C,QAAA,GAC5B+B,MAAM,CAACQ,GAAG,CAAC,CAACjE,GAAG,EAAEwE,CAAC,kBACjB9F,IAAA,CAACwC,OAAO;QAAelB,GAAG,EAAEA,GAAI;QAACmB,IAAI,EAAEqD,CAAC,GAAG,CAAE;QAACpD,OAAO,EAAEkC;MAAY,GAArDtD,GAAG,CAAClB,GAAmD,CACtE,CAAC,EACD2E,MAAM,CAACpD,MAAM,KAAK,CAAC,iBAClB3B,IAAA,CAACL,IAAI;QAACkD,KAAK,EAAEsC,MAAM,CAACY,KAAM;QAAA/C,QAAA,EAAC;MAE3B,CAAM,CACP;IAAA,CACS,CAAC;EAAA,CACT,CAAC;AAEX;AAEA,MAAMmC,MAAM,GAAGzF,UAAU,CAACsG,MAAM,CAAC;EAC/BZ,IAAI,EAAE;IAAEa,IAAI,EAAE,CAAC;IAAEC,SAAS,EAAE;EAAE,CAAC;EAC/Bb,OAAO,EAAE;IACPc,aAAa,EAAE,KAAK;IACpBC,UAAU,EAAE,QAAQ;IACpBC,GAAG,EAAE,CAAC;IACNC,iBAAiB,EAAE,EAAE;IACrBC,eAAe,EAAE,CAAC;IAClBC,iBAAiB,EAAE,CAAC;IACpBC,iBAAiB,EAAE3G,WAAW,CAAC4G,MAAM,CAACC,OAAO;IAC7CxD,eAAe,EAAErD,WAAW,CAAC8G,UAAU,CAACC;EAC1C,CAAC;EACDvB,SAAS,EAAE;IACT7E,KAAK,EAAEX,WAAW,CAACU,IAAI,CAACsG,KAAK;IAC7BC,QAAQ,EAAE,CAAC;IACXC,UAAU,EAAE,KAAK;IACjBC,aAAa,EAAE,GAAG;IAClBC,WAAW,EAAE;EACf,CAAC;EACDzB,QAAQ,EAAE;IACR0B,WAAW,EAAE,CAAC;IACdjE,WAAW,EAAEpD,WAAW,CAAC4G,MAAM,CAACC,OAAO;IACvCS,YAAY,EAAE,CAAC;IACfd,iBAAiB,EAAE,CAAC;IACpBC,eAAe,EAAE;EACnB,CAAC;EACDb,UAAU,EAAE;IACVxC,WAAW,EAAEpD,WAAW,CAAC8D,QAAQ,CAACyD,IAAI;IACtClE,eAAe,EAAE,GAAGrD,WAAW,CAAC8D,QAAQ,CAACyD,IAAI;EAC/C,CAAC;EACD1B,YAAY,EAAE;IACZlF,KAAK,EAAEX,WAAW,CAACU,IAAI,CAACsG,KAAK;IAC7BC,QAAQ,EAAE,CAAC;IACXC,UAAU,EAAE,KAAK;IACjBM,WAAW,EAAE,CAAC,cAAc;EAC9B,CAAC;EACD1B,cAAc,EAAE;IAAEnF,KAAK,EAAEX,WAAW,CAAC8D,QAAQ,CAACyD;EAAK,CAAC;EACpDxB,IAAI,EAAE;IAAEI,IAAI,EAAE;EAAE,CAAC;EACjBF,KAAK,EAAE;IACLtF,KAAK,EAAEX,WAAW,CAACU,IAAI,CAACsG,KAAK;IAC7BC,QAAQ,EAAE,EAAE;IACZQ,SAAS,EAAE,QAAQ;IACnBhB,eAAe,EAAE;EACnB;AACF,CAAC,CAAC;AAEF,MAAMzD,SAAS,GAAGpD,UAAU,CAACsG,MAAM,CAAC;EAClC1E,GAAG,EAAE;IACHgF,iBAAiB,EAAE,EAAE;IACrBC,eAAe,EAAE,CAAC;IAClBC,iBAAiB,EAAE9G,UAAU,CAAC8H,aAAa;IAC3Cf,iBAAiB,EAAE3G,WAAW,CAAC4G,MAAM,CAACC,OAAO;IAC7CN,GAAG,EAAE;EACP,CAAC;EACDpD,OAAO,EAAE;IACPkD,aAAa,EAAE,KAAK;IACpBC,UAAU,EAAE,QAAQ;IACpBC,GAAG,EAAE;EACP,CAAC;EACD5D,IAAI,EAAE;IACJ4B,KAAK,EAAE,EAAE;IACT5D,KAAK,EAAEX,WAAW,CAACU,IAAI,CAACsG,KAAK;IAC7BC,QAAQ,EAAE,EAAE;IACZO,WAAW,EAAE,CAAC,cAAc;EAC9B,CAAC;EACD3E,KAAK,EAAE;IACLwE,WAAW,EAAE,CAAC;IACdC,YAAY,EAAE,CAAC;IACfd,iBAAiB,EAAE,CAAC;IACpBC,eAAe,EAAE;EACnB,CAAC;EACDnD,SAAS,EAAE;IACT2D,QAAQ,EAAE,CAAC;IACXC,UAAU,EAAE,KAAK;IACjBC,aAAa,EAAE;EACjB,CAAC;EACD1F,IAAI,EAAE;IACJ0E,IAAI,EAAE,CAAC;IACPxF,KAAK,EAAEX,WAAW,CAACU,IAAI,CAACiH,OAAO;IAC/BV,QAAQ,EAAE,EAAE;IACZC,UAAU,EAAE;EACd,CAAC;EACDzD,WAAW,EAAE;IACX9C,KAAK,EAAEX,WAAW,CAAC8D,QAAQ,CAACE,OAAO;IACnCiD,QAAQ,EAAE,EAAE;IACZC,UAAU,EAAE,KAAK;IACjBM,WAAW,EAAE,CAAC,cAAc;EAC9B,CAAC;EACD7D,iBAAiB,EAAE;IACjBhD,KAAK,EAAEX,WAAW,CAAC8D,QAAQ,CAACC;EAC9B,CAAC;EACDH,QAAQ,EAAE;IACRjD,KAAK,EAAEX,WAAW,CAACU,IAAI,CAACiH,OAAO;IAC/BV,QAAQ,EAAE,EAAE;IACZC,UAAU,EAAE,KAAK;IACjBM,WAAW,EAAE,CAAC,cAAc;EAC9B,CAAC;EACDvD,IAAI,EAAE;IACJtD,KAAK,EAAEX,WAAW,CAACU,IAAI,CAACsG,KAAK;IAC7BC,QAAQ,EAAE,EAAE;IACZC,UAAU,EAAE;EACd,CAAC;EACDhD,GAAG,EAAE;IACHK,KAAK,EAAE,EAAE;IACTkD,SAAS,EAAE,OAAO;IAClB9G,KAAK,EAAEX,WAAW,CAACU,IAAI,CAACkH,SAAS;IACjCX,QAAQ,EAAE,EAAE;IACZC,UAAU,EAAE,KAAK;IACjBM,WAAW,EAAE,CAAC,cAAc;EAC9B,CAAC;EACDrD,QAAQ,EAAE;IACRxD,KAAK,EAAEX,WAAW,CAACU,IAAI,CAACsG;EAC1B,CAAC;EACD5C,OAAO,EAAE;IACPiC,aAAa,EAAE,KAAK;IACpBC,UAAU,EAAE,QAAQ;IACpBC,GAAG,EAAE,CAAC;IACNsB,WAAW,EAAE;EACf,CAAC;EACDxD,QAAQ,EAAE;IACRE,KAAK,EAAE,EAAE;IACTuD,MAAM,EAAE,CAAC;IACTR,YAAY,EAAE,CAAC;IACfjE,eAAe,EAAErD,WAAW,CAAC8G,UAAU,CAACiB,KAAK;IAC7CC,QAAQ,EAAE;EACZ,CAAC;EACD1D,OAAO,EAAE;IACPwD,MAAM,EAAE,CAAC;IACTR,YAAY,EAAE,CAAC;IACfW,OAAO,EAAE;EACX,CAAC;EACDxD,KAAK,EAAE;IACL0B,IAAI,EAAE,CAAC;IACPxF,KAAK,EAAEX,WAAW,CAACU,IAAI,CAACsG,KAAK;IAC7BC,QAAQ,EAAE,EAAE;IACZO,WAAW,EAAE,CAAC,cAAc;EAC9B;AACF,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,347 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * JsTopController — singleton orchestrating the task-accounting engine.
5
+ *
6
+ * Lifecycle mirrors PerfMonitorController: the engine runs only while
7
+ * someone is looking (snapshot subscribers — the HUD/modal — or a desktop
8
+ * dashboard's silent remote sampling). Patches install once on first start
9
+ * and stay installed; stopping just clears the `active` gate and the probe,
10
+ * so a closed tool costs one boolean per schedule and nothing else.
11
+ */
12
+
13
+ import { AppState } from "react-native";
14
+ import { BUCKET_MS, WINDOW_BUCKETS, SNAPSHOT_ROWS } from "../types";
15
+ import { now } from "./now";
16
+ import { setActive, isActive } from "./state";
17
+ import { installTimerPatches } from "./patches/timers";
18
+ import { installMicrotaskPatches } from "./patches/microtasks";
19
+ import { busyHistory, resetAggregator, windowAttributedMs, windowBusyMs, windowResidualBuckets } from "./aggregator";
20
+ import { buildRows, getOriginDetailBase, resetOrigins } from "./originRegistry";
21
+ import { startBusyProbe, stopBusyProbe, suppressNextGap } from "./busyProbe";
22
+ import { getOriginals } from "./state";
23
+ import { loadJsTopPrefs, saveJsTopPrefs } from "../utils/preferences";
24
+ const NOTIFY_INTERVAL_MS = BUCKET_MS;
25
+ class JsTopControllerImpl {
26
+ enabled = false;
27
+ enabledLoaded = false;
28
+ paused = false;
29
+ remoteSampling = false;
30
+ engineRunning = false;
31
+ tiers = {
32
+ timers: false,
33
+ promises: false,
34
+ bridge: false,
35
+ longtask: false
36
+ };
37
+ notifyHandle = null;
38
+ appStateSub = null;
39
+ snapshot = this.buildSnapshot();
40
+ subscribers = new Set();
41
+ enabledSubscribers = new Set();
42
+ /** Phase-2 seam: extra tier installers (promises/bridge/longtasks) register
43
+ * here so the controller stays ignorant of their internals. */
44
+ tierInstallers = [];
45
+ longtaskProvider = null;
46
+ freezeStatsProvider = null;
47
+ clearHooks = [];
48
+ constructor() {
49
+ void loadJsTopPrefs().then(prefs => {
50
+ this.enabledLoaded = true;
51
+ if (prefs.enabled && !this.enabled) this.setEnabled(true);
52
+ });
53
+ }
54
+
55
+ // ── observation lifecycle ────────────────────────────────────────────────
56
+
57
+ subscribe(fn) {
58
+ this.subscribers.add(fn);
59
+ this.syncEngineState();
60
+ fn(this.snapshot);
61
+ return () => {
62
+ this.subscribers.delete(fn);
63
+ this.syncEngineState();
64
+ };
65
+ }
66
+ subscribeEnabled(fn) {
67
+ this.enabledSubscribers.add(fn);
68
+ fn(this.enabled);
69
+ return () => {
70
+ this.enabledSubscribers.delete(fn);
71
+ };
72
+ }
73
+
74
+ /** HUD visibility toggle (persisted). Not required for the engine to run —
75
+ * the modal or a desktop watcher subscribing is what starts sampling. */
76
+ setEnabled(on) {
77
+ if (this.enabled === on) return;
78
+ this.enabled = on;
79
+ if (this.enabledLoaded) void saveJsTopPrefs({
80
+ enabled: on
81
+ });
82
+ this.enabledSubscribers.forEach(fn => {
83
+ try {
84
+ fn(on);
85
+ } catch (err) {
86
+ if (__DEV__) {
87
+ // eslint-disable-next-line no-console
88
+ console.error("[js-top] enabled subscriber threw", err);
89
+ }
90
+ }
91
+ });
92
+ this.syncEngineState();
93
+ }
94
+ isEnabled() {
95
+ return this.enabled;
96
+ }
97
+
98
+ /** Silent sampling for a desktop viewer — engine runs, device HUD stays
99
+ * hidden (same contract as perf-monitor's setRemoteSampling). */
100
+ setRemoteSampling(on) {
101
+ if (this.remoteSampling === on) return;
102
+ this.remoteSampling = on;
103
+ this.syncEngineState();
104
+ }
105
+ isRemoteSampling() {
106
+ return this.remoteSampling;
107
+ }
108
+ getStatus() {
109
+ if (!this.engineRunning) return "disabled";
110
+ return this.paused ? "paused" : "running";
111
+ }
112
+
113
+ // ── controls ─────────────────────────────────────────────────────────────
114
+
115
+ pause() {
116
+ if (this.paused) return;
117
+ this.paused = true;
118
+ setActive(false);
119
+ stopBusyProbe();
120
+ this.emitSnapshot();
121
+ }
122
+ resume() {
123
+ if (!this.paused) return;
124
+ this.paused = false;
125
+ if (this.engineRunning) {
126
+ setActive(true);
127
+ startBusyProbe();
128
+ }
129
+ this.emitSnapshot();
130
+ }
131
+ clear() {
132
+ resetOrigins();
133
+ resetAggregator();
134
+ for (const hook of this.clearHooks) {
135
+ try {
136
+ hook();
137
+ } catch {
138
+ // ignore
139
+ }
140
+ }
141
+ this.emitSnapshot();
142
+ }
143
+ registerClearHook(fn) {
144
+ this.clearHooks.push(fn);
145
+ }
146
+ getSnapshot() {
147
+ return this.snapshot;
148
+ }
149
+
150
+ /**
151
+ * Full detail for one origin (tap-through view). Returns null when the
152
+ * origin was evicted or never existed. The pinned "unattributed" row gets
153
+ * a synthetic detail built from the probe residuals.
154
+ */
155
+ getOriginDetail(key) {
156
+ const t = now();
157
+ const busy = windowBusyMs(t);
158
+ const freezeStats = this.freezeStatsProvider?.(Date.now());
159
+ const freezes = freezeStats?.byOrigin[key];
160
+ if (key === "unattributed") {
161
+ const buckets = windowResidualBuckets(t);
162
+ const windowMs = Math.round(buckets.reduce((sum, ms) => sum + ms, 0) * 10) / 10;
163
+ return {
164
+ key,
165
+ label: "unattributed (events / React / native call-ins)",
166
+ api: "unattributed",
167
+ promoted: false,
168
+ scheduleCount: 0,
169
+ calls: 0,
170
+ totalMs: 0,
171
+ avgMs: 0,
172
+ maxMs: 0,
173
+ windowMs,
174
+ pctOfBusy: busy > 0 ? Math.min(100, Math.round(windowMs / busy * 1000) / 10) : 0,
175
+ lastSeenAgoMs: 0,
176
+ buckets,
177
+ freezes: freezes?.count ?? 0,
178
+ worstFreezeMs: Math.round(freezes?.maxMs ?? 0)
179
+ };
180
+ }
181
+ const base = getOriginDetailBase(key, t, busy);
182
+ if (!base) return null;
183
+ return {
184
+ ...base,
185
+ freezes: freezes?.count ?? 0,
186
+ worstFreezeMs: Math.round(freezes?.maxMs ?? 0)
187
+ };
188
+ }
189
+
190
+ /** Phase-2 registration seam for additional patch tiers. */
191
+ registerTierInstaller(install) {
192
+ this.tierInstallers.push(install);
193
+ if (this.engineRunning) {
194
+ Object.assign(this.tiers, this.runInstaller(install));
195
+ }
196
+ }
197
+ registerLongtaskProvider(fn) {
198
+ this.longtaskProvider = fn;
199
+ }
200
+ registerFreezeStatsProvider(fn) {
201
+ this.freezeStatsProvider = fn;
202
+ }
203
+
204
+ // ── engine ───────────────────────────────────────────────────────────────
205
+
206
+ shouldRun() {
207
+ return this.subscribers.size > 0 || this.remoteSampling;
208
+ }
209
+ syncEngineState() {
210
+ const want = this.shouldRun();
211
+ if (want && !this.engineRunning) this.startEngine();else if (!want && this.engineRunning) this.stopEngine();
212
+ }
213
+ runInstaller(install) {
214
+ try {
215
+ return install();
216
+ } catch (err) {
217
+ if (__DEV__) {
218
+ // eslint-disable-next-line no-console
219
+ console.error("[js-top] tier installer threw", err);
220
+ }
221
+ return {};
222
+ }
223
+ }
224
+ startEngine() {
225
+ this.engineRunning = true;
226
+ installTimerPatches();
227
+ installMicrotaskPatches();
228
+ this.tiers = {
229
+ timers: true,
230
+ promises: false,
231
+ bridge: false,
232
+ longtask: false
233
+ };
234
+ for (const install of this.tierInstallers) {
235
+ Object.assign(this.tiers, this.runInstaller(install));
236
+ }
237
+ setActive(!this.paused);
238
+ if (!this.paused) startBusyProbe();
239
+ try {
240
+ this.appStateSub = AppState.addEventListener("change", () => {
241
+ suppressNextGap();
242
+ });
243
+ } catch {
244
+ this.appStateSub = null;
245
+ }
246
+ // The notify tick uses the pre-patch setInterval: the engine must never
247
+ // list its own heartbeat as a task.
248
+ this.notifyHandle = getOriginals().setInterval(() => this.emitSnapshot(), NOTIFY_INTERVAL_MS);
249
+ this.emitSnapshot();
250
+ }
251
+ stopEngine() {
252
+ this.engineRunning = false;
253
+ setActive(false);
254
+ stopBusyProbe();
255
+ if (this.notifyHandle != null) {
256
+ getOriginals().clearInterval(this.notifyHandle);
257
+ this.notifyHandle = null;
258
+ }
259
+ if (this.appStateSub) {
260
+ try {
261
+ this.appStateSub.remove();
262
+ } catch {
263
+ // ignore
264
+ }
265
+ this.appStateSub = null;
266
+ }
267
+ }
268
+ buildSnapshot() {
269
+ const t = now();
270
+ const busy = windowBusyMs(t);
271
+ const attributed = windowAttributedMs(t);
272
+ const unattributed = Math.max(0, busy - attributed);
273
+ const rows = buildRows(t, busy, SNAPSHOT_ROWS);
274
+ if (unattributed >= 1) {
275
+ rows.push({
276
+ key: "unattributed",
277
+ label: "unattributed (events / React / native call-ins)",
278
+ api: "unattributed",
279
+ windowMs: Math.round(unattributed * 10) / 10,
280
+ pctOfBusy: busy > 0 ? Math.min(100, Math.round(unattributed / busy * 1000) / 10) : 0,
281
+ totalMs: 0,
282
+ calls: 0,
283
+ avgMs: 0,
284
+ maxMs: 0,
285
+ lastSeenAgoMs: 0,
286
+ freezes: 0,
287
+ worstFreezeMs: 0
288
+ });
289
+ rows.sort((a, b) => b.windowMs - a.windowMs || b.totalMs - a.totalMs);
290
+ }
291
+ // Decorate rows with freeze badges (unattributed freezes land on the
292
+ // pinned "unattributed" row, whose key matches SYSTEM_FREEZE_KEY).
293
+ const freezeStats = this.freezeStatsProvider?.(Date.now()) ?? {
294
+ count: 0,
295
+ worstMs: 0,
296
+ byOrigin: {}
297
+ };
298
+ for (const row of rows) {
299
+ const s = freezeStats.byOrigin[row.key];
300
+ if (s) {
301
+ row.freezes = s.count;
302
+ row.worstFreezeMs = Math.round(s.maxMs);
303
+ }
304
+ }
305
+ const windowSpanMs = WINDOW_BUCKETS * BUCKET_MS;
306
+ return {
307
+ ts: Date.now(),
308
+ paused: this.paused,
309
+ busyPct: Math.min(100, Math.round(busy / windowSpanMs * 1000) / 10),
310
+ busyHistory: busyHistory(t),
311
+ tiers: {
312
+ ...this.tiers
313
+ },
314
+ rows,
315
+ totals: {
316
+ attributedWindowMs: Math.round(attributed * 10) / 10,
317
+ unattributedWindowMs: Math.round(unattributed * 10) / 10,
318
+ windowMs: windowSpanMs
319
+ },
320
+ freezeSummary: {
321
+ count: freezeStats.count,
322
+ worstMs: Math.round(freezeStats.worstMs)
323
+ },
324
+ longtasks: this.longtaskProvider ? this.longtaskProvider() : []
325
+ };
326
+ }
327
+ emitSnapshot() {
328
+ this.snapshot = this.buildSnapshot();
329
+ this.subscribers.forEach(fn => {
330
+ try {
331
+ fn(this.snapshot);
332
+ } catch (err) {
333
+ if (__DEV__) {
334
+ // eslint-disable-next-line no-console
335
+ console.error("[js-top] snapshot subscriber threw", err);
336
+ }
337
+ }
338
+ });
339
+ }
340
+
341
+ /** Engine active state, for diagnostics/tests. */
342
+ isEngineActive() {
343
+ return isActive();
344
+ }
345
+ }
346
+ export const JsTopController = new JsTopControllerImpl();
347
+ //# sourceMappingURL=JsTopController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["AppState","BUCKET_MS","WINDOW_BUCKETS","SNAPSHOT_ROWS","now","setActive","isActive","installTimerPatches","installMicrotaskPatches","busyHistory","resetAggregator","windowAttributedMs","windowBusyMs","windowResidualBuckets","buildRows","getOriginDetailBase","resetOrigins","startBusyProbe","stopBusyProbe","suppressNextGap","getOriginals","loadJsTopPrefs","saveJsTopPrefs","NOTIFY_INTERVAL_MS","JsTopControllerImpl","enabled","enabledLoaded","paused","remoteSampling","engineRunning","tiers","timers","promises","bridge","longtask","notifyHandle","appStateSub","snapshot","buildSnapshot","subscribers","Set","enabledSubscribers","tierInstallers","longtaskProvider","freezeStatsProvider","clearHooks","constructor","then","prefs","setEnabled","subscribe","fn","add","syncEngineState","delete","subscribeEnabled","on","forEach","err","__DEV__","console","error","isEnabled","setRemoteSampling","isRemoteSampling","getStatus","pause","emitSnapshot","resume","clear","hook","registerClearHook","push","getSnapshot","getOriginDetail","key","t","busy","freezeStats","Date","freezes","byOrigin","buckets","windowMs","Math","round","reduce","sum","ms","label","api","promoted","scheduleCount","calls","totalMs","avgMs","maxMs","pctOfBusy","min","lastSeenAgoMs","count","worstFreezeMs","base","registerTierInstaller","install","Object","assign","runInstaller","registerLongtaskProvider","registerFreezeStatsProvider","shouldRun","size","want","startEngine","stopEngine","addEventListener","setInterval","clearInterval","remove","attributed","unattributed","max","rows","sort","a","b","worstMs","row","s","windowSpanMs","ts","busyPct","totals","attributedWindowMs","unattributedWindowMs","freezeSummary","longtasks","isEngineActive","JsTopController"],"sourceRoot":"../../../../src","sources":["js-top/engine/JsTopController.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Global per-bucket accounting: the engine's clock is divided into 250ms
5
+ * buckets (epochs). Each bucket tracks measured busy ms (from the probe) and
6
+ * attributed ms (from wrapped tasks); `unattributed = busy − attributed` per
7
+ * bucket is what keeps the table honest when work enters the thread through
8
+ * a path we can't wrap (bridgeless events, React commits, async/await).
9
+ *
10
+ * Rings are epoch-stamped parallel arrays: a slot is only valid when its
11
+ * stamp matches the epoch being read, so stale slots cost nothing to skip
12
+ * and nothing to zero eagerly.
13
+ */
14
+
15
+ import { BUCKET_MS, HISTORY_BUCKETS, WINDOW_BUCKETS } from "../types";
16
+ const busyMs = new Float64Array(HISTORY_BUCKETS);
17
+ const attributedMs = new Float64Array(HISTORY_BUCKETS);
18
+ const longtaskMs = new Float64Array(HISTORY_BUCKETS);
19
+ const stamps = new Float64Array(HISTORY_BUCKETS).fill(-1);
20
+ export function epochOf(t) {
21
+ return Math.floor(t / BUCKET_MS);
22
+ }
23
+ function slotFor(epoch) {
24
+ const i = epoch % HISTORY_BUCKETS;
25
+ if (stamps[i] !== epoch) {
26
+ stamps[i] = epoch;
27
+ busyMs[i] = 0;
28
+ attributedMs[i] = 0;
29
+ longtaskMs[i] = 0;
30
+ }
31
+ return i;
32
+ }
33
+
34
+ /**
35
+ * Distribute a wall-clock span across the buckets it overlaps. Spans older
36
+ * than the history ring are clamped — a pathological hours-long gap books at
37
+ * most one ring's worth of buckets.
38
+ */
39
+ function distribute(start, end, add) {
40
+ if (!(end > start)) return;
41
+ const clampedStart = Math.max(start, end - HISTORY_BUCKETS * BUCKET_MS);
42
+ let e = epochOf(clampedStart);
43
+ const lastEpoch = epochOf(end);
44
+ let cursor = clampedStart;
45
+ while (e <= lastEpoch) {
46
+ const bucketEnd = (e + 1) * BUCKET_MS;
47
+ const sliceEnd = Math.min(end, bucketEnd);
48
+ const ms = sliceEnd - cursor;
49
+ if (ms > 0) add(slotFor(e), ms);
50
+ cursor = sliceEnd;
51
+ e++;
52
+ }
53
+ }
54
+
55
+ /** Book probe-measured busy time over [start, end], capped per bucket. */
56
+ export function bookBusyRange(start, end) {
57
+ distribute(start, end, (i, ms) => {
58
+ busyMs[i] = Math.min(BUCKET_MS, busyMs[i] + ms);
59
+ });
60
+ }
61
+
62
+ /**
63
+ * Book a task's exclusive ms, spread proportionally over its wall span.
64
+ * (Exclusive time isn't contiguous when children interleave; proportional
65
+ * spread is exact at 250ms-bucket granularity for all practical tasks.)
66
+ */
67
+ export function bookAttributedRange(start, end, exclusiveMs) {
68
+ const span = end - start;
69
+ if (!(span > 0) || !(exclusiveMs > 0)) return;
70
+ const ratio = Math.min(1, exclusiveMs / span);
71
+ distribute(start, end, (i, ms) => {
72
+ attributedMs[i] = Math.min(BUCKET_MS, attributedMs[i] + ms * ratio);
73
+ });
74
+ }
75
+
76
+ /** Book a reported longtask span (for history display only). */
77
+ export function bookLongtaskRange(start, end) {
78
+ distribute(start, end, (i, ms) => {
79
+ longtaskMs[i] = Math.min(BUCKET_MS, longtaskMs[i] + ms);
80
+ });
81
+ }
82
+ function sumWindow(arr, nowT, buckets) {
83
+ const current = epochOf(nowT);
84
+ let sum = 0;
85
+ for (let e = current - buckets + 1; e <= current; e++) {
86
+ const i = e % HISTORY_BUCKETS;
87
+ if (i >= 0 && stamps[i] === e) sum += arr[i];
88
+ }
89
+ return sum;
90
+ }
91
+ export function windowBusyMs(nowT) {
92
+ return sumWindow(busyMs, nowT, WINDOW_BUCKETS);
93
+ }
94
+ export function windowAttributedMs(nowT) {
95
+ return sumWindow(attributedMs, nowT, WINDOW_BUCKETS);
96
+ }
97
+
98
+ /**
99
+ * Per-bucket UNATTRIBUTED ms (busy − attributed), oldest→newest over the
100
+ * rolling window — the "system" row's activity trend for the detail view.
101
+ */
102
+ export function windowResidualBuckets(nowT) {
103
+ const current = epochOf(nowT);
104
+ const out = [];
105
+ for (let e = current - WINDOW_BUCKETS + 1; e <= current; e++) {
106
+ const i = e % HISTORY_BUCKETS;
107
+ if (i >= 0 && stamps[i] === e) {
108
+ out.push(Math.max(0, Math.round((busyMs[i] - attributedMs[i]) * 10) / 10));
109
+ } else {
110
+ out.push(0);
111
+ }
112
+ }
113
+ return out;
114
+ }
115
+
116
+ /** Per-bucket busy%, oldest→newest, over the full 30s history ring. */
117
+ export function busyHistory(nowT) {
118
+ const current = epochOf(nowT);
119
+ const out = [];
120
+ for (let e = current - HISTORY_BUCKETS + 1; e <= current; e++) {
121
+ const i = e % HISTORY_BUCKETS;
122
+ if (i >= 0 && stamps[i] === e) {
123
+ out.push(Math.round(busyMs[i] / BUCKET_MS * 100));
124
+ } else {
125
+ out.push(0);
126
+ }
127
+ }
128
+ // Trim the leading dead zone from before the engine started.
129
+ let firstLive = 0;
130
+ while (firstLive < out.length && out[firstLive] === 0) firstLive++;
131
+ return out.slice(Math.max(0, Math.min(firstLive, out.length - 1)));
132
+ }
133
+ export function resetAggregator() {
134
+ stamps.fill(-1);
135
+ }
136
+ //# sourceMappingURL=aggregator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["BUCKET_MS","HISTORY_BUCKETS","WINDOW_BUCKETS","busyMs","Float64Array","attributedMs","longtaskMs","stamps","fill","epochOf","t","Math","floor","slotFor","epoch","i","distribute","start","end","add","clampedStart","max","e","lastEpoch","cursor","bucketEnd","sliceEnd","min","ms","bookBusyRange","bookAttributedRange","exclusiveMs","span","ratio","bookLongtaskRange","sumWindow","arr","nowT","buckets","current","sum","windowBusyMs","windowAttributedMs","windowResidualBuckets","out","push","round","busyHistory","firstLive","length","slice","resetAggregator"],"sourceRoot":"../../../../src","sources":["js-top/engine/aggregator.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Busy probe — measures true JS-thread occupancy from timer-gap inflation.
5
+ *
6
+ * A 16ms heartbeat (created with the PRE-PATCH setInterval so the probe never
7
+ * appears in its own table) can only fire when the thread yields; any gap
8
+ * beyond the calibrated idle baseline is time the thread was busy. This is
9
+ * the same physical signal as perf-monitor's stall-aware sampler, at higher
10
+ * frequency: multi-second stalls simply arrive as one huge gap and are booked
11
+ * as fully-busy buckets by bookBusyRange (the backfill falls out of the
12
+ * range-distribution math; no separate synthetic-sample pass needed).
13
+ *
14
+ * Calibration: the nominal 16ms is never what a real device delivers at
15
+ * idle. We track a rolling min gap (3 one-second slots) and subtract THAT,
16
+ * otherwise idle devices read 10–20% phantom busy.
17
+ *
18
+ * AppState transitions also pause JS timers, so the controller flags them
19
+ * via suppressNextGap() — same trick as PerfMonitorController; AppState
20
+ * events arrive on the JS thread, so a genuine stall can never set the flag.
21
+ */
22
+
23
+ import { now } from "./now";
24
+ import { getOriginals } from "./state";
25
+ import { bookBusyRange } from "./aggregator";
26
+ const PROBE_INTERVAL_MS = 16;
27
+ /** Ignore gaps below this when calibrating (a busy tick isn't a baseline). */
28
+ const CALIBRATION_MAX_GAP_MS = 100;
29
+ const BASELINE_SLOTS = 3;
30
+ const MIN_BASELINE_MS = 8;
31
+ let handle = null;
32
+ let lastAt = 0;
33
+ let suppressNext = false;
34
+ let slotMins = [];
35
+ let currentSlotMin = Infinity;
36
+ let currentSlotStart = 0;
37
+ let baseline = PROBE_INTERVAL_MS;
38
+ function buoyJsTopProbeTick() {
39
+ const t = now();
40
+ const gap = lastAt > 0 ? t - lastAt : 0;
41
+ lastAt = t;
42
+ if (suppressNext) {
43
+ // Backgrounding/foregrounding paused timers — not a stall. Reset
44
+ // calibration too: refresh-rate or thermal state may have changed.
45
+ suppressNext = false;
46
+ currentSlotMin = Infinity;
47
+ currentSlotStart = t;
48
+ return;
49
+ }
50
+ if (gap <= 0) return;
51
+ if (gap < CALIBRATION_MAX_GAP_MS) {
52
+ if (gap < currentSlotMin) currentSlotMin = gap;
53
+ if (currentSlotStart === 0) currentSlotStart = t;
54
+ if (t - currentSlotStart >= 1000) {
55
+ slotMins.push(currentSlotMin);
56
+ if (slotMins.length > BASELINE_SLOTS) slotMins.shift();
57
+ baseline = Math.max(MIN_BASELINE_MS, Math.min(...slotMins));
58
+ currentSlotMin = Infinity;
59
+ currentSlotStart = t;
60
+ }
61
+ }
62
+ const busyExcess = gap - baseline;
63
+ if (busyExcess > 1) {
64
+ // The block ended when this tick finally fired — position it at the tail.
65
+ bookBusyRange(t - busyExcess, t);
66
+ }
67
+ }
68
+ export function startBusyProbe() {
69
+ if (handle != null) return;
70
+ const originals = getOriginals();
71
+ lastAt = now();
72
+ suppressNext = false;
73
+ slotMins = [];
74
+ currentSlotMin = Infinity;
75
+ currentSlotStart = 0;
76
+ baseline = PROBE_INTERVAL_MS;
77
+ handle = originals.setInterval(buoyJsTopProbeTick, PROBE_INTERVAL_MS);
78
+ }
79
+ export function stopBusyProbe() {
80
+ if (handle != null) {
81
+ getOriginals().clearInterval(handle);
82
+ handle = null;
83
+ }
84
+ lastAt = 0;
85
+ }
86
+ export function suppressNextGap() {
87
+ suppressNext = true;
88
+ }
89
+
90
+ /** Test-only. */
91
+ export function debugBaseline() {
92
+ return baseline;
93
+ }
94
+ //# sourceMappingURL=busyProbe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["now","getOriginals","bookBusyRange","PROBE_INTERVAL_MS","CALIBRATION_MAX_GAP_MS","BASELINE_SLOTS","MIN_BASELINE_MS","handle","lastAt","suppressNext","slotMins","currentSlotMin","Infinity","currentSlotStart","baseline","buoyJsTopProbeTick","t","gap","push","length","shift","Math","max","min","busyExcess","startBusyProbe","originals","setInterval","stopBusyProbe","clearInterval","suppressNextGap","debugBaseline"],"sourceRoot":"../../../../src","sources":["js-top/engine/busyProbe.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,GAAG,QAAQ,OAAO;AAC3B,SAASC,YAAY,QAAQ,SAAS;AACtC,SAASC,aAAa,QAAQ,cAAc;AAE5C,MAAMC,iBAAiB,GAAG,EAAE;AAC5B;AACA,MAAMC,sBAAsB,GAAG,GAAG;AAClC,MAAMC,cAAc,GAAG,CAAC;AACxB,MAAMC,eAAe,GAAG,CAAC;AAEzB,IAAIC,MAA6C,GAAG,IAAI;AACxD,IAAIC,MAAM,GAAG,CAAC;AACd,IAAIC,YAAY,GAAG,KAAK;AAExB,IAAIC,QAAkB,GAAG,EAAE;AAC3B,IAAIC,cAAc,GAAGC,QAAQ;AAC7B,IAAIC,gBAAgB,GAAG,CAAC;AACxB,IAAIC,QAAQ,GAAGX,iBAAiB;AAEhC,SAASY,kBAAkBA,CAAA,EAAS;EAClC,MAAMC,CAAC,GAAGhB,GAAG,CAAC,CAAC;EACf,MAAMiB,GAAG,GAAGT,MAAM,GAAG,CAAC,GAAGQ,CAAC,GAAGR,MAAM,GAAG,CAAC;EACvCA,MAAM,GAAGQ,CAAC;EACV,IAAIP,YAAY,EAAE;IAChB;IACA;IACAA,YAAY,GAAG,KAAK;IACpBE,cAAc,GAAGC,QAAQ;IACzBC,gBAAgB,GAAGG,CAAC;IACpB;EACF;EACA,IAAIC,GAAG,IAAI,CAAC,EAAE;EAEd,IAAIA,GAAG,GAAGb,sBAAsB,EAAE;IAChC,IAAIa,GAAG,GAAGN,cAAc,EAAEA,cAAc,GAAGM,GAAG;IAC9C,IAAIJ,gBAAgB,KAAK,CAAC,EAAEA,gBAAgB,GAAGG,CAAC;IAChD,IAAIA,CAAC,GAAGH,gBAAgB,IAAI,IAAI,EAAE;MAChCH,QAAQ,CAACQ,IAAI,CAACP,cAAc,CAAC;MAC7B,IAAID,QAAQ,CAACS,MAAM,GAAGd,cAAc,EAAEK,QAAQ,CAACU,KAAK,CAAC,CAAC;MACtDN,QAAQ,GAAGO,IAAI,CAACC,GAAG,CAAChB,eAAe,EAAEe,IAAI,CAACE,GAAG,CAAC,GAAGb,QAAQ,CAAC,CAAC;MAC3DC,cAAc,GAAGC,QAAQ;MACzBC,gBAAgB,GAAGG,CAAC;IACtB;EACF;EAEA,MAAMQ,UAAU,GAAGP,GAAG,GAAGH,QAAQ;EACjC,IAAIU,UAAU,GAAG,CAAC,EAAE;IAClB;IACAtB,aAAa,CAACc,CAAC,GAAGQ,UAAU,EAAER,CAAC,CAAC;EAClC;AACF;AAEA,OAAO,SAASS,cAAcA,CAAA,EAAS;EACrC,IAAIlB,MAAM,IAAI,IAAI,EAAE;EACpB,MAAMmB,SAAS,GAAGzB,YAAY,CAAC,CAAC;EAChCO,MAAM,GAAGR,GAAG,CAAC,CAAC;EACdS,YAAY,GAAG,KAAK;EACpBC,QAAQ,GAAG,EAAE;EACbC,cAAc,GAAGC,QAAQ;EACzBC,gBAAgB,GAAG,CAAC;EACpBC,QAAQ,GAAGX,iBAAiB;EAC5BI,MAAM,GAAGmB,SAAS,CAACC,WAAW,CAACZ,kBAAkB,EAAEZ,iBAAiB,CAAC;AACvE;AAEA,OAAO,SAASyB,aAAaA,CAAA,EAAS;EACpC,IAAIrB,MAAM,IAAI,IAAI,EAAE;IAClBN,YAAY,CAAC,CAAC,CAAC4B,aAAa,CAACtB,MAAM,CAAC;IACpCA,MAAM,GAAG,IAAI;EACf;EACAC,MAAM,GAAG,CAAC;AACZ;AAEA,OAAO,SAASsB,eAAeA,CAAA,EAAS;EACtCrB,YAAY,GAAG,IAAI;AACrB;;AAEA;AACA,OAAO,SAASsB,aAAaA,CAAA,EAAW;EACtC,OAAOjB,QAAQ;AACjB","ignoreList":[]}