effect 4.0.4 → 4.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1079) hide show
  1. package/ai-docs/package.json +1 -1
  2. package/ai-docs/src/06_schedule/10_schedules.ts +5 -4
  3. package/ai-docs/src/52_graphql/10_basics.ts +19 -13
  4. package/ai-docs/src/52_graphql/30_batching.ts +6 -4
  5. package/ai-docs/src/52_graphql/40_aliased-batching.ts +6 -4
  6. package/ai-docs/tsconfig.json +3 -1
  7. package/dist/Array.d.ts +207 -58
  8. package/dist/Array.d.ts.map +1 -1
  9. package/dist/Array.js +45 -22
  10. package/dist/Array.js.map +1 -1
  11. package/dist/Bytes.d.ts +79 -0
  12. package/dist/Bytes.d.ts.map +1 -0
  13. package/dist/Bytes.js +109 -0
  14. package/dist/Bytes.js.map +1 -0
  15. package/dist/Channel.d.ts +187 -14
  16. package/dist/Channel.d.ts.map +1 -1
  17. package/dist/Channel.js +142 -33
  18. package/dist/Channel.js.map +1 -1
  19. package/dist/ChannelSchema.d.ts.map +1 -1
  20. package/dist/ChannelSchema.js.map +1 -1
  21. package/dist/Chunk.d.ts +39 -21
  22. package/dist/Chunk.d.ts.map +1 -1
  23. package/dist/Chunk.js +26 -17
  24. package/dist/Chunk.js.map +1 -1
  25. package/dist/Config.d.ts.map +1 -1
  26. package/dist/Config.js +8 -3
  27. package/dist/Config.js.map +1 -1
  28. package/dist/ConfigProvider.d.ts.map +1 -1
  29. package/dist/ConfigProvider.js +34 -32
  30. package/dist/ConfigProvider.js.map +1 -1
  31. package/dist/Cron.d.ts +2 -2
  32. package/dist/Cron.d.ts.map +1 -1
  33. package/dist/Cron.js +6 -3
  34. package/dist/Cron.js.map +1 -1
  35. package/dist/Duration.d.ts.map +1 -1
  36. package/dist/Duration.js +58 -21
  37. package/dist/Duration.js.map +1 -1
  38. package/dist/Effect.d.ts +548 -182
  39. package/dist/Effect.d.ts.map +1 -1
  40. package/dist/Effect.js +261 -76
  41. package/dist/Effect.js.map +1 -1
  42. package/dist/Equivalence.d.ts +2 -1
  43. package/dist/Equivalence.d.ts.map +1 -1
  44. package/dist/Equivalence.js +12 -8
  45. package/dist/Equivalence.js.map +1 -1
  46. package/dist/Exit.d.ts +24 -9
  47. package/dist/Exit.d.ts.map +1 -1
  48. package/dist/Exit.js +8 -3
  49. package/dist/Exit.js.map +1 -1
  50. package/dist/FiberHandle.d.ts +2 -0
  51. package/dist/FiberHandle.d.ts.map +1 -1
  52. package/dist/FiberHandle.js +9 -4
  53. package/dist/FiberHandle.js.map +1 -1
  54. package/dist/FiberMap.d.ts +2 -0
  55. package/dist/FiberMap.d.ts.map +1 -1
  56. package/dist/FiberMap.js +5 -2
  57. package/dist/FiberMap.js.map +1 -1
  58. package/dist/FileSystem.d.ts +28 -9
  59. package/dist/FileSystem.d.ts.map +1 -1
  60. package/dist/FileSystem.js +3 -0
  61. package/dist/FileSystem.js.map +1 -1
  62. package/dist/Graph.d.ts.map +1 -1
  63. package/dist/Graph.js.map +1 -1
  64. package/dist/HashSet.d.ts.map +1 -1
  65. package/dist/HashSet.js.map +1 -1
  66. package/dist/Iterable.d.ts.map +1 -1
  67. package/dist/Iterable.js +18 -17
  68. package/dist/Iterable.js.map +1 -1
  69. package/dist/JsonSchema.d.ts +9 -3
  70. package/dist/JsonSchema.d.ts.map +1 -1
  71. package/dist/JsonSchema.js +19 -3
  72. package/dist/JsonSchema.js.map +1 -1
  73. package/dist/Layer.d.ts.map +1 -1
  74. package/dist/Layer.js +2 -2
  75. package/dist/Layer.js.map +1 -1
  76. package/dist/ManagedRuntime.d.ts +19 -1
  77. package/dist/ManagedRuntime.d.ts.map +1 -1
  78. package/dist/ManagedRuntime.js +62 -6
  79. package/dist/ManagedRuntime.js.map +1 -1
  80. package/dist/Match.d.ts +20 -6
  81. package/dist/Match.d.ts.map +1 -1
  82. package/dist/Match.js +2 -2
  83. package/dist/Match.js.map +1 -1
  84. package/dist/Metric.d.ts +132 -0
  85. package/dist/Metric.d.ts.map +1 -1
  86. package/dist/Metric.js +197 -25
  87. package/dist/Metric.js.map +1 -1
  88. package/dist/MutableHashMap.d.ts.map +1 -1
  89. package/dist/MutableHashMap.js.map +1 -1
  90. package/dist/Number.js +2 -2
  91. package/dist/Number.js.map +1 -1
  92. package/dist/Optic.d.ts.map +1 -1
  93. package/dist/Optic.js.map +1 -1
  94. package/dist/Path.d.ts +37 -5
  95. package/dist/Path.d.ts.map +1 -1
  96. package/dist/Path.js +44 -6
  97. package/dist/Path.js.map +1 -1
  98. package/dist/PubSub.d.ts.map +1 -1
  99. package/dist/PubSub.js +12 -7
  100. package/dist/PubSub.js.map +1 -1
  101. package/dist/Queue.d.ts +4 -1
  102. package/dist/Queue.d.ts.map +1 -1
  103. package/dist/Queue.js +4 -1
  104. package/dist/Queue.js.map +1 -1
  105. package/dist/Random.d.ts.map +1 -1
  106. package/dist/Random.js +1 -1
  107. package/dist/Random.js.map +1 -1
  108. package/dist/RcMap.d.ts +12 -7
  109. package/dist/RcMap.d.ts.map +1 -1
  110. package/dist/RcMap.js +9 -6
  111. package/dist/RcMap.js.map +1 -1
  112. package/dist/Record.d.ts +51 -0
  113. package/dist/Record.d.ts.map +1 -1
  114. package/dist/Record.js +17 -0
  115. package/dist/Record.js.map +1 -1
  116. package/dist/Ref.d.ts.map +1 -1
  117. package/dist/Ref.js.map +1 -1
  118. package/dist/References.d.ts +5 -4
  119. package/dist/References.d.ts.map +1 -1
  120. package/dist/References.js +5 -4
  121. package/dist/References.js.map +1 -1
  122. package/dist/RequestResolver.d.ts +31 -1
  123. package/dist/RequestResolver.d.ts.map +1 -1
  124. package/dist/RequestResolver.js +39 -4
  125. package/dist/RequestResolver.js.map +1 -1
  126. package/dist/Resource.js +1 -1
  127. package/dist/Resource.js.map +1 -1
  128. package/dist/Runtime.d.ts +3 -3
  129. package/dist/Runtime.d.ts.map +1 -1
  130. package/dist/Runtime.js +18 -15
  131. package/dist/Runtime.js.map +1 -1
  132. package/dist/Schedule.d.ts.map +1 -1
  133. package/dist/Schedule.js.map +1 -1
  134. package/dist/Schema.d.ts +383 -326
  135. package/dist/Schema.d.ts.map +1 -1
  136. package/dist/Schema.js +338 -17
  137. package/dist/Schema.js.map +1 -1
  138. package/dist/SchemaAST.d.ts +5 -5
  139. package/dist/SchemaAST.d.ts.map +1 -1
  140. package/dist/SchemaAST.js +24 -8
  141. package/dist/SchemaAST.js.map +1 -1
  142. package/dist/SchemaGetter.d.ts +8 -3
  143. package/dist/SchemaGetter.d.ts.map +1 -1
  144. package/dist/SchemaGetter.js +15 -5
  145. package/dist/SchemaGetter.js.map +1 -1
  146. package/dist/SchemaIssue.d.ts +4 -4
  147. package/dist/SchemaIssue.d.ts.map +1 -1
  148. package/dist/SchemaIssue.js +29 -51
  149. package/dist/SchemaIssue.js.map +1 -1
  150. package/dist/SchemaRepresentation.d.ts +56 -1
  151. package/dist/SchemaRepresentation.d.ts.map +1 -1
  152. package/dist/SchemaRepresentation.js +18 -0
  153. package/dist/SchemaRepresentation.js.map +1 -1
  154. package/dist/SchemaTransformation.d.ts +1 -1
  155. package/dist/SchemaTransformation.js +1 -1
  156. package/dist/Scope.d.ts +12 -2
  157. package/dist/Scope.d.ts.map +1 -1
  158. package/dist/Scope.js +5 -0
  159. package/dist/Scope.js.map +1 -1
  160. package/dist/ScopedCache.d.ts +10 -7
  161. package/dist/ScopedCache.d.ts.map +1 -1
  162. package/dist/ScopedCache.js +9 -5
  163. package/dist/ScopedCache.js.map +1 -1
  164. package/dist/SemVer.d.ts +1196 -0
  165. package/dist/SemVer.d.ts.map +1 -0
  166. package/dist/SemVer.js +756 -0
  167. package/dist/SemVer.js.map +1 -0
  168. package/dist/SemVerRange.d.ts +559 -0
  169. package/dist/SemVerRange.d.ts.map +1 -0
  170. package/dist/SemVerRange.js +551 -0
  171. package/dist/SemVerRange.js.map +1 -0
  172. package/dist/Sink.d.ts.map +1 -1
  173. package/dist/Sink.js +6 -2
  174. package/dist/Sink.js.map +1 -1
  175. package/dist/Stream.d.ts +235 -8
  176. package/dist/Stream.d.ts.map +1 -1
  177. package/dist/Stream.js +145 -60
  178. package/dist/Stream.js.map +1 -1
  179. package/dist/String.d.ts +16 -2
  180. package/dist/String.d.ts.map +1 -1
  181. package/dist/String.js +25 -10
  182. package/dist/String.js.map +1 -1
  183. package/dist/TextDiff.d.ts +399 -0
  184. package/dist/TextDiff.d.ts.map +1 -0
  185. package/dist/TextDiff.js +634 -0
  186. package/dist/TextDiff.js.map +1 -0
  187. package/dist/TxHashMap.d.ts.map +1 -1
  188. package/dist/TxHashMap.js.map +1 -1
  189. package/dist/TxHashSet.d.ts.map +1 -1
  190. package/dist/TxHashSet.js.map +1 -1
  191. package/dist/TxRef.d.ts.map +1 -1
  192. package/dist/TxRef.js +3 -2
  193. package/dist/TxRef.js.map +1 -1
  194. package/dist/ai/AiError.d.ts +78 -14
  195. package/dist/ai/AiError.d.ts.map +1 -1
  196. package/dist/ai/AiError.js +51 -3
  197. package/dist/ai/AiError.js.map +1 -1
  198. package/dist/ai/Chat.d.ts +1 -2
  199. package/dist/ai/Chat.d.ts.map +1 -1
  200. package/dist/ai/Chat.js +6 -3
  201. package/dist/ai/Chat.js.map +1 -1
  202. package/dist/ai/Decision.d.ts +116 -20
  203. package/dist/ai/Decision.d.ts.map +1 -1
  204. package/dist/ai/Decision.js +37 -3
  205. package/dist/ai/Decision.js.map +1 -1
  206. package/dist/ai/DecisionModel.d.ts +129 -11
  207. package/dist/ai/DecisionModel.d.ts.map +1 -1
  208. package/dist/ai/DecisionModel.js +183 -95
  209. package/dist/ai/DecisionModel.js.map +1 -1
  210. package/dist/ai/EmbeddingModel.d.ts +10 -0
  211. package/dist/ai/EmbeddingModel.d.ts.map +1 -1
  212. package/dist/ai/EmbeddingModel.js +21 -7
  213. package/dist/ai/EmbeddingModel.js.map +1 -1
  214. package/dist/ai/LanguageModel.d.ts.map +1 -1
  215. package/dist/ai/LanguageModel.js +47 -35
  216. package/dist/ai/LanguageModel.js.map +1 -1
  217. package/dist/ai/McpClient.d.ts +289 -0
  218. package/dist/ai/McpClient.d.ts.map +1 -0
  219. package/dist/ai/McpClient.js +819 -0
  220. package/dist/ai/McpClient.js.map +1 -0
  221. package/dist/ai/McpClientError.d.ts +254 -0
  222. package/dist/ai/McpClientError.d.ts.map +1 -0
  223. package/dist/ai/McpClientError.js +260 -0
  224. package/dist/ai/McpClientError.js.map +1 -0
  225. package/dist/ai/McpProtocol.d.ts +2 -2
  226. package/dist/ai/McpProtocol.d.ts.map +1 -1
  227. package/dist/ai/McpSchema.d.ts +368 -235
  228. package/dist/ai/McpSchema.d.ts.map +1 -1
  229. package/dist/ai/McpSchema.js +94 -24
  230. package/dist/ai/McpSchema.js.map +1 -1
  231. package/dist/ai/McpServer.d.ts +6 -52
  232. package/dist/ai/McpServer.d.ts.map +1 -1
  233. package/dist/ai/McpServer.js +27 -50
  234. package/dist/ai/McpServer.js.map +1 -1
  235. package/dist/ai/Prompt.d.ts +22 -20
  236. package/dist/ai/Prompt.d.ts.map +1 -1
  237. package/dist/ai/Prompt.js +23 -1
  238. package/dist/ai/Prompt.js.map +1 -1
  239. package/dist/ai/Response.d.ts +148 -4
  240. package/dist/ai/Response.d.ts.map +1 -1
  241. package/dist/ai/Response.js +35 -37
  242. package/dist/ai/Response.js.map +1 -1
  243. package/dist/ai/Tool.d.ts +12 -4
  244. package/dist/ai/Tool.d.ts.map +1 -1
  245. package/dist/ai/Tool.js.map +1 -1
  246. package/dist/ai/Toolkit.d.ts +48 -1
  247. package/dist/ai/Toolkit.d.ts.map +1 -1
  248. package/dist/ai/Toolkit.js +65 -12
  249. package/dist/ai/Toolkit.js.map +1 -1
  250. package/dist/ai/index.d.ts +10 -0
  251. package/dist/ai/index.d.ts.map +1 -1
  252. package/dist/ai/index.js +10 -0
  253. package/dist/ai/index.js.map +1 -1
  254. package/dist/ai/internal/mcpCore.js.map +1 -1
  255. package/dist/ai/internal/mcpProtocol/v2024_11_05.js +1 -1
  256. package/dist/ai/internal/mcpProtocol/v2024_11_05.js.map +1 -1
  257. package/dist/ai/internal/mcpProtocol/v2025_03_26.js +1 -1
  258. package/dist/ai/internal/mcpProtocol/v2025_03_26.js.map +1 -1
  259. package/dist/ai/internal/mcpProtocol/v2025_06_18.js +2 -2
  260. package/dist/ai/internal/mcpProtocol/v2025_06_18.js.map +1 -1
  261. package/dist/ai/internal/mcpProtocol/v2025_11_25.js +2 -2
  262. package/dist/ai/internal/mcpProtocol/v2025_11_25.js.map +1 -1
  263. package/dist/ai/internal/mcpProtocol/v2026_07_28.js +4 -7
  264. package/dist/ai/internal/mcpProtocol/v2026_07_28.js.map +1 -1
  265. package/dist/ai/internal/mcpProtocol.js +16 -2
  266. package/dist/ai/internal/mcpProtocol.js.map +1 -1
  267. package/dist/ai/internal/mcpRuntime.js +3 -4
  268. package/dist/ai/internal/mcpRuntime.js.map +1 -1
  269. package/dist/ai/internal/mcpSchema/v2024_11_05.js +19 -13
  270. package/dist/ai/internal/mcpSchema/v2024_11_05.js.map +1 -1
  271. package/dist/ai/internal/mcpSchema/v2025_03_26.js +3 -2
  272. package/dist/ai/internal/mcpSchema/v2025_03_26.js.map +1 -1
  273. package/dist/ai/internal/mcpSchema/v2025_06_18.js +7 -7
  274. package/dist/ai/internal/mcpSchema/v2025_06_18.js.map +1 -1
  275. package/dist/ai/internal/mcpSchema/v2025_11_25.js +8 -8
  276. package/dist/ai/internal/mcpSchema/v2025_11_25.js.map +1 -1
  277. package/dist/ai/internal/mcpSchema/v2026_07_28.js +43 -42
  278. package/dist/ai/internal/mcpSchema/v2026_07_28.js.map +1 -1
  279. package/dist/cli/CliError.d.ts +42 -2
  280. package/dist/cli/CliError.d.ts.map +1 -1
  281. package/dist/cli/CliError.js +44 -5
  282. package/dist/cli/CliError.js.map +1 -1
  283. package/dist/cli/Command.d.ts +286 -2
  284. package/dist/cli/Command.d.ts.map +1 -1
  285. package/dist/cli/Command.js +107 -6
  286. package/dist/cli/Command.js.map +1 -1
  287. package/dist/cli/Completions.d.ts +10 -0
  288. package/dist/cli/Completions.d.ts.map +1 -1
  289. package/dist/cli/Completions.js.map +1 -1
  290. package/dist/cli/Flag.d.ts +215 -0
  291. package/dist/cli/Flag.d.ts.map +1 -1
  292. package/dist/cli/Flag.js +89 -0
  293. package/dist/cli/Flag.js.map +1 -1
  294. package/dist/cli/GlobalFlag.d.ts.map +1 -1
  295. package/dist/cli/GlobalFlag.js +3 -3
  296. package/dist/cli/GlobalFlag.js.map +1 -1
  297. package/dist/cli/Param.d.ts +194 -0
  298. package/dist/cli/Param.d.ts.map +1 -1
  299. package/dist/cli/Param.js +86 -0
  300. package/dist/cli/Param.js.map +1 -1
  301. package/dist/cli/TerminalCapabilities.d.ts +84 -0
  302. package/dist/cli/TerminalCapabilities.d.ts.map +1 -0
  303. package/dist/cli/TerminalCapabilities.js +122 -0
  304. package/dist/cli/TerminalCapabilities.js.map +1 -0
  305. package/dist/cli/index.d.ts +5 -0
  306. package/dist/cli/index.d.ts.map +1 -1
  307. package/dist/cli/index.js +5 -0
  308. package/dist/cli/index.js.map +1 -1
  309. package/dist/cli/internal/command.d.ts +2 -1
  310. package/dist/cli/internal/command.d.ts.map +1 -1
  311. package/dist/cli/internal/command.js +7 -3
  312. package/dist/cli/internal/command.js.map +1 -1
  313. package/dist/cli/internal/completions/bash.js +7 -5
  314. package/dist/cli/internal/completions/bash.js.map +1 -1
  315. package/dist/cli/internal/completions/descriptor.js +16 -1
  316. package/dist/cli/internal/completions/descriptor.js.map +1 -1
  317. package/dist/cli/internal/completions/fish.js +12 -10
  318. package/dist/cli/internal/completions/fish.js.map +1 -1
  319. package/dist/cli/internal/completions/powershell.js +20 -10
  320. package/dist/cli/internal/completions/powershell.js.map +1 -1
  321. package/dist/cli/internal/completions/zsh.js +15 -8
  322. package/dist/cli/internal/completions/zsh.js.map +1 -1
  323. package/dist/cli/internal/formatter.d.ts +2 -0
  324. package/dist/cli/internal/formatter.d.ts.map +1 -0
  325. package/dist/cli/internal/formatter.js +15 -0
  326. package/dist/cli/internal/formatter.js.map +1 -0
  327. package/dist/cli/internal/lexer.js +24 -10
  328. package/dist/cli/internal/lexer.js.map +1 -1
  329. package/dist/cli/internal/parser.js +35 -15
  330. package/dist/cli/internal/parser.js.map +1 -1
  331. package/dist/cli/internal/wizard.d.ts.map +1 -1
  332. package/dist/cli/internal/wizard.js +2 -1
  333. package/dist/cli/internal/wizard.js.map +1 -1
  334. package/dist/cluster/ClusterCron.d.ts +29 -1
  335. package/dist/cluster/ClusterCron.d.ts.map +1 -1
  336. package/dist/cluster/ClusterCron.js +64 -32
  337. package/dist/cluster/ClusterCron.js.map +1 -1
  338. package/dist/cluster/ClusterMetrics.d.ts +143 -7
  339. package/dist/cluster/ClusterMetrics.d.ts.map +1 -1
  340. package/dist/cluster/ClusterMetrics.js +151 -7
  341. package/dist/cluster/ClusterMetrics.js.map +1 -1
  342. package/dist/cluster/ClusterWorkflowEngine.d.ts +2 -1
  343. package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
  344. package/dist/cluster/ClusterWorkflowEngine.js +98 -18
  345. package/dist/cluster/ClusterWorkflowEngine.js.map +1 -1
  346. package/dist/cluster/Entity.d.ts +2 -0
  347. package/dist/cluster/Entity.d.ts.map +1 -1
  348. package/dist/cluster/Entity.js.map +1 -1
  349. package/dist/cluster/MessageStorage.d.ts +21 -0
  350. package/dist/cluster/MessageStorage.d.ts.map +1 -1
  351. package/dist/cluster/MessageStorage.js +20 -12
  352. package/dist/cluster/MessageStorage.js.map +1 -1
  353. package/dist/cluster/Runners.d.ts.map +1 -1
  354. package/dist/cluster/Runners.js +96 -37
  355. package/dist/cluster/Runners.js.map +1 -1
  356. package/dist/cluster/Sharding.d.ts +1 -0
  357. package/dist/cluster/Sharding.d.ts.map +1 -1
  358. package/dist/cluster/Sharding.js +95 -32
  359. package/dist/cluster/Sharding.js.map +1 -1
  360. package/dist/cluster/ShardingConfig.d.ts +20 -0
  361. package/dist/cluster/ShardingConfig.d.ts.map +1 -1
  362. package/dist/cluster/ShardingConfig.js +4 -0
  363. package/dist/cluster/ShardingConfig.js.map +1 -1
  364. package/dist/cluster/SqlMessageStorage.d.ts.map +1 -1
  365. package/dist/cluster/SqlMessageStorage.js +40 -50
  366. package/dist/cluster/SqlMessageStorage.js.map +1 -1
  367. package/dist/cluster/SqlRunnerStorage.d.ts +2 -2
  368. package/dist/cluster/SqlRunnerStorage.d.ts.map +1 -1
  369. package/dist/cluster/SqlRunnerStorage.js +10 -4
  370. package/dist/cluster/SqlRunnerStorage.js.map +1 -1
  371. package/dist/cluster/internal/entityManager.js +66 -9
  372. package/dist/cluster/internal/entityManager.js.map +1 -1
  373. package/dist/devtools/DevTools.d.ts +3 -2
  374. package/dist/devtools/DevTools.d.ts.map +1 -1
  375. package/dist/devtools/DevTools.js +3 -2
  376. package/dist/devtools/DevTools.js.map +1 -1
  377. package/dist/devtools/DevToolsClient.d.ts +11 -0
  378. package/dist/devtools/DevToolsClient.d.ts.map +1 -1
  379. package/dist/devtools/DevToolsClient.js +31 -4
  380. package/dist/devtools/DevToolsClient.js.map +1 -1
  381. package/dist/encoding/Base64Url.d.ts +29 -0
  382. package/dist/encoding/Base64Url.d.ts.map +1 -1
  383. package/dist/encoding/Base64Url.js +29 -0
  384. package/dist/encoding/Base64Url.js.map +1 -1
  385. package/dist/encoding/Ini.d.ts.map +1 -1
  386. package/dist/encoding/Ini.js +3 -0
  387. package/dist/encoding/Ini.js.map +1 -1
  388. package/dist/encoding/JsonArray.d.ts +270 -0
  389. package/dist/encoding/JsonArray.d.ts.map +1 -0
  390. package/dist/encoding/JsonArray.js +691 -0
  391. package/dist/encoding/JsonArray.js.map +1 -0
  392. package/dist/encoding/Ndjson.d.ts +43 -4
  393. package/dist/encoding/Ndjson.d.ts.map +1 -1
  394. package/dist/encoding/Ndjson.js +169 -18
  395. package/dist/encoding/Ndjson.js.map +1 -1
  396. package/dist/encoding/SchemaBinary.d.ts +9 -1
  397. package/dist/encoding/SchemaBinary.d.ts.map +1 -1
  398. package/dist/encoding/SchemaBinary.js +12 -19
  399. package/dist/encoding/SchemaBinary.js.map +1 -1
  400. package/dist/encoding/Sse.js +1 -1
  401. package/dist/encoding/Sse.js.map +1 -1
  402. package/dist/encoding/Tar.d.ts +309 -0
  403. package/dist/encoding/Tar.d.ts.map +1 -0
  404. package/dist/encoding/Tar.js +1182 -0
  405. package/dist/encoding/Tar.js.map +1 -0
  406. package/dist/encoding/Toml.js +3 -3
  407. package/dist/encoding/Toml.js.map +1 -1
  408. package/dist/encoding/Xml.d.ts +464 -0
  409. package/dist/encoding/Xml.d.ts.map +1 -0
  410. package/dist/encoding/Xml.js +1619 -0
  411. package/dist/encoding/Xml.js.map +1 -0
  412. package/dist/encoding/Yaml.d.ts +6 -2
  413. package/dist/encoding/Yaml.d.ts.map +1 -1
  414. package/dist/encoding/Yaml.js +97 -34
  415. package/dist/encoding/Yaml.js.map +1 -1
  416. package/dist/encoding/Zip.d.ts +413 -0
  417. package/dist/encoding/Zip.d.ts.map +1 -0
  418. package/dist/encoding/Zip.js +1255 -0
  419. package/dist/encoding/Zip.js.map +1 -0
  420. package/dist/encoding/index.d.ts +20 -0
  421. package/dist/encoding/index.d.ts.map +1 -1
  422. package/dist/encoding/index.js +20 -0
  423. package/dist/encoding/index.js.map +1 -1
  424. package/dist/eventlog/EventJournal.d.ts +90 -5
  425. package/dist/eventlog/EventJournal.d.ts.map +1 -1
  426. package/dist/eventlog/EventJournal.js +488 -228
  427. package/dist/eventlog/EventJournal.js.map +1 -1
  428. package/dist/eventlog/EventLog.d.ts +180 -12
  429. package/dist/eventlog/EventLog.d.ts.map +1 -1
  430. package/dist/eventlog/EventLog.js +394 -146
  431. package/dist/eventlog/EventLog.js.map +1 -1
  432. package/dist/eventlog/EventLogEncryption.d.ts +36 -30
  433. package/dist/eventlog/EventLogEncryption.d.ts.map +1 -1
  434. package/dist/eventlog/EventLogEncryption.js +97 -38
  435. package/dist/eventlog/EventLogEncryption.js.map +1 -1
  436. package/dist/eventlog/EventLogMessage.d.ts +74 -34
  437. package/dist/eventlog/EventLogMessage.d.ts.map +1 -1
  438. package/dist/eventlog/EventLogMessage.js +45 -11
  439. package/dist/eventlog/EventLogMessage.js.map +1 -1
  440. package/dist/eventlog/EventLogRemote.d.ts +45 -8
  441. package/dist/eventlog/EventLogRemote.d.ts.map +1 -1
  442. package/dist/eventlog/EventLogRemote.js +51 -14
  443. package/dist/eventlog/EventLogRemote.js.map +1 -1
  444. package/dist/eventlog/EventLogServer.d.ts +46 -3
  445. package/dist/eventlog/EventLogServer.d.ts.map +1 -1
  446. package/dist/eventlog/EventLogServer.js +119 -19
  447. package/dist/eventlog/EventLogServer.js.map +1 -1
  448. package/dist/eventlog/EventLogServerEncrypted.d.ts +23 -33
  449. package/dist/eventlog/EventLogServerEncrypted.d.ts.map +1 -1
  450. package/dist/eventlog/EventLogServerEncrypted.js +97 -70
  451. package/dist/eventlog/EventLogServerEncrypted.js.map +1 -1
  452. package/dist/eventlog/EventLogServerUnencrypted.d.ts +39 -5
  453. package/dist/eventlog/EventLogServerUnencrypted.d.ts.map +1 -1
  454. package/dist/eventlog/EventLogServerUnencrypted.js +151 -69
  455. package/dist/eventlog/EventLogServerUnencrypted.js.map +1 -1
  456. package/dist/eventlog/EventRow.d.ts +288 -0
  457. package/dist/eventlog/EventRow.d.ts.map +1 -0
  458. package/dist/eventlog/EventRow.js +435 -0
  459. package/dist/eventlog/EventRow.js.map +1 -0
  460. package/dist/eventlog/SqlEventJournal.d.ts +18 -18
  461. package/dist/eventlog/SqlEventJournal.d.ts.map +1 -1
  462. package/dist/eventlog/SqlEventJournal.js +387 -159
  463. package/dist/eventlog/SqlEventJournal.js.map +1 -1
  464. package/dist/eventlog/SqlEventLogServerEncrypted.d.ts +10 -18
  465. package/dist/eventlog/SqlEventLogServerEncrypted.d.ts.map +1 -1
  466. package/dist/eventlog/SqlEventLogServerEncrypted.js +179 -69
  467. package/dist/eventlog/SqlEventLogServerEncrypted.js.map +1 -1
  468. package/dist/eventlog/SqlEventLogServerUnencrypted.d.ts +23 -3
  469. package/dist/eventlog/SqlEventLogServerUnencrypted.d.ts.map +1 -1
  470. package/dist/eventlog/SqlEventLogServerUnencrypted.js +102 -51
  471. package/dist/eventlog/SqlEventLogServerUnencrypted.js.map +1 -1
  472. package/dist/eventlog/index.d.ts +5 -0
  473. package/dist/eventlog/index.d.ts.map +1 -1
  474. package/dist/eventlog/index.js +5 -0
  475. package/dist/eventlog/index.js.map +1 -1
  476. package/dist/eventlog/internal/conflicts.d.ts +47 -0
  477. package/dist/eventlog/internal/conflicts.d.ts.map +1 -0
  478. package/dist/eventlog/internal/conflicts.js +92 -0
  479. package/dist/eventlog/internal/conflicts.js.map +1 -0
  480. package/dist/graphql/GraphQLClient.d.ts.map +1 -1
  481. package/dist/graphql/GraphQLClient.js +12 -5
  482. package/dist/graphql/GraphQLClient.js.map +1 -1
  483. package/dist/graphql/GraphQLClientError.d.ts +2 -2
  484. package/dist/graphql/GraphQLClientError.d.ts.map +1 -1
  485. package/dist/graphql/GraphQLClientError.js +4 -18
  486. package/dist/graphql/GraphQLClientError.js.map +1 -1
  487. package/dist/graphql/GraphQLProtocol.d.ts +252 -11
  488. package/dist/graphql/GraphQLProtocol.d.ts.map +1 -1
  489. package/dist/graphql/GraphQLProtocol.js +99 -8
  490. package/dist/graphql/GraphQLProtocol.js.map +1 -1
  491. package/dist/graphql/GraphQLResolver.d.ts +3 -1
  492. package/dist/graphql/GraphQLResolver.d.ts.map +1 -1
  493. package/dist/graphql/GraphQLResolver.js +91 -19
  494. package/dist/graphql/GraphQLResolver.js.map +1 -1
  495. package/dist/http/FetchHttpClient.d.ts +13 -3
  496. package/dist/http/FetchHttpClient.d.ts.map +1 -1
  497. package/dist/http/FetchHttpClient.js +56 -6
  498. package/dist/http/FetchHttpClient.js.map +1 -1
  499. package/dist/http/FindMyWay/internal/router.js +12 -1
  500. package/dist/http/FindMyWay/internal/router.js.map +1 -1
  501. package/dist/http/Headers.d.ts +230 -3
  502. package/dist/http/Headers.d.ts.map +1 -1
  503. package/dist/http/Headers.js +267 -5
  504. package/dist/http/Headers.js.map +1 -1
  505. package/dist/http/HttpClient.d.ts +105 -0
  506. package/dist/http/HttpClient.d.ts.map +1 -1
  507. package/dist/http/HttpClient.js +69 -17
  508. package/dist/http/HttpClient.js.map +1 -1
  509. package/dist/http/HttpClientError.d.ts.map +1 -1
  510. package/dist/http/HttpClientError.js +8 -6
  511. package/dist/http/HttpClientError.js.map +1 -1
  512. package/dist/http/HttpClientRequest.d.ts +274 -7
  513. package/dist/http/HttpClientRequest.d.ts.map +1 -1
  514. package/dist/http/HttpClientRequest.js +91 -3
  515. package/dist/http/HttpClientRequest.js.map +1 -1
  516. package/dist/http/HttpClientResponse.d.ts +53 -0
  517. package/dist/http/HttpClientResponse.d.ts.map +1 -1
  518. package/dist/http/HttpClientResponse.js +47 -0
  519. package/dist/http/HttpClientResponse.js.map +1 -1
  520. package/dist/http/HttpEffect.d.ts +6 -2
  521. package/dist/http/HttpEffect.d.ts.map +1 -1
  522. package/dist/http/HttpEffect.js +21 -17
  523. package/dist/http/HttpEffect.js.map +1 -1
  524. package/dist/http/HttpIncomingMessage.d.ts +2 -1
  525. package/dist/http/HttpIncomingMessage.d.ts.map +1 -1
  526. package/dist/http/HttpIncomingMessage.js +3 -23
  527. package/dist/http/HttpIncomingMessage.js.map +1 -1
  528. package/dist/http/HttpMiddleware.d.ts +179 -2
  529. package/dist/http/HttpMiddleware.d.ts.map +1 -1
  530. package/dist/http/HttpMiddleware.js +226 -18
  531. package/dist/http/HttpMiddleware.js.map +1 -1
  532. package/dist/http/HttpRouter.d.ts.map +1 -1
  533. package/dist/http/HttpRouter.js +58 -14
  534. package/dist/http/HttpRouter.js.map +1 -1
  535. package/dist/http/HttpServerError.d.ts +5 -2
  536. package/dist/http/HttpServerError.d.ts.map +1 -1
  537. package/dist/http/HttpServerError.js +11 -7
  538. package/dist/http/HttpServerError.js.map +1 -1
  539. package/dist/http/HttpServerRequest.d.ts +25 -5
  540. package/dist/http/HttpServerRequest.d.ts.map +1 -1
  541. package/dist/http/HttpServerRequest.js +38 -12
  542. package/dist/http/HttpServerRequest.js.map +1 -1
  543. package/dist/http/HttpServerResponse.d.ts +17 -8
  544. package/dist/http/HttpServerResponse.d.ts.map +1 -1
  545. package/dist/http/HttpServerResponse.js +37 -21
  546. package/dist/http/HttpServerResponse.js.map +1 -1
  547. package/dist/http/HttpStaticServer.d.ts +0 -12
  548. package/dist/http/HttpStaticServer.d.ts.map +1 -1
  549. package/dist/http/HttpStaticServer.js +25 -17
  550. package/dist/http/HttpStaticServer.js.map +1 -1
  551. package/dist/http/HttpTraceContext.js +1 -1
  552. package/dist/http/HttpTraceContext.js.map +1 -1
  553. package/dist/http/MultipartParser/internal/contentType.d.ts +15 -1
  554. package/dist/http/MultipartParser/internal/contentType.d.ts.map +1 -1
  555. package/dist/http/MultipartParser/internal/contentType.js +87 -5
  556. package/dist/http/MultipartParser/internal/contentType.js.map +1 -1
  557. package/dist/http/MultipartParser/internal/headers.d.ts.map +1 -1
  558. package/dist/http/MultipartParser/internal/headers.js +4 -12
  559. package/dist/http/MultipartParser/internal/headers.js.map +1 -1
  560. package/dist/http/MultipartParser/internal/multipart.d.ts.map +1 -1
  561. package/dist/http/MultipartParser/internal/multipart.js +6 -27
  562. package/dist/http/MultipartParser/internal/multipart.js.map +1 -1
  563. package/dist/http/Url.d.ts.map +1 -1
  564. package/dist/http/Url.js +8 -2
  565. package/dist/http/Url.js.map +1 -1
  566. package/dist/http/UrlParams.d.ts +112 -8
  567. package/dist/http/UrlParams.d.ts.map +1 -1
  568. package/dist/http/UrlParams.js +141 -14
  569. package/dist/http/UrlParams.js.map +1 -1
  570. package/dist/http/internal/compression.d.ts +1 -1
  571. package/dist/http/internal/compression.d.ts.map +1 -1
  572. package/dist/http/internal/compression.js +2 -10
  573. package/dist/http/internal/compression.js.map +1 -1
  574. package/dist/http/internal/compressionBody.d.ts +2 -0
  575. package/dist/http/internal/compressionBody.d.ts.map +1 -0
  576. package/dist/http/internal/compressionBody.js +36 -0
  577. package/dist/http/internal/compressionBody.js.map +1 -0
  578. package/dist/http/internal/decompression.d.ts +2 -0
  579. package/dist/http/internal/decompression.d.ts.map +1 -0
  580. package/dist/http/internal/decompression.js +168 -0
  581. package/dist/http/internal/decompression.js.map +1 -0
  582. package/dist/http/internal/lazyStream.d.ts +2 -0
  583. package/dist/http/internal/lazyStream.d.ts.map +1 -0
  584. package/dist/http/internal/lazyStream.js +18 -0
  585. package/dist/http/internal/lazyStream.js.map +1 -0
  586. package/dist/http/internal/requestState.d.ts +2 -0
  587. package/dist/http/internal/requestState.d.ts.map +1 -0
  588. package/dist/http/internal/requestState.js +28 -0
  589. package/dist/http/internal/requestState.js.map +1 -0
  590. package/dist/http/internal/tracing.js +14 -4
  591. package/dist/http/internal/tracing.js.map +1 -1
  592. package/dist/http/internal/urlParams.d.ts +2 -0
  593. package/dist/http/internal/urlParams.d.ts.map +1 -0
  594. package/dist/http/internal/urlParams.js +4 -0
  595. package/dist/http/internal/urlParams.js.map +1 -0
  596. package/dist/http/internal/webResponse.d.ts +2 -0
  597. package/dist/http/internal/webResponse.d.ts.map +1 -0
  598. package/dist/http/internal/webResponse.js +12 -0
  599. package/dist/http/internal/webResponse.js.map +1 -0
  600. package/dist/http-api/HttpApi.js +1 -1
  601. package/dist/http-api/HttpApi.js.map +1 -1
  602. package/dist/http-api/HttpApiBuilder.d.ts.map +1 -1
  603. package/dist/http-api/HttpApiBuilder.js +121 -18
  604. package/dist/http-api/HttpApiBuilder.js.map +1 -1
  605. package/dist/http-api/HttpApiClient.d.ts +29 -4
  606. package/dist/http-api/HttpApiClient.d.ts.map +1 -1
  607. package/dist/http-api/HttpApiClient.js +85 -24
  608. package/dist/http-api/HttpApiClient.js.map +1 -1
  609. package/dist/http-api/HttpApiEndpoint.d.ts +55 -29
  610. package/dist/http-api/HttpApiEndpoint.d.ts.map +1 -1
  611. package/dist/http-api/HttpApiEndpoint.js +49 -5
  612. package/dist/http-api/HttpApiEndpoint.js.map +1 -1
  613. package/dist/http-api/HttpApiError.d.ts +58 -0
  614. package/dist/http-api/HttpApiError.d.ts.map +1 -1
  615. package/dist/http-api/HttpApiError.js +38 -12
  616. package/dist/http-api/HttpApiError.js.map +1 -1
  617. package/dist/http-api/HttpApiScalar.d.ts +2 -1
  618. package/dist/http-api/HttpApiScalar.d.ts.map +1 -1
  619. package/dist/http-api/HttpApiScalar.js +6 -3
  620. package/dist/http-api/HttpApiScalar.js.map +1 -1
  621. package/dist/http-api/HttpApiSchema.d.ts +191 -9
  622. package/dist/http-api/HttpApiSchema.d.ts.map +1 -1
  623. package/dist/http-api/HttpApiSchema.js +137 -4
  624. package/dist/http-api/HttpApiSchema.js.map +1 -1
  625. package/dist/http-api/HttpApiSwagger.d.ts +5 -0
  626. package/dist/http-api/HttpApiSwagger.d.ts.map +1 -1
  627. package/dist/http-api/HttpApiSwagger.js +14 -4
  628. package/dist/http-api/HttpApiSwagger.js.map +1 -1
  629. package/dist/http-api/HttpApiTest.d.ts +13 -2
  630. package/dist/http-api/HttpApiTest.d.ts.map +1 -1
  631. package/dist/http-api/HttpApiTest.js +30 -9
  632. package/dist/http-api/HttpApiTest.js.map +1 -1
  633. package/dist/http-api/OpenApi.d.ts +17 -3
  634. package/dist/http-api/OpenApi.d.ts.map +1 -1
  635. package/dist/http-api/OpenApi.js +57 -32
  636. package/dist/http-api/OpenApi.js.map +1 -1
  637. package/dist/http-api/internal/path.js +35 -10
  638. package/dist/http-api/internal/path.js.map +1 -1
  639. package/dist/index.d.ts +20 -0
  640. package/dist/index.d.ts.map +1 -1
  641. package/dist/index.js +20 -0
  642. package/dist/index.js.map +1 -1
  643. package/dist/internal/core.js +18 -2
  644. package/dist/internal/core.js.map +1 -1
  645. package/dist/internal/dateTime.js +19 -7
  646. package/dist/internal/dateTime.js.map +1 -1
  647. package/dist/internal/effect.js +89 -76
  648. package/dist/internal/effect.js.map +1 -1
  649. package/dist/internal/graphql.js +12 -2
  650. package/dist/internal/graphql.js.map +1 -1
  651. package/dist/internal/hashMap.js +2 -2
  652. package/dist/internal/hashMap.js.map +1 -1
  653. package/dist/internal/hydration.d.ts +2 -0
  654. package/dist/internal/hydration.d.ts.map +1 -0
  655. package/dist/internal/hydration.js +15 -0
  656. package/dist/internal/hydration.js.map +1 -0
  657. package/dist/internal/inflate.d.ts +2 -0
  658. package/dist/internal/inflate.d.ts.map +1 -0
  659. package/dist/internal/inflate.js +680 -0
  660. package/dist/internal/inflate.js.map +1 -0
  661. package/dist/internal/record.js +6 -0
  662. package/dist/internal/record.js.map +1 -1
  663. package/dist/internal/request.js +20 -7
  664. package/dist/internal/request.js.map +1 -1
  665. package/dist/internal/schedule.js +17 -22
  666. package/dist/internal/schedule.js.map +1 -1
  667. package/dist/internal/schema/fromJsonSchemaDocument.js +136 -126
  668. package/dist/internal/schema/fromJsonSchemaDocument.js.map +1 -1
  669. package/dist/internal/schema/interpreter.js +51 -36
  670. package/dist/internal/schema/interpreter.js.map +1 -1
  671. package/dist/internal/schema/standardSchema.js +34 -33
  672. package/dist/internal/schema/standardSchema.js.map +1 -1
  673. package/dist/internal/schema/toCodeDocument.js +7 -2
  674. package/dist/internal/schema/toCodeDocument.js.map +1 -1
  675. package/dist/internal/schema/toCodec.js +86 -1
  676. package/dist/internal/schema/toCodec.js.map +1 -1
  677. package/dist/internal/schema/toFormatter.js +5 -5
  678. package/dist/internal/schema/toFormatter.js.map +1 -1
  679. package/dist/internal/schema/toJsonSchemaDocument.js +60 -38
  680. package/dist/internal/schema/toJsonSchemaDocument.js.map +1 -1
  681. package/dist/internal/trie.js +1 -3
  682. package/dist/internal/trie.js.map +1 -1
  683. package/dist/internal/uuid.js +7 -3
  684. package/dist/internal/uuid.js.map +1 -1
  685. package/dist/internal/version.js +1 -1
  686. package/dist/net/NetAddress.d.ts.map +1 -1
  687. package/dist/net/NetAddress.js +2 -8
  688. package/dist/net/NetAddress.js.map +1 -1
  689. package/dist/observability/Otlp.d.ts +15 -0
  690. package/dist/observability/Otlp.d.ts.map +1 -1
  691. package/dist/observability/Otlp.js +3 -0
  692. package/dist/observability/Otlp.js.map +1 -1
  693. package/dist/observability/OtlpExporter.d.ts +8 -0
  694. package/dist/observability/OtlpExporter.d.ts.map +1 -1
  695. package/dist/observability/OtlpExporter.js +15 -13
  696. package/dist/observability/OtlpExporter.js.map +1 -1
  697. package/dist/observability/OtlpLogger.d.ts +17 -0
  698. package/dist/observability/OtlpLogger.d.ts.map +1 -1
  699. package/dist/observability/OtlpLogger.js +14 -1
  700. package/dist/observability/OtlpLogger.js.map +1 -1
  701. package/dist/observability/OtlpMetrics.d.ts +17 -0
  702. package/dist/observability/OtlpMetrics.d.ts.map +1 -1
  703. package/dist/observability/OtlpMetrics.js +18 -3
  704. package/dist/observability/OtlpMetrics.js.map +1 -1
  705. package/dist/observability/OtlpResource.d.ts +3 -1
  706. package/dist/observability/OtlpResource.d.ts.map +1 -1
  707. package/dist/observability/OtlpResource.js +11 -4
  708. package/dist/observability/OtlpResource.js.map +1 -1
  709. package/dist/observability/OtlpSerialization.d.ts +5 -0
  710. package/dist/observability/OtlpSerialization.d.ts.map +1 -1
  711. package/dist/observability/OtlpSerialization.js +14 -3
  712. package/dist/observability/OtlpSerialization.js.map +1 -1
  713. package/dist/observability/OtlpTracer.d.ts +17 -0
  714. package/dist/observability/OtlpTracer.d.ts.map +1 -1
  715. package/dist/observability/OtlpTracer.js +15 -2
  716. package/dist/observability/OtlpTracer.js.map +1 -1
  717. package/dist/observability/internal/protobuf.d.ts +0 -9
  718. package/dist/observability/internal/protobuf.d.ts.map +1 -1
  719. package/dist/observability/internal/protobuf.js +2 -10
  720. package/dist/observability/internal/protobuf.js.map +1 -1
  721. package/dist/persistence/PersistedCache.d.ts.map +1 -1
  722. package/dist/persistence/PersistedCache.js +1 -1
  723. package/dist/persistence/PersistedCache.js.map +1 -1
  724. package/dist/persistence/PersistedQueue.d.ts +6 -2
  725. package/dist/persistence/PersistedQueue.d.ts.map +1 -1
  726. package/dist/persistence/PersistedQueue.js +162 -84
  727. package/dist/persistence/PersistedQueue.js.map +1 -1
  728. package/dist/persistence/Persistence.d.ts +28 -0
  729. package/dist/persistence/Persistence.d.ts.map +1 -1
  730. package/dist/persistence/Persistence.js +36 -8
  731. package/dist/persistence/Persistence.js.map +1 -1
  732. package/dist/persistence/RateLimiter.d.ts.map +1 -1
  733. package/dist/persistence/RateLimiter.js +8 -12
  734. package/dist/persistence/RateLimiter.js.map +1 -1
  735. package/dist/persistence/UserDirectories.d.ts +129 -0
  736. package/dist/persistence/UserDirectories.d.ts.map +1 -0
  737. package/dist/persistence/UserDirectories.js +178 -0
  738. package/dist/persistence/UserDirectories.js.map +1 -0
  739. package/dist/persistence/index.d.ts +5 -0
  740. package/dist/persistence/index.d.ts.map +1 -1
  741. package/dist/persistence/index.js +5 -0
  742. package/dist/persistence/index.js.map +1 -1
  743. package/dist/process/ChildProcess.d.ts +2 -1
  744. package/dist/process/ChildProcess.d.ts.map +1 -1
  745. package/dist/process/ChildProcess.js.map +1 -1
  746. package/dist/reactivity/AsyncResult.d.ts +6 -0
  747. package/dist/reactivity/AsyncResult.d.ts.map +1 -1
  748. package/dist/reactivity/AsyncResult.js +28 -1
  749. package/dist/reactivity/AsyncResult.js.map +1 -1
  750. package/dist/reactivity/Atom.d.ts +69 -30
  751. package/dist/reactivity/Atom.d.ts.map +1 -1
  752. package/dist/reactivity/Atom.js +40 -15
  753. package/dist/reactivity/Atom.js.map +1 -1
  754. package/dist/reactivity/AtomHttpApi.d.ts +5 -5
  755. package/dist/reactivity/AtomHttpApi.d.ts.map +1 -1
  756. package/dist/reactivity/AtomHttpApi.js +1 -1
  757. package/dist/reactivity/AtomHttpApi.js.map +1 -1
  758. package/dist/reactivity/AtomRegistry.d.ts +2 -2
  759. package/dist/reactivity/AtomRegistry.d.ts.map +1 -1
  760. package/dist/reactivity/AtomRegistry.js +47 -10
  761. package/dist/reactivity/AtomRegistry.js.map +1 -1
  762. package/dist/reactivity/AtomRpc.d.ts +3 -3
  763. package/dist/reactivity/AtomRpc.d.ts.map +1 -1
  764. package/dist/reactivity/AtomRpc.js +1 -1
  765. package/dist/reactivity/AtomRpc.js.map +1 -1
  766. package/dist/reactivity/Hydration.d.ts.map +1 -1
  767. package/dist/reactivity/Hydration.js +46 -12
  768. package/dist/reactivity/Hydration.js.map +1 -1
  769. package/dist/reactivity/Reactivity.d.ts +71 -7
  770. package/dist/reactivity/Reactivity.d.ts.map +1 -1
  771. package/dist/reactivity/Reactivity.js +21 -12
  772. package/dist/reactivity/Reactivity.js.map +1 -1
  773. package/dist/rpc/Rpc.d.ts +18 -0
  774. package/dist/rpc/Rpc.d.ts.map +1 -1
  775. package/dist/rpc/Rpc.js +20 -0
  776. package/dist/rpc/Rpc.js.map +1 -1
  777. package/dist/rpc/RpcClient.d.ts +26 -2
  778. package/dist/rpc/RpcClient.d.ts.map +1 -1
  779. package/dist/rpc/RpcClient.js +202 -61
  780. package/dist/rpc/RpcClient.js.map +1 -1
  781. package/dist/rpc/RpcSerialization.d.ts +15 -0
  782. package/dist/rpc/RpcSerialization.d.ts.map +1 -1
  783. package/dist/rpc/RpcSerialization.js +21 -5
  784. package/dist/rpc/RpcSerialization.js.map +1 -1
  785. package/dist/rpc/RpcServer.d.ts.map +1 -1
  786. package/dist/rpc/RpcServer.js +9 -18
  787. package/dist/rpc/RpcServer.js.map +1 -1
  788. package/dist/schema/Model.d.ts +1 -1
  789. package/dist/schema/VariantSchema.d.ts +22 -3
  790. package/dist/schema/VariantSchema.d.ts.map +1 -1
  791. package/dist/schema/VariantSchema.js +32 -18
  792. package/dist/schema/VariantSchema.js.map +1 -1
  793. package/dist/socket/Socket.d.ts +23 -1
  794. package/dist/socket/Socket.d.ts.map +1 -1
  795. package/dist/socket/Socket.js +36 -3
  796. package/dist/socket/Socket.js.map +1 -1
  797. package/dist/sql/Migrator.d.ts.map +1 -1
  798. package/dist/sql/Migrator.js +15 -3
  799. package/dist/sql/Migrator.js.map +1 -1
  800. package/dist/sql/SqlClient.d.ts +151 -12
  801. package/dist/sql/SqlClient.d.ts.map +1 -1
  802. package/dist/sql/SqlClient.js +156 -34
  803. package/dist/sql/SqlClient.js.map +1 -1
  804. package/dist/sql/SqlResolver.d.ts +9 -0
  805. package/dist/sql/SqlResolver.d.ts.map +1 -1
  806. package/dist/sql/SqlResolver.js +9 -0
  807. package/dist/sql/SqlResolver.js.map +1 -1
  808. package/dist/sql/Statement.d.ts +3 -1
  809. package/dist/sql/Statement.d.ts.map +1 -1
  810. package/dist/sql/Statement.js +24 -5
  811. package/dist/sql/Statement.js.map +1 -1
  812. package/dist/testing/TestClock.d.ts +16 -3
  813. package/dist/testing/TestClock.d.ts.map +1 -1
  814. package/dist/testing/TestClock.js +115 -23
  815. package/dist/testing/TestClock.js.map +1 -1
  816. package/dist/testing/TestSchema.d.ts +7 -1
  817. package/dist/testing/TestSchema.d.ts.map +1 -1
  818. package/dist/testing/TestSchema.js +9 -3
  819. package/dist/testing/TestSchema.js.map +1 -1
  820. package/dist/workflow/Activity.js +1 -0
  821. package/dist/workflow/Activity.js.map +1 -1
  822. package/dist/workflow/Workflow.d.ts +22 -0
  823. package/dist/workflow/Workflow.d.ts.map +1 -1
  824. package/dist/workflow/Workflow.js +15 -3
  825. package/dist/workflow/Workflow.js.map +1 -1
  826. package/dist/workflow/WorkflowEngine.d.ts +20 -1
  827. package/dist/workflow/WorkflowEngine.d.ts.map +1 -1
  828. package/dist/workflow/WorkflowEngine.js +52 -24
  829. package/dist/workflow/WorkflowEngine.js.map +1 -1
  830. package/package.json +13 -3
  831. package/src/Array.ts +223 -61
  832. package/src/Bytes.ts +111 -0
  833. package/src/Channel.ts +287 -439
  834. package/src/ChannelSchema.ts +1 -49
  835. package/src/Chunk.ts +55 -61
  836. package/src/Config.ts +12 -86
  837. package/src/ConfigProvider.ts +41 -44
  838. package/src/Cron.ts +6 -3
  839. package/src/Duration.ts +70 -21
  840. package/src/Effect.ts +642 -220
  841. package/src/Equivalence.ts +7 -4
  842. package/src/Exit.ts +24 -9
  843. package/src/FiberHandle.ts +10 -9
  844. package/src/FiberMap.ts +13 -66
  845. package/src/FileSystem.ts +33 -9
  846. package/src/Graph.ts +171 -1263
  847. package/src/HashSet.ts +0 -60
  848. package/src/Iterable.ts +15 -14
  849. package/src/JsonSchema.ts +28 -3
  850. package/src/Layer.ts +2 -2
  851. package/src/ManagedRuntime.ts +72 -6
  852. package/src/Match.ts +65 -12
  853. package/src/Metric.ts +249 -507
  854. package/src/MutableHashMap.ts +4 -473
  855. package/src/Number.ts +2 -2
  856. package/src/Optic.ts +17 -332
  857. package/src/Path.ts +61 -8
  858. package/src/PubSub.ts +12 -7
  859. package/src/Queue.ts +5 -37
  860. package/src/Random.ts +1 -1
  861. package/src/RcMap.ts +14 -8
  862. package/src/Record.ts +51 -0
  863. package/src/Ref.ts +7 -104
  864. package/src/References.ts +5 -4
  865. package/src/RequestResolver.ts +46 -87
  866. package/src/Resource.ts +1 -1
  867. package/src/Runtime.ts +19 -18
  868. package/src/Schedule.ts +2 -94
  869. package/src/Schema.ts +596 -348
  870. package/src/SchemaAST.ts +20 -9
  871. package/src/SchemaGetter.ts +22 -5
  872. package/src/SchemaIssue.ts +44 -53
  873. package/src/SchemaRepresentation.ts +64 -1
  874. package/src/SchemaTransformation.ts +1 -1
  875. package/src/Scope.ts +12 -2
  876. package/src/ScopedCache.ts +17 -142
  877. package/src/SemVer.ts +1528 -0
  878. package/src/SemVerRange.ts +883 -0
  879. package/src/Sink.ts +6 -2
  880. package/src/Stream.ts +334 -1011
  881. package/src/String.ts +25 -12
  882. package/src/TextDiff.ts +766 -0
  883. package/src/TxHashMap.ts +1 -103
  884. package/src/TxHashSet.ts +48 -753
  885. package/src/TxRef.ts +4 -2
  886. package/src/ai/AiError.ts +69 -5
  887. package/src/ai/Chat.ts +10 -5
  888. package/src/ai/Decision.ts +119 -22
  889. package/src/ai/DecisionModel.ts +265 -109
  890. package/src/ai/EmbeddingModel.ts +25 -13
  891. package/src/ai/LanguageModel.ts +57 -51
  892. package/src/ai/McpClient.ts +1211 -0
  893. package/src/ai/McpClientError.ts +329 -0
  894. package/src/ai/McpProtocol.ts +2 -2
  895. package/src/ai/McpSchema.ts +153 -35
  896. package/src/ai/McpServer.ts +232 -275
  897. package/src/ai/Prompt.ts +49 -35
  898. package/src/ai/Response.ts +195 -65
  899. package/src/ai/Tool.ts +12 -4
  900. package/src/ai/Toolkit.ts +78 -10
  901. package/src/ai/index.ts +12 -0
  902. package/src/ai/internal/mcpCore.ts +13 -14
  903. package/src/ai/internal/mcpProtocol/v2024_11_05.ts +1 -1
  904. package/src/ai/internal/mcpProtocol/v2025_03_26.ts +1 -1
  905. package/src/ai/internal/mcpProtocol/v2025_06_18.ts +3 -3
  906. package/src/ai/internal/mcpProtocol/v2025_11_25.ts +3 -3
  907. package/src/ai/internal/mcpProtocol/v2026_07_28.ts +12 -14
  908. package/src/ai/internal/mcpProtocol.ts +22 -2
  909. package/src/ai/internal/mcpRuntime.ts +3 -4
  910. package/src/ai/internal/mcpSchema/v2024_11_05.ts +20 -13
  911. package/src/ai/internal/mcpSchema/v2025_03_26.ts +4 -2
  912. package/src/ai/internal/mcpSchema/v2025_06_18.ts +7 -7
  913. package/src/ai/internal/mcpSchema/v2025_11_25.ts +8 -8
  914. package/src/ai/internal/mcpSchema/v2026_07_28.ts +44 -42
  915. package/src/cli/CliError.ts +49 -4
  916. package/src/cli/Command.ts +316 -9
  917. package/src/cli/Completions.ts +10 -0
  918. package/src/cli/Flag.ts +218 -0
  919. package/src/cli/GlobalFlag.ts +3 -3
  920. package/src/cli/Param.ts +218 -0
  921. package/src/cli/TerminalCapabilities.ts +156 -0
  922. package/src/cli/index.ts +6 -0
  923. package/src/cli/internal/command.ts +10 -4
  924. package/src/cli/internal/completions/bash.ts +7 -5
  925. package/src/cli/internal/completions/descriptor.ts +20 -1
  926. package/src/cli/internal/completions/fish.ts +12 -10
  927. package/src/cli/internal/completions/powershell.ts +25 -13
  928. package/src/cli/internal/completions/zsh.ts +15 -8
  929. package/src/cli/internal/formatter.ts +18 -0
  930. package/src/cli/internal/lexer.ts +12 -5
  931. package/src/cli/internal/parser.ts +43 -14
  932. package/src/cli/internal/wizard.ts +2 -1
  933. package/src/cluster/ClusterCron.ts +94 -35
  934. package/src/cluster/ClusterMetrics.ts +149 -7
  935. package/src/cluster/ClusterWorkflowEngine.ts +164 -53
  936. package/src/cluster/Entity.ts +4 -0
  937. package/src/cluster/MessageStorage.ts +21 -3
  938. package/src/cluster/Runners.ts +145 -72
  939. package/src/cluster/Sharding.ts +118 -38
  940. package/src/cluster/ShardingConfig.ts +15 -0
  941. package/src/cluster/SqlMessageStorage.ts +58 -55
  942. package/src/cluster/SqlRunnerStorage.ts +10 -4
  943. package/src/cluster/internal/entityManager.ts +81 -11
  944. package/src/devtools/DevTools.ts +3 -2
  945. package/src/devtools/DevToolsClient.ts +27 -10
  946. package/src/encoding/Base64Url.ts +31 -0
  947. package/src/encoding/Ini.ts +3 -0
  948. package/src/encoding/JsonArray.ts +849 -0
  949. package/src/encoding/Ndjson.ts +211 -20
  950. package/src/encoding/SchemaBinary.ts +14 -48
  951. package/src/encoding/Sse.ts +1 -1
  952. package/src/encoding/Tar.ts +1417 -0
  953. package/src/encoding/Toml.ts +3 -3
  954. package/src/encoding/Xml.ts +2037 -0
  955. package/src/encoding/Yaml.ts +108 -36
  956. package/src/encoding/Zip.ts +1558 -0
  957. package/src/encoding/index.ts +24 -0
  958. package/src/eventlog/EventJournal.ts +611 -227
  959. package/src/eventlog/EventLog.ts +496 -196
  960. package/src/eventlog/EventLogEncryption.ts +128 -43
  961. package/src/eventlog/EventLogMessage.ts +62 -11
  962. package/src/eventlog/EventLogRemote.ts +77 -21
  963. package/src/eventlog/EventLogServer.ts +162 -20
  964. package/src/eventlog/EventLogServerEncrypted.ts +121 -80
  965. package/src/eventlog/EventLogServerUnencrypted.ts +180 -77
  966. package/src/eventlog/EventRow.ts +706 -0
  967. package/src/eventlog/SqlEventJournal.ts +453 -173
  968. package/src/eventlog/SqlEventLogServerEncrypted.ts +212 -83
  969. package/src/eventlog/SqlEventLogServerUnencrypted.ts +141 -62
  970. package/src/eventlog/index.ts +6 -0
  971. package/src/eventlog/internal/conflicts.ts +123 -0
  972. package/src/graphql/GraphQLClient.ts +17 -5
  973. package/src/graphql/GraphQLClientError.ts +5 -12
  974. package/src/graphql/GraphQLProtocol.ts +277 -20
  975. package/src/graphql/GraphQLResolver.ts +109 -230
  976. package/src/http/FetchHttpClient.ts +61 -8
  977. package/src/http/FindMyWay/internal/router.ts +13 -1
  978. package/src/http/Headers.ts +343 -163
  979. package/src/http/HttpClient.ts +144 -136
  980. package/src/http/HttpClientError.ts +10 -6
  981. package/src/http/HttpClientRequest.ts +315 -11
  982. package/src/http/HttpClientResponse.ts +71 -0
  983. package/src/http/HttpEffect.ts +25 -33
  984. package/src/http/HttpIncomingMessage.ts +3 -23
  985. package/src/http/HttpMiddleware.ts +265 -28
  986. package/src/http/HttpRouter.ts +67 -14
  987. package/src/http/HttpServerError.ts +14 -7
  988. package/src/http/HttpServerRequest.ts +73 -14
  989. package/src/http/HttpServerResponse.ts +49 -23
  990. package/src/http/HttpStaticServer.ts +29 -19
  991. package/src/http/HttpTraceContext.ts +1 -1
  992. package/src/http/MultipartParser/internal/contentType.ts +107 -6
  993. package/src/http/MultipartParser/internal/headers.ts +4 -16
  994. package/src/http/MultipartParser/internal/multipart.ts +10 -32
  995. package/src/http/Url.ts +8 -2
  996. package/src/http/UrlParams.ts +225 -26
  997. package/src/http/internal/compression.ts +3 -17
  998. package/src/http/internal/compressionBody.ts +56 -0
  999. package/src/http/internal/decompression.ts +235 -0
  1000. package/src/http/internal/lazyStream.ts +25 -0
  1001. package/src/http/internal/requestState.ts +33 -0
  1002. package/src/http/internal/tracing.ts +21 -4
  1003. package/src/http/internal/urlParams.ts +5 -0
  1004. package/src/http/internal/webResponse.ts +20 -0
  1005. package/src/http-api/HttpApi.ts +1 -1
  1006. package/src/http-api/HttpApiBuilder.ts +151 -23
  1007. package/src/http-api/HttpApiClient.ts +160 -31
  1008. package/src/http-api/HttpApiEndpoint.ts +144 -33
  1009. package/src/http-api/HttpApiError.ts +55 -0
  1010. package/src/http-api/HttpApiScalar.ts +4 -3
  1011. package/src/http-api/HttpApiSchema.ts +275 -13
  1012. package/src/http-api/HttpApiSwagger.ts +11 -4
  1013. package/src/http-api/HttpApiTest.ts +33 -9
  1014. package/src/http-api/OpenApi.ts +84 -42
  1015. package/src/http-api/internal/path.ts +40 -12
  1016. package/src/index.ts +24 -0
  1017. package/src/internal/core.ts +22 -2
  1018. package/src/internal/dateTime.ts +20 -7
  1019. package/src/internal/effect.ts +125 -88
  1020. package/src/internal/graphql.ts +30 -7
  1021. package/src/internal/hashMap.ts +2 -2
  1022. package/src/internal/hydration.ts +15 -0
  1023. package/src/internal/inflate.ts +710 -0
  1024. package/src/internal/record.ts +6 -0
  1025. package/src/internal/request.ts +21 -6
  1026. package/src/internal/schedule.ts +20 -39
  1027. package/src/internal/schema/fromJsonSchemaDocument.ts +262 -193
  1028. package/src/internal/schema/interpreter.ts +58 -45
  1029. package/src/internal/schema/standardSchema.ts +32 -30
  1030. package/src/internal/schema/toCodeDocument.ts +8 -3
  1031. package/src/internal/schema/toCodec.ts +116 -1
  1032. package/src/internal/schema/toFormatter.ts +6 -6
  1033. package/src/internal/schema/toJsonSchemaDocument.ts +69 -39
  1034. package/src/internal/trie.ts +1 -3
  1035. package/src/internal/uuid.ts +15 -10
  1036. package/src/internal/version.ts +1 -1
  1037. package/src/net/NetAddress.ts +2 -9
  1038. package/src/observability/Otlp.ts +18 -0
  1039. package/src/observability/OtlpExporter.ts +19 -15
  1040. package/src/observability/OtlpLogger.ts +31 -2
  1041. package/src/observability/OtlpMetrics.ts +35 -4
  1042. package/src/observability/OtlpResource.ts +16 -6
  1043. package/src/observability/OtlpSerialization.ts +17 -3
  1044. package/src/observability/OtlpTracer.ts +32 -3
  1045. package/src/observability/internal/protobuf.ts +2 -10
  1046. package/src/persistence/PersistedCache.ts +3 -1
  1047. package/src/persistence/PersistedQueue.ts +223 -153
  1048. package/src/persistence/Persistence.ts +64 -30
  1049. package/src/persistence/RateLimiter.ts +18 -21
  1050. package/src/persistence/UserDirectories.ts +273 -0
  1051. package/src/persistence/index.ts +6 -0
  1052. package/src/process/ChildProcess.ts +2 -1
  1053. package/src/reactivity/AsyncResult.ts +35 -38
  1054. package/src/reactivity/Atom.ts +134 -166
  1055. package/src/reactivity/AtomHttpApi.ts +10 -16
  1056. package/src/reactivity/AtomRegistry.ts +53 -30
  1057. package/src/reactivity/AtomRpc.ts +6 -22
  1058. package/src/reactivity/Hydration.ts +53 -12
  1059. package/src/reactivity/Reactivity.ts +97 -39
  1060. package/src/rpc/Rpc.ts +21 -0
  1061. package/src/rpc/RpcClient.ts +285 -104
  1062. package/src/rpc/RpcSerialization.ts +21 -5
  1063. package/src/rpc/RpcServer.ts +11 -20
  1064. package/src/schema/VariantSchema.ts +86 -22
  1065. package/src/socket/Socket.ts +45 -20
  1066. package/src/sql/Migrator.ts +19 -9
  1067. package/src/sql/SqlClient.ts +275 -36
  1068. package/src/sql/SqlResolver.ts +9 -0
  1069. package/src/sql/Statement.ts +35 -8
  1070. package/src/testing/TestClock.ts +147 -29
  1071. package/src/testing/TestSchema.ts +9 -3
  1072. package/src/workflow/Activity.ts +1 -0
  1073. package/src/workflow/Workflow.ts +31 -5
  1074. package/src/workflow/WorkflowEngine.ts +93 -31
  1075. package/dist/http/internal/preResponseHandler.d.ts +0 -2
  1076. package/dist/http/internal/preResponseHandler.d.ts.map +0 -1
  1077. package/dist/http/internal/preResponseHandler.js +0 -14
  1078. package/dist/http/internal/preResponseHandler.js.map +0 -1
  1079. package/src/http/internal/preResponseHandler.ts +0 -19
