effect 4.0.4 → 4.0.6

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 (1079) hide show
  1. package/ai-docs/package.json +1 -1
  2. package/ai-docs/src/06_schedule/10_schedules.ts +5 -4
  3. package/ai-docs/src/52_graphql/10_basics.ts +19 -13
  4. package/ai-docs/src/52_graphql/30_batching.ts +6 -4
  5. package/ai-docs/src/52_graphql/40_aliased-batching.ts +6 -4
  6. package/ai-docs/tsconfig.json +3 -1
  7. package/dist/Array.d.ts +207 -58
  8. package/dist/Array.d.ts.map +1 -1
  9. package/dist/Array.js +45 -22
  10. package/dist/Array.js.map +1 -1
  11. package/dist/Bytes.d.ts +79 -0
  12. package/dist/Bytes.d.ts.map +1 -0
  13. package/dist/Bytes.js +109 -0
  14. package/dist/Bytes.js.map +1 -0
  15. package/dist/Channel.d.ts +187 -14
  16. package/dist/Channel.d.ts.map +1 -1
  17. package/dist/Channel.js +142 -33
  18. package/dist/Channel.js.map +1 -1
  19. package/dist/ChannelSchema.d.ts.map +1 -1
  20. package/dist/ChannelSchema.js.map +1 -1
  21. package/dist/Chunk.d.ts +39 -21
  22. package/dist/Chunk.d.ts.map +1 -1
  23. package/dist/Chunk.js +26 -17
  24. package/dist/Chunk.js.map +1 -1
  25. package/dist/Config.d.ts.map +1 -1
  26. package/dist/Config.js +8 -3
  27. package/dist/Config.js.map +1 -1
  28. package/dist/ConfigProvider.d.ts.map +1 -1
  29. package/dist/ConfigProvider.js +34 -32
  30. package/dist/ConfigProvider.js.map +1 -1
  31. package/dist/Cron.d.ts +2 -2
  32. package/dist/Cron.d.ts.map +1 -1
  33. package/dist/Cron.js +6 -3
  34. package/dist/Cron.js.map +1 -1
  35. package/dist/Duration.d.ts.map +1 -1
  36. package/dist/Duration.js +58 -21
  37. package/dist/Duration.js.map +1 -1
  38. package/dist/Effect.d.ts +548 -182
  39. package/dist/Effect.d.ts.map +1 -1
  40. package/dist/Effect.js +261 -76
  41. package/dist/Effect.js.map +1 -1
  42. package/dist/Equivalence.d.ts +2 -1
  43. package/dist/Equivalence.d.ts.map +1 -1
  44. package/dist/Equivalence.js +12 -8
  45. package/dist/Equivalence.js.map +1 -1
  46. package/dist/Exit.d.ts +24 -9
  47. package/dist/Exit.d.ts.map +1 -1
  48. package/dist/Exit.js +8 -3
  49. package/dist/Exit.js.map +1 -1
  50. package/dist/FiberHandle.d.ts +2 -0
  51. package/dist/FiberHandle.d.ts.map +1 -1
  52. package/dist/FiberHandle.js +9 -4
  53. package/dist/FiberHandle.js.map +1 -1
  54. package/dist/FiberMap.d.ts +2 -0
  55. package/dist/FiberMap.d.ts.map +1 -1
  56. package/dist/FiberMap.js +5 -2
  57. package/dist/FiberMap.js.map +1 -1
  58. package/dist/FileSystem.d.ts +28 -9
  59. package/dist/FileSystem.d.ts.map +1 -1
  60. package/dist/FileSystem.js +3 -0
  61. package/dist/FileSystem.js.map +1 -1
  62. package/dist/Graph.d.ts.map +1 -1
  63. package/dist/Graph.js.map +1 -1
  64. package/dist/HashSet.d.ts.map +1 -1
  65. package/dist/HashSet.js.map +1 -1
  66. package/dist/Iterable.d.ts.map +1 -1
  67. package/dist/Iterable.js +18 -17
  68. package/dist/Iterable.js.map +1 -1
  69. package/dist/JsonSchema.d.ts +9 -3
  70. package/dist/JsonSchema.d.ts.map +1 -1
  71. package/dist/JsonSchema.js +19 -3
  72. package/dist/JsonSchema.js.map +1 -1
  73. package/dist/Layer.d.ts.map +1 -1
  74. package/dist/Layer.js +2 -2
  75. package/dist/Layer.js.map +1 -1
  76. package/dist/ManagedRuntime.d.ts +19 -1
  77. package/dist/ManagedRuntime.d.ts.map +1 -1
  78. package/dist/ManagedRuntime.js +62 -6
  79. package/dist/ManagedRuntime.js.map +1 -1
  80. package/dist/Match.d.ts +20 -6
  81. package/dist/Match.d.ts.map +1 -1
  82. package/dist/Match.js +2 -2
  83. package/dist/Match.js.map +1 -1
  84. package/dist/Metric.d.ts +132 -0
  85. package/dist/Metric.d.ts.map +1 -1
  86. package/dist/Metric.js +197 -25
  87. package/dist/Metric.js.map +1 -1
  88. package/dist/MutableHashMap.d.ts.map +1 -1
  89. package/dist/MutableHashMap.js.map +1 -1
  90. package/dist/Number.js +2 -2
  91. package/dist/Number.js.map +1 -1
  92. package/dist/Optic.d.ts.map +1 -1
  93. package/dist/Optic.js.map +1 -1
  94. package/dist/Path.d.ts +37 -5
  95. package/dist/Path.d.ts.map +1 -1
  96. package/dist/Path.js +44 -6
  97. package/dist/Path.js.map +1 -1
  98. package/dist/PubSub.d.ts.map +1 -1
  99. package/dist/PubSub.js +12 -7
  100. package/dist/PubSub.js.map +1 -1
  101. package/dist/Queue.d.ts +4 -1
  102. package/dist/Queue.d.ts.map +1 -1
  103. package/dist/Queue.js +4 -1
  104. package/dist/Queue.js.map +1 -1
  105. package/dist/Random.d.ts.map +1 -1
  106. package/dist/Random.js +1 -1
  107. package/dist/Random.js.map +1 -1
  108. package/dist/RcMap.d.ts +12 -7
  109. package/dist/RcMap.d.ts.map +1 -1
  110. package/dist/RcMap.js +9 -6
  111. package/dist/RcMap.js.map +1 -1
  112. package/dist/Record.d.ts +51 -0
  113. package/dist/Record.d.ts.map +1 -1
  114. package/dist/Record.js +17 -0
  115. package/dist/Record.js.map +1 -1
  116. package/dist/Ref.d.ts.map +1 -1
  117. package/dist/Ref.js.map +1 -1
  118. package/dist/References.d.ts +5 -4
  119. package/dist/References.d.ts.map +1 -1
  120. package/dist/References.js +5 -4
  121. package/dist/References.js.map +1 -1
  122. package/dist/RequestResolver.d.ts +31 -1
  123. package/dist/RequestResolver.d.ts.map +1 -1
  124. package/dist/RequestResolver.js +39 -4
  125. package/dist/RequestResolver.js.map +1 -1
  126. package/dist/Resource.js +1 -1
  127. package/dist/Resource.js.map +1 -1
  128. package/dist/Runtime.d.ts +3 -3
  129. package/dist/Runtime.d.ts.map +1 -1
  130. package/dist/Runtime.js +18 -15
  131. package/dist/Runtime.js.map +1 -1
  132. package/dist/Schedule.d.ts.map +1 -1
  133. package/dist/Schedule.js.map +1 -1
  134. package/dist/Schema.d.ts +383 -326
  135. package/dist/Schema.d.ts.map +1 -1
  136. package/dist/Schema.js +338 -17
  137. package/dist/Schema.js.map +1 -1
  138. package/dist/SchemaAST.d.ts +5 -5
  139. package/dist/SchemaAST.d.ts.map +1 -1
  140. package/dist/SchemaAST.js +24 -8
  141. package/dist/SchemaAST.js.map +1 -1
  142. package/dist/SchemaGetter.d.ts +8 -3
  143. package/dist/SchemaGetter.d.ts.map +1 -1
  144. package/dist/SchemaGetter.js +15 -5
  145. package/dist/SchemaGetter.js.map +1 -1
  146. package/dist/SchemaIssue.d.ts +4 -4
  147. package/dist/SchemaIssue.d.ts.map +1 -1
  148. package/dist/SchemaIssue.js +29 -51
  149. package/dist/SchemaIssue.js.map +1 -1
  150. package/dist/SchemaRepresentation.d.ts +56 -1
  151. package/dist/SchemaRepresentation.d.ts.map +1 -1
  152. package/dist/SchemaRepresentation.js +18 -0
  153. package/dist/SchemaRepresentation.js.map +1 -1
  154. package/dist/SchemaTransformation.d.ts +1 -1
  155. package/dist/SchemaTransformation.js +1 -1
  156. package/dist/Scope.d.ts +12 -2
  157. package/dist/Scope.d.ts.map +1 -1
  158. package/dist/Scope.js +5 -0
  159. package/dist/Scope.js.map +1 -1
  160. package/dist/ScopedCache.d.ts +10 -7
  161. package/dist/ScopedCache.d.ts.map +1 -1
  162. package/dist/ScopedCache.js +9 -5
  163. package/dist/ScopedCache.js.map +1 -1
  164. package/dist/SemVer.d.ts +1196 -0
  165. package/dist/SemVer.d.ts.map +1 -0
  166. package/dist/SemVer.js +756 -0
  167. package/dist/SemVer.js.map +1 -0
  168. package/dist/SemVerRange.d.ts +559 -0
  169. package/dist/SemVerRange.d.ts.map +1 -0
  170. package/dist/SemVerRange.js +551 -0
  171. package/dist/SemVerRange.js.map +1 -0
  172. package/dist/Sink.d.ts.map +1 -1
  173. package/dist/Sink.js +6 -2
  174. package/dist/Sink.js.map +1 -1
  175. package/dist/Stream.d.ts +235 -8
  176. package/dist/Stream.d.ts.map +1 -1
  177. package/dist/Stream.js +145 -60
  178. package/dist/Stream.js.map +1 -1
  179. package/dist/String.d.ts +16 -2
  180. package/dist/String.d.ts.map +1 -1
  181. package/dist/String.js +25 -10
  182. package/dist/String.js.map +1 -1
  183. package/dist/TextDiff.d.ts +399 -0
  184. package/dist/TextDiff.d.ts.map +1 -0
  185. package/dist/TextDiff.js +634 -0
  186. package/dist/TextDiff.js.map +1 -0
  187. package/dist/TxHashMap.d.ts.map +1 -1
  188. package/dist/TxHashMap.js.map +1 -1
  189. package/dist/TxHashSet.d.ts.map +1 -1
  190. package/dist/TxHashSet.js.map +1 -1
  191. package/dist/TxRef.d.ts.map +1 -1
  192. package/dist/TxRef.js +3 -2
  193. package/dist/TxRef.js.map +1 -1
  194. package/dist/ai/AiError.d.ts +78 -14
  195. package/dist/ai/AiError.d.ts.map +1 -1
  196. package/dist/ai/AiError.js +51 -3
  197. package/dist/ai/AiError.js.map +1 -1
  198. package/dist/ai/Chat.d.ts +1 -2
  199. package/dist/ai/Chat.d.ts.map +1 -1
  200. package/dist/ai/Chat.js +6 -3
  201. package/dist/ai/Chat.js.map +1 -1
  202. package/dist/ai/Decision.d.ts +116 -20
  203. package/dist/ai/Decision.d.ts.map +1 -1
  204. package/dist/ai/Decision.js +37 -3
  205. package/dist/ai/Decision.js.map +1 -1
  206. package/dist/ai/DecisionModel.d.ts +129 -11
  207. package/dist/ai/DecisionModel.d.ts.map +1 -1
  208. package/dist/ai/DecisionModel.js +183 -95
  209. package/dist/ai/DecisionModel.js.map +1 -1
  210. package/dist/ai/EmbeddingModel.d.ts +10 -0
  211. package/dist/ai/EmbeddingModel.d.ts.map +1 -1
  212. package/dist/ai/EmbeddingModel.js +21 -7
  213. package/dist/ai/EmbeddingModel.js.map +1 -1
  214. package/dist/ai/LanguageModel.d.ts.map +1 -1
  215. package/dist/ai/LanguageModel.js +47 -35
  216. package/dist/ai/LanguageModel.js.map +1 -1
  217. package/dist/ai/McpClient.d.ts +289 -0
  218. package/dist/ai/McpClient.d.ts.map +1 -0
  219. package/dist/ai/McpClient.js +819 -0
  220. package/dist/ai/McpClient.js.map +1 -0
  221. package/dist/ai/McpClientError.d.ts +254 -0
  222. package/dist/ai/McpClientError.d.ts.map +1 -0
  223. package/dist/ai/McpClientError.js +260 -0
  224. package/dist/ai/McpClientError.js.map +1 -0
  225. package/dist/ai/McpProtocol.d.ts +2 -2
  226. package/dist/ai/McpProtocol.d.ts.map +1 -1
  227. package/dist/ai/McpSchema.d.ts +368 -235
  228. package/dist/ai/McpSchema.d.ts.map +1 -1
  229. package/dist/ai/McpSchema.js +94 -24
  230. package/dist/ai/McpSchema.js.map +1 -1
  231. package/dist/ai/McpServer.d.ts +6 -52
  232. package/dist/ai/McpServer.d.ts.map +1 -1
  233. package/dist/ai/McpServer.js +27 -50
  234. package/dist/ai/McpServer.js.map +1 -1
  235. package/dist/ai/Prompt.d.ts +22 -20
  236. package/dist/ai/Prompt.d.ts.map +1 -1
  237. package/dist/ai/Prompt.js +23 -1
  238. package/dist/ai/Prompt.js.map +1 -1
  239. package/dist/ai/Response.d.ts +148 -4
  240. package/dist/ai/Response.d.ts.map +1 -1
  241. package/dist/ai/Response.js +35 -37
  242. package/dist/ai/Response.js.map +1 -1
  243. package/dist/ai/Tool.d.ts +12 -4
  244. package/dist/ai/Tool.d.ts.map +1 -1
  245. package/dist/ai/Tool.js.map +1 -1
  246. package/dist/ai/Toolkit.d.ts +48 -1
  247. package/dist/ai/Toolkit.d.ts.map +1 -1
  248. package/dist/ai/Toolkit.js +65 -12
  249. package/dist/ai/Toolkit.js.map +1 -1
  250. package/dist/ai/index.d.ts +10 -0
  251. package/dist/ai/index.d.ts.map +1 -1
  252. package/dist/ai/index.js +10 -0
  253. package/dist/ai/index.js.map +1 -1
  254. package/dist/ai/internal/mcpCore.js.map +1 -1
  255. package/dist/ai/internal/mcpProtocol/v2024_11_05.js +1 -1
  256. package/dist/ai/internal/mcpProtocol/v2024_11_05.js.map +1 -1
  257. package/dist/ai/internal/mcpProtocol/v2025_03_26.js +1 -1
  258. package/dist/ai/internal/mcpProtocol/v2025_03_26.js.map +1 -1
  259. package/dist/ai/internal/mcpProtocol/v2025_06_18.js +2 -2
  260. package/dist/ai/internal/mcpProtocol/v2025_06_18.js.map +1 -1
  261. package/dist/ai/internal/mcpProtocol/v2025_11_25.js +2 -2
  262. package/dist/ai/internal/mcpProtocol/v2025_11_25.js.map +1 -1
  263. package/dist/ai/internal/mcpProtocol/v2026_07_28.js +4 -7
  264. package/dist/ai/internal/mcpProtocol/v2026_07_28.js.map +1 -1
  265. package/dist/ai/internal/mcpProtocol.js +16 -2
  266. package/dist/ai/internal/mcpProtocol.js.map +1 -1
  267. package/dist/ai/internal/mcpRuntime.js +3 -4
  268. package/dist/ai/internal/mcpRuntime.js.map +1 -1
  269. package/dist/ai/internal/mcpSchema/v2024_11_05.js +19 -13
  270. package/dist/ai/internal/mcpSchema/v2024_11_05.js.map +1 -1
  271. package/dist/ai/internal/mcpSchema/v2025_03_26.js +3 -2
  272. package/dist/ai/internal/mcpSchema/v2025_03_26.js.map +1 -1
  273. package/dist/ai/internal/mcpSchema/v2025_06_18.js +7 -7
  274. package/dist/ai/internal/mcpSchema/v2025_06_18.js.map +1 -1
  275. package/dist/ai/internal/mcpSchema/v2025_11_25.js +8 -8
  276. package/dist/ai/internal/mcpSchema/v2025_11_25.js.map +1 -1
  277. package/dist/ai/internal/mcpSchema/v2026_07_28.js +43 -42
  278. package/dist/ai/internal/mcpSchema/v2026_07_28.js.map +1 -1
  279. package/dist/cli/CliError.d.ts +42 -2
  280. package/dist/cli/CliError.d.ts.map +1 -1
  281. package/dist/cli/CliError.js +44 -5
  282. package/dist/cli/CliError.js.map +1 -1
  283. package/dist/cli/Command.d.ts +286 -2
  284. package/dist/cli/Command.d.ts.map +1 -1
  285. package/dist/cli/Command.js +107 -6
  286. package/dist/cli/Command.js.map +1 -1
  287. package/dist/cli/Completions.d.ts +10 -0
  288. package/dist/cli/Completions.d.ts.map +1 -1
  289. package/dist/cli/Completions.js.map +1 -1
  290. package/dist/cli/Flag.d.ts +215 -0
  291. package/dist/cli/Flag.d.ts.map +1 -1
  292. package/dist/cli/Flag.js +89 -0
  293. package/dist/cli/Flag.js.map +1 -1
  294. package/dist/cli/GlobalFlag.d.ts.map +1 -1
  295. package/dist/cli/GlobalFlag.js +3 -3
  296. package/dist/cli/GlobalFlag.js.map +1 -1
  297. package/dist/cli/Param.d.ts +194 -0
  298. package/dist/cli/Param.d.ts.map +1 -1
  299. package/dist/cli/Param.js +86 -0
  300. package/dist/cli/Param.js.map +1 -1
  301. package/dist/cli/TerminalCapabilities.d.ts +84 -0
  302. package/dist/cli/TerminalCapabilities.d.ts.map +1 -0
  303. package/dist/cli/TerminalCapabilities.js +122 -0
  304. package/dist/cli/TerminalCapabilities.js.map +1 -0
  305. package/dist/cli/index.d.ts +5 -0
  306. package/dist/cli/index.d.ts.map +1 -1
  307. package/dist/cli/index.js +5 -0
  308. package/dist/cli/index.js.map +1 -1
  309. package/dist/cli/internal/command.d.ts +2 -1
  310. package/dist/cli/internal/command.d.ts.map +1 -1
  311. package/dist/cli/internal/command.js +7 -3
  312. package/dist/cli/internal/command.js.map +1 -1
  313. package/dist/cli/internal/completions/bash.js +7 -5
  314. package/dist/cli/internal/completions/bash.js.map +1 -1
  315. package/dist/cli/internal/completions/descriptor.js +16 -1
  316. package/dist/cli/internal/completions/descriptor.js.map +1 -1
  317. package/dist/cli/internal/completions/fish.js +12 -10
  318. package/dist/cli/internal/completions/fish.js.map +1 -1
  319. package/dist/cli/internal/completions/powershell.js +20 -10
  320. package/dist/cli/internal/completions/powershell.js.map +1 -1
  321. package/dist/cli/internal/completions/zsh.js +15 -8
  322. package/dist/cli/internal/completions/zsh.js.map +1 -1
  323. package/dist/cli/internal/formatter.d.ts +2 -0
  324. package/dist/cli/internal/formatter.d.ts.map +1 -0
  325. package/dist/cli/internal/formatter.js +15 -0
  326. package/dist/cli/internal/formatter.js.map +1 -0
  327. package/dist/cli/internal/lexer.js +24 -10
  328. package/dist/cli/internal/lexer.js.map +1 -1
  329. package/dist/cli/internal/parser.js +35 -15
  330. package/dist/cli/internal/parser.js.map +1 -1
  331. package/dist/cli/internal/wizard.d.ts.map +1 -1
  332. package/dist/cli/internal/wizard.js +2 -1
  333. package/dist/cli/internal/wizard.js.map +1 -1
  334. package/dist/cluster/ClusterCron.d.ts +29 -1
  335. package/dist/cluster/ClusterCron.d.ts.map +1 -1
  336. package/dist/cluster/ClusterCron.js +64 -32
  337. package/dist/cluster/ClusterCron.js.map +1 -1
  338. package/dist/cluster/ClusterMetrics.d.ts +143 -7
  339. package/dist/cluster/ClusterMetrics.d.ts.map +1 -1
  340. package/dist/cluster/ClusterMetrics.js +151 -7
  341. package/dist/cluster/ClusterMetrics.js.map +1 -1
  342. package/dist/cluster/ClusterWorkflowEngine.d.ts +2 -1
  343. package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
  344. package/dist/cluster/ClusterWorkflowEngine.js +98 -18
  345. package/dist/cluster/ClusterWorkflowEngine.js.map +1 -1
  346. package/dist/cluster/Entity.d.ts +2 -0
  347. package/dist/cluster/Entity.d.ts.map +1 -1
  348. package/dist/cluster/Entity.js.map +1 -1
  349. package/dist/cluster/MessageStorage.d.ts +21 -0
  350. package/dist/cluster/MessageStorage.d.ts.map +1 -1
  351. package/dist/cluster/MessageStorage.js +20 -12
  352. package/dist/cluster/MessageStorage.js.map +1 -1
  353. package/dist/cluster/Runners.d.ts.map +1 -1
  354. package/dist/cluster/Runners.js +96 -37
  355. package/dist/cluster/Runners.js.map +1 -1
  356. package/dist/cluster/Sharding.d.ts +1 -0
  357. package/dist/cluster/Sharding.d.ts.map +1 -1
  358. package/dist/cluster/Sharding.js +95 -32
  359. package/dist/cluster/Sharding.js.map +1 -1
  360. package/dist/cluster/ShardingConfig.d.ts +20 -0
  361. package/dist/cluster/ShardingConfig.d.ts.map +1 -1
  362. package/dist/cluster/ShardingConfig.js +4 -0
  363. package/dist/cluster/ShardingConfig.js.map +1 -1
  364. package/dist/cluster/SqlMessageStorage.d.ts.map +1 -1
  365. package/dist/cluster/SqlMessageStorage.js +40 -50
  366. package/dist/cluster/SqlMessageStorage.js.map +1 -1
  367. package/dist/cluster/SqlRunnerStorage.d.ts +2 -2
  368. package/dist/cluster/SqlRunnerStorage.d.ts.map +1 -1
  369. package/dist/cluster/SqlRunnerStorage.js +10 -4
  370. package/dist/cluster/SqlRunnerStorage.js.map +1 -1
  371. package/dist/cluster/internal/entityManager.js +66 -9
  372. package/dist/cluster/internal/entityManager.js.map +1 -1
  373. package/dist/devtools/DevTools.d.ts +3 -2
  374. package/dist/devtools/DevTools.d.ts.map +1 -1
  375. package/dist/devtools/DevTools.js +3 -2
  376. package/dist/devtools/DevTools.js.map +1 -1
  377. package/dist/devtools/DevToolsClient.d.ts +11 -0
  378. package/dist/devtools/DevToolsClient.d.ts.map +1 -1
  379. package/dist/devtools/DevToolsClient.js +31 -4
  380. package/dist/devtools/DevToolsClient.js.map +1 -1
  381. package/dist/encoding/Base64Url.d.ts +29 -0
  382. package/dist/encoding/Base64Url.d.ts.map +1 -1
  383. package/dist/encoding/Base64Url.js +29 -0
  384. package/dist/encoding/Base64Url.js.map +1 -1
  385. package/dist/encoding/Ini.d.ts.map +1 -1
  386. package/dist/encoding/Ini.js +3 -0
  387. package/dist/encoding/Ini.js.map +1 -1
  388. package/dist/encoding/JsonArray.d.ts +270 -0
  389. package/dist/encoding/JsonArray.d.ts.map +1 -0
  390. package/dist/encoding/JsonArray.js +691 -0
  391. package/dist/encoding/JsonArray.js.map +1 -0
  392. package/dist/encoding/Ndjson.d.ts +43 -4
  393. package/dist/encoding/Ndjson.d.ts.map +1 -1
  394. package/dist/encoding/Ndjson.js +169 -18
  395. package/dist/encoding/Ndjson.js.map +1 -1
  396. package/dist/encoding/SchemaBinary.d.ts +9 -1
  397. package/dist/encoding/SchemaBinary.d.ts.map +1 -1
  398. package/dist/encoding/SchemaBinary.js +12 -19
  399. package/dist/encoding/SchemaBinary.js.map +1 -1
  400. package/dist/encoding/Sse.js +1 -1
  401. package/dist/encoding/Sse.js.map +1 -1
  402. package/dist/encoding/Tar.d.ts +309 -0
  403. package/dist/encoding/Tar.d.ts.map +1 -0
  404. package/dist/encoding/Tar.js +1182 -0
  405. package/dist/encoding/Tar.js.map +1 -0
  406. package/dist/encoding/Toml.js +3 -3
  407. package/dist/encoding/Toml.js.map +1 -1
  408. package/dist/encoding/Xml.d.ts +464 -0
  409. package/dist/encoding/Xml.d.ts.map +1 -0
  410. package/dist/encoding/Xml.js +1619 -0
  411. package/dist/encoding/Xml.js.map +1 -0
  412. package/dist/encoding/Yaml.d.ts +6 -2
  413. package/dist/encoding/Yaml.d.ts.map +1 -1
  414. package/dist/encoding/Yaml.js +97 -34
  415. package/dist/encoding/Yaml.js.map +1 -1
  416. package/dist/encoding/Zip.d.ts +413 -0
  417. package/dist/encoding/Zip.d.ts.map +1 -0
  418. package/dist/encoding/Zip.js +1255 -0
  419. package/dist/encoding/Zip.js.map +1 -0
  420. package/dist/encoding/index.d.ts +20 -0
  421. package/dist/encoding/index.d.ts.map +1 -1
  422. package/dist/encoding/index.js +20 -0
  423. package/dist/encoding/index.js.map +1 -1
  424. package/dist/eventlog/EventJournal.d.ts +90 -5
  425. package/dist/eventlog/EventJournal.d.ts.map +1 -1
  426. package/dist/eventlog/EventJournal.js +488 -228
  427. package/dist/eventlog/EventJournal.js.map +1 -1
  428. package/dist/eventlog/EventLog.d.ts +180 -12
  429. package/dist/eventlog/EventLog.d.ts.map +1 -1
  430. package/dist/eventlog/EventLog.js +394 -146
  431. package/dist/eventlog/EventLog.js.map +1 -1
  432. package/dist/eventlog/EventLogEncryption.d.ts +36 -30
  433. package/dist/eventlog/EventLogEncryption.d.ts.map +1 -1
  434. package/dist/eventlog/EventLogEncryption.js +97 -38
  435. package/dist/eventlog/EventLogEncryption.js.map +1 -1
  436. package/dist/eventlog/EventLogMessage.d.ts +74 -34
  437. package/dist/eventlog/EventLogMessage.d.ts.map +1 -1
  438. package/dist/eventlog/EventLogMessage.js +45 -11
  439. package/dist/eventlog/EventLogMessage.js.map +1 -1
  440. package/dist/eventlog/EventLogRemote.d.ts +45 -8
  441. package/dist/eventlog/EventLogRemote.d.ts.map +1 -1
  442. package/dist/eventlog/EventLogRemote.js +51 -14
  443. package/dist/eventlog/EventLogRemote.js.map +1 -1
  444. package/dist/eventlog/EventLogServer.d.ts +46 -3
  445. package/dist/eventlog/EventLogServer.d.ts.map +1 -1
  446. package/dist/eventlog/EventLogServer.js +119 -19
  447. package/dist/eventlog/EventLogServer.js.map +1 -1
  448. package/dist/eventlog/EventLogServerEncrypted.d.ts +23 -33
  449. package/dist/eventlog/EventLogServerEncrypted.d.ts.map +1 -1
  450. package/dist/eventlog/EventLogServerEncrypted.js +97 -70
  451. package/dist/eventlog/EventLogServerEncrypted.js.map +1 -1
  452. package/dist/eventlog/EventLogServerUnencrypted.d.ts +39 -5
  453. package/dist/eventlog/EventLogServerUnencrypted.d.ts.map +1 -1
  454. package/dist/eventlog/EventLogServerUnencrypted.js +151 -69
  455. package/dist/eventlog/EventLogServerUnencrypted.js.map +1 -1
  456. package/dist/eventlog/EventRow.d.ts +288 -0
  457. package/dist/eventlog/EventRow.d.ts.map +1 -0
  458. package/dist/eventlog/EventRow.js +435 -0
  459. package/dist/eventlog/EventRow.js.map +1 -0
  460. package/dist/eventlog/SqlEventJournal.d.ts +18 -18
  461. package/dist/eventlog/SqlEventJournal.d.ts.map +1 -1
  462. package/dist/eventlog/SqlEventJournal.js +387 -159
  463. package/dist/eventlog/SqlEventJournal.js.map +1 -1
  464. package/dist/eventlog/SqlEventLogServerEncrypted.d.ts +10 -18
  465. package/dist/eventlog/SqlEventLogServerEncrypted.d.ts.map +1 -1
  466. package/dist/eventlog/SqlEventLogServerEncrypted.js +179 -69
  467. package/dist/eventlog/SqlEventLogServerEncrypted.js.map +1 -1
  468. package/dist/eventlog/SqlEventLogServerUnencrypted.d.ts +23 -3
  469. package/dist/eventlog/SqlEventLogServerUnencrypted.d.ts.map +1 -1
  470. package/dist/eventlog/SqlEventLogServerUnencrypted.js +102 -51
  471. package/dist/eventlog/SqlEventLogServerUnencrypted.js.map +1 -1
  472. package/dist/eventlog/index.d.ts +5 -0
  473. package/dist/eventlog/index.d.ts.map +1 -1
  474. package/dist/eventlog/index.js +5 -0
  475. package/dist/eventlog/index.js.map +1 -1
  476. package/dist/eventlog/internal/conflicts.d.ts +47 -0
  477. package/dist/eventlog/internal/conflicts.d.ts.map +1 -0
  478. package/dist/eventlog/internal/conflicts.js +92 -0
  479. package/dist/eventlog/internal/conflicts.js.map +1 -0
  480. package/dist/graphql/GraphQLClient.d.ts.map +1 -1
  481. package/dist/graphql/GraphQLClient.js +12 -5
  482. package/dist/graphql/GraphQLClient.js.map +1 -1
  483. package/dist/graphql/GraphQLClientError.d.ts +2 -2
  484. package/dist/graphql/GraphQLClientError.d.ts.map +1 -1
  485. package/dist/graphql/GraphQLClientError.js +4 -18
  486. package/dist/graphql/GraphQLClientError.js.map +1 -1
  487. package/dist/graphql/GraphQLProtocol.d.ts +252 -11
  488. package/dist/graphql/GraphQLProtocol.d.ts.map +1 -1
  489. package/dist/graphql/GraphQLProtocol.js +99 -8
  490. package/dist/graphql/GraphQLProtocol.js.map +1 -1
  491. package/dist/graphql/GraphQLResolver.d.ts +3 -1
  492. package/dist/graphql/GraphQLResolver.d.ts.map +1 -1
  493. package/dist/graphql/GraphQLResolver.js +91 -19
  494. package/dist/graphql/GraphQLResolver.js.map +1 -1
  495. package/dist/http/FetchHttpClient.d.ts +13 -3
  496. package/dist/http/FetchHttpClient.d.ts.map +1 -1
  497. package/dist/http/FetchHttpClient.js +56 -6
  498. package/dist/http/FetchHttpClient.js.map +1 -1
  499. package/dist/http/FindMyWay/internal/router.js +12 -1
  500. package/dist/http/FindMyWay/internal/router.js.map +1 -1
  501. package/dist/http/Headers.d.ts +230 -3
  502. package/dist/http/Headers.d.ts.map +1 -1
  503. package/dist/http/Headers.js +267 -5
  504. package/dist/http/Headers.js.map +1 -1
  505. package/dist/http/HttpClient.d.ts +105 -0
  506. package/dist/http/HttpClient.d.ts.map +1 -1
  507. package/dist/http/HttpClient.js +69 -17
  508. package/dist/http/HttpClient.js.map +1 -1
  509. package/dist/http/HttpClientError.d.ts.map +1 -1
  510. package/dist/http/HttpClientError.js +8 -6
  511. package/dist/http/HttpClientError.js.map +1 -1
  512. package/dist/http/HttpClientRequest.d.ts +274 -7
  513. package/dist/http/HttpClientRequest.d.ts.map +1 -1
  514. package/dist/http/HttpClientRequest.js +91 -3
  515. package/dist/http/HttpClientRequest.js.map +1 -1
  516. package/dist/http/HttpClientResponse.d.ts +53 -0
  517. package/dist/http/HttpClientResponse.d.ts.map +1 -1
  518. package/dist/http/HttpClientResponse.js +47 -0
  519. package/dist/http/HttpClientResponse.js.map +1 -1
  520. package/dist/http/HttpEffect.d.ts +6 -2
  521. package/dist/http/HttpEffect.d.ts.map +1 -1
  522. package/dist/http/HttpEffect.js +21 -17
  523. package/dist/http/HttpEffect.js.map +1 -1
  524. package/dist/http/HttpIncomingMessage.d.ts +2 -1
  525. package/dist/http/HttpIncomingMessage.d.ts.map +1 -1
  526. package/dist/http/HttpIncomingMessage.js +3 -23
  527. package/dist/http/HttpIncomingMessage.js.map +1 -1
  528. package/dist/http/HttpMiddleware.d.ts +179 -2
  529. package/dist/http/HttpMiddleware.d.ts.map +1 -1
  530. package/dist/http/HttpMiddleware.js +226 -18
  531. package/dist/http/HttpMiddleware.js.map +1 -1
  532. package/dist/http/HttpRouter.d.ts.map +1 -1
  533. package/dist/http/HttpRouter.js +58 -14
  534. package/dist/http/HttpRouter.js.map +1 -1
  535. package/dist/http/HttpServerError.d.ts +5 -2
  536. package/dist/http/HttpServerError.d.ts.map +1 -1
  537. package/dist/http/HttpServerError.js +11 -7
  538. package/dist/http/HttpServerError.js.map +1 -1
  539. package/dist/http/HttpServerRequest.d.ts +25 -5
  540. package/dist/http/HttpServerRequest.d.ts.map +1 -1
  541. package/dist/http/HttpServerRequest.js +38 -12
  542. package/dist/http/HttpServerRequest.js.map +1 -1
  543. package/dist/http/HttpServerResponse.d.ts +17 -8
  544. package/dist/http/HttpServerResponse.d.ts.map +1 -1
  545. package/dist/http/HttpServerResponse.js +37 -21
  546. package/dist/http/HttpServerResponse.js.map +1 -1
  547. package/dist/http/HttpStaticServer.d.ts +0 -12
  548. package/dist/http/HttpStaticServer.d.ts.map +1 -1
  549. package/dist/http/HttpStaticServer.js +25 -17
  550. package/dist/http/HttpStaticServer.js.map +1 -1
  551. package/dist/http/HttpTraceContext.js +1 -1
  552. package/dist/http/HttpTraceContext.js.map +1 -1
  553. package/dist/http/MultipartParser/internal/contentType.d.ts +15 -1
  554. package/dist/http/MultipartParser/internal/contentType.d.ts.map +1 -1
  555. package/dist/http/MultipartParser/internal/contentType.js +87 -5
  556. package/dist/http/MultipartParser/internal/contentType.js.map +1 -1
  557. package/dist/http/MultipartParser/internal/headers.d.ts.map +1 -1
  558. package/dist/http/MultipartParser/internal/headers.js +4 -12
  559. package/dist/http/MultipartParser/internal/headers.js.map +1 -1
  560. package/dist/http/MultipartParser/internal/multipart.d.ts.map +1 -1
  561. package/dist/http/MultipartParser/internal/multipart.js +6 -27
  562. package/dist/http/MultipartParser/internal/multipart.js.map +1 -1
  563. package/dist/http/Url.d.ts.map +1 -1
  564. package/dist/http/Url.js +8 -2
  565. package/dist/http/Url.js.map +1 -1
  566. package/dist/http/UrlParams.d.ts +112 -8
  567. package/dist/http/UrlParams.d.ts.map +1 -1
  568. package/dist/http/UrlParams.js +141 -14
  569. package/dist/http/UrlParams.js.map +1 -1
  570. package/dist/http/internal/compression.d.ts +1 -1
  571. package/dist/http/internal/compression.d.ts.map +1 -1
  572. package/dist/http/internal/compression.js +2 -10
  573. package/dist/http/internal/compression.js.map +1 -1
  574. package/dist/http/internal/compressionBody.d.ts +2 -0
  575. package/dist/http/internal/compressionBody.d.ts.map +1 -0
  576. package/dist/http/internal/compressionBody.js +36 -0
  577. package/dist/http/internal/compressionBody.js.map +1 -0
  578. package/dist/http/internal/decompression.d.ts +2 -0
  579. package/dist/http/internal/decompression.d.ts.map +1 -0
  580. package/dist/http/internal/decompression.js +168 -0
  581. package/dist/http/internal/decompression.js.map +1 -0
  582. package/dist/http/internal/lazyStream.d.ts +2 -0
  583. package/dist/http/internal/lazyStream.d.ts.map +1 -0
  584. package/dist/http/internal/lazyStream.js +18 -0
  585. package/dist/http/internal/lazyStream.js.map +1 -0
  586. package/dist/http/internal/requestState.d.ts +2 -0
  587. package/dist/http/internal/requestState.d.ts.map +1 -0
  588. package/dist/http/internal/requestState.js +28 -0
  589. package/dist/http/internal/requestState.js.map +1 -0
  590. package/dist/http/internal/tracing.js +14 -4
  591. package/dist/http/internal/tracing.js.map +1 -1
  592. package/dist/http/internal/urlParams.d.ts +2 -0
  593. package/dist/http/internal/urlParams.d.ts.map +1 -0
  594. package/dist/http/internal/urlParams.js +4 -0
  595. package/dist/http/internal/urlParams.js.map +1 -0
  596. package/dist/http/internal/webResponse.d.ts +2 -0
  597. package/dist/http/internal/webResponse.d.ts.map +1 -0
  598. package/dist/http/internal/webResponse.js +12 -0
  599. package/dist/http/internal/webResponse.js.map +1 -0
  600. package/dist/http-api/HttpApi.js +1 -1
  601. package/dist/http-api/HttpApi.js.map +1 -1
  602. package/dist/http-api/HttpApiBuilder.d.ts.map +1 -1
  603. package/dist/http-api/HttpApiBuilder.js +121 -18
  604. package/dist/http-api/HttpApiBuilder.js.map +1 -1
  605. package/dist/http-api/HttpApiClient.d.ts +29 -4
  606. package/dist/http-api/HttpApiClient.d.ts.map +1 -1
  607. package/dist/http-api/HttpApiClient.js +85 -24
  608. package/dist/http-api/HttpApiClient.js.map +1 -1
  609. package/dist/http-api/HttpApiEndpoint.d.ts +55 -29
  610. package/dist/http-api/HttpApiEndpoint.d.ts.map +1 -1
  611. package/dist/http-api/HttpApiEndpoint.js +49 -5
  612. package/dist/http-api/HttpApiEndpoint.js.map +1 -1
  613. package/dist/http-api/HttpApiError.d.ts +58 -0
  614. package/dist/http-api/HttpApiError.d.ts.map +1 -1
  615. package/dist/http-api/HttpApiError.js +38 -12
  616. package/dist/http-api/HttpApiError.js.map +1 -1
  617. package/dist/http-api/HttpApiScalar.d.ts +2 -1
  618. package/dist/http-api/HttpApiScalar.d.ts.map +1 -1
  619. package/dist/http-api/HttpApiScalar.js +6 -3
  620. package/dist/http-api/HttpApiScalar.js.map +1 -1
  621. package/dist/http-api/HttpApiSchema.d.ts +191 -9
  622. package/dist/http-api/HttpApiSchema.d.ts.map +1 -1
  623. package/dist/http-api/HttpApiSchema.js +137 -4
  624. package/dist/http-api/HttpApiSchema.js.map +1 -1
  625. package/dist/http-api/HttpApiSwagger.d.ts +5 -0
  626. package/dist/http-api/HttpApiSwagger.d.ts.map +1 -1
  627. package/dist/http-api/HttpApiSwagger.js +14 -4
  628. package/dist/http-api/HttpApiSwagger.js.map +1 -1
  629. package/dist/http-api/HttpApiTest.d.ts +13 -2
  630. package/dist/http-api/HttpApiTest.d.ts.map +1 -1
  631. package/dist/http-api/HttpApiTest.js +30 -9
  632. package/dist/http-api/HttpApiTest.js.map +1 -1
  633. package/dist/http-api/OpenApi.d.ts +17 -3
  634. package/dist/http-api/OpenApi.d.ts.map +1 -1
  635. package/dist/http-api/OpenApi.js +57 -32
  636. package/dist/http-api/OpenApi.js.map +1 -1
  637. package/dist/http-api/internal/path.js +35 -10
  638. package/dist/http-api/internal/path.js.map +1 -1
  639. package/dist/index.d.ts +20 -0
  640. package/dist/index.d.ts.map +1 -1
  641. package/dist/index.js +20 -0
  642. package/dist/index.js.map +1 -1
  643. package/dist/internal/core.js +18 -2
  644. package/dist/internal/core.js.map +1 -1
  645. package/dist/internal/dateTime.js +19 -7
  646. package/dist/internal/dateTime.js.map +1 -1
  647. package/dist/internal/effect.js +89 -76
  648. package/dist/internal/effect.js.map +1 -1
  649. package/dist/internal/graphql.js +12 -2
  650. package/dist/internal/graphql.js.map +1 -1
  651. package/dist/internal/hashMap.js +2 -2
  652. package/dist/internal/hashMap.js.map +1 -1
  653. package/dist/internal/hydration.d.ts +2 -0
  654. package/dist/internal/hydration.d.ts.map +1 -0
  655. package/dist/internal/hydration.js +15 -0
  656. package/dist/internal/hydration.js.map +1 -0
  657. package/dist/internal/inflate.d.ts +2 -0
  658. package/dist/internal/inflate.d.ts.map +1 -0
  659. package/dist/internal/inflate.js +680 -0
  660. package/dist/internal/inflate.js.map +1 -0
  661. package/dist/internal/record.js +6 -0
  662. package/dist/internal/record.js.map +1 -1
  663. package/dist/internal/request.js +20 -7
  664. package/dist/internal/request.js.map +1 -1
  665. package/dist/internal/schedule.js +17 -22
  666. package/dist/internal/schedule.js.map +1 -1
  667. package/dist/internal/schema/fromJsonSchemaDocument.js +136 -126
  668. package/dist/internal/schema/fromJsonSchemaDocument.js.map +1 -1
  669. package/dist/internal/schema/interpreter.js +51 -36
  670. package/dist/internal/schema/interpreter.js.map +1 -1
  671. package/dist/internal/schema/standardSchema.js +34 -33
  672. package/dist/internal/schema/standardSchema.js.map +1 -1
  673. package/dist/internal/schema/toCodeDocument.js +7 -2
  674. package/dist/internal/schema/toCodeDocument.js.map +1 -1
  675. package/dist/internal/schema/toCodec.js +86 -1
  676. package/dist/internal/schema/toCodec.js.map +1 -1
  677. package/dist/internal/schema/toFormatter.js +5 -5
  678. package/dist/internal/schema/toFormatter.js.map +1 -1
  679. package/dist/internal/schema/toJsonSchemaDocument.js +60 -38
  680. package/dist/internal/schema/toJsonSchemaDocument.js.map +1 -1
  681. package/dist/internal/trie.js +1 -3
  682. package/dist/internal/trie.js.map +1 -1
  683. package/dist/internal/uuid.js +7 -3
  684. package/dist/internal/uuid.js.map +1 -1
  685. package/dist/internal/version.js +1 -1
  686. package/dist/net/NetAddress.d.ts.map +1 -1
  687. package/dist/net/NetAddress.js +2 -8
  688. package/dist/net/NetAddress.js.map +1 -1
  689. package/dist/observability/Otlp.d.ts +15 -0
  690. package/dist/observability/Otlp.d.ts.map +1 -1
  691. package/dist/observability/Otlp.js +3 -0
  692. package/dist/observability/Otlp.js.map +1 -1
  693. package/dist/observability/OtlpExporter.d.ts +8 -0
  694. package/dist/observability/OtlpExporter.d.ts.map +1 -1
  695. package/dist/observability/OtlpExporter.js +15 -13
  696. package/dist/observability/OtlpExporter.js.map +1 -1
  697. package/dist/observability/OtlpLogger.d.ts +17 -0
  698. package/dist/observability/OtlpLogger.d.ts.map +1 -1
  699. package/dist/observability/OtlpLogger.js +14 -1
  700. package/dist/observability/OtlpLogger.js.map +1 -1
  701. package/dist/observability/OtlpMetrics.d.ts +17 -0
  702. package/dist/observability/OtlpMetrics.d.ts.map +1 -1
  703. package/dist/observability/OtlpMetrics.js +18 -3
  704. package/dist/observability/OtlpMetrics.js.map +1 -1
  705. package/dist/observability/OtlpResource.d.ts +3 -1
  706. package/dist/observability/OtlpResource.d.ts.map +1 -1
  707. package/dist/observability/OtlpResource.js +11 -4
  708. package/dist/observability/OtlpResource.js.map +1 -1
  709. package/dist/observability/OtlpSerialization.d.ts +5 -0
  710. package/dist/observability/OtlpSerialization.d.ts.map +1 -1
  711. package/dist/observability/OtlpSerialization.js +14 -3
  712. package/dist/observability/OtlpSerialization.js.map +1 -1
  713. package/dist/observability/OtlpTracer.d.ts +17 -0
  714. package/dist/observability/OtlpTracer.d.ts.map +1 -1
  715. package/dist/observability/OtlpTracer.js +15 -2
  716. package/dist/observability/OtlpTracer.js.map +1 -1
  717. package/dist/observability/internal/protobuf.d.ts +0 -9
  718. package/dist/observability/internal/protobuf.d.ts.map +1 -1
  719. package/dist/observability/internal/protobuf.js +2 -10
  720. package/dist/observability/internal/protobuf.js.map +1 -1
  721. package/dist/persistence/PersistedCache.d.ts.map +1 -1
  722. package/dist/persistence/PersistedCache.js +1 -1
  723. package/dist/persistence/PersistedCache.js.map +1 -1
  724. package/dist/persistence/PersistedQueue.d.ts +6 -2
  725. package/dist/persistence/PersistedQueue.d.ts.map +1 -1
  726. package/dist/persistence/PersistedQueue.js +162 -84
  727. package/dist/persistence/PersistedQueue.js.map +1 -1
  728. package/dist/persistence/Persistence.d.ts +28 -0
  729. package/dist/persistence/Persistence.d.ts.map +1 -1
  730. package/dist/persistence/Persistence.js +36 -8
  731. package/dist/persistence/Persistence.js.map +1 -1
  732. package/dist/persistence/RateLimiter.d.ts.map +1 -1
  733. package/dist/persistence/RateLimiter.js +8 -12
  734. package/dist/persistence/RateLimiter.js.map +1 -1
  735. package/dist/persistence/UserDirectories.d.ts +129 -0
  736. package/dist/persistence/UserDirectories.d.ts.map +1 -0
  737. package/dist/persistence/UserDirectories.js +178 -0
  738. package/dist/persistence/UserDirectories.js.map +1 -0
  739. package/dist/persistence/index.d.ts +5 -0
  740. package/dist/persistence/index.d.ts.map +1 -1
  741. package/dist/persistence/index.js +5 -0
  742. package/dist/persistence/index.js.map +1 -1
  743. package/dist/process/ChildProcess.d.ts +2 -1
  744. package/dist/process/ChildProcess.d.ts.map +1 -1
  745. package/dist/process/ChildProcess.js.map +1 -1
  746. package/dist/reactivity/AsyncResult.d.ts +6 -0
  747. package/dist/reactivity/AsyncResult.d.ts.map +1 -1
  748. package/dist/reactivity/AsyncResult.js +28 -1
  749. package/dist/reactivity/AsyncResult.js.map +1 -1
  750. package/dist/reactivity/Atom.d.ts +69 -30
  751. package/dist/reactivity/Atom.d.ts.map +1 -1
  752. package/dist/reactivity/Atom.js +40 -15
  753. package/dist/reactivity/Atom.js.map +1 -1
  754. package/dist/reactivity/AtomHttpApi.d.ts +5 -5
  755. package/dist/reactivity/AtomHttpApi.d.ts.map +1 -1
  756. package/dist/reactivity/AtomHttpApi.js +1 -1
  757. package/dist/reactivity/AtomHttpApi.js.map +1 -1
  758. package/dist/reactivity/AtomRegistry.d.ts +2 -2
  759. package/dist/reactivity/AtomRegistry.d.ts.map +1 -1
  760. package/dist/reactivity/AtomRegistry.js +47 -10
  761. package/dist/reactivity/AtomRegistry.js.map +1 -1
  762. package/dist/reactivity/AtomRpc.d.ts +3 -3
  763. package/dist/reactivity/AtomRpc.d.ts.map +1 -1
  764. package/dist/reactivity/AtomRpc.js +1 -1
  765. package/dist/reactivity/AtomRpc.js.map +1 -1
  766. package/dist/reactivity/Hydration.d.ts.map +1 -1
  767. package/dist/reactivity/Hydration.js +46 -12
  768. package/dist/reactivity/Hydration.js.map +1 -1
  769. package/dist/reactivity/Reactivity.d.ts +71 -7
  770. package/dist/reactivity/Reactivity.d.ts.map +1 -1
  771. package/dist/reactivity/Reactivity.js +21 -12
  772. package/dist/reactivity/Reactivity.js.map +1 -1
  773. package/dist/rpc/Rpc.d.ts +18 -0
  774. package/dist/rpc/Rpc.d.ts.map +1 -1
  775. package/dist/rpc/Rpc.js +20 -0
  776. package/dist/rpc/Rpc.js.map +1 -1
  777. package/dist/rpc/RpcClient.d.ts +26 -2
  778. package/dist/rpc/RpcClient.d.ts.map +1 -1
  779. package/dist/rpc/RpcClient.js +202 -61
  780. package/dist/rpc/RpcClient.js.map +1 -1
  781. package/dist/rpc/RpcSerialization.d.ts +15 -0
  782. package/dist/rpc/RpcSerialization.d.ts.map +1 -1
  783. package/dist/rpc/RpcSerialization.js +21 -5
  784. package/dist/rpc/RpcSerialization.js.map +1 -1
  785. package/dist/rpc/RpcServer.d.ts.map +1 -1
  786. package/dist/rpc/RpcServer.js +9 -18
  787. package/dist/rpc/RpcServer.js.map +1 -1
  788. package/dist/schema/Model.d.ts +1 -1
  789. package/dist/schema/VariantSchema.d.ts +22 -3
  790. package/dist/schema/VariantSchema.d.ts.map +1 -1
  791. package/dist/schema/VariantSchema.js +32 -18
  792. package/dist/schema/VariantSchema.js.map +1 -1
  793. package/dist/socket/Socket.d.ts +23 -1
  794. package/dist/socket/Socket.d.ts.map +1 -1
  795. package/dist/socket/Socket.js +36 -3
  796. package/dist/socket/Socket.js.map +1 -1
  797. package/dist/sql/Migrator.d.ts.map +1 -1
  798. package/dist/sql/Migrator.js +15 -3
  799. package/dist/sql/Migrator.js.map +1 -1
  800. package/dist/sql/SqlClient.d.ts +151 -12
  801. package/dist/sql/SqlClient.d.ts.map +1 -1
  802. package/dist/sql/SqlClient.js +156 -34
  803. package/dist/sql/SqlClient.js.map +1 -1
  804. package/dist/sql/SqlResolver.d.ts +9 -0
  805. package/dist/sql/SqlResolver.d.ts.map +1 -1
  806. package/dist/sql/SqlResolver.js +9 -0
  807. package/dist/sql/SqlResolver.js.map +1 -1
  808. package/dist/sql/Statement.d.ts +3 -1
  809. package/dist/sql/Statement.d.ts.map +1 -1
  810. package/dist/sql/Statement.js +24 -5
  811. package/dist/sql/Statement.js.map +1 -1
  812. package/dist/testing/TestClock.d.ts +16 -3
  813. package/dist/testing/TestClock.d.ts.map +1 -1
  814. package/dist/testing/TestClock.js +115 -23
  815. package/dist/testing/TestClock.js.map +1 -1
  816. package/dist/testing/TestSchema.d.ts +7 -1
  817. package/dist/testing/TestSchema.d.ts.map +1 -1
  818. package/dist/testing/TestSchema.js +9 -3
  819. package/dist/testing/TestSchema.js.map +1 -1
  820. package/dist/workflow/Activity.js +1 -0
  821. package/dist/workflow/Activity.js.map +1 -1
  822. package/dist/workflow/Workflow.d.ts +22 -0
  823. package/dist/workflow/Workflow.d.ts.map +1 -1
  824. package/dist/workflow/Workflow.js +15 -3
  825. package/dist/workflow/Workflow.js.map +1 -1
  826. package/dist/workflow/WorkflowEngine.d.ts +20 -1
  827. package/dist/workflow/WorkflowEngine.d.ts.map +1 -1
  828. package/dist/workflow/WorkflowEngine.js +52 -24
  829. package/dist/workflow/WorkflowEngine.js.map +1 -1
  830. package/package.json +13 -3
  831. package/src/Array.ts +223 -61
  832. package/src/Bytes.ts +111 -0
  833. package/src/Channel.ts +287 -439
  834. package/src/ChannelSchema.ts +1 -49
  835. package/src/Chunk.ts +55 -61
  836. package/src/Config.ts +12 -86
  837. package/src/ConfigProvider.ts +41 -44
  838. package/src/Cron.ts +6 -3
  839. package/src/Duration.ts +70 -21
  840. package/src/Effect.ts +642 -220
  841. package/src/Equivalence.ts +7 -4
  842. package/src/Exit.ts +24 -9
  843. package/src/FiberHandle.ts +10 -9
  844. package/src/FiberMap.ts +13 -66
  845. package/src/FileSystem.ts +33 -9
  846. package/src/Graph.ts +171 -1263
  847. package/src/HashSet.ts +0 -60
  848. package/src/Iterable.ts +15 -14
  849. package/src/JsonSchema.ts +28 -3
  850. package/src/Layer.ts +2 -2
  851. package/src/ManagedRuntime.ts +72 -6
  852. package/src/Match.ts +65 -12
  853. package/src/Metric.ts +249 -507
  854. package/src/MutableHashMap.ts +4 -473
  855. package/src/Number.ts +2 -2
  856. package/src/Optic.ts +17 -332
  857. package/src/Path.ts +61 -8
  858. package/src/PubSub.ts +12 -7
  859. package/src/Queue.ts +5 -37
  860. package/src/Random.ts +1 -1
  861. package/src/RcMap.ts +14 -8
  862. package/src/Record.ts +51 -0
  863. package/src/Ref.ts +7 -104
  864. package/src/References.ts +5 -4
  865. package/src/RequestResolver.ts +46 -87
  866. package/src/Resource.ts +1 -1
  867. package/src/Runtime.ts +19 -18
  868. package/src/Schedule.ts +2 -94
  869. package/src/Schema.ts +596 -348
  870. package/src/SchemaAST.ts +20 -9
  871. package/src/SchemaGetter.ts +22 -5
  872. package/src/SchemaIssue.ts +44 -53
  873. package/src/SchemaRepresentation.ts +64 -1
  874. package/src/SchemaTransformation.ts +1 -1
  875. package/src/Scope.ts +12 -2
  876. package/src/ScopedCache.ts +17 -142
  877. package/src/SemVer.ts +1528 -0
  878. package/src/SemVerRange.ts +883 -0
  879. package/src/Sink.ts +6 -2
  880. package/src/Stream.ts +334 -1011
  881. package/src/String.ts +25 -12
  882. package/src/TextDiff.ts +766 -0
  883. package/src/TxHashMap.ts +1 -103
  884. package/src/TxHashSet.ts +48 -753
  885. package/src/TxRef.ts +4 -2
  886. package/src/ai/AiError.ts +69 -5
  887. package/src/ai/Chat.ts +10 -5
  888. package/src/ai/Decision.ts +119 -22
  889. package/src/ai/DecisionModel.ts +265 -109
  890. package/src/ai/EmbeddingModel.ts +25 -13
  891. package/src/ai/LanguageModel.ts +57 -51
  892. package/src/ai/McpClient.ts +1211 -0
  893. package/src/ai/McpClientError.ts +329 -0
  894. package/src/ai/McpProtocol.ts +2 -2
  895. package/src/ai/McpSchema.ts +153 -35
  896. package/src/ai/McpServer.ts +232 -275
  897. package/src/ai/Prompt.ts +49 -35
  898. package/src/ai/Response.ts +195 -65
  899. package/src/ai/Tool.ts +12 -4
  900. package/src/ai/Toolkit.ts +78 -10
  901. package/src/ai/index.ts +12 -0
  902. package/src/ai/internal/mcpCore.ts +13 -14
  903. package/src/ai/internal/mcpProtocol/v2024_11_05.ts +1 -1
  904. package/src/ai/internal/mcpProtocol/v2025_03_26.ts +1 -1
  905. package/src/ai/internal/mcpProtocol/v2025_06_18.ts +3 -3
  906. package/src/ai/internal/mcpProtocol/v2025_11_25.ts +3 -3
  907. package/src/ai/internal/mcpProtocol/v2026_07_28.ts +12 -14
  908. package/src/ai/internal/mcpProtocol.ts +22 -2
  909. package/src/ai/internal/mcpRuntime.ts +3 -4
  910. package/src/ai/internal/mcpSchema/v2024_11_05.ts +20 -13
  911. package/src/ai/internal/mcpSchema/v2025_03_26.ts +4 -2
  912. package/src/ai/internal/mcpSchema/v2025_06_18.ts +7 -7
  913. package/src/ai/internal/mcpSchema/v2025_11_25.ts +8 -8
  914. package/src/ai/internal/mcpSchema/v2026_07_28.ts +44 -42
  915. package/src/cli/CliError.ts +49 -4
  916. package/src/cli/Command.ts +316 -9
  917. package/src/cli/Completions.ts +10 -0
  918. package/src/cli/Flag.ts +218 -0
  919. package/src/cli/GlobalFlag.ts +3 -3
  920. package/src/cli/Param.ts +218 -0
  921. package/src/cli/TerminalCapabilities.ts +156 -0
  922. package/src/cli/index.ts +6 -0
  923. package/src/cli/internal/command.ts +10 -4
  924. package/src/cli/internal/completions/bash.ts +7 -5
  925. package/src/cli/internal/completions/descriptor.ts +20 -1
  926. package/src/cli/internal/completions/fish.ts +12 -10
  927. package/src/cli/internal/completions/powershell.ts +25 -13
  928. package/src/cli/internal/completions/zsh.ts +15 -8
  929. package/src/cli/internal/formatter.ts +18 -0
  930. package/src/cli/internal/lexer.ts +12 -5
  931. package/src/cli/internal/parser.ts +43 -14
  932. package/src/cli/internal/wizard.ts +2 -1
  933. package/src/cluster/ClusterCron.ts +94 -35
  934. package/src/cluster/ClusterMetrics.ts +149 -7
  935. package/src/cluster/ClusterWorkflowEngine.ts +164 -53
  936. package/src/cluster/Entity.ts +4 -0
  937. package/src/cluster/MessageStorage.ts +21 -3
  938. package/src/cluster/Runners.ts +145 -72
  939. package/src/cluster/Sharding.ts +118 -38
  940. package/src/cluster/ShardingConfig.ts +15 -0
  941. package/src/cluster/SqlMessageStorage.ts +58 -55
  942. package/src/cluster/SqlRunnerStorage.ts +10 -4
  943. package/src/cluster/internal/entityManager.ts +81 -11
  944. package/src/devtools/DevTools.ts +3 -2
  945. package/src/devtools/DevToolsClient.ts +27 -10
  946. package/src/encoding/Base64Url.ts +31 -0
  947. package/src/encoding/Ini.ts +3 -0
  948. package/src/encoding/JsonArray.ts +849 -0
  949. package/src/encoding/Ndjson.ts +211 -20
  950. package/src/encoding/SchemaBinary.ts +14 -48
  951. package/src/encoding/Sse.ts +1 -1
  952. package/src/encoding/Tar.ts +1417 -0
  953. package/src/encoding/Toml.ts +3 -3
  954. package/src/encoding/Xml.ts +2037 -0
  955. package/src/encoding/Yaml.ts +108 -36
  956. package/src/encoding/Zip.ts +1558 -0
  957. package/src/encoding/index.ts +24 -0
  958. package/src/eventlog/EventJournal.ts +611 -227
  959. package/src/eventlog/EventLog.ts +496 -196
  960. package/src/eventlog/EventLogEncryption.ts +128 -43
  961. package/src/eventlog/EventLogMessage.ts +62 -11
  962. package/src/eventlog/EventLogRemote.ts +77 -21
  963. package/src/eventlog/EventLogServer.ts +162 -20
  964. package/src/eventlog/EventLogServerEncrypted.ts +121 -80
  965. package/src/eventlog/EventLogServerUnencrypted.ts +180 -77
  966. package/src/eventlog/EventRow.ts +706 -0
  967. package/src/eventlog/SqlEventJournal.ts +453 -173
  968. package/src/eventlog/SqlEventLogServerEncrypted.ts +212 -83
  969. package/src/eventlog/SqlEventLogServerUnencrypted.ts +141 -62
  970. package/src/eventlog/index.ts +6 -0
  971. package/src/eventlog/internal/conflicts.ts +123 -0
  972. package/src/graphql/GraphQLClient.ts +17 -5
  973. package/src/graphql/GraphQLClientError.ts +5 -12
  974. package/src/graphql/GraphQLProtocol.ts +277 -20
  975. package/src/graphql/GraphQLResolver.ts +109 -230
  976. package/src/http/FetchHttpClient.ts +61 -8
  977. package/src/http/FindMyWay/internal/router.ts +13 -1
  978. package/src/http/Headers.ts +343 -163
  979. package/src/http/HttpClient.ts +144 -136
  980. package/src/http/HttpClientError.ts +10 -6
  981. package/src/http/HttpClientRequest.ts +315 -11
  982. package/src/http/HttpClientResponse.ts +71 -0
  983. package/src/http/HttpEffect.ts +25 -33
  984. package/src/http/HttpIncomingMessage.ts +3 -23
  985. package/src/http/HttpMiddleware.ts +265 -28
  986. package/src/http/HttpRouter.ts +67 -14
  987. package/src/http/HttpServerError.ts +14 -7
  988. package/src/http/HttpServerRequest.ts +73 -14
  989. package/src/http/HttpServerResponse.ts +49 -23
  990. package/src/http/HttpStaticServer.ts +29 -19
  991. package/src/http/HttpTraceContext.ts +1 -1
  992. package/src/http/MultipartParser/internal/contentType.ts +107 -6
  993. package/src/http/MultipartParser/internal/headers.ts +4 -16
  994. package/src/http/MultipartParser/internal/multipart.ts +10 -32
  995. package/src/http/Url.ts +8 -2
  996. package/src/http/UrlParams.ts +225 -26
  997. package/src/http/internal/compression.ts +3 -17
  998. package/src/http/internal/compressionBody.ts +56 -0
  999. package/src/http/internal/decompression.ts +235 -0
  1000. package/src/http/internal/lazyStream.ts +25 -0
  1001. package/src/http/internal/requestState.ts +33 -0
  1002. package/src/http/internal/tracing.ts +21 -4
  1003. package/src/http/internal/urlParams.ts +5 -0
  1004. package/src/http/internal/webResponse.ts +20 -0
  1005. package/src/http-api/HttpApi.ts +1 -1
  1006. package/src/http-api/HttpApiBuilder.ts +151 -23
  1007. package/src/http-api/HttpApiClient.ts +160 -31
  1008. package/src/http-api/HttpApiEndpoint.ts +144 -33
  1009. package/src/http-api/HttpApiError.ts +55 -0
  1010. package/src/http-api/HttpApiScalar.ts +4 -3
  1011. package/src/http-api/HttpApiSchema.ts +275 -13
  1012. package/src/http-api/HttpApiSwagger.ts +11 -4
  1013. package/src/http-api/HttpApiTest.ts +33 -9
  1014. package/src/http-api/OpenApi.ts +84 -42
  1015. package/src/http-api/internal/path.ts +40 -12
  1016. package/src/index.ts +24 -0
  1017. package/src/internal/core.ts +22 -2
  1018. package/src/internal/dateTime.ts +20 -7
  1019. package/src/internal/effect.ts +125 -88
  1020. package/src/internal/graphql.ts +30 -7
  1021. package/src/internal/hashMap.ts +2 -2
  1022. package/src/internal/hydration.ts +15 -0
  1023. package/src/internal/inflate.ts +710 -0
  1024. package/src/internal/record.ts +6 -0
  1025. package/src/internal/request.ts +21 -6
  1026. package/src/internal/schedule.ts +20 -39
  1027. package/src/internal/schema/fromJsonSchemaDocument.ts +262 -193
  1028. package/src/internal/schema/interpreter.ts +58 -45
  1029. package/src/internal/schema/standardSchema.ts +32 -30
  1030. package/src/internal/schema/toCodeDocument.ts +8 -3
  1031. package/src/internal/schema/toCodec.ts +116 -1
  1032. package/src/internal/schema/toFormatter.ts +6 -6
  1033. package/src/internal/schema/toJsonSchemaDocument.ts +69 -39
  1034. package/src/internal/trie.ts +1 -3
  1035. package/src/internal/uuid.ts +15 -10
  1036. package/src/internal/version.ts +1 -1
  1037. package/src/net/NetAddress.ts +2 -9
  1038. package/src/observability/Otlp.ts +18 -0
  1039. package/src/observability/OtlpExporter.ts +19 -15
  1040. package/src/observability/OtlpLogger.ts +31 -2
  1041. package/src/observability/OtlpMetrics.ts +35 -4
  1042. package/src/observability/OtlpResource.ts +16 -6
  1043. package/src/observability/OtlpSerialization.ts +17 -3
  1044. package/src/observability/OtlpTracer.ts +32 -3
  1045. package/src/observability/internal/protobuf.ts +2 -10
  1046. package/src/persistence/PersistedCache.ts +3 -1
  1047. package/src/persistence/PersistedQueue.ts +223 -153
  1048. package/src/persistence/Persistence.ts +64 -30
  1049. package/src/persistence/RateLimiter.ts +18 -21
  1050. package/src/persistence/UserDirectories.ts +273 -0
  1051. package/src/persistence/index.ts +6 -0
  1052. package/src/process/ChildProcess.ts +2 -1
  1053. package/src/reactivity/AsyncResult.ts +35 -38
  1054. package/src/reactivity/Atom.ts +134 -166
  1055. package/src/reactivity/AtomHttpApi.ts +10 -16
  1056. package/src/reactivity/AtomRegistry.ts +53 -30
  1057. package/src/reactivity/AtomRpc.ts +6 -22
  1058. package/src/reactivity/Hydration.ts +53 -12
  1059. package/src/reactivity/Reactivity.ts +97 -39
  1060. package/src/rpc/Rpc.ts +21 -0
  1061. package/src/rpc/RpcClient.ts +285 -104
  1062. package/src/rpc/RpcSerialization.ts +21 -5
  1063. package/src/rpc/RpcServer.ts +11 -20
  1064. package/src/schema/VariantSchema.ts +86 -22
  1065. package/src/socket/Socket.ts +45 -20
  1066. package/src/sql/Migrator.ts +19 -9
  1067. package/src/sql/SqlClient.ts +275 -36
  1068. package/src/sql/SqlResolver.ts +9 -0
  1069. package/src/sql/Statement.ts +35 -8
  1070. package/src/testing/TestClock.ts +147 -29
  1071. package/src/testing/TestSchema.ts +9 -3
  1072. package/src/workflow/Activity.ts +1 -0
  1073. package/src/workflow/Workflow.ts +31 -5
  1074. package/src/workflow/WorkflowEngine.ts +93 -31
  1075. package/dist/http/internal/preResponseHandler.d.ts +0 -2
  1076. package/dist/http/internal/preResponseHandler.d.ts.map +0 -1
  1077. package/dist/http/internal/preResponseHandler.js +0 -14
  1078. package/dist/http/internal/preResponseHandler.js.map +0 -1
  1079. package/src/http/internal/preResponseHandler.ts +0 -19
