@farm.js/core 0.1.0-beta.95 → 0.1.0-beta.97

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 (317) hide show
  1. package/dist/after.cjs +1 -1
  2. package/dist/after.mjs +1 -1
  3. package/dist/agent-runtime.d.mts +3 -2
  4. package/dist/agent-runtime.d.ts +3 -2
  5. package/dist/api/route-manager.cjs +43 -4
  6. package/dist/api/route-manager.d.mts +4 -3
  7. package/dist/api/route-manager.d.ts +4 -3
  8. package/dist/api/route-manager.mjs +7 -7
  9. package/dist/api/runtime.cjs +43 -4
  10. package/dist/api/runtime.d.mts +1 -1
  11. package/dist/api/runtime.d.ts +1 -1
  12. package/dist/api/runtime.mjs +5 -5
  13. package/dist/api.cjs +352 -109
  14. package/dist/api.d.mts +7 -6
  15. package/dist/api.d.ts +7 -6
  16. package/dist/api.mjs +19 -12
  17. package/dist/{app-CIIEvA4r.d.ts → app-CIOx3LvY.d.ts} +4 -4
  18. package/dist/{app-O4AEC1OH.d.mts → app-DBd6437H.d.mts} +4 -4
  19. package/dist/app-markdown.d.mts +4 -3
  20. package/dist/app-markdown.d.ts +4 -3
  21. package/dist/cache.cjs +42 -4
  22. package/dist/cache.d.mts +68 -1
  23. package/dist/cache.d.ts +68 -1
  24. package/dist/cache.mjs +3 -3
  25. package/dist/{chunk-AXVJCMVF.mjs → chunk-2HDOV47R.mjs} +3 -3
  26. package/dist/chunk-2HDOV47R.mjs.map +1 -0
  27. package/dist/{chunk-RBRLLZL5.mjs → chunk-34IAPZBG.mjs} +16 -3
  28. package/dist/chunk-34IAPZBG.mjs.map +1 -0
  29. package/dist/{chunk-VV24CC42.mjs → chunk-35NPLKQJ.mjs} +2 -2
  30. package/dist/{chunk-D7QH7MDU.mjs → chunk-3TWQERDE.mjs} +5 -4
  31. package/dist/chunk-3TWQERDE.mjs.map +1 -0
  32. package/dist/{chunk-RWYRFCLG.mjs → chunk-4X57GXQA.mjs} +2 -2
  33. package/dist/{chunk-KOTSX5JH.mjs → chunk-52BR7LTX.mjs} +30 -21
  34. package/dist/chunk-52BR7LTX.mjs.map +1 -0
  35. package/dist/{chunk-SALMKQXH.mjs → chunk-6EJHNHH4.mjs} +80 -27
  36. package/dist/chunk-6EJHNHH4.mjs.map +1 -0
  37. package/dist/{chunk-ZFNK77WN.mjs → chunk-6JNGOC37.mjs} +2 -2
  38. package/dist/{after.cjs.map → chunk-6JNGOC37.mjs.map} +1 -1
  39. package/dist/{chunk-MOW47IF5.mjs → chunk-6UYVU46O.mjs} +2 -2
  40. package/dist/{chunk-7MABZJIM.mjs → chunk-7PYVLJ4J.mjs} +1 -1
  41. package/dist/chunk-7PYVLJ4J.mjs.map +1 -0
  42. package/dist/{chunk-FLHLPB57.mjs → chunk-D7F7YZ7L.mjs} +93 -67
  43. package/dist/chunk-D7F7YZ7L.mjs.map +1 -0
  44. package/dist/chunk-DU3PKDVQ.mjs +35 -0
  45. package/dist/chunk-DU3PKDVQ.mjs.map +1 -0
  46. package/dist/{chunk-SCFX4UTD.mjs → chunk-EHTUKVSW.mjs} +1 -1
  47. package/dist/chunk-EHTUKVSW.mjs.map +1 -0
  48. package/dist/{chunk-KWCNQUH5.mjs → chunk-EPDIF432.mjs} +526 -50
  49. package/dist/chunk-EPDIF432.mjs.map +1 -0
  50. package/dist/{chunk-A3636IHN.mjs → chunk-FP5Q67FO.mjs} +167 -96
  51. package/dist/chunk-FP5Q67FO.mjs.map +1 -0
  52. package/dist/{chunk-HHZAOTQD.mjs → chunk-GJ7W6LNK.mjs} +7 -6
  53. package/dist/chunk-GJ7W6LNK.mjs.map +1 -0
  54. package/dist/{chunk-RLGUZ3HS.mjs → chunk-I3OOUWO5.mjs} +3 -3
  55. package/dist/{chunk-75CGAL6E.mjs → chunk-IZBX2TEU.mjs} +217 -105
  56. package/dist/chunk-IZBX2TEU.mjs.map +1 -0
  57. package/dist/{chunk-22VG4DFJ.mjs → chunk-J3MPQ4MQ.mjs} +2 -2
  58. package/dist/{chunk-22VG4DFJ.mjs.map → chunk-J3MPQ4MQ.mjs.map} +1 -1
  59. package/dist/{chunk-2LS3KKE7.mjs → chunk-JV7JUD7Q.mjs} +4 -4
  60. package/dist/{chunk-Q3OX763A.mjs → chunk-LXDASSTE.mjs} +2 -2
  61. package/dist/{chunk-ZRBCBOEX.mjs → chunk-N2FY2QZ7.mjs} +28 -3
  62. package/dist/chunk-N2FY2QZ7.mjs.map +1 -0
  63. package/dist/{chunk-MRVJCLYQ.mjs → chunk-PSQ7N4XP.mjs} +4 -2
  64. package/dist/chunk-PSQ7N4XP.mjs.map +1 -0
  65. package/dist/{chunk-HVG3HLQZ.mjs → chunk-Q7WGOOAI.mjs} +3 -3
  66. package/dist/{chunk-WTYAPO5I.mjs → chunk-RCNWMEBT.mjs} +3 -2
  67. package/dist/{chunk-WTYAPO5I.mjs.map → chunk-RCNWMEBT.mjs.map} +1 -1
  68. package/dist/{chunk-3INDBMUU.mjs → chunk-TGDIACZT.mjs} +2 -2
  69. package/dist/{chunk-WB75GIX2.mjs → chunk-TQTB33JS.mjs} +14 -3
  70. package/dist/chunk-TQTB33JS.mjs.map +1 -0
  71. package/dist/{chunk-MH27UH72.mjs → chunk-TT3E2JOF.mjs} +3 -3
  72. package/dist/{chunk-UWRGX3J3.mjs → chunk-UMUWR5XA.mjs} +2 -2
  73. package/dist/{chunk-XTLLHCWU.mjs → chunk-V4VRLVLW.mjs} +52 -31
  74. package/dist/chunk-V4VRLVLW.mjs.map +1 -0
  75. package/dist/{chunk-EXCGBERG.mjs → chunk-WD2EBM3I.mjs} +79 -17
  76. package/dist/chunk-WD2EBM3I.mjs.map +1 -0
  77. package/dist/{chunk-DLBUAJTK.mjs → chunk-WMJGA32P.mjs} +74 -5
  78. package/dist/chunk-WMJGA32P.mjs.map +1 -0
  79. package/dist/{chunk-TKQCJMY7.mjs → chunk-X4SFHKFH.mjs} +7 -4
  80. package/dist/{chunk-TKQCJMY7.mjs.map → chunk-X4SFHKFH.mjs.map} +1 -1
  81. package/dist/{chunk-Q7GPJZCO.mjs → chunk-YIBV77KZ.mjs} +26 -7
  82. package/dist/chunk-YIBV77KZ.mjs.map +1 -0
  83. package/dist/client/lifecycle.mjs +2 -2
  84. package/dist/{client-mcMC334J.d.mts → client-DWoLZ3QU.d.mts} +52 -5
  85. package/dist/{client-d5ONQ-Pd.d.ts → client-DuQuQC1h.d.ts} +52 -5
  86. package/dist/client-cache-BMxuFqwH.d.ts +18 -0
  87. package/dist/client-cache-CCK-fCe0.d.mts +18 -0
  88. package/dist/{client-plugins-BvClItiL.d.mts → client-plugins-B6-07YmP.d.mts} +52 -99
  89. package/dist/{client-plugins-B9Sq-iMg.d.ts → client-plugins-By6MVUX-.d.ts} +52 -99
  90. package/dist/client-plugins.cjs +1 -1
  91. package/dist/client-plugins.d.mts +3 -2
  92. package/dist/client-plugins.d.ts +3 -2
  93. package/dist/client-plugins.mjs +2 -2
  94. package/dist/client.cjs +1046 -211
  95. package/dist/client.d.mts +136 -18
  96. package/dist/client.d.ts +136 -18
  97. package/dist/client.mjs +32 -15
  98. package/dist/config.d.mts +3 -2
  99. package/dist/config.d.ts +3 -2
  100. package/dist/{devtools-S52RRRMN.mjs → devtools-XWZX6CCL.mjs} +5 -5
  101. package/dist/{devtools-client-3XRTBND5.mjs → devtools-client-Z7QQA3Q2.mjs} +56 -17
  102. package/dist/devtools-client-Z7QQA3Q2.mjs.map +1 -0
  103. package/dist/{devtools-ui-NJKFORTG.mjs → devtools-ui-2HG5M4EL.mjs} +3 -1
  104. package/dist/devtools-ui-2HG5M4EL.mjs.map +1 -0
  105. package/dist/docs.cjs +24 -5
  106. package/dist/docs.mjs +5 -5
  107. package/dist/i18n/server.cjs +13 -2
  108. package/dist/i18n/server.d.mts +2 -2
  109. package/dist/i18n/server.d.ts +2 -2
  110. package/dist/i18n/server.mjs +1 -1
  111. package/dist/index.cjs +1928 -894
  112. package/dist/index.d.mts +139 -21
  113. package/dist/index.d.ts +139 -21
  114. package/dist/index.mjs +57 -34
  115. package/dist/index.mjs.map +1 -1
  116. package/dist/integration-api-BT024nuJ.d.mts +97 -0
  117. package/dist/integration-api-BT024nuJ.d.ts +97 -0
  118. package/dist/integrations.d.mts +3 -2
  119. package/dist/integrations.d.ts +3 -2
  120. package/dist/internal/build-runtime.cjs +764 -547
  121. package/dist/internal/build-runtime.d.mts +5 -4
  122. package/dist/internal/build-runtime.d.ts +5 -4
  123. package/dist/internal/build-runtime.mjs +16 -16
  124. package/dist/internal/client-runtime.cjs +1 -1
  125. package/dist/internal/client-runtime.mjs +2 -2
  126. package/dist/internal/config-runtime.cjs +4 -1
  127. package/dist/internal/config-runtime.d.mts +4 -3
  128. package/dist/internal/config-runtime.d.ts +4 -3
  129. package/dist/internal/config-runtime.mjs +4 -4
  130. package/dist/internal/product-telemetry-runtime.cjs +1 -1
  131. package/dist/internal/product-telemetry-runtime.mjs +1 -1
  132. package/dist/internal/production-runtime.cjs +29 -3
  133. package/dist/internal/production-runtime.d.mts +8 -7
  134. package/dist/internal/production-runtime.d.ts +8 -7
  135. package/dist/internal/production-runtime.mjs +5 -5
  136. package/dist/{metadata-route-yV4U6X8h.d.ts → metadata-route-8_V3UonT.d.ts} +1 -1
  137. package/dist/{metadata-route-p4K1l92V.d.mts → metadata-route-CWP_HjGU.d.mts} +1 -1
  138. package/dist/middleware.cjs +28 -2
  139. package/dist/middleware.d.mts +5 -4
  140. package/dist/middleware.d.ts +5 -4
  141. package/dist/middleware.mjs +4 -4
  142. package/dist/navigation.cjs +3 -1
  143. package/dist/navigation.mjs +3 -3
  144. package/dist/observability.cjs +27 -2
  145. package/dist/observability.mjs +1 -1
  146. package/dist/plugin.cjs +528 -349
  147. package/dist/plugin.d.mts +3 -2
  148. package/dist/plugin.d.ts +3 -2
  149. package/dist/plugin.mjs +13 -13
  150. package/dist/{production-runtime-IkB0Qj4i.d.mts → production-runtime-BGRH1dKG.d.mts} +1 -1
  151. package/dist/{production-runtime-0JTch4_d.d.ts → production-runtime-CdmzsDax.d.ts} +1 -1
  152. package/dist/query/client.cjs +68 -29
  153. package/dist/query/client.mjs +69 -30
  154. package/dist/query/client.mjs.map +1 -1
  155. package/dist/{render-plan-Dc8CjNI7.d.ts → render-plan-0GeHiGVZ.d.ts} +1 -1
  156. package/dist/{render-plan-CU31j-Jk.d.mts → render-plan-DLxJYAA5.d.mts} +1 -1
  157. package/dist/renderer-client.cjs +169 -26
  158. package/dist/renderer-client.d.mts +7 -6
  159. package/dist/renderer-client.d.ts +7 -6
  160. package/dist/renderer-client.mjs +16 -19
  161. package/dist/renderer-client.mjs.map +1 -1
  162. package/dist/{request-BXa1KY8i.d.mts → request-BCNXSXLh.d.mts} +1 -1
  163. package/dist/{request-CUUBujZt.d.ts → request-BstWbZ6O.d.ts} +1 -1
  164. package/dist/request.d.mts +4 -3
  165. package/dist/request.d.ts +4 -3
  166. package/dist/{route-Y8lfz1wF.d.ts → route-4pd-EVtw.d.ts} +45 -50
  167. package/dist/{route-Cq3aObmj.d.mts → route-CvEr4Uc9.d.mts} +45 -50
  168. package/dist/routes.cjs +27 -2
  169. package/dist/routes.d.mts +3 -2
  170. package/dist/routes.d.ts +3 -2
  171. package/dist/routes.mjs +4 -4
  172. package/dist/{runtime-j1S3sDTh.d.ts → runtime-BgDQzBiu.d.ts} +1 -0
  173. package/dist/{runtime-DDwvDtS4.d.mts → runtime-CV2UCV-5.d.mts} +1 -0
  174. package/dist/server-action-security.mjs +2 -2
  175. package/dist/server-fn-client.cjs +102 -26
  176. package/dist/server-fn-client.d.mts +6 -0
  177. package/dist/server-fn-client.d.ts +6 -0
  178. package/dist/server-fn-client.mjs +2 -1
  179. package/dist/server-fn.cjs +42 -4
  180. package/dist/server-fn.mjs +5 -5
  181. package/dist/server-plugins.d.mts +4 -3
  182. package/dist/server-plugins.d.ts +4 -3
  183. package/dist/server-query-client.cjs +195 -34
  184. package/dist/server-query-client.d.mts +3 -3
  185. package/dist/server-query-client.d.ts +3 -3
  186. package/dist/server-query-client.mjs +7 -7
  187. package/dist/{server-query-runtime-3zAj77yv.d.ts → server-query-runtime-DXRNhX_3.d.ts} +2 -0
  188. package/dist/{server-query-runtime-B50KAcj5.d.mts → server-query-runtime-aP52iuL5.d.mts} +2 -0
  189. package/dist/server-query.cjs +44 -5
  190. package/dist/server-query.d.mts +4 -0
  191. package/dist/server-query.d.ts +4 -0
  192. package/dist/server-query.mjs +7 -7
  193. package/dist/server.cjs +553 -370
  194. package/dist/server.d.mts +11 -10
  195. package/dist/server.d.ts +11 -10
  196. package/dist/server.mjs +17 -17
  197. package/dist/{spa-router-CyLkwst6.d.mts → spa-router-BeyAVSc6.d.mts} +1 -1
  198. package/dist/{spa-router-BkqGXaV_.d.ts → spa-router-COgu4txb.d.ts} +1 -1
  199. package/dist/testing.cjs +27 -2
  200. package/dist/testing.d.mts +3 -2
  201. package/dist/testing.d.ts +3 -2
  202. package/dist/testing.mjs +9 -9
  203. package/dist/{utils-NKR6SoNv.d.mts → utils-DL2VwDQl.d.mts} +1 -1
  204. package/dist/{utils-B2OHrb9F.d.ts → utils-DkU2c_1B.d.ts} +1 -1
  205. package/dist/version.cjs +1 -1
  206. package/dist/version.mjs +1 -1
  207. package/dist/vite.cjs +536 -353
  208. package/dist/vite.d.mts +3 -2
  209. package/dist/vite.d.ts +3 -2
  210. package/dist/vite.mjs +17 -13
  211. package/package.json +17 -17
  212. package/types/client.d.ts +115 -10
  213. package/dist/agent-runtime.cjs.map +0 -1
  214. package/dist/api/route-manager.cjs.map +0 -1
  215. package/dist/api/runtime.cjs.map +0 -1
  216. package/dist/api.cjs.map +0 -1
  217. package/dist/app-markdown.cjs.map +0 -1
  218. package/dist/cache.cjs.map +0 -1
  219. package/dist/chunk-75CGAL6E.mjs.map +0 -1
  220. package/dist/chunk-7MABZJIM.mjs.map +0 -1
  221. package/dist/chunk-A3636IHN.mjs.map +0 -1
  222. package/dist/chunk-AXVJCMVF.mjs.map +0 -1
  223. package/dist/chunk-D7QH7MDU.mjs.map +0 -1
  224. package/dist/chunk-DLBUAJTK.mjs.map +0 -1
  225. package/dist/chunk-EXCGBERG.mjs.map +0 -1
  226. package/dist/chunk-FLHLPB57.mjs.map +0 -1
  227. package/dist/chunk-HHZAOTQD.mjs.map +0 -1
  228. package/dist/chunk-KOTSX5JH.mjs.map +0 -1
  229. package/dist/chunk-KWCNQUH5.mjs.map +0 -1
  230. package/dist/chunk-MRVJCLYQ.mjs.map +0 -1
  231. package/dist/chunk-Q7GPJZCO.mjs.map +0 -1
  232. package/dist/chunk-RBRLLZL5.mjs.map +0 -1
  233. package/dist/chunk-SALMKQXH.mjs.map +0 -1
  234. package/dist/chunk-SCFX4UTD.mjs.map +0 -1
  235. package/dist/chunk-WB75GIX2.mjs.map +0 -1
  236. package/dist/chunk-XTLLHCWU.mjs.map +0 -1
  237. package/dist/chunk-ZFNK77WN.mjs.map +0 -1
  238. package/dist/chunk-ZRBCBOEX.mjs.map +0 -1
  239. package/dist/client/lifecycle.cjs.map +0 -1
  240. package/dist/client-cache-CopR_MaI.d.mts +0 -6
  241. package/dist/client-cache-Djy_TlE8.d.ts +0 -6
  242. package/dist/client-plugins.cjs.map +0 -1
  243. package/dist/client.cjs.map +0 -1
  244. package/dist/config.cjs.map +0 -1
  245. package/dist/cron.cjs.map +0 -1
  246. package/dist/deferred.cjs.map +0 -1
  247. package/dist/deployment.cjs.map +0 -1
  248. package/dist/devtools-client-3XRTBND5.mjs.map +0 -1
  249. package/dist/devtools-ui-NJKFORTG.mjs.map +0 -1
  250. package/dist/docs.cjs.map +0 -1
  251. package/dist/env-types.cjs.map +0 -1
  252. package/dist/env.cjs.map +0 -1
  253. package/dist/environment/vite.cjs.map +0 -1
  254. package/dist/environment.cjs.map +0 -1
  255. package/dist/font.cjs.map +0 -1
  256. package/dist/headers.cjs.map +0 -1
  257. package/dist/i18n/client.cjs.map +0 -1
  258. package/dist/i18n/index.cjs.map +0 -1
  259. package/dist/i18n/server.cjs.map +0 -1
  260. package/dist/image/server.cjs.map +0 -1
  261. package/dist/image/sharp.cjs.map +0 -1
  262. package/dist/image.cjs.map +0 -1
  263. package/dist/index.cjs.map +0 -1
  264. package/dist/instrumentation.cjs.map +0 -1
  265. package/dist/integrations.cjs.map +0 -1
  266. package/dist/internal/build-runtime.cjs.map +0 -1
  267. package/dist/internal/client-runtime.cjs.map +0 -1
  268. package/dist/internal/config-runtime.cjs.map +0 -1
  269. package/dist/internal/isolated-boundary.cjs.map +0 -1
  270. package/dist/internal/metadata-image-runtime.cjs.map +0 -1
  271. package/dist/internal/product-telemetry-runtime.cjs.map +0 -1
  272. package/dist/internal/production-node-env.cjs.map +0 -1
  273. package/dist/internal/production-runtime.cjs.map +0 -1
  274. package/dist/markdown.cjs.map +0 -1
  275. package/dist/middleware.cjs.map +0 -1
  276. package/dist/navigation.cjs.map +0 -1
  277. package/dist/observability.cjs.map +0 -1
  278. package/dist/plugin.cjs.map +0 -1
  279. package/dist/query/client.cjs.map +0 -1
  280. package/dist/query/index.cjs.map +0 -1
  281. package/dist/query/parsers.cjs.map +0 -1
  282. package/dist/query/server.cjs.map +0 -1
  283. package/dist/renderer/react/client.cjs.map +0 -1
  284. package/dist/renderer/react/server.cjs.map +0 -1
  285. package/dist/renderer/react/vite.cjs.map +0 -1
  286. package/dist/renderer-client.cjs.map +0 -1
  287. package/dist/renderer.cjs.map +0 -1
  288. package/dist/request.cjs.map +0 -1
  289. package/dist/router.cjs.map +0 -1
  290. package/dist/routes.cjs.map +0 -1
  291. package/dist/server-action-security.cjs.map +0 -1
  292. package/dist/server-fn-client.cjs.map +0 -1
  293. package/dist/server-fn.cjs.map +0 -1
  294. package/dist/server-plugins.cjs.map +0 -1
  295. package/dist/server-query-client.cjs.map +0 -1
  296. package/dist/server-query.cjs.map +0 -1
  297. package/dist/server.cjs.map +0 -1
  298. package/dist/storage.cjs.map +0 -1
  299. package/dist/testing.cjs.map +0 -1
  300. package/dist/theme/client.cjs.map +0 -1
  301. package/dist/theme/index.cjs.map +0 -1
  302. package/dist/theme/runtime.cjs.map +0 -1
  303. package/dist/theme/server.cjs.map +0 -1
  304. package/dist/version.cjs.map +0 -1
  305. package/dist/vite.cjs.map +0 -1
  306. package/dist/workflows.cjs.map +0 -1
  307. /package/dist/{chunk-VV24CC42.mjs.map → chunk-35NPLKQJ.mjs.map} +0 -0
  308. /package/dist/{chunk-RWYRFCLG.mjs.map → chunk-4X57GXQA.mjs.map} +0 -0
  309. /package/dist/{chunk-MOW47IF5.mjs.map → chunk-6UYVU46O.mjs.map} +0 -0
  310. /package/dist/{chunk-RLGUZ3HS.mjs.map → chunk-I3OOUWO5.mjs.map} +0 -0
  311. /package/dist/{chunk-2LS3KKE7.mjs.map → chunk-JV7JUD7Q.mjs.map} +0 -0
  312. /package/dist/{chunk-Q3OX763A.mjs.map → chunk-LXDASSTE.mjs.map} +0 -0
  313. /package/dist/{chunk-HVG3HLQZ.mjs.map → chunk-Q7WGOOAI.mjs.map} +0 -0
  314. /package/dist/{chunk-3INDBMUU.mjs.map → chunk-TGDIACZT.mjs.map} +0 -0
  315. /package/dist/{chunk-MH27UH72.mjs.map → chunk-TT3E2JOF.mjs.map} +0 -0
  316. /package/dist/{chunk-UWRGX3J3.mjs.map → chunk-UMUWR5XA.mjs.map} +0 -0
  317. /package/dist/{devtools-S52RRRMN.mjs.map → devtools-XWZX6CCL.mjs.map} +0 -0
