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

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,172 +0,0 @@
1
- import { Effect } from "effect";
2
- import { withInterfereLogger } from "@interfere/effect-utils/observability";
3
- import { v7 } from "uuid";
4
- import { normalizeEnv, normalizeRuntime } from "@interfere/types/sdk/runtime";
5
-
6
- //#region src/server/capture.ts
7
- function toJsonBytes(obj) {
8
- const encoder = new TextEncoder();
9
- return Array.from(encoder.encode(JSON.stringify(obj)));
10
- }
11
- const X_INTERFERE_REQUEST_HEADER = "x-interfere-request";
12
- /**
13
- * Parse x-interfere-request header to extract session ID and request ID
14
- * Format: {sessionId}/{requestId}
15
- */
16
- function parseInterfereRequestHeader(headerValue) {
17
- if (!headerValue) return {
18
- sessionId: null,
19
- requestId: null
20
- };
21
- const parts = headerValue.split("/");
22
- if (parts.length !== 2) return {
23
- sessionId: null,
24
- requestId: null
25
- };
26
- return {
27
- sessionId: parts[0] || null,
28
- requestId: parts[1] || null
29
- };
30
- }
31
- function resolveSessionId(request, deps = {}) {
32
- const { getAsyncContext } = deps;
33
- if (request) {
34
- const parsed = parseInterfereRequestHeader(request.headers.get(X_INTERFERE_REQUEST_HEADER));
35
- if (parsed.sessionId) return {
36
- sessionId: parsed.sessionId,
37
- source: "header"
38
- };
39
- }
40
- if (getAsyncContext) {
41
- const asyncContext = getAsyncContext();
42
- if (asyncContext?.sessionId) return {
43
- sessionId: asyncContext.sessionId,
44
- source: "async_context"
45
- };
46
- }
47
- return {
48
- sessionId: `server_${v7()}`,
49
- source: "fallback"
50
- };
51
- }
52
- /**
53
- * Parse stack trace to extract frames
54
- * Similar logic to client-side error parsing
55
- */
56
- const STACK_TRACE_REGEX = /at\s+(?:(.+?)\s+\()?(.+?):(\d+):(\d+)\)?/;
57
- function parseStackTrace(stack) {
58
- if (!stack) return [{
59
- file: { reported: null },
60
- line: { reported: null },
61
- column: { reported: null },
62
- fn: { reported: null }
63
- }];
64
- const lines = stack.split("\n");
65
- const frames = [];
66
- for (const line of lines) {
67
- const match = line.match(STACK_TRACE_REGEX);
68
- if (match) frames.push({
69
- file: { reported: match[2] || null },
70
- line: { reported: match[3] ? Number.parseInt(match[3], 10) : null },
71
- column: { reported: match[4] ? Number.parseInt(match[4], 10) : null },
72
- fn: { reported: match[1] || null }
73
- });
74
- }
75
- return frames.length > 0 ? frames : [{
76
- file: { reported: null },
77
- line: { reported: null },
78
- column: { reported: null },
79
- fn: { reported: null }
80
- }];
81
- }
82
- const ROUTER_KINDS = ["Pages Router", "App Router"];
83
- const ROUTE_TYPES = [
84
- "render",
85
- "route",
86
- "action",
87
- "middleware",
88
- "proxy"
89
- ];
90
- const RENDER_SOURCES = [
91
- "react-server-components",
92
- "react-server-components-payload",
93
- "server-rendering"
94
- ];
95
- const REVALIDATE_REASONS = ["on-demand", "stale"];
96
- const RENDER_TYPES = ["dynamic", "dynamic-resume"];
97
- function isOneOf(value, allowed) {
98
- return typeof value === "string" && allowed.includes(value);
99
- }
100
- function extractNextjsContext(context) {
101
- if (!context) return;
102
- const nextjsContext = {};
103
- if (isOneOf(context.routerKind, ROUTER_KINDS)) nextjsContext.routerKind = context.routerKind;
104
- if (typeof context.routePath === "string") nextjsContext.routePath = context.routePath;
105
- if (isOneOf(context.routeType, ROUTE_TYPES)) nextjsContext.routeType = context.routeType;
106
- if (isOneOf(context.renderSource, RENDER_SOURCES)) nextjsContext.renderSource = context.renderSource;
107
- if (isOneOf(context.revalidateReason, REVALIDATE_REASONS)) nextjsContext.revalidateReason = context.revalidateReason;
108
- if (isOneOf(context.renderType, RENDER_TYPES)) nextjsContext.renderType = context.renderType;
109
- if (typeof context.requestPath === "string") nextjsContext.requestPath = context.requestPath;
110
- if (typeof context.requestMethod === "string") nextjsContext.requestMethod = context.requestMethod;
111
- if (typeof context.errorDigest === "string") nextjsContext.errorDigest = context.errorDigest;
112
- return Object.keys(nextjsContext).length > 0 ? nextjsContext : void 0;
113
- }
114
- function extractMechanism(context) {
115
- if (!context?.mechanism) return;
116
- const mech = context.mechanism;
117
- if (typeof mech.type !== "string" || typeof mech.handled !== "boolean") return;
118
- return {
119
- type: mech.type,
120
- handled: mech.handled,
121
- synthetic: typeof mech.synthetic === "boolean" ? mech.synthetic : void 0
122
- };
123
- }
124
- function buildServerErrorEnvelope(input) {
125
- const { error, request, buildId, releaseId, environment, runtime, context, sessionResolverDeps } = input;
126
- const { sessionId, source: sessionSource } = resolveSessionId(request, sessionResolverDeps);
127
- const nextjsContext = extractNextjsContext(context);
128
- const mechanism = extractMechanism(context);
129
- const captureSource = typeof context?.captureSource === "string" ? context.captureSource : void 0;
130
- const errorObj = error;
131
- const errorPayload = {
132
- frames: parseStackTrace(errorObj?.stack),
133
- message: errorObj?.message ?? String(error ?? "Unknown error"),
134
- name: errorObj?.name ?? "Error",
135
- stack: errorObj?.stack ?? null,
136
- errorSource: "server",
137
- ...mechanism && { mechanism },
138
- ...nextjsContext && { nextjs: nextjsContext },
139
- ...captureSource && { captureSource }
140
- };
141
- return {
142
- v: 0,
143
- runtime: normalizeRuntime(runtime),
144
- environment: normalizeEnv(environment),
145
- clientTs: Date.now(),
146
- sessionId,
147
- sessionSource,
148
- type: "error",
149
- payload: errorPayload,
150
- buildId: buildId ?? "unknown",
151
- releaseId: releaseId ?? "unknown",
152
- uuid: v7()
153
- };
154
- }
155
- async function sendEnvelopesToIngest(envelopes, ingestUrl, surfaceToken) {
156
- const response = await Effect.runPromise(withInterfereLogger("react", Effect.promise(() => fetch(ingestUrl, {
157
- method: "POST",
158
- headers: {
159
- "Content-Type": "application/json",
160
- "x-interfere-pub-token": surfaceToken
161
- },
162
- body: JSON.stringify(envelopes),
163
- keepalive: true
164
- })).pipe(Effect.withSpan("server.sendEnvelopes"))));
165
- if (!response.ok) {
166
- const errorText = await response.text().catch(() => "");
167
- throw new Error(`Failed to send envelopes to ingest: ${response.status} ${response.statusText}${errorText ? ` - ${errorText}` : ""}`);
168
- }
169
- }
170
-
171
- //#endregion
172
- export { buildServerErrorEnvelope, sendEnvelopesToIngest, toJsonBytes };
@@ -1 +0,0 @@
1
- {"version":3,"file":"capture.mjs","names":["uuidv7"],"sources":["../../src/server/capture.ts"],"sourcesContent":["import { withInterfereLogger } from \"@interfere/effect-utils/observability\";\nimport type { IngestedFrame } from \"@interfere/types/data/frame\";\nimport type { Config } from \"@interfere/types/sdk/config\";\nimport type { Envelope, SessionSource } from \"@interfere/types/sdk/envelope\";\nimport type {\n ErrorEnvelopePayload,\n ErrorMechanism,\n NextjsErrorContext,\n} from \"@interfere/types/sdk/plugins/payload/errors\";\nimport {\n type Env,\n normalizeEnv,\n normalizeRuntime,\n type Runtime,\n} from \"@interfere/types/sdk/runtime\";\n\nimport { Effect } from \"effect\";\nimport { v7 as uuidv7 } from \"uuid\";\n\nexport function toJsonBytes(obj: unknown): number[] {\n const encoder = new TextEncoder();\n return Array.from(encoder.encode(JSON.stringify(obj)));\n}\n\nconst X_INTERFERE_REQUEST_HEADER = \"x-interfere-request\";\n\n/**\n * Parse x-interfere-request header to extract session ID and request ID\n * Format: {sessionId}/{requestId}\n */\nfunction parseInterfereRequestHeader(headerValue: string | null): {\n sessionId: string | null;\n requestId: string | null;\n} {\n if (!headerValue) {\n return { sessionId: null, requestId: null };\n }\n\n const parts = headerValue.split(\"/\");\n if (parts.length !== 2) {\n return { sessionId: null, requestId: null };\n }\n\n return {\n sessionId: parts[0] || null,\n requestId: parts[1] || null,\n };\n}\n\n/**\n * Session resolution result with source tracking for debugging.\n */\ninterface SessionResolution {\n sessionId: string;\n source: SessionSource;\n}\n\n/**\n * Session resolution strategy.\n *\n * Attempts to resolve session ID in order of preference:\n * 1. Header: Parse x-interfere-request header (ideal case)\n * 2. AsyncContext: Check AsyncLocalStorage context (for async code paths)\n * 3. Fallback: Generate server-side session ID (breaks continuity - tracked for monitoring)\n */\nexport interface SessionResolverDeps {\n /** Get session context from AsyncLocalStorage */\n getAsyncContext?: () =>\n | { sessionId: string | null; requestId: string | null }\n | undefined;\n}\n\nfunction resolveSessionId(\n request: Request | undefined,\n deps: SessionResolverDeps = {}\n): SessionResolution {\n const { getAsyncContext } = deps;\n\n // Level 1: Parse x-interfere-request header\n if (request) {\n const headerValue = request.headers.get(X_INTERFERE_REQUEST_HEADER);\n const parsed = parseInterfereRequestHeader(headerValue);\n\n if (parsed.sessionId) {\n return { sessionId: parsed.sessionId, source: \"header\" };\n }\n }\n\n // Level 2: Check AsyncLocalStorage context\n if (getAsyncContext) {\n const asyncContext = getAsyncContext();\n if (asyncContext?.sessionId) {\n return { sessionId: asyncContext.sessionId, source: \"async_context\" };\n }\n }\n\n // Level 3: Fallback - generate server-side session ID\n // This breaks session continuity but at least captures the error\n return {\n sessionId: `server_${uuidv7()}`,\n source: \"fallback\",\n };\n}\n\n/**\n * Parse stack trace to extract frames\n * Similar logic to client-side error parsing\n */\nconst STACK_TRACE_REGEX = /at\\s+(?:(.+?)\\s+\\()?(.+?):(\\d+):(\\d+)\\)?/;\n\nfunction parseStackTrace(stack?: string): IngestedFrame[] {\n if (!stack) {\n return [\n {\n file: { reported: null },\n line: { reported: null },\n column: { reported: null },\n fn: { reported: null },\n },\n ];\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\ntype ServerErrorMeta = Pick<Config[\"metadata\"], \"buildId\" | \"releaseId\">;\n\nexport type ServerErrorEnvelopeInput = ServerErrorMeta & {\n error: unknown;\n request?: Request;\n context?: Record<string, unknown>;\n environment: string | Env;\n runtime?: string | Runtime;\n /** Optional dependency injection for session resolution */\n sessionResolverDeps?: SessionResolverDeps;\n};\n\nconst ROUTER_KINDS = [\"Pages Router\", \"App Router\"] as const;\nconst ROUTE_TYPES = [\n \"render\",\n \"route\",\n \"action\",\n \"middleware\",\n \"proxy\",\n] as const;\nconst RENDER_SOURCES = [\n \"react-server-components\",\n \"react-server-components-payload\",\n \"server-rendering\",\n] as const;\nconst REVALIDATE_REASONS = [\"on-demand\", \"stale\"] as const;\nconst RENDER_TYPES = [\"dynamic\", \"dynamic-resume\"] as const;\n\ntype RouterKind = (typeof ROUTER_KINDS)[number];\ntype RouteType = (typeof ROUTE_TYPES)[number];\ntype RenderSource = (typeof RENDER_SOURCES)[number];\ntype RevalidateReason = (typeof REVALIDATE_REASONS)[number];\ntype RenderType = (typeof RENDER_TYPES)[number];\n\nfunction isOneOf<T extends string>(\n value: unknown,\n allowed: readonly T[]\n): value is T {\n return (\n typeof value === \"string\" && (allowed as readonly string[]).includes(value)\n );\n}\n\nfunction extractNextjsContext(\n context?: Record<string, unknown>\n): NextjsErrorContext | undefined {\n if (!context) {\n return undefined;\n }\n\n const nextjsContext: NextjsErrorContext = {};\n\n if (isOneOf<RouterKind>(context.routerKind, ROUTER_KINDS)) {\n nextjsContext.routerKind = context.routerKind;\n }\n if (typeof context.routePath === \"string\") {\n nextjsContext.routePath = context.routePath;\n }\n if (isOneOf<RouteType>(context.routeType, ROUTE_TYPES)) {\n nextjsContext.routeType = context.routeType;\n }\n if (isOneOf<RenderSource>(context.renderSource, RENDER_SOURCES)) {\n nextjsContext.renderSource = context.renderSource;\n }\n if (isOneOf<RevalidateReason>(context.revalidateReason, REVALIDATE_REASONS)) {\n nextjsContext.revalidateReason = context.revalidateReason;\n }\n if (isOneOf<RenderType>(context.renderType, RENDER_TYPES)) {\n nextjsContext.renderType = context.renderType;\n }\n if (typeof context.requestPath === \"string\") {\n nextjsContext.requestPath = context.requestPath;\n }\n if (typeof context.requestMethod === \"string\") {\n nextjsContext.requestMethod = context.requestMethod;\n }\n if (typeof context.errorDigest === \"string\") {\n nextjsContext.errorDigest = context.errorDigest;\n }\n\n return Object.keys(nextjsContext).length > 0 ? nextjsContext : undefined;\n}\n\nfunction extractMechanism(\n context?: Record<string, unknown>\n): ErrorMechanism | undefined {\n if (!context?.mechanism) {\n return undefined;\n }\n\n const mech = context.mechanism as Record<string, unknown>;\n if (typeof mech.type !== \"string\" || typeof mech.handled !== \"boolean\") {\n return undefined;\n }\n\n return {\n type: mech.type,\n handled: mech.handled,\n synthetic: typeof mech.synthetic === \"boolean\" ? mech.synthetic : undefined,\n };\n}\n\nexport function buildServerErrorEnvelope(\n input: ServerErrorEnvelopeInput\n): Envelope {\n const {\n error,\n request,\n buildId,\n releaseId,\n environment,\n runtime,\n context,\n sessionResolverDeps,\n } = input;\n\n // Multi-level session resolution\n const { sessionId, source: sessionSource } = resolveSessionId(\n request,\n sessionResolverDeps\n );\n\n // Extract Next.js-specific context and mechanism\n const nextjsContext = extractNextjsContext(context);\n const mechanism = extractMechanism(context);\n const captureSource =\n typeof context?.captureSource === \"string\"\n ? context.captureSource\n : undefined;\n\n // Build error payload matching ErrorEnvelopePayload schema\n const errorObj = error as Error;\n const errorPayload: ErrorEnvelopePayload = {\n frames: parseStackTrace(errorObj?.stack),\n message: errorObj?.message ?? String(error ?? \"Unknown error\"),\n name: errorObj?.name ?? \"Error\",\n stack: errorObj?.stack ?? null,\n errorSource: \"server\",\n ...(mechanism && { mechanism }),\n ...(nextjsContext && { nextjs: nextjsContext }),\n ...(captureSource && { captureSource }),\n };\n\n return {\n v: 0,\n runtime: normalizeRuntime(runtime),\n environment: normalizeEnv(environment),\n clientTs: Date.now(),\n sessionId,\n sessionSource,\n type: \"error\",\n payload: errorPayload,\n buildId: buildId ?? \"unknown\",\n releaseId: releaseId ?? \"unknown\",\n uuid: uuidv7(),\n };\n}\n\nexport async function sendEnvelopesToIngest(\n envelopes: Envelope[],\n ingestUrl: string,\n surfaceToken: string\n): Promise<void> {\n const response = await Effect.runPromise(\n withInterfereLogger(\n \"react\",\n Effect.promise(() =>\n fetch(ingestUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-interfere-pub-token\": surfaceToken,\n },\n body: JSON.stringify(envelopes),\n keepalive: true,\n })\n ).pipe(Effect.withSpan(\"server.sendEnvelopes\"))\n )\n );\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => \"\");\n throw new Error(\n `Failed to send envelopes to ingest: ${response.status} ${response.statusText}${\n errorText ? ` - ${errorText}` : \"\"\n }`\n );\n }\n}\n"],"mappings":"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"}