effect 4.0.5 → 4.0.7

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 (1177) 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/tsconfig.json +3 -1
  4. package/dist/Arbitrary.d.ts +10 -2
  5. package/dist/Arbitrary.d.ts.map +1 -1
  6. package/dist/Arbitrary.js +2 -1
  7. package/dist/Arbitrary.js.map +1 -1
  8. package/dist/Array.d.ts +117 -52
  9. package/dist/Array.d.ts.map +1 -1
  10. package/dist/Array.js +41 -20
  11. package/dist/Array.js.map +1 -1
  12. package/dist/Bytes.d.ts +79 -0
  13. package/dist/Bytes.d.ts.map +1 -0
  14. package/dist/Bytes.js +109 -0
  15. package/dist/Bytes.js.map +1 -0
  16. package/dist/Channel.d.ts +181 -13
  17. package/dist/Channel.d.ts.map +1 -1
  18. package/dist/Channel.js +144 -34
  19. package/dist/Channel.js.map +1 -1
  20. package/dist/ChannelSchema.d.ts.map +1 -1
  21. package/dist/ChannelSchema.js.map +1 -1
  22. package/dist/Chunk.d.ts +39 -21
  23. package/dist/Chunk.d.ts.map +1 -1
  24. package/dist/Chunk.js +26 -17
  25. package/dist/Chunk.js.map +1 -1
  26. package/dist/Config.d.ts.map +1 -1
  27. package/dist/Config.js +8 -3
  28. package/dist/Config.js.map +1 -1
  29. package/dist/ConfigProvider.d.ts.map +1 -1
  30. package/dist/ConfigProvider.js +2 -1
  31. package/dist/ConfigProvider.js.map +1 -1
  32. package/dist/Cron.d.ts +2 -2
  33. package/dist/Cron.d.ts.map +1 -1
  34. package/dist/Cron.js +6 -3
  35. package/dist/Cron.js.map +1 -1
  36. package/dist/Data.d.ts +54 -235
  37. package/dist/Data.d.ts.map +1 -1
  38. package/dist/Data.js.map +1 -1
  39. package/dist/Duration.d.ts.map +1 -1
  40. package/dist/Duration.js +56 -16
  41. package/dist/Duration.js.map +1 -1
  42. package/dist/Effect.d.ts +488 -164
  43. package/dist/Effect.d.ts.map +1 -1
  44. package/dist/Effect.js +204 -38
  45. package/dist/Effect.js.map +1 -1
  46. package/dist/Equal.d.ts.map +1 -1
  47. package/dist/Equal.js +8 -1
  48. package/dist/Equal.js.map +1 -1
  49. package/dist/Equivalence.d.ts +2 -1
  50. package/dist/Equivalence.d.ts.map +1 -1
  51. package/dist/Equivalence.js +12 -8
  52. package/dist/Equivalence.js.map +1 -1
  53. package/dist/Exit.d.ts +27 -12
  54. package/dist/Exit.d.ts.map +1 -1
  55. package/dist/Exit.js +8 -3
  56. package/dist/Exit.js.map +1 -1
  57. package/dist/FiberHandle.d.ts +2 -0
  58. package/dist/FiberHandle.d.ts.map +1 -1
  59. package/dist/FiberHandle.js +9 -4
  60. package/dist/FiberHandle.js.map +1 -1
  61. package/dist/FiberMap.d.ts +2 -0
  62. package/dist/FiberMap.d.ts.map +1 -1
  63. package/dist/FiberMap.js +5 -2
  64. package/dist/FiberMap.js.map +1 -1
  65. package/dist/FileSystem.d.ts +5 -0
  66. package/dist/FileSystem.d.ts.map +1 -1
  67. package/dist/FileSystem.js +3 -0
  68. package/dist/FileSystem.js.map +1 -1
  69. package/dist/Formatter.d.ts.map +1 -1
  70. package/dist/Formatter.js +27 -13
  71. package/dist/Formatter.js.map +1 -1
  72. package/dist/Graph.d.ts.map +1 -1
  73. package/dist/Graph.js.map +1 -1
  74. package/dist/Hash.d.ts.map +1 -1
  75. package/dist/Hash.js +4 -1
  76. package/dist/Hash.js.map +1 -1
  77. package/dist/HashSet.d.ts.map +1 -1
  78. package/dist/HashSet.js.map +1 -1
  79. package/dist/Iterable.d.ts.map +1 -1
  80. package/dist/Iterable.js +18 -17
  81. package/dist/Iterable.js.map +1 -1
  82. package/dist/JsonPatch.js +4 -0
  83. package/dist/JsonPatch.js.map +1 -1
  84. package/dist/JsonSchema.d.ts +9 -3
  85. package/dist/JsonSchema.d.ts.map +1 -1
  86. package/dist/JsonSchema.js +32 -43
  87. package/dist/JsonSchema.js.map +1 -1
  88. package/dist/Layer.d.ts.map +1 -1
  89. package/dist/Layer.js +2 -2
  90. package/dist/Layer.js.map +1 -1
  91. package/dist/ManagedRuntime.d.ts +19 -1
  92. package/dist/ManagedRuntime.d.ts.map +1 -1
  93. package/dist/ManagedRuntime.js +62 -6
  94. package/dist/ManagedRuntime.js.map +1 -1
  95. package/dist/Metric.d.ts +135 -3
  96. package/dist/Metric.d.ts.map +1 -1
  97. package/dist/Metric.js +197 -25
  98. package/dist/Metric.js.map +1 -1
  99. package/dist/MutableHashMap.d.ts.map +1 -1
  100. package/dist/MutableHashMap.js.map +1 -1
  101. package/dist/MutableList.d.ts +5 -2
  102. package/dist/MutableList.d.ts.map +1 -1
  103. package/dist/MutableList.js +7 -5
  104. package/dist/MutableList.js.map +1 -1
  105. package/dist/MutableRef.d.ts.map +1 -1
  106. package/dist/MutableRef.js +7 -0
  107. package/dist/MutableRef.js.map +1 -1
  108. package/dist/Number.js +2 -2
  109. package/dist/Number.js.map +1 -1
  110. package/dist/Optic.d.ts.map +1 -1
  111. package/dist/Optic.js.map +1 -1
  112. package/dist/PartitionedSemaphore.d.ts +2 -1
  113. package/dist/PartitionedSemaphore.d.ts.map +1 -1
  114. package/dist/PartitionedSemaphore.js +22 -12
  115. package/dist/PartitionedSemaphore.js.map +1 -1
  116. package/dist/Path.d.ts.map +1 -1
  117. package/dist/Path.js +8 -1
  118. package/dist/Path.js.map +1 -1
  119. package/dist/Pool.d.ts.map +1 -1
  120. package/dist/Pool.js +77 -27
  121. package/dist/Pool.js.map +1 -1
  122. package/dist/PubSub.d.ts.map +1 -1
  123. package/dist/PubSub.js +17 -13
  124. package/dist/PubSub.js.map +1 -1
  125. package/dist/Queue.d.ts +4 -1
  126. package/dist/Queue.d.ts.map +1 -1
  127. package/dist/Queue.js +4 -1
  128. package/dist/Queue.js.map +1 -1
  129. package/dist/Random.d.ts.map +1 -1
  130. package/dist/Random.js +1 -1
  131. package/dist/Random.js.map +1 -1
  132. package/dist/RcMap.d.ts +12 -7
  133. package/dist/RcMap.d.ts.map +1 -1
  134. package/dist/RcMap.js +9 -6
  135. package/dist/RcMap.js.map +1 -1
  136. package/dist/Record.d.ts +51 -0
  137. package/dist/Record.d.ts.map +1 -1
  138. package/dist/Record.js +17 -0
  139. package/dist/Record.js.map +1 -1
  140. package/dist/Ref.d.ts.map +1 -1
  141. package/dist/Ref.js +8 -0
  142. package/dist/Ref.js.map +1 -1
  143. package/dist/References.d.ts +5 -4
  144. package/dist/References.d.ts.map +1 -1
  145. package/dist/References.js +5 -4
  146. package/dist/References.js.map +1 -1
  147. package/dist/RequestResolver.d.ts +31 -1
  148. package/dist/RequestResolver.d.ts.map +1 -1
  149. package/dist/RequestResolver.js +39 -4
  150. package/dist/RequestResolver.js.map +1 -1
  151. package/dist/Resource.js +1 -1
  152. package/dist/Resource.js.map +1 -1
  153. package/dist/Runtime.d.ts +3 -3
  154. package/dist/Runtime.d.ts.map +1 -1
  155. package/dist/Runtime.js +18 -15
  156. package/dist/Runtime.js.map +1 -1
  157. package/dist/Schedule.d.ts.map +1 -1
  158. package/dist/Schedule.js +1 -1
  159. package/dist/Schedule.js.map +1 -1
  160. package/dist/Schema.d.ts +408 -340
  161. package/dist/Schema.d.ts.map +1 -1
  162. package/dist/Schema.js +370 -47
  163. package/dist/Schema.js.map +1 -1
  164. package/dist/SchemaAST.d.ts +9 -7
  165. package/dist/SchemaAST.d.ts.map +1 -1
  166. package/dist/SchemaAST.js +38 -25
  167. package/dist/SchemaAST.js.map +1 -1
  168. package/dist/SchemaGetter.d.ts +8 -3
  169. package/dist/SchemaGetter.d.ts.map +1 -1
  170. package/dist/SchemaGetter.js +15 -5
  171. package/dist/SchemaGetter.js.map +1 -1
  172. package/dist/SchemaIssue.d.ts +4 -4
  173. package/dist/SchemaIssue.d.ts.map +1 -1
  174. package/dist/SchemaIssue.js +29 -51
  175. package/dist/SchemaIssue.js.map +1 -1
  176. package/dist/SchemaParser.d.ts.map +1 -1
  177. package/dist/SchemaParser.js +48 -22
  178. package/dist/SchemaParser.js.map +1 -1
  179. package/dist/SchemaRepresentation.d.ts +75 -11
  180. package/dist/SchemaRepresentation.d.ts.map +1 -1
  181. package/dist/SchemaRepresentation.js +41 -13
  182. package/dist/SchemaRepresentation.js.map +1 -1
  183. package/dist/SchemaTransformation.d.ts +5 -2
  184. package/dist/SchemaTransformation.d.ts.map +1 -1
  185. package/dist/SchemaTransformation.js +10 -3
  186. package/dist/SchemaTransformation.js.map +1 -1
  187. package/dist/Scope.d.ts +12 -2
  188. package/dist/Scope.d.ts.map +1 -1
  189. package/dist/Scope.js +5 -0
  190. package/dist/Scope.js.map +1 -1
  191. package/dist/ScopedCache.d.ts +10 -7
  192. package/dist/ScopedCache.d.ts.map +1 -1
  193. package/dist/ScopedCache.js +9 -5
  194. package/dist/ScopedCache.js.map +1 -1
  195. package/dist/SemVer.d.ts +1196 -0
  196. package/dist/SemVer.d.ts.map +1 -0
  197. package/dist/SemVer.js +756 -0
  198. package/dist/SemVer.js.map +1 -0
  199. package/dist/SemVerRange.d.ts +559 -0
  200. package/dist/SemVerRange.d.ts.map +1 -0
  201. package/dist/SemVerRange.js +551 -0
  202. package/dist/SemVerRange.js.map +1 -0
  203. package/dist/Semaphore.d.ts.map +1 -1
  204. package/dist/Semaphore.js +54 -35
  205. package/dist/Semaphore.js.map +1 -1
  206. package/dist/Sink.d.ts.map +1 -1
  207. package/dist/Sink.js +13 -4
  208. package/dist/Sink.js.map +1 -1
  209. package/dist/Stream.d.ts +235 -8
  210. package/dist/Stream.d.ts.map +1 -1
  211. package/dist/Stream.js +167 -70
  212. package/dist/Stream.js.map +1 -1
  213. package/dist/String.d.ts +7 -2
  214. package/dist/String.d.ts.map +1 -1
  215. package/dist/String.js +11 -6
  216. package/dist/String.js.map +1 -1
  217. package/dist/TextDiff.d.ts +399 -0
  218. package/dist/TextDiff.d.ts.map +1 -0
  219. package/dist/TextDiff.js +634 -0
  220. package/dist/TextDiff.js.map +1 -0
  221. package/dist/Tracer.d.ts +11 -1
  222. package/dist/Tracer.d.ts.map +1 -1
  223. package/dist/Tracer.js +6 -1
  224. package/dist/Tracer.js.map +1 -1
  225. package/dist/TxHashMap.d.ts.map +1 -1
  226. package/dist/TxHashMap.js.map +1 -1
  227. package/dist/TxHashSet.d.ts.map +1 -1
  228. package/dist/TxHashSet.js.map +1 -1
  229. package/dist/ai/AiError.d.ts +68 -4
  230. package/dist/ai/AiError.d.ts.map +1 -1
  231. package/dist/ai/AiError.js +50 -2
  232. package/dist/ai/AiError.js.map +1 -1
  233. package/dist/ai/Chat.d.ts +1 -2
  234. package/dist/ai/Chat.d.ts.map +1 -1
  235. package/dist/ai/Chat.js +6 -3
  236. package/dist/ai/Chat.js.map +1 -1
  237. package/dist/ai/Decision.d.ts +46 -1
  238. package/dist/ai/Decision.d.ts.map +1 -1
  239. package/dist/ai/Decision.js.map +1 -1
  240. package/dist/ai/DecisionModel.d.ts +129 -11
  241. package/dist/ai/DecisionModel.d.ts.map +1 -1
  242. package/dist/ai/DecisionModel.js +182 -94
  243. package/dist/ai/DecisionModel.js.map +1 -1
  244. package/dist/ai/EmbeddingModel.d.ts +10 -0
  245. package/dist/ai/EmbeddingModel.d.ts.map +1 -1
  246. package/dist/ai/EmbeddingModel.js +21 -7
  247. package/dist/ai/EmbeddingModel.js.map +1 -1
  248. package/dist/ai/LanguageModel.d.ts.map +1 -1
  249. package/dist/ai/LanguageModel.js +9 -0
  250. package/dist/ai/LanguageModel.js.map +1 -1
  251. package/dist/ai/McpClient.d.ts +289 -0
  252. package/dist/ai/McpClient.d.ts.map +1 -0
  253. package/dist/ai/McpClient.js +819 -0
  254. package/dist/ai/McpClient.js.map +1 -0
  255. package/dist/ai/McpClientError.d.ts +254 -0
  256. package/dist/ai/McpClientError.d.ts.map +1 -0
  257. package/dist/ai/McpClientError.js +260 -0
  258. package/dist/ai/McpClientError.js.map +1 -0
  259. package/dist/ai/McpProtocol.d.ts +2 -2
  260. package/dist/ai/McpProtocol.d.ts.map +1 -1
  261. package/dist/ai/McpSchema.d.ts +258 -125
  262. package/dist/ai/McpSchema.d.ts.map +1 -1
  263. package/dist/ai/McpSchema.js +94 -24
  264. package/dist/ai/McpSchema.js.map +1 -1
  265. package/dist/ai/McpServer.d.ts.map +1 -1
  266. package/dist/ai/McpServer.js +46 -37
  267. package/dist/ai/McpServer.js.map +1 -1
  268. package/dist/ai/Prompt.d.ts +74 -20
  269. package/dist/ai/Prompt.d.ts.map +1 -1
  270. package/dist/ai/Prompt.js +61 -1
  271. package/dist/ai/Prompt.js.map +1 -1
  272. package/dist/ai/Response.d.ts +160 -3
  273. package/dist/ai/Response.d.ts.map +1 -1
  274. package/dist/ai/Response.js +39 -37
  275. package/dist/ai/Response.js.map +1 -1
  276. package/dist/ai/Tool.d.ts +36 -4
  277. package/dist/ai/Tool.d.ts.map +1 -1
  278. package/dist/ai/Tool.js +5 -2
  279. package/dist/ai/Tool.js.map +1 -1
  280. package/dist/ai/Toolkit.d.ts +48 -1
  281. package/dist/ai/Toolkit.d.ts.map +1 -1
  282. package/dist/ai/Toolkit.js +73 -13
  283. package/dist/ai/Toolkit.js.map +1 -1
  284. package/dist/ai/index.d.ts +10 -0
  285. package/dist/ai/index.d.ts.map +1 -1
  286. package/dist/ai/index.js +10 -0
  287. package/dist/ai/index.js.map +1 -1
  288. package/dist/ai/internal/mcpCore.js.map +1 -1
  289. package/dist/ai/internal/mcpProtocol/v2024_11_05.js +1 -1
  290. package/dist/ai/internal/mcpProtocol/v2024_11_05.js.map +1 -1
  291. package/dist/ai/internal/mcpProtocol/v2025_03_26.js +1 -1
  292. package/dist/ai/internal/mcpProtocol/v2025_03_26.js.map +1 -1
  293. package/dist/ai/internal/mcpProtocol/v2025_06_18.js +2 -2
  294. package/dist/ai/internal/mcpProtocol/v2025_06_18.js.map +1 -1
  295. package/dist/ai/internal/mcpProtocol/v2025_11_25.js +2 -2
  296. package/dist/ai/internal/mcpProtocol/v2025_11_25.js.map +1 -1
  297. package/dist/ai/internal/mcpProtocol/v2026_07_28.js +4 -7
  298. package/dist/ai/internal/mcpProtocol/v2026_07_28.js.map +1 -1
  299. package/dist/ai/internal/mcpProtocol.js +16 -2
  300. package/dist/ai/internal/mcpProtocol.js.map +1 -1
  301. package/dist/ai/internal/mcpRuntime.js +3 -4
  302. package/dist/ai/internal/mcpRuntime.js.map +1 -1
  303. package/dist/ai/internal/mcpSchema/v2024_11_05.js +19 -13
  304. package/dist/ai/internal/mcpSchema/v2024_11_05.js.map +1 -1
  305. package/dist/ai/internal/mcpSchema/v2025_03_26.js +3 -2
  306. package/dist/ai/internal/mcpSchema/v2025_03_26.js.map +1 -1
  307. package/dist/ai/internal/mcpSchema/v2025_06_18.js +7 -7
  308. package/dist/ai/internal/mcpSchema/v2025_06_18.js.map +1 -1
  309. package/dist/ai/internal/mcpSchema/v2025_11_25.js +8 -8
  310. package/dist/ai/internal/mcpSchema/v2025_11_25.js.map +1 -1
  311. package/dist/ai/internal/mcpSchema/v2026_07_28.js +43 -42
  312. package/dist/ai/internal/mcpSchema/v2026_07_28.js.map +1 -1
  313. package/dist/cli/Argument.d.ts +15 -0
  314. package/dist/cli/Argument.d.ts.map +1 -1
  315. package/dist/cli/Argument.js +5 -0
  316. package/dist/cli/Argument.js.map +1 -1
  317. package/dist/cli/CliError.d.ts +120 -2
  318. package/dist/cli/CliError.d.ts.map +1 -1
  319. package/dist/cli/CliError.js +106 -5
  320. package/dist/cli/CliError.js.map +1 -1
  321. package/dist/cli/CliOutput.d.ts +155 -6
  322. package/dist/cli/CliOutput.d.ts.map +1 -1
  323. package/dist/cli/CliOutput.js +62 -6
  324. package/dist/cli/CliOutput.js.map +1 -1
  325. package/dist/cli/Command.d.ts +310 -18
  326. package/dist/cli/Command.d.ts.map +1 -1
  327. package/dist/cli/Command.js +164 -33
  328. package/dist/cli/Command.js.map +1 -1
  329. package/dist/cli/Completions.d.ts +63 -0
  330. package/dist/cli/Completions.d.ts.map +1 -1
  331. package/dist/cli/Completions.js +49 -9
  332. package/dist/cli/Completions.js.map +1 -1
  333. package/dist/cli/Flag.d.ts +130 -0
  334. package/dist/cli/Flag.d.ts.map +1 -1
  335. package/dist/cli/Flag.js +61 -0
  336. package/dist/cli/Flag.js.map +1 -1
  337. package/dist/cli/GlobalFlag.d.ts.map +1 -1
  338. package/dist/cli/GlobalFlag.js +14 -6
  339. package/dist/cli/GlobalFlag.js.map +1 -1
  340. package/dist/cli/Param.d.ts +116 -0
  341. package/dist/cli/Param.d.ts.map +1 -1
  342. package/dist/cli/Param.js +77 -2
  343. package/dist/cli/Param.js.map +1 -1
  344. package/dist/cli/TerminalCapabilities.d.ts +85 -0
  345. package/dist/cli/TerminalCapabilities.d.ts.map +1 -0
  346. package/dist/cli/TerminalCapabilities.js +124 -0
  347. package/dist/cli/TerminalCapabilities.js.map +1 -0
  348. package/dist/cli/index.d.ts +5 -0
  349. package/dist/cli/index.d.ts.map +1 -1
  350. package/dist/cli/index.js +5 -0
  351. package/dist/cli/index.js.map +1 -1
  352. package/dist/cli/internal/command.d.ts +2 -1
  353. package/dist/cli/internal/command.d.ts.map +1 -1
  354. package/dist/cli/internal/command.js +5 -2
  355. package/dist/cli/internal/command.js.map +1 -1
  356. package/dist/cli/internal/completions/bash.js +77 -30
  357. package/dist/cli/internal/completions/bash.js.map +1 -1
  358. package/dist/cli/internal/completions/descriptor.js +9 -1
  359. package/dist/cli/internal/completions/descriptor.js.map +1 -1
  360. package/dist/cli/internal/completions/fish.js +10 -8
  361. package/dist/cli/internal/completions/fish.js.map +1 -1
  362. package/dist/cli/internal/completions/powershell.js +18 -9
  363. package/dist/cli/internal/completions/powershell.js.map +1 -1
  364. package/dist/cli/internal/completions/zsh.js +8 -5
  365. package/dist/cli/internal/completions/zsh.js.map +1 -1
  366. package/dist/cli/internal/formatter.d.ts +2 -0
  367. package/dist/cli/internal/formatter.d.ts.map +1 -0
  368. package/dist/cli/internal/formatter.js +15 -0
  369. package/dist/cli/internal/formatter.js.map +1 -0
  370. package/dist/cli/internal/lexer.js +24 -10
  371. package/dist/cli/internal/lexer.js.map +1 -1
  372. package/dist/cli/internal/parser.js +24 -12
  373. package/dist/cli/internal/parser.js.map +1 -1
  374. package/dist/cluster/ClusterCron.d.ts +29 -1
  375. package/dist/cluster/ClusterCron.d.ts.map +1 -1
  376. package/dist/cluster/ClusterCron.js +64 -32
  377. package/dist/cluster/ClusterCron.js.map +1 -1
  378. package/dist/cluster/ClusterMetrics.d.ts +143 -7
  379. package/dist/cluster/ClusterMetrics.d.ts.map +1 -1
  380. package/dist/cluster/ClusterMetrics.js +151 -7
  381. package/dist/cluster/ClusterMetrics.js.map +1 -1
  382. package/dist/cluster/ClusterWorkflowEngine.d.ts +1 -1
  383. package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
  384. package/dist/cluster/ClusterWorkflowEngine.js +82 -21
  385. package/dist/cluster/ClusterWorkflowEngine.js.map +1 -1
  386. package/dist/cluster/Entity.d.ts +2 -0
  387. package/dist/cluster/Entity.d.ts.map +1 -1
  388. package/dist/cluster/Entity.js.map +1 -1
  389. package/dist/cluster/MessageStorage.d.ts +44 -45
  390. package/dist/cluster/MessageStorage.d.ts.map +1 -1
  391. package/dist/cluster/MessageStorage.js +6 -7
  392. package/dist/cluster/MessageStorage.js.map +1 -1
  393. package/dist/cluster/Runners.d.ts.map +1 -1
  394. package/dist/cluster/Runners.js +54 -15
  395. package/dist/cluster/Runners.js.map +1 -1
  396. package/dist/cluster/Sharding.d.ts +1 -0
  397. package/dist/cluster/Sharding.d.ts.map +1 -1
  398. package/dist/cluster/Sharding.js +155 -52
  399. package/dist/cluster/Sharding.js.map +1 -1
  400. package/dist/cluster/ShardingConfig.d.ts +30 -0
  401. package/dist/cluster/ShardingConfig.d.ts.map +1 -1
  402. package/dist/cluster/ShardingConfig.js +4 -0
  403. package/dist/cluster/ShardingConfig.js.map +1 -1
  404. package/dist/cluster/Snowflake.d.ts.map +1 -1
  405. package/dist/cluster/Snowflake.js +3 -7
  406. package/dist/cluster/Snowflake.js.map +1 -1
  407. package/dist/cluster/SqlMessageStorage.d.ts.map +1 -1
  408. package/dist/cluster/SqlMessageStorage.js +40 -50
  409. package/dist/cluster/SqlMessageStorage.js.map +1 -1
  410. package/dist/cluster/SqlRunnerStorage.d.ts +2 -2
  411. package/dist/cluster/SqlRunnerStorage.d.ts.map +1 -1
  412. package/dist/cluster/SqlRunnerStorage.js +97 -43
  413. package/dist/cluster/SqlRunnerStorage.js.map +1 -1
  414. package/dist/cluster/internal/entityManager.js +119 -28
  415. package/dist/cluster/internal/entityManager.js.map +1 -1
  416. package/dist/devtools/DevTools.d.ts +3 -2
  417. package/dist/devtools/DevTools.d.ts.map +1 -1
  418. package/dist/devtools/DevTools.js +3 -2
  419. package/dist/devtools/DevTools.js.map +1 -1
  420. package/dist/devtools/DevToolsClient.d.ts +11 -0
  421. package/dist/devtools/DevToolsClient.d.ts.map +1 -1
  422. package/dist/devtools/DevToolsClient.js +33 -4
  423. package/dist/devtools/DevToolsClient.js.map +1 -1
  424. package/dist/encoding/Base64.js +36 -0
  425. package/dist/encoding/Base64.js.map +1 -1
  426. package/dist/encoding/Base64Url.d.ts +29 -0
  427. package/dist/encoding/Base64Url.d.ts.map +1 -1
  428. package/dist/encoding/Base64Url.js +29 -0
  429. package/dist/encoding/Base64Url.js.map +1 -1
  430. package/dist/encoding/Ini.d.ts.map +1 -1
  431. package/dist/encoding/Ini.js +3 -0
  432. package/dist/encoding/Ini.js.map +1 -1
  433. package/dist/encoding/JsonArray.d.ts +270 -0
  434. package/dist/encoding/JsonArray.d.ts.map +1 -0
  435. package/dist/encoding/JsonArray.js +691 -0
  436. package/dist/encoding/JsonArray.js.map +1 -0
  437. package/dist/encoding/Ndjson.d.ts +43 -4
  438. package/dist/encoding/Ndjson.d.ts.map +1 -1
  439. package/dist/encoding/Ndjson.js +169 -18
  440. package/dist/encoding/Ndjson.js.map +1 -1
  441. package/dist/encoding/SchemaBinary.d.ts +9 -1
  442. package/dist/encoding/SchemaBinary.d.ts.map +1 -1
  443. package/dist/encoding/SchemaBinary.js +12 -19
  444. package/dist/encoding/SchemaBinary.js.map +1 -1
  445. package/dist/encoding/Sse.d.ts.map +1 -1
  446. package/dist/encoding/Sse.js +3 -3
  447. package/dist/encoding/Sse.js.map +1 -1
  448. package/dist/encoding/Tar.d.ts +309 -0
  449. package/dist/encoding/Tar.d.ts.map +1 -0
  450. package/dist/encoding/Tar.js +1182 -0
  451. package/dist/encoding/Tar.js.map +1 -0
  452. package/dist/encoding/Toml.d.ts.map +1 -1
  453. package/dist/encoding/Toml.js +24 -19
  454. package/dist/encoding/Toml.js.map +1 -1
  455. package/dist/encoding/Xml.d.ts +464 -0
  456. package/dist/encoding/Xml.d.ts.map +1 -0
  457. package/dist/encoding/Xml.js +1619 -0
  458. package/dist/encoding/Xml.js.map +1 -0
  459. package/dist/encoding/Yaml.d.ts +6 -2
  460. package/dist/encoding/Yaml.d.ts.map +1 -1
  461. package/dist/encoding/Yaml.js +97 -34
  462. package/dist/encoding/Yaml.js.map +1 -1
  463. package/dist/encoding/Zip.d.ts +413 -0
  464. package/dist/encoding/Zip.d.ts.map +1 -0
  465. package/dist/encoding/Zip.js +1255 -0
  466. package/dist/encoding/Zip.js.map +1 -0
  467. package/dist/encoding/index.d.ts +20 -0
  468. package/dist/encoding/index.d.ts.map +1 -1
  469. package/dist/encoding/index.js +20 -0
  470. package/dist/encoding/index.js.map +1 -1
  471. package/dist/eventlog/EventJournal.d.ts +90 -5
  472. package/dist/eventlog/EventJournal.d.ts.map +1 -1
  473. package/dist/eventlog/EventJournal.js +488 -228
  474. package/dist/eventlog/EventJournal.js.map +1 -1
  475. package/dist/eventlog/EventLog.d.ts +180 -12
  476. package/dist/eventlog/EventLog.d.ts.map +1 -1
  477. package/dist/eventlog/EventLog.js +394 -146
  478. package/dist/eventlog/EventLog.js.map +1 -1
  479. package/dist/eventlog/EventLogEncryption.d.ts +36 -30
  480. package/dist/eventlog/EventLogEncryption.d.ts.map +1 -1
  481. package/dist/eventlog/EventLogEncryption.js +97 -38
  482. package/dist/eventlog/EventLogEncryption.js.map +1 -1
  483. package/dist/eventlog/EventLogMessage.d.ts +74 -34
  484. package/dist/eventlog/EventLogMessage.d.ts.map +1 -1
  485. package/dist/eventlog/EventLogMessage.js +45 -11
  486. package/dist/eventlog/EventLogMessage.js.map +1 -1
  487. package/dist/eventlog/EventLogRemote.d.ts +45 -8
  488. package/dist/eventlog/EventLogRemote.d.ts.map +1 -1
  489. package/dist/eventlog/EventLogRemote.js +51 -14
  490. package/dist/eventlog/EventLogRemote.js.map +1 -1
  491. package/dist/eventlog/EventLogServer.d.ts +46 -3
  492. package/dist/eventlog/EventLogServer.d.ts.map +1 -1
  493. package/dist/eventlog/EventLogServer.js +119 -19
  494. package/dist/eventlog/EventLogServer.js.map +1 -1
  495. package/dist/eventlog/EventLogServerEncrypted.d.ts +23 -33
  496. package/dist/eventlog/EventLogServerEncrypted.d.ts.map +1 -1
  497. package/dist/eventlog/EventLogServerEncrypted.js +97 -70
  498. package/dist/eventlog/EventLogServerEncrypted.js.map +1 -1
  499. package/dist/eventlog/EventLogServerUnencrypted.d.ts +39 -5
  500. package/dist/eventlog/EventLogServerUnencrypted.d.ts.map +1 -1
  501. package/dist/eventlog/EventLogServerUnencrypted.js +151 -69
  502. package/dist/eventlog/EventLogServerUnencrypted.js.map +1 -1
  503. package/dist/eventlog/EventRow.d.ts +288 -0
  504. package/dist/eventlog/EventRow.d.ts.map +1 -0
  505. package/dist/eventlog/EventRow.js +435 -0
  506. package/dist/eventlog/EventRow.js.map +1 -0
  507. package/dist/eventlog/SqlEventJournal.d.ts +18 -18
  508. package/dist/eventlog/SqlEventJournal.d.ts.map +1 -1
  509. package/dist/eventlog/SqlEventJournal.js +417 -169
  510. package/dist/eventlog/SqlEventJournal.js.map +1 -1
  511. package/dist/eventlog/SqlEventLogServerEncrypted.d.ts +10 -18
  512. package/dist/eventlog/SqlEventLogServerEncrypted.d.ts.map +1 -1
  513. package/dist/eventlog/SqlEventLogServerEncrypted.js +179 -69
  514. package/dist/eventlog/SqlEventLogServerEncrypted.js.map +1 -1
  515. package/dist/eventlog/SqlEventLogServerUnencrypted.d.ts +23 -3
  516. package/dist/eventlog/SqlEventLogServerUnencrypted.d.ts.map +1 -1
  517. package/dist/eventlog/SqlEventLogServerUnencrypted.js +102 -51
  518. package/dist/eventlog/SqlEventLogServerUnencrypted.js.map +1 -1
  519. package/dist/eventlog/index.d.ts +5 -0
  520. package/dist/eventlog/index.d.ts.map +1 -1
  521. package/dist/eventlog/index.js +5 -0
  522. package/dist/eventlog/index.js.map +1 -1
  523. package/dist/eventlog/internal/conflicts.d.ts +46 -0
  524. package/dist/eventlog/internal/conflicts.d.ts.map +1 -0
  525. package/dist/eventlog/internal/conflicts.js +89 -0
  526. package/dist/eventlog/internal/conflicts.js.map +1 -0
  527. package/dist/graphql/GraphQLClientError.d.ts +2 -2
  528. package/dist/graphql/GraphQLClientError.d.ts.map +1 -1
  529. package/dist/graphql/GraphQLClientError.js +4 -18
  530. package/dist/graphql/GraphQLClientError.js.map +1 -1
  531. package/dist/graphql/GraphQLProtocol.d.ts +12 -9
  532. package/dist/graphql/GraphQLProtocol.d.ts.map +1 -1
  533. package/dist/graphql/GraphQLProtocol.js +4 -3
  534. package/dist/graphql/GraphQLProtocol.js.map +1 -1
  535. package/dist/graphql/GraphQLResolver.d.ts +2 -0
  536. package/dist/graphql/GraphQLResolver.d.ts.map +1 -1
  537. package/dist/graphql/GraphQLResolver.js +74 -32
  538. package/dist/graphql/GraphQLResolver.js.map +1 -1
  539. package/dist/http/Cookies.d.ts.map +1 -1
  540. package/dist/http/Cookies.js +10 -9
  541. package/dist/http/Cookies.js.map +1 -1
  542. package/dist/http/FetchHttpClient.d.ts +8 -1
  543. package/dist/http/FetchHttpClient.d.ts.map +1 -1
  544. package/dist/http/FetchHttpClient.js +51 -4
  545. package/dist/http/FetchHttpClient.js.map +1 -1
  546. package/dist/http/FindMyWay/internal/router.js +10 -0
  547. package/dist/http/FindMyWay/internal/router.js.map +1 -1
  548. package/dist/http/Headers.d.ts +227 -0
  549. package/dist/http/Headers.d.ts.map +1 -1
  550. package/dist/http/Headers.js +261 -0
  551. package/dist/http/Headers.js.map +1 -1
  552. package/dist/http/HttpClient.d.ts +516 -0
  553. package/dist/http/HttpClient.d.ts.map +1 -1
  554. package/dist/http/HttpClient.js +286 -23
  555. package/dist/http/HttpClient.js.map +1 -1
  556. package/dist/http/HttpClientError.d.ts +8 -1
  557. package/dist/http/HttpClientError.d.ts.map +1 -1
  558. package/dist/http/HttpClientError.js +37 -1
  559. package/dist/http/HttpClientError.js.map +1 -1
  560. package/dist/http/HttpClientRequest.d.ts +127 -3
  561. package/dist/http/HttpClientRequest.d.ts.map +1 -1
  562. package/dist/http/HttpClientRequest.js +45 -3
  563. package/dist/http/HttpClientRequest.js.map +1 -1
  564. package/dist/http/HttpClientResponse.d.ts +53 -0
  565. package/dist/http/HttpClientResponse.d.ts.map +1 -1
  566. package/dist/http/HttpClientResponse.js +47 -0
  567. package/dist/http/HttpClientResponse.js.map +1 -1
  568. package/dist/http/HttpEffect.d.ts +6 -2
  569. package/dist/http/HttpEffect.d.ts.map +1 -1
  570. package/dist/http/HttpEffect.js +21 -17
  571. package/dist/http/HttpEffect.js.map +1 -1
  572. package/dist/http/HttpIncomingMessage.d.ts +2 -1
  573. package/dist/http/HttpIncomingMessage.d.ts.map +1 -1
  574. package/dist/http/HttpIncomingMessage.js +3 -23
  575. package/dist/http/HttpIncomingMessage.js.map +1 -1
  576. package/dist/http/HttpMiddleware.d.ts +119 -2
  577. package/dist/http/HttpMiddleware.d.ts.map +1 -1
  578. package/dist/http/HttpMiddleware.js +173 -29
  579. package/dist/http/HttpMiddleware.js.map +1 -1
  580. package/dist/http/HttpRouter.d.ts.map +1 -1
  581. package/dist/http/HttpRouter.js +9 -3
  582. package/dist/http/HttpRouter.js.map +1 -1
  583. package/dist/http/HttpServerError.d.ts +5 -2
  584. package/dist/http/HttpServerError.d.ts.map +1 -1
  585. package/dist/http/HttpServerError.js +7 -5
  586. package/dist/http/HttpServerError.js.map +1 -1
  587. package/dist/http/HttpServerRequest.d.ts +30 -5
  588. package/dist/http/HttpServerRequest.d.ts.map +1 -1
  589. package/dist/http/HttpServerRequest.js +109 -20
  590. package/dist/http/HttpServerRequest.js.map +1 -1
  591. package/dist/http/HttpServerResponse.d.ts +17 -8
  592. package/dist/http/HttpServerResponse.d.ts.map +1 -1
  593. package/dist/http/HttpServerResponse.js +37 -21
  594. package/dist/http/HttpServerResponse.js.map +1 -1
  595. package/dist/http/HttpStaticServer.d.ts +0 -12
  596. package/dist/http/HttpStaticServer.d.ts.map +1 -1
  597. package/dist/http/HttpStaticServer.js +65 -24
  598. package/dist/http/HttpStaticServer.js.map +1 -1
  599. package/dist/http/MultipartParser/internal/contentType.d.ts +15 -1
  600. package/dist/http/MultipartParser/internal/contentType.d.ts.map +1 -1
  601. package/dist/http/MultipartParser/internal/contentType.js +89 -7
  602. package/dist/http/MultipartParser/internal/contentType.js.map +1 -1
  603. package/dist/http/MultipartParser/internal/headers.d.ts.map +1 -1
  604. package/dist/http/MultipartParser/internal/headers.js +4 -12
  605. package/dist/http/MultipartParser/internal/headers.js.map +1 -1
  606. package/dist/http/MultipartParser/internal/multipart.d.ts.map +1 -1
  607. package/dist/http/MultipartParser/internal/multipart.js +6 -27
  608. package/dist/http/MultipartParser/internal/multipart.js.map +1 -1
  609. package/dist/http/Url.d.ts.map +1 -1
  610. package/dist/http/Url.js +6 -1
  611. package/dist/http/Url.js.map +1 -1
  612. package/dist/http/UrlParams.d.ts +3 -1
  613. package/dist/http/UrlParams.d.ts.map +1 -1
  614. package/dist/http/UrlParams.js +4 -2
  615. package/dist/http/UrlParams.js.map +1 -1
  616. package/dist/http/internal/compression.js +4 -5
  617. package/dist/http/internal/compression.js.map +1 -1
  618. package/dist/http/internal/decompression.js +20 -11
  619. package/dist/http/internal/decompression.js.map +1 -1
  620. package/dist/http/internal/httpBody.js +8 -1
  621. package/dist/http/internal/httpBody.js.map +1 -1
  622. package/dist/http/internal/lazyStream.d.ts +2 -0
  623. package/dist/http/internal/lazyStream.d.ts.map +1 -0
  624. package/dist/http/internal/lazyStream.js +18 -0
  625. package/dist/http/internal/lazyStream.js.map +1 -0
  626. package/dist/http/internal/requestState.d.ts +2 -0
  627. package/dist/http/internal/requestState.d.ts.map +1 -0
  628. package/dist/http/internal/requestState.js +28 -0
  629. package/dist/http/internal/requestState.js.map +1 -0
  630. package/dist/http/internal/urlParams.js +25 -0
  631. package/dist/http/internal/urlParams.js.map +1 -1
  632. package/dist/http/internal/webResponse.d.ts +2 -0
  633. package/dist/http/internal/webResponse.d.ts.map +1 -0
  634. package/dist/http/internal/webResponse.js +12 -0
  635. package/dist/http/internal/webResponse.js.map +1 -0
  636. package/dist/http-api/HttpApi.d.ts +3 -6
  637. package/dist/http-api/HttpApi.d.ts.map +1 -1
  638. package/dist/http-api/HttpApi.js +4 -7
  639. package/dist/http-api/HttpApi.js.map +1 -1
  640. package/dist/http-api/HttpApiBuilder.d.ts.map +1 -1
  641. package/dist/http-api/HttpApiBuilder.js +142 -23
  642. package/dist/http-api/HttpApiBuilder.js.map +1 -1
  643. package/dist/http-api/HttpApiClient.d.ts +99 -4
  644. package/dist/http-api/HttpApiClient.d.ts.map +1 -1
  645. package/dist/http-api/HttpApiClient.js +218 -60
  646. package/dist/http-api/HttpApiClient.js.map +1 -1
  647. package/dist/http-api/HttpApiEndpoint.d.ts +72 -29
  648. package/dist/http-api/HttpApiEndpoint.d.ts.map +1 -1
  649. package/dist/http-api/HttpApiEndpoint.js +140 -14
  650. package/dist/http-api/HttpApiEndpoint.js.map +1 -1
  651. package/dist/http-api/HttpApiError.d.ts +58 -0
  652. package/dist/http-api/HttpApiError.d.ts.map +1 -1
  653. package/dist/http-api/HttpApiError.js +38 -12
  654. package/dist/http-api/HttpApiError.js.map +1 -1
  655. package/dist/http-api/HttpApiScalar.d.ts +2 -1
  656. package/dist/http-api/HttpApiScalar.d.ts.map +1 -1
  657. package/dist/http-api/HttpApiScalar.js +6 -3
  658. package/dist/http-api/HttpApiScalar.js.map +1 -1
  659. package/dist/http-api/HttpApiSchema.d.ts +242 -13
  660. package/dist/http-api/HttpApiSchema.d.ts.map +1 -1
  661. package/dist/http-api/HttpApiSchema.js +149 -5
  662. package/dist/http-api/HttpApiSchema.js.map +1 -1
  663. package/dist/http-api/HttpApiSwagger.d.ts +5 -0
  664. package/dist/http-api/HttpApiSwagger.d.ts.map +1 -1
  665. package/dist/http-api/HttpApiSwagger.js +14 -4
  666. package/dist/http-api/HttpApiSwagger.js.map +1 -1
  667. package/dist/http-api/HttpApiTest.d.ts +13 -2
  668. package/dist/http-api/HttpApiTest.d.ts.map +1 -1
  669. package/dist/http-api/HttpApiTest.js +33 -11
  670. package/dist/http-api/HttpApiTest.js.map +1 -1
  671. package/dist/http-api/OpenApi.d.ts +17 -3
  672. package/dist/http-api/OpenApi.d.ts.map +1 -1
  673. package/dist/http-api/OpenApi.js +81 -47
  674. package/dist/http-api/OpenApi.js.map +1 -1
  675. package/dist/http-api/internal/path.js +35 -10
  676. package/dist/http-api/internal/path.js.map +1 -1
  677. package/dist/http-api/internal/toCodecHttpProperties.d.ts +2 -0
  678. package/dist/http-api/internal/toCodecHttpProperties.d.ts.map +1 -0
  679. package/dist/http-api/internal/toCodecHttpProperties.js +38 -0
  680. package/dist/http-api/internal/toCodecHttpProperties.js.map +1 -0
  681. package/dist/index.d.ts +20 -0
  682. package/dist/index.d.ts.map +1 -1
  683. package/dist/index.js +20 -0
  684. package/dist/index.js.map +1 -1
  685. package/dist/internal/arbitrary/runner.d.ts.map +1 -1
  686. package/dist/internal/arbitrary/runner.js +120 -44
  687. package/dist/internal/arbitrary/runner.js.map +1 -1
  688. package/dist/internal/core.js +3 -1
  689. package/dist/internal/core.js.map +1 -1
  690. package/dist/internal/dateTime.js +19 -7
  691. package/dist/internal/dateTime.js.map +1 -1
  692. package/dist/internal/effect.js +106 -87
  693. package/dist/internal/effect.js.map +1 -1
  694. package/dist/internal/equal.js +14 -0
  695. package/dist/internal/equal.js.map +1 -1
  696. package/dist/internal/hashMap.js +2 -2
  697. package/dist/internal/hashMap.js.map +1 -1
  698. package/dist/internal/hydration.d.ts +2 -0
  699. package/dist/internal/hydration.d.ts.map +1 -0
  700. package/dist/internal/hydration.js +15 -0
  701. package/dist/internal/hydration.js.map +1 -0
  702. package/dist/internal/inflate.d.ts +2 -0
  703. package/dist/internal/inflate.d.ts.map +1 -0
  704. package/dist/internal/inflate.js +680 -0
  705. package/dist/internal/inflate.js.map +1 -0
  706. package/dist/internal/jsonSchema.d.ts +2 -0
  707. package/dist/internal/jsonSchema.d.ts.map +1 -0
  708. package/dist/internal/jsonSchema.js +28 -0
  709. package/dist/internal/jsonSchema.js.map +1 -0
  710. package/dist/internal/matcher.js +1 -1
  711. package/dist/internal/matcher.js.map +1 -1
  712. package/dist/internal/record.js +6 -0
  713. package/dist/internal/record.js.map +1 -1
  714. package/dist/internal/request.js +20 -7
  715. package/dist/internal/request.js.map +1 -1
  716. package/dist/internal/schedule.js +17 -22
  717. package/dist/internal/schedule.js.map +1 -1
  718. package/dist/internal/schema/compilerRegistry.js +4 -1
  719. package/dist/internal/schema/compilerRegistry.js.map +1 -1
  720. package/dist/internal/schema/content.d.ts +2 -0
  721. package/dist/internal/schema/content.d.ts.map +1 -0
  722. package/dist/internal/schema/content.js +13 -0
  723. package/dist/internal/schema/content.js.map +1 -0
  724. package/dist/internal/schema/fromJsonSchemaDocument.js +253 -255
  725. package/dist/internal/schema/fromJsonSchemaDocument.js.map +1 -1
  726. package/dist/internal/schema/fromRepresentation.js +2 -1
  727. package/dist/internal/schema/fromRepresentation.js.map +1 -1
  728. package/dist/internal/schema/interpreter.js +51 -36
  729. package/dist/internal/schema/interpreter.js.map +1 -1
  730. package/dist/internal/schema/standardSchema.js +42 -35
  731. package/dist/internal/schema/standardSchema.js.map +1 -1
  732. package/dist/internal/schema/toCodeDocument.js +10 -5
  733. package/dist/internal/schema/toCodeDocument.js.map +1 -1
  734. package/dist/internal/schema/toCodec.js +99 -17
  735. package/dist/internal/schema/toCodec.js.map +1 -1
  736. package/dist/internal/schema/toFormatter.js +5 -5
  737. package/dist/internal/schema/toFormatter.js.map +1 -1
  738. package/dist/internal/schema/toJsonSchemaDocument.js +257 -170
  739. package/dist/internal/schema/toJsonSchemaDocument.js.map +1 -1
  740. package/dist/internal/schema/toRepresentation.js +107 -129
  741. package/dist/internal/schema/toRepresentation.js.map +1 -1
  742. package/dist/internal/sql.d.ts +2 -0
  743. package/dist/internal/sql.d.ts.map +1 -0
  744. package/dist/internal/sql.js +13 -0
  745. package/dist/internal/sql.js.map +1 -0
  746. package/dist/internal/trie.js +1 -3
  747. package/dist/internal/trie.js.map +1 -1
  748. package/dist/internal/uuid.js +7 -3
  749. package/dist/internal/uuid.js.map +1 -1
  750. package/dist/internal/version.js +1 -1
  751. package/dist/net/NetAddress.d.ts.map +1 -1
  752. package/dist/net/NetAddress.js +2 -8
  753. package/dist/net/NetAddress.js.map +1 -1
  754. package/dist/observability/OtlpExporter.d.ts.map +1 -1
  755. package/dist/observability/OtlpExporter.js +5 -12
  756. package/dist/observability/OtlpExporter.js.map +1 -1
  757. package/dist/observability/OtlpMetrics.d.ts.map +1 -1
  758. package/dist/observability/OtlpMetrics.js +5 -3
  759. package/dist/observability/OtlpMetrics.js.map +1 -1
  760. package/dist/observability/OtlpProxy.d.ts +154 -0
  761. package/dist/observability/OtlpProxy.d.ts.map +1 -0
  762. package/dist/observability/OtlpProxy.js +235 -0
  763. package/dist/observability/OtlpProxy.js.map +1 -0
  764. package/dist/observability/OtlpResource.d.ts +3 -1
  765. package/dist/observability/OtlpResource.d.ts.map +1 -1
  766. package/dist/observability/OtlpResource.js +11 -4
  767. package/dist/observability/OtlpResource.js.map +1 -1
  768. package/dist/observability/OtlpSerialization.d.ts +5 -0
  769. package/dist/observability/OtlpSerialization.d.ts.map +1 -1
  770. package/dist/observability/OtlpSerialization.js +14 -3
  771. package/dist/observability/OtlpSerialization.js.map +1 -1
  772. package/dist/observability/OtlpTracer.d.ts.map +1 -1
  773. package/dist/observability/OtlpTracer.js +4 -0
  774. package/dist/observability/OtlpTracer.js.map +1 -1
  775. package/dist/observability/index.d.ts +5 -0
  776. package/dist/observability/index.d.ts.map +1 -1
  777. package/dist/observability/index.js +5 -0
  778. package/dist/observability/index.js.map +1 -1
  779. package/dist/observability/internal/protobuf.d.ts +0 -9
  780. package/dist/observability/internal/protobuf.d.ts.map +1 -1
  781. package/dist/observability/internal/protobuf.js +2 -10
  782. package/dist/observability/internal/protobuf.js.map +1 -1
  783. package/dist/persistence/CircuitBreaker.d.ts +897 -0
  784. package/dist/persistence/CircuitBreaker.d.ts.map +1 -0
  785. package/dist/persistence/CircuitBreaker.js +1165 -0
  786. package/dist/persistence/CircuitBreaker.js.map +1 -0
  787. package/dist/persistence/PersistedCache.d.ts.map +1 -1
  788. package/dist/persistence/PersistedCache.js +1 -1
  789. package/dist/persistence/PersistedCache.js.map +1 -1
  790. package/dist/persistence/PersistedQueue.d.ts +6 -2
  791. package/dist/persistence/PersistedQueue.d.ts.map +1 -1
  792. package/dist/persistence/PersistedQueue.js +162 -84
  793. package/dist/persistence/PersistedQueue.js.map +1 -1
  794. package/dist/persistence/Persistence.d.ts +28 -0
  795. package/dist/persistence/Persistence.d.ts.map +1 -1
  796. package/dist/persistence/Persistence.js +36 -8
  797. package/dist/persistence/Persistence.js.map +1 -1
  798. package/dist/persistence/RateLimiter.d.ts.map +1 -1
  799. package/dist/persistence/RateLimiter.js +8 -12
  800. package/dist/persistence/RateLimiter.js.map +1 -1
  801. package/dist/persistence/Redis.d.ts +78 -2
  802. package/dist/persistence/Redis.d.ts.map +1 -1
  803. package/dist/persistence/Redis.js +62 -7
  804. package/dist/persistence/Redis.js.map +1 -1
  805. package/dist/persistence/UserDirectories.d.ts +129 -0
  806. package/dist/persistence/UserDirectories.d.ts.map +1 -0
  807. package/dist/persistence/UserDirectories.js +178 -0
  808. package/dist/persistence/UserDirectories.js.map +1 -0
  809. package/dist/persistence/index.d.ts +10 -0
  810. package/dist/persistence/index.d.ts.map +1 -1
  811. package/dist/persistence/index.js +10 -0
  812. package/dist/persistence/index.js.map +1 -1
  813. package/dist/process/ChildProcess.d.ts +32 -5
  814. package/dist/process/ChildProcess.d.ts.map +1 -1
  815. package/dist/process/ChildProcess.js.map +1 -1
  816. package/dist/process/ChildProcessSpawner.d.ts +30 -0
  817. package/dist/process/ChildProcessSpawner.d.ts.map +1 -1
  818. package/dist/process/ChildProcessSpawner.js +5 -2
  819. package/dist/process/ChildProcessSpawner.js.map +1 -1
  820. package/dist/reactivity/AsyncResult.d.ts +1 -1
  821. package/dist/reactivity/AsyncResult.d.ts.map +1 -1
  822. package/dist/reactivity/AsyncResult.js +1 -1
  823. package/dist/reactivity/AsyncResult.js.map +1 -1
  824. package/dist/reactivity/Atom.d.ts +69 -30
  825. package/dist/reactivity/Atom.d.ts.map +1 -1
  826. package/dist/reactivity/Atom.js +40 -15
  827. package/dist/reactivity/Atom.js.map +1 -1
  828. package/dist/reactivity/AtomHttpApi.d.ts +5 -5
  829. package/dist/reactivity/AtomHttpApi.d.ts.map +1 -1
  830. package/dist/reactivity/AtomHttpApi.js +1 -1
  831. package/dist/reactivity/AtomHttpApi.js.map +1 -1
  832. package/dist/reactivity/AtomRegistry.d.ts +2 -2
  833. package/dist/reactivity/AtomRegistry.d.ts.map +1 -1
  834. package/dist/reactivity/AtomRegistry.js +44 -9
  835. package/dist/reactivity/AtomRegistry.js.map +1 -1
  836. package/dist/reactivity/AtomRpc.d.ts +3 -3
  837. package/dist/reactivity/AtomRpc.d.ts.map +1 -1
  838. package/dist/reactivity/AtomRpc.js +1 -1
  839. package/dist/reactivity/AtomRpc.js.map +1 -1
  840. package/dist/reactivity/Hydration.d.ts.map +1 -1
  841. package/dist/reactivity/Hydration.js +46 -12
  842. package/dist/reactivity/Hydration.js.map +1 -1
  843. package/dist/reactivity/Reactivity.d.ts +71 -7
  844. package/dist/reactivity/Reactivity.d.ts.map +1 -1
  845. package/dist/reactivity/Reactivity.js +21 -12
  846. package/dist/reactivity/Reactivity.js.map +1 -1
  847. package/dist/rpc/Rpc.d.ts +18 -0
  848. package/dist/rpc/Rpc.d.ts.map +1 -1
  849. package/dist/rpc/Rpc.js +20 -0
  850. package/dist/rpc/Rpc.js.map +1 -1
  851. package/dist/rpc/RpcClient.d.ts +26 -2
  852. package/dist/rpc/RpcClient.d.ts.map +1 -1
  853. package/dist/rpc/RpcClient.js +198 -61
  854. package/dist/rpc/RpcClient.js.map +1 -1
  855. package/dist/rpc/RpcSerialization.d.ts +29 -0
  856. package/dist/rpc/RpcSerialization.d.ts.map +1 -1
  857. package/dist/rpc/RpcSerialization.js +41 -13
  858. package/dist/rpc/RpcSerialization.js.map +1 -1
  859. package/dist/rpc/RpcServer.d.ts.map +1 -1
  860. package/dist/rpc/RpcServer.js +20 -19
  861. package/dist/rpc/RpcServer.js.map +1 -1
  862. package/dist/rpc/RpcTest.d.ts +1 -0
  863. package/dist/rpc/RpcTest.d.ts.map +1 -1
  864. package/dist/rpc/RpcTest.js +1 -0
  865. package/dist/rpc/RpcTest.js.map +1 -1
  866. package/dist/schema/Model.d.ts +1 -1
  867. package/dist/schema/VariantSchema.d.ts +22 -3
  868. package/dist/schema/VariantSchema.d.ts.map +1 -1
  869. package/dist/schema/VariantSchema.js +32 -18
  870. package/dist/schema/VariantSchema.js.map +1 -1
  871. package/dist/socket/Socket.d.ts +23 -1
  872. package/dist/socket/Socket.d.ts.map +1 -1
  873. package/dist/socket/Socket.js +36 -3
  874. package/dist/socket/Socket.js.map +1 -1
  875. package/dist/sql/Migrator.d.ts +2 -1
  876. package/dist/sql/Migrator.d.ts.map +1 -1
  877. package/dist/sql/Migrator.js +21 -6
  878. package/dist/sql/Migrator.js.map +1 -1
  879. package/dist/sql/SqlClient.d.ts +148 -5
  880. package/dist/sql/SqlClient.d.ts.map +1 -1
  881. package/dist/sql/SqlClient.js +155 -27
  882. package/dist/sql/SqlClient.js.map +1 -1
  883. package/dist/sql/SqlResolver.d.ts +13 -0
  884. package/dist/sql/SqlResolver.d.ts.map +1 -1
  885. package/dist/sql/SqlResolver.js +27 -4
  886. package/dist/sql/SqlResolver.js.map +1 -1
  887. package/dist/sql/Statement.d.ts +10 -1
  888. package/dist/sql/Statement.d.ts.map +1 -1
  889. package/dist/sql/Statement.js +45 -7
  890. package/dist/sql/Statement.js.map +1 -1
  891. package/dist/testing/TestClock.d.ts.map +1 -1
  892. package/dist/testing/TestClock.js +4 -2
  893. package/dist/testing/TestClock.js.map +1 -1
  894. package/dist/testing/TestSchema.d.ts +7 -1
  895. package/dist/testing/TestSchema.d.ts.map +1 -1
  896. package/dist/testing/TestSchema.js +9 -3
  897. package/dist/testing/TestSchema.js.map +1 -1
  898. package/dist/workflow/DurableDeferred.d.ts.map +1 -1
  899. package/dist/workflow/DurableDeferred.js +21 -2
  900. package/dist/workflow/DurableDeferred.js.map +1 -1
  901. package/dist/workflow/WorkflowEngine.d.ts.map +1 -1
  902. package/dist/workflow/WorkflowEngine.js +18 -4
  903. package/dist/workflow/WorkflowEngine.js.map +1 -1
  904. package/package.json +13 -3
  905. package/src/Arbitrary.ts +10 -2
  906. package/src/Array.ts +128 -55
  907. package/src/Bytes.ts +111 -0
  908. package/src/Channel.ts +308 -452
  909. package/src/ChannelSchema.ts +1 -49
  910. package/src/Chunk.ts +55 -61
  911. package/src/Config.ts +12 -86
  912. package/src/ConfigProvider.ts +2 -1
  913. package/src/Cron.ts +6 -3
  914. package/src/Data.ts +60 -265
  915. package/src/Duration.ts +66 -16
  916. package/src/Effect.ts +503 -168
  917. package/src/Equal.ts +8 -1
  918. package/src/Equivalence.ts +7 -4
  919. package/src/Exit.ts +27 -12
  920. package/src/FiberHandle.ts +10 -9
  921. package/src/FiberMap.ts +13 -66
  922. package/src/FileSystem.ts +10 -0
  923. package/src/Formatter.ts +28 -13
  924. package/src/Graph.ts +171 -1263
  925. package/src/Hash.ts +4 -1
  926. package/src/HashSet.ts +0 -60
  927. package/src/Iterable.ts +15 -14
  928. package/src/JsonPatch.ts +4 -0
  929. package/src/JsonSchema.ts +40 -43
  930. package/src/Layer.ts +2 -2
  931. package/src/ManagedRuntime.ts +72 -6
  932. package/src/Metric.ts +252 -510
  933. package/src/MutableHashMap.ts +4 -473
  934. package/src/MutableList.ts +7 -5
  935. package/src/MutableRef.ts +8 -1
  936. package/src/Number.ts +2 -2
  937. package/src/Optic.ts +17 -332
  938. package/src/PartitionedSemaphore.ts +24 -13
  939. package/src/Path.ts +9 -1
  940. package/src/Pool.ts +109 -37
  941. package/src/PubSub.ts +17 -13
  942. package/src/Queue.ts +5 -37
  943. package/src/Random.ts +1 -1
  944. package/src/RcMap.ts +14 -8
  945. package/src/Record.ts +51 -0
  946. package/src/Ref.ts +15 -104
  947. package/src/References.ts +5 -4
  948. package/src/RequestResolver.ts +46 -87
  949. package/src/Resource.ts +1 -1
  950. package/src/Runtime.ts +19 -18
  951. package/src/Schedule.ts +3 -95
  952. package/src/Schema.ts +639 -381
  953. package/src/SchemaAST.ts +40 -29
  954. package/src/SchemaGetter.ts +22 -5
  955. package/src/SchemaIssue.ts +44 -53
  956. package/src/SchemaParser.ts +51 -18
  957. package/src/SchemaRepresentation.ts +95 -35
  958. package/src/SchemaTransformation.ts +10 -3
  959. package/src/Scope.ts +12 -2
  960. package/src/ScopedCache.ts +17 -142
  961. package/src/SemVer.ts +1528 -0
  962. package/src/SemVerRange.ts +883 -0
  963. package/src/Semaphore.ts +67 -40
  964. package/src/Sink.ts +21 -4
  965. package/src/Stream.ts +367 -1027
  966. package/src/String.ts +11 -8
  967. package/src/TextDiff.ts +766 -0
  968. package/src/Tracer.ts +15 -1
  969. package/src/TxHashMap.ts +1 -103
  970. package/src/TxHashSet.ts +48 -753
  971. package/src/ai/AiError.ts +66 -4
  972. package/src/ai/Chat.ts +10 -5
  973. package/src/ai/Decision.ts +49 -1
  974. package/src/ai/DecisionModel.ts +264 -108
  975. package/src/ai/EmbeddingModel.ts +25 -13
  976. package/src/ai/LanguageModel.ts +9 -0
  977. package/src/ai/McpClient.ts +1211 -0
  978. package/src/ai/McpClientError.ts +329 -0
  979. package/src/ai/McpProtocol.ts +2 -2
  980. package/src/ai/McpSchema.ts +153 -35
  981. package/src/ai/McpServer.ts +231 -233
  982. package/src/ai/Prompt.ts +114 -35
  983. package/src/ai/Response.ts +220 -65
  984. package/src/ai/Tool.ts +50 -6
  985. package/src/ai/Toolkit.ts +82 -11
  986. package/src/ai/index.ts +12 -0
  987. package/src/ai/internal/mcpCore.ts +13 -14
  988. package/src/ai/internal/mcpProtocol/v2024_11_05.ts +1 -1
  989. package/src/ai/internal/mcpProtocol/v2025_03_26.ts +1 -1
  990. package/src/ai/internal/mcpProtocol/v2025_06_18.ts +3 -3
  991. package/src/ai/internal/mcpProtocol/v2025_11_25.ts +3 -3
  992. package/src/ai/internal/mcpProtocol/v2026_07_28.ts +12 -14
  993. package/src/ai/internal/mcpProtocol.ts +22 -2
  994. package/src/ai/internal/mcpRuntime.ts +3 -4
  995. package/src/ai/internal/mcpSchema/v2024_11_05.ts +20 -13
  996. package/src/ai/internal/mcpSchema/v2025_03_26.ts +4 -2
  997. package/src/ai/internal/mcpSchema/v2025_06_18.ts +7 -7
  998. package/src/ai/internal/mcpSchema/v2025_11_25.ts +8 -8
  999. package/src/ai/internal/mcpSchema/v2026_07_28.ts +44 -42
  1000. package/src/cli/Argument.ts +15 -0
  1001. package/src/cli/CliError.ts +136 -4
  1002. package/src/cli/CliOutput.ts +183 -6
  1003. package/src/cli/Command.ts +367 -48
  1004. package/src/cli/Completions.ts +56 -0
  1005. package/src/cli/Flag.ts +132 -0
  1006. package/src/cli/GlobalFlag.ts +5 -6
  1007. package/src/cli/Param.ts +151 -6
  1008. package/src/cli/TerminalCapabilities.ts +159 -0
  1009. package/src/cli/index.ts +6 -0
  1010. package/src/cli/internal/command.ts +8 -3
  1011. package/src/cli/internal/completions/bash.ts +83 -32
  1012. package/src/cli/internal/completions/descriptor.ts +11 -1
  1013. package/src/cli/internal/completions/fish.ts +10 -8
  1014. package/src/cli/internal/completions/powershell.ts +23 -14
  1015. package/src/cli/internal/completions/zsh.ts +8 -5
  1016. package/src/cli/internal/formatter.ts +18 -0
  1017. package/src/cli/internal/lexer.ts +12 -5
  1018. package/src/cli/internal/parser.ts +31 -11
  1019. package/src/cluster/ClusterCron.ts +94 -35
  1020. package/src/cluster/ClusterMetrics.ts +149 -7
  1021. package/src/cluster/ClusterWorkflowEngine.ts +130 -57
  1022. package/src/cluster/Entity.ts +4 -0
  1023. package/src/cluster/MessageStorage.ts +26 -14
  1024. package/src/cluster/Runners.ts +76 -25
  1025. package/src/cluster/Sharding.ts +200 -58
  1026. package/src/cluster/ShardingConfig.ts +20 -0
  1027. package/src/cluster/Snowflake.ts +3 -7
  1028. package/src/cluster/SqlMessageStorage.ts +58 -55
  1029. package/src/cluster/SqlRunnerStorage.ts +120 -51
  1030. package/src/cluster/internal/entityManager.ts +155 -32
  1031. package/src/devtools/DevTools.ts +3 -2
  1032. package/src/devtools/DevToolsClient.ts +29 -10
  1033. package/src/encoding/Base64.ts +38 -0
  1034. package/src/encoding/Base64Url.ts +31 -0
  1035. package/src/encoding/Ini.ts +3 -0
  1036. package/src/encoding/JsonArray.ts +849 -0
  1037. package/src/encoding/Ndjson.ts +211 -20
  1038. package/src/encoding/SchemaBinary.ts +14 -48
  1039. package/src/encoding/Sse.ts +4 -3
  1040. package/src/encoding/Tar.ts +1417 -0
  1041. package/src/encoding/Toml.ts +36 -19
  1042. package/src/encoding/Xml.ts +2037 -0
  1043. package/src/encoding/Yaml.ts +108 -36
  1044. package/src/encoding/Zip.ts +1558 -0
  1045. package/src/encoding/index.ts +24 -0
  1046. package/src/eventlog/EventJournal.ts +611 -227
  1047. package/src/eventlog/EventLog.ts +496 -196
  1048. package/src/eventlog/EventLogEncryption.ts +128 -43
  1049. package/src/eventlog/EventLogMessage.ts +62 -11
  1050. package/src/eventlog/EventLogRemote.ts +77 -21
  1051. package/src/eventlog/EventLogServer.ts +162 -20
  1052. package/src/eventlog/EventLogServerEncrypted.ts +121 -80
  1053. package/src/eventlog/EventLogServerUnencrypted.ts +180 -77
  1054. package/src/eventlog/EventRow.ts +706 -0
  1055. package/src/eventlog/SqlEventJournal.ts +496 -193
  1056. package/src/eventlog/SqlEventLogServerEncrypted.ts +212 -83
  1057. package/src/eventlog/SqlEventLogServerUnencrypted.ts +141 -62
  1058. package/src/eventlog/index.ts +6 -0
  1059. package/src/eventlog/internal/conflicts.ts +119 -0
  1060. package/src/graphql/GraphQLClientError.ts +5 -12
  1061. package/src/graphql/GraphQLProtocol.ts +12 -9
  1062. package/src/graphql/GraphQLResolver.ts +90 -239
  1063. package/src/http/Cookies.ts +10 -11
  1064. package/src/http/FetchHttpClient.ts +56 -6
  1065. package/src/http/FindMyWay/internal/router.ts +11 -0
  1066. package/src/http/Headers.ts +337 -154
  1067. package/src/http/HttpClient.ts +673 -142
  1068. package/src/http/HttpClientError.ts +35 -1
  1069. package/src/http/HttpClientRequest.ts +151 -5
  1070. package/src/http/HttpClientResponse.ts +71 -0
  1071. package/src/http/HttpEffect.ts +25 -33
  1072. package/src/http/HttpIncomingMessage.ts +3 -23
  1073. package/src/http/HttpMiddleware.ts +194 -40
  1074. package/src/http/HttpRouter.ts +10 -3
  1075. package/src/http/HttpServerError.ts +8 -5
  1076. package/src/http/HttpServerRequest.ts +172 -27
  1077. package/src/http/HttpServerResponse.ts +49 -23
  1078. package/src/http/HttpStaticServer.ts +71 -26
  1079. package/src/http/MultipartParser/internal/contentType.ts +109 -8
  1080. package/src/http/MultipartParser/internal/headers.ts +4 -16
  1081. package/src/http/MultipartParser/internal/multipart.ts +10 -32
  1082. package/src/http/Url.ts +6 -1
  1083. package/src/http/UrlParams.ts +6 -1
  1084. package/src/http/internal/compression.ts +4 -5
  1085. package/src/http/internal/decompression.ts +32 -17
  1086. package/src/http/internal/httpBody.ts +10 -2
  1087. package/src/http/internal/lazyStream.ts +25 -0
  1088. package/src/http/internal/requestState.ts +33 -0
  1089. package/src/http/internal/urlParams.ts +29 -0
  1090. package/src/http/internal/webResponse.ts +20 -0
  1091. package/src/http-api/HttpApi.ts +4 -7
  1092. package/src/http-api/HttpApiBuilder.ts +190 -32
  1093. package/src/http-api/HttpApiClient.ts +364 -90
  1094. package/src/http-api/HttpApiEndpoint.ts +248 -46
  1095. package/src/http-api/HttpApiError.ts +55 -0
  1096. package/src/http-api/HttpApiScalar.ts +4 -3
  1097. package/src/http-api/HttpApiSchema.ts +373 -18
  1098. package/src/http-api/HttpApiSwagger.ts +11 -4
  1099. package/src/http-api/HttpApiTest.ts +36 -11
  1100. package/src/http-api/OpenApi.ts +103 -58
  1101. package/src/http-api/internal/path.ts +40 -12
  1102. package/src/http-api/internal/toCodecHttpProperties.ts +56 -0
  1103. package/src/index.ts +24 -0
  1104. package/src/internal/arbitrary/runner.ts +133 -36
  1105. package/src/internal/core.ts +3 -1
  1106. package/src/internal/dateTime.ts +20 -7
  1107. package/src/internal/effect.ts +144 -100
  1108. package/src/internal/equal.ts +17 -0
  1109. package/src/internal/hashMap.ts +2 -2
  1110. package/src/internal/hydration.ts +15 -0
  1111. package/src/internal/inflate.ts +710 -0
  1112. package/src/internal/jsonSchema.ts +27 -0
  1113. package/src/internal/matcher.ts +1 -1
  1114. package/src/internal/record.ts +6 -0
  1115. package/src/internal/request.ts +21 -6
  1116. package/src/internal/schedule.ts +20 -39
  1117. package/src/internal/schema/compilerRegistry.ts +6 -1
  1118. package/src/internal/schema/content.ts +18 -0
  1119. package/src/internal/schema/fromJsonSchemaDocument.ts +458 -351
  1120. package/src/internal/schema/fromRepresentation.ts +2 -1
  1121. package/src/internal/schema/interpreter.ts +58 -45
  1122. package/src/internal/schema/standardSchema.ts +34 -32
  1123. package/src/internal/schema/toCodeDocument.ts +12 -7
  1124. package/src/internal/schema/toCodec.ts +134 -15
  1125. package/src/internal/schema/toFormatter.ts +6 -6
  1126. package/src/internal/schema/toJsonSchemaDocument.ts +246 -194
  1127. package/src/internal/schema/toRepresentation.ts +122 -140
  1128. package/src/internal/sql.ts +14 -0
  1129. package/src/internal/trie.ts +1 -3
  1130. package/src/internal/uuid.ts +15 -10
  1131. package/src/internal/version.ts +1 -1
  1132. package/src/net/NetAddress.ts +2 -9
  1133. package/src/observability/OtlpExporter.ts +5 -12
  1134. package/src/observability/OtlpMetrics.ts +5 -3
  1135. package/src/observability/OtlpProxy.ts +314 -0
  1136. package/src/observability/OtlpResource.ts +16 -6
  1137. package/src/observability/OtlpSerialization.ts +17 -3
  1138. package/src/observability/OtlpTracer.ts +4 -0
  1139. package/src/observability/index.ts +6 -0
  1140. package/src/observability/internal/protobuf.ts +2 -10
  1141. package/src/persistence/CircuitBreaker.ts +1678 -0
  1142. package/src/persistence/PersistedCache.ts +3 -1
  1143. package/src/persistence/PersistedQueue.ts +223 -153
  1144. package/src/persistence/Persistence.ts +64 -30
  1145. package/src/persistence/RateLimiter.ts +18 -21
  1146. package/src/persistence/Redis.ts +129 -8
  1147. package/src/persistence/UserDirectories.ts +273 -0
  1148. package/src/persistence/index.ts +12 -0
  1149. package/src/process/ChildProcess.ts +32 -5
  1150. package/src/process/ChildProcessSpawner.ts +41 -2
  1151. package/src/reactivity/AsyncResult.ts +5 -39
  1152. package/src/reactivity/Atom.ts +134 -166
  1153. package/src/reactivity/AtomHttpApi.ts +10 -16
  1154. package/src/reactivity/AtomRegistry.ts +50 -29
  1155. package/src/reactivity/AtomRpc.ts +6 -22
  1156. package/src/reactivity/Hydration.ts +53 -12
  1157. package/src/reactivity/Reactivity.ts +97 -39
  1158. package/src/rpc/Rpc.ts +21 -0
  1159. package/src/rpc/RpcClient.ts +283 -104
  1160. package/src/rpc/RpcSerialization.ts +53 -14
  1161. package/src/rpc/RpcServer.ts +27 -21
  1162. package/src/rpc/RpcTest.ts +3 -0
  1163. package/src/schema/VariantSchema.ts +86 -22
  1164. package/src/socket/Socket.ts +45 -20
  1165. package/src/sql/Migrator.ts +26 -11
  1166. package/src/sql/SqlClient.ts +273 -29
  1167. package/src/sql/SqlResolver.ts +32 -9
  1168. package/src/sql/Statement.ts +65 -10
  1169. package/src/testing/TestClock.ts +4 -1
  1170. package/src/testing/TestSchema.ts +9 -3
  1171. package/src/workflow/DurableDeferred.ts +23 -6
  1172. package/src/workflow/WorkflowEngine.ts +34 -10
  1173. package/dist/http/internal/preResponseHandler.d.ts +0 -2
  1174. package/dist/http/internal/preResponseHandler.d.ts.map +0 -1
  1175. package/dist/http/internal/preResponseHandler.js +0 -14
  1176. package/dist/http/internal/preResponseHandler.js.map +0 -1
  1177. 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 { type ConflictGroup, 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,305 @@ 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
+ })
93
271
 
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
- )`
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
+ })
288
+
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
- execute: (entries) => sql`INSERT INTO ${entryTableSql} ${sql.insert(entries)} ON CONFLICT DO NOTHING`
318
+ execute: (entries) =>
319
+ forEachChunk(
320
+ entries,
321
+ entryColumns,
322
+ (chunk) => sql`INSERT INTO ${entryTableSql} ${sql.insert(chunk)} ON CONFLICT DO NOTHING`
323
+ )
140
324
  })
141
- const insertRemotes = SqlSchema.void({
142
- Request: RemoteRowArray,
143
- execute: (entries) => sql`INSERT INTO ${remotesTableSql} ${sql.insert(entries)} ON CONFLICT DO NOTHING`
325
+ const insertSources = (entries: ReadonlyArray<EventJournal.Entry>, remoteId: EventJournal.RemoteId) =>
326
+ forEachChunk(entries, 2, (chunk) => {
327
+ const rows = chunk.map((entry) => ({ entry_id: entry.id, remote_id: remoteId }))
328
+ return sql`INSERT INTO ${sourcesTableSql} ${sql.insert(rows)} ON CONFLICT DO NOTHING`
329
+ })
330
+ // Serialize writers so checkpoints cannot skip out-of-order commits.
331
+ // Lock before callbacks in both paths to avoid projection-row deadlocks.
332
+ const lockWriters = sql.onDialectOrElse({
333
+ pg: () => Effect.asVoid(sql`LOCK TABLE ${sequenceTableSql} IN SHARE ROW EXCLUSIVE MODE`),
334
+ orElse: () => Effect.void
144
335
  })
336
+ const insertSequence = (entries: ReadonlyArray<EventJournal.Entry>) =>
337
+ forEachChunk(entries, 1, (chunk) => {
338
+ const rows = chunk.map((entry) => ({ entry_id: entry.id }))
339
+ return sql`INSERT INTO ${sequenceTableSql} ${sql.insert(rows)} ON CONFLICT DO NOTHING`
340
+ })
341
+
342
+ const decodeCursorRows = Schema.decodeUnknownEffect(CursorRowArray)
343
+
344
+ const readCursor = (remoteId: EventJournal.RemoteId) =>
345
+ sql`SELECT next_sequence FROM ${remoteCursorsTableSql} WHERE remote_id = ${remoteId}`.pipe(
346
+ Effect.flatMap(decodeCursorRows),
347
+ Effect.map((rows) => rows.length > 0 ? rows[0].next_sequence : 0)
348
+ )
349
+
350
+ // Cursors only move forward.
351
+ const writeCursor = (remoteId: EventJournal.RemoteId, next: number) =>
352
+ sql`
353
+ INSERT INTO ${remoteCursorsTableSql} ${sql.insert({ remote_id: remoteId, next_sequence: next })}
354
+ ON CONFLICT (remote_id) DO UPDATE SET next_sequence = excluded.next_sequence
355
+ WHERE ${remoteCursorsTableSql}.next_sequence < excluded.next_sequence
356
+ `
145
357
 
146
358
  const pubsub = yield* PubSub.unbounded<EventJournal.Entry>()
359
+ const clock = yield* Clock.Clock
147
360
 
148
361
  const writeFromRemote = Effect.fnUntraced(function*(options: WriteFromRemoteOptions): Effect.fn.Return<
149
362
  {
@@ -152,38 +365,23 @@ export const make = (options?: {
152
365
  EventJournal.EventJournalError | Schema.SchemaError | SqlError.SqlError
153
366
  > {
154
367
  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
- }))
160
-
161
- const existingIds = new Set<string>()
162
- if (entries.length > 0) {
163
- yield* sql`SELECT id FROM ${entryTableSql} WHERE ${
164
- sql.in(
165
- "id",
166
- entries.map((entry) => entry.id)
167
- )
168
- }`.pipe(
169
- Effect.flatMap(decodeEntryIdRows),
170
- Effect.tap((rows) =>
171
- Effect.sync(() => {
172
- for (const row of rows) {
173
- existingIds.add(Uuid.stringify(row.id))
174
- }
175
- })
176
- )
177
- )
178
- }
179
- if (entries.length > 0) {
180
- yield* insertEntries(entries.map(toEntryRow))
181
- }
182
- if (remoteRows.length > 0) {
183
- yield* insertRemotes(remoteRows)
184
- }
185
368
 
186
- const uncommitted = options.entries.filter((entry) => !existingIds.has(entry.entry.idString))
369
+ yield* lockWriters
370
+
371
+ const existingRows = yield* forEachChunk(
372
+ entries,
373
+ 1,
374
+ (chunk) => sql`SELECT id FROM ${entryTableSql} WHERE ${sql.in("id", chunk.map((entry) => entry.id))}`
375
+ ).pipe(Effect.flatMap(decodeEntryIdRows))
376
+ const existingIds = new Set(existingRows.map((row) => Uuid.stringify(row.id)))
377
+ // Overlapping batches can repeat an entry; the first copy wins.
378
+ const incomingIds = new Set<string>()
379
+ const uncommitted = options.entries.filter((entry) => {
380
+ const idString = entry.entry.idString
381
+ if (existingIds.has(idString) || incomingIds.has(idString)) return false
382
+ incomingIds.add(idString)
383
+ return true
384
+ })
187
385
  const duplicateEntries = options.entries
188
386
  .filter((entry) => existingIds.has(entry.entry.idString))
189
387
  .map((entry) => entry.entry)
@@ -191,56 +389,122 @@ export const make = (options?: {
191
389
  ? yield* options.compact(uncommitted)
192
390
  : uncommitted.map((remoteEntry) => remoteEntry.entry)
193
391
 
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(
203
- Effect.flatMap(decodeEntryRows),
392
+ if (Arr.isReadonlyArrayNonEmpty(compacted)) {
393
+ const index = new ConflictIndex(compacted)
394
+ const conflicts = (groups: ReadonlyArray<ConflictGroup>) => {
395
+ const events = Array.from(new Set(groups.map((group) => group.event)))
396
+ const primaryKeys = Array.from(new Set(groups.map((group) => group.primaryKey)))
397
+ return sql`SELECT * FROM ${entryTableSql} WHERE ${
398
+ sql.and([
399
+ // Match the hash index; exact predicates below rule out hash collisions.
400
+ ...sql.onDialectOrElse({
401
+ pg: () => [
402
+ sql`md5(event) IN (${sql.csv(events.map((event) => sql`md5(${event})`))})`,
403
+ sql`md5(primary_key) IN (${sql.csv(primaryKeys.map((primaryKey) => sql`md5(${primaryKey})`))})`
404
+ ],
405
+ orElse: () => []
406
+ }),
407
+ sql.in("event", events),
408
+ sql.in("primary_key", primaryKeys),
409
+ // A coarse filter: the index compares ids exactly.
410
+ sql`timestamp >= ${index.oldestMillis}`
411
+ ])
412
+ }`
413
+ }
414
+ // Each group binds its event and key, twice on PostgreSQL, and one
415
+ // parameter is left for the timestamp.
416
+ const groupsPerChunk = Math.floor((maxParameters - 1) / sql.onDialectOrElse({ pg: () => 4, orElse: () => 2 }))
417
+ const stored = yield* Effect.forEach(Arr.chunksOf(index.groups(), groupsPerChunk), conflicts).pipe(
418
+ Effect.flatMap((rows) => decodeEntryRows(rows.flat())),
204
419
  Effect.map(toEntries)
205
420
  )
206
- yield* options.effect({ entry, conflicts })
421
+ // Chunks can share an event and a key, so a row can be returned twice.
422
+ const added = new Set<string>()
423
+ for (const entry of stored) {
424
+ if (added.has(entry.idString)) continue
425
+ added.add(entry.idString)
426
+ index.add(entry)
427
+ }
428
+ yield* options.effect(index.toBatch())
207
429
  }
208
430
 
431
+ // Keep the incoming batch out of conflict queries and persist only after
432
+ // compaction and every callback have succeeded.
433
+ if (uncommitted.length > 0) {
434
+ const imported = uncommitted.map((remoteEntry) => remoteEntry.entry)
435
+ yield* insertEntries(imported.map(toEntryRow))
436
+ yield* insertSequence(imported)
437
+ yield* insertSources(imported, options.remoteId)
438
+ }
439
+ // The change stream is ordered, so every earlier sequence is now known.
440
+ if (options.entries.length > 0) {
441
+ yield* writeCursor(options.remoteId, EventJournal.nextSequenceAfter(options.entries))
442
+ }
443
+ yield* EventJournal.warnIfAhead(clock, uncommitted.map((remoteEntry) => remoteEntry.entry.id))
444
+
209
445
  return {
210
446
  duplicateEntries
211
447
  }
212
448
  })
213
449
 
450
+ // Other processes share the database but not the entry id sequence. Ids in
451
+ // the latest millisecond are few, and comparing them here avoids ordering
452
+ // id bytes in SQL.
453
+ const latestEntryIds = sql`
454
+ SELECT id FROM ${entryTableSql} WHERE timestamp = (SELECT MAX(timestamp) FROM ${entryTableSql})
455
+ `.pipe(
456
+ Effect.flatMap(decodeEntryIdRows),
457
+ Effect.map((rows) => rows.map((row) => row.id))
458
+ )
459
+
460
+ const writeMany: EventJournal.EventJournal["Service"]["writeMany"] = ({ effect, entries }) =>
461
+ Effect.uninterruptibleMask((restore) =>
462
+ Effect.gen(function*() {
463
+ yield* lockWriters
464
+ // Rows visible here include an enclosing transaction's uncommitted
465
+ // ones, which local ids must also sort after.
466
+ const committed = yield* EventJournal.makeEntries(entries, yield* latestEntryIds)
467
+ const result = yield* restore(effect(committed)).pipe(
468
+ Effect.mapError((error) => new CallbackFailure(error))
469
+ )
470
+ yield* insertEntries(committed.map(toEntryRow))
471
+ yield* insertSequence(committed)
472
+ return { result, committed }
473
+ }).pipe(
474
+ sql.withTransaction,
475
+ Effect.mapError((error) =>
476
+ error instanceof CallbackFailure
477
+ ? error.error
478
+ : error instanceof EventJournal.EventJournalError
479
+ ? error
480
+ : new EventJournal.EventJournalError({ cause: error, method: "writeMany" })
481
+ ),
482
+ Effect.flatMap(({ committed, result }) => Effect.as(PubSub.publishAll(pubsub, committed), result))
483
+ )
484
+ ).pipe(withTracerDisabled)
485
+
214
486
  return EventJournal.EventJournal.of({
215
487
  entries: sql`SELECT * FROM ${entryTableSql} ORDER BY timestamp ASC`.pipe(
216
488
  withTracerDisabled,
217
489
  Effect.flatMap(decodeEntryRows),
218
- Effect.map(toEntries),
490
+ Effect.map(toOrderedEntries),
219
491
  Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "entries" }))
220
492
  ),
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
- ),
493
+ entriesById: (ids) =>
494
+ forEachChunk(ids, 1, (chunk) => sql`SELECT * FROM ${entryTableSql} WHERE ${sql.in("id", chunk)}`).pipe(
495
+ withTracerDisabled,
496
+ Effect.flatMap(decodeEntryRows),
497
+ Effect.map((rows) => {
498
+ const byId = new Map(toEntries(rows).map((entry) => [entry.idString, entry]))
499
+ return ids.map((id) => byId.get(Uuid.stringify(id)))
500
+ }),
501
+ Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "entriesById" }))
502
+ ),
503
+ write: ({ effect, ...entry }) => writeMany({ entries: [entry], effect: (entries) => effect(entries[0]) }),
504
+ writeMany,
242
505
  writeFromRemote: (options) =>
243
506
  writeFromRemote(options).pipe(
507
+ sql.withTransaction,
244
508
  withTracerDisabled,
245
509
  Effect.catchIf(
246
510
  (e) => e._tag !== "EventJournalError",
@@ -249,36 +513,66 @@ export const make = (options?: {
249
513
  ),
250
514
  withRemoteUncommited: Effect.fnUntraced(
251
515
  function*(remoteId, f) {
516
+ const mapError = Effect.mapError((cause: unknown) =>
517
+ new EventJournal.EventJournalError({ cause, method: "withRemoteUncommited" })
518
+ )
519
+ // Capture an upper bound so entries committed during upload remain pending.
520
+ const [{ checkpoint, latest }] = yield* sql`
521
+ SELECT
522
+ COALESCE((SELECT sequence FROM ${checkpointsTableSql} WHERE remote_id = ${remoteId}), 0) AS checkpoint,
523
+ COALESCE((SELECT MAX(sequence) FROM ${sequenceTableSql}), 0) AS latest
524
+ `.pipe(Effect.flatMap(decodeUploadBounds), mapError)
525
+ if (latest <= checkpoint) return yield* Effect.succeedNone
252
526
  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
527
+ SELECT e.*
528
+ FROM ${sequenceTableSql} s
529
+ JOIN ${entryTableSql} e ON e.id = s.entry_id
530
+ WHERE s.sequence > ${checkpoint} AND
531
+ s.sequence <= ${latest} AND
532
+ NOT EXISTS (
533
+ SELECT 1 FROM ${sourcesTableSql} src WHERE src.entry_id = s.entry_id AND src.remote_id = ${remoteId}
534
+ )
257
535
  `.pipe(
258
536
  Effect.flatMap(decodeEntryRows),
259
- Effect.map(toEntries),
260
- Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "withRemoteUncommited" }))
537
+ Effect.map(toOrderedEntries),
538
+ mapError
539
+ )
540
+ // Uploads can complete out of order; the checkpoint only moves forward.
541
+ const saveCheckpoint = sql`
542
+ INSERT INTO ${checkpointsTableSql} ${sql.insert({ remote_id: remoteId, sequence: latest })}
543
+ ON CONFLICT (remote_id) DO UPDATE SET sequence = excluded.sequence
544
+ WHERE ${checkpointsTableSql}.sequence < excluded.sequence
545
+ `.pipe(mapError)
546
+ return yield* Effect.uninterruptibleMask((restore) =>
547
+ restore(Arr.isReadonlyArrayNonEmpty(entries) ? Effect.asSome(f(entries)) : Effect.succeedNone).pipe(
548
+ Effect.tap(saveCheckpoint)
549
+ )
261
550
  )