package/dist/api.cjs CHANGED
@@ -75,7 +75,13 @@ function recordFarmEventTrace(event) {
75
75
  activeSpan.addEvent(event.type, toEventAttributes(event), event.timestamp);
76
76
  }
77
77
  const error = event.type === "request.error" ? void 0 : getEventError(event);
78
- if (error !== void 0) recordSpanError(activeSpan, error);
78
+ if (error !== void 0) {
79
+ if (event.type === "render.error") {
80
+ recordSpanException(activeSpan, error);
81
+ } else {
82
+ recordSpanError(activeSpan, error);
83
+ }
84
+ }
79
85
  }
80
86
  const completedTraceContext = recordCompletedEventSpan(event, activeContext);
81
87
  return traceContext ?? completedTraceContext;
@@ -169,12 +175,25 @@ function getCompletedSpanDescriptor(event) {
169
175
  return void 0;
170
176
  }
171
177
  }
178
+ function hashFarmCacheKey(value) {
179
+ let hash = 2166136261;
180
+ for (let index = 0; index < value.length; index++) {
181
+ hash ^= value.charCodeAt(index);
182
+ hash = Math.imul(hash, 16777619);
183
+ }
184
+ return (hash >>> 0).toString(16).padStart(8, "0");
185
+ }
172
186
  function toEventAttributes(event) {
173
187
  const attributes = {};
188
+ const redactKey = typeof event.type === "string" && event.type.startsWith("cache.");
174
189
  for (const [key, value] of Object.entries(event)) {
175
190
  if (key === "timestamp" || key === "level" || key === "error" || key === "traceId" || key === "spanId" || key === "traceSampled" || value === void 0) {
176
191
  continue;
177
192
  }
193
+ if (redactKey && key === "key" && typeof value === "string") {
194
+ attributes["farm.key_hash"] = hashFarmCacheKey(value);
195
+ continue;
196
+ }
178
197
  if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
179
198
  attributes[`farm.${key}`] = value;
180
199
  } else if (Array.isArray(value)) {
@@ -192,9 +211,13 @@ function toEventAttributes(event) {
192
211
  function getEventError(event) {
193
212
  return "error" in event ? event.error : void 0;
194
213
  }
195
- function recordSpanError(span, error) {
214
+ function recordSpanException(span, error) {
196
215
  const normalized = error instanceof Error ? error : new Error(String(error));
197
216
  span.recordException(normalized);
217
+ return normalized;
218
+ }
219
+ function recordSpanError(span, error) {
220
+ const normalized = recordSpanException(span, error);
198
221
  span.setStatus({ code: import_api.SpanStatusCode.ERROR, message: normalized.message });
199
222
  }
200
223
  function setResponseStatus(span, status) {
@@ -245,8 +268,10 @@ var init_tracing = __esm({
245
268
  __name(recordFarmEventTrace, "recordFarmEventTrace");
246
269
  __name(recordCompletedEventSpan, "recordCompletedEventSpan");
247
270
  __name(getCompletedSpanDescriptor, "getCompletedSpanDescriptor");
271
+ __name(hashFarmCacheKey, "hashFarmCacheKey");
248
272
  __name(toEventAttributes, "toEventAttributes");
249
273
  __name(getEventError, "getEventError");
274
+ __name(recordSpanException, "recordSpanException");
250
275
  __name(recordSpanError, "recordSpanError");
251
276
  __name(setResponseStatus, "setResponseStatus");
252
277
  __name(getSpanTraceContext, "getSpanTraceContext");
@@ -393,15 +418,27 @@ function getFarmCacheInvalidationState() {
393
418
  taskListeners: /* @__PURE__ */ new Set()
394
419
  });
395
420
  }
421
+ function warnFarmCacheListenerError(scope, error) {
422
+ const detail = error instanceof Error ? error.stack ?? error.message : String(error);
423
+ console.warn(`[farm:cache] ${scope} listener failed: ${detail}`);
424
+ }
396
425
  function notifyFarmCacheInvalidation(key) {
397
426
  if (typeof key !== "string" || key.length === 0) return;
398
427
  for (const listener of getFarmCacheInvalidationState().listeners) {
399
- listener(key);
428
+ try {
429
+ listener(key);
430
+ } catch (error) {
431
+ warnFarmCacheListenerError("invalidation", error);
432
+ }
400
433
  }
401
434
  }
402
435
  function notifyFarmCacheTask(task) {
403
436
  for (const listener of getFarmCacheInvalidationState().taskListeners) {
404
- listener(task);
437
+ try {
438
+ listener(task);
439
+ } catch (error) {
440
+ warnFarmCacheListenerError("task", error);
441
+ }
405
442
  }
406
443
  }
407
444
  function applyFarmCacheInvalidations(keys) {
@@ -443,6 +480,7 @@ var init_cache_invalidation = __esm({
443
480
  FARM_CACHE_INVALIDATION_STATE = /* @__PURE__ */ Symbol.for("farm.cacheInvalidationState");
444
481
  globalState = globalThis;
445
482
  __name(getFarmCacheInvalidationState, "getFarmCacheInvalidationState");
483
+ __name(warnFarmCacheListenerError, "warnFarmCacheListenerError");
446
484
  __name(notifyFarmCacheInvalidation, "notifyFarmCacheInvalidation");
447
485
  __name(notifyFarmCacheTask, "notifyFarmCacheTask");
448
486
  __name(applyFarmCacheInvalidations, "applyFarmCacheInvalidations");
@@ -2250,6 +2288,7 @@ __export(api_exports, {
2250
2288
  POST: () => POST,
2251
2289
  PUT: () => PUT,
2252
2290
  QUERY: () => QUERY,
2291
+ applyServerFnOptimisticUpdates: () => applyServerFnOptimisticUpdates,
2253
2292
  createAPIClient: () => createAPIClient,
2254
2293
  createApiClients: () => createApiClients,
2255
2294
  createEndpoint: () => createEndpoint,
@@ -2278,6 +2317,8 @@ __export(api_exports, {
2278
2317
  resolveFarmAPIRequestURL: () => resolveFarmAPIRequestURL,
2279
2318
  resolveFarmAPIServerBasePath: () => resolveFarmAPIServerBasePath,
2280
2319
  resolvePluginRoutes: () => resolvePluginRoutes,
2320
+ resolveServerFnInvalidateTargets: () => resolveServerFnInvalidateTargets,
2321
+ settleServerFnOptimisticUpdates: () => settleServerFnOptimisticUpdates,
2281
2322
  toFormData: () => toFormData
2282
2323
  });
2283
2324
  module.exports = __toCommonJS(api_exports);
@@ -2323,12 +2364,15 @@ function jsonStream(source, init = {}) {
2323
2364
  const iterator = toAsyncIterator(source);
2324
2365
  const encoder = new TextEncoder();
2325
2366
  let finished = false;
2367
+ let cleanup;
2368
+ const closeSource = /* @__PURE__ */ __name((reason) => cleanup ?? (cleanup = Promise.resolve().then(() => iterator.return?.(reason))), "closeSource");
2326
2369
  const body = new ReadableStream(
2327
2370
  {
2328
2371
  async pull(controller) {
2329
2372
  if (finished) return;
2330
2373
  try {
2331
2374
  const next = await iterator.next();
2375
+ if (finished) return;
2332
2376
  if (next.done) {
2333
2377
  finished = true;
2334
2378
  controller.close();
@@ -2337,9 +2381,10 @@ function jsonStream(source, init = {}) {
2337
2381
  controller.enqueue(encoder.encode(`${JSON.stringify(next.value)}
2338
2382
  `));
2339
2383
  } catch (error) {
2384
+ if (finished) return;
2340
2385
  finished = true;
2341
2386
  try {
2342
- await iterator.return?.(error);
2387
+ await closeSource(error);
2343
2388
  } catch {
2344
2389
  }
2345
2390
  controller.error(error);
@@ -2347,7 +2392,7 @@ function jsonStream(source, init = {}) {
2347
2392
  },
2348
2393
  async cancel(reason) {
2349
2394
  finished = true;
2350
- await iterator.return?.(reason);
2395
+ await closeSource(reason);
2351
2396
  }
2352
2397
  },
2353
2398
  {
@@ -2380,6 +2425,7 @@ function readJSONStream(response) {
2380
2425
  const decoder = new TextDecoder();
2381
2426
  let buffer = "";
2382
2427
  let completed = false;
2428
+ let cancelled = false;
2383
2429
  let claimed = false;
2384
2430
  let released = false;
2385
2431
  const releaseReader = /* @__PURE__ */ __name(() => {
@@ -2399,39 +2445,54 @@ function readJSONStream(response) {
2399
2445
  throw error;
2400
2446
  }
2401
2447
  }, "parseLine");
2402
- const iterator = {
2403
- async next() {
2404
- while (true) {
2405
- const lineEnd = buffer.indexOf("\n");
2406
- if (lineEnd >= 0) {
2407
- const line = buffer.slice(0, lineEnd).trim();
2408
- buffer = buffer.slice(lineEnd + 1);
2409
- if (!line) continue;
2410
- return { done: false, value: await parseLine(line) };
2411
- }
2412
- if (completed) {
2413
- const line = buffer.trim();
2414
- buffer = "";
2415
- if (!line) {
2416
- releaseReader();
2417
- return { done: true, value: void 0 };
2418
- }
2419
- return { done: false, value: await parseLine(line) };
2420
- }
2421
- let chunk;
2422
- try {
2423
- chunk = await reader.read();
2424
- } catch (error) {
2425
- completed = true;
2426
- buffer = "";
2448
+ const readNext = /* @__PURE__ */ __name(async () => {
2449
+ while (true) {
2450
+ if (cancelled) return { done: true, value: void 0 };
2451
+ const lineEnd = buffer.indexOf("\n");
2452
+ if (lineEnd >= 0) {
2453
+ const line = buffer.slice(0, lineEnd).trim();
2454
+ buffer = buffer.slice(lineEnd + 1);
2455
+ if (!line) continue;
2456
+ return { done: false, value: await parseLine(line) };
2457
+ }
2458
+ if (completed) {
2459
+ const line = buffer.trim();
2460
+ buffer = "";
2461
+ if (!line) {
2427
2462
  releaseReader();
2428
- throw error;
2463
+ return { done: true, value: void 0 };
2429
2464
  }
2430
- completed = chunk.done;
2431
- buffer += decoder.decode(chunk.value, { stream: !chunk.done });
2465
+ return { done: false, value: await parseLine(line) };
2466
+ }
2467
+ let chunk;
2468
+ try {
2469
+ chunk = await reader.read();
2470
+ } catch (error) {
2471
+ if (cancelled) return { done: true, value: void 0 };
2472
+ completed = true;
2473
+ buffer = "";
2474
+ releaseReader();
2475
+ throw error;
2432
2476
  }
2477
+ if (cancelled) return { done: true, value: void 0 };
2478
+ completed = chunk.done;
2479
+ buffer += decoder.decode(chunk.value, { stream: !chunk.done });
2480
+ }
2481
+ }, "readNext");
2482
+ let readQueue = Promise.resolve();
2483
+ const iterator = {
2484
+ next() {
2485
+ const result = readQueue.then(readNext);
2486
+ readQueue = result.then(
2487
+ () => {
2488
+ },
2489
+ () => {
2490
+ }
2491
+ );
2492
+ return result;
2433
2493
  },
2434
2494
  async return() {
2495
+ cancelled = true;
2435
2496
  completed = true;
2436
2497
  buffer = "";
2437
2498
  if (!released) {
@@ -2447,6 +2508,7 @@ function readJSONStream(response) {
2447
2508
  return {
2448
2509
  response,
2449
2510
  async cancel(reason) {
2511
+ cancelled = true;
2450
2512
  completed = true;
2451
2513
  buffer = "";
2452
2514
  if (!released) {
@@ -2573,6 +2635,7 @@ function createEndpoint(pathOrOptions, optionsOrHandler, maybeHandler) {
2573
2635
  body: options.body,
2574
2636
  inputBody: isMultipartSchema(options.body) ? "form-data" : options.body,
2575
2637
  query: options.query,
2638
+ inputQuery: options.query,
2576
2639
  headers: options.headers,
2577
2640
  response: null,
2578
2641
  errors
@@ -4904,7 +4967,8 @@ async function executeServerOperation(operation, input, options, requestOptions,
4904
4967
  serverRequestOptions?.baseURL ?? options.baseURL,
4905
4968
  request
4906
4969
  );
4907
- const url = new URL(operation.path, baseURL);
4970
+ const origin = resolveServerBaseURL(void 0, request);
4971
+ const url = new URL(operation.path, new URL(baseURL, origin));
4908
4972
  appendQuery(url, input.query);
4909
4973
  const headers = new Headers();
4910
4974
  appendHeaders(
@@ -4957,7 +5021,9 @@ async function executeServerOperation(operation, input, options, requestOptions,
4957
5021
  }
4958
5022
  appendIntegrationClientDataHeader(headers, data);
4959
5023
  const body = createOperationBody(operation, input.body, headers);
4960
- const response = await (options.fetch ?? fetch)(url.toString(), {
5024
+ const httpURL = resolveFarmAPIRequestURL(operation.path, baseURL, origin);
5025
+ appendQuery(httpURL, input.query);
5026
+ const response = await (options.fetch ?? fetch)(httpURL.toString(), {
4961
5027
  method: operation.method,
4962
5028
  headers,
4963
5029
  body,
@@ -5143,6 +5209,7 @@ __name(createServerNamespaceProxy, "createServerNamespaceProxy");
5143
5209
  // src/client-cache.ts
5144
5210
  init_cache();
5145
5211
  init_cache_invalidation();
5212
+ var invalidationTrackers = /* @__PURE__ */ new WeakMap();
5146
5213
  var cacheFinalizer = typeof FinalizationRegistry === "function" ? new FinalizationRegistry((unsubscribe) => unsubscribe()) : void 0;
5147
5214
  function subscribeWeakCache(reference) {
5148
5215
  const unsubscribe = subscribeFarmCacheInvalidation((key) => {
@@ -5158,6 +5225,7 @@ function subscribeWeakCache(reference) {
5158
5225
  return dispose;
5159
5226
  }
5160
5227
  __name(subscribeWeakCache, "subscribeWeakCache");
5228
+ var DEFAULT_GC_SWEEP_INTERVAL_MS = 3e4;
5161
5229
  var _FarmClientDataCache = class _FarmClientDataCache {
5162
5230
  constructor(options = {}) {
5163
5231
  this.entries = /* @__PURE__ */ new Map();
@@ -5165,6 +5233,7 @@ var _FarmClientDataCache = class _FarmClientDataCache {
5165
5233
  this.invalidatedAt = /* @__PURE__ */ new Map();
5166
5234
  this.listeners = /* @__PURE__ */ new Map();
5167
5235
  this.inflight = /* @__PURE__ */ new Map();
5236
+ this.gcSweepIntervalMs = options.gcSweepIntervalMs ?? DEFAULT_GC_SWEEP_INTERVAL_MS;
5168
5237
  if (options.subscribeToInvalidation !== false) {
5169
5238
  if (typeof WeakRef === "function") {
5170
5239
  const reference = new WeakRef(this);
@@ -5181,6 +5250,10 @@ var _FarmClientDataCache = class _FarmClientDataCache {
5181
5250
  get size() {
5182
5251
  return this.entries.size;
5183
5252
  }
5253
+ /** @internal Attach or detach the persistence engine's observation sink. */
5254
+ attachPersistence(sink) {
5255
+ this.persistence = sink;
5256
+ }
5184
5257
  resolveKey(key) {
5185
5258
  let resolved = key;
5186
5259
  const seen = /* @__PURE__ */ new Set();
@@ -5196,6 +5269,7 @@ var _FarmClientDataCache = class _FarmClientDataCache {
5196
5269
  if (!entry) return void 0;
5197
5270
  if (entry.gcAt !== void 0 && now >= entry.gcAt) {
5198
5271
  this.entries.delete(resolved);
5272
+ this.persistence?.onDelete(resolved);
5199
5273
  this.emit(resolved);
5200
5274
  return void 0;
5201
5275
  }
@@ -5209,6 +5283,8 @@ var _FarmClientDataCache = class _FarmClientDataCache {
5209
5283
  this.invalidatedAt.delete(resolved);
5210
5284
  }
5211
5285
  this.entries.set(resolved, nextEntry);
5286
+ if (nextEntry.gcAt !== void 0) this.scheduleGcSweep();
5287
+ this.persistence?.onSet(resolved, nextEntry);
5212
5288
  this.emit(resolved);
5213
5289
  return this;
5214
5290
  }
@@ -5216,6 +5292,7 @@ var _FarmClientDataCache = class _FarmClientDataCache {
5216
5292
  const resolved = this.resolveKey(key);
5217
5293
  const deleted = this.entries.delete(resolved);
5218
5294
  this.inflight.delete(resolved);
5295
+ if (deleted) this.persistence?.onDelete(resolved);
5219
5296
  this.emit(resolved);
5220
5297
  return deleted;
5221
5298
  }
@@ -5225,11 +5302,16 @@ var _FarmClientDataCache = class _FarmClientDataCache {
5225
5302
  this.aliases.clear();
5226
5303
  this.invalidatedAt.clear();
5227
5304
  this.inflight.clear();
5305
+ this.persistence?.onClear();
5228
5306
  for (const key of keys) this.emit(key);
5229
5307
  }
5230
5308
  dispose() {
5231
5309
  this.unsubscribeInvalidation?.();
5232
5310
  this.unsubscribeInvalidation = void 0;
5311
+ if (this.gcTimer !== void 0) {
5312
+ clearTimeout(this.gcTimer);
5313
+ this.gcTimer = void 0;
5314
+ }
5233
5315
  this.clear();
5234
5316
  }
5235
5317
  isStale(key, now = Date.now()) {
@@ -5238,6 +5320,7 @@ var _FarmClientDataCache = class _FarmClientDataCache {
5238
5320
  }
5239
5321
  invalidate(key, now = Date.now()) {
5240
5322
  const resolved = this.resolveKey(key);
5323
+ for (const keys of invalidationTrackers.get(this) ?? []) keys.add(resolved);
5241
5324
  this.invalidatedAt.set(resolved, now);
5242
5325
  const entry = this.entries.get(resolved);
5243
5326
  if (entry) {
@@ -5257,8 +5340,9 @@ var _FarmClientDataCache = class _FarmClientDataCache {
5257
5340
  const resolvedInvalidatedAt = this.invalidatedAt.get(resolved);
5258
5341
  if (aliasEntry && !this.entries.has(resolved)) {
5259
5342
  this.entries.set(resolved, aliasEntry);
5343
+ this.persistence?.onSet(resolved, aliasEntry);
5260
5344
  }
5261
- this.entries.delete(alias);
5345
+ if (this.entries.delete(alias)) this.persistence?.onDelete(alias);
5262
5346
  this.invalidatedAt.delete(alias);
5263
5347
  const invalidatedAt = [aliasInvalidatedAt, resolvedInvalidatedAt].reduce(
5264
5348
  (latest, value) => value === void 0 ? latest : latest === void 0 ? value : Math.max(latest, value),
@@ -5298,7 +5382,9 @@ var _FarmClientDataCache = class _FarmClientDataCache {
5298
5382
  listeners.add(listener);
5299
5383
  return () => {
5300
5384
  listeners.delete(listener);
5301
- if (listeners.size === 0) this.listeners.delete(key);
5385
+ if (listeners.size === 0 && this.listeners.get(key) === listeners) {
5386
+ this.listeners.delete(key);
5387
+ }
5302
5388
  };
5303
5389
  }
5304
5390
  getInflight(key) {
@@ -5310,6 +5396,30 @@ var _FarmClientDataCache = class _FarmClientDataCache {
5310
5396
  deleteInflight(key) {
5311
5397
  this.inflight.delete(this.resolveKey(key));
5312
5398
  }
5399
+ scheduleGcSweep() {
5400
+ if (this.gcSweepIntervalMs === false || this.gcTimer !== void 0) return;
5401
+ const timer = setTimeout(() => {
5402
+ this.gcTimer = void 0;
5403
+ this.sweepExpiredEntries();
5404
+ }, this.gcSweepIntervalMs);
5405
+ timer.unref?.();
5406
+ this.gcTimer = timer;
5407
+ }
5408
+ sweepExpiredEntries(now = Date.now()) {
5409
+ const watched = /* @__PURE__ */ new Set();
5410
+ for (const key of this.listeners.keys()) watched.add(this.resolveKey(key));
5411
+ let remaining = false;
5412
+ for (const [key, entry] of this.entries) {
5413
+ if (entry.gcAt === void 0) continue;
5414
+ if (now < entry.gcAt || entry.fetching || this.inflight.has(key) || watched.has(key)) {
5415
+ remaining = true;
5416
+ continue;
5417
+ }
5418
+ this.entries.delete(key);
5419
+ this.persistence?.onDelete(key);
5420
+ }
5421
+ if (remaining) this.scheduleGcSweep();
5422
+ }
5313
5423
  emit(key, event) {
5314
5424
  this.notifyListeners(key, event);
5315
5425
  for (const [alias, target] of this.aliases) {
@@ -5588,69 +5698,6 @@ function createAPIClientRuntime(options = {}, transport) {
5588
5698
  let scopedRequestState;
5589
5699
  const routeMeta = transport?.routeMeta ?? /* @__PURE__ */ new WeakMap();
5590
5700
  let requestCounter = 0;
5591
- const applyOptimisticLayer = /* @__PURE__ */ __name((entry, layer) => {
5592
- let data = entry?.data;
5593
- for (const updater of layer.updaters) data = updater(data);
5594
- return {
5595
- data,
5596
- updatedAt: layer.updatedAt,
5597
- staleAt: entry?.staleAt ?? layer.staleAt,
5598
- gcAt: entry?.gcAt ?? layer.gcAt,
5599
- invalidatedAt: entry?.invalidatedAt
5600
- };
5601
- }, "applyOptimisticLayer");
5602
- const storeOptimisticEntry = /* @__PURE__ */ __name((cacheState, key, stack, entry) => {
5603
- if (!entry) {
5604
- cacheState.delete(key);
5605
- stack.renderedEntry = void 0;
5606
- return;
5607
- }
5608
- cacheState.set(key, entry);
5609
- if (stack.invalidatedAt !== void 0) {
5610
- cacheState.invalidate(key, stack.invalidatedAt);
5611
- }
5612
- stack.renderedEntry = cacheState.get(key);
5613
- }, "storeOptimisticEntry");
5614
- const reconcileOptimisticInvalidation = /* @__PURE__ */ __name((cacheState, key, stack) => {
5615
- const current = cacheState.get(key);
5616
- const rendered = stack.renderedEntry;
5617
- if (current === rendered) return true;
5618
- if (!current || !rendered || current.data !== rendered.data || current.updatedAt !== rendered.updatedAt || current.gcAt !== rendered.gcAt || current.status !== rendered.status || current.error !== rendered.error || current.fetching !== rendered.fetching || current.staleAt !== 0 || current.invalidatedAt === void 0) {
5619
- return false;
5620
- }
5621
- stack.invalidatedAt = current.invalidatedAt;
5622
- stack.renderedEntry = current;
5623
- return true;
5624
- }, "reconcileOptimisticInvalidation");
5625
- const renderOptimisticStack = /* @__PURE__ */ __name((cacheState, key, stack) => {
5626
- let entry = stack.entry ? { ...stack.entry } : void 0;
5627
- for (const layer of stack.layers) entry = applyOptimisticLayer(entry, layer);
5628
- storeOptimisticEntry(cacheState, key, stack, entry);
5629
- }, "renderOptimisticStack");
5630
- const settleOptimisticUpdates = /* @__PURE__ */ __name((cacheState, optimisticState, snapshots, outcome) => {
5631
- const settledKeys = [];
5632
- for (const snapshot of snapshots) {
5633
- const stack = optimisticState.get(snapshot.key);
5634
- if (stack !== snapshot.stack) continue;
5635
- if (!reconcileOptimisticInvalidation(cacheState, snapshot.key, stack)) {
5636
- optimisticState.delete(snapshot.key);
5637
- continue;
5638
- }
5639
- if (outcome === "rollback") {
5640
- stack.layers = stack.layers.filter((layer) => layer !== snapshot.layer);
5641
- } else {
5642
- snapshot.layer.committed = true;
5643
- if (outcome === "invalidate") stack.invalidatedAt = Date.now();
5644
- }
5645
- while (stack.layers[0]?.committed) {
5646
- stack.entry = applyOptimisticLayer(stack.entry, stack.layers.shift());
5647
- }
5648
- renderOptimisticStack(cacheState, snapshot.key, stack);
5649
- if (stack.layers.length === 0) optimisticState.delete(snapshot.key);
5650
- settledKeys.push(snapshot.key);
5651
- }
5652
- return settledKeys;
5653
- }, "settleOptimisticUpdates");
5654
5701
  const fetchClient = /* @__PURE__ */ __name(async (path4, requestOptions, defaultHeaders, cancellation) => {
5655
5702
  const url = resolveFarmAPIRequestURL(path4, baseURL);
5656
5703
  const method = String(requestOptions.method || "GET").toUpperCase();
@@ -5883,6 +5930,9 @@ function createAPIClientRuntime(options = {}, transport) {
5883
5930
  const executeNetwork = /* @__PURE__ */ __name(async (opts) => {
5884
5931
  const release = cancellation.hold();
5885
5932
  let unsubscribeInvalidation;
5933
+ let readOwners;
5934
+ let readOwner;
5935
+ const resolvedCacheKey = cacheState.resolveKey(cacheKey);
5886
5936
  try {
5887
5937
  const dedupeMs = cacheOptions?.dedupeMs ?? 0;
5888
5938
  const inflight = inflightState.get(cacheKey);
@@ -5906,6 +5956,9 @@ function createAPIClientRuntime(options = {}, transport) {
5906
5956
  }
5907
5957
  let invalidatedDuringRequest = false;
5908
5958
  if (isCacheEnabled) {
5959
+ readOwners = getCacheReadOwners(cacheState);
5960
+ readOwner = {};
5961
+ readOwners.set(resolvedCacheKey, readOwner);
5909
5962
  unsubscribeInvalidation = cacheState.subscribe(cacheKey, (event) => {
5910
5963
  if (event === "invalidate") invalidatedDuringRequest = true;
5911
5964
  });
@@ -6013,15 +6066,27 @@ function createAPIClientRuntime(options = {}, transport) {
6013
6066
  inflightState.set(cacheKey, inflightEntry);
6014
6067
  try {
6015
6068
  const result2 = await promise;
6016
- if (inflightState.get(cacheKey) === inflightEntry && !invalidatedDuringRequest && !result2.error && isCacheEnabled && !isFarmAPIStream(result2.data)) {
6069
+ if (inflightState.get(cacheKey) === inflightEntry && readOwners?.get(resolvedCacheKey) === readOwner && !invalidatedDuringRequest && !result2.error && isCacheEnabled && !isFarmAPIStream(result2.data)) {
6017
6070
  const updatedAt = Date.now();
6018
- cacheState.set(cacheKey, {
6071
+ const cached = {
6019
6072
  data: result2.data,
6020
6073
  updatedAt,
6021
6074
  staleAt: updatedAt + staleTime,
6022
6075
  gcAt: getGcAt(updatedAt, cacheOptions?.gcTime),
6023
- invalidatedAt: void 0
6024
- });
6076
+ invalidatedAt: void 0,
6077
+ persist: cacheOptions?.persist === true ? true : void 0,
6078
+ [API_CACHE_REFETCH]: createCacheRefetch(
6079
+ request,
6080
+ path4,
6081
+ method,
6082
+ input,
6083
+ cacheKey,
6084
+ cacheOptions,
6085
+ clientOptions,
6086
+ options.onError
6087
+ )
6088
+ };
6089
+ cacheState.set(cacheKey, cached);
6025
6090
  }
6026
6091
  if (result2.error) {
6027
6092
  emitStatus("error", { error: result2.error, isBackground: opts?.isBackground });
@@ -6049,6 +6114,9 @@ function createAPIClientRuntime(options = {}, transport) {
6049
6114
  }
6050
6115
  }
6051
6116
  } finally {
6117
+ if (readOwner && readOwners?.get(resolvedCacheKey) === readOwner) {
6118
+ readOwners.delete(resolvedCacheKey);
6119
+ }
6052
6120
  unsubscribeInvalidation?.();
6053
6121
  release();
6054
6122
  }
@@ -6059,6 +6127,7 @@ function createAPIClientRuntime(options = {}, transport) {
6059
6127
  targets: clientOptions.invalidate.targets,
6060
6128
  refetch: clientOptions.invalidate.refetch ?? false
6061
6129
  };
6130
+ const refetches = /* @__PURE__ */ new Set();
6062
6131
  for (const target of invalidateOptions.targets) {
6063
6132
  const targetKey = resolveTargetKey(
6064
6133
  routeMeta,
@@ -6070,20 +6139,22 @@ function createAPIClientRuntime(options = {}, transport) {
6070
6139
  );
6071
6140
  if (!targetKey) continue;
6072
6141
  const existing = cacheState.get(targetKey);
6142
+ const invalidatedAt = Date.now();
6143
+ cacheState.invalidate(targetKey, invalidatedAt);
6073
6144
  if (existing) {
6074
- const invalidatedAt = Date.now();
6075
6145
  const stack = optimisticState.get(targetKey);
6076
- cacheState.invalidate(targetKey, invalidatedAt);
6077
6146
  if (stack?.renderedEntry === existing) {
6078
6147
  stack.invalidatedAt = invalidatedAt;
6079
6148
  stack.renderedEntry = cacheState.get(targetKey);
6080
6149
  }
6081
6150
  }
6082
6151
  emitStatus("invalidated", { key: targetKey });
6083
- if (invalidateOptions.refetch && existing && targetKey === cacheKey) {
6084
- void executeNetwork({ isBackground: true, callCallbacks: false });
6152
+ const refetch = existing?.[API_CACHE_REFETCH];
6153
+ if (invalidateOptions.refetch && refetch) {
6154
+ refetches.add(refetch);
6085
6155
  }
6086
6156
  }
6157
+ for (const refetch of refetches) refetch();
6087
6158
  }, "invalidateTargets");
6088
6159
  const optimisticSnapshots = requestContextError ? [] : applyOptimisticUpdates();
6089
6160
  if (isCacheEnabled && !requestContextError && !cancellation.signal?.aborted) {
@@ -6317,7 +6388,31 @@ function createServerAPIClient(endpoints, options = {}) {
6317
6388
  return endpoints;
6318
6389
  }
6319
6390
  __name(createServerAPIClient, "createServerAPIClient");
6391
+ var API_CACHE_REFETCH = /* @__PURE__ */ Symbol.for("farm.api.cache-refetch");
6392
+ function createCacheRefetch(request, path4, method, input, key, cache, options, onError) {
6393
+ const readOptions = {
6394
+ cache: { ...cache, key, policy: "network-only", dedupeMs: 0 },
6395
+ retry: options?.retry,
6396
+ timeoutMs: options?.timeoutMs
6397
+ };
6398
+ return () => {
6399
+ void request(path4, method, input, readOptions).catch((error) => {
6400
+ notifyClientObserver(onError, [normalizeError(error)]);
6401
+ });
6402
+ };
6403
+ }
6404
+ __name(createCacheRefetch, "createCacheRefetch");
6320
6405
  var optimisticStates = /* @__PURE__ */ new WeakMap();
6406
+ var cacheReadOwners = /* @__PURE__ */ new WeakMap();
6407
+ function getCacheReadOwners(cache) {
6408
+ let owners = cacheReadOwners.get(cache);
6409
+ if (!owners) {
6410
+ owners = /* @__PURE__ */ new Map();
6411
+ cacheReadOwners.set(cache, owners);
6412
+ }
6413
+ return owners;
6414
+ }
6415
+ __name(getCacheReadOwners, "getCacheReadOwners");
6321
6416
  function getOptimisticState(cache) {
6322
6417
  let state = optimisticStates.get(cache);
6323
6418
  if (!state) {
@@ -6327,6 +6422,151 @@ function getOptimisticState(cache) {
6327
6422
  return state;
6328
6423
  }
6329
6424
  __name(getOptimisticState, "getOptimisticState");
6425
+ function applyOptimisticLayer(entry, layer) {
6426
+ let data = entry?.data;
6427
+ for (const updater of layer.updaters) data = updater(data);
6428
+ return {
6429
+ data,
6430
+ updatedAt: layer.updatedAt,
6431
+ staleAt: entry?.staleAt ?? layer.staleAt,
6432
+ gcAt: entry?.gcAt ?? layer.gcAt,
6433
+ invalidatedAt: entry?.invalidatedAt,
6434
+ [API_CACHE_REFETCH]: entry?.[API_CACHE_REFETCH]
6435
+ };
6436
+ }
6437
+ __name(applyOptimisticLayer, "applyOptimisticLayer");
6438
+ function storeOptimisticEntry(cacheState, key, stack, entry) {
6439
+ if (!entry) {
6440
+ cacheState.delete(key);
6441
+ stack.renderedEntry = void 0;
6442
+ return;
6443
+ }
6444
+ cacheState.set(key, entry);
6445
+ if (stack.invalidatedAt !== void 0) {
6446
+ cacheState.invalidate(key, stack.invalidatedAt);
6447
+ }
6448
+ stack.renderedEntry = cacheState.get(key);
6449
+ }
6450
+ __name(storeOptimisticEntry, "storeOptimisticEntry");
6451
+ function reconcileOptimisticInvalidation(cacheState, key, stack) {
6452
+ const current = cacheState.get(key);
6453
+ const rendered = stack.renderedEntry;
6454
+ if (current === rendered) return true;
6455
+ if (!current || !rendered || current.data !== rendered.data || current.updatedAt !== rendered.updatedAt || current.gcAt !== rendered.gcAt || current.status !== rendered.status || current.error !== rendered.error || current.fetching !== rendered.fetching || current.staleAt !== 0 || current.invalidatedAt === void 0) {
6456
+ return false;
6457
+ }
6458
+ stack.invalidatedAt = current.invalidatedAt;
6459
+ stack.renderedEntry = current;
6460
+ return true;
6461
+ }
6462
+ __name(reconcileOptimisticInvalidation, "reconcileOptimisticInvalidation");
6463
+ function renderOptimisticStack(cacheState, key, stack) {
6464
+ let entry = stack.entry ? { ...stack.entry } : void 0;
6465
+ for (const layer of stack.layers) entry = applyOptimisticLayer(entry, layer);
6466
+ storeOptimisticEntry(cacheState, key, stack, entry);
6467
+ }
6468
+ __name(renderOptimisticStack, "renderOptimisticStack");
6469
+ function settleOptimisticUpdates(cacheState, optimisticState, snapshots, outcome) {
6470
+ const settledKeys = [];
6471
+ for (const snapshot of snapshots) {
6472
+ const stack = optimisticState.get(snapshot.key);
6473
+ if (stack !== snapshot.stack) continue;
6474
+ if (!reconcileOptimisticInvalidation(cacheState, snapshot.key, stack)) {
6475
+ optimisticState.delete(snapshot.key);
6476
+ continue;
6477
+ }
6478
+ if (outcome === "rollback") {
6479
+ stack.layers = stack.layers.filter((layer) => layer !== snapshot.layer);
6480
+ } else {
6481
+ snapshot.layer.committed = true;
6482
+ if (outcome === "invalidate") stack.invalidatedAt = Date.now();
6483
+ }
6484
+ while (stack.layers[0]?.committed) {
6485
+ stack.entry = applyOptimisticLayer(stack.entry, stack.layers.shift());
6486
+ }
6487
+ renderOptimisticStack(cacheState, snapshot.key, stack);
6488
+ if (stack.layers.length === 0) optimisticState.delete(snapshot.key);
6489
+ settledKeys.push(snapshot.key);
6490
+ }
6491
+ return settledKeys;
6492
+ }
6493
+ __name(settleOptimisticUpdates, "settleOptimisticUpdates");
6494
+ function applyServerFnOptimisticUpdates(updates, now = Date.now()) {
6495
+ const cacheState = getFarmClientDataCache();
6496
+ const optimisticState = getOptimisticState(cacheState);
6497
+ const snapshots = /* @__PURE__ */ new Map();
6498
+ for (const update of updates) {
6499
+ if (update.length !== 2) continue;
6500
+ const [target, updater] = update;
6501
+ if (typeof updater !== "function") continue;
6502
+ const targetKey = typeof target === "string" || Array.isArray(target) ? normalizeFarmClientCacheKey(target) : null;
6503
+ if (!targetKey) continue;
6504
+ const targetEntry = getValidCacheEntry(cacheState, targetKey, now);
6505
+ const currentEntry = cacheState.get(targetKey);
6506
+ let stack = optimisticState.get(targetKey);
6507
+ if (stack && !reconcileOptimisticInvalidation(cacheState, targetKey, stack)) {
6508
+ stack = void 0;
6509
+ }
6510
+ if (!stack) {
6511
+ stack = {
6512
+ entry: targetEntry ? { ...targetEntry } : void 0,
6513
+ layers: [],
6514
+ renderedEntry: currentEntry
6515
+ };
6516
+ optimisticState.set(targetKey, stack);
6517
+ }
6518
+ let snapshot = snapshots.get(targetKey);
6519
+ if (!snapshot) {
6520
+ const previousEntry = stack.layers.length === 0 ? stack.entry : stack.renderedEntry;
6521
+ const layer = {
6522
+ updaters: [],
6523
+ updatedAt: now,
6524
+ // A server function has no cache policy of its own; preserve the
6525
+ // target read's freshness metadata when it exists.
6526
+ staleAt: targetEntry?.staleAt ?? now,
6527
+ gcAt: targetEntry?.gcAt
6528
+ };
6529
+ stack.layers.push(layer);
6530
+ snapshot = { key: targetKey, stack, layer };
6531
+ snapshots.set(targetKey, snapshot);
6532
+ snapshot.layer.updaters.push(updater);
6533
+ const nextEntry2 = applyOptimisticLayer(previousEntry, {
6534
+ ...snapshot.layer,
6535
+ updaters: [updater]
6536
+ });
6537
+ storeOptimisticEntry(cacheState, targetKey, stack, nextEntry2);
6538
+ continue;
6539
+ }
6540
+ snapshot.layer.updaters.push(updater);
6541
+ const nextEntry = applyOptimisticLayer(stack.renderedEntry, {
6542
+ ...snapshot.layer,
6543
+ updaters: [updater]
6544
+ });
6545
+ storeOptimisticEntry(cacheState, targetKey, stack, nextEntry);
6546
+ }
6547
+ return Array.from(snapshots.values());
6548
+ }
6549
+ __name(applyServerFnOptimisticUpdates, "applyServerFnOptimisticUpdates");
6550
+ function settleServerFnOptimisticUpdates(snapshots, outcome) {
6551
+ if (snapshots.length === 0) return;
6552
+ const cacheState = getFarmClientDataCache();
6553
+ settleOptimisticUpdates(cacheState, getOptimisticState(cacheState), snapshots, outcome);
6554
+ }
6555
+ __name(settleServerFnOptimisticUpdates, "settleServerFnOptimisticUpdates");
6556
+ function resolveServerFnInvalidateTargets(invalidate2) {
6557
+ const targets = Array.isArray(invalidate2) ? invalidate2 : invalidate2.targets;
6558
+ const keys = [];
6559
+ for (const target of targets) {
6560
+ if (typeof target === "string" || Array.isArray(target)) {
6561
+ if (Array.isArray(target) && typeof target[0] === "function") continue;
6562
+ keys.push(normalizeFarmClientCacheKey(target));
6563
+ } else if (target && typeof target === "object" && "key" in target) {
6564
+ keys.push(normalizeFarmClientCacheKey(target.key));
6565
+ }
6566
+ }
6567
+ return keys;
6568
+ }
6569
+ __name(resolveServerFnInvalidateTargets, "resolveServerFnInvalidateTargets");
6330
6570
  function buildCacheKey(method, path4, input, baseURL, defaultHeaders) {
6331
6571
  const keyInput = input && typeof input === "object" ? {
6332
6572
  query: input.query,
@@ -7286,6 +7526,7 @@ __name(farmApiPlugin, "farmApiPlugin");
7286
7526
  POST,
7287
7527
  PUT,
7288
7528
  QUERY,
7529
+ applyServerFnOptimisticUpdates,
7289
7530
  createAPIClient,
7290
7531
  createApiClients,
7291
7532
  createEndpoint,
@@ -7314,6 +7555,8 @@ __name(farmApiPlugin, "farmApiPlugin");
7314
7555
  resolveFarmAPIRequestURL,
7315
7556
  resolveFarmAPIServerBasePath,
7316
7557
  resolvePluginRoutes,
7558
+ resolveServerFnInvalidateTargets,
7559
+ settleServerFnOptimisticUpdates,
7317
7560
  toFormData
7318
7561
  });
7319
7562
  //# sourceMappingURL=api.cjs.map