effect 4.0.2 → 4.0.3

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 (243) hide show
  1. package/dist/Context.js +3 -3
  2. package/dist/Context.js.map +1 -1
  3. package/dist/Crypto.d.ts +33 -5
  4. package/dist/Crypto.d.ts.map +1 -1
  5. package/dist/Crypto.js +8 -2
  6. package/dist/Crypto.js.map +1 -1
  7. package/dist/DateTime.d.ts +9 -6
  8. package/dist/DateTime.d.ts.map +1 -1
  9. package/dist/DateTime.js +9 -6
  10. package/dist/DateTime.js.map +1 -1
  11. package/dist/Duration.d.ts +6 -6
  12. package/dist/Duration.d.ts.map +1 -1
  13. package/dist/Duration.js +27 -8
  14. package/dist/Duration.js.map +1 -1
  15. package/dist/FileSystem.d.ts +44 -2
  16. package/dist/FileSystem.d.ts.map +1 -1
  17. package/dist/FileSystem.js.map +1 -1
  18. package/dist/Schema.d.ts +473 -1
  19. package/dist/Schema.d.ts.map +1 -1
  20. package/dist/Schema.js +355 -4
  21. package/dist/Schema.js.map +1 -1
  22. package/dist/Stdio.d.ts +7 -1
  23. package/dist/Stdio.d.ts.map +1 -1
  24. package/dist/Stdio.js +1 -0
  25. package/dist/Stdio.js.map +1 -1
  26. package/dist/Stream.d.ts +11 -11
  27. package/dist/Stream.js +5 -5
  28. package/dist/ai/McpServer.d.ts +6 -0
  29. package/dist/ai/McpServer.d.ts.map +1 -1
  30. package/dist/ai/McpServer.js +65 -23
  31. package/dist/ai/McpServer.js.map +1 -1
  32. package/dist/ai/internal/mcpProtocol/v2026_07_28.js +5 -0
  33. package/dist/ai/internal/mcpProtocol/v2026_07_28.js.map +1 -1
  34. package/dist/ai/internal/mcpProtocol.js.map +1 -1
  35. package/dist/ai/internal/mcpRuntime.js +1 -0
  36. package/dist/ai/internal/mcpRuntime.js.map +1 -1
  37. package/dist/cli/CliOutput.d.ts +27 -0
  38. package/dist/cli/CliOutput.d.ts.map +1 -1
  39. package/dist/cli/CliOutput.js +33 -10
  40. package/dist/cli/CliOutput.js.map +1 -1
  41. package/dist/cli/Command.d.ts.map +1 -1
  42. package/dist/cli/Command.js +6 -3
  43. package/dist/cli/Command.js.map +1 -1
  44. package/dist/cli/Completions.d.ts +3 -3
  45. package/dist/cli/Completions.d.ts.map +1 -1
  46. package/dist/cli/Completions.js +8 -5
  47. package/dist/cli/Completions.js.map +1 -1
  48. package/dist/cli/GlobalFlag.d.ts +5 -4
  49. package/dist/cli/GlobalFlag.d.ts.map +1 -1
  50. package/dist/cli/GlobalFlag.js +3 -3
  51. package/dist/cli/GlobalFlag.js.map +1 -1
  52. package/dist/cli/Prompt.d.ts +17 -1
  53. package/dist/cli/Prompt.d.ts.map +1 -1
  54. package/dist/cli/Prompt.js +119 -114
  55. package/dist/cli/Prompt.js.map +1 -1
  56. package/dist/cli/internal/ansi.d.ts +0 -1
  57. package/dist/cli/internal/ansi.d.ts.map +1 -1
  58. package/dist/cli/internal/ansi.js +20 -3
  59. package/dist/cli/internal/ansi.js.map +1 -1
  60. package/dist/cli/internal/completions/powershell.d.ts +2 -0
  61. package/dist/cli/internal/completions/powershell.d.ts.map +1 -0
  62. package/dist/cli/internal/completions/powershell.js +273 -0
  63. package/dist/cli/internal/completions/powershell.js.map +1 -0
  64. package/dist/cli/internal/completions/zsh.js +3 -2
  65. package/dist/cli/internal/completions/zsh.js.map +1 -1
  66. package/dist/cli/internal/wizard.d.ts +3 -3
  67. package/dist/cli/internal/wizard.d.ts.map +1 -1
  68. package/dist/cli/internal/wizard.js +21 -18
  69. package/dist/cli/internal/wizard.js.map +1 -1
  70. package/dist/cluster/ClusterSchema.d.ts +28 -0
  71. package/dist/cluster/ClusterSchema.d.ts.map +1 -1
  72. package/dist/cluster/ClusterSchema.js +30 -0
  73. package/dist/cluster/ClusterSchema.js.map +1 -1
  74. package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
  75. package/dist/cluster/ClusterWorkflowEngine.js +10 -18
  76. package/dist/cluster/ClusterWorkflowEngine.js.map +1 -1
  77. package/dist/cluster/MessageStorage.d.ts +18 -3
  78. package/dist/cluster/MessageStorage.d.ts.map +1 -1
  79. package/dist/cluster/MessageStorage.js +31 -11
  80. package/dist/cluster/MessageStorage.js.map +1 -1
  81. package/dist/cluster/Runners.d.ts.map +1 -1
  82. package/dist/cluster/Runners.js +8 -2
  83. package/dist/cluster/Runners.js.map +1 -1
  84. package/dist/cluster/Sharding.d.ts.map +1 -1
  85. package/dist/cluster/Sharding.js +181 -62
  86. package/dist/cluster/Sharding.js.map +1 -1
  87. package/dist/cluster/SqlMessageStorage.d.ts +59 -19
  88. package/dist/cluster/SqlMessageStorage.d.ts.map +1 -1
  89. package/dist/cluster/SqlMessageStorage.js +84 -55
  90. package/dist/cluster/SqlMessageStorage.js.map +1 -1
  91. package/dist/cluster/SqlRunnerStorage.d.ts +68 -19
  92. package/dist/cluster/SqlRunnerStorage.d.ts.map +1 -1
  93. package/dist/cluster/SqlRunnerStorage.js +191 -113
  94. package/dist/cluster/SqlRunnerStorage.js.map +1 -1
  95. package/dist/cluster/internal/entityManager.js +104 -37
  96. package/dist/cluster/internal/entityManager.js.map +1 -1
  97. package/dist/http/FindMyWay/internal/router.js +3 -6
  98. package/dist/http/FindMyWay/internal/router.js.map +1 -1
  99. package/dist/http/HttpClient.d.ts +6 -0
  100. package/dist/http/HttpClient.d.ts.map +1 -1
  101. package/dist/http/HttpClient.js +39 -2
  102. package/dist/http/HttpClient.js.map +1 -1
  103. package/dist/http/HttpTraceContext.d.ts.map +1 -1
  104. package/dist/http/HttpTraceContext.js +4 -2
  105. package/dist/http/HttpTraceContext.js.map +1 -1
  106. package/dist/internal/effect.js +12 -7
  107. package/dist/internal/effect.js.map +1 -1
  108. package/dist/internal/version.js +1 -1
  109. package/dist/net/AddressResolver.d.ts +145 -0
  110. package/dist/net/AddressResolver.d.ts.map +1 -0
  111. package/dist/net/AddressResolver.js +114 -0
  112. package/dist/net/AddressResolver.js.map +1 -0
  113. package/dist/net/Dns.d.ts +596 -0
  114. package/dist/net/Dns.d.ts.map +1 -0
  115. package/dist/net/Dns.js +549 -0
  116. package/dist/net/Dns.js.map +1 -0
  117. package/dist/net/Host.d.ts +320 -0
  118. package/dist/net/Host.d.ts.map +1 -0
  119. package/dist/net/Host.js +342 -0
  120. package/dist/net/Host.js.map +1 -0
  121. package/dist/net/IpInterface.d.ts +76 -3
  122. package/dist/net/IpInterface.d.ts.map +1 -1
  123. package/dist/net/IpInterface.js +53 -4
  124. package/dist/net/IpInterface.js.map +1 -1
  125. package/dist/net/IpNetwork.d.ts +82 -8
  126. package/dist/net/IpNetwork.d.ts.map +1 -1
  127. package/dist/net/IpNetwork.js +60 -4
  128. package/dist/net/IpNetwork.js.map +1 -1
  129. package/dist/net/NetAddress.d.ts +388 -35
  130. package/dist/net/NetAddress.d.ts.map +1 -1
  131. package/dist/net/NetAddress.js +350 -34
  132. package/dist/net/NetAddress.js.map +1 -1
  133. package/dist/net/index.d.ts +15 -0
  134. package/dist/net/index.d.ts.map +1 -1
  135. package/dist/net/index.js +15 -0
  136. package/dist/net/index.js.map +1 -1
  137. package/dist/observability/OtlpMetrics.d.ts.map +1 -1
  138. package/dist/observability/OtlpMetrics.js +15 -21
  139. package/dist/observability/OtlpMetrics.js.map +1 -1
  140. package/dist/observability/PrometheusMetrics.js +1 -0
  141. package/dist/observability/PrometheusMetrics.js.map +1 -1
  142. package/dist/persistence/PersistedQueue.d.ts +32 -3
  143. package/dist/persistence/PersistedQueue.d.ts.map +1 -1
  144. package/dist/persistence/PersistedQueue.js +75 -16
  145. package/dist/persistence/PersistedQueue.js.map +1 -1
  146. package/dist/rpc/RpcClient.d.ts +22 -6
  147. package/dist/rpc/RpcClient.d.ts.map +1 -1
  148. package/dist/rpc/RpcClient.js +12 -5
  149. package/dist/rpc/RpcClient.js.map +1 -1
  150. package/dist/rpc/RpcServer.d.ts +6 -0
  151. package/dist/rpc/RpcServer.d.ts.map +1 -1
  152. package/dist/rpc/RpcServer.js +42 -20
  153. package/dist/rpc/RpcServer.js.map +1 -1
  154. package/dist/socket/DatagramSocket.d.ts +456 -0
  155. package/dist/socket/DatagramSocket.d.ts.map +1 -0
  156. package/dist/socket/DatagramSocket.js +535 -0
  157. package/dist/socket/DatagramSocket.js.map +1 -0
  158. package/dist/socket/Socket.d.ts +14 -1
  159. package/dist/socket/Socket.d.ts.map +1 -1
  160. package/dist/socket/Socket.js +9 -1
  161. package/dist/socket/Socket.js.map +1 -1
  162. package/dist/socket/index.d.ts +5 -0
  163. package/dist/socket/index.d.ts.map +1 -1
  164. package/dist/socket/index.js +5 -0
  165. package/dist/socket/index.js.map +1 -1
  166. package/dist/sql/Migrator.d.ts.map +1 -1
  167. package/dist/sql/Migrator.js +7 -2
  168. package/dist/sql/Migrator.js.map +1 -1
  169. package/dist/sql/SqlClient.d.ts +7 -1
  170. package/dist/sql/SqlClient.d.ts.map +1 -1
  171. package/dist/sql/SqlClient.js +31 -6
  172. package/dist/sql/SqlClient.js.map +1 -1
  173. package/dist/testing/TestCrypto.d.ts +73 -0
  174. package/dist/testing/TestCrypto.d.ts.map +1 -0
  175. package/dist/testing/TestCrypto.js +87 -0
  176. package/dist/testing/TestCrypto.js.map +1 -0
  177. package/dist/testing/index.d.ts +5 -0
  178. package/dist/testing/index.d.ts.map +1 -1
  179. package/dist/testing/index.js +5 -0
  180. package/dist/testing/index.js.map +1 -1
  181. package/dist/workflow/DurableDeferred.d.ts +54 -0
  182. package/dist/workflow/DurableDeferred.d.ts.map +1 -1
  183. package/dist/workflow/DurableDeferred.js +78 -49
  184. package/dist/workflow/DurableDeferred.js.map +1 -1
  185. package/dist/workflow/WorkflowEngine.d.ts.map +1 -1
  186. package/dist/workflow/WorkflowEngine.js +2 -1
  187. package/dist/workflow/WorkflowEngine.js.map +1 -1
  188. package/package.json +1 -1
  189. package/src/Context.ts +3 -3
  190. package/src/Crypto.ts +43 -9
  191. package/src/DateTime.ts +9 -6
  192. package/src/Duration.ts +36 -16
  193. package/src/FileSystem.ts +48 -2
  194. package/src/Schema.ts +669 -5
  195. package/src/Stdio.ts +9 -2
  196. package/src/Stream.ts +11 -11
  197. package/src/ai/McpServer.ts +63 -23
  198. package/src/ai/internal/mcpProtocol/v2026_07_28.ts +5 -0
  199. package/src/ai/internal/mcpProtocol.ts +3 -0
  200. package/src/ai/internal/mcpRuntime.ts +2 -0
  201. package/src/cli/CliOutput.ts +33 -16
  202. package/src/cli/Command.ts +4 -3
  203. package/src/cli/Completions.ts +9 -6
  204. package/src/cli/GlobalFlag.ts +19 -11
  205. package/src/cli/Prompt.ts +159 -149
  206. package/src/cli/internal/ansi.ts +26 -3
  207. package/src/cli/internal/completions/powershell.ts +322 -0
  208. package/src/cli/internal/completions/zsh.ts +4 -2
  209. package/src/cli/internal/wizard.ts +34 -26
  210. package/src/cluster/ClusterSchema.ts +32 -0
  211. package/src/cluster/ClusterWorkflowEngine.ts +13 -24
  212. package/src/cluster/MessageStorage.ts +45 -14
  213. package/src/cluster/Runners.ts +8 -2
  214. package/src/cluster/Sharding.ts +207 -49
  215. package/src/cluster/SqlMessageStorage.ts +118 -84
  216. package/src/cluster/SqlRunnerStorage.ts +224 -128
  217. package/src/cluster/internal/entityManager.ts +151 -55
  218. package/src/http/FindMyWay/internal/router.ts +4 -7
  219. package/src/http/HttpClient.ts +56 -2
  220. package/src/http/HttpTraceContext.ts +8 -2
  221. package/src/internal/effect.ts +15 -13
  222. package/src/internal/version.ts +1 -1
  223. package/src/net/AddressResolver.ts +222 -0
  224. package/src/net/Dns.ts +1035 -0
  225. package/src/net/Host.ts +472 -0
  226. package/src/net/IpInterface.ts +117 -7
  227. package/src/net/IpNetwork.ts +116 -17
  228. package/src/net/NetAddress.ts +611 -76
  229. package/src/net/index.ts +18 -0
  230. package/src/observability/OtlpMetrics.ts +12 -23
  231. package/src/observability/PrometheusMetrics.ts +1 -0
  232. package/src/persistence/PersistedQueue.ts +146 -53
  233. package/src/rpc/RpcClient.ts +41 -19
  234. package/src/rpc/RpcServer.ts +60 -25
  235. package/src/socket/DatagramSocket.ts +919 -0
  236. package/src/socket/Socket.ts +22 -2
  237. package/src/socket/index.ts +6 -0
  238. package/src/sql/Migrator.ts +21 -5
  239. package/src/sql/SqlClient.ts +39 -15
  240. package/src/testing/TestCrypto.ts +94 -0
  241. package/src/testing/index.ts +6 -0
  242. package/src/workflow/DurableDeferred.ts +123 -48
  243. package/src/workflow/WorkflowEngine.ts +2 -1
