effect 4.0.7 → 4.1.1

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 (863) hide show
  1. package/README.md +31 -1
  2. package/THIRD_PARTY_NOTICES.md +62 -0
  3. package/dist/BigDecimal.d.ts +139 -7
  4. package/dist/BigDecimal.d.ts.map +1 -1
  5. package/dist/BigDecimal.js +86 -14
  6. package/dist/BigDecimal.js.map +1 -1
  7. package/dist/Channel.d.ts +12 -6
  8. package/dist/Channel.d.ts.map +1 -1
  9. package/dist/Channel.js +9 -3
  10. package/dist/Channel.js.map +1 -1
  11. package/dist/Config.d.ts +7 -1
  12. package/dist/Config.d.ts.map +1 -1
  13. package/dist/Config.js.map +1 -1
  14. package/dist/Context.d.ts +18 -1
  15. package/dist/Context.d.ts.map +1 -1
  16. package/dist/Context.js +27 -8
  17. package/dist/Context.js.map +1 -1
  18. package/dist/Cron.d.ts +81 -11
  19. package/dist/Cron.d.ts.map +1 -1
  20. package/dist/Cron.js +101 -26
  21. package/dist/Cron.js.map +1 -1
  22. package/dist/Duration.d.ts +78 -0
  23. package/dist/Duration.d.ts.map +1 -1
  24. package/dist/Duration.js +123 -0
  25. package/dist/Duration.js.map +1 -1
  26. package/dist/Effect.d.ts +164 -7
  27. package/dist/Effect.d.ts.map +1 -1
  28. package/dist/Effect.js +11 -1
  29. package/dist/Effect.js.map +1 -1
  30. package/dist/Equal.d.ts +2 -2
  31. package/dist/Equal.d.ts.map +1 -1
  32. package/dist/Equal.js +3 -3
  33. package/dist/Equal.js.map +1 -1
  34. package/dist/FileSystem.d.ts +59 -4
  35. package/dist/FileSystem.d.ts.map +1 -1
  36. package/dist/FileSystem.js +9 -2
  37. package/dist/FileSystem.js.map +1 -1
  38. package/dist/Glob.d.ts +165 -0
  39. package/dist/Glob.d.ts.map +1 -0
  40. package/dist/Glob.js +127 -0
  41. package/dist/Glob.js.map +1 -0
  42. package/dist/Hash.d.ts +3 -2
  43. package/dist/Hash.d.ts.map +1 -1
  44. package/dist/Hash.js +5 -4
  45. package/dist/Hash.js.map +1 -1
  46. package/dist/Iterable.d.ts.map +1 -1
  47. package/dist/Iterable.js +11 -8
  48. package/dist/Iterable.js.map +1 -1
  49. package/dist/Match.d.ts +86 -0
  50. package/dist/Match.d.ts.map +1 -1
  51. package/dist/Match.js +72 -0
  52. package/dist/Match.js.map +1 -1
  53. package/dist/Path.d.ts.map +1 -1
  54. package/dist/Path.js +5 -1
  55. package/dist/Path.js.map +1 -1
  56. package/dist/Pool.d.ts +51 -0
  57. package/dist/Pool.d.ts.map +1 -1
  58. package/dist/Pool.js +61 -10
  59. package/dist/Pool.js.map +1 -1
  60. package/dist/Random.d.ts.map +1 -1
  61. package/dist/Random.js +3 -3
  62. package/dist/Random.js.map +1 -1
  63. package/dist/RcMap.d.ts.map +1 -1
  64. package/dist/RcMap.js +8 -2
  65. package/dist/RcMap.js.map +1 -1
  66. package/dist/Schedule.d.ts +18 -1
  67. package/dist/Schedule.d.ts.map +1 -1
  68. package/dist/Schedule.js +7 -2
  69. package/dist/Schedule.js.map +1 -1
  70. package/dist/Schema.d.ts +668 -42
  71. package/dist/Schema.d.ts.map +1 -1
  72. package/dist/Schema.js +652 -1
  73. package/dist/Schema.js.map +1 -1
  74. package/dist/SchemaGetter.d.ts +6 -1
  75. package/dist/SchemaGetter.d.ts.map +1 -1
  76. package/dist/SchemaGetter.js +22 -11
  77. package/dist/SchemaGetter.js.map +1 -1
  78. package/dist/SchemaRepresentation.d.ts +18 -2
  79. package/dist/SchemaRepresentation.d.ts.map +1 -1
  80. package/dist/SchemaRepresentation.js +20 -2
  81. package/dist/SchemaRepresentation.js.map +1 -1
  82. package/dist/SchemaTransformation.d.ts +10 -5
  83. package/dist/SchemaTransformation.d.ts.map +1 -1
  84. package/dist/SchemaTransformation.js +8 -5
  85. package/dist/SchemaTransformation.js.map +1 -1
  86. package/dist/ScopedCache.d.ts.map +1 -1
  87. package/dist/ScopedCache.js +5 -7
  88. package/dist/ScopedCache.js.map +1 -1
  89. package/dist/Semaphore.d.ts +130 -0
  90. package/dist/Semaphore.d.ts.map +1 -1
  91. package/dist/Semaphore.js +40 -0
  92. package/dist/Semaphore.js.map +1 -1
  93. package/dist/Stream.d.ts +13 -4
  94. package/dist/Stream.d.ts.map +1 -1
  95. package/dist/Stream.js +9 -0
  96. package/dist/Stream.js.map +1 -1
  97. package/dist/Terminal.d.ts +18 -1
  98. package/dist/Terminal.d.ts.map +1 -1
  99. package/dist/Terminal.js +1 -1
  100. package/dist/Terminal.js.map +1 -1
  101. package/dist/ai/AiError.d.ts +43 -116
  102. package/dist/ai/AiError.d.ts.map +1 -1
  103. package/dist/ai/AiError.js +53 -72
  104. package/dist/ai/AiError.js.map +1 -1
  105. package/dist/ai/Decision.d.ts +196 -15
  106. package/dist/ai/Decision.d.ts.map +1 -1
  107. package/dist/ai/Decision.js +130 -0
  108. package/dist/ai/Decision.js.map +1 -1
  109. package/dist/ai/DecisionModel.d.ts +54 -13
  110. package/dist/ai/DecisionModel.d.ts.map +1 -1
  111. package/dist/ai/DecisionModel.js +123 -12
  112. package/dist/ai/DecisionModel.js.map +1 -1
  113. package/dist/ai/McpClient.d.ts +171 -19
  114. package/dist/ai/McpClient.d.ts.map +1 -1
  115. package/dist/ai/McpClient.js +277 -66
  116. package/dist/ai/McpClient.js.map +1 -1
  117. package/dist/ai/McpSchema.d.ts +108 -0
  118. package/dist/ai/McpSchema.d.ts.map +1 -1
  119. package/dist/ai/McpSchema.js +99 -0
  120. package/dist/ai/McpSchema.js.map +1 -1
  121. package/dist/ai/McpServer.d.ts +744 -29
  122. package/dist/ai/McpServer.d.ts.map +1 -1
  123. package/dist/ai/McpServer.js +763 -136
  124. package/dist/ai/McpServer.js.map +1 -1
  125. package/dist/ai/McpTest.d.ts +130 -0
  126. package/dist/ai/McpTest.d.ts.map +1 -0
  127. package/dist/ai/McpTest.js +237 -0
  128. package/dist/ai/McpTest.js.map +1 -0
  129. package/dist/ai/Prompt.d.ts.map +1 -1
  130. package/dist/ai/Prompt.js +20 -11
  131. package/dist/ai/Prompt.js.map +1 -1
  132. package/dist/ai/Response.d.ts +1 -25
  133. package/dist/ai/Response.d.ts.map +1 -1
  134. package/dist/ai/Response.js +1 -10
  135. package/dist/ai/Response.js.map +1 -1
  136. package/dist/ai/Tool.d.ts +19 -1
  137. package/dist/ai/Tool.d.ts.map +1 -1
  138. package/dist/ai/Tool.js +5 -7
  139. package/dist/ai/Tool.js.map +1 -1
  140. package/dist/ai/index.d.ts +5 -0
  141. package/dist/ai/index.d.ts.map +1 -1
  142. package/dist/ai/index.js +5 -0
  143. package/dist/ai/index.js.map +1 -1
  144. package/dist/ai/internal/mcpCore.js +89 -15
  145. package/dist/ai/internal/mcpCore.js.map +1 -1
  146. package/dist/ai/internal/mcpProtocol/v2024_11_05.js +7 -6
  147. package/dist/ai/internal/mcpProtocol/v2024_11_05.js.map +1 -1
  148. package/dist/ai/internal/mcpProtocol/v2025_03_26.js +7 -6
  149. package/dist/ai/internal/mcpProtocol/v2025_03_26.js.map +1 -1
  150. package/dist/ai/internal/mcpProtocol/v2025_06_18.js +7 -6
  151. package/dist/ai/internal/mcpProtocol/v2025_06_18.js.map +1 -1
  152. package/dist/ai/internal/mcpProtocol/v2025_11_25.js +7 -6
  153. package/dist/ai/internal/mcpProtocol/v2025_11_25.js.map +1 -1
  154. package/dist/ai/internal/mcpProtocol/v2026_07_28.js +60 -17
  155. package/dist/ai/internal/mcpProtocol/v2026_07_28.js.map +1 -1
  156. package/dist/ai/internal/mcpProtocol.js +25 -0
  157. package/dist/ai/internal/mcpProtocol.js.map +1 -1
  158. package/dist/ai/internal/mcpRuntime.js +8 -6
  159. package/dist/ai/internal/mcpRuntime.js.map +1 -1
  160. package/dist/ai/internal/mcpSkills.d.ts +2 -0
  161. package/dist/ai/internal/mcpSkills.d.ts.map +1 -0
  162. package/dist/ai/internal/mcpSkills.js +428 -0
  163. package/dist/ai/internal/mcpSkills.js.map +1 -0
  164. package/dist/ai/internal/mcpStatefulRuntime.js +6 -1
  165. package/dist/ai/internal/mcpStatefulRuntime.js.map +1 -1
  166. package/dist/cli/Argument.d.ts +6 -0
  167. package/dist/cli/Argument.d.ts.map +1 -1
  168. package/dist/cli/Argument.js +2 -0
  169. package/dist/cli/Argument.js.map +1 -1
  170. package/dist/cli/CliOutput.d.ts +65 -1
  171. package/dist/cli/CliOutput.d.ts.map +1 -1
  172. package/dist/cli/CliOutput.js +94 -37
  173. package/dist/cli/CliOutput.js.map +1 -1
  174. package/dist/cli/Command.d.ts +23 -0
  175. package/dist/cli/Command.d.ts.map +1 -1
  176. package/dist/cli/Command.js +8 -0
  177. package/dist/cli/Command.js.map +1 -1
  178. package/dist/cli/Flag.d.ts +107 -0
  179. package/dist/cli/Flag.d.ts.map +1 -1
  180. package/dist/cli/Flag.js +37 -0
  181. package/dist/cli/Flag.js.map +1 -1
  182. package/dist/cli/HelpDoc.d.ts +15 -1
  183. package/dist/cli/HelpDoc.d.ts.map +1 -1
  184. package/dist/cli/Param.d.ts +6 -0
  185. package/dist/cli/Param.d.ts.map +1 -1
  186. package/dist/cli/Param.js +2 -0
  187. package/dist/cli/Param.js.map +1 -1
  188. package/dist/cli/Primitive.d.ts +14 -0
  189. package/dist/cli/Primitive.d.ts.map +1 -1
  190. package/dist/cli/Primitive.js +15 -1
  191. package/dist/cli/Primitive.js.map +1 -1
  192. package/dist/cli/Prompt.d.ts +1 -0
  193. package/dist/cli/Prompt.d.ts.map +1 -1
  194. package/dist/cli/Prompt.js +1 -0
  195. package/dist/cli/Prompt.js.map +1 -1
  196. package/dist/cli/internal/help.d.ts.map +1 -1
  197. package/dist/cli/internal/help.js +17 -10
  198. package/dist/cli/internal/help.js.map +1 -1
  199. package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
  200. package/dist/cluster/ClusterWorkflowEngine.js +15 -5
  201. package/dist/cluster/ClusterWorkflowEngine.js.map +1 -1
  202. package/dist/cluster/Reply.d.ts +1 -1
  203. package/dist/cluster/Reply.d.ts.map +1 -1
  204. package/dist/cluster/Reply.js.map +1 -1
  205. package/dist/cluster/Sharding.d.ts.map +1 -1
  206. package/dist/cluster/Sharding.js +93 -28
  207. package/dist/cluster/Sharding.js.map +1 -1
  208. package/dist/cluster/ShardingConfig.d.ts +72 -6
  209. package/dist/cluster/ShardingConfig.d.ts.map +1 -1
  210. package/dist/cluster/ShardingConfig.js +4 -0
  211. package/dist/cluster/ShardingConfig.js.map +1 -1
  212. package/dist/cluster/SingleRunner.d.ts +3 -3
  213. package/dist/cluster/SingleRunner.d.ts.map +1 -1
  214. package/dist/cluster/SingleRunner.js +1 -1
  215. package/dist/cluster/SqlMessageStorage.d.ts +37 -6
  216. package/dist/cluster/SqlMessageStorage.d.ts.map +1 -1
  217. package/dist/cluster/SqlMessageStorage.js +34 -7
  218. package/dist/cluster/SqlMessageStorage.js.map +1 -1
  219. package/dist/cluster/SqlRunnerStorage.d.ts.map +1 -1
  220. package/dist/cluster/SqlRunnerStorage.js +23 -8
  221. package/dist/cluster/SqlRunnerStorage.js.map +1 -1
  222. package/dist/cluster/internal/entityManager.js +15 -7
  223. package/dist/cluster/internal/entityManager.js.map +1 -1
  224. package/dist/crypto/Aead.d.ts +323 -0
  225. package/dist/crypto/Aead.d.ts.map +1 -0
  226. package/dist/crypto/Aead.js +331 -0
  227. package/dist/crypto/Aead.js.map +1 -0
  228. package/dist/crypto/Cipher.d.ts +236 -0
  229. package/dist/crypto/Cipher.d.ts.map +1 -0
  230. package/dist/crypto/Cipher.js +233 -0
  231. package/dist/crypto/Cipher.js.map +1 -0
  232. package/dist/crypto/CryptoError.d.ts +212 -0
  233. package/dist/crypto/CryptoError.d.ts.map +1 -0
  234. package/dist/crypto/CryptoError.js +202 -0
  235. package/dist/crypto/CryptoError.js.map +1 -0
  236. package/dist/crypto/Digest.d.ts +143 -0
  237. package/dist/crypto/Digest.d.ts.map +1 -0
  238. package/dist/crypto/Digest.js +146 -0
  239. package/dist/crypto/Digest.js.map +1 -0
  240. package/dist/crypto/Kdf.d.ts +220 -0
  241. package/dist/crypto/Kdf.d.ts.map +1 -0
  242. package/dist/crypto/Kdf.js +212 -0
  243. package/dist/crypto/Kdf.js.map +1 -0
  244. package/dist/crypto/KeyAgreement.d.ts +324 -0
  245. package/dist/crypto/KeyAgreement.d.ts.map +1 -0
  246. package/dist/crypto/KeyAgreement.js +303 -0
  247. package/dist/crypto/KeyAgreement.js.map +1 -0
  248. package/dist/crypto/KeyFormat.d.ts +341 -0
  249. package/dist/crypto/KeyFormat.d.ts.map +1 -0
  250. package/dist/crypto/KeyFormat.js +556 -0
  251. package/dist/crypto/KeyFormat.js.map +1 -0
  252. package/dist/crypto/KeyWrap.d.ts +390 -0
  253. package/dist/crypto/KeyWrap.d.ts.map +1 -0
  254. package/dist/crypto/KeyWrap.js +381 -0
  255. package/dist/crypto/KeyWrap.js.map +1 -0
  256. package/dist/crypto/Mac.d.ts +278 -0
  257. package/dist/crypto/Mac.d.ts.map +1 -0
  258. package/dist/crypto/Mac.js +288 -0
  259. package/dist/crypto/Mac.js.map +1 -0
  260. package/dist/crypto/SecureRandom.d.ts +340 -0
  261. package/dist/crypto/SecureRandom.d.ts.map +1 -0
  262. package/dist/crypto/SecureRandom.js +257 -0
  263. package/dist/crypto/SecureRandom.js.map +1 -0
  264. package/dist/crypto/Signature.d.ts +449 -0
  265. package/dist/crypto/Signature.d.ts.map +1 -0
  266. package/dist/crypto/Signature.js +484 -0
  267. package/dist/crypto/Signature.js.map +1 -0
  268. package/dist/crypto/WebCrypto.d.ts +80 -0
  269. package/dist/crypto/WebCrypto.d.ts.map +1 -0
  270. package/dist/crypto/WebCrypto.js +63 -0
  271. package/dist/crypto/WebCrypto.js.map +1 -0
  272. package/dist/crypto/index.d.ts +65 -0
  273. package/dist/crypto/index.d.ts.map +1 -0
  274. package/dist/crypto/index.js +66 -0
  275. package/dist/crypto/index.js.map +1 -0
  276. package/dist/crypto/internal/asymmetric.d.ts +2 -0
  277. package/dist/crypto/internal/asymmetric.d.ts.map +1 -0
  278. package/dist/crypto/internal/asymmetric.js +210 -0
  279. package/dist/crypto/internal/asymmetric.js.map +1 -0
  280. package/dist/crypto/internal/chacha.d.ts +46 -0
  281. package/dist/crypto/internal/chacha.d.ts.map +1 -0
  282. package/dist/crypto/internal/chacha.js +885 -0
  283. package/dist/crypto/internal/chacha.js.map +1 -0
  284. package/dist/crypto/internal/der.d.ts +6 -0
  285. package/dist/crypto/internal/der.d.ts.map +1 -0
  286. package/dist/crypto/internal/der.js +86 -0
  287. package/dist/crypto/internal/der.js.map +1 -0
  288. package/dist/crypto/internal/digest.d.ts +2 -0
  289. package/dist/crypto/internal/digest.d.ts.map +1 -0
  290. package/dist/crypto/internal/digest.js +15 -0
  291. package/dist/crypto/internal/digest.js.map +1 -0
  292. package/dist/crypto/internal/key.d.ts +2 -0
  293. package/dist/crypto/internal/key.d.ts.map +1 -0
  294. package/dist/crypto/internal/key.js +171 -0
  295. package/dist/crypto/internal/key.js.map +1 -0
  296. package/dist/crypto/internal/md5.d.ts +39 -0
  297. package/dist/crypto/internal/md5.d.ts.map +1 -0
  298. package/dist/crypto/internal/md5.js +179 -0
  299. package/dist/crypto/internal/md5.js.map +1 -0
  300. package/dist/crypto/internal/webCrypto.d.ts +2 -0
  301. package/dist/crypto/internal/webCrypto.d.ts.map +1 -0
  302. package/dist/crypto/internal/webCrypto.js +111 -0
  303. package/dist/crypto/internal/webCrypto.js.map +1 -0
  304. package/dist/encoding/Base64Url.d.ts.map +1 -1
  305. package/dist/encoding/Base64Url.js +29 -5
  306. package/dist/encoding/Base64Url.js.map +1 -1
  307. package/dist/encoding/Csv.d.ts +608 -0
  308. package/dist/encoding/Csv.d.ts.map +1 -0
  309. package/dist/encoding/Csv.js +718 -0
  310. package/dist/encoding/Csv.js.map +1 -0
  311. package/dist/encoding/Hex.d.ts +3 -2
  312. package/dist/encoding/Hex.d.ts.map +1 -1
  313. package/dist/encoding/Hex.js +3 -2
  314. package/dist/encoding/Hex.js.map +1 -1
  315. package/dist/encoding/Ndjson.d.ts +5 -4
  316. package/dist/encoding/Ndjson.d.ts.map +1 -1
  317. package/dist/encoding/Ndjson.js +6 -5
  318. package/dist/encoding/Ndjson.js.map +1 -1
  319. package/dist/encoding/SchemaBinary.d.ts.map +1 -1
  320. package/dist/encoding/SchemaBinary.js +42 -4
  321. package/dist/encoding/SchemaBinary.js.map +1 -1
  322. package/dist/encoding/Sse.d.ts +3 -1
  323. package/dist/encoding/Sse.d.ts.map +1 -1
  324. package/dist/encoding/Sse.js +5 -3
  325. package/dist/encoding/Sse.js.map +1 -1
  326. package/dist/encoding/Toml.d.ts +17 -3
  327. package/dist/encoding/Toml.d.ts.map +1 -1
  328. package/dist/encoding/Toml.js +104 -16
  329. package/dist/encoding/Toml.js.map +1 -1
  330. package/dist/encoding/Yaml.d.ts +8 -1
  331. package/dist/encoding/Yaml.d.ts.map +1 -1
  332. package/dist/encoding/Yaml.js +54 -18
  333. package/dist/encoding/Yaml.js.map +1 -1
  334. package/dist/encoding/index.d.ts +5 -0
  335. package/dist/encoding/index.d.ts.map +1 -1
  336. package/dist/encoding/index.js +5 -0
  337. package/dist/encoding/index.js.map +1 -1
  338. package/dist/eventlog/EventJournal.d.ts.map +1 -1
  339. package/dist/eventlog/EventJournal.js +6 -3
  340. package/dist/eventlog/EventJournal.js.map +1 -1
  341. package/dist/eventlog/EventLog.d.ts +126 -4
  342. package/dist/eventlog/EventLog.d.ts.map +1 -1
  343. package/dist/eventlog/EventLog.js +207 -12
  344. package/dist/eventlog/EventLog.js.map +1 -1
  345. package/dist/eventlog/EventLogEncryption.d.ts +41 -4
  346. package/dist/eventlog/EventLogEncryption.d.ts.map +1 -1
  347. package/dist/eventlog/EventLogEncryption.js +83 -64
  348. package/dist/eventlog/EventLogEncryption.js.map +1 -1
  349. package/dist/eventlog/EventLogMessage.d.ts +279 -0
  350. package/dist/eventlog/EventLogMessage.d.ts.map +1 -1
  351. package/dist/eventlog/EventLogMessage.js +217 -1
  352. package/dist/eventlog/EventLogMessage.js.map +1 -1
  353. package/dist/eventlog/EventLogRemote.d.ts +200 -28
  354. package/dist/eventlog/EventLogRemote.d.ts.map +1 -1
  355. package/dist/eventlog/EventLogRemote.js +186 -16
  356. package/dist/eventlog/EventLogRemote.js.map +1 -1
  357. package/dist/eventlog/EventLogServer.d.ts +10 -1
  358. package/dist/eventlog/EventLogServer.d.ts.map +1 -1
  359. package/dist/eventlog/EventLogServer.js +45 -22
  360. package/dist/eventlog/EventLogServer.js.map +1 -1
  361. package/dist/eventlog/EventLogServerEncrypted.d.ts +336 -5
  362. package/dist/eventlog/EventLogServerEncrypted.d.ts.map +1 -1
  363. package/dist/eventlog/EventLogServerEncrypted.js +769 -14
  364. package/dist/eventlog/EventLogServerEncrypted.js.map +1 -1
  365. package/dist/eventlog/EventLogServerUnencrypted.d.ts +17 -0
  366. package/dist/eventlog/EventLogServerUnencrypted.d.ts.map +1 -1
  367. package/dist/eventlog/EventLogServerUnencrypted.js +14 -2
  368. package/dist/eventlog/EventLogServerUnencrypted.js.map +1 -1
  369. package/dist/eventlog/EventLogSessionAuth.d.ts +26 -3
  370. package/dist/eventlog/EventLogSessionAuth.d.ts.map +1 -1
  371. package/dist/eventlog/EventLogSessionAuth.js +63 -64
  372. package/dist/eventlog/EventLogSessionAuth.js.map +1 -1
  373. package/dist/eventlog/EventRow.d.ts +4 -0
  374. package/dist/eventlog/EventRow.d.ts.map +1 -1
  375. package/dist/eventlog/EventRow.js +12 -2
  376. package/dist/eventlog/EventRow.js.map +1 -1
  377. package/dist/eventlog/SqlEventJournal.js +2 -2
  378. package/dist/eventlog/SqlEventJournal.js.map +1 -1
  379. package/dist/eventlog/SqlEventLogServerEncrypted.d.ts +21 -5
  380. package/dist/eventlog/SqlEventLogServerEncrypted.d.ts.map +1 -1
  381. package/dist/eventlog/SqlEventLogServerEncrypted.js +1048 -113
  382. package/dist/eventlog/SqlEventLogServerEncrypted.js.map +1 -1
  383. package/dist/eventlog/SqlEventLogServerUnencrypted.js +2 -2
  384. package/dist/eventlog/SqlEventLogServerUnencrypted.js.map +1 -1
  385. package/dist/eventlog/internal/batches.d.ts +12 -0
  386. package/dist/eventlog/internal/batches.d.ts.map +1 -0
  387. package/dist/eventlog/internal/batches.js +26 -0
  388. package/dist/eventlog/internal/batches.js.map +1 -0
  389. package/dist/eventlog/internal/compaction.d.ts +38 -0
  390. package/dist/eventlog/internal/compaction.d.ts.map +1 -0
  391. package/dist/eventlog/internal/compaction.js +33 -0
  392. package/dist/eventlog/internal/compaction.js.map +1 -0
  393. package/dist/eventlog/internal/identityRootSecretDerivation.js +66 -67
  394. package/dist/eventlog/internal/identityRootSecretDerivation.js.map +1 -1
  395. package/dist/eventlog/internal/remoteCompaction.d.ts +31 -0
  396. package/dist/eventlog/internal/remoteCompaction.d.ts.map +1 -0
  397. package/dist/eventlog/internal/remoteCompaction.js +76 -0
  398. package/dist/eventlog/internal/remoteCompaction.js.map +1 -0
  399. package/dist/graphql/GraphQLClient.d.ts +3 -1
  400. package/dist/graphql/GraphQLClient.d.ts.map +1 -1
  401. package/dist/graphql/GraphQLClient.js.map +1 -1
  402. package/dist/graphql/GraphQLClientError.d.ts +14 -9
  403. package/dist/graphql/GraphQLClientError.d.ts.map +1 -1
  404. package/dist/graphql/GraphQLClientError.js +14 -21
  405. package/dist/graphql/GraphQLClientError.js.map +1 -1
  406. package/dist/graphql/GraphQLProtocol.d.ts +12 -3
  407. package/dist/graphql/GraphQLProtocol.d.ts.map +1 -1
  408. package/dist/graphql/GraphQLProtocol.js +4 -1
  409. package/dist/graphql/GraphQLProtocol.js.map +1 -1
  410. package/dist/http/Cookies.d.ts +172 -0
  411. package/dist/http/Cookies.d.ts.map +1 -1
  412. package/dist/http/Cookies.js +143 -1
  413. package/dist/http/Cookies.js.map +1 -1
  414. package/dist/http/FetchHttpClient.d.ts +26 -2
  415. package/dist/http/FetchHttpClient.d.ts.map +1 -1
  416. package/dist/http/FetchHttpClient.js +78 -15
  417. package/dist/http/FetchHttpClient.js.map +1 -1
  418. package/dist/http/HttpClient.d.ts +268 -15
  419. package/dist/http/HttpClient.d.ts.map +1 -1
  420. package/dist/http/HttpClient.js +140 -7
  421. package/dist/http/HttpClient.js.map +1 -1
  422. package/dist/http/HttpClientRequest.d.ts +9 -5
  423. package/dist/http/HttpClientRequest.d.ts.map +1 -1
  424. package/dist/http/HttpClientRequest.js +2 -3
  425. package/dist/http/HttpClientRequest.js.map +1 -1
  426. package/dist/http/HttpClientResponse.d.ts.map +1 -1
  427. package/dist/http/HttpClientResponse.js +3 -2
  428. package/dist/http/HttpClientResponse.js.map +1 -1
  429. package/dist/http/HttpMethod.d.ts +7 -1
  430. package/dist/http/HttpMethod.d.ts.map +1 -1
  431. package/dist/http/HttpMethod.js +3 -8
  432. package/dist/http/HttpMethod.js.map +1 -1
  433. package/dist/http/HttpServerRequest.d.ts +5 -2
  434. package/dist/http/HttpServerRequest.d.ts.map +1 -1
  435. package/dist/http/HttpServerRequest.js +44 -39
  436. package/dist/http/HttpServerRequest.js.map +1 -1
  437. package/dist/http/HttpServerResponse.d.ts.map +1 -1
  438. package/dist/http/HttpServerResponse.js +3 -2
  439. package/dist/http/HttpServerResponse.js.map +1 -1
  440. package/dist/http/HttpTraceContext.d.ts +2 -1
  441. package/dist/http/HttpTraceContext.d.ts.map +1 -1
  442. package/dist/http/HttpTraceContext.js +7 -5
  443. package/dist/http/HttpTraceContext.js.map +1 -1
  444. package/dist/http/ProblemDetails.d.ts +96 -0
  445. package/dist/http/ProblemDetails.d.ts.map +1 -0
  446. package/dist/http/ProblemDetails.js +98 -0
  447. package/dist/http/ProblemDetails.js.map +1 -0
  448. package/dist/http/index.d.ts +5 -0
  449. package/dist/http/index.d.ts.map +1 -1
  450. package/dist/http/index.js +5 -0
  451. package/dist/http/index.js.map +1 -1
  452. package/dist/http/internal/decompression.js +3 -2
  453. package/dist/http/internal/decompression.js.map +1 -1
  454. package/dist/http/internal/mimeTypes.d.ts +4 -1
  455. package/dist/http/internal/mimeTypes.d.ts.map +1 -1
  456. package/dist/http/internal/mimeTypes.js +4 -1
  457. package/dist/http/internal/mimeTypes.js.map +1 -1
  458. package/dist/http/internal/urlParams.js +8 -0
  459. package/dist/http/internal/urlParams.js.map +1 -1
  460. package/dist/http-api/HttpApiBuilder.js +19 -5
  461. package/dist/http-api/HttpApiBuilder.js.map +1 -1
  462. package/dist/http-api/HttpApiClient.d.ts +63 -0
  463. package/dist/http-api/HttpApiClient.d.ts.map +1 -1
  464. package/dist/http-api/HttpApiClient.js +51 -0
  465. package/dist/http-api/HttpApiClient.js.map +1 -1
  466. package/dist/http-api/HttpApiEndpoint.d.ts.map +1 -1
  467. package/dist/http-api/HttpApiEndpoint.js +14 -5
  468. package/dist/http-api/HttpApiEndpoint.js.map +1 -1
  469. package/dist/http-api/HttpApiError.d.ts +185 -13
  470. package/dist/http-api/HttpApiError.d.ts.map +1 -1
  471. package/dist/http-api/HttpApiError.js +128 -0
  472. package/dist/http-api/HttpApiError.js.map +1 -1
  473. package/dist/http-api/HttpApiMiddleware.d.ts +64 -17
  474. package/dist/http-api/HttpApiMiddleware.d.ts.map +1 -1
  475. package/dist/http-api/HttpApiMiddleware.js +85 -1
  476. package/dist/http-api/HttpApiMiddleware.js.map +1 -1
  477. package/dist/http-api/HttpApiSchema.d.ts +76 -14
  478. package/dist/http-api/HttpApiSchema.d.ts.map +1 -1
  479. package/dist/http-api/HttpApiSchema.js +54 -1
  480. package/dist/http-api/HttpApiSchema.js.map +1 -1
  481. package/dist/index.d.ts +5 -5
  482. package/dist/index.d.ts.map +1 -1
  483. package/dist/index.js +5 -5
  484. package/dist/index.js.map +1 -1
  485. package/dist/internal/dateTime.js +49 -24
  486. package/dist/internal/dateTime.js.map +1 -1
  487. package/dist/internal/effect.js +35 -14
  488. package/dist/internal/effect.js.map +1 -1
  489. package/dist/internal/glob.d.ts +2 -0
  490. package/dist/internal/glob.d.ts.map +1 -0
  491. package/dist/internal/glob.js +808 -0
  492. package/dist/internal/glob.js.map +1 -0
  493. package/dist/internal/graphql.js +21 -7
  494. package/dist/internal/graphql.js.map +1 -1
  495. package/dist/internal/graphqlHeaders.d.ts +7 -0
  496. package/dist/internal/graphqlHeaders.d.ts.map +1 -1
  497. package/dist/internal/graphqlHeaders.js +11 -0
  498. package/dist/internal/graphqlHeaders.js.map +1 -1
  499. package/dist/internal/matcher.js +10 -0
  500. package/dist/internal/matcher.js.map +1 -1
  501. package/dist/internal/persistence.js +9 -0
  502. package/dist/internal/persistence.js.map +1 -1
  503. package/dist/internal/rcRef.js +4 -1
  504. package/dist/internal/rcRef.js.map +1 -1
  505. package/dist/internal/request.js +29 -42
  506. package/dist/internal/request.js.map +1 -1
  507. package/dist/internal/schema/fromJsonSchemaDocument.js +7 -8
  508. package/dist/internal/schema/fromJsonSchemaDocument.js.map +1 -1
  509. package/dist/internal/schema/toCodeDocument.js +6 -3
  510. package/dist/internal/schema/toCodeDocument.js.map +1 -1
  511. package/dist/internal/trie.js +42 -13
  512. package/dist/internal/trie.js.map +1 -1
  513. package/dist/internal/ulid.js +41 -0
  514. package/dist/internal/ulid.js.map +1 -1
  515. package/dist/internal/uuid.js +52 -8
  516. package/dist/internal/uuid.js.map +1 -1
  517. package/dist/internal/version.js +1 -1
  518. package/dist/jose/JoseError.d.ts +285 -0
  519. package/dist/jose/JoseError.d.ts.map +1 -0
  520. package/dist/jose/JoseError.js +269 -0
  521. package/dist/jose/JoseError.js.map +1 -0
  522. package/dist/jose/Jwe.d.ts +128 -0
  523. package/dist/jose/Jwe.d.ts.map +1 -0
  524. package/dist/jose/Jwe.js +134 -0
  525. package/dist/jose/Jwe.js.map +1 -0
  526. package/dist/jose/Jwk.d.ts +597 -0
  527. package/dist/jose/Jwk.d.ts.map +1 -0
  528. package/dist/jose/Jwk.js +503 -0
  529. package/dist/jose/Jwk.js.map +1 -0
  530. package/dist/jose/Jwks.d.ts +236 -0
  531. package/dist/jose/Jwks.d.ts.map +1 -0
  532. package/dist/jose/Jwks.js +306 -0
  533. package/dist/jose/Jwks.js.map +1 -0
  534. package/dist/jose/Jws.d.ts +177 -0
  535. package/dist/jose/Jws.d.ts.map +1 -0
  536. package/dist/jose/Jws.js +183 -0
  537. package/dist/jose/Jws.js.map +1 -0
  538. package/dist/jose/Jwt.d.ts +270 -0
  539. package/dist/jose/Jwt.d.ts.map +1 -0
  540. package/dist/jose/Jwt.js +293 -0
  541. package/dist/jose/Jwt.js.map +1 -0
  542. package/dist/jose/index.d.ts +51 -0
  543. package/dist/jose/index.d.ts.map +1 -0
  544. package/dist/jose/index.js +52 -0
  545. package/dist/jose/index.js.map +1 -0
  546. package/dist/jose/internal/compact.d.ts +2 -0
  547. package/dist/jose/internal/compact.d.ts.map +1 -0
  548. package/dist/jose/internal/compact.js +179 -0
  549. package/dist/jose/internal/compact.js.map +1 -0
  550. package/dist/net/Host.d.ts.map +1 -1
  551. package/dist/net/Host.js +5 -10
  552. package/dist/net/Host.js.map +1 -1
  553. package/dist/observability/Otlp.d.ts +15 -4
  554. package/dist/observability/Otlp.d.ts.map +1 -1
  555. package/dist/observability/Otlp.js +10 -0
  556. package/dist/observability/Otlp.js.map +1 -1
  557. package/dist/observability/OtlpResource.d.ts +7 -0
  558. package/dist/observability/OtlpResource.d.ts.map +1 -1
  559. package/dist/observability/OtlpResource.js +11 -1
  560. package/dist/observability/OtlpResource.js.map +1 -1
  561. package/dist/observability/OtlpSerialization.d.ts +1 -1
  562. package/dist/observability/OtlpSerialization.d.ts.map +1 -1
  563. package/dist/observability/OtlpSerialization.js +10 -4
  564. package/dist/observability/OtlpSerialization.js.map +1 -1
  565. package/dist/observability/internal/otlpProtobuf.js +3 -3
  566. package/dist/observability/internal/otlpProtobuf.js.map +1 -1
  567. package/dist/observability/internal/protobuf.js +6 -0
  568. package/dist/observability/internal/protobuf.js.map +1 -1
  569. package/dist/persistence/CircuitBreaker.d.ts +98 -38
  570. package/dist/persistence/CircuitBreaker.d.ts.map +1 -1
  571. package/dist/persistence/CircuitBreaker.js +67 -29
  572. package/dist/persistence/CircuitBreaker.js.map +1 -1
  573. package/dist/persistence/KeyValueStore.d.ts +47 -2
  574. package/dist/persistence/KeyValueStore.d.ts.map +1 -1
  575. package/dist/persistence/KeyValueStore.js +129 -18
  576. package/dist/persistence/KeyValueStore.js.map +1 -1
  577. package/dist/persistence/PersistedQueue.d.ts +9 -0
  578. package/dist/persistence/PersistedQueue.d.ts.map +1 -1
  579. package/dist/persistence/PersistedQueue.js +94 -52
  580. package/dist/persistence/PersistedQueue.js.map +1 -1
  581. package/dist/persistence/Persistence.d.ts +10 -4
  582. package/dist/persistence/Persistence.d.ts.map +1 -1
  583. package/dist/persistence/Persistence.js +18 -11
  584. package/dist/persistence/Persistence.js.map +1 -1
  585. package/dist/persistence/RateLimiter.d.ts +8 -0
  586. package/dist/persistence/RateLimiter.d.ts.map +1 -1
  587. package/dist/persistence/RateLimiter.js +63 -12
  588. package/dist/persistence/RateLimiter.js.map +1 -1
  589. package/dist/persistence/index.d.ts +1 -1
  590. package/dist/persistence/index.js +1 -1
  591. package/dist/process/ChildProcess.d.ts +207 -67
  592. package/dist/process/ChildProcess.d.ts.map +1 -1
  593. package/dist/process/ChildProcess.js +56 -158
  594. package/dist/process/ChildProcess.js.map +1 -1
  595. package/dist/process/ChildProcessSpawner.d.ts +5 -0
  596. package/dist/process/ChildProcessSpawner.d.ts.map +1 -1
  597. package/dist/process/ChildProcessSpawner.js.map +1 -1
  598. package/dist/process/CommandLine.d.ts +294 -0
  599. package/dist/process/CommandLine.d.ts.map +1 -0
  600. package/dist/process/CommandLine.js +481 -0
  601. package/dist/process/CommandLine.js.map +1 -0
  602. package/dist/process/index.d.ts +5 -0
  603. package/dist/process/index.d.ts.map +1 -1
  604. package/dist/process/index.js +5 -0
  605. package/dist/process/index.js.map +1 -1
  606. package/dist/reactivity/Atom.d.ts +2 -1
  607. package/dist/reactivity/Atom.d.ts.map +1 -1
  608. package/dist/reactivity/Atom.js +3 -4
  609. package/dist/reactivity/Atom.js.map +1 -1
  610. package/dist/reactivity/AtomRegistry.js +17 -7
  611. package/dist/reactivity/AtomRegistry.js.map +1 -1
  612. package/dist/rpc/Rpc.d.ts +1 -1
  613. package/dist/rpc/Rpc.d.ts.map +1 -1
  614. package/dist/rpc/Rpc.js.map +1 -1
  615. package/dist/rpc/RpcClient.d.ts +28 -1
  616. package/dist/rpc/RpcClient.d.ts.map +1 -1
  617. package/dist/rpc/RpcClient.js +78 -27
  618. package/dist/rpc/RpcClient.js.map +1 -1
  619. package/dist/rpc/RpcMessage.d.ts +13 -3
  620. package/dist/rpc/RpcMessage.d.ts.map +1 -1
  621. package/dist/rpc/RpcMessage.js +1 -0
  622. package/dist/rpc/RpcMessage.js.map +1 -1
  623. package/dist/rpc/RpcSerialization.d.ts.map +1 -1
  624. package/dist/rpc/RpcSerialization.js +6 -0
  625. package/dist/rpc/RpcSerialization.js.map +1 -1
  626. package/dist/rpc/RpcServer.d.ts +31 -0
  627. package/dist/rpc/RpcServer.d.ts.map +1 -1
  628. package/dist/rpc/RpcServer.js +139 -66
  629. package/dist/rpc/RpcServer.js.map +1 -1
  630. package/dist/schema/Model.d.ts +14 -0
  631. package/dist/schema/Model.d.ts.map +1 -1
  632. package/dist/schema/Model.js +18 -3
  633. package/dist/schema/Model.js.map +1 -1
  634. package/dist/sql/Migrator.d.ts +9 -20
  635. package/dist/sql/Migrator.d.ts.map +1 -1
  636. package/dist/sql/Migrator.js +20 -53
  637. package/dist/sql/Migrator.js.map +1 -1
  638. package/dist/sql/MigratorFileSystem.d.ts +21 -0
  639. package/dist/sql/MigratorFileSystem.d.ts.map +1 -0
  640. package/dist/sql/MigratorFileSystem.js +57 -0
  641. package/dist/sql/MigratorFileSystem.js.map +1 -0
  642. package/dist/sql/SqlClient.d.ts +38 -3
  643. package/dist/sql/SqlClient.d.ts.map +1 -1
  644. package/dist/sql/SqlClient.js +9 -12
  645. package/dist/sql/SqlClient.js.map +1 -1
  646. package/dist/sql/Statement.d.ts +61 -9
  647. package/dist/sql/Statement.d.ts.map +1 -1
  648. package/dist/sql/Statement.js +24 -33
  649. package/dist/sql/Statement.js.map +1 -1
  650. package/dist/sql/index.js +1 -1
  651. package/dist/testing/index.d.ts +0 -5
  652. package/dist/testing/index.d.ts.map +1 -1
  653. package/dist/testing/index.js +0 -5
  654. package/dist/testing/index.js.map +1 -1
  655. package/dist/workflow/Workflow.d.ts +4 -0
  656. package/dist/workflow/Workflow.d.ts.map +1 -1
  657. package/dist/workflow/Workflow.js.map +1 -1
  658. package/dist/workflow/WorkflowEngine.d.ts.map +1 -1
  659. package/dist/workflow/WorkflowEngine.js +5 -0
  660. package/dist/workflow/WorkflowEngine.js.map +1 -1
  661. package/dist/workflow/internal/crypto.js +9 -8
  662. package/dist/workflow/internal/crypto.js.map +1 -1
  663. package/package.json +7 -1
  664. package/src/BigDecimal.ts +173 -16
  665. package/src/Channel.ts +17 -11
  666. package/src/Config.ts +7 -1
  667. package/src/Context.ts +34 -10
  668. package/src/Cron.ts +178 -29
  669. package/src/Duration.ts +140 -0
  670. package/src/Effect.ts +914 -85
  671. package/src/Equal.ts +3 -3
  672. package/src/FileSystem.ts +65 -4
  673. package/src/Glob.ts +205 -0
  674. package/src/Hash.ts +5 -4
  675. package/src/Iterable.ts +8 -5
  676. package/src/Match.ts +127 -0
  677. package/src/Path.ts +6 -1
  678. package/src/Pool.ts +75 -16
  679. package/src/Random.ts +3 -3
  680. package/src/RcMap.ts +5 -1
  681. package/src/Schedule.ts +26 -3
  682. package/src/Schema.ts +1191 -63
  683. package/src/SchemaGetter.ts +27 -11
  684. package/src/SchemaRepresentation.ts +23 -2
  685. package/src/SchemaTransformation.ts +10 -5
  686. package/src/ScopedCache.ts +5 -9
  687. package/src/Semaphore.ts +141 -0
  688. package/src/Stream.ts +15 -6
  689. package/src/Terminal.ts +19 -1
  690. package/src/ai/AiError.ts +56 -80
  691. package/src/ai/Decision.ts +257 -6
  692. package/src/ai/DecisionModel.ts +171 -28
  693. package/src/ai/McpClient.ts +488 -91
  694. package/src/ai/McpSchema.ts +119 -0
  695. package/src/ai/McpServer.ts +1525 -319
  696. package/src/ai/McpTest.ts +380 -0
  697. package/src/ai/Prompt.ts +16 -11
  698. package/src/ai/Response.ts +2 -22
  699. package/src/ai/Tool.ts +32 -18
  700. package/src/ai/index.ts +6 -0
  701. package/src/ai/internal/mcpCore.ts +243 -56
  702. package/src/ai/internal/mcpProtocol/v2024_11_05.ts +7 -8
  703. package/src/ai/internal/mcpProtocol/v2025_03_26.ts +7 -8
  704. package/src/ai/internal/mcpProtocol/v2025_06_18.ts +7 -8
  705. package/src/ai/internal/mcpProtocol/v2025_11_25.ts +7 -8
  706. package/src/ai/internal/mcpProtocol/v2026_07_28.ts +56 -17
  707. package/src/ai/internal/mcpProtocol.ts +44 -0
  708. package/src/ai/internal/mcpRuntime.ts +15 -8
  709. package/src/ai/internal/mcpSkills.ts +480 -0
  710. package/src/ai/internal/mcpStatefulRuntime.ts +14 -2
  711. package/src/cli/Argument.ts +6 -0
  712. package/src/cli/CliOutput.ts +117 -49
  713. package/src/cli/Command.ts +23 -0
  714. package/src/cli/Flag.ts +107 -0
  715. package/src/cli/HelpDoc.ts +18 -1
  716. package/src/cli/Param.ts +6 -0
  717. package/src/cli/Primitive.ts +16 -1
  718. package/src/cli/Prompt.ts +1 -0
  719. package/src/cli/internal/help.ts +21 -9
  720. package/src/cluster/ClusterWorkflowEngine.ts +22 -8
  721. package/src/cluster/Reply.ts +1 -1
  722. package/src/cluster/Sharding.ts +96 -26
  723. package/src/cluster/ShardingConfig.ts +41 -3
  724. package/src/cluster/SingleRunner.ts +3 -3
  725. package/src/cluster/SqlMessageStorage.ts +49 -17
  726. package/src/cluster/SqlRunnerStorage.ts +37 -27
  727. package/src/cluster/internal/entityManager.ts +24 -10
  728. package/src/crypto/Aead.ts +517 -0
  729. package/src/crypto/Cipher.ts +326 -0
  730. package/src/crypto/CryptoError.ts +242 -0
  731. package/src/crypto/Digest.ts +167 -0
  732. package/src/crypto/Kdf.ts +315 -0
  733. package/src/crypto/KeyAgreement.ts +489 -0
  734. package/src/crypto/KeyFormat.ts +741 -0
  735. package/src/crypto/KeyWrap.ts +639 -0
  736. package/src/crypto/Mac.ts +386 -0
  737. package/src/crypto/SecureRandom.ts +459 -0
  738. package/src/crypto/Signature.ts +673 -0
  739. package/src/crypto/WebCrypto.ts +84 -0
  740. package/src/crypto/index.ts +78 -0
  741. package/src/crypto/internal/asymmetric.ts +330 -0
  742. package/src/crypto/internal/chacha.ts +1088 -0
  743. package/src/crypto/internal/der.ts +110 -0
  744. package/src/crypto/internal/digest.ts +16 -0
  745. package/src/crypto/internal/key.ts +242 -0
  746. package/src/crypto/internal/md5.ts +170 -0
  747. package/src/crypto/internal/webCrypto.ts +150 -0
  748. package/src/encoding/Base64Url.ts +32 -5
  749. package/src/encoding/Csv.ts +1298 -0
  750. package/src/encoding/Hex.ts +3 -2
  751. package/src/encoding/Ndjson.ts +6 -5
  752. package/src/encoding/SchemaBinary.ts +40 -4
  753. package/src/encoding/Sse.ts +5 -3
  754. package/src/encoding/Toml.ts +85 -20
  755. package/src/encoding/Yaml.ts +61 -18
  756. package/src/encoding/index.ts +6 -0
  757. package/src/eventlog/EventJournal.ts +4 -3
  758. package/src/eventlog/EventLog.ts +347 -15
  759. package/src/eventlog/EventLogEncryption.ts +118 -110
  760. package/src/eventlog/EventLogMessage.ts +273 -1
  761. package/src/eventlog/EventLogRemote.ts +367 -23
  762. package/src/eventlog/EventLogServer.ts +54 -20
  763. package/src/eventlog/EventLogServerEncrypted.ts +1135 -67
  764. package/src/eventlog/EventLogServerUnencrypted.ts +19 -2
  765. package/src/eventlog/EventLogSessionAuth.ts +82 -70
  766. package/src/eventlog/EventRow.ts +12 -3
  767. package/src/eventlog/SqlEventJournal.ts +2 -2
  768. package/src/eventlog/SqlEventLogServerEncrypted.ts +1244 -136
  769. package/src/eventlog/SqlEventLogServerUnencrypted.ts +2 -2
  770. package/src/eventlog/internal/batches.ts +30 -0
  771. package/src/eventlog/internal/compaction.ts +64 -0
  772. package/src/eventlog/internal/identityRootSecretDerivation.ts +93 -123
  773. package/src/eventlog/internal/remoteCompaction.ts +92 -0
  774. package/src/graphql/GraphQLClient.ts +3 -1
  775. package/src/graphql/GraphQLClientError.ts +15 -22
  776. package/src/graphql/GraphQLProtocol.ts +12 -3
  777. package/src/http/Cookies.ts +281 -1
  778. package/src/http/FetchHttpClient.ts +88 -16
  779. package/src/http/HttpClient.ts +299 -33
  780. package/src/http/HttpClientRequest.ts +12 -9
  781. package/src/http/HttpClientResponse.ts +3 -2
  782. package/src/http/HttpMethod.ts +10 -2
  783. package/src/http/HttpServerRequest.ts +76 -53
  784. package/src/http/HttpServerResponse.ts +3 -2
  785. package/src/http/HttpTraceContext.ts +7 -4
  786. package/src/http/ProblemDetails.ts +149 -0
  787. package/src/http/index.ts +6 -0
  788. package/src/http/internal/decompression.ts +4 -4
  789. package/src/http/internal/mimeTypes.ts +4 -1
  790. package/src/http/internal/urlParams.ts +8 -0
  791. package/src/http-api/HttpApiBuilder.ts +24 -12
  792. package/src/http-api/HttpApiClient.ts +67 -1
  793. package/src/http-api/HttpApiEndpoint.ts +14 -5
  794. package/src/http-api/HttpApiError.ts +250 -0
  795. package/src/http-api/HttpApiMiddleware.ts +95 -1
  796. package/src/http-api/HttpApiSchema.ts +106 -15
  797. package/src/index.ts +6 -6
  798. package/src/internal/dateTime.ts +54 -24
  799. package/src/internal/effect.ts +40 -18
  800. package/src/internal/glob.ts +952 -0
  801. package/src/internal/graphql.ts +27 -9
  802. package/src/internal/graphqlHeaders.ts +13 -0
  803. package/src/internal/matcher.ts +17 -0
  804. package/src/internal/persistence.ts +11 -0
  805. package/src/internal/rcRef.ts +4 -1
  806. package/src/internal/request.ts +51 -58
  807. package/src/internal/schema/fromJsonSchemaDocument.ts +11 -10
  808. package/src/internal/schema/toCodeDocument.ts +7 -3
  809. package/src/internal/trie.ts +43 -14
  810. package/src/internal/ulid.ts +44 -0
  811. package/src/internal/uuid.ts +57 -16
  812. package/src/internal/version.ts +1 -1
  813. package/src/jose/JoseError.ts +329 -0
  814. package/src/jose/Jwe.ts +196 -0
  815. package/src/jose/Jwk.ts +777 -0
  816. package/src/jose/Jwks.ts +418 -0
  817. package/src/jose/Jws.ts +312 -0
  818. package/src/jose/Jwt.ts +493 -0
  819. package/src/jose/index.ts +58 -0
  820. package/src/jose/internal/compact.ts +195 -0
  821. package/src/net/Host.ts +5 -10
  822. package/src/observability/Otlp.ts +21 -4
  823. package/src/observability/OtlpResource.ts +9 -1
  824. package/src/observability/OtlpSerialization.ts +13 -5
  825. package/src/observability/internal/otlpProtobuf.ts +6 -6
  826. package/src/observability/internal/protobuf.ts +10 -0
  827. package/src/persistence/CircuitBreaker.ts +113 -48
  828. package/src/persistence/KeyValueStore.ts +219 -22
  829. package/src/persistence/PersistedQueue.ts +128 -59
  830. package/src/persistence/Persistence.ts +20 -13
  831. package/src/persistence/RateLimiter.ts +84 -15
  832. package/src/persistence/index.ts +1 -1
  833. package/src/process/ChildProcess.ts +255 -260
  834. package/src/process/ChildProcessSpawner.ts +5 -0
  835. package/src/process/CommandLine.ts +630 -0
  836. package/src/process/index.ts +6 -0
  837. package/src/reactivity/Atom.ts +5 -5
  838. package/src/reactivity/AtomRegistry.ts +20 -9
  839. package/src/rpc/Rpc.ts +3 -1
  840. package/src/rpc/RpcClient.ts +94 -38
  841. package/src/rpc/RpcMessage.ts +13 -3
  842. package/src/rpc/RpcSerialization.ts +3 -0
  843. package/src/rpc/RpcServer.ts +176 -78
  844. package/src/schema/Model.ts +26 -3
  845. package/src/sql/Migrator.ts +38 -80
  846. package/src/sql/MigratorFileSystem.ts +71 -0
  847. package/src/sql/SqlClient.ts +45 -24
  848. package/src/sql/Statement.ts +60 -29
  849. package/src/sql/index.ts +1 -1
  850. package/src/testing/index.ts +0 -6
  851. package/src/workflow/Workflow.ts +4 -0
  852. package/src/workflow/WorkflowEngine.ts +5 -0
  853. package/src/workflow/internal/crypto.ts +15 -11
  854. package/dist/Crypto.d.ts +0 -244
  855. package/dist/Crypto.d.ts.map +0 -1
  856. package/dist/Crypto.js +0 -139
  857. package/dist/Crypto.js.map +0 -1
  858. package/dist/testing/TestCrypto.d.ts +0 -73
  859. package/dist/testing/TestCrypto.d.ts.map +0 -1
  860. package/dist/testing/TestCrypto.js +0 -87
  861. package/dist/testing/TestCrypto.js.map +0 -1
  862. package/src/Crypto.ts +0 -347
  863. package/src/testing/TestCrypto.ts +0 -94