@@ -1,15 +1,11 @@
1
1
  /**
2
- * SQL-backed persistence for the unstable event-log journal.
3
- *
4
- * This module implements `EventJournal` on top of a `SqlClient`. It stores event
5
- * entries as encoded bytes and stores per-remote sequence metadata in separate
6
- * tables, giving event-log programs a durable journal that can be replayed after
7
- * restart and synchronized with remote journals.
2
+ * SQL-backed event journal with per-remote upload checkpoints.
8
3
  *
9
4
  * @stability unstable
10
5
  * @since 4.0.0
11
6
  */
12
7
  import * as Arr from "../Array.ts"
8
+ import * as Clock from "../Clock.ts"
13
9
  import * as Effect from "../Effect.ts"
14
10
  import * as Uuid from "../internal/uuid.ts"
15
11
  import * as Layer from "../Layer.ts"
@@ -20,6 +16,7 @@ import * as SqlClient from "../sql/SqlClient.ts"
20
16
  import * as SqlError from "../sql/SqlError.ts"
21
17
  import * as SqlSchema from "../sql/SqlSchema.ts"
22
18
  import * as EventJournal from "./EventJournal.ts"
19
+ import { ConflictIndex } from "./internal/conflicts.ts"
23
20
 
24
21
  type WriteFromRemoteOptions = Parameters<EventJournal.EventJournal["Service"]["writeFromRemote"]>[0]