262
- if (!Arr.isReadonlyArrayNonEmpty(entries)) return yield* Effect.succeedNone
263
- return yield* Effect.asSome(f(entries))
264
551
  },
265
552
  withTracerDisabled
266
553
  ),
554
+ writeRemoteAcks: Effect.fnUntraced(
555
+ function*({ acks, firstSequence, remoteId }) {
556
+ if (acks.length === 0) return
557
+ const next = yield* readCursor(remoteId)
558
+ yield* writeCursor(remoteId, EventJournal.advanceSequence(next, acks, firstSequence))
559
+ },
560
+ (_) => sql.withTransaction(_),
561
+ (_) => withTracerDisabled(_),
562
+ Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "writeRemoteAcks" }))
563
+ ),
267
564
  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
- ),
565
+ readCursor(remoteId).pipe(
566
+ withTracerDisabled,
567
+ Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "nextRemoteSequence" }))
568
+ ),
278
569
  changes: PubSub.subscribe(pubsub),
279
570
  destroy: Effect.gen(function*() {
280
571
  yield* sql`DROP TABLE ${entryTableSql}`
281
- yield* sql`DROP TABLE ${remotesTableSql}`
572
+ yield* sql`DROP TABLE ${sequenceTableSql}`
573
+ yield* sql`DROP TABLE ${sourcesTableSql}`
574
+ yield* sql`DROP TABLE ${checkpointsTableSql}`
575
+ yield* sql`DROP TABLE ${remoteCursorsTableSql}`
282
576
  }).pipe(
283
577
  withTracerDisabled,
284
578
  Effect.mapError((cause) => new EventJournal.EventJournalError({ cause, method: "destroy" }))
@@ -293,25 +587,11 @@ export const make = (options?: {
293
587
  })
294
588
 
295
589
  /**
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`.
590
+ * Provides a SQL-backed `EventJournal` from an existing `SqlClient` service.
309
591
  *
310
592
  * **Gotchas**
311
593
  *
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.
594
+ * Creating or migrating the schema requires a writable connection.
315
595
  *
316
596
  * @see {@link make} for constructing the SQL-backed service directly
317
597
  * @see {@link EventJournal.layerMemory} for an in-memory `EventJournal` layer
@@ -324,6 +604,7 @@ export const make = (options?: {
324
604
  export const layer = (options?: {
325
605
  readonly entryTable?: string
326
606
  readonly remotesTable?: string
607
+ readonly remoteCursorsTable?: string
327
608
  }): Layer.Layer<EventJournal.EventJournal, SqlError.SqlError, SqlClient.SqlClient> =>
328
609
  Layer.effect(EventJournal.EventJournal)(make(options))
329
610
 
@@ -366,6 +647,10 @@ const EntryRow = Schema.Struct({
366
647
  })
367
648
 
368
649
  const EntryRowArray = Schema.Array(EntryRow)
650
+ const entryColumns = Object.keys(EntryRow.fields).length
651
+ const decodeUploadBounds = Schema.decodeUnknownEffect(Schema.Tuple([
652
+ Schema.Struct({ checkpoint: SqlNatural, latest: SqlNatural })
653
+ ]))
369
654
  const EntryIdRowArray = Schema.Array(Schema.Struct({ id: SqlEntryId }))
370
655
 
371
656
  type EntryRow = Schema.Schema.Type<typeof EntryRow>
@@ -386,12 +671,30 @@ const toEntryRow = (entry: EventJournal.Entry): EntryRow => ({
386
671
  timestamp: EventJournal.entryIdMillis(entry.id)
387
672
  })
388
673
 
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)
674
+ const CursorRowArray = Schema.Array(Schema.Struct({ next_sequence: SqlNatural }))
396
675
 
397
676
  const withTracerDisabled = Effect.withTracerEnabled(false)
677
+
678
+ // Statements bind at most this many parameters: Cloudflare Durable Object
679
+ // SQLite's per-statement limit, the lowest of the supported databases.
680
+ const maxParameters = 100
681
+
682
+ // Runs `f` in order over chunks of `values`, each binding `parametersPerValue`
683
+ // parameters per value, and concatenates the rows.
684
+ const forEachChunk = <A, B, E, R>(
685
+ values: ReadonlyArray<A>,
686
+ parametersPerValue: number,
687
+ f: (chunk: Arr.NonEmptyReadonlyArray<A>) => Effect.Effect<ReadonlyArray<B>, E, R>
688
+ ): Effect.Effect<Array<B>, E, R> =>
689
+ Effect.map(
690
+ Effect.forEach(Arr.chunksOf(values, Math.floor(maxParameters / parametersPerValue)), f),
691
+ (rows) => rows.flat()
692
+ )
693
+
694
+ // Preserve callback errors without wrapping them as journal SQL errors.
695
+ class CallbackFailure<E> {
696
+ readonly error: E
697
+ constructor(error: E) {
698
+ this.error = error
699
+ }
700
+ }