@workflow/web-shared 4.1.0-beta.47 → 4.1.0-beta.49

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 (301) hide show
  1. package/README.md +26 -52
  2. package/dist/components/error-boundary.d.ts.map +1 -0
  3. package/dist/{error-boundary.js → components/error-boundary.js} +1 -1
  4. package/dist/components/error-boundary.js.map +1 -0
  5. package/dist/{event-list-view.d.ts → components/event-list-view.d.ts} +2 -3
  6. package/dist/components/event-list-view.d.ts.map +1 -0
  7. package/dist/{event-list-view.js → components/event-list-view.js} +9 -17
  8. package/dist/components/event-list-view.js.map +1 -0
  9. package/dist/{hook-actions.d.ts → components/hook-actions.d.ts} +2 -3
  10. package/dist/components/hook-actions.d.ts.map +1 -0
  11. package/dist/{hook-actions.js → components/hook-actions.js} +3 -4
  12. package/dist/components/hook-actions.js.map +1 -0
  13. package/dist/components/index.d.ts +10 -0
  14. package/dist/components/index.d.ts.map +1 -0
  15. package/dist/components/index.js +8 -0
  16. package/dist/components/index.js.map +1 -0
  17. package/dist/components/run-trace-view.d.ts +22 -0
  18. package/dist/components/run-trace-view.d.ts.map +1 -0
  19. package/dist/components/run-trace-view.js +11 -0
  20. package/dist/components/run-trace-view.js.map +1 -0
  21. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -0
  22. package/dist/{sidebar → components/sidebar}/attribute-panel.js +3 -3
  23. package/dist/components/sidebar/attribute-panel.js.map +1 -0
  24. package/dist/components/sidebar/conversation-view.d.ts.map +1 -0
  25. package/dist/components/sidebar/conversation-view.js.map +1 -0
  26. package/dist/components/sidebar/detail-card.d.ts.map +1 -0
  27. package/dist/components/sidebar/detail-card.js.map +1 -0
  28. package/dist/components/sidebar/entity-detail-panel.d.ts +32 -0
  29. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -0
  30. package/dist/{sidebar → components/sidebar}/entity-detail-panel.js +61 -49
  31. package/dist/components/sidebar/entity-detail-panel.js.map +1 -0
  32. package/dist/components/sidebar/events-list.d.ts +8 -0
  33. package/dist/components/sidebar/events-list.d.ts.map +1 -0
  34. package/dist/components/sidebar/events-list.js +16 -0
  35. package/dist/components/sidebar/events-list.js.map +1 -0
  36. package/dist/components/sidebar/resolve-hook-modal.d.ts.map +1 -0
  37. package/dist/components/sidebar/resolve-hook-modal.js.map +1 -0
  38. package/dist/components/stream-viewer.d.ts +18 -0
  39. package/dist/components/stream-viewer.d.ts.map +1 -0
  40. package/dist/{stream-viewer.js → components/stream-viewer.js} +1 -59
  41. package/dist/components/stream-viewer.js.map +1 -0
  42. package/dist/components/trace-viewer/components/map.d.ts.map +1 -0
  43. package/dist/components/trace-viewer/components/map.js.map +1 -0
  44. package/dist/components/trace-viewer/components/markers.d.ts.map +1 -0
  45. package/dist/components/trace-viewer/components/markers.js.map +1 -0
  46. package/dist/components/trace-viewer/components/node.d.ts.map +1 -0
  47. package/dist/components/trace-viewer/components/node.js.map +1 -0
  48. package/dist/components/trace-viewer/components/search-input.d.ts.map +1 -0
  49. package/dist/components/trace-viewer/components/search-input.js.map +1 -0
  50. package/dist/components/trace-viewer/components/search.d.ts.map +1 -0
  51. package/dist/components/trace-viewer/components/search.js.map +1 -0
  52. package/dist/components/trace-viewer/components/span-detail-panel.d.ts.map +1 -0
  53. package/dist/components/trace-viewer/components/span-detail-panel.js.map +1 -0
  54. package/dist/components/trace-viewer/components/ui.d.ts.map +1 -0
  55. package/dist/components/trace-viewer/components/ui.js.map +1 -0
  56. package/dist/components/trace-viewer/components/zoom-button.d.ts.map +1 -0
  57. package/dist/components/trace-viewer/components/zoom-button.js.map +1 -0
  58. package/dist/components/trace-viewer/components/zoom-icons.d.ts.map +1 -0
  59. package/dist/components/trace-viewer/components/zoom-icons.js.map +1 -0
  60. package/dist/components/trace-viewer/context.d.ts.map +1 -0
  61. package/dist/components/trace-viewer/context.js.map +1 -0
  62. package/dist/components/trace-viewer/index.d.ts.map +1 -0
  63. package/dist/components/trace-viewer/index.js.map +1 -0
  64. package/dist/components/trace-viewer/trace-viewer.d.ts.map +1 -0
  65. package/dist/components/trace-viewer/trace-viewer.js.map +1 -0
  66. package/dist/components/trace-viewer/types.d.ts.map +1 -0
  67. package/dist/components/trace-viewer/types.js.map +1 -0
  68. package/dist/components/trace-viewer/util/constants.d.ts.map +1 -0
  69. package/dist/components/trace-viewer/util/constants.js.map +1 -0
  70. package/dist/components/trace-viewer/util/scrollbar-width.d.ts.map +1 -0
  71. package/dist/components/trace-viewer/util/scrollbar-width.js.map +1 -0
  72. package/dist/{trace-viewer → components/trace-viewer}/util/timing.d.ts +1 -1
  73. package/dist/components/trace-viewer/util/timing.d.ts.map +1 -0
  74. package/dist/{trace-viewer → components/trace-viewer}/util/timing.js +1 -1
  75. package/dist/components/trace-viewer/util/timing.js.map +1 -0
  76. package/dist/components/trace-viewer/util/tree.d.ts.map +1 -0
  77. package/dist/components/trace-viewer/util/tree.js.map +1 -0
  78. package/dist/components/trace-viewer/util/use-immediate-style.d.ts.map +1 -0
  79. package/dist/components/trace-viewer/util/use-immediate-style.js.map +1 -0
  80. package/dist/components/trace-viewer/util/use-streaming-spans.d.ts.map +1 -0
  81. package/dist/components/trace-viewer/util/use-streaming-spans.js.map +1 -0
  82. package/dist/components/trace-viewer/util/use-trackpad-zoom.d.ts.map +1 -0
  83. package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +1 -0
  84. package/dist/components/trace-viewer/worker.d.ts.map +1 -0
  85. package/dist/components/trace-viewer/worker.js.map +1 -0
  86. package/dist/components/workflow-trace-view.d.ts +24 -0
  87. package/dist/components/workflow-trace-view.d.ts.map +1 -0
  88. package/dist/components/workflow-trace-view.js +152 -0
  89. package/dist/components/workflow-trace-view.js.map +1 -0
  90. package/dist/components/workflow-traces/event-colors.d.ts.map +1 -0
  91. package/dist/components/workflow-traces/event-colors.js.map +1 -0
  92. package/dist/components/workflow-traces/trace-colors.d.ts.map +1 -0
  93. package/dist/components/workflow-traces/trace-colors.js.map +1 -0
  94. package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -0
  95. package/dist/components/workflow-traces/trace-span-construction.js.map +1 -0
  96. package/dist/components/workflow-traces/trace-time-utils.d.ts.map +1 -0
  97. package/dist/components/workflow-traces/trace-time-utils.js.map +1 -0
  98. package/dist/index.d.ts +3 -13
  99. package/dist/index.d.ts.map +1 -1
  100. package/dist/index.js +2 -9
  101. package/dist/index.js.map +1 -1
  102. package/package.json +15 -11
  103. package/src/components/error-boundary.tsx +79 -0
  104. package/src/components/event-list-view.tsx +429 -0
  105. package/src/components/hook-actions.tsx +167 -0
  106. package/src/components/index.d.ts +1 -0
  107. package/src/components/index.ts +23 -0
  108. package/src/components/run-trace-view.tsx +75 -0
  109. package/src/components/sidebar/attribute-panel.tsx +938 -0
  110. package/src/components/sidebar/conversation-view.tsx +235 -0
  111. package/src/components/sidebar/detail-card.tsx +43 -0
  112. package/src/components/sidebar/entity-detail-panel.tsx +338 -0
  113. package/src/components/sidebar/events-list.tsx +119 -0
  114. package/src/components/sidebar/resolve-hook-modal.tsx +219 -0
  115. package/src/components/stream-viewer.tsx +143 -0
  116. package/src/components/trace-viewer/components/map.tsx +226 -0
  117. package/src/components/trace-viewer/components/markers.tsx +564 -0
  118. package/src/components/trace-viewer/components/node.tsx +259 -0
  119. package/src/components/trace-viewer/components/search-input.tsx +52 -0
  120. package/src/components/trace-viewer/components/search.tsx +47 -0
  121. package/src/components/trace-viewer/components/span-detail-panel.tsx +650 -0
  122. package/src/components/trace-viewer/components/ui.tsx +156 -0
  123. package/src/components/trace-viewer/components/zoom-button.tsx +61 -0
  124. package/src/components/trace-viewer/components/zoom-icons.tsx +65 -0
  125. package/src/components/trace-viewer/context.tsx +633 -0
  126. package/src/components/trace-viewer/index.tsx +4 -0
  127. package/src/components/trace-viewer/modules.d.ts +16 -0
  128. package/src/components/trace-viewer/trace-viewer.module.css +1292 -0
  129. package/src/components/trace-viewer/trace-viewer.tsx +448 -0
  130. package/src/components/trace-viewer/types.ts +234 -0
  131. package/src/components/trace-viewer/util/constants.ts +8 -0
  132. package/src/components/trace-viewer/util/scrollbar-width.ts +13 -0
  133. package/src/components/trace-viewer/util/timing.ts +33 -0
  134. package/src/components/trace-viewer/util/tree.ts +277 -0
  135. package/src/components/trace-viewer/util/use-immediate-style.ts +38 -0
  136. package/src/components/trace-viewer/util/use-streaming-spans.ts +415 -0
  137. package/src/components/trace-viewer/util/use-trackpad-zoom.tsx +51 -0
  138. package/src/components/trace-viewer/worker.ts +128 -0
  139. package/src/components/ui/alert.tsx +59 -0
  140. package/src/components/ui/card.tsx +88 -0
  141. package/src/components/ui/error-card.tsx +65 -0
  142. package/src/components/ui/skeleton.tsx +15 -0
  143. package/src/components/workflow-trace-view.tsx +306 -0
  144. package/src/components/workflow-traces/event-colors.ts +94 -0
  145. package/src/components/workflow-traces/trace-colors.ts +112 -0
  146. package/src/components/workflow-traces/trace-span-construction.ts +299 -0
  147. package/src/components/workflow-traces/trace-time-utils.ts +50 -0
  148. package/src/hooks/use-dark-mode.ts +34 -0
  149. package/src/index.d.ts +1 -0
  150. package/src/index.ts +29 -0
  151. package/src/lib/event-analysis.ts +231 -0
  152. package/src/lib/utils.ts +166 -0
  153. package/dist/api/workflow-api-client.d.ts +0 -543
  154. package/dist/api/workflow-api-client.d.ts.map +0 -1
  155. package/dist/api/workflow-api-client.js +0 -953
  156. package/dist/api/workflow-api-client.js.map +0 -1
  157. package/dist/api/workflow-server-actions.d.ts +0 -230
  158. package/dist/api/workflow-server-actions.d.ts.map +0 -1
  159. package/dist/api/workflow-server-actions.js +0 -861
  160. package/dist/api/workflow-server-actions.js.map +0 -1
  161. package/dist/error-boundary.d.ts.map +0 -1
  162. package/dist/error-boundary.js.map +0 -1
  163. package/dist/event-list-view.d.ts.map +0 -1
  164. package/dist/event-list-view.js.map +0 -1
  165. package/dist/hook-actions.d.ts.map +0 -1
  166. package/dist/hook-actions.js.map +0 -1
  167. package/dist/run-trace-view.d.ts +0 -8
  168. package/dist/run-trace-view.d.ts.map +0 -1
  169. package/dist/run-trace-view.js +0 -15
  170. package/dist/run-trace-view.js.map +0 -1
  171. package/dist/sidebar/attribute-panel.d.ts.map +0 -1
  172. package/dist/sidebar/attribute-panel.js.map +0 -1
  173. package/dist/sidebar/conversation-view.d.ts.map +0 -1
  174. package/dist/sidebar/conversation-view.js.map +0 -1
  175. package/dist/sidebar/detail-card.d.ts.map +0 -1
  176. package/dist/sidebar/detail-card.js.map +0 -1
  177. package/dist/sidebar/entity-detail-panel.d.ts +0 -12
  178. package/dist/sidebar/entity-detail-panel.d.ts.map +0 -1
  179. package/dist/sidebar/entity-detail-panel.js.map +0 -1
  180. package/dist/sidebar/events-list.d.ts +0 -9
  181. package/dist/sidebar/events-list.d.ts.map +0 -1
  182. package/dist/sidebar/events-list.js +0 -36
  183. package/dist/sidebar/events-list.js.map +0 -1
  184. package/dist/sidebar/resolve-hook-modal.d.ts.map +0 -1
  185. package/dist/sidebar/resolve-hook-modal.js.map +0 -1
  186. package/dist/stream-viewer.d.ts +0 -13
  187. package/dist/stream-viewer.d.ts.map +0 -1
  188. package/dist/stream-viewer.js.map +0 -1
  189. package/dist/trace-viewer/components/map.d.ts.map +0 -1
  190. package/dist/trace-viewer/components/map.js.map +0 -1
  191. package/dist/trace-viewer/components/markers.d.ts.map +0 -1
  192. package/dist/trace-viewer/components/markers.js.map +0 -1
  193. package/dist/trace-viewer/components/node.d.ts.map +0 -1
  194. package/dist/trace-viewer/components/node.js.map +0 -1
  195. package/dist/trace-viewer/components/search-input.d.ts.map +0 -1
  196. package/dist/trace-viewer/components/search-input.js.map +0 -1
  197. package/dist/trace-viewer/components/search.d.ts.map +0 -1
  198. package/dist/trace-viewer/components/search.js.map +0 -1
  199. package/dist/trace-viewer/components/span-detail-panel.d.ts.map +0 -1
  200. package/dist/trace-viewer/components/span-detail-panel.js.map +0 -1
  201. package/dist/trace-viewer/components/ui.d.ts.map +0 -1
  202. package/dist/trace-viewer/components/ui.js.map +0 -1
  203. package/dist/trace-viewer/components/zoom-button.d.ts.map +0 -1
  204. package/dist/trace-viewer/components/zoom-button.js.map +0 -1
  205. package/dist/trace-viewer/components/zoom-icons.d.ts.map +0 -1
  206. package/dist/trace-viewer/components/zoom-icons.js.map +0 -1
  207. package/dist/trace-viewer/context.d.ts.map +0 -1
  208. package/dist/trace-viewer/context.js.map +0 -1
  209. package/dist/trace-viewer/index.d.ts.map +0 -1
  210. package/dist/trace-viewer/index.js.map +0 -1
  211. package/dist/trace-viewer/trace-viewer.d.ts.map +0 -1
  212. package/dist/trace-viewer/trace-viewer.js.map +0 -1
  213. package/dist/trace-viewer/types.d.ts.map +0 -1
  214. package/dist/trace-viewer/types.js.map +0 -1
  215. package/dist/trace-viewer/util/constants.d.ts.map +0 -1
  216. package/dist/trace-viewer/util/constants.js.map +0 -1
  217. package/dist/trace-viewer/util/scrollbar-width.d.ts.map +0 -1
  218. package/dist/trace-viewer/util/scrollbar-width.js.map +0 -1
  219. package/dist/trace-viewer/util/timing.d.ts.map +0 -1
  220. package/dist/trace-viewer/util/timing.js.map +0 -1
  221. package/dist/trace-viewer/util/tree.d.ts.map +0 -1
  222. package/dist/trace-viewer/util/tree.js.map +0 -1
  223. package/dist/trace-viewer/util/use-immediate-style.d.ts.map +0 -1
  224. package/dist/trace-viewer/util/use-immediate-style.js.map +0 -1
  225. package/dist/trace-viewer/util/use-streaming-spans.d.ts.map +0 -1
  226. package/dist/trace-viewer/util/use-streaming-spans.js.map +0 -1
  227. package/dist/trace-viewer/util/use-trackpad-zoom.d.ts.map +0 -1
  228. package/dist/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
  229. package/dist/trace-viewer/worker.d.ts.map +0 -1
  230. package/dist/trace-viewer/worker.js.map +0 -1
  231. package/dist/workflow-trace-view.d.ts +0 -14
  232. package/dist/workflow-trace-view.d.ts.map +0 -1
  233. package/dist/workflow-trace-view.js +0 -135
  234. package/dist/workflow-trace-view.js.map +0 -1
  235. package/dist/workflow-traces/event-colors.d.ts.map +0 -1
  236. package/dist/workflow-traces/event-colors.js.map +0 -1
  237. package/dist/workflow-traces/trace-colors.d.ts.map +0 -1
  238. package/dist/workflow-traces/trace-colors.js.map +0 -1
  239. package/dist/workflow-traces/trace-span-construction.d.ts.map +0 -1
  240. package/dist/workflow-traces/trace-span-construction.js.map +0 -1
  241. package/dist/workflow-traces/trace-time-utils.d.ts.map +0 -1
  242. package/dist/workflow-traces/trace-time-utils.js.map +0 -1
  243. package/server/README.md +0 -1
  244. package/server/package.json +0 -4
  245. /package/dist/{error-boundary.d.ts → components/error-boundary.d.ts} +0 -0
  246. /package/dist/{sidebar → components/sidebar}/attribute-panel.d.ts +0 -0
  247. /package/dist/{sidebar → components/sidebar}/conversation-view.d.ts +0 -0
  248. /package/dist/{sidebar → components/sidebar}/conversation-view.js +0 -0
  249. /package/dist/{sidebar → components/sidebar}/detail-card.d.ts +0 -0
  250. /package/dist/{sidebar → components/sidebar}/detail-card.js +0 -0
  251. /package/dist/{sidebar → components/sidebar}/resolve-hook-modal.d.ts +0 -0
  252. /package/dist/{sidebar → components/sidebar}/resolve-hook-modal.js +0 -0
  253. /package/dist/{trace-viewer → components/trace-viewer}/components/map.d.ts +0 -0
  254. /package/dist/{trace-viewer → components/trace-viewer}/components/map.js +0 -0
  255. /package/dist/{trace-viewer → components/trace-viewer}/components/markers.d.ts +0 -0
  256. /package/dist/{trace-viewer → components/trace-viewer}/components/markers.js +0 -0
  257. /package/dist/{trace-viewer → components/trace-viewer}/components/node.d.ts +0 -0
  258. /package/dist/{trace-viewer → components/trace-viewer}/components/node.js +0 -0
  259. /package/dist/{trace-viewer → components/trace-viewer}/components/search-input.d.ts +0 -0
  260. /package/dist/{trace-viewer → components/trace-viewer}/components/search-input.js +0 -0
  261. /package/dist/{trace-viewer → components/trace-viewer}/components/search.d.ts +0 -0
  262. /package/dist/{trace-viewer → components/trace-viewer}/components/search.js +0 -0
  263. /package/dist/{trace-viewer → components/trace-viewer}/components/span-detail-panel.d.ts +0 -0
  264. /package/dist/{trace-viewer → components/trace-viewer}/components/span-detail-panel.js +0 -0
  265. /package/dist/{trace-viewer → components/trace-viewer}/components/ui.d.ts +0 -0
  266. /package/dist/{trace-viewer → components/trace-viewer}/components/ui.js +0 -0
  267. /package/dist/{trace-viewer → components/trace-viewer}/components/zoom-button.d.ts +0 -0
  268. /package/dist/{trace-viewer → components/trace-viewer}/components/zoom-button.js +0 -0
  269. /package/dist/{trace-viewer → components/trace-viewer}/components/zoom-icons.d.ts +0 -0
  270. /package/dist/{trace-viewer → components/trace-viewer}/components/zoom-icons.js +0 -0
  271. /package/dist/{trace-viewer → components/trace-viewer}/context.d.ts +0 -0
  272. /package/dist/{trace-viewer → components/trace-viewer}/context.js +0 -0
  273. /package/dist/{trace-viewer → components/trace-viewer}/index.d.ts +0 -0
  274. /package/dist/{trace-viewer → components/trace-viewer}/index.js +0 -0
  275. /package/dist/{trace-viewer → components/trace-viewer}/trace-viewer.d.ts +0 -0
  276. /package/dist/{trace-viewer → components/trace-viewer}/trace-viewer.js +0 -0
  277. /package/dist/{trace-viewer → components/trace-viewer}/trace-viewer.module.css +0 -0
  278. /package/dist/{trace-viewer → components/trace-viewer}/types.d.ts +0 -0
  279. /package/dist/{trace-viewer → components/trace-viewer}/types.js +0 -0
  280. /package/dist/{trace-viewer → components/trace-viewer}/util/constants.d.ts +0 -0
  281. /package/dist/{trace-viewer → components/trace-viewer}/util/constants.js +0 -0
  282. /package/dist/{trace-viewer → components/trace-viewer}/util/scrollbar-width.d.ts +0 -0
  283. /package/dist/{trace-viewer → components/trace-viewer}/util/scrollbar-width.js +0 -0
  284. /package/dist/{trace-viewer → components/trace-viewer}/util/tree.d.ts +0 -0
  285. /package/dist/{trace-viewer → components/trace-viewer}/util/tree.js +0 -0
  286. /package/dist/{trace-viewer → components/trace-viewer}/util/use-immediate-style.d.ts +0 -0
  287. /package/dist/{trace-viewer → components/trace-viewer}/util/use-immediate-style.js +0 -0
  288. /package/dist/{trace-viewer → components/trace-viewer}/util/use-streaming-spans.d.ts +0 -0
  289. /package/dist/{trace-viewer → components/trace-viewer}/util/use-streaming-spans.js +0 -0
  290. /package/dist/{trace-viewer → components/trace-viewer}/util/use-trackpad-zoom.d.ts +0 -0
  291. /package/dist/{trace-viewer → components/trace-viewer}/util/use-trackpad-zoom.js +0 -0
  292. /package/dist/{trace-viewer → components/trace-viewer}/worker.d.ts +0 -0
  293. /package/dist/{trace-viewer → components/trace-viewer}/worker.js +0 -0
  294. /package/dist/{workflow-traces → components/workflow-traces}/event-colors.d.ts +0 -0
  295. /package/dist/{workflow-traces → components/workflow-traces}/event-colors.js +0 -0
  296. /package/dist/{workflow-traces → components/workflow-traces}/trace-colors.d.ts +0 -0
  297. /package/dist/{workflow-traces → components/workflow-traces}/trace-colors.js +0 -0
  298. /package/dist/{workflow-traces → components/workflow-traces}/trace-span-construction.d.ts +0 -0
  299. /package/dist/{workflow-traces → components/workflow-traces}/trace-span-construction.js +0 -0
  300. /package/dist/{workflow-traces → components/workflow-traces}/trace-time-utils.d.ts +0 -0
  301. /package/dist/{workflow-traces → components/workflow-traces}/trace-time-utils.js +0 -0