25
22
 
@@ -28,8 +25,20 @@ type WriteFromRemoteOptions = Parameters<EventJournal.EventJournal["Service"]["w
28
25
  *
29
26
  * **Details**
30
27
  *
31
- * The constructor creates the entry and remote metadata tables when needed,
32
- * persists local and remote entries, and uses the configured `SqlClient`.
28
+ * Maintains `entryTable`, `${entryTable}_sequence`, `${entryTable}_sources`,
29
+ * `${remotesTable}_checkpoints` and `remoteCursorsTable` (default
30
+ * `${remotesTable}_cursors`) using the configured `SqlClient`.
31
+ *
32
+ * **Gotchas**
33
+ *
34
+ * Creating or migrating the schema requires a writable connection. Migrated
35
+ * databases can be reopened read-only.
36
+ *
37
+ * Journals from earlier releases keep one `remotesTable` row per entry per
38
+ * remote. Opening one replaces those rows with entry sources and drops the
39
+ * table; an entry known to several remotes keeps one of them as its source.
40
+ *
41
+ * Upload acknowledgements do not advance past unseen entries.
33
42
  *
34
43
  * @stability unstable
35
44
  * @category constructors
@@ -38,6 +47,7 @@ type WriteFromRemoteOptions = Parameters<EventJournal.EventJournal["Service"]["w
38
47
  export const make = (options?: {
39
48
  readonly entryTable?: string
40
49
  readonly remotesTable?: string
50
+ readonly remoteCursorsTable?: string
41
51
  }): Effect.Effect<
42
52
  EventJournal.EventJournal["Service"],
43
53
  SqlError.SqlError,
@@ -48,102 +58,298 @@ export const make = (options?: {
48
58
 
49
59
  const entryTable = options?.entryTable ?? "effect_event_journal"
50
60
  const remotesTable = options?.remotesTable ?? "effect_event_remotes"
61
+ const remoteCursorsTable = options?.remoteCursorsTable ?? `${remotesTable}_cursors`
62
+
63
+ const sequenceTable = `${entryTable}_sequence`
64
+ const sourcesTable = `${entryTable}_sources`
65
+ const checkpointsTable = `${remotesTable}_checkpoints`
51
66
 
52
67
  const entryTableSql = sql(entryTable)
53
68
  const remotesTableSql = sql(remotesTable)
69
+ const sequenceTableSql = sql(sequenceTable)
70
+ const sourcesTableSql = sql(sourcesTable)
71
+ const checkpointsTableSql = sql(checkpointsTable)
72
+ const remoteCursorsTableSql = sql(remoteCursorsTable)
54
73
 
55
- yield* sql.onDialectOrElse({
56
- pg: () =>
57
- sql`
58
- CREATE TABLE IF NOT EXISTS ${entryTableSql} (
59
- id BYTEA PRIMARY KEY,
60
- event TEXT NOT NULL,
61
- primary_key TEXT NOT NULL,
62
- payload BYTEA NOT NULL,
63
- timestamp BIGINT NOT NULL
64
- )`,
65
- mysql: () =>
66
- sql`
67
- CREATE TABLE IF NOT EXISTS ${entryTableSql} (
68
- id BINARY(16) PRIMARY KEY,
69
- event TEXT NOT NULL,
70
- primary_key TEXT NOT NULL,
71
- payload BLOB NOT NULL,
72
- timestamp BIGINT NOT NULL
73
- )`,
74
- mssql: () =>
75
- sql`
76
- CREATE TABLE IF NOT EXISTS ${entryTableSql} (
77
- id UNIQUEIDENTIFIER PRIMARY KEY,
78
- event NVARCHAR(MAX) NOT NULL,
79
- primary_key NVARCHAR(MAX) NOT NULL,
80
- payload VARBINARY(MAX) NOT NULL,
81
- timestamp BIGINT NOT NULL
82
- )`,
83
- orElse: () =>
84
- sql`
85
- CREATE TABLE IF NOT EXISTS ${entryTableSql} (
86
- id BLOB PRIMARY KEY,
87
- event TEXT NOT NULL,
88
- primary_key TEXT NOT NULL,
89
- payload BLOB NOT NULL,
90
- timestamp INTEGER NOT NULL
91
- )`
92
- }).pipe(withTracerDisabled)
74
+ // to_regclass folds unquoted names to lowercase, so pass the quoted identifier.
75
+ const quoted = (table: string) => sql`${sql(table)}`.compile(true)[0]
76
+
77
+ const tableExists = (table: string) =>
78
+ sql.onDialectOrElse({
79
+ // Reading the catalog refreshes cached names after concurrent DDL.
80
+ pg: () => sql`SELECT 1 AS found FROM pg_class WHERE oid = to_regclass(${quoted(table)})`,
81
+ mysql: () =>
82
+ sql`SELECT 1 AS found FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = ${table}`,
83
+ mssql: () => sql`SELECT 1 AS found WHERE OBJECT_ID(${table}, 'U') IS NOT NULL`,
84
+ orElse: () => sql`SELECT 1 AS found FROM sqlite_master WHERE type = 'table' AND name = ${table}`
85
+ }).pipe(Effect.map((rows) => rows.length > 0))
86
+
87
+ const createSchema = Effect.gen(function*() {
88
+ const eventIndex = sql(`${entryTable}_event_idx`)
89
+ const timestampIndex = sql(`${entryTable}_timestamp_idx`)
90
+
91
+ yield* sql.onDialectOrElse({
92
+ pg: () =>
93
+ sql`
94
+ CREATE TABLE IF NOT EXISTS ${entryTableSql} (
95
+ id BYTEA PRIMARY KEY,
96
+ event TEXT NOT NULL,
97
+ primary_key TEXT NOT NULL,
98
+ payload BYTEA NOT NULL,
99
+ timestamp BIGINT NOT NULL
100
+ )`,
101
+ mysql: () =>
102
+ sql`
103
+ CREATE TABLE IF NOT EXISTS ${entryTableSql} (
104
+ id BINARY(16) PRIMARY KEY,
105
+ event TEXT NOT NULL,
106
+ primary_key TEXT NOT NULL,
107
+ payload BLOB NOT NULL,
108
+ timestamp BIGINT NOT NULL
109
+ )`,
110
+ mssql: () =>
111
+ sql`
112
+ CREATE TABLE IF NOT EXISTS ${entryTableSql} (
113
+ id UNIQUEIDENTIFIER PRIMARY KEY,
114
+ event NVARCHAR(MAX) NOT NULL,
115
+ primary_key NVARCHAR(MAX) NOT NULL,
116
+ payload VARBINARY(MAX) NOT NULL,
117
+ timestamp BIGINT NOT NULL
118
+ )`,
119
+ orElse: () =>
120
+ sql`
121
+ CREATE TABLE IF NOT EXISTS ${entryTableSql} (
122
+ id BLOB PRIMARY KEY,
123
+ event TEXT NOT NULL,
124
+ primary_key TEXT NOT NULL,
125
+ payload BLOB NOT NULL,
126
+ timestamp INTEGER NOT NULL
127
+ )`
128
+ })
129
+
130
+ // Insertion sequences let uploads include older entries imported later.
131
+ yield* sql.onDialectOrElse({
132
+ pg: () =>
133
+ sql`
134
+ CREATE TABLE IF NOT EXISTS ${sequenceTableSql} (
135
+ sequence BIGSERIAL PRIMARY KEY,
136
+ entry_id BYTEA NOT NULL UNIQUE
137
+ )`,
138
+ mysql: () =>
139
+ sql`
140
+ CREATE TABLE IF NOT EXISTS ${sequenceTableSql} (
141
+ sequence BIGINT AUTO_INCREMENT PRIMARY KEY,
142
+ entry_id BINARY(16) NOT NULL UNIQUE
143
+ )`,
144
+ mssql: () =>
145
+ sql`
146
+ CREATE TABLE ${sequenceTableSql} (
147
+ sequence BIGINT IDENTITY(1,1) PRIMARY KEY,
148
+ entry_id UNIQUEIDENTIFIER NOT NULL UNIQUE
149
+ )`,
150
+ orElse: () =>
151
+ sql`
152
+ CREATE TABLE IF NOT EXISTS ${sequenceTableSql} (
153
+ sequence INTEGER PRIMARY KEY,
154
+ entry_id BLOB NOT NULL UNIQUE
155
+ )`
156
+ })
157
+
158
+ yield* sql.onDialectOrElse({
159
+ pg: () =>
160
+ sql`
161
+ CREATE TABLE IF NOT EXISTS ${checkpointsTableSql} (
162
+ remote_id BYTEA PRIMARY KEY,
163
+ sequence BIGINT NOT NULL
164
+ )`,
165
+ mysql: () =>
166
+ sql`
167
+ CREATE TABLE IF NOT EXISTS ${checkpointsTableSql} (
168
+ remote_id BINARY(16) PRIMARY KEY,
169
+ sequence BIGINT NOT NULL
170
+ )`,
171
+ mssql: () =>
172
+ sql`
173
+ CREATE TABLE ${checkpointsTableSql} (
174
+ remote_id UNIQUEIDENTIFIER PRIMARY KEY,
175
+ sequence BIGINT NOT NULL
176
+ )`,
177
+ orElse: () =>
178
+ sql`
179
+ CREATE TABLE IF NOT EXISTS ${checkpointsTableSql} (
180
+ remote_id BLOB PRIMARY KEY,
181
+ sequence INTEGER NOT NULL
182
+ )`
183
+ })
184
+
185
+ yield* sql.onDialectOrElse({
186
+ pg: () =>
187
+ sql`
188
+ CREATE TABLE IF NOT EXISTS ${remoteCursorsTableSql} (
189
+ remote_id BYTEA PRIMARY KEY,
190
+ next_sequence INT NOT NULL
191
+ )`,
192
+ mysql: () =>
193
+ sql`
194
+ CREATE TABLE IF NOT EXISTS ${remoteCursorsTableSql} (
195
+ remote_id BINARY(16) PRIMARY KEY,
196
+ next_sequence INT NOT NULL
197
+ )`,
198
+ mssql: () =>
199
+ sql`
200
+ CREATE TABLE ${remoteCursorsTableSql} (
201
+ remote_id UNIQUEIDENTIFIER PRIMARY KEY,
202
+ next_sequence INT NOT NULL
203
+ )`,
204
+ orElse: () =>
205
+ sql`
206
+ CREATE TABLE IF NOT EXISTS ${remoteCursorsTableSql} (
207
+ remote_id BLOB PRIMARY KEY,
208
+ next_sequence INT NOT NULL
209
+ )`
210
+ })
211
+
212
+ // The remote each imported entry came from, so uploads skip it.
213
+ yield* sql.onDialectOrElse({
214
+ pg: () =>
215
+ sql`
216
+ CREATE TABLE IF NOT EXISTS ${sourcesTableSql} (
217
+ entry_id BYTEA PRIMARY KEY,
218
+ remote_id BYTEA NOT NULL
219
+ )`,
220
+ mysql: () =>
221
+ sql`
222
+ CREATE TABLE IF NOT EXISTS ${sourcesTableSql} (
223
+ entry_id BINARY(16) PRIMARY KEY,
224
+ remote_id BINARY(16) NOT NULL
225
+ )`,
226
+ mssql: () =>
227
+ sql`
228
+ CREATE TABLE ${sourcesTableSql} (
229
+ entry_id UNIQUEIDENTIFIER PRIMARY KEY,
230
+ remote_id UNIQUEIDENTIFIER NOT NULL
231
+ )`,
232
+ orElse: () =>
233
+ sql`
234
+ CREATE TABLE IF NOT EXISTS ${sourcesTableSql} (
235
+ entry_id BLOB PRIMARY KEY,
236
+ remote_id BLOB NOT NULL
237
+ )`
238
+ })
239
+
240
+ yield* sql.onDialectOrElse({
241
+ // MySQL indexes TEXT columns by prefix only.
242
+ mysql: () =>
243
+ Effect.andThen(
244
+ sql`CREATE INDEX ${eventIndex} ON ${entryTableSql} (event(191), primary_key(191), timestamp)`,
245
+ sql`CREATE INDEX ${timestampIndex} ON ${entryTableSql} (timestamp)`
246
+ ),
247
+ // B-tree entries are limited to about 2.7 KB, so index hashes of the
248
+ // unbounded columns.
249
+ pg: () =>
250
+ Effect.andThen(
251
+ sql`CREATE INDEX IF NOT EXISTS ${eventIndex} ON ${entryTableSql} (md5(event), md5(primary_key), timestamp)`,
252
+ sql`CREATE INDEX IF NOT EXISTS ${timestampIndex} ON ${entryTableSql} (timestamp)`
253
+ ),
254
+ // NVARCHAR(MAX) columns cannot be index keys.
255
+ mssql: () => sql`CREATE INDEX ${timestampIndex} ON ${entryTableSql} (timestamp)`,
256
+ orElse: () =>
257
+ Effect.andThen(
258
+ sql`CREATE INDEX IF NOT EXISTS ${eventIndex} ON ${entryTableSql} (event, primary_key, timestamp)`,
259
+ sql`CREATE INDEX IF NOT EXISTS ${timestampIndex} ON ${entryTableSql} (timestamp)`
260
+ )
261
+ })
262
+
263
+ // Number existing entries in creation order. `WHERE true` keeps SQLite
264
+ // from parsing ON CONFLICT as a join constraint.
265
+ yield* sql`
266
+ INSERT INTO ${sequenceTableSql} (entry_id)
267
+ SELECT id FROM ${entryTableSql} WHERE true ORDER BY timestamp ASC, id ASC
268
+ ON CONFLICT DO NOTHING
269
+ `
270
+ })
271
+
272
+ // Earlier releases kept a remotes row per entry per remote. An entry known
273
+ // to several remotes keeps one of them as its source, and a remote without
274
+ // a cursor resumes after its highest downloaded sequence.
275
+ const importRemotes = Effect.gen(function*() {
276
+ yield* sql`
277
+ INSERT INTO ${sourcesTableSql} (entry_id, remote_id)
278
+ SELECT entry_id, remote_id FROM ${remotesTableSql} WHERE true
279
+ ON CONFLICT DO NOTHING
280
+ `
281
+ yield* sql`
282
+ INSERT INTO ${remoteCursorsTableSql} (remote_id, next_sequence)
283
+ SELECT remote_id, MAX(sequence) + 1 FROM ${remotesTableSql} GROUP BY remote_id
284
+ ON CONFLICT DO NOTHING
285
+ `
286
+ yield* sql`DROP TABLE ${remotesTableSql}`
287
+ })
93
288
 
94
- yield* sql.onDialectOrElse({
95
- pg: () =>
96
- sql`
97
- CREATE TABLE IF NOT EXISTS ${remotesTableSql} (
98
- remote_id BYTEA NOT NULL,
99
- entry_id BYTEA NOT NULL,
100
- sequence INT NOT NULL,
101
- PRIMARY KEY (remote_id, entry_id)
102
- )`,
103
- mysql: () =>
104
- sql`
105
- CREATE TABLE IF NOT EXISTS ${remotesTableSql} (
106
- remote_id BINARY(16) NOT NULL,
107
- entry_id BINARY(16) NOT NULL,
108
- sequence INT NOT NULL,
109
- PRIMARY KEY (remote_id, entry_id)
110
- )`,
111
- mssql: () =>
112
- sql`
113
- CREATE TABLE IF NOT EXISTS ${remotesTableSql} (
114
- remote_id UNIQUEIDENTIFIER NOT NULL,
115
- entry_id UNIQUEIDENTIFIER NOT NULL,
116
- sequence INT NOT NULL,
117
- PRIMARY KEY (remote_id, entry_id)
118
- )`,
119
- orElse: () =>
120
- sql`
121
- CREATE TABLE IF NOT EXISTS ${remotesTableSql} (
122
- remote_id BLOB NOT NULL,
123
- entry_id BLOB NOT NULL,
124
- sequence INT NOT NULL,
125
- PRIMARY KEY (remote_id, entry_id)
126
- )`
289
+ // Both steps run in one transaction, so a complete schema has the sources
290
+ // table and no remotes table. Checking that first lets complete databases
291
+ // open read-only; PostgreSQL also locks and rechecks so concurrent opens
292
+ // migrate once.
293
+ const schemaState = Effect.all({ sources: tableExists(sourcesTable), remotes: tableExists(remotesTable) })
294
+ const isComplete = (state: { readonly sources: boolean; readonly remotes: boolean }) =>
295
+ state.sources && !state.remotes
296
+ yield* Effect.gen(function*() {
297
+ if (isComplete(yield* schemaState)) return
298
+ yield* Effect.gen(function*() {
299
+ yield* sql.onDialectOrElse({
300
+ pg: () => sql`SELECT pg_advisory_xact_lock(hashtext(${quoted(entryTable)}))`,
301
+ orElse: () => Effect.void
302
+ })
303
+ const state = yield* schemaState
304
+ if (!state.sources) yield* createSchema
305
+ if (state.remotes) yield* importRemotes
306
+ }).pipe(sql.withTransaction)
127
307
  }).pipe(withTracerDisabled)
128
308
 
129
309
  const decodeEntryRows = Schema.decodeUnknownEffect(EntryRowArray)
130
310
  const decodeEntryIdRows = Schema.decodeUnknownEffect(EntryIdRowArray)
131
311
  const toEntries = (rows: ReadonlyArray<EntryRow>): ReadonlyArray<EventJournal.Entry> => rows.map(toEntry)
312
+ // Sort timestamp ties by id bytes consistently across dialects.
313
+ const toOrderedEntries = (rows: ReadonlyArray<EntryRow>): ReadonlyArray<EventJournal.Entry> =>
314
+ rows.map(toEntry).sort(EventJournal.Entry.Order)
132
315
 
133
- const insertEntry = SqlSchema.void({
134
- Request: EntryRow,
135
- execute: (entry) => sql`INSERT INTO ${entryTableSql} ${sql.insert(entry)} ON CONFLICT DO NOTHING`
136
- })
137
316
  const insertEntries = SqlSchema.void({
138
317
  Request: EntryRowArray,
139
318
  execute: (entries) => sql`INSERT INTO ${entryTableSql} ${sql.insert(entries)} ON CONFLICT DO NOTHING`
140
319
  })
141
- const insertRemotes = SqlSchema.void({
142
- Request: RemoteRowArray,
143
- execute: (entries) => sql`INSERT INTO ${remotesTableSql} ${sql.insert(entries)} ON CONFLICT DO NOTHING`
320
+ const insertSources = (entries: ReadonlyArray<EventJournal.Entry>, remoteId: EventJournal.RemoteId) =>
321
+ sql`INSERT INTO ${sourcesTableSql} ${
322
+ sql.insert(entries.map((entry) => ({ entry_id: entry.id, remote_id: remoteId })))
323
+ } ON CONFLICT DO NOTHING`
324
+ // Serialize writers so checkpoints cannot skip out-of-order commits.
325
+ // Lock before callbacks in both paths to avoid projection-row deadlocks.
326
+ const lockWriters = sql.onDialectOrElse({
327
+ pg: () => Effect.asVoid(sql`LOCK TABLE ${sequenceTableSql} IN SHARE ROW EXCLUSIVE MODE`),
328
+ orElse: () => Effect.void
144
329
  })
330
+ const insertSequence = (entries: ReadonlyArray<EventJournal.Entry>) =>
331
+ sql`INSERT INTO ${sequenceTableSql} ${
332
+ sql.insert(entries.map((entry) => ({ entry_id: entry.id })))
333
+ } ON CONFLICT DO NOTHING`
334
+
335
+ const decodeCursorRows = Schema.decodeUnknownEffect(CursorRowArray)
336
+
337
+ const readCursor = (remoteId: EventJournal.RemoteId) =>
338
+ sql`SELECT next_sequence FROM ${remoteCursorsTableSql} WHERE remote_id = ${remoteId}`.pipe(
339
+ Effect.flatMap(decodeCursorRows),
340
+ Effect.map((rows) => rows.length > 0 ? rows[0].next_sequence : 0)
341
+ )
342
+
343
+ // Cursors only move forward.
344
+ const writeCursor = (remoteId: EventJournal.RemoteId, next: number) =>
345
+ sql`
346
+ INSERT INTO ${remoteCursorsTableSql} ${sql.insert({ remote_id: remoteId, next_sequence: next })}
347
+ ON CONFLICT (remote_id) DO UPDATE SET next_sequence = excluded.next_sequence
348
+ WHERE ${remoteCursorsTableSql}.next_sequence < excluded.next_sequence
349
+ `
145
350
 
146
351
  const pubsub = yield* PubSub.unbounded<EventJournal.Entry>()
352
+ const clock = yield* Clock.Clock
147
353
 
148
354
  const writeFromRemote = Effect.fnUntraced(function*(options: WriteFromRemoteOptions): Effect.fn.Return<
149
355
  {
@@ -152,11 +358,8 @@ export const make = (options?: {
152
358
  EventJournal.EventJournalError | Schema.SchemaError | SqlError.SqlError
153
359
  > {
154
360
  const entries = options.entries.map((remoteEntry) => remoteEntry.entry)
155
- const remoteRows = options.entries.map((remoteEntry) => ({
156
- remote_id: options.remoteId,
157
- entry_id: remoteEntry.entry.id,
158
- sequence: remoteEntry.remoteSequence
159
- }))
361
+
362
+ yield* lockWriters
160
363
 
161
364
  const existingIds = new Set<string>()
162
365
  if (entries.length > 0) {
@@ -176,14 +379,14 @@ export const make = (options?: {
176
379
  )
177
380
  )
178
381
  }
179
- if (entries.length > 0) {
180
- yield* insertEntries(entries.map(toEntryRow))
181
- }
182
- if (remoteRows.length > 0) {
183
- yield* insertRemotes(remoteRows)
184
- }
185
-
186
- const uncommitted = options.entries.filter((entry) => !existingIds.has(entry.entry.idString))
382
+ // Overlapping batches can repeat an entry; the first copy wins.
383
+ const incomingIds = new Set<string>()
384
+ const uncommitted = options.entries.filter((entry) => {
385
+ const idString = entry.entry.idString
386
+ if (existingIds.has(idString) || incomingIds.has(idString)) return false
387
+ incomingIds.add(idString)
388
+ return true
389
+ })
187
390
  const duplicateEntries = options.entries
188
391
  .filter((entry) => existingIds.has(entry.entry.idString))
189
392
  .map((entry) => entry.entry)
@@ -191,56 +394,111 @@ export const make = (options?: {
191
394
  ? yield* options.compact(uncommitted)
192
395
  : uncommitted.map((remoteEntry) => remoteEntry.entry)
193
396
 
194
- for (const entry of compacted) {
195
- const conflicts = yield* sql`
196
- SELECT *
197
- FROM ${entryTableSql}
198
- WHERE event = ${entry.event} AND
199
- primary_key = ${entry.primaryKey} AND
200
- timestamp >= ${entry.createdAtMillis}
201
- ORDER BY timestamp ASC
202
- `.pipe(
397
+ if (Arr.isReadonlyArrayNonEmpty(compacted)) {
398
+ const index = new ConflictIndex(compacted)
399
+ const primaryKeys = Array.from(new Set(compacted.map((entry) => entry.primaryKey)))
400
+ // Match the hash index; exact predicates below rule out hash collisions.
401
+ const hashed = sql.onDialectOrElse({
402
+ pg: () => [
403
+ sql`md5(event) IN (${sql.csv(index.events.map((event) => sql`md5(${event})`))})`,
404
+ sql`md5(primary_key) IN (${sql.csv(primaryKeys.map((primaryKey) => sql`md5(${primaryKey})`))})`
405
+ ],
406
+ orElse: () => []
407
+ })
408
+ const conflicts = sql.and([
409
+ ...hashed,
410
+ sql.in("event", index.events),
411
+ sql.in("primary_key", primaryKeys),
412
+ // A coarse filter: the index compares ids exactly.
413
+ sql`timestamp >= ${index.oldestMillis}`
414
+ ])
415
+ const stored = yield* sql`SELECT * FROM ${entryTableSql} WHERE ${conflicts}`.pipe(
203
416
  Effect.flatMap(decodeEntryRows),
204
417
  Effect.map(toEntries)
205
418
  )
206
- yield* options.effect({ entry, conflicts })
419
+ for (const entry of stored) {
420
+ index.add(entry)
421
+ }
422
+ yield* options.effect(index.toBatch())
423
+ }
424
+
425
+ // Keep the incoming batch out of conflict queries and persist only after
426
+ // compaction and every callback have succeeded.
427
+ if (uncommitted.length > 0) {
428
+ const imported = uncommitted.map((remoteEntry) => remoteEntry.entry)
429
+ yield* insertEntries(imported.map(toEntryRow))
430
+ yield* insertSequence(imported)
431
+ yield* insertSources(imported, options.remoteId)
432
+ }
433
+ // The change stream is ordered, so every earlier sequence is now known.
434
+ if (options.entries.length > 0) {
435
+ yield* writeCursor(options.remoteId, EventJournal.nextSequenceAfter(options.entries))
207
436
  }
437
+ yield* EventJournal.warnIfAhead(clock, uncommitted.map((remoteEntry) => remoteEntry.entry.id))
208
438
 
209
439
  return {
210
440
  duplicateEntries
211
441
  }
212
442
  })
213
443
 
444
+ // Other processes share the database but not the entry id sequence. Ids in
445
+ // the latest millisecond are few, and comparing them here avoids ordering
446
+ // id bytes in SQL.
447
+ const latestEntryIds = sql`
448
+ SELECT id FROM ${entryTableSql} WHERE timestamp = (SELECT MAX(timestamp) FROM ${entryTableSql})
449
+ `.pipe(
450
+ Effect.flatMap(decodeEntryIdRows),
451
+ Effect.map((rows) => rows.map((row) => row.id))
452
+ )
453
+
454
+ const writeMany: EventJournal.EventJournal["Service"]["writeMany"] = ({ effect, entries }) =>
455
+ Effect.uninterruptibleMask((restore) =>
456
+ Effect.gen(function*() {
457
+ yield* lockWriters
458
+ // Rows visible here include an enclosing transaction's uncommitted
459
+ // ones, which local ids must also sort after.
460
+ const committed = yield* EventJournal.makeEntries(entries, yield* latestEntryIds)
461
+ const result = yield* restore(effect(committed)).pipe(
462
+ Effect.mapError((error) => new CallbackFailure(error))
463
+ )
464
+ yield* insertEntries(committed.map(toEntryRow))
465
+ yield* insertSequence(committed)
466
+ return { result, committed }
467
+ }).pipe(
468
+ sql.withTransaction,
469
+ Effect.mapError((error) =>
470
+ error instanceof CallbackFailure
471
+ ? error.error
472
+ : error instanceof EventJournal.EventJournalError
473
+ ? error
474
+ : new EventJournal.EventJournalError({ cause: error, method: "writeMany" })
475
+ ),
476
+ Effect.flatMap(({ committed, result }) => Effect.as(PubSub.publishAll(pubsub, committed), result))
477
+ )
478
+ ).pipe(withTracerDisabled)
479
+
214
480
  return EventJournal.EventJournal.of({
215
481
  entries: sql`SELECT * FROM ${entryTableSql} ORDER BY timestamp ASC`.pipe(
216
482
  withTracerDisabled,
217
483
  Effect.flatMap(decodeEntryRows),
218
- Effect.map(toEntries),
484
+ Effect.map(toOrderedEntries),
219
485
  Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "entries" }))
220
486
  ),
221
- write: Effect.fnUntraced(
222
- function*({ effect, event, payload, primaryKey }) {
223
- const entry = new EventJournal.Entry({
224
- id: EventJournal.makeEntryIdUnsafe(),
225
- event,
226
- primaryKey,
227
- payload
228
- }, { disableChecks: true })
229
- return yield* Effect.uninterruptibleMask((restore) =>
230
- restore(effect(entry)).pipe(
231
- Effect.tap(
232
- insertEntry(toEntryRow(entry)).pipe(
233
- Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "write" }))
234
- )
235
- ),
236
- Effect.tap(PubSub.publish(pubsub, entry))
237
- )
238
- )
239
- },
240
- withTracerDisabled
241
- ),
487
+ entriesById: (ids) =>
488
+ ids.length === 0 ? Effect.succeed([]) : sql`SELECT * FROM ${entryTableSql} WHERE ${sql.in("id", ids)}`.pipe(
489
+ withTracerDisabled,
490
+ Effect.flatMap(decodeEntryRows),
491
+ Effect.map((rows) => {
492
+ const byId = new Map(toEntries(rows).map((entry) => [entry.idString, entry]))
493
+ return ids.map((id) => byId.get(Uuid.stringify(id)))
494
+ }),
495
+ Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "entriesById" }))
496
+ ),
497
+ write: ({ effect, ...entry }) => writeMany({ entries: [entry], effect: (entries) => effect(entries[0]) }),
498
+ writeMany,
242
499
  writeFromRemote: (options) =>
243
500
  writeFromRemote(options).pipe(
501
+ sql.withTransaction,
244
502
  withTracerDisabled,
245
503
  Effect.catchIf(
246
504
  (e) => e._tag !== "EventJournalError",
@@ -249,36 +507,66 @@ export const make = (options?: {
249
507
  ),
250
508
  withRemoteUncommited: Effect.fnUntraced(
251
509
  function*(remoteId, f) {
510
+ const mapError = Effect.mapError((cause: unknown) =>
511
+ new EventJournal.EventJournalError({ cause, method: "withRemoteUncommited" })
512
+ )
513
+ // Capture an upper bound so entries committed during upload remain pending.
514
+ const [{ checkpoint, latest }] = yield* sql`
515
+ SELECT
516
+ COALESCE((SELECT sequence FROM ${checkpointsTableSql} WHERE remote_id = ${remoteId}), 0) AS checkpoint,
517
+ COALESCE((SELECT MAX(sequence) FROM ${sequenceTableSql}), 0) AS latest
518
+ `.pipe(Effect.flatMap(decodeUploadBounds), mapError)
519
+ if (latest <= checkpoint) return yield* Effect.succeedNone
252
520
  const entries = yield* sql`
253
- SELECT *
254
- FROM ${entryTableSql}
255
- WHERE id NOT IN (SELECT entry_id FROM ${remotesTableSql} WHERE remote_id = ${remoteId})
256
- ORDER BY timestamp ASC
521
+ SELECT e.*
522
+ FROM ${sequenceTableSql} s
523
+ JOIN ${entryTableSql} e ON e.id = s.entry_id
524
+ WHERE s.sequence > ${checkpoint} AND
525
+ s.sequence <= ${latest} AND
526
+ NOT EXISTS (
527
+ SELECT 1 FROM ${sourcesTableSql} src WHERE src.entry_id = s.entry_id AND src.remote_id = ${remoteId}
528
+ )
257
529
  `.pipe(
258
530
  Effect.flatMap(decodeEntryRows),
259
- Effect.map(toEntries),
260
- Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "withRemoteUncommited" }))
531
+ Effect.map(toOrderedEntries),
532
+ mapError
533
+ )
534
+ // Uploads can complete out of order; the checkpoint only moves forward.
535
+ const saveCheckpoint = sql`
536
+ INSERT INTO ${checkpointsTableSql} ${sql.insert({ remote_id: remoteId, sequence: latest })}
537
+ ON CONFLICT (remote_id) DO UPDATE SET sequence = excluded.sequence
538
+ WHERE ${checkpointsTableSql}.sequence < excluded.sequence
539
+ `.pipe(mapError)
540
+ return yield* Effect.uninterruptibleMask((restore) =>
541
+ restore(Arr.isReadonlyArrayNonEmpty(entries) ? Effect.asSome(f(entries)) : Effect.succeedNone).pipe(
542
+ Effect.tap(saveCheckpoint)
543
+ )
261
544
  )
262
- if (!Arr.isReadonlyArrayNonEmpty(entries)) return yield* Effect.succeedNone
263
- return yield* Effect.asSome(f(entries))
264
545
  },
265
546
  withTracerDisabled
266
547
  ),
548
+ writeRemoteAcks: Effect.fnUntraced(
549
+ function*({ acks, firstSequence, remoteId }) {
550
+ if (acks.length === 0) return
551
+ const next = yield* readCursor(remoteId)
552
+ yield* writeCursor(remoteId, EventJournal.advanceSequence(next, acks, firstSequence))
553
+ },
554
+ (_) => sql.withTransaction(_),
555
+ (_) => withTracerDisabled(_),
556
+ Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "writeRemoteAcks" }))
557
+ ),
267
558
  nextRemoteSequence: (remoteId) =>
268
- sql<{ max: number | null }>`SELECT MAX(sequence) AS max FROM ${remotesTableSql} WHERE remote_id = ${remoteId}`
269
- .pipe(
270
- Effect.map((rows) => {
271
- const value = rows[0]?.max
272
- if (value === null || value === undefined) return 0
273
- return Number(value) + 1
274
- }),
275
- withTracerDisabled,
276
- Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "nextRemoteSequence" }))
277
- ),
559
+ readCursor(remoteId).pipe(
560
+ withTracerDisabled,
561
+ Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "nextRemoteSequence" }))
562
+ ),
278
563
  changes: PubSub.subscribe(pubsub),
