effect 4.1.0 → 4.1.2

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 (445) hide show
  1. package/README.md +30 -0
  2. package/THIRD_PARTY_NOTICES.md +62 -0
  3. package/ai-docs/package.json +2 -2
  4. package/dist/BigDecimal.d.ts +139 -7
  5. package/dist/BigDecimal.d.ts.map +1 -1
  6. package/dist/BigDecimal.js +83 -14
  7. package/dist/BigDecimal.js.map +1 -1
  8. package/dist/ByteSize.d.ts.map +1 -1
  9. package/dist/ByteSize.js +27 -14
  10. package/dist/ByteSize.js.map +1 -1
  11. package/dist/Equal.d.ts +2 -2
  12. package/dist/Equal.d.ts.map +1 -1
  13. package/dist/Equal.js +3 -3
  14. package/dist/Equal.js.map +1 -1
  15. package/dist/Hash.d.ts +3 -2
  16. package/dist/Hash.d.ts.map +1 -1
  17. package/dist/Hash.js +5 -4
  18. package/dist/Hash.js.map +1 -1
  19. package/dist/Iterable.d.ts.map +1 -1
  20. package/dist/Iterable.js +38 -32
  21. package/dist/Iterable.js.map +1 -1
  22. package/dist/JsonSchema.d.ts.map +1 -1
  23. package/dist/JsonSchema.js +27 -6
  24. package/dist/JsonSchema.js.map +1 -1
  25. package/dist/MutableRef.d.ts.map +1 -1
  26. package/dist/MutableRef.js +0 -7
  27. package/dist/MutableRef.js.map +1 -1
  28. package/dist/Path.d.ts.map +1 -1
  29. package/dist/Path.js +5 -1
  30. package/dist/Path.js.map +1 -1
  31. package/dist/Pool.d.ts.map +1 -1
  32. package/dist/Pool.js +2 -1
  33. package/dist/Pool.js.map +1 -1
  34. package/dist/Ref.d.ts.map +1 -1
  35. package/dist/Ref.js +0 -8
  36. package/dist/Ref.js.map +1 -1
  37. package/dist/Schedule.d.ts.map +1 -1
  38. package/dist/Schedule.js +8 -3
  39. package/dist/Schedule.js.map +1 -1
  40. package/dist/Schema.d.ts +2 -1
  41. package/dist/Schema.d.ts.map +1 -1
  42. package/dist/Schema.js +2 -1
  43. package/dist/Schema.js.map +1 -1
  44. package/dist/SchemaRepresentation.d.ts +4 -2
  45. package/dist/SchemaRepresentation.d.ts.map +1 -1
  46. package/dist/SchemaRepresentation.js +4 -2
  47. package/dist/SchemaRepresentation.js.map +1 -1
  48. package/dist/SchemaTransformation.d.ts +2 -2
  49. package/dist/SchemaTransformation.js +2 -2
  50. package/dist/Stream.d.ts.map +1 -1
  51. package/dist/Stream.js +6 -5
  52. package/dist/Stream.js.map +1 -1
  53. package/dist/ai/McpClient.d.ts +171 -19
  54. package/dist/ai/McpClient.d.ts.map +1 -1
  55. package/dist/ai/McpClient.js +277 -66
  56. package/dist/ai/McpClient.js.map +1 -1
  57. package/dist/ai/McpSchema.d.ts +108 -0
  58. package/dist/ai/McpSchema.d.ts.map +1 -1
  59. package/dist/ai/McpSchema.js +99 -0
  60. package/dist/ai/McpSchema.js.map +1 -1
  61. package/dist/ai/McpServer.d.ts +120 -6
  62. package/dist/ai/McpServer.d.ts.map +1 -1
  63. package/dist/ai/McpServer.js +258 -49
  64. package/dist/ai/McpServer.js.map +1 -1
  65. package/dist/ai/Prompt.d.ts.map +1 -1
  66. package/dist/ai/Prompt.js +20 -11
  67. package/dist/ai/Prompt.js.map +1 -1
  68. package/dist/ai/Tool.d.ts.map +1 -1
  69. package/dist/ai/Tool.js +5 -7
  70. package/dist/ai/Tool.js.map +1 -1
  71. package/dist/ai/internal/mcpCore.js +72 -3
  72. package/dist/ai/internal/mcpCore.js.map +1 -1
  73. package/dist/ai/internal/mcpProtocol/v2024_11_05.js +3 -1
  74. package/dist/ai/internal/mcpProtocol/v2024_11_05.js.map +1 -1
  75. package/dist/ai/internal/mcpProtocol/v2025_03_26.js +3 -1
  76. package/dist/ai/internal/mcpProtocol/v2025_03_26.js.map +1 -1
  77. package/dist/ai/internal/mcpProtocol/v2025_06_18.js +3 -1
  78. package/dist/ai/internal/mcpProtocol/v2025_06_18.js.map +1 -1
  79. package/dist/ai/internal/mcpProtocol/v2025_11_25.js +3 -1
  80. package/dist/ai/internal/mcpProtocol/v2025_11_25.js.map +1 -1
  81. package/dist/ai/internal/mcpProtocol/v2026_07_28.js +44 -8
  82. package/dist/ai/internal/mcpProtocol/v2026_07_28.js.map +1 -1
  83. package/dist/ai/internal/mcpProtocol.js +12 -0
  84. package/dist/ai/internal/mcpProtocol.js.map +1 -1
  85. package/dist/ai/internal/mcpRuntime.js +3 -3
  86. package/dist/ai/internal/mcpRuntime.js.map +1 -1
  87. package/dist/ai/internal/mcpSkills.d.ts +2 -0
  88. package/dist/ai/internal/mcpSkills.d.ts.map +1 -0
  89. package/dist/ai/internal/mcpSkills.js +428 -0
  90. package/dist/ai/internal/mcpSkills.js.map +1 -0
  91. package/dist/ai/internal/structured-output.js +11 -2
  92. package/dist/ai/internal/structured-output.js.map +1 -1
  93. package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
  94. package/dist/cluster/ClusterWorkflowEngine.js +30 -11
  95. package/dist/cluster/ClusterWorkflowEngine.js.map +1 -1
  96. package/dist/cluster/Entity.d.ts +26 -0
  97. package/dist/cluster/Entity.d.ts.map +1 -1
  98. package/dist/cluster/Entity.js.map +1 -1
  99. package/dist/cluster/MessageStorage.d.ts +6 -6
  100. package/dist/cluster/MessageStorage.d.ts.map +1 -1
  101. package/dist/cluster/MessageStorage.js +1 -3
  102. package/dist/cluster/MessageStorage.js.map +1 -1
  103. package/dist/cluster/Reply.d.ts +1 -1
  104. package/dist/cluster/Reply.d.ts.map +1 -1
  105. package/dist/cluster/Reply.js.map +1 -1
  106. package/dist/cluster/Runners.d.ts.map +1 -1
  107. package/dist/cluster/Runners.js +13 -2
  108. package/dist/cluster/Runners.js.map +1 -1
  109. package/dist/cluster/Sharding.d.ts +13 -0
  110. package/dist/cluster/Sharding.d.ts.map +1 -1
  111. package/dist/cluster/Sharding.js +4 -1
  112. package/dist/cluster/Sharding.js.map +1 -1
  113. package/dist/cluster/internal/clusterAbandon.d.ts.map +1 -1
  114. package/dist/cluster/internal/clusterAbandon.js +6 -4
  115. package/dist/cluster/internal/clusterAbandon.js.map +1 -1
  116. package/dist/cluster/internal/entityManager.js +63 -11
  117. package/dist/cluster/internal/entityManager.js.map +1 -1
  118. package/dist/cluster/internal/transactionNotifications.d.ts +5 -0
  119. package/dist/cluster/internal/transactionNotifications.d.ts.map +1 -0
  120. package/dist/cluster/internal/transactionNotifications.js +5 -0
  121. package/dist/cluster/internal/transactionNotifications.js.map +1 -0
  122. package/dist/crypto/Aead.d.ts +2 -1
  123. package/dist/crypto/Aead.d.ts.map +1 -1
  124. package/dist/crypto/Aead.js +2 -2
  125. package/dist/crypto/Aead.js.map +1 -1
  126. package/dist/crypto/Cipher.d.ts +2 -1
  127. package/dist/crypto/Cipher.d.ts.map +1 -1
  128. package/dist/crypto/Cipher.js +2 -2
  129. package/dist/crypto/Cipher.js.map +1 -1
  130. package/dist/crypto/KeyAgreement.d.ts +3 -2
  131. package/dist/crypto/KeyAgreement.d.ts.map +1 -1
  132. package/dist/crypto/KeyAgreement.js +2 -2
  133. package/dist/crypto/KeyAgreement.js.map +1 -1
  134. package/dist/crypto/KeyFormat.d.ts +33 -1
  135. package/dist/crypto/KeyFormat.d.ts.map +1 -1
  136. package/dist/crypto/KeyFormat.js.map +1 -1
  137. package/dist/crypto/KeyWrap.d.ts +4 -3
  138. package/dist/crypto/KeyWrap.d.ts.map +1 -1
  139. package/dist/crypto/KeyWrap.js +2 -2
  140. package/dist/crypto/KeyWrap.js.map +1 -1
  141. package/dist/crypto/Mac.d.ts +2 -1
  142. package/dist/crypto/Mac.d.ts.map +1 -1
  143. package/dist/crypto/Mac.js +2 -2
  144. package/dist/crypto/Mac.js.map +1 -1
  145. package/dist/crypto/Signature.d.ts +3 -2
  146. package/dist/crypto/Signature.d.ts.map +1 -1
  147. package/dist/crypto/Signature.js +2 -2
  148. package/dist/crypto/Signature.js.map +1 -1
  149. package/dist/crypto/WebCrypto.d.ts +19 -0
  150. package/dist/crypto/WebCrypto.d.ts.map +1 -1
  151. package/dist/crypto/WebCrypto.js.map +1 -1
  152. package/dist/crypto/internal/asymmetric.js.map +1 -1
  153. package/dist/crypto/internal/key.js +3 -2
  154. package/dist/crypto/internal/key.js.map +1 -1
  155. package/dist/encoding/Base64Url.d.ts.map +1 -1
  156. package/dist/encoding/Base64Url.js +26 -3
  157. package/dist/encoding/Base64Url.js.map +1 -1
  158. package/dist/encoding/Json5.d.ts +44 -0
  159. package/dist/encoding/Json5.d.ts.map +1 -0
  160. package/dist/encoding/Json5.js +56 -0
  161. package/dist/encoding/Json5.js.map +1 -0
  162. package/dist/encoding/Jsonc.d.ts +47 -0
  163. package/dist/encoding/Jsonc.d.ts.map +1 -0
  164. package/dist/encoding/Jsonc.js +120 -0
  165. package/dist/encoding/Jsonc.js.map +1 -0
  166. package/dist/encoding/Ndjson.d.ts +5 -4
  167. package/dist/encoding/Ndjson.d.ts.map +1 -1
  168. package/dist/encoding/Ndjson.js +6 -5
  169. package/dist/encoding/Ndjson.js.map +1 -1
  170. package/dist/encoding/SchemaBinary.d.ts +94 -0
  171. package/dist/encoding/SchemaBinary.d.ts.map +1 -1
  172. package/dist/encoding/SchemaBinary.js +219 -6
  173. package/dist/encoding/SchemaBinary.js.map +1 -1
  174. package/dist/encoding/Sse.d.ts +3 -1
  175. package/dist/encoding/Sse.d.ts.map +1 -1
  176. package/dist/encoding/Sse.js +5 -3
  177. package/dist/encoding/Sse.js.map +1 -1
  178. package/dist/encoding/index.d.ts +10 -0
  179. package/dist/encoding/index.d.ts.map +1 -1
  180. package/dist/encoding/index.js +10 -0
  181. package/dist/encoding/index.js.map +1 -1
  182. package/dist/eventlog/EventLog.d.ts +7 -0
  183. package/dist/eventlog/EventLog.d.ts.map +1 -1
  184. package/dist/eventlog/EventLog.js +7 -0
  185. package/dist/eventlog/EventLog.js.map +1 -1
  186. package/dist/eventlog/EventLogServer.d.ts +7 -1
  187. package/dist/eventlog/EventLogServer.d.ts.map +1 -1
  188. package/dist/eventlog/EventLogServer.js +55 -24
  189. package/dist/eventlog/EventLogServer.js.map +1 -1
  190. package/dist/eventlog/EventLogServerEncrypted.d.ts +10 -0
  191. package/dist/eventlog/EventLogServerEncrypted.d.ts.map +1 -1
  192. package/dist/eventlog/EventLogServerEncrypted.js.map +1 -1
  193. package/dist/eventlog/EventLogServerUnencrypted.d.ts +17 -0
  194. package/dist/eventlog/EventLogServerUnencrypted.d.ts.map +1 -1
  195. package/dist/eventlog/EventLogServerUnencrypted.js +14 -2
  196. package/dist/eventlog/EventLogServerUnencrypted.js.map +1 -1
  197. package/dist/eventlog/EventLogSessionAuth.d.ts +21 -0
  198. package/dist/eventlog/EventLogSessionAuth.d.ts.map +1 -1
  199. package/dist/eventlog/EventLogSessionAuth.js +22 -0
  200. package/dist/eventlog/EventLogSessionAuth.js.map +1 -1
  201. package/dist/graphql/GraphQLClient.d.ts +3 -1
  202. package/dist/graphql/GraphQLClient.d.ts.map +1 -1
  203. package/dist/graphql/GraphQLClient.js.map +1 -1
  204. package/dist/graphql/GraphQLClientError.d.ts +14 -9
  205. package/dist/graphql/GraphQLClientError.d.ts.map +1 -1
  206. package/dist/graphql/GraphQLClientError.js +14 -21
  207. package/dist/graphql/GraphQLClientError.js.map +1 -1
  208. package/dist/graphql/GraphQLProtocol.d.ts +12 -3
  209. package/dist/graphql/GraphQLProtocol.d.ts.map +1 -1
  210. package/dist/graphql/GraphQLProtocol.js +4 -1
  211. package/dist/graphql/GraphQLProtocol.js.map +1 -1
  212. package/dist/http/HttpClient.d.ts +204 -16
  213. package/dist/http/HttpClient.d.ts.map +1 -1
  214. package/dist/http/HttpClient.js +93 -13
  215. package/dist/http/HttpClient.js.map +1 -1
  216. package/dist/http/HttpServerRequest.d.ts.map +1 -1
  217. package/dist/http/HttpServerRequest.js +38 -22
  218. package/dist/http/HttpServerRequest.js.map +1 -1
  219. package/dist/http/internal/mimeTypes.d.ts +4 -1
  220. package/dist/http/internal/mimeTypes.d.ts.map +1 -1
  221. package/dist/http/internal/mimeTypes.js +4 -1
  222. package/dist/http/internal/mimeTypes.js.map +1 -1
  223. package/dist/http-api/HttpApiSchema.js +1 -1
  224. package/dist/http-api/HttpApiSchema.js.map +1 -1
  225. package/dist/internal/dateTime.js +66 -27
  226. package/dist/internal/dateTime.js.map +1 -1
  227. package/dist/internal/effect.js +10 -0
  228. package/dist/internal/effect.js.map +1 -1
  229. package/dist/internal/glob.js +234 -56
  230. package/dist/internal/glob.js.map +1 -1
  231. package/dist/internal/graphql.js +21 -7
  232. package/dist/internal/graphql.js.map +1 -1
  233. package/dist/internal/graphqlHeaders.d.ts +7 -0
  234. package/dist/internal/graphqlHeaders.d.ts.map +1 -1
  235. package/dist/internal/graphqlHeaders.js +11 -0
  236. package/dist/internal/graphqlHeaders.js.map +1 -1
  237. package/dist/internal/jsonParser.d.ts +5 -0
  238. package/dist/internal/jsonParser.d.ts.map +1 -0
  239. package/dist/internal/jsonParser.js +280 -0
  240. package/dist/internal/jsonParser.js.map +1 -0
  241. package/dist/internal/persistence.js +8 -1
  242. package/dist/internal/persistence.js.map +1 -1
  243. package/dist/internal/request.js +29 -42
  244. package/dist/internal/request.js.map +1 -1
  245. package/dist/internal/schema/fromJsonSchemaDocument.js +7 -8
  246. package/dist/internal/schema/fromJsonSchemaDocument.js.map +1 -1
  247. package/dist/internal/sql.js +16 -0
  248. package/dist/internal/sql.js.map +1 -1
  249. package/dist/internal/version.js +1 -1
  250. package/dist/jose/JoseError.d.ts +285 -0
  251. package/dist/jose/JoseError.d.ts.map +1 -0
  252. package/dist/jose/JoseError.js +269 -0
  253. package/dist/jose/JoseError.js.map +1 -0
  254. package/dist/jose/Jwe.d.ts +128 -0
  255. package/dist/jose/Jwe.d.ts.map +1 -0
  256. package/dist/jose/Jwe.js +134 -0
  257. package/dist/jose/Jwe.js.map +1 -0
  258. package/dist/jose/Jwk.d.ts +597 -0
  259. package/dist/jose/Jwk.d.ts.map +1 -0
  260. package/dist/jose/Jwk.js +503 -0
  261. package/dist/jose/Jwk.js.map +1 -0
  262. package/dist/jose/Jwks.d.ts +236 -0
  263. package/dist/jose/Jwks.d.ts.map +1 -0
  264. package/dist/jose/Jwks.js +306 -0
  265. package/dist/jose/Jwks.js.map +1 -0
  266. package/dist/jose/Jws.d.ts +177 -0
  267. package/dist/jose/Jws.d.ts.map +1 -0
  268. package/dist/jose/Jws.js +183 -0
  269. package/dist/jose/Jws.js.map +1 -0
  270. package/dist/jose/Jwt.d.ts +270 -0
  271. package/dist/jose/Jwt.d.ts.map +1 -0
  272. package/dist/jose/Jwt.js +293 -0
  273. package/dist/jose/Jwt.js.map +1 -0
  274. package/dist/jose/index.d.ts +51 -0
  275. package/dist/jose/index.d.ts.map +1 -0
  276. package/dist/jose/index.js +52 -0
  277. package/dist/jose/index.js.map +1 -0
  278. package/dist/jose/internal/compact.d.ts +2 -0
  279. package/dist/jose/internal/compact.d.ts.map +1 -0
  280. package/dist/jose/internal/compact.js +179 -0
  281. package/dist/jose/internal/compact.js.map +1 -0
  282. package/dist/net/Host.d.ts.map +1 -1
  283. package/dist/net/Host.js +5 -10
  284. package/dist/net/Host.js.map +1 -1
  285. package/dist/observability/OtlpExporter.d.ts +4 -0
  286. package/dist/observability/OtlpExporter.d.ts.map +1 -1
  287. package/dist/observability/OtlpExporter.js +40 -12
  288. package/dist/observability/OtlpExporter.js.map +1 -1
  289. package/dist/observability/OtlpSerialization.d.ts +1 -1
  290. package/dist/observability/OtlpSerialization.d.ts.map +1 -1
  291. package/dist/observability/OtlpSerialization.js +10 -4
  292. package/dist/observability/OtlpSerialization.js.map +1 -1
  293. package/dist/observability/internal/otlpProtobuf.js +3 -3
  294. package/dist/observability/internal/otlpProtobuf.js.map +1 -1
  295. package/dist/observability/internal/protobuf.js +6 -0
  296. package/dist/observability/internal/protobuf.js.map +1 -1
  297. package/dist/persistence/CircuitBreaker.d.ts +98 -38
  298. package/dist/persistence/CircuitBreaker.d.ts.map +1 -1
  299. package/dist/persistence/CircuitBreaker.js +67 -29
  300. package/dist/persistence/CircuitBreaker.js.map +1 -1
  301. package/dist/persistence/RateLimiter.d.ts +15 -0
  302. package/dist/persistence/RateLimiter.d.ts.map +1 -1
  303. package/dist/persistence/RateLimiter.js +76 -16
  304. package/dist/persistence/RateLimiter.js.map +1 -1
  305. package/dist/persistence/index.d.ts +1 -1
  306. package/dist/persistence/index.js +1 -1
  307. package/dist/reactivity/AtomRegistry.js +17 -7
  308. package/dist/reactivity/AtomRegistry.js.map +1 -1
  309. package/dist/rpc/Rpc.d.ts +1 -1
  310. package/dist/rpc/Rpc.d.ts.map +1 -1
  311. package/dist/rpc/Rpc.js.map +1 -1
  312. package/dist/rpc/RpcClient.d.ts +14 -2
  313. package/dist/rpc/RpcClient.d.ts.map +1 -1
  314. package/dist/rpc/RpcClient.js +38 -21
  315. package/dist/rpc/RpcClient.js.map +1 -1
  316. package/dist/rpc/RpcMessage.d.ts +3 -2
  317. package/dist/rpc/RpcMessage.d.ts.map +1 -1
  318. package/dist/rpc/RpcMessage.js.map +1 -1
  319. package/dist/rpc/RpcServer.d.ts.map +1 -1
  320. package/dist/rpc/RpcServer.js +10 -1
  321. package/dist/rpc/RpcServer.js.map +1 -1
  322. package/dist/sql/Migrator.d.ts +9 -1
  323. package/dist/sql/Migrator.d.ts.map +1 -1
  324. package/dist/sql/Migrator.js +18 -6
  325. package/dist/sql/Migrator.js.map +1 -1
  326. package/dist/sql/SqlClient.d.ts +46 -3
  327. package/dist/sql/SqlClient.d.ts.map +1 -1
  328. package/dist/sql/SqlClient.js +40 -15
  329. package/dist/sql/SqlClient.js.map +1 -1
  330. package/dist/sql/Statement.d.ts +46 -3
  331. package/dist/sql/Statement.d.ts.map +1 -1
  332. package/dist/sql/Statement.js +32 -26
  333. package/dist/sql/Statement.js.map +1 -1
  334. package/dist/workflow/Workflow.d.ts +4 -0
  335. package/dist/workflow/Workflow.d.ts.map +1 -1
  336. package/dist/workflow/Workflow.js.map +1 -1
  337. package/dist/workflow/WorkflowEngine.d.ts.map +1 -1
  338. package/dist/workflow/WorkflowEngine.js +5 -0
  339. package/dist/workflow/WorkflowEngine.js.map +1 -1
  340. package/package.json +7 -3
  341. package/src/BigDecimal.ts +170 -16
  342. package/src/ByteSize.ts +29 -14
  343. package/src/Equal.ts +3 -3
  344. package/src/Hash.ts +5 -4
  345. package/src/Iterable.ts +28 -19
  346. package/src/JsonSchema.ts +45 -7
  347. package/src/MutableRef.ts +1 -8
  348. package/src/Path.ts +6 -1
  349. package/src/Pool.ts +2 -1
  350. package/src/Ref.ts +0 -8
  351. package/src/Schedule.ts +8 -6
  352. package/src/Schema.ts +3 -2
  353. package/src/SchemaRepresentation.ts +4 -2
  354. package/src/SchemaTransformation.ts +2 -2
  355. package/src/Stream.ts +6 -5
  356. package/src/ai/McpClient.ts +488 -91
  357. package/src/ai/McpSchema.ts +119 -0
  358. package/src/ai/McpServer.ts +302 -56
  359. package/src/ai/Prompt.ts +16 -11
  360. package/src/ai/Tool.ts +5 -10
  361. package/src/ai/internal/mcpCore.ts +165 -12
  362. package/src/ai/internal/mcpProtocol/v2024_11_05.ts +3 -1
  363. package/src/ai/internal/mcpProtocol/v2025_03_26.ts +3 -1
  364. package/src/ai/internal/mcpProtocol/v2025_06_18.ts +3 -1
  365. package/src/ai/internal/mcpProtocol/v2025_11_25.ts +3 -1
  366. package/src/ai/internal/mcpProtocol/v2026_07_28.ts +42 -9
  367. package/src/ai/internal/mcpProtocol.ts +15 -0
  368. package/src/ai/internal/mcpRuntime.ts +6 -3
  369. package/src/ai/internal/mcpSkills.ts +480 -0
  370. package/src/ai/internal/structured-output.ts +10 -4
  371. package/src/cluster/ClusterWorkflowEngine.ts +48 -33
  372. package/src/cluster/Entity.ts +52 -0
  373. package/src/cluster/MessageStorage.ts +3 -6
  374. package/src/cluster/Reply.ts +1 -1
  375. package/src/cluster/Runners.ts +16 -2
  376. package/src/cluster/Sharding.ts +17 -1
  377. package/src/cluster/internal/clusterAbandon.ts +7 -7
  378. package/src/cluster/internal/entityManager.ts +89 -15
  379. package/src/cluster/internal/transactionNotifications.ts +7 -0
  380. package/src/crypto/Aead.ts +3 -3
  381. package/src/crypto/Cipher.ts +3 -3
  382. package/src/crypto/KeyAgreement.ts +4 -4
  383. package/src/crypto/KeyFormat.ts +30 -1
  384. package/src/crypto/KeyWrap.ts +6 -6
  385. package/src/crypto/Mac.ts +3 -3
  386. package/src/crypto/Signature.ts +4 -4
  387. package/src/crypto/WebCrypto.ts +20 -0
  388. package/src/crypto/internal/asymmetric.ts +2 -1
  389. package/src/crypto/internal/key.ts +12 -5
  390. package/src/encoding/Base64Url.ts +27 -3
  391. package/src/encoding/Json5.ts +59 -0
  392. package/src/encoding/Jsonc.ts +126 -0
  393. package/src/encoding/Ndjson.ts +6 -5
  394. package/src/encoding/SchemaBinary.ts +228 -7
  395. package/src/encoding/Sse.ts +5 -3
  396. package/src/encoding/index.ts +12 -0
  397. package/src/eventlog/EventLog.ts +7 -0
  398. package/src/eventlog/EventLogServer.ts +67 -24
  399. package/src/eventlog/EventLogServerEncrypted.ts +5 -0
  400. package/src/eventlog/EventLogServerUnencrypted.ts +19 -2
  401. package/src/eventlog/EventLogSessionAuth.ts +26 -0
  402. package/src/graphql/GraphQLClient.ts +3 -1
  403. package/src/graphql/GraphQLClientError.ts +15 -22
  404. package/src/graphql/GraphQLProtocol.ts +12 -3
  405. package/src/http/HttpClient.ts +244 -33
  406. package/src/http/HttpServerRequest.ts +61 -23
  407. package/src/http/internal/mimeTypes.ts +4 -1
  408. package/src/http-api/HttpApiSchema.ts +1 -1
  409. package/src/internal/dateTime.ts +80 -27
  410. package/src/internal/effect.ts +6 -0
  411. package/src/internal/glob.ts +279 -63
  412. package/src/internal/graphql.ts +27 -9
  413. package/src/internal/graphqlHeaders.ts +13 -0
  414. package/src/internal/jsonParser.ts +307 -0
  415. package/src/internal/persistence.ts +9 -1
  416. package/src/internal/request.ts +51 -58
  417. package/src/internal/schema/fromJsonSchemaDocument.ts +11 -10
  418. package/src/internal/sql.ts +25 -0
  419. package/src/internal/version.ts +1 -1
  420. package/src/jose/JoseError.ts +329 -0
  421. package/src/jose/Jwe.ts +196 -0
  422. package/src/jose/Jwk.ts +777 -0
  423. package/src/jose/Jwks.ts +418 -0
  424. package/src/jose/Jws.ts +312 -0
  425. package/src/jose/Jwt.ts +493 -0
  426. package/src/jose/index.ts +58 -0
  427. package/src/jose/internal/compact.ts +195 -0
  428. package/src/net/Host.ts +5 -10
  429. package/src/observability/OtlpExporter.ts +42 -18
  430. package/src/observability/OtlpSerialization.ts +13 -5
  431. package/src/observability/internal/otlpProtobuf.ts +6 -6
  432. package/src/observability/internal/protobuf.ts +10 -0
  433. package/src/persistence/CircuitBreaker.ts +113 -48
  434. package/src/persistence/RateLimiter.ts +97 -19
  435. package/src/persistence/index.ts +1 -1
  436. package/src/reactivity/AtomRegistry.ts +19 -8
  437. package/src/rpc/Rpc.ts +3 -1
  438. package/src/rpc/RpcClient.ts +44 -24
  439. package/src/rpc/RpcMessage.ts +3 -2
  440. package/src/rpc/RpcServer.ts +12 -1
  441. package/src/sql/Migrator.ts +35 -18
  442. package/src/sql/SqlClient.ts +91 -22
  443. package/src/sql/Statement.ts +60 -35
  444. package/src/workflow/Workflow.ts +4 -0
  445. package/src/workflow/WorkflowEngine.ts +5 -0
