@interfere/react 0.1.0-alpha.6 → 0.2.0-alpha.2

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 (310) hide show
  1. package/README.md +90 -0
  2. package/dist/error-boundary.d.mts +27 -0
  3. package/dist/error-boundary.d.mts.map +1 -0
  4. package/dist/error-boundary.mjs +42 -0
  5. package/dist/error-boundary.mjs.map +1 -0
  6. package/dist/internal/client.d.mts +13 -0
  7. package/dist/internal/client.d.mts.map +1 -0
  8. package/dist/internal/client.mjs +80 -0
  9. package/dist/internal/client.mjs.map +1 -0
  10. package/dist/internal/config.d.mts +9 -0
  11. package/dist/internal/config.d.mts.map +1 -0
  12. package/dist/internal/config.mjs +27 -0
  13. package/dist/internal/config.mjs.map +1 -0
  14. package/dist/internal/context.d.mts +6 -0
  15. package/dist/internal/context.d.mts.map +1 -0
  16. package/dist/internal/context.mjs +32 -0
  17. package/dist/internal/context.mjs.map +1 -0
  18. package/dist/internal/envelope.d.mts +14 -0
  19. package/dist/internal/envelope.d.mts.map +1 -0
  20. package/dist/internal/envelope.mjs +20 -0
  21. package/dist/internal/envelope.mjs.map +1 -0
  22. package/dist/internal/errors.d.mts +4 -0
  23. package/dist/internal/errors.d.mts.map +1 -0
  24. package/dist/internal/errors.mjs +4 -0
  25. package/dist/internal/errors.mjs.map +1 -0
  26. package/dist/internal/sw.d.mts +4 -0
  27. package/dist/internal/sw.d.mts.map +1 -0
  28. package/dist/internal/sw.mjs +10 -0
  29. package/dist/internal/sw.mjs.map +1 -0
  30. package/dist/plugins/errors.d.mts +6 -0
  31. package/dist/plugins/errors.d.mts.map +1 -0
  32. package/dist/plugins/errors.mjs +59 -0
  33. package/dist/plugins/errors.mjs.map +1 -0
  34. package/dist/plugins/lib/loader.d.mts +9 -0
  35. package/dist/plugins/lib/loader.d.mts.map +1 -0
  36. package/dist/plugins/lib/loader.mjs +47 -0
  37. package/dist/plugins/lib/loader.mjs.map +1 -0
  38. package/dist/plugins/lib/types.d.mts +14 -0
  39. package/dist/plugins/lib/types.d.mts.map +1 -0
  40. package/dist/plugins/lib/types.mjs +1 -0
  41. package/dist/plugins/pages.d.mts +6 -0
  42. package/dist/plugins/pages.d.mts.map +1 -0
  43. package/dist/plugins/pages.mjs +102 -0
  44. package/dist/plugins/pages.mjs.map +1 -0
  45. package/dist/plugins/rage-clicks.d.mts +6 -0
  46. package/dist/plugins/rage-clicks.d.mts.map +1 -0
  47. package/dist/plugins/rage-clicks.mjs +53 -0
  48. package/dist/plugins/rage-clicks.mjs.map +1 -0
  49. package/dist/plugins/replay.d.mts +6 -0
  50. package/dist/plugins/replay.d.mts.map +1 -0
  51. package/dist/plugins/replay.mjs +62 -0
  52. package/dist/plugins/replay.mjs.map +1 -0
  53. package/dist/provider.d.mts +17 -11
  54. package/dist/provider.d.mts.map +1 -1
  55. package/dist/provider.mjs +18 -17
  56. package/dist/provider.mjs.map +1 -1
  57. package/dist/tracking/api.d.mts +22 -0
  58. package/dist/tracking/api.d.mts.map +1 -0
  59. package/dist/tracking/api.mjs +88 -0
  60. package/dist/tracking/api.mjs.map +1 -0
  61. package/dist/tracking/session.d.mts +19 -0
  62. package/dist/tracking/session.d.mts.map +1 -0
  63. package/dist/tracking/session.mjs +92 -0
  64. package/dist/tracking/session.mjs.map +1 -0
  65. package/dist/tracking/visitor.d.mts +6 -0
  66. package/dist/tracking/visitor.d.mts.map +1 -0
  67. package/dist/tracking/visitor.mjs +35 -0
  68. package/dist/tracking/visitor.mjs.map +1 -0
  69. package/dist/transport/http.d.mts +15 -0
  70. package/dist/transport/http.d.mts.map +1 -0
  71. package/dist/transport/http.mjs +56 -0
  72. package/dist/transport/http.mjs.map +1 -0
  73. package/dist/transport/queue.d.mts +25 -0
  74. package/dist/transport/queue.d.mts.map +1 -0
  75. package/dist/transport/queue.mjs +60 -0
  76. package/dist/transport/queue.mjs.map +1 -0
  77. package/dist/util/log.d.mts +13 -0
  78. package/dist/util/log.d.mts.map +1 -0
  79. package/dist/util/log.mjs +37 -0
  80. package/dist/util/log.mjs.map +1 -0
  81. package/package.json +38 -64
  82. package/dist/client.d.mts +0 -8
  83. package/dist/client.d.mts.map +0 -1
  84. package/dist/client.mjs +0 -14
  85. package/dist/client.mjs.map +0 -1
  86. package/dist/core/events/define-event.d.mts +0 -12
  87. package/dist/core/events/define-event.d.mts.map +0 -1
  88. package/dist/core/events/define-event.mjs +0 -39
  89. package/dist/core/events/define-event.mjs.map +0 -1
  90. package/dist/core/events/event-registry.d.mts +0 -23
  91. package/dist/core/events/event-registry.d.mts.map +0 -1
  92. package/dist/core/events/event-registry.mjs +0 -32
  93. package/dist/core/events/event-registry.mjs.map +0 -1
  94. package/dist/core/events/plugin-event-types.d.mts +0 -130
  95. package/dist/core/events/plugin-event-types.d.mts.map +0 -1
  96. package/dist/core/events/plugin-event-types.mjs +0 -25
  97. package/dist/core/events/plugin-event-types.mjs.map +0 -1
  98. package/dist/core/plugins/define-plugin.d.mts +0 -43
  99. package/dist/core/plugins/define-plugin.d.mts.map +0 -1
  100. package/dist/core/plugins/define-plugin.mjs +0 -23
  101. package/dist/core/plugins/define-plugin.mjs.map +0 -1
  102. package/dist/core/plugins/dom-utils.d.mts +0 -9
  103. package/dist/core/plugins/dom-utils.d.mts.map +0 -1
  104. package/dist/core/plugins/dom-utils.mjs +0 -25
  105. package/dist/core/plugins/dom-utils.mjs.map +0 -1
  106. package/dist/core/plugins/impl/ai-summary/ai-summary-plugin-api.d.mts +0 -18
  107. package/dist/core/plugins/impl/ai-summary/ai-summary-plugin-api.d.mts.map +0 -1
  108. package/dist/core/plugins/impl/ai-summary/ai-summary-plugin-api.mjs +0 -17
  109. package/dist/core/plugins/impl/ai-summary/ai-summary-plugin-api.mjs.map +0 -1
  110. package/dist/core/plugins/impl/ai-summary/plugin.d.mts +0 -6
  111. package/dist/core/plugins/impl/ai-summary/plugin.d.mts.map +0 -1
  112. package/dist/core/plugins/impl/ai-summary/plugin.mjs +0 -151
  113. package/dist/core/plugins/impl/ai-summary/plugin.mjs.map +0 -1
  114. package/dist/core/plugins/impl/errors/errors-plugin-api.d.mts +0 -17
  115. package/dist/core/plugins/impl/errors/errors-plugin-api.d.mts.map +0 -1
  116. package/dist/core/plugins/impl/errors/errors-plugin-api.mjs +0 -58
  117. package/dist/core/plugins/impl/errors/errors-plugin-api.mjs.map +0 -1
  118. package/dist/core/plugins/impl/errors/logic.d.mts +0 -15
  119. package/dist/core/plugins/impl/errors/logic.d.mts.map +0 -1
  120. package/dist/core/plugins/impl/errors/logic.mjs +0 -48
  121. package/dist/core/plugins/impl/errors/logic.mjs.map +0 -1
  122. package/dist/core/plugins/impl/errors/patches.d.mts +0 -13
  123. package/dist/core/plugins/impl/errors/patches.d.mts.map +0 -1
  124. package/dist/core/plugins/impl/errors/patches.mjs +0 -43
  125. package/dist/core/plugins/impl/errors/patches.mjs.map +0 -1
  126. package/dist/core/plugins/impl/errors/plugin.d.mts +0 -9
  127. package/dist/core/plugins/impl/errors/plugin.d.mts.map +0 -1
  128. package/dist/core/plugins/impl/errors/plugin.mjs +0 -91
  129. package/dist/core/plugins/impl/errors/plugin.mjs.map +0 -1
  130. package/dist/core/plugins/impl/page-events/page-events-plugin-api.d.mts +0 -19
  131. package/dist/core/plugins/impl/page-events/page-events-plugin-api.d.mts.map +0 -1
  132. package/dist/core/plugins/impl/page-events/page-events-plugin-api.mjs +0 -38
  133. package/dist/core/plugins/impl/page-events/page-events-plugin-api.mjs.map +0 -1
  134. package/dist/core/plugins/impl/page-events/plugin.d.mts +0 -6
  135. package/dist/core/plugins/impl/page-events/plugin.d.mts.map +0 -1
  136. package/dist/core/plugins/impl/page-events/plugin.mjs +0 -95
  137. package/dist/core/plugins/impl/page-events/plugin.mjs.map +0 -1
  138. package/dist/core/plugins/impl/rage-click/plugin.d.mts +0 -6
  139. package/dist/core/plugins/impl/rage-click/plugin.d.mts.map +0 -1
  140. package/dist/core/plugins/impl/rage-click/plugin.mjs +0 -38
  141. package/dist/core/plugins/impl/rage-click/plugin.mjs.map +0 -1
  142. package/dist/core/plugins/impl/rage-click/rage-click.layer.d.mts +0 -9
  143. package/dist/core/plugins/impl/rage-click/rage-click.layer.d.mts.map +0 -1
  144. package/dist/core/plugins/impl/rage-click/rage-click.layer.mjs +0 -35
  145. package/dist/core/plugins/impl/rage-click/rage-click.layer.mjs.map +0 -1
  146. package/dist/core/plugins/impl/rage-click/rage-click.service.d.mts +0 -16
  147. package/dist/core/plugins/impl/rage-click/rage-click.service.d.mts.map +0 -1
  148. package/dist/core/plugins/impl/rage-click/rage-click.service.mjs +0 -7
  149. package/dist/core/plugins/impl/rage-click/rage-click.service.mjs.map +0 -1
  150. package/dist/core/plugins/impl/rage-click/rage-click.test-layer.d.mts +0 -16
  151. package/dist/core/plugins/impl/rage-click/rage-click.test-layer.d.mts.map +0 -1
  152. package/dist/core/plugins/impl/rage-click/rage-click.test-layer.mjs +0 -18
  153. package/dist/core/plugins/impl/rage-click/rage-click.test-layer.mjs.map +0 -1
  154. package/dist/core/plugins/impl/replay/plugin.d.mts +0 -9
  155. package/dist/core/plugins/impl/replay/plugin.d.mts.map +0 -1
  156. package/dist/core/plugins/impl/replay/plugin.mjs +0 -83
  157. package/dist/core/plugins/impl/replay/plugin.mjs.map +0 -1
  158. package/dist/core/plugins/impl/replay/replay-plugin-api.d.mts +0 -18
  159. package/dist/core/plugins/impl/replay/replay-plugin-api.d.mts.map +0 -1
  160. package/dist/core/plugins/impl/replay/replay-plugin-api.mjs +0 -50
  161. package/dist/core/plugins/impl/replay/replay-plugin-api.mjs.map +0 -1
  162. package/dist/core/plugins/impl/server-tracing/plugin.d.mts +0 -13
  163. package/dist/core/plugins/impl/server-tracing/plugin.d.mts.map +0 -1
  164. package/dist/core/plugins/impl/server-tracing/plugin.mjs +0 -75
  165. package/dist/core/plugins/impl/server-tracing/plugin.mjs.map +0 -1
  166. package/dist/core/plugins/impl/server-tracing/server-tracing-plugin-api.d.mts +0 -16
  167. package/dist/core/plugins/impl/server-tracing/server-tracing-plugin-api.d.mts.map +0 -1
  168. package/dist/core/plugins/impl/server-tracing/server-tracing-plugin-api.mjs +0 -17
  169. package/dist/core/plugins/impl/server-tracing/server-tracing-plugin-api.mjs.map +0 -1
  170. package/dist/core/plugins/impl/server-tracing/tracing-logic.d.mts +0 -29
  171. package/dist/core/plugins/impl/server-tracing/tracing-logic.d.mts.map +0 -1
  172. package/dist/core/plugins/impl/server-tracing/tracing-logic.mjs +0 -55
  173. package/dist/core/plugins/impl/server-tracing/tracing-logic.mjs.map +0 -1
  174. package/dist/core/plugins/plugin-loader.d.mts +0 -75
  175. package/dist/core/plugins/plugin-loader.d.mts.map +0 -1
  176. package/dist/core/plugins/plugin-loader.mjs +0 -79
  177. package/dist/core/plugins/plugin-loader.mjs.map +0 -1
  178. package/dist/core/plugins/services/event-capture.d.mts +0 -12
  179. package/dist/core/plugins/services/event-capture.d.mts.map +0 -1
  180. package/dist/core/plugins/services/event-capture.layer.d.mts +0 -11
  181. package/dist/core/plugins/services/event-capture.layer.d.mts.map +0 -1
  182. package/dist/core/plugins/services/event-capture.layer.mjs +0 -79
  183. package/dist/core/plugins/services/event-capture.layer.mjs.map +0 -1
  184. package/dist/core/plugins/services/event-capture.mjs +0 -7
  185. package/dist/core/plugins/services/event-capture.mjs.map +0 -1
  186. package/dist/core/plugins/services/event-capture.test-layer.d.mts +0 -17
  187. package/dist/core/plugins/services/event-capture.test-layer.d.mts.map +0 -1
  188. package/dist/core/plugins/services/event-capture.test-layer.mjs +0 -21
  189. package/dist/core/plugins/services/event-capture.test-layer.mjs.map +0 -1
  190. package/dist/core/plugins/services/plugin-config.d.mts +0 -11
  191. package/dist/core/plugins/services/plugin-config.d.mts.map +0 -1
  192. package/dist/core/plugins/services/plugin-config.mjs +0 -7
  193. package/dist/core/plugins/services/plugin-config.mjs.map +0 -1
  194. package/dist/core/plugins/services/plugin-config.test-layer.d.mts +0 -60
  195. package/dist/core/plugins/services/plugin-config.test-layer.d.mts.map +0 -1
  196. package/dist/core/plugins/services/plugin-config.test-layer.mjs +0 -8
  197. package/dist/core/plugins/services/plugin-config.test-layer.mjs.map +0 -1
  198. package/dist/core/plugins/services/plugin-logger.d.mts +0 -14
  199. package/dist/core/plugins/services/plugin-logger.d.mts.map +0 -1
  200. package/dist/core/plugins/services/plugin-logger.mjs +0 -7
  201. package/dist/core/plugins/services/plugin-logger.mjs.map +0 -1
  202. package/dist/core/plugins/services/plugin-logger.test-layer.d.mts +0 -18
  203. package/dist/core/plugins/services/plugin-logger.test-layer.d.mts.map +0 -1
  204. package/dist/core/plugins/services/plugin-logger.test-layer.mjs +0 -28
  205. package/dist/core/plugins/services/plugin-logger.test-layer.mjs.map +0 -1
  206. package/dist/core/plugins/services/plugin-runtime.d.mts +0 -10
  207. package/dist/core/plugins/services/plugin-runtime.d.mts.map +0 -1
  208. package/dist/core/plugins/services/plugin-runtime.mjs +0 -7
  209. package/dist/core/plugins/services/plugin-runtime.mjs.map +0 -1
  210. package/dist/core/plugins/services/plugin-runtime.test-layer.d.mts +0 -16
  211. package/dist/core/plugins/services/plugin-runtime.test-layer.d.mts.map +0 -1
  212. package/dist/core/plugins/services/plugin-runtime.test-layer.mjs +0 -21
  213. package/dist/core/plugins/services/plugin-runtime.test-layer.mjs.map +0 -1
  214. package/dist/core/plugins/services/session-info.d.mts +0 -11
  215. package/dist/core/plugins/services/session-info.d.mts.map +0 -1
  216. package/dist/core/plugins/services/session-info.mjs +0 -7
  217. package/dist/core/plugins/services/session-info.mjs.map +0 -1
  218. package/dist/core/plugins/services/session-info.test-layer.d.mts +0 -18
  219. package/dist/core/plugins/services/session-info.test-layer.d.mts.map +0 -1
  220. package/dist/core/plugins/services/session-info.test-layer.mjs +0 -20
  221. package/dist/core/plugins/services/session-info.test-layer.mjs.map +0 -1
  222. package/dist/core/runtime/config.d.mts +0 -14
  223. package/dist/core/runtime/config.d.mts.map +0 -1
  224. package/dist/core/runtime/config.mjs +0 -33
  225. package/dist/core/runtime/config.mjs.map +0 -1
  226. package/dist/core/runtime/context.d.mts +0 -50
  227. package/dist/core/runtime/context.d.mts.map +0 -1
  228. package/dist/core/runtime/context.mjs +0 -46
  229. package/dist/core/runtime/context.mjs.map +0 -1
  230. package/dist/core/runtime/ingest-target.d.mts +0 -10
  231. package/dist/core/runtime/ingest-target.d.mts.map +0 -1
  232. package/dist/core/runtime/ingest-target.mjs +0 -15
  233. package/dist/core/runtime/ingest-target.mjs.map +0 -1
  234. package/dist/core/runtime/native-fetch.d.mts +0 -32
  235. package/dist/core/runtime/native-fetch.d.mts.map +0 -1
  236. package/dist/core/runtime/native-fetch.mjs +0 -49
  237. package/dist/core/runtime/native-fetch.mjs.map +0 -1
  238. package/dist/core/schemas.d.mts +0 -26
  239. package/dist/core/schemas.d.mts.map +0 -1
  240. package/dist/core/schemas.mjs +0 -1
  241. package/dist/effect/errors.d.mts +0 -22
  242. package/dist/effect/errors.d.mts.map +0 -1
  243. package/dist/effect/errors.mjs +0 -17
  244. package/dist/effect/errors.mjs.map +0 -1
  245. package/dist/effect/layers/circuit-breaker.layer.d.mts +0 -9
  246. package/dist/effect/layers/circuit-breaker.layer.d.mts.map +0 -1
  247. package/dist/effect/layers/circuit-breaker.layer.mjs +0 -9
  248. package/dist/effect/layers/circuit-breaker.layer.mjs.map +0 -1
  249. package/dist/effect/layers/circuit-breaker.layer.test-layer.d.mts +0 -18
  250. package/dist/effect/layers/circuit-breaker.layer.test-layer.d.mts.map +0 -1
  251. package/dist/effect/layers/circuit-breaker.layer.test-layer.mjs +0 -43
  252. package/dist/effect/layers/circuit-breaker.layer.test-layer.mjs.map +0 -1
  253. package/dist/effect/layers/config.layer.d.mts +0 -13
  254. package/dist/effect/layers/config.layer.d.mts.map +0 -1
  255. package/dist/effect/layers/config.layer.mjs +0 -21
  256. package/dist/effect/layers/config.layer.mjs.map +0 -1
  257. package/dist/effect/layers/context.layer.d.mts +0 -12
  258. package/dist/effect/layers/context.layer.d.mts.map +0 -1
  259. package/dist/effect/layers/context.layer.mjs +0 -14
  260. package/dist/effect/layers/context.layer.mjs.map +0 -1
  261. package/dist/effect/layers/http.layer.d.mts +0 -21
  262. package/dist/effect/layers/http.layer.d.mts.map +0 -1
  263. package/dist/effect/layers/http.layer.mjs +0 -118
  264. package/dist/effect/layers/http.layer.mjs.map +0 -1
  265. package/dist/effect/layers/queue.layer.d.mts +0 -31
  266. package/dist/effect/layers/queue.layer.d.mts.map +0 -1
  267. package/dist/effect/layers/queue.layer.mjs +0 -257
  268. package/dist/effect/layers/queue.layer.mjs.map +0 -1
  269. package/dist/effect/layers/queue.layer.test-layer.d.mts +0 -19
  270. package/dist/effect/layers/queue.layer.test-layer.d.mts.map +0 -1
  271. package/dist/effect/layers/queue.layer.test-layer.mjs +0 -44
  272. package/dist/effect/layers/queue.layer.test-layer.mjs.map +0 -1
  273. package/dist/effect/layers/session.layer.d.mts +0 -34
  274. package/dist/effect/layers/session.layer.d.mts.map +0 -1
  275. package/dist/effect/layers/session.layer.mjs +0 -127
  276. package/dist/effect/layers/session.layer.mjs.map +0 -1
  277. package/dist/effect/layers/storage.layer.d.mts +0 -50
  278. package/dist/effect/layers/storage.layer.d.mts.map +0 -1
  279. package/dist/effect/layers/storage.layer.mjs +0 -180
  280. package/dist/effect/layers/storage.layer.mjs.map +0 -1
  281. package/dist/effect/layers/test-utils.d.mts +0 -19
  282. package/dist/effect/layers/test-utils.d.mts.map +0 -1
  283. package/dist/effect/layers/test-utils.mjs +0 -32
  284. package/dist/effect/layers/test-utils.mjs.map +0 -1
  285. package/dist/effect/runtime-services.d.mts +0 -23
  286. package/dist/effect/runtime-services.d.mts.map +0 -1
  287. package/dist/effect/runtime-services.mjs +0 -79
  288. package/dist/effect/runtime-services.mjs.map +0 -1
  289. package/dist/effect/tags.d.mts +0 -58
  290. package/dist/effect/tags.d.mts.map +0 -1
  291. package/dist/effect/tags.mjs +0 -7
  292. package/dist/effect/tags.mjs.map +0 -1
  293. package/dist/hooks/use-runtime-and-plugins.d.mts +0 -7
  294. package/dist/hooks/use-runtime-and-plugins.d.mts.map +0 -1
  295. package/dist/hooks/use-runtime-and-plugins.mjs +0 -121
  296. package/dist/hooks/use-runtime-and-plugins.mjs.map +0 -1
  297. package/dist/hooks/use-session.d.mts +0 -40
  298. package/dist/hooks/use-session.d.mts.map +0 -1
  299. package/dist/hooks/use-session.mjs +0 -96
  300. package/dist/hooks/use-session.mjs.map +0 -1
  301. package/dist/package.mjs +0 -103
  302. package/dist/package.mjs.map +0 -1
  303. package/dist/server/auth.d.mts +0 -15
  304. package/dist/server/auth.d.mts.map +0 -1
  305. package/dist/server/auth.mjs +0 -45
  306. package/dist/server/auth.mjs.map +0 -1
  307. package/dist/server/capture.d.mts +0 -34
  308. package/dist/server/capture.d.mts.map +0 -1
  309. package/dist/server/capture.mjs +0 -172
  310. package/dist/server/capture.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors-plugin-api.mjs","names":[],"sources":["../../../../../src/core/plugins/impl/errors/errors-plugin-api.ts"],"sourcesContent":["import type { ErrorEnvelopePayload } from \"@interfere/types/sdk/plugins/payload/errors\";\n\nimport { Context, Duration, Effect, Layer, Ref } from \"effect\";\n\nimport { EventCapture } from \"../../services/event-capture.js\";\nimport { PluginLogger } from \"../../services/plugin-logger.js\";\nimport type { ErrorInfo } from \"./logic.js\";\nimport { buildErrorPayload, toStringSafe } from \"./logic.js\";\n\ninterface ErrorsPluginApiService {\n readonly captureConsoleArgsOnce: (\n span: string,\n args: readonly unknown[]\n ) => Effect.Effect<void>;\n readonly captureErrorInfoOnce: (\n span: string,\n info: ErrorInfo,\n meta?: Record<string, unknown>\n ) => Effect.Effect<void>;\n readonly capturePayloadOnce: (\n span: string,\n payload: ErrorEnvelopePayload\n ) => Effect.Effect<void>;\n}\n\nexport class ErrorsPluginApi extends Context.Tag(\n \"@interfere/plugins/errors/ErrorsPluginApi\"\n)<ErrorsPluginApi, ErrorsPluginApiService>() {}\n\nconst DEDUPE_TTL_MS = 2000;\nconst STACK_PREFIX_SLICE = 120;\n\nconst makeDedupeKey = (input: {\n readonly message?: string | null;\n readonly stack?: string | null;\n readonly name?: string | null;\n}) =>\n `${input.name ?? \"\"}|${input.message ?? \"\"}|${input.stack?.slice(0, STACK_PREFIX_SLICE) ?? \"\"}`;\n\nexport const ErrorsPluginApiLayer = Layer.effect(\n ErrorsPluginApi,\n Effect.gen(function* () {\n const capture = yield* EventCapture;\n const logger = yield* PluginLogger;\n\n const recentRef = yield* Ref.make<ReadonlySet<string>>(new Set());\n\n const markIfNew = (key: string) =>\n Ref.modify(recentRef, (previous) => {\n if (previous.has(key)) {\n return [false, previous] as const;\n }\n\n const next = new Set(previous);\n next.add(key);\n return [true, next] as const;\n });\n\n const scheduleDelete = (key: string) =>\n Effect.sleep(Duration.millis(DEDUPE_TTL_MS)).pipe(\n Effect.zipRight(\n Ref.update(recentRef, (previous) => {\n if (!previous.has(key)) {\n return previous;\n }\n\n const next = new Set(previous);\n next.delete(key);\n return next;\n })\n ),\n Effect.forkDaemon,\n Effect.asVoid\n );\n\n const capturePayloadOnce = Effect.fn(\"ErrorsPluginApi.capturePayloadOnce\")(\n (span: string, payload: ErrorEnvelopePayload) =>\n Effect.gen(function* () {\n const key = makeDedupeKey(payload);\n\n const isNew = yield* markIfNew(key);\n if (!isNew) {\n return;\n }\n\n yield* scheduleDelete(key);\n yield* capture.capture(\"error\", payload).pipe(Effect.withSpan(span));\n })\n );\n\n const captureErrorInfoOnce = Effect.fn(\n \"ErrorsPluginApi.captureErrorInfoOnce\"\n )((span: string, info: ErrorInfo, meta?: Record<string, unknown>) =>\n Effect.gen(function* () {\n const payload = buildErrorPayload(info);\n const merged = meta\n ? ({ ...payload, ...meta } as ErrorEnvelopePayload)\n : payload;\n\n yield* capturePayloadOnce(span, merged);\n })\n );\n\n const captureConsoleArgsOnce = Effect.fn(\n \"ErrorsPluginApi.captureConsoleArgsOnce\"\n )((span: string, args: readonly unknown[]) =>\n Effect.gen(function* () {\n const firstError = args.find((a): a is Error => a instanceof Error);\n const message = args.map(toStringSafe).join(\" \");\n\n yield* logger.debug(\"Captured console.error\");\n yield* captureErrorInfoOnce(\n span,\n {\n message,\n name: firstError?.name ?? \"ConsoleError\",\n stack: firstError?.stack,\n },\n undefined\n );\n })\n );\n\n return ErrorsPluginApi.of({\n capturePayloadOnce,\n captureErrorInfoOnce,\n captureConsoleArgsOnce,\n });\n })\n);\n"],"mappings":";;;;;;AAyBA,IAAa,kBAAb,cAAqC,QAAQ,IAC3C,4CACD,EAA2C,CAAC;AAE7C,MAAM,gBAAgB;AACtB,MAAM,qBAAqB;AAE3B,MAAM,iBAAiB,UAKrB,GAAG,MAAM,QAAQ,GAAG,GAAG,MAAM,WAAW,GAAG,GAAG,MAAM,OAAO,MAAM,GAAG,mBAAmB,IAAI;AAE7F,MAAa,uBAAuB,MAAM,OACxC,iBACA,OAAO,IAAI,aAAa;CACtB,MAAM,UAAU,OAAO;CACvB,MAAM,SAAS,OAAO;CAEtB,MAAM,YAAY,OAAO,IAAI,qBAA0B,IAAI,KAAK,CAAC;CAEjE,MAAM,aAAa,QACjB,IAAI,OAAO,YAAY,aAAa;AAClC,MAAI,SAAS,IAAI,IAAI,CACnB,QAAO,CAAC,OAAO,SAAS;EAG1B,MAAM,OAAO,IAAI,IAAI,SAAS;AAC9B,OAAK,IAAI,IAAI;AACb,SAAO,CAAC,MAAM,KAAK;GACnB;CAEJ,MAAM,kBAAkB,QACtB,OAAO,MAAM,SAAS,OAAO,cAAc,CAAC,CAAC,KAC3C,OAAO,SACL,IAAI,OAAO,YAAY,aAAa;AAClC,MAAI,CAAC,SAAS,IAAI,IAAI,CACpB,QAAO;EAGT,MAAM,OAAO,IAAI,IAAI,SAAS;AAC9B,OAAK,OAAO,IAAI;AAChB,SAAO;GACP,CACH,EACD,OAAO,YACP,OAAO,OACR;CAEH,MAAM,qBAAqB,OAAO,GAAG,qCAAqC,EACvE,MAAc,YACb,OAAO,IAAI,aAAa;EACtB,MAAM,MAAM,cAAc,QAAQ;AAGlC,MAAI,EADU,OAAO,UAAU,IAAI,EAEjC;AAGF,SAAO,eAAe,IAAI;AAC1B,SAAO,QAAQ,QAAQ,SAAS,QAAQ,CAAC,KAAK,OAAO,SAAS,KAAK,CAAC;GACpE,CACL;CAED,MAAM,uBAAuB,OAAO,GAClC,uCACD,EAAE,MAAc,MAAiB,SAChC,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,kBAAkB,KAAK;AAKvC,SAAO,mBAAmB,MAJX,OACV;GAAE,GAAG;GAAS,GAAG;GAAM,GACxB,QAEmC;GACvC,CACH;CAED,MAAM,yBAAyB,OAAO,GACpC,yCACD,EAAE,MAAc,SACf,OAAO,IAAI,aAAa;EACtB,MAAM,aAAa,KAAK,MAAM,MAAkB,aAAa,MAAM;EACnE,MAAM,UAAU,KAAK,IAAI,aAAa,CAAC,KAAK,IAAI;AAEhD,SAAO,OAAO,MAAM,yBAAyB;AAC7C,SAAO,qBACL,MACA;GACE;GACA,MAAM,YAAY,QAAQ;GAC1B,OAAO,YAAY;GACpB,EACD,OACD;GACD,CACH;AAED,QAAO,gBAAgB,GAAG;EACxB;EACA;EACA;EACD,CAAC;EACF,CACH"}