279
564
  destroy: Effect.gen(function*() {
280
565
  yield* sql`DROP TABLE ${entryTableSql}`
281
- yield* sql`DROP TABLE ${remotesTableSql}`
566
+ yield* sql`DROP TABLE ${sequenceTableSql}`
567
+ yield* sql`DROP TABLE ${sourcesTableSql}`
568
+ yield* sql`DROP TABLE ${checkpointsTableSql}`
569
+ yield* sql`DROP TABLE ${remoteCursorsTableSql}`
282
570
  }).pipe(
283
571
  withTracerDisabled,
284
572
  Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "destroy" }))
@@ -293,25 +581,11 @@ export const make = (options?: {
293
581
  })
294
582
 
295
583
  /**
296
- * Provides `EventJournal` using the SQL-backed implementation created by
297
- * `make`.
298
- *
299
- * **When to use**
300
- *
301
- * Use when composing a Layer graph that should provide a persistent SQL-backed
302
- * `EventJournal` from an existing `SqlClient` service.
303
- *
304
- * **Details**
305
- *
306
- * The layer delegates to `make(options)`, so the same optional `entryTable` and
307
- * `remotesTable` settings are used and construction requires `SqlClient` and
308
- * may fail with `SqlError`.
584
+ * Provides a SQL-backed `EventJournal` from an existing `SqlClient` service.
309
585
  *
310
586
  * **Gotchas**
311
587
  *
312
- * Layer construction performs the same minimal `CREATE TABLE IF NOT EXISTS`
313
- * setup as `make`; manage indexes and schema migrations outside this layer when
314
- * your SQL schema needs more than the built-in tables.
588
+ * Creating or migrating the schema requires a writable connection.
315
589
  *
316
590
  * @see {@link make} for constructing the SQL-backed service directly
317
591
  * @see {@link EventJournal.layerMemory} for an in-memory `EventJournal` layer
@@ -324,6 +598,7 @@ export const make = (options?: {
324
598
  export const layer = (options?: {
325
599
  readonly entryTable?: string
326
600
  readonly remotesTable?: string
601
+ readonly remoteCursorsTable?: string
327
602
  }): Layer.Layer<EventJournal.EventJournal, SqlError.SqlError, SqlClient.SqlClient> =>
328
603
  Layer.effect(EventJournal.EventJournal)(make(options))
329
604
 
@@ -366,6 +641,9 @@ const EntryRow = Schema.Struct({
366
641
  })
367
642
 
368
643
  const EntryRowArray = Schema.Array(EntryRow)
644
+ const decodeUploadBounds = Schema.decodeUnknownEffect(Schema.Tuple([
645
+ Schema.Struct({ checkpoint: SqlNatural, latest: SqlNatural })
646
+ ]))
369
647
  const EntryIdRowArray = Schema.Array(Schema.Struct({ id: SqlEntryId }))
370
648
 
371
649
  type EntryRow = Schema.Schema.Type<typeof EntryRow>
@@ -386,12 +664,14 @@ const toEntryRow = (entry: EventJournal.Entry): EntryRow => ({
386
664
  timestamp: EventJournal.entryIdMillis(entry.id)
387
665
  })
388
666
 
389
- const RemoteRow = Schema.Struct({
390
- remote_id: EventJournal.RemoteId,
391
- entry_id: EventJournal.EntryId,
392
- sequence: Schema.Natural
393
- })
394
-
395
- const RemoteRowArray = Schema.Array(RemoteRow)
667
+ const CursorRowArray = Schema.Array(Schema.Struct({ next_sequence: SqlNatural }))
396
668
 
397
669
  const withTracerDisabled = Effect.withTracerEnabled(false)
670
+
671
+ // Preserve callback errors without wrapping them as journal SQL errors.
672
+ class CallbackFailure<E> {
673
+ readonly error: E
674
+ constructor(error: E) {
675
+ this.error = error
676
+ }
677
+ }