@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,58 +0,0 @@
1
- import { Context } from "effect";
2
-
3
- //#region src/effect/tags.d.ts
4
- declare const ConfigTag_base: Context.TagClass<ConfigTag, "@interfere/react/Config", ({
5
- features: {
6
- errors?: boolean | undefined;
7
- replay?: boolean | undefined;
8
- rageClick?: boolean | undefined;
9
- aiSummary?: boolean | undefined;
10
- pageEvents?: boolean | undefined;
11
- serverTracing?: boolean | undefined;
12
- };
13
- metadata: {
14
- buildId: string | null;
15
- releaseId: string | null;
16
- environment: "development" | "preview" | "production" | null;
17
- runtime: "edge" | "browser" | "node" | null;
18
- };
19
- batch: {
20
- size: number;
21
- ms: number;
22
- };
23
- offline: {
24
- enabled: boolean;
25
- maxQueueSize: number;
26
- };
27
- } & {
28
- proxyUrl: string;
29
- }) | ({
30
- features: {
31
- errors?: boolean | undefined;
32
- replay?: boolean | undefined;
33
- rageClick?: boolean | undefined;
34
- aiSummary?: boolean | undefined;
35
- pageEvents?: boolean | undefined;
36
- serverTracing?: boolean | undefined;
37
- };
38
- metadata: {
39
- buildId: string | null;
40
- releaseId: string | null;
41
- environment: "development" | "preview" | "production" | null;
42
- runtime: "edge" | "browser" | "node" | null;
43
- };
44
- batch: {
45
- size: number;
46
- ms: number;
47
- };
48
- offline: {
49
- enabled: boolean;
50
- maxQueueSize: number;
51
- };
52
- } & {
53
- ingestUrl: string;
54
- surfaceToken: string;
55
- })>;
56
- declare class ConfigTag extends ConfigTag_base {}
57
- //#endregion
58
- export { ConfigTag };
@@ -1 +0,0 @@
1
- {"version":3,"file":"tags.d.mts","names":[],"sources":["../../src/effect/tags.ts"],"mappings":";;;cAEiC,cAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAEpB,SAAA,SAAkB,cAAA"}
@@ -1,7 +0,0 @@
1
- import { Context } from "effect";
2
-
3
- //#region src/effect/tags.ts
4
- var ConfigTag = class extends Context.Tag("@interfere/react/Config")() {};
5
-
6
- //#endregion
7
- export { ConfigTag };
@@ -1 +0,0 @@
1
- {"version":3,"file":"tags.mjs","names":[],"sources":["../../src/effect/tags.ts"],"sourcesContent":["import type { Config } from \"@interfere/types/sdk/config\";\n\nimport { Context } from \"effect\";\n\nexport class ConfigTag extends Context.Tag(\"@interfere/react/Config\")<\n ConfigTag,\n Config\n>() {}\n"],"mappings":";;;AAIA,IAAa,YAAb,cAA+B,QAAQ,IAAI,0BAA0B,EAGlE,CAAC"}
@@ -1,7 +0,0 @@
1
- import { PluginDef } from "../core/plugins/define-plugin.mjs";
2
- import { Config } from "@interfere/types/sdk/config";
3
-
4
- //#region src/hooks/use-runtime-and-plugins.d.ts
5
- declare function useRuntimeAndPlugins(config: Config, plugins?: readonly PluginDef[]): Readonly<Record<string, unknown>>;
6
- //#endregion
7
- export { useRuntimeAndPlugins };
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-runtime-and-plugins.d.mts","names":[],"sources":["../../src/hooks/use-runtime-and-plugins.ts"],"mappings":";;;;iBAiGgB,oBAAA,CACd,MAAA,EAAQ,MAAA,EACR,OAAA,YAAmB,SAAA,KAClB,QAAA,CAAS,MAAA"}
@@ -1,121 +0,0 @@
1
- "use client";
2
-
3
- import { ContextServiceLive } from "../effect/layers/context.layer.mjs";
4
- import { ConfigTag } from "../effect/tags.mjs";
5
- import { CircuitBreakerLive } from "../effect/layers/circuit-breaker.layer.mjs";
6
- import { deriveIngestTarget } from "../core/runtime/ingest-target.mjs";
7
- import { HttpServiceLive } from "../effect/layers/http.layer.mjs";
8
- import { QueueServiceLive, QueueServiceTag } from "../effect/layers/queue.layer.mjs";
9
- import { SessionServiceLive } from "../effect/layers/session.layer.mjs";
10
- import { EventCaptureLive } from "../core/plugins/services/event-capture.layer.mjs";
11
- import { getRuntime, initConfig } from "../core/runtime/config.mjs";
12
- import { closeSDK, flushQueue, isSDKInitialized, runWithSDK, setSDKRuntime } from "../effect/runtime-services.mjs";
13
- import { loadAndSetupPluginsEffect } from "../core/plugins/plugin-loader.mjs";
14
- import { Cause, Effect, Exit, Layer, Runtime, Scope } from "effect";
15
- import { configSchema } from "@interfere/types/sdk/config";
16
- import { useEffect, useRef, useState } from "react";
17
-
18
- //#region src/hooks/use-runtime-and-plugins.ts
19
- const createSDKLayer = (config) => {
20
- const configWithRuntime = {
21
- ...config,
22
- runtime: getRuntime()
23
- };
24
- const configLayer = Layer.succeed(ConfigTag, configWithRuntime);
25
- const contextLayer = ContextServiceLive;
26
- const httpLayer = HttpServiceLive(configWithRuntime);
27
- const sessionLayer = SessionServiceLive;
28
- const queueLayer = QueueServiceLive.pipe(Layer.provide(configLayer), Layer.provide(httpLayer), Layer.provide(CircuitBreakerLive));
29
- const baseLayer = Layer.mergeAll(configLayer, contextLayer, httpLayer, sessionLayer, queueLayer);
30
- return EventCaptureLive.pipe(Layer.provideMerge(baseLayer));
31
- };
32
- const initRuntimeServices = async (input) => {
33
- if (isSDKInitialized()) return;
34
- const config = configSchema.parse(input);
35
- initConfig(config);
36
- const scope = await Effect.runPromise(Scope.make());
37
- const runtime = await Effect.runPromise(Layer.toRuntime(createSDKLayer(config)).pipe(Effect.provideService(Scope.Scope, scope)));
38
- setSDKRuntime(scope, runtime);
39
- await Runtime.runPromise(runtime)(Effect.gen(function* () {
40
- yield* Effect.logDebug("Runtime initialized successfully");
41
- yield* Effect.forkDaemon(Effect.gen(function* () {
42
- yield* (yield* QueueServiceTag).startBatchProcessor().pipe(Effect.provideService(Scope.Scope, scope));
43
- }));
44
- }));
45
- };
46
- function useRuntimeAndPlugins(config, plugins) {
47
- const [pluginApis, setPluginApis] = useState({});
48
- const pluginHandlersRef = useRef([]);
49
- const initRef = useRef(false);
50
- useEffect(() => {
51
- if (typeof window === "undefined" || initRef.current) return;
52
- initRef.current = true;
53
- const runCleanup = Effect.fn("useRuntimeAndPlugins.runCleanup")(function* (cleanups) {
54
- const TIMEOUT_MS = 1500;
55
- yield* Effect.tryPromise({
56
- try: () => flushQueue(TIMEOUT_MS),
57
- catch: (error) => Effect.logDebug("Bounded flush timed out during cleanup", {
58
- timeoutMs: TIMEOUT_MS,
59
- error: String(error)
60
- })
61
- }).pipe(Effect.ignore);
62
- for (const dispose of cleanups) {
63
- yield* Effect.logTrace(`Running cleanup for plugin ${dispose.name}`);
64
- yield* Effect.try({
65
- try: () => dispose(),
66
- catch: (error) => Effect.logDebug("Plugin cleanup failed", { error: String(error) })
67
- }).pipe(Effect.ignore);
68
- }
69
- yield* Effect.logTrace("Closing SDK");
70
- yield* Effect.promise(() => closeSDK());
71
- });
72
- const initialize = async () => {
73
- try {
74
- await initRuntimeServices(config);
75
- deriveIngestTarget(config);
76
- } catch (error) {
77
- console.error("[Interfere SDK] Failed to initialize:", error);
78
- return;
79
- }
80
- const result = await runWithSDK(Effect.gen(function* () {
81
- const exit = yield* Effect.exit(loadAndSetupPluginsEffect(config, plugins));
82
- if (Exit.isFailure(exit)) {
83
- const cause = exit.cause;
84
- yield* Effect.logFatal("Failed to load plugins", {
85
- cause: Cause.pretty(cause),
86
- features: config.features,
87
- userPluginCount: Array.isArray(plugins) ? plugins.length : 0
88
- });
89
- return;
90
- }
91
- const { cleanups, apis, keys } = exit.value;
92
- yield* Effect.logDebug(`${keys.size} plugins loaded, ${Object.keys(apis).length} APIs exposed`, {
93
- plugins: Array.from(keys),
94
- apis: Object.keys(apis)
95
- });
96
- yield* (yield* QueueServiceTag).setReady(true);
97
- return {
98
- cleanups,
99
- apis
100
- };
101
- }));
102
- if (result) {
103
- pluginHandlersRef.current = [...result.cleanups];
104
- setPluginApis(result.apis);
105
- }
106
- };
107
- initialize();
108
- return () => {
109
- if (isSDKInitialized()) runWithSDK(runCleanup(pluginHandlersRef.current)).catch((error) => {
110
- console.error("[Interfere SDK] Provider cleanup failed:", error);
111
- });
112
- else Effect.runPromise(runCleanup(pluginHandlersRef.current)).catch((error) => {
113
- console.error("[Interfere SDK] Provider cleanup failed:", error);
114
- });
115
- };
116
- }, [config, plugins]);
117
- return pluginApis;
118
- }
119
-
120
- //#endregion
121
- export { useRuntimeAndPlugins };
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-runtime-and-plugins.mjs","names":[],"sources":["../../src/hooks/use-runtime-and-plugins.ts"],"sourcesContent":["\"use client\";\n\nimport type { Config } from \"@interfere/types/sdk/config\";\nimport { configSchema } from \"@interfere/types/sdk/config\";\n\nimport { Cause, Effect, Exit, Layer, Runtime, Scope } from \"effect\";\nimport { useEffect, useRef, useState } from \"react\";\n\nimport type { PluginDef } from \"../core/plugins/define-plugin.js\";\nimport { loadAndSetupPluginsEffect } from \"../core/plugins/plugin-loader.js\";\nimport { EventCaptureLive } from \"../core/plugins/services/event-capture.layer.js\";\nimport { getRuntime, initConfig } from \"../core/runtime/config.js\";\nimport { deriveIngestTarget } from \"../core/runtime/ingest-target.js\";\nimport { CircuitBreakerLive } from \"../effect/layers/circuit-breaker.layer.js\";\nimport { ContextServiceLive } from \"../effect/layers/context.layer.js\";\nimport { HttpServiceLive } from \"../effect/layers/http.layer.js\";\nimport {\n QueueServiceLive,\n QueueServiceTag,\n} from \"../effect/layers/queue.layer.js\";\nimport { SessionServiceLive } from \"../effect/layers/session.layer.js\";\nimport {\n closeSDK,\n flushQueue,\n isSDKInitialized,\n runWithSDK,\n setSDKRuntime,\n} from \"../effect/runtime-services.js\";\nimport { ConfigTag } from \"../effect/tags.js\";\n\nconst createSDKLayer = (config: Config) => {\n const configWithRuntime = {\n ...config,\n runtime: getRuntime(),\n };\n\n const configLayer = Layer.succeed(ConfigTag, configWithRuntime);\n const contextLayer = ContextServiceLive;\n const httpLayer = HttpServiceLive(configWithRuntime);\n const sessionLayer = SessionServiceLive;\n\n const queueLayer = QueueServiceLive.pipe(\n Layer.provide(configLayer),\n Layer.provide(httpLayer),\n Layer.provide(CircuitBreakerLive)\n );\n\n const baseLayer = Layer.mergeAll(\n configLayer,\n contextLayer,\n httpLayer,\n sessionLayer,\n queueLayer\n );\n\n return EventCaptureLive.pipe(Layer.provideMerge(baseLayer));\n};\n\nconst initRuntimeServices = async (input: unknown): Promise<void> => {\n if (isSDKInitialized()) {\n return;\n }\n\n const config = configSchema.parse(input);\n\n // Seed config for runtime consumers that don't use Effect tags\n initConfig(config);\n\n const scope = await Effect.runPromise(Scope.make());\n\n const runtime = await Effect.runPromise(\n Layer.toRuntime(createSDKLayer(config)).pipe(\n Effect.provideService(Scope.Scope, scope)\n )\n );\n\n setSDKRuntime(scope, runtime);\n\n await Runtime.runPromise(runtime)(\n Effect.gen(function* () {\n yield* Effect.logDebug(\"Runtime initialized successfully\");\n\n // Start batch processor\n yield* Effect.forkDaemon(\n Effect.gen(function* () {\n const queue = yield* QueueServiceTag;\n yield* queue\n .startBatchProcessor()\n .pipe(Effect.provideService(Scope.Scope, scope));\n })\n );\n })\n );\n};\n\n// removed Effect wrapper; plugin loading now handled with runPromise + try/catch in initialize\n\nexport function useRuntimeAndPlugins(\n config: Config,\n plugins?: readonly PluginDef[]\n): Readonly<Record<string, unknown>> {\n const [pluginApis, setPluginApis] = useState<\n Readonly<Record<string, unknown>>\n >({});\n const pluginHandlersRef = useRef<Array<() => void>>([]);\n const initRef = useRef(false);\n\n useEffect(() => {\n if (typeof window === \"undefined\" || initRef.current) {\n return;\n }\n\n initRef.current = true;\n\n const runCleanup = Effect.fn(\"useRuntimeAndPlugins.runCleanup\")(function* (\n cleanups: Array<() => void>\n ) {\n const TIMEOUT_MS = 1500;\n\n yield* Effect.tryPromise({\n try: () => flushQueue(TIMEOUT_MS),\n catch: (error) =>\n Effect.logDebug(\"Bounded flush timed out during cleanup\", {\n timeoutMs: TIMEOUT_MS,\n error: String(error),\n }),\n }).pipe(Effect.ignore);\n\n for (const dispose of cleanups) {\n yield* Effect.logTrace(`Running cleanup for plugin ${dispose.name}`);\n\n yield* Effect.try({\n try: () => dispose(),\n catch: (error) =>\n Effect.logDebug(\"Plugin cleanup failed\", {\n error: String(error),\n }),\n }).pipe(Effect.ignore);\n }\n\n yield* Effect.logTrace(\"Closing SDK\");\n\n yield* Effect.promise(() => closeSDK());\n });\n\n const initialize = async () => {\n try {\n await initRuntimeServices(config);\n // Early ingest target validation (fail fast) without singleton reliance\n deriveIngestTarget(config);\n } catch (error) {\n console.error(\"[Interfere SDK] Failed to initialize:\", error);\n return;\n }\n\n const result = await runWithSDK(\n Effect.gen(function* () {\n const exit = yield* Effect.exit(\n loadAndSetupPluginsEffect(config, plugins)\n );\n\n if (Exit.isFailure(exit)) {\n const cause = exit.cause;\n\n yield* Effect.logFatal(\"Failed to load plugins\", {\n cause: Cause.pretty(cause),\n features: config.features,\n userPluginCount: Array.isArray(plugins) ? plugins.length : 0,\n });\n\n return;\n }\n\n const { cleanups, apis, keys } = exit.value;\n\n yield* Effect.logDebug(\n `${keys.size} plugins loaded, ${Object.keys(apis).length} APIs exposed`,\n {\n plugins: Array.from(keys),\n apis: Object.keys(apis),\n }\n );\n\n // Signal queue readiness now that plugins have loaded\n const queue = yield* QueueServiceTag;\n yield* queue.setReady(true);\n\n return { cleanups, apis };\n })\n );\n\n if (result) {\n pluginHandlersRef.current = [...result.cleanups];\n\n setPluginApis(result.apis);\n }\n };\n\n // biome-ignore lint/complexity/noVoid: fire-and-forget initialization\n void initialize();\n\n return () => {\n if (isSDKInitialized()) {\n runWithSDK(runCleanup(pluginHandlersRef.current)).catch((error) => {\n console.error(\"[Interfere SDK] Provider cleanup failed:\", error);\n });\n } else {\n // If SDK never initialized, run cleanup directly\n Effect.runPromise(runCleanup(pluginHandlersRef.current)).catch(\n (error) => {\n console.error(\"[Interfere SDK] Provider cleanup failed:\", error);\n }\n );\n }\n };\n }, [config, plugins]);\n\n return pluginApis;\n}\n"],"mappings":"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"}
@@ -1,40 +0,0 @@
1
- //#region src/hooks/use-session.d.ts
2
- /**
3
- * React hook to get the current session ID.
4
- * Automatically handles cleanup on unmount.
5
- *
6
- * @returns Object with sessionId (string | null) and loading state
7
- *
8
- * @example
9
- * function MyComponent() {
10
- * const { sessionId, loading, error } = useSession();
11
- *
12
- * if (loading) return <div>Loading session...</div>;
13
- * if (error) return <div>Error: {error.message}</div>;
14
- *
15
- * return <div>Session ID: {sessionId}</div>;
16
- * }
17
- */
18
- declare function useSession(): {
19
- sessionId: string | null;
20
- loading: boolean;
21
- error: Error | null;
22
- };
23
- /**
24
- * React hook to execute a callback when the session is ready.
25
- * Automatically handles cleanup on unmount.
26
- *
27
- * @param callback Function to call with the session ID
28
- * @param deps Dependency array for the callback
29
- *
30
- * @example
31
- * function MyComponent() {
32
- * useSessionReady((sessionId) => {
33
- * console.log('Session is ready:', sessionId);
34
- * // Send analytics event, initialize tracking, etc.
35
- * }, []);
36
- * }
37
- */
38
- declare function useSessionReady(callback: (sessionId: string) => void, deps?: React.DependencyList): void;
39
- //#endregion
40
- export { useSession, useSessionReady };
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-session.d.mts","names":[],"sources":["../../src/hooks/use-session.ts"],"mappings":";;AAsBA;;;;;;;;;;AA2EA;;;;;iBA3EgB,UAAA,CAAA;;;SAAU,KAAA;AAAA;;;;;;;;;;;;;;;;iBA2EV,eAAA,CACd,QAAA,GAAW,SAAA,mBACX,IAAA,GAAM,KAAA,CAAM,cAAA"}
@@ -1,96 +0,0 @@
1
- import { SessionServiceTag } from "../effect/layers/session.layer.mjs";
2
- import { runWithSDK } from "../effect/runtime-services.mjs";
3
- import { Effect, Option } from "effect";
4
- import { useEffect, useState } from "react";
5
-
6
- //#region src/hooks/use-session.ts
7
- /**
8
- * React hook to get the current session ID.
9
- * Automatically handles cleanup on unmount.
10
- *
11
- * @returns Object with sessionId (string | null) and loading state
12
- *
13
- * @example
14
- * function MyComponent() {
15
- * const { sessionId, loading, error } = useSession();
16
- *
17
- * if (loading) return <div>Loading session...</div>;
18
- * if (error) return <div>Error: {error.message}</div>;
19
- *
20
- * return <div>Session ID: {sessionId}</div>;
21
- * }
22
- */
23
- function useSession() {
24
- const [sessionId, setSessionId] = useState(null);
25
- const [loading, setLoading] = useState(true);
26
- const [error, setError] = useState(null);
27
- useEffect(() => {
28
- runWithSDK(Effect.gen(function* () {
29
- const sidOpt = yield* (yield* SessionServiceTag).getSessionId();
30
- if (Option.isSome(sidOpt)) {
31
- setSessionId(sidOpt.value);
32
- setLoading(false);
33
- return true;
34
- }
35
- return false;
36
- })).then((has) => {
37
- if (has) return;
38
- });
39
- const controller = new AbortController();
40
- runWithSDK(Effect.gen(function* () {
41
- return yield* (yield* SessionServiceTag).whenSessionReady({
42
- signal: controller.signal,
43
- timeout: 3e4
44
- });
45
- })).then((id) => {
46
- setSessionId(id);
47
- setLoading(false);
48
- }).catch((err) => {
49
- if (!controller.signal.aborted) {
50
- setError(err instanceof Error ? err : new Error(String(err)));
51
- setLoading(false);
52
- }
53
- });
54
- return () => {
55
- controller.abort();
56
- };
57
- }, []);
58
- return {
59
- sessionId,
60
- loading,
61
- error
62
- };
63
- }
64
- /**
65
- * React hook to execute a callback when the session is ready.
66
- * Automatically handles cleanup on unmount.
67
- *
68
- * @param callback Function to call with the session ID
69
- * @param deps Dependency array for the callback
70
- *
71
- * @example
72
- * function MyComponent() {
73
- * useSessionReady((sessionId) => {
74
- * console.log('Session is ready:', sessionId);
75
- * // Send analytics event, initialize tracking, etc.
76
- * }, []);
77
- * }
78
- */
79
- function useSessionReady(callback, deps = []) {
80
- useEffect(() => {
81
- const controller = new AbortController();
82
- runWithSDK(Effect.gen(function* () {
83
- return yield* (yield* SessionServiceTag).whenSessionReady({ signal: controller.signal });
84
- })).then((sessionId) => {
85
- if (!controller.signal.aborted) callback(sessionId);
86
- }).catch((err) => {
87
- if (!controller.signal.aborted) runWithSDK(Effect.logError("Failed to get session", { error: String(err) }));
88
- });
89
- return () => {
90
- controller.abort();
91
- };
92
- }, deps);
93
- }
94
-
95
- //#endregion
96
- export { useSession, useSessionReady };
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-session.mjs","names":[],"sources":["../../src/hooks/use-session.ts"],"sourcesContent":["import { Effect, Option } from \"effect\";\nimport { useEffect, useState } from \"react\";\n\nimport { SessionServiceTag } from \"../effect/layers/session.layer.js\";\nimport { runWithSDK } from \"../effect/runtime-services.js\";\n\n/**\n * React hook to get the current session ID.\n * Automatically handles cleanup on unmount.\n *\n * @returns Object with sessionId (string | null) and loading state\n *\n * @example\n * function MyComponent() {\n * const { sessionId, loading, error } = useSession();\n *\n * if (loading) return <div>Loading session...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * return <div>Session ID: {sessionId}</div>;\n * }\n */\nexport function useSession() {\n const [sessionId, setSessionId] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n // Check if session already exists\n // Try to read session id from SessionService\n runWithSDK(\n Effect.gen(function* () {\n const session = yield* SessionServiceTag;\n const sidOpt = yield* session.getSessionId();\n if (Option.isSome(sidOpt)) {\n setSessionId(sidOpt.value);\n setLoading(false);\n return true as const;\n }\n return false as const;\n })\n ).then((has) => {\n if (has) {\n return;\n }\n });\n\n // Create AbortController for cleanup\n const controller = new AbortController();\n\n // Wait for session to be ready\n runWithSDK(\n Effect.gen(function* () {\n const session = yield* SessionServiceTag;\n const sid = yield* session.whenSessionReady({\n signal: controller.signal,\n timeout: 30_000,\n });\n return sid;\n })\n )\n .then((id) => {\n setSessionId(id);\n setLoading(false);\n })\n .catch((err) => {\n // Only set error if not aborted (aborted = component unmounted)\n if (!controller.signal.aborted) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setLoading(false);\n }\n });\n\n // Cleanup function - abort the polling on unmount\n return () => {\n controller.abort();\n };\n }, []);\n\n return { sessionId, loading, error };\n}\n\n/**\n * React hook to execute a callback when the session is ready.\n * Automatically handles cleanup on unmount.\n *\n * @param callback Function to call with the session ID\n * @param deps Dependency array for the callback\n *\n * @example\n * function MyComponent() {\n * useSessionReady((sessionId) => {\n * console.log('Session is ready:', sessionId);\n * // Send analytics event, initialize tracking, etc.\n * }, []);\n * }\n */\nexport function useSessionReady(\n callback: (sessionId: string) => void,\n deps: React.DependencyList = []\n) {\n useEffect(() => {\n const controller = new AbortController();\n\n runWithSDK(\n Effect.gen(function* () {\n const session = yield* SessionServiceTag;\n const sid = yield* session.whenSessionReady({\n signal: controller.signal,\n });\n return sid;\n })\n )\n .then((sessionId: string) => {\n if (!controller.signal.aborted) {\n callback(sessionId);\n }\n })\n .catch((err: unknown) => {\n // Silently ignore abort errors (component unmounted)\n if (!controller.signal.aborted) {\n // biome-ignore lint/complexity/noVoid: necessary to avoid blocking\n void runWithSDK(\n Effect.logError(\"Failed to get session\", {\n error: String(err),\n })\n );\n }\n });\n\n return () => {\n controller.abort();\n };\n // biome-ignore lint/correctness/useExhaustiveDependencies: we want to pass the deps to the effect\n }, deps);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAsBA,SAAgB,aAAa;CAC3B,MAAM,CAAC,WAAW,gBAAgB,SAAwB,KAAK;CAC/D,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAC5C,MAAM,CAAC,OAAO,YAAY,SAAuB,KAAK;AAEtD,iBAAgB;AAGd,aACE,OAAO,IAAI,aAAa;GAEtB,MAAM,SAAS,QADC,OAAO,mBACO,cAAc;AAC5C,OAAI,OAAO,OAAO,OAAO,EAAE;AACzB,iBAAa,OAAO,MAAM;AAC1B,eAAW,MAAM;AACjB,WAAO;;AAET,UAAO;IACP,CACH,CAAC,MAAM,QAAQ;AACd,OAAI,IACF;IAEF;EAGF,MAAM,aAAa,IAAI,iBAAiB;AAGxC,aACE,OAAO,IAAI,aAAa;AAMtB,UAJY,QADI,OAAO,mBACI,iBAAiB;IAC1C,QAAQ,WAAW;IACnB,SAAS;IACV,CAAC;IAEF,CACH,CACE,MAAM,OAAO;AACZ,gBAAa,GAAG;AAChB,cAAW,MAAM;IACjB,CACD,OAAO,QAAQ;AAEd,OAAI,CAAC,WAAW,OAAO,SAAS;AAC9B,aAAS,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,IAAI,CAAC,CAAC;AAC7D,eAAW,MAAM;;IAEnB;AAGJ,eAAa;AACX,cAAW,OAAO;;IAEnB,EAAE,CAAC;AAEN,QAAO;EAAE;EAAW;EAAS;EAAO;;;;;;;;;;;;;;;;;AAkBtC,SAAgB,gBACd,UACA,OAA6B,EAAE,EAC/B;AACA,iBAAgB;EACd,MAAM,aAAa,IAAI,iBAAiB;AAExC,aACE,OAAO,IAAI,aAAa;AAKtB,UAHY,QADI,OAAO,mBACI,iBAAiB,EAC1C,QAAQ,WAAW,QACpB,CAAC;IAEF,CACH,CACE,MAAM,cAAsB;AAC3B,OAAI,CAAC,WAAW,OAAO,QACrB,UAAS,UAAU;IAErB,CACD,OAAO,QAAiB;AAEvB,OAAI,CAAC,WAAW,OAAO,QAErB,CAAK,WACH,OAAO,SAAS,yBAAyB,EACvC,OAAO,OAAO,IAAI,EACnB,CAAC,CACH;IAEH;AAEJ,eAAa;AACX,cAAW,OAAO;;IAGnB,KAAK"}
package/dist/package.mjs DELETED
@@ -1,103 +0,0 @@
1
- //#region package.json
2
- var name = "@interfere/react";
3
- var version = "0.1.0-alpha.6";
4
- var package_default = {
5
- name,
6
- version,
7
- license: "MIT",
8
- description: "Build apps that never break.",
9
- keywords: [
10
- "observability",
11
- "typescript",
12
- "react",
13
- "logging",
14
- "error-tracking",
15
- "session-replay"
16
- ],
17
- homepage: "https://interfere.com",
18
- bugs: { "url": "mailto:support@interfere.com" },
19
- author: "Interfere <support@interfere.com> (https://interfere.com)",
20
- repository: {
21
- "type": "git",
22
- "url": "git+https://github.com/interfere-inc/interfere.git",
23
- "directory": "src/packages/public/react"
24
- },
25
- files: ["dist"],
26
- type: "module",
27
- main: "./dist/index.mjs",
28
- types: "./dist/index.d.mts",
29
- typesVersions: { "*": {
30
- "server/*": ["dist/server/*.d.mts"],
31
- "*": ["dist/*.d.mts"]
32
- } },
33
- exports: {
34
- "./provider": {
35
- "@source": "./src/provider.tsx",
36
- "types": "./dist/provider.d.mts",
37
- "default": "./dist/provider.mjs"
38
- },
39
- "./server/*": {
40
- "@source": "./src/server/*.ts",
41
- "types": "./dist/server/*.d.mts",
42
- "default": "./dist/server/*.mjs"
43
- },
44
- "./core/runtime/*": {
45
- "@source": "./src/core/runtime/*.ts",
46
- "types": "./dist/core/runtime/*.d.mts",
47
- "default": "./dist/core/runtime/*.mjs"
48
- },
49
- "./core/*": {
50
- "@source": "./src/core/*.ts",
51
- "types": "./dist/core/*.d.mts",
52
- "default": "./dist/core/*.mjs"
53
- },
54
- "./*": {
55
- "@source": "./src/*.ts",
56
- "types": "./dist/*.d.mts",
57
- "default": "./dist/*.mjs"
58
- }
59
- },
60
- sideEffects: false,
61
- publishConfig: { "access": "public" },
62
- scripts: {
63
- "build": "tsdown",
64
- "dev": "tsdown --watch",
65
- "typecheck": "tsc --noEmit --incremental"
66
- },
67
- dependencies: {
68
- "@effect/platform": "catalog:",
69
- "@interfere/constants": "workspace:*",
70
- "@interfere/effect-utils": "workspace:*",
71
- "@interfere/types": "workspace:*",
72
- "@rrweb/packer": "catalog:",
73
- "@ua-parser-js/pro-enterprise": "catalog:",
74
- "effect": "catalog:",
75
- "nanoid": "catalog:",
76
- "rrweb": "catalog:",
77
- "uuid": "catalog:",
78
- "zod": "catalog:"
79
- },
80
- peerDependencies: {
81
- "react": ">=18",
82
- "react-dom": ">=18"
83
- },
84
- devDependencies: {
85
- "@effect/vitest": "catalog:",
86
- "@interfere/typescript-config": "workspace:*",
87
- "@interfere/vitest-config": "workspace:*",
88
- "@rrweb/types": "catalog:",
89
- "@types/node": "catalog:",
90
- "@types/react": "catalog:",
91
- "@types/react-dom": "catalog:",
92
- "@vitest/coverage-v8": "catalog:",
93
- "jsdom": "catalog:",
94
- "react": "catalog:",
95
- "react-dom": "catalog:",
96
- "tsdown": "catalog:",
97
- "typescript": "catalog:",
98
- "vitest": "catalog:"
99
- }
100
- };
101
-
102
- //#endregion
103
- export { package_default as default, name, version };
@@ -1 +0,0 @@
1
- {"version":3,"file":"package.mjs","names":[],"sources":["../package.json"],"sourcesContent":[""],"mappings":""}
@@ -1,15 +0,0 @@
1
- //#region src/server/auth.d.ts
2
- type FetchImpl = typeof fetch;
3
- declare function exchangeSecretForPublicToken(apiUrl: string, apiKey: string, surfaceSlug: string | undefined, fetchImpl?: FetchImpl): Promise<{
4
- token: string;
5
- surfaceSlug: string;
6
- } | null>;
7
- declare function getPublicToken(params: {
8
- apiUrl: string;
9
- apiKey: string;
10
- surfaceSlug?: string;
11
- cacheTtlMs?: number;
12
- fetchImpl?: FetchImpl;
13
- }): Promise<string | null>;
14
- //#endregion
15
- export { exchangeSecretForPublicToken, getPublicToken };
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.d.mts","names":[],"sources":["../../src/server/auth.ts"],"mappings":";KAAK,SAAA,UAAmB,KAAA;AAAA,iBAOF,4BAAA,CACpB,MAAA,UACA,MAAA,UACA,WAAA,sBACA,SAAA,GAAW,SAAA,GACV,OAAA;EAAU,KAAA;EAAe,WAAA;AAAA;AAAA,iBAuCN,cAAA,CAAe,MAAA;EACnC,MAAA;EACA,MAAA;EACA,WAAA;EACA,UAAA;EACA,SAAA,GAAY,SAAA;AAAA,IACV,OAAA"}
@@ -1,45 +0,0 @@
1
- //#region src/server/auth.ts
2
- async function exchangeSecretForPublicToken(apiUrl, apiKey, surfaceSlug, fetchImpl = fetch) {
3
- const body = surfaceSlug !== void 0 && surfaceSlug !== "" ? { surfaceSlug } : {};
4
- const res = await fetchImpl(`${apiUrl}/auth/exchange`, {
5
- method: "POST",
6
- headers: {
7
- "x-api-key": apiKey,
8
- "Content-Type": "application/json"
9
- },
10
- body: JSON.stringify(body)
11
- });
12
- if (!res.ok) return null;
13
- const data = await res.json();
14
- if (typeof data.publicToken === "string" && data.publicToken.length > 0) {
15
- const slug = typeof data.surfaceSlug === "string" && data.surfaceSlug.length > 0 ? data.surfaceSlug : surfaceSlug ?? "";
16
- return {
17
- token: data.publicToken,
18
- surfaceSlug: slug
19
- };
20
- }
21
- return null;
22
- }
23
- const tokenCache = /* @__PURE__ */ new Map();
24
- function getCacheKey(apiUrl, apiKey, surfaceSlug) {
25
- return `${apiUrl}::${apiKey}::${surfaceSlug}`;
26
- }
27
- async function getPublicToken(params) {
28
- const { apiUrl, apiKey, surfaceSlug, cacheTtlMs = 36e5, fetchImpl = fetch } = params;
29
- const now = Date.now();
30
- const cacheKey = getCacheKey(apiUrl, apiKey, surfaceSlug ?? "");
31
- const cached = tokenCache.get(cacheKey);
32
- if (cached && cached.expiresAt > now) return cached.token;
33
- const result = await exchangeSecretForPublicToken(apiUrl, apiKey, surfaceSlug, fetchImpl);
34
- if (!result) return null;
35
- const keyForCache = getCacheKey(apiUrl, apiKey, result.surfaceSlug.length > 0 ? result.surfaceSlug : surfaceSlug ?? "");
36
- tokenCache.set(keyForCache, {
37
- token: result.token,
38
- expiresAt: now + cacheTtlMs
39
- });
40
- for (const [key, value] of tokenCache.entries()) if (value.expiresAt <= now) tokenCache.delete(key);
41
- return result.token;
42
- }
43
-
44
- //#endregion
45
- export { exchangeSecretForPublicToken, getPublicToken };
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.mjs","names":[],"sources":["../../src/server/auth.ts"],"sourcesContent":["type FetchImpl = typeof fetch;\n\ninterface ExchangeResponse {\n publicToken: string;\n surfaceSlug?: string;\n}\n\nexport async function exchangeSecretForPublicToken(\n apiUrl: string,\n apiKey: string,\n surfaceSlug: string | undefined,\n fetchImpl: FetchImpl = fetch\n): Promise<{ token: string; surfaceSlug: string } | null> {\n const body =\n surfaceSlug !== undefined && surfaceSlug !== \"\" ? { surfaceSlug } : {};\n\n const res = await fetchImpl(`${apiUrl}/auth/exchange`, {\n method: \"POST\",\n headers: {\n \"x-api-key\": apiKey,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n return null;\n }\n\n const data = (await res.json()) as Partial<ExchangeResponse>;\n if (typeof data.publicToken === \"string\" && data.publicToken.length > 0) {\n const slug =\n typeof data.surfaceSlug === \"string\" && data.surfaceSlug.length > 0\n ? data.surfaceSlug\n : (surfaceSlug ?? \"\");\n return { token: data.publicToken, surfaceSlug: slug };\n }\n\n return null;\n}\n\nconst tokenCache = new Map<string, { token: string; expiresAt: number }>();\n\nfunction getCacheKey(\n apiUrl: string,\n apiKey: string,\n surfaceSlug: string\n): string {\n return `${apiUrl}::${apiKey}::${surfaceSlug}`;\n}\n\nexport async function getPublicToken(params: {\n apiUrl: string;\n apiKey: string;\n surfaceSlug?: string;\n cacheTtlMs?: number;\n fetchImpl?: FetchImpl;\n}): Promise<string | null> {\n const {\n apiUrl,\n apiKey,\n surfaceSlug,\n cacheTtlMs = 3_600_000,\n fetchImpl = fetch,\n } = params;\n\n const now = Date.now();\n const cacheKey = getCacheKey(apiUrl, apiKey, surfaceSlug ?? \"\");\n\n const cached = tokenCache.get(cacheKey);\n if (cached && cached.expiresAt > now) {\n return cached.token;\n }\n\n const result = await exchangeSecretForPublicToken(\n apiUrl,\n apiKey,\n surfaceSlug,\n fetchImpl\n );\n\n if (!result) {\n return null;\n }\n\n const effectiveSlug =\n result.surfaceSlug.length > 0 ? result.surfaceSlug : (surfaceSlug ?? \"\");\n const keyForCache = getCacheKey(apiUrl, apiKey, effectiveSlug);\n tokenCache.set(keyForCache, {\n token: result.token,\n expiresAt: now + cacheTtlMs,\n });\n\n for (const [key, value] of tokenCache.entries()) {\n if (value.expiresAt <= now) {\n tokenCache.delete(key);\n }\n }\n\n return result.token;\n}\n"],"mappings":";AAOA,eAAsB,6BACpB,QACA,QACA,aACA,YAAuB,OACiC;CACxD,MAAM,OACJ,gBAAgB,UAAa,gBAAgB,KAAK,EAAE,aAAa,GAAG,EAAE;CAExE,MAAM,MAAM,MAAM,UAAU,GAAG,OAAO,iBAAiB;EACrD,QAAQ;EACR,SAAS;GACP,aAAa;GACb,gBAAgB;GACjB;EACD,MAAM,KAAK,UAAU,KAAK;EAC3B,CAAC;AAEF,KAAI,CAAC,IAAI,GACP,QAAO;CAGT,MAAM,OAAQ,MAAM,IAAI,MAAM;AAC9B,KAAI,OAAO,KAAK,gBAAgB,YAAY,KAAK,YAAY,SAAS,GAAG;EACvE,MAAM,OACJ,OAAO,KAAK,gBAAgB,YAAY,KAAK,YAAY,SAAS,IAC9D,KAAK,cACJ,eAAe;AACtB,SAAO;GAAE,OAAO,KAAK;GAAa,aAAa;GAAM;;AAGvD,QAAO;;AAGT,MAAM,6BAAa,IAAI,KAAmD;AAE1E,SAAS,YACP,QACA,QACA,aACQ;AACR,QAAO,GAAG,OAAO,IAAI,OAAO,IAAI;;AAGlC,eAAsB,eAAe,QAMV;CACzB,MAAM,EACJ,QACA,QACA,aACA,aAAa,MACb,YAAY,UACV;CAEJ,MAAM,MAAM,KAAK,KAAK;CACtB,MAAM,WAAW,YAAY,QAAQ,QAAQ,eAAe,GAAG;CAE/D,MAAM,SAAS,WAAW,IAAI,SAAS;AACvC,KAAI,UAAU,OAAO,YAAY,IAC/B,QAAO,OAAO;CAGhB,MAAM,SAAS,MAAM,6BACnB,QACA,QACA,aACA,UACD;AAED,KAAI,CAAC,OACH,QAAO;CAKT,MAAM,cAAc,YAAY,QAAQ,QADtC,OAAO,YAAY,SAAS,IAAI,OAAO,cAAe,eAAe,GACT;AAC9D,YAAW,IAAI,aAAa;EAC1B,OAAO,OAAO;EACd,WAAW,MAAM;EAClB,CAAC;AAEF,MAAK,MAAM,CAAC,KAAK,UAAU,WAAW,SAAS,CAC7C,KAAI,MAAM,aAAa,IACrB,YAAW,OAAO,IAAI;AAI1B,QAAO,OAAO"}
@@ -1,34 +0,0 @@
1
- import { Config } from "@interfere/types/sdk/config";
2
- import { Env, Runtime } from "@interfere/types/sdk/runtime";
3
- import { Envelope } from "@interfere/types/sdk/envelope";
4
-
5
- //#region src/server/capture.d.ts
6
- declare function toJsonBytes(obj: unknown): number[];
7
- /**
8
- * Session resolution strategy.
9
- *
10
- * Attempts to resolve session ID in order of preference:
11
- * 1. Header: Parse x-interfere-request header (ideal case)
12
- * 2. AsyncContext: Check AsyncLocalStorage context (for async code paths)
13
- * 3. Fallback: Generate server-side session ID (breaks continuity - tracked for monitoring)
14
- */
15
- interface SessionResolverDeps {
16
- /** Get session context from AsyncLocalStorage */
17
- getAsyncContext?: () => {
18
- sessionId: string | null;
19
- requestId: string | null;
20
- } | undefined;
21
- }
22
- type ServerErrorMeta = Pick<Config["metadata"], "buildId" | "releaseId">;
23
- type ServerErrorEnvelopeInput = ServerErrorMeta & {
24
- error: unknown;
25
- request?: Request;
26
- context?: Record<string, unknown>;
27
- environment: string | Env;
28
- runtime?: string | Runtime; /** Optional dependency injection for session resolution */
29
- sessionResolverDeps?: SessionResolverDeps;
30
- };
31
- declare function buildServerErrorEnvelope(input: ServerErrorEnvelopeInput): Envelope;
32
- declare function sendEnvelopesToIngest(envelopes: Envelope[], ingestUrl: string, surfaceToken: string): Promise<void>;
33
- //#endregion
34
- export { ServerErrorEnvelopeInput, SessionResolverDeps, buildServerErrorEnvelope, sendEnvelopesToIngest, toJsonBytes };
@@ -1 +0,0 @@
1
- {"version":3,"file":"capture.d.mts","names":[],"sources":["../../src/server/capture.ts"],"mappings":";;;;;iBAmBgB,WAAA,CAAY,GAAA;;AAA5B;;;;;AA8CA;;UAAiB,mBAAA;EAAmB;EAElC,eAAA;IACM,SAAA;IAA0B,SAAA;EAAA;AAAA;AAAA,KAkF7B,eAAA,GAAkB,IAAA,CAAK,MAAA;AAAA,KAEhB,wBAAA,GAA2B,eAAA;EACrC,KAAA;EACA,OAAA,GAAU,OAAA;EACV,OAAA,GAAU,MAAA;EACV,WAAA,WAAsB,GAAA;EACtB,OAAA,YAAmB,OAAA;EAEnB,mBAAA,GAAsB,mBAAA;AAAA;AAAA,iBA6FR,wBAAA,CACd,KAAA,EAAO,wBAAA,GACN,QAAA;AAAA,iBAsDmB,qBAAA,CACpB,SAAA,EAAW,QAAA,IACX,SAAA,UACA,YAAA,WACC,OAAA"}