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
@@ -0,0 +1,1417 @@
1
+ /**
2
+ * Encodes and decodes tar archives as streams in Effect channels.
3
+ *
4
+ * `decode` streams entry bodies from the archive input; `encode` streams them
5
+ * back into archive bytes. Neither buffers an entire entry body.
6
+ *
7
+ * The decoder reads the formats produced by common tools: v7, USTAR, PAX
8
+ * extended headers, and GNU long names and base-256 numbers. The encoder writes
9
+ * USTAR, adding PAX extended headers for fields that do not fit or for custom
10
+ * metadata. It does not access the file system or compress archives.
11
+ *
12
+ * @stability unstable
13
+ * @since 4.0.5
14
+ */
15
+ import * as Arr from "../Array.ts"
16
+ import * as Cause from "../Cause.ts"
17
+ import * as Channel from "../Channel.ts"
18
+ import * as Data from "../Data.ts"
19
+ import * as Effect from "../Effect.ts"
20
+ import * as Exit from "../Exit.ts"
21
+ import * as Predicate from "../Predicate.ts"
22
+ import * as Pull from "../Pull.ts"
23
+ import * as Scope from "../Scope.ts"
24
+ import * as Semaphore from "../Semaphore.ts"
25
+ import * as Stream from "../Stream.ts"
26
+ import type * as Types from "../Types.ts"
27
+
28
+ const TarErrorTypeId = "~effect/encoding/Tar/TarError"
29
+
30
+ /**
31
+ * Error raised when a tar archive cannot be encoded or decoded.
32
+ *
33
+ * **Details**
34
+ *
35
+ * The `kind` field identifies the failure:
36
+ *
37
+ * - `InvalidHeader`: a header has a bad checksum, a malformed field, or a value
38
+ * that cannot be written.
39
+ * - `Truncated`: the input ended inside a header or an entry body.
40
+ * - `SizeMismatch`: an entry body produced a byte count other than its declared
41
+ * `size`.
42
+ * - `Unsupported`: the archive uses a feature this module does not read, such
43
+ * as GNU sparse files.
44
+ * - `BodyConsumed`: an entry body was read after the decoder had moved past it.
45
+ *
46
+ * @stability unstable
47
+ * @category errors
48
+ * @since 4.0.5
49
+ */
50
+ export class TarError extends Data.TaggedError("TarError")<{
51
+ readonly kind: "InvalidHeader" | "Truncated" | "SizeMismatch" | "Unsupported" | "BodyConsumed"
52
+ readonly message: string
53
+ }> {
54
+ /**
55
+ * Marks this value as a tar error for runtime guards.
56
+ *
57
+ * @stability unstable
58
+ * @since 4.0.5
59
+ */
60
+ readonly [TarErrorTypeId] = TarErrorTypeId
61
+ }
62
+
63
+ /**
64
+ * Checks whether a value is a `TarError`.
65
+ *
66
+ * @stability unstable
67
+ * @category guards
68
+ * @since 4.0.5
69
+ */
70
+ export const isTarError = (u: unknown): u is TarError => Predicate.hasProperty(u, TarErrorTypeId)
71
+
72
+ /**
73
+ * Kind of filesystem object described by a tar entry.
74
+ *
75
+ * **Details**
76
+ *
77
+ * `Other` covers every typeflag without a dedicated kind, such as GNU volume
78
+ * labels; the raw flag is kept in `Header.typeflag`.
79
+ *
80
+ * @stability unstable
81
+ * @category models
82
+ * @since 4.0.5
83
+ */
84
+ export type EntryType =
85
+ | "File"
86
+ | "Directory"
87
+ | "Symlink"
88
+ | "Hardlink"
89
+ | "CharDevice"
90
+ | "BlockDevice"
91
+ | "Fifo"
92
+ | "Other"
93
+
94
+ /**
95
+ * Metadata of a tar entry.
96
+ *
97
+ * **Details**
98
+ *
99
+ * `path` and `linkTarget` are archive paths; hard link targets name another
100
+ * entry of the same archive. `mode` holds the permission bits, including
101
+ * setuid, setgid and sticky; file type bits, as in a `stat` mode, are dropped
102
+ * when decoding and encoding. `pax` holds the PAX extended header records,
103
+ * including those of global headers, that are not reflected in the other
104
+ * fields, such as `SCHILY.xattr.*`, `atime` or the `comment` of `git archive`.
105
+ * `devMajor` and `devMinor` are set for device entries only.
106
+ *
107
+ * @stability unstable
108
+ * @category models
109
+ * @since 4.0.5
110
+ */
111
+ export interface Header {
112
+ readonly path: string
113
+ readonly type: EntryType
114
+ readonly typeflag: string
115
+ readonly size: number
116
+ readonly mode: number
117
+ readonly uid: number
118
+ readonly gid: number
119
+ readonly uname: string
120
+ readonly gname: string
121
+ readonly mtime: Date
122
+ readonly linkTarget?: string | undefined
123
+ readonly devMajor?: number | undefined
124
+ readonly devMinor?: number | undefined
125
+ readonly pax: Readonly<Record<string, string>>
126
+ }
127
+
128
+ /**
129
+ * Tar entry: a header and a stream of exactly `header.size` body bytes.
130
+ *
131
+ * @stability unstable
132
+ * @category models
133
+ * @since 4.0.5
134
+ */
135
+ export interface Entry<E = never, R = never> {
136
+ readonly header: Header
137
+ readonly body: Stream.Stream<Uint8Array, E, R>
138
+ }
139
+
140
+ /**
141
+ * Options for the entry constructors.
142
+ *
143
+ * **Details**
144
+ *
145
+ * Unset fields default to mode `0o644` (`0o755` for directories, `0o777` for
146
+ * symlinks), uid and gid `0`, empty user and group names, an mtime at the Unix
147
+ * epoch, and no extra PAX records. The defaults make archives reproducible.
148
+ *
149
+ * @stability unstable
150
+ * @category models
151
+ * @since 4.0.5
152
+ */
153
+ export interface EntryOptions {
154
+ readonly mode?: number | undefined
155
+ readonly uid?: number | undefined
156
+ readonly gid?: number | undefined
157
+ readonly uname?: string | undefined
158
+ readonly gname?: string | undefined
159
+ readonly mtime?: Date | undefined
160
+ readonly pax?: Readonly<Record<string, string>> | undefined
161
+ }
162
+
163
+ const makeHeader = (
164
+ path: string,
165
+ type: "File" | "Directory" | "Symlink" | "Hardlink",
166
+ size: number,
167
+ options: EntryOptions | undefined,
168
+ linkTarget?: string
169
+ ): Header => ({
170
+ path,
171
+ type,
172
+ typeflag: typeflags[type],
173
+ size,
174
+ mode: options?.mode ?? (type === "Directory" ? 0o755 : type === "Symlink" ? 0o777 : 0o644),
175
+ uid: options?.uid ?? 0,
176
+ gid: options?.gid ?? 0,
177
+ uname: options?.uname ?? "",
178
+ gname: options?.gname ?? "",
179
+ mtime: options?.mtime ?? new Date(0),
180
+ ...(linkTarget === undefined || linkTarget === "" ? undefined : { linkTarget }),
181
+ pax: options?.pax ?? {}
182
+ })
183
+
184
+ /**
185
+ * Creates a regular file entry from in-memory content.
186
+ *
187
+ * **Details**
188
+ *
189
+ * String content is encoded as UTF-8, and `size` is the byte length of the
190
+ * content.
191
+ *
192
+ * @see {@link fileStream} for content that is streamed instead of held in memory
193
+ * @see {@link encode} for writing entries to an archive
194
+ *
195
+ * @stability unstable
196
+ * @category constructors
197
+ * @since 4.0.5
198
+ */
199
+ export const file = (path: string, content: string | Uint8Array, options?: EntryOptions): Entry => {
200
+ const bytes = typeof content === "string" ? textEncoder.encode(content) : content
201
+ const header = makeHeader(path, "File", bytes.length, options)
202
+ if (bytes.length === 0) return { header, body: Stream.empty }
203
+ const body = Stream.succeed(bytes)
204
+ inMemoryBodies.set(body, bytes)
205
+ return { header, body }
206
+ }
207
+
208
+ // Key by body identity so replacing an entry body bypasses the encode fast path.
209
+ const inMemoryBodies = new WeakMap<Stream.Stream<Uint8Array, unknown, unknown>, Uint8Array>()
210
+
211
+ /**
212
+ * Creates a regular file entry whose content is streamed from `body`.
213
+ *
214
+ * **When to use**
215
+ *
216
+ * Use when the content is too large to hold in memory, or is read from a file
217
+ * or another stream, and its byte length is known up front.
218
+ *
219
+ * **Details**
220
+ *
221
+ * The defaults match `file`: mode `0o644`, uid and gid `0`, and an mtime at the
222
+ * Unix epoch. `body` is not run until the entry is encoded.
223
+ *
224
+ * **Gotchas**
225
+ *
226
+ * `size` must be the exact byte length of `body`: `encode` fails with a
227
+ * `SizeMismatch` `TarError` when the body produces fewer or more bytes.
228
+ *
229
+ * @see {@link file} for in-memory content
230
+ * @see {@link encode} for writing entries to an archive
231
+ *
232
+ * @stability unstable
233
+ * @category constructors
234
+ * @since 4.0.5
235
+ */
236
+ export const fileStream = <E = never, R = never>(
237
+ path: string,
238
+ size: number,
239
+ body: Stream.Stream<Uint8Array, E, R>,
240
+ options?: EntryOptions
241
+ ): Entry<E, R> => ({
242
+ header: makeHeader(path, "File", size, options),
243
+ body
244
+ })
245
+
246
+ /**
247
+ * Creates a directory entry.
248
+ *
249
+ * **Details**
250
+ *
251
+ * A trailing `/` is added to a non-empty `path` when missing, as tar tools
252
+ * expect for directories.
253
+ *
254
+ * @stability unstable
255
+ * @category constructors
256
+ * @since 4.0.5
257
+ */
258
+ export const directory = (path: string, options?: EntryOptions): Entry => ({
259
+ // An empty path stays empty, so that `encode` rejects it
260
+ header: makeHeader(path === "" || path.endsWith("/") ? path : `${path}/`, "Directory", 0, options),
261
+ body: Stream.empty
262
+ })
263
+
264
+ /**
265
+ * Creates a symbolic link entry pointing at `target`.
266
+ *
267
+ * @stability unstable
268
+ * @category constructors
269
+ * @since 4.0.5
270
+ */
271
+ export const symlink = (path: string, target: string, options?: EntryOptions): Entry => ({
272
+ header: makeHeader(path, "Symlink", 0, options, target),
273
+ body: Stream.empty
274
+ })
275
+
276
+ /**
277
+ * Creates a hard link entry pointing at another entry of the archive.
278
+ *
279
+ * **Details**
280
+ *
281
+ * `target` is the archive path of an entry written earlier in the same
282
+ * archive.
283
+ *
284
+ * @stability unstable
285
+ * @category constructors
286
+ * @since 4.0.5
287
+ */
288
+ export const hardlink = (path: string, target: string, options?: EntryOptions): Entry => ({
289
+ header: makeHeader(path, "Hardlink", 0, options, target),
290
+ body: Stream.empty
291
+ })
292
+
293
+ /**
294
+ * Creates a channel that decodes tar archive bytes into entries.
295
+ *
296
+ * **Details**
297
+ *
298
+ * Each output chunk holds one entry, and each entry body streams exactly
299
+ * `header.size` bytes straight from the input. Pulling the next entry skips
300
+ * whatever is left of the current body, like Go's `tar.Reader`. The decoder
301
+ * reads v7, USTAR, PAX extended headers (applying `path`, `linkpath`, `size`,
302
+ * `uid`, `gid`, `uname`, `gname` and `mtime`), GNU long names and links, and
303
+ * base-256 numbers. The records of a PAX global header apply to every entry
304
+ * that follows, except `path`, `linkpath` and `size`, which describe a single
305
+ * entry. Anything after the end-of-archive marker is ignored.
306
+ *
307
+ * **Gotchas**
308
+ *
309
+ * - Read each body before pulling the next entry: a body read afterwards fails
310
+ * with a `BodyConsumed` `TarError`. Operators that pull ahead, such as
311
+ * `Stream.buffer`, therefore can't sit between `decode` and the body reads.
312
+ * - Read bodies while the entry stream runs, for example in `Stream.mapEffect`:
313
+ * once it has ended, as after `Stream.runCollect`, `Stream.runHead` or
314
+ * `Stream.take`, every body fails with a `BodyConsumed` `TarError`.
315
+ * - A body reads the entry's bytes once: running it again continues where the
316
+ * previous run stopped.
317
+ * - Directories, links, devices and FIFOs have no body, and their `size` is
318
+ * reported as `0`.
319
+ * - Paths and link targets are returned as written in the archive, so they can
320
+ * be absolute or contain `..`, and a symlink entry can redirect a later entry
321
+ * outside the target directory. Validate both before writing entries to disk.
322
+ * - Names that are not valid UTF-8 are decoded with replacement characters.
323
+ * - PAX extended headers and GNU long names of more than 1 MiB fail with an
324
+ * `InvalidHeader` `TarError`.
325
+ * - The channel completes only when its input ends: input after the
326
+ * end-of-archive marker is read and discarded, so that the upstream done
327
+ * value can be passed on.
328
+ * - GNU sparse entries fail with an `Unsupported` `TarError`.
329
+ *
330
+ * @see {@link encode} for the inverse operation
331
+ *
332
+ * @stability unstable
333
+ * @category decoding
334
+ * @since 4.0.5
335
+ */
336
+ export const decode = <IE = never, Done = unknown>(): Channel.Channel<
337
+ Arr.NonEmptyReadonlyArray<Entry<TarError | IE>>,
338
+ TarError | IE,
339
+ Done,
340
+ Arr.NonEmptyReadonlyArray<Uint8Array>,
341
+ IE,
342
+ Done
343
+ > =>
344
+ Channel.fromTransform((upstream, scope) =>
345
+ Effect.suspend(() => {
346
+ const decoder = new Decoder()
347
+ let done: { readonly value: Done } | undefined
348
+ let pulls = 0
349
+
350
+ const pullUpstream = upstream.pipe(
351
+ Effect.map((chunks) => {
352
+ pulls++
353
+ for (const chunk of chunks) decoder.push(chunk)
354
+ }),
355
+ Pull.catchDone((value) => {
356
+ pulls++
357
+ done = { value: value as Done }
358
+ decoder.end()
359
+ return Effect.void
360
+ })
361
+ )
362
+
363
+ // Serialize entry and body pulls; reuse input pulled while waiting for the lock.
364
+ const lock = Semaphore.makeUnsafe(1)
365
+ const pullInput = (seen: number) =>
366
+ lock.withPermit(Effect.suspend(() => pulls === seen ? pullUpstream : Effect.void))
367
+
368
+ const run = <A, D>(f: () => A | undefined | typeof NeedInput, end: () => D): Pull.Pull<A, TarError | IE, D> =>
369
+ Effect.suspend(function loop(): Pull.Pull<A, TarError | IE, D> {
370
+ const seen = pulls
371
+ let result: A | undefined | typeof NeedInput
372
+ try {
373
+ result = f()
374
+ } catch (error) {
375
+ return isTarError(error) ? Effect.fail(error) : Effect.die(error)
376
+ }
377
+ if (result === NeedInput) return Effect.flatMap(pullInput(seen), loop)
378
+ return result === undefined ? Cause.done(end()) : Effect.succeed(result)
379
+ })
380
+
381
+ const body = (id: number): Stream.Stream<Uint8Array, TarError | IE> =>
382
+ Stream.fromPull(Effect.succeed(run(() => decoder.read(id), () => undefined)))
383
+
384
+ const next = run(() => {
385
+ const header = decoder.next()
386
+ return header === NeedInput || header === undefined
387
+ ? header
388
+ : Arr.of({ header, body: body(decoder.generation) })
389
+ }, () => done!.value)
390
+
391
+ return Effect.as(Scope.addFinalizer(scope, Effect.sync(() => decoder.close())), next)
392
+ })
393
+ )
394
+
395
+ /**
396
+ * Creates a channel that encodes entries into tar archive bytes.
397
+ *
398
+ * **Details**
399
+ *
400
+ * Each entry is written as a USTAR header, with the path split into the USTAR
401
+ * prefix and name fields when it is longer than 100 bytes. A PAX extended
402
+ * header is added only for what USTAR cannot hold: a long or non-ASCII path,
403
+ * link target, user or group name, a size of 8 GiB or more, a uid or gid above
404
+ * `2097151`, an mtime outside the USTAR range, or custom `pax` records. The
405
+ * archive ends with two zero blocks.
406
+ *
407
+ * Headers, padding and body chunks below 16 KiB are gathered into output chunks
408
+ * of up to 64 KiB, and larger body chunks pass through without copying, so
409
+ * bodies stream without being held in memory. Output is handed out before
410
+ * waiting for more entries, but up to 64 KiB of it can be held while a body is
411
+ * pulled.
412
+ *
413
+ * **Gotchas**
414
+ *
415
+ * - A body that produces any byte count other than `header.size` fails with a
416
+ * `SizeMismatch` `TarError`, so the size must be known before the body is
417
+ * written.
418
+ * - `header.pax` may contain custom metadata such as `SCHILY.xattr.*`. Keys
419
+ * `path`, `linkpath`, `size`, `uid`, `gid`, `uname`, `gname` and `mtime` must
420
+ * be set through the corresponding header fields. These keys and
421
+ * `GNU.sparse.*` records fail with an `InvalidHeader` `TarError`.
422
+ * - A `File` entry whose path ends with `/` fails with an `InvalidHeader`
423
+ * `TarError`, because other tools read it as a directory.
424
+ * - Entries other than `File` and `Other` must have `size` 0, and `devMajor`
425
+ * and `devMinor` must not exceed `2097151`; otherwise encoding fails with an
426
+ * `InvalidHeader` `TarError`.
427
+ * - mtime is rounded down to whole seconds.
428
+ * - `typeflag` is only written for `Other` entries; every other type writes its
429
+ * standard flag.
430
+ *
431
+ * @see {@link decode} for the inverse operation
432
+ * @see {@link file} for building entries from in-memory content
433
+ * @see {@link fileStream} for building entries from streamed content
434
+ *
435
+ * @stability unstable
436
+ * @category encoding
437
+ * @since 4.0.5
438
+ */
439
+ export const encode = <IE = never, Done = unknown, In extends Entry<any, any> = Entry>(): Channel.Channel<
440
+ Arr.NonEmptyReadonlyArray<Uint8Array>,
441
+ TarError | IE | (In extends Entry<infer E, any> ? E : never),
442
+ Done,
443
+ Arr.NonEmptyReadonlyArray<In>,
444
+ IE,
445
+ Done,
446
+ In extends Entry<any, infer R> ? R : never
447
+ > => {
448
+ // Distribute over entry unions to infer body errors and services.
449
+ type E = In extends Entry<infer E, any> ? E : never
450
+ type R = In extends Entry<any, infer R> ? R : never
451
+ return Channel.fromTransform((upstream: Pull.Pull<Arr.NonEmptyReadonlyArray<In>, IE, Done>, scope) =>
452
+ Effect.sync(() => {
453
+ const encoder = new Encoder()
454
+ let entries: ReadonlyArray<Entry<E, R>> = []
455
+ let index = 0
456
+ let done: { readonly value: Done } | undefined
457
+ let body: Pull.Pull<Arr.NonEmptyReadonlyArray<Uint8Array>, E, void, R> | undefined
458
+ let bodyScope: Scope.Closeable | undefined
459
+
460
+ const write = (f: () => void): Effect.Effect<void, TarError> => {
461
+ try {
462
+ f()
463
+ } catch (error) {
464
+ return isTarError(error) ? Effect.fail(error) : Effect.die(error)
465
+ }
466
+ return Effect.void
467
+ }
468
+
469
+ return Effect.gen(function*() {
470
+ while (true) {
471
+ if (encoder.buffered >= SLAB_SIZE) return encoder.flush()
472
+ if (body !== undefined) {
473
+ const chunks = yield* Pull.catchDone(body, () => Effect.undefined)
474
+ if (chunks !== undefined) {
475
+ yield* write(() => {
476
+ for (const chunk of chunks) encoder.body(chunk)
477
+ })
478
+ continue
479
+ }
480
+ body = undefined
481
+ yield* Scope.close(bodyScope!, Exit.void)
482
+ yield* write(() => encoder.end())
483
+ continue
484
+ }
485
+ if (index < entries.length) {
486
+ const entry = entries[index++]
487
+ // Directories, links and in-memory files have nothing to stream
488
+ const bytes = entry.body === Stream.empty ? emptyBody : inMemoryBodies.get(entry.body)
489
+ yield* write(() => {
490
+ encoder.begin(entry.header)
491
+ if (bytes !== undefined) {
492
+ encoder.body(bytes)
493
+ encoder.end()
494
+ }
495
+ })
496
+ if (bytes !== undefined) continue
497
+ bodyScope = Scope.forkUnsafe(scope)
498
+ body = yield* Channel.toPullScoped(entry.body.channel, bodyScope)
499
+ continue
500
+ }
501
+ if (encoder.buffered > 0) return encoder.flush()
502
+ if (done !== undefined) return yield* Cause.done(done.value)
503
+ const next = yield* Pull.catchDone(upstream, (value) => {
504
+ done = { value: value as Done }
505
+ encoder.finish()
506
+ return Effect.undefined
507
+ })
508
+ if (next !== undefined) {
509
+ entries = next
510
+ index = 0
511
+ }
512
+ }
513
+ })
514
+ })
515
+ )
516
+ }
517
+
518
+ const invalidHeader = (message: string) => new TarError({ kind: "InvalidHeader", message })
519
+
520
+ const truncated = (at: number) =>
521
+ new TarError({ kind: "Truncated", message: `unexpected end of tar archive at byte ${at}` })
522
+
523
+ const unsupported = (message: string) => new TarError({ kind: "Unsupported", message })
524
+
525
+ const sizeMismatch = (header: Header, written: number) =>
526
+ new TarError({
527
+ kind: "SizeMismatch",
528
+ message: `body of ${JSON.stringify(header.path)} has ${
529
+ written > header.size ? "at least" : "only"
530
+ } ${written} bytes, but its size is ${header.size}`
531
+ })
532
+
533
+ const BLOCK = 512
534
+ const PERMISSION_BITS = 0o7777
535
+
536
+ const padding = (size: number): number => (BLOCK - (size % BLOCK)) % BLOCK
537
+
538
+ const isZeroBlock = (block: Uint8Array): boolean => {
539
+ for (let i = 0; i < BLOCK; i++) {
540
+ if (block[i] !== 0) return false
541
+ }
542
+ return true
543
+ }
544
+
545
+ const sumBlock = (block: Uint8Array): number => {
546
+ // Four sums let the loop run faster than one
547
+ let a = 0
548
+ let b = 0
549
+ let c = 0
550
+ let d = 0
551
+ for (let i = 0; i < BLOCK; i += 4) {
552
+ a += block[i]
553
+ b += block[i + 1]
554
+ c += block[i + 2]
555
+ d += block[i + 3]
556
+ }
557
+ return a + b + c + d
558
+ }
559
+
560
+ const USTAR_MAGIC = [0x75, 0x73, 0x74, 0x61, 0x72, 0x00] // "ustar\0"
561
+ const GNU_MAGIC = [0x75, 0x73, 0x74, 0x61, 0x72, 0x20, 0x20, 0x00] // "ustar \0"
562
+ const STAR_TRAILER = [0x74, 0x61, 0x72, 0x00] // "tar\0"
563
+ const USTAR_MAGIC_VERSION = new Uint8Array([0x75, 0x73, 0x74, 0x61, 0x72, 0x00, 0x30, 0x30]) // "ustar\0" "00"
564
+
565
+ const hasBytes = (block: Uint8Array, offset: number, bytes: ReadonlyArray<number>): boolean => {
566
+ for (let i = 0; i < bytes.length; i++) {
567
+ if (block[offset + i] !== bytes[i]) return false
568
+ }
569
+ return true
570
+ }
571
+
572
+ const typeflags: Record<Exclude<EntryType, "Other">, string> = {
573
+ File: "0",
574
+ Hardlink: "1",
575
+ Symlink: "2",
576
+ CharDevice: "3",
577
+ BlockDevice: "4",
578
+ Directory: "5",
579
+ Fifo: "6"
580
+ }
581
+
582
+ const types: Record<string, EntryType> = {
583
+ ...Object.fromEntries(Object.entries(typeflags).map(([type, typeflag]) => [typeflag, type])),
584
+ // Contiguous files
585
+ "7": "File"
586
+ }
587
+
588
+ const typeOf = (typeflag: string, path: string): EntryType => {
589
+ // Legacy archives mark directories with a trailing slash only
590
+ if (typeflag === "\0") return path.endsWith("/") ? "Directory" : "File"
591
+ return types[typeflag] ?? "Other"
592
+ }
593
+
594
+ const typeflagOf = (header: Header): string => header.type === "Other" ? header.typeflag : typeflags[header.type]
595
+
596
+ // Entries of these types never carry body bytes, whatever their size field says
597
+ const isHeaderOnly = (type: EntryType): boolean => type !== "File" && type !== "Other"
598
+
599
+ const textEncoder = new TextEncoder()
600
+ // Keeps a leading byte order mark as part of the decoded field
601
+ const textDecoder = new TextDecoder("utf-8", { ignoreBOM: true })
602
+
603
+ const isAscii = (s: string): boolean => {
604
+ for (let i = 0; i < s.length; i++) {
605
+ const c = s.charCodeAt(i)
606
+ if (c === 0 || c >= 0x80) return false
607
+ }
608
+ return true
609
+ }
610
+
611
+ // Keeps the ASCII characters of a value that is also stored in a PAX record
612
+ const toAscii = (s: string): string => {
613
+ let out = ""
614
+ for (let i = 0; i < s.length; i++) {
615
+ const c = s.charCodeAt(i)
616
+ if (c > 0 && c < 0x80) out += s[i]
617
+ }
618
+ return out
619
+ }
620
+
621
+ const fits = (value: string, length: number): boolean => value.length <= length && isAscii(value)
622
+
623
+ const paxStringKeys = new Set(["path", "linkpath", "uname", "gname"])
624
+ const paxHeaderKeys = new Set(["path", "linkpath", "size", "uid", "gid", "uname", "gname", "mtime"])
625
+
626
+ const noPax: Readonly<Record<string, string>> = Object.freeze({})
627
+
628
+ // Parses records of the form "<length> <key>=<value>\n", where the length counts
629
+ // the bytes of the whole record
630
+ const parsePax = (data: Uint8Array): Map<string, string> => {
631
+ const records = new Map<string, string>()
632
+ let offset = 0
633
+ while (offset < data.length) {
634
+ let space = offset
635
+ while (space < data.length && space - offset < 16 && data[space] !== 0x20) space++
636
+ const lengthField = String.fromCharCode.apply(null, data.subarray(offset, space) as unknown as Array<number>)
637
+ const length = /^\d+$/.test(lengthField) ? Number(lengthField) : Number.NaN
638
+ const end = offset + length
639
+ if (!(length >= 5) || end > data.length || data[space] !== 0x20 || space + 1 >= end || data[end - 1] !== 0x0a) {
640
+ throw invalidHeader("malformed PAX record")
641
+ }
642
+ const record = data.subarray(space + 1, end - 1)
643
+ const equals = record.indexOf(0x3d)
644
+ if (equals <= 0) {
645
+ throw invalidHeader("malformed PAX record")
646
+ }
647
+ const key = textDecoder.decode(record.subarray(0, equals))
648
+ const value = textDecoder.decode(record.subarray(equals + 1))
649
+ if (key.includes("\0") || (paxStringKeys.has(key) && value.includes("\0"))) {
650
+ throw invalidHeader(`invalid PAX record ${key}`)
651
+ }
652
+ records.set(key, value)
653
+ offset = end
654
+ }
655
+ return records
656
+ }
657
+
658
+ const paxInteger = (key: string, value: string): number => {
659
+ const n = /^\d+$/.test(value) ? Number(value) : Number.NaN
660
+ if (!Number.isSafeInteger(n)) {
661
+ throw invalidHeader(`invalid PAX ${key} ${JSON.stringify(value)}`)
662
+ }
663
+ return n
664
+ }
665
+
666
+ // Parses a PAX time of decimal seconds into milliseconds, rounded down. The
667
+ // digits are added up separately, because `Number(value) * 1000` is inexact.
668
+ const paxMillis = (value: string): number => {
669
+ const match = /^(-?)(\d+)(?:\.(\d+))?$/.exec(value)
670
+ if (match === null) {
671
+ throw invalidHeader(`invalid PAX mtime ${JSON.stringify(value)}`)
672
+ }
673
+ const [, sign, seconds, fraction = ""] = match
674
+ const millis = Number(seconds) * 1000 + Number(fraction.slice(0, 3).padEnd(3, "0"))
675
+ if (sign === "") return millis
676
+ // A negative time with digits below a millisecond rounds down past them
677
+ return -millis - (/[1-9]/.test(fraction.slice(3)) ? 1 : 0);
678
+ }
679
+
680
+ // Applies the records that override header fields and returns the rest. An
681
+ // empty value keeps the field from the header block.
682
+ const applyPax = (header: RawHeader, records: Map<string, string>): Record<string, string> => {
683
+ const rest: Record<string, string> = {}
684
+ for (const [key, value] of records) {
685
+ if (key.startsWith("GNU.sparse.")) {
686
+ throw unsupported("GNU sparse files are not supported")
687
+ }
688
+ if (!paxHeaderKeys.has(key)) {
689
+ // Defined rather than assigned, so that a `__proto__` key stays a record
690
+ Object.defineProperty(rest, key, { value, enumerable: true, writable: true, configurable: true })
691
+ continue
692
+ }
693
+ if (value === "") continue
694
+ switch (key) {
695
+ case "path":
696
+ header.path = value
697
+ break
698
+ case "linkpath":
699
+ header.linkTarget = value
700
+ break
701
+ case "uname":
702
+ case "gname":
703
+ header[key] = value
704
+ break
705
+ case "uid":
706
+ case "gid":
707
+ case "size":
708
+ header[key] = paxInteger(key, value)
709
+ break
710
+ case "mtime":
711
+ header.mtimeMillis = paxMillis(value)
712
+ }
713
+ }
714
+ return rest
715
+ }
716
+
717
+ const paxRecord = (key: string, value: string): Uint8Array => {
718
+ const rest = textEncoder.encode(` ${key}=${value}\n`)
719
+ // The length counts its own digits
720
+ const length = rest.length + String(rest.length + String(rest.length).length).length
721
+ const out = new Uint8Array(length)
722
+ writeString(out, 0, length, String(length))
723
+ out.set(rest, length - rest.length)
724
+ return out
725
+ }
726
+
727
+ const paxHeaderName = (path: string): string => {
728
+ const trimmed = path.replace(/\/+$/, "")
729
+ const i = trimmed.lastIndexOf("/")
730
+ const name = i === -1 ? `PaxHeaders.0/${trimmed}` : `${trimmed.slice(0, i)}/PaxHeaders.0/${trimmed.slice(i + 1)}`
731
+ return toAscii(name).slice(0, 100)
732
+ }
733
+
734
+ const readString = (block: Uint8Array, offset: number, length: number): string => {
735
+ let end = offset
736
+ let ascii = true
737
+ const limit = offset + length
738
+ while (end < limit && block[end] !== 0) {
739
+ if (block[end] >= 0x80) ascii = false
740
+ end++
741
+ }
742
+ if (end === offset) return ""
743
+ if (!ascii || end - offset > 256) return textDecoder.decode(block.subarray(offset, end))
744
+ // Most header strings are short ASCII, which is cheaper to build directly
745
+ return String.fromCharCode.apply(null, block.subarray(offset, end) as unknown as Array<number>)
746
+ }
747
+
748
+ const readOctal = (block: Uint8Array, offset: number, length: number): number => {
749
+ let start = offset
750
+ let end = offset + length
751
+ while (start < end && (block[start] === 0 || block[start] === 0x20)) start++
752
+ while (end > start && (block[end - 1] === 0 || block[end - 1] === 0x20)) end--
753
+ let value = 0
754
+ for (let i = start; i < end; i++) {
755
+ const c = block[i]
756
+ if (c < 0x30 || c > 0x37) {
757
+ throw invalidHeader(`invalid octal number in the header field at offset ${offset}`)
758
+ }
759
+ value = value * 8 + (c - 0x30)
760
+ }
761
+ return value
762
+ }
763
+
764
+ // GNU base-256: the high bit of the first byte is set, and the next bit is the
765
+ // sign of a two's complement big-endian number
766
+ const readNumber = (block: Uint8Array, offset: number, length: number): number => {
767
+ if ((block[offset] & 0x80) === 0) return readOctal(block, offset, length)
768
+ const negative = (block[offset] & 0x40) !== 0
769
+ // Negative numbers are read as the bitwise inverse of their magnitude minus one
770
+ let value = 0
771
+ for (let i = 0; i < length; i++) {
772
+ let c = block[offset + i]
773
+ if (negative) c ^= 0xff
774
+ if (i === 0) c &= 0x7f
775
+ value = value * 256 + c
776
+ if (value > Number.MAX_SAFE_INTEGER) {
777
+ throw invalidHeader(`base-256 number in the header field at offset ${offset} is out of range`)
778
+ }
779
+ }
780
+ return negative ? -value - 1 : value
781
+ }
782
+
783
+ const readUnsigned = (block: Uint8Array, offset: number, length: number, field: string): number => {
784
+ const value = readNumber(block, offset, length)
785
+ if (value < 0) {
786
+ throw invalidHeader(`negative ${field}`)
787
+ }
788
+ return value
789
+ }
790
+
791
+ // The checksum is the sum of the block bytes with the checksum field counted as
792
+ // spaces. Some old tar writers summed signed bytes, which is accepted too.
793
+ const verifyChecksum = (block: Uint8Array): boolean => {
794
+ const stored = readOctal(block, 148, 8)
795
+ let unsigned = sumBlock(block) + 8 * 0x20
796
+ for (let i = 148; i < 156; i++) unsigned -= block[i]
797
+ if (stored === unsigned) return true
798
+ let high = 0
799
+ for (let i = 0; i < BLOCK; i++) {
800
+ if (block[i] > 0x7f && (i < 148 || i >= 156)) high++
801
+ }
802
+ return stored === unsigned - 0x100 * high
803
+ }
804
+
805
+ interface RawHeader {
806
+ readonly typeflag: string
807
+ path: string
808
+ linkTarget: string
809
+ size: number
810
+ readonly mode: number
811
+ uid: number
812
+ gid: number
813
+ uname: string
814
+ gname: string
815
+ mtimeMillis: number
816
+ devMajor: number
817
+ devMinor: number
818
+ }
819
+
820
+ const parseHeader = (block: Uint8Array): RawHeader => {
821
+ if (!verifyChecksum(block)) {
822
+ throw invalidHeader("header checksum mismatch")
823
+ }
824
+ const isUstar = hasBytes(block, 257, USTAR_MAGIC)
825
+ const isGnu = !isUstar && hasBytes(block, 257, GNU_MAGIC)
826
+ const header: RawHeader = {
827
+ typeflag: String.fromCharCode(block[156]),
828
+ path: readString(block, 0, 100),
829
+ linkTarget: readString(block, 157, 100),
830
+ size: readUnsigned(block, 124, 12, "size"),
831
+ mode: readUnsigned(block, 100, 8, "mode"),
832
+ uid: readUnsigned(block, 108, 8, "uid"),
833
+ gid: readUnsigned(block, 116, 8, "gid"),
834
+ mtimeMillis: readNumber(block, 136, 12) * 1000,
835
+ uname: "",
836
+ gname: "",
837
+ devMajor: 0,
838
+ devMinor: 0
839
+ }
840
+ if (!isUstar && !isGnu) return header
841
+ header.uname = readString(block, 265, 32)
842
+ header.gname = readString(block, 297, 32)
843
+ header.devMajor = readUnsigned(block, 329, 8, "devMajor")
844
+ header.devMinor = readUnsigned(block, 337, 8, "devMinor")
845
+ if (isUstar) {
846
+ // star archives end the block with "tar\0" and keep times after a shorter prefix
847
+ const prefix = hasBytes(block, 508, STAR_TRAILER) ? readString(block, 345, 131) : readString(block, 345, 155)
848
+ if (prefix.length > 0) header.path = `${prefix}/${header.path}`
849
+ }
850
+ return header
851
+ }
852
+
853
+ const MAX_OCTAL_7 = 0o7777777 // 8-byte numeric fields
854
+ const MAX_OCTAL_11 = 0o77777777777 // 12-byte numeric fields
855
+
856
+ const writeString = (block: Uint8Array, offset: number, length: number, value: string): void => {
857
+ const n = Math.min(value.length, length)
858
+ for (let i = 0; i < n; i++) block[offset + i] = value.charCodeAt(i)
859
+ }
860
+
861
+ // Writes `length - 1` zero-padded octal digits; the value must fit
862
+ const writeOctal = (block: Uint8Array, offset: number, length: number, value: number): void => {
863
+ let i = offset + length - 2
864
+ // Bit operations are faster, but only cover 32 bits
865
+ for (; value > 0x3fffffff && i >= offset; i--) {
866
+ block[i] = 0x30 + (value % 8)
867
+ value = Math.floor(value / 8)
868
+ }
869
+ for (; i >= offset; i--) {
870
+ block[i] = 0x30 + (value & 7)
871
+ value >>>= 3
872
+ }
873
+ }
874
+
875
+ // Split at the last slash that fits the 155-byte USTAR prefix.
876
+ const splitPath = (path: string): readonly [prefix: string, name: string] | undefined => {
877
+ if (path.length <= 100 || !isAscii(path)) return undefined
878
+ let length = path.length
879
+ if (length > 156) length = 156
880
+ else if (path[length - 1] === "/") length--
881
+ const i = path.lastIndexOf("/", length - 1)
882
+ if (i <= 0 || path.length - i - 1 > 100) return undefined
883
+ return [path.slice(0, i), path.slice(i + 1)]
884
+ }
885
+
886
+ interface UstarFields {
887
+ readonly name: string
888
+ readonly prefix: string
889
+ readonly typeflag: string
890
+ readonly size: number
891
+ readonly mode: number
892
+ readonly uid: number
893
+ readonly gid: number
894
+ readonly mtime: number
895
+ readonly linkname: string
896
+ readonly uname: string
897
+ readonly gname: string
898
+ readonly devMajor: number
899
+ readonly devMinor: number
900
+ }
901
+
902
+ const paxHeaderFields: UstarFields = {
903
+ name: "",
904
+ prefix: "",
905
+ typeflag: "x",
906
+ size: 0,
907
+ mode: 0o644,
908
+ uid: 0,
909
+ gid: 0,
910
+ mtime: 0,
911
+ linkname: "",
912
+ uname: "",
913
+ gname: "",
914
+ devMajor: 0,
915
+ devMinor: 0
916
+ }
917
+
918
+ const writeUstarBlock = (block: Uint8Array, fields: UstarFields): void => {
919
+ writeString(block, 0, 100, fields.name)
920
+ writeOctal(block, 100, 8, fields.mode)
921
+ writeOctal(block, 108, 8, fields.uid)
922
+ writeOctal(block, 116, 8, fields.gid)
923
+ writeOctal(block, 124, 12, fields.size)
924
+ writeOctal(block, 136, 12, fields.mtime)
925
+ block[156] = fields.typeflag.charCodeAt(0)
926
+ writeString(block, 157, 100, fields.linkname)
927
+ block.set(USTAR_MAGIC_VERSION, 257)
928
+ writeString(block, 265, 32, fields.uname)
929
+ writeString(block, 297, 32, fields.gname)
930
+ writeOctal(block, 329, 8, fields.devMajor)
931
+ writeOctal(block, 337, 8, fields.devMinor)
932
+ writeString(block, 345, 155, fields.prefix)
933
+ block.fill(0x20, 148, 156)
934
+ // Six digits, a NUL and the space left from the fill
935
+ writeOctal(block, 148, 7, sumBlock(block))
936
+ block[154] = 0
937
+ }
938
+
939
+ const checkNumber = (field: string, value: number | undefined, max: number): number => {
940
+ const n = value ?? 0
941
+ if (!Number.isSafeInteger(n) || n < 0 || n > max) {
942
+ throw invalidHeader(`invalid ${field} ${n}`)
943
+ }
944
+ return n
945
+ }
946
+
947
+ const checkNoNul = (field: string, value: string): string => {
948
+ if (value.includes("\0")) {
949
+ throw invalidHeader(`${field} must not contain NUL characters`)
950
+ }
951
+ return value
952
+ }
953
+
954
+ // Writes the header blocks of an entry, with a PAX header first when needed, into
955
+ // zeroed memory from `alloc`. Throws before allocating when the header is invalid.
956
+ const encodeHeader = (header: Header, alloc: (size: number) => Uint8Array): void => {
957
+ const path = checkNoNul("path", header.path)
958
+ if (path === "") {
959
+ throw invalidHeader("path must not be empty")
960
+ }
961
+ // GNU tar and node-tar read such an entry as a directory
962
+ if (header.type === "File" && path.endsWith("/")) {
963
+ throw invalidHeader(`File entry ${JSON.stringify(path)} must not end with "/"`)
964
+ }
965
+ const typeflag = typeflagOf(header)
966
+ if (typeflag.length !== 1 || typeflag.charCodeAt(0) >= 0x80 || "xgLKS".includes(typeflag)) {
967
+ throw invalidHeader(`invalid typeflag ${JSON.stringify(typeflag)}`)
968
+ }
969
+ const size = checkNumber("size", header.size, Number.MAX_SAFE_INTEGER)
970
+ if (size > 0 && isHeaderOnly(header.type)) {
971
+ throw invalidHeader(`${header.type} entry ${JSON.stringify(path)} must have size 0`)
972
+ }
973
+ const mode = checkNumber("mode", header.mode, Number.MAX_SAFE_INTEGER) & PERMISSION_BITS
974
+ const uid = checkNumber("uid", header.uid, Number.MAX_SAFE_INTEGER)
975
+ const gid = checkNumber("gid", header.gid, Number.MAX_SAFE_INTEGER)
976
+ const devMajor = checkNumber("devMajor", header.devMajor, MAX_OCTAL_7)
977
+ const devMinor = checkNumber("devMinor", header.devMinor, MAX_OCTAL_7)
978
+ const millis = header.mtime.getTime()
979
+ if (Number.isNaN(millis)) {
980
+ throw invalidHeader("mtime must be a valid date")
981
+ }
982
+ const mtime = Math.floor(millis / 1000)
983
+
984
+ // Records of the PAX header, created when one is needed. Their keys are
985
+ // unique, as custom records cannot use the keys of header fields.
986
+ let pax: Array<readonly [key: string, value: string]> | undefined
987
+ for (const key of Object.keys(header.pax)) {
988
+ if (key.startsWith("GNU.sparse.")) {
989
+ throw invalidHeader(`PAX record ${JSON.stringify(key)} is not supported`)
990
+ }
991
+ if (paxHeaderKeys.has(key)) {
992
+ throw invalidHeader(`PAX record ${JSON.stringify(key)} must be set through its header field`)
993
+ }
994
+ if (key === "" || key.includes("=") || key.includes("\0")) {
995
+ throw invalidHeader(`invalid PAX record ${JSON.stringify(key)}`)
996
+ }
997
+ pax ??= []
998
+ pax.push([key, header.pax[key]])
999
+ }
1000
+
1001
+ // PAX holds overflow values; USTAR keeps truncated ASCII strings or zero.
1002
+ const split = splitPath(path)
1003
+ const linkTarget = checkNoNul("linkTarget", header.linkTarget ?? "")
1004
+ const uname = checkNoNul("uname", header.uname)
1005
+ const gname = checkNoNul("gname", header.gname)
1006
+ const pathFits = split !== undefined || fits(path, 100)
1007
+ const linkTargetFits = fits(linkTarget, 100)
1008
+ const unameFits = fits(uname, 32)
1009
+ const gnameFits = fits(gname, 32)
1010
+ if (!pathFits) (pax ??= []).push(["path", path])
1011
+ if (!linkTargetFits) (pax ??= []).push(["linkpath", linkTarget])
1012
+ if (!unameFits) (pax ??= []).push(["uname", uname])
1013
+ if (!gnameFits) (pax ??= []).push(["gname", gname])
1014
+ if (size > MAX_OCTAL_11) (pax ??= []).push(["size", String(size)])
1015
+ if (uid > MAX_OCTAL_7) (pax ??= []).push(["uid", String(uid)])
1016
+ if (gid > MAX_OCTAL_7) (pax ??= []).push(["gid", String(gid)])
1017
+ if (mtime < 0 || mtime > MAX_OCTAL_11) (pax ??= []).push(["mtime", String(mtime)])
1018
+
1019
+ const ustar: UstarFields = {
1020
+ name: split !== undefined ? split[1] : pathFits ? path : toAscii(path).slice(0, 100),
1021
+ prefix: split !== undefined ? split[0] : "",
1022
+ typeflag,
1023
+ size: size > MAX_OCTAL_11 ? 0 : size,
1024
+ mode,
1025
+ uid: uid > MAX_OCTAL_7 ? 0 : uid,
1026
+ gid: gid > MAX_OCTAL_7 ? 0 : gid,
1027
+ mtime: mtime < 0 || mtime > MAX_OCTAL_11 ? 0 : mtime,
1028
+ linkname: linkTargetFits ? linkTarget : toAscii(linkTarget).slice(0, 100),
1029
+ uname: unameFits ? uname : toAscii(uname).slice(0, 32),
1030
+ gname: gnameFits ? gname : toAscii(gname).slice(0, 32),
1031
+ devMajor,
1032
+ devMinor
1033
+ }
1034
+
1035
+ if (pax === undefined) {
1036
+ writeUstarBlock(alloc(BLOCK), ustar)
1037
+ return
1038
+ }
1039
+ const records = pax.sort(([a], [b]) => a < b ? -1 : 1).map(([key, value]) => paxRecord(key, value))
1040
+ let dataLength = 0
1041
+ for (const record of records) dataLength += record.length
1042
+ const paxBlocks = 1 + Math.ceil(dataLength / BLOCK)
1043
+ const out = alloc(BLOCK * (paxBlocks + 1))
1044
+ writeUstarBlock(out, { ...paxHeaderFields, name: paxHeaderName(path), size: dataLength })
1045
+ let offset = BLOCK
1046
+ for (const record of records) {
1047
+ out.set(record, offset)
1048
+ offset += record.length
1049
+ }
1050
+ writeUstarBlock(out.subarray(BLOCK * paxBlocks), ustar)
1051
+ }
1052
+
1053
+ const MAX_META_SIZE = 1024 * 1024 // PAX and GNU long name data
1054
+ const MAX_DATE_MILLIS = 8.64e15 // the range of `Date`
1055
+
1056
+ // A queue of byte chunks that hands out views without copying where possible.
1057
+ // Consumed chunks are released right away.
1058
+ class ByteQueue {
1059
+ private chunks: Array<Uint8Array | undefined> = []
1060
+ private head = 0
1061
+ private offset = 0
1062
+ length = 0
1063
+ consumed = 0
1064
+
1065
+ push(chunk: Uint8Array): void {
1066
+ if (chunk.length === 0) return
1067
+ this.chunks.push(chunk)
1068
+ this.length += chunk.length
1069
+ }
1070
+
1071
+ takeSome(max: number): Uint8Array {
1072
+ const chunk = this.chunks[this.head]!
1073
+ const available = chunk.length - this.offset
1074
+ if (max < available) {
1075
+ const out = chunk.subarray(this.offset, this.offset + max)
1076
+ this.offset += max
1077
+ this.length -= max
1078
+ this.consumed += max
1079
+ return out
1080
+ }
1081
+ const out = this.offset === 0 ? chunk : chunk.subarray(this.offset)
1082
+ this.chunks[this.head++] = undefined
1083
+ this.length -= available
1084
+ this.consumed += available
1085
+ this.offset = 0
1086
+ if (this.head === this.chunks.length) {
1087
+ this.chunks = []
1088
+ this.head = 0
1089
+ } else if (this.head >= 1024) {
1090
+ this.chunks = this.chunks.slice(this.head)
1091
+ this.head = 0
1092
+ }
1093
+ return out
1094
+ }
1095
+
1096
+ // Takes exactly `n` bytes; the queue must hold at least `n`
1097
+ take(n: number): Uint8Array {
1098
+ if (n === 0) return new Uint8Array(0)
1099
+ const first = this.takeSome(n)
1100
+ if (first.length === n) return first
1101
+ const out = new Uint8Array(n)
1102
+ out.set(first)
1103
+ let filled = first.length
1104
+ while (filled < n) {
1105
+ const part = this.takeSome(n - filled)
1106
+ out.set(part, filled)
1107
+ filled += part.length
1108
+ }
1109
+ return out
1110
+ }
1111
+
1112
+ clear(): void {
1113
+ this.chunks = []
1114
+ this.head = 0
1115
+ this.offset = 0
1116
+ this.length = 0
1117
+ }
1118
+ }
1119
+
1120
+ // Returned by the decoder when the buffered input is not enough to continue
1121
+ const NeedInput: unique symbol = Symbol("effect/encoding/Tar/NeedInput")
1122
+
1123
+ // `next` skips unread body bytes; `read` consumes the current body.
1124
+ // Both preserve progress across `NeedInput` retries.
1125
+ class Decoder {
1126
+ private readonly queue = new ByteQueue()
1127
+ private ended = false
1128
+ private finished = false
1129
+ private closed = false
1130
+ // Incremented whenever the current body is invalidated
1131
+ generation = 0
1132
+ private remaining = 0
1133
+ private pad = 0
1134
+ // Bytes to discard before the next header
1135
+ private skip = 0
1136
+ private zeroBlock = false
1137
+ // Archive offset of the last header block read, for error messages
1138
+ private at = 0
1139
+ // An extended header whose data is still to be read
1140
+ private meta: RawHeader | undefined
1141
+ private pax: Map<string, string> | undefined
1142
+ // Records of the PAX global headers read so far
1143
+ private global: Map<string, string> | undefined
1144
+ private longName = ""
1145
+ private longLink = ""
1146
+
1147
+ push(chunk: Uint8Array): void {
1148
+ if (!this.finished) this.queue.push(chunk)
1149
+ }
1150
+
1151
+ end(): void {
1152
+ this.ended = true
1153
+ }
1154
+
1155
+ close(): void {
1156
+ this.closed = true
1157
+ this.generation++
1158
+ this.queue.clear()
1159
+ }
1160
+
1161
+ // Returns the next entry header, or `undefined` once the archive and the
1162
+ // input have ended. Input after the end of the archive is discarded.
1163
+ next(): Header | undefined | typeof NeedInput {
1164
+ try {
1165
+ return this.advance()
1166
+ } catch (error) {
1167
+ // Header errors are thrown where the archive offset is not known
1168
+ if (isTarError(error) && (error.kind === "InvalidHeader" || error.kind === "Unsupported")) {
1169
+ throw new TarError({ kind: error.kind, message: `${error.message} (header at byte ${this.at})` })
1170
+ }
1171
+ throw error
1172
+ }
1173
+ }
1174
+
1175
+ private advance(): Header | undefined | typeof NeedInput {
1176
+ this.generation++
1177
+ this.skip += this.remaining + this.pad
1178
+ this.remaining = 0
1179
+ this.pad = 0
1180
+ const queue = this.queue
1181
+ while (true) {
1182
+ if (this.finished) return this.finish()
1183
+ while (this.skip > 0) {
1184
+ if (queue.length === 0) return this.needInput()
1185
+ this.skip -= queue.takeSome(this.skip).length
1186
+ }
1187
+ if (this.meta !== undefined) {
1188
+ const { size, typeflag } = this.meta
1189
+ const total = size + padding(size)
1190
+ if (queue.length < total) return this.needInput()
1191
+ const data = queue.take(total).subarray(0, size)
1192
+ this.meta = undefined
1193
+ if (typeflag === "x") this.pax = parsePax(data)
1194
+ else if (typeflag === "g") this.addGlobal(parsePax(data))
1195
+ else if (typeflag === "L") this.longName = readString(data, 0, size)
1196
+ else this.longLink = readString(data, 0, size)
1197
+ continue
1198
+ }
1199
+ if (queue.length < BLOCK) {
1200
+ if (queue.length === 0 && this.ended) return this.finish()
1201
+ return this.needInput()
1202
+ }
1203
+ this.at = queue.consumed
1204
+ const block = queue.take(BLOCK)
1205
+ if (isZeroBlock(block)) {
1206
+ if (this.zeroBlock) return this.finish()
1207
+ this.zeroBlock = true
1208
+ continue
1209
+ }
1210
+ if (this.zeroBlock) {
1211
+ throw invalidHeader("non-zero block after an end-of-archive block")
1212
+ }
1213
+ const raw = parseHeader(block)
1214
+ switch (raw.typeflag) {
1215
+ case "x":
1216
+ case "g":
1217
+ case "L":
1218
+ case "K": {
1219
+ if (raw.size > MAX_META_SIZE) {
1220
+ throw invalidHeader(`extended header of ${raw.size} bytes exceeds the limit`)
1221
+ }
1222
+ this.meta = raw
1223
+ continue
1224
+ }
1225
+ case "S": {
1226
+ throw unsupported("GNU sparse files are not supported")
1227
+ }
1228
+ }
1229
+ const header = this.toHeader(raw)
1230
+ this.remaining = header.size
1231
+ this.pad = padding(header.size)
1232
+ return header
1233
+ }
1234
+ }
1235
+
1236
+ // Returns the buffered body bytes of the entry from generation `id`, or
1237
+ // `undefined` once the whole body has been read
1238
+ read(id: number): Arr.NonEmptyArray<Uint8Array> | undefined | typeof NeedInput {
1239
+ if (id !== this.generation) {
1240
+ throw new TarError({
1241
+ kind: "BodyConsumed",
1242
+ message: this.closed ?
1243
+ "tar entry body read after the archive stream ended" :
1244
+ "tar entry body read after moving to the next entry"
1245
+ })
1246
+ }
1247
+ if (this.remaining === 0) return undefined
1248
+ if (this.queue.length === 0) return this.needInput()
1249
+ const chunks = Arr.of(this.queue.takeSome(this.remaining))
1250
+ this.remaining -= chunks[0].length
1251
+ while (this.remaining > 0 && this.queue.length > 0) {
1252
+ const chunk = this.queue.takeSome(this.remaining)
1253
+ this.remaining -= chunk.length
1254
+ chunks.push(chunk)
1255
+ }
1256
+ return chunks
1257
+ }
1258
+
1259
+ private needInput(): typeof NeedInput {
1260
+ if (this.ended) throw truncated(this.queue.consumed + this.queue.length)
1261
+ return NeedInput
1262
+ }
1263
+
1264
+ private finish(): undefined | typeof NeedInput {
1265
+ // An extended header must be followed by the entry it describes
1266
+ if (!this.finished && (this.pax !== undefined || this.longName !== "" || this.longLink !== "")) {
1267
+ throw truncated(this.queue.consumed)
1268
+ }
1269
+ this.finished = true
1270
+ this.queue.clear()
1271
+ return this.ended ? undefined : NeedInput
1272
+ }
1273
+
1274
+ // Global records apply to every entry that follows, except the ones that only
1275
+ // describe a single entry, and an empty value removes a record
1276
+ private addGlobal(records: Map<string, string>): void {
1277
+ for (const [key, value] of records) {
1278
+ if (key === "path" || key === "linkpath" || key === "size") continue
1279
+ if (value !== "") (this.global ??= new Map()).set(key, value)
1280
+ else this.global?.delete(key)
1281
+ }
1282
+ if (this.global?.size === 0) this.global = undefined
1283
+ }
1284
+
1285
+ private toHeader(raw: RawHeader): Header {
1286
+ // The records of the entry's own extended header override global ones
1287
+ const records = this.global === undefined
1288
+ ? this.pax
1289
+ : this.pax === undefined
1290
+ ? this.global
1291
+ : new Map([...this.global, ...this.pax])
1292
+ const rest = records === undefined ? noPax : applyPax(raw, records)
1293
+ // Empty GNU long names are ignored, as in Go
1294
+ if (this.longName !== "") raw.path = this.longName
1295
+ if (this.longLink !== "") raw.linkTarget = this.longLink
1296
+ this.pax = undefined
1297
+ this.longName = ""
1298
+ this.longLink = ""
1299
+ if (!(Math.abs(raw.mtimeMillis) <= MAX_DATE_MILLIS)) {
1300
+ throw invalidHeader("mtime is out of range")
1301
+ }
1302
+ const type = typeOf(raw.typeflag, raw.path)
1303
+ const header: Types.Mutable<Header> = {
1304
+ path: raw.path,
1305
+ type,
1306
+ typeflag: raw.typeflag,
1307
+ size: isHeaderOnly(type) ? 0 : raw.size,
1308
+ mode: raw.mode & PERMISSION_BITS,
1309
+ uid: raw.uid,
1310
+ gid: raw.gid,
1311
+ uname: raw.uname,
1312
+ gname: raw.gname,
1313
+ mtime: new Date(raw.mtimeMillis),
1314
+ pax: rest
1315
+ }
1316
+ if (raw.linkTarget !== "") header.linkTarget = raw.linkTarget
1317
+ if (type === "CharDevice" || type === "BlockDevice") {
1318
+ header.devMajor = raw.devMajor
1319
+ header.devMinor = raw.devMinor
1320
+ }
1321
+ return header
1322
+ }
1323
+ }
1324
+
1325
+ const SLAB_SIZE = 64 * 1024
1326
+
1327
+ const emptyBody = new Uint8Array(0)
1328
+
1329
+ // Bodies below this size are copied next to their header instead of being
1330
+ // handed out as chunks of their own
1331
+ const COPY_LIMIT = 16 * 1024
1332
+
1333
+ // Pack headers, padding and small body chunks into slabs; pass large chunks
1334
+ // through without copying. Flushed slab regions are never overwritten.
1335
+ class Encoder {
1336
+ private slab = new Uint8Array(0)
1337
+ // Start of the bytes in `slab` that have not been flushed, and their end
1338
+ private start = 0
1339
+ private offset = 0
1340
+ private chunks: Array<Uint8Array> = []
1341
+ buffered = 0
1342
+ // The entry whose body is being written, and the body bytes written so far
1343
+ private header: Header | undefined
1344
+ private written = 0
1345
+
1346
+ begin(header: Header): void {
1347
+ encodeHeader(header, this.alloc)
1348
+ this.header = header
1349
+ this.written = 0
1350
+ }
1351
+
1352
+ body(chunk: Uint8Array): void {
1353
+ const header = this.header!
1354
+ this.written += chunk.length
1355
+ if (this.written > header.size) {
1356
+ throw sizeMismatch(header, this.written)
1357
+ }
1358
+ if (chunk.length < COPY_LIMIT) {
1359
+ // `reserve` can start a new slab, so it must run before `slab` is read
1360
+ const offset = this.reserve(chunk.length)
1361
+ this.slab.set(chunk, offset)
1362
+ return
1363
+ }
1364
+ this.cut()
1365
+ this.chunks.push(chunk)
1366
+ this.buffered += chunk.length
1367
+ }
1368
+
1369
+ end(): void {
1370
+ const header = this.header!
1371
+ this.header = undefined
1372
+ if (this.written !== header.size) {
1373
+ throw sizeMismatch(header, this.written)
1374
+ }
1375
+ this.reserve(padding(header.size))
1376
+ }
1377
+
1378
+ finish(): void {
1379
+ this.reserve(BLOCK * 2)
1380
+ }
1381
+
1382
+ flush(): Arr.NonEmptyArray<Uint8Array> {
1383
+ this.cut()
1384
+ const chunks = this.chunks as Arr.NonEmptyArray<Uint8Array>
1385
+ this.chunks = []
1386
+ this.buffered = 0
1387
+ return chunks
1388
+ }
1389
+
1390
+ // Ends the current run of slab bytes as a chunk
1391
+ private cut(): void {
1392
+ if (this.offset > this.start) {
1393
+ this.chunks.push(this.slab.subarray(this.start, this.offset))
1394
+ this.start = this.offset
1395
+ }
1396
+ }
1397
+
1398
+ // Returns `size` zeroed bytes of the output
1399
+ private alloc = (size: number): Uint8Array => {
1400
+ const offset = this.reserve(size)
1401
+ return this.slab.subarray(offset, offset + size)
1402
+ }
1403
+
1404
+ // Reserves `size` zeroed bytes of the output in `slab`, and returns their offset
1405
+ private reserve(size: number): number {
1406
+ if (this.offset + size > this.slab.length) {
1407
+ this.cut()
1408
+ this.slab = new Uint8Array(Math.max(SLAB_SIZE, size))
1409
+ this.start = 0
1410
+ this.offset = 0
1411
+ }
1412
+ const offset = this.offset
1413
+ this.offset += size
1414
+ this.buffered += size
1415
+ return offset
1416
+ }
1417
+ }