@@ -13,17 +13,20 @@
13
13
  * @since 4.0.0
14
14
  */
15
15
  import * as Arr from "../Array.js";
16
+ import * as Clock from "../Clock.js";
16
17
  import * as Context from "../Context.js";
17
18
  import * as Data from "../Data.js";
18
19
  import * as DateTime from "../DateTime.js";
19
20
  import * as Effect from "../Effect.js";
20
21
  import * as SchemaBinary from "../encoding/SchemaBinary.js";
22
+ import { constVoid } from "../Function.js";
21
23
  import * as Uuid from "../internal/uuid.js";
22
24
  import * as Layer from "../Layer.js";
23
25
  import * as Order from "../Order.js";
24
26
  import * as PubSub from "../PubSub.js";
25
27
  import * as Schema from "../Schema.js";
26
28
  import * as Semaphore from "../Semaphore.js";
29
+ import { ConflictIndex, entryIdOrder } from "./internal/conflicts.js";
27
30
  /**
28
31
  * Context service for storing and replaying event journal entries.
29
32
  *
@@ -32,6 +35,9 @@ import * as Semaphore from "../Semaphore.js";
32
35
  * The service writes local entries, imports entries from remote journals, exposes
33
36
  * a stream of local changes, and provides per-store locking.
34
37
  *
38
+ * Entries written by `EventLog` carry payloads encoded with their event's
39
+ * `payloadSchemaBinary`; see {@link Entry} for how to decode them.
40
+ *
35
41
  * @stability unstable
36
42
  * @category services
37
43
  * @since 4.0.0
@@ -115,14 +121,50 @@ export const EntryId = /*#__PURE__*/Schema.Uint8Array.pipe(/*#__PURE__*/Schema.b
115
121
  * @category ordering
116
122
  * @since 4.0.0
117
123
  */
118
- export const EntryIdOrder = /*#__PURE__*/Order.make((a, b) => {
119
- for (let i = 0; i < 16; i++) {
120
- if (a[i] !== b[i]) {
121
- return a[i] - b[i] < 0 ? -1 : 1;
122
- }
124
+ export const EntryIdOrder = entryIdOrder;
125
+ const maxEntryIdMillis = 2 ** 48 - 1;
126
+ const processEntryIds = {
127
+ millis: 0,
128
+ counter: 0
129
+ };
130
+ const nextEntryId = (sequence, now) => {
131
+ if (now > sequence.millis) {
132
+ sequence.millis = now;
133
+ sequence.counter = 0;
134
+ } else if (++sequence.counter > 0xfff) {
135
+ sequence.millis++;
136
+ sequence.counter = 0;
123
137
  }
124
- return 0;
125
- });
138
+ // The sequence only moves forward, so once exhausted it stays exhausted.
139
+ if (sequence.millis > maxEntryIdMillis) {
140
+ throw new RangeError("The entry id sequence has passed the last UUID v7 millisecond");
141
+ }
142
+ const bytes = Uuid.v7Bytes(sequence.millis);
143
+ // The counter replaces the 12 random `rand_a` bits after the version.
144
+ bytes[6] = 0x70 | sequence.counter >> 8;
145
+ bytes[7] = sequence.counter & 0xff;
146
+ return bytes;
147
+ };
148
+ // The process sequence, or a copy advanced to `floor` when that is later. The
149
+ // copy is never written back, so a floor read from uncommitted rows leaves the
150
+ // process sequence alone.
151
+ const sequenceAfter = floor => {
152
+ if (floor === undefined) return processEntryIds;
153
+ const millis = entryIdMillis(floor);
154
+ // Continuing from the floor's `rand_a` sorts the next id after it.
155
+ const counter = (floor[6] & 0x0f) << 8 | floor[7];
156
+ return millis > processEntryIds.millis || millis === processEntryIds.millis && counter > processEntryIds.counter ? {
157
+ millis,
158
+ counter
159
+ } : processEntryIds;
160
+ };
161
+ const maxEntryId = ids => {
162
+ let latest;
163
+ for (const id of ids) {
164
+ if (latest === undefined || EntryIdOrder(id, latest) === 1) latest = id;
165
+ }
166
+ return latest;
167
+ };
126
168
  /**
127
169
  * Generates a UUID v7 `EntryId`, optionally using the supplied millisecond
128
170
  * timestamp.
@@ -132,16 +174,54 @@ export const EntryIdOrder = /*#__PURE__*/Order.make((a, b) => {
132
174
  * Use when generating an event-log entry id internally and the UUID v7 bytes
133
175
  * are trusted to satisfy the brand.
134
176
  *
177
+ * **Details**
178
+ *
179
+ * Ids taken from the clock are strictly ascending within the current process.
180
+ * Ids created in the same millisecond carry an incrementing 12-bit counter. If
181
+ * the clock stalls or moves backwards, ids keep the last millisecond, and
182
+ * after 4096 ids in one millisecond they move to the next one.
183
+ *
184
+ * The journals generate local ids from this sequence, or from a copy of it
185
+ * advanced past the latest id in their store, so a local id sorts after every
186
+ * entry committed to that store, even when the local clock is behind.
187
+ *
135
188
  * **Gotchas**
136
189
  *
137
190
  * This is unsafe because the generated UUID bytes are cast to the brand without
138
191
  * schema validation.
139
192
  *
193
+ * Throws a `RangeError` once the sequence passes the last UUID v7 millisecond.
194
+ * Every later call throws too, because any id it could return would sort before
195
+ * one already generated.
196
+ *
197
+ * Ids created with an explicit `msecs` are not part of the sequence, and clamp
198
+ * to the UUID v7 range.
199
+ *
140
200
  * @stability unstable
141
201
  * @category unsafe
142
202
  * @since 4.0.0
143
203
  */
144
- export const makeEntryIdUnsafe = (options = {}) => Uuid.v7Bytes(options.msecs ?? DateTime.nowUnsafe().epochMilliseconds);
204
+ export const makeEntryIdUnsafe = (options = {}) => options.msecs !== undefined ? Uuid.v7Bytes(options.msecs) : nextEntryId(processEntryIds, Date.now());
205
+ // Imported ids further ahead of the local clock than this are logged.
206
+ const maxClockSkewMillis = 24 * 60 * 60 * 1000;
207
+ /**
208
+ * Logs a warning when the latest of the imported `ids` is more than 24 hours
209
+ * ahead of the supplied `clock`. Memory and IndexedDB journals call this after
210
+ * commit; SQL calls it at the end of its transaction body, so a later rollback
211
+ * (including an enclosing transaction rollback) can still leave a warning.
212
+ *
213
+ * @internal
214
+ */
215
+ export const warnIfAhead = (clock, ids) => {
216
+ const latest = maxEntryId(ids);
217
+ if (latest === undefined) return Effect.void;
218
+ const ahead = entryIdMillis(latest) - clock.currentTimeMillisUnsafe();
219
+ if (ahead <= maxClockSkewMillis) return Effect.void;
220
+ return Effect.logWarning(`Imported an entry id ${Math.round(ahead / 3_600_000)} hours ahead of the local clock`).pipe(Effect.annotateLogs({
221
+ service: "EventJournal",
222
+ entryId: Uuid.stringify(latest)
223
+ }));
224
+ };
145
225
  /**
146
226
  * Extracts the millisecond timestamp encoded in a UUID v7 `EntryId`.
147
227
  *
@@ -149,11 +229,9 @@ export const makeEntryIdUnsafe = (options = {}) => Uuid.v7Bytes(options.msecs ??
149
229
  * @category getters
150
230
  * @since 4.0.0
151
231
  */
152
- export const entryIdMillis = entryId => {
153
- const bytes = new Uint8Array(8);
154
- bytes.set(entryId.subarray(0, 6), 2);
155
- return Number(new DataView(bytes.buffer).getBigUint64(0));
156
- };
232
+ export const entryIdMillis = entryId =>
233
+ // Multiply instead of shifting: bitwise operators are signed 32-bit.
234
+ ((((entryId[0] * 256 + entryId[1]) * 256 + entryId[2]) * 256 + entryId[3]) * 256 + entryId[4]) * 256 + entryId[5];
157
235
  /**
158
236
  * Schema for a committed event journal entry.
159
237
  *
@@ -162,6 +240,14 @@ export const entryIdMillis = entryId => {
162
240
  * An entry records its ID, event tag, primary key, and SchemaBinary-encoded
163
241
  * payload, with helpers for array SchemaBinary encoding and creation timestamps.
164
242
  *
243
+ * **Gotchas**
244
+ *
245
+ * `EventLog` encodes `payload` with the `payloadSchemaBinary` of the event whose
246
+ * tag is `entry.event`, so decode it with that event's codec. A codec with an
247
+ * incompatible wire layout, such as a union of a group's tagged payload schemas,
248
+ * cannot read it. Entries from remote journals can carry tags the local schema
249
+ * does not define.
250
+ *
165
251
  * @stability unstable
166
252
  * @category schemas
167
253
  * @since 4.0.0
@@ -192,7 +278,7 @@ export class Entry extends /*#__PURE__*/Schema.Class("effect/eventlog/EventJourn
192
278
  * @stability unstable
193
279
  * @since 4.0.0
194
280
  */
195
- static decodeArray = /*#__PURE__*/Schema.decodeUnknownEffect(Entry.arraySchemaBinary);
281
+ static decodeArray = (input, options) => Effect.map(decodeEntryFieldsArray(input, options), Arr.map(entryFromFields));
196
282
  /**
197
283
  * Ordering for committed entries by their event journal entry id.
198
284
  *
@@ -200,6 +286,7 @@ export class Entry extends /*#__PURE__*/Schema.Class("effect/eventlog/EventJourn
200
286
  * @since 4.0.0
201
287
  */
202
288
  static Order = /*#__PURE__*/Order.make((a, b) => EntryIdOrder(a.id, b.id));
289
+ #idString;
203
290
  /**
204
291
  * String representation of the entry id.
205
292
  *
@@ -207,7 +294,7 @@ export class Entry extends /*#__PURE__*/Schema.Class("effect/eventlog/EventJourn
207
294
  * @since 4.0.0
208
295
  */
209
296
  get idString() {
210
- return Uuid.stringify(this.id);
297
+ return this.#idString ??= Uuid.stringify(this.id);
211
298
  }
212
299
  /**
213
300
  * Creation timestamp encoded in the UUID v7 entry id, in epoch milliseconds.
@@ -243,6 +330,41 @@ export class RemoteEntry extends /*#__PURE__*/Schema.Class("effect/eventlog/Even
243
330
  remoteSequence: Schema.Natural,
244
331
  entry: Entry
245
332
  }) {}
333
+ // Decoding frames into the plain field structs and then constructing the
334
+ // classes from the already validated fields skips the per-instance class
335
+ // decode, which costs more than reading the frame. The wire format is the same.
336
+ /** @internal */
337
+ export const EntryFields = /*#__PURE__*/Schema.Struct(Entry.fields);
338
+ /** @internal */
339
+ export const entryFromFields = fields => Schema.makeClassTrusted(Entry, fields);
340
+ const decodeEntryFieldsArray = /*#__PURE__*/Schema.decodeUnknownEffect(/*#__PURE__*/Schema.Array(/*#__PURE__*/SchemaBinary.toCodec(EntryFields)));
341
+ /**
342
+ * Creates local entries with ids after every id in `after`, normally the
343
+ * latest id in the journal's store.
344
+ *
345
+ * @internal
346
+ */
347
+ export const makeEntries = (entries, after) => Effect.try({
348
+ try: () => {
349
+ const sequence = sequenceAfter(maxEntryId(after));
350
+ return Arr.map(entries, ({
351
+ event,
352
+ payload,
353
+ primaryKey
354
+ }) => new Entry({
355
+ id: nextEntryId(sequence, Date.now()),
356
+ event,
357
+ primaryKey,
358
+ payload
359
+ }, {
360
+ disableChecks: true
361
+ }));
362
+ },
363
+ catch: cause => new EventJournalError({
364
+ method: "writeMany",
365
+ cause
366
+ })
367
+ });
246
368
  /**
247
369
  * Creates an in-memory `EventJournal` service.
248
370
  *
@@ -257,6 +379,17 @@ export class RemoteEntry extends /*#__PURE__*/Schema.Class("effect/eventlog/Even
257
379
  */
258
380
  export const makeMemory = /*#__PURE__*/Effect.gen(function* () {
259
381
  const journal = [];
382
+ // Local writes append in commit order, which unserialized direct callers can
383
+ // make differ from id order, leaving the journal unordered until the next
384
+ // import re-sorts it. Remote backlogs are subsequences of the journal, so one
385
+ // flag covers them too.
386
+ let journalSorted = true;
387
+ // The latest committed id, the floor for local ids.
388
+ let latestId;
389
+ const commitLatest = ids => {
390
+ latestId = maxEntryId(latestId === undefined ? ids : [latestId, ...ids]);
391
+ };
392
+ const clock = yield* Clock.Clock;
260
393
  const byId = new Map();
261
394
  const remotes = new Map();
262
395
  const pubsub = yield* PubSub.unbounded();
@@ -280,85 +413,80 @@ export const makeMemory = /*#__PURE__*/Effect.gen(function* () {
280
413
  remotes.set(remoteIdString, created);
281
414
  return created;
282
415
  };
416
+ const writeMany = ({
417
+ effect,
418
+ entries
419
+ }) => Effect.acquireUseRelease(Effect.suspend(() => makeEntries(entries, latestId === undefined ? [] : [latestId])), effect, (entries, exit) => Effect.suspend(() => {
420
+ if (exit._tag === "Failure") return Effect.void;
421
+ for (const entry of entries) {
422
+ const last = journal[journal.length - 1];
423
+ if (last !== undefined && Entry.Order(last, entry) > 0) {
424
+ journalSorted = false;
425
+ }
426
+ journal.push(entry);
427
+ byId.set(entry.idString, entry);
428
+ remotes.forEach(remote => {
429
+ remote.missing.push(entry);
430
+ });
431
+ }
432
+ commitLatest(entries.map(entry => entry.id));
433
+ return PubSub.publishAll(pubsub, entries);
434
+ }));
283
435
  return EventJournal.of({
284
436
  entries: Effect.sync(() => journal.slice()),
285
- write({
437
+ write: ({
286
438
  effect,
287
- event,
288
- payload,
289
- primaryKey
290
- }) {
291
- return Effect.acquireUseRelease(Effect.sync(() => new Entry({
292
- id: makeEntryIdUnsafe(),
293
- event,
294
- primaryKey,
295
- payload
296
- }, {
297
- disableChecks: true
298
- })), effect, (entry, exit) => Effect.suspend(() => {
299
- if (exit._tag === "Failure" || byId.has(entry.idString)) return Effect.void;
300
- journal.push(entry);
301
- byId.set(entry.idString, entry);
302
- remotes.forEach(remote => {
303
- remote.missing.push(entry);
304
- });
305
- return PubSub.publish(pubsub, entry);
306
- }));
307
- },
439
+ ...entry
440
+ }) => writeMany({
441
+ entries: [entry],
442
+ effect: entries => effect(entries[0])
443
+ }),
444
+ writeMany,
308
445
  writeFromRemote: Effect.fnUntraced(function* (options) {
309
446
  const remote = ensureRemote(options.remoteId);
310
447
  const uncommittedRemotes = [];
311
- const uncommitted = [];
312
448
  const duplicateEntries = [];
449
+ // Overlapping batches can repeat an entry; the first copy wins.
450
+ const incomingIds = new Set();
313
451
  for (const remoteEntry of options.entries) {
314
- if (byId.has(remoteEntry.entry.idString)) {
452
+ const idString = remoteEntry.entry.idString;
453
+ if (byId.has(idString)) {
315
454
  duplicateEntries.push(remoteEntry.entry);
316
- if (remoteEntry.remoteSequence >= remote.sequence) {
317
- remote.sequence = remoteEntry.remoteSequence + 1;
318
- }
319
- continue;
455
+ } else if (!incomingIds.has(idString)) {
456
+ incomingIds.add(idString);
457
+ uncommittedRemotes.push(remoteEntry);
320
458
  }
321
- uncommittedRemotes.push(remoteEntry);
322
- uncommitted.push(remoteEntry.entry);
323
459
  }
324
- const compacted = options.compact ? yield* options.compact(uncommittedRemotes) : uncommitted;
325
- for (const originEntry of compacted) {
326
- const entryMillis = entryIdMillis(originEntry.id);
327
- const conflicts = [];
328
- for (let i = journal.length - 1; i >= -1; i--) {
329
- const entry = journal[i];
330
- if (entry !== undefined && entry.createdAtMillis > entryMillis) {
331
- continue;
332
- }
333
- for (let j = i + 1; j < journal.length; j++) {
334
- const scannedEntry = journal[j];
335
- if (scannedEntry.event === originEntry.event && scannedEntry.primaryKey === originEntry.primaryKey) {
336
- conflicts.push(scannedEntry);
337
- }
338
- }
339
- yield* options.effect({
340
- entry: originEntry,
341
- conflicts
342
- });
343
- break;
460
+ const compacted = options.compact ? yield* options.compact(uncommittedRemotes) : uncommittedRemotes.map(remoteEntry => remoteEntry.entry);
461
+ if (Arr.isReadonlyArrayNonEmpty(compacted)) {
462
+ const index = new ConflictIndex(compacted);
463
+ const oldest = index.oldest;
464
+ // Only the suffix with greater ids can conflict, unless local writes
465
+ // left the journal unordered.
466
+ let i = journalSorted ? journal.length : 0;
467
+ while (i > 0 && Entry.Order(journal[i - 1], oldest) > 0) i--;
468
+ for (; i < journal.length; i++) {
469
+ index.add(journal[i]);
344
470
  }
471
+ yield* options.effect(index.toBatch());
345
472
  }
346
473
  for (const remoteEntry of uncommittedRemotes) {
347
- journal.push(remoteEntry.entry);
348
474
  byId.set(remoteEntry.entry.idString, remoteEntry.entry);
349
- remotes.forEach(target => {
350
- if (target !== remote) {
351
- target.missing.push(remoteEntry.entry);
352
- }
353
- });
354
- if (remoteEntry.remoteSequence >= remote.sequence) {
355
- remote.sequence = remoteEntry.remoteSequence + 1;
356
- }
357
475
  }
358
- journal.sort((a, b) => a.createdAtMillis - b.createdAtMillis);
359
- remotes.forEach(remote => {
360
- remote.missing.sort((a, b) => a.createdAtMillis - b.createdAtMillis);
476
+ // Sequences advance with the commit, so a failed batch is redelivered.
477
+ remote.sequence = nextSequenceAfter(options.entries, remote.sequence);
478
+ const imported = uncommittedRemotes.map(remoteEntry => remoteEntry.entry).sort(Entry.Order);
479
+ insertOrdered(journal, journalSorted, imported);
480
+ remotes.forEach(target => {
481
+ if (target !== remote) {
482
+ insertOrdered(target.missing, journalSorted, imported);
483
+ } else if (!journalSorted) {
484
+ target.missing.sort(Entry.Order);
485
+ }
361
486
  });
487
+ journalSorted = true;
488
+ commitLatest(imported.map(entry => entry.id));
489
+ yield* warnIfAhead(clock, imported.map(entry => entry.id));
362
490
  return {
363
491
  duplicateEntries
364
492
  };
@@ -375,16 +503,48 @@ export const makeMemory = /*#__PURE__*/Effect.gen(function* () {
375
503
  }
376
504
  }
377
505
  })),
506
+ writeRemoteAcks: ({
507
+ acks,
508
+ firstSequence,
509
+ remoteId
510
+ }) => Effect.sync(() => {
511
+ const remote = ensureRemote(remoteId);
512
+ remote.sequence = advanceSequence(remote.sequence, acks, firstSequence);
513
+ }),
378
514
  nextRemoteSequence: remoteId => Effect.sync(() => ensureRemote(remoteId).sequence),
515
+ entriesById: ids => Effect.sync(() => ids.map(id => byId.get(Uuid.stringify(id)))),
379
516
  changes: PubSub.subscribe(pubsub),
380
517
  destroy: Effect.sync(() => {
381
518
  journal.length = 0;
519
+ journalSorted = true;
520
+ latestId = undefined;
382
521
  byId.clear();
383
522
  remotes.clear();
384
523
  }),
385
524
  withLock
386
525
  });
387
526
  });
527
+ // Same result as appending `additions` and sorting by id.
528
+ const insertOrdered = (entries, sorted, additions) => {
529
+ let i = entries.length - 1;
530
+ for (let n = 0; n < additions.length; n++) {
531
+ entries.push(additions[n]);
532
+ }
533
+ if (!sorted) {
534
+ entries.sort(Entry.Order);
535
+ return;
536
+ }
537
+ // Merge from the back, so additions sorting after the whole array cost O(additions).
538
+ let j = additions.length - 1;
539
+ let k = entries.length - 1;
540
+ while (j >= 0) {
541
+ if (i >= 0 && Entry.Order(entries[i], additions[j]) > 0) {
542
+ entries[k--] = entries[i--];
543
+ } else {
544
+ entries[k--] = additions[j--];
545
+ }
546
+ }
547
+ };
388
548
  /**
389
549
  * Layer that provides an in-memory `EventJournal`.
390
550
  *
@@ -413,194 +573,239 @@ export const layerMemory = /*#__PURE__*/Layer.effect(EventJournal, makeMemory);
413
573
  */
414
574
  export const makeIndexedDb = options => Effect.gen(function* () {
415
575
  const database = options?.database ?? "effect_event_journal";
416
- const openRequest = indexedDB.open(database, 1);
417
- openRequest.onupgradeneeded = () => {
576
+ const openRequest = indexedDB.open(database, 2);
577
+ openRequest.onupgradeneeded = event => {
418
578
  const db = openRequest.result;
419
- const entries = db.createObjectStore("entries", {
420
- keyPath: "id"
421
- });
422
- entries.createIndex("id", "id", {
423
- unique: true
424
- });
425
- entries.createIndex("event", "event");
426
- const remotes = db.createObjectStore("remotes", {
427
- keyPath: ["remoteId", "entryId"]
428
- });
429
- remotes.createIndex("id", ["remoteId", "entryId"], {
430
- unique: true
431
- });
432
- remotes.createIndex("sequence", ["remoteId", "sequence"], {
433
- unique: true
434
- });
435
- const remoteEntryId = db.createObjectStore("remoteEntryId", {
436
- keyPath: ["remoteId"]
437
- });
438
- remoteEntryId.createIndex("id", "remoteId", {
439
- unique: true
579
+ const tx = openRequest.transaction;
580
+ if (event.oldVersion < 1) {
581
+ const entries = db.createObjectStore("entries", {
582
+ keyPath: "id"
583
+ });
584
+ entries.createIndex("id", "id", {
585
+ unique: true
586
+ });
587
+ entries.createIndex("event", "event");
588
+ db.createObjectStore("remoteEntryId", {
589
+ keyPath: ["remoteId"]
590
+ }).createIndex("id", "remoteId", {
591
+ unique: true
592
+ });
593
+ }
594
+ const entries = tx.objectStore("entries");
595
+ // Bounds conflict reads to one event and primary key.
596
+ entries.createIndex("conflict", ["event", "primaryKey", "id"]);
597
+ // Entry ids order creation, not insertion, so uploads checkpoint an
598
+ // insertion sequence instead.
599
+ const sequence = db.createObjectStore("entrySequence", {
600
+ autoIncrement: true
440
601
  });
602
+ // The remote each imported entry came from, so uploads skip it.
603
+ const sources = db.createObjectStore("entrySource");
604
+ if (event.oldVersion < 1) return;
605
+ // Number the existing entries in creation order.
606
+ const entryIds = entries.openKeyCursor();
607
+ entryIds.onsuccess = () => {
608
+ const cursor = entryIds.result;
609
+ if (!cursor) return;
610
+ sequence.add(cursor.primaryKey);
611
+ cursor.continue();
612
+ };
613
+ // Version 1 kept a `remotes` row per entry per remote and recorded upload
614
+ // progress as an entry id, which cannot become a checkpoint. Keep one
615
+ // source per entry and, walking each remote's rows in sequence order, its
616
+ // download cursor; then drop the store.
617
+ const progress = tx.objectStore("remoteEntryId");
618
+ progress.clear();
619
+ const remotes = tx.objectStore("remotes").index("sequence").openCursor();
620
+ remotes.onsuccess = () => {
621
+ const cursor = remotes.result;
622
+ if (!cursor) {
623
+ db.deleteObjectStore("remotes");
624
+ return;
625
+ }
626
+ const row = cursor.value;
627
+ sources.put(row.remoteId, row.entryId);
628
+ progress.put({
629
+ remoteId: row.remoteId,
630
+ nextSequence: row.sequence + 1
631
+ });
632
+ cursor.continue();
633
+ };
441
634
  };
442
635
  const db = yield* Effect.acquireRelease(idbReq("open", () => openRequest), db => Effect.sync(() => db.close()));
443
636
  const pubsub = yield* PubSub.unbounded();
637
+ const clock = yield* Clock.Clock;
638
+ // Other tabs share the database but not the entry id sequence.
639
+ const latestEntryId = Effect.callback(resume => {
640
+ const tx = db.transaction("entries", "readonly");
641
+ const request = tx.objectStore("entries").openKeyCursor(null, "prev");
642
+ onTransactionDone(tx, "writeMany", resume, () => {
643
+ const key = request.result?.primaryKey;
644
+ if (key === undefined) return [];
645
+ return [ArrayBuffer.isView(key) ? new Uint8Array(key.buffer, key.byteOffset, key.byteLength) : new Uint8Array(key)];
646
+ });
647
+ return Effect.sync(() => tx.abort());
648
+ });
649
+ const writeMany = ({
650
+ effect,
651
+ entries
652
+ }) => Effect.uninterruptibleMask(restore => latestEntryId.pipe(Effect.flatMap(latest => makeEntries(entries, latest)), Effect.flatMap(committed => restore(effect(committed)).pipe(Effect.tap(Effect.callback(resume => {
653
+ const tx = db.transaction(["entries", "entrySequence"], "readwrite");
654
+ const store = tx.objectStore("entries");
655
+ const sequence = tx.objectStore("entrySequence");
656
+ for (const entry of committed) {
657
+ store.put(encodeEntryIdb(entry));
658
+ sequence.add(entry.id);
659
+ }
660
+ onTransactionDone(tx, "writeMany", resume, constVoid);
661
+ })), Effect.tap(PubSub.publishAll(pubsub, committed))))));
444
662
  return EventJournal.of({
445
- entries: idbReq("entries", () => db.transaction("entries", "readonly").objectStore("entries").index("id").getAll()).pipe(Effect.flatMap(_ => decodeEntryIdbArray(_).pipe(Effect.mapError(cause => new EventJournalError({
446
- method: "entries",
447
- cause
448
- }))))),
663
+ entries: idbReq("entries", () => db.transaction("entries", "readonly").objectStore("entries").index("id").getAll()).pipe(Effect.map(rows => rows.map(entryFromIdb))),
664
+ entriesById: ids => Effect.callback(resume => {
665
+ const entries = ids.map(() => undefined);
666
+ const tx = db.transaction("entries", "readonly");
667
+ const store = tx.objectStore("entries");
668
+ for (let i = 0; i < ids.length; i++) {
669
+ const request = store.get(ids[i]);
670
+ request.onsuccess = () => {
671
+ if (request.result !== undefined) entries[i] = entryFromIdb(request.result);
672
+ };
673
+ }
674
+ onTransactionDone(tx, "entriesById", resume, () => entries);
675
+ return Effect.sync(() => tx.abort());
676
+ }),
449
677
  write: ({
450
678
  effect,
451
- event,
452
- payload,
453
- primaryKey
454
- }) => Effect.uninterruptibleMask(restore => {
455
- const entry = new Entry({
456
- id: makeEntryIdUnsafe(),
457
- event,
458
- primaryKey,
459
- payload
460
- }, {
461
- disableChecks: true
462
- });
463
- return restore(effect(entry)).pipe(Effect.tap(idbReq("write", () => db.transaction("entries", "readwrite").objectStore("entries").put(encodeEntryIdb(entry)))), Effect.tap(PubSub.publish(pubsub, entry)));
679
+ ...entry
680
+ }) => writeMany({
681
+ entries: [entry],
682
+ effect: entries => effect(entries[0])
464
683
  }),
684
+ writeMany,
465
685
  writeFromRemote: Effect.fnUntraced(function* (options) {
466
- const uncommitted = [];
467
686
  const uncommittedRemotes = [];
468
687
  const duplicateEntries = [];
688
+ // Overlapping batches can repeat an entry; the first copy wins.
689
+ const incomingIds = new Set();
469
690
  yield* Effect.callback(resume => {
470
- const tx = db.transaction(["entries", "remotes"], "readwrite");
691
+ const tx = db.transaction("entries", "readonly");
471
692
  const entries = tx.objectStore("entries");
472
- const remotes = tx.objectStore("remotes");
473
- const iterator = options.entries[Symbol.iterator]();
474
- const handleNext = state => {
475
- if (state.done) return;
476
- const remoteEntry = state.value;
477
- const entry = remoteEntry.entry;
478
- const entryIdKey = entry.id;
479
- entries.get(entryIdKey).onsuccess = event => {
480
- if (event.target && "result" in event.target && event.target.result) {
481
- duplicateEntries.push(entry);
482
- remotes.put({
483
- remoteId: options.remoteId,
484
- entryId: entry.id,
485
- sequence: remoteEntry.remoteSequence
486
- });
487
- handleNext(iterator.next());
488
- return;
693
+ // Requests in a transaction complete in the order they were issued.
694
+ for (const remoteEntry of options.entries) {
695
+ const request = entries.getKey(remoteEntry.entry.id);
696
+ request.onsuccess = () => {
697
+ const idString = remoteEntry.entry.idString;
698
+ if (request.result !== undefined) {
699
+ duplicateEntries.push(remoteEntry.entry);
700
+ } else if (!incomingIds.has(idString)) {
701
+ incomingIds.add(idString);
702
+ uncommittedRemotes.push(remoteEntry);
489
703
  }
490
- uncommitted.push(entry);
491
- uncommittedRemotes.push(remoteEntry);
492
- handleNext(iterator.next());
493
704
  };
494
- };
495
- handleNext(iterator.next());
496
- tx.oncomplete = () => resume(Effect.void);
497
- tx.onerror = () => resume(Effect.fail(new EventJournalError({
498
- method: "writeFromRemote",
499
- cause: tx.error
500
- })));
705
+ }
706
+ onTransactionDone(tx, "writeFromRemote", resume, constVoid);
501
707
  return Effect.sync(() => tx.abort());
502
708
  });
503
- const compacted = options.compact ? yield* options.compact(uncommittedRemotes) : uncommitted;
504
- for (const originEntry of compacted) {
505
- const conflicts = [];
709
+ const compacted = options.compact ? yield* options.compact(uncommittedRemotes) : uncommittedRemotes.map(remoteEntry => remoteEntry.entry);
710
+ if (Arr.isReadonlyArrayNonEmpty(compacted)) {
711
+ const index = new ConflictIndex(compacted);
506
712
  yield* Effect.callback(resume => {
507
713
  const tx = db.transaction("entries", "readonly");
508
- const entries = tx.objectStore("entries");
509
- const cursorRequest = entries.index("id").openCursor(IDBKeyRange.lowerBound(originEntry.id, true), "next");
510
- cursorRequest.onsuccess = () => {
511
- const cursor = cursorRequest.result;
512
- if (!cursor) return;
513
- const decodedEntry = decodeEntryIdb(cursor.value);
514
- if (decodedEntry.event === originEntry.event && decodedEntry.primaryKey === originEntry.primaryKey) {
515
- conflicts.push(decodedEntry);
516
- }
517
- cursor.continue();
518
- };
519
- tx.oncomplete = () => resume(Effect.void);
520
- tx.onerror = () => resume(Effect.fail(new EventJournalError({
521
- method: "writeFromRemote",
522
- cause: tx.error
523
- })));
714
+ const conflicts = tx.objectStore("entries").index("conflict");
715
+ // One read per group of the entries with a greater id than its
716
+ // oldest, in id order.
717
+ for (const group of index.groups()) {
718
+ const request = conflicts.getAll(IDBKeyRange.bound([group.event, group.primaryKey, group.oldest.id], [group.event, group.primaryKey, entryIdUpperBound], true));
719
+ request.onsuccess = () => {
720
+ for (const row of request.result) index.add(entryFromIdb(row));
721
+ };
722
+ }
723
+ onTransactionDone(tx, "writeFromRemote", resume, constVoid);
524
724
  return Effect.sync(() => tx.abort());
525
725
  });
526
- yield* options.effect({
527
- entry: originEntry,
528
- conflicts
529
- });
726
+ yield* options.effect(index.toBatch());
530
727
  }
531
728
  yield* Effect.callback(resume => {
532
- const tx = db.transaction(["entries", "remotes"], "readwrite");
729
+ const tx = db.transaction(["entries", "entrySource", "entrySequence", "remoteEntryId"], "readwrite");
533
730
  const entries = tx.objectStore("entries");
534
- const remotes = tx.objectStore("remotes");
731
+ const sources = tx.objectStore("entrySource");
732
+ const sequence = tx.objectStore("entrySequence");
535
733
  for (const remoteEntry of uncommittedRemotes) {
536
734
  entries.add(encodeEntryIdb(remoteEntry.entry));
537
- remotes.put({
538
- remoteId: options.remoteId,
539
- entryId: remoteEntry.entry.id,
540
- sequence: remoteEntry.remoteSequence
541
- });
735
+ sequence.add(remoteEntry.entry.id);
736
+ sources.put(options.remoteId, remoteEntry.entry.id);
542
737
  }
543
- tx.oncomplete = () => resume(Effect.void);
544
- tx.onerror = () => resume(Effect.fail(new EventJournalError({
545
- method: "writeFromRemote",
546
- cause: tx.error
547
- })));
738
+ // Sequences advance with the commit, so a failed batch is redelivered.
739
+ advanceProgress(tx.objectStore("remoteEntryId"), options.remoteId, "nextSequence", () => nextSequenceAfter(options.entries));
740
+ onTransactionDone(tx, "writeFromRemote", resume, constVoid);
548
741
  return Effect.sync(() => tx.abort());
549
742
  });
743
+ yield* warnIfAhead(clock, uncommittedRemotes.map(remoteEntry => remoteEntry.entry.id));
550
744
  return {
551
745
  duplicateEntries
552
746
  };
553
747
  }),
554
- withRemoteUncommited: (remoteId, f) => Effect.callback(resume => {
555
- const entries = [];
556
- const tx = db.transaction(["entries", "remotes", "remoteEntryId"], "readwrite");
557
- const entriesStore = tx.objectStore("entries");
558
- const remotesStore = tx.objectStore("remotes");
559
- const remoteEntryIdStore = tx.objectStore("remoteEntryId");
748
+ withRemoteUncommited: (remoteId, f) => {
560
749
  const remoteIdKey = remoteId;
561
- const request = remoteEntryIdStore.get(remoteIdKey);
562
- request.onsuccess = () => {
563
- const startEntryId = request.result?.entryId;
564
- const entryCursor = entriesStore.index("id").openCursor(startEntryId ? IDBKeyRange.lowerBound(startEntryId, true) : null, "next");
565
- entryCursor.onsuccess = () => {
566
- const cursor = entryCursor.result;
567
- if (!cursor) return;
568
- const entry = decodeEntryIdb(cursor.value);
569
- remotesStore.get([remoteIdKey, entry.id]).onsuccess = event => {
570
- if (!(event.target && "result" in event.target && event.target.result)) entries.push(entry);
750
+ return Effect.callback(resume => {
751
+ const entries = [];
752
+ // The last insertion sequence visited, or 0 when nothing follows the checkpoint.
753
+ let sequence = 0;
754
+ const tx = db.transaction(["entries", "entrySource", "remoteEntryId", "entrySequence"], "readonly");
755
+ const entriesStore = tx.objectStore("entries");
756
+ const sourcesStore = tx.objectStore("entrySource");
757
+ const checkpoint = tx.objectStore("remoteEntryId").get([remoteIdKey]);
758
+ checkpoint.onsuccess = () => {
759
+ const cursorRequest = tx.objectStore("entrySequence").openCursor(IDBKeyRange.lowerBound(checkpoint.result?.sequence ?? 0, true));
760
+ cursorRequest.onsuccess = () => {
761
+ const cursor = cursorRequest.result;
762
+ if (!cursor) return;
763
+ sequence = cursor.key;
764
+ const entryId = cursor.value;
765
+ const source = sourcesStore.get(entryId);
766
+ source.onsuccess = () => {
767
+ if (source.result !== undefined && indexedDB.cmp(source.result, remoteIdKey) === 0) return;
768
+ const entry = entriesStore.get(entryId);
769
+ entry.onsuccess = () => {
770
+ entries.push(entryFromIdb(entry.result));
771
+ };
772
+ };
571
773
  cursor.continue();
572
774
  };
573
775
  };
574
- };
575
- tx.oncomplete = () => resume(Effect.succeed(entries));
576
- tx.onerror = () => resume(Effect.fail(new EventJournalError({
577
- method: "withRemoteUncommited",
578
- cause: tx.error
579
- })));
776
+ onTransactionDone(tx, "withRemoteUncommited", resume, () => ({
777
+ entries,
778
+ sequence
779
+ }));
780
+ return Effect.sync(() => tx.abort());
781
+ }).pipe(Effect.flatMap(({
782
+ entries,
783
+ sequence
784
+ }) => {
785
+ if (sequence === 0) return Effect.succeedNone;
786
+ entries.sort(byEntryId);
787
+ return Effect.uninterruptibleMask(restore => restore(Arr.isReadonlyArrayNonEmpty(entries) ? Effect.asSome(f(entries)) : Effect.succeedNone).pipe(Effect.tap(Effect.callback(resume => {
788
+ // Uploads can complete out of order; the checkpoint only moves forward.
789
+ const tx = db.transaction("remoteEntryId", "readwrite");
790
+ advanceProgress(tx.objectStore("remoteEntryId"), remoteId, "sequence", () => sequence);
791
+ onTransactionDone(tx, "withRemoteUncommited", resume, constVoid);
792
+ }))));
793
+ }));
794
+ },
795
+ writeRemoteAcks: ({
796
+ acks,
797
+ firstSequence,
798
+ remoteId
799
+ }) => Effect.callback(resume => {
800
+ const tx = db.transaction("remoteEntryId", "readwrite");
801
+ advanceProgress(tx.objectStore("remoteEntryId"), remoteId, "nextSequence", next => advanceSequence(next, acks, firstSequence));
802
+ onTransactionDone(tx, "writeRemoteAcks", resume, constVoid);
580
803
  return Effect.sync(() => tx.abort());
581
- }).pipe(Effect.flatMap(entries => {
582
- if (!Arr.isReadonlyArrayNonEmpty(entries)) return Effect.succeedNone;
583
- const entryId = entries[entries.length - 1].id;
584
- return Effect.uninterruptibleMask(restore => restore(f(entries)).pipe(Effect.tap(idbReq("withRemoteUncommited", () => db.transaction("remoteEntryId", "readwrite").objectStore("remoteEntryId").put({
585
- remoteId,
586
- entryId
587
- }))), Effect.asSome));
588
- })),
804
+ }),
589
805
  nextRemoteSequence: remoteId => Effect.callback(resume => {
590
- const tx = db.transaction("remotes", "readonly");
591
- let sequence = 0;
592
- const remoteIdKey = remoteId;
593
- const cursorRequest = tx.objectStore("remotes").index("sequence").openCursor(IDBKeyRange.bound([remoteIdKey, 0], [remoteIdKey, Infinity]), "prev");
594
- cursorRequest.onsuccess = () => {
595
- const cursor = cursorRequest.result;
596
- if (!cursor) return;
597
- sequence = cursor.value.sequence + 1;
598
- };
599
- tx.oncomplete = () => resume(Effect.succeed(sequence));
600
- tx.onerror = () => resume(Effect.fail(new EventJournalError({
601
- method: "nextRemoteSequence",
602
- cause: tx.error
603
- })));
806
+ const tx = db.transaction("remoteEntryId", "readonly");
807
+ const progress = tx.objectStore("remoteEntryId").get([remoteId]);
808
+ onTransactionDone(tx, "nextRemoteSequence", resume, () => progress.result?.nextSequence ?? 0);
604
809
  return Effect.sync(() => tx.abort());
605
810
  }),
606
811
  changes: PubSub.subscribe(pubsub),
@@ -610,6 +815,30 @@ export const makeIndexedDb = options => Effect.gen(function* () {
610
815
  withLock: yield* makeBrowserWithLock(database)
611
816
  });
612
817
  });
818
+ /**
819
+ * The sequence following every entry in a delivered batch.
820
+ *
821
+ * @internal
822
+ */
823
+ export const nextSequenceAfter = (entries, next = 0) => {
824
+ for (const remoteEntry of entries) {
825
+ if (remoteEntry.remoteSequence >= next) next = remoteEntry.remoteSequence + 1;
826
+ }
827
+ return next;
828
+ };
829
+ /**
830
+ * Advances across contiguous acknowledgements without skipping unseen entries.
831
+ *
832
+ * @internal
833
+ */
834
+ export const advanceSequence = (next, acks, firstSequence = 0) => {
835
+ next = Math.max(next, firstSequence);
836
+ const sequences = acks.map(ack => ack.sequence).sort((a, b) => a - b);
837
+ for (const sequence of sequences) {
838
+ if (sequence === next) next++;else if (sequence > next) break;
839
+ }
840
+ return next;
841
+ };
613
842
  const makeBrowserWithLock = /*#__PURE__*/Effect.fnUntraced(function* (key) {
614
843
  if (typeof navigator !== "undefined" && "locks" in navigator) {
615
844
  return storeId => self => Effect.callback((resume, signal) => {
@@ -633,10 +862,32 @@ const makeBrowserWithLock = /*#__PURE__*/Effect.fnUntraced(function* (key) {
633
862
  return semaphore.withPermit;
634
863
  };
635
864
  });
636
- const decodeEntryIdb = /*#__PURE__*/Schema.decodeSync(Entry);
865
+ // Raises one progress field within the store's transaction; progress only moves forward.
866
+ const advanceProgress = (store, remoteId, field, next) => {
867
+ const request = store.get([remoteId]);
868
+ request.onsuccess = () => {
869
+ const current = request.result?.[field] ?? 0;
870
+ const value = next(current);
871
+ if (value > current) store.put({
872
+ ...request.result,
873
+ remoteId,
874
+ [field]: value
875
+ });
876
+ };
877
+ };
878
+ const byEntryId = (a, b) => indexedDB.cmp(a.id, b.id);
879
+ // Greater than or equal to every entry id.
880
+ const entryIdUpperBound = /*#__PURE__*/new Uint8Array(16).fill(0xff);
881
+ // Rows are written by `encodeEntryIdb`, so they are not validated again.
882
+ const entryFromIdb = row => new Entry({
883
+ id: row.id,
884
+ event: row.event,
885
+ primaryKey: row.primaryKey,
886
+ payload: row.payload
887
+ }, {
888
+ disableChecks: true
889
+ });
637
890
  const encodeEntryIdb = /*#__PURE__*/Schema.encodeSync(Entry);
638
- const EntryIdbArray = /*#__PURE__*/Schema.Array(Entry);
639
- const decodeEntryIdbArray = /*#__PURE__*/Schema.decodeUnknownEffect(EntryIdbArray);
640
891
  /**
641
892
  * Provides `EventJournal` using the IndexedDB-backed implementation created by
642
893
  * `makeIndexedDb`.
@@ -646,6 +897,15 @@ const decodeEntryIdbArray = /*#__PURE__*/Schema.decodeUnknownEffect(EntryIdbArra
646
897
  * @since 4.0.0
647
898
  */
648
899
  export const layerIndexedDb = options => Layer.effect(EventJournal, makeIndexedDb(options));
900
+ // Resumes when the transaction commits, and fails if it errors or aborts. An
901
+ // abort, such as a failed commit, does not always dispatch an error first.
902
+ const onTransactionDone = (tx, method, resume, onComplete) => {
903
+ tx.oncomplete = () => resume(Effect.succeed(onComplete()));
904
+ tx.onerror = tx.onabort = () => resume(Effect.fail(new EventJournalError({
905
+ method,
906
+ cause: tx.error
907
+ })));
908
+ };
649
909
  const idbReq = (method, evaluate) => Effect.callback(resume => {
650
910
  const request = evaluate();
651
911
  if (request.readyState === "done") {