@@ -12,18 +12,26 @@
12
12
  * @since 4.0.0
13
13
  */
14
14
  import * as Arr from "../Array.js";
15
+ import * as Cause from "../Cause.js";
16
+ import * as Clock from "../Clock.js";
15
17
  import * as Context from "../Context.js";
18
+ import * as SecureRandom from "../crypto/SecureRandom.js";
19
+ import * as Data from "../Data.js";
20
+ import * as Duration from "../Duration.js";
16
21
  import * as Effect from "../Effect.js";
17
22
  import * as Equal from "../Equal.js";
18
23
  import * as Uuid from "../internal/uuid.js";
24
+ import * as Latch from "../Latch.js";
19
25
  import * as Layer from "../Layer.js";
20
26
  import * as PubSub from "../PubSub.js";
27
+ import * as Pull from "../Pull.js";
21
28
  import * as RcMap from "../RcMap.js";
22
29
  import * as RpcServer from "../rpc/RpcServer.js";
23
30
  import * as Stream from "../Stream.js";
24
31
  import { makeRemoteIdUnsafe } from "./EventJournal.js";
25
- import { ChangesRpc, EventLogProtocolError, EventLogRemoteRpcs, WriteEntries } from "./EventLogMessage.js";
32
+ import { ChangesRpc, ChunkedMessage, CompactionInputRpc, CompactionPartRpc, CompactionStatus, EventLogCompactionRpcs, EventLogProtocolError, EventLogRemoteRpcs, WriteEntries } from "./EventLogMessage.js";
26
33
  import * as EventLogServer from "./EventLogServer.js";