@@ -82,6 +82,12 @@ export interface RpcServer<A extends Rpc.Any> {
82
82
  * handlers for a group and sending decoded server responses through
83
83
  * `onFromServer`.
84
84
  *
85
+ * **Details**
86
+ *
87
+ * If writing a stream `Chunk` fails with anything other than an interruption,
88
+ * the request fails with that cause. `onFromServer` is assumed to have already
89
+ * answered the client and reported it, so nothing else is sent or reported.
90
+ *
85
91
  * @stability unstable
86
92
  * @category constructors
87
93
  * @since 4.0.0
@@ -188,7 +194,7 @@ export const makeNoSerialization: <Rpcs extends Rpc.Any>(
188
194
  clients.set(clientId, client)
189
195
  } else if (
190
196
  client.ended &&
191
- (message._tag !== "Interrupt" || !client.fibers.has(message.requestId))
197
+ ((message._tag !== "Interrupt" && message._tag !== "Ack") || !client.fibers.has(message.requestId))
192
198
  ) {
193
199
  return Effect.interrupt
194
200
  }
@@ -199,7 +205,7 @@ export const makeNoSerialization: <Rpcs extends Rpc.Any>(
199
205
  }
200
206
  case "Ack": {
201
207
  const latch = client.latches?.get(message.requestId)
202
- return latch ? latch.open : Effect.void
208
+ return latch ? Effect.asVoid(latch.open) : Effect.void
203
209
  }
204
210
  case "Interrupt": {
205
211
  const fiber = client.fibers.get(message.requestId)
@@ -279,13 +285,23 @@ export const makeNoSerialization: <Rpcs extends Rpc.Any>(
279
285
  const isUninterruptible = isWrapper && result.uninterruptible
280
286
  // unwrap the fork data type
281
287
  const streamOrEffect = isWrapper ? result.value : result
288
+ // set when a chunk could not be written; the writer has already responded
289
+ let writeFailure: Cause.Cause<never> | undefined
282
290
  const handler = isStream
283
- ? (streamEffect(client, request, streamOrEffect) as Effect.Effect<{} | Deferred.Deferred<any, any>>)
291
+ ? (streamEffect(client, request, streamOrEffect, (cause) => {
292
+ writeFailure = cause
293
+ }) as Effect.Effect<{} | Deferred.Deferred<any, any>>)
284
294
  : (streamOrEffect as Effect.Effect<{} | Deferred.Deferred<any, any>>)
285
295
 
286
- const withMiddleware = rpc.middlewares.size > 0
287
- ? applyMiddleware(services, handler, metadata)
288
- : handler
296
+ const withMiddleware = rpc.middlewares.size === 0
297
+ ? handler
298
+ : isStream
299
+ // middleware may rewrite or swallow a chunk write failure, so restore it
300
+ ? Effect.flatMap(
301
+ Effect.exit(applyMiddleware(services, handler, metadata)),
302
+ (exit) => writeFailure ? Effect.failCause(writeFailure) : exit
303
+ )
304
+ : applyMiddleware(services, handler, metadata)
289
305
  let responded = false
290
306
  const scope = Scope.makeUnsafe()
291
307
  let deferred: Deferred.Deferred<unknown, unknown> | undefined = undefined
@@ -304,6 +320,9 @@ export const makeNoSerialization: <Rpcs extends Rpc.Any>(
304
320
  exit: exit as any
305
321
  })
306
322
  }
323
+ } else if (writeFailure) {
324
+ // onFromServer has already answered the client and reported the failure
325
+ return Scope.closeUnsafe(scope, exit) ?? Effect.void
307
326
  } else if (
308
327
  !disableFatalDefects &&
309
328
  Cause.hasDies(exit.cause) &&
@@ -409,8 +428,17 @@ export const makeNoSerialization: <Rpcs extends Rpc.Any>(
409
428
  request: Request<Rpcs>,
410
429
  stream:
411
430
  | Stream.Stream<any, any>
412
- | Effect.Effect<Queue.Dequeue<any, any>, any, Scope.Scope>
431
+ | Effect.Effect<Queue.Dequeue<any, any>, any, Scope.Scope>,
432
+ onWriteFailure: (cause: Cause.Cause<never>) => void
413
433
  ) => {
434
+ const writeChunk = (values: NonEmptyReadonlyArray<any>) =>
435
+ Effect.onError(
436
+ options.onFromServer({ _tag: "Chunk", clientId: client.id, requestId: request.id, values }),
437
+ (cause) => {
438
+ if (!Cause.hasInterruptsOnly(cause)) onWriteFailure(cause)
439
+ return Effect.void
440
+ }
441
+ )
414
442
  let latch: Latch.Latch | undefined
415
443
  if (supportsAck) {
416
444
  client.latches ??= new Map()
@@ -427,12 +455,7 @@ export const makeNoSerialization: <Rpcs extends Rpc.Any>(
427
455
  while: constTrue,
428
456
  body: constant(
429
457
  Effect.flatMap(Queue.takeAll(queue), (values) => {
430
- const write = options.onFromServer({
431
- _tag: "Chunk",
432
- clientId: client.id,
433
- requestId: request.id,
434
- values
435
- })
458
+ const write = writeChunk(values)
436
459
  if (!latch) return write
437
460
  latch.closeUnsafe()
438
461
  return Effect.flatMap(write, () => latch.await)
@@ -446,12 +469,7 @@ export const makeNoSerialization: <Rpcs extends Rpc.Any>(
446
469
  )
447
470
  }
448
471
  return Stream.runForEachArray(stream, (values) => {
449
- const write = options.onFromServer({
450
- _tag: "Chunk",
451
- clientId: client.id,
452
- requestId: request.id,
453
- values
454
- })
472
+ const write = writeChunk(values)
455
473
  if (!latch) return write
456
474
  latch.closeUnsafe()
457
475
  return Effect.andThen(write, latch.await)
@@ -633,6 +651,7 @@ export const make: <Rpcs extends Rpc.Any>(
633
651
  )
634
652
 
635
653
  type Schemas = {
654
+ readonly tag: string
636
655
  readonly decode: (u: unknown) => Effect.Effect<Rpc.Payload<Rpcs>, Schema.SchemaError>
637
656
  readonly encodeChunk: (
638
657
  u: NonEmptyReadonlyArray<unknown>
@@ -649,6 +668,7 @@ export const make: <Rpcs extends Rpc.Any>(
649
668
  const entry = Context.getOrUndefinedUnsafe(services, rpc.key) as Rpc.Handler<Rpcs["_tag"]>
650
669
  const streamSchemas = RpcSchema.getStreamSchemas(rpc.successSchema)
651
670
  schemas = {
671
+ tag: rpc._tag,
652
672
  decode: Schema.decodeUnknownEffect(codecFor(rpc.payloadSchema)) as any,
653
673
  encodeChunk: Schema.encodeUnknownEffect(
654
674
  codecFor(
@@ -686,23 +706,38 @@ export const make: <Rpcs extends Rpc.Any>(
686
706
  tag: "Chunk" | "Exit"
687
707
  ) => {
688
708
  const collector = schemas.collector
709
+ let encodeFailed = false
689
710
  // The schema encoders evaluate eagerly, so an encode that needs no
690
711
  // services is already a resolved success and can skip the effect wrappers.
691
712
  const write = Exit.isExit(effect) && Exit.isSuccess(effect)
692
713
  ? send(client.id, responseEnvelope(requestId, tag, effect.value), collector && collector.clearUnsafe())
693
714
  : Effect.flatMap(
694
- Effect.provideContext(
695
- collector ? Effect.provideService(effect, Transferable.Collector, collector) : effect,
696
- schemas.context
715
+ Effect.catch(
716
+ Effect.provideContext(
717
+ collector ? Effect.provideService(effect, Transferable.Collector, collector) : effect,
718
+ schemas.context
719
+ ),
720
+ (error) =>
721
+ Effect.withFiber((fiber) => {
722
+ const defect = Cause.die(
723
+ `Failed to encode response for RPC "${schemas.tag}": ${SchemaIssue.defaultFormatter(error.issue)}`
724
+ )
725
+ reportCauseUnsafe(fiber, defect)
726
+ encodeFailed = true
727
+ return Effect.failCause(defect)
728
+ })
697
729
  ),
698
730
  (value) => send(client.id, responseEnvelope(requestId, tag, value), collector && collector.clearUnsafe())
699
731
  )
700
732
  return Effect.catchCause(write, (cause) => {
701
733
  client.schemas.delete(requestId)
702
- const defect = Cause.squash(Cause.map(cause, (e) => SchemaIssue.defaultFormatter(e.issue)))
734
+ // An encode failure ends the request with the defect, so the request
735
+ // span records it. Other failures stop the request as a cancellation.
703
736
  return Effect.andThen(
704
- sendRequestDefect(client, requestId, schemas.encodeExit, defect),
705
- server.write(client.id, { _tag: "Interrupt", requestId, interruptors: [] })
737
+ sendRequestDefect(client, requestId, schemas.encodeExit, Cause.squash(cause)),
738
+ encodeFailed
739
+ ? Effect.failCause(cause)
740
+ : server.write(client.id, { _tag: "Interrupt", requestId, interruptors: [] })
706
741
  )
707
742
  })
708
743
  }