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
@@ -0,0 +1,195 @@
1
+ import type * as CryptoError from "../../crypto/CryptoError.ts"
2
+ import * as Duration from "../../Duration.ts"
3
+ import * as Effect from "../../Effect.ts"
4
+ import * as Base64Url from "../../encoding/Base64Url.ts"
5
+ import * as Option from "../../Option.ts"
6
+ import * as Redacted from "../../Redacted.ts"
7
+ import * as Result from "../../Result.ts"
8
+ import * as Schema from "../../Schema.ts"
9
+ import * as JoseError from "../JoseError.ts"
10
+
11
+ /** @internal */
12
+ export const fail = (reason: JoseError.JoseErrorReason): Effect.Effect<never, JoseError.JoseError> =>
13
+ Effect.fail(new JoseError.JoseError({ reason }))
14
+
15
+ /** @internal */
16
+ export const invalidToken = (description: string) => fail(new JoseError.InvalidToken({ description }))
17
+
18
+ /** @internal */
19
+ export const invalidKey = (description: string, cause?: unknown) =>
20
+ fail(new JoseError.InvalidKey({ description, cause }))
21
+
22
+ /** @internal */
23
+ export const invalidArgument = (description: string, cause?: unknown) =>
24
+ fail(new JoseError.InvalidArgument({ description, cause }))
25
+
26
+ /**
27
+ * Maps a failure of an operation on secret material, such as signing or
28
+ * private-key import, to a fixed description. Backend messages and causes may
29
+ * describe the secret, so they are dropped.
30
+ *
31
+ * @internal
32
+ */
33
+ export const cryptoFailure = (description: string) => (_: CryptoError.CryptoError): JoseError.JoseError =>
34
+ new JoseError.JoseError({ reason: new JoseError.InvalidKey({ description }) })
35
+
36
+ /**
37
+ * Maps a public-key import failure, keeping the backend diagnostic.
38
+ *
39
+ * @internal
40
+ */
41
+ export const publicKeyFailure = (error: CryptoError.CryptoError): JoseError.JoseError =>
42
+ new JoseError.JoseError({ reason: new JoseError.InvalidKey({ description: error.message, cause: error }) })
43
+
44
+ /**
45
+ * Schema fields that keep private and symmetric key members out of a public
46
+ * JWK.
47
+ *
48
+ * @internal
49
+ */
50
+ export const noPrivateMembers = {
51
+ d: Schema.optionalKey(Schema.Never),
52
+ p: Schema.optionalKey(Schema.Never),
53
+ q: Schema.optionalKey(Schema.Never),
54
+ dp: Schema.optionalKey(Schema.Never),
55
+ dq: Schema.optionalKey(Schema.Never),
56
+ qi: Schema.optionalKey(Schema.Never),
57
+ oth: Schema.optionalKey(Schema.Never),
58
+ k: Schema.optionalKey(Schema.Never)
59
+ }
60
+
61
+ /** @internal */
62
+ export const hasPrivateMembers = (jwk: object): boolean =>
63
+ Object.keys(noPrivateMembers).some((name) => Object.hasOwn(jwk, name))
64
+
65
+ /** @internal */
66
+ export const utf8 = (text: string): Uint8Array => new TextEncoder().encode(text)
67
+
68
+ /** @internal */
69
+ export const reveal = (token: string | Redacted.Redacted<string>): string =>
70
+ Redacted.isRedacted(token) ? Redacted.value(token) : token
71
+
72
+ /**
73
+ * Checks unpadded base64url, including the unused bits in the final character.
74
+ *
75
+ * @internal
76
+ */
77
+ export const isCanonicalSegment = (segment: string): boolean => {
78
+ if (/[^A-Za-z0-9_-]/.test(segment)) return false
79
+ const remainder = segment.length % 4
80
+ const last = segment.charAt(segment.length - 1)
81
+ return remainder === 0 ||
82
+ (remainder === 2 ? "AQgw".includes(last) : remainder === 3 && "AEIMQUYcgkosw048".includes(last))
83
+ }
84
+
85
+ /**
86
+ * Decodes canonical unpadded base64url.
87
+ *
88
+ * @internal
89
+ */
90
+ export const decodeSegment = (segment: string): Uint8Array | undefined => {
91
+ if (!isCanonicalSegment(segment)) return undefined
92
+ const decoded = Base64Url.decode(segment)
93
+ return Result.isSuccess(decoded) ? decoded.success : undefined
94
+ }
95
+
96
+ /** @internal */
97
+ export const parseJsonObject = (bytes: Uint8Array): Readonly<Record<string, Schema.Json>> | undefined => {
98
+ try {
99
+ const value: unknown = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes))
100
+ return typeof value === "object" && value !== null && !Array.isArray(value)
101
+ ? value as Readonly<Record<string, Schema.Json>>
102
+ : undefined
103
+ } catch {
104
+ return undefined
105
+ }
106
+ }
107
+
108
+ /**
109
+ * Splits a compact serialization into exactly `count` segments.
110
+ *
111
+ * @internal
112
+ */
113
+ export const split = (
114
+ token: string | Redacted.Redacted<string>,
115
+ count: number
116
+ ): Effect.Effect<ReadonlyArray<string>, JoseError.JoseError> => {
117
+ const parts = reveal(token).split(".")
118
+ return parts.length === count
119
+ ? Effect.succeed(parts)
120
+ : invalidToken(`A compact serialization must have ${count} segments`)
121
+ }
122
+
123
+ /**
124
+ * Decodes a protected header. Parameters in `unsupported` change how the
125
+ * token is processed, so they are rejected rather than ignored.
126
+ *
127
+ * @internal
128
+ */
129
+ export const decodeHeader = <A>(
130
+ segment: string,
131
+ decode: (input: unknown) => Option.Option<A>,
132
+ unsupported: ReadonlyArray<string>
133
+ ): Effect.Effect<A, JoseError.JoseError> => {
134
+ const bytes = decodeSegment(segment)
135
+ const json = bytes === undefined ? undefined : parseJsonObject(bytes)
136
+ if (json === undefined) return invalidToken("The protected header is not a base64url JSON object")
137
+ for (const name of unsupported) {
138
+ if (Object.hasOwn(json, name)) return invalidToken(`The ${name} header parameter is not supported`)
139
+ }
140
+ return Option.match(decode(json), {
141
+ onNone: () => invalidToken("The protected header has unsupported or malformed parameters"),
142
+ onSome: Effect.succeed
143
+ })
144
+ }
145
+
146
+ /**
147
+ * Base64url-encodes a protected header. Fixed parameters come first and
148
+ * cannot be overridden by additional parameters.
149
+ *
150
+ * @internal
151
+ */
152
+ export const encodeHeader = (
153
+ fixed: Readonly<Record<string, string>>,
154
+ kid: string | undefined,
155
+ header: { readonly kid?: string | undefined } | undefined,
156
+ unsupported: ReadonlyArray<string>
157
+ ): Effect.Effect<string, JoseError.JoseError> => {
158
+ for (const name of unsupported) {
159
+ if (header !== undefined && Object.hasOwn(header, name)) {
160
+ return invalidArgument(`The ${name} header parameter is not supported`)
161
+ }
162
+ }
163
+ const { kid: headerKid, ...rest } = header ?? {}
164
+ const value = { ...fixed, kid: headerKid ?? kid, ...rest, ...fixed }
165
+ try {
166
+ return Effect.succeed(Base64Url.encode(JSON.stringify(value)))
167
+ } catch {
168
+ return invalidArgument("The protected header is not JSON serializable")
169
+ }
170
+ }
171
+
172
+ /**
173
+ * Reads a finite, non-negative duration in milliseconds.
174
+ *
175
+ * @internal
176
+ */
177
+ export const millis = (name: string, input: Duration.Input): Effect.Effect<number, JoseError.JoseError> => {
178
+ const value = hasInvalidComponent(input) ? Option.none() : Option.map(Duration.fromInput(input), Duration.toMillis)
179
+ return Option.isSome(value) && Number.isFinite(value.value) && value.value >= 0
180
+ ? Effect.succeed(value.value)
181
+ : invalidArgument(`${name} must be a finite, non-negative duration`)
182
+ }
183
+
184
+ // `Duration` reads NaN as zero in every input form, and components that are
185
+ // not finite or overflow on conversion add up to NaN. Either would silently
186
+ // disable a bound.
187
+ const hasInvalidComponent = (input: Duration.Input): boolean => {
188
+ if (typeof input === "number") return Number.isNaN(input)
189
+ if (typeof input !== "object" || Duration.isDuration(input)) return false
190
+ if (Array.isArray(input)) return input.some((component) => !Number.isFinite(component))
191
+ return Object.entries(input).some(([unit, component]) =>
192
+ typeof component === "number" &&
193
+ (!Number.isFinite(component) || !Number.isFinite(Duration.toMillis({ [unit]: component })))
194
+ )
195
+ }
package/src/net/Host.ts CHANGED
@@ -111,7 +111,8 @@ export type HostPortInput = HostPort | string | HostPortParts
111
111
  const hostError = (input: unknown, message: string): Result.Result<never, NetAddress.NetAddressError> =>