34
+ import { hourMillis, lagHour, logCommit, logNoOp, logRollback, maxSegments, positionsPerSegment } from "./internal/compaction.js";
27
35
  /**
28
36
  * Provides RPC handlers for the encrypted event-log server.
29
37
  *
@@ -33,6 +41,10 @@ import * as EventLogServer from "./EventLogServer.js";
33
41
  * sequences. Change streams encode stored batches, excluding this connection's
34
42
  * writes.
35
43
  *
44
+ * It also serves `EventLogCompactionRpcs`. If `Storage` provides `compaction`,
45
+ * it sets `HelloResponse.compaction` and applies the compaction policy;
46
+ * otherwise those handlers fail with `NotFound`.
47
+ *
36
48
  * @stability unstable
37
49
  * @category layers
38
50
  * @since 4.0.0
@@ -40,9 +52,10 @@ import * as EventLogServer from "./EventLogServer.js";
40
52
  export const layerRpcHandlers = /*#__PURE__*/Layer.unwrap(/*#__PURE__*/Effect.gen(function* () {
41
53
  const storage = yield* Storage;
42
54
  const remoteId = yield* storage.getId;
43
- return EventLogServer.layerRpcHandlers({
55
+ return Layer.merge(EventLogServer.layerRpcHandlers({
44
56
  remoteId,
45
57
  firstSequence: storage.firstSequence,
58
+ compaction: storage.compaction !== undefined,
46
59
  getOrCreateSessionAuthBinding: (publicKey, signingPublicKey) => storage.getOrCreateSessionAuthBinding(publicKey, signingPublicKey),
47
60
  onWrite: Effect.fnUntraced(function* (data, authenticatedPublicKeys, writes) {
48
61
  const request = yield* WriteEntries.decode(data).pipe(Effect.mapError(_ => new EventLogProtocolError({
@@ -83,10 +96,11 @@ export const layerRpcHandlers = /*#__PURE__*/Layer.unwrap(/*#__PURE__*/Effect.ge
83
96
  entryIds: batch => batch.entryIds,
84
97
  sequence: batch => batch.sequence + batch.entryIds.length - 1
85
98
  }, storage.changes(publicKey, storeId, startSequence)).pipe(Stream.mapArrayEffect(batches => Effect.map(ChangesRpc.encodeEncrypted(batches), Arr.of)))
86
- });
99
+ }), layerCompactionRpcHandlers(storage));
87
100
  }));
88
101
  // Acknowledges each entry occurrence in request order: at its position in the
89
- // batch this write stored, or, for a skipped batch, where it was first stored.
102
+ // batch this write stored, or, for a skipped batch, where it was first stored
103
+ // if that is above the active compaction base.
90
104
  const toWriteAcks = /*#__PURE__*/Effect.fnUntraced(function* (storage, publicKey, storeId, batches, stored) {
91
105
  // Stored batches keep request order, and each batch has its own random iv.
92
106
  let next = 0;
@@ -97,8 +111,11 @@ const toWriteAcks = /*#__PURE__*/Effect.fnUntraced(function* (storage, publicKey
97
111
  const skipped = batches.flatMap((batch, i) => storedAt[i] === undefined ? batch.entryIds : []);
98
112
  const firstStored = new Map();
99
113
  if (skipped.length > 0) {
114
+ // An id first stored at or below the active base may have been dropped, so
115
+ // acking it would move the client's cursor past kept entries.
116
+ const base = storage.compaction === undefined ? -Infinity : (yield* storage.compaction.status(publicKey, storeId)).base;
100
117
  for (const ack of yield* storage.entrySequences(publicKey, storeId, skipped)) {
101
- firstStored.set(Uuid.stringify(ack.entryId), ack.sequence);
118
+ if (ack.sequence > base) firstStored.set(Uuid.stringify(ack.entryId), ack.sequence);
102
119
  }
103
120
  }
104
121
  const acks = [];
@@ -111,6 +128,213 @@ const toWriteAcks = /*#__PURE__*/Effect.fnUntraced(function* (storage, publicKey
111
128
  }));
112
129
  return acks;
113
130
  });
131
+ const layerCompactionRpcHandlers = storage => EventLogCompactionRpcs.toLayer(Effect.sync(() => {
132
+ const compaction = storage.compaction;
133
+ const toFrames = EventLogServer.makeFramer();
134
+ const protocolError = (requestTag, request, code, message) => new EventLogProtocolError({
135
+ requestTag,
136
+ publicKey: request.publicKey,
137
+ storeId: request.storeId,
138
+ code,
139
+ message
140
+ });
141
+ const fromCompactionError = (requestTag, request) => error => error._tag === "CompactionNotFound" ? protocolError(requestTag, request, "NotFound", "Compaction stage not found") : protocolError(requestTag, request, "InvalidRequest", error.message);
142
+ const withCompaction = (requestTag, request, client, f) => {
143
+ if (!Context.getOrUndefined(client.annotations, EventLogServer.AuthenticatedIdentities)?.has(request.publicKey)) {
144
+ return Effect.fail(protocolError(requestTag, request, "Forbidden", "Identity is not authenticated"));
145
+ }
146
+ if (compaction === undefined) {
147
+ return Effect.fail(protocolError(requestTag, request, "NotFound", "Compaction is not supported"));
148
+ }
149
+ return Effect.mapError(f(compaction), fromCompactionError(requestTag, request));
150
+ };
151
+ const withCompactionStream = (requestTag, request, client, f) => Stream.unwrap(withCompaction(requestTag, request, client, compaction => Effect.succeed(Stream.mapError(f(compaction), fromCompactionError(requestTag, request)))));
152
+ const getStatus = Effect.fnUntraced(function* (compaction, publicKey, storeId) {
153
+ const status = yield* compaction.status(publicKey, storeId);
154
+ return {
155
+ status,
156
+ wanted: isCompactionWanted(status, compaction.config.thresholdFloor)
157
+ };
158
+ });
159
+ return EventLogCompactionRpcs.of({
160
+ "EventLog.CompactionStatus": (request, {
161
+ client
162
+ }) => withCompaction("CompactionStatus", request, client, compaction => Effect.map(getStatus(compaction, request.publicKey, request.storeId), ({
163
+ status,
164
+ wanted
165
+ }) => new CompactionStatus({
166
+ wanted,
167
+ head: status.head
168
+ }))),
169
+ "EventLog.CompactionBegin": (request, {
170
+ client
171
+ }) => withCompaction("CompactionBegin", request, client, compaction => Effect.gen(function* () {
172
+ const {
173
+ status,
174
+ wanted
175
+ } = yield* getStatus(compaction, request.publicKey, request.storeId);
176
+ if (!wanted) {
177
+ return {
178
+ _tag: "NotWanted"
179
+ };
180
+ }
181
+ const result = yield* compaction.begin(request.publicKey, request.storeId, {
182
+ through: status.lagHead
183
+ });
184
+ return result._tag === "Busy" ? {
185
+ _tag: "Busy"
186
+ } : {
187
+ _tag: "Started",
188
+ stageId: result.stageId
189
+ };
190
+ })),
191
+ "EventLog.CompactionInput": (request, {
192
+ client
193
+ }) => withCompactionStream("CompactionInput", request, client, compaction => compaction.inputHeaders(request.publicKey, request.storeId, request.stageId).pipe(Stream.mapArrayEffect(headers => Effect.map(Effect.orDie(CompactionInputRpc.encodeHeaders(headers)), toFrames)))),
194
+ "EventLog.CompactionFetch": (request, {
195
+ client
196
+ }) => withCompactionStream("CompactionFetch", request, client, compaction => compaction.fetch(request.publicKey, request.storeId, request.stageId, request.batches).pipe(Stream.mapArrayEffect(batches => Effect.map(Effect.orDie(ChangesRpc.encodeEncrypted(batches)), toFrames)))),
197
+ "EventLog.CompactionPart": (request, {
198
+ client
199
+ }) => withCompaction("CompactionPart", request, client, compaction => Effect.gen(function* () {
200
+ const {
201
+ publicKey,
202
+ stageId,
203
+ storeId
204
+ } = request;
205
+ const data = ChunkedMessage.join(getPendingSegments(client, request), request.chunk);
206
+ if (data === undefined) {
207
+ return;
208
+ }
209
+ const batches = yield* CompactionPartRpc.decodeSegment(data).pipe(Effect.catch(() => Effect.andThen(compaction.abort(publicKey, storeId, stageId), Effect.fail(new CompactionInvalidRequest({
210
+ stageId,
211
+ message: "Invalid segment"
212
+ })))));
213
+ yield* compaction.stagePart(publicKey, storeId, stageId, request.chunk.id, batches);
214
+ })),
215
+ "EventLog.CompactionAbort": (request, {
216
+ client
217
+ }) => withCompaction("CompactionAbort", request, client, compaction => {
218
+ releasePendingSegments(client, request);
219
+ return compaction.abort(request.publicKey, request.storeId, request.stageId);
220
+ }),
221
+ "EventLog.CompactionCommit": (request, {
222
+ client
223
+ }) => withCompaction("CompactionCommit", request, client, compaction => {
224
+ const {
225
+ publicKey,
226
+ stageId,
227
+ storeId
228
+ } = request;
229
+ releasePendingSegments(client, request);
230
+ if (request.result._tag === "NoOp") {
231
+ return Effect.as(compaction.recordNoOp(publicKey, storeId, stageId), "Committed");
232
+ }
233
+ return checkSnapshot(compaction, publicKey, storeId, stageId, request.result.segmentCount).pipe(Effect.tapError(error => error._tag === "CompactionInvalidRequest" ? compaction.abort(publicKey, storeId, stageId) : Effect.void), Effect.flatMap(virtualSequences => compaction.commit(publicKey, storeId, stageId, virtualSequences)));
234
+ })
235
+ });
236
+ }));
237
+ // The input past the lag must reach the threshold. After `k` consecutive
238
+ // no-ops, the lag head must also have moved `threshold * 2^(k-1)` past the
239
+ // latest one.
240
+ const isCompactionWanted = (status, thresholdFloor) => {
241
+ const threshold = Math.max(status.activeKeptCount, thresholdFloor);
242
+ const pending = status.lagHead - status.base;
243
+ if (pending <= 0 || pending < threshold) return false;
244
+ if (status.noOp === undefined) return true;
245
+ return status.lagHead - status.noOp.at >= threshold * 2 ** (status.noOp.count - 1);
246
+ };
247
+ // Checks the staged batches against the stage's input in one pass over both
248
+ // and returns each batch's virtual start sequence. The kept ids, read in
249
+ // segments 0 to segmentCount - 1, must be a non-empty, repeat-free
250
+ // subsequence of the input's ids.
251
+ const checkSnapshot = /*#__PURE__*/Effect.fnUntraced(function* (compaction, publicKey, storeId, stageId, segmentCount) {
252
+ const invalid = message => Effect.fail(new CompactionInvalidRequest({
253
+ stageId,
254
+ message
255
+ }));
256
+ const pullInput = yield* Stream.toPull(compaction.inputHeaders(publicKey, storeId, stageId));
257
+ let headers = [];
258
+ let headerIndex = 0;
259
+ let entryIndex = 0;
260
+ let lastInputSequence = -1;
261
+ const nextInput = Effect.gen(function* () {
262
+ while (true) {
263
+ const header = headers[headerIndex];
264
+ if (header === undefined) {
265
+ const chunk = yield* Pull.catchDone(pullInput, () => Effect.succeed(undefined));
266
+ if (chunk === undefined) return undefined;
267
+ headers = chunk;
268
+ headerIndex = 0;
269
+ continue;
270
+ }
271
+ if (entryIndex === header.entryIds.length) {
272
+ headerIndex++;
273
+ entryIndex = 0;
274
+ continue;
275
+ }
276
+ const sequence = header.sequence + entryIndex;
277
+ const id = Uuid.stringify(header.entryIds[entryIndex++]);
278
+ lastInputSequence = sequence;
279
+ return {
280
+ id,
281
+ sequence
282
+ };
283
+ }
284
+ });
285
+ // The input sequence of each batch's last kept entry, and its size.
286
+ const ends = [];
287
+ const sizes = [];
288
+ let segment = -1;
289
+ yield* Stream.runForEach(compaction.stagedHeaders(publicKey, storeId, stageId), header => Effect.gen(function* () {
290
+ const headerSegment = Math.floor(header.position / positionsPerSegment);
291
+ if (headerSegment !== segment) {
292
+ if (headerSegment !== segment + 1 || headerSegment >= segmentCount) {
293
+ return yield* invalid("Unexpected segment");
294
+ }
295
+ segment = headerSegment;
296
+ }
297
+ let last = -1;
298
+ for (const entryId of header.entryIds) {
299
+ const id = Uuid.stringify(entryId);
300
+ let input = yield* nextInput;
301
+ while (input !== undefined && input.id !== id) input = yield* nextInput;
302
+ if (input === undefined) return yield* invalid("Kept entry is not in the input, or is out of order");
303
+ last = input.sequence;
304
+ }
305
+ ends.push(last);
306
+ sizes.push(header.entryIds.length);
307
+ }));
308
+ if (ends.length === 0) return yield* invalid("Snapshot is empty");
309
+ if (segment !== segmentCount - 1) return yield* invalid("Missing segment");
310
+ while ((yield* nextInput) !== undefined) {
311
+ // Drain the input to learn its last sequence.
312
+ }
313
+ // Each batch ends at its last kept entry's input sequence, and the final one
314
+ // at the end of the input, so no batch starts below its entries' input.
315
+ return ends.map((end, i) => (i === ends.length - 1 ? lastInputSequence : end) - sizes[i] + 1);
316
+ }, Effect.scoped);
317
+ // One connection's unjoined segment pieces, keyed by identity, store and
318
+ // stage. The JSON tuple key keeps the components unambiguous.
319
+ class PendingSegments extends /*#__PURE__*/Context.Service()("effect/eventlog/EventLogServerEncrypted/PendingSegments") {}
320
+ const pendingSegmentsKey = request => JSON.stringify([request.publicKey, request.storeId, request.stageId]);
321
+ const getPendingSegments = (client, request) => {
322
+ let stages = Context.getOrUndefined(client.annotations, PendingSegments);
323
+ if (stages === undefined) {
324
+ stages = new Map();
325
+ client.annotate(PendingSegments, stages);
326
+ }
327
+ const key = pendingSegmentsKey(request);
328
+ let pending = stages.get(key);
329
+ if (pending === undefined) {
330
+ pending = ChunkedMessage.initialJoinState();
331
+ stages.set(key, pending);
332
+ }
333
+ return pending;
334
+ };
335
+ const releasePendingSegments = (client, request) => {
336
+ Context.getOrUndefined(client.annotations, PendingSegments)?.delete(pendingSegmentsKey(request));
337
+ };
114
338
  /**
115
339
  * Provides an encrypted event-log RPC server using `EventLogRemoteRpcs` and the
116
340
  * encrypted server RPC handlers.
@@ -125,7 +349,8 @@ const toWriteAcks = /*#__PURE__*/Effect.fnUntraced(function* (storage, publicKey
125
349
  * This layer installs `EventLogRemoteRpcs` on the provided RPC server protocol
126
350
  * and wires those RPCs to `layerRpcHandlers`. Encrypted batches, session
127
351
  * authentication bindings, remote ids, and change streams are delegated to
128
- * `Storage`.
352
+ * `Storage`. It also installs `EventLogCompactionRpcs`, which clients call
353
+ * only when `Storage` provides `compaction`.
129
354
  *
130
355
  * @see {@link layerRpcHandlers} for the encrypted handler layer without installing an RPC server protocol
131
356
  * @see {@link Storage} for the storage service required by this layer
@@ -135,7 +360,7 @@ const toWriteAcks = /*#__PURE__*/Effect.fnUntraced(function* (storage, publicKey
135
360
  * @category layers
136
361
  * @since 4.0.0
137
362
  */
138
- export const layer = /*#__PURE__*/RpcServer.layer(EventLogRemoteRpcs).pipe(/*#__PURE__*/Layer.provide(layerRpcHandlers));
363
+ export const layer = /*#__PURE__*/RpcServer.layer(EventLogRemoteRpcs.merge(EventLogCompactionRpcs)).pipe(/*#__PURE__*/Layer.provide(layerRpcHandlers));
139
364
  /**
140
365
  * Defines the backing store service used by the encrypted event-log server.
141
366
  *
@@ -158,34 +383,143 @@ export const layer = /*#__PURE__*/RpcServer.layer(EventLogRemoteRpcs).pipe(/*#__
158
383
  * whose last sequence is at or after `startSequence`, followed by newly stored
159
384
  * batches.
160
385
  *
386
+ * Storages that support remote compaction provide `compaction`. With an active
387
+ * snapshot, `changes` serves snapshot batches by their virtual sequences for a
388
+ * start sequence at or below the snapshot base, then the originals above it.
389
+ *
161
390
  * @stability unstable
162
391
  * @category services
163
392
  * @since 4.0.0
164
393
  */
165
394
  export class Storage extends /*#__PURE__*/Context.Service()("effect/eventlog/EventLogServer/Storage") {}
166
395
  /**
167
- * Creates an in-memory encrypted server `Storage`.
396
+ * Error raised when a compaction stage has expired, was aborted or committed,
397
+ * or is unknown to the store.
398
+ *
399
+ * @stability unstable
400
+ * @category errors
401
+ * @since 4.0.0
402
+ */
403
+ export class CompactionNotFound extends /*#__PURE__*/Data.TaggedError("CompactionNotFound") {}
404
+ /**
405
+ * Error raised when a compaction Part fails validation.
406
+ *
407
+ * @stability unstable
408
+ * @category errors
409
+ * @since 4.0.0
410
+ */
411
+ export class CompactionInvalidRequest extends /*#__PURE__*/Data.TaggedError("CompactionInvalidRequest") {}
412
+ /**
413
+ * Error raised when a rollback is refused.
414
+ *
415
+ * **Details**
416
+ *
417
+ * `NotActive` means the expected activation is not the active one,
418
+ * `NoPrevious` that there is no earlier generation, and `PruneStarted` that
419
+ * the previous generation has started to be pruned.
420
+ *
421
+ * @stability unstable
422
+ * @category errors
423
+ * @since 4.0.0
424
+ */
425
+ export class CompactionRollbackError extends /*#__PURE__*/Data.TaggedError("CompactionRollbackError") {}
426
+ /**
427
+ * Resolves compaction options against their defaults.
428
+ *
429
+ * **Details**
430
+ *
431
+ * Dies with an `IllegalArgumentError` unless `grace` is longer than both `lag`
432
+ * and `stageTtl`, `stageTtl` and `sweepInterval` are positive, and
433
+ * `thresholdFloor` is a non-negative integer.
434
+ *
435
+ * @stability unstable
436
+ * @category constructors
437
+ * @since 4.0.0
438
+ */
439
+ export const makeCompactionConfig = options => Effect.suspend(() => {
440
+ const config = {
441
+ grace: Duration.fromInputUnsafe(options?.grace ?? "30 days"),
442
+ lag: Duration.fromInputUnsafe(options?.lag ?? "24 hours"),
443
+ stageTtl: Duration.fromInputUnsafe(options?.stageTtl ?? "10 minutes"),
444
+ thresholdFloor: options?.thresholdFloor ?? 1000,
445
+ sweepInterval: Duration.fromInputUnsafe(options?.sweepInterval ?? "1 hour")
446
+ };
447
+ if (!Duration.isGreaterThan(config.grace, config.lag) || !Duration.isGreaterThan(config.grace, config.stageTtl)) {
448
+ return Effect.die(new Cause.IllegalArgumentError("Compaction grace must be longer than lag and stageTtl"));
449
+ }
450
+ if (!Duration.isGreaterThan(config.stageTtl, Duration.zero)) {
451
+ return Effect.die(new Cause.IllegalArgumentError("Compaction stageTtl must be positive"));
452
+ }
453
+ if (!Duration.isGreaterThan(config.sweepInterval, Duration.zero)) {
454
+ return Effect.die(new Cause.IllegalArgumentError("Compaction sweepInterval must be positive"));
455
+ }
456
+ if (!Number.isSafeInteger(config.thresholdFloor) || config.thresholdFloor < 0) {
457
+ return Effect.die(new Cause.IllegalArgumentError("Compaction thresholdFloor must be a non-negative integer"));
458
+ }
459
+ return Effect.succeed(config);
460
+ });
461
+ /**
462
+ * Creates an in-memory encrypted server `Storage` with default compaction
463
+ * tuning.
168
464
  *
169
465
  * **Details**
170
466
  *
171
467
  * Data, session authentication bindings, and streams are process-local and are
172
468
  * released with the surrounding scope.
173
469
  *
470
+ * @see {@link makeStorageMemoryWith} to configure compaction
471
+ *
472
+ * @stability unstable
473
+ * @category constructors
474
+ * @since 4.0.0
475
+ */
476
+ export const makeStorageMemory = /*#__PURE__*/Effect.suspend(() => makeStorageMemoryWith({}));
477
+ /**
478
+ * Creates an in-memory encrypted server `Storage`.
479
+ *
480
+ * **Details**
481
+ *
482
+ * Data, session authentication bindings, and streams are process-local and are
483
+ * released with the surrounding scope. The storage always provides
484
+ * `compaction`. Its sweep runs on `Clock` only while some store has a
485
+ * generation to prune or a stage to expire.
486
+ *
487
+ * Dies when the compaction options are invalid (see {@link makeCompactionConfig}).
488
+ *
174
489
  * @stability unstable
175
490
  * @category constructors
176
491
  * @since 4.0.0
177
492
  */
178
- export const makeStorageMemory = /*#__PURE__*/Effect.gen(function* () {
493
+ export const makeStorageMemoryWith = /*#__PURE__*/Effect.fnUntraced(function* (options) {
494
+ const config = yield* makeCompactionConfig(options.compaction);
495
+ const graceMillis = Duration.toMillis(config.grace);
496
+ const lagMillis = Duration.toMillis(config.lag);
497
+ const stageTtlMillis = Duration.toMillis(config.stageTtl);
179
498
  const journals = new Map();
180
499
  const sessionAuthBindings = new Map();
181
500
  const remoteId = makeRemoteIdUnsafe();
182
501
  const ensureJournal = scopeKey => {
183
502
  let journal = journals.get(scopeKey);
184
503
  if (journal) return journal;
504
+ const originals = {
505
+ id: SecureRandom.uuidV4Unsafe(),
506
+ set: undefined,
507
+ base: -1,
508
+ keptCount: undefined,
509
+ previous: undefined,
510
+ supersededAt: undefined,
511
+ pruneStartedAt: undefined
512
+ };
185
513
  journal = {
186
514
  knownIds: new Map(),
187
515
  batches: [],
188
- nextSequence: 0
516
+ nextSequence: 0,
517
+ buckets: new Map(),
518
+ activations: [originals],
519
+ active: originals,
520
+ noOp: undefined,
521
+ openStage: undefined,
522
+ nextSweepAt: undefined
189
523
  };
190
524
  journals.set(scopeKey, journal);
191
525
  return journal;
@@ -194,6 +528,386 @@ export const makeStorageMemory = /*#__PURE__*/Effect.gen(function* () {
194
528
  lookup: _scopeKey => Effect.acquireRelease(PubSub.unbounded(), PubSub.shutdown),
195
529
  idleTimeToLive: 60000
196
530
  });
531
+ // Open while any store has something for the sweep to do, so an idle
532
+ // storage never sleeps on the clock.
533
+ const sweepPending = Latch.makeUnsafe(false);
534
+ const schedulePrune = (journal, at) => {
535
+ journal.nextSweepAt = journal.nextSweepAt === undefined ? at : Math.min(journal.nextSweepAt, at);
536
+ sweepPending.openUnsafe();
537
+ };
538
+ const closeStage = (journal, stage) => {
539
+ if (journal.openStage === stage) journal.openStage = undefined;
540
+ };
541
+ const sweep = now => {
542
+ let pending = false;
543
+ for (const journal of journals.values()) {
544
+ if (journal.openStage !== undefined && journal.openStage.expiresAt <= now) closeStage(journal, journal.openStage);
545
+ if (journal.nextSweepAt !== undefined && journal.nextSweepAt <= now) prune(journal, now);
546
+ pending ||= journal.openStage !== undefined || journal.nextSweepAt !== undefined;
547
+ }
548
+ if (!pending) sweepPending.closeUnsafe();
549
+ };
550
+ // Keeps what the active generation and every generation still within grace
551
+ // need, which is their batch sets and the originals above their bases.
552
+ const prune = (journal, now) => {
553
+ const kept = journal.activations.filter(activation => activation === journal.active || activation.pruneStartedAt === undefined && activation.supersededAt + graceMillis > now);
554
+ const keptSets = new Set(kept.map(activation => activation.set));
555
+ for (const activation of journal.activations) {
556
+ if (kept.includes(activation) || activation.pruneStartedAt !== undefined) continue;
557
+ activation.pruneStartedAt = now;
558
+ if (activation.set !== undefined && !keptSets.has(activation.set)) activation.set.batches = [];
559
+ }
560
+ const keptBase = Math.min(...kept.map(activation => activation.base));
561
+ const first = journal.batches.findIndex(batch => batch.sequence + batch.entryIds.length - 1 > keptBase);
562
+ journal.batches.splice(0, first === -1 ? journal.batches.length : first);
563
+ journal.nextSweepAt = undefined;
564
+ for (const activation of journal.activations) {
565
+ if (activation !== journal.active && activation.pruneStartedAt === undefined) {
566
+ schedulePrune(journal, activation.supersededAt + graceMillis);
567
+ }
568
+ }
569
+ };
570
+ yield* Effect.forkScoped(Effect.forever(sweepPending.await.pipe(Effect.andThen(Effect.sleep(config.sweepInterval)), Effect.andThen(Clock.currentTimeMillis), Effect.flatMap(now => Effect.sync(() => sweep(now))))));
571
+ // The highest last sequence stored in an hour that ended before now - lag.
572
+ const lagHead = (journal, now) => {
573
+ const pastLag = lagHour(now, lagMillis);
574
+ let head = -1;
575
+ for (const [hour, lastSequence] of journal.buckets) {
576
+ if (hour <= pastLag) head = Math.max(head, lastSequence);
577
+ }
578
+ return head;
579
+ };
580
+ const recordBucket = (journal, now, lastSequence) => {
581
+ const hour = Math.floor(now / hourMillis);
582
+ const existing = journal.buckets.get(hour);
583
+ if (existing !== undefined) {
584
+ journal.buckets.set(hour, Math.max(existing, lastSequence));
585
+ return;
586
+ }
587
+ journal.buckets.set(hour, lastSequence);
588
+ // Only the newest bucket past the lag matters for the lag head.
589
+ const pastLag = Array.from(journal.buckets.keys()).filter(bucket => bucket <= lagHour(now, lagMillis));
590
+ const newest = Math.max(...pastLag);
591
+ for (const bucket of pastLag) {
592
+ if (bucket < newest) journal.buckets.delete(bucket);
593
+ }
594
+ };
595
+ // The input of a stage: its pinned batch set, then originals in (base, through].
596
+ const inputBatches = (journal, stage) => [...(stage.pinned.set?.batches ?? []), ...journal.batches.filter(batch => batch.sequence > stage.pinned.base && batch.sequence + batch.entryIds.length - 1 <= stage.through)];
597
+ // A stage that Part, NoOp and Commit can act on.
598
+ const findOpenStage = (publicKey, storeId, stageId, now) => {
599
+ const journal = journals.get(makeEncryptedScopeKey({
600
+ publicKey,
601
+ storeId
602
+ }));
603
+ const stage = journal?.openStage;
604
+ if (journal === undefined || stage === undefined || stage.id !== stageId) return undefined;
605
+ if (stage.expiresAt <= now) {
606
+ closeStage(journal, stage);
607
+ return undefined;
608
+ }
609
+ return {
610
+ stage,
611
+ journal
612
+ };
613
+ };
614
+ // Call within the same execution-time block that captures the input rows.
615
+ const findInputStage = (publicKey, storeId, stageId, now) => {
616
+ const found = findOpenStage(publicKey, storeId, stageId, now);
617
+ return found?.stage.pinned.pruneStartedAt === undefined ? found : undefined;
618
+ };
619
+ const compaction = {
620
+ config,
621
+ status: (publicKey, storeId) => Effect.map(Clock.currentTimeMillis, now => {
622
+ const journal = ensureJournal(makeEncryptedScopeKey({
623
+ publicKey,
624
+ storeId
625
+ }));
626
+ return {
627
+ head: journal.nextSequence - 1,
628
+ base: journal.active.base,
629
+ activeKeptCount: journal.active.keptCount ?? 0,
630
+ lagHead: lagHead(journal, now),
631
+ noOp: journal.noOp
632
+ };
633
+ }),
634
+ begin: (publicKey, storeId, {
635
+ through
636
+ }) => Effect.map(Clock.currentTimeMillis, now => {
637
+ const scopeKey = makeEncryptedScopeKey({
638
+ publicKey,
639
+ storeId
640
+ });
641
+ const journal = ensureJournal(scopeKey);
642
+ const open = journal.openStage;
643
+ if (open !== undefined) {
644
+ if (open.expiresAt > now) return {
645
+ _tag: "Busy",
646
+ expiresAt: open.expiresAt
647
+ };
648
+ closeStage(journal, open);
649
+ }
650
+ const stage = {
651
+ id: SecureRandom.uuidV4Unsafe(),
652
+ pinned: journal.active,
653
+ through,
654
+ expiresAt: now + stageTtlMillis,
655
+ staged: new Map()
656
+ };
657
+ journal.openStage = stage;
658
+ sweepPending.openUnsafe();
659
+ return {
660
+ _tag: "Started",
661
+ stageId: stage.id
662
+ };
663
+ }),
664
+ inputHeaders: (publicKey, storeId, stageId) => Clock.currentTimeMillis.pipe(Effect.flatMap(now => {
665
+ const found = findInputStage(publicKey, storeId, stageId, now);
666
+ if (found === undefined) return Effect.fail(new CompactionNotFound({
667
+ stageId
668
+ }));
669
+ const {
670
+ journal,
671
+ stage
672
+ } = found;
673
+ return Effect.succeed(Stream.fromArray(inputBatches(journal, stage).map(batch => ({
674
+ sequence: batch.sequence,
675
+ entryIds: batch.entryIds
676
+ }))));
677
+ }), Stream.unwrap),
678
+ fetch: (publicKey, storeId, stageId, sequences) => Clock.currentTimeMillis.pipe(Effect.flatMap(now => {
679
+ const found = findInputStage(publicKey, storeId, stageId, now);
680
+ if (found === undefined) return Effect.fail(new CompactionNotFound({
681
+ stageId
682
+ }));
683
+ const {
684
+ journal,
685
+ stage
686
+ } = found;
687
+ const fetched = [];
688
+ for (const sequence of sequences) {
689
+ const batch = sequence <= stage.pinned.base ? findBatch(stage.pinned.set?.batches ?? [], sequence) : sequence <= stage.through ? findBatch(journal.batches, sequence) : undefined;
690
+ if (batch !== undefined) fetched.push(batch);
691
+ }
692
+ return Effect.succeed(Stream.fromArray(fetched));
693
+ }), Stream.unwrap),
694
+ stagePart: (publicKey, storeId, stageId, segment, batches) => Effect.flatMap(Clock.currentTimeMillis, now => {
695
+ const found = findOpenStage(publicKey, storeId, stageId, now);
696
+ if (found === undefined) return Effect.fail(new CompactionNotFound({
697
+ stageId
698
+ }));
699
+ const {
700
+ journal,
701
+ stage
702
+ } = found;
703
+ const reject = message => {
704
+ closeStage(journal, stage);
705
+ return Effect.fail(new CompactionInvalidRequest({
706
+ stageId,
707
+ message
708
+ }));
709
+ };
710
+ if (!Number.isSafeInteger(segment) || segment < 0 || segment >= maxSegments) {
711
+ return reject("Invalid segment index");
712
+ }
713
+ if (batches.length > positionsPerSegment) return reject("Too many batches in a segment");
714
+ // Positions are the staged rows' key, so a retried segment inserts nothing.
715
+ let inserted = 0;
716
+ batches.forEach((batch, i) => {
717
+ const position = segment * positionsPerSegment + i;
718
+ if (stage.staged.has(position)) return;
719
+ stage.staged.set(position, batch);
720
+ inserted++;
721
+ });
722
+ if (inserted === 0) return Effect.succeed("AlreadyStored");
723
+ stage.expiresAt = now + stageTtlMillis;
724
+ return Effect.succeed("Stored");
725
+ }),
726
+ stagedHeaders: (publicKey, storeId, stageId) => Effect.flatMap(Clock.currentTimeMillis, now => {
727
+ const found = findOpenStage(publicKey, storeId, stageId, now);
728
+ if (found === undefined) {
729
+ return Effect.fail(new CompactionNotFound({
730
+ stageId
731
+ }));
732
+ }
733
+ return Effect.succeed(Stream.fromArray(stagedBatches(found.stage).map(({
734
+ batch,
735
+ position
736
+ }) => ({
737
+ position,
738
+ entryIds: batch.entryIds
739
+ }))));
740
+ }).pipe(Stream.unwrap),
741
+ commit: (publicKey, storeId, stageId, virtualSequences) => Effect.flatMap(Clock.currentTimeMillis, now => {
742
+ const found = findOpenStage(publicKey, storeId, stageId, now);
743
+ if (found === undefined) return Effect.fail(new CompactionNotFound({
744
+ stageId
745
+ }));
746
+ const {
747
+ journal,
748
+ stage
749
+ } = found;
750
+ if (stage.pinned !== journal.active) {
751
+ const keptCount = stagedBatches(stage).reduce((count, {
752
+ batch
753
+ }) => count + batch.entryIds.length, 0);
754
+ closeStage(journal, stage);
755
+ return Effect.as(logCommit({
756
+ publicKey,
757
+ storeId,
758
+ result: "Superseded",
759
+ through: stage.through,
760
+ keptCount,
761
+ activationId: undefined
762
+ }), "Superseded");
763
+ }
764
+ const staged = stagedBatches(stage);
765
+ if (staged.length !== virtualSequences.length) {
766
+ return Effect.die(new Cause.IllegalArgumentError("Expected one virtual sequence per staged batch"));
767
+ }
768
+ const keptCount = staged.reduce((count, {
769
+ batch
770
+ }) => count + batch.entryIds.length, 0);
771
+ const activation = {
772
+ id: SecureRandom.uuidV4Unsafe(),
773
+ set: {
774
+ batches: staged.map(({
775
+ batch
776
+ }, i) => ({
777
+ ...batch,
778
+ sequence: virtualSequences[i]
779
+ }))
780
+ },
781
+ base: stage.through,
782
+ keptCount,
783
+ previous: journal.active,
784
+ supersededAt: undefined,
785
+ pruneStartedAt: undefined
786
+ };
787
+ journal.active.supersededAt = now;
788
+ journal.activations.push(activation);
789
+ journal.active = activation;
790
+ journal.noOp = undefined;
791
+ schedulePrune(journal, now + graceMillis);
792
+ closeStage(journal, stage);
793
+ // Log this commit's activation id. A concurrent rollback could change
794
+ // the active one before the logger runs.
795
+ return Effect.as(logCommit({
796
+ publicKey,
797
+ storeId,
798
+ result: "Committed",
799
+ through: stage.through,
800
+ keptCount,
801
+ activationId: activation.id
802
+ }), "Committed");
803
+ }),
804
+ recordNoOp: (publicKey, storeId, stageId) => Effect.flatMap(Clock.currentTimeMillis, now => {
805
+ const found = findOpenStage(publicKey, storeId, stageId, now);
806
+ if (found === undefined) return Effect.fail(new CompactionNotFound({
807
+ stageId
808
+ }));
809
+ const {
810
+ journal,
811
+ stage
812
+ } = found;
813
+ // A rollback since begin cleared the no-op state, so a stale run leaves it.
814
+ if (stage.pinned === journal.active) {
815
+ journal.noOp = {
816
+ at: stage.through,
817
+ count: (journal.noOp?.count ?? 0) + 1
818
+ };
819
+ }
820
+ closeStage(journal, stage);
821
+ return logNoOp({
822
+ publicKey,
823
+ storeId,
824
+ stageId,
825
+ through: stage.through
826
+ });
827
+ }),
828
+ abort: (publicKey, storeId, stageId) => Effect.sync(() => {
829
+ const journal = journals.get(makeEncryptedScopeKey({
830
+ publicKey,
831
+ storeId
832
+ }));
833
+ if (journal?.openStage?.id === stageId) closeStage(journal, journal.openStage);
834
+ }),
835
+ rollback: Effect.fnUntraced(function* (publicKey, storeId, expectedActivationId) {
836
+ const scopeKey = makeEncryptedScopeKey({
837
+ publicKey,
838
+ storeId
839
+ });
840
+ const pubsub = yield* RcMap.get(pubsubs, scopeKey);
841
+ const now = yield* Clock.currentTimeMillis;
842
+ return yield* Effect.suspend(() => {
843
+ const journal = ensureJournal(scopeKey);
844
+ const withdrawn = journal.active;
845
+ if (withdrawn.id !== expectedActivationId) {
846
+ return Effect.fail(new CompactionRollbackError({
847
+ reason: "NotActive"
848
+ }));
849
+ }
850
+ const target = withdrawn.previous;
851
+ if (target === undefined) return Effect.fail(new CompactionRollbackError({
852
+ reason: "NoPrevious"
853
+ }));
854
+ if (target.pruneStartedAt !== undefined) {
855
+ return Effect.fail(new CompactionRollbackError({
856
+ reason: "PruneStarted"
857
+ }));
858
+ }
859
+ const activation = {
860
+ ...target,
861
+ id: SecureRandom.uuidV4Unsafe(),
862
+ supersededAt: undefined,
863
+ pruneStartedAt: undefined
864
+ };
865
+ // The input of the stage that built the withdrawn generation.
866
+ const input = [...(target.set?.batches ?? []), ...journal.batches.filter(batch => batch.sequence > target.base && batch.sequence + batch.entryIds.length - 1 <= withdrawn.base)];
867
+ withdrawn.supersededAt = now;
868
+ journal.activations.push(activation);
869
+ journal.active = activation;
870
+ journal.noOp = undefined;
871
+ schedulePrune(journal, now + graceMillis);
872
+ for (const {
873
+ encryptedBatch,
874
+ entryIds,
875
+ iv
876
+ } of input) {
877
+ const batch = {
878
+ sequence: journal.nextSequence,
879
+ entryIds,
880
+ iv,
881
+ encryptedBatch
882
+ };
883
+ journal.nextSequence += entryIds.length;
884
+ journal.batches.push(batch);
885
+ PubSub.publishUnsafe(pubsub, batch);
886
+ }
887
+ if (input.length > 0) recordBucket(journal, now, journal.nextSequence - 1);
888
+ return Effect.as(logRollback({
889
+ publicKey,
890
+ storeId,
891
+ activation,
892
+ withdrawn
893
+ }), activation.id);
894
+ });
895
+ }, Effect.scoped),
896
+ history: (publicKey, storeId) => Effect.sync(() => {
897
+ const journal = ensureJournal(makeEncryptedScopeKey({
898
+ publicKey,
899
+ storeId
900
+ }));
901
+ return journal.activations.map(activation => ({
902
+ activationId: activation.id,
903
+ base: activation.base,
904
+ keptCount: activation.keptCount,
905
+ active: activation === journal.active,
906
+ supersededAt: activation === journal.active ? undefined : activation.supersededAt,
907
+ restorable: activation.pruneStartedAt === undefined
908
+ }));
909
+ })
910
+ };
197
911
  return Storage.of({
198
912
  getId: Effect.succeed(remoteId),
199
913
  getOrCreateSessionAuthBinding: (publicKey, signingPublicKey) => Effect.sync(() => {
@@ -208,6 +922,7 @@ export const makeStorageMemory = /*#__PURE__*/Effect.gen(function* () {
208
922
  storeId
209
923
  });
210
924
  const pubsub = yield* RcMap.get(pubsubs, scopeKey);
925
+ const now = yield* Clock.currentTimeMillis;
211
926
  const journal = ensureJournal(scopeKey);
212
927
  const stored = [];
213
928
  for (const batch of batches) {
@@ -225,6 +940,7 @@ export const makeStorageMemory = /*#__PURE__*/Effect.gen(function* () {
225
940
  stored.push(remoteBatch);
226
941
  PubSub.publishUnsafe(pubsub, remoteBatch);
227
942
  }
943
+ if (stored.length > 0) recordBucket(journal, now, journal.nextSequence - 1);
228
944
  return stored;
229
945
  }, Effect.scoped),
230
946
  entrySequences: (publicKey, storeId, entryIds) => Effect.sync(() => {
@@ -249,20 +965,59 @@ export const makeStorageMemory = /*#__PURE__*/Effect.gen(function* () {
249
965
  });
250
966
  const pubsub = yield* RcMap.get(pubsubs, scopeKey);
251
967
  const subscription = yield* PubSub.subscribe(pubsub);
252
- const batches = ensureJournal(scopeKey).batches;
968
+ const journal = ensureJournal(scopeKey);
969
+ const {
970
+ base,
971
+ set
972
+ } = journal.active;
973
+ const live = Stream.fromSubscription(subscription);
974
+ // Below the base an active snapshot replaces the originals.
975
+ if (set !== undefined && startSequence <= base) {
976
+ if (set.batches.length === 0) {
977
+ return Stream.die(new Error(`The active compaction snapshot of store ${storeId} has no batches`));
978
+ }
979
+ const tail = journal.batches.filter(batch => batch.sequence > base);
980
+ return Stream.fromArray([...set.batches.filter(batch => batch.sequence + batch.entryIds.length > startSequence), ...tail]).pipe(Stream.concat(live));
981
+ }
982
+ const batches = journal.batches;
253
983
  const first = batches.findIndex(batch => batch.sequence + batch.entryIds.length > startSequence);
254
- return Stream.fromArray(first === -1 ? [] : batches.slice(first)).pipe(Stream.concat(Stream.fromSubscription(subscription)));
255
- }, Stream.unwrap)
984
+ return Stream.fromArray(first === -1 ? [] : batches.slice(first)).pipe(Stream.concat(live));
985
+ }, Stream.unwrap),
986
+ compaction
256
987
  });
257
988
  });
258
989
  /**
259
- * Provides encrypted server `Storage` using the in-memory implementation.
990
+ * Provides encrypted server `Storage` using the in-memory implementation with
991
+ * default compaction tuning.
992
+ *
993
+ * @see {@link layerStorageMemoryWith} to configure compaction
260
994
  *
261
995
  * @stability unstable
262
996
  * @category layers
263
997
  * @since 4.0.0
264
998
  */
265
999
  export const layerStorageMemory = /*#__PURE__*/Layer.effect(Storage)(makeStorageMemory);
1000
+ /**
1001
+ * Provides encrypted server `Storage` using the in-memory implementation.
1002
+ *
1003
+ * @stability unstable
1004
+ * @category layers
1005
+ * @since 4.0.0
1006
+ */
1007
+ export const layerStorageMemoryWith = options => Layer.effect(Storage)(makeStorageMemoryWith(options));
1008
+ const stagedBatches = stage => Array.from(stage.staged, ([position, batch]) => ({
1009
+ batch,
1010
+ position
1011
+ })).sort((a, b) => a.position - b.position);
1012
+ const findBatch = (batches, sequence) => {
1013
+ let low = 0;
1014
+ let high = batches.length;
1015
+ while (low < high) {
1016
+ const mid = low + high >>> 1;
1017
+ if (batches[mid].sequence < sequence) low = mid + 1;else high = mid;
1018
+ }
1019
+ return batches[low]?.sequence === sequence ? batches[low] : undefined;
1020
+ };
266
1021
  const makeEncryptedScopeKey = ({
267
1022
  publicKey,
268
1023
  storeId