@@ -0,0 +1,633 @@
1
+ 'use client';
2
+
3
+ import type { Dispatch, MutableRefObject, ReactNode, Reducer } from 'react';
4
+ import {
5
+ createContext,
6
+ useContext,
7
+ useEffect,
8
+ useMemo,
9
+ useReducer,
10
+ useRef,
11
+ } from 'react';
12
+ import type {
13
+ GetQuickLinks,
14
+ MemoCache,
15
+ MemoCacheKey,
16
+ QuickLink,
17
+ Resource,
18
+ RootNode,
19
+ ScrollSnapshot,
20
+ SpanNode,
21
+ VisibleSpanEvent,
22
+ } from './types';
23
+ import {
24
+ MAP_HEIGHT,
25
+ MARKER_HEIGHT,
26
+ ROW_HEIGHT,
27
+ ROW_PADDING,
28
+ SEARCH_GAP,
29
+ SEARCH_HEIGHT,
30
+ TIMELINE_PADDING,
31
+ } from './util/constants';
32
+ import { detectScrollbarWidth } from './util/scrollbar-width';
33
+
34
+ export interface TraceViewerState {
35
+ /**
36
+ * The root node for the tree
37
+ */
38
+ root: RootNode;
39
+ /**
40
+ * A map of spanId to span nodes
41
+ */
42
+ spanMap: Record<string, SpanNode>;
43
+ /**
44
+ * A map of resource name to resource
45
+ */
46
+ resourceMap: Record<string, Resource['attributes']>;
47
+ /**
48
+ * The current (debounced) search input value
49
+ */
50
+ filter: string;
51
+ /**
52
+ * The span that is currently focused and visible in the panel
53
+ */
54
+ selected: SpanNode | null;
55
+ /**
56
+ * The initial scale of the trace. At this scale the entire trace is visible
57
+ */
58
+ baseScale: number;
59
+ /**
60
+ * The multiplier of the base scale to get the current scale
61
+ */
62
+ scaleRatio: number;
63
+ /**
64
+ * The scale of 1ms in pixels
65
+ */
66
+ scale: number;
67
+ /**
68
+ * The width of the entire trace viewer in pixels
69
+ */
70
+ width: number;
71
+ /**
72
+ * The height of the entire trace viewer in pixels
73
+ */
74
+ height: number;
75
+ /**
76
+ * The width of the timeline view in pixels
77
+ */
78
+ timelineWidth: number;
79
+ /**
80
+ * The height of the timeline view in pixels
81
+ */
82
+ timelineHeight: number;
83
+ /**
84
+ * The width of the side panel in pixels
85
+ */
86
+ panelWidth: number;
87
+ /**
88
+ * The height of the side panel in pixels
89
+ */
90
+ panelHeight: number;
91
+ /**
92
+ * The width of scrollbars on this device
93
+ */
94
+ scrollbarWidth: number;
95
+ /**
96
+ * A ref for the timeline element
97
+ */
98
+ timelineRef: MutableRefObject<HTMLDivElement | null>;
99
+ /**
100
+ * A ref for updating timeline scroll position immediately after a scale operation
101
+ */
102
+ scrollSnapshotRef: MutableRefObject<ScrollSnapshot | undefined>;
103
+ /**
104
+ * A reference for the last time each node was mutated. Used for more efficent control
105
+ * of what React re-renders and when.
106
+ */
107
+ memoCacheRef: MutableRefObject<MemoCache>;
108
+ /**
109
+ * A constant, wrapped version of the getQuickLinks property with caching
110
+ */
111
+ getQuickLinks: GetQuickLinks;
112
+ /**
113
+ * Whether the panel is being rendered attached to the timeline
114
+ */
115
+ withPanel: boolean;
116
+ /**
117
+ * Whether the trace viewer is small enough that it should be in mobile mode
118
+ */
119
+ isMobile: boolean;
120
+ /**
121
+ * Panel to render instead of the default span detail panel. The panel
122
+ * should use the context to get the selected span and other state.
123
+ */
124
+ customPanelComponent: ReactNode | null;
125
+ /**
126
+ * A function to provide custom class names for spans.
127
+ */
128
+ customSpanClassNameFunc?: (span: SpanNode) => string;
129
+ /**
130
+ * A function to provide custom class names for span events.
131
+ */
132
+ customSpanEventClassNameFunc?: (event: VisibleSpanEvent) => string;
133
+ }
134
+
135
+ export type TraceViewerAction =
136
+ | {
137
+ type: 'setRoot';
138
+ root: RootNode;
139
+ spanMap: Record<string, SpanNode>;
140
+ resources: Resource[];
141
+ }
142
+ | {
143
+ type: 'setSize';
144
+ width: number;
145
+ height: number;
146
+ }
147
+ | {
148
+ type: 'setPanelWidth';
149
+ width: number;
150
+ }
151
+ | {
152
+ type: 'setFilter';
153
+ filter: string;
154
+ }
155
+ | {
156
+ type: 'deselect';
157
+ }
158
+ | {
159
+ type: 'select';
160
+ id: string;
161
+ }
162
+ | {
163
+ type: 'escape';
164
+ }
165
+ | {
166
+ type: 'toggleSelection';
167
+ id: string;
168
+ }
169
+ | {
170
+ type: 'detectBaseScale';
171
+ }
172
+ | {
173
+ type: 'setScale';
174
+ scale: number;
175
+ }
176
+ | {
177
+ type: 'resetScale';
178
+ }
179
+ | {
180
+ type: 'scaleToNode';
181
+ id: string;
182
+ }
183
+ | {
184
+ type: 'scaleToRange';
185
+ t1: number;
186
+ t2: number;
187
+ }
188
+ | {
189
+ type: 'adjustScaleRatio';
190
+ direction: -1 | 0 | 1;
191
+ }
192
+ | {
193
+ type: 'trackpadScale';
194
+ delta: number;
195
+ anchorT: number;
196
+ anchorX: number;
197
+ }
198
+ | {
199
+ type: 'minScale';
200
+ }
201
+ | {
202
+ type: 'setScrollSnapshot';
203
+ /**
204
+ * The time that will remain the same location after scaling
205
+ */
206
+ anchorT: number;
207
+ /**
208
+ * The anchor point relative to the timeline's left position
209
+ */
210
+ anchorX: number;
211
+ }
212
+ | {
213
+ type: 'setWithPanel';
214
+ withPanel: boolean;
215
+ }
216
+ | {
217
+ type: 'forceRender';
218
+ };
219
+
220
+ export interface TraceViewerContextProps {
221
+ state: TraceViewerState;
222
+ dispatch: Dispatch<TraceViewerAction>;
223
+ }
224
+
225
+ export const initialState: TraceViewerState = {
226
+ root: {
227
+ startTime: 0,
228
+ endTime: 1,
229
+ duration: 1,
230
+ depth: 0,
231
+ children: [],
232
+ },
233
+ spanMap: {},
234
+ resourceMap: {},
235
+ filter: '',
236
+ selected: null,
237
+ baseScale: 1,
238
+ scaleRatio: 1,
239
+ scale: 1,
240
+ width: 640,
241
+ height: 480,
242
+ timelineWidth: 640,
243
+ timelineHeight: 480,
244
+ panelWidth: 380,
245
+ panelHeight: 480,
246
+ scrollbarWidth: 0,
247
+ timelineRef: { current: null },
248
+ scrollSnapshotRef: { current: undefined },
249
+ memoCacheRef: { current: new Map() },
250
+ getQuickLinks: () => [],
251
+ withPanel: false,
252
+ isMobile: false,
253
+ customPanelComponent: null,
254
+ };
255
+
256
+ const getMinScale = (state: TraceViewerState): number => {
257
+ return (
258
+ (state.width -
259
+ state.scrollbarWidth -
260
+ Number(Boolean(state.selected && state.withPanel)) * state.panelWidth) /
261
+ state.root.duration
262
+ );
263
+ };
264
+
265
+ export const TraceViewerContext = createContext<TraceViewerContextProps>({
266
+ state: initialState,
267
+ dispatch: () => {
268
+ // noop
269
+ },
270
+ });
271
+ TraceViewerContext.displayName = 'TraceViewerContext';
272
+
273
+ const reducer: Reducer<TraceViewerState, TraceViewerAction> = (
274
+ state,
275
+ action
276
+ ) => {
277
+ switch (action.type) {
278
+ case 'setRoot':
279
+ state.scrollSnapshotRef.current = undefined;
280
+ state.memoCacheRef.current.clear();
281
+ return reducer(
282
+ {
283
+ ...state,
284
+ root: action.root,
285
+ spanMap: action.spanMap,
286
+ resourceMap: Object.fromEntries(
287
+ action.resources.map(({ name, attributes }) => [name, attributes])
288
+ ),
289
+ },
290
+ {
291
+ type: 'detectBaseScale',
292
+ }
293
+ );
294
+ case 'setSize': {
295
+ const lowerHeight =
296
+ action.height - MAP_HEIGHT - SEARCH_HEIGHT - 3 * SEARCH_GAP;
297
+
298
+ const isMobile = state.withPanel && action.width <= 768;
299
+
300
+ let newState = {
301
+ ...state,
302
+ width: action.width,
303
+ height: action.height,
304
+ timelineWidth:
305
+ action.width -
306
+ Number(Boolean(state.selected && state.withPanel && !isMobile)) *
307
+ state.panelWidth,
308
+ timelineHeight: lowerHeight,
309
+ panelHeight: lowerHeight,
310
+ isMobile,
311
+ };
312
+
313
+ if (newState.width !== state.width) {
314
+ newState = reducer(newState, {
315
+ type: 'detectBaseScale',
316
+ });
317
+ }
318
+
319
+ return newState;
320
+ }
321
+ case 'setPanelWidth': {
322
+ const panelWidth = Math.max(
323
+ 240,
324
+ Math.min(action.width, state.width - 240)
325
+ );
326
+ return {
327
+ ...state,
328
+ timelineWidth: state.width - panelWidth,
329
+ panelWidth,
330
+ };
331
+ }
332
+ case 'setFilter':
333
+ return {
334
+ ...state,
335
+ filter: action.filter,
336
+ };
337
+ case 'deselect':
338
+ return reducer(
339
+ {
340
+ ...state,
341
+ selected: null,
342
+ timelineWidth: state.width,
343
+ },
344
+ {
345
+ type: 'minScale',
346
+ }
347
+ );
348
+ case 'select': {
349
+ const node = state.spanMap[action.id];
350
+ if (!node) {
351
+ return state;
352
+ }
353
+
354
+ return {
355
+ ...state,
356
+ selected: node,
357
+ timelineWidth:
358
+ state.width -
359
+ (state.withPanel && !state.isMobile ? state.panelWidth : 0),
360
+ };
361
+ }
362
+ case 'escape': {
363
+ if (state.selected) {
364
+ return reducer(state, {
365
+ type: 'deselect',
366
+ });
367
+ }
368
+ return reducer(state, {
369
+ type: 'resetScale',
370
+ });
371
+ }
372
+ case 'toggleSelection': {
373
+ let newState = state;
374
+ if (state.selected) {
375
+ newState = reducer(newState, {
376
+ type: 'deselect',
377
+ });
378
+ }
379
+ if (state.selected?.span.spanId === action.id) {
380
+ return newState;
381
+ }
382
+ return reducer(newState, {
383
+ type: 'select',
384
+ id: action.id,
385
+ });
386
+ }
387
+ case 'detectBaseScale': {
388
+ const baseScale =
389
+ (state.width - state.scrollbarWidth) / state.root.duration;
390
+
391
+ return {
392
+ ...state,
393
+ baseScale,
394
+ scale: baseScale * state.scaleRatio,
395
+ };
396
+ }
397
+ case 'setScale':
398
+ return {
399
+ ...state,
400
+ scaleRatio: action.scale,
401
+ scale: state.baseScale * action.scale,
402
+ };
403
+ case 'resetScale':
404
+ return reducer(state, {
405
+ type: 'scaleToRange',
406
+ t1: state.root.startTime,
407
+ t2: state.root.endTime,
408
+ });
409
+ case 'scaleToNode': {
410
+ const node = state.spanMap[action.id];
411
+ if (!node) {
412
+ return state;
413
+ }
414
+ return reducer(
415
+ reducer(state, {
416
+ type: 'setScale',
417
+ scale:
418
+ (state.width -
419
+ state.scrollbarWidth -
420
+ (state.withPanel && !state.isMobile ? state.panelWidth : 0)) /
421
+ node.duration /
422
+ state.baseScale,
423
+ }),
424
+ {
425
+ type: 'setScrollSnapshot',
426
+ anchorT: node.startTime - state.root.startTime,
427
+ anchorX: 0,
428
+ }
429
+ );
430
+ }
431
+ case 'scaleToRange': {
432
+ const duration = Math.abs(action.t1 - action.t2);
433
+
434
+ return reducer(
435
+ reducer(state, {
436
+ type: 'setScale',
437
+ scale:
438
+ (state.width -
439
+ state.scrollbarWidth -
440
+ (state.selected && state.withPanel ? state.panelWidth : 0)) /
441
+ duration /
442
+ state.baseScale,
443
+ }),
444
+ {
445
+ type: 'setScrollSnapshot',
446
+ anchorT: Math.min(action.t1, action.t2) - state.root.startTime,
447
+ anchorX: 0,
448
+ }
449
+ );
450
+ }
451
+ case 'adjustScaleRatio': {
452
+ let { scaleRatio } = state;
453
+ switch (action.direction) {
454
+ case -1:
455
+ scaleRatio *= 0.8;
456
+ break;
457
+ case 1:
458
+ scaleRatio *= 1.25;
459
+ break;
460
+ default:
461
+ scaleRatio = 1;
462
+ break;
463
+ }
464
+
465
+ const $timeline = state.timelineRef.current;
466
+ if (!$timeline) {
467
+ console.warn('timelineRef is null');
468
+ return state;
469
+ }
470
+
471
+ const { clientWidth, scrollLeft } = $timeline;
472
+
473
+ return reducer(
474
+ reducer(
475
+ {
476
+ ...state,
477
+ scaleRatio,
478
+ scale: state.baseScale * scaleRatio,
479
+ },
480
+ {
481
+ type: 'minScale',
482
+ }
483
+ ),
484
+ {
485
+ type: 'setScrollSnapshot',
486
+ anchorT: (scrollLeft + clientWidth * 0.5) / state.scale,
487
+ anchorX: clientWidth * 0.5,
488
+ }
489
+ );
490
+ }
491
+ case 'trackpadScale': {
492
+ const minScaleRatio = getMinScale(state) / state.baseScale;
493
+ const scaleRatio = Math.max(
494
+ minScaleRatio,
495
+ state.scaleRatio *
496
+ (1 +
497
+ 0.2 * Math.sign(action.delta) * Math.sqrt(Math.abs(action.delta)))
498
+ );
499
+
500
+ return reducer(
501
+ {
502
+ ...state,
503
+ scaleRatio,
504
+ scale: state.baseScale * scaleRatio,
505
+ },
506
+ {
507
+ type: 'setScrollSnapshot',
508
+ anchorT: action.anchorT,
509
+ anchorX: action.anchorX,
510
+ }
511
+ );
512
+ }
513
+ case 'minScale': {
514
+ const minScale = getMinScale(state);
515
+ if (state.scale >= minScale) return state;
516
+ return {
517
+ ...state,
518
+ scale: minScale,
519
+ scaleRatio: minScale / state.baseScale,
520
+ };
521
+ }
522
+ case 'setScrollSnapshot': {
523
+ const $timeline = state.timelineRef.current;
524
+ if (!$timeline) return state;
525
+
526
+ const { anchorT, anchorX } = action;
527
+
528
+ const scrollLeft = anchorT * state.scale - anchorX;
529
+ const { scrollTop } = $timeline;
530
+ const startRow =
531
+ (scrollTop - MARKER_HEIGHT - TIMELINE_PADDING) /
532
+ (ROW_HEIGHT + ROW_PADDING);
533
+ const endRow =
534
+ startRow + Math.ceil(state.timelineHeight / (ROW_HEIGHT + ROW_PADDING));
535
+
536
+ state.scrollSnapshotRef.current = {
537
+ anchorT,
538
+ anchorX,
539
+ scrollLeft,
540
+ scrollTop,
541
+ startTime: state.root.startTime + scrollLeft / state.scale,
542
+ endTime:
543
+ state.root.startTime +
544
+ (scrollLeft + state.timelineWidth) / state.scale,
545
+ startRow,
546
+ endRow,
547
+ scale: state.scale,
548
+ };
549
+
550
+ return state;
551
+ }
552
+ case 'setWithPanel': {
553
+ if (state.withPanel === action.withPanel) return state;
554
+ return {
555
+ ...state,
556
+ withPanel: action.withPanel,
557
+ };
558
+ }
559
+ case 'forceRender':
560
+ state.memoCacheRef.current.set('', {});
561
+ return {
562
+ ...state,
563
+ };
564
+ }
565
+ };
566
+
567
+ export function TraceViewerContextProvider({
568
+ getQuickLinks,
569
+ withPanel = false,
570
+ children,
571
+ customSpanClassNameFunc,
572
+ customSpanEventClassNameFunc,
573
+ customPanelComponent = null,
574
+ }: {
575
+ getQuickLinks?: GetQuickLinks;
576
+ withPanel?: boolean;
577
+ children: ReactNode;
578
+ customSpanClassNameFunc?: (span: SpanNode) => string;
579
+ customSpanEventClassNameFunc?: (event: VisibleSpanEvent) => string;
580
+ customPanelComponent?: ReactNode;
581
+ }): ReactNode {
582
+ const timelineRef = useRef<HTMLDivElement>(null);
583
+ const scrollSnapshotRef = useRef<ScrollSnapshot>(undefined);
584
+ const getQuickLinksRef = useRef(getQuickLinks);
585
+ getQuickLinksRef.current = getQuickLinks;
586
+ const memoCacheRef = useRef(new Map<string, MemoCacheKey>());
587
+ const quickLinksCache = useRef(new Map<string, QuickLink[]>());
588
+ const [state, dispatch] = useReducer(reducer, initialState, (initial) => {
589
+ return {
590
+ ...initial,
591
+ scrollbarWidth: detectScrollbarWidth(),
592
+ timelineRef,
593
+ scrollSnapshotRef,
594
+ customSpanClassNameFunc,
595
+ customSpanEventClassNameFunc,
596
+ customPanelComponent,
597
+ memoCacheRef,
598
+ withPanel,
599
+ getQuickLinks: (span) => {
600
+ const cacheKey = span.spanId;
601
+ const existing = quickLinksCache.current.get(cacheKey);
602
+ if (existing) return existing;
603
+
604
+ const value = getQuickLinksRef.current?.(span) || [];
605
+ quickLinksCache.current.set(cacheKey, value);
606
+ return value;
607
+ },
608
+ };
609
+ });
610
+
611
+ useEffect(
612
+ () =>
613
+ dispatch({
614
+ type: 'setWithPanel',
615
+ withPanel,
616
+ }),
617
+ [withPanel]
618
+ );
619
+
620
+ const value: TraceViewerContextProps = useMemo(
621
+ () => ({ state, dispatch }),
622
+ [state, dispatch]
623
+ );
624
+
625
+ return (
626
+ <TraceViewerContext.Provider value={value}>
627
+ {children}
628
+ </TraceViewerContext.Provider>
629
+ );
630
+ }
631
+
632
+ export const useTraceViewer = (): TraceViewerContextProps =>
633
+ useContext(TraceViewerContext);
@@ -0,0 +1,4 @@
1
+ export { PanelResizer } from './components/span-detail-panel';
2
+ export { TraceViewerContextProvider, useTraceViewer } from './context';
3
+ export * from './trace-viewer';
4
+ export type { Trace } from './types';
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Required for CSS modules to be supported by TypeScript.
3
+ * https://github.com/mrmckeb/typescript-plugin-css-modules#custom-definitions
4
+ */
5
+
6
+ declare module '*.module.css' {
7
+ const classes: Record<string, string>;
8
+
9
+ export default classes;
10
+ }
11
+
12
+ declare module '*.svg' {
13
+ const content: { src: string };
14
+
15
+ export default content;
16
+ }