@@ -10,12 +10,11 @@
10
10
  * @since 4.0.0
11
11
  */
12
12
  import * as Cause from "../Cause.ts"
13
- import { Clock } from "../Clock.ts"
14
13
  import * as Context from "../Context.ts"
15
14
  import * as Effect from "../Effect.ts"
16
15
  import * as Exit from "../Exit.ts"
17
16
  import { identity } from "../Function.ts"
18
- import { CurrentTransactionService } from "../internal/sql.ts"
17
+ import { CurrentTransactionService, recordConnectionWait, waitClock } from "../internal/sql.ts"
19
18
  import * as Option from "../Option.ts"
20
19
  import { hasProperty } from "../Predicate.ts"
21
20
  import type * as Queue from "../Queue.ts"
@@ -81,6 +80,10 @@ export interface SqlClient extends Constructor {
81
80
  * client's, such as one that sets its isolation level, provide
82
81
  * `BeginTransaction`.
83
82
  *
83
+ * To retry serialization failures or deadlocks, wrap the outermost
84
+ * `withTransaction` in `Effect.retry`. Each attempt starts a fresh
85
+ * transaction and re-runs the whole effect, including `COMMIT`.
86
+ *
84
87
  * **Gotchas**
85
88
  *
86
89
  * Deferred invalidations run individually after the commit and don't join an
@@ -88,6 +91,35 @@ export interface SqlClient extends Constructor {
88
91
  * the transaction's context defers, and a fiber that outlives the
89
92
  * transaction can't defer through it, as with `afterCommit`. Transactions
90
93
  * that don't go through `makeWithTransaction` invalidate immediately.
94
+ *
95
+ * Retrying a nested transaction only retries its savepoint, which can't
96
+ * recover an outer transaction the database has aborted. Since a retried
97
+ * effect runs more than once, keep non-transactional side effects in
98
+ * `afterCommit`, which discards the callbacks of a failed attempt but
99
+ * doesn't guarantee they run exactly once. Don't retry `ConnectionError`: a
100
+ * `COMMIT` that lost its connection may have committed, and retrying would
101
+ * apply its writes twice.
102
+ *
103
+ * **Example** (Retrying serialization failures and deadlocks)
104
+ *
105
+ * ```ts
106
+ * import { Effect, Schedule } from "effect"
107
+ * import { SqlClient } from "effect/sql"
108
+ *
109
+ * const program = Effect.gen(function*() {
110
+ * const sql = yield* SqlClient.SqlClient
111
+ * return yield* sql.withTransaction(
112
+ * sql`UPDATE accounts SET balance = balance - 10 WHERE id = 1`
113
+ * ).pipe(
114
+ * Effect.provideService(SqlClient.BeginTransaction, "BEGIN ISOLATION LEVEL SERIALIZABLE"),
115
+ * Effect.retry({
116
+ * while: (error) => error.reason._tag === "SerializationError" || error.reason._tag === "DeadlockError",
117
+ * times: 5,
118
+ * schedule: Schedule.exponential("10 millis").pipe(Schedule.jittered)
119
+ * })
120
+ * )
121
+ * })
122
+ * ```
91
123
  */
92
124
  readonly withTransaction: <R, E, A>(
93
125
  self: Effect.Effect<A, E, R>
@@ -206,9 +238,8 @@ export declare namespace SqlClient {
206
238
  readonly spanAttributes: ReadonlyArray<readonly [string, unknown]>
207
239
  readonly transactionService?: Context.Service<TransactionConnection, TransactionConnection.Service>
208
240
  /**
209
- * Whether the transaction control statements - `BEGIN`, `COMMIT`,
210
- * `ROLLBACK`, and the savepoint pair - can be prepared like any other
211
- * statement.
241
+ * Whether the transaction control statements - `BEGIN`, `COMMIT` and
242
+ * `SAVEPOINT` - can be prepared like any other statement.
212
243
  *
213
244
  * **Details**
214
245
  *
@@ -216,6 +247,9 @@ export declare namespace SqlClient {
216
247
  * prepare them stops parsing them again each time. Off by default,
217
248
  * because several databases refuse to prepare transaction control at all;
218
249
  * a driver has to say that its own does not.
250
+ *
251
+ * Rollbacks and savepoint releases always run unprepared, so a prepared
252
+ * statement the backend has dropped cannot stop cleanup.
219
253
  */
220
254
  readonly prepareTransactionControls?: boolean | undefined
221
255
  readonly beginTransaction?: string | undefined
@@ -248,6 +282,8 @@ export declare namespace SqlClient {
248
282
  let clientIdCounter = 0
249
283
  let transactionSemaphoreIdCounter = 0
250
284
 
285
+ const ATTR_DB_OPERATION_NAME = "db.operation.name"
286
+
251
287
  /**
252
288
  * Constructs a `SqlClient` from connection acquirers, a compiler, transaction
253
289
  * commands, tracing attributes, optional row transforms, and reactive query
@@ -274,20 +310,20 @@ export const make = Effect.fnUntraced(function*(options: SqlClient.MakeOptions)
274
310
  const rollback = options.rollback ?? "ROLLBACK"
275
311
  const rollbackSavepoint = options.rollbackSavepoint ?? ((name: string) => `ROLLBACK TO SAVEPOINT ${name}`)
276
312
  const transactionAcquirer = options.transactionAcquirer ?? options.acquirer
313
+ const unprepared = (conn: Connection.Connection, sql: string) => conn.executeUnprepared(sql, [], undefined)
277
314
  const control = options.prepareTransactionControls === true
278
315
  ? (conn: Connection.Connection, sql: string) => conn.execute(sql, [], undefined)
279
- : (conn: Connection.Connection, sql: string) => conn.executeUnprepared(sql, [], undefined)
316
+ : unprepared
280
317
  const isTransaction = options.isTransaction
281
318
  const cleanup = isTransaction
282
- ? (conn: Connection.Connection, sql: string) => isTransaction(conn) ? control(conn, sql) : Effect.void
283
- : control
319
+ ? (conn: Connection.Connection, sql: string) => isTransaction(conn) ? unprepared(conn, sql) : Effect.void
320
+ : unprepared
284
321
  const withTransaction = makeWithTransaction({
285
322
  transactionService,
286
323
  spanAttributes: options.spanAttributes,
287
324
  acquireConnection: (restore) => restore(transactionAcquirer!),
288
325
  // Unlike the client's own, a provided statement isn't fixed, so it isn't prepared.
289
- begin: (conn, statement) =>
290
- statement === undefined ? control(conn, beginTransaction) : conn.executeUnprepared(statement, [], undefined),
326
+ begin: (conn, statement) => statement === undefined ? control(conn, beginTransaction) : unprepared(conn, statement),
291
327
  savepoint: (conn, id) => control(conn, savepoint(`effect_sql_${id}`)),
292
328
  releaseSavepoint: releaseSavepoint
293
329
  ? (conn, id) => cleanup(conn, releaseSavepoint(`effect_sql_${id}`))
@@ -517,6 +553,14 @@ const makeAfterCommit =
517
553
  * caller's context has no `SqlClient`, so their requests don't share a batch
518
554
  * with requests outside the transaction.
519
555
  *
556
+ * Each callback below except `acquireConnection` is traced like a statement,
557
+ * in its own client span under the `sql.transaction` span, named after the
558
+ * operation and the target derived from `spanAttributes`, such as
559
+ * `COMMIT mydb`. With `Statement.SpanPropagationEnabled`, a top-level
560
+ * transaction also records how long `acquireConnection` took as
561
+ * `db.client.connection.wait_time_ms`, so work a driver does there, such as
562
+ * starting the transaction, counts as waiting for the connection.
563
+ *
520
564
  * @stability unstable
521
565
  * @category transactions
522
566
  * @since 4.0.0
@@ -557,6 +601,7 @@ export const makeWithTransaction = <I, S>(options: {
557
601
  `effect/sql/SqlClient/TransactionSemaphore/${transactionSemaphoreIdCounter++}`
558
602
  )
559
603
  const afterCommit = makeAfterCommit(options.transactionService)
604
+ const target = Statement.spanTarget(options.spanAttributes)
560
605
  const deferInvalidations = (reactivity: Reactivity): Reactivity => {
561
606
  const invalidate = (keys: Parameters<Reactivity["invalidate"]>[0]) =>
562
607
  afterCommit(Effect.sync(() => reactivity.invalidateUnsafe(keys)))
@@ -574,13 +619,32 @@ export const makeWithTransaction = <I, S>(options: {
574
619
  }
575
620
  const services = fiber.context
576
621
  const reactivity = Context.getOrUndefined(services, Reactivity)
577
- const clock = fiber.getRef(Clock)
622
+ const propagate = fiber.cache.tracerEnabled && fiber.getRef(Statement.SpanPropagationEnabled)
623
+ const waitedClock = propagate ? waitClock(fiber) : undefined
624
+ // Runs a transaction control in a span of its own, so a failure ends
625
+ // that span with the control's own exit.
626
+ const control = (operation: string, effect: Effect.Effect<void, SqlError>) =>
627
+ Effect.useSpan(
628
+ target === undefined ? operation : `${operation} ${target}`,
629
+ { kind: "client", parent: span },
630
+ (controlSpan) => {
631
+ for (const [key, value] of options.spanAttributes) {
632
+ controlSpan.attribute(key, value)
633
+ }
634
+ controlSpan.attribute(ATTR_DB_OPERATION_NAME, operation)
635
+ return effect
636
+ }
637
+ )
578
638
  const connOption = Context.getOption(services, options.transactionService)
579
639
  const conn: Effect.Effect<readonly [Scope.Closeable | undefined, S], SqlError> = connOption._tag === "Some"
580
640
  ? Effect.succeed([undefined, connOption.value[0]] as const)
581
641
  : Effect.flatMap(Scope.make(), (scope) =>
582
642
  Scope.provide(options.acquireConnection(restore), scope).pipe(
583
- Effect.map((conn) => [scope, conn] as const),
643
+ Effect.provideService(Tracer.ParentSpan, span),
644
+ Effect.map((conn) => {
645
+ if (waitedClock !== undefined) recordConnectionWait(span, waitedClock)
646
+ return [scope, conn] as const
647
+ }),
584
648
  Effect.onError((cause) => Scope.close(scope, Exit.failCause(cause)))
585
649
  ))
586
650
  const id = connOption._tag === "Some" ? connOption.value[1] + 1 : 0
@@ -590,12 +654,16 @@ export const makeWithTransaction = <I, S>(options: {
590
654
  open: true
591
655
  }
592
656
  let committed = false
657
+ const start = (conn: S) =>
658
+ id === 0
659
+ ? control("BEGIN", options.begin(conn, fiber.getRef(BeginTransaction)))
660
+ : control("SAVEPOINT", options.savepoint(conn, id))
593
661
  const transaction = Effect.flatMap(
594
662
  conn,
595
663
  (
596
664
  [scope, conn]
597
665
  ) =>
598
- (id === 0 ? options.begin(conn, fiber.getRef(BeginTransaction)) : options.savepoint(conn, id)).pipe(
666
+ start(conn).pipe(
599
667
  Effect.flatMap(() => {
600
668
  const level = [conn, id] as const
601
669
  afterCommitBuffers.set(level, buffer)
@@ -614,30 +682,31 @@ export const makeWithTransaction = <I, S>(options: {
614
682
  let effect: Effect.Effect<void, SqlError>
615
683
  if (Exit.isSuccess(exit)) {
616
684
  if (id === 0) {
617
- span.event("effect.sql.transaction.commit", clock.currentTimeNanosUnsafe())
618
685
  const onCommitFailure = options.onCommitFailure
686
+ const commit = control("COMMIT", options.commit(conn))
619
687
  effect = onCommitFailure
620
- ? Effect.catchCause(options.commit(conn), (commitCause) =>
621
- Effect.matchCauseEffect(onCommitFailure(conn), {
688
+ ? Effect.catchCause(commit, (commitCause) =>
689
+ Effect.matchCauseEffect(control("ROLLBACK", onCommitFailure(conn)), {
622
690
  onFailure: (cleanupCause) =>
623
691
  Effect.failCause(failuresToDefects(Cause.combine(commitCause, cleanupCause))),
624
692
  onSuccess: () => Effect.failCause(commitCause)
625
693
  }))
626
- : options.commit(conn)
694
+ : commit
627
695
  } else {
628
- span.event("effect.sql.transaction.savepoint", clock.currentTimeNanosUnsafe())
629
696
  effect = Effect.void
630
697
  }
631
698
  } else {
632
- span.event("effect.sql.transaction.rollback", clock.currentTimeNanosUnsafe())
633
699
  effect = Effect.orDie(
634
700
  id > 0
635
- ? options.rollbackSavepoint(conn, id)
636
- : options.rollback(conn)
701
+ ? control("ROLLBACK TO SAVEPOINT", options.rollbackSavepoint(conn, id))
702
+ : control("ROLLBACK", options.rollback(conn))
637
703
  )
638
704
  }
639
705
  if (id > 0 && options.releaseSavepoint) {
640
- effect = Effect.andThen(effect, Effect.orDie(options.releaseSavepoint(conn, id)))
706
+ effect = Effect.andThen(
707
+ effect,
708
+ Effect.orDie(control("RELEASE SAVEPOINT", options.releaseSavepoint(conn, id)))
709
+ )
641
710
  }
642
711
  return Effect.flatMap(effect, () => {
643
712
  committed = Exit.isSuccess(exit)
@@ -20,6 +20,7 @@ import type * as Fiber from "../Fiber.ts"
20
20
  import { constUndefined } from "../Function.ts"
21
21
  import * as internalEffect from "../internal/effect.ts"
22
22
  import * as InternalRecord from "../internal/record.ts"
23
+ import { recordConnectionWait, waitClock } from "../internal/sql.ts"
23
24
  import { hasProperty } from "../Predicate.ts"
24
25
  import { TracerTimingEnabled } from "../References.ts"
25
26
  import * as Stream from "../Stream.ts"
@@ -27,7 +28,41 @@ import * as Tracer from "../Tracer.ts"
27
28
  import type { Acquirer, Borrower, Connection, Row } from "./SqlConnection.ts"
28
29
  import type { SqlError } from "./SqlError.ts"
29
30
 
30
- const FragmentTypeId = "~effect/sql/Statement/Fragment"
31
+ /**
32
+ * Runtime type identifier for SQL `Fragment` values.
33
+ *
34
+ * @stability unstable
35
+ * @category Type ID
36
+ * @since 4.1.1
37
+ */
38
+ export const FragmentTypeId: unique symbol = Symbol.for("~effect/sql/Statement/Fragment")
39
+
40
+ /**
41
+ * Type of the unique symbol used to brand SQL `Fragment` values.
42
+ *
43
+ * @stability unstable
44
+ * @category Type ID
45
+ * @since 4.1.1
46
+ */
47
+ export type FragmentTypeId = typeof FragmentTypeId
48
+
49
+ /**
50
+ * Runtime type identifier for SQL `Segment` values.
51
+ *
52
+ * @stability unstable
53
+ * @category Type ID
54
+ * @since 4.1.1
55
+ */
56
+ export const SegmentTypeId: unique symbol = Symbol.for("~effect/sql/Statement/Segment")
57
+
58
+ /**
59
+ * Type of the unique symbol used to brand SQL `Segment` values.
60
+ *
61
+ * @stability unstable
62
+ * @category Type ID
63
+ * @since 4.1.1
64
+ */
65
+ export type SegmentTypeId = typeof SegmentTypeId
31
66
 
32
67
  /**
33
68
  * Composable SQL fragment represented as low-level segments that can be
@@ -38,7 +73,7 @@ const FragmentTypeId = "~effect/sql/Statement/Fragment"
38
73
  * @since 4.0.0
39
74
  */
40
75
  export interface Fragment {
41
- readonly [FragmentTypeId]: typeof FragmentTypeId
76
+ readonly [FragmentTypeId]: FragmentTypeId
42
77
  readonly segments: ReadonlyArray<Segment>
43
78
  }
44
79
 
@@ -120,6 +155,11 @@ export const CurrentTransformer = Context.Reference<Transformer | undefined>("ef
120
155
  * waited for a connection as `db.client.connection.wait_time_ms`. Defaults to
121
156
  * `false`; ignored when tracing is disabled.
122
157
  *
158
+ * **Details**
159
+ *
160
+ * A top-level transaction also records how long it waited for its
161
+ * connection on its `sql.transaction` span.
162
+ *
123
163
  * @stability unstable
124
164
  * @category services
125
165
  * @since 4.0.0
@@ -147,7 +187,7 @@ export const isFragment = (u: unknown): u is Fragment => hasProperty(u, Fragment
147
187
  export const isCustom = <A extends Custom<any, any, any, any>>(
148
188
  kind: A["kind"]
149
189
  ) =>
150
- (u: unknown): u is A => hasProperty(u, "_tag") && u._tag === "Custom" && (u as any).kind === kind
190
+ (u: unknown): u is A => isSegment(u) && u._tag === "Custom" && u.kind === kind
151
191
 
152
192
  /**
153
193
  * Union of low-level segment types that make up a SQL `Fragment`.
@@ -175,6 +215,7 @@ export type Segment =
175
215
  * @since 4.0.0
176
216
  */
177
217
  export interface Literal {
218
+ readonly [SegmentTypeId]: SegmentTypeId
178
219
  readonly _tag: "Literal"
179
220
  readonly value: string
180
221
  readonly params?: ReadonlyArray<unknown> | undefined
@@ -189,6 +230,7 @@ export interface Literal {
189
230
  * @since 4.0.0
190
231
  */
191
232
  export const literal = (value: string, params?: ReadonlyArray<unknown> | undefined): Literal => ({
233
+ [SegmentTypeId]: SegmentTypeId,
192
234
  _tag: "Literal",
193
235
  value,
194
236
  params
@@ -202,6 +244,7 @@ export const literal = (value: string, params?: ReadonlyArray<unknown> | undefin
202
244
  * @since 4.0.0
203
245
  */
204
246
  export interface Identifier {
247
+ readonly [SegmentTypeId]: SegmentTypeId
205
248
  readonly _tag: "Identifier"
206
249
  readonly value: string
207
250
  }
@@ -215,6 +258,7 @@ export interface Identifier {
215
258
  * @since 4.0.0
216
259
  */
217
260
  export const identifier = (value: string): Identifier => ({
261
+ [SegmentTypeId]: SegmentTypeId,
218
262
  _tag: "Identifier",
219
263
  value
220
264
  })
@@ -228,6 +272,7 @@ export const identifier = (value: string): Identifier => ({
228
272
  * @since 4.0.0
229
273
  */
230
274
  export interface Parameter {
275
+ readonly [SegmentTypeId]: SegmentTypeId
231
276
  readonly _tag: "Parameter"
232
277
  readonly value: unknown
233
278
  }
@@ -240,6 +285,7 @@ export interface Parameter {
240
285
  * @since 4.0.0
241
286
  */
242
287
  export const parameter = (value: unknown): Parameter => ({
288
+ [SegmentTypeId]: SegmentTypeId,
243
289
  _tag: "Parameter",
244
290
  value
245
291
  })
@@ -253,6 +299,7 @@ export const parameter = (value: unknown): Parameter => ({
253
299
  * @since 4.0.0
254
300
  */
255
301
  export interface ArrayHelper {
302
+ readonly [SegmentTypeId]: SegmentTypeId
256
303
  readonly _tag: "ArrayHelper"
257
304
  readonly value: ReadonlyArray<unknown | Fragment>
258
305
  }
@@ -265,6 +312,7 @@ export interface ArrayHelper {
265
312
  * @since 4.0.0
266
313
  */
267
314
  export const arrayHelper = (value: ReadonlyArray<unknown | Fragment>): ArrayHelper => ({
315
+ [SegmentTypeId]: SegmentTypeId,
268
316
  _tag: "ArrayHelper",
269
317
  value
270
318
  })
@@ -278,6 +326,7 @@ export const arrayHelper = (value: ReadonlyArray<unknown | Fragment>): ArrayHelp
278
326
  * @since 4.0.0
279
327
  */
280
328
  export interface RecordInsertHelper {
329
+ readonly [SegmentTypeId]: SegmentTypeId
281
330
  readonly _tag: "RecordInsertHelper"
282
331
  readonly value: Arr.NonEmptyReadonlyArray<Record<string, unknown>>
283
332
  /**
@@ -288,6 +337,7 @@ export interface RecordInsertHelper {
288
337
  }
289
338
 
290
339
  const RecordInsertHelperProto = {
340
+ [SegmentTypeId]: SegmentTypeId,
291
341
  _tag: "RecordInsertHelper" as const,
292
342
  returning(this: RecordInsertHelper, sql: string | Identifier | Fragment) {
293
343
  const self = Object.create(Object.getPrototypeOf(this))
@@ -322,6 +372,7 @@ export const recordInsertHelper = (
322
372
  * @since 4.0.0
323
373
  */
324
374
  export interface RecordUpdateHelper {
375
+ readonly [SegmentTypeId]: SegmentTypeId
325
376
  readonly _tag: "RecordUpdateHelper"
326
377
  readonly value: Arr.NonEmptyReadonlyArray<Record<string, unknown>>
327
378
  readonly alias: string
@@ -364,6 +415,7 @@ export const recordUpdateHelper = (
364
415
  * @since 4.0.0
365
416
  */
366
417
  export interface RecordUpdateHelperSingle {
418
+ readonly [SegmentTypeId]: SegmentTypeId
367
419
  readonly _tag: "RecordUpdateHelperSingle"
368
420
  readonly value: Record<string, unknown>
369
421
  readonly omit: ReadonlyArray<string>
@@ -411,6 +463,7 @@ export interface Custom<
411
463
  B = void,
412
464
  C = void
413
465
  > {
466
+ readonly [SegmentTypeId]: SegmentTypeId
414
467
  readonly _tag: "Custom"
415
468
  readonly kind: T
416
469
  readonly paramA: A
@@ -433,7 +486,7 @@ export const custom = <C extends Custom<any, any, any, any>>(
433
486
  paramA: C["paramA"],
434
487
  paramB: C["paramB"],
435
488
  paramC: C["paramC"]
436
- ): C => ({ _tag: "Custom", kind, paramA, paramB, paramC } as C)
489
+ ): C => ({ [SegmentTypeId]: SegmentTypeId, _tag: "Custom", kind, paramA, paramB, paramC } as C)
437
490
 
438
491
  /**
439
492
  * Names the primitive value categories recognized by SQL statement helpers and
@@ -1355,7 +1408,6 @@ export const spanName = (spanAttributes: ReadonlyArray<readonly [string, unknown
1355
1408
  // internal
1356
1409
 
1357
1410
  const ATTR_DB_QUERY_TEXT = "db.query.text"
1358
- const ATTR_DB_CLIENT_CONNECTION_WAIT_TIME = "db.client.connection.wait_time_ms"
1359
1411
  const ATTR_SQL_METHOD = "effect.sql.method"
1360
1412
 
1361
1413
  // the last value wins, matching the order the attributes are applied to spans
@@ -1464,6 +1516,8 @@ const StatementProto: Omit<
1464
1516
  span.attribute(ATTR_SQL_METHOD, operation)
1465
1517
  span.attribute(ATTR_DB_QUERY_TEXT, sql)
1466
1518
  const propagate = fiber.cache.tracerEnabled && fiber.getRef(SpanPropagationEnabled)
1519
+ // Measured from the span's start, so the wait also covers compiling the
1520
+ // statement and any `CurrentTransformer` run first.
1467
1521
  const clock = propagate ? waitClock(fiber) : undefined
1468
1522
  const run = clock === undefined
1469
1523
  ? (connection: Connection) => f(connection, sql, params)
@@ -1580,18 +1634,6 @@ const StatementProto: Omit<
1580
1634
  }
1581
1635
  }
1582
1636
 
1583
- // Without span timing, the span has no start time to measure from.
1584
- const waitClock = (fiber: Fiber.Fiber<unknown, unknown>): Clock | undefined =>
1585
- fiber.getRef(TracerTimingEnabled) ? fiber.getRef(Clock) : undefined
1586
-
1587
- // Measured from the statement span's start to the connection hand-off, so it
1588
- // also covers compiling the statement and any `CurrentTransformer` run first.
1589
- const recordConnectionWait = (span: Tracer.Span, clock: Clock): void =>
1590
- span.attribute(
1591
- ATTR_DB_CLIENT_CONNECTION_WAIT_TIME,
1592
- Number(clock.currentTimeNanosUnsafe() - span.status.startTime) / 1e6
1593
- )
1594
-
1595
1637
  const withStatement = <A, X, E, R>(
1596
1638
  self: StatementImpl<A>,
1597
1639
  span: Tracer.Span,
@@ -1613,24 +1655,7 @@ const withStatement = <A, X, E, R>(
1613
1655
  )
1614
1656
  })
1615
1657
 
1616
- const isSegment = (u: unknown): u is Segment => {
1617
- if (!hasProperty(u, "_tag")) {
1618
- return false
1619
- }
1620
- switch (u._tag) {
1621
- case "Literal":
1622
- case "Parameter":
1623
- case "ArrayHelper":
1624
- case "RecordInsertHelper":
1625
- case "RecordUpdateHelper":
1626
- case "RecordUpdateHelperSingle":
1627
- case "Identifier":
1628
- case "Custom":
1629
- return true
1630
- default:
1631
- return false
1632
- }
1633
- }
1658
+ const isSegment = (u: unknown): u is Segment => hasProperty(u, SegmentTypeId)
1634
1659
 
1635
1660
  function convertLiteralOrFragment(clause: string | Fragment): Array<Segment> {
1636
1661
  if (typeof clause === "string") {
@@ -88,6 +88,10 @@ export interface Workflow<
88
88
  * nor gets interrupted with it. The cluster engine retains the parent for
89
89
  * observability.
90
90
  *
91
+ * Inside a workflow, an awaited child that is interrupted fails the parent
92
+ * with a defect rather than an interrupt, so the parent can recover with
93
+ * `Effect.catchDefect` or `Effect.exit`.
94
+ *
91
95
  * **Gotchas**
92
96
  *
93
97
  * Do not await a detached execution later. Executing the same payload joins
@@ -583,6 +583,11 @@ export const makeUnsafe = (options: Encoded): WorkflowEngine["Service"] =>
583
583
  if (wrapped._tag === "Suspended") {
584
584
  return yield* Workflow.suspend(parentInstance.value)
585
585
  }
586
+ // A child's interrupt is an outcome for the parent, not an interrupt of
587
+ // the parent's run, so surface it as a defect the parent can observe.
588
+ if (Exit.isFailure(wrapped.exit) && Cause.hasInterruptsOnly(wrapped.exit.cause)) {
589
+ return yield* Effect.die(`${self._tag}.execute: execution "${executionId}" was interrupted`)
590
+ }
586
591
  return yield* wrapped.exit
587
592
  }
588
593