@@ -1,15 +0,0 @@
1
- import { ErrorEnvelopePayload } from "@interfere/types/sdk/plugins/payload/errors";
2
-
3
- //#region src/core/plugins/impl/errors/logic.d.ts
4
- interface ErrorInfo {
5
- readonly colno?: number;
6
- readonly filename?: string;
7
- readonly lineno?: number;
8
- readonly message?: string;
9
- readonly name?: string;
10
- readonly stack?: string;
11
- }
12
- declare function buildErrorPayload(error: ErrorInfo): ErrorEnvelopePayload;
13
- declare function toStringSafe(a: unknown): string;
14
- //#endregion
15
- export { ErrorInfo, buildErrorPayload, toStringSafe };
@@ -1 +0,0 @@
1
- {"version":3,"file":"logic.d.mts","names":[],"sources":["../../../../../src/core/plugins/impl/errors/logic.ts"],"mappings":";;;UAMiB,SAAA;EAAA,SACN,KAAA;EAAA,SACA,QAAA;EAAA,SACA,MAAA;EAAA,SACA,OAAA;EAAA,SACA,IAAA;EAAA,SACA,KAAA;AAAA;AAAA,iBAoCK,iBAAA,CAAkB,KAAA,EAAO,SAAA,GAAY,oBAAA;AAAA,iBAqBrC,YAAA,CAAa,CAAA"}
@@ -1,48 +0,0 @@
1
- //#region src/core/plugins/impl/errors/logic.ts
2
- const STACK_TRACE_REGEX = /at\s+(?:(.+?)\s+\()?(.+?):(\d+):(\d+)\)?/;
3
- function parseStackTrace(stack) {
4
- if (!stack) return [];
5
- const lines = stack.split("\n");
6
- const frames = [];
7
- for (const line of lines) {
8
- const match = line.match(STACK_TRACE_REGEX);
9
- if (match) frames.push({
10
- file: { reported: match[2] || null },
11
- line: { reported: match[3] ? Number.parseInt(match[3], 10) : null },
12
- column: { reported: match[4] ? Number.parseInt(match[4], 10) : null },
13
- fn: { reported: match[1] || null }
14
- });
15
- }
16
- return frames.length > 0 ? frames : [{
17
- file: { reported: null },
18
- line: { reported: null },
19
- column: { reported: null },
20
- fn: { reported: null }
21
- }];
22
- }
23
- function buildErrorPayload(error) {
24
- return {
25
- frames: error.stack ? parseStackTrace(error.stack) : [{
26
- file: { reported: error.filename || null },
27
- line: { reported: error.lineno || null },
28
- column: { reported: error.colno || null },
29
- fn: { reported: null }
30
- }],
31
- message: error.message || null,
32
- name: error.name || null,
33
- stack: error.stack || null,
34
- errorSource: "client"
35
- };
36
- }
37
- function toStringSafe(a) {
38
- if (typeof a === "string") return a;
39
- if (a instanceof Error) return a.message;
40
- try {
41
- return JSON.stringify(a) ?? String(a);
42
- } catch {
43
- return String(a);
44
- }
45
- }
46
-
47
- //#endregion
48
- export { buildErrorPayload, toStringSafe };
@@ -1 +0,0 @@
1
- {"version":3,"file":"logic.mjs","names":[],"sources":["../../../../../src/core/plugins/impl/errors/logic.ts"],"sourcesContent":["import type { IngestedFrame } from \"@interfere/types/data/frame\";\nimport type { ErrorEnvelopePayload } from \"@interfere/types/sdk/plugins/payload/errors\";\n\n// Regex defined at top level for performance\nconst STACK_TRACE_REGEX = /at\\s+(?:(.+?)\\s+\\()?(.+?):(\\d+):(\\d+)\\)?/;\n\nexport interface ErrorInfo {\n readonly colno?: number;\n readonly filename?: string;\n readonly lineno?: number;\n readonly message?: string;\n readonly name?: string;\n readonly stack?: string;\n}\n\nfunction parseStackTrace(stack?: string): IngestedFrame[] {\n if (!stack) {\n return [];\n }\n\n const lines = stack.split(\"\\n\");\n const frames: IngestedFrame[] = [];\n\n for (const line of lines) {\n const match = line.match(STACK_TRACE_REGEX);\n\n if (match) {\n frames.push({\n file: { reported: match[2] || null },\n line: { reported: match[3] ? Number.parseInt(match[3], 10) : null },\n column: { reported: match[4] ? Number.parseInt(match[4], 10) : null },\n fn: { reported: match[1] || null },\n });\n }\n }\n\n return frames.length > 0\n ? frames\n : [\n {\n file: { reported: null },\n line: { reported: null },\n column: { reported: null },\n fn: { reported: null },\n },\n ];\n}\n\nexport function buildErrorPayload(error: ErrorInfo): ErrorEnvelopePayload {\n const frames = error.stack\n ? parseStackTrace(error.stack)\n : [\n {\n file: { reported: error.filename || null },\n line: { reported: error.lineno || null },\n column: { reported: error.colno || null },\n fn: { reported: null },\n },\n ];\n\n return {\n frames,\n message: error.message || null,\n name: error.name || null,\n stack: error.stack || null,\n errorSource: \"client\",\n };\n}\n\nexport function toStringSafe(a: unknown): string {\n if (typeof a === \"string\") {\n return a;\n }\n if (a instanceof Error) {\n return a.message;\n }\n try {\n const json = JSON.stringify(a);\n // JSON.stringify returns undefined for Symbol, undefined, and functions\n return json ?? String(a);\n } catch {\n return String(a);\n }\n}\n"],"mappings":";AAIA,MAAM,oBAAoB;AAW1B,SAAS,gBAAgB,OAAiC;AACxD,KAAI,CAAC,MACH,QAAO,EAAE;CAGX,MAAM,QAAQ,MAAM,MAAM,KAAK;CAC/B,MAAM,SAA0B,EAAE;AAElC,MAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,QAAQ,KAAK,MAAM,kBAAkB;AAE3C,MAAI,MACF,QAAO,KAAK;GACV,MAAM,EAAE,UAAU,MAAM,MAAM,MAAM;GACpC,MAAM,EAAE,UAAU,MAAM,KAAK,OAAO,SAAS,MAAM,IAAI,GAAG,GAAG,MAAM;GACnE,QAAQ,EAAE,UAAU,MAAM,KAAK,OAAO,SAAS,MAAM,IAAI,GAAG,GAAG,MAAM;GACrE,IAAI,EAAE,UAAU,MAAM,MAAM,MAAM;GACnC,CAAC;;AAIN,QAAO,OAAO,SAAS,IACnB,SACA,CACE;EACE,MAAM,EAAE,UAAU,MAAM;EACxB,MAAM,EAAE,UAAU,MAAM;EACxB,QAAQ,EAAE,UAAU,MAAM;EAC1B,IAAI,EAAE,UAAU,MAAM;EACvB,CACF;;AAGP,SAAgB,kBAAkB,OAAwC;AAYxE,QAAO;EACL,QAZa,MAAM,QACjB,gBAAgB,MAAM,MAAM,GAC5B,CACE;GACE,MAAM,EAAE,UAAU,MAAM,YAAY,MAAM;GAC1C,MAAM,EAAE,UAAU,MAAM,UAAU,MAAM;GACxC,QAAQ,EAAE,UAAU,MAAM,SAAS,MAAM;GACzC,IAAI,EAAE,UAAU,MAAM;GACvB,CACF;EAIH,SAAS,MAAM,WAAW;EAC1B,MAAM,MAAM,QAAQ;EACpB,OAAO,MAAM,SAAS;EACtB,aAAa;EACd;;AAGH,SAAgB,aAAa,GAAoB;AAC/C,KAAI,OAAO,MAAM,SACf,QAAO;AAET,KAAI,aAAa,MACf,QAAO,EAAE;AAEX,KAAI;AAGF,SAFa,KAAK,UAAU,EAAE,IAEf,OAAO,EAAE;SAClB;AACN,SAAO,OAAO,EAAE"}
@@ -1,13 +0,0 @@
1
- //#region src/core/plugins/impl/errors/patches.d.ts
2
- declare function patchWindowError(onError: (event: ErrorEvent) => void): () => void;
3
- declare function patchUnhandledRejection(onRejection: (event: PromiseRejectionEvent) => void): () => void;
4
- declare function patchFetch(onError: (error: unknown, args: Parameters<typeof fetch>) => void): {
5
- readonly original: typeof window.fetch;
6
- readonly cleanup: () => void;
7
- };
8
- declare function patchConsoleError(onError: (args: unknown[]) => void): {
9
- readonly original: typeof console.error;
10
- readonly cleanup: () => void;
11
- };
12
- //#endregion
13
- export { patchConsoleError, patchFetch, patchUnhandledRejection, patchWindowError };
@@ -1 +0,0 @@
1
- {"version":3,"file":"patches.d.mts","names":[],"sources":["../../../../../src/core/plugins/impl/errors/patches.ts"],"mappings":";iBAAgB,gBAAA,CACd,OAAA,GAAU,KAAA,EAAO,UAAA;AAAA,iBAOH,uBAAA,CACd,WAAA,GAAc,KAAA,EAAO,qBAAA;AAAA,iBAMP,UAAA,CACd,OAAA,GAAU,KAAA,WAAgB,IAAA,EAAM,UAAA,QAAkB,KAAA;EAAA,SACtC,QAAA,SAAiB,MAAA,CAAO,KAAA;EAAA,SAAgB,OAAA;AAAA;AAAA,iBAmBtC,iBAAA,CAAkB,OAAA,GAAU,IAAA;EAAA,SACjC,QAAA,SAAiB,OAAA,CAAQ,KAAA;EAAA,SACzB,OAAA;AAAA"}
@@ -1,43 +0,0 @@
1
- //#region src/core/plugins/impl/errors/patches.ts
2
- function patchWindowError(onError) {
3
- const handler = (e) => onError(e);
4
- window.addEventListener("error", handler, { capture: true });
5
- return () => window.removeEventListener("error", handler, { capture: true });
6
- }
7
- function patchUnhandledRejection(onRejection) {
8
- window.addEventListener("unhandledrejection", onRejection);
9
- return () => window.removeEventListener("unhandledrejection", onRejection);
10
- }
11
- function patchFetch(onError) {
12
- const originalFetch = window.fetch.bind(window);
13
- const patchedFetch = (...args) => originalFetch(...args).catch((err) => {
14
- onError(err, args);
15
- throw err;
16
- });
17
- window.fetch = patchedFetch;
18
- return {
19
- original: originalFetch,
20
- cleanup: () => {
21
- window.fetch = originalFetch;
22
- }
23
- };
24
- }
25
- function patchConsoleError(onError) {
26
- const originalConsoleError = console.error.bind(console);
27
- console.error = (...args) => {
28
- try {
29
- originalConsoleError(...args);
30
- } finally {
31
- onError(args);
32
- }
33
- };
34
- return {
35
- original: originalConsoleError,
36
- cleanup: () => {
37
- console.error = originalConsoleError;
38
- }
39
- };
40
- }
41
-
42
- //#endregion
43
- export { patchConsoleError, patchFetch, patchUnhandledRejection, patchWindowError };
@@ -1 +0,0 @@
1
- {"version":3,"file":"patches.mjs","names":[],"sources":["../../../../../src/core/plugins/impl/errors/patches.ts"],"sourcesContent":["export function patchWindowError(\n onError: (event: ErrorEvent) => void\n): () => void {\n const handler = (e: ErrorEvent) => onError(e);\n window.addEventListener(\"error\", handler, { capture: true });\n return () => window.removeEventListener(\"error\", handler, { capture: true });\n}\n\nexport function patchUnhandledRejection(\n onRejection: (event: PromiseRejectionEvent) => void\n): () => void {\n window.addEventListener(\"unhandledrejection\", onRejection);\n return () => window.removeEventListener(\"unhandledrejection\", onRejection);\n}\n\nexport function patchFetch(\n onError: (error: unknown, args: Parameters<typeof fetch>) => void\n): { readonly original: typeof window.fetch; readonly cleanup: () => void } {\n const originalFetch: typeof window.fetch = window.fetch.bind(window);\n\n const patchedFetch: typeof window.fetch = (...args) =>\n originalFetch(...args).catch((err: unknown) => {\n onError(err, args);\n throw err;\n });\n\n window.fetch = patchedFetch;\n\n return {\n original: originalFetch,\n cleanup: () => {\n window.fetch = originalFetch;\n },\n };\n}\n\nexport function patchConsoleError(onError: (args: unknown[]) => void): {\n readonly original: typeof console.error;\n readonly cleanup: () => void;\n} {\n const originalConsoleError: typeof console.error =\n console.error.bind(console);\n\n console.error = (...args: unknown[]) => {\n try {\n originalConsoleError(...(args as Parameters<typeof console.error>));\n } finally {\n onError(args);\n }\n };\n\n return {\n original: originalConsoleError,\n cleanup: () => {\n console.error = originalConsoleError as typeof console.error;\n },\n };\n}\n"],"mappings":";AAAA,SAAgB,iBACd,SACY;CACZ,MAAM,WAAW,MAAkB,QAAQ,EAAE;AAC7C,QAAO,iBAAiB,SAAS,SAAS,EAAE,SAAS,MAAM,CAAC;AAC5D,cAAa,OAAO,oBAAoB,SAAS,SAAS,EAAE,SAAS,MAAM,CAAC;;AAG9E,SAAgB,wBACd,aACY;AACZ,QAAO,iBAAiB,sBAAsB,YAAY;AAC1D,cAAa,OAAO,oBAAoB,sBAAsB,YAAY;;AAG5E,SAAgB,WACd,SAC0E;CAC1E,MAAM,gBAAqC,OAAO,MAAM,KAAK,OAAO;CAEpE,MAAM,gBAAqC,GAAG,SAC5C,cAAc,GAAG,KAAK,CAAC,OAAO,QAAiB;AAC7C,UAAQ,KAAK,KAAK;AAClB,QAAM;GACN;AAEJ,QAAO,QAAQ;AAEf,QAAO;EACL,UAAU;EACV,eAAe;AACb,UAAO,QAAQ;;EAElB;;AAGH,SAAgB,kBAAkB,SAGhC;CACA,MAAM,uBACJ,QAAQ,MAAM,KAAK,QAAQ;AAE7B,SAAQ,SAAS,GAAG,SAAoB;AACtC,MAAI;AACF,wBAAqB,GAAI,KAA0C;YAC3D;AACR,WAAQ,KAAK;;;AAIjB,QAAO;EACL,UAAU;EACV,eAAe;AACb,WAAQ,QAAQ;;EAEnB"}
@@ -1,9 +0,0 @@
1
- import { PluginDef } from "../../define-plugin.mjs";
2
-
3
- //#region src/core/plugins/impl/errors/plugin.d.ts
4
- interface ErrorsAPI {
5
- captureError: (err: unknown, meta?: Record<string, unknown>) => void;
6
- }
7
- declare const _default: PluginDef<"errors", ErrorsAPI>;
8
- //#endregion
9
- export { ErrorsAPI, _default as default };
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin.d.mts","names":[],"sources":["../../../../../src/core/plugins/impl/errors/plugin.ts"],"mappings":";;;UAciB,SAAA;EACf,YAAA,GAAe,GAAA,WAAc,IAAA,GAAO,MAAA;AAAA;AAAA,cACrC,QAAA"}
@@ -1,91 +0,0 @@
1
- import { isInterfereInternalError } from "../../../runtime/native-fetch.mjs";
2
- import { PluginRuntime } from "../../services/plugin-runtime.mjs";
3
- import { definePlugin } from "../../define-plugin.mjs";
4
- import { defineEvent } from "../../../events/define-event.mjs";
5
- import { ErrorsPluginApi, ErrorsPluginApiLayer } from "./errors-plugin-api.mjs";
6
- import { patchConsoleError, patchFetch, patchUnhandledRejection, patchWindowError } from "./patches.mjs";
7
- import { Effect } from "effect";
8
-
9
- //#region src/core/plugins/impl/errors/plugin.ts
10
- var plugin_default = definePlugin("errors", {
11
- name: "errors",
12
- events: [defineEvent("error").value()],
13
- layer: ErrorsPluginApiLayer,
14
- setup: Effect.gen(function* () {
15
- const api = yield* ErrorsPluginApi;
16
- const runtime = yield* PluginRuntime;
17
- if (typeof window === "undefined") return {};
18
- const apiPublic = { captureError: (err, meta) => {
19
- if (isInterfereInternalError(err)) return;
20
- const errorInfo = err instanceof Error ? {
21
- message: err.message,
22
- stack: err.stack,
23
- name: err.name
24
- } : {
25
- message: String(err),
26
- name: "UnknownError"
27
- };
28
- runtime.fork(api.captureErrorInfoOnce("plugin.error.capture", errorInfo, meta));
29
- } };
30
- const errorHandler = (event) => {
31
- if (isInterfereInternalError(event.error)) return;
32
- runtime.fork(api.captureErrorInfoOnce("plugin.error.window", {
33
- message: event.message,
34
- stack: event.error?.stack,
35
- filename: event.filename,
36
- lineno: event.lineno,
37
- colno: event.colno,
38
- name: event.error?.name
39
- }, void 0));
40
- };
41
- const rejectionHandler = (event) => {
42
- const reason = event.reason;
43
- if (isInterfereInternalError(reason)) return;
44
- runtime.fork(api.captureErrorInfoOnce("plugin.error.rejection", reason instanceof Error ? {
45
- message: `Unhandled Promise Rejection: ${reason.message}`,
46
- stack: reason.stack,
47
- name: reason.name
48
- } : {
49
- message: `Unhandled Promise Rejection: ${String(reason)}`,
50
- name: "UnhandledRejection"
51
- }, void 0));
52
- };
53
- const fetchPatch = patchFetch((err) => {
54
- if (isInterfereInternalError(err)) throw err;
55
- runtime.fork(api.captureErrorInfoOnce("plugin.error.fetch", err instanceof Error ? {
56
- message: `Fetch failed: ${err.message}`,
57
- stack: err.stack,
58
- name: err.name
59
- } : {
60
- message: `Fetch failed: ${String(err)}`,
61
- name: "FetchError"
62
- }, void 0));
63
- });
64
- let inConsoleCapture = false;
65
- const consolePatch = patchConsoleError((args) => {
66
- if (inConsoleCapture) return;
67
- inConsoleCapture = true;
68
- try {
69
- const firstError = args.find((a) => a instanceof Error);
70
- if (firstError && isInterfereInternalError(firstError)) return;
71
- runtime.fork(api.captureConsoleArgsOnce("plugin.error.console_error", args));
72
- } finally {
73
- inConsoleCapture = false;
74
- }
75
- });
76
- const cleanupWindowError = patchWindowError(errorHandler);
77
- const cleanupRejection = patchUnhandledRejection(rejectionHandler);
78
- return {
79
- api: apiPublic,
80
- cleanup: () => {
81
- cleanupWindowError();
82
- cleanupRejection();
83
- fetchPatch.cleanup();
84
- consolePatch.cleanup();
85
- }
86
- };
87
- }).pipe(Effect.withSpan("plugins.errors.setup"))
88
- });
89
-
90
- //#endregion
91
- export { plugin_default as default };
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin.mjs","names":[],"sources":["../../../../../src/core/plugins/impl/errors/plugin.ts"],"sourcesContent":["import { Effect } from \"effect\";\n\nimport { defineEvent } from \"../../../events/define-event.js\";\nimport { isInterfereInternalError } from \"../../../runtime/native-fetch.js\";\nimport { definePlugin } from \"../../define-plugin.js\";\nimport { PluginRuntime } from \"../../services/plugin-runtime.js\";\nimport { ErrorsPluginApi, ErrorsPluginApiLayer } from \"./errors-plugin-api.js\";\nimport {\n patchConsoleError,\n patchFetch,\n patchUnhandledRejection,\n patchWindowError,\n} from \"./patches.js\";\n\nexport interface ErrorsAPI {\n captureError: (err: unknown, meta?: Record<string, unknown>) => void;\n}\n\nexport default definePlugin(\"errors\", {\n name: \"errors\",\n events: [defineEvent(\"error\").value()],\n layer: ErrorsPluginApiLayer,\n setup: Effect.gen(function* () {\n const api = yield* ErrorsPluginApi;\n const runtime = yield* PluginRuntime;\n\n if (typeof window === \"undefined\") {\n return {};\n }\n\n const apiPublic: ErrorsAPI = {\n captureError: (err, meta) => {\n if (isInterfereInternalError(err)) {\n return;\n }\n\n const errorInfo =\n err instanceof Error\n ? { message: err.message, stack: err.stack, name: err.name }\n : { message: String(err), name: \"UnknownError\" };\n runtime.fork(\n api.captureErrorInfoOnce(\"plugin.error.capture\", errorInfo, meta)\n );\n },\n };\n\n const errorHandler = (event: ErrorEvent) => {\n if (isInterfereInternalError(event.error)) {\n return;\n }\n\n runtime.fork(\n api.captureErrorInfoOnce(\n \"plugin.error.window\",\n {\n message: event.message,\n stack: event.error?.stack,\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n name: event.error?.name,\n },\n undefined\n )\n );\n };\n\n const rejectionHandler = (event: PromiseRejectionEvent) => {\n const reason = event.reason;\n\n if (isInterfereInternalError(reason)) {\n return;\n }\n\n runtime.fork(\n api.captureErrorInfoOnce(\n \"plugin.error.rejection\",\n reason instanceof Error\n ? {\n message: `Unhandled Promise Rejection: ${reason.message}`,\n stack: reason.stack,\n name: reason.name,\n }\n : {\n message: `Unhandled Promise Rejection: ${String(reason)}`,\n name: \"UnhandledRejection\",\n },\n undefined\n )\n );\n };\n\n const fetchPatch = patchFetch((err) => {\n if (isInterfereInternalError(err)) {\n throw err;\n }\n\n runtime.fork(\n api.captureErrorInfoOnce(\n \"plugin.error.fetch\",\n err instanceof Error\n ? {\n message: `Fetch failed: ${err.message}`,\n stack: err.stack,\n name: err.name,\n }\n : { message: `Fetch failed: ${String(err)}`, name: \"FetchError\" },\n undefined\n )\n );\n });\n\n let inConsoleCapture = false;\n const consolePatch = patchConsoleError((args) => {\n if (inConsoleCapture) {\n return;\n }\n\n inConsoleCapture = true;\n try {\n const firstError = args.find((a): a is Error => a instanceof Error);\n if (firstError && isInterfereInternalError(firstError)) {\n return;\n }\n runtime.fork(\n api.captureConsoleArgsOnce(\"plugin.error.console_error\", args)\n );\n } finally {\n inConsoleCapture = false;\n }\n });\n\n const cleanupWindowError = patchWindowError(errorHandler);\n const cleanupRejection = patchUnhandledRejection(rejectionHandler);\n\n return {\n api: apiPublic,\n cleanup: () => {\n cleanupWindowError();\n cleanupRejection();\n fetchPatch.cleanup();\n consolePatch.cleanup();\n },\n };\n }).pipe(Effect.withSpan(\"plugins.errors.setup\")),\n});\n"],"mappings":";;;;;;;;;AAkBA,qBAAe,aAAa,UAAU;CACpC,MAAM;CACN,QAAQ,CAAC,YAAY,QAAQ,CAAC,OAAO,CAAC;CACtC,OAAO;CACP,OAAO,OAAO,IAAI,aAAa;EAC7B,MAAM,MAAM,OAAO;EACnB,MAAM,UAAU,OAAO;AAEvB,MAAI,OAAO,WAAW,YACpB,QAAO,EAAE;EAGX,MAAM,YAAuB,EAC3B,eAAe,KAAK,SAAS;AAC3B,OAAI,yBAAyB,IAAI,CAC/B;GAGF,MAAM,YACJ,eAAe,QACX;IAAE,SAAS,IAAI;IAAS,OAAO,IAAI;IAAO,MAAM,IAAI;IAAM,GAC1D;IAAE,SAAS,OAAO,IAAI;IAAE,MAAM;IAAgB;AACpD,WAAQ,KACN,IAAI,qBAAqB,wBAAwB,WAAW,KAAK,CAClE;KAEJ;EAED,MAAM,gBAAgB,UAAsB;AAC1C,OAAI,yBAAyB,MAAM,MAAM,CACvC;AAGF,WAAQ,KACN,IAAI,qBACF,uBACA;IACE,SAAS,MAAM;IACf,OAAO,MAAM,OAAO;IACpB,UAAU,MAAM;IAChB,QAAQ,MAAM;IACd,OAAO,MAAM;IACb,MAAM,MAAM,OAAO;IACpB,EACD,OACD,CACF;;EAGH,MAAM,oBAAoB,UAAiC;GACzD,MAAM,SAAS,MAAM;AAErB,OAAI,yBAAyB,OAAO,CAClC;AAGF,WAAQ,KACN,IAAI,qBACF,0BACA,kBAAkB,QACd;IACE,SAAS,gCAAgC,OAAO;IAChD,OAAO,OAAO;IACd,MAAM,OAAO;IACd,GACD;IACE,SAAS,gCAAgC,OAAO,OAAO;IACvD,MAAM;IACP,EACL,OACD,CACF;;EAGH,MAAM,aAAa,YAAY,QAAQ;AACrC,OAAI,yBAAyB,IAAI,CAC/B,OAAM;AAGR,WAAQ,KACN,IAAI,qBACF,sBACA,eAAe,QACX;IACE,SAAS,iBAAiB,IAAI;IAC9B,OAAO,IAAI;IACX,MAAM,IAAI;IACX,GACD;IAAE,SAAS,iBAAiB,OAAO,IAAI;IAAI,MAAM;IAAc,EACnE,OACD,CACF;IACD;EAEF,IAAI,mBAAmB;EACvB,MAAM,eAAe,mBAAmB,SAAS;AAC/C,OAAI,iBACF;AAGF,sBAAmB;AACnB,OAAI;IACF,MAAM,aAAa,KAAK,MAAM,MAAkB,aAAa,MAAM;AACnE,QAAI,cAAc,yBAAyB,WAAW,CACpD;AAEF,YAAQ,KACN,IAAI,uBAAuB,8BAA8B,KAAK,CAC/D;aACO;AACR,uBAAmB;;IAErB;EAEF,MAAM,qBAAqB,iBAAiB,aAAa;EACzD,MAAM,mBAAmB,wBAAwB,iBAAiB;AAElE,SAAO;GACL,KAAK;GACL,eAAe;AACb,wBAAoB;AACpB,sBAAkB;AAClB,eAAW,SAAS;AACpB,iBAAa,SAAS;;GAEzB;GACD,CAAC,KAAK,OAAO,SAAS,uBAAuB,CAAC;CACjD,CAAC"}
@@ -1,19 +0,0 @@
1
- import { EventPayload } from "../../../events/event-registry.mjs";
2
- import { EventCapture } from "../../services/event-capture.mjs";
3
- import { PluginLogger } from "../../services/plugin-logger.mjs";
4
- import { Context, Effect, Layer } from "effect";
5
-
6
- //#region src/core/plugins/impl/page-events/page-events-plugin-api.d.ts
7
- type PageviewPayload = EventPayload<"pageview">;
8
- type PageleavePayload = EventPayload<"pageleave">;
9
- type UiEventPayload = EventPayload<"ui_event">;
10
- interface PageEventsPluginApiService {
11
- readonly onPageLeave: (payload: PageleavePayload) => Effect.Effect<void>;
12
- readonly onPageView: (payload: PageviewPayload) => Effect.Effect<void>;
13
- readonly onUiEvent: (payload: UiEventPayload) => Effect.Effect<void>;
14
- }
15
- declare const PageEventsPluginApi_base: Context.TagClass<PageEventsPluginApi, "@interfere/plugins/page-events/PageEventsPluginApi", PageEventsPluginApiService>;
16
- declare class PageEventsPluginApi extends PageEventsPluginApi_base {}
17
- declare const PageEventsPluginApiLayer: Layer.Layer<PageEventsPluginApi, never, EventCapture | PluginLogger>;
18
- //#endregion
19
- export { PageEventsPluginApi, PageEventsPluginApiLayer };
@@ -1 +0,0 @@
1
- {"version":3,"file":"page-events-plugin-api.d.mts","names":[],"sources":["../../../../../src/core/plugins/impl/page-events/page-events-plugin-api.ts"],"mappings":";;;;;;KAMK,eAAA,GAAkB,YAAA;AAAA,KAClB,gBAAA,GAAmB,YAAA;AAAA,KACnB,cAAA,GAAiB,YAAA;AAAA,UAEZ,0BAAA;EAAA,SACC,WAAA,GAAc,OAAA,EAAS,gBAAA,KAAqB,MAAA,CAAO,MAAA;EAAA,SACnD,UAAA,GAAa,OAAA,EAAS,eAAA,KAAoB,MAAA,CAAO,MAAA;EAAA,SACjD,SAAA,GAAY,OAAA,EAAS,cAAA,KAAmB,MAAA,CAAO,MAAA;AAAA;AAAA,cAAM,wBAAA;cAGnD,mBAAA,SAA4B,wBAAA;AAAA,cAI5B,wBAAA,EAAwB,KAAA,CAAA,KAAA,CAAA,mBAAA,SAAA,YAAA,GAAA,YAAA"}
@@ -1,38 +0,0 @@
1
- import { EventCapture } from "../../services/event-capture.mjs";
2
- import { PluginLogger } from "../../services/plugin-logger.mjs";
3
- import { Context, Effect, Layer, Ref } from "effect";
4
-
5
- //#region src/core/plugins/impl/page-events/page-events-plugin-api.ts
6
- var PageEventsPluginApi = class extends Context.Tag("@interfere/plugins/page-events/PageEventsPluginApi")() {};
7
- const PageEventsPluginApiLayer = Layer.effect(PageEventsPluginApi, Effect.gen(function* () {
8
- const capture = yield* EventCapture;
9
- const logger = yield* PluginLogger;
10
- const lastKeyRef = yield* Ref.make(null);
11
- const shouldRunForKey = (key) => Ref.modify(lastKeyRef, (lastKey) => {
12
- if (lastKey === key) return [false, lastKey];
13
- return [true, key];
14
- });
15
- const onPageView = Effect.fn("PageEventsPluginApi.onPageView")((payload) => Effect.gen(function* () {
16
- yield* logger.trace("Page view");
17
- if (!(yield* shouldRunForKey(`pageview:${payload.url}`))) return;
18
- yield* capture.capture("pageview", payload).pipe(Effect.withSpan("plugin.page_events.pageview"));
19
- }));
20
- const onPageLeave = Effect.fn("PageEventsPluginApi.onPageLeave")((payload) => Effect.gen(function* () {
21
- yield* logger.trace("Page leave");
22
- if (!(yield* shouldRunForKey(`pageleave:${payload.url}`))) return;
23
- yield* capture.capture("pageleave", payload).pipe(Effect.withSpan("plugin.page_events.pageleave"));
24
- }));
25
- const onUiEvent = Effect.fn("PageEventsPluginApi.onUiEvent")((payload) => Effect.gen(function* () {
26
- const event = payload.event;
27
- if (!(yield* shouldRunForKey(`ui_event:${event.selector}:${event.text ?? ""}`))) return;
28
- yield* capture.capture("ui_event", payload).pipe(Effect.withSpan("plugin.page_events.ui_event"));
29
- }));
30
- return PageEventsPluginApi.of({
31
- onPageView,
32
- onPageLeave,
33
- onUiEvent
34
- });
35
- }));
36
-
37
- //#endregion
38
- export { PageEventsPluginApi, PageEventsPluginApiLayer };
@@ -1 +0,0 @@
1
- {"version":3,"file":"page-events-plugin-api.mjs","names":[],"sources":["../../../../../src/core/plugins/impl/page-events/page-events-plugin-api.ts"],"sourcesContent":["import { Context, Effect, Layer, Ref } from \"effect\";\n\nimport type { EventPayload } from \"../../../events/event-registry.js\";\nimport { EventCapture } from \"../../services/event-capture.js\";\nimport { PluginLogger } from \"../../services/plugin-logger.js\";\n\ntype PageviewPayload = EventPayload<\"pageview\">;\ntype PageleavePayload = EventPayload<\"pageleave\">;\ntype UiEventPayload = EventPayload<\"ui_event\">;\n\ninterface PageEventsPluginApiService {\n readonly onPageLeave: (payload: PageleavePayload) => Effect.Effect<void>;\n readonly onPageView: (payload: PageviewPayload) => Effect.Effect<void>;\n readonly onUiEvent: (payload: UiEventPayload) => Effect.Effect<void>;\n}\n\nexport class PageEventsPluginApi extends Context.Tag(\n \"@interfere/plugins/page-events/PageEventsPluginApi\"\n)<PageEventsPluginApi, PageEventsPluginApiService>() {}\n\nexport const PageEventsPluginApiLayer = Layer.effect(\n PageEventsPluginApi,\n Effect.gen(function* () {\n const capture = yield* EventCapture;\n const logger = yield* PluginLogger;\n\n const lastKeyRef = yield* Ref.make<string | null>(null);\n\n const shouldRunForKey = (key: string) =>\n Ref.modify(lastKeyRef, (lastKey) => {\n if (lastKey === key) {\n return [false, lastKey] as const;\n }\n\n return [true, key] as const;\n });\n\n const onPageView = Effect.fn(\"PageEventsPluginApi.onPageView\")(\n (payload: PageviewPayload) =>\n Effect.gen(function* () {\n yield* logger.trace(\"Page view\");\n\n const shouldRun = yield* shouldRunForKey(`pageview:${payload.url}`);\n if (!shouldRun) {\n return;\n }\n\n yield* capture\n .capture(\"pageview\", payload)\n .pipe(Effect.withSpan(\"plugin.page_events.pageview\"));\n })\n );\n\n const onPageLeave = Effect.fn(\"PageEventsPluginApi.onPageLeave\")(\n (payload: PageleavePayload) =>\n Effect.gen(function* () {\n yield* logger.trace(\"Page leave\");\n\n const shouldRun = yield* shouldRunForKey(`pageleave:${payload.url}`);\n if (!shouldRun) {\n return;\n }\n\n yield* capture\n .capture(\"pageleave\", payload)\n .pipe(Effect.withSpan(\"plugin.page_events.pageleave\"));\n })\n );\n\n const onUiEvent = Effect.fn(\"PageEventsPluginApi.onUiEvent\")(\n (payload: UiEventPayload) =>\n Effect.gen(function* () {\n const event = payload.event;\n const key = `ui_event:${event.selector}:${event.text ?? \"\"}`;\n\n const shouldRun = yield* shouldRunForKey(key);\n if (!shouldRun) {\n return;\n }\n\n yield* capture\n .capture(\"ui_event\", payload)\n .pipe(Effect.withSpan(\"plugin.page_events.ui_event\"));\n })\n );\n\n return PageEventsPluginApi.of({\n onPageView,\n onPageLeave,\n onUiEvent,\n });\n })\n);\n"],"mappings":";;;;;AAgBA,IAAa,sBAAb,cAAyC,QAAQ,IAC/C,qDACD,EAAmD,CAAC;AAErD,MAAa,2BAA2B,MAAM,OAC5C,qBACA,OAAO,IAAI,aAAa;CACtB,MAAM,UAAU,OAAO;CACvB,MAAM,SAAS,OAAO;CAEtB,MAAM,aAAa,OAAO,IAAI,KAAoB,KAAK;CAEvD,MAAM,mBAAmB,QACvB,IAAI,OAAO,aAAa,YAAY;AAClC,MAAI,YAAY,IACd,QAAO,CAAC,OAAO,QAAQ;AAGzB,SAAO,CAAC,MAAM,IAAI;GAClB;CAEJ,MAAM,aAAa,OAAO,GAAG,iCAAiC,EAC3D,YACC,OAAO,IAAI,aAAa;AACtB,SAAO,OAAO,MAAM,YAAY;AAGhC,MAAI,EADc,OAAO,gBAAgB,YAAY,QAAQ,MAAM,EAEjE;AAGF,SAAO,QACJ,QAAQ,YAAY,QAAQ,CAC5B,KAAK,OAAO,SAAS,8BAA8B,CAAC;GACvD,CACL;CAED,MAAM,cAAc,OAAO,GAAG,kCAAkC,EAC7D,YACC,OAAO,IAAI,aAAa;AACtB,SAAO,OAAO,MAAM,aAAa;AAGjC,MAAI,EADc,OAAO,gBAAgB,aAAa,QAAQ,MAAM,EAElE;AAGF,SAAO,QACJ,QAAQ,aAAa,QAAQ,CAC7B,KAAK,OAAO,SAAS,+BAA+B,CAAC;GACxD,CACL;CAED,MAAM,YAAY,OAAO,GAAG,gCAAgC,EACzD,YACC,OAAO,IAAI,aAAa;EACtB,MAAM,QAAQ,QAAQ;AAItB,MAAI,EADc,OAAO,gBAFb,YAAY,MAAM,SAAS,GAAG,MAAM,QAAQ,KAEX,EAE3C;AAGF,SAAO,QACJ,QAAQ,YAAY,QAAQ,CAC5B,KAAK,OAAO,SAAS,8BAA8B,CAAC;GACvD,CACL;AAED,QAAO,oBAAoB,GAAG;EAC5B;EACA;EACA;EACD,CAAC;EACF,CACH"}
@@ -1,6 +0,0 @@
1
- import { PluginDef } from "../../define-plugin.mjs";
2
-
3
- //#region src/core/plugins/impl/page-events/plugin.d.ts
4
- declare const _default: PluginDef<"pageEvents", unknown>;
5
- //#endregion
6
- export { _default as default };
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin.d.mts","names":[],"sources":["../../../../../src/core/plugins/impl/page-events/plugin.ts"],"mappings":""}
@@ -1,95 +0,0 @@
1
- import { PluginRuntime } from "../../services/plugin-runtime.mjs";
2
- import { definePlugin } from "../../define-plugin.mjs";
3
- import { getElementSelector, getElementText } from "../../dom-utils.mjs";
4
- import { defineEvent } from "../../../events/define-event.mjs";
5
- import { PageEventsPluginApi, PageEventsPluginApiLayer } from "./page-events-plugin-api.mjs";
6
- import { Effect } from "effect";
7
-
8
- //#region src/core/plugins/impl/page-events/plugin.ts
9
- const TRUNCATE_LENGTH = 100;
10
- var plugin_default = definePlugin("pageEvents", {
11
- name: "page-events",
12
- events: [
13
- defineEvent("pageview").value(),
14
- defineEvent("pageleave").value(),
15
- defineEvent("ui_event").value()
16
- ],
17
- layer: PageEventsPluginApiLayer,
18
- setup: Effect.gen(function* () {
19
- const api = yield* PageEventsPluginApi;
20
- const runtime = yield* PluginRuntime;
21
- if (typeof window === "undefined") return {};
22
- const handlePageView = () => {
23
- const url = window.location.href;
24
- const title = document.title;
25
- runtime.fork(api.onPageView({
26
- url,
27
- title
28
- }));
29
- };
30
- const handlePageLeave = () => {
31
- const url = window.location.href;
32
- const duration = performance.now();
33
- runtime.fork(api.onPageLeave({
34
- url,
35
- durationMs: Math.round(duration)
36
- }));
37
- };
38
- const isInteractiveElement = (element) => {
39
- const isInteractiveTag = [
40
- "BUTTON",
41
- "A",
42
- "INPUT",
43
- "SELECT",
44
- "TEXTAREA"
45
- ].includes(element.tagName);
46
- const hasClickHandler = element.onclick !== null;
47
- const hasRole = element.getAttribute("role") === "button";
48
- return isInteractiveTag || hasClickHandler || hasRole;
49
- };
50
- const handleUIEvent = (event) => {
51
- const target = event.target;
52
- if (!isInteractiveElement(target)) return;
53
- const selector = getElementSelector(target);
54
- const text = getElementText(target);
55
- runtime.fork(api.onUiEvent({ event: {
56
- type: "click",
57
- selector,
58
- text: text ? text.substring(0, TRUNCATE_LENGTH) : void 0,
59
- url: window.location.href,
60
- timestamp: Date.now()
61
- } }));
62
- };
63
- handlePageView();
64
- const originalPushState = history.pushState;
65
- const originalReplaceState = history.replaceState;
66
- history.pushState = (...args) => {
67
- const result = originalPushState.apply(history, args);
68
- handlePageView();
69
- return result;
70
- };
71
- history.replaceState = (...args) => {
72
- const result = originalReplaceState.apply(history, args);
73
- handlePageView();
74
- return result;
75
- };
76
- window.addEventListener("popstate", handlePageView);
77
- window.addEventListener("beforeunload", handlePageLeave);
78
- const onVisibility = () => {
79
- if (document.visibilityState === "hidden") handlePageLeave();
80
- };
81
- document.addEventListener("visibilitychange", onVisibility);
82
- document.addEventListener("click", handleUIEvent, true);
83
- return { cleanup: () => {
84
- history.pushState = originalPushState;
85
- history.replaceState = originalReplaceState;
86
- window.removeEventListener("popstate", handlePageView);
87
- window.removeEventListener("beforeunload", handlePageLeave);
88
- document.removeEventListener("visibilitychange", onVisibility);
89
- document.removeEventListener("click", handleUIEvent, true);
90
- } };
91
- }).pipe(Effect.withSpan("plugins.pageEvents.setup"))
92
- });
93
-
94
- //#endregion
95
- export { plugin_default as default };
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin.mjs","names":[],"sources":["../../../../../src/core/plugins/impl/page-events/plugin.ts"],"sourcesContent":["import { Effect } from \"effect\";\n\nimport { defineEvent } from \"../../../events/define-event.js\";\nimport { definePlugin } from \"../../define-plugin.js\";\nimport { getElementSelector, getElementText } from \"../../dom-utils.js\";\nimport { PluginRuntime } from \"../../services/plugin-runtime.js\";\nimport {\n PageEventsPluginApi,\n PageEventsPluginApiLayer,\n} from \"./page-events-plugin-api.js\";\n\nconst TRUNCATE_LENGTH = 100;\n\nexport default definePlugin(\"pageEvents\", {\n name: \"page-events\",\n events: [\n defineEvent(\"pageview\").value(),\n defineEvent(\"pageleave\").value(),\n defineEvent(\"ui_event\").value(),\n ],\n layer: PageEventsPluginApiLayer,\n setup: Effect.gen(function* () {\n const api = yield* PageEventsPluginApi;\n const runtime = yield* PluginRuntime;\n\n if (typeof window === \"undefined\") {\n return {};\n }\n\n const handlePageView = () => {\n const url = window.location.href;\n const title = document.title;\n runtime.fork(api.onPageView({ url, title }));\n };\n\n const handlePageLeave = () => {\n const url = window.location.href;\n const duration = performance.now();\n runtime.fork(api.onPageLeave({ url, durationMs: Math.round(duration) }));\n };\n\n const isInteractiveElement = (element: HTMLElement): boolean => {\n const interactiveTags = [\"BUTTON\", \"A\", \"INPUT\", \"SELECT\", \"TEXTAREA\"];\n const isInteractiveTag = interactiveTags.includes(element.tagName);\n const hasClickHandler = element.onclick !== null;\n const hasRole = element.getAttribute(\"role\") === \"button\";\n\n return isInteractiveTag || hasClickHandler || hasRole;\n };\n\n const handleUIEvent = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n\n if (!isInteractiveElement(target)) {\n return;\n }\n\n const selector = getElementSelector(target);\n const text = getElementText(target);\n\n runtime.fork(\n api.onUiEvent({\n event: {\n type: \"click\",\n selector,\n text: text ? text.substring(0, TRUNCATE_LENGTH) : undefined,\n url: window.location.href,\n timestamp: Date.now(),\n },\n })\n );\n };\n\n handlePageView();\n\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n\n history.pushState = (...args) => {\n const result = originalPushState.apply(history, args);\n handlePageView();\n return result;\n };\n\n history.replaceState = (...args) => {\n const result = originalReplaceState.apply(history, args);\n handlePageView();\n return result;\n };\n\n window.addEventListener(\"popstate\", handlePageView);\n window.addEventListener(\"beforeunload\", handlePageLeave);\n\n const onVisibility = () => {\n if (document.visibilityState === \"hidden\") {\n handlePageLeave();\n }\n };\n document.addEventListener(\"visibilitychange\", onVisibility);\n\n document.addEventListener(\"click\", handleUIEvent, true);\n\n return {\n cleanup: () => {\n history.pushState = originalPushState;\n history.replaceState = originalReplaceState;\n window.removeEventListener(\"popstate\", handlePageView);\n window.removeEventListener(\"beforeunload\", handlePageLeave);\n document.removeEventListener(\"visibilitychange\", onVisibility);\n document.removeEventListener(\"click\", handleUIEvent, true);\n },\n };\n }).pipe(Effect.withSpan(\"plugins.pageEvents.setup\")),\n});\n"],"mappings":";;;;;;;;AAWA,MAAM,kBAAkB;AAExB,qBAAe,aAAa,cAAc;CACxC,MAAM;CACN,QAAQ;EACN,YAAY,WAAW,CAAC,OAAO;EAC/B,YAAY,YAAY,CAAC,OAAO;EAChC,YAAY,WAAW,CAAC,OAAO;EAChC;CACD,OAAO;CACP,OAAO,OAAO,IAAI,aAAa;EAC7B,MAAM,MAAM,OAAO;EACnB,MAAM,UAAU,OAAO;AAEvB,MAAI,OAAO,WAAW,YACpB,QAAO,EAAE;EAGX,MAAM,uBAAuB;GAC3B,MAAM,MAAM,OAAO,SAAS;GAC5B,MAAM,QAAQ,SAAS;AACvB,WAAQ,KAAK,IAAI,WAAW;IAAE;IAAK;IAAO,CAAC,CAAC;;EAG9C,MAAM,wBAAwB;GAC5B,MAAM,MAAM,OAAO,SAAS;GAC5B,MAAM,WAAW,YAAY,KAAK;AAClC,WAAQ,KAAK,IAAI,YAAY;IAAE;IAAK,YAAY,KAAK,MAAM,SAAS;IAAE,CAAC,CAAC;;EAG1E,MAAM,wBAAwB,YAAkC;GAE9D,MAAM,mBADkB;IAAC;IAAU;IAAK;IAAS;IAAU;IAAW,CAC7B,SAAS,QAAQ,QAAQ;GAClE,MAAM,kBAAkB,QAAQ,YAAY;GAC5C,MAAM,UAAU,QAAQ,aAAa,OAAO,KAAK;AAEjD,UAAO,oBAAoB,mBAAmB;;EAGhD,MAAM,iBAAiB,UAAsB;GAC3C,MAAM,SAAS,MAAM;AAErB,OAAI,CAAC,qBAAqB,OAAO,CAC/B;GAGF,MAAM,WAAW,mBAAmB,OAAO;GAC3C,MAAM,OAAO,eAAe,OAAO;AAEnC,WAAQ,KACN,IAAI,UAAU,EACZ,OAAO;IACL,MAAM;IACN;IACA,MAAM,OAAO,KAAK,UAAU,GAAG,gBAAgB,GAAG;IAClD,KAAK,OAAO,SAAS;IACrB,WAAW,KAAK,KAAK;IACtB,EACF,CAAC,CACH;;AAGH,kBAAgB;EAEhB,MAAM,oBAAoB,QAAQ;EAClC,MAAM,uBAAuB,QAAQ;AAErC,UAAQ,aAAa,GAAG,SAAS;GAC/B,MAAM,SAAS,kBAAkB,MAAM,SAAS,KAAK;AACrD,mBAAgB;AAChB,UAAO;;AAGT,UAAQ,gBAAgB,GAAG,SAAS;GAClC,MAAM,SAAS,qBAAqB,MAAM,SAAS,KAAK;AACxD,mBAAgB;AAChB,UAAO;;AAGT,SAAO,iBAAiB,YAAY,eAAe;AACnD,SAAO,iBAAiB,gBAAgB,gBAAgB;EAExD,MAAM,qBAAqB;AACzB,OAAI,SAAS,oBAAoB,SAC/B,kBAAiB;;AAGrB,WAAS,iBAAiB,oBAAoB,aAAa;AAE3D,WAAS,iBAAiB,SAAS,eAAe,KAAK;AAEvD,SAAO,EACL,eAAe;AACb,WAAQ,YAAY;AACpB,WAAQ,eAAe;AACvB,UAAO,oBAAoB,YAAY,eAAe;AACtD,UAAO,oBAAoB,gBAAgB,gBAAgB;AAC3D,YAAS,oBAAoB,oBAAoB,aAAa;AAC9D,YAAS,oBAAoB,SAAS,eAAe,KAAK;KAE7D;GACD,CAAC,KAAK,OAAO,SAAS,2BAA2B,CAAC;CACrD,CAAC"}
@@ -1,6 +0,0 @@
1
- import { PluginDef } from "../../define-plugin.mjs";
2
-
3
- //#region src/core/plugins/impl/rage-click/plugin.d.ts
4
- declare const _default: PluginDef<"rageClick", unknown>;
5
- //#endregion
6
- export { _default as default };
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin.d.mts","names":[],"sources":["../../../../../src/core/plugins/impl/rage-click/plugin.ts"],"mappings":""}
@@ -1,38 +0,0 @@
1
- import { PluginRuntime } from "../../services/plugin-runtime.mjs";
2
- import { definePlugin } from "../../define-plugin.mjs";
3
- import { getElementSelector } from "../../dom-utils.mjs";
4
- import { defineEvent } from "../../../events/define-event.mjs";
5
- import { RageClickService } from "./rage-click.service.mjs";
6
- import { RageClickLive } from "./rage-click.layer.mjs";
7
- import { Effect } from "effect";
8
-
9
- //#region src/core/plugins/impl/rage-click/plugin.ts
10
- const TRUNCATE_LENGTH = 100;
11
- var plugin_default = definePlugin("rageClick", {
12
- name: "rage-click",
13
- events: [defineEvent("rage_click").value()],
14
- layer: RageClickLive,
15
- setup: Effect.gen(function* () {
16
- const service = yield* RageClickService;
17
- const runtime = yield* PluginRuntime;
18
- if (typeof window === "undefined") return {};
19
- const handleClick = (event) => {
20
- const now = Date.now();
21
- const target = event.target;
22
- runtime.fork(service.onClick({
23
- now,
24
- x: event.clientX,
25
- y: event.clientY,
26
- selector: target ? getElementSelector(target) : "unknown",
27
- text: target?.textContent?.substring(0, TRUNCATE_LENGTH) || ""
28
- }));
29
- };
30
- window.addEventListener("click", handleClick, true);
31
- return { cleanup: () => {
32
- window.removeEventListener("click", handleClick, true);
33
- } };
34
- }).pipe(Effect.withSpan("plugins.rageClick.setup"))
35
- });
36
-
37
- //#endregion
38
- export { plugin_default as default };
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin.mjs","names":[],"sources":["../../../../../src/core/plugins/impl/rage-click/plugin.ts"],"sourcesContent":["import { Effect } from \"effect\";\n\nimport { defineEvent } from \"../../../events/define-event.js\";\nimport { definePlugin } from \"../../define-plugin.js\";\nimport { getElementSelector } from \"../../dom-utils.js\";\nimport { PluginRuntime } from \"../../services/plugin-runtime.js\";\nimport { RageClickLive } from \"./rage-click.layer.js\";\nimport { RageClickService } from \"./rage-click.service.js\";\n\nconst TRUNCATE_LENGTH = 100;\n\nexport default definePlugin(\"rageClick\", {\n name: \"rage-click\",\n events: [defineEvent(\"rage_click\").value()],\n layer: RageClickLive,\n setup: Effect.gen(function* () {\n const service = yield* RageClickService;\n const runtime = yield* PluginRuntime;\n\n if (typeof window === \"undefined\") {\n return {};\n }\n\n const handleClick = (event: MouseEvent) => {\n const now = Date.now();\n const target = event.target as Element | null;\n runtime.fork(\n service.onClick({\n now,\n x: event.clientX,\n y: event.clientY,\n selector: target ? getElementSelector(target) : \"unknown\",\n text: target?.textContent?.substring(0, TRUNCATE_LENGTH) || \"\",\n })\n );\n };\n\n window.addEventListener(\"click\", handleClick, true);\n\n return {\n cleanup: () => {\n window.removeEventListener(\"click\", handleClick, true);\n },\n };\n }).pipe(Effect.withSpan(\"plugins.rageClick.setup\")),\n});\n"],"mappings":";;;;;;;;;AASA,MAAM,kBAAkB;AAExB,qBAAe,aAAa,aAAa;CACvC,MAAM;CACN,QAAQ,CAAC,YAAY,aAAa,CAAC,OAAO,CAAC;CAC3C,OAAO;CACP,OAAO,OAAO,IAAI,aAAa;EAC7B,MAAM,UAAU,OAAO;EACvB,MAAM,UAAU,OAAO;AAEvB,MAAI,OAAO,WAAW,YACpB,QAAO,EAAE;EAGX,MAAM,eAAe,UAAsB;GACzC,MAAM,MAAM,KAAK,KAAK;GACtB,MAAM,SAAS,MAAM;AACrB,WAAQ,KACN,QAAQ,QAAQ;IACd;IACA,GAAG,MAAM;IACT,GAAG,MAAM;IACT,UAAU,SAAS,mBAAmB,OAAO,GAAG;IAChD,MAAM,QAAQ,aAAa,UAAU,GAAG,gBAAgB,IAAI;IAC7D,CAAC,CACH;;AAGH,SAAO,iBAAiB,SAAS,aAAa,KAAK;AAEnD,SAAO,EACL,eAAe;AACb,UAAO,oBAAoB,SAAS,aAAa,KAAK;KAEzD;GACD,CAAC,KAAK,OAAO,SAAS,0BAA0B,CAAC;CACpD,CAAC"}
@@ -1,9 +0,0 @@
1
- import { EventCapture } from "../../services/event-capture.mjs";
2
- import { PluginLogger } from "../../services/plugin-logger.mjs";
3
- import { RageClickService } from "./rage-click.service.mjs";
4
- import { Layer } from "effect";
5
-
6
- //#region src/core/plugins/impl/rage-click/rage-click.layer.d.ts
7
- declare const RageClickLive: Layer.Layer<RageClickService, never, EventCapture | PluginLogger>;
8
- //#endregion
9
- export { RageClickLive };
@@ -1 +0,0 @@
1
- {"version":3,"file":"rage-click.layer.d.mts","names":[],"sources":["../../../../../src/core/plugins/impl/rage-click/rage-click.layer.ts"],"mappings":";;;;;;cASa,aAAA,EAAa,KAAA,CAAA,KAAA,CAAA,gBAAA,SAAA,YAAA,GAAA,YAAA"}
@@ -1,35 +0,0 @@
1
- import { EventCapture } from "../../services/event-capture.mjs";
2
- import { PluginLogger } from "../../services/plugin-logger.mjs";
3
- import { RageClickService } from "./rage-click.service.mjs";
4
- import { Effect, Layer, Ref } from "effect";
5
-
6
- //#region src/core/plugins/impl/rage-click/rage-click.layer.ts
7
- const DEFAULT_TIME_WINDOW_MS = 1e3;
8
- const DEFAULT_THRESHOLD = 3;
9
- const RageClickLive = Layer.effect(RageClickService, Effect.gen(function* () {
10
- const capture = yield* EventCapture;
11
- const logger = yield* PluginLogger;
12
- const clickTimestampsRef = yield* Ref.make([]);
13
- const onClick = Effect.fn("RageClick.onClick")((input) => Effect.gen(function* () {
14
- const payload = yield* Ref.modify(clickTimestampsRef, (previous) => {
15
- const next = [...previous.filter((ts) => input.now - ts < DEFAULT_TIME_WINDOW_MS), input.now];
16
- if (next.length < DEFAULT_THRESHOLD) return [void 0, next];
17
- return [{
18
- count: next.length,
19
- timeWindow: DEFAULT_TIME_WINDOW_MS,
20
- selector: input.selector,
21
- text: input.text,
22
- x: input.x,
23
- y: input.y,
24
- timestamp: input.now
25
- }, []];
26
- });
27
- if (!payload) return;
28
- yield* logger.debug("Rage click detected");
29
- yield* capture.capture("rage_click", payload).pipe(Effect.withSpan("plugin.rage_click"));
30
- }));
31
- return RageClickService.of({ onClick });
32
- }));
33
-
34
- //#endregion
35
- export { RageClickLive };
@@ -1 +0,0 @@
1
- {"version":3,"file":"rage-click.layer.mjs","names":[],"sources":["../../../../../src/core/plugins/impl/rage-click/rage-click.layer.ts"],"sourcesContent":["import { Effect, Layer, Ref } from \"effect\";\n\nimport { EventCapture } from \"../../services/event-capture.js\";\nimport { PluginLogger } from \"../../services/plugin-logger.js\";\nimport { RageClickService } from \"./rage-click.service.js\";\n\nconst DEFAULT_TIME_WINDOW_MS = 1000;\nconst DEFAULT_THRESHOLD = 3;\n\nexport const RageClickLive = Layer.effect(\n RageClickService,\n Effect.gen(function* () {\n const capture = yield* EventCapture;\n const logger = yield* PluginLogger;\n\n const clickTimestampsRef = yield* Ref.make<readonly number[]>([]);\n\n const onClick = Effect.fn(\"RageClick.onClick\")(\n (input: {\n readonly now: number;\n readonly x: number;\n readonly y: number;\n readonly selector: string;\n readonly text: string;\n }) =>\n Effect.gen(function* () {\n const payload = yield* Ref.modify(clickTimestampsRef, (previous) => {\n const filtered = previous.filter(\n (ts) => input.now - ts < DEFAULT_TIME_WINDOW_MS\n );\n const next = [...filtered, input.now];\n\n if (next.length < DEFAULT_THRESHOLD) {\n return [undefined, next] as const;\n }\n\n return [\n {\n count: next.length,\n timeWindow: DEFAULT_TIME_WINDOW_MS,\n selector: input.selector,\n text: input.text,\n x: input.x,\n y: input.y,\n timestamp: input.now,\n },\n [],\n ] as const;\n });\n\n if (!payload) {\n return;\n }\n\n yield* logger.debug(\"Rage click detected\");\n yield* capture\n .capture(\"rage_click\", payload)\n .pipe(Effect.withSpan(\"plugin.rage_click\"));\n })\n );\n\n return RageClickService.of({ onClick });\n })\n);\n"],"mappings":";;;;;;AAMA,MAAM,yBAAyB;AAC/B,MAAM,oBAAoB;AAE1B,MAAa,gBAAgB,MAAM,OACjC,kBACA,OAAO,IAAI,aAAa;CACtB,MAAM,UAAU,OAAO;CACvB,MAAM,SAAS,OAAO;CAEtB,MAAM,qBAAqB,OAAO,IAAI,KAAwB,EAAE,CAAC;CAEjE,MAAM,UAAU,OAAO,GAAG,oBAAoB,EAC3C,UAOC,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAO,IAAI,OAAO,qBAAqB,aAAa;GAIlE,MAAM,OAAO,CAAC,GAHG,SAAS,QACvB,OAAO,MAAM,MAAM,KAAK,uBAC1B,EAC0B,MAAM,IAAI;AAErC,OAAI,KAAK,SAAS,kBAChB,QAAO,CAAC,QAAW,KAAK;AAG1B,UAAO,CACL;IACE,OAAO,KAAK;IACZ,YAAY;IACZ,UAAU,MAAM;IAChB,MAAM,MAAM;IACZ,GAAG,MAAM;IACT,GAAG,MAAM;IACT,WAAW,MAAM;IAClB,EACD,EAAE,CACH;IACD;AAEF,MAAI,CAAC,QACH;AAGF,SAAO,OAAO,MAAM,sBAAsB;AAC1C,SAAO,QACJ,QAAQ,cAAc,QAAQ,CAC9B,KAAK,OAAO,SAAS,oBAAoB,CAAC;GAC7C,CACL;AAED,QAAO,iBAAiB,GAAG,EAAE,SAAS,CAAC;EACvC,CACH"}
@@ -1,16 +0,0 @@
1
- import { Context, Effect } from "effect";
2
-
3
- //#region src/core/plugins/impl/rage-click/rage-click.service.d.ts
4
- interface RageClickServiceApi {
5
- readonly onClick: (input: {
6
- readonly now: number;
7
- readonly x: number;
8
- readonly y: number;
9
- readonly selector: string;
10
- readonly text: string;
11
- }) => Effect.Effect<void>;
12
- }
13
- declare const RageClickService_base: Context.TagClass<RageClickService, "@interfere/plugins/rage-click/RageClickService", RageClickServiceApi>;
14
- declare class RageClickService extends RageClickService_base {}
15
- //#endregion
16
- export { RageClickService };
@@ -1 +0,0 @@
1
- {"version":3,"file":"rage-click.service.d.mts","names":[],"sources":["../../../../../src/core/plugins/impl/rage-click/rage-click.service.ts"],"mappings":";;;UAEU,mBAAA;EAAA,SACC,OAAA,GAAU,KAAA;IAAA,SACR,GAAA;IAAA,SACA,CAAA;IAAA,SACA,CAAA;IAAA,SACA,QAAA;IAAA,SACA,IAAA;EAAA,MACL,MAAA,CAAO,MAAA;AAAA;AAAA,cAAM,qBAAA;cAGR,gBAAA,SAAyB,qBAAA"}
@@ -1,7 +0,0 @@
1
- import { Context } from "effect";
2
-
3
- //#region src/core/plugins/impl/rage-click/rage-click.service.ts
4
- var RageClickService = class extends Context.Tag("@interfere/plugins/rage-click/RageClickService")() {};
5
-
6
- //#endregion
7
- export { RageClickService };