112
112
  Result.fail(new NetAddress.NetAddressError({ input, message }))
113
113
 
114
- const asciiNameCharacter = /^[a-z0-9_.-]$/i
114
+ const asciiName = /^[a-z0-9_.-]*$/i
115
+ const nonAscii = /[\u0080-\uffff]/g
115
116
  const labelPattern = /^[a-z0-9_](?:[a-z0-9_-]{0,61}[a-z0-9_])?$/
116
117
  const numericLabel = /^(?:\d+|0x[0-9a-f]*)$/
117
118
 
@@ -135,15 +136,9 @@ const validateDomainName = (name: string): string | undefined => {
135
136
  }
136
137
 
137
138
  const toAsciiDomainName = (input: string): string | undefined => {
138
- let ascii = true
139
- for (const character of input) {
140
- if (character.charCodeAt(0) < 0x80) {
141
- if (!asciiNameCharacter.test(character)) return undefined
142
- } else {
143
- ascii = false
144
- }
145
- }
146
- if (ascii) return input.toLowerCase()
139
+ if (asciiName.test(input)) return input.toLowerCase()
140
+ // Check the composed form, so that `=\u0338` is read as `≠`
141
+ if (!asciiName.test(input.normalize("NFC").replace(nonAscii, ""))) return undefined
147
142
  try {
148
143
  return new URL(`http://${input}`).hostname
149
144
  } catch {
@@ -21,6 +21,7 @@ import type { HttpBody } from "../http/HttpBody.ts"
21
21
  import * as HttpClient from "../http/HttpClient.ts"
22
22
  import * as HttpClientError from "../http/HttpClientError.ts"
23
23
  import * as HttpClientRequest from "../http/HttpClientRequest.ts"
24
+ import * as Latch from "../Latch.ts"
24
25
  import * as Layer from "../Layer.ts"
25
26
  import * as Result from "../Result.ts"
26
27
  import * as Schedule from "../Schedule.ts"
@@ -154,6 +155,10 @@ export const layerFlusher: Layer.Layer<Flusher> = Layer.sync(Flusher, () => {
154
155
  * after unhandled failures, and flushes during scope finalization up to
155
156
  * `shutdownTimeout`.
156
157
  *
158
+ * The export interval starts with the first push and stops once an export
159
+ * empties the buffer, so an idle exporter keeps no timer pending. With
160
+ * `exportEmpty` and batching disabled, it exports on every interval instead.
161
+ *
157
162
  * Optional gzip compression uses `HttpClientRequest.compressBody` before the
158
163
  * retry loop, so retries reuse the compressed bytes. Bodies smaller than 1KB
159
164
  * remain uncompressed. Compression requires runtime `CompressionStream` support;
@@ -186,7 +191,6 @@ export const make: (
186
191
  const clock = Context.get(services, Clock)
187
192
  const scope = Context.get(services, Scope.Scope)
188
193
  const exportInterval = Duration.max(Duration.fromInputUnsafe(options.exportInterval), Duration.zero)
189
- let disabledUntil: number | undefined = undefined
190
194
 
191
195
  const client = Context.get(services, HttpClient.HttpClient).pipe(
192
196
  HttpClient.tap((response) => Effect.ignore(response.arrayBuffer)),
@@ -206,14 +210,18 @@ export const make: (
206
210
  )
207
211
 
208
212
  const request = HttpClientRequest.post(options.url, { headers })
213
+ const exportsEmpty = options.maxBatchSize === "disabled" && options.exportEmpty === true
209
214
  let buffer: Array<any> = []
215
+ let disabledUntil: number | undefined = undefined
216
+ const isDisabled = () => {
217
+ if (disabledUntil === undefined) return false
218
+ if (clock.currentTimeMillisUnsafe() < disabledUntil) return true
219
+ disabledUntil = undefined
220
+ return false
221
+ }
222
+
210
223
  const runExport = Effect.suspend(() => {
211
- if (disabledUntil !== undefined && clock.currentTimeMillisUnsafe() < disabledUntil) {
212
- return Effect.void
213
- } else if (disabledUntil !== undefined) {
214
- disabledUntil = undefined
215
- }
216
- if (buffer.length === 0 && (options.maxBatchSize !== "disabled" || options.exportEmpty !== true)) {
224
+ if (isDisabled() || (buffer.length === 0 && !exportsEmpty)) {
217
225
  return Effect.void
218
226
  }
219
227
  const items = buffer
@@ -245,9 +253,6 @@ export const make: (
245
253
  const exportFibers = yield* FiberSet.make<void, never>()
246
254
  const runExportFork = yield* FiberSet.runtime(exportFibers)<never>()
247
255
 
248
- const flusher = yield* Flusher
249
- yield* flusher.register(runExport)
250
-
251
256
  yield* Scope.addFinalizer(
252
257
  scope,
253
258
  Effect.suspend(() => {
@@ -261,19 +266,38 @@ export const make: (
261
266
  )
262
267
  )
263
268
 
264
- yield* Effect.sleep(exportInterval).pipe(
265
- Effect.andThen(FiberSet.run(exportFibers, runExport)),
266
- Effect.flatMap(Fiber.await),
267
- Effect.forever,
268
- Effect.forkIn(scope)
269
- )
269
+ // `armed` is open while there is something to export. It changes in the
270
+ // same synchronous step as the buffer check, so a push is never stranded.
271
+ const armed = yield* Latch.make(exportsEmpty)
272
+ const wake = yield* Latch.make()
273
+ const disarmIfEmpty = Effect.sync(() => {
274
+ if (exportsEmpty || buffer.length > 0 || !armed.closeUnsafe()) return
275
+ wake.openUnsafe()
276
+ })
277
+ // Forked after the shutdown finalizer, so the loop stops before the shutdown flush.
278
+ yield* Effect.gen(function*() {
279
+ while (true) {
280
+ wake.closeUnsafe()
281
+ yield* armed.await
282
+ yield* Effect.race(Effect.sleep(exportInterval), wake.await)
283
+ yield* Fiber.await(yield* FiberSet.run(exportFibers, runExport))
284
+ yield* disarmIfEmpty
285
+ }
286
+ }).pipe(Effect.forkIn(scope))
287
+ const exportNow = Effect.andThen(runExport, disarmIfEmpty)
288
+
289
+ const flusher = yield* Flusher
290
+ yield* flusher.register(exportNow)
270
291
 
271
292
  return {
272
293
  push(data) {
273
- if (disabledUntil !== undefined) return
294
+ // With no idle timer, the next push ends the disabled window.
295
+ if (isDisabled()) return
274
296
  buffer.push(data)
275
297
  if (options.maxBatchSize !== "disabled" && buffer.length >= options.maxBatchSize) {
276
- runExportFork(runExport)
298
+ runExportFork(exportNow)
299
+ } else {
300
+ armed.openUnsafe()
277
301
  }
278
302
  }
279
303
  }
@@ -9,6 +9,7 @@
9
9
  * @since 4.0.0
10
10
  */
11
11
  import * as Context from "../Context.ts"
12
+ import * as Base64 from "../encoding/Base64.ts"
12
13
  import * as HttpBody from "../http/HttpBody.ts"
13
14
  import * as Layer from "../Layer.ts"
14
15
  import * as otlpProtobuf from "./internal/otlpProtobuf.ts"
@@ -30,13 +31,20 @@ export class OtlpSerialization extends Context.Service<OtlpSerialization, {
30
31
  readonly logs: (data: LogsData) => HttpBody.HttpBody
31
32
  }>()("effect/observability/OtlpSerialization") {}
32
33
 
33
- // OTLP/JSON writes NaN and Infinity as strings, but JSON.stringify writes null
34
- const nonFiniteToString = (_key: string, value: unknown) =>
35
- typeof value === "number" && !Number.isFinite(value) ? String(value) : value
34
+ // OTLP/JSON writes non-finite numbers as strings and bytes as base64.
35
+ // The holder is read because Buffer#toJSON runs before the replacer.
36
+ function jsonReplacer(this: Record<string, unknown>, key: string, value: unknown) {
37
+ if (typeof value === "number" && !Number.isFinite(value)) return String(value)
38
+ if (key === "bytesValue" && this[key] instanceof Uint8Array) return Base64.encode(this[key])
39
+ return value
40
+ }
36
41
 
37
42
  const jsonBody = (data: unknown): HttpBody.HttpBody => {
38
43
  const json = JSON.stringify(data)
39
- return HttpBody.text(json.includes("null") ? JSON.stringify(data, nonFiniteToString) : json, "application/json")
44
+ return HttpBody.text(
45
+ json.includes("null") || json.includes("\"bytesValue\":") ? JSON.stringify(data, jsonReplacer) : json,
46
+ "application/json"
47
+ )
40
48
  }
41
49
 
42
50
  /**
@@ -45,7 +53,7 @@ const jsonBody = (data: unknown): HttpBody.HttpBody => {
45
53
  * **Details**
46
54
  *
47
55
  * `NaN`, `Infinity` and `-Infinity` are written as the strings OTLP/JSON
48
- * expects, not as `null`.
56
+ * expects, not as `null`. `bytesValue` data is written as a base64 string.
49
57
  *
50
58
  * @stability unstable
51
59
  * @category layers
@@ -368,14 +368,14 @@ export const encodeTracesData = (tracesData: TraceData): Uint8Array =>
368
368
  */
369
369
  export const encodeNumberDataPoint = (point: {
370
370
  readonly attributes: ReadonlyArray<KeyValue>
371
- readonly startTimeUnixNano: string
371
+ readonly startTimeUnixNano?: string | undefined
372
372
  readonly timeUnixNano: string
373
373
  readonly asDouble?: number | undefined
374
374
  readonly asInt?: string | number | bigint | undefined
375
375
  readonly flags?: number | undefined
376
376
  }): Uint8Array =>
377
377
  Proto.concat(
378
- Proto.fixed64Field(2, BigInt(point.startTimeUnixNano)),
378
+ Proto.optionalFixed64Field(2, point.startTimeUnixNano),
379
379
  Proto.fixed64Field(3, BigInt(point.timeUnixNano)),
380
380
  point.asDouble !== undefined
381
381
  ? Proto.doubleField(4, point.asDouble)
@@ -407,7 +407,7 @@ export const encodeNumberDataPoint = (point: {
407
407
  */
408
408
  export const encodeHistogramDataPoint = (point: {
409
409
  readonly attributes: ReadonlyArray<KeyValue>
410
- readonly startTimeUnixNano: string
410
+ readonly startTimeUnixNano?: string | undefined
411
411
  readonly timeUnixNano: string
412
412
  readonly count: string | number | bigint
413
413
  readonly sum?: number | undefined
@@ -426,7 +426,7 @@ export const encodeHistogramDataPoint = (point: {
426
426
  ...point.explicitBounds.map((bound) => Proto.doubleField(7, bound))
427
427
  )
428
428
  return Proto.concat(
429
- Proto.fixed64Field(2, BigInt(point.startTimeUnixNano)),
429
+ Proto.optionalFixed64Field(2, point.startTimeUnixNano),
430
430
  Proto.fixed64Field(3, BigInt(point.timeUnixNano)),
431
431
  Proto.fixed64Field(4, BigInt(point.count)),
432
432
  point.sum !== undefined ? Proto.doubleField(5, point.sum) : new Uint8Array(0),
@@ -515,7 +515,7 @@ export const encodeHistogram = (histogram: {
515
515
  */
516
516
  export const encodeSummaryDataPoint = (point: {
517
517
  readonly attributes: ReadonlyArray<KeyValue>
518
- readonly startTimeUnixNano: string
518
+ readonly startTimeUnixNano?: string | undefined
519
519
  readonly timeUnixNano: string
520
520
  readonly count: string | number | bigint
521
521
  readonly sum: number
@@ -523,7 +523,7 @@ export const encodeSummaryDataPoint = (point: {
523
523
  readonly flags?: number | undefined
524
524
  }): Uint8Array =>
525
525
  Proto.concat(
526
- Proto.fixed64Field(2, BigInt(point.startTimeUnixNano)),
526
+ Proto.optionalFixed64Field(2, point.startTimeUnixNano),
527
527
  Proto.fixed64Field(3, BigInt(point.timeUnixNano)),
528
528
  Proto.fixed64Field(4, BigInt(point.count)),
529
529
  Proto.doubleField(5, point.sum),
@@ -213,3 +213,13 @@ export const optionalStringField = (
213
213
  fieldNumber: number,
214
214
  value: string | undefined
215
215
  ): Uint8Array => value !== undefined && value !== "" ? stringField(fieldNumber, value) : new Uint8Array(0)
216
+
217
+ /**
218
+ * Encodes a fixed64 field if the value is defined
219
+ *
220
+ * @internal
221
+ */
222
+ export const optionalFixed64Field = (
223
+ fieldNumber: number,
224
+ value: string | undefined
225
+ ): Uint8Array => value !== undefined ? fixed64Field(fieldNumber, BigInt(value)) : new Uint